File indexing completed on 2024-04-06 12:18:39
0001
0002
0003
0004
0005
0006
0007 #include "HLTrigger/Muon/test/HLTMuonTurnOnAnalyzer.h"
0008
0009
0010 #include "FWCore/Framework/interface/MakerMacros.h"
0011 #include "FWCore/Framework/interface/Frameworkfwd.h"
0012 #include "FWCore/Framework/interface/Event.h"
0013 #include "FWCore/Framework/interface/EventSetup.h"
0014 #include "DataFormats/Common/interface/Handle.h"
0015
0016 #include "DataFormats/L1Trigger/interface/L1MuonParticle.h"
0017 #include "DataFormats/L1Trigger/interface/L1MuonParticleFwd.h"
0018
0019 #include "DataFormats/TrackReco/interface/Track.h"
0020 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidate.h"
0021 #include "DataFormats/RecoCandidate/interface/RecoChargedCandidateFwd.h"
0022
0023 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0024
0025 #include "TFile.h"
0026 #include "TH1F.h"
0027
0028 using namespace std;
0029 using namespace edm;
0030 using namespace reco;
0031 using namespace trigger;
0032 using namespace l1extra;
0033
0034
0035 HLTMuonTurnOnAnalyzer::HLTMuonTurnOnAnalyzer(const ParameterSet& pset) {
0036 theGenLabel = pset.getUntrackedParameter<InputTag>("GenLabel");
0037 useMuonFromGenerator = pset.getUntrackedParameter<bool>("UseMuonFromGenerator");
0038 theL1CollectionLabel = pset.getUntrackedParameter<InputTag>("L1CollectionLabel");
0039 theHLTCollectionLabels = pset.getUntrackedParameter<std::vector<InputTag> >("HLTCollectionLabels");
0040 theGenToken = consumes<edm::HepMCProduct>(theGenLabel);
0041 theL1CollectionToken = consumes<trigger::TriggerFilterObjectWithRefs>(theL1CollectionLabel);
0042 for (auto& theHLTCollectionLabel : theHLTCollectionLabels) {
0043 theHLTCollectionTokens.push_back(consumes<trigger::TriggerFilterObjectWithRefs>(theHLTCollectionLabel));
0044 }
0045 theReferenceThreshold = pset.getUntrackedParameter<double>("ReferenceThreshold");
0046
0047 thePtMin = pset.getUntrackedParameter<double>("PtMin");
0048 thePtMax = pset.getUntrackedParameter<double>("PtMax");
0049 theNbins = pset.getUntrackedParameter<unsigned int>("Nbins");
0050
0051 theRootFileName = pset.getUntrackedParameter<string>("RootFileName");
0052
0053 theNumberOfEvents = 0.;
0054 }
0055
0056
0057 HLTMuonTurnOnAnalyzer::~HLTMuonTurnOnAnalyzer() = default;
0058
0059 void HLTMuonTurnOnAnalyzer::beginJob() {
0060
0061 theFile = new TFile(theRootFileName.c_str(), "RECREATE");
0062 theFile->cd();
0063
0064 char chname[256];
0065 char chtitle[256];
0066 snprintf(chname, 255, "eff_%s", theL1CollectionLabel.encode().c_str());
0067 snprintf(chtitle, 255, "Efficiency (%%) vs Generated Pt (GeV), label=%s", theL1CollectionLabel.encode().c_str());
0068 hL1eff = new TH1F(chname, chtitle, theNbins, thePtMin, thePtMax);
0069 hL1nor = new TH1F(chname, chtitle, theNbins, thePtMin, thePtMax);
0070
0071 for (auto& theHLTCollectionLabel : theHLTCollectionLabels) {
0072 snprintf(chname, 255, "eff_%s", theHLTCollectionLabel.encode().c_str());
0073 snprintf(chtitle, 255, "Efficiency (%%) vs Generated Pt (GeV), label=%s", theHLTCollectionLabel.encode().c_str());
0074 hHLTeff.push_back(new TH1F(chname, chtitle, theNbins, thePtMin, thePtMax));
0075 hHLTnor.push_back(new TH1F(chname, chtitle, theNbins, thePtMin, thePtMax));
0076 }
0077 }
0078
0079 void HLTMuonTurnOnAnalyzer::endJob() {
0080 LogInfo("HLTMuonTurnOnAnalyzer") << " (Weighted) number of analyzed events= " << theNumberOfEvents;
0081 theFile->cd();
0082
0083 if (theNumberOfEvents == 0) {
0084 LogInfo("HLTMuonTurnOnAnalyzer") << " No histograms will be written because number of events=0!!!";
0085 theFile->Close();
0086 return;
0087 }
0088
0089
0090 hL1eff->Divide(hL1nor);
0091 hL1eff->Scale(100.);
0092
0093
0094 for (unsigned int i = 0; i < theHLTCollectionLabels.size(); i++) {
0095 hHLTeff[i]->Divide(hHLTnor[i]);
0096 hHLTeff[i]->Scale(100.);
0097 }
0098
0099
0100 hL1eff->Write();
0101 for (unsigned int i = 0; i < theHLTCollectionLabels.size(); i++) {
0102 hHLTeff[i]->Write();
0103 }
0104
0105 theFile->Close();
0106 }
0107
0108 void HLTMuonTurnOnAnalyzer::analyze(const Event& event, const EventSetup& eventSetup) {
0109 theFile->cd();
0110
0111
0112 double this_event_weight = 1.;
0113 Handle<HepMCProduct> genProduct;
0114 event.getByToken(theGenToken, genProduct);
0115
0116 const HepMC::GenEvent* evt = genProduct->GetEvent();
0117 HepMC::WeightContainer weights = evt->weights();
0118 if (weights.size() > 0)
0119 this_event_weight = weights[0];
0120 theNumberOfEvents += this_event_weight;
0121
0122
0123 Handle<TriggerFilterObjectWithRefs> l1cands;
0124 event.getByToken(theL1CollectionToken, l1cands);
0125
0126
0127 std::vector<Handle<TriggerFilterObjectWithRefs> > hltcands(theHLTCollectionLabels.size());
0128
0129 unsigned int modules_in_this_event = 0;
0130 for (unsigned int i = 0; i < theHLTCollectionLabels.size(); i++) {
0131 event.getByToken(theHLTCollectionTokens[i], hltcands[i]);
0132 if (hltcands[i].failedToGet())
0133 break;
0134 modules_in_this_event++;
0135 }
0136
0137
0138 bool refmuon_found = false;
0139 double ptuse = -1;
0140
0141 if (useMuonFromGenerator) {
0142 HepMC::GenEvent::particle_const_iterator part;
0143 for (part = evt->particles_begin(); part != evt->particles_end(); ++part) {
0144 int id1 = (*part)->pdg_id();
0145 if (id1 != 13 && id1 != -13)
0146 continue;
0147 float pt1 = (*part)->momentum().perp();
0148 if (pt1 > ptuse) {
0149 refmuon_found = true;
0150 ptuse = pt1;
0151 }
0152 }
0153 } else {
0154 unsigned int i = modules_in_this_event - 1;
0155 vector<RecoChargedCandidateRef> vref;
0156 hltcands[i]->getObjects(TriggerMuon, vref);
0157 for (auto& k : vref) {
0158 RecoChargedCandidateRef candref = RecoChargedCandidateRef(k);
0159 TrackRef tk = candref->get<TrackRef>();
0160 double pt = tk->pt();
0161 if (pt > ptuse) {
0162 refmuon_found = true;
0163 ptuse = pt;
0164 }
0165 }
0166 }
0167
0168 if (!refmuon_found) {
0169 LogInfo("HLTMuonTurnOnAnalyzer") << " NO reference muon found!!!";
0170 LogInfo("HLTMuonTurnOnAnalyzer") << " Skipping event";
0171 return;
0172 }
0173
0174
0175 unsigned int nL1FoundRef = 0;
0176 double epsilon = 0.001;
0177 vector<L1MuonParticleRef> l1mu;
0178 l1cands->getObjects(TriggerL1Mu, l1mu);
0179 for (auto& k : l1mu) {
0180 L1MuonParticleRef candref = L1MuonParticleRef(k);
0181
0182
0183 double ptLUT = candref->pt();
0184
0185 if (ptLUT + epsilon > theReferenceThreshold)
0186 nL1FoundRef++;
0187 }
0188 hL1nor->Fill(ptuse, this_event_weight);
0189 if (nL1FoundRef > 0)
0190 hL1eff->Fill(ptuse, this_event_weight);
0191
0192
0193 unsigned int last_module = modules_in_this_event - 1;
0194 if ((!useMuonFromGenerator) && last_module > 0)
0195 last_module--;
0196 for (unsigned int i = 0; i <= last_module; i++) {
0197 double ptcut = theReferenceThreshold;
0198 unsigned nFound = 0;
0199 vector<RecoChargedCandidateRef> vref;
0200 hltcands[i]->getObjects(TriggerMuon, vref);
0201 for (auto& k : vref) {
0202 RecoChargedCandidateRef candref = RecoChargedCandidateRef(k);
0203 TrackRef tk = candref->get<TrackRef>();
0204 double pt = tk->pt();
0205 if (pt > ptcut)
0206 nFound++;
0207 }
0208 hHLTnor[i]->Fill(ptuse, this_event_weight);
0209 if (nFound > 0)
0210 hHLTeff[i]->Fill(ptuse, this_event_weight);
0211 }
0212 }
0213
0214 DEFINE_FWK_MODULE(HLTMuonTurnOnAnalyzer);