CMS 3D CMS Logo

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