CMS 3D CMS Logo

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