// system include files #include #include // user include files #include "FWCore/Framework/interface/Frameworkfwd.h" #include "FWCore/Framework/interface/EDAnalyzer.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/MakerMacros.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "DataFormats/Math/interface/deltaR.h" #include "FWCore/Common/interface/TriggerNames.h" #include "DataFormats/Common/interface/TriggerResults.h" #include "DataFormats/PatCandidates/interface/TriggerObjectStandAlone.h" #include "DataFormats/PatCandidates/interface/PackedTriggerPrescales.h" class MiniAODTriggerAnalyzer : public edm::EDAnalyzer { public: explicit MiniAODTriggerAnalyzer(const edm::ParameterSet&); ~MiniAODTriggerAnalyzer() {} private: virtual void analyze(const edm::Event&, const edm::EventSetup&) override; edm::EDGetTokenT triggerBits_; edm::EDGetTokenT triggerObjects_; edm::EDGetTokenT triggerPrescales_; }; MiniAODTriggerAnalyzer::MiniAODTriggerAnalyzer(const edm::ParameterSet& iConfig): triggerBits_(consumes(iConfig.getParameter("bits"))), triggerObjects_(consumes(iConfig.getParameter("objects"))), triggerPrescales_(consumes(iConfig.getParameter("prescales"))) { } void MiniAODTriggerAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) { edm::Handle triggerBits; edm::Handle triggerObjects; edm::Handle triggerPrescales; iEvent.getByToken(triggerBits_, triggerBits); iEvent.getByToken(triggerObjects_, triggerObjects); iEvent.getByToken(triggerPrescales_, triggerPrescales); const edm::TriggerNames &names = iEvent.triggerNames(*triggerBits); std::cout << "\n === TRIGGER PATHS === " << std::endl; for (unsigned int i = 0, n = triggerBits->size(); i < n; ++i) { std::cout << "Trigger " << names.triggerName(i) << ", prescale " << triggerPrescales->getPrescaleForIndex(i) << ": " << (triggerBits->accept(i) ? "PASS" : "fail (or not run)") << std::endl; } std::cout << "\n === TRIGGER OBJECTS === " << std::endl; for (pat::TriggerObjectStandAlone obj : *triggerObjects) { // note: not "const &" since we want to call unpackPathNames obj.unpackPathNames(names); std::cout << "\tTrigger object: pt " << obj.pt() << ", eta " << obj.eta() << ", phi " << obj.phi() << std::endl; // Print trigger object collection and type std::cout << "\t Collection: " << obj.collection() << std::endl; std::cout << "\t Type IDs: "; for (unsigned h = 0; h < obj.filterIds().size(); ++h) std::cout << " " << obj.filterIds()[h] ; std::cout << std::endl; // Print associated trigger filters std::cout << "\t Filters: "; for (unsigned h = 0; h < obj.filterLabels().size(); ++h) std::cout << " " << obj.filterLabels()[h]; std::cout << std::endl; std::vector pathNamesAll = obj.pathNames(false); std::vector pathNamesLast = obj.pathNames(true); // Print all trigger paths, for each one record also if the object is associated to a 'l3' filter (always true for the // definition used in the PAT trigger producer) and if it's associated to the last filter of a successfull path (which // means that this object did cause this trigger to succeed; however, it doesn't work on some multi-object triggers) std::cout << "\t Paths (" << pathNamesAll.size()<<"/"<