CMS 3D CMS Logo

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