CMS 3D CMS Logo

SUSY_HLT_DoubleEle_Hadronic.cc
Go to the documentation of this file.
8 
10  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic")
11  << "Constructor SUSY_HLT_DoubleEle_Hadronic::SUSY_HLT_DoubleEle_Hadronic " << std::endl;
12  // Get parameters from configuration file
13  theTrigSummary_ = consumes<trigger::TriggerEvent>(ps.getParameter<edm::InputTag>("trigSummary"));
14  theElectronCollection_ = consumes<reco::GsfElectronCollection>(ps.getParameter<edm::InputTag>("ElectronCollection"));
15  thePfJetCollection_ = consumes<reco::PFJetCollection>(ps.getParameter<edm::InputTag>("pfJetCollection"));
16  theCaloJetCollection_ = consumes<reco::CaloJetCollection>(ps.getParameter<edm::InputTag>("caloJetCollection"));
17  triggerResults_ = consumes<edm::TriggerResults>(ps.getParameter<edm::InputTag>("TriggerResults"));
18  HLTProcess_ = ps.getParameter<std::string>("HLTProcess");
19  triggerPath_ = ps.getParameter<std::string>("TriggerPath");
20  triggerPathAuxiliaryForElectron_ = ps.getParameter<std::string>("TriggerPathAuxiliaryForElectron");
21  triggerPathAuxiliaryForHadronic_ = ps.getParameter<std::string>("TriggerPathAuxiliaryForHadronic");
22  triggerFilter_ = ps.getParameter<edm::InputTag>("TriggerFilter");
23  ptThrJet_ = ps.getUntrackedParameter<double>("PtThrJet");
24  etaThrJet_ = ps.getUntrackedParameter<double>("EtaThrJet");
25 }
26 
28  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic")
29  << "Destructor SUSY_HLT_DoubleEle_Hadronic::~SUSY_HLT_DoubleEle_Hadronic " << std::endl;
30 }
31 
33  bool changed;
34 
35  if (!fHltConfig.init(run, e, HLTProcess_, changed)) {
36  edm::LogError("SUSY_HLT_DoubleEle_Hadronic") << "Initialization of HLTConfigProvider failed!!";
37  return;
38  }
39 
40  bool pathFound = false;
41  const std::vector<std::string> allTrigNames = fHltConfig.triggerNames();
42  for (size_t j = 0; j < allTrigNames.size(); ++j) {
43  if (allTrigNames[j].find(triggerPath_) != std::string::npos) {
44  pathFound = true;
45  }
46  }
47 
48  if (!pathFound) {
49  LogDebug("SUSY_HLT_DoubleEle_Hadronic") << "Path not found"
50  << "\n";
51  return;
52  }
53  // std::vector<std::string> filtertags = fHltConfig.moduleLabels( triggerPath_
54  // ); triggerFilter_ =
55  // edm::InputTag(filtertags[filtertags.size()-1],"",fHltConfig.processName());
56  // triggerFilter_ = edm::InputTag("hltPFMET120Mu5L3PreFiltered", "",
57  // fHltConfig.processName());
58 
59  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic") << "SUSY_HLT_DoubleEle_Hadronic::beginRun" << std::endl;
60 }
61 
63  edm::Run const &,
64  edm::EventSetup const &) {
65  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic") << "SUSY_HLT_DoubleEle_Hadronic::bookHistograms" << std::endl;
66  // book at beginRun
67  bookHistos(ibooker_);
68 }
69 
71  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic") << "SUSY_HLT_DoubleEle_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_DoubleEle_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_DoubleEle_Hadronic") << "invalid collection: CaloJets"
87  << "\n";
88  return;
89  }
90 
91  //-------------------------------
92  //--- Electron
93  //-------------------------------
95  e.getByToken(theElectronCollection_, ElectronCollection);
96  if (!ElectronCollection.isValid()) {
97  edm::LogError("SUSY_HLT_DoubleEle_Hadronic") << "invalid collection: Electrons "
98  << "\n";
99  return;
100  }
101 
102  //-------------------------------
103  //--- Trigger
104  //-------------------------------
106  e.getByToken(triggerResults_, hltresults);
107  if (!hltresults.isValid()) {
108  edm::LogError("SUSY_HLT_DoubleEle_Hadronic") << "invalid collection: TriggerResults"
109  << "\n";
110  return;
111  }
112  edm::Handle<trigger::TriggerEvent> triggerSummary;
113  e.getByToken(theTrigSummary_, triggerSummary);
114  if (!triggerSummary.isValid()) {
115  edm::LogError("SUSY_HLT_DoubleEle_Hadronic") << "invalid collection: TriggerSummary"
116  << "\n";
117  return;
118  }
119 
120  // get online objects
121  std::vector<float> ptElectron, etaElectron, phiElectron;
122  size_t filterIndex = triggerSummary->filterIndex(triggerFilter_);
124  if (!(filterIndex >= triggerSummary->sizeFilters())) {
125  const trigger::Keys &keys = triggerSummary->filterKeys(filterIndex);
126  for (size_t j = 0; j < keys.size(); ++j) {
127  trigger::TriggerObject foundObject = triggerObjects[keys[j]];
128  if (fabs(foundObject.id()) == 11) { // It's an electron
129 
130  bool same = false;
131  for (unsigned int x = 0; x < ptElectron.size(); x++) {
132  if (fabs(ptElectron[x] - foundObject.pt()) < 0.01 || fabs(etaElectron[x] - foundObject.eta()) < 0.001 ||
133  fabs(phiElectron[x] - foundObject.phi()) < 0.001)
134  same = true;
135  }
136 
137  if (!same) {
138  h_triggerElePt->Fill(foundObject.pt());
139  h_triggerEleEta->Fill(foundObject.eta());
140  h_triggerElePhi->Fill(foundObject.phi());
141  ptElectron.push_back(foundObject.pt());
142  etaElectron.push_back(foundObject.eta());
143  phiElectron.push_back(foundObject.phi());
144  }
145  }
146  }
147  if (ptElectron.size() >= 2) {
149  new math::PtEtaPhiMLorentzVectorD(ptElectron[0], etaElectron[0], phiElectron[0], 0.0005);
151  new math::PtEtaPhiMLorentzVectorD(ptElectron[1], etaElectron[1], phiElectron[1], 0.0005);
152  (*ele1) += (*ele2);
153  h_triggerDoubleEleMass->Fill(ele1->M());
154  delete ele1;
155  delete ele2;
156  } else {
158  }
159  }
160 
161  bool hasFired = false;
162  bool hasFiredAuxiliaryForElectronLeg = false;
163  bool hasFiredAuxiliaryForHadronicLeg = false;
164  const edm::TriggerNames &trigNames = e.triggerNames(*hltresults);
165  unsigned int numTriggers = trigNames.size();
166  for (unsigned int hltIndex = 0; hltIndex < numTriggers; ++hltIndex) {
167  if (trigNames.triggerName(hltIndex).find(triggerPath_) != std::string::npos && hltresults->wasrun(hltIndex) &&
168  hltresults->accept(hltIndex))
169  hasFired = true;
170  if (trigNames.triggerName(hltIndex).find(triggerPathAuxiliaryForElectron_) != std::string::npos &&
171  hltresults->wasrun(hltIndex) && hltresults->accept(hltIndex))
172  hasFiredAuxiliaryForElectronLeg = true;
173  if (trigNames.triggerName(hltIndex).find(triggerPathAuxiliaryForHadronic_) != std::string::npos &&
174  hltresults->wasrun(hltIndex) && hltresults->accept(hltIndex))
175  hasFiredAuxiliaryForHadronicLeg = true;
176  }
177 
178  if (hasFiredAuxiliaryForElectronLeg || hasFiredAuxiliaryForHadronicLeg) {
179  // Matching the Electron
180  int indexOfMatchedElectron[2] = {-1};
181  int matchedCounter = 0;
182  int offlineCounter = 0;
183  for (reco::GsfElectronCollection::const_iterator Electron = ElectronCollection->begin();
184  (Electron != ElectronCollection->end() && matchedCounter < 2);
185  ++Electron) {
186  for (size_t off_i = 0; off_i < ptElectron.size(); ++off_i) {
187  if (sqrt((Electron->phi() - phiElectron[off_i]) * (Electron->phi() - phiElectron[off_i]) +
188  (Electron->eta() - etaElectron[off_i]) * (Electron->eta() - etaElectron[off_i])) < 0.5) {
189  indexOfMatchedElectron[matchedCounter] = offlineCounter;
190  matchedCounter++;
191  break;
192  }
193  }
194  offlineCounter++;
195  }
196 
197  float caloHT = 0.0;
198  float pfHT = 0.0;
199  for (reco::PFJetCollection::const_iterator i_pfjet = pfJetCollection->begin(); i_pfjet != pfJetCollection->end();
200  ++i_pfjet) {
201  if (i_pfjet->pt() < ptThrJet_)
202  continue;
203  if (fabs(i_pfjet->eta()) > etaThrJet_)
204  continue;
205  pfHT += i_pfjet->pt();
206  }
207  for (reco::CaloJetCollection::const_iterator i_calojet = caloJetCollection->begin();
208  i_calojet != caloJetCollection->end();
209  ++i_calojet) {
210  if (i_calojet->pt() < ptThrJet_)
211  continue;
212  if (fabs(i_calojet->eta()) > etaThrJet_)
213  continue;
214  caloHT += i_calojet->pt();
215  }
216 
217  if (hasFiredAuxiliaryForElectronLeg && ElectronCollection->size() > 1) {
218  if (hasFired && indexOfMatchedElectron[1] >= 0) { // fill trailing leg
219  h_EleTurnOn_num->Fill(ElectronCollection->at(indexOfMatchedElectron[1]).pt());
220  }
221  h_EleTurnOn_den->Fill(ElectronCollection->at(1).pt());
222  }
223  if (hasFiredAuxiliaryForHadronicLeg) {
224  if (hasFired) {
225  h_pfHTTurnOn_num->Fill(pfHT);
226  }
227  h_pfHTTurnOn_den->Fill(pfHT);
228  }
229  }
230 }
231 
233  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic") << "SUSY_HLT_DoubleEle_Hadronic::endRun" << std::endl;
234 }
235 
237  ibooker_.cd();
238  ibooker_.setCurrentFolder("HLT/SUSYBSM/" + triggerPath_);
239 
240  // offline quantities
241 
242  // online quantities
243  h_triggerElePt = ibooker_.book1D("triggerElePt", "Trigger Electron Pt; GeV", 50, 0.0, 500.0);
244  h_triggerEleEta = ibooker_.book1D("triggerEleEta", "Trigger Electron Eta", 20, -3.0, 3.0);
245  h_triggerElePhi = ibooker_.book1D("triggerElePhi", "Trigger Electron Phi", 20, -3.5, 3.5);
246 
247  h_triggerDoubleEleMass = ibooker_.book1D("triggerDoubleEleMass", "Trigger DoubleElectron Mass", 202, -2, 200);
248 
249  // num and den hists to be divided in harvesting step to make turn on curves
250  h_pfHTTurnOn_num = ibooker_.book1D("pfHTTurnOn_num", "PF HT Turn On Numerator", 30, 0.0, 1500.0);
251  h_pfHTTurnOn_den = ibooker_.book1D("pfHTTurnOn_den", "PF HT Turn On Denominator", 30, 0.0, 1500.0);
252  h_EleTurnOn_num = ibooker_.book1D("EleTurnOn_num", "Electron Turn On Numerator", 30, 0.0, 150);
253  h_EleTurnOn_den = ibooker_.book1D("EleTurnOn_den", "Electron Turn On Denominator", 30, 0.0, 150.0);
254 
255  ibooker_.cd();
256 }
257 
258 // 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::PFJetCollection > thePfJetCollection_
bool wasrun() const
Was at least one path run?
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< double > > PtEtaPhiMLorentzVectorD
Lorentz vector with cartesian internal representation.
Definition: LorentzVector.h:10
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
int id() const
getters
Definition: TriggerObject.h:55
trigger::size_type sizeFilters() const
Definition: TriggerEvent.h:135
edm::EDGetTokenT< reco::GsfElectronCollection > theElectronCollection_
SUSY_HLT_DoubleEle_Hadronic(const edm::ParameterSet &ps)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
float phi() const
Definition: TriggerObject.h:58
edm::EDGetTokenT< edm::TriggerResults > triggerResults_
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
edm::EDGetTokenT< trigger::TriggerEvent > theTrigSummary_
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
void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override
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
bool isValid() const
Definition: HandleBase.h:74
std::vector< Electron > ElectronCollection
collectin of Electron objects
Definition: ElectronFwd.h:9
edm::EDGetTokenT< reco::CaloJetCollection > theCaloJetCollection_
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 dqmBeginRun(edm::Run const &, edm::EventSetup const &) override
std::string const & triggerName(unsigned int index) const
Definition: TriggerNames.cc:22
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 endRun(edm::Run const &run, edm::EventSetup const &eSetup) override
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
Definition: Event.cc:256
Definition: Run.h:45