CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SUSY_HLT_DoubleEle_Hadronic.cc
Go to the documentation of this file.
8 
10 {
11  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic") << "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 {
29  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic") << "Destructor SUSY_HLT_DoubleEle_Hadronic::~SUSY_HLT_DoubleEle_Hadronic " << std::endl;
30 }
31 
33 {
34 
35  bool changed;
36 
37  if (!fHltConfig.init(run, e, HLTProcess_, changed)) {
38  edm::LogError("SUSY_HLT_DoubleEle_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_DoubleEle_Hadronic") << "Path not found" << "\n";
52  return;
53  }
54  //std::vector<std::string> filtertags = fHltConfig.moduleLabels( triggerPath_ );
55  //triggerFilter_ = edm::InputTag(filtertags[filtertags.size()-1],"",fHltConfig.processName());
56  //triggerFilter_ = edm::InputTag("hltPFMET120Mu5L3PreFiltered", "", fHltConfig.processName());
57 
58  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic") << "SUSY_HLT_DoubleEle_Hadronic::beginRun" << std::endl;
59 }
60 
62 {
63  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic") << "SUSY_HLT_DoubleEle_Hadronic::bookHistograms" << std::endl;
64  //book at beginRun
65  bookHistos(ibooker_);
66 }
67 
69  edm::EventSetup const& context)
70 {
71  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic") << "SUSY_HLT_DoubleEle_Hadronic::beginLuminosityBlock" << std::endl;
72 }
73 
74 
75 
77  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic") << "SUSY_HLT_DoubleEle_Hadronic::analyze" << std::endl;
78 
79  //-------------------------------
80  //--- Jets
81  //-------------------------------
82  edm::Handle<reco::PFJetCollection> pfJetCollection;
83  e.getByToken (thePfJetCollection_,pfJetCollection);
84  if ( !pfJetCollection.isValid() ){
85  edm::LogError ("SUSY_HLT_DoubleEle_Hadronic") << "invalid collection: PFJets" << "\n";
86  return;
87  }
88  edm::Handle<reco::CaloJetCollection> caloJetCollection;
89  e.getByToken (theCaloJetCollection_,caloJetCollection);
90  if ( !caloJetCollection.isValid() ){
91  edm::LogError ("SUSY_HLT_DoubleEle_Hadronic") << "invalid collection: CaloJets" << "\n";
92  return;
93  }
94 
95  //-------------------------------
96  //--- Electron
97  //-------------------------------
99  e.getByToken (theElectronCollection_, ElectronCollection);
100  if ( !ElectronCollection.isValid() ){
101  edm::LogError ("SUSY_HLT_DoubleEle_Hadronic") << "invalid collection: Electrons " << "\n";
102  return;
103  }
104 
105 
106  //-------------------------------
107  //--- Trigger
108  //-------------------------------
110  e.getByToken(triggerResults_,hltresults);
111  if(!hltresults.isValid()){
112  edm::LogError ("SUSY_HLT_DoubleEle_Hadronic") << "invalid collection: TriggerResults" << "\n";
113  return;
114  }
115  edm::Handle<trigger::TriggerEvent> triggerSummary;
116  e.getByToken(theTrigSummary_, triggerSummary);
117  if(!triggerSummary.isValid()) {
118  edm::LogError ("SUSY_HLT_DoubleEle_Hadronic") << "invalid collection: TriggerSummary" << "\n";
119  return;
120  }
121 
122 
123  //get online objects
124  std::vector<float> ptElectron, etaElectron, phiElectron;
125  size_t filterIndex = triggerSummary->filterIndex( triggerFilter_ );
126  trigger::TriggerObjectCollection triggerObjects = triggerSummary->getObjects();
127  if( !(filterIndex >= triggerSummary->sizeFilters()) ){
128  const trigger::Keys& keys = triggerSummary->filterKeys( filterIndex );
129  for( size_t j = 0; j < keys.size(); ++j ){
130  trigger::TriggerObject foundObject = triggerObjects[keys[j]];
131  if(fabs(foundObject.id()) == 11){ //It's an electron
132 
133  bool same= false;
134  for(unsigned int x=0;x<ptElectron.size();x++){
135  if(fabs(ptElectron[x] - foundObject.pt()) < 0.01 || fabs(etaElectron[x] - foundObject.eta()) < 0.001 || fabs(phiElectron[x] - foundObject.phi()) < 0.001)
136  same = true;
137  }
138 
139  if(!same){
140  h_triggerElePt->Fill(foundObject.pt());
141  h_triggerEleEta->Fill(foundObject.eta());
142  h_triggerElePhi->Fill(foundObject.phi());
143  ptElectron.push_back(foundObject.pt());
144  etaElectron.push_back(foundObject.eta());
145  phiElectron.push_back(foundObject.phi());
146  }
147  }
148  }
149  if (ptElectron.size()>=2) {
150  math::PtEtaPhiMLorentzVectorD* ele1 = new math::PtEtaPhiMLorentzVectorD(ptElectron[0],etaElectron[0],phiElectron[0],0.0005);
151  math::PtEtaPhiMLorentzVectorD* ele2 = 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 
162  bool hasFired = false;
163  bool hasFiredAuxiliaryForElectronLeg = false;
164  bool hasFiredAuxiliaryForHadronicLeg = false;
165  const edm::TriggerNames& trigNames = e.triggerNames(*hltresults);
166  unsigned int numTriggers = trigNames.size();
167  for( unsigned int hltIndex=0; hltIndex<numTriggers; ++hltIndex ){
168  if (trigNames.triggerName(hltIndex).find(triggerPath_) != std::string::npos && hltresults->wasrun(hltIndex) && hltresults->accept(hltIndex)) hasFired = true;
169  if (trigNames.triggerName(hltIndex).find(triggerPathAuxiliaryForElectron_) != std::string::npos && hltresults->wasrun(hltIndex) && hltresults->accept(hltIndex)) hasFiredAuxiliaryForElectronLeg = true;
170  if (trigNames.triggerName(hltIndex).find(triggerPathAuxiliaryForHadronic_) != std::string::npos && hltresults->wasrun(hltIndex) && hltresults->accept(hltIndex)) hasFiredAuxiliaryForHadronicLeg = true;
171  }
172 
173 
174 
175  if(hasFiredAuxiliaryForElectronLeg || hasFiredAuxiliaryForHadronicLeg) {
176 
177  //Matching the Electron
178  int indexOfMatchedElectron[2] = {-1};
179  int matchedCounter = 0;
180  int offlineCounter = 0;
181  for(reco::GsfElectronCollection::const_iterator Electron = ElectronCollection->begin(); (Electron != ElectronCollection->end() && matchedCounter < 2) ; ++Electron) {
182  for(size_t off_i = 0; off_i < ptElectron.size(); ++off_i) {
183  if(sqrt((Electron->phi()-phiElectron[off_i])*(Electron->phi()-phiElectron[off_i]) + (Electron->eta()-etaElectron[off_i])*(Electron->eta()-etaElectron[off_i])) < 0.5) {
184  indexOfMatchedElectron[matchedCounter] = offlineCounter;
185  matchedCounter++;
186  break;
187  }
188  }
189  offlineCounter++;
190  }
191 
192  float caloHT = 0.0;
193  float pfHT = 0.0;
194  for (reco::PFJetCollection::const_iterator i_pfjet = pfJetCollection->begin(); i_pfjet != pfJetCollection->end(); ++i_pfjet){
195  if (i_pfjet->pt() < ptThrJet_) continue;
196  if (fabs(i_pfjet->eta()) > etaThrJet_) continue;
197  pfHT += i_pfjet->pt();
198  }
199  for (reco::CaloJetCollection::const_iterator i_calojet = caloJetCollection->begin(); i_calojet != caloJetCollection->end(); ++i_calojet){
200  if (i_calojet->pt() < ptThrJet_) continue;
201  if (fabs(i_calojet->eta()) > etaThrJet_) continue;
202  caloHT += i_calojet->pt();
203  }
204 
205  if(hasFiredAuxiliaryForElectronLeg && ElectronCollection->size()>1) {
206  if(hasFired && indexOfMatchedElectron[1] >= 0) { //fill trailing leg
207  h_EleTurnOn_num-> Fill(ElectronCollection->at(indexOfMatchedElectron[1]).pt());
208  }
209  h_EleTurnOn_den-> Fill(ElectronCollection->at(1).pt());
210  }
211  if(hasFiredAuxiliaryForHadronicLeg) {
212  if(hasFired) {
213  h_pfHTTurnOn_num-> Fill(pfHT);
214  }
215  h_pfHTTurnOn_den-> Fill(pfHT);
216  }
217  }
218 }
219 
220 
222 {
223  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic") << "SUSY_HLT_DoubleEle_Hadronic::endLuminosityBlock" << std::endl;
224 }
225 
226 
228 {
229  edm::LogInfo("SUSY_HLT_DoubleEle_Hadronic") << "SUSY_HLT_DoubleEle_Hadronic::endRun" << std::endl;
230 }
231 
233 {
234  ibooker_.cd();
235  ibooker_.setCurrentFolder("HLT/SUSYBSM/" + triggerPath_);
236 
237  //offline quantities
238 
239  //online quantities
240  h_triggerElePt = ibooker_.book1D("triggerElePt", "Trigger Electron Pt; GeV", 50, 0.0, 500.0);
241  h_triggerEleEta = ibooker_.book1D("triggerEleEta", "Trigger Electron Eta", 20, -3.0, 3.0);
242  h_triggerElePhi = ibooker_.book1D("triggerElePhi", "Trigger Electron Phi", 20, -3.5, 3.5);
243 
244  h_triggerDoubleEleMass = ibooker_.book1D("triggerDoubleEleMass", "Trigger DoubleElectron Mass", 202, -2, 200);
245 
246  //num and den hists to be divided in harvesting step to make turn on curves
247  h_pfHTTurnOn_num = ibooker_.book1D("pfHTTurnOn_num", "PF HT Turn On Numerator", 30, 0.0, 1500.0 );
248  h_pfHTTurnOn_den = ibooker_.book1D("pfHTTurnOn_den", "PF HT Turn On Denominator", 30, 0.0, 1500.0 );
249  h_EleTurnOn_num = ibooker_.book1D("EleTurnOn_num", "Electron Turn On Numerator", 30, 0.0, 150 );
250  h_EleTurnOn_den = ibooker_.book1D("EleTurnOn_den", "Electron Turn On Denominator", 30, 0.0, 150.0 );
251 
252  ibooker_.cd();
253 }
254 
255 //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_
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 bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
void endRun(edm::Run const &run, edm::EventSetup const &eSetup)
int id() const
getters
Definition: TriggerObject.h:55
edm::EDGetTokenT< reco::GsfElectronCollection > theElectronCollection_
SUSY_HLT_DoubleEle_Hadronic(const edm::ParameterSet &ps)
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
edm::EDGetTokenT< edm::TriggerResults > triggerResults_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
const std::vector< std::string > & triggerNames() const
names of trigger paths
void endLuminosityBlock(edm::LuminosityBlock const &lumi, edm::EventSetup const &eSetup)
Strings::size_type size() const
Definition: TriggerNames.cc:39
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:7
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
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
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< 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
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 beginLuminosityBlock(edm::LuminosityBlock const &lumi, edm::EventSetup const &eSetup)
Definition: Run.h:43