74 #include "Math/VectorUtil.h"
104 useDefaultPropagator_ =
false;
109 if (defProp_)
delete defProp_;
115 cachedTrajectory_.setPropagator(ivProp_);
120 useDefaultPropagator_ =
true;
128 if (!theCaloGeometry_.isValid())
129 throw cms::Exception(
"FatalError") <<
"Unable to find CaloGeometryRecord in event!\n";
133 if (!theTrackingGeometry_.isValid())
134 throw cms::Exception(
"FatalError") <<
"Unable to find GlobalTrackingGeometryRecord in event!\n";
136 if (useDefaultPropagator_ && (! defProp_ || theMagneticFeildWatcher_.check(iSetup) ) ) {
146 setPropagator(defProp_);
162 return associate(iEvent,iSetup,parameters,&fts);
175 "Configuration error! No subdetector was selected for the track association.";
181 cachedTrajectory_.setStateAtIP(trackOrigin);
197 cachedTrajectory_.reset_trajectory();
202 double HOmaxR = hoDetIdAssociator_->volume().maxR();
203 double HOmaxZ = hoDetIdAssociator_->volume().maxZ();
204 double minR = ecalDetIdAssociator_->volume().minR();
205 double minZ = preshowerDetIdAssociator_->volume().minZ();
206 cachedTrajectory_.setMaxHORadius(HOmaxR);
207 cachedTrajectory_.setMaxHOLength(HOmaxZ*2.);
208 cachedTrajectory_.setMinDetectorRadius(minR);
209 cachedTrajectory_.setMinDetectorLength(minZ*2.);
215 maxR = muonDetIdAssociator_->volume().maxR();
216 maxZ = muonDetIdAssociator_->volume().maxZ();
217 cachedTrajectory_.setMaxDetectorRadius(maxR);
218 cachedTrajectory_.setMaxDetectorLength(maxZ*2.);
223 cachedTrajectory_.setMaxDetectorRadius(HOmaxR);
224 cachedTrajectory_.setMaxDetectorLength(HOmaxZ*2.);
230 LogTrace(
"TrackAssociator") <<
"Using outerState as trackOrigin at Rho=" << outerState->
position().
perp()
231 <<
" Z=" << outerState->
position().
z() <<
"\n";
234 else if(innerState) {
235 LogTrace(
"TrackAssociator") <<
"Using innerState as trackOrigin at Rho=" << innerState->
position().
perp()
236 <<
" Z=" << innerState->
position().
z() <<
"\n";
241 if ( ! cachedTrajectory_.propagateAll(trackOrigin) )
return info;
244 cachedTrajectory_.findEcalTrajectory( ecalDetIdAssociator_->volume() );
245 cachedTrajectory_.findHcalTrajectory( hcalDetIdAssociator_->volume() );
246 cachedTrajectory_.findHOTrajectory( hoDetIdAssociator_->volume() );
247 cachedTrajectory_.findPreshowerTrajectory( preshowerDetIdAssociator_->volume() );
249 info.
trkGlobPosAtEcal = getPoint( cachedTrajectory_.getStateAtEcal().position() );
250 info.
trkGlobPosAtHcal = getPoint( cachedTrajectory_.getStateAtHcal().position() );
251 info.
trkGlobPosAtHO = getPoint( cachedTrajectory_.getStateAtHO().position() );
253 info.
trkMomAtEcal = cachedTrajectory_.getStateAtEcal().momentum();
254 info.
trkMomAtHcal = cachedTrajectory_.getStateAtHcal().momentum();
255 info.
trkMomAtHO = cachedTrajectory_.getStateAtHO().momentum();
259 if (parameters.
useEcal) fillEcal( iEvent, info, parameters);
261 if (parameters.
useHcal) fillHcal( iEvent, info, parameters);
262 if (parameters.
useHO) fillHO( iEvent, info, parameters);
263 if (parameters.
usePreshower) fillPreshower( iEvent, info, parameters);
264 if (parameters.
useMuon) fillMuon( iEvent, info, parameters);
265 if (parameters.
truthMatch) fillCaloTruth( iEvent, info, parameters);
277 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getEcalTrajectory();
279 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
280 itr != trajectoryStates.end(); itr++)
281 LogTrace(
"TrackAssociator") <<
"ECAL trajectory point (rho, z, phi): " << itr->position().perp() <<
282 ", " << itr->position().z() <<
", " << itr->position().phi();
284 std::vector<GlobalPoint> coreTrajectory;
285 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
286 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
288 if(coreTrajectory.empty()) {
289 LogTrace(
"TrackAssociator") <<
"ECAL track trajectory is empty; moving on\n";
299 if (!EBRecHits.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find EBRecHitCollection in the event!\n";
304 if (!EERecHits.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find EERecHitCollection in event!\n";
308 std::set<DetId> ecalIdsInRegion;
313 ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0],mapRange);
314 }
else ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dREcalPreselection);
316 LogTrace(
"TrackAssociator") <<
"ECAL hits in the region: " << ecalIdsInRegion.size();
318 ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsInACone(ecalIdsInRegion, coreTrajectory, parameters.
dREcal);
319 LogTrace(
"TrackAssociator") <<
"ECAL hits in the cone: " << ecalIdsInRegion.size();
320 std::vector<DetId> crossedEcalIds =
321 ecalDetIdAssociator_->getCrossedDetIds(ecalIdsInRegion, coreTrajectory);
322 LogTrace(
"TrackAssociator") <<
"ECAL crossed hits " << crossedEcalIds.size();
328 for(std::vector<DetId>::const_iterator itr=crossedEcalIds.begin(); itr!=crossedEcalIds.end();itr++)
330 std::vector<EcalRecHit>::const_iterator ebHit = (*EBRecHits).find(*itr);
331 std::vector<EcalRecHit>::const_iterator eeHit = (*EERecHits).find(*itr);
332 if(ebHit != (*EBRecHits).end())
334 else if(eeHit != (*EERecHits).end())
337 LogTrace(
"TrackAssociator") <<
"Crossed EcalRecHit is not found for DetId: " << itr->rawId();
340 for(std::set<DetId>::const_iterator itr=ecalIdsInRegion.begin(); itr!=ecalIdsInRegion.end();itr++)
342 std::vector<EcalRecHit>::const_iterator ebHit = (*EBRecHits).find(*itr);
343 std::vector<EcalRecHit>::const_iterator eeHit = (*EERecHits).find(*itr);
344 if(ebHit != (*EBRecHits).end())
346 else if(eeHit != (*EERecHits).end())
349 LogTrace(
"TrackAssociator") <<
"EcalRecHit from the cone is not found for DetId: " << itr->rawId();
361 std::vector<GlobalPoint> trajectory;
362 const std::vector<SteppingHelixStateInfo>& ecalTrajectoryStates = cachedTrajectory_.getEcalTrajectory();
363 const std::vector<SteppingHelixStateInfo>& hcalTrajectoryStates = cachedTrajectory_.getHcalTrajectory();
364 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = ecalTrajectoryStates.begin();
365 itr != ecalTrajectoryStates.end(); itr++) trajectory.push_back(itr->position());
366 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = hcalTrajectoryStates.begin();
367 itr != hcalTrajectoryStates.end(); itr++) trajectory.push_back(itr->position());
369 if(trajectory.empty()) {
370 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";
473 if ( ! collection.
isValid() )
throw cms::Exception(
"FatalError") <<
"Unable to find HBHERecHits in event!\n";
476 std::set<DetId> idsInRegion;
481 idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
482 }
else idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dRHcalPreselection);
484 LogTrace(
"TrackAssociator") <<
"HCAL hits in the region: " << idsInRegion.size() <<
"\n" <<
DetIdInfo::info(idsInRegion);
485 std::set<DetId> idsInACone = hcalDetIdAssociator_->getDetIdsInACone(idsInRegion, coreTrajectory, parameters.
dRHcal);
486 LogTrace(
"TrackAssociator") <<
"HCAL hits in the cone: " << idsInACone.size() <<
"\n" <<
DetIdInfo::info(idsInACone);
487 std::vector<DetId> crossedIds =
488 hcalDetIdAssociator_->getCrossedDetIds(idsInRegion, coreTrajectory);
489 LogTrace(
"TrackAssociator") <<
"HCAL hits crossed: " << crossedIds.size() <<
"\n" <<
DetIdInfo::info(crossedIds);
495 for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
498 if( hit != (*collection).end() )
501 LogTrace(
"TrackAssociator") <<
"Crossed HBHERecHit is not found for DetId: " << itr->rawId();
504 for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
507 if( hit != (*collection).end() )
510 LogTrace(
"TrackAssociator") <<
"HBHERecHit from the cone is not found for DetId: " << itr->rawId();
521 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHOTrajectory();
523 std::vector<GlobalPoint> coreTrajectory;
524 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
525 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
527 if(coreTrajectory.empty()) {
528 LogTrace(
"TrackAssociator") <<
"HO trajectory is empty; moving on\n";
539 if ( ! collection.
isValid() )
throw cms::Exception(
"FatalError") <<
"Unable to find HORecHits in event!\n";
542 std::set<DetId> idsInRegion;
547 idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
548 }
else idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dRHcalPreselection);
550 LogTrace(
"TrackAssociator") <<
"idsInRegion.size(): " << idsInRegion.size();
551 std::set<DetId> idsInACone = hoDetIdAssociator_->getDetIdsInACone(idsInRegion, coreTrajectory, parameters.
dRHcal);
552 LogTrace(
"TrackAssociator") <<
"idsInACone.size(): " << idsInACone.size();
553 std::vector<DetId> crossedIds =
554 hoDetIdAssociator_->getCrossedDetIds(idsInRegion, coreTrajectory);
560 for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
563 if( hit != (*collection).end() )
566 LogTrace(
"TrackAssociator") <<
"Crossed HORecHit is not found for DetId: " << itr->rawId();
570 for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
573 if( hit != (*collection).end() )
576 LogTrace(
"TrackAssociator") <<
"HORecHit from the cone is not found for DetId: " << itr->rawId();
588 if (
abs(track.
type( )) == 211 ||
591 charge = track.
type( )< 0 ? -1 : 1;
592 return getFreeTrajectoryState(iSetup, vector,
point, charge);
605 CLHEP::HepSymMatrix covT(6,1); covT *= 1
e-6;
627 CLHEP::HepSymMatrix covT(6,1); covT *= 1
e-6;
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"<<
700 detId->rawId() <<
" not crossed\n";
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());
754 LogTrace(
"TrackAssociator") <<
"found a match, DetId: " << detId->rawId();
756 match.
tState = stateOnSurface;
760 matches.push_back(match);
780 throw cms::Exception(
"FatalError") <<
"Unable to find DTRecSegment4DCollection in event!\n";
785 throw cms::Exception(
"FatalError") <<
"Unable to find CSCSegmentCollection in event!\n";
800 std::vector<TAMuonChamberMatch> matchedChambers;
801 LogTrace(
"TrackAssociator") <<
"Trying to Get ChamberMatches" << std::endl;
802 getTAMuonChamberMatches(matchedChambers, parameters);
803 LogTrace(
"TrackAssociator") <<
"Chambers matched: " << matchedChambers.size() <<
"\n";
808 for(std::vector<TAMuonChamberMatch>::iterator matchedChamber = matchedChambers.begin();
809 matchedChamber != matchedChambers.end(); matchedChamber++)
811 const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet((*matchedChamber).id);
813 if(
const DTChamber* chamber = dynamic_cast<const DTChamber*>(geomDet) ) {
818 if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
819 matchedChamber->segments.back().dtSegmentRef =
DTRecSegment4DRef(dtSegments, segment - dtSegments->begin());
824 if(
const CSCChamber* chamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
829 if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
830 matchedChamber->segments.back().cscSegmentRef =
CSCSegmentRef(cscSegments, segment - cscSegments->begin());
834 throw cms::Exception(
"FatalError") <<
"Failed to cast GeomDet object to either DTChamber or CSCChamber. Who is this guy anyway?\n";
837 info.
chambers.push_back(*matchedChamber);
847 <<
"Segment local position: " << segment->
localPosition() <<
"\n"
850 const GeomDet* chamber = muonDetIdAssociator_->getGeomDet(matchedChamber.
id);
855 <<
"Segment global position: " << segmentGlobalPosition <<
" \t (R_xy,eta,phi): "
856 << segmentGlobalPosition.
perp() <<
"," << segmentGlobalPosition.
eta() <<
"," << segmentGlobalPosition.
phi() <<
"\n";
859 <<
"\teta hit: " << segmentGlobalPosition.
eta() <<
" \tpropagator: " << trajectoryStateOnSurface.
freeState()->
position().
eta() <<
"\n"
860 <<
"\tphi hit: " << segmentGlobalPosition.
phi() <<
" \tpropagator: " << trajectoryStateOnSurface.
freeState()->
position().
phi() << std::endl;
863 bool isDTWithoutY =
false;
865 if ( dtseg && (! dtseg->
hasZed()) )
869 if(deltaPhi>
M_PI) deltaPhi = fabs(deltaPhi-
M_PI*2.);
873 isGood = deltaPhi < parameters.
dRMuon;
877 deltaPhi*deltaPhi) < parameters.
dRMuon;
896 muonSegment.
hasZed =
true;
897 muonSegment.
hasPhi =
true;
902 if ( (dtseg->
hasPhi()) && (! isDTWithoutY) ) {
911 LogTrace(
"TrackAssociator") <<
" Phi t0: " << dtseg->
phiSegment()->
t0() <<
" hits: " << phiHits;
919 if (hits) muonSegment.
t0 = t0/hits;
923 if (isDTWithoutY) muonSegment.
hasZed =
false;
927 matchedChamber.
segments.push_back(muonSegment);
943 if (! simTracks.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated tracks found\n";
947 if (! simVertices.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated vertices found\n";
951 iEvent.
getByLabel(
"g4SimHits",
"EcalHitsEB",simEcalHitsEB);
952 if (! simEcalHitsEB.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated ECAL EB hits found\n";
955 iEvent.
getByLabel(
"g4SimHits",
"EcalHitsEE",simEcalHitsEE);
956 if (! simEcalHitsEE.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated ECAL EE hits found\n";
959 iEvent.
getByLabel(
"g4SimHits",
"HcalHits",simHcalHits);
960 if (! simHcalHits.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated HCAL hits found\n";
963 SimTrackContainer::const_iterator simTrack = simTracks->begin();
964 for( ; simTrack != simTracks->end(); ++simTrack){
965 math::XYZVector simP3( simTrack->momentum().x(), simTrack->momentum().y(), simTrack->momentum().z() );
967 if ( ROOT::Math::VectorUtil::DeltaR(recoP3, simP3) < 0.1 )
break;
969 if ( simTrack != simTracks->end() ) {
971 double ecalTrueEnergy(0);
972 double hcalTrueEnergy(0);
975 for( PCaloHitContainer::const_iterator
hit = simEcalHitsEB->begin();
hit != simEcalHitsEB->end(); ++
hit )
978 for( PCaloHitContainer::const_iterator
hit = simEcalHitsEE->begin();
hit != simEcalHitsEE->end(); ++
hit )
981 for( PCaloHitContainer::const_iterator
hit = simHcalHits->begin();
hit != simHcalHits->end(); ++
hit )
1001 double currentStepSize = cachedTrajectory_.getPropagationStep();
1007 if ( direction != InsideOut )
1009 "No TrackExtra information is available and association is done with something else than InsideOut track.\n" <<
1010 "Either change the parameter or provide needed data!\n";
1011 LogTrace(
"TrackAssociator") <<
"Track Extras not found\n";
1013 return associate(iEvent, iSetup, parameters, &initialState);
1016 LogTrace(
"TrackAssociator") <<
"Track Extras found\n";
1021 LogTrace(
"TrackAssociator") <<
"inner track state (rho, z, phi):" <<
1024 LogTrace(
"TrackAssociator") <<
"innerFreeState (rho, z, phi):" <<
1028 LogTrace(
"TrackAssociator") <<
"outer track state (rho, z, phi):" <<
1031 LogTrace(
"TrackAssociator") <<
"outerFreeState (rho, z, phi):" <<
1036 if ( crossedIP( track ) ) {
1037 switch ( direction ) {
1040 return associate(iEvent, iSetup, parameters, &referenceState, &outerState);
1044 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1046 cachedTrajectory_.setPropagationStep( currentStepSize );
1052 switch ( direction ) {
1054 return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1058 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1060 cachedTrajectory_.setPropagationStep( currentStepSize );
1070 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1073 result = associate(iEvent, iSetup, parameters, &innerState, &outerState);
1075 result = associate(iEvent, iSetup, parameters, &outerState, &innerState);
1076 cachedTrajectory_.setPropagationStep( currentStepSize );
1084 return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1093 return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, track, vertex), parameters);
1103 return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, momentum, vertex, charge), parameters);
1108 bool crossed =
true;
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
math::XYZPoint segmentGlobalPosition
edm::InputTag theHBHERecHitCollectionLabel
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.
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
bool getByType(Handle< PROD > &result) const
edm::InputTag theHORecHitCollectionLabel
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
math::XYZVector segmentLocalDirection
LocalError positionError() const
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 &)
C::const_iterator const_iterator
constant access iterator type
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)
FreeTrajectoryState * freeState(bool withErrors=true) const
void applyRadX0Correction(bool applyRadX0Correction)
GlobalPoint position() const
LocalPoint toLocal(const GlobalPoint &gp) 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
std::vector< DetId > crossedHOIds
double dRPreshowerPreselection
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
float yOfWire(float wire, float x=0.) const
void fillPreshower(const edm::Event &iEvent, TrackDetMatchInfo &info, const AssociatorParameters &)
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
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?
edm::InputTag theDTRecSegment4DCollectionLabel
GlobalPoint position() const
const Bounds & bounds() const
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
double wideWidthOfPlane() const
double hcalTrueEnergyCorrected
GlobalVector trkMomAtEcal
XYZVectorD XYZVector
spatial vector with cartesian internal representation
virtual LocalError localPositionError() const =0
~TrackDetectorAssociator()
edm::InputTag theEERecHitCollectionLabel
std::vector< SimVertex > SimVertexContainer
void fillMuon(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
void init(const edm::EventSetup &)
edm::InputTag theCSCSegmentCollectionLabel
const CSCLayerGeometry *const oddLayerGeometry(int iendcap) const
Accessors for LayerGeometry's.
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 &)
edm::InputTag theCaloTowerCollectionLabel
const math::XYZTLorentzVectorD & momentum() const
particle info...
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.
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
edm::InputTag theEBRecHitCollectionLabel
Labels of the detector EDProducts.
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.
void fillHO(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
std::vector< SimTrack > SimTrackContainer
virtual const BoundPlane & surface() const
The nominal surface of the GeomDet.
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