73 #include "Math/VectorUtil.h"
105 useDefaultPropagator_ =
false;
110 if (defProp_)
delete defProp_;
116 cachedTrajectory_.setPropagator(ivProp_);
121 useDefaultPropagator_ =
true;
129 if (!theCaloGeometry_.isValid())
130 throw cms::Exception(
"FatalError") <<
"Unable to find CaloGeometryRecord in event!\n";
134 if (!theTrackingGeometry_.isValid())
135 throw cms::Exception(
"FatalError") <<
"Unable to find GlobalTrackingGeometryRecord in event!\n";
137 if (useDefaultPropagator_ && (! defProp_ || theMagneticFeildWatcher_.check(iSetup) ) ) {
147 setPropagator(defProp_);
163 return associate(iEvent,iSetup,parameters,&fts);
176 "Configuration error! No subdetector was selected for the track association.";
182 cachedTrajectory_.setStateAtIP(trackOrigin);
198 cachedTrajectory_.reset_trajectory();
203 double HOmaxR = hoDetIdAssociator_->volume().maxR();
204 double HOmaxZ = hoDetIdAssociator_->volume().maxZ();
205 double minR = ecalDetIdAssociator_->volume().minR();
206 double minZ = preshowerDetIdAssociator_->volume().minZ();
207 cachedTrajectory_.setMaxHORadius(HOmaxR);
208 cachedTrajectory_.setMaxHOLength(HOmaxZ*2.);
209 cachedTrajectory_.setMinDetectorRadius(minR);
210 cachedTrajectory_.setMinDetectorLength(minZ*2.);
216 maxR = muonDetIdAssociator_->volume().maxR();
217 maxZ = muonDetIdAssociator_->volume().maxZ();
218 cachedTrajectory_.setMaxDetectorRadius(maxR);
219 cachedTrajectory_.setMaxDetectorLength(maxZ*2.);
224 cachedTrajectory_.setMaxDetectorRadius(HOmaxR);
225 cachedTrajectory_.setMaxDetectorLength(HOmaxZ*2.);
231 LogTrace(
"TrackAssociator") <<
"Using outerState as trackOrigin at Rho=" << outerState->
position().
perp()
232 <<
" Z=" << outerState->
position().
z() <<
"\n";
235 else if(innerState) {
236 LogTrace(
"TrackAssociator") <<
"Using innerState as trackOrigin at Rho=" << innerState->
position().
perp()
237 <<
" Z=" << innerState->
position().
z() <<
"\n";
242 if ( ! cachedTrajectory_.propagateAll(trackOrigin) )
return info;
245 cachedTrajectory_.findEcalTrajectory( ecalDetIdAssociator_->volume() );
246 cachedTrajectory_.findHcalTrajectory( hcalDetIdAssociator_->volume() );
247 cachedTrajectory_.findHOTrajectory( hoDetIdAssociator_->volume() );
248 cachedTrajectory_.findPreshowerTrajectory( preshowerDetIdAssociator_->volume() );
250 info.
trkGlobPosAtEcal = getPoint( cachedTrajectory_.getStateAtEcal().position() );
251 info.
trkGlobPosAtHcal = getPoint( cachedTrajectory_.getStateAtHcal().position() );
252 info.
trkGlobPosAtHO = getPoint( cachedTrajectory_.getStateAtHO().position() );
254 info.
trkMomAtEcal = cachedTrajectory_.getStateAtEcal().momentum();
255 info.
trkMomAtHcal = cachedTrajectory_.getStateAtHcal().momentum();
256 info.
trkMomAtHO = cachedTrajectory_.getStateAtHO().momentum();
260 if (parameters.
useEcal) fillEcal( iEvent, info, parameters);
261 if (parameters.
useCalo) fillCaloTowers( iEvent, info, parameters);
262 if (parameters.
useHcal) fillHcal( iEvent, info, parameters);
263 if (parameters.
useHO) fillHO( iEvent, info, parameters);
264 if (parameters.
usePreshower) fillPreshower( iEvent, info, parameters);
265 if (parameters.
useMuon) fillMuon( iEvent, info, parameters);
266 if (parameters.
truthMatch) fillCaloTruth( iEvent, info, parameters);
278 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getEcalTrajectory();
280 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
281 itr != trajectoryStates.end(); itr++)
282 LogTrace(
"TrackAssociator") <<
"ECAL trajectory point (rho, z, phi): " << itr->position().perp() <<
283 ", " << itr->position().z() <<
", " << itr->position().phi();
285 std::vector<GlobalPoint> coreTrajectory;
286 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
287 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
289 if(coreTrajectory.empty()) {
290 LogTrace(
"TrackAssociator") <<
"ECAL track trajectory is empty; moving on\n";
300 if (!EBRecHits.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find EBRecHitCollection in the event!\n";
305 if (!EERecHits.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find EERecHitCollection in event!\n";
309 std::set<DetId> ecalIdsInRegion;
314 ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0],mapRange);
315 }
else ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dREcalPreselection);
317 LogTrace(
"TrackAssociator") <<
"ECAL hits in the region: " << ecalIdsInRegion.size();
319 ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsInACone(ecalIdsInRegion, coreTrajectory, parameters.
dREcal);
320 LogTrace(
"TrackAssociator") <<
"ECAL hits in the cone: " << ecalIdsInRegion.size();
321 std::vector<DetId> crossedEcalIds =
322 ecalDetIdAssociator_->getCrossedDetIds(ecalIdsInRegion, coreTrajectory);
323 LogTrace(
"TrackAssociator") <<
"ECAL crossed hits " << crossedEcalIds.size();
329 for(std::vector<DetId>::const_iterator itr=crossedEcalIds.begin(); itr!=crossedEcalIds.end();itr++)
331 std::vector<EcalRecHit>::const_iterator ebHit = (*EBRecHits).find(*itr);
332 std::vector<EcalRecHit>::const_iterator eeHit = (*EERecHits).find(*itr);
333 if(ebHit != (*EBRecHits).end())
335 else if(eeHit != (*EERecHits).end())
338 LogTrace(
"TrackAssociator") <<
"Crossed EcalRecHit is not found for DetId: " << itr->rawId();
341 for(std::set<DetId>::const_iterator itr=ecalIdsInRegion.begin(); itr!=ecalIdsInRegion.end();itr++)
343 std::vector<EcalRecHit>::const_iterator ebHit = (*EBRecHits).find(*itr);
344 std::vector<EcalRecHit>::const_iterator eeHit = (*EERecHits).find(*itr);
345 if(ebHit != (*EBRecHits).end())
347 else if(eeHit != (*EERecHits).end())
350 LogTrace(
"TrackAssociator") <<
"EcalRecHit from the cone is not found for DetId: " << itr->rawId();
362 std::vector<GlobalPoint> trajectory;
363 const std::vector<SteppingHelixStateInfo>& ecalTrajectoryStates = cachedTrajectory_.getEcalTrajectory();
364 const std::vector<SteppingHelixStateInfo>& hcalTrajectoryStates = cachedTrajectory_.getHcalTrajectory();
365 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = ecalTrajectoryStates.begin();
366 itr != ecalTrajectoryStates.end(); itr++) trajectory.push_back(itr->position());
367 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = hcalTrajectoryStates.begin();
368 itr != hcalTrajectoryStates.end(); itr++) trajectory.push_back(itr->position());
370 if(trajectory.empty()) {
371 LogTrace(
"TrackAssociator") <<
"HCAL trajectory is empty; moving on\n";
381 if (!caloTowers.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find CaloTowers in event!\n";
384 std::set<DetId> caloTowerIdsInRegion;
389 caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0],mapRange);
390 }
else caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0], parameters.
dRHcalPreselection);
392 LogTrace(
"TrackAssociator") <<
"Towers in the region: " << caloTowerIdsInRegion.size();
393 std::set<DetId> caloTowerIdsInACone = caloDetIdAssociator_->getDetIdsInACone(caloTowerIdsInRegion, trajectory, parameters.
dRHcal);
394 LogTrace(
"TrackAssociator") <<
"Towers in the cone: " << caloTowerIdsInACone.size();
395 std::vector<DetId> crossedCaloTowerIds = caloDetIdAssociator_->getCrossedDetIds(caloTowerIdsInRegion, trajectory);
396 LogTrace(
"TrackAssociator") <<
"Towers crossed: " << crossedCaloTowerIds.size();
402 for(std::vector<DetId>::const_iterator itr=crossedCaloTowerIds.begin(); itr!=crossedCaloTowerIds.end();itr++)
405 if(tower != (*caloTowers).end())
408 LogTrace(
"TrackAssociator") <<
"Crossed CaloTower is not found for DetId: " << (*itr).rawId();
412 for(std::set<DetId>::const_iterator itr=caloTowerIdsInACone.begin(); itr!=caloTowerIdsInACone.end();itr++)
415 if(tower != (*caloTowers).end())
416 info.
towers.push_back(&*tower);
418 LogTrace(
"TrackAssociator") <<
"CaloTower from the cone is not found for DetId: " << (*itr).rawId();
427 std::vector<GlobalPoint> trajectory;
428 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getPreshowerTrajectory();
429 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
430 itr != trajectoryStates.end(); itr++) trajectory.push_back(itr->position());
432 if(trajectory.empty()) {
433 LogTrace(
"TrackAssociator") <<
"Preshower trajectory is empty; moving on\n";
437 std::set<DetId> idsInRegion =
438 preshowerDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0],
441 LogTrace(
"TrackAssociator") <<
"Number of Preshower Ids in the region: " << idsInRegion.size();
442 std::vector<DetId> crossedIds = preshowerDetIdAssociator_->getCrossedDetIds(idsInRegion, trajectory);
443 LogTrace(
"TrackAssociator") <<
"Number of Preshower Ids in crossed: " << crossedIds.size();
455 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHcalTrajectory();
457 std::vector<GlobalPoint> coreTrajectory;
458 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
459 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
461 if(coreTrajectory.empty()) {
462 LogTrace(
"TrackAssociator") <<
"HCAL trajectory is empty; moving on\n";
472 if ( ! collection.
isValid() )
throw cms::Exception(
"FatalError") <<
"Unable to find HBHERecHits in event!\n";
475 std::set<DetId> idsInRegion;
480 idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
481 }
else idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dRHcalPreselection);
483 LogTrace(
"TrackAssociator") <<
"HCAL hits in the region: " << idsInRegion.size() <<
"\n" <<
DetIdInfo::info(idsInRegion);
484 std::set<DetId> idsInACone = hcalDetIdAssociator_->getDetIdsInACone(idsInRegion, coreTrajectory, parameters.
dRHcal);
485 LogTrace(
"TrackAssociator") <<
"HCAL hits in the cone: " << idsInACone.size() <<
"\n" <<
DetIdInfo::info(idsInACone);
486 std::vector<DetId> crossedIds =
487 hcalDetIdAssociator_->getCrossedDetIds(idsInRegion, coreTrajectory);
488 LogTrace(
"TrackAssociator") <<
"HCAL hits crossed: " << crossedIds.size() <<
"\n" <<
DetIdInfo::info(crossedIds);
494 for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
497 if( hit != (*collection).end() )
500 LogTrace(
"TrackAssociator") <<
"Crossed HBHERecHit is not found for DetId: " << itr->rawId();
503 for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
506 if( hit != (*collection).end() )
509 LogTrace(
"TrackAssociator") <<
"HBHERecHit from the cone is not found for DetId: " << itr->rawId();
520 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHOTrajectory();
522 std::vector<GlobalPoint> coreTrajectory;
523 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
524 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
526 if(coreTrajectory.empty()) {
527 LogTrace(
"TrackAssociator") <<
"HO trajectory is empty; moving on\n";
537 if ( ! collection.
isValid() )
throw cms::Exception(
"FatalError") <<
"Unable to find HORecHits in event!\n";
540 std::set<DetId> idsInRegion;
545 idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
546 }
else idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dRHcalPreselection);
548 LogTrace(
"TrackAssociator") <<
"idsInRegion.size(): " << idsInRegion.size();
549 std::set<DetId> idsInACone = hoDetIdAssociator_->getDetIdsInACone(idsInRegion, coreTrajectory, parameters.
dRHcal);
550 LogTrace(
"TrackAssociator") <<
"idsInACone.size(): " << idsInACone.size();
551 std::vector<DetId> crossedIds =
552 hoDetIdAssociator_->getCrossedDetIds(idsInRegion, coreTrajectory);
558 for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
561 if( hit != (*collection).end() )
564 LogTrace(
"TrackAssociator") <<
"Crossed HORecHit is not found for DetId: " << itr->rawId();
568 for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
571 if( hit != (*collection).end() )
574 LogTrace(
"TrackAssociator") <<
"HORecHit from the cone is not found for DetId: " << itr->rawId();
586 if (
abs(track.
type( )) == 211 ||
589 charge = track.
type( )< 0 ? -1 : 1;
590 return getFreeTrajectoryState(iSetup, vector,
point, charge);
603 ROOT::Math::SMatrixIdentity id;
626 ROOT::Math::SMatrixIdentity id;
641 if ( delta.first > 0 )
645 if ( delta.second > 0 )
648 mapRange.
dPhiMinus += fabs(delta.second);
649 LogTrace(
"TrackAssociator") <<
"Selection range: (dThetaPlus, dThetaMinus, dPhiPlus, dPhiMinus, dRPreselection): " <<
672 if(! trajectoryPoint.
isValid() ) trajectoryPoint = cachedTrajectory_.getOuterState();
673 if(! trajectoryPoint.
isValid() ) {
675 "trajectory position at HCAL is not valid. Assume the track cannot reach muon detectors and skip it";
680 LogTrace(
"TrackAssociator") <<
"muon direction: " << direction <<
"\n\t and corresponding point: " <<
689 std::set<DetId> muonIdsInRegion =
690 muonDetIdAssociator_->getDetIdsCloseToAPoint(trajectoryPoint.
position(), mapRange);
692 LogTrace(
"TrackAssociator") <<
"Number of chambers to check: " << muonIdsInRegion.size();
693 for(std::set<DetId>::const_iterator detId = muonIdsInRegion.begin(); detId != muonIdsInRegion.end(); detId++)
695 const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet(*detId);
698 if (! stateOnSurface.
isValid()) {
699 LogTrace(
"TrackAssociator") <<
"Failed to propagate the track; moving on\n\t"<<
710 if(
const CSCChamber* cscChamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
713 LogTrace(
"TrackAssociator") <<
"Failed to get CSCChamberSpecs from CSCChamber; moving on\n";
717 if(! layerGeometry) {
718 LogTrace(
"TrackAssociator") <<
"Failed to get CSCLayerGeometry from CSCChamberSpecs; moving on\n";
723 LogTrace(
"TrackAssociator") <<
"Failed to get CSCWireTopology from CSCLayerGeometry; moving on\n";
731 float yOfFirstWire = fabs(wireTopology->
wireAngle())>1.E-06 ? -0.5*length : wireTopology->
yOfWire(1);
733 float yCOWPOffset = yOfFirstWire+0.5*length;
736 float tangent = (wideWidth-narrowWidth)/(2.*length);
738 float yPrime = localPoint.
y()+fabs(yOfFirstWire);
740 float halfWidthAtYPrime = 0.5*narrowWidth+yPrime*tangent;
741 distanceX = fabs(localPoint.
x()) - halfWidthAtYPrime;
742 distanceY = fabs(localPoint.
y()-yCOWPOffset) - 0.5*length;
743 sigmaX = distanceX/
sqrt(localError.
xx());
744 sigmaY = distanceY/
sqrt(localError.
yy());
748 sigmaX = distanceX/
sqrt(localError.
xx());
749 sigmaY = distanceY/
sqrt(localError.
yy());
756 match.
tState = stateOnSurface;
760 matches.push_back(match);
762 LogTrace(
"TrackAssociator") <<
"chamber is too far: " <<
763 DetIdInfo::info(*detId) <<
"\n\tdistanceX: " << distanceX <<
"\t distanceY: " << distanceY <<
764 "\t sigmaX: " << sigmaX <<
"\t sigmaY: " << sigmaY <<
"\n";
784 throw cms::Exception(
"FatalError") <<
"Unable to find DTRecSegment4DCollection in event!\n";
789 throw cms::Exception(
"FatalError") <<
"Unable to find CSCSegmentCollection in event!\n";
804 std::vector<TAMuonChamberMatch> matchedChambers;
805 LogTrace(
"TrackAssociator") <<
"Trying to Get ChamberMatches" << std::endl;
806 getTAMuonChamberMatches(matchedChambers, parameters);
807 LogTrace(
"TrackAssociator") <<
"Chambers matched: " << matchedChambers.size() <<
"\n";
812 for(std::vector<TAMuonChamberMatch>::iterator matchedChamber = matchedChambers.begin();
813 matchedChamber != matchedChambers.end(); matchedChamber++)
815 const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet((*matchedChamber).id);
817 if(
const DTChamber* chamber = dynamic_cast<const DTChamber*>(geomDet) ) {
822 if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
823 matchedChamber->segments.back().dtSegmentRef =
DTRecSegment4DRef(dtSegments, segment - dtSegments->begin());
828 if(
const CSCChamber* chamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
833 if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
834 matchedChamber->segments.back().cscSegmentRef =
CSCSegmentRef(cscSegments, segment - cscSegments->begin());
841 info.
chambers.push_back(*matchedChamber);
851 <<
"Segment local position: " << segment->
localPosition() <<
"\n"
854 const GeomDet* chamber = muonDetIdAssociator_->getGeomDet(matchedChamber.
id);
859 <<
"Segment global position: " << segmentGlobalPosition <<
" \t (R_xy,eta,phi): "
860 << segmentGlobalPosition.
perp() <<
"," << segmentGlobalPosition.
eta() <<
"," << segmentGlobalPosition.
phi() <<
"\n";
863 <<
"\teta hit: " << segmentGlobalPosition.
eta() <<
" \tpropagator: " << trajectoryStateOnSurface.
freeState()->
position().
eta() <<
"\n"
864 <<
"\tphi hit: " << segmentGlobalPosition.
phi() <<
" \tpropagator: " << trajectoryStateOnSurface.
freeState()->
position().
phi() << std::endl;
867 bool isDTWithoutY =
false;
869 if ( dtseg && (! dtseg->
hasZed()) )
873 if(deltaPhi>
M_PI) deltaPhi = fabs(deltaPhi-
M_PI*2.);
877 isGood = deltaPhi < parameters.
dRMuon;
881 deltaPhi*deltaPhi) < parameters.
dRMuon;
900 muonSegment.
hasZed =
true;
901 muonSegment.
hasPhi =
true;
906 if ( (dtseg->
hasPhi()) && (! isDTWithoutY) ) {
915 LogTrace(
"TrackAssociator") <<
" Phi t0: " << dtseg->
phiSegment()->
t0() <<
" hits: " << phiHits;
923 if (hits) muonSegment.
t0 = t0/hits;
927 if (isDTWithoutY) muonSegment.
hasZed =
false;
931 matchedChamber.
segments.push_back(muonSegment);
947 if (! simTracks.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated tracks found\n";
951 if (! simVertices.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated vertices found\n";
956 if (! simEcalHitsEB.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated ECAL EB hits found\n";
960 if (! simEcalHitsEE.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated ECAL EE hits found\n";
964 if (! simHcalHits.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated HCAL hits found\n";
967 SimTrackContainer::const_iterator simTrack = simTracks->begin();
968 for( ; simTrack != simTracks->end(); ++simTrack){
969 math::XYZVector simP3( simTrack->momentum().x(), simTrack->momentum().y(), simTrack->momentum().z() );
971 if ( ROOT::Math::VectorUtil::DeltaR(recoP3, simP3) < 0.1 )
break;
973 if ( simTrack != simTracks->end() ) {
975 double ecalTrueEnergy(0);
976 double hcalTrueEnergy(0);
979 for( PCaloHitContainer::const_iterator
hit = simEcalHitsEB->begin();
hit != simEcalHitsEB->end(); ++
hit )
982 for( PCaloHitContainer::const_iterator
hit = simEcalHitsEE->begin();
hit != simEcalHitsEE->end(); ++
hit )
985 for( PCaloHitContainer::const_iterator
hit = simHcalHits->begin();
hit != simHcalHits->end(); ++
hit )
1005 double currentStepSize = cachedTrajectory_.getPropagationStep();
1011 if ( direction != InsideOut )
1013 "No TrackExtra information is available and association is done with something else than InsideOut track.\n" <<
1014 "Either change the parameter or provide needed data!\n";
1015 LogTrace(
"TrackAssociator") <<
"Track Extras not found\n";
1017 return associate(iEvent, iSetup, parameters, &initialState);
1020 LogTrace(
"TrackAssociator") <<
"Track Extras found\n";
1025 LogTrace(
"TrackAssociator") <<
"inner track state (rho, z, phi):" <<
1028 LogTrace(
"TrackAssociator") <<
"innerFreeState (rho, z, phi):" <<
1032 LogTrace(
"TrackAssociator") <<
"outer track state (rho, z, phi):" <<
1035 LogTrace(
"TrackAssociator") <<
"outerFreeState (rho, z, phi):" <<
1040 if ( crossedIP( track ) ) {
1041 switch ( direction ) {
1044 return associate(iEvent, iSetup, parameters, &referenceState, &outerState);
1048 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1050 cachedTrajectory_.setPropagationStep( currentStepSize );
1056 switch ( direction ) {
1058 return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1062 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1064 cachedTrajectory_.setPropagationStep( currentStepSize );
1074 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1077 result = associate(iEvent, iSetup, parameters, &innerState, &outerState);
1079 result = associate(iEvent, iSetup, parameters, &outerState, &innerState);
1080 cachedTrajectory_.setPropagationStep( currentStepSize );
1088 return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1097 return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, track, vertex), parameters);
1107 return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, momentum, vertex, charge), parameters);
1112 bool crossed =
true;
edm::EDGetTokenT< CaloTowerCollection > caloTowersToken
std::vector< DetId > crossedPreshowerIds
math::XYZPoint trkGlobPosAtHO
std::pair< const_iterator, const_iterator > range
iterator range
TrackDetectorAssociator()
float segmentLocalErrorXX
const CSCWireTopology * wireTopology() const
virtual float length() const =0
static bool crossedIP(const reco::Track &track)
const Vector & momentum() const
track momentum vector
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 "extra" object
std::vector< const HBHERecHit * > crossedHcalRecHits
std::vector< DetId > crossedTowerIds
double dREcalPreselection
float segmentLocalErrorXY
bool getByToken(EDGetToken token, Handle< PROD > &result) const
math::XYZPoint segmentGlobalPosition
float segmentLocalErrorYDyDz
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.
math::XYZPoint segmentLocalPosition
void setCaloGeometry(edm::ESHandle< CaloGeometry > geometry)
virtual LocalVector localDirection() const =0
Local direction.
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepSym< double, 6 > > AlgebraicSymMatrix66
void useDefaultPropagator()
use the default propagator
Geom::Phi< T > phi() const
std::vector< CaloTower >::const_iterator const_iterator
void fillHcal(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
double dRMuonPreselection
const Bounds & bounds() const
bool addTAMuonSegmentMatch(TAMuonChamberMatch &, const RecSegment *, const AssociatorParameters &)
double muonMaxDistanceSigmaY
const math::XYZPoint & outerPosition() const
position of the outermost hit
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.
math::XYZVector segmentLocalDirection
LocalError positionError() const
edm::EDGetTokenT< EBRecHitCollection > EBRecHitsToken
float segmentLocalErrorDxDz
math::XYZPoint trkGlobPosAtHcal
FreeTrajectoryState stateAtIP
track info
void fillCaloTowers(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
const math::XYZPoint & innerPosition() const
position of the innermost hit
uint32_t rawId() const
get the raw id
void fillCaloTruth(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
edm::EDGetTokenT< edm::PCaloHitContainer > simEcalHitsEBToken
edm::EDGetTokenT< HORecHitCollection > HOcollToken
bool isNull() const
Checks for null.
float segmentLocalErrorDyDz
tuple SteppingHelixPropagator
void setPropagator(const Propagator *)
use a user configured propagator
void getTAMuonChamberMatches(std::vector< TAMuonChamberMatch > &matches, const AssociatorParameters ¶meters)
void applyRadX0Correction(bool applyRadX0Correction)
GlobalPoint position() const
LocalPoint toLocal(const GlobalPoint &gp) const
FreeTrajectoryState const * freeState(bool withErrors=true) const
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) ...
std::vector< TAMuonChamberMatch > chambers
std::vector< const HBHERecHit * > hcalRecHits
edm::EDGetTokenT< DTRecSegment4DCollection > dtSegmentsToken
std::vector< DetId > crossedHOIds
double dRPreshowerPreselection
Abs< T >::type abs(const T &t)
const math::XYZTLorentzVectorD & position() const
static std::string info(const DetId &)
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
edm::EDGetTokenT< HBHERecHitCollection > HBHEcollToken
void fillPreshower(const edm::Event &iEvent, TrackDetMatchInfo &info, const AssociatorParameters &)
GlobalVector momentum() const
float segmentLocalErrorYY
std::vector< DTRecHit1D > specificRecHits() const
Access to specific components.
double narrowWidthOfPlane() const
double dRHcalPreselection
edm::Ref< DTRecSegment4DCollection > DTRecSegment4DRef
double muonMaxDistanceSigmaX
const Point & vertex() const
reference point on the track. This method is DEPRECATED, please use referencePoint() instead ...
double deltaPhi(double phi1, double phi2)
Vector3DBase unit() const
bool hasZed() const
Does it have the Z projection?
GlobalPoint position() const
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
double wideWidthOfPlane() const
double hcalTrueEnergyCorrected
GlobalVector trkMomAtEcal
edm::EDGetTokenT< edm::SimVertexContainer > simVerticesToken
XYZVectorD XYZVector
spatial vector with cartesian internal representation
virtual LocalError localPositionError() const =0
~TrackDetectorAssociator()
void fillMuon(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
const CSCLayerGeometry * oddLayerGeometry(int iendcap) const
Accessors for LayerGeometry's.
void init(const edm::EventSetup &)
DetIdAssociator::MapRange getMapRange(const std::pair< float, float > &delta, const float dR)
GlobalVector trkMomAtHcal
int type() const
particle type (HEP PDT convension)
float segmentLocalErrorXDxDz
void fillEcal(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
const math::XYZTLorentzVectorD & momentum() const
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
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
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
DetId geographicalId() const
double t0() const
Get the segment t0 (if recomputed, 0 is returned otherwise)
std::vector< const HORecHit * > hoRecHits
virtual LocalPoint localPosition() const =0
virtual float width() const =0
const SimTrack * simTrack
MC truth info.
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)
*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
bool accountForTrajectoryChangeCalo
edm::EDGetTokenT< edm::PCaloHitContainer > simEcalHitsEEToken