CMS 3D CMS Logo

TrackDetectorAssociator.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: TrackAssociator
4 // Class: TrackDetectorAssociator
5 //
6 /*
7 
8  Description: <one line class summary>
9 
10  Implementation:
11  <Notes on implementation>
12 */
13 //
14 // Original Author: Dmytro Kovalskyi
15 // Created: Fri Apr 21 10:59:41 PDT 2006
16 //
17 //
18 
22 
23 // user include files
25 
33 
43 
44 // calorimeter info
51 
55 
58 
61 
64 
66 
69 
71 #include <stack>
72 #include <set>
73 
75 #include "Math/VectorUtil.h"
76 #include <algorithm>
77 
80 // #include "TrackingTools/TrackAssociator/interface/CaloDetIdAssociator.h"
81 // #include "TrackingTools/TrackAssociator/interface/EcalDetIdAssociator.h"
82 // #include "TrackingTools/TrackAssociator/interface/PreshowerDetIdAssociator.h"
83 
90 
99 
101 
102 using namespace reco;
103 
105  ivProp_ = nullptr;
106  defProp_ = nullptr;
107  useDefaultPropagator_ = false;
108 }
109 
111  if (defProp_)
112  delete defProp_;
113 }
114 
116  ivProp_ = ptr;
117  cachedTrajectory_.setPropagator(ivProp_);
118 }
119 
120 void TrackDetectorAssociator::useDefaultPropagator() { useDefaultPropagator_ = true; }
121 
123  // access the calorimeter geometry
124  iSetup.get<CaloGeometryRecord>().get(theCaloGeometry_);
125  if (!theCaloGeometry_.isValid())
126  throw cms::Exception("FatalError") << "Unable to find CaloGeometryRecord in event!\n";
127 
128  // get the tracking Geometry
129  iSetup.get<GlobalTrackingGeometryRecord>().get(theTrackingGeometry_);
130  if (!theTrackingGeometry_.isValid())
131  throw cms::Exception("FatalError") << "Unable to find GlobalTrackingGeometryRecord in event!\n";
132 
133  if (useDefaultPropagator_ && (!defProp_ || theMagneticFeildWatcher_.check(iSetup))) {
134  // setup propagator
137 
139  prop->setMaterialMode(false);
140  prop->applyRadX0Correction(true);
141  // prop->setDebug(true); // tmp
142  defProp_ = prop;
143  setPropagator(defProp_);
144  }
145 
146  iSetup.get<DetIdAssociatorRecord>().get("EcalDetIdAssociator", ecalDetIdAssociator_);
147  iSetup.get<DetIdAssociatorRecord>().get("HcalDetIdAssociator", hcalDetIdAssociator_);
148  iSetup.get<DetIdAssociatorRecord>().get("HODetIdAssociator", hoDetIdAssociator_);
149  iSetup.get<DetIdAssociatorRecord>().get("CaloDetIdAssociator", caloDetIdAssociator_);
150  iSetup.get<DetIdAssociatorRecord>().get("MuonDetIdAssociator", muonDetIdAssociator_);
151  iSetup.get<DetIdAssociatorRecord>().get("PreshowerDetIdAssociator", preshowerDetIdAssociator_);
152 }
153 
155  const edm::EventSetup& iSetup,
156  const FreeTrajectoryState& fts,
158  return associate(iEvent, iSetup, parameters, &fts);
159 }
160 
162  const edm::EventSetup& iSetup,
164  const FreeTrajectoryState* innerState,
165  const FreeTrajectoryState* outerState) {
167  if (!parameters.useEcal && !parameters.useCalo && !parameters.useHcal && !parameters.useHO && !parameters.useMuon &&
168  !parameters.usePreshower)
169  throw cms::Exception("ConfigurationError")
170  << "Configuration error! No subdetector was selected for the track association.";
171 
172  SteppingHelixStateInfo trackOrigin(*innerState);
173  info.stateAtIP = *innerState;
174  cachedTrajectory_.setStateAtIP(trackOrigin);
175 
176  init(iSetup);
177  // get track trajectory
178  // ECAL points (EB+EE)
179  // If the phi angle between a track entrance and exit points is more
180  // than 2 crystals, it is possible that the track will cross 3 crystals
181  // and therefore one has to check at least 3 points along the track
182  // trajectory inside ECAL. In order to have a chance to cross 4 crystalls
183  // in the barrel, a track should have P_t as low as 3 GeV or smaller
184  // If it's necessary, number of points along trajectory can be increased
185 
186  info.setCaloGeometry(theCaloGeometry_);
187 
188  cachedTrajectory_.reset_trajectory();
189  // estimate propagation outer boundaries based on
190  // requested sub-detector information. For now limit
191  // propagation region only if muon matching is not
192  // requested.
193  double HOmaxR = hoDetIdAssociator_->volume().maxR();
194  double HOmaxZ = hoDetIdAssociator_->volume().maxZ();
195  double minR = ecalDetIdAssociator_->volume().minR();
196  double minZ = preshowerDetIdAssociator_->volume().minZ();
197  cachedTrajectory_.setMaxHORadius(HOmaxR);
198  cachedTrajectory_.setMaxHOLength(HOmaxZ * 2.);
199  cachedTrajectory_.setMinDetectorRadius(minR);
200  cachedTrajectory_.setMinDetectorLength(minZ * 2.);
201 
202  if (parameters.useMuon) {
203  double maxR = muonDetIdAssociator_->volume().maxR();
204  double maxZ = muonDetIdAssociator_->volume().maxZ();
205  cachedTrajectory_.setMaxDetectorRadius(maxR);
206  cachedTrajectory_.setMaxDetectorLength(maxZ * 2.);
207  } else {
208  cachedTrajectory_.setMaxDetectorRadius(HOmaxR);
209  cachedTrajectory_.setMaxDetectorLength(HOmaxZ * 2.);
210  }
211 
212  // If track extras exist and outerState is before HO maximum, then use outerState
213  if (outerState) {
214  if (outerState->position().perp() < HOmaxR && fabs(outerState->position().z()) < HOmaxZ) {
215  LogTrace("TrackAssociator") << "Using outerState as trackOrigin at Rho=" << outerState->position().perp()
216  << " Z=" << outerState->position().z() << "\n";
217  trackOrigin = SteppingHelixStateInfo(*outerState);
218  } else if (innerState) {
219  LogTrace("TrackAssociator") << "Using innerState as trackOrigin at Rho=" << innerState->position().perp()
220  << " Z=" << innerState->position().z() << "\n";
221  trackOrigin = SteppingHelixStateInfo(*innerState);
222  }
223  }
224 
225  if (trackOrigin.momentum().mag() == 0)
226  return info;
227  if (edm::isNotFinite(trackOrigin.momentum().x()) or edm::isNotFinite(trackOrigin.momentum().y()) or
228  edm::isNotFinite(trackOrigin.momentum().z()))
229  return info;
230  if (!cachedTrajectory_.propagateAll(trackOrigin))
231  return info;
232 
233  // get trajectory in calorimeters
234  cachedTrajectory_.findEcalTrajectory(ecalDetIdAssociator_->volume());
235  cachedTrajectory_.findHcalTrajectory(hcalDetIdAssociator_->volume());
236  cachedTrajectory_.findHOTrajectory(hoDetIdAssociator_->volume());
237  cachedTrajectory_.findPreshowerTrajectory(preshowerDetIdAssociator_->volume());
238 
239  info.trkGlobPosAtEcal = getPoint(cachedTrajectory_.getStateAtEcal().position());
240  info.trkGlobPosAtHcal = getPoint(cachedTrajectory_.getStateAtHcal().position());
241  info.trkGlobPosAtHO = getPoint(cachedTrajectory_.getStateAtHO().position());
242 
243  info.trkMomAtEcal = cachedTrajectory_.getStateAtEcal().momentum();
244  info.trkMomAtHcal = cachedTrajectory_.getStateAtHcal().momentum();
245  info.trkMomAtHO = cachedTrajectory_.getStateAtHO().momentum();
246 
247  if (parameters.useEcal)
248  fillEcal(iEvent, info, parameters);
249  if (parameters.useCalo)
251  if (parameters.useHcal)
252  fillHcal(iEvent, info, parameters);
253  if (parameters.useHO)
254  fillHO(iEvent, info, parameters);
255  if (parameters.usePreshower)
256  fillPreshower(iEvent, info, parameters);
257  if (parameters.useMuon)
258  fillMuon(iEvent, info, parameters);
259  if (parameters.truthMatch)
260  fillCaloTruth(iEvent, info, parameters);
261 
262  return info;
263 }
264 
268  const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getEcalTrajectory();
269 
270  for (std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
271  itr != trajectoryStates.end();
272  itr++)
273  LogTrace("TrackAssociator") << "ECAL trajectory point (rho, z, phi): " << itr->position().perp() << ", "
274  << itr->position().z() << ", " << itr->position().phi();
275 
276  std::vector<GlobalPoint> coreTrajectory;
277  for (std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
278  itr != trajectoryStates.end();
279  itr++)
280  coreTrajectory.push_back(itr->position());
281 
282  if (coreTrajectory.empty()) {
283  LogTrace("TrackAssociator") << "ECAL track trajectory is empty; moving on\n";
284  info.isGoodEcal = false;
285  return;
286  }
287  info.isGoodEcal = true;
288 
289  // Find ECAL crystals
291  iEvent.getByToken(parameters.EBRecHitsToken, EBRecHits);
292  if (!EBRecHits.isValid())
293  throw cms::Exception("FatalError") << "Unable to find EBRecHitCollection in the event!\n";
294 
296  iEvent.getByToken(parameters.EERecHitsToken, EERecHits);
297  if (!EERecHits.isValid())
298  throw cms::Exception("FatalError") << "Unable to find EERecHitCollection in event!\n";
299 
300  std::set<DetId> ecalIdsInRegion;
301  if (parameters.accountForTrajectoryChangeCalo) {
302  // get trajectory change with respect to initial state
303  DetIdAssociator::MapRange mapRange =
304  getMapRange(cachedTrajectory_.trajectoryDelta(CachedTrajectory::IpToEcal), parameters.dREcalPreselection);
305  ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
306  } else
307  ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.dREcalPreselection);
308  LogTrace("TrackAssociator") << "ECAL hits in the region: " << ecalIdsInRegion.size();
309  if (parameters.dREcalPreselection > parameters.dREcal)
310  ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsInACone(ecalIdsInRegion, coreTrajectory, parameters.dREcal);
311  LogTrace("TrackAssociator") << "ECAL hits in the cone: " << ecalIdsInRegion.size();
312  info.crossedEcalIds = ecalDetIdAssociator_->getCrossedDetIds(ecalIdsInRegion, coreTrajectory);
313  const std::vector<DetId>& crossedEcalIds = info.crossedEcalIds;
314  LogTrace("TrackAssociator") << "ECAL crossed hits " << crossedEcalIds.size();
315 
316  // add EcalRecHits
317  for (std::vector<DetId>::const_iterator itr = crossedEcalIds.begin(); itr != crossedEcalIds.end(); itr++) {
318  std::vector<EcalRecHit>::const_iterator ebHit = (*EBRecHits).find(*itr);
319  std::vector<EcalRecHit>::const_iterator eeHit = (*EERecHits).find(*itr);
320  if (ebHit != (*EBRecHits).end())
321  info.crossedEcalRecHits.push_back(&*ebHit);
322  else if (eeHit != (*EERecHits).end())
323  info.crossedEcalRecHits.push_back(&*eeHit);
324  else
325  LogTrace("TrackAssociator") << "Crossed EcalRecHit is not found for DetId: " << itr->rawId();
326  }
327  for (std::set<DetId>::const_iterator itr = ecalIdsInRegion.begin(); itr != ecalIdsInRegion.end(); itr++) {
328  std::vector<EcalRecHit>::const_iterator ebHit = (*EBRecHits).find(*itr);
329  std::vector<EcalRecHit>::const_iterator eeHit = (*EERecHits).find(*itr);
330  if (ebHit != (*EBRecHits).end())
331  info.ecalRecHits.push_back(&*ebHit);
332  else if (eeHit != (*EERecHits).end())
333  info.ecalRecHits.push_back(&*eeHit);
334  else
335  LogTrace("TrackAssociator") << "EcalRecHit from the cone is not found for DetId: " << itr->rawId();
336  }
337 }
338 
342  // use ECAL and HCAL trajectories to match a tower. (HO isn't used for matching).
343  std::vector<GlobalPoint> trajectory;
344  const std::vector<SteppingHelixStateInfo>& ecalTrajectoryStates = cachedTrajectory_.getEcalTrajectory();
345  const std::vector<SteppingHelixStateInfo>& hcalTrajectoryStates = cachedTrajectory_.getHcalTrajectory();
346  for (std::vector<SteppingHelixStateInfo>::const_iterator itr = ecalTrajectoryStates.begin();
347  itr != ecalTrajectoryStates.end();
348  itr++)
349  trajectory.push_back(itr->position());
350  for (std::vector<SteppingHelixStateInfo>::const_iterator itr = hcalTrajectoryStates.begin();
351  itr != hcalTrajectoryStates.end();
352  itr++)
353  trajectory.push_back(itr->position());
354 
355  if (trajectory.empty()) {
356  LogTrace("TrackAssociator") << "HCAL trajectory is empty; moving on\n";
357  info.isGoodCalo = false;
358  return;
359  }
360  info.isGoodCalo = true;
361 
362  // find crossed CaloTowers
364  iEvent.getByToken(parameters.caloTowersToken, caloTowers);
365  if (!caloTowers.isValid())
366  throw cms::Exception("FatalError") << "Unable to find CaloTowers in event!\n";
367 
368  std::set<DetId> caloTowerIdsInRegion;
369  if (parameters.accountForTrajectoryChangeCalo) {
370  // get trajectory change with respect to initial state
371  DetIdAssociator::MapRange mapRange =
372  getMapRange(cachedTrajectory_.trajectoryDelta(CachedTrajectory::IpToHcal), parameters.dRHcalPreselection);
373  caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0], mapRange);
374  } else
375  caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0], parameters.dRHcalPreselection);
376 
377  LogTrace("TrackAssociator") << "Towers in the region: " << caloTowerIdsInRegion.size();
378 
379  auto caloTowerIdsInAConeBegin = caloTowerIdsInRegion.begin();
380  auto caloTowerIdsInAConeEnd = caloTowerIdsInRegion.end();
381  std::set<DetId> caloTowerIdsInAConeTmp;
382  if (!caloDetIdAssociator_->selectAllInACone(parameters.dRHcal)) {
383  caloTowerIdsInAConeTmp =
384  caloDetIdAssociator_->getDetIdsInACone(caloTowerIdsInRegion, trajectory, parameters.dRHcal);
385  caloTowerIdsInAConeBegin = caloTowerIdsInAConeTmp.begin();
386  caloTowerIdsInAConeEnd = caloTowerIdsInAConeTmp.end();
387  }
388  LogTrace("TrackAssociator") << "Towers in the cone: "
389  << std::distance(caloTowerIdsInAConeBegin, caloTowerIdsInAConeEnd);
390 
391  info.crossedTowerIds = caloDetIdAssociator_->getCrossedDetIds(caloTowerIdsInRegion, trajectory);
392  const std::vector<DetId>& crossedCaloTowerIds = info.crossedTowerIds;
393  LogTrace("TrackAssociator") << "Towers crossed: " << crossedCaloTowerIds.size();
394 
395  // add CaloTowers
396  for (std::vector<DetId>::const_iterator itr = crossedCaloTowerIds.begin(); itr != crossedCaloTowerIds.end(); itr++) {
397  CaloTowerCollection::const_iterator tower = (*caloTowers).find(*itr);
398  if (tower != (*caloTowers).end())
399  info.crossedTowers.push_back(&*tower);
400  else
401  LogTrace("TrackAssociator") << "Crossed CaloTower is not found for DetId: " << (*itr).rawId();
402  }
403 
404  for (std::set<DetId>::const_iterator itr = caloTowerIdsInAConeBegin; itr != caloTowerIdsInAConeEnd; itr++) {
405  CaloTowerCollection::const_iterator tower = (*caloTowers).find(*itr);
406  if (tower != (*caloTowers).end())
407  info.towers.push_back(&*tower);
408  else
409  LogTrace("TrackAssociator") << "CaloTower from the cone is not found for DetId: " << (*itr).rawId();
410  }
411 }
412 
416  std::vector<GlobalPoint> trajectory;
417  const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getPreshowerTrajectory();
418  for (std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
419  itr != trajectoryStates.end();
420  itr++)
421  trajectory.push_back(itr->position());
422 
423  if (trajectory.empty()) {
424  LogTrace("TrackAssociator") << "Preshower trajectory is empty; moving on\n";
425  return;
426  }
427 
428  std::set<DetId> idsInRegion =
429  preshowerDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0], parameters.dRPreshowerPreselection);
430 
431  LogTrace("TrackAssociator") << "Number of Preshower Ids in the region: " << idsInRegion.size();
432  info.crossedPreshowerIds = preshowerDetIdAssociator_->getCrossedDetIds(idsInRegion, trajectory);
433  LogTrace("TrackAssociator") << "Number of Preshower Ids in crossed: " << info.crossedPreshowerIds.size();
434 }
435 
439  const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHcalTrajectory();
440 
441  std::vector<GlobalPoint> coreTrajectory;
442  for (std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
443  itr != trajectoryStates.end();
444  itr++)
445  coreTrajectory.push_back(itr->position());
446 
447  if (coreTrajectory.empty()) {
448  LogTrace("TrackAssociator") << "HCAL trajectory is empty; moving on\n";
449  info.isGoodHcal = false;
450  return;
451  }
452  info.isGoodHcal = true;
453 
454  // find crossed Hcals
456  iEvent.getByToken(parameters.HBHEcollToken, collection);
457  if (!collection.isValid())
458  throw cms::Exception("FatalError") << "Unable to find HBHERecHits in event!\n";
459 
460  std::set<DetId> idsInRegion;
461  if (parameters.accountForTrajectoryChangeCalo) {
462  // get trajectory change with respect to initial state
463  DetIdAssociator::MapRange mapRange =
464  getMapRange(cachedTrajectory_.trajectoryDelta(CachedTrajectory::IpToHcal), parameters.dRHcalPreselection);
465  idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
466  } else
467  idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.dRHcalPreselection);
468 
469  LogTrace("TrackAssociator") << "HCAL hits in the region: " << idsInRegion.size() << "\n"
470  << DetIdInfo::info(idsInRegion, nullptr);
471 
472  auto idsInAConeBegin = idsInRegion.begin();
473  auto idsInAConeEnd = idsInRegion.end();
474  std::set<DetId> idsInAConeTmp;
475  if (!hcalDetIdAssociator_->selectAllInACone(parameters.dRHcal)) {
476  idsInAConeTmp = hcalDetIdAssociator_->getDetIdsInACone(idsInRegion, coreTrajectory, parameters.dRHcal);
477  idsInAConeBegin = idsInAConeTmp.begin();
478  idsInAConeEnd = idsInAConeTmp.end();
479  }
480  LogTrace("TrackAssociator") << "HCAL hits in the cone: " << std::distance(idsInAConeBegin, idsInAConeEnd) << "\n"
481  << DetIdInfo::info(std::set<DetId>(idsInAConeBegin, idsInAConeEnd), nullptr);
482  info.crossedHcalIds = hcalDetIdAssociator_->getCrossedDetIds(idsInRegion, coreTrajectory);
483  const std::vector<DetId>& crossedIds = info.crossedHcalIds;
484  LogTrace("TrackAssociator") << "HCAL hits crossed: " << crossedIds.size() << "\n"
485  << DetIdInfo::info(crossedIds, nullptr);
486 
487  // add Hcal
488  for (std::vector<DetId>::const_iterator itr = crossedIds.begin(); itr != crossedIds.end(); itr++) {
489  HBHERecHitCollection::const_iterator hit = (*collection).find(*itr);
490  if (hit != (*collection).end())
491  info.crossedHcalRecHits.push_back(&*hit);
492  else
493  LogTrace("TrackAssociator") << "Crossed HBHERecHit is not found for DetId: " << itr->rawId();
494  }
495  for (std::set<DetId>::const_iterator itr = idsInAConeBegin; itr != idsInAConeEnd; itr++) {
496  HBHERecHitCollection::const_iterator hit = (*collection).find(*itr);
497  if (hit != (*collection).end())
498  info.hcalRecHits.push_back(&*hit);
499  else
500  LogTrace("TrackAssociator") << "HBHERecHit from the cone is not found for DetId: " << itr->rawId();
501  }
502 }
503 
507  const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHOTrajectory();
508 
509  std::vector<GlobalPoint> coreTrajectory;
510  for (std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
511  itr != trajectoryStates.end();
512  itr++)
513  coreTrajectory.push_back(itr->position());
514 
515  if (coreTrajectory.empty()) {
516  LogTrace("TrackAssociator") << "HO trajectory is empty; moving on\n";
517  info.isGoodHO = false;
518  return;
519  }
520  info.isGoodHO = true;
521 
522  // find crossed HOs
524  iEvent.getByToken(parameters.HOcollToken, collection);
525  if (!collection.isValid())
526  throw cms::Exception("FatalError") << "Unable to find HORecHits in event!\n";
527 
528  std::set<DetId> idsInRegion;
529  if (parameters.accountForTrajectoryChangeCalo) {
530  // get trajectory change with respect to initial state
531  DetIdAssociator::MapRange mapRange =
532  getMapRange(cachedTrajectory_.trajectoryDelta(CachedTrajectory::IpToHO), parameters.dRHcalPreselection);
533  idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
534  } else
535  idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.dRHcalPreselection);
536 
537  LogTrace("TrackAssociator") << "idsInRegion.size(): " << idsInRegion.size();
538 
539  auto idsInAConeBegin = idsInRegion.begin();
540  auto idsInAConeEnd = idsInRegion.end();
541  std::set<DetId> idsInAConeTmp;
542  if (!hoDetIdAssociator_->selectAllInACone(parameters.dRHcal)) {
543  idsInAConeTmp = hoDetIdAssociator_->getDetIdsInACone(idsInRegion, coreTrajectory, parameters.dRHcal);
544  idsInAConeBegin = idsInAConeTmp.begin();
545  idsInAConeEnd = idsInAConeTmp.end();
546  }
547  LogTrace("TrackAssociator") << "idsInACone.size(): " << std::distance(idsInAConeBegin, idsInAConeEnd);
548  info.crossedHOIds = hoDetIdAssociator_->getCrossedDetIds(idsInRegion, coreTrajectory);
549  const std::vector<DetId>& crossedIds = info.crossedHOIds;
550 
551  // add HO
552  for (std::vector<DetId>::const_iterator itr = crossedIds.begin(); itr != crossedIds.end(); itr++) {
553  HORecHitCollection::const_iterator hit = (*collection).find(*itr);
554  if (hit != (*collection).end())
555  info.crossedHORecHits.push_back(&*hit);
556  else
557  LogTrace("TrackAssociator") << "Crossed HORecHit is not found for DetId: " << itr->rawId();
558  }
559 
560  for (std::set<DetId>::const_iterator itr = idsInAConeBegin; itr != idsInAConeEnd; itr++) {
561  HORecHitCollection::const_iterator hit = (*collection).find(*itr);
562  if (hit != (*collection).end())
563  info.hoRecHits.push_back(&*hit);
564  else
565  LogTrace("TrackAssociator") << "HORecHit from the cone is not found for DetId: " << itr->rawId();
566  }
567 }
568 
570  const SimTrack& track,
571  const SimVertex& vertex) {
572  GlobalVector vector(track.momentum().x(), track.momentum().y(), track.momentum().z());
573  GlobalPoint point(vertex.position().x(), vertex.position().y(), vertex.position().z());
574 
575  int charge = track.type() > 0 ? -1 : 1; // lepton convention
576  if (abs(track.type()) == 211 || // pion
577  abs(track.type()) == 321 || // kaon
578  abs(track.type()) == 2212)
579  charge = track.type() < 0 ? -1 : 1;
580  return getFreeTrajectoryState(iSetup, vector, point, charge);
581 }
582 
584  const GlobalVector& momentum,
585  const GlobalPoint& vertex,
586  const int charge) {
589 
590  GlobalTrajectoryParameters tPars(vertex, momentum, charge, &*bField);
591 
592  ROOT::Math::SMatrixIdentity id;
593  AlgebraicSymMatrix66 covT(id);
594  covT *= 1e-6; // initialize to sigma=1e-3
595  CartesianTrajectoryError tCov(covT);
596 
597  return FreeTrajectoryState(tPars, tCov);
598 }
599 
601  const reco::Track& track) {
604 
605  GlobalVector vector(track.momentum().x(), track.momentum().y(), track.momentum().z());
606 
607  GlobalPoint point(track.vertex().x(), track.vertex().y(), track.vertex().z());
608 
609  GlobalTrajectoryParameters tPars(point, vector, track.charge(), &*bField);
610 
611  // FIX THIS !!!
612  // need to convert from perigee to global or helix (curvilinear) frame
613  // for now just an arbitrary matrix.
614  ROOT::Math::SMatrixIdentity id;
615  AlgebraicSymMatrix66 covT(id);
616  covT *= 1e-6; // initialize to sigma=1e-3
617  CartesianTrajectoryError tCov(covT);
618 
619  return FreeTrajectoryState(tPars, tCov);
620 }
621 
622 DetIdAssociator::MapRange TrackDetectorAssociator::getMapRange(const std::pair<float, float>& delta, const float dR) {
623  DetIdAssociator::MapRange mapRange;
624  mapRange.dThetaPlus = dR;
625  mapRange.dThetaMinus = dR;
626  mapRange.dPhiPlus = dR;
627  mapRange.dPhiMinus = dR;
628  if (delta.first > 0)
629  mapRange.dThetaPlus += delta.first;
630  else
631  mapRange.dThetaMinus += fabs(delta.first);
632  if (delta.second > 0)
633  mapRange.dPhiPlus += delta.second;
634  else
635  mapRange.dPhiMinus += fabs(delta.second);
636  LogTrace("TrackAssociator") << "Selection range: (dThetaPlus, dThetaMinus, dPhiPlus, dPhiMinus, dRPreselection): "
637  << mapRange.dThetaPlus << ", " << mapRange.dThetaMinus << ", " << mapRange.dPhiPlus
638  << ", " << mapRange.dPhiMinus << ", " << dR;
639  return mapRange;
640 }
641 
642 void TrackDetectorAssociator::getTAMuonChamberMatches(std::vector<TAMuonChamberMatch>& matches,
644  // Strategy:
645  // Propagate through the whole detector, estimate change in eta and phi
646  // along the trajectory, add this to dRMuon and find DetIds around this
647  // direction using the map. Then propagate fast to each surface and apply
648  // final matching criteria.
649 
650  // get the direction first
651  SteppingHelixStateInfo trajectoryPoint = cachedTrajectory_.getStateAtHcal();
652  // If trajectory point at HCAL is not valid, try to use the outer most state of the
653  // trajectory instead.
654  if (!trajectoryPoint.isValid())
655  trajectoryPoint = cachedTrajectory_.getOuterState();
656  if (!trajectoryPoint.isValid()) {
657  LogTrace("TrackAssociator")
658  << "trajectory position at HCAL is not valid. Assume the track cannot reach muon detectors and skip it";
659  return;
660  }
661 
662  GlobalVector direction = trajectoryPoint.momentum().unit();
663  LogTrace("TrackAssociator") << "muon direction: " << direction
664  << "\n\t and corresponding point: " << trajectoryPoint.position() << "\n";
665 
666  DetIdAssociator::MapRange mapRange =
667  getMapRange(cachedTrajectory_.trajectoryDelta(CachedTrajectory::FullTrajectory), parameters.dRMuonPreselection);
668 
669  // and find chamber DetIds
670 
671  std::set<DetId> muonIdsInRegion = muonDetIdAssociator_->getDetIdsCloseToAPoint(trajectoryPoint.position(), mapRange);
672  LogTrace("TrackAssociator") << "Number of chambers to check: " << muonIdsInRegion.size();
673  for (std::set<DetId>::const_iterator detId = muonIdsInRegion.begin(); detId != muonIdsInRegion.end(); detId++) {
674  const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet(*detId);
675  TrajectoryStateOnSurface stateOnSurface = cachedTrajectory_.propagate(&geomDet->surface());
676  if (!stateOnSurface.isValid()) {
677  LogTrace("TrackAssociator") << "Failed to propagate the track; moving on\n\t"
678  << "Element is not crosssed: " << DetIdInfo::info(*detId, nullptr) << "\n";
679  continue;
680  }
681  LocalPoint localPoint = geomDet->surface().toLocal(stateOnSurface.freeState()->position());
682  LocalError localError = stateOnSurface.localError().positionError();
683  float distanceX = 0;
684  float distanceY = 0;
685  float sigmaX = 0.0;
686  float sigmaY = 0.0;
687  if (const CSCChamber* cscChamber = dynamic_cast<const CSCChamber*>(geomDet)) {
688  const CSCChamberSpecs* chamberSpecs = cscChamber->specs();
689  if (!chamberSpecs) {
690  LogTrace("TrackAssociator") << "Failed to get CSCChamberSpecs from CSCChamber; moving on\n";
691  continue;
692  }
693  const CSCLayerGeometry* layerGeometry = chamberSpecs->oddLayerGeometry(1);
694  if (!layerGeometry) {
695  LogTrace("TrackAssociator") << "Failed to get CSCLayerGeometry from CSCChamberSpecs; moving on\n";
696  continue;
697  }
698  const CSCWireTopology* wireTopology = layerGeometry->wireTopology();
699  if (!wireTopology) {
700  LogTrace("TrackAssociator") << "Failed to get CSCWireTopology from CSCLayerGeometry; moving on\n";
701  continue;
702  }
703 
704  float wideWidth = wireTopology->wideWidthOfPlane();
705  float narrowWidth = wireTopology->narrowWidthOfPlane();
706  float length = wireTopology->lengthOfPlane();
707  // If slanted, there is no y offset between local origin and symmetry center of wire plane
708  float yOfFirstWire = fabs(wireTopology->wireAngle()) > 1.E-06 ? -0.5 * length : wireTopology->yOfWire(1);
709  // y offset between local origin and symmetry center of wire plane
710  float yCOWPOffset = yOfFirstWire + 0.5 * length;
711 
712  // tangent of the incline angle from inside the trapezoid
713  float tangent = (wideWidth - narrowWidth) / (2. * length);
714  // y position wrt bottom of trapezoid
715  float yPrime = localPoint.y() + fabs(yOfFirstWire);
716  // half trapezoid width at y' is 0.5 * narrowWidth + x side of triangle with the above tangent and side y'
717  float halfWidthAtYPrime = 0.5 * narrowWidth + yPrime * tangent;
718  distanceX = fabs(localPoint.x()) - halfWidthAtYPrime;
719  distanceY = fabs(localPoint.y() - yCOWPOffset) - 0.5 * length;
720  sigmaX = distanceX / sqrt(localError.xx());
721  sigmaY = distanceY / sqrt(localError.yy());
722  } else {
723  distanceX = fabs(localPoint.x()) - geomDet->surface().bounds().width() / 2.;
724  distanceY = fabs(localPoint.y()) - geomDet->surface().bounds().length() / 2.;
725  sigmaX = distanceX / sqrt(localError.xx());
726  sigmaY = distanceY / sqrt(localError.yy());
727  }
728  if ((distanceX < parameters.muonMaxDistanceX && distanceY < parameters.muonMaxDistanceY) ||
729  (sigmaX < parameters.muonMaxDistanceSigmaX && sigmaY < parameters.muonMaxDistanceSigmaY)) {
730  LogTrace("TrackAssociator") << "found a match: " << DetIdInfo::info(*detId, nullptr) << "\n";
732  match.tState = stateOnSurface;
733  match.localDistanceX = distanceX;
734  match.localDistanceY = distanceY;
735  match.id = *detId;
736  matches.push_back(match);
737  } else {
738  LogTrace("TrackAssociator") << "chamber is too far: " << DetIdInfo::info(*detId, nullptr)
739  << "\n\tdistanceX: " << distanceX << "\t distanceY: " << distanceY
740  << "\t sigmaX: " << sigmaX << "\t sigmaY: " << sigmaY << "\n";
741  }
742  }
743 }
744 
748  // Get the segments from the event
750  iEvent.getByToken(parameters.dtSegmentsToken, dtSegments);
751  if (!dtSegments.isValid())
752  throw cms::Exception("FatalError") << "Unable to find DTRecSegment4DCollection in event!\n";
753 
755  iEvent.getByToken(parameters.cscSegmentsToken, cscSegments);
756  if (!cscSegments.isValid())
757  throw cms::Exception("FatalError") << "Unable to find CSCSegmentCollection in event!\n";
758 
760  if (parameters.useGEM)
761  iEvent.getByToken(parameters.gemSegmentsToken, gemSegments);
763  if (parameters.useME0)
764  iEvent.getByToken(parameters.me0SegmentsToken, me0Segments);
765 
767 
768  // check the map of available segments
769  // if there is no segments in a given direction at all,
770  // then there is no point to fly there.
771  //
772  // MISSING
773  // Possible solution: quick search for presence of segments
774  // for the set of DetIds
775 
776  // get a set of matches corresponding to muon chambers
777  std::vector<TAMuonChamberMatch> matchedChambers;
778  LogTrace("TrackAssociator") << "Trying to Get ChamberMatches" << std::endl;
779  getTAMuonChamberMatches(matchedChambers, parameters);
780  LogTrace("TrackAssociator") << "Chambers matched: " << matchedChambers.size() << "\n";
781 
782  // Iterate over all chamber matches and fill segment matching
783  // info if it's available
784  for (std::vector<TAMuonChamberMatch>::iterator matchedChamber = matchedChambers.begin();
785  matchedChamber != matchedChambers.end();
786  matchedChamber++) {
787  const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet((*matchedChamber).id);
788  // DT chamber
789  if (const DTChamber* chamber = dynamic_cast<const DTChamber*>(geomDet)) {
790  // Get the range for the corresponding segments
791  DTRecSegment4DCollection::range range = dtSegments->get(chamber->id());
792  // Loop over the segments of this chamber
793  for (DTRecSegment4DCollection::const_iterator segment = range.first; segment != range.second; segment++) {
794  if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
795  matchedChamber->segments.back().dtSegmentRef = DTRecSegment4DRef(dtSegments, segment - dtSegments->begin());
796  }
797  }
798  }
799  // CSC Chamber
800  else if (const CSCChamber* chamber = dynamic_cast<const CSCChamber*>(geomDet)) {
801  // Get the range for the corresponding segments
803  // Loop over the segments
804  for (CSCSegmentCollection::const_iterator segment = range.first; segment != range.second; segment++) {
805  if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
806  matchedChamber->segments.back().cscSegmentRef = CSCSegmentRef(cscSegments, segment - cscSegments->begin());
807  }
808  }
809  } else {
810  // GEM Chamber
811  if (parameters.useGEM) {
812  if (const GEMSuperChamber* chamber = dynamic_cast<const GEMSuperChamber*>(geomDet)) {
813  // Get the range for the corresponding segments
815  // Loop over the segments
816  for (GEMSegmentCollection::const_iterator segment = range.first; segment != range.second; segment++) {
817  if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
818  matchedChamber->segments.back().gemSegmentRef =
819  GEMSegmentRef(gemSegments, segment - gemSegments->begin());
820  }
821  }
822  }
823  }
824  // ME0 Chamber
825  if (parameters.useME0) {
826  if (const ME0Chamber* chamber = dynamic_cast<const ME0Chamber*>(geomDet)) {
827  // Get the range for the corresponding segments
829  // Loop over the segments
830  for (ME0SegmentCollection::const_iterator segment = range.first; segment != range.second; segment++) {
831  if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
832  matchedChamber->segments.back().me0SegmentRef =
833  ME0SegmentRef(me0Segments, segment - me0Segments->begin());
834  }
835  }
836  }
837  }
838  }
839  info.chambers.push_back(*matchedChamber);
840  }
841 }
842 
844  const RecSegment* segment,
846  LogTrace("TrackAssociator") << "Segment local position: " << segment->localPosition() << "\n"
847  << std::hex << segment->geographicalId().rawId() << "\n";
848 
849  const GeomDet* chamber = muonDetIdAssociator_->getGeomDet(matchedChamber.id);
850  TrajectoryStateOnSurface trajectoryStateOnSurface = matchedChamber.tState;
851  GlobalPoint segmentGlobalPosition = chamber->toGlobal(segment->localPosition());
852 
853  LogTrace("TrackAssociator") << "Segment global position: " << segmentGlobalPosition
854  << " \t (R_xy,eta,phi): " << segmentGlobalPosition.perp() << ","
855  << segmentGlobalPosition.eta() << "," << segmentGlobalPosition.phi() << "\n";
856 
857  LogTrace("TrackAssociator") << "\teta hit: " << segmentGlobalPosition.eta()
858  << " \tpropagator: " << trajectoryStateOnSurface.freeState()->position().eta() << "\n"
859  << "\tphi hit: " << segmentGlobalPosition.phi()
860  << " \tpropagator: " << trajectoryStateOnSurface.freeState()->position().phi()
861  << std::endl;
862 
863  bool isGood = false;
864  bool isDTWithoutY = false;
865  const DTRecSegment4D* dtseg = dynamic_cast<const DTRecSegment4D*>(segment);
866  if (dtseg && (!dtseg->hasZed()))
867  isDTWithoutY = true;
868 
869  double deltaPhi(fabs(segmentGlobalPosition.phi() - trajectoryStateOnSurface.freeState()->position().phi()));
870  if (deltaPhi > M_PI)
871  deltaPhi = fabs(deltaPhi - M_PI * 2.);
872 
873  if (isDTWithoutY) {
874  isGood = deltaPhi < parameters.dRMuon;
875  // Be in chamber
876  isGood &= fabs(segmentGlobalPosition.eta() - trajectoryStateOnSurface.freeState()->position().eta()) < .3;
877  } else
878  isGood = sqrt(pow(segmentGlobalPosition.eta() - trajectoryStateOnSurface.freeState()->position().eta(), 2) +
879  deltaPhi * deltaPhi) < parameters.dRMuon;
880 
881  if (isGood) {
882  TAMuonSegmentMatch muonSegment;
883  muonSegment.segmentGlobalPosition = getPoint(segmentGlobalPosition);
884  muonSegment.segmentLocalPosition = getPoint(segment->localPosition());
885  muonSegment.segmentLocalDirection = getVector(segment->localDirection());
886  muonSegment.segmentLocalErrorXX = segment->localPositionError().xx();
887  muonSegment.segmentLocalErrorYY = segment->localPositionError().yy();
888  muonSegment.segmentLocalErrorXY = segment->localPositionError().xy();
889  muonSegment.segmentLocalErrorDxDz = segment->localDirectionError().xx();
890  muonSegment.segmentLocalErrorDyDz = segment->localDirectionError().yy();
891 
892  // DANGEROUS - compiler cannot guaranty parameters ordering
893  // AlgebraicSymMatrix segmentCovMatrix = segment->parametersError();
894  // muonSegment.segmentLocalErrorXDxDz = segmentCovMatrix[2][0];
895  // muonSegment.segmentLocalErrorYDyDz = segmentCovMatrix[3][1];
896  muonSegment.segmentLocalErrorXDxDz = -999;
897  muonSegment.segmentLocalErrorYDyDz = -999;
898  muonSegment.hasZed = true;
899  muonSegment.hasPhi = true;
900 
901  // timing information
902  muonSegment.t0 = 0;
903  if (dtseg) {
904  if ((dtseg->hasPhi()) && (!isDTWithoutY)) {
905  int phiHits = dtseg->phiSegment()->specificRecHits().size();
906  // int zHits = dtseg->zSegment()->specificRecHits().size();
907  int hits = 0;
908  double t0 = 0.;
909  // TODO: cuts on hit numbers not optimized in any way yet...
910  if (phiHits > 5 && dtseg->phiSegment()->ist0Valid()) {
911  t0 += dtseg->phiSegment()->t0() * phiHits;
912  hits += phiHits;
913  LogTrace("TrackAssociator") << " Phi t0: " << dtseg->phiSegment()->t0() << " hits: " << phiHits;
914  }
915  // the z segments seem to contain little useful information...
916  // if (zHits>3) {
917  // t0+=s->zSegment()->t0()*zHits;
918  // hits+=zHits;
919  // LogTrace("TrackAssociator") << " Z t0: " << s->zSegment()->t0() << " hits: " << zHits << std::endl;
920  // }
921  if (hits)
922  muonSegment.t0 = t0 / hits;
923  // LogTrace("TrackAssociator") << " --- t0: " << muonSegment.t0 << std::endl;
924  } else {
925  // check and set dimensionality
926  if (isDTWithoutY)
927  muonSegment.hasZed = false;
928  if (!dtseg->hasPhi())
929  muonSegment.hasPhi = false;
930  }
931  }
932  matchedChamber.segments.push_back(muonSegment);
933  }
934 
935  return isGood;
936 }
937 
938 //********************** NON-CORE CODE ******************************//
939 
943  // get list of simulated tracks and their vertices
944  using namespace edm;
946  iEvent.getByToken(parameters.simTracksToken, simTracks);
947  if (!simTracks.isValid())
948  throw cms::Exception("FatalError") << "No simulated tracks found\n";
949 
951  iEvent.getByToken(parameters.simVerticesToken, simVertices);
952  if (!simVertices.isValid())
953  throw cms::Exception("FatalError") << "No simulated vertices found\n";
954 
955  // get sim calo hits
956  Handle<PCaloHitContainer> simEcalHitsEB;
957  iEvent.getByToken(parameters.simEcalHitsEBToken, simEcalHitsEB);
958  if (!simEcalHitsEB.isValid())
959  throw cms::Exception("FatalError") << "No simulated ECAL EB hits found\n";
960 
961  Handle<PCaloHitContainer> simEcalHitsEE;
962  iEvent.getByToken(parameters.simEcalHitsEEToken, simEcalHitsEE);
963  if (!simEcalHitsEE.isValid())
964  throw cms::Exception("FatalError") << "No simulated ECAL EE hits found\n";
965 
966  Handle<PCaloHitContainer> simHcalHits;
967  iEvent.getByToken(parameters.simHcalHitsToken, simHcalHits);
968  if (!simHcalHits.isValid())
969  throw cms::Exception("FatalError") << "No simulated HCAL hits found\n";
970 
971  // find truth partner
972  SimTrackContainer::const_iterator simTrack = simTracks->begin();
973  for (; simTrack != simTracks->end(); ++simTrack) {
974  math::XYZVector simP3(simTrack->momentum().x(), simTrack->momentum().y(), simTrack->momentum().z());
975  math::XYZVector recoP3(info.stateAtIP.momentum().x(), info.stateAtIP.momentum().y(), info.stateAtIP.momentum().z());
976  if (ROOT::Math::VectorUtil::DeltaR(recoP3, simP3) < 0.1)
977  break;
978  }
979  if (simTrack != simTracks->end()) {
980  info.simTrack = &(*simTrack);
981  double ecalTrueEnergy(0);
982  double hcalTrueEnergy(0);
983 
984  // loop over calo hits
985  for (PCaloHitContainer::const_iterator hit = simEcalHitsEB->begin(); hit != simEcalHitsEB->end(); ++hit)
986  if (hit->geantTrackId() == info.simTrack->genpartIndex())
987  ecalTrueEnergy += hit->energy();
988 
989  for (PCaloHitContainer::const_iterator hit = simEcalHitsEE->begin(); hit != simEcalHitsEE->end(); ++hit)
990  if (hit->geantTrackId() == info.simTrack->genpartIndex())
991  ecalTrueEnergy += hit->energy();
992 
993  for (PCaloHitContainer::const_iterator hit = simHcalHits->begin(); hit != simHcalHits->end(); ++hit)
994  if (hit->geantTrackId() == info.simTrack->genpartIndex())
995  hcalTrueEnergy += hit->energy();
996 
997  info.ecalTrueEnergy = ecalTrueEnergy;
998  info.hcalTrueEnergy = hcalTrueEnergy;
999  info.hcalTrueEnergyCorrected = hcalTrueEnergy;
1000  if (fabs(info.trkGlobPosAtHcal.eta()) < 1.3)
1001  info.hcalTrueEnergyCorrected = hcalTrueEnergy * 113.2;
1002  else if (fabs(info.trkGlobPosAtHcal.eta()) < 3.0)
1003  info.hcalTrueEnergyCorrected = hcalTrueEnergy * 167.2;
1004  }
1005 }
1006 
1008  const edm::EventSetup& iSetup,
1009  const reco::Track& track,
1011  Direction direction /*= Any*/) {
1012  double currentStepSize = cachedTrajectory_.getPropagationStep();
1013 
1016 
1017  if (track.extra().isNull()) {
1018  if (direction != InsideOut)
1019  throw cms::Exception("FatalError") << "No TrackExtra information is available and association is done with "
1020  "something else than InsideOut track.\n"
1021  << "Either change the parameter or provide needed data!\n";
1022  LogTrace("TrackAssociator") << "Track Extras not found\n";
1024  return associate(iEvent, iSetup, parameters, &initialState); // 5th argument is null pointer
1025  }
1026 
1027  LogTrace("TrackAssociator") << "Track Extras found\n";
1031 
1032  LogTrace("TrackAssociator") << "inner track state (rho, z, phi):" << track.innerPosition().Rho() << ", "
1033  << track.innerPosition().z() << ", " << track.innerPosition().phi() << "\n";
1034  LogTrace("TrackAssociator") << "innerFreeState (rho, z, phi):" << innerState.position().perp() << ", "
1035  << innerState.position().z() << ", " << innerState.position().phi() << "\n";
1036 
1037  LogTrace("TrackAssociator") << "outer track state (rho, z, phi):" << track.outerPosition().Rho() << ", "
1038  << track.outerPosition().z() << ", " << track.outerPosition().phi() << "\n";
1039  LogTrace("TrackAssociator") << "outerFreeState (rho, z, phi):" << outerState.position().perp() << ", "
1040  << outerState.position().z() << ", " << outerState.position().phi() << "\n";
1041 
1042  // InsideOut first
1043  if (crossedIP(track)) {
1044  switch (direction) {
1045  case InsideOut:
1046  case Any:
1047  return associate(iEvent, iSetup, parameters, &referenceState, &outerState);
1048  break;
1049  case OutsideIn: {
1050  cachedTrajectory_.setPropagationStep(-fabs(currentStepSize));
1051  TrackDetMatchInfo result = associate(iEvent, iSetup, parameters, &innerState, &referenceState);
1052  cachedTrajectory_.setPropagationStep(currentStepSize);
1053  return result;
1054  break;
1055  }
1056  }
1057  } else {
1058  switch (direction) {
1059  case InsideOut:
1060  return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1061  break;
1062  case OutsideIn: {
1063  cachedTrajectory_.setPropagationStep(-fabs(currentStepSize));
1064  TrackDetMatchInfo result = associate(iEvent, iSetup, parameters, &outerState, &innerState);
1065  cachedTrajectory_.setPropagationStep(currentStepSize);
1066  return result;
1067  break;
1068  }
1069  case Any: {
1070  // check if we deal with clear outside-in case
1071  if (track.innerPosition().Dot(track.innerMomentum()) < 0 &&
1072  track.outerPosition().Dot(track.outerMomentum()) < 0) {
1073  cachedTrajectory_.setPropagationStep(-fabs(currentStepSize));
1075  if (track.innerPosition().R() < track.outerPosition().R())
1076  result = associate(iEvent, iSetup, parameters, &innerState, &outerState);
1077  else
1078  result = associate(iEvent, iSetup, parameters, &outerState, &innerState);
1079  cachedTrajectory_.setPropagationStep(currentStepSize);
1080  return result;
1081  }
1082  }
1083  }
1084  }
1085 
1086  // all other cases
1087  return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1088 }
1089 
1091  const edm::EventSetup& iSetup,
1092  const SimTrack& track,
1093  const SimVertex& vertex,
1095  return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, track, vertex), parameters);
1096 }
1097 
1099  const edm::EventSetup& iSetup,
1100  const GlobalVector& momentum,
1101  const GlobalPoint& vertex,
1102  const int charge,
1104  return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, momentum, vertex, charge), parameters);
1105 }
1106 
1108  bool crossed = true;
1109  crossed &= (track.innerPosition().rho() > 3); // something close to active volume
1110  crossed &= (track.outerPosition().rho() > 3); // something close to active volume
1111  crossed &=
1112  ((track.innerPosition().x() * track.innerMomentum().x() + track.innerPosition().y() * track.innerMomentum().y() <
1113  0) !=
1114  (track.outerPosition().x() * track.outerMomentum().x() + track.outerPosition().y() * track.outerMomentum().y() <
1115  0));
1116  return crossed;
1117 }
Vector3DBase
Definition: Vector3DBase.h:8
DTRecSegment2D::ist0Valid
bool ist0Valid() const
Definition: DTRecSegment2D.h:115
SteppingHelixStateInfo::momentum
GlobalVector momentum() const
Definition: SteppingHelixStateInfo.h:60
TrackExtra.h
FastTimerService_cff.range
range
Definition: FastTimerService_cff.py:34
TrackDetectorAssociator::crossedIP
static bool crossedIP(const reco::Track &track)
Definition: TrackDetectorAssociator.cc:1107
DTRecSegment4D
Definition: DTRecSegment4D.h:23
Handle.h
init
int init
Definition: HydjetWrapper.h:64
anyDirection
Definition: PropagationDirection.h:4
edm::SortedCollection< CaloTower >::const_iterator
std::vector< CaloTower >::const_iterator const_iterator
Definition: SortedCollection.h:80
SimVertex
Definition: SimVertex.h:5
Bounds::width
virtual float width() const =0
Cylinder.h
CaloTower.h
SteppingHelixStateInfo::position
GlobalPoint position() const
Definition: SteppingHelixStateInfo.h:59
trajectoryStateTransform::outerFreeState
FreeTrajectoryState outerFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
Definition: TrajectoryStateTransform.cc:98
SteppingHelixPropagator.h
GeomDet
Definition: GeomDet.h:27
trajectoryStateTransform::initialFreeState
FreeTrajectoryState initialFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
Definition: TrajectoryStateTransform.cc:58
CSCWireTopology::wireAngle
float wireAngle() const override
Definition: CSCWireTopology.h:70
hfClusterShapes_cfi.hits
hits
Definition: hfClusterShapes_cfi.py:5
TAMuonSegmentMatch::segmentLocalErrorYDyDz
float segmentLocalErrorYDyDz
Definition: TAMuonSegmentMatch.h:22
HLT_2018_cff.minR
minR
Definition: HLT_2018_cff.py:83154
ESHandle.h
DTRecHitCollection.h
DTRecSegment2D::t0
double t0() const
Get the segment t0 (if recomputed, 0 is returned otherwise)
Definition: DTRecSegment2D.h:114
GEMSuperChamber
Definition: GEMSuperChamber.h:19
LocalTrajectoryError::positionError
LocalError positionError() const
Definition: LocalTrajectoryError.h:81
LocalError::xy
float xy() const
Definition: LocalError.h:23
edm::isNotFinite
constexpr bool isNotFinite(T x)
Definition: isFinite.h:9
PV3DBase::x
T x() const
Definition: PV3DBase.h:59
DTRecSegment2D.h
TrackDetectorAssociator::TrackDetectorAssociator
TrackDetectorAssociator()
Definition: TrackDetectorAssociator.cc:104
TrackDetectorAssociator.h
reco::deltaPhi
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
CaloGeometryRecord
Definition: CaloGeometryRecord.h:30
edm
HLT enums.
Definition: AlignableModifier.h:19
TrackDetectorAssociator::useDefaultPropagator
void useDefaultPropagator()
use the default propagator
Definition: TrackDetectorAssociator.cc:120
DetIdAssociator::MapRange::dThetaPlus
float dThetaPlus
Definition: DetIdAssociator.h:49
CSCChamberSpecs
Definition: CSCChamberSpecs.h:39
DTChamber
Definition: DTChamber.h:24
PSimHitContainer.h
EBDetId.h
RecSegment
Definition: RecSegment.h:27
DetIdAssociator::MapRange::dPhiPlus
float dPhiPlus
Definition: DetIdAssociator.h:51
CSCWireTopology::lengthOfPlane
double lengthOfPlane() const
Definition: CSCWireTopology.h:96
hgcalTowerProducer_cfi.tower
tower
Definition: hgcalTowerProducer_cfi.py:3
ME0SegmentCollection.h
CachedTrajectory::FullTrajectory
Definition: CachedTrajectory.h:64
HLT_2018_cff.distance
distance
Definition: HLT_2018_cff.py:6417
TrackCandidateProducer_cfi.simTracks
simTracks
Definition: TrackCandidateProducer_cfi.py:15
GlobalTrackingGeometryRecord
Definition: GlobalTrackingGeometryRecord.h:17
TrackDetectorAssociator::addTAMuonSegmentMatch
bool addTAMuonSegmentMatch(TAMuonChamberMatch &, const RecSegment *, const AssociatorParameters &)
Definition: TrackDetectorAssociator.cc:843
TrackDetectorAssociator::fillCaloTruth
void fillCaloTruth(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
Definition: TrackDetectorAssociator.cc:940
info
static const TGPicture * info(bool iBackgroundIsBlack)
Definition: FWCollectionSummaryWidget.cc:152
SteppingHelixPropagator_cfi.SteppingHelixPropagator
SteppingHelixPropagator
Definition: SteppingHelixPropagator_cfi.py:3
dtChamberEfficiency_cfi.cscSegments
cscSegments
Definition: dtChamberEfficiency_cfi.py:15
reco
fixed size matrix
Definition: AlignmentAlgorithmBase.h:45
FreeTrajectoryState::position
GlobalPoint position() const
Definition: FreeTrajectoryState.h:67
gemSegments_cfi.gemSegments
gemSegments
Definition: gemSegments_cfi.py:3
DetIdAssociator::MapRange::dThetaMinus
float dThetaMinus
Definition: DetIdAssociator.h:50
TAMuonSegmentMatch::hasPhi
bool hasPhi
Definition: TAMuonSegmentMatch.h:25
edm::Handle
Definition: AssociativeIterator.h:50
TrackingRecHit::localPosition
virtual LocalPoint localPosition() const =0
filterRecHits_cfi.EERecHits
EERecHits
Definition: filterRecHits_cfi.py:9
CachedTrajectory::IpToEcal
Definition: CachedTrajectory.h:64
TrackDetectorAssociator::fillHcal
void fillHcal(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
Definition: TrackDetectorAssociator.cc:436
TrackingRecHit::geographicalId
DetId geographicalId() const
Definition: TrackingRecHit.h:120
EcalRecHitCollections.h
CSCSegmentRef
edm::Ref< CSCSegmentCollection > CSCSegmentRef
Definition: CSCSegmentCollection.h:21
Bounds::length
virtual float length() const =0
TrackDetectorAssociator::fillCaloTowers
void fillCaloTowers(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
Definition: TrackDetectorAssociator.cc:339
parameters
parameters
Definition: BeamSpot_PayloadInspector.cc:14
CSCWireTopology::narrowWidthOfPlane
double narrowWidthOfPlane() const
Definition: CSCWireTopology.h:86
CosmicsPD_Skims.maxZ
maxZ
Definition: CosmicsPD_Skims.py:136
PV3DBase::z
T z() const
Definition: PV3DBase.h:61
TrackDetectorAssociator::getFreeTrajectoryState
static FreeTrajectoryState getFreeTrajectoryState(const edm::EventSetup &, const reco::Track &)
get FreeTrajectoryState from different track representations
Definition: TrackDetectorAssociator.cc:600
IdealMagneticFieldRecord
Definition: IdealMagneticFieldRecord.h:11
TAMuonSegmentMatch::segmentLocalErrorXDxDz
float segmentLocalErrorXDxDz
Definition: TAMuonSegmentMatch.h:21
Propagator
Definition: Propagator.h:44
Plane.h
GeomDet::surface
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
TrajectoryStateOnSurface
Definition: TrajectoryStateOnSurface.h:16
MakerMacros.h
SteppingHelixPropagator
Definition: SteppingHelixPropagator.h:36
Vector3DBase::unit
Vector3DBase unit() const
Definition: Vector3DBase.h:54
PSimHit.h
TrajectoryStateOnSurface::freeState
FreeTrajectoryState const * freeState(bool withErrors=true) const
Definition: TrajectoryStateOnSurface.h:58
Track.h
edm::EventSetup::get
T get() const
Definition: EventSetup.h:73
DetIdInfo::info
static std::string info(const DetId &, const TrackerTopology *tTopo)
Definition: DetIdInfo.cc:25
FrontierCondition_GT_autoExpress_cfi.t0
t0
Definition: FrontierCondition_GT_autoExpress_cfi.py:148
LocalError::xx
float xx() const
Definition: LocalError.h:22
OrphanHandle.h
CSCLayerGeometry
Definition: CSCLayerGeometry.h:25
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
SimVertex.h
Surface::bounds
const Bounds & bounds() const
Definition: Surface.h:87
AlgebraicSymMatrix66
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepSym< double, 6 > > AlgebraicSymMatrix66
Definition: AlgebraicROOTObjects.h:24
reco::Track
Definition: Track.h:27
IdealMagneticFieldRecord.h
edm::ESHandle< MagneticField >
CSCChamber
Definition: CSCChamber.h:22
GEMSegmentRef
edm::Ref< GEMSegmentCollection > GEMSegmentRef
Definition: GEMSegmentCollection.h:21
RecSegment::localDirection
virtual LocalVector localDirection() const =0
Local direction.
TAMuonSegmentMatch::segmentGlobalPosition
math::XYZPoint segmentGlobalPosition
Definition: TAMuonSegmentMatch.h:13
GlobalTrajectoryParameters
Definition: GlobalTrajectoryParameters.h:15
TAMuonSegmentMatch::segmentLocalErrorYY
float segmentLocalErrorYY
Definition: TAMuonSegmentMatch.h:17
Point3DBase< float, GlobalTag >
TrackDetectorAssociator::setPropagator
void setPropagator(const Propagator *)
use a user configured propagator
Definition: TrackDetectorAssociator.cc:115
DTLayer.h
TrackDetectorAssociator::getTAMuonChamberMatches
void getTAMuonChamberMatches(std::vector< TAMuonChamberMatch > &matches, const AssociatorParameters &parameters)
Definition: TrackDetectorAssociator.cc:642
CaloGeometryRecord.h
TAMuonSegmentMatch::t0
float t0
Definition: TAMuonSegmentMatch.h:23
DTGeometry.h
EcalSubdetector.h
SteppingHelixStateInfo
Definition: SteppingHelixStateInfo.h:27
TAMuonSegmentMatch::segmentLocalErrorDyDz
float segmentLocalErrorDyDz
Definition: TAMuonSegmentMatch.h:20
ALCARECOTkAlJpsiMuMu_cff.charge
charge
Definition: ALCARECOTkAlJpsiMuMu_cff.py:47
DetIdInfo.h
CaloSubdetectorGeometry.h
bphysicsOniaDQM_cfi.vertex
vertex
Definition: bphysicsOniaDQM_cfi.py:7
TrackDetectorAssociator::~TrackDetectorAssociator
~TrackDetectorAssociator()
Definition: TrackDetectorAssociator.cc:110
Event.h
eleHcalExtractorBlocks_cff.caloTowers
caloTowers
Definition: eleHcalExtractorBlocks_cff.py:15
LocalError
Definition: LocalError.h:12
TrackDetectorAssociator::fillMuon
void fillMuon(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
Definition: TrackDetectorAssociator.cc:745
DetIdAssociator::MapRange
Definition: DetIdAssociator.h:48
dumpMFGeometry_cfg.delta
delta
Definition: dumpMFGeometry_cfg.py:25
edm::RangeMap::const_iterator
C::const_iterator const_iterator
constant access iterator type
Definition: RangeMap.h:43
CachedTrajectory::IpToHO
Definition: CachedTrajectory.h:64
TAMuonChamberMatch::id
DetId id
Definition: TAMuonChamberMatch.h:31
match
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
SteppingHelixPropagator::applyRadX0Correction
void applyRadX0Correction(bool applyRadX0Correction)
Definition: SteppingHelixPropagator.h:133
PCaloHit.h
muonSimHitMatcherPSet.simTrack
simTrack
Definition: muonSimHitMatcherPSet.py:4
math::XYZVector
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
PV3DBase::eta
T eta() const
Definition: PV3DBase.h:73
TAMuonSegmentMatch::segmentLocalErrorDxDz
float segmentLocalErrorDxDz
Definition: TAMuonSegmentMatch.h:19
PV3DBase::y
T y() const
Definition: PV3DBase.h:60
LorentzVector.h
TAMuonSegmentMatch::segmentLocalErrorXX
float segmentLocalErrorXX
Definition: TAMuonSegmentMatch.h:16
iEvent
int iEvent
Definition: GenABIO.cc:224
universalConfigTemplate.collection
collection
Definition: universalConfigTemplate.py:81
ME0Chamber
Definition: ME0Chamber.h:10
DetIdAssociator::MapRange::dPhiMinus
float dPhiMinus
Definition: DetIdAssociator.h:52
M_PI
#define M_PI
Definition: BXVectorInputProducer.cc:50
TAMuonSegmentMatch::hasZed
bool hasZed
Definition: TAMuonSegmentMatch.h:24
DetIdAssociatorRecord.h
HLT_2018_cff.fillCaloTowers
fillCaloTowers
Definition: HLT_2018_cff.py:48595
MagneticField.h
edm::EventSetup
Definition: EventSetup.h:57
HcalSubdetector.h
electronAnalyzer_cfi.DeltaR
DeltaR
Definition: electronAnalyzer_cfi.py:33
itr
std::vector< std::pair< float, float > >::iterator itr
Definition: HGCDigitizer.cc:28
SteppingHelixStateInfo::isValid
bool isValid() const
Definition: SteppingHelixStateInfo.h:65
DetIdAssociatorRecord
Definition: DetIdAssociatorRecord.h:13
TrackDetectorAssociator::init
void init(const edm::EventSetup &)
Definition: TrackDetectorAssociator.cc:122
SteppingHelixPropagator::setMaterialMode
void setMaterialMode(bool noMaterial)
Switch for material effects mode: no material effects if true.
Definition: SteppingHelixPropagator.h:124
CSCWireTopology::wideWidthOfPlane
double wideWidthOfPlane() const
Definition: CSCWireTopology.h:91
reco::get
T get(const Candidate &c)
Definition: component.h:60
CaloTowerCollection.h
TAMuonChamberMatch
Definition: TAMuonChamberMatch.h:20
fftjetvertexadder_cfi.sigmaX
sigmaX
Definition: fftjetvertexadder_cfi.py:30
PV3DBase::mag
T mag() const
Definition: PV3DBase.h:64
TrackDetectorAssociator::Direction
Direction
Definition: TrackDetectorAssociator.h:55
TAMuonChamberMatch::segments
std::vector< TAMuonSegmentMatch > segments
distance sign convention: negative - crossed chamber, positive - missed chamber
Definition: TAMuonChamberMatch.h:27
ME0Geometry.h
trajectoryStateTransform::innerFreeState
FreeTrajectoryState innerFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
Definition: TrajectoryStateTransform.cc:86
CartesianTrajectoryError
Definition: CartesianTrajectoryError.h:15
TrackDetMatchInfo
Definition: TrackDetMatchInfo.h:14
GeomDet.h
CaloCellGeometry.h
TrackDetectorAssociator::fillPreshower
void fillPreshower(const edm::Event &iEvent, TrackDetMatchInfo &info, const AssociatorParameters &)
Definition: TrackDetectorAssociator.cc:413
GEMGeometry.h
edm::RangeMap::range
std::pair< const_iterator, const_iterator > range
iterator range
Definition: RangeMap.h:50
TrackDetectorAssociator::fillEcal
void fillEcal(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
Definition: TrackDetectorAssociator.cc:265
DetId::rawId
constexpr uint32_t rawId() const
get the raw id
Definition: DetId.h:57
fftjetvertexadder_cfi.sigmaY
sigmaY
Definition: fftjetvertexadder_cfi.py:31
DTRecSegment4D::hasZed
bool hasZed() const
Does it have the Z projection?
Definition: DTRecSegment4D.h:93
ErrorFrameTransformer.h
CachedTrajectory::IpToHcal
Definition: CachedTrajectory.h:64
isFinite.h
FreeTrajectoryState
Definition: FreeTrajectoryState.h:27
Calorimetry_cff.bField
bField
Definition: Calorimetry_cff.py:292
CSCLayerGeometry::wireTopology
const CSCWireTopology * wireTopology() const
Definition: CSCLayerGeometry.h:282
DetId.h
SimTrack
Definition: SimTrack.h:6
TAMuonSegmentMatch
Definition: TAMuonSegmentMatch.h:11
Frameworkfwd.h
triggerObjects_cff.id
id
Definition: triggerObjects_cff.py:31
DetIdAssociator.h
CSCWireTopology::yOfWire
float yOfWire(float wire, float x=0.) const
Definition: CSCWireTopology.h:81
GloballyPositioned::toLocal
LocalPoint toLocal(const GlobalPoint &gp) const
Definition: GloballyPositioned.h:98
GEMSegmentCollection.h
SuperCluster.h
ME0SegmentRef
edm::Ref< ME0SegmentCollection > ME0SegmentRef
Definition: ME0SegmentCollection.h:22
Exception
Definition: hltDiff.cc:246
CaloGeometry.h
CSCWireTopology
Definition: CSCWireTopology.h:18
TrackDetectorAssociator::getMapRange
DetIdAssociator::MapRange getMapRange(const std::pair< float, float > &delta, const float dR)
Definition: TrackDetectorAssociator.cc:622
DTRecSegment4DRef
edm::Ref< DTRecSegment4DCollection > DTRecSegment4DRef
Definition: DTRecSegment4DCollection.h:24
DTRecSegment2D::specificRecHits
std::vector< DTRecHit1D > specificRecHits() const
Access to specific components.
Definition: DTRecSegment2D.cc:104
relativeConstraints.chamber
chamber
Definition: relativeConstraints.py:53
EventSetup.h
or
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
HcalRecHitCollections.h
TrajectoryStateTransform.h
PCaloHitContainer.h
TAMuonSegmentMatch::segmentLocalDirection
math::XYZVector segmentLocalDirection
Definition: TAMuonSegmentMatch.h:15
TAMuonSegmentMatch::segmentLocalErrorXY
float segmentLocalErrorXY
Definition: TAMuonSegmentMatch.h:18
TAMuonSegmentMatch::segmentLocalPosition
math::XYZPoint segmentLocalPosition
Definition: TAMuonSegmentMatch.h:14
patCandidatesForDimuonsSequences_cff.matches
matches
Definition: patCandidatesForDimuonsSequences_cff.py:131
DTRecSegment4D::hasPhi
bool hasPhi() const
Does it have the Phi projection?
Definition: DTRecSegment4D.h:90
HLT_2018_cff.track
track
Definition: HLT_2018_cff.py:10352
funct::pow
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:30
TAMuonChamberMatch::tState
TrajectoryStateOnSurface tState
Definition: TAMuonChamberMatch.h:30
mps_fire.result
result
Definition: mps_fire.py:303
cms::Exception
Definition: Exception.h:70
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
CSCChamberSpecs.h
TrackDetectorAssociator::associate
TrackDetMatchInfo associate(const edm::Event &, const edm::EventSetup &, const FreeTrajectoryState &, const AssociatorParameters &)
Definition: TrackDetectorAssociator.cc:154
LogTrace
#define LogTrace(id)
Definition: MessageLogger.h:671
HGCalValidator_cfi.simVertices
simVertices
Definition: HGCalValidator_cfi.py:43
SimTrack.h
HGC3DClusterGenMatchSelector_cfi.dR
dR
Definition: HGC3DClusterGenMatchSelector_cfi.py:7
me0Segments_cfi.me0Segments
me0Segments
Definition: me0Segments_cfi.py:6
MuonGeometryRecord.h
edm::HandleBase::isValid
bool isValid() const
Definition: HandleBase.h:70
point
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5
edm::Event
Definition: Event.h:73
TrajectoryStateOnSurface::localError
const LocalTrajectoryError & localError() const
Definition: TrajectoryStateOnSurface.h:77
DTRecSegment4D::phiSegment
const DTChamberRecSegment2D * phiSegment() const
The superPhi segment: 0 if no phi projection available.
Definition: DTRecSegment4D.h:96
CSCChamberSpecs::oddLayerGeometry
const CSCLayerGeometry * oddLayerGeometry(int iendcap) const
Accessors for LayerGeometry's.
Definition: CSCChamberSpecs.h:67
LocalError::yy
float yy() const
Definition: LocalError.h:24
SimTrackContainer.h
PV3DBase::perp
T perp() const
Definition: PV3DBase.h:69
PV3DBase::phi
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
SimVertexContainer.h
TrajectoryStateOnSurface::isValid
bool isValid() const
Definition: TrajectoryStateOnSurface.h:54
hit
Definition: SiStripHitEffFromCalibTree.cc:88
TrackDetectorAssociator::fillHO
void fillHO(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
Definition: TrackDetectorAssociator.cc:504
CSCGeometry.h
RecSegment::localDirectionError
virtual LocalError localDirectionError() const =0
Error on the local direction.
DTRecSegment4DCollection.h
MillePedeFileConverter_cfg.e
e
Definition: MillePedeFileConverter_cfg.py:37
TrackingRecHit::localPositionError
virtual LocalError localPositionError() const =0
TrackAssociatorParameters
Definition: TrackAssociatorParameters.h:34
CosmicGenFilterHelix_cff.minZ
minZ
i.e.
Definition: CosmicGenFilterHelix_cff.py:9
CSCSegmentCollection.h
filterRecHits_cfi.EBRecHits
EBRecHits
Definition: filterRecHits_cfi.py:8