CMS 3D CMS Logo

SUSY_HLT_Muon_Hadronic.cc
Go to the documentation of this file.
7 
8 bool comparePt(Lepton a, Lepton b) { return (a.pt > b.pt); }
9 
11  edm::LogInfo("SUSY_HLT_Muon_Hadronic") << "Constructor SUSY_HLT_Muon_Hadronic::SUSY_HLT_Muon_Hadronic " << std::endl;
12  // Get parameters from configuration file
13  theTrigSummary_ = consumes<trigger::TriggerEvent>(ps.getParameter<edm::InputTag>("trigSummary"));
14  theMuonCollection_ = consumes<reco::MuonCollection>(ps.getParameter<edm::InputTag>("MuonCollection"));
15  thePfMETCollection_ = consumes<reco::PFMETCollection>(ps.getParameter<edm::InputTag>("pfMETCollection"));
16  thePfJetCollection_ = consumes<reco::PFJetCollection>(ps.getParameter<edm::InputTag>("pfJetCollection"));
17  theCaloJetCollection_ = consumes<reco::CaloJetCollection>(ps.getParameter<edm::InputTag>("caloJetCollection"));
18  triggerResults_ = consumes<edm::TriggerResults>(ps.getParameter<edm::InputTag>("TriggerResults"));
19  HLTProcess_ = ps.getParameter<std::string>("HLTProcess");
20  triggerPath_ = ps.getParameter<std::string>("TriggerPath");
21  triggerPathAuxiliaryForMuon_ = ps.getParameter<std::string>("TriggerPathAuxiliaryForMuon");
22  triggerPathAuxiliaryForHadronic_ = ps.getParameter<std::string>("TriggerPathAuxiliaryForHadronic");
23  triggerFilter_ = ps.getParameter<edm::InputTag>("TriggerFilter");
24  ptMuonOffline_ = ps.getUntrackedParameter<double>("ptMuonOffline");
25  etaMuonOffline_ = ps.getUntrackedParameter<double>("etaMuonOffline");
26  HTOffline_ = ps.getUntrackedParameter<double>("HTOffline");
27  METOffline_ = ps.getUntrackedParameter<double>("METOffline");
28  ptThrJet_ = ps.getUntrackedParameter<double>("PtThrJet");
29  etaThrJet_ = ps.getUntrackedParameter<double>("EtaThrJet");
30 }
31 
33  edm::LogInfo("SUSY_HLT_Muon_Hadronic") << "Destructor SUSY_HLT_Muon_Hadronic::~SUSY_HLT_Muon_Hadronic " << std::endl;
34 }
35 
37  bool changed;
38 
39  if (!fHltConfig.init(run, e, HLTProcess_, changed)) {
40  edm::LogError("SUSY_HLT_Muon_Hadronic") << "Initialization of HLTConfigProvider failed!!";
41  return;
42  }
43 
44  bool pathFound = false;
45  const std::vector<std::string> allTrigNames = fHltConfig.triggerNames();
46  for (size_t j = 0; j < allTrigNames.size(); ++j) {
47  if (allTrigNames[j].find(triggerPath_) != std::string::npos) {
48  pathFound = true;
49  }
50  }
51 
52  if (!pathFound) {
53  LogDebug("SUSY_HLT_Muon_Hadronic") << "Path not found"
54  << "\n";
55  return;
56  }
57  // std::vector<std::string> filtertags = fHltConfig.moduleLabels( triggerPath_
58  // ); triggerFilter_ =
59  // edm::InputTag(filtertags[filtertags.size()-1],"",fHltConfig.processName());
60  // triggerFilter_ = edm::InputTag("hltPFMET120Mu5L3PreFiltered", "",
61  // fHltConfig.processName());
62 
63  edm::LogInfo("SUSY_HLT_Muon_Hadronic") << "SUSY_HLT_Muon_Hadronic::beginRun" << std::endl;
64 }
65 
67  edm::LogInfo("SUSY_HLT_Muon_Hadronic") << "SUSY_HLT_Muon_Hadronic::bookHistograms" << std::endl;
68  // book at beginRun
69  bookHistos(ibooker_);
70 }
71 
73  edm::LogInfo("SUSY_HLT_Muon_Hadronic") << "SUSY_HLT_Muon_Hadronic::analyze" << std::endl;
74 
75  //-------------------------------
76  //--- MET
77  //-------------------------------
78  edm::Handle<reco::PFMETCollection> pfMETCollection;
79  e.getByToken(thePfMETCollection_, pfMETCollection);
80  if (!pfMETCollection.isValid()) {
81  edm::LogError("SUSY_HLT_Muon_Hadronic") << "invalid collection: PFMET"
82  << "\n";
83  return;
84  }
85  //-------------------------------
86  //--- Jets
87  //-------------------------------
88  edm::Handle<reco::PFJetCollection> pfJetCollection;
89  e.getByToken(thePfJetCollection_, pfJetCollection);
90  if (!pfJetCollection.isValid()) {
91  edm::LogError("SUSY_HLT_Muon_Hadronic") << "invalid collection: PFJets"
92  << "\n";
93  return;
94  }
95  edm::Handle<reco::CaloJetCollection> caloJetCollection;
96  e.getByToken(theCaloJetCollection_, caloJetCollection);
97  if (!caloJetCollection.isValid()) {
98  edm::LogError("SUSY_HLT_Muon_Hadronic") << "invalid collection: CaloJets"
99  << "\n";
100  return;
101  }
102 
103  //-------------------------------
104  //--- Muon
105  //-------------------------------
107  e.getByToken(theMuonCollection_, MuonCollection);
108  if (!MuonCollection.isValid()) {
109  edm::LogError("SUSY_HLT_Mu_Hadronic") << "invalid collection: Muons "
110  << "\n";
111  return;
112  }
113 
114  //-------------------------------
115  //--- Trigger
116  //-------------------------------
118  e.getByToken(triggerResults_, hltresults);
119  if (!hltresults.isValid()) {
120  edm::LogError("SUSY_HLT_Muon_Hadronic") << "invalid collection: TriggerResults"
121  << "\n";
122  return;
123  }
124  edm::Handle<trigger::TriggerEvent> triggerSummary;
125  e.getByToken(theTrigSummary_, triggerSummary);
126  if (!triggerSummary.isValid()) {
127  edm::LogError("SUSY_HLT_Muon_Hadronic") << "invalid collection: TriggerSummary"
128  << "\n";
129  return;
130  }
131 
132  // get online objects
133  std::vector<Lepton> onlineMuons;
134  size_t filterIndex = triggerSummary->filterIndex(triggerFilter_);
136  if (!(filterIndex >= triggerSummary->sizeFilters())) {
137  const trigger::Keys &keys = triggerSummary->filterKeys(filterIndex);
138  for (size_t j = 0; j < keys.size(); ++j) {
139  trigger::TriggerObject foundObject = triggerObjects[keys[j]];
140  if (fabs(foundObject.id()) == 13) { // It's a muon
141  h_triggerMuPt->Fill(foundObject.pt());
142  h_triggerMuEta->Fill(foundObject.eta());
143  h_triggerMuPhi->Fill(foundObject.phi());
144  Lepton theMuon;
145  theMuon.pt = foundObject.pt();
146  theMuon.phi = foundObject.phi();
147  theMuon.eta = foundObject.eta();
148  onlineMuons.push_back(theMuon);
149  }
150  }
151  }
152 
153  bool hasFired = false;
154  bool hasFiredAuxiliaryForMuonLeg = false;
155  bool hasFiredAuxiliaryForHadronicLeg = false;
156  const edm::TriggerNames &trigNames = e.triggerNames(*hltresults);
157  unsigned int numTriggers = trigNames.size();
158  for (unsigned int hltIndex = 0; hltIndex < numTriggers; ++hltIndex) {
159  if (trigNames.triggerName(hltIndex).find(triggerPath_) != std::string::npos && hltresults->wasrun(hltIndex) &&
160  hltresults->accept(hltIndex))
161  hasFired = true;
162  if (trigNames.triggerName(hltIndex).find(triggerPathAuxiliaryForMuon_) != std::string::npos &&
163  hltresults->wasrun(hltIndex) && hltresults->accept(hltIndex))
164  hasFiredAuxiliaryForMuonLeg = true;
165  if (trigNames.triggerName(hltIndex).find(triggerPathAuxiliaryForHadronic_) != std::string::npos &&
166  hltresults->wasrun(hltIndex) && hltresults->accept(hltIndex))
167  hasFiredAuxiliaryForHadronicLeg = true;
168  }
169 
170  if (hasFiredAuxiliaryForMuonLeg || hasFiredAuxiliaryForHadronicLeg || !e.isRealData()) {
171  std::vector<Lepton> offlineMuons;
172  for (reco::MuonCollection::const_iterator muon = MuonCollection->begin(); muon != MuonCollection->end(); ++muon) {
173  if (fabs(muon->eta()) > etaMuonOffline_)
174  continue;
175  Lepton theMuon;
176  theMuon.pt = muon->pt();
177  theMuon.phi = muon->phi();
178  theMuon.eta = muon->eta();
179  offlineMuons.push_back(theMuon);
180  }
181 
182  std::sort(onlineMuons.begin(), onlineMuons.end(), comparePt);
183  std::sort(offlineMuons.begin(), offlineMuons.end(), comparePt);
184  /*
185  std::cout << "OFFLINE MUON" << std::endl;
186  for(std::vector<Lepton>::iterator offline_muon = offlineMuons.begin();
187  offline_muon != offlineMuons.end(); offline_muon++) { std::cout <<
188  offline_muon->pt << std::endl;
189  }
190  std::cout << "ONLINE MUON" << std::endl;
191  for(std::vector<Lepton>::iterator online_muon = onlineMuons.begin();
192  online_muon != onlineMuons.end(); online_muon++) { std::cout <<
193  online_muon->pt << std::endl;
194  }
195  */
196  // Matching the muon
197  int indexOfMatchedMuon = -1;
198  int offlineCounter = 0;
199  for (std::vector<Lepton>::iterator offline_muon = offlineMuons.begin();
200  (offline_muon != offlineMuons.end() && indexOfMatchedMuon == -1);
201  offline_muon++) {
202  for (std::vector<Lepton>::iterator online_muon = onlineMuons.begin(); online_muon != onlineMuons.end();
203  online_muon++) {
204  if (sqrt((offline_muon->phi - online_muon->phi) * (offline_muon->phi - online_muon->phi) +
205  (offline_muon->eta - online_muon->eta) * (offline_muon->eta - online_muon->eta)) < 0.5) {
206  indexOfMatchedMuon = offlineCounter;
207  // std::cout << "Offline " << offline_muon->pt << " " << "Online " <<
208  // online_muon->pt << std::endl;
209  break;
210  }
211  }
212  offlineCounter++;
213  }
214  float caloHT = 0.0;
215  float pfHT = 0.0;
216  for (reco::PFJetCollection::const_iterator i_pfjet = pfJetCollection->begin(); i_pfjet != pfJetCollection->end();
217  ++i_pfjet) {
218  if (i_pfjet->pt() < ptThrJet_)
219  continue;
220  if (fabs(i_pfjet->eta()) > etaThrJet_)
221  continue;
222  pfHT += i_pfjet->pt();
223  }
224  for (reco::CaloJetCollection::const_iterator i_calojet = caloJetCollection->begin();
225  i_calojet != caloJetCollection->end();
226  ++i_calojet) {
227  if (i_calojet->pt() < ptThrJet_)
228  continue;
229  if (fabs(i_calojet->eta()) > etaThrJet_)
230  continue;
231  caloHT += i_calojet->pt();
232  }
233  // Need to apply the MET offline cut to be in the MET plateau
234  if ((hasFiredAuxiliaryForMuonLeg || !e.isRealData()) && !offlineMuons.empty() &&
235  pfMETCollection->begin()->et() > METOffline_ && pfHT > HTOffline_) {
236  if (hasFired && indexOfMatchedMuon >= 0) {
237  h_MuTurnOn_num->Fill(offlineMuons.at(indexOfMatchedMuon).pt);
238  h_MuTurnOn_den->Fill(offlineMuons.at(indexOfMatchedMuon).pt);
239  } else {
240  h_MuTurnOn_den->Fill(offlineMuons.at(0).pt);
241  }
242  }
243  // Need to apply the pt offline cut to be in the muon pt plateau
244  if ((hasFiredAuxiliaryForHadronicLeg || !e.isRealData()) && indexOfMatchedMuon >= 0 &&
245  offlineMuons.at(indexOfMatchedMuon).pt > ptMuonOffline_ && pfHT > HTOffline_) {
246  if (hasFired) {
247  h_pfMetTurnOn_num->Fill(pfMETCollection->begin()->et());
248  }
249  h_pfMetTurnOn_den->Fill(pfMETCollection->begin()->et());
250  }
251  if ((hasFiredAuxiliaryForHadronicLeg || !e.isRealData()) && indexOfMatchedMuon >= 0 &&
252  offlineMuons.at(indexOfMatchedMuon).pt > ptMuonOffline_ && pfMETCollection->begin()->et() > METOffline_) {
253  if (hasFired) {
254  h_pfHTTurnOn_num->Fill(pfHT);
255  }
256  h_pfHTTurnOn_den->Fill(pfHT);
257  }
258  }
259 }
260 
262  edm::LogInfo("SUSY_HLT_Muon_Hadronic") << "SUSY_HLT_Muon_Hadronic::endRun" << std::endl;
263 }
264 
266  ibooker_.cd();
267  ibooker_.setCurrentFolder("HLT/SUSYBSM/" + triggerPath_);
268 
269  // offline quantities
270 
271  // online quantities
272  h_triggerMuPt = ibooker_.book1D("triggerMuPt", "Trigger Muon Pt; GeV", 20, 0.0, 500.0);
273  h_triggerMuEta = ibooker_.book1D("triggerMuEta", "Trigger Muon Eta", 20, -3.0, 3.0);
274  h_triggerMuPhi = ibooker_.book1D("triggerMuPhi", "Trigger Muon Phi", 20, -3.5, 3.5);
275 
276  // num and den hists to be divided in harvesting step to make turn on curves
277  h_pfMetTurnOn_num = ibooker_.book1D("pfMetTurnOn_num", "PF MET Turn On Numerator", 20, 0.0, 500.0);
278  h_pfMetTurnOn_den = ibooker_.book1D("pfMetTurnOn_den", "PF MET Turn OnDenominator", 20, 0.0, 500.0);
279  h_pfHTTurnOn_num = ibooker_.book1D("pfHTTurnOn_num", "PF HT Turn On Numerator", 30, 0.0, 1500.0);
280  h_pfHTTurnOn_den = ibooker_.book1D("pfHTTurnOn_den", "PF HT Turn On Denominator", 30, 0.0, 1500.0);
281  h_MuTurnOn_num = ibooker_.book1D("MuTurnOn_num", "Muon Turn On Numerator", 30, 0.0, 150);
282  h_MuTurnOn_den = ibooker_.book1D("MuTurnOn_den", "Muon Turn On Denominator", 30, 0.0, 150.0);
283 
284  ibooker_.cd();
285 }
286 
287 // define this as a plug-in
#define LogDebug(id)
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
bool wasrun() const
Was at least one path run?
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
edm::EDGetTokenT< trigger::TriggerEvent > theTrigSummary_
int id() const
getters
Definition: TriggerObject.h:55
trigger::size_type sizeFilters() const
Definition: TriggerEvent.h:135
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
float phi() const
Definition: TriggerObject.h:58
bool accept() const
Has at least one path accepted the event?
const std::vector< std::string > & triggerNames() const
names of trigger paths
const Keys & filterKeys(trigger::size_type index) const
Definition: TriggerEvent.h:111
trigger::size_type filterIndex(const edm::InputTag &filterTag) const
find index of filter in data-member vector from filter tag
Definition: TriggerEvent.h:123
std::string triggerPathAuxiliaryForHadronic_
Strings::size_type size() const
Definition: TriggerNames.cc:31
float eta() const
Definition: TriggerObject.h:57
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
bool isRealData() const
Definition: EventBase.h:62
std::vector< Muon > MuonCollection
collection of Muon objects
Definition: MuonFwd.h:9
void Fill(long long x)
edm::EDGetTokenT< reco::PFJetCollection > thePfJetCollection_
Single trigger physics object (e.g., an isolated muon)
Definition: TriggerObject.h:22
edm::EDGetTokenT< reco::CaloJetCollection > theCaloJetCollection_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:268
void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override
const TriggerObjectCollection & getObjects() const
Definition: TriggerEvent.h:98
T sqrt(T t)
Definition: SSEVec.h:18
MonitorElement * h_pfMetTurnOn_num
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:106
bool isValid() const
Definition: HandleBase.h:74
MonitorElement * h_pfHTTurnOn_den
edm::EDGetTokenT< edm::TriggerResults > triggerResults_
edm::EDGetTokenT< reco::MuonCollection > theMuonCollection_
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
Definition: TriggerObject.h:81
void endRun(edm::Run const &run, edm::EventSetup const &eSetup) override
static const char *const trigNames[]
Definition: EcalDumpRaw.cc:74
std::string const & triggerName(unsigned int index) const
Definition: TriggerNames.cc:22
edm::EDGetTokenT< reco::PFMETCollection > thePfMETCollection_
std::vector< size_type > Keys
MonitorElement * h_pfHTTurnOn_num
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
double b
Definition: hdecay.h:120
double a
Definition: hdecay.h:121
SUSY_HLT_Muon_Hadronic(const edm::ParameterSet &ps)
void bookHistos(DQMStore::IBooker &)
Definition: Lepton.py:1
MonitorElement * h_pfMetTurnOn_den
bool comparePt(Lepton a, Lepton b)
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
Definition: Event.cc:256
Definition: Run.h:45