CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions | Static Public Member Functions | Private Member Functions | Private Attributes
TrackDetectorAssociator Class Reference

#include <TrackDetectorAssociator.h>

Public Types

typedef TrackAssociatorParameters AssociatorParameters
 
enum  Direction { Any, InsideOut, OutsideIn }
 

Public Member Functions

TrackDetMatchInfo associate (const edm::Event &, const edm::EventSetup &, const FreeTrajectoryState &, const AssociatorParameters &)
 
TrackDetMatchInfo associate (const edm::Event &iEvent, const edm::EventSetup &iSetup, const AssociatorParameters &parameters, const FreeTrajectoryState *innerState, const FreeTrajectoryState *outerState=0)
 
TrackDetMatchInfo associate (const edm::Event &, const edm::EventSetup &, const reco::Track &, const AssociatorParameters &, Direction direction=Any)
 associate using reco::Track More...
 
TrackDetMatchInfo associate (const edm::Event &, const edm::EventSetup &, const SimTrack &, const SimVertex &, const AssociatorParameters &)
 associate using a simulated track More...
 
TrackDetMatchInfo associate (const edm::Event &, const edm::EventSetup &, const GlobalVector &, const GlobalPoint &, const int, const AssociatorParameters &)
 associate using 3-momentum, vertex and charge More...
 
const CachedTrajectorygetCachedTrajector () const
 trajector information More...
 
void setPropagator (const Propagator *)
 use a user configured propagator More...
 
 TrackDetectorAssociator ()
 
void useDefaultPropagator ()
 use the default propagator More...
 
 ~TrackDetectorAssociator ()
 

Static Public Member Functions

static bool crossedIP (const reco::Track &track)
 
static FreeTrajectoryState getFreeTrajectoryState (const edm::EventSetup &, const reco::Track &)
 get FreeTrajectoryState from different track representations More...
 
static FreeTrajectoryState getFreeTrajectoryState (const edm::EventSetup &, const SimTrack &, const SimVertex &)
 
static FreeTrajectoryState getFreeTrajectoryState (const edm::EventSetup &, const GlobalVector &, const GlobalPoint &, const int)
 

Private Member Functions

bool addTAMuonSegmentMatch (TAMuonChamberMatch &, const RecSegment *, const AssociatorParameters &)
 
void fillCaloTowers (const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
 
void fillCaloTruth (const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
 
void fillEcal (const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
 
void fillHcal (const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
 
void fillHO (const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
 
void fillMuon (const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
 
void fillPreshower (const edm::Event &iEvent, TrackDetMatchInfo &info, const AssociatorParameters &)
 
DetIdAssociator::MapRange getMapRange (const std::pair< float, float > &delta, const float dR)
 
math::XYZPoint getPoint (const GlobalPoint &point)
 
math::XYZPoint getPoint (const LocalPoint &point)
 
void getTAMuonChamberMatches (std::vector< TAMuonChamberMatch > &matches, const AssociatorParameters &parameters)
 
math::XYZVector getVector (const GlobalVector &vec)
 
math::XYZVector getVector (const LocalVector &vec)
 
void init (const edm::EventSetup &)
 

Private Attributes

CachedTrajectory cachedTrajectory_
 
edm::ESHandle< DetIdAssociatorcaloDetIdAssociator_
 
PropagatordefProp_
 
edm::ESHandle< DetIdAssociatorecalDetIdAssociator_
 
edm::ESHandle< DetIdAssociatorhcalDetIdAssociator_
 
edm::ESHandle< DetIdAssociatorhoDetIdAssociator_
 
const PropagatorivProp_
 
edm::ESHandle< DetIdAssociatormuonDetIdAssociator_
 
edm::ESHandle< DetIdAssociatorpreshowerDetIdAssociator_
 
edm::ESHandle< CaloGeometrytheCaloGeometry_
 
edm::ESWatcher
< IdealMagneticFieldRecord
theMagneticFeildWatcher_
 
edm::ESHandle
< GlobalTrackingGeometry
theTrackingGeometry_
 
bool useDefaultPropagator_
 

Detailed Description

Definition at line 50 of file TrackDetectorAssociator.h.

Member Typedef Documentation

Definition at line 55 of file TrackDetectorAssociator.h.

Member Enumeration Documentation

Constructor & Destructor Documentation

TrackDetectorAssociator::TrackDetectorAssociator ( )

Definition at line 99 of file TrackDetectorAssociator.cc.

100 {
101  ivProp_ = 0;
102  defProp_ = 0;
103  useDefaultPropagator_ = false;
104 }
TrackDetectorAssociator::~TrackDetectorAssociator ( )

Definition at line 106 of file TrackDetectorAssociator.cc.

107 {
108  if (defProp_) delete defProp_;
109 }

Member Function Documentation

bool TrackDetectorAssociator::addTAMuonSegmentMatch ( TAMuonChamberMatch matchedChamber,
const RecSegment segment,
const AssociatorParameters parameters 
)
private

Definition at line 788 of file TrackDetectorAssociator.cc.

References reco::deltaPhi(), TrackAssociatorParameters::dRMuon, PV3DBase< T, PVType, FrameType >::eta(), TrajectoryStateOnSurface::freeState(), TrackingRecHit::geographicalId(), TAMuonSegmentMatch::hasPhi, DTRecSegment4D::hasPhi(), TAMuonSegmentMatch::hasZed, DTRecSegment4D::hasZed(), TAMuonChamberMatch::id, DTRecSegment2D::ist0Valid(), RecSegment::localDirection(), RecSegment::localDirectionError(), TrackingRecHit::localPosition(), TrackingRecHit::localPositionError(), LogTrace, M_PI, PV3DBase< T, PVType, FrameType >::perp(), PV3DBase< T, PVType, FrameType >::phi(), DTRecSegment4D::phiSegment(), FreeTrajectoryState::position(), funct::pow(), DetId::rawId(), TAMuonSegmentMatch::segmentGlobalPosition, TAMuonSegmentMatch::segmentLocalDirection, TAMuonSegmentMatch::segmentLocalErrorDxDz, TAMuonSegmentMatch::segmentLocalErrorDyDz, TAMuonSegmentMatch::segmentLocalErrorXDxDz, TAMuonSegmentMatch::segmentLocalErrorXX, TAMuonSegmentMatch::segmentLocalErrorXY, TAMuonSegmentMatch::segmentLocalErrorYDyDz, TAMuonSegmentMatch::segmentLocalErrorYY, TAMuonSegmentMatch::segmentLocalPosition, TAMuonChamberMatch::segments, DTRecSegment2D::specificRecHits(), mathSSE::sqrt(), TAMuonSegmentMatch::t0, DTRecSegment2D::t0(), GeomDet::toGlobal(), TAMuonChamberMatch::tState, LocalError::xx(), LocalError::xy(), and LocalError::yy().

791 {
792  LogTrace("TrackAssociator")
793  << "Segment local position: " << segment->localPosition() << "\n"
794  << std::hex << segment->geographicalId().rawId() << "\n";
795 
796  const GeomDet* chamber = muonDetIdAssociator_->getGeomDet(matchedChamber.id);
797  TrajectoryStateOnSurface trajectoryStateOnSurface = matchedChamber.tState;
798  GlobalPoint segmentGlobalPosition = chamber->toGlobal(segment->localPosition());
799 
800  LogTrace("TrackAssociator")
801  << "Segment global position: " << segmentGlobalPosition << " \t (R_xy,eta,phi): "
802  << segmentGlobalPosition.perp() << "," << segmentGlobalPosition.eta() << "," << segmentGlobalPosition.phi() << "\n";
803 
804  LogTrace("TrackAssociator")
805  << "\teta hit: " << segmentGlobalPosition.eta() << " \tpropagator: " << trajectoryStateOnSurface.freeState()->position().eta() << "\n"
806  << "\tphi hit: " << segmentGlobalPosition.phi() << " \tpropagator: " << trajectoryStateOnSurface.freeState()->position().phi() << std::endl;
807 
808  bool isGood = false;
809  bool isDTWithoutY = false;
810  const DTRecSegment4D* dtseg = dynamic_cast<const DTRecSegment4D*>(segment);
811  if ( dtseg && (! dtseg->hasZed()) )
812  isDTWithoutY = true;
813 
814  double deltaPhi(fabs(segmentGlobalPosition.phi()-trajectoryStateOnSurface.freeState()->position().phi()));
815  if(deltaPhi>M_PI) deltaPhi = fabs(deltaPhi-M_PI*2.);
816 
817  if( isDTWithoutY )
818  {
819  isGood = deltaPhi < parameters.dRMuon;
820  // Be in chamber
821  isGood &= fabs(segmentGlobalPosition.eta()-trajectoryStateOnSurface.freeState()->position().eta()) < .3;
822  } else isGood = sqrt( pow(segmentGlobalPosition.eta()-trajectoryStateOnSurface.freeState()->position().eta(),2) +
823  deltaPhi*deltaPhi) < parameters.dRMuon;
824 
825  if(isGood) {
826  TAMuonSegmentMatch muonSegment;
827  muonSegment.segmentGlobalPosition = getPoint(segmentGlobalPosition);
828  muonSegment.segmentLocalPosition = getPoint( segment->localPosition() );
829  muonSegment.segmentLocalDirection = getVector( segment->localDirection() );
830  muonSegment.segmentLocalErrorXX = segment->localPositionError().xx();
831  muonSegment.segmentLocalErrorYY = segment->localPositionError().yy();
832  muonSegment.segmentLocalErrorXY = segment->localPositionError().xy();
833  muonSegment.segmentLocalErrorDxDz = segment->localDirectionError().xx();
834  muonSegment.segmentLocalErrorDyDz = segment->localDirectionError().yy();
835 
836  // DANGEROUS - compiler cannot guaranty parameters ordering
837  // AlgebraicSymMatrix segmentCovMatrix = segment->parametersError();
838  // muonSegment.segmentLocalErrorXDxDz = segmentCovMatrix[2][0];
839  // muonSegment.segmentLocalErrorYDyDz = segmentCovMatrix[3][1];
840  muonSegment.segmentLocalErrorXDxDz = -999;
841  muonSegment.segmentLocalErrorYDyDz = -999;
842  muonSegment.hasZed = true;
843  muonSegment.hasPhi = true;
844 
845  // timing information
846  muonSegment.t0 = 0;
847  if ( dtseg ) {
848  if ( (dtseg->hasPhi()) && (! isDTWithoutY) ) {
849  int phiHits = dtseg->phiSegment()->specificRecHits().size();
850  // int zHits = dtseg->zSegment()->specificRecHits().size();
851  int hits=0;
852  double t0=0.;
853  // TODO: cuts on hit numbers not optimized in any way yet...
854  if (phiHits>5 && dtseg->phiSegment()->ist0Valid()) {
855  t0+=dtseg->phiSegment()->t0()*phiHits;
856  hits+=phiHits;
857  LogTrace("TrackAssociator") << " Phi t0: " << dtseg->phiSegment()->t0() << " hits: " << phiHits;
858  }
859  // the z segments seem to contain little useful information...
860 // if (zHits>3) {
861 // t0+=s->zSegment()->t0()*zHits;
862 // hits+=zHits;
863 // std::cout << " Z t0: " << s->zSegment()->t0() << " hits: " << zHits << std::endl;
864 // }
865  if (hits) muonSegment.t0 = t0/hits;
866 // std::cout << " --- t0: " << muonSegment.t0 << std::endl;
867  } else {
868  // check and set dimensionality
869  if (isDTWithoutY) muonSegment.hasZed = false;
870  if (! dtseg->hasPhi()) muonSegment.hasPhi = false;
871  }
872  }
873  matchedChamber.segments.push_back(muonSegment);
874  }
875 
876  return isGood;
877 }
float xx() const
Definition: LocalError.h:24
dictionary parameters
Definition: Parameters.py:2
T perp() const
Definition: PV3DBase.h:72
virtual LocalError localDirectionError() const =0
Error on the local direction.
TrajectoryStateOnSurface tState
math::XYZPoint segmentGlobalPosition
const DTChamberRecSegment2D * phiSegment() const
The superPhi segment: 0 if no phi projection available.
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
Definition: GeomDet.h:52
math::XYZPoint segmentLocalPosition
virtual LocalVector localDirection() const =0
Local direction.
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
math::XYZVector getVector(const GlobalVector &vec)
math::XYZVector segmentLocalDirection
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
float xy() const
Definition: LocalError.h:25
float yy() const
Definition: LocalError.h:26
T sqrt(T t)
Definition: SSEVec.h:48
FreeTrajectoryState const * freeState(bool withErrors=true) const
std::vector< TAMuonSegmentMatch > segments
distance sign convention: negative - crossed chamber, positive - missed chamber
bool hasPhi() const
Does it have the Phi projection?
#define LogTrace(id)
#define M_PI
std::vector< DTRecHit1D > specificRecHits() const
Access to specific components.
bool ist0Valid() const
bool hasZed() const
Does it have the Z projection?
GlobalPoint position() const
math::XYZPoint getPoint(const GlobalPoint &point)
virtual LocalError localPositionError() const =0
T eta() const
Definition: PV3DBase.h:76
edm::ESHandle< DetIdAssociator > muonDetIdAssociator_
DetId geographicalId() const
double t0() const
Get the segment t0 (if recomputed, 0 is returned otherwise)
virtual LocalPoint localPosition() const =0
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
TrackDetMatchInfo TrackDetectorAssociator::associate ( const edm::Event iEvent,
const edm::EventSetup iSetup,
const FreeTrajectoryState fts,
const AssociatorParameters parameters 
)

propagate a track across the whole detector and find associated objects. Association is done in two modes 1) an object is associated to a track only if crossed by track 2) an object is associated to a track if it is withing an eta-phi cone of some radius with respect to a track. (the cone origin is at (0,0,0)) Trajectory bending in eta-phi is taking into account when matching is performed

associate using FreeTrajectoryState

Definition at line 156 of file TrackDetectorAssociator.cc.

Referenced by BetaCalculatorECAL::addInfoToCandidate(), EopTreeWriter::analyze(), EcalCosmicsHists::analyze(), IsolatedTracksCone::analyze(), spr::chargeIsolation(), spr::chargeIsolationEcal(), spr::chargeIsolationHcal(), spr::coneChargeIsolation(), muonisolation::JetExtractor::deposit(), muonisolation::CaloExtractorByAssociator::deposits(), cms::MuonMETValueMapProducer::determine_deltax_deltay(), MuonDetCleaner::fillHitMap(), MuonIdProducer::fillMuonId(), SelectReplacementCandidates::getRawIDsAdvanced(), getTrackDetMatchInfo(), InterestingTrackEcalDetIdProducer::produce(), AlCaIsoTracksProducer::produce(), HighPtTrackEcalDetIdProducer::produce(), and ReduceHcalRecHitCollectionProducer::produce().

160 {
161  return associate(iEvent,iSetup,parameters,&fts);
162 }
dictionary parameters
Definition: Parameters.py:2
TrackDetMatchInfo associate(const edm::Event &, const edm::EventSetup &, const FreeTrajectoryState &, const AssociatorParameters &)
TrackDetMatchInfo TrackDetectorAssociator::associate ( const edm::Event iEvent,
const edm::EventSetup iSetup,
const AssociatorParameters parameters,
const FreeTrajectoryState innerState,
const FreeTrajectoryState outerState = 0 
)

associate using inner and outer most states of a track in the silicon tracker.

Definition at line 164 of file TrackDetectorAssociator.cc.

References edm::hlt::Exception, info(), init, LogTrace, CosmicsPD_Skims::maxZ, PV3DBase< T, PVType, FrameType >::perp(), FreeTrajectoryState::position(), TrackDetMatchInfo::setCaloGeometry(), TrackDetMatchInfo::stateAtIP, TrackDetMatchInfo::trkGlobPosAtEcal, TrackDetMatchInfo::trkGlobPosAtHcal, TrackDetMatchInfo::trkGlobPosAtHO, TrackDetMatchInfo::trkMomAtEcal, TrackDetMatchInfo::trkMomAtHcal, TrackDetMatchInfo::trkMomAtHO, TrackAssociatorParameters::truthMatch, TrackAssociatorParameters::useCalo, TrackAssociatorParameters::useEcal, TrackAssociatorParameters::useHcal, TrackAssociatorParameters::useHO, TrackAssociatorParameters::useMuon, TrackAssociatorParameters::usePreshower, and PV3DBase< T, PVType, FrameType >::z().

169 {
171  if (! parameters.useEcal && ! parameters.useCalo && ! parameters.useHcal &&
172  ! parameters.useHO && ! parameters.useMuon && !parameters.usePreshower)
173  throw cms::Exception("ConfigurationError") <<
174  "Configuration error! No subdetector was selected for the track association.";
175 
176  SteppingHelixStateInfo trackOrigin(*innerState);
177  info.stateAtIP = *innerState;
178  cachedTrajectory_.setStateAtIP(trackOrigin);
179 
180  init( iSetup );
181  // get track trajectory
182  // ECAL points (EB+EE)
183  // If the phi angle between a track entrance and exit points is more
184  // than 2 crystals, it is possible that the track will cross 3 crystals
185  // and therefore one has to check at least 3 points along the track
186  // trajectory inside ECAL. In order to have a chance to cross 4 crystalls
187  // in the barrel, a track should have P_t as low as 3 GeV or smaller
188  // If it's necessary, number of points along trajectory can be increased
189 
191 
193  // estimate propagation outer boundaries based on
194  // requested sub-detector information. For now limit
195  // propagation region only if muon matching is not
196  // requested.
197  double HOmaxR = hoDetIdAssociator_->volume().maxR();
198  double HOmaxZ = hoDetIdAssociator_->volume().maxZ();
199  double minR = ecalDetIdAssociator_->volume().minR();
200  double minZ = preshowerDetIdAssociator_->volume().minZ();
205 
206  double maxR(0);
207  double maxZ(0);
208 
209  if (parameters.useMuon) {
210  maxR = muonDetIdAssociator_->volume().maxR();
211  maxZ = muonDetIdAssociator_->volume().maxZ();
214  }
215  else {
216  maxR = HOmaxR;
217  maxZ = HOmaxZ;
220  }
221 
222  // If track extras exist and outerState is before HO maximum, then use outerState
223  if (outerState) {
224  if (outerState->position().perp()<HOmaxR && fabs(outerState->position().z())<HOmaxZ) {
225  LogTrace("TrackAssociator") << "Using outerState as trackOrigin at Rho=" << outerState->position().perp()
226  << " Z=" << outerState->position().z() << "\n";
227  trackOrigin = SteppingHelixStateInfo(*outerState);
228  }
229  else if(innerState) {
230  LogTrace("TrackAssociator") << "Using innerState as trackOrigin at Rho=" << innerState->position().perp()
231  << " Z=" << innerState->position().z() << "\n";
232  trackOrigin = SteppingHelixStateInfo(*innerState);
233  }
234  }
235 
236  if ( ! cachedTrajectory_.propagateAll(trackOrigin) ) return info;
237 
238  // get trajectory in calorimeters
243 
247 
251 
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);
259 
260  return info;
261 }
SteppingHelixStateInfo getStateAtHO()
math::XYZPoint trkGlobPosAtHO
dictionary parameters
Definition: Parameters.py:2
static const TGPicture * info(bool iBackgroundIsBlack)
T perp() const
Definition: PV3DBase.h:72
void findPreshowerTrajectory(const FiducialVolume &)
void setMinDetectorLength(float l=0.)
void setMinDetectorRadius(float r=0.)
void setCaloGeometry(edm::ESHandle< CaloGeometry > geometry)
void setMaxHOLength(float l=2200.)
void fillHcal(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
void findHcalTrajectory(const FiducialVolume &)
GlobalVector momentum() const
edm::ESHandle< DetIdAssociator > hcalDetIdAssociator_
math::XYZPoint trkGlobPosAtHcal
FreeTrajectoryState stateAtIP
track info
void fillCaloTowers(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
void fillCaloTruth(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
GlobalVector trkMomAtHO
bool propagateAll(const SteppingHelixStateInfo &initialState)
propagate through the whole detector, returns true if successful
GlobalPoint position() const
T z() const
Definition: PV3DBase.h:64
void setMaxHORadius(float r=800.)
edm::ESHandle< CaloGeometry > theCaloGeometry_
edm::ESHandle< DetIdAssociator > ecalDetIdAssociator_
void fillPreshower(const edm::Event &iEvent, TrackDetMatchInfo &info, const AssociatorParameters &)
#define LogTrace(id)
GlobalPoint position() const
math::XYZPoint getPoint(const GlobalPoint &point)
GlobalVector trkMomAtEcal
edm::ESHandle< DetIdAssociator > hoDetIdAssociator_
void fillMuon(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
void findEcalTrajectory(const FiducialVolume &)
void init(const edm::EventSetup &)
GlobalVector trkMomAtHcal
edm::ESHandle< DetIdAssociator > muonDetIdAssociator_
edm::ESHandle< DetIdAssociator > preshowerDetIdAssociator_
void fillEcal(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
SteppingHelixStateInfo getStateAtEcal()
void findHOTrajectory(const FiducialVolume &)
math::XYZPoint trkGlobPosAtEcal
Track position at different parts of the calorimeter.
void setStateAtIP(const SteppingHelixStateInfo &state)
void fillHO(const edm::Event &, TrackDetMatchInfo &, const AssociatorParameters &)
void setMaxDetectorLength(float l=2200.)
SteppingHelixStateInfo getStateAtHcal()
void setMaxDetectorRadius(float r=800.)
TrackDetMatchInfo TrackDetectorAssociator::associate ( const edm::Event iEvent,
const edm::EventSetup iSetup,
const reco::Track track,
const AssociatorParameters parameters,
Direction  direction = Any 
)

associate using reco::Track

Definition at line 941 of file TrackDetectorAssociator.cc.

References ecalTB2006H4_GenSimDigiReco_cfg::bField, edm::hlt::Exception, reco::Track::extra(), edm::EventSetup::get(), trajectoryStateTransform::initialFreeState(), trajectoryStateTransform::innerFreeState(), reco::Track::innerMomentum(), reco::Track::innerPosition(), edm::Ref< C, T, F >::isNull(), LogTrace, trajectoryStateTransform::outerFreeState(), reco::Track::outerMomentum(), reco::Track::outerPosition(), PV3DBase< T, PVType, FrameType >::perp(), PV3DBase< T, PVType, FrameType >::phi(), FreeTrajectoryState::position(), query::result, and PV3DBase< T, PVType, FrameType >::z().

946 {
947  double currentStepSize = cachedTrajectory_.getPropagationStep();
948 
950  iSetup.get<IdealMagneticFieldRecord>().get(bField);
951 
952  if(track.extra().isNull()) {
953  if ( direction != InsideOut )
954  throw cms::Exception("FatalError") <<
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); // 5th argument is null pointer
960  }
961 
962  LogTrace("TrackAssociator") << "Track Extras found\n";
965  FreeTrajectoryState referenceState = trajectoryStateTransform::initialFreeState(track,&*bField);
966 
967  LogTrace("TrackAssociator") << "inner track state (rho, z, phi):" <<
968  track.innerPosition().Rho() << ", " << track.innerPosition().z() <<
969  ", " << track.innerPosition().phi() << "\n";
970  LogTrace("TrackAssociator") << "innerFreeState (rho, z, phi):" <<
971  innerState.position().perp() << ", " << innerState.position().z() <<
972  ", " << innerState.position().phi() << "\n";
973 
974  LogTrace("TrackAssociator") << "outer track state (rho, z, phi):" <<
975  track.outerPosition().Rho() << ", " << track.outerPosition().z() <<
976  ", " << track.outerPosition().phi() << "\n";
977  LogTrace("TrackAssociator") << "outerFreeState (rho, z, phi):" <<
978  outerState.position().perp() << ", " << outerState.position().z() <<
979  ", " << outerState.position().phi() << "\n";
980 
981  // InsideOut first
982  if ( crossedIP( track ) ) {
983  switch ( direction ) {
984  case InsideOut:
985  case Any:
986  return associate(iEvent, iSetup, parameters, &referenceState, &outerState);
987  break;
988  case OutsideIn:
989  {
990  cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
991  TrackDetMatchInfo result = associate(iEvent, iSetup, parameters, &innerState, &referenceState);
992  cachedTrajectory_.setPropagationStep( currentStepSize );
993  return result;
994  break;
995  }
996  }
997  } else {
998  switch ( direction ) {
999  case InsideOut:
1000  return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1001  break;
1002  case OutsideIn:
1003  {
1004  cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1005  TrackDetMatchInfo result = associate(iEvent, iSetup, parameters, &outerState, &innerState);
1006  cachedTrajectory_.setPropagationStep( currentStepSize );
1007  return result;
1008  break;
1009  }
1010  case Any:
1011  {
1012  // check if we deal with clear outside-in case
1013  if ( track.innerPosition().Dot( track.innerMomentum() ) < 0 &&
1014  track.outerPosition().Dot( track.outerMomentum() ) < 0 )
1015  {
1016  cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1018  if ( track.innerPosition().R() < track.outerPosition().R() )
1019  result = associate(iEvent, iSetup, parameters, &innerState, &outerState);
1020  else
1021  result = associate(iEvent, iSetup, parameters, &outerState, &innerState);
1022  cachedTrajectory_.setPropagationStep( currentStepSize );
1023  return result;
1024  }
1025  }
1026  }
1027  }
1028 
1029  // all other cases
1030  return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1031 }
dictionary parameters
Definition: Parameters.py:2
float getPropagationStep() const
T perp() const
Definition: PV3DBase.h:72
static bool crossedIP(const reco::Track &track)
const TrackExtraRef & extra() const
reference to &quot;extra&quot; object
Definition: Track.h:189
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
void setPropagationStep(float s=20.)
const math::XYZPoint & outerPosition() const
position of the outermost hit
Definition: Track.h:65
const math::XYZPoint & innerPosition() const
position of the innermost hit
Definition: Track.h:55
T z() const
Definition: PV3DBase.h:64
tuple result
Definition: query.py:137
bool isNull() const
Checks for null.
Definition: Ref.h:247
#define LogTrace(id)
GlobalPoint position() const
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
Definition: Track.h:70
const T & get() const
Definition: EventSetup.h:55
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
Definition: Track.h:60
TrackDetMatchInfo associate(const edm::Event &, const edm::EventSetup &, const FreeTrajectoryState &, const AssociatorParameters &)
FreeTrajectoryState innerFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
FreeTrajectoryState outerFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
FreeTrajectoryState initialFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
TrackDetMatchInfo TrackDetectorAssociator::associate ( const edm::Event iEvent,
const edm::EventSetup iSetup,
const SimTrack track,
const SimVertex vertex,
const AssociatorParameters parameters 
)

associate using a simulated track

Definition at line 1033 of file TrackDetectorAssociator.cc.

1038 {
1039  return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, track, vertex), parameters);
1040 }
dictionary parameters
Definition: Parameters.py:2
static FreeTrajectoryState getFreeTrajectoryState(const edm::EventSetup &, const reco::Track &)
get FreeTrajectoryState from different track representations
TrackDetMatchInfo associate(const edm::Event &, const edm::EventSetup &, const FreeTrajectoryState &, const AssociatorParameters &)
TrackDetMatchInfo TrackDetectorAssociator::associate ( const edm::Event iEvent,
const edm::EventSetup iSetup,
const GlobalVector momentum,
const GlobalPoint vertex,
const int  charge,
const AssociatorParameters parameters 
)

associate using 3-momentum, vertex and charge

Definition at line 1042 of file TrackDetectorAssociator.cc.

1048 {
1049  return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, momentum, vertex, charge), parameters);
1050 }
dictionary parameters
Definition: Parameters.py:2
static FreeTrajectoryState getFreeTrajectoryState(const edm::EventSetup &, const reco::Track &)
get FreeTrajectoryState from different track representations
TrackDetMatchInfo associate(const edm::Event &, const edm::EventSetup &, const FreeTrajectoryState &, const AssociatorParameters &)
bool TrackDetectorAssociator::crossedIP ( const reco::Track track)
static

Definition at line 1052 of file TrackDetectorAssociator.cc.

References reco::Track::innerMomentum(), reco::Track::innerPosition(), reco::Track::outerMomentum(), and reco::Track::outerPosition().

Referenced by MuonIdProducer::produce().

1053 {
1054  bool crossed = true;
1055  crossed &= (track.innerPosition().rho() > 3 ); // something close to active volume
1056  crossed &= (track.outerPosition().rho() > 3 ); // something close to active volume
1057  crossed &= ( ( track.innerPosition().x()*track.innerMomentum().x() +
1058  track.innerPosition().y()*track.innerMomentum().y() < 0 ) !=
1059  ( track.outerPosition().x()*track.outerMomentum().x() +
1060  track.outerPosition().y()*track.outerMomentum().y() < 0 ) );
1061  return crossed;
1062 }
const math::XYZPoint & outerPosition() const
position of the outermost hit
Definition: Track.h:65
const math::XYZPoint & innerPosition() const
position of the innermost hit
Definition: Track.h:55
const math::XYZVector & outerMomentum() const
momentum vector at the outermost hit position
Definition: Track.h:70
const math::XYZVector & innerMomentum() const
momentum vector at the innermost hit position
Definition: Track.h:60
void TrackDetectorAssociator::fillCaloTowers ( const edm::Event iEvent,
TrackDetMatchInfo info,
const AssociatorParameters parameters 
)
private

Definition at line 336 of file TrackDetectorAssociator.cc.

References TrackAssociatorParameters::accountForTrajectoryChangeCalo, HiRecoJets_cff::caloTowers, TrackAssociatorParameters::caloTowersToken, TrackDetMatchInfo::crossedTowerIds, TrackDetMatchInfo::crossedTowers, TrackAssociatorParameters::dRHcal, TrackAssociatorParameters::dRHcalPreselection, edm::Event::getByToken(), CachedTrajectory::IpToHcal, TrackDetMatchInfo::isGoodCalo, edm::HandleBase::isValid(), LogTrace, and TrackDetMatchInfo::towers.

339 {
340  // use ECAL and HCAL trajectories to match a tower. (HO isn't used for matching).
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());
348 
349  if(trajectory.empty()) {
350  LogTrace("TrackAssociator") << "HCAL trajectory is empty; moving on\n";
351  info.isGoodCalo = 0;
352  return;
353  }
354  info.isGoodCalo = 1;
355 
356  // find crossed CaloTowers
358  iEvent.getByToken(parameters.caloTowersToken, caloTowers);
359  if (!caloTowers.isValid()) throw cms::Exception("FatalError") << "Unable to find CaloTowers in event!\n";
360 
361  std::set<DetId> caloTowerIdsInRegion;
362  if (parameters.accountForTrajectoryChangeCalo){
363  // get trajectory change with respect to initial state
365  parameters.dRHcalPreselection);
366  caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0],mapRange);
367  } else caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0], parameters.dRHcalPreselection);
368 
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();
374 
375  info.crossedTowerIds = crossedCaloTowerIds;
376 
377  // add CaloTowers
378  for(std::vector<DetId>::const_iterator itr=crossedCaloTowerIds.begin(); itr!=crossedCaloTowerIds.end();itr++)
379  {
380  CaloTowerCollection::const_iterator tower = (*caloTowers).find(*itr);
381  if(tower != (*caloTowers).end())
382  info.crossedTowers.push_back(&*tower);
383  else
384  LogTrace("TrackAssociator") << "Crossed CaloTower is not found for DetId: " << (*itr).rawId();
385  }
386 
387  for(std::set<DetId>::const_iterator itr=caloTowerIdsInACone.begin(); itr!=caloTowerIdsInACone.end();itr++)
388  {
389  CaloTowerCollection::const_iterator tower = (*caloTowers).find(*itr);
390  if(tower != (*caloTowers).end())
391  info.towers.push_back(&*tower);
392  else
393  LogTrace("TrackAssociator") << "CaloTower from the cone is not found for DetId: " << (*itr).rawId();
394  }
395 
396 }
dictionary parameters
Definition: Parameters.py:2
std::vector< const CaloTower * > crossedTowers
std::vector< const CaloTower * > towers
std::vector< DetId > crossedTowerIds
const std::vector< SteppingHelixStateInfo > & getHcalTrajectory() const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
std::vector< CaloTower >::const_iterator const_iterator
const std::vector< SteppingHelixStateInfo > & getEcalTrajectory() const
std::pair< float, float > trajectoryDelta(TrajectorType)
bool isValid() const
Definition: HandleBase.h:76
#define LogTrace(id)
DetIdAssociator::MapRange getMapRange(const std::pair< float, float > &delta, const float dR)
edm::ESHandle< DetIdAssociator > caloDetIdAssociator_
void TrackDetectorAssociator::fillCaloTruth ( const edm::Event iEvent,
TrackDetMatchInfo info,
const AssociatorParameters parameters 
)
private

Definition at line 881 of file TrackDetectorAssociator.cc.

References TrackDetMatchInfo::ecalTrueEnergy, SimTrack::genpartIndex(), edm::Event::getByToken(), TrackDetMatchInfo::hcalTrueEnergy, TrackDetMatchInfo::hcalTrueEnergyCorrected, FreeTrajectoryState::momentum(), TrackAssociatorParameters::simEcalHitsEBToken, TrackAssociatorParameters::simEcalHitsEEToken, TrackAssociatorParameters::simHcalHitsToken, TrackDetMatchInfo::simTrack, TrackAssociatorParameters::simTracksToken, TrackAssociatorParameters::simVerticesToken, TrackDetMatchInfo::stateAtIP, TrackDetMatchInfo::trkGlobPosAtHcal, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

884 {
885  // get list of simulated tracks and their vertices
886  using namespace edm;
887  Handle<SimTrackContainer> simTracks;
888  iEvent.getByToken(parameters.simTracksToken, simTracks);
889  if (! simTracks.isValid() ) throw cms::Exception("FatalError") << "No simulated tracks found\n";
890 
891  Handle<SimVertexContainer> simVertices;
892  iEvent.getByToken(parameters.simVerticesToken, simVertices);
893  if (! simVertices.isValid() ) throw cms::Exception("FatalError") << "No simulated vertices found\n";
894 
895  // get sim calo hits
896  Handle<PCaloHitContainer> simEcalHitsEB;
897  iEvent.getByToken(parameters.simEcalHitsEBToken, simEcalHitsEB);
898  if (! simEcalHitsEB.isValid() ) throw cms::Exception("FatalError") << "No simulated ECAL EB hits found\n";
899 
900  Handle<PCaloHitContainer> simEcalHitsEE;
901  iEvent.getByToken(parameters.simEcalHitsEEToken, simEcalHitsEE);
902  if (! simEcalHitsEE.isValid() ) throw cms::Exception("FatalError") << "No simulated ECAL EE hits found\n";
903 
904  Handle<PCaloHitContainer> simHcalHits;
905  iEvent.getByToken(parameters.simHcalHitsToken, simHcalHits);
906  if (! simHcalHits.isValid() ) throw cms::Exception("FatalError") << "No simulated HCAL hits found\n";
907 
908  // find truth partner
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() );
912  math::XYZVector recoP3( info.stateAtIP.momentum().x(), info.stateAtIP.momentum().y(), info.stateAtIP.momentum().z() );
913  if ( ROOT::Math::VectorUtil::DeltaR(recoP3, simP3) < 0.1 ) break;
914  }
915  if ( simTrack != simTracks->end() ) {
916  info.simTrack = &(*simTrack);
917  double ecalTrueEnergy(0);
918  double hcalTrueEnergy(0);
919 
920  // loop over calo hits
921  for( PCaloHitContainer::const_iterator hit = simEcalHitsEB->begin(); hit != simEcalHitsEB->end(); ++hit )
922  if ( hit->geantTrackId() == info.simTrack->genpartIndex() ) ecalTrueEnergy += hit->energy();
923 
924  for( PCaloHitContainer::const_iterator hit = simEcalHitsEE->begin(); hit != simEcalHitsEE->end(); ++hit )
925  if ( hit->geantTrackId() == info.simTrack->genpartIndex() ) ecalTrueEnergy += hit->energy();
926 
927  for( PCaloHitContainer::const_iterator hit = simHcalHits->begin(); hit != simHcalHits->end(); ++hit )
928  if ( hit->geantTrackId() == info.simTrack->genpartIndex() ) hcalTrueEnergy += hit->energy();
929 
930  info.ecalTrueEnergy = ecalTrueEnergy;
931  info.hcalTrueEnergy = hcalTrueEnergy;
932  info.hcalTrueEnergyCorrected = hcalTrueEnergy;
933  if ( fabs(info.trkGlobPosAtHcal.eta()) < 1.3 )
934  info.hcalTrueEnergyCorrected = hcalTrueEnergy*113.2;
935  else
936  if ( fabs(info.trkGlobPosAtHcal.eta()) < 3.0 )
937  info.hcalTrueEnergyCorrected = hcalTrueEnergy*167.2;
938  }
939 }
dictionary parameters
Definition: Parameters.py:2
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
T y() const
Definition: PV3DBase.h:63
math::XYZPoint trkGlobPosAtHcal
FreeTrajectoryState stateAtIP
track info
T z() const
Definition: PV3DBase.h:64
int genpartIndex() const
index of the corresponding Generator particle in the Event container (-1 if no Genpart) ...
Definition: SimTrack.h:33
GlobalVector momentum() const
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
T x() const
Definition: PV3DBase.h:62
const SimTrack * simTrack
MC truth info.
void TrackDetectorAssociator::fillEcal ( const edm::Event iEvent,
TrackDetMatchInfo info,
const AssociatorParameters parameters 
)
private

Definition at line 263 of file TrackDetectorAssociator.cc.

References TrackAssociatorParameters::accountForTrajectoryChangeCalo, TrackDetMatchInfo::crossedEcalIds, TrackDetMatchInfo::crossedEcalRecHits, TrackAssociatorParameters::dREcal, TrackAssociatorParameters::dREcalPreselection, egHLT::errCodes::EBRecHits, TrackAssociatorParameters::EBRecHitsToken, TrackDetMatchInfo::ecalRecHits, egHLT::errCodes::EERecHits, TrackAssociatorParameters::EERecHitsToken, edm::Event::getByToken(), CachedTrajectory::IpToEcal, TrackDetMatchInfo::isGoodEcal, edm::HandleBase::isValid(), and LogTrace.

266 {
267  const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getEcalTrajectory();
268 
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();
273 
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());
277 
278  if(coreTrajectory.empty()) {
279  LogTrace("TrackAssociator") << "ECAL track trajectory is empty; moving on\n";
280  info.isGoodEcal = 0;
281  return;
282  }
283  info.isGoodEcal = 1;
284 
285  // Find ECAL crystals
287  iEvent.getByToken(parameters.EBRecHitsToken, EBRecHits);
288  if (!EBRecHits.isValid()) throw cms::Exception("FatalError") << "Unable to find EBRecHitCollection in the event!\n";
289 
291  iEvent.getByToken(parameters.EERecHitsToken, EERecHits);
292  if (!EERecHits.isValid()) throw cms::Exception("FatalError") << "Unable to find EERecHitCollection in event!\n";
293 
294  std::set<DetId> ecalIdsInRegion;
295  if (parameters.accountForTrajectoryChangeCalo){
296  // get trajectory change with respect to initial state
298  parameters.dREcalPreselection);
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();
302  if (parameters.dREcalPreselection > parameters.dREcal)
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();
308 
309  info.crossedEcalIds = crossedEcalIds;
310 
311  // add EcalRecHits
312  for(std::vector<DetId>::const_iterator itr=crossedEcalIds.begin(); itr!=crossedEcalIds.end();itr++)
313  {
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())
317  info.crossedEcalRecHits.push_back(&*ebHit);
318  else if(eeHit != (*EERecHits).end())
319  info.crossedEcalRecHits.push_back(&*eeHit);
320  else
321  LogTrace("TrackAssociator") << "Crossed EcalRecHit is not found for DetId: " << itr->rawId();
322  }
323  for(std::set<DetId>::const_iterator itr=ecalIdsInRegion.begin(); itr!=ecalIdsInRegion.end();itr++)
324  {
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())
328  info.ecalRecHits.push_back(&*ebHit);
329  else if(eeHit != (*EERecHits).end())
330  info.ecalRecHits.push_back(&*eeHit);
331  else
332  LogTrace("TrackAssociator") << "EcalRecHit from the cone is not found for DetId: " << itr->rawId();
333  }
334 }
dictionary parameters
Definition: Parameters.py:2
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
std::vector< const EcalRecHit * > ecalRecHits
hits in the cone
std::vector< DetId > crossedEcalIds
std::vector< const EcalRecHit * > crossedEcalRecHits
hits in detector elements crossed by a track
const std::vector< SteppingHelixStateInfo > & getEcalTrajectory() const
edm::ESHandle< DetIdAssociator > ecalDetIdAssociator_
std::pair< float, float > trajectoryDelta(TrajectorType)
bool isValid() const
Definition: HandleBase.h:76
#define LogTrace(id)
DetIdAssociator::MapRange getMapRange(const std::pair< float, float > &delta, const float dR)
void TrackDetectorAssociator::fillHcal ( const edm::Event iEvent,
TrackDetMatchInfo info,
const AssociatorParameters parameters 
)
private

Definition at line 423 of file TrackDetectorAssociator.cc.

References TrackAssociatorParameters::accountForTrajectoryChangeCalo, runEdmFileComparison::collection, TrackDetMatchInfo::crossedHcalIds, TrackDetMatchInfo::crossedHcalRecHits, TrackAssociatorParameters::dRHcal, TrackAssociatorParameters::dRHcalPreselection, edm::Event::getByToken(), TrackAssociatorParameters::HBHEcollToken, TrackDetMatchInfo::hcalRecHits, DetIdInfo::info(), CachedTrajectory::IpToHcal, TrackDetMatchInfo::isGoodHcal, edm::HandleBase::isValid(), and LogTrace.

426 {
427  const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHcalTrajectory();
428 
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());
432 
433  if(coreTrajectory.empty()) {
434  LogTrace("TrackAssociator") << "HCAL trajectory is empty; moving on\n";
435  info.isGoodHcal = 0;
436  return;
437  }
438  info.isGoodHcal = 1;
439 
440  // find crossed Hcals
442  iEvent.getByToken(parameters.HBHEcollToken, collection);
443  if ( ! collection.isValid() ) throw cms::Exception("FatalError") << "Unable to find HBHERecHits in event!\n";
444 
445  std::set<DetId> idsInRegion;
446  if (parameters.accountForTrajectoryChangeCalo){
447  // get trajectory change with respect to initial state
449  parameters.dRHcalPreselection);
450  idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
451  } else idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.dRHcalPreselection);
452 
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);
459 
460  info.crossedHcalIds = crossedIds;
461  // add Hcal
462  for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
463  {
464  HBHERecHitCollection::const_iterator hit = (*collection).find(*itr);
465  if( hit != (*collection).end() )
466  info.crossedHcalRecHits.push_back(&*hit);
467  else
468  LogTrace("TrackAssociator") << "Crossed HBHERecHit is not found for DetId: " << itr->rawId();
469  }
470  for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
471  {
472  HBHERecHitCollection::const_iterator hit = (*collection).find(*itr);
473  if( hit != (*collection).end() )
474  info.hcalRecHits.push_back(&*hit);
475  else
476  LogTrace("TrackAssociator") << "HBHERecHit from the cone is not found for DetId: " << itr->rawId();
477  }
478 }
dictionary parameters
Definition: Parameters.py:2
std::vector< const HBHERecHit * > crossedHcalRecHits
const std::vector< SteppingHelixStateInfo > & getHcalTrajectory() const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
std::vector< HBHERecHit >::const_iterator const_iterator
std::vector< DetId > crossedHcalIds
edm::ESHandle< DetIdAssociator > hcalDetIdAssociator_
std::vector< const HBHERecHit * > hcalRecHits
static std::string info(const DetId &)
Definition: DetIdInfo.cc:28
std::pair< float, float > trajectoryDelta(TrajectorType)
bool isValid() const
Definition: HandleBase.h:76
#define LogTrace(id)
DetIdAssociator::MapRange getMapRange(const std::pair< float, float > &delta, const float dR)
void TrackDetectorAssociator::fillHO ( const edm::Event iEvent,
TrackDetMatchInfo info,
const AssociatorParameters parameters 
)
private

Definition at line 480 of file TrackDetectorAssociator.cc.

References TrackAssociatorParameters::accountForTrajectoryChangeCalo, runEdmFileComparison::collection, TrackDetMatchInfo::crossedHOIds, TrackDetMatchInfo::crossedHORecHits, TrackAssociatorParameters::dRHcal, TrackAssociatorParameters::dRHcalPreselection, edm::Event::getByToken(), TrackAssociatorParameters::HOcollToken, TrackDetMatchInfo::hoRecHits, CachedTrajectory::IpToHO, TrackDetMatchInfo::isGoodHO, edm::HandleBase::isValid(), and LogTrace.

483 {
484  const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHOTrajectory();
485 
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());
489 
490  if(coreTrajectory.empty()) {
491  LogTrace("TrackAssociator") << "HO trajectory is empty; moving on\n";
492  info.isGoodHO = 0;
493  return;
494  }
495  info.isGoodHO = 1;
496 
497  // find crossed HOs
499  iEvent.getByToken(parameters.HOcollToken, collection);
500  if ( ! collection.isValid() ) throw cms::Exception("FatalError") << "Unable to find HORecHits in event!\n";
501 
502  std::set<DetId> idsInRegion;
503  if (parameters.accountForTrajectoryChangeCalo){
504  // get trajectory change with respect to initial state
506  parameters.dRHcalPreselection);
507  idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
508  } else idsInRegion = hoDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.dRHcalPreselection);
509 
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);
515 
516  info.crossedHOIds = crossedIds;
517 
518  // add HO
519  for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
520  {
521  HORecHitCollection::const_iterator hit = (*collection).find(*itr);
522  if( hit != (*collection).end() )
523  info.crossedHORecHits.push_back(&*hit);
524  else
525  LogTrace("TrackAssociator") << "Crossed HORecHit is not found for DetId: " << itr->rawId();
526  }
527 
528  for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
529  {
530  HORecHitCollection::const_iterator hit = (*collection).find(*itr);
531  if( hit != (*collection).end() )
532  info.hoRecHits.push_back(&*hit);
533  else
534  LogTrace("TrackAssociator") << "HORecHit from the cone is not found for DetId: " << itr->rawId();
535  }
536 }
dictionary parameters
Definition: Parameters.py:2
const std::vector< SteppingHelixStateInfo > & getHOTrajectory() const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
std::vector< HORecHit >::const_iterator const_iterator
std::vector< DetId > crossedHOIds
std::pair< float, float > trajectoryDelta(TrajectorType)
bool isValid() const
Definition: HandleBase.h:76
#define LogTrace(id)
edm::ESHandle< DetIdAssociator > hoDetIdAssociator_
DetIdAssociator::MapRange getMapRange(const std::pair< float, float > &delta, const float dR)
std::vector< const HORecHit * > crossedHORecHits
std::vector< const HORecHit * > hoRecHits
void TrackDetectorAssociator::fillMuon ( const edm::Event iEvent,
TrackDetMatchInfo info,
const AssociatorParameters parameters 
)
private

Definition at line 721 of file TrackDetectorAssociator.cc.

References TrackDetMatchInfo::chambers, cscSegments_cfi::cscSegments, TrackAssociatorParameters::cscSegmentsToken, TrackAssociatorParameters::dtSegmentsToken, edm::Event::getByToken(), edm::HandleBase::isValid(), and LogTrace.

724 {
725  // Get the segments from the event
727  iEvent.getByToken(parameters.dtSegmentsToken, dtSegments);
728  if (! dtSegments.isValid())
729  throw cms::Exception("FatalError") << "Unable to find DTRecSegment4DCollection in event!\n";
730 
732  iEvent.getByToken(parameters.cscSegmentsToken, cscSegments);
733  if (! cscSegments.isValid())
734  throw cms::Exception("FatalError") << "Unable to find CSCSegmentCollection in event!\n";
735 
737 
738  // check the map of available segments
739  // if there is no segments in a given direction at all,
740  // then there is no point to fly there.
741  //
742  // MISSING
743  // Possible solution: quick search for presence of segments
744  // for the set of DetIds
745 
746  // get a set of matches corresponding to muon chambers
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";
751 
752  // Iterate over all chamber matches and fill segment matching
753  // info if it's available
754  for(std::vector<TAMuonChamberMatch>::iterator matchedChamber = matchedChambers.begin();
755  matchedChamber != matchedChambers.end(); matchedChamber++)
756  {
757  const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet((*matchedChamber).id);
758  // DT chamber
759  if(const DTChamber* chamber = dynamic_cast<const DTChamber*>(geomDet) ) {
760  // Get the range for the corresponding segments
761  DTRecSegment4DCollection::range range = dtSegments->get(chamber->id());
762  // Loop over the segments of this chamber
763  for (DTRecSegment4DCollection::const_iterator segment = range.first; segment!=range.second; segment++) {
764  if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
765  matchedChamber->segments.back().dtSegmentRef = DTRecSegment4DRef(dtSegments, segment - dtSegments->begin());
766  }
767  }
768  }else{
769  // CSC Chamber
770  if(const CSCChamber* chamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
771  // Get the range for the corresponding segments
772  CSCSegmentCollection::range range = cscSegments->get(chamber->id());
773  // Loop over the segments
774  for (CSCSegmentCollection::const_iterator segment = range.first; segment!=range.second; segment++) {
775  if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
776  matchedChamber->segments.back().cscSegmentRef = CSCSegmentRef(cscSegments, segment - cscSegments->begin());
777  }
778  }
779  }else{
780  // throw cms::Exception("FatalError") << "Failed to cast GeomDet object to either DTChamber or CSCChamber. Who is this guy anyway?\n";
781  }
782  }
783  info.chambers.push_back(*matchedChamber);
784  }
785 }
dictionary parameters
Definition: Parameters.py:2
std::pair< const_iterator, const_iterator > range
iterator range
Definition: RangeMap.h:50
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
edm::Ref< CSCSegmentCollection > CSCSegmentRef
bool addTAMuonSegmentMatch(TAMuonChamberMatch &, const RecSegment *, const AssociatorParameters &)
void getTAMuonChamberMatches(std::vector< TAMuonChamberMatch > &matches, const AssociatorParameters &parameters)
std::vector< TAMuonChamberMatch > chambers
bool isValid() const
Definition: HandleBase.h:76
#define LogTrace(id)
edm::Ref< DTRecSegment4DCollection > DTRecSegment4DRef
edm::ESHandle< DetIdAssociator > muonDetIdAssociator_
void TrackDetectorAssociator::fillPreshower ( const edm::Event iEvent,
TrackDetMatchInfo info,
const AssociatorParameters parameters 
)
private

Definition at line 398 of file TrackDetectorAssociator.cc.

References TrackDetMatchInfo::crossedPreshowerIds, TrackAssociatorParameters::dRPreshowerPreselection, and LogTrace.

401 {
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());
406 
407  if(trajectory.empty()) {
408  LogTrace("TrackAssociator") << "Preshower trajectory is empty; moving on\n";
409  return;
410  }
411 
412  std::set<DetId> idsInRegion =
413  preshowerDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0],
414  parameters.dRPreshowerPreselection);
415 
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();
419  info.crossedPreshowerIds = crossedIds;
420 }
std::vector< DetId > crossedPreshowerIds
dictionary parameters
Definition: Parameters.py:2
const std::vector< SteppingHelixStateInfo > & getPreshowerTrajectory() const
#define LogTrace(id)
edm::ESHandle< DetIdAssociator > preshowerDetIdAssociator_
const CachedTrajectory& TrackDetectorAssociator::getCachedTrajector ( ) const
inline

trajector information

Definition at line 102 of file TrackDetectorAssociator.h.

References cachedTrajectory_.

Referenced by MuonCaloDistanceProducer::fillDistanceMap().

103  {return cachedTrajectory_;}
FreeTrajectoryState TrackDetectorAssociator::getFreeTrajectoryState ( const edm::EventSetup iSetup,
const reco::Track track 
)
static

get FreeTrajectoryState from different track representations

Definition at line 571 of file TrackDetectorAssociator.cc.

References ecalTB2006H4_GenSimDigiReco_cfg::bField, reco::TrackBase::charge(), alignCSCRings::e, edm::EventSetup::get(), reco::TrackBase::momentum(), point, and reco::TrackBase::vertex().

Referenced by BetaCalculatorECAL::addInfoToCandidate(), EopTreeWriter::analyze(), IsolatedTracksCone::analyze(), spr::chargeIsolation(), spr::chargeIsolationEcal(), spr::chargeIsolationHcal(), spr::coneChargeIsolation(), cms::MuonMETValueMapProducer::determine_deltax_deltay(), InterestingTrackEcalDetIdProducer::produce(), and AlCaIsoTracksProducer::produce().

573 {
575  iSetup.get<IdealMagneticFieldRecord>().get(bField);
576 
577  GlobalVector vector( track.momentum().x(), track.momentum().y(), track.momentum().z() );
578 
579  GlobalPoint point( track.vertex().x(), track.vertex().y(), track.vertex().z() );
580 
581  GlobalTrajectoryParameters tPars(point, vector, track.charge(), &*bField);
582 
583  // FIX THIS !!!
584  // need to convert from perigee to global or helix (curvilinear) frame
585  // for now just an arbitrary matrix.
586  ROOT::Math::SMatrixIdentity id;
587  AlgebraicSymMatrix66 covT(id); covT *= 1e-6; // initialize to sigma=1e-3
588  CartesianTrajectoryError tCov(covT);
589 
590  return FreeTrajectoryState(tPars, tCov);
591 }
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepSym< double, 6 > > AlgebraicSymMatrix66
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:723
const Point & vertex() const
reference point on the track. This method is DEPRECATED, please use referencePoint() instead ...
Definition: TrackBase.h:735
const T & get() const
Definition: EventSetup.h:55
int charge() const
track electric charge
Definition: TrackBase.h:615
*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
Definition: invegas.h:5
FreeTrajectoryState TrackDetectorAssociator::getFreeTrajectoryState ( const edm::EventSetup iSetup,
const SimTrack track,
const SimVertex vertex 
)
static

Definition at line 538 of file TrackDetectorAssociator.cc.

References funct::abs(), CoreSimTrack::momentum(), point, CoreSimVertex::position(), and CoreSimTrack::type().

541 {
542  GlobalVector vector( track.momentum().x(), track.momentum().y(), track.momentum().z() );
543  GlobalPoint point( vertex.position().x(), vertex.position().y(), vertex.position().z() );
544 
545  int charge = track.type( )> 0 ? -1 : 1; // lepton convention
546  if ( abs(track.type( )) == 211 || // pion
547  abs(track.type( )) == 321 || // kaon
548  abs(track.type( )) == 2212 )
549  charge = track.type( )< 0 ? -1 : 1;
550  return getFreeTrajectoryState(iSetup, vector, point, charge);
551 }
static FreeTrajectoryState getFreeTrajectoryState(const edm::EventSetup &, const reco::Track &)
get FreeTrajectoryState from different track representations
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const math::XYZTLorentzVectorD & position() const
Definition: CoreSimVertex.h:26
int type() const
particle type (HEP PDT convension)
Definition: CoreSimTrack.h:25
const math::XYZTLorentzVectorD & momentum() const
Definition: CoreSimTrack.h:22
*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
Definition: invegas.h:5
FreeTrajectoryState TrackDetectorAssociator::getFreeTrajectoryState ( const edm::EventSetup iSetup,
const GlobalVector momentum,
const GlobalPoint vertex,
const int  charge 
)
static

Definition at line 553 of file TrackDetectorAssociator.cc.

References ecalTB2006H4_GenSimDigiReco_cfg::bField, alignCSCRings::e, and edm::EventSetup::get().

557 {
559  iSetup.get<IdealMagneticFieldRecord>().get(bField);
560 
561  GlobalTrajectoryParameters tPars(vertex, momentum, charge, &*bField);
562 
563  ROOT::Math::SMatrixIdentity id;
564  AlgebraicSymMatrix66 covT(id); covT *= 1e-6; // initialize to sigma=1e-3
565  CartesianTrajectoryError tCov(covT);
566 
567  return FreeTrajectoryState(tPars, tCov);
568 }
ROOT::Math::SMatrix< double, 6, 6, ROOT::Math::MatRepSym< double, 6 > > AlgebraicSymMatrix66
const T & get() const
Definition: EventSetup.h:55
DetIdAssociator::MapRange TrackDetectorAssociator::getMapRange ( const std::pair< float, float > &  delta,
const float  dR 
)
private

Definition at line 593 of file TrackDetectorAssociator.cc.

References DetIdAssociator::MapRange::dPhiMinus, DetIdAssociator::MapRange::dPhiPlus, PFRecoTauDiscriminationAgainstElectronDeadECAL_cfi::dR, DetIdAssociator::MapRange::dThetaMinus, DetIdAssociator::MapRange::dThetaPlus, and LogTrace.

595 {
596  DetIdAssociator::MapRange mapRange;
597  mapRange.dThetaPlus = dR;
598  mapRange.dThetaMinus = dR;
599  mapRange.dPhiPlus = dR;
600  mapRange.dPhiMinus = dR;
601  if ( delta.first > 0 )
602  mapRange.dThetaPlus += delta.first;
603  else
604  mapRange.dThetaMinus += fabs(delta.first);
605  if ( delta.second > 0 )
606  mapRange.dPhiPlus += delta.second;
607  else
608  mapRange.dPhiMinus += fabs(delta.second);
609  LogTrace("TrackAssociator") << "Selection range: (dThetaPlus, dThetaMinus, dPhiPlus, dPhiMinus, dRPreselection): " <<
610  mapRange.dThetaPlus << ", " << mapRange.dThetaMinus << ", " <<
611  mapRange.dPhiPlus << ", " << mapRange.dPhiMinus << ", " << dR;
612  return mapRange;
613 }
dbl * delta
Definition: mlp_gen.cc:36
#define LogTrace(id)
math::XYZPoint TrackDetectorAssociator::getPoint ( const GlobalPoint point)
inlineprivate

Definition at line 165 of file TrackDetectorAssociator.h.

References point.

166  {
167  return math::XYZPoint(point.x(),point.y(),point.z());
168  }
T y() const
Definition: PV3DBase.h:63
T z() const
Definition: PV3DBase.h:64
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
T x() const
Definition: PV3DBase.h:62
math::XYZPoint TrackDetectorAssociator::getPoint ( const LocalPoint point)
inlineprivate

Definition at line 170 of file TrackDetectorAssociator.h.

References point.

171  {
172  return math::XYZPoint(point.x(),point.y(),point.z());
173  }
T y() const
Definition: PV3DBase.h:63
T z() const
Definition: PV3DBase.h:64
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
T x() const
Definition: PV3DBase.h:62
void TrackDetectorAssociator::getTAMuonChamberMatches ( std::vector< TAMuonChamberMatch > &  matches,
const AssociatorParameters parameters 
)
private

Definition at line 615 of file TrackDetectorAssociator.cc.

References Surface::bounds(), TrackAssociatorParameters::dRMuonPreselection, TrajectoryStateOnSurface::freeState(), CachedTrajectory::FullTrajectory, TAMuonChamberMatch::id, DetIdInfo::info(), TrajectoryStateOnSurface::isValid(), SteppingHelixStateInfo::isValid(), Bounds::length(), CSCWireTopology::lengthOfPlane(), TAMuonChamberMatch::localDistanceX, TAMuonChamberMatch::localDistanceY, TrajectoryStateOnSurface::localError(), LogTrace, match(), SteppingHelixStateInfo::momentum(), TrackAssociatorParameters::muonMaxDistanceSigmaX, TrackAssociatorParameters::muonMaxDistanceSigmaY, TrackAssociatorParameters::muonMaxDistanceX, TrackAssociatorParameters::muonMaxDistanceY, CSCWireTopology::narrowWidthOfPlane(), CSCChamberSpecs::oddLayerGeometry(), SteppingHelixStateInfo::position(), FreeTrajectoryState::position(), LocalTrajectoryError::positionError(), mathSSE::sqrt(), GeomDet::surface(), GloballyPositioned< T >::toLocal(), TAMuonChamberMatch::tState, Vector3DBase< T, FrameTag >::unit(), CSCWireTopology::wideWidthOfPlane(), Bounds::width(), CSCWireTopology::wireAngle(), CSCLayerGeometry::wireTopology(), PV3DBase< T, PVType, FrameType >::x(), LocalError::xx(), PV3DBase< T, PVType, FrameType >::y(), CSCWireTopology::yOfWire(), and LocalError::yy().

617 {
618  // Strategy:
619  // Propagate through the whole detector, estimate change in eta and phi
620  // along the trajectory, add this to dRMuon and find DetIds around this
621  // direction using the map. Then propagate fast to each surface and apply
622  // final matching criteria.
623 
624  // get the direction first
626  // If trajectory point at HCAL is not valid, try to use the outer most state of the
627  // trajectory instead.
628  if(! trajectoryPoint.isValid() ) trajectoryPoint = cachedTrajectory_.getOuterState();
629  if(! trajectoryPoint.isValid() ) {
630  LogTrace("TrackAssociator") <<
631  "trajectory position at HCAL is not valid. Assume the track cannot reach muon detectors and skip it";
632  return;
633  }
634 
635  GlobalVector direction = trajectoryPoint.momentum().unit();
636  LogTrace("TrackAssociator") << "muon direction: " << direction << "\n\t and corresponding point: " <<
637  trajectoryPoint.position() <<"\n";
638 
640  parameters.dRMuonPreselection);
641 
642  // and find chamber DetIds
643 
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++)
648  {
649  const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet(*detId);
650  TrajectoryStateOnSurface stateOnSurface = cachedTrajectory_.propagate( &geomDet->surface() );
651  if (! stateOnSurface.isValid()) {
652  LogTrace("TrackAssociator") << "Failed to propagate the track; moving on\n\t"<<
653  "Element is not crosssed: " << DetIdInfo::info(*detId) << "\n";
654  continue;
655  }
656  LocalPoint localPoint = geomDet->surface().toLocal(stateOnSurface.freeState()->position());
657  LocalError localError = stateOnSurface.localError().positionError();
658  float distanceX = 0;
659  float distanceY = 0;
660  float sigmaX = 0.0;
661  float sigmaY = 0.0;
662  if(const CSCChamber* cscChamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
663  const CSCChamberSpecs* chamberSpecs = cscChamber->specs();
664  if(! chamberSpecs) {
665  LogTrace("TrackAssociator") << "Failed to get CSCChamberSpecs from CSCChamber; moving on\n";
666  continue;
667  }
668  const CSCLayerGeometry* layerGeometry = chamberSpecs->oddLayerGeometry(1);
669  if(! layerGeometry) {
670  LogTrace("TrackAssociator") << "Failed to get CSCLayerGeometry from CSCChamberSpecs; moving on\n";
671  continue;
672  }
673  const CSCWireTopology* wireTopology = layerGeometry->wireTopology();
674  if(! wireTopology) {
675  LogTrace("TrackAssociator") << "Failed to get CSCWireTopology from CSCLayerGeometry; moving on\n";
676  continue;
677  }
678 
679  float wideWidth = wireTopology->wideWidthOfPlane();
680  float narrowWidth = wireTopology->narrowWidthOfPlane();
681  float length = wireTopology->lengthOfPlane();
682  // If slanted, there is no y offset between local origin and symmetry center of wire plane
683  float yOfFirstWire = fabs(wireTopology->wireAngle())>1.E-06 ? -0.5*length : wireTopology->yOfWire(1);
684  // y offset between local origin and symmetry center of wire plane
685  float yCOWPOffset = yOfFirstWire+0.5*length;
686 
687  // tangent of the incline angle from inside the trapezoid
688  float tangent = (wideWidth-narrowWidth)/(2.*length);
689  // y position wrt bottom of trapezoid
690  float yPrime = localPoint.y()+fabs(yOfFirstWire);
691  // half trapezoid width at y' is 0.5 * narrowWidth + x side of triangle with the above tangent and side y'
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());
697  } else {
698  distanceX = fabs(localPoint.x()) - geomDet->surface().bounds().width()/2.;
699  distanceY = fabs(localPoint.y()) - geomDet->surface().bounds().length()/2.;
700  sigmaX = distanceX/sqrt(localError.xx());
701  sigmaY = distanceY/sqrt(localError.yy());
702  }
703  if ( (distanceX < parameters.muonMaxDistanceX && distanceY < parameters.muonMaxDistanceY) ||
704  (sigmaX < parameters.muonMaxDistanceSigmaX && sigmaY < parameters.muonMaxDistanceSigmaY) ) {
705  LogTrace("TrackAssociator") << "found a match: " << DetIdInfo::info(*detId) << "\n";
707  match.tState = stateOnSurface;
708  match.localDistanceX = distanceX;
709  match.localDistanceY = distanceY;
710  match.id = *detId;
711  matches.push_back(match);
712  } else {
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";
716  }
717  }
718 
719 }
float xx() const
Definition: LocalError.h:24
dictionary parameters
Definition: Parameters.py:2
const CSCWireTopology * wireTopology() const
virtual float length() const =0
TrajectoryStateOnSurface tState
T y() const
Definition: PV3DBase.h:63
const Bounds & bounds() const
Definition: Surface.h:128
GlobalVector momentum() const
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:40
LocalError positionError() const
float wireAngle() const
float yy() const
Definition: LocalError.h:26
GlobalPoint position() const
T sqrt(T t)
Definition: SSEVec.h:48
LocalPoint toLocal(const GlobalPoint &gp) const
FreeTrajectoryState const * freeState(bool withErrors=true) const
static std::string info(const DetId &)
Definition: DetIdInfo.cc:28
double lengthOfPlane() const
std::pair< float, float > trajectoryDelta(TrajectorType)
const LocalTrajectoryError & localError() const
float yOfWire(float wire, float x=0.) const
#define LogTrace(id)
double narrowWidthOfPlane() const
SteppingHelixStateInfo getOuterState()
Vector3DBase unit() const
Definition: Vector3DBase.h:57
GlobalPoint position() const
void propagate(SteppingHelixStateInfo &state, const Plane &plane)
double wideWidthOfPlane() const
const CSCLayerGeometry * oddLayerGeometry(int iendcap) const
Accessors for LayerGeometry&#39;s.
DetIdAssociator::MapRange getMapRange(const std::pair< float, float > &delta, const float dR)
edm::ESHandle< DetIdAssociator > muonDetIdAssociator_
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:6
T x() const
Definition: PV3DBase.h:62
virtual float width() const =0
SteppingHelixStateInfo getStateAtHcal()
math::XYZVector TrackDetectorAssociator::getVector ( const GlobalVector vec)
inlineprivate

Definition at line 175 of file TrackDetectorAssociator.h.

176  {
177  return math::XYZVector(vec.x(),vec.y(),vec.z());
178  }
T y() const
Definition: PV3DBase.h:63
T z() const
Definition: PV3DBase.h:64
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
T x() const
Definition: PV3DBase.h:62
math::XYZVector TrackDetectorAssociator::getVector ( const LocalVector vec)
inlineprivate

Definition at line 180 of file TrackDetectorAssociator.h.

181  {
182  return math::XYZVector(vec.x(),vec.y(),vec.z());
183  }
T y() const
Definition: PV3DBase.h:63
T z() const
Definition: PV3DBase.h:64
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
T x() const
Definition: PV3DBase.h:62
void TrackDetectorAssociator::init ( const edm::EventSetup iSetup)
private

Definition at line 123 of file TrackDetectorAssociator.cc.

References anyDirection, SteppingHelixPropagator::applyRadX0Correction(), ecalTB2006H4_GenSimDigiReco_cfg::bField, edm::EventSetup::get(), SteppingHelixPropagator::setMaterialMode(), and SteppingHelixPropagator_cfi::SteppingHelixPropagator.

124 {
125  // access the calorimeter geometry
126  iSetup.get<CaloGeometryRecord>().get(theCaloGeometry_);
127  if (!theCaloGeometry_.isValid())
128  throw cms::Exception("FatalError") << "Unable to find CaloGeometryRecord in event!\n";
129 
130  // get the tracking Geometry
133  throw cms::Exception("FatalError") << "Unable to find GlobalTrackingGeometryRecord in event!\n";
134 
136  // setup propagator
138  iSetup.get<IdealMagneticFieldRecord>().get(bField);
139 
141  prop->setMaterialMode(false);
142  prop->applyRadX0Correction(true);
143  // prop->setDebug(true); // tmp
144  defProp_ = prop;
146  }
147 
148  iSetup.get<DetIdAssociatorRecord>().get("EcalDetIdAssociator", ecalDetIdAssociator_);
149  iSetup.get<DetIdAssociatorRecord>().get("HcalDetIdAssociator", hcalDetIdAssociator_);
150  iSetup.get<DetIdAssociatorRecord>().get("HODetIdAssociator", hoDetIdAssociator_);
151  iSetup.get<DetIdAssociatorRecord>().get("CaloDetIdAssociator", caloDetIdAssociator_);
152  iSetup.get<DetIdAssociatorRecord>().get("MuonDetIdAssociator", muonDetIdAssociator_);
153  iSetup.get<DetIdAssociatorRecord>().get("PreshowerDetIdAssociator", preshowerDetIdAssociator_);
154 }
edm::ESWatcher< IdealMagneticFieldRecord > theMagneticFeildWatcher_
edm::ESHandle< DetIdAssociator > hcalDetIdAssociator_
void setPropagator(const Propagator *)
use a user configured propagator
void applyRadX0Correction(bool applyRadX0Correction)
edm::ESHandle< CaloGeometry > theCaloGeometry_
edm::ESHandle< DetIdAssociator > ecalDetIdAssociator_
edm::ESHandle< DetIdAssociator > hoDetIdAssociator_
const T & get() const
Definition: EventSetup.h:55
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
edm::ESHandle< DetIdAssociator > muonDetIdAssociator_
edm::ESHandle< DetIdAssociator > preshowerDetIdAssociator_
bool isValid() const
Definition: ESHandle.h:47
edm::ESHandle< DetIdAssociator > caloDetIdAssociator_
edm::ESHandle< GlobalTrackingGeometry > theTrackingGeometry_
void setMaterialMode(bool noMaterial)
Switch for material effects mode: no material effects if true.
void TrackDetectorAssociator::setPropagator ( const Propagator ptr)

use a user configured propagator

Definition at line 111 of file TrackDetectorAssociator.cc.

Referenced by muonisolation::JetExtractor::deposit(), muonisolation::CaloExtractorByAssociator::deposits(), and MuonIdProducer::init().

112 {
113  ivProp_ = ptr;
115 }
void setPropagator(const Propagator *ptr)
void TrackDetectorAssociator::useDefaultPropagator ( )

Member Data Documentation

CachedTrajectory TrackDetectorAssociator::cachedTrajectory_
private

Definition at line 187 of file TrackDetectorAssociator.h.

Referenced by getCachedTrajector().

edm::ESHandle<DetIdAssociator> TrackDetectorAssociator::caloDetIdAssociator_
private

Definition at line 193 of file TrackDetectorAssociator.h.

Propagator* TrackDetectorAssociator::defProp_
private

Definition at line 186 of file TrackDetectorAssociator.h.

edm::ESHandle<DetIdAssociator> TrackDetectorAssociator::ecalDetIdAssociator_
private

Definition at line 190 of file TrackDetectorAssociator.h.

edm::ESHandle<DetIdAssociator> TrackDetectorAssociator::hcalDetIdAssociator_
private

Definition at line 191 of file TrackDetectorAssociator.h.

edm::ESHandle<DetIdAssociator> TrackDetectorAssociator::hoDetIdAssociator_
private

Definition at line 192 of file TrackDetectorAssociator.h.

const Propagator* TrackDetectorAssociator::ivProp_
private

Definition at line 185 of file TrackDetectorAssociator.h.

edm::ESHandle<DetIdAssociator> TrackDetectorAssociator::muonDetIdAssociator_
private

Definition at line 194 of file TrackDetectorAssociator.h.

edm::ESHandle<DetIdAssociator> TrackDetectorAssociator::preshowerDetIdAssociator_
private

Definition at line 195 of file TrackDetectorAssociator.h.

edm::ESHandle<CaloGeometry> TrackDetectorAssociator::theCaloGeometry_
private

Definition at line 197 of file TrackDetectorAssociator.h.

edm::ESWatcher<IdealMagneticFieldRecord> TrackDetectorAssociator::theMagneticFeildWatcher_
private

Definition at line 200 of file TrackDetectorAssociator.h.

edm::ESHandle<GlobalTrackingGeometry> TrackDetectorAssociator::theTrackingGeometry_
private

Definition at line 198 of file TrackDetectorAssociator.h.

bool TrackDetectorAssociator::useDefaultPropagator_
private

Definition at line 188 of file TrackDetectorAssociator.h.