CMS 3D CMS Logo

SUSY_HLT_MuEle_Hadronic.cc
Go to the documentation of this file.
9 
11  edm::LogInfo("SUSY_HLT_MuEle_Hadronic")
12  << "Constructor SUSY_HLT_MuEle_Hadronic::SUSY_HLT_MuEle_Hadronic " << std::endl;
13  // Get parameters from configuration file
14  theTrigSummary_ = consumes<trigger::TriggerEvent>(ps.getParameter<edm::InputTag>("trigSummary"));
15  theMuonCollection_ = consumes<reco::MuonCollection>(ps.getParameter<edm::InputTag>("MuonCollection"));
16  theElectronCollection_ = consumes<reco::GsfElectronCollection>(ps.getParameter<edm::InputTag>("ElectronCollection"));
17  thePfJetCollection_ = consumes<reco::PFJetCollection>(ps.getParameter<edm::InputTag>("pfJetCollection"));
18  theCaloJetCollection_ = consumes<reco::CaloJetCollection>(ps.getParameter<edm::InputTag>("caloJetCollection"));
19  triggerResults_ = consumes<edm::TriggerResults>(ps.getParameter<edm::InputTag>("TriggerResults"));
20  HLTProcess_ = ps.getParameter<std::string>("HLTProcess");
21  triggerPath_ = ps.getParameter<std::string>("TriggerPath");
22  triggerPathAuxiliaryForMuEle_ = ps.getParameter<std::string>("TriggerPathAuxiliaryForMuEle");
23  triggerPathAuxiliaryForHadronic_ = ps.getParameter<std::string>("TriggerPathAuxiliaryForHadronic");
24  triggerFilter_ = ps.getParameter<edm::InputTag>("TriggerFilter");
25  ptThrJet_ = ps.getUntrackedParameter<double>("PtThrJet");
26  etaThrJet_ = ps.getUntrackedParameter<double>("EtaThrJet");
27 }
28 
30  edm::LogInfo("SUSY_HLT_MuEle_Hadronic")
31  << "Destructor SUSY_HLT_MuEle_Hadronic::~SUSY_HLT_MuEle_Hadronic " << std::endl;
32 }
33 
35  bool changed;
36 
37  if (!fHltConfig.init(run, e, HLTProcess_, changed)) {
38  edm::LogError("SUSY_HLT_MuEle_Hadronic") << "Initialization of HLTConfigProvider failed!!";
39  return;
40  }
41 
42  bool pathFound = false;
43  const std::vector<std::string> allTrigNames = fHltConfig.triggerNames();
44  for (size_t j = 0; j < allTrigNames.size(); ++j) {
45  if (allTrigNames[j].find(triggerPath_) != std::string::npos) {
46  pathFound = true;
47  }
48  }
49 
50  if (!pathFound) {
51  LogDebug("SUSY_HLT_MuEle_Hadronic") << "Path not found"
52  << "\n";
53  return;
54  }
55  // std::vector<std::string> filtertags = fHltConfig.moduleLabels( triggerPath_
56  // ); triggerFilter_ =
57  // edm::InputTag(filtertags[filtertags.size()-1],"",fHltConfig.processName());
58  // triggerFilter_ = edm::InputTag("hltPFMET120Mu5L3PreFiltered", "",
59  // fHltConfig.processName());
60 
61  edm::LogInfo("SUSY_HLT_MuEle_Hadronic") << "SUSY_HLT_MuEle_Hadronic::beginRun" << std::endl;
62 }
63 
65  edm::LogInfo("SUSY_HLT_MuEle_Hadronic") << "SUSY_HLT_MuEle_Hadronic::bookHistograms" << std::endl;
66  // book at beginRun
67  bookHistos(ibooker_);
68 }
69 
71  edm::LogInfo("SUSY_HLT_MuEle_Hadronic") << "SUSY_HLT_MuEle_Hadronic::analyze" << std::endl;
72 
73  //-------------------------------
74  //--- Jets
75  //-------------------------------
76  edm::Handle<reco::PFJetCollection> pfJetCollection;
77  e.getByToken(thePfJetCollection_, pfJetCollection);
78  if (!pfJetCollection.isValid()) {
79  edm::LogError("SUSY_HLT_MuEle_Hadronic") << "invalid collection: PFJets"
80  << "\n";
81  return;
82  }
83  edm::Handle<reco::CaloJetCollection> caloJetCollection;
84  e.getByToken(theCaloJetCollection_, caloJetCollection);
85  if (!caloJetCollection.isValid()) {
86  edm::LogError("SUSY_HLT_MuEle_Hadronic") << "invalid collection: CaloJets"
87  << "\n";
88  return;
89  }
90 
91  //-------------------------------
92  //--- Muon
93  //-------------------------------
95  e.getByToken(theMuonCollection_, MuonCollection);
96  if (!MuonCollection.isValid()) {
97  edm::LogError("SUSY_HLT_MuEle_Hadronic") << "invalid collection: Muons "
98  << "\n";
99  return;
100  }
101 
102  //-------------------------------
103  //--- Electron
104  //-------------------------------
106  e.getByToken(theElectronCollection_, ElectronCollection);
107  if (!ElectronCollection.isValid()) {
108  edm::LogError("SUSY_HLT_MuEle_Hadronic") << "invalid collection: Electrons "
109  << "\n";
110  return;
111  }
112 
113  //-------------------------------
114  //--- Trigger
115  //-------------------------------
117  e.getByToken(triggerResults_, hltresults);
118  if (!hltresults.isValid()) {
119  edm::LogError("SUSY_HLT_MuEle_Hadronic") << "invalid collection: TriggerResults"
120  << "\n";
121  return;
122  }
123  edm::Handle<trigger::TriggerEvent> triggerSummary;
124  e.getByToken(theTrigSummary_, triggerSummary);
125  if (!triggerSummary.isValid()) {
126  edm::LogError("SUSY_HLT_MuEle_Hadronic") << "invalid collection: TriggerSummary"
127  << "\n";
128  return;
129  }
130 
131  // get online objects
132  std::vector<float> ptMuon, etaMuon, phiMuon, ptElectron, etaElectron, phiElectron;
133  size_t filterIndexEle = triggerSummary->filterIndex(triggerFilter_);
135  if (!(filterIndexEle >= triggerSummary->sizeFilters())) {
136  const trigger::Keys &keys = triggerSummary->filterKeys(filterIndexEle);
137  for (size_t j = 0; j < keys.size(); ++j) {
138  trigger::TriggerObject foundObject = triggerObjects[keys[j]];
139  if (foundObject.id() == trigger::TriggerElectron) { // It's an electron
140 
141  bool same = false;
142  for (unsigned int x = 0; x < ptElectron.size(); x++) {
143  if (fabs(ptElectron[x] - foundObject.pt()) < 0.01 || fabs(etaElectron[x] - foundObject.eta()) < 0.001 ||
144  fabs(phiElectron[x] - foundObject.phi()) < 0.001)
145  same = true;
146  }
147 
148  if (!same) {
149  h_triggerElePt->Fill(foundObject.pt());
150  h_triggerEleEta->Fill(foundObject.eta());
151  h_triggerElePhi->Fill(foundObject.phi());
152  ptElectron.push_back(foundObject.pt());
153  etaElectron.push_back(foundObject.eta());
154  phiElectron.push_back(foundObject.phi());
155  }
156  }
157  if (foundObject.id() == trigger::TriggerMuon) { // It's a muon
158 
159  bool same = false;
160  for (unsigned int x = 0; x < ptMuon.size(); x++) {
161  if (fabs(ptMuon[x] - foundObject.pt()) < 0.01)
162  same = true;
163  }
164 
165  if (!same) {
166  h_triggerMuPt->Fill(foundObject.pt());
167  h_triggerMuEta->Fill(foundObject.eta());
168  h_triggerMuPhi->Fill(foundObject.phi());
169  ptMuon.push_back(foundObject.pt());
170  etaMuon.push_back(foundObject.eta());
171  phiMuon.push_back(foundObject.phi());
172  }
173  }
174  }
175  }
176 
177  if (!ptMuon.empty() && !ptElectron.empty()) {
178  math::PtEtaPhiMLorentzVectorD *mu1 = new math::PtEtaPhiMLorentzVectorD(ptMuon[0], etaMuon[0], phiMuon[0], 0.106);
180  new math::PtEtaPhiMLorentzVectorD(ptElectron[0], etaElectron[0], phiElectron[0], 0.0005);
181  (*mu1) += (*ele2);
182  h_triggerMuEleMass->Fill(mu1->M());
183  delete mu1;
184  delete ele2;
185  } else {
186  h_triggerMuEleMass->Fill(-1.);
187  }
188 
189  bool hasFired = false;
190  bool hasFiredAuxiliaryForMuEleLeg = false;
191  bool hasFiredAuxiliaryForHadronicLeg = false;
192  const edm::TriggerNames &trigNames = e.triggerNames(*hltresults);
193  unsigned int numTriggers = trigNames.size();
194  for (unsigned int hltIndex = 0; hltIndex < numTriggers; ++hltIndex) {
195  if (trigNames.triggerName(hltIndex).find(triggerPath_) != std::string::npos && hltresults->wasrun(hltIndex) &&
196  hltresults->accept(hltIndex))
197  hasFired = true;
198  if (trigNames.triggerName(hltIndex).find(triggerPathAuxiliaryForMuEle_) != std::string::npos &&
199  hltresults->wasrun(hltIndex) && hltresults->accept(hltIndex))
200  hasFiredAuxiliaryForMuEleLeg = true;
201  if (trigNames.triggerName(hltIndex).find(triggerPathAuxiliaryForHadronic_) != std::string::npos &&
202  hltresults->wasrun(hltIndex) && hltresults->accept(hltIndex))
203  hasFiredAuxiliaryForHadronicLeg = true;
204  }
205 
206  if (hasFiredAuxiliaryForMuEleLeg || hasFiredAuxiliaryForHadronicLeg) {
207  // Matching the muon
208  int indexOfMatchedMuEle[2] = {-1};
209  int matchedCounter = 0;
210  int offlineCounter = 0;
211  for (reco::MuonCollection::const_iterator muon = MuonCollection->begin();
212  (muon != MuonCollection->end() && matchedCounter < 1);
213  ++muon) {
214  for (size_t off_i = 0; off_i < ptMuon.size(); ++off_i) {
215  if (sqrt((muon->phi() - phiMuon[off_i]) * (muon->phi() - phiMuon[off_i]) +
216  (muon->eta() - etaMuon[off_i]) * (muon->eta() - etaMuon[off_i])) < 0.5) {
217  indexOfMatchedMuEle[matchedCounter] = offlineCounter;
218  matchedCounter++;
219  break;
220  }
221  }
222  offlineCounter++;
223  }
224 
225  for (reco::GsfElectronCollection::const_iterator electron = ElectronCollection->begin();
226  (electron != ElectronCollection->end() && matchedCounter < 2);
227  ++electron) {
228  for (size_t off_i = 0; off_i < ptElectron.size(); ++off_i) {
229  if (sqrt((electron->phi() - phiElectron[off_i]) * (electron->phi() - phiElectron[off_i]) +
230  (electron->eta() - etaElectron[off_i]) * (electron->eta() - etaElectron[off_i])) < 0.5) {
231  indexOfMatchedMuEle[matchedCounter] = offlineCounter;
232  matchedCounter++;
233  break;
234  }
235  }
236  offlineCounter++;
237  }
238 
239  float caloHT = 0.0;
240  float pfHT = 0.0;
241  for (reco::PFJetCollection::const_iterator i_pfjet = pfJetCollection->begin(); i_pfjet != pfJetCollection->end();
242  ++i_pfjet) {
243  if (i_pfjet->pt() < ptThrJet_)
244  continue;
245  if (fabs(i_pfjet->eta()) > etaThrJet_)
246  continue;
247  pfHT += i_pfjet->pt();
248  }
249  for (reco::CaloJetCollection::const_iterator i_calojet = caloJetCollection->begin();
250  i_calojet != caloJetCollection->end();
251  ++i_calojet) {
252  if (i_calojet->pt() < ptThrJet_)
253  continue;
254  if (fabs(i_calojet->eta()) > etaThrJet_)
255  continue;
256  caloHT += i_calojet->pt();
257  }
258 
259  if (hasFiredAuxiliaryForMuEleLeg && !MuonCollection->empty() && !ElectronCollection->empty()) {
260  if (hasFired && indexOfMatchedMuEle[1] >= 0 && indexOfMatchedMuEle[0] >= 0) { // check that ele is there too
261  h_EleTurnOn_num->Fill(ElectronCollection->at(indexOfMatchedMuEle[1]).pt());
262  h_MuTurnOn_num->Fill(MuonCollection->at(indexOfMatchedMuEle[0]).pt());
263  }
264  h_MuTurnOn_den->Fill(MuonCollection->at(0).pt());
265  h_EleTurnOn_den->Fill(ElectronCollection->at(0).pt());
266  }
267 
268  if (hasFiredAuxiliaryForHadronicLeg) {
269  if (hasFired) {
270  h_pfHTTurnOn_num->Fill(pfHT);
271  }
272  h_pfHTTurnOn_den->Fill(pfHT);
273  }
274  }
275 }
276 
278  edm::LogInfo("SUSY_HLT_MuEle_Hadronic") << "SUSY_HLT_MuEle_Hadronic::endRun" << std::endl;
279 }
280 
282  ibooker_.cd();
283  ibooker_.setCurrentFolder("HLT/SUSYBSM/" + triggerPath_);
284 
285  // offline quantities
286 
287  // online quantities
288  h_triggerMuPt = ibooker_.book1D("triggerMuPt", "Trigger Muon Pt; GeV", 50, 0.0, 500.0);
289  h_triggerMuEta = ibooker_.book1D("triggerMuEta", "Trigger Muon Eta", 20, -3.0, 3.0);
290  h_triggerMuPhi = ibooker_.book1D("triggerMuPhi", "Trigger Muon Phi", 20, -3.5, 3.5);
291 
292  h_triggerElePt = ibooker_.book1D("triggerElePt", "Trigger Electron Pt; GeV", 50, 0.0, 500.0);
293  h_triggerEleEta = ibooker_.book1D("triggerEleEta", "Trigger Electron Eta", 20, -3.0, 3.0);
294  h_triggerElePhi = ibooker_.book1D("triggerElePhi", "Trigger Electron Phi", 20, -3.5, 3.5);
295 
296  h_triggerMuEleMass = ibooker_.book1D("triggerMuEleMass", "Trigger MuEle Mass", 202, -2, 200);
297 
298  // num and den hists to be divided in harvesting step to make turn on curves
299  h_pfHTTurnOn_num = ibooker_.book1D("pfHTTurnOn_num", "PF HT Turn On Numerator", 30, 0.0, 1500.0);
300  h_pfHTTurnOn_den = ibooker_.book1D("pfHTTurnOn_den", "PF HT Turn On Denominator", 30, 0.0, 1500.0);
301  h_MuTurnOn_num = ibooker_.book1D("MuTurnOn_num", "Muon Turn On Numerator", 30, 0.0, 150);
302  h_MuTurnOn_den = ibooker_.book1D("MuTurnOn_den", "Muon Turn On Denominator", 30, 0.0, 150.0);
303  h_EleTurnOn_num = ibooker_.book1D("EleTurnOn_num", "Electron Turn On Numerator", 30, 0.0, 150);
304  h_EleTurnOn_den = ibooker_.book1D("EleTurnOn_den", "Electron Turn On Denominator", 30, 0.0, 150.0);
305 
306  ibooker_.cd();
307 }
308 
309 // 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?
edm::EDGetTokenT< reco::MuonCollection > theMuonCollection_
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< double > > PtEtaPhiMLorentzVectorD
Lorentz vector with cartesian internal representation.
Definition: LorentzVector.h:10
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
SUSY_HLT_MuEle_Hadronic(const edm::ParameterSet &ps)
void bookHistos(DQMStore::IBooker &)
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
Strings::size_type size() const
Definition: TriggerNames.cc:31
float eta() const
Definition: TriggerObject.h:57
edm::EDGetTokenT< reco::GsfElectronCollection > theElectronCollection_
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
edm::EDGetTokenT< edm::TriggerResults > triggerResults_
std::vector< Muon > MuonCollection
collection of Muon objects
Definition: MuonFwd.h:9
edm::EDGetTokenT< reco::PFJetCollection > thePfJetCollection_
void Fill(long long x)
Single trigger physics object (e.g., an isolated muon)
Definition: TriggerObject.h:22
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:268
const TriggerObjectCollection & getObjects() const
Definition: TriggerEvent.h:98
T sqrt(T t)
Definition: SSEVec.h:18
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:106
edm::EDGetTokenT< reco::CaloJetCollection > theCaloJetCollection_
void endRun(edm::Run const &run, edm::EventSetup const &eSetup) override
bool isValid() const
Definition: HandleBase.h:74
std::vector< Electron > ElectronCollection
collectin of Electron objects
Definition: ElectronFwd.h:9
edm::EDGetTokenT< trigger::TriggerEvent > theTrigSummary_
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
Definition: TriggerObject.h:81
static const char *const trigNames[]
Definition: EcalDumpRaw.cc:74
std::string const & triggerName(unsigned int index) const
Definition: TriggerNames.cc:22
std::vector< size_type > Keys
void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
Definition: Event.cc:256
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
Definition: Run.h:45