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 790 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().

793 {
794  LogTrace("TrackAssociator")
795  << "Segment local position: " << segment->localPosition() << "\n"
796  << std::hex << segment->geographicalId().rawId() << "\n";
797 
798  const GeomDet* chamber = muonDetIdAssociator_->getGeomDet(matchedChamber.id);
799  TrajectoryStateOnSurface trajectoryStateOnSurface = matchedChamber.tState;
800  GlobalPoint segmentGlobalPosition = chamber->toGlobal(segment->localPosition());
801 
802  LogTrace("TrackAssociator")
803  << "Segment global position: " << segmentGlobalPosition << " \t (R_xy,eta,phi): "
804  << segmentGlobalPosition.perp() << "," << segmentGlobalPosition.eta() << "," << segmentGlobalPosition.phi() << "\n";
805 
806  LogTrace("TrackAssociator")
807  << "\teta hit: " << segmentGlobalPosition.eta() << " \tpropagator: " << trajectoryStateOnSurface.freeState()->position().eta() << "\n"
808  << "\tphi hit: " << segmentGlobalPosition.phi() << " \tpropagator: " << trajectoryStateOnSurface.freeState()->position().phi() << std::endl;
809 
810  bool isGood = false;
811  bool isDTWithoutY = false;
812  const DTRecSegment4D* dtseg = dynamic_cast<const DTRecSegment4D*>(segment);
813  if ( dtseg && (! dtseg->hasZed()) )
814  isDTWithoutY = true;
815 
816  double deltaPhi(fabs(segmentGlobalPosition.phi()-trajectoryStateOnSurface.freeState()->position().phi()));
817  if(deltaPhi>M_PI) deltaPhi = fabs(deltaPhi-M_PI*2.);
818 
819  if( isDTWithoutY )
820  {
821  isGood = deltaPhi < parameters.dRMuon;
822  // Be in chamber
823  isGood &= fabs(segmentGlobalPosition.eta()-trajectoryStateOnSurface.freeState()->position().eta()) < .3;
824  } else isGood = sqrt( pow(segmentGlobalPosition.eta()-trajectoryStateOnSurface.freeState()->position().eta(),2) +
825  deltaPhi*deltaPhi) < parameters.dRMuon;
826 
827  if(isGood) {
828  TAMuonSegmentMatch muonSegment;
829  muonSegment.segmentGlobalPosition = getPoint(segmentGlobalPosition);
830  muonSegment.segmentLocalPosition = getPoint( segment->localPosition() );
831  muonSegment.segmentLocalDirection = getVector( segment->localDirection() );
832  muonSegment.segmentLocalErrorXX = segment->localPositionError().xx();
833  muonSegment.segmentLocalErrorYY = segment->localPositionError().yy();
834  muonSegment.segmentLocalErrorXY = segment->localPositionError().xy();
835  muonSegment.segmentLocalErrorDxDz = segment->localDirectionError().xx();
836  muonSegment.segmentLocalErrorDyDz = segment->localDirectionError().yy();
837 
838  // DANGEROUS - compiler cannot guaranty parameters ordering
839  // AlgebraicSymMatrix segmentCovMatrix = segment->parametersError();
840  // muonSegment.segmentLocalErrorXDxDz = segmentCovMatrix[2][0];
841  // muonSegment.segmentLocalErrorYDyDz = segmentCovMatrix[3][1];
842  muonSegment.segmentLocalErrorXDxDz = -999;
843  muonSegment.segmentLocalErrorYDyDz = -999;
844  muonSegment.hasZed = true;
845  muonSegment.hasPhi = true;
846 
847  // timing information
848  muonSegment.t0 = 0;
849  if ( dtseg ) {
850  if ( (dtseg->hasPhi()) && (! isDTWithoutY) ) {
851  int phiHits = dtseg->phiSegment()->specificRecHits().size();
852  // int zHits = dtseg->zSegment()->specificRecHits().size();
853  int hits=0;
854  double t0=0.;
855  // TODO: cuts on hit numbers not optimized in any way yet...
856  if (phiHits>5 && dtseg->phiSegment()->ist0Valid()) {
857  t0+=dtseg->phiSegment()->t0()*phiHits;
858  hits+=phiHits;
859  LogTrace("TrackAssociator") << " Phi t0: " << dtseg->phiSegment()->t0() << " hits: " << phiHits;
860  }
861  // the z segments seem to contain little useful information...
862 // if (zHits>3) {
863 // t0+=s->zSegment()->t0()*zHits;
864 // hits+=zHits;
865 // std::cout << " Z t0: " << s->zSegment()->t0() << " hits: " << zHits << std::endl;
866 // }
867  if (hits) muonSegment.t0 = t0/hits;
868 // std::cout << " --- t0: " << muonSegment.t0 << std::endl;
869  } else {
870  // check and set dimensionality
871  if (isDTWithoutY) muonSegment.hasZed = false;
872  if (! dtseg->hasPhi()) muonSegment.hasPhi = false;
873  }
874  }
875  matchedChamber.segments.push_back(muonSegment);
876  }
877 
878  return isGood;
879 }
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(), 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 Exception, HLT_25ns14e33_v1_cff::fillCaloTowers, info(), init, edm::detail::isnan(), LogTrace, PV3DBase< T, PVType, FrameType >::mag(), CosmicsPD_Skims::maxZ, HLT_25ns14e33_v1_cff::minR, SteppingHelixStateInfo::momentum(), or, 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, PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), 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 ( trackOrigin.momentum().mag() == 0 ) return info;
237  if ( std::isnan(trackOrigin.momentum().x()) or std::isnan(trackOrigin.momentum().y()) or std::isnan(trackOrigin.momentum().z()) ) return info;
238  if ( ! cachedTrajectory_.propagateAll(trackOrigin) ) return info;
239 
240  // get trajectory in calorimeters
245 
249 
253 
254  if (parameters.useEcal) fillEcal( iEvent, info, parameters);
255  if (parameters.useCalo) fillCaloTowers( 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);
261 
262  return info;
263 }
SteppingHelixStateInfo getStateAtHO()
math::XYZPoint trkGlobPosAtHO
dictionary parameters
Definition: Parameters.py:2
static const TGPicture * info(bool iBackgroundIsBlack)
T perp() const
Definition: PV3DBase.h:72
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
Definition: Activities.doc:12
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
bool isnan(float x)
Definition: math.h:13
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 943 of file TrackDetectorAssociator.cc.

References ecalTB2006H4_GenSimDigiReco_cfg::bField, 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().

948 {
949  double currentStepSize = cachedTrajectory_.getPropagationStep();
950 
952  iSetup.get<IdealMagneticFieldRecord>().get(bField);
953 
954  if(track.extra().isNull()) {
955  if ( direction != InsideOut )
956  throw cms::Exception("FatalError") <<
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); // 5th argument is null pointer
962  }
963 
964  LogTrace("TrackAssociator") << "Track Extras found\n";
967  FreeTrajectoryState referenceState = trajectoryStateTransform::initialFreeState(track,&*bField);
968 
969  LogTrace("TrackAssociator") << "inner track state (rho, z, phi):" <<
970  track.innerPosition().Rho() << ", " << track.innerPosition().z() <<
971  ", " << track.innerPosition().phi() << "\n";
972  LogTrace("TrackAssociator") << "innerFreeState (rho, z, phi):" <<
973  innerState.position().perp() << ", " << innerState.position().z() <<
974  ", " << innerState.position().phi() << "\n";
975 
976  LogTrace("TrackAssociator") << "outer track state (rho, z, phi):" <<
977  track.outerPosition().Rho() << ", " << track.outerPosition().z() <<
978  ", " << track.outerPosition().phi() << "\n";
979  LogTrace("TrackAssociator") << "outerFreeState (rho, z, phi):" <<
980  outerState.position().perp() << ", " << outerState.position().z() <<
981  ", " << outerState.position().phi() << "\n";
982 
983  // InsideOut first
984  if ( crossedIP( track ) ) {
985  switch ( direction ) {
986  case InsideOut:
987  case Any:
988  return associate(iEvent, iSetup, parameters, &referenceState, &outerState);
989  break;
990  case OutsideIn:
991  {
992  cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
993  TrackDetMatchInfo result = associate(iEvent, iSetup, parameters, &innerState, &referenceState);
994  cachedTrajectory_.setPropagationStep( currentStepSize );
995  return result;
996  break;
997  }
998  }
999  } else {
1000  switch ( direction ) {
1001  case InsideOut:
1002  return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1003  break;
1004  case OutsideIn:
1005  {
1006  cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1007  TrackDetMatchInfo result = associate(iEvent, iSetup, parameters, &outerState, &innerState);
1008  cachedTrajectory_.setPropagationStep( currentStepSize );
1009  return result;
1010  break;
1011  }
1012  case Any:
1013  {
1014  // check if we deal with clear outside-in case
1015  if ( track.innerPosition().Dot( track.innerMomentum() ) < 0 &&
1016  track.outerPosition().Dot( track.outerMomentum() ) < 0 )
1017  {
1018  cachedTrajectory_.setPropagationStep( -fabs(currentStepSize) );
1020  if ( track.innerPosition().R() < track.outerPosition().R() )
1021  result = associate(iEvent, iSetup, parameters, &innerState, &outerState);
1022  else
1023  result = associate(iEvent, iSetup, parameters, &outerState, &innerState);
1024  cachedTrajectory_.setPropagationStep( currentStepSize );
1025  return result;
1026  }
1027  }
1028  }
1029  }
1030 
1031  // all other cases
1032  return associate(iEvent, iSetup, parameters, &innerState, &outerState);
1033 }
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:249
#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 1035 of file TrackDetectorAssociator.cc.

1040 {
1041  return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, track, vertex), parameters);
1042 }
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 1044 of file TrackDetectorAssociator.cc.

1050 {
1051  return associate(iEvent, iSetup, getFreeTrajectoryState(iSetup, momentum, vertex, charge), parameters);
1052 }
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 1054 of file TrackDetectorAssociator.cc.

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

Referenced by MuonIdProducer::produce().

1055 {
1056  bool crossed = true;
1057  crossed &= (track.innerPosition().rho() > 3 ); // something close to active volume
1058  crossed &= (track.outerPosition().rho() > 3 ); // something close to active volume
1059  crossed &= ( ( track.innerPosition().x()*track.innerMomentum().x() +
1060  track.innerPosition().y()*track.innerMomentum().y() < 0 ) !=
1061  ( track.outerPosition().x()*track.outerMomentum().x() +
1062  track.outerPosition().y()*track.outerMomentum().y() < 0 ) );
1063  return crossed;
1064 }
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 338 of file TrackDetectorAssociator.cc.

References TrackAssociatorParameters::accountForTrajectoryChangeCalo, HLT_25ns14e33_v1_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.

341 {
342  // use ECAL and HCAL trajectories to match a tower. (HO isn't used for matching).
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());
350 
351  if(trajectory.empty()) {
352  LogTrace("TrackAssociator") << "HCAL trajectory is empty; moving on\n";
353  info.isGoodCalo = 0;
354  return;
355  }
356  info.isGoodCalo = 1;
357 
358  // find crossed CaloTowers
360  iEvent.getByToken(parameters.caloTowersToken, caloTowers);
361  if (!caloTowers.isValid()) throw cms::Exception("FatalError") << "Unable to find CaloTowers in event!\n";
362 
363  std::set<DetId> caloTowerIdsInRegion;
364  if (parameters.accountForTrajectoryChangeCalo){
365  // get trajectory change with respect to initial state
367  parameters.dRHcalPreselection);
368  caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0],mapRange);
369  } else caloTowerIdsInRegion = caloDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0], parameters.dRHcalPreselection);
370 
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();
376 
377  info.crossedTowerIds = crossedCaloTowerIds;
378 
379  // add CaloTowers
380  for(std::vector<DetId>::const_iterator itr=crossedCaloTowerIds.begin(); itr!=crossedCaloTowerIds.end();itr++)
381  {
382  CaloTowerCollection::const_iterator tower = (*caloTowers).find(*itr);
383  if(tower != (*caloTowers).end())
384  info.crossedTowers.push_back(&*tower);
385  else
386  LogTrace("TrackAssociator") << "Crossed CaloTower is not found for DetId: " << (*itr).rawId();
387  }
388 
389  for(std::set<DetId>::const_iterator itr=caloTowerIdsInACone.begin(); itr!=caloTowerIdsInACone.end();itr++)
390  {
391  CaloTowerCollection::const_iterator tower = (*caloTowers).find(*itr);
392  if(tower != (*caloTowers).end())
393  info.towers.push_back(&*tower);
394  else
395  LogTrace("TrackAssociator") << "CaloTower from the cone is not found for DetId: " << (*itr).rawId();
396  }
397 
398 }
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:457
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:75
#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 883 of file TrackDetectorAssociator.cc.

References HLT_25ns14e33_v1_cff::DeltaR, 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().

886 {
887  // get list of simulated tracks and their vertices
888  using namespace edm;
889  Handle<SimTrackContainer> simTracks;
890  iEvent.getByToken(parameters.simTracksToken, simTracks);
891  if (! simTracks.isValid() ) throw cms::Exception("FatalError") << "No simulated tracks found\n";
892 
893  Handle<SimVertexContainer> simVertices;
894  iEvent.getByToken(parameters.simVerticesToken, simVertices);
895  if (! simVertices.isValid() ) throw cms::Exception("FatalError") << "No simulated vertices found\n";
896 
897  // get sim calo hits
898  Handle<PCaloHitContainer> simEcalHitsEB;
899  iEvent.getByToken(parameters.simEcalHitsEBToken, simEcalHitsEB);
900  if (! simEcalHitsEB.isValid() ) throw cms::Exception("FatalError") << "No simulated ECAL EB hits found\n";
901 
902  Handle<PCaloHitContainer> simEcalHitsEE;
903  iEvent.getByToken(parameters.simEcalHitsEEToken, simEcalHitsEE);
904  if (! simEcalHitsEE.isValid() ) throw cms::Exception("FatalError") << "No simulated ECAL EE hits found\n";
905 
906  Handle<PCaloHitContainer> simHcalHits;
907  iEvent.getByToken(parameters.simHcalHitsToken, simHcalHits);
908  if (! simHcalHits.isValid() ) throw cms::Exception("FatalError") << "No simulated HCAL hits found\n";
909 
910  // find truth partner
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() );
914  math::XYZVector recoP3( info.stateAtIP.momentum().x(), info.stateAtIP.momentum().y(), info.stateAtIP.momentum().z() );
915  if ( ROOT::Math::VectorUtil::DeltaR(recoP3, simP3) < 0.1 ) break;
916  }
917  if ( simTrack != simTracks->end() ) {
918  info.simTrack = &(*simTrack);
919  double ecalTrueEnergy(0);
920  double hcalTrueEnergy(0);
921 
922  // loop over calo hits
923  for( PCaloHitContainer::const_iterator hit = simEcalHitsEB->begin(); hit != simEcalHitsEB->end(); ++hit )
924  if ( hit->geantTrackId() == info.simTrack->genpartIndex() ) ecalTrueEnergy += hit->energy();
925 
926  for( PCaloHitContainer::const_iterator hit = simEcalHitsEE->begin(); hit != simEcalHitsEE->end(); ++hit )
927  if ( hit->geantTrackId() == info.simTrack->genpartIndex() ) ecalTrueEnergy += hit->energy();
928 
929  for( PCaloHitContainer::const_iterator hit = simHcalHits->begin(); hit != simHcalHits->end(); ++hit )
930  if ( hit->geantTrackId() == info.simTrack->genpartIndex() ) hcalTrueEnergy += hit->energy();
931 
932  info.ecalTrueEnergy = ecalTrueEnergy;
933  info.hcalTrueEnergy = hcalTrueEnergy;
934  info.hcalTrueEnergyCorrected = hcalTrueEnergy;
935  if ( fabs(info.trkGlobPosAtHcal.eta()) < 1.3 )
936  info.hcalTrueEnergyCorrected = hcalTrueEnergy*113.2;
937  else
938  if ( fabs(info.trkGlobPosAtHcal.eta()) < 3.0 )
939  info.hcalTrueEnergyCorrected = hcalTrueEnergy*167.2;
940  }
941 }
dictionary parameters
Definition: Parameters.py:2
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
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 265 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.

268 {
269  const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getEcalTrajectory();
270 
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();
275 
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());
279 
280  if(coreTrajectory.empty()) {
281  LogTrace("TrackAssociator") << "ECAL track trajectory is empty; moving on\n";
282  info.isGoodEcal = 0;
283  return;
284  }
285  info.isGoodEcal = 1;
286 
287  // Find ECAL crystals
289  iEvent.getByToken(parameters.EBRecHitsToken, EBRecHits);
290  if (!EBRecHits.isValid()) throw cms::Exception("FatalError") << "Unable to find EBRecHitCollection in the event!\n";
291 
293  iEvent.getByToken(parameters.EERecHitsToken, EERecHits);
294  if (!EERecHits.isValid()) throw cms::Exception("FatalError") << "Unable to find EERecHitCollection in event!\n";
295 
296  std::set<DetId> ecalIdsInRegion;
297  if (parameters.accountForTrajectoryChangeCalo){
298  // get trajectory change with respect to initial state
300  parameters.dREcalPreselection);
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();
304  if (parameters.dREcalPreselection > parameters.dREcal)
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();
310 
311  info.crossedEcalIds = crossedEcalIds;
312 
313  // add EcalRecHits
314  for(std::vector<DetId>::const_iterator itr=crossedEcalIds.begin(); itr!=crossedEcalIds.end();itr++)
315  {
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())
319  info.crossedEcalRecHits.push_back(&*ebHit);
320  else if(eeHit != (*EERecHits).end())
321  info.crossedEcalRecHits.push_back(&*eeHit);
322  else
323  LogTrace("TrackAssociator") << "Crossed EcalRecHit is not found for DetId: " << itr->rawId();
324  }
325  for(std::set<DetId>::const_iterator itr=ecalIdsInRegion.begin(); itr!=ecalIdsInRegion.end();itr++)
326  {
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())
330  info.ecalRecHits.push_back(&*ebHit);
331  else if(eeHit != (*EERecHits).end())
332  info.ecalRecHits.push_back(&*eeHit);
333  else
334  LogTrace("TrackAssociator") << "EcalRecHit from the cone is not found for DetId: " << itr->rawId();
335  }
336 }
dictionary parameters
Definition: Parameters.py:2
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
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:75
#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 425 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.

428 {
429  const std::vector<SteppingHelixStateInfo>& trajectoryStates = cachedTrajectory_.getHcalTrajectory();
430 
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());
434 
435  if(coreTrajectory.empty()) {
436  LogTrace("TrackAssociator") << "HCAL trajectory is empty; moving on\n";
437  info.isGoodHcal = 0;
438  return;
439  }
440  info.isGoodHcal = 1;
441 
442  // find crossed Hcals
444  iEvent.getByToken(parameters.HBHEcollToken, collection);
445  if ( ! collection.isValid() ) throw cms::Exception("FatalError") << "Unable to find HBHERecHits in event!\n";
446 
447  std::set<DetId> idsInRegion;
448  if (parameters.accountForTrajectoryChangeCalo){
449  // get trajectory change with respect to initial state
451  parameters.dRHcalPreselection);
452  idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], mapRange);
453  } else idsInRegion = hcalDetIdAssociator_->getDetIdsCloseToAPoint(coreTrajectory[0], parameters.dRHcalPreselection);
454 
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);
461 
462  info.crossedHcalIds = crossedIds;
463  // add Hcal
464  for(std::vector<DetId>::const_iterator itr=crossedIds.begin(); itr!=crossedIds.end();itr++)
465  {
466  HBHERecHitCollection::const_iterator hit = (*collection).find(*itr);
467  if( hit != (*collection).end() )
468  info.crossedHcalRecHits.push_back(&*hit);
469  else
470  LogTrace("TrackAssociator") << "Crossed HBHERecHit is not found for DetId: " << itr->rawId();
471  }
472  for(std::set<DetId>::const_iterator itr=idsInACone.begin(); itr!=idsInACone.end();itr++)
473  {
474  HBHERecHitCollection::const_iterator hit = (*collection).find(*itr);
475  if( hit != (*collection).end() )
476  info.hcalRecHits.push_back(&*hit);
477  else
478  LogTrace("TrackAssociator") << "HBHERecHit from the cone is not found for DetId: " << itr->rawId();
479  }
480 }
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:457
std::vector< HBHERecHit >::const_iterator const_iterator
std::vector< DetId > crossedHcalIds
edm::ESHandle< DetIdAssociator > hcalDetIdAssociator_
std::vector< const HBHERecHit * > hcalRecHits
std::pair< float, float > trajectoryDelta(TrajectorType)
bool isValid() const
Definition: HandleBase.h:75
#define LogTrace(id)
static std::string info(const DetId &, const TrackerTopology *tTopo)
Definition: DetIdInfo.cc:29
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 482 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.

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

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

726 {
727  // Get the segments from the event
729  iEvent.getByToken(parameters.dtSegmentsToken, dtSegments);
730  if (! dtSegments.isValid())
731  throw cms::Exception("FatalError") << "Unable to find DTRecSegment4DCollection in event!\n";
732 
734  iEvent.getByToken(parameters.cscSegmentsToken, cscSegments);
735  if (! cscSegments.isValid())
736  throw cms::Exception("FatalError") << "Unable to find CSCSegmentCollection in event!\n";
737 
739 
740  // check the map of available segments
741  // if there is no segments in a given direction at all,
742  // then there is no point to fly there.
743  //
744  // MISSING
745  // Possible solution: quick search for presence of segments
746  // for the set of DetIds
747 
748  // get a set of matches corresponding to muon chambers
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";
753 
754  // Iterate over all chamber matches and fill segment matching
755  // info if it's available
756  for(std::vector<TAMuonChamberMatch>::iterator matchedChamber = matchedChambers.begin();
757  matchedChamber != matchedChambers.end(); matchedChamber++)
758  {
759  const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet((*matchedChamber).id);
760  // DT chamber
761  if(const DTChamber* chamber = dynamic_cast<const DTChamber*>(geomDet) ) {
762  // Get the range for the corresponding segments
763  DTRecSegment4DCollection::range range = dtSegments->get(chamber->id());
764  // Loop over the segments of this chamber
765  for (DTRecSegment4DCollection::const_iterator segment = range.first; segment!=range.second; segment++) {
766  if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
767  matchedChamber->segments.back().dtSegmentRef = DTRecSegment4DRef(dtSegments, segment - dtSegments->begin());
768  }
769  }
770  }else{
771  // CSC Chamber
772  if(const CSCChamber* chamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
773  // Get the range for the corresponding segments
774  CSCSegmentCollection::range range = cscSegments->get(chamber->id());
775  // Loop over the segments
776  for (CSCSegmentCollection::const_iterator segment = range.first; segment!=range.second; segment++) {
777  if (addTAMuonSegmentMatch(*matchedChamber, &(*segment), parameters)) {
778  matchedChamber->segments.back().cscSegmentRef = CSCSegmentRef(cscSegments, segment - cscSegments->begin());
779  }
780  }
781  }else{
782  // throw cms::Exception("FatalError") << "Failed to cast GeomDet object to either DTChamber or CSCChamber. Who is this guy anyway?\n";
783  }
784  }
785  info.chambers.push_back(*matchedChamber);
786  }
787 }
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:457
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:75
#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 400 of file TrackDetectorAssociator.cc.

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

403 {
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());
408 
409  if(trajectory.empty()) {
410  LogTrace("TrackAssociator") << "Preshower trajectory is empty; moving on\n";
411  return;
412  }
413 
414  std::set<DetId> idsInRegion =
415  preshowerDetIdAssociator_->getDetIdsCloseToAPoint(trajectory[0],
416  parameters.dRPreshowerPreselection);
417 
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();
421  info.crossedPreshowerIds = crossedIds;
422 }
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 573 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(), and InterestingTrackEcalDetIdProducer::produce().

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

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

543 {
544  GlobalVector vector( track.momentum().x(), track.momentum().y(), track.momentum().z() );
545  GlobalPoint point( vertex.position().x(), vertex.position().y(), vertex.position().z() );
546 
547  int charge = track.type( )> 0 ? -1 : 1; // lepton convention
548  if ( abs(track.type( )) == 211 || // pion
549  abs(track.type( )) == 321 || // kaon
550  abs(track.type( )) == 2212 )
551  charge = track.type( )< 0 ? -1 : 1;
552  return getFreeTrajectoryState(iSetup, vector, point, charge);
553 }
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 555 of file TrackDetectorAssociator.cc.

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

559 {
561  iSetup.get<IdealMagneticFieldRecord>().get(bField);
562 
563  GlobalTrajectoryParameters tPars(vertex, momentum, charge, &*bField);
564 
565  ROOT::Math::SMatrixIdentity id;
566  AlgebraicSymMatrix66 covT(id); covT *= 1e-6; // initialize to sigma=1e-3
567  CartesianTrajectoryError tCov(covT);
568 
569  return FreeTrajectoryState(tPars, tCov);
570 }
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 595 of file TrackDetectorAssociator.cc.

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

597 {
598  DetIdAssociator::MapRange mapRange;
599  mapRange.dThetaPlus = dR;
600  mapRange.dThetaMinus = dR;
601  mapRange.dPhiPlus = dR;
602  mapRange.dPhiMinus = dR;
603  if ( delta.first > 0 )
604  mapRange.dThetaPlus += delta.first;
605  else
606  mapRange.dThetaMinus += fabs(delta.first);
607  if ( delta.second > 0 )
608  mapRange.dPhiPlus += delta.second;
609  else
610  mapRange.dPhiMinus += fabs(delta.second);
611  LogTrace("TrackAssociator") << "Selection range: (dThetaPlus, dThetaMinus, dPhiPlus, dPhiMinus, dRPreselection): " <<
612  mapRange.dThetaPlus << ", " << mapRange.dThetaMinus << ", " <<
613  mapRange.dPhiPlus << ", " << mapRange.dPhiMinus << ", " << dR;
614  return mapRange;
615 }
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 617 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().

619 {
620  // Strategy:
621  // Propagate through the whole detector, estimate change in eta and phi
622  // along the trajectory, add this to dRMuon and find DetIds around this
623  // direction using the map. Then propagate fast to each surface and apply
624  // final matching criteria.
625 
626  // get the direction first
628  // If trajectory point at HCAL is not valid, try to use the outer most state of the
629  // trajectory instead.
630  if(! trajectoryPoint.isValid() ) trajectoryPoint = cachedTrajectory_.getOuterState();
631  if(! trajectoryPoint.isValid() ) {
632  LogTrace("TrackAssociator") <<
633  "trajectory position at HCAL is not valid. Assume the track cannot reach muon detectors and skip it";
634  return;
635  }
636 
637  GlobalVector direction = trajectoryPoint.momentum().unit();
638  LogTrace("TrackAssociator") << "muon direction: " << direction << "\n\t and corresponding point: " <<
639  trajectoryPoint.position() <<"\n";
640 
642  parameters.dRMuonPreselection);
643 
644  // and find chamber DetIds
645 
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++)
650  {
651  const GeomDet* geomDet = muonDetIdAssociator_->getGeomDet(*detId);
652  TrajectoryStateOnSurface stateOnSurface = cachedTrajectory_.propagate( &geomDet->surface() );
653  if (! stateOnSurface.isValid()) {
654  LogTrace("TrackAssociator") << "Failed to propagate the track; moving on\n\t"<<
655  "Element is not crosssed: " << DetIdInfo::info(*detId,0) << "\n";
656  continue;
657  }
658  LocalPoint localPoint = geomDet->surface().toLocal(stateOnSurface.freeState()->position());
659  LocalError localError = stateOnSurface.localError().positionError();
660  float distanceX = 0;
661  float distanceY = 0;
662  float sigmaX = 0.0;
663  float sigmaY = 0.0;
664  if(const CSCChamber* cscChamber = dynamic_cast<const CSCChamber*>(geomDet) ) {
665  const CSCChamberSpecs* chamberSpecs = cscChamber->specs();
666  if(! chamberSpecs) {
667  LogTrace("TrackAssociator") << "Failed to get CSCChamberSpecs from CSCChamber; moving on\n";
668  continue;
669  }
670  const CSCLayerGeometry* layerGeometry = chamberSpecs->oddLayerGeometry(1);
671  if(! layerGeometry) {
672  LogTrace("TrackAssociator") << "Failed to get CSCLayerGeometry from CSCChamberSpecs; moving on\n";
673  continue;
674  }
675  const CSCWireTopology* wireTopology = layerGeometry->wireTopology();
676  if(! wireTopology) {
677  LogTrace("TrackAssociator") << "Failed to get CSCWireTopology from CSCLayerGeometry; moving on\n";
678  continue;
679  }
680 
681  float wideWidth = wireTopology->wideWidthOfPlane();
682  float narrowWidth = wireTopology->narrowWidthOfPlane();
683  float length = wireTopology->lengthOfPlane();
684  // If slanted, there is no y offset between local origin and symmetry center of wire plane
685  float yOfFirstWire = fabs(wireTopology->wireAngle())>1.E-06 ? -0.5*length : wireTopology->yOfWire(1);
686  // y offset between local origin and symmetry center of wire plane
687  float yCOWPOffset = yOfFirstWire+0.5*length;
688 
689  // tangent of the incline angle from inside the trapezoid
690  float tangent = (wideWidth-narrowWidth)/(2.*length);
691  // y position wrt bottom of trapezoid
692  float yPrime = localPoint.y()+fabs(yOfFirstWire);
693  // half trapezoid width at y' is 0.5 * narrowWidth + x side of triangle with the above tangent and side y'
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());
699  } else {
700  distanceX = fabs(localPoint.x()) - geomDet->surface().bounds().width()/2.;
701  distanceY = fabs(localPoint.y()) - geomDet->surface().bounds().length()/2.;
702  sigmaX = distanceX/sqrt(localError.xx());
703  sigmaY = distanceY/sqrt(localError.yy());
704  }
705  if ( (distanceX < parameters.muonMaxDistanceX && distanceY < parameters.muonMaxDistanceY) ||
706  (sigmaX < parameters.muonMaxDistanceSigmaX && sigmaY < parameters.muonMaxDistanceSigmaY) ) {
707  LogTrace("TrackAssociator") << "found a match: " << DetIdInfo::info(*detId,0) << "\n";
709  match.tState = stateOnSurface;
710  match.localDistanceX = distanceX;
711  match.localDistanceY = distanceY;
712  match.id = *detId;
713  matches.push_back(match);
714  } else {
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";
718  }
719  }
720 
721 }
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
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
static std::string info(const DetId &, const TrackerTopology *tTopo)
Definition: DetIdInfo.cc:29
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:10
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.