00001 #include "PhysicsTools/CandAlgos/interface/GenJetParticleSelector.h" 00002 #include "DataFormats/Candidate/interface/Candidate.h" 00003 #include "FWCore/ParameterSet/interface/ParameterSet.h" 00004 #include "SimGeneral/HepPDTRecord/interface/PdtEntry.h" 00005 #include "FWCore/Utilities/interface/EDMException.h" 00006 #include <algorithm> 00007 using namespace std; 00008 using namespace edm; 00009 00010 GenJetParticleSelector::GenJetParticleSelector(const ParameterSet& cfg) : 00011 stableOnly_(cfg.getParameter<bool>("stableOnly")), 00012 partons_(false), bInclude_(false) { 00013 const string excludeString("excludeList"); 00014 const string includeString("includeList"); 00015 vpdt includeList, excludeList; 00016 vector<string> vPdtParams = cfg.getParameterNamesForType<vpdt>(); 00017 bool found = std::find(vPdtParams.begin(), vPdtParams.end(), includeString) != vPdtParams.end(); 00018 if(found) includeList = cfg.getParameter<vpdt>(includeString); 00019 found = find(vPdtParams.begin(), vPdtParams.end(), excludeString) != vPdtParams.end(); 00020 if(found) excludeList = cfg.getParameter<vpdt>(excludeString); 00021 const string partonsString("partons"); 00022 vector<string> vBoolParams = cfg.getParameterNamesForType<bool>(); 00023 found = find(vBoolParams.begin(), vBoolParams.end(), partonsString) != vBoolParams.end(); 00024 if(found) partons_ = cfg.getParameter<bool>(partonsString); 00025 bool bExclude = false; 00026 if (includeList.size() > 0) bInclude_ = true; 00027 if (excludeList.size() > 0) bExclude = true; 00028 00029 if (bInclude_ && bExclude) { 00030 throw cms::Exception("ConfigError", "not allowed to use both includeList and excludeList at the same time\n"); 00031 } 00032 else if (bInclude_) { 00033 pdtList_ = includeList; 00034 } 00035 else { 00036 pdtList_ = excludeList; 00037 } 00038 if(stableOnly_ && partons_) { 00039 throw cms::Exception("ConfigError", "not allowed to have both stableOnly and partons true at the same time\n"); 00040 } 00041 } 00042 00043 bool GenJetParticleSelector::operator()(const reco::Candidate& p) { 00044 int status = p.status(); 00045 int id = abs(p.pdgId()); 00046 if((!stableOnly_ || status == 1) && !partons_ && 00047 (pIds_.find(id) == pIds_.end() ^ bInclude_)) 00048 return true; 00049 else if(partons_ && 00050 (p.numberOfDaughters() > 0 && (p.daughter(0)->pdgId() == 91 || p.daughter(0)->pdgId() == 92)) && 00051 ((pIds_.find(id) == pIds_.end() ^ bInclude_))) 00052 return true; 00053 else 00054 return false; 00055 } 00056 00057 void GenJetParticleSelector::init(const edm::EventSetup& es) { 00058 for(vpdt::iterator i = pdtList_.begin(); i != pdtList_.end(); ++i ) 00059 i->setup(es); 00060 } 00061