CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
AlCaIsoTracksFilter.cc
Go to the documentation of this file.
1 // system include files
2 #include <atomic>
3 #include <memory>
4 #include <cmath>
5 #include <iostream>
6 #include <sstream>
7 #include <fstream>
8 
9 // user include files
19 
21 //Tracks
26 // Vertices
30 // RecHits
33 //Triggers
36 
38 
43 
56 
57 //
58 // class declaration
59 //
60 
61 namespace AlCaIsoTracks {
62  struct Counters {
63  Counters() : nAll_(0), nGood_(0) {}
64  mutable std::atomic<unsigned int> nAll_, nGood_;
65  };
66 }
67 
68 class AlCaIsoTracksFilter : public edm::stream::EDFilter<edm::GlobalCache<AlCaIsoTracks::Counters> > {
69 public:
72 
73  static std::unique_ptr<AlCaIsoTracks::Counters> initializeGlobalCache(edm::ParameterSet const& iConfig) {
74  return std::unique_ptr<AlCaIsoTracks::Counters>(new AlCaIsoTracks::Counters());
75  }
76 
77  virtual bool filter(edm::Event&, edm::EventSetup const&) override;
78  virtual void endStream() override;
79  static void globalEndJob(const AlCaIsoTracks::Counters* counters);
80  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
81 
82 private:
83  virtual void beginRun(edm::Run const&, edm::EventSetup const&) override;
84  virtual void endRun(edm::Run const&, edm::EventSetup const&) override;
85 
86  // ----------member data ---------------------------
88  std::vector<std::string> trigNames_, HLTNames_;
94  unsigned int nRun_, nAll_, nGood_;
106 };
107 
108 //
109 // constants, enums and typedefs
110 //
111 
112 //
113 // static data member definitions
114 //
115 
116 //
117 // constructors and destructor
118 //
120  nRun_(0), nAll_(0), nGood_(0) {
121  //now do what ever initialization is needed
122  const double isolationRadius(28.9);
123  trigNames_ = iConfig.getParameter<std::vector<std::string> >("Triggers");
124  theTrackQuality_ = iConfig.getParameter<std::string>("TrackQuality");
125  processName_ = iConfig.getParameter<std::string>("ProcessName");
126  reco::TrackBase::TrackQuality trackQuality_=reco::TrackBase::qualityByName(theTrackQuality_);
127  maxRestrictionPt_ = iConfig.getParameter<double>("MinTrackPt");
128  slopeRestrictionPt_ = iConfig.getParameter<double>("SlopeTrackPt");
130  selectionParameter_.minQuality = trackQuality_;
131  selectionParameter_.maxDxyPV = iConfig.getParameter<double>("MaxDxyPV");
132  selectionParameter_.maxDzPV = iConfig.getParameter<double>("MaxDzPV");
133  selectionParameter_.maxChi2 = iConfig.getParameter<double>("MaxChi2");
134  selectionParameter_.maxDpOverP = iConfig.getParameter<double>("MaxDpOverP");
135  selectionParameter_.minOuterHit = iConfig.getParameter<int>("MinOuterHit");
136  selectionParameter_.minLayerCrossed = iConfig.getParameter<int>("MinLayerCrossed");
137  selectionParameter_.maxInMiss = iConfig.getParameter<int>("MaxInMiss");
138  selectionParameter_.maxOutMiss = iConfig.getParameter<int>("MaxOutMiss");
139  a_coneR_ = iConfig.getParameter<double>("ConeRadius");
140  a_charIsoR_ = a_coneR_ + isolationRadius;
141  a_mipR_ = iConfig.getParameter<double>("ConeRadiusMIP");
142  pTrackMin_ = iConfig.getParameter<double>("MinimumTrackP");
143  eEcalMax_ = iConfig.getParameter<double>("MaximumEcalEnergy");
144  eIsolation_ = iConfig.getParameter<double>("IsolationEnergy");
145  triggerEvent_ = iConfig.getParameter<edm::InputTag>("TriggerEventLabel");
146  theTriggerResultsLabel = iConfig.getParameter<edm::InputTag>("TriggerResultLabel");
147  labelGenTrack_ = iConfig.getParameter<edm::InputTag>("TrackLabel");
148  labelRecVtx_ = iConfig.getParameter<edm::InputTag>("VertexLabel");
149  labelEB_ = iConfig.getParameter<edm::InputTag>("EBRecHitLabel");
150  labelEE_ = iConfig.getParameter<edm::InputTag>("EERecHitLabel");
151  labelHBHE_ = iConfig.getParameter<edm::InputTag>("HBHERecHitLabel");
152 
153  // define tokens for access
154  tok_trigEvt_ = consumes<trigger::TriggerEvent>(triggerEvent_);
155  tok_trigRes_ = consumes<edm::TriggerResults>(theTriggerResultsLabel);
156  tok_genTrack_ = consumes<reco::TrackCollection>(labelGenTrack_);
157  tok_recVtx_ = consumes<reco::VertexCollection>(labelRecVtx_);
158  tok_bs_ = consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("BeamSpotLabel"));
159 
160  tok_EB_ = consumes<EcalRecHitCollection>(labelEB_);
161  tok_EE_ = consumes<EcalRecHitCollection>(labelEE_);
162  tok_hbhe_ = consumes<HBHERecHitCollection>(labelHBHE_);
163 
164  edm::LogInfo("HcalIsoTrack") <<"Parameters read from config file \n"
165  <<"\t minPt " << maxRestrictionPt_
166  <<":" << slopeRestrictionPt_
167  <<"\t theTrackQuality " << theTrackQuality_
168  <<"\t minQuality " << selectionParameter_.minQuality
169  <<"\t maxDxyPV " << selectionParameter_.maxDxyPV
170  <<"\t maxDzPV " << selectionParameter_.maxDzPV
171  <<"\t maxChi2 " << selectionParameter_.maxChi2
172  <<"\t maxDpOverP " << selectionParameter_.maxDpOverP
173  <<"\t minOuterHit " << selectionParameter_.minOuterHit
174  <<"\t minLayerCrossed " << selectionParameter_.minLayerCrossed
175  <<"\t maxInMiss " << selectionParameter_.maxInMiss
176  <<"\t maxOutMiss " << selectionParameter_.maxOutMiss
177  <<"\t a_coneR " << a_coneR_
178  <<"\t a_charIsoR " << a_charIsoR_
179  <<"\t a_mipR " << a_mipR_;
180  for (unsigned int k=0; k<trigNames_.size(); ++k)
181  edm::LogInfo("HcalIsoTrack") << "Trigger[" << k << "] " << trigNames_[k];
182 } // AlCaIsoTracksFilter::AlCaIsoTracksFilter constructor
183 
184 
186 
187 //
188 // member functions
189 //
190 
191 // ------------ method called on each new Event ------------
193  bool accept(false);
194  ++nAll_;
195  LogDebug("HcalIsoTrack") << "Run " << iEvent.id().run() << " Event "
196  << iEvent.id().event() << " Luminosity "
197  << iEvent.luminosityBlock() << " Bunch "
198  << iEvent.bunchCrossing();
199 
200  //Step1: Find if the event passes one of the chosen triggers
201  trigger::TriggerEvent triggerEvent;
202  edm::Handle<trigger::TriggerEvent> triggerEventHandle;
203  iEvent.getByToken(tok_trigEvt_, triggerEventHandle);
204  if (!triggerEventHandle.isValid()) {
205  edm::LogWarning("HcalIsoTrack") << "Error! Can't get the product "
206  << triggerEvent_.label() ;
207  } else {
208  triggerEvent = *(triggerEventHandle.product());
209 
212  iEvent.getByToken(tok_trigRes_, triggerResults);
213  if (triggerResults.isValid()) {
214  bool ok(false);
215  std::vector<std::string> modules;
216  const edm::TriggerNames & triggerNames = iEvent.triggerNames(*triggerResults);
217  const std::vector<std::string> & triggerNames_ = triggerNames.triggerNames();
218  for (unsigned int iHLT=0; iHLT<triggerResults->size(); iHLT++) {
219  int hlt = triggerResults->accept(iHLT);
220  for (unsigned int i=0; i<trigNames_.size(); ++i) {
221  if (triggerNames_[iHLT].find(trigNames_[i].c_str())!=std::string::npos) {
222  if (hlt > 0) {
223  ok = true;
224  }
225  LogDebug("HcalIsoTrack") <<"This is the trigger we are looking for "
226  << triggerNames_[iHLT] << " Flag " << hlt
227  << ":" << ok;
228  }
229  }
230  }
231  if (ok) {
232  //Step2: Get geometry/B-field information
233  //Get magnetic field
235  iSetup.get<IdealMagneticFieldRecord>().get(bFieldH);
236  const MagneticField *bField = bFieldH.product();
237  // get handles to calogeometry and calotopology
239  iSetup.get<CaloGeometryRecord>().get(pG);
240  const CaloGeometry* geo = pG.product();
241 
242  //Also relevant information to extrapolate tracks to Hcal surface
243  bool okC(true);
244  //Get track collection
246  iEvent.getByToken(tok_genTrack_, trkCollection);
247  if (!trkCollection.isValid()) {
248  edm::LogWarning("HcalIsoTrack") << "Cannot access the collection " << labelGenTrack_;
249  okC = false;
250  }
251  reco::TrackCollection::const_iterator trkItr;
252 
253  //Define the best vertex and the beamspot
255  iEvent.getByToken(tok_recVtx_, recVtxs);
256  edm::Handle<reco::BeamSpot> beamSpotH;
257  iEvent.getByToken(tok_bs_, beamSpotH);
258  math::XYZPoint leadPV(0,0,0);
259  if (recVtxs->size()>0 && !((*recVtxs)[0].isFake())) {
260  leadPV = math::XYZPoint((*recVtxs)[0].x(),(*recVtxs)[0].y(),
261  (*recVtxs)[0].z());
262  } else if (beamSpotH.isValid()) {
263  leadPV = beamSpotH->position();
264  }
265  LogDebug("HcalIsoTrack") << "Primary Vertex " << leadPV;
266 
267  // RecHits
268  edm::Handle<EcalRecHitCollection> barrelRecHitsHandle;
269  iEvent.getByToken(tok_EB_, barrelRecHitsHandle);
270  if (!barrelRecHitsHandle.isValid()) {
271  edm::LogWarning("HcalIsoTrack") << "Cannot access the collection " << labelEB_;
272  okC = false;
273  }
274  edm::Handle<EcalRecHitCollection> endcapRecHitsHandle;
275  iEvent.getByToken(tok_EE_, endcapRecHitsHandle);
276  if (!endcapRecHitsHandle.isValid()) {
277  edm::LogWarning("HcalIsoTrack") << "Cannot access the collection " << labelEE_;
278  okC = false;
279  }
281  iEvent.getByToken(tok_hbhe_, hbhe);
282  if (!hbhe.isValid()) {
283  edm::LogWarning("HcalIsoTrack") << "Cannot access the collection " << labelHBHE_;
284  okC = false;
285  }
286 
287  if (okC) {
288  //Step3 propagate the tracks to calorimeter surface and find
289  // candidates for isolated tracks
290  //Propagate tracks to calorimeter surface)
291  std::vector<spr::propagatedTrackDirection> trkCaloDirections;
292  spr::propagateCALO(trkCollection, geo, bField, theTrackQuality_,
293  trkCaloDirections, false);
294 
295  std::vector<spr::propagatedTrackDirection>::const_iterator trkDetItr;
296  unsigned int nTracks(0), nselTracks(0);
297  for (trkDetItr = trkCaloDirections.begin(),nTracks=0;
298  trkDetItr != trkCaloDirections.end(); trkDetItr++,nTracks++) {
299  const reco::Track* pTrack = &(*(trkDetItr->trkItr));
300  math::XYZTLorentzVector v4(pTrack->px(), pTrack->py(),
301  pTrack->pz(), pTrack->p());
302  LogDebug("HcalIsoTrack") << "This track : " << nTracks
303  << " (pt|eta|phi|p) :" << pTrack->pt()
304  << "|" << pTrack->eta() << "|"
305  << pTrack->phi() << "|" << pTrack->p();
306 
307  //Selection of good track
309  bool qltyFlag = spr::goodTrack(pTrack,leadPV,selectionParameter_,false);
310  LogDebug("HcalIsoTrack") << "qltyFlag|okECAL|okHCAL : " << qltyFlag
311  << "|" << trkDetItr->okECAL << "|"
312  << trkDetItr->okHCAL;
313  if (qltyFlag && trkDetItr->okECAL && trkDetItr->okHCAL) {
314  double t_p = pTrack->p();
315  nselTracks++;
316  int nRH_eMipDR(0), nNearTRKs(0);
317  double eMipDR = spr::eCone_ecal(geo, barrelRecHitsHandle,
318  endcapRecHitsHandle,
319  trkDetItr->pointHCAL,
320  trkDetItr->pointECAL, a_mipR_,
321  trkDetItr->directionECAL,
322  nRH_eMipDR);
323  double hmaxNearP = spr::chargeIsolationCone(nTracks,
324  trkCaloDirections,
325  a_charIsoR_,
326  nNearTRKs, false);
327  LogDebug("HcalIsoTrack") << "This track : " << nTracks
328  << " (pt|eta|phi|p) :" << pTrack->pt()
329  << "|" << pTrack->eta() << "|"
330  << pTrack->phi() << "|" << t_p
331  << "e_MIP " << eMipDR
332  << " Chg Isolation " << hmaxNearP;
333  if (t_p>pTrackMin_ && eMipDR<eEcalMax_ && hmaxNearP<eIsolation_)
334  accept = true;
335  }
336  }
337  }
338  }
339  }
340  }
341  // Step 4: Return the acceptance flag
342  if (accept) ++nGood_;
343  return accept;
344 
345 } // AlCaIsoTracksFilter::filter
346 
347 // ------------ method called once each job just after ending the event loop ------------
349  globalCache()->nAll_ += nAll_;
350  globalCache()->nGood_ += nGood_;
351 }
352 
354  edm::LogInfo("HcalIsoTrack") << "Selects " << count->nGood_ << " in "
355  << count->nAll_ << " events";
356 }
357 
358 
359 // ------------ method called when starting to processes a run ------------
360 void AlCaIsoTracksFilter::beginRun(edm::Run const& iRun, edm::EventSetup const& iSetup) {
361  bool changed(false);
362  edm::LogInfo("HcalIsoTrack") << "Run[" << nRun_ << "] " << iRun.run()
363  << " hltconfig.init " << hltConfig_.init(iRun,iSetup,processName_,changed);
364 }
365 
366 // ------------ method called when ending the processing of a run ------------
368  ++nRun_;
369  edm::LogInfo("HcalIsoTrack") << "endRun[" << nRun_ << "] " << iRun.run();
370 }
371 
372 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
374  //The following says we do not know what parameters are allowed so do no validation
375  // Please change this to state exactly what you do use, even if it is no parameters
377  desc.setUnknown();
378  descriptions.addDefault(desc);
379 }
380 
381 //define this as a plug-in
#define LogDebug(id)
RunNumber_t run() const
Definition: EventID.h:39
double p() const
momentum vector magnitude
Definition: TrackBase.h:602
T getParameter(std::string const &) const
EventNumber_t event() const
Definition: EventID.h:41
int i
Definition: DBlmapReader.cc:9
virtual void endStream() override
virtual edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const
Definition: Event.cc:220
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< spr::propagatedTrackID > propagateCALO(edm::Handle< reco::TrackCollection > &trkCollection, const CaloGeometry *geo, const MagneticField *bField, std::string &theTrackQuality, bool debug=false)
RunNumber_t run() const
Definition: RunBase.h:42
The single EDProduct to be saved for each event (AOD case)
Definition: TriggerEvent.h:25
spr::trackSelectionParameters selectionParameter_
static void globalEndJob(const AlCaIsoTracks::Counters *counters)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:464
edm::EDGetTokenT< reco::TrackCollection > tok_genTrack_
TrackQuality
track quality
Definition: TrackBase.h:149
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
int bunchCrossing() const
Definition: EventBase.h:66
edm::LuminosityBlockNumber_t luminosityBlock() const
Definition: EventBase.h:63
edm::EDGetTokenT< reco::BeamSpot > tok_bs_
std::vector< std::string > trigNames_
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:632
std::atomic< unsigned int > nAll_
double chargeIsolationCone(unsigned int trkIndex, std::vector< spr::propagatedTrackDirection > &trkDirs, double dR, int &nNearTRKs, bool debug=false)
double px() const
x coordinate of momentum vector
Definition: TrackBase.h:614
virtual bool filter(edm::Event &, edm::EventSetup const &) override
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:24
edm::EDGetTokenT< reco::VertexCollection > tok_recVtx_
Strings const & triggerNames() const
Definition: TriggerNames.cc:24
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
int iEvent
Definition: GenABIO.cc:230
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:638
void addDefault(ParameterSetDescription const &psetDescription)
edm::InputTag labelGenTrack_
bool goodTrack(const reco::Track *pTrack, math::XYZPoint leadPV, trackSelectionParameters parameters, bool debug=false)
double pt() const
track transverse momentum
Definition: TrackBase.h:608
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
edm::EDGetTokenT< trigger::TriggerEvent > tok_trigEvt_
double eCone_ecal(const CaloGeometry *geo, edm::Handle< T > &barrelhits, edm::Handle< T > &endcaphits, const GlobalPoint &hpoint1, const GlobalPoint &point1, double dR, const GlobalVector &trackMom, int &nRecHits, double ebThr=-100, double eeThr=-100, double tMin=-500, double tMax=500, bool debug=false)
edm::EDGetTokenT< HBHERecHitCollection > tok_hbhe_
static std::string const triggerResults
Definition: EdmProvDump.cc:40
edm::EDGetTokenT< EcalRecHitCollection > tok_EB_
bool isValid() const
Definition: HandleBase.h:75
double pz() const
z coordinate of momentum vector
Definition: TrackBase.h:626
edm::EDGetTokenT< edm::TriggerResults > tok_trigRes_
edm::EDGetTokenT< EcalRecHitCollection > tok_EE_
static TrackQuality qualityByName(const std::string &name)
Definition: TrackBase.cc:123
T const * product() const
Definition: Handle.h:81
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
const T & get() const
Definition: EventSetup.h:56
AlCaIsoTracksFilter(edm::ParameterSet const &, const AlCaIsoTracks::Counters *count)
T const * product() const
Definition: ESHandle.h:86
std::string const & label() const
Definition: InputTag.h:43
edm::EventID id() const
Definition: EventBase.h:60
reco::TrackBase::TrackQuality minQuality
edm::InputTag theTriggerResultsLabel
virtual void endRun(edm::Run const &, edm::EventSetup const &) override
HLTConfigProvider hltConfig_
std::atomic< unsigned int > nGood_
double py() const
y coordinate of momentum vector
Definition: TrackBase.h:620
Definition: Run.h:43
std::vector< std::string > HLTNames_
static std::unique_ptr< AlCaIsoTracks::Counters > initializeGlobalCache(edm::ParameterSet const &iConfig)
virtual void beginRun(edm::Run const &, edm::EventSetup const &) override