Index: trunk/CHANGELOG
===================================================================
--- trunk/CHANGELOG	(revision 468)
+++ trunk/CHANGELOG	(revision 469)
@@ -8,4 +8,5 @@
    - bug fix: number of events to process is correct event if multiple files in the inputlist
    - updates in Resolution.cpp & Resolution_ATLAS.cpp
+   - new method "invisible()" in PdgParticle, needed for invisible particles BSM
 
  /-----------------------------------------\
Index: trunk/Delphes.cpp
===================================================================
--- trunk/Delphes.cpp	(revision 468)
+++ trunk/Delphes.cpp	(revision 469)
@@ -396,5 +396,5 @@
 	  
 	  // 2.1a.2********************* visible particles only
-	  if( (particle->Status == 1) && (pid != pNU1) && (pid != pNU2) && (pid != pNU3) )
+	  if( (particle->Status == 1) && (! pdg_part.invisible() ) )
 	    {
 	      // 2.1a.2.1 Central solenoidal magnetic field 
Index: trunk/Resolutions.cpp
===================================================================
--- trunk/Resolutions.cpp	(revision 468)
+++ trunk/Resolutions.cpp	(revision 469)
@@ -49,4 +49,5 @@
 #include "JetsUtil.h"
 #include "BFieldProp.h"
+#include "PdgParticle.h"
 
 #include<vector>
@@ -325,5 +326,5 @@
 	{
           genMomentum.SetPxPyPzE(particle->Px, particle->Py, particle->Pz, particle->E);
-	  
+	  PdgParticle pdg_part = DET->PDGtable[particle->PID]; 
 	  int pid = abs(particle->PID);
 	  float eta = fabs(particle->Eta);
@@ -336,9 +337,11 @@
 	  
 	  //Calculate ETMIS from generated particles
-          if((pid == pNU1) || (pid == pNU2) || (pid == pNU3))PTmisGEN = PTmisGEN + genMomentum;
+          //if((pid == pNU1) || (pid == pNU2) || (pid == pNU3))PTmisGEN = PTmisGEN + genMomentum;
+          if( (particle->Status == 1) && pdg_part.invisible() )PTmisGEN = PTmisGEN + genMomentum;
 
           //Electrons and muons	 
           if( (particle->Status == 1)    &&
-            ((pid != pNU1) && (pid != pNU2) && (pid != pNU3)) &&
+            //((pid != pNU1) && (pid != pNU2) && (pid != pNU3)) &&
+             (! pdg_part.invisible() ) &&
              (fabs(particle->Eta) < DET->CEN_max_calo_fwd)
             )
Index: trunk/Resolutions_ATLAS.cpp
===================================================================
--- trunk/Resolutions_ATLAS.cpp	(revision 468)
+++ trunk/Resolutions_ATLAS.cpp	(revision 469)
@@ -49,4 +49,5 @@
 #include "JetsUtil.h"
 #include "BFieldProp.h"
+#include "PdgParticle.h"
 
 #include<vector>
@@ -327,4 +328,5 @@
 	{
           genMomentum.SetPxPyPzE(particle->Px, particle->Py, particle->Pz, particle->E);
+	  PdgParticle pdg_part = DET->PDGtable[particle->PID];
 	  
 	  int pid = abs(particle->PID);
@@ -338,9 +340,11 @@
 	  
 	  //Calculate ETMIS from generated particles
-          if((pid == pNU1) || (pid == pNU2) || (pid == pNU3))PTmisGEN = PTmisGEN + genMomentum;
+          //if((pid == pNU1) || (pid == pNU2) || (pid == pNU3))PTmisGEN = PTmisGEN + genMomentum;
+          if( (particle->Status == 1) && pdg_part.invisible() )PTmisGEN = PTmisGEN + genMomentum;
 
 	  //Electrons and muons	 
           if( (particle->Status == 1)    &&
-            ((pid != pNU1) && (pid != pNU2) && (pid != pNU3)) &&
+            //((pid != pNU1) && (pid != pNU2) && (pid != pNU3)) &&
+             (! pdg_part.invisible() ) &&
              (fabs(particle->Eta) < DET->CEN_max_calo_fwd)
             )
Index: trunk/interface/PdgParticle.h
===================================================================
--- trunk/interface/PdgParticle.h	(revision 468)
+++ trunk/interface/PdgParticle.h	(revision 469)
@@ -40,23 +40,25 @@
 class PdgParticle {
   public:
-	PdgParticle(): _pid(-999), _mass(0), _charge(0), _gamma_tot(0), _ctau(0), _name("Unknown") {};
-	PdgParticle(const int pid, const std::string& name, const float m, const float q, const float gamma, const float ctau);
+	PdgParticle(): _pid(-999), _mass(0), _charge(0), _gamma_tot(0), _ctau(0), _name("Unknown"), _isInvisible(false) {};
+	PdgParticle(const long int pid, const std::string& name, const float m, const float q, const float gamma, const float ctau);
 	PdgParticle(const PdgParticle& p);
 	PdgParticle& operator=(const PdgParticle& p);
 	~PdgParticle() {};
-	int pid() const {return _pid;};
+	long int pid() const {return _pid;};
 	float mass() const {return _mass;};
 	float charge() const {return _charge;};
 	float gamma_tot() const {return _gamma_tot;};
 	double ctau() const {return _ctau;};
+	bool invisible() const {return _isInvisible;};
         std::string name() const {return _name;};
 
   private:
-	int _pid;
-	float _mass;       // GeV
-	float _charge;     // in e+
-	float _gamma_tot;  // GeV
+	long int _pid;
+	float _mass;        // GeV
+	float _charge;      // in e+
+	float _gamma_tot;   // GeV
 	double _ctau;       // in m
 	std::string _name;
+	bool _isInvisible;  // neutrino-like
 };
 
@@ -67,5 +69,5 @@
 	PdgTable& operator=(const PdgTable& table);
         ~PdgTable(){};
-	void insert(const int pid, const PdgParticle &p);
+	void insert(const long int pid, const PdgParticle &p);
 	void print() const;
         PdgParticle operator[](const int pid) const;
Index: trunk/src/PdgParticle.cc
===================================================================
--- trunk/src/PdgParticle.cc	(revision 468)
+++ trunk/src/PdgParticle.cc	(revision 469)
@@ -43,10 +43,15 @@
 //PdgParticle::PdgParticle() : _pid(1), _mass(-1), _charge(-999), _gamma_tot(-1), _ctau(-1), _name("") {}
 
-PdgParticle::PdgParticle(const int pid, const std::string& name, const float m, const float q, const float gamma, const float ctau) :
-  _pid(pid), _mass(m), _charge(q), _gamma_tot(gamma), _ctau(ctau), _name(name) {}
+PdgParticle::PdgParticle(const long int pid, const std::string& name, const float m, const float q, const float gamma, const float ctau) :
+  _pid(pid), _mass(m), _charge(q), _gamma_tot(gamma), _ctau(ctau), _name(name) {
+  if( (abs(pid) == 12)       || (abs(pid) == 14)       || (abs(pid) == 16)      || 
+      (abs(pid) == 1000022 ) || (abs(pid) == 1000023 ) || (abs(pid) == 1000025) || 
+      (abs(pid) == 1000035 ) || (abs(pid) == 1000045 ) ) { /*std::cout << "invisible : " << pid << std::endl;*/ _isInvisible = true; }
+  else _isInvisible = false;
+}
 
 
 PdgParticle::PdgParticle(const PdgParticle& p) :
-  _pid(p._pid), _mass(p._mass), _charge(p._charge), _gamma_tot(p._gamma_tot), _ctau(p._ctau), _name(p._name) {}
+  _pid(p._pid), _mass(p._mass), _charge(p._charge), _gamma_tot(p._gamma_tot), _ctau(p._ctau), _name(p._name), _isInvisible(p._isInvisible) {}
 
 PdgParticle& PdgParticle::operator=(const PdgParticle& p) {
@@ -54,4 +59,5 @@
     _pid = p._pid; 	_name= p._name;			_mass=p._mass; 
     _charge=p._charge; 	_gamma_tot=p._gamma_tot;	_ctau = p._ctau;
+    _isInvisible = p._isInvisible;
    return *this;
 }
@@ -71,5 +77,5 @@
 }
 
-void PdgTable::insert(const int pid, const PdgParticle &p) {
+void PdgTable::insert(const long int pid, const PdgParticle &p) {
    _table.insert(std::map<int,PdgParticle>::value_type(pid,p));
 }
@@ -77,10 +83,13 @@
 void PdgTable::print() const {
    std::map<int, PdgParticle>::const_iterator i;
-   for(i = _table.begin(); i != _table.end(); i++)
+   for(i = _table.begin(); i != _table.end(); i++) {
          std::cout << "name = " << std::setw(20) << std::left << i->second.name() 
                    << "pid = "  << std::setw(10) << i->first 
                    << "\t M="   << std::setw(10) << i->second.mass() << "GeV/c^2" 
                    << "\t Q="   << std::setw(6)  << i->second.charge() << "e+" 
-                   << "\t ctau=" << i->second.ctau() << " m" << std::endl;
+                   << "\t ctau=" << i->second.ctau() << " m";
+         if(i->second.invisible()) std::cout << "\t invisible";
+         std::cout << std::endl;
+   }
 }
 
Index: trunk/src/SmearUtil.cc
===================================================================
--- trunk/src/SmearUtil.cc	(revision 468)
+++ trunk/src/SmearUtil.cc	(revision 469)
@@ -1467,5 +1467,5 @@
     curstring.clear(); // needed when using several times istringstream::str(string)
     curstring.str(temp_string);
-    int ID; string name; int charge; float mass; float width; float lifetime;
+    long int ID; std::string name; int charge; float mass; float width; float lifetime;
     // ID name   chg       mass    total width   lifetime
     //  1 d      -1      0.33000     0.00000   0.00000E+00
