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 ( trackOrigin.
momentum().
mag() == 0 )
return info;
238 if ( ! cachedTrajectory_.propagateAll(trackOrigin) )
return info;
241 cachedTrajectory_.findEcalTrajectory( ecalDetIdAssociator_->volume() );
242 cachedTrajectory_.findHcalTrajectory( hcalDetIdAssociator_->volume() );
243 cachedTrajectory_.findHOTrajectory( hoDetIdAssociator_->volume() );
244 cachedTrajectory_.findPreshowerTrajectory( preshowerDetIdAssociator_->volume() );
246 info.
trkGlobPosAtEcal = getPoint( cachedTrajectory_.getStateAtEcal().position() );
247 info.
trkGlobPosAtHcal = getPoint( cachedTrajectory_.getStateAtHcal().position() );
248 info.
trkGlobPosAtHO = getPoint( cachedTrajectory_.getStateAtHO().position() );
250 info.
trkMomAtEcal = cachedTrajectory_.getStateAtEcal().momentum();
251 info.
trkMomAtHcal = cachedTrajectory_.getStateAtHcal().momentum();
252 info.
trkMomAtHO = cachedTrajectory_.getStateAtHO().momentum();
254 if (parameters.
useEcal) fillEcal( iEvent, info, parameters);
256 if (parameters.
useHcal) fillHcal( iEvent, info, parameters);
257 if (parameters.
useHO) fillHO( iEvent, info, parameters);
258 if (parameters.
usePreshower) fillPreshower( iEvent, info, parameters);
259 if (parameters.
useMuon) fillMuon( iEvent, info, parameters);
260 if (parameters.
truthMatch) fillCaloTruth( iEvent, info, parameters);
269 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getEcalTrajectory();
271 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
272 itr != trajectoryStates.end(); itr++)
273 LogTrace(
"TrackAssociator") <<
"ECAL trajectory point (rho, z, phi): " << itr->position().perp() <<
274 ", " << itr->position().z() <<
", " << itr->position().phi();
276 std::vector<GlobalPoint> coreTrajectory;
277 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
278 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
280 if(coreTrajectory.empty()) {
281 LogTrace(
"TrackAssociator") <<
"ECAL track trajectory is empty; moving on\n";
290 if (!EBRecHits.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find EBRecHitCollection in the event!\n";
294 if (!EERecHits.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find EERecHitCollection in event!\n";
296 std::set<DetId> ecalIdsInRegion;
301 ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0],mapRange);
302 }
else ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dREcalPreselection);
303 LogTrace(
"TrackAssociator") <<
"ECAL hits in the region: " << ecalIdsInRegion.size();
305 ecalIdsInRegion = ecalDetIdAssociator_->getDetIdsInACone(ecalIdsInRegion, coreTrajectory, parameters.
dREcal);
306 LogTrace(
"TrackAssociator") <<
"ECAL hits in the cone: " << ecalIdsInRegion.size();
307 std::vector<DetId> crossedEcalIds =
308 ecalDetIdAssociator_->getCrossedDetIds(ecalIdsInRegion, coreTrajectory);
309 LogTrace(
"TrackAssociator") <<
"ECAL crossed hits " << crossedEcalIds.size();
314 for(std::vector<DetId>::const_iterator itr=crossedEcalIds.begin(); itr!=crossedEcalIds.end();itr++)
316 std::vector<EcalRecHit>::const_iterator ebHit = (*EBRecHits).find(*itr);
317 std::vector<EcalRecHit>::const_iterator eeHit = (*EERecHits).find(*itr);
318 if(ebHit != (*EBRecHits).end())
320 else if(eeHit != (*EERecHits).end())
323 LogTrace(
"TrackAssociator") <<
"Crossed EcalRecHit is not found for DetId: " << itr->rawId();
325 for(std::set<DetId>::const_iterator itr=ecalIdsInRegion.begin(); itr!=ecalIdsInRegion.end();itr++)
327 std::vector<EcalRecHit>::const_iterator ebHit = (*EBRecHits).find(*itr);
328 std::vector<EcalRecHit>::const_iterator eeHit = (*EERecHits).find(*itr);
329 if(ebHit != (*EBRecHits).end())
331 else if(eeHit != (*EERecHits).end())
334 LogTrace(
"TrackAssociator") <<
"EcalRecHit from the cone is not found for DetId: " << itr->rawId();
343 std::vector<GlobalPoint> trajectory;
344 const std::vector<SteppingHelixStateInfo>& ecalTrajectoryStates = cachedTrajectory_.getEcalTrajectory();
345 const std::vector<SteppingHelixStateInfo>& hcalTrajectoryStates = cachedTrajectory_.getHcalTrajectory();
346 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = ecalTrajectoryStates.begin();
347 itr != ecalTrajectoryStates.end(); itr++) trajectory.push_back(itr->position());
348 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = hcalTrajectoryStates.begin();
349 itr != hcalTrajectoryStates.end(); itr++) trajectory.push_back(itr->position());
351 if(trajectory.empty()) {
352 LogTrace(
"TrackAssociator") <<
"HCAL trajectory is empty; moving on\n";
361 if (!caloTowers.
isValid())
throw cms::Exception(
"FatalError") <<
"Unable to find CaloTowers in event!\n";
363 std::set<DetId> caloTowerIdsInRegion;
368 caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0],mapRange);
369 }
else caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0], parameters.
dRHcalPreselection);
371 LogTrace(
"TrackAssociator") <<
"Towers in the region: " << caloTowerIdsInRegion.size();
372 std::set<DetId> caloTowerIdsInACone = caloDetIdAssociator_->getDetIdsInACone(caloTowerIdsInRegion, trajectory, parameters.
dRHcal);
373 LogTrace(
"TrackAssociator") <<
"Towers in the cone: " << caloTowerIdsInACone.size();
374 std::vector<DetId> crossedCaloTowerIds = caloDetIdAssociator_->getCrossedDetIds(caloTowerIdsInRegion, trajectory);
375 LogTrace(
"TrackAssociator") <<
"Towers crossed: " << crossedCaloTowerIds.size();
380 for(std::vector<DetId>::const_iterator itr=crossedCaloTowerIds.begin(); itr!=crossedCaloTowerIds.end();itr++)
383 if(tower != (*caloTowers).end())
386 LogTrace(
"TrackAssociator") <<
"Crossed CaloTower is not found for DetId: " << (*itr).rawId();
389 for(std::set<DetId>::const_iterator itr=caloTowerIdsInACone.begin(); itr!=caloTowerIdsInACone.end();itr++)
392 if(tower != (*caloTowers).end())
393 info.
towers.push_back(&*tower);
395 LogTrace(
"TrackAssociator") <<
"CaloTower from the cone is not found for DetId: " << (*itr).rawId();
404 std::vector<GlobalPoint> trajectory;
405 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getPreshowerTrajectory();
406 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
407 itr != trajectoryStates.end(); itr++) trajectory.push_back(itr->position());
409 if(trajectory.empty()) {
410 LogTrace(
"TrackAssociator") <<
"Preshower trajectory is empty; moving on\n";
414 std::set<DetId> idsInRegion =
415 preshowerDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0],
418 LogTrace(
"TrackAssociator") <<
"Number of Preshower Ids in the region: " << idsInRegion.size();
419 std::vector<DetId> crossedIds = preshowerDetIdAssociator_->getCrossedDetIds(idsInRegion, trajectory);
420 LogTrace(
"TrackAssociator") <<
"Number of Preshower Ids in crossed: " << crossedIds.size();
429 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHcalTrajectory();
431 std::vector<GlobalPoint> coreTrajectory;
432 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
433 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
435 if(coreTrajectory.empty()) {
436 LogTrace(
"TrackAssociator") <<
"HCAL trajectory is empty; moving on\n";
445 if ( ! collection.
isValid() )
throw cms::Exception(
"FatalError") <<
"Unable to find HBHERecHits in event!\n";
447 std::set<DetId> idsInRegion;
452 idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
453 }
else idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dRHcalPreselection);
455 LogTrace(
"TrackAssociator") <<
"HCAL hits in the region: " << idsInRegion.size() <<
"\n" <<
DetIdInfo::info(idsInRegion,0);
456 std::set<DetId> idsInACone = hcalDetIdAssociator_->getDetIdsInACone(idsInRegion, coreTrajectory, parameters.
dRHcal);
457 LogTrace(
"TrackAssociator") <<
"HCAL hits in the cone: " << idsInACone.size() <<
"\n" <<
DetIdInfo::info(idsInACone,0);
458 std::vector<DetId> crossedIds =
459 hcalDetIdAssociator_->getCrossedDetIds(idsInRegion, coreTrajectory);
460 LogTrace(
"TrackAssociator") <<
"HCAL hits crossed: " << crossedIds.size() <<
"\n" <<
DetIdInfo::info(crossedIds,0);
464 for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
467 if( hit != (*collection).end() )
470 LogTrace(
"TrackAssociator") <<
"Crossed HBHERecHit is not found for DetId: " << itr->rawId();
472 for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
475 if( hit != (*collection).end() )
478 LogTrace(
"TrackAssociator") <<
"HBHERecHit from the cone is not found for DetId: " << itr->rawId();
486 const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHOTrajectory();
488 std::vector<GlobalPoint> coreTrajectory;
489 for(std::vector<SteppingHelixStateInfo>::const_iterator itr = trajectoryStates.begin();
490 itr != trajectoryStates.end(); itr++) coreTrajectory.push_back(itr->position());
492 if(coreTrajectory.empty()) {
493 LogTrace(
"TrackAssociator") <<
"HO trajectory is empty; moving on\n";
502 if ( ! collection.
isValid() )
throw cms::Exception(
"FatalError") <<
"Unable to find HORecHits in event!\n";
504 std::set<DetId> idsInRegion;
509 idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
510 }
else idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.
dRHcalPreselection);
512 LogTrace(
"TrackAssociator") <<
"idsInRegion.size(): " << idsInRegion.size();
513 std::set<DetId> idsInACone = hoDetIdAssociator_->getDetIdsInACone(idsInRegion, coreTrajectory, parameters.
dRHcal);
514 LogTrace(
"TrackAssociator") <<
"idsInACone.size(): " << idsInACone.size();
515 std::vector<DetId> crossedIds =
516 hoDetIdAssociator_->getCrossedDetIds(idsInRegion, coreTrajectory);
521 for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
524 if( hit != (*collection).end() )
527 LogTrace(
"TrackAssociator") <<
"Crossed HORecHit is not found for DetId: " << itr->rawId();
530 for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
533 if( hit != (*collection).end() )
536 LogTrace(
"TrackAssociator") <<
"HORecHit from the cone is not found for DetId: " << itr->rawId();
548 if (
abs(track.
type( )) == 211 ||
551 charge = track.
type( )< 0 ? -1 : 1;
552 return getFreeTrajectoryState(iSetup, vector,
point, charge);
565 ROOT::Math::SMatrixIdentity id;
588 ROOT::Math::SMatrixIdentity id;
603 if ( delta.first > 0 )
607 if ( delta.second > 0 )
610 mapRange.
dPhiMinus += fabs(delta.second);
611 LogTrace(
"TrackAssociator") <<
"Selection range: (dThetaPlus, dThetaMinus, dPhiPlus, dPhiMinus, dRPreselection): " <<
630 if(! trajectoryPoint.
isValid() ) trajectoryPoint = cachedTrajectory_.getOuterState();
631 if(! trajectoryPoint.
isValid() ) {
633 "trajectory position at HCAL is not valid. Assume the track cannot reach muon detectors and skip it";
638 LogTrace(
"TrackAssociator") <<
"muon direction: " << direction <<
"\n\t and corresponding point: " <<
646 std::set<DetId> muonIdsInRegion =
647 muonDetIdAssociator_->getDetIdsCloseToAPoint(trajectoryPoint.
position(), mapRange);
648 LogTrace(
"TrackAssociator") <<
"Number of chambers to check: " << muonIdsInRegion.size();
649 for(std::set<DetId>::const_iterator detId = muonIdsInRegion.begin(); detId != muonIdsInRegion.end(); detId++)
651 const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet(*detId);
653 if (! stateOnSurface.
isValid()) {
654 LogTrace(
"TrackAssociator") <<
"Failed to propagate the track; moving on\n\t"<<
664 if(
const CSCChamber* cscChamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
667 LogTrace(
"TrackAssociator") <<
"Failed to get CSCChamberSpecs from CSCChamber; moving on\n";
671 if(! layerGeometry) {
672 LogTrace(
"TrackAssociator") <<
"Failed to get CSCLayerGeometry from CSCChamberSpecs; moving on\n";
677 LogTrace(
"TrackAssociator") <<
"Failed to get CSCWireTopology from CSCLayerGeometry; moving on\n";
685 float yOfFirstWire = fabs(wireTopology->
wireAngle())>1.E-06 ? -0.5*length : wireTopology->
yOfWire(1);
687 float yCOWPOffset = yOfFirstWire+0.5*length;
690 float tangent = (wideWidth-narrowWidth)/(2.*length);
692 float yPrime = localPoint.
y()+fabs(yOfFirstWire);
694 float halfWidthAtYPrime = 0.5*narrowWidth+yPrime*tangent;
695 distanceX = fabs(localPoint.
x()) - halfWidthAtYPrime;
696 distanceY = fabs(localPoint.
y()-yCOWPOffset) - 0.5*length;
697 sigmaX = distanceX/
sqrt(localError.
xx());
698 sigmaY = distanceY/
sqrt(localError.
yy());
702 sigmaX = distanceX/
sqrt(localError.
xx());
703 sigmaY = distanceY/
sqrt(localError.
yy());
709 match.
tState = stateOnSurface;
713 matches.push_back(match);
715 LogTrace(
"TrackAssociator") <<
"chamber is too far: " <<
716 DetIdInfo::info(*detId,0) <<
"\n\tdistanceX: " << distanceX <<
"\t distanceY: " << distanceY <<
717 "\t sigmaX: " << sigmaX <<
"\t sigmaY: " << sigmaY <<
"\n";
731 throw cms::Exception(
"FatalError") <<
"Unable to find DTRecSegment4DCollection in event!\n";
736 throw cms::Exception(
"FatalError") <<
"Unable to find CSCSegmentCollection in event!\n";
749 std::vector<TAMuonChamberMatch> matchedChambers;
750 LogTrace(
"TrackAssociator") <<
"Trying to Get ChamberMatches" << std::endl;
751 getTAMuonChamberMatches(matchedChambers, parameters);
752 LogTrace(
"TrackAssociator") <<
"Chambers matched: " << matchedChambers.size() <<
"\n";
756 for(std::vector<TAMuonChamberMatch>::iterator matchedChamber = matchedChambers.begin();
757 matchedChamber != matchedChambers.end(); matchedChamber++)
759 const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet((*matchedChamber).id);
761 if(
const DTChamber* chamber = dynamic_cast<const DTChamber*>(geomDet) ) {
766 if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
767 matchedChamber->segments.back().dtSegmentRef =
DTRecSegment4DRef(dtSegments, segment - dtSegments->begin());
772 if(
const CSCChamber* chamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
777 if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
778 matchedChamber->segments.back().cscSegmentRef =
CSCSegmentRef(cscSegments, segment - cscSegments->begin());
785 info.
chambers.push_back(*matchedChamber);
795 <<
"Segment local position: " << segment->
localPosition() <<
"\n"
798 const GeomDet* chamber = muonDetIdAssociator_->getGeomDet(matchedChamber.
id);
803 <<
"Segment global position: " << segmentGlobalPosition <<
" \t (R_xy,eta,phi): "
804 << segmentGlobalPosition.
perp() <<
"," << segmentGlobalPosition.
eta() <<
"," << segmentGlobalPosition.
phi() <<
"\n";
807 <<
"\teta hit: " << segmentGlobalPosition.
eta() <<
" \tpropagator: " << trajectoryStateOnSurface.
freeState()->
position().
eta() <<
"\n"
808 <<
"\tphi hit: " << segmentGlobalPosition.
phi() <<
" \tpropagator: " << trajectoryStateOnSurface.
freeState()->
position().
phi() << std::endl;
811 bool isDTWithoutY =
false;
813 if ( dtseg && (! dtseg->
hasZed()) )
817 if(deltaPhi>
M_PI) deltaPhi = fabs(deltaPhi-
M_PI*2.);
821 isGood = deltaPhi < parameters.
dRMuon;
825 deltaPhi*deltaPhi) < parameters.
dRMuon;
844 muonSegment.
hasZed =
true;
845 muonSegment.
hasPhi =
true;
850 if ( (dtseg->
hasPhi()) && (! isDTWithoutY) ) {
859 LogTrace(
"TrackAssociator") <<
" Phi t0: " << dtseg->
phiSegment()->
t0() <<
" hits: " << phiHits;
867 if (hits) muonSegment.
t0 = t0/hits;
871 if (isDTWithoutY) muonSegment.
hasZed =
false;
875 matchedChamber.
segments.push_back(muonSegment);
891 if (! simTracks.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated tracks found\n";
895 if (! simVertices.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated vertices found\n";
900 if (! simEcalHitsEB.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated ECAL EB hits found\n";
904 if (! simEcalHitsEE.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated ECAL EE hits found\n";
908 if (! simHcalHits.isValid() )
throw cms::Exception(
"FatalError") <<
"No simulated HCAL hits found\n";
911 SimTrackContainer::const_iterator simTrack = simTracks->begin();
912 for( ; simTrack != simTracks->end(); ++simTrack){
913 math::XYZVector simP3( simTrack->momentum().x(), simTrack->momentum().y(), simTrack->momentum().z() );
917 if ( simTrack != simTracks->end() ) {
919 double ecalTrueEnergy(0);
920 double hcalTrueEnergy(0);
923 for( PCaloHitContainer::const_iterator
hit = simEcalHitsEB->begin();
hit != simEcalHitsEB->end(); ++
hit )
926 for( PCaloHitContainer::const_iterator
hit = simEcalHitsEE->begin();
hit != simEcalHitsEE->end(); ++
hit )
929 for( PCaloHitContainer::const_iterator
hit = simHcalHits->begin();
hit != simHcalHits->end(); ++
hit )
949 double currentStepSize = cachedTrajectory_.getPropagationStep();
955 if ( direction != InsideOut )
957 "No TrackExtra information is available and association is done with something else than InsideOut track.\n" <<
958 "Either change the parameter or provide needed data!\n";
959 LogTrace(
"TrackAssociator") <<
"Track Extras not found\n";
961 return associate(iEvent, iSetup, parameters, &initialState);
964 LogTrace(
"TrackAssociator") <<
"Track Extras found\n";
969 LogTrace(
"TrackAssociator") <<
"inner track state (rho, z, phi):" <<
972 LogTrace(
"TrackAssociator") <<
"innerFreeState (rho, z, phi):" <<
976 LogTrace(
"TrackAssociator") <<
"outer track state (rho, z, phi):" <<
979 LogTrace(
"TrackAssociator") <<
"outerFreeState (rho, z, phi):" <<
984 if ( crossedIP( track ) ) {
985 switch ( direction ) {
988 return associate(iEvent, iSetup, parameters, &referenceState, &outerState);
992 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
994 cachedTrajectory_.setPropagationStep( currentStepSize );
1000 switch ( direction ) {
1002 return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1006 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1008 cachedTrajectory_.setPropagationStep( currentStepSize );
1018 cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1021 result = associate(iEvent, iSetup, parameters, &innerState, &outerState);
1023 result = associate(iEvent, iSetup, parameters, &outerState, &innerState);
1024 cachedTrajectory_.setPropagationStep( currentStepSize );
1032 return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1041 return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, track, vertex), parameters);
1051 return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, momentum, vertex, charge), parameters);
1056 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