72 #include "Math/VectorUtil.h"
103 useDefaultPropagator_ =
false;
108 if (defProp_)
delete defProp_;
114 cachedTrajectory_.setPropagator(ivProp_);
119 useDefaultPropagator_ =
true;
127 if (!theCaloGeometry_.isValid())
128 throw cms::Exception(
"FatalError") <<
"Unable to find CaloGeometryRecord in event!\n";
132 if (!theTrackingGeometry_.isValid())
133 throw cms::Exception(
"FatalError") <<
"Unable to find GlobalTrackingGeometryRecord in event!\n";
135 if (useDefaultPropagator_ && (! defProp_ || theMagneticFeildWatcher_.check(iSetup) ) ) {
145 setPropagator(defProp_);
161 return associate(iEvent,iSetup,parameters,&fts);
174 "Configuration error! No subdetector was selected for the track association.";
178 cachedTrajectory_.setStateAtIP(trackOrigin);
192 cachedTrajectory_.reset_trajectory();
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.);
210 maxR = muonDetIdAssociator_->volume().maxR();
211 maxZ = muonDetIdAssociator_->volume().maxZ();
212 cachedTrajectory_.setMaxDetectorRadius(maxR);
213 cachedTrajectory_.setMaxDetectorLength(maxZ*2.);
218 cachedTrajectory_.setMaxDetectorRadius(HOmaxR);
219 cachedTrajectory_.setMaxDetectorLength(HOmaxZ*2.);
225 LogTrace(
"TrackAssociator") <<
"Using outerState as trackOrigin at Rho=" << outerState->
position().
perp()
226 <<
" Z=" << outerState->
position().
z() <<
"\n";
229 else if(innerState) {
230 LogTrace(
"TrackAssociator") <<
"Using innerState as trackOrigin at Rho=" << innerState->
position().
perp()
231 <<
" Z=" << innerState->
position().
z() <<
"\n";
236 if ( ! cachedTrajectory_.propagateAll(trackOrigin) )
return info;
239 cachedTrajectory_.findEcalTrajectory( ecalDetIdAssociator_->volume() );
240 cachedTrajectory_.findHcalTrajectory( hcalDetIdAssociator_->volume() );
241 cachedTrajectory_.findHOTrajectory( hoDetIdAssociator_->volume() );
242 cachedTrajectory_.findPreshowerTrajectory( preshowerDetIdAssociator_->volume() );
244 info.
trkGlobPosAtEcal = getPoint( cachedTrajectory_.getStateAtEcal().position() );
245 info.
trkGlobPosAtHcal = getPoint( cachedTrajectory_.getStateAtHcal().position() );
246 info.
trkGlobPosAtHO = getPoint( cachedTrajectory_.getStateAtHO().position() );
248 info.
trkMomAtEcal = cachedTrajectory_.getStateAtEcal().momentum();
249 info.
trkMomAtHcal = cachedTrajectory_.getStateAtHcal().momentum();
250 info.
trkMomAtHO = cachedTrajectory_.getStateAtHO().momentum();
252 if (parameters.
useEcal) fillEcal( iEvent, info, parameters);
253 if (parameters.
useCalo) fillCaloTowers( iEvent, info, parameters);
254 if (parameters.
useHcal) fillHcal( iEvent, info, parameters);
255 if (parameters.
useHO) fillHO( iEvent, info, parameters);
256 if (parameters.
usePreshower) fillPreshower( iEvent, info, parameters);
257 if (parameters.
useMuon) fillMuon( iEvent, info, parameters);
258 if (parameters.
truthMatch) fillCaloTruth( iEvent, info, parameters);
267 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getEcalTrajectory();
269 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
270 itr != trajectoryStates.end(); itr++)
271 LogTrace(
"TrackAssociator") <<
"ECAL trajectory point (rho, z, phi): " << itr->position().perp() <<
272 ", " << itr->position().z() <<
", " << itr->position().phi();
274 std::vector<GlobalPoint> coreTrajectory;
275 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
276 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
278 if(coreTrajectory.empty()) {
279 LogTrace(
"TrackAssociator") <<
"ECAL track trajectory is empty; moving on\n";
288 if (!EBRecHits.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find EBRecHitCollection in the event!\n";
292 if (!EERecHits.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find EERecHitCollection in event!\n";
294 std::set<DetId> ecalIdsInRegion;
299 ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0],mapRange);
300 }
else ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dREcalPreselection);
301 LogTrace(
"TrackAssociator") <<
"ECAL hits in the region: " << ecalIdsInRegion.size();
303 ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsInACone(ecalIdsInRegion, coreTrajectory, parameters.
dREcal);
304 LogTrace(
"TrackAssociator") <<
"ECAL hits in the cone: " << ecalIdsInRegion.size();
305 std::vector<DetId> crossedEcalIds =
306 ecalDetIdAssociator_->getCrossedDetIds(ecalIdsInRegion, coreTrajectory);
307 LogTrace(
"TrackAssociator") <<
"ECAL crossed hits " << crossedEcalIds.size();
312 for(std::vector<DetId>::const_iterator itr=crossedEcalIds.begin(); itr!=crossedEcalIds.end();itr++)
314 std::vector<EcalRecHit>::const_iterator ebHit = (*EBRecHits).find(*itr);
315 std::vector<EcalRecHit>::const_iterator eeHit = (*EERecHits).find(*itr);
316 if(ebHit != (*EBRecHits).end())
318 else if(eeHit != (*EERecHits).end())
321 LogTrace(
"TrackAssociator") <<
"Crossed EcalRecHit is not found for DetId: " << itr->rawId();
323 for(std::set<DetId>::const_iterator itr=ecalIdsInRegion.begin(); itr!=ecalIdsInRegion.end();itr++)
325 std::vector<EcalRecHit>::const_iterator ebHit = (*EBRecHits).find(*itr);
326 std::vector<EcalRecHit>::const_iterator eeHit = (*EERecHits).find(*itr);
327 if(ebHit != (*EBRecHits).end())
329 else if(eeHit != (*EERecHits).end())
332 LogTrace(
"TrackAssociator") <<
"EcalRecHit from the cone is not found for DetId: " << itr->rawId();
341 std::vector<GlobalPoint> trajectory;
342 const std::vector<SteppingHelixStateInfo>& ecalTrajectoryStates = cachedTrajectory_.getEcalTrajectory();
343 const std::vector<SteppingHelixStateInfo>& hcalTrajectoryStates = cachedTrajectory_.getHcalTrajectory();
344 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = ecalTrajectoryStates.begin();
345 itr != ecalTrajectoryStates.end(); itr++) trajectory.push_back(itr->position());
346 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = hcalTrajectoryStates.begin();
347 itr != hcalTrajectoryStates.end(); itr++) trajectory.push_back(itr->position());
349 if(trajectory.empty()) {
350 LogTrace(
"TrackAssociator") <<
"HCAL trajectory is empty; moving on\n";
359 if (!caloTowers.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find CaloTowers in event!\n";
361 std::set<DetId> caloTowerIdsInRegion;
366 caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0],mapRange);
367 }
else caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0], parameters.
dRHcalPreselection);
369 LogTrace(
"TrackAssociator") <<
"Towers in the region: " << caloTowerIdsInRegion.size();
370 std::set<DetId> caloTowerIdsInACone = caloDetIdAssociator_->getDetIdsInACone(caloTowerIdsInRegion, trajectory, parameters.
dRHcal);
371 LogTrace(
"TrackAssociator") <<
"Towers in the cone: " << caloTowerIdsInACone.size();
372 std::vector<DetId> crossedCaloTowerIds = caloDetIdAssociator_->getCrossedDetIds(caloTowerIdsInRegion, trajectory);
373 LogTrace(
"TrackAssociator") <<
"Towers crossed: " << crossedCaloTowerIds.size();
378 for(std::vector<DetId>::const_iterator itr=crossedCaloTowerIds.begin(); itr!=crossedCaloTowerIds.end();itr++)
381 if(tower != (*caloTowers).end())
384 LogTrace(
"TrackAssociator") <<
"Crossed CaloTower is not found for DetId: " << (*itr).rawId();
387 for(std::set<DetId>::const_iterator itr=caloTowerIdsInACone.begin(); itr!=caloTowerIdsInACone.end();itr++)
390 if(tower != (*caloTowers).end())
391 info.
towers.push_back(&*tower);
393 LogTrace(
"TrackAssociator") <<
"CaloTower from the cone is not found for DetId: " << (*itr).rawId();
402 std::vector<GlobalPoint> trajectory;
403 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getPreshowerTrajectory();
404 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
405 itr != trajectoryStates.end(); itr++) trajectory.push_back(itr->position());
407 if(trajectory.empty()) {
408 LogTrace(
"TrackAssociator") <<
"Preshower trajectory is empty; moving on\n";
412 std::set<DetId> idsInRegion =
413 preshowerDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0],
416 LogTrace(
"TrackAssociator") <<
"Number of Preshower Ids in the region: " << idsInRegion.size();
417 std::vector<DetId> crossedIds = preshowerDetIdAssociator_->getCrossedDetIds(idsInRegion, trajectory);
418 LogTrace(
"TrackAssociator") <<
"Number of Preshower Ids in crossed: " << crossedIds.size();
427 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHcalTrajectory();
429 std::vector<GlobalPoint> coreTrajectory;
430 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
431 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
433 if(coreTrajectory.empty()) {
434 LogTrace(
"TrackAssociator") <<
"HCAL trajectory is empty; moving on\n";
443 if ( ! collection.
isValid() )
throw cms::Exception(
"FatalError") <<
"Unable to find HBHERecHits in event!\n";
445 std::set<DetId> idsInRegion;
450 idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
451 }
else idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dRHcalPreselection);
453 LogTrace(
"TrackAssociator") <<
"HCAL hits in the region: " << idsInRegion.size() <<
"\n" <<
DetIdInfo::info(idsInRegion);
454 std::set<DetId> idsInACone = hcalDetIdAssociator_->getDetIdsInACone(idsInRegion, coreTrajectory, parameters.
dRHcal);
455 LogTrace(
"TrackAssociator") <<
"HCAL hits in the cone: " << idsInACone.size() <<
"\n" <<
DetIdInfo::info(idsInACone);
456 std::vector<DetId> crossedIds =
457 hcalDetIdAssociator_->getCrossedDetIds(idsInRegion, coreTrajectory);
458 LogTrace(
"TrackAssociator") <<
"HCAL hits crossed: " << crossedIds.size() <<
"\n" <<
DetIdInfo::info(crossedIds);
462 for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
465 if( hit != (*collection).end() )
468 LogTrace(
"TrackAssociator") <<
"Crossed HBHERecHit is not found for DetId: " << itr->rawId();
470 for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
473 if( hit != (*collection).end() )
476 LogTrace(
"TrackAssociator") <<
"HBHERecHit from the cone is not found for DetId: " << itr->rawId();
484 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHOTrajectory();
486 std::vector<GlobalPoint> coreTrajectory;
487 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
488 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
490 if(coreTrajectory.empty()) {
491 LogTrace(
"TrackAssociator") <<
"HO trajectory is empty; moving on\n";
500 if ( ! collection.
isValid() )
throw cms::Exception(
"FatalError") <<
"Unable to find HORecHits in event!\n";
502 std::set<DetId> idsInRegion;
507 idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
508 }
else idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dRHcalPreselection);
510 LogTrace(
"TrackAssociator") <<
"idsInRegion.size(): " << idsInRegion.size();
511 std::set<DetId> idsInACone = hoDetIdAssociator_->getDetIdsInACone(idsInRegion, coreTrajectory, parameters.
dRHcal);
512 LogTrace(
"TrackAssociator") <<
"idsInACone.size(): " << idsInACone.size();
513 std::vector<DetId> crossedIds =
514 hoDetIdAssociator_->getCrossedDetIds(idsInRegion, coreTrajectory);
519 for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
522 if( hit != (*collection).end() )
525 LogTrace(
"TrackAssociator") <<
"Crossed HORecHit is not found for DetId: " << itr->rawId();
528 for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
531 if( hit != (*collection).end() )
534 LogTrace(
"TrackAssociator") <<
"HORecHit from the cone is not found for DetId: " << itr->rawId();
545 int charge = track.
type( )> 0 ? -1 : 1;
546 if (
abs(track.
type( )) == 211 ||
549 charge = track.
type( )< 0 ? -1 : 1;
550 return getFreeTrajectoryState(iSetup, vector,
point, charge);
563 ROOT::Math::SMatrixIdentity id;
586 ROOT::Math::SMatrixIdentity id;
601 if ( delta.first > 0 )
605 if ( delta.second > 0 )
608 mapRange.
dPhiMinus += fabs(delta.second);
609 LogTrace(
"TrackAssociator") <<
"Selection range: (dThetaPlus, dThetaMinus, dPhiPlus, dPhiMinus, dRPreselection): " <<
628 if(! trajectoryPoint.
isValid() ) trajectoryPoint = cachedTrajectory_.getOuterState();
629 if(! trajectoryPoint.
isValid() ) {
631 "trajectory position at HCAL is not valid. Assume the track cannot reach muon detectors and skip it";
636 LogTrace(
"TrackAssociator") <<
"muon direction: " << direction <<
"\n\t and corresponding point: " <<
644 std::set<DetId> muonIdsInRegion =
645 muonDetIdAssociator_->getDetIdsCloseToAPoint(trajectoryPoint.
position(), mapRange);
646 LogTrace(
"TrackAssociator") <<
"Number of chambers to check: " << muonIdsInRegion.size();
647 for(std::set<DetId>::const_iterator detId = muonIdsInRegion.begin(); detId != muonIdsInRegion.end(); detId++)
649 const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet(*detId);
651 if (! stateOnSurface.
isValid()) {
652 LogTrace(
"TrackAssociator") <<
"Failed to propagate the track; moving on\n\t"<<
662 if(
const CSCChamber* cscChamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
665 LogTrace(
"TrackAssociator") <<
"Failed to get CSCChamberSpecs from CSCChamber; moving on\n";
669 if(! layerGeometry) {
670 LogTrace(
"TrackAssociator") <<
"Failed to get CSCLayerGeometry from CSCChamberSpecs; moving on\n";
675 LogTrace(
"TrackAssociator") <<
"Failed to get CSCWireTopology from CSCLayerGeometry; moving on\n";
683 float yOfFirstWire = fabs(wireTopology->
wireAngle())>1.E-06 ? -0.5*length : wireTopology->
yOfWire(1);
685 float yCOWPOffset = yOfFirstWire+0.5*length;
688 float tangent = (wideWidth-narrowWidth)/(2.*length);
690 float yPrime = localPoint.
y()+fabs(yOfFirstWire);
692 float halfWidthAtYPrime = 0.5*narrowWidth+yPrime*tangent;
693 distanceX = fabs(localPoint.
x()) - halfWidthAtYPrime;
694 distanceY = fabs(localPoint.
y()-yCOWPOffset) - 0.5*length;
695 sigmaX = distanceX/
sqrt(localError.
xx());
696 sigmaY = distanceY/
sqrt(localError.
yy());
700 sigmaX = distanceX/
sqrt(localError.
xx());
701 sigmaY = distanceY/
sqrt(localError.
yy());
707 match.
tState = stateOnSurface;
711 matches.push_back(match);
713 LogTrace(
"TrackAssociator") <<
"chamber is too far: " <<
714 DetIdInfo::info(*detId) <<
"\n\tdistanceX: " << distanceX <<
"\t distanceY: " << distanceY <<
715 "\t sigmaX: " << sigmaX <<
"\t sigmaY: " << sigmaY <<
"\n";
729 throw cms::Exception(
"FatalError") <<
"Unable to find DTRecSegment4DCollection in event!\n";
734 throw cms::Exception(
"FatalError") <<
"Unable to find CSCSegmentCollection in event!\n";
747 std::vector<TAMuonChamberMatch> matchedChambers;
748 LogTrace(
"TrackAssociator") <<
"Trying to Get ChamberMatches" << std::endl;
749 getTAMuonChamberMatches(matchedChambers, parameters);
750 LogTrace(
"TrackAssociator") <<
"Chambers matched: " << matchedChambers.size() <<
"\n";
754 for(std::vector<TAMuonChamberMatch>::iterator matchedChamber = matchedChambers.begin();
755 matchedChamber != matchedChambers.end(); matchedChamber++)
757 const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet((*matchedChamber).id);
759 if(
const DTChamber* chamber = dynamic_cast<const DTChamber*>(geomDet) ) {
764 if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
765 matchedChamber->segments.back().dtSegmentRef =
DTRecSegment4DRef(dtSegments, segment - dtSegments->begin());
770 if(
const CSCChamber* chamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
775 if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
776 matchedChamber->segments.back().cscSegmentRef =
CSCSegmentRef(cscSegments, segment - cscSegments->begin());
783 info.
chambers.push_back(*matchedChamber);
793 <<
"Segment local position: " << segment->
localPosition() <<
"\n"
796 const GeomDet* chamber = muonDetIdAssociator_->getGeomDet(matchedChamber.
id);
801 <<
"Segment global position: " << segmentGlobalPosition <<
" \t (R_xy,eta,phi): "
802 << segmentGlobalPosition.
perp() <<
"," << segmentGlobalPosition.
eta() <<
"," << segmentGlobalPosition.
phi() <<
"\n";
805 <<
"\teta hit: " << segmentGlobalPosition.
eta() <<
" \tpropagator: " << trajectoryStateOnSurface.
freeState()->
position().
eta() <<
"\n"
806 <<
"\tphi hit: " << segmentGlobalPosition.
phi() <<
" \tpropagator: " << trajectoryStateOnSurface.
freeState()->
position().
phi() << std::endl;
809 bool isDTWithoutY =
false;
811 if ( dtseg && (! dtseg->
hasZed()) )
815 if(deltaPhi>
M_PI) deltaPhi = fabs(deltaPhi-
M_PI*2.);
819 isGood = deltaPhi < parameters.
dRMuon;
823 deltaPhi*deltaPhi) < parameters.
dRMuon;
842 muonSegment.
hasZed =
true;
843 muonSegment.
hasPhi =
true;
848 if ( (dtseg->
hasPhi()) && (! isDTWithoutY) ) {
857 LogTrace(
"TrackAssociator") <<
" Phi t0: " << dtseg->
phiSegment()->
t0() <<
" hits: " << phiHits;
865 if (hits) muonSegment.
t0 = t0/hits;
869 if (isDTWithoutY) muonSegment.
hasZed =
false;
873 matchedChamber.
segments.push_back(muonSegment);
889 if (! simTracks.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated tracks found\n";
893 if (! simVertices.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated vertices found\n";
898 if (! simEcalHitsEB.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated ECAL EB hits found\n";
902 if (! simEcalHitsEE.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated ECAL EE hits found\n";
906 if (! simHcalHits.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated HCAL hits found\n";
909 SimTrackContainer::const_iterator simTrack = simTracks->begin();
910 for( ; simTrack != simTracks->end(); ++simTrack){
911 math::XYZVector simP3( simTrack->momentum().x(), simTrack->momentum().y(), simTrack->momentum().z() );
913 if ( ROOT::Math::VectorUtil::DeltaR(recoP3, simP3) < 0.1 )
break;
915 if ( simTrack != simTracks->end() ) {
917 double ecalTrueEnergy(0);
918 double hcalTrueEnergy(0);
921 for( PCaloHitContainer::const_iterator
hit = simEcalHitsEB->begin();
hit != simEcalHitsEB->end(); ++
hit )
924 for( PCaloHitContainer::const_iterator
hit = simEcalHitsEE->begin();
hit != simEcalHitsEE->end(); ++
hit )
927 for( PCaloHitContainer::const_iterator
hit = simHcalHits->begin();
hit != simHcalHits->end(); ++
hit )
947 double currentStepSize = cachedTrajectory_.getPropagationStep();
953 if ( direction != InsideOut )
955 "No TrackExtra information is available and association is done with something else than InsideOut track.\n" <<
956 "Either change the parameter or provide needed data!\n";
957 LogTrace(
"TrackAssociator") <<
"Track Extras not found\n";
959 return associate(iEvent, iSetup, parameters, &initialState);
962 LogTrace(
"TrackAssociator") <<
"Track Extras found\n";
967 LogTrace(
"TrackAssociator") <<
"inner track state (rho, z, phi):" <<
970 LogTrace(
"TrackAssociator") <<
"innerFreeState (rho, z, phi):" <<
974 LogTrace(
"TrackAssociator") <<
"outer track state (rho, z, phi):" <<
977 LogTrace(
"TrackAssociator") <<
"outerFreeState (rho, z, phi):" <<
982 if ( crossedIP( track ) ) {
983 switch ( direction ) {
986 return associate(iEvent, iSetup, parameters, &referenceState, &outerState);
990 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
992 cachedTrajectory_.setPropagationStep( currentStepSize );
998 switch ( direction ) {
1000 return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1004 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1006 cachedTrajectory_.setPropagationStep( currentStepSize );
1016 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1019 result = associate(iEvent, iSetup, parameters, &innerState, &outerState);
1021 result = associate(iEvent, iSetup, parameters, &outerState, &innerState);
1022 cachedTrajectory_.setPropagationStep( currentStepSize );
1030 return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1039 return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, track, vertex), parameters);
1049 return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, momentum, vertex, charge), parameters);
1054 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)
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 Vector & momentum() const
track momentum vector
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
const Point & vertex() const
reference point on the track. This method is DEPRECATED, please use referencePoint() instead ...
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 &)
bool isNull() const
Checks for null.
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
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