00001 #include "PhysicsTools/PatAlgos/interface/MultiIsolator.h" 00002 #include "PhysicsTools/PatAlgos/interface/SimpleIsolator.h" 00003 #include "PhysicsTools/PatAlgos/interface/IsoDepositIsolator.h" 00004 #include "DataFormats/PatCandidates/interface/Flags.h" 00005 #include <sstream> 00006 00007 using namespace pat::helper; 00008 00009 MultiIsolator::MultiIsolator(const edm::ParameterSet &conf, bool cuts) { 00010 using pat::Flags; 00011 if (conf.exists("tracker")) addIsolator(conf.getParameter<edm::ParameterSet>("tracker"), cuts, Flags::Isolation::Tracker, pat::TrackIso); 00012 if (conf.exists("ecal")) addIsolator(conf.getParameter<edm::ParameterSet>("ecal"), cuts, Flags::Isolation::ECal, pat::EcalIso); 00013 if (conf.exists("hcal")) addIsolator(conf.getParameter<edm::ParameterSet>("hcal"), cuts, Flags::Isolation::HCal, pat::HcalIso); 00014 if (conf.exists("calo")) addIsolator(conf.getParameter<edm::ParameterSet>("calo"), cuts, Flags::Isolation::Calo, pat::CaloIso); 00015 if (conf.exists("calo") && (conf.exists("ecal") || conf.exists("hcal"))) { 00016 throw cms::Exception("Configuration") << 00017 "MultiIsolator: you can't specify both 'calo' isolation and 'ecal'/'hcal', " << 00018 "as the 'calo' isolation flag is just the logical OR of 'ecal' and 'hcal'.\n"; 00019 } 00020 if (conf.exists("pfAllParticles")) addIsolator(conf.getParameter<edm::ParameterSet>("pfAllParticles"), cuts,Flags::Isolation::Calo, pat::PfAllParticleIso); 00021 if (conf.exists("pfChargedHadron")) addIsolator(conf.getParameter<edm::ParameterSet>("pfChargedHadron"), cuts,Flags::Isolation::Calo, pat::PfChargedHadronIso); 00022 if (conf.exists("pfNeutralHadron")) addIsolator(conf.getParameter<edm::ParameterSet>("pfNeutralHadron"), cuts,Flags::Isolation::Calo, pat::PfNeutralHadronIso); 00023 if (conf.exists("pfGamma")) addIsolator(conf.getParameter<edm::ParameterSet>("pfGamma"), cuts,Flags::Isolation::Calo, pat::PfGammaIso); 00024 if (conf.exists("user")) { 00025 00026 std::vector<edm::ParameterSet> psets = conf.getParameter<std::vector<edm::ParameterSet> >("user"); 00027 if (psets.size() > 5) { 00028 throw cms::Exception("Configuration") << 00029 "MultiIsolator: you can specify at most 5 user isolation collections.\n"; 00030 } 00031 uint32_t bit = Flags::Isolation::User1; 00032 for (std::vector<edm::ParameterSet>::const_iterator it = psets.begin(), ed = psets.end(); it != ed; ++it, bit <<= 1) { 00033 addIsolator(*it, cuts, bit, pat::IsolationKeys(pat::UserBaseIso + (it - psets.begin()))); 00034 } 00035 } 00036 } 00037 00038 00039 void 00040 MultiIsolator::addIsolator(BaseIsolator *iso, uint32_t mask, pat::IsolationKeys key) { 00041 isolators_.push_back(iso); 00042 masks_.push_back(mask); 00043 keys_.push_back(key); 00044 } 00045 00046 BaseIsolator * 00047 MultiIsolator::make(const edm::ParameterSet &conf, bool withCut) { 00048 if (conf.empty()) return 0; 00049 if (conf.exists("placeholder") && conf.getParameter<bool>("placeholder")) return 0; 00050 if (conf.exists("deltaR")) { 00051 return new IsoDepositIsolator(conf, withCut); 00052 } else { 00053 return new SimpleIsolator(conf, withCut); 00054 } 00055 } 00056 00057 00058 void 00059 MultiIsolator::addIsolator(const edm::ParameterSet &conf, bool withCut, uint32_t mask, pat::IsolationKeys key) { 00060 BaseIsolator * iso = make(conf, withCut); 00061 if (iso) addIsolator(iso, mask, key); 00062 } 00063 00064 00065 void 00066 MultiIsolator::beginEvent(const edm::Event &event, const edm::EventSetup &eventSetup) { 00067 for (boost::ptr_vector<BaseIsolator>::iterator it = isolators_.begin(), ed = isolators_.end(); it != ed; ++it) { 00068 it->beginEvent(event, eventSetup); 00069 } 00070 } 00071 00072 void 00073 MultiIsolator::endEvent() { 00074 for (boost::ptr_vector<BaseIsolator>::iterator it = isolators_.begin(), ed = isolators_.end(); it != ed; ++it) { 00075 it->endEvent(); 00076 } 00077 } 00078 00079 void 00080 MultiIsolator::print(std::ostream &out) const { 00081 for (boost::ptr_vector<BaseIsolator>::const_iterator it = isolators_.begin(), ed = isolators_.end(); it != ed; ++it) { 00082 out << " * "; 00083 it->print(out); 00084 out << ": Flag " << pat::Flags::bitToString( masks_[it - isolators_.begin()] ) << "\n"; 00085 } 00086 out << "\n"; 00087 } 00088 00089 std::string 00090 MultiIsolator::printSummary() const { 00091 std::ostringstream isoSumm; 00092 print(isoSumm); 00093 return isoSumm.str(); 00094 } 00095