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.);
207 double maxR = muonDetIdAssociator_->volume().maxR();
208 double maxZ = muonDetIdAssociator_->volume().maxZ();
209 cachedTrajectory_.setMaxDetectorRadius(maxR);
210 cachedTrajectory_.setMaxDetectorLength(maxZ*2.);
213 cachedTrajectory_.setMaxDetectorRadius(HOmaxR);
214 cachedTrajectory_.setMaxDetectorLength(HOmaxZ*2.);
220 LogTrace(
"TrackAssociator") <<
"Using outerState as trackOrigin at Rho=" << outerState->
position().
perp()
221 <<
" Z=" << outerState->
position().
z() <<
"\n";
224 else if(innerState) {
225 LogTrace(
"TrackAssociator") <<
"Using innerState as trackOrigin at Rho=" << innerState->
position().
perp()
226 <<
" Z=" << innerState->
position().
z() <<
"\n";
231 if ( trackOrigin.
momentum().
mag() == 0 )
return info;
233 if ( ! cachedTrajectory_.propagateAll(trackOrigin) )
return info;
236 cachedTrajectory_.findEcalTrajectory( ecalDetIdAssociator_->volume() );
237 cachedTrajectory_.findHcalTrajectory( hcalDetIdAssociator_->volume() );
238 cachedTrajectory_.findHOTrajectory( hoDetIdAssociator_->volume() );
239 cachedTrajectory_.findPreshowerTrajectory( preshowerDetIdAssociator_->volume() );
241 info.
trkGlobPosAtEcal = getPoint( cachedTrajectory_.getStateAtEcal().position() );
242 info.
trkGlobPosAtHcal = getPoint( cachedTrajectory_.getStateAtHcal().position() );
243 info.
trkGlobPosAtHO = getPoint( cachedTrajectory_.getStateAtHO().position() );
245 info.
trkMomAtEcal = cachedTrajectory_.getStateAtEcal().momentum();
246 info.
trkMomAtHcal = cachedTrajectory_.getStateAtHcal().momentum();
247 info.
trkMomAtHO = cachedTrajectory_.getStateAtHO().momentum();
249 if (parameters.
useEcal) fillEcal( 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);
264 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getEcalTrajectory();
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();
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());
275 if(coreTrajectory.empty()) {
276 LogTrace(
"TrackAssociator") <<
"ECAL track trajectory is empty; moving on\n";
285 if (!EBRecHits.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find EBRecHitCollection in the event!\n";
289 if (!EERecHits.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find EERecHitCollection in event!\n";
291 std::set<DetId> ecalIdsInRegion;
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();
300 ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsInACone(ecalIdsInRegion, coreTrajectory, parameters.
dREcal);
301 LogTrace(
"TrackAssociator") <<
"ECAL hits in the cone: " << ecalIdsInRegion.size();
302 std::vector<DetId> crossedEcalIds =
303 ecalDetIdAssociator_->getCrossedDetIds(ecalIdsInRegion, coreTrajectory);
304 LogTrace(
"TrackAssociator") <<
"ECAL crossed hits " << crossedEcalIds.size();
309 for(std::vector<DetId>::const_iterator itr=crossedEcalIds.begin(); itr!=crossedEcalIds.end();itr++)
311 std::vector<EcalRecHit>::const_iterator ebHit = (*EBRecHits).find(*itr);
312 std::vector<EcalRecHit>::const_iterator eeHit = (*EERecHits).find(*itr);
313 if(ebHit != (*EBRecHits).end())
315 else if(eeHit != (*EERecHits).end())
318 LogTrace(
"TrackAssociator") <<
"Crossed EcalRecHit is not found for DetId: " << itr->rawId();
320 for(std::set<DetId>::const_iterator itr=ecalIdsInRegion.begin(); itr!=ecalIdsInRegion.end();itr++)
322 std::vector<EcalRecHit>::const_iterator ebHit = (*EBRecHits).find(*itr);
323 std::vector<EcalRecHit>::const_iterator eeHit = (*EERecHits).find(*itr);
324 if(ebHit != (*EBRecHits).end())
326 else if(eeHit != (*EERecHits).end())
329 LogTrace(
"TrackAssociator") <<
"EcalRecHit from the cone is not found for DetId: " << itr->rawId();
338 std::vector<GlobalPoint> trajectory;
339 const std::vector<SteppingHelixStateInfo>& ecalTrajectoryStates = cachedTrajectory_.getEcalTrajectory();
340 const std::vector<SteppingHelixStateInfo>& hcalTrajectoryStates = cachedTrajectory_.getHcalTrajectory();
341 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = ecalTrajectoryStates.begin();
342 itr != ecalTrajectoryStates.end(); itr++) trajectory.push_back(itr->position());
343 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = hcalTrajectoryStates.begin();
344 itr != hcalTrajectoryStates.end(); itr++) trajectory.push_back(itr->position());
346 if(trajectory.empty()) {
347 LogTrace(
"TrackAssociator") <<
"HCAL trajectory is empty; moving on\n";
356 if (!caloTowers.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find CaloTowers in event!\n";
358 std::set<DetId> caloTowerIdsInRegion;
363 caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0],mapRange);
364 }
else caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0], parameters.
dRHcalPreselection);
366 LogTrace(
"TrackAssociator") <<
"Towers in the region: " << caloTowerIdsInRegion.size();
367 std::set<DetId> caloTowerIdsInACone = caloDetIdAssociator_->getDetIdsInACone(caloTowerIdsInRegion, trajectory, parameters.
dRHcal);
368 LogTrace(
"TrackAssociator") <<
"Towers in the cone: " << caloTowerIdsInACone.size();
369 std::vector<DetId> crossedCaloTowerIds = caloDetIdAssociator_->getCrossedDetIds(caloTowerIdsInRegion, trajectory);
370 LogTrace(
"TrackAssociator") <<
"Towers crossed: " << crossedCaloTowerIds.size();
375 for(std::vector<DetId>::const_iterator itr=crossedCaloTowerIds.begin(); itr!=crossedCaloTowerIds.end();itr++)
378 if(tower != (*caloTowers).end())
381 LogTrace(
"TrackAssociator") <<
"Crossed CaloTower is not found for DetId: " << (*itr).rawId();
384 for(std::set<DetId>::const_iterator itr=caloTowerIdsInACone.begin(); itr!=caloTowerIdsInACone.end();itr++)
387 if(tower != (*caloTowers).end())
388 info.
towers.push_back(&*tower);
390 LogTrace(
"TrackAssociator") <<
"CaloTower from the cone is not found for DetId: " << (*itr).rawId();
399 std::vector<GlobalPoint> trajectory;
400 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getPreshowerTrajectory();
401 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
402 itr != trajectoryStates.end(); itr++) trajectory.push_back(itr->position());
404 if(trajectory.empty()) {
405 LogTrace(
"TrackAssociator") <<
"Preshower trajectory is empty; moving on\n";
409 std::set<DetId> idsInRegion =
410 preshowerDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0],
413 LogTrace(
"TrackAssociator") <<
"Number of Preshower Ids in the region: " << idsInRegion.size();
414 std::vector<DetId> crossedIds = preshowerDetIdAssociator_->getCrossedDetIds(idsInRegion, trajectory);
415 LogTrace(
"TrackAssociator") <<
"Number of Preshower Ids in crossed: " << crossedIds.size();
424 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHcalTrajectory();
426 std::vector<GlobalPoint> coreTrajectory;
427 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
428 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
430 if(coreTrajectory.empty()) {
431 LogTrace(
"TrackAssociator") <<
"HCAL trajectory is empty; moving on\n";
440 if ( ! collection.
isValid() )
throw cms::Exception(
"FatalError") <<
"Unable to find HBHERecHits in event!\n";
442 std::set<DetId> idsInRegion;
447 idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
448 }
else idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dRHcalPreselection);
450 LogTrace(
"TrackAssociator") <<
"HCAL hits in the region: " << idsInRegion.size() <<
"\n" <<
DetIdInfo::info(idsInRegion,0);
451 std::set<DetId> idsInACone = hcalDetIdAssociator_->getDetIdsInACone(idsInRegion, coreTrajectory, parameters.
dRHcal);
452 LogTrace(
"TrackAssociator") <<
"HCAL hits in the cone: " << idsInACone.size() <<
"\n" <<
DetIdInfo::info(idsInACone,0);
453 std::vector<DetId> crossedIds =
454 hcalDetIdAssociator_->getCrossedDetIds(idsInRegion, coreTrajectory);
455 LogTrace(
"TrackAssociator") <<
"HCAL hits crossed: " << crossedIds.size() <<
"\n" <<
DetIdInfo::info(crossedIds,0);
459 for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
462 if( hit != (*collection).end() )
465 LogTrace(
"TrackAssociator") <<
"Crossed HBHERecHit is not found for DetId: " << itr->rawId();
467 for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
470 if( hit != (*collection).end() )
473 LogTrace(
"TrackAssociator") <<
"HBHERecHit from the cone is not found for DetId: " << itr->rawId();
481 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHOTrajectory();
483 std::vector<GlobalPoint> coreTrajectory;
484 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
485 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
487 if(coreTrajectory.empty()) {
488 LogTrace(
"TrackAssociator") <<
"HO trajectory is empty; moving on\n";
497 if ( ! collection.
isValid() )
throw cms::Exception(
"FatalError") <<
"Unable to find HORecHits in event!\n";
499 std::set<DetId> idsInRegion;
504 idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
505 }
else idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dRHcalPreselection);
507 LogTrace(
"TrackAssociator") <<
"idsInRegion.size(): " << idsInRegion.size();
508 std::set<DetId> idsInACone = hoDetIdAssociator_->getDetIdsInACone(idsInRegion, coreTrajectory, parameters.
dRHcal);
509 LogTrace(
"TrackAssociator") <<
"idsInACone.size(): " << idsInACone.size();
510 std::vector<DetId> crossedIds =
511 hoDetIdAssociator_->getCrossedDetIds(idsInRegion, coreTrajectory);
516 for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
519 if( hit != (*collection).end() )
522 LogTrace(
"TrackAssociator") <<
"Crossed HORecHit is not found for DetId: " << itr->rawId();
525 for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
528 if( hit != (*collection).end() )
531 LogTrace(
"TrackAssociator") <<
"HORecHit from the cone is not found for DetId: " << itr->rawId();
543 if (
abs(track.
type( )) == 211 ||
546 charge = track.
type( )< 0 ? -1 : 1;
547 return getFreeTrajectoryState(iSetup, vector,
point, charge);
560 ROOT::Math::SMatrixIdentity id;
583 ROOT::Math::SMatrixIdentity id;
598 if ( delta.first > 0 )
602 if ( delta.second > 0 )
605 mapRange.
dPhiMinus += fabs(delta.second);
606 LogTrace(
"TrackAssociator") <<
"Selection range: (dThetaPlus, dThetaMinus, dPhiPlus, dPhiMinus, dRPreselection): " <<
625 if(! trajectoryPoint.
isValid() ) trajectoryPoint = cachedTrajectory_.getOuterState();
626 if(! trajectoryPoint.
isValid() ) {
628 "trajectory position at HCAL is not valid. Assume the track cannot reach muon detectors and skip it";
633 LogTrace(
"TrackAssociator") <<
"muon direction: " << direction <<
"\n\t and corresponding point: " <<
641 std::set<DetId> muonIdsInRegion =
642 muonDetIdAssociator_->getDetIdsCloseToAPoint(trajectoryPoint.
position(), mapRange);
643 LogTrace(
"TrackAssociator") <<
"Number of chambers to check: " << muonIdsInRegion.size();
644 for(std::set<DetId>::const_iterator detId = muonIdsInRegion.begin(); detId != muonIdsInRegion.end(); detId++)
646 const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet(*detId);
648 if (! stateOnSurface.
isValid()) {
649 LogTrace(
"TrackAssociator") <<
"Failed to propagate the track; moving on\n\t"<<
659 if(
const CSCChamber* cscChamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
662 LogTrace(
"TrackAssociator") <<
"Failed to get CSCChamberSpecs from CSCChamber; moving on\n";
666 if(! layerGeometry) {
667 LogTrace(
"TrackAssociator") <<
"Failed to get CSCLayerGeometry from CSCChamberSpecs; moving on\n";
672 LogTrace(
"TrackAssociator") <<
"Failed to get CSCWireTopology from CSCLayerGeometry; moving on\n";
680 float yOfFirstWire = fabs(wireTopology->
wireAngle())>1.E-06 ? -0.5*length : wireTopology->
yOfWire(1);
682 float yCOWPOffset = yOfFirstWire+0.5*length;
685 float tangent = (wideWidth-narrowWidth)/(2.*length);
687 float yPrime = localPoint.
y()+fabs(yOfFirstWire);
689 float halfWidthAtYPrime = 0.5*narrowWidth+yPrime*tangent;
690 distanceX = fabs(localPoint.
x()) - halfWidthAtYPrime;
691 distanceY = fabs(localPoint.
y()-yCOWPOffset) - 0.5*length;
692 sigmaX = distanceX/
sqrt(localError.
xx());
693 sigmaY = distanceY/
sqrt(localError.
yy());
697 sigmaX = distanceX/
sqrt(localError.
xx());
698 sigmaY = distanceY/
sqrt(localError.
yy());
704 match.
tState = stateOnSurface;
708 matches.push_back(match);
710 LogTrace(
"TrackAssociator") <<
"chamber is too far: " <<
711 DetIdInfo::info(*detId,0) <<
"\n\tdistanceX: " << distanceX <<
"\t distanceY: " << distanceY <<
712 "\t sigmaX: " << sigmaX <<
"\t sigmaY: " << sigmaY <<
"\n";
726 throw cms::Exception(
"FatalError") <<
"Unable to find DTRecSegment4DCollection in event!\n";
731 throw cms::Exception(
"FatalError") <<
"Unable to find CSCSegmentCollection in event!\n";
744 std::vector<TAMuonChamberMatch> matchedChambers;
745 LogTrace(
"TrackAssociator") <<
"Trying to Get ChamberMatches" << std::endl;
746 getTAMuonChamberMatches(matchedChambers, parameters);
747 LogTrace(
"TrackAssociator") <<
"Chambers matched: " << matchedChambers.size() <<
"\n";
751 for(std::vector<TAMuonChamberMatch>::iterator matchedChamber = matchedChambers.begin();
752 matchedChamber != matchedChambers.end(); matchedChamber++)
754 const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet((*matchedChamber).id);
756 if(
const DTChamber* chamber = dynamic_cast<const DTChamber*>(geomDet) ) {
761 if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
762 matchedChamber->segments.back().dtSegmentRef =
DTRecSegment4DRef(dtSegments, segment - dtSegments->begin());
767 if(
const CSCChamber* chamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
772 if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
773 matchedChamber->segments.back().cscSegmentRef =
CSCSegmentRef(cscSegments, segment - cscSegments->begin());
780 info.
chambers.push_back(*matchedChamber);
790 <<
"Segment local position: " << segment->
localPosition() <<
"\n"
793 const GeomDet* chamber = muonDetIdAssociator_->getGeomDet(matchedChamber.
id);
798 <<
"Segment global position: " << segmentGlobalPosition <<
" \t (R_xy,eta,phi): "
799 << segmentGlobalPosition.
perp() <<
"," << segmentGlobalPosition.
eta() <<
"," << segmentGlobalPosition.
phi() <<
"\n";
802 <<
"\teta hit: " << segmentGlobalPosition.
eta() <<
" \tpropagator: " << trajectoryStateOnSurface.
freeState()->
position().
eta() <<
"\n"
803 <<
"\tphi hit: " << segmentGlobalPosition.
phi() <<
" \tpropagator: " << trajectoryStateOnSurface.
freeState()->
position().
phi() << std::endl;
806 bool isDTWithoutY =
false;
808 if ( dtseg && (! dtseg->
hasZed()) )
812 if(deltaPhi>
M_PI) deltaPhi = fabs(deltaPhi-
M_PI*2.);
816 isGood = deltaPhi < parameters.
dRMuon;
820 deltaPhi*deltaPhi) < parameters.
dRMuon;
839 muonSegment.
hasZed =
true;
840 muonSegment.
hasPhi =
true;
845 if ( (dtseg->
hasPhi()) && (! isDTWithoutY) ) {
854 LogTrace(
"TrackAssociator") <<
" Phi t0: " << dtseg->
phiSegment()->
t0() <<
" hits: " << phiHits;
862 if (hits) muonSegment.
t0 = t0/hits;
866 if (isDTWithoutY) muonSegment.
hasZed =
false;
870 matchedChamber.
segments.push_back(muonSegment);
886 if (! simTracks.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated tracks found\n";
890 if (! simVertices.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated vertices found\n";
895 if (! simEcalHitsEB.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated ECAL EB hits found\n";
899 if (! simEcalHitsEE.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated ECAL EE hits found\n";
903 if (! simHcalHits.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated HCAL hits found\n";
906 SimTrackContainer::const_iterator simTrack = simTracks->begin();
907 for( ; simTrack != simTracks->end(); ++simTrack){
908 math::XYZVector simP3( simTrack->momentum().x(), simTrack->momentum().y(), simTrack->momentum().z() );
912 if ( simTrack != simTracks->end() ) {
914 double ecalTrueEnergy(0);
915 double hcalTrueEnergy(0);
918 for( PCaloHitContainer::const_iterator
hit = simEcalHitsEB->begin();
hit != simEcalHitsEB->end(); ++
hit )
921 for( PCaloHitContainer::const_iterator
hit = simEcalHitsEE->begin();
hit != simEcalHitsEE->end(); ++
hit )
924 for( PCaloHitContainer::const_iterator
hit = simHcalHits->begin();
hit != simHcalHits->end(); ++
hit )
944 double currentStepSize = cachedTrajectory_.getPropagationStep();
950 if ( direction != InsideOut )
952 "No TrackExtra information is available and association is done with something else than InsideOut track.\n" <<
953 "Either change the parameter or provide needed data!\n";
954 LogTrace(
"TrackAssociator") <<
"Track Extras not found\n";
956 return associate(iEvent, iSetup, parameters, &initialState);
959 LogTrace(
"TrackAssociator") <<
"Track Extras found\n";
964 LogTrace(
"TrackAssociator") <<
"inner track state (rho, z, phi):" <<
967 LogTrace(
"TrackAssociator") <<
"innerFreeState (rho, z, phi):" <<
971 LogTrace(
"TrackAssociator") <<
"outer track state (rho, z, phi):" <<
974 LogTrace(
"TrackAssociator") <<
"outerFreeState (rho, z, phi):" <<
979 if ( crossedIP( track ) ) {
980 switch ( direction ) {
983 return associate(iEvent, iSetup, parameters, &referenceState, &outerState);
987 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
989 cachedTrajectory_.setPropagationStep( currentStepSize );
995 switch ( direction ) {
997 return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1001 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1003 cachedTrajectory_.setPropagationStep( currentStepSize );
1013 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1016 result = associate(iEvent, iSetup, parameters, &innerState, &outerState);
1018 result = associate(iEvent, iSetup, parameters, &outerState, &innerState);
1019 cachedTrajectory_.setPropagationStep( currentStepSize );
1027 return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1036 return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, track, vertex), parameters);
1046 return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, momentum, vertex, charge), parameters);
1051 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
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
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
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
static std::string info(const DetId &, const TrackerTopology *tTopo)
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