CMS 3D CMS Logo

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

#include <GetTrackTrajInfo.h>

Classes

struct  Result
 

Public Member Functions

std::vector< Resultanalyze (const edm::EventSetup &iSetup, const reco::Track &track)
 
 GetTrackTrajInfo ()
 
 ~GetTrackTrajInfo ()
 

Private Member Functions

void init (const edm::EventSetup &iSetup)
 

Private Attributes

edm::ESHandle
< TransientTrackBuilder
trkTool_
 

Detailed Description

Definition at line 40 of file GetTrackTrajInfo.h.

Constructor & Destructor Documentation

GetTrackTrajInfo::GetTrackTrajInfo ( )
inline

Definition at line 62 of file GetTrackTrajInfo.h.

62 {}
GetTrackTrajInfo::~GetTrackTrajInfo ( )
inline

Definition at line 64 of file GetTrackTrajInfo.h.

64 {}

Member Function Documentation

std::vector< GetTrackTrajInfo::Result > GetTrackTrajInfo::analyze ( const edm::EventSetup iSetup,
const reco::Track track 
)

Definition at line 32 of file GetTrackTrajInfo.cc.

References GetTrackTrajInfo::Result::accurate, alongMomentum, GeometricSearchDet::compatible(), GeometricSearchDet::compatibleDets(), GetTrackTrajInfo::Result::detLayer, GetTrackTrajInfo::Result::detTSOS, reco::TrackBase::eta(), edm::EventSetup::get(), reco::HitPattern::getHitPattern(), reco::HitPattern::getLayer(), reco::HitPattern::getSubStructure(), TrajectoryStateOnSurface::globalPosition(), reco::TrackBase::hitPattern(), i, reco::TransientTrack::impactPointState(), LogDebug, reco::HitPattern::numberOfHits(), PixelSubdetector::PixelBarrel, PixelSubdetector::PixelEndcap, LargeD0_PixelPairStep_cff::propagator, query::result, python.entryComment::results, Propagator::setPropagationDirection(), StripSubdetector::TEC, StripSubdetector::TIB, StripSubdetector::TID, StripSubdetector::TOB, patCandidatesForDimuonsSequences_cff::tracker, reco::HitPattern::trackerHitFilter(), trkTool_, GetTrackTrajInfo::Result::valid, reco::HitPattern::validHitFilter(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().

Referenced by FixTrackHitPattern::analyze().

33 {
34  // Determine the track trajectory and detLayer at each layer that the track produces a hit in.
35 
36  std::vector< GetTrackTrajInfo::Result > results;
37 
38  // Initialise Tracker geometry info (not sufficient to do this only on first call).
40  iSetup.get<TrackerRecoGeometryRecord>().get( tracker );
41 
42  // This is also needed to extrapolate amongst the tracker layers.
44  iSetup.get<NavigationSchoolRecord>().get("SimpleNavigationSchool",theSchool);
45  NavigationSetter junk(*theSchool);
46 
47  // Get the magnetic field and use it to define a propagator for extrapolating the track trajectory.
49  iSetup.get<IdealMagneticFieldRecord>().get(magField);
51 
52  // This is used to check if a track is compatible with crossing a sensor.
53  // Use +3.0 rather than default -3.0 here, so hit defined as inside acceptance if
54  // no more than 3*sigma outside detector edge, as opposed to more than 3*sigma inside detector edge.
55  Chi2MeasurementEstimator estimator(30.,3.0);
56 
57  // Convert track to transientTrack, and hence to TSOS at its point of closest approach to beam.
58  iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder",trkTool_); // Needed for vertex fits
59  reco::TransientTrack t_trk = trkTool_->build(track);
60  TrajectoryStateOnSurface initTSOS = t_trk.impactPointState();
61  LogDebug("GTTI")<<"TRACK TSOS POS: x="<<initTSOS.globalPosition().x()<<" y="<<initTSOS.globalPosition().y()<<" z="<<initTSOS.globalPosition().z();
62 
63  // Note if the track is going into +ve or -ve z.
64  // This is only used to guess if the track is more likely to have hit a +ve rather than a -ve endcap
65  // disk. Since the +ve and -ve disks are a long way apart, this approximate method is good enough.
66  // More precise would be to check both possiblities and see which one (if either) the track crosses
67  // using detLayer::compatible().
68  bool posSide = track.eta() > 0;
69 
70  // Get hit patterns of this track
71  const reco::HitPattern& hp = track.hitPattern();
72 
73  // Loop over info for each hit
74  // N.B. Hits are sorted according to increasing distance from origin by
75  // RecoTracker/TrackProducer/src/TrackProducerBase.cc
76  for (int i = 0; i < hp.numberOfHits(); i++) {
77  uint32_t hit = hp.getHitPattern(i);
78  if (hp.trackerHitFilter(hit) && hp.validHitFilter(hit)) {
79  uint32_t subDet = hp.getSubStructure(hit);
80  uint32_t layer = hp.getLayer(hit);
81  // subdet: PixelBarrel=1, PixelEndcap=2, TIB=3, TID=4, TOB=5, TEC=6
82  LogDebug("GTTI")<<" hit in subdet="<<subDet<<" layer="<<layer;
83 
84  // Get corresponding DetLayer object (based on code in GeometricSearchTracker::idToLayer(...)
85  const DetLayer* detLayer = 0;
86  if (subDet == StripSubdetector::TIB) {
87  detLayer = tracker->tibLayers()[layer - 1];
88  } else if (subDet == StripSubdetector::TOB) {
89  detLayer = tracker->tobLayers()[layer - 1];
90  } else if (subDet == StripSubdetector::TID) {
91  detLayer = posSide ? tracker->posTidLayers()[layer - 1] : tracker->negTidLayers()[layer - 1];
92  } else if (subDet == StripSubdetector::TEC) {
93  detLayer = posSide ? tracker->posTecLayers()[layer - 1] : tracker->negTecLayers()[layer - 1];
94  } else if (subDet == PixelSubdetector::PixelBarrel) {
95  detLayer = tracker->pixelBarrelLayers()[layer - 1];
96  } else if (subDet == PixelSubdetector::PixelEndcap) {
97  detLayer = posSide ? tracker->posPixelForwardLayers()[layer - 1] : tracker->negPixelForwardLayers()[layer - 1];
98  }
99 
100  // Store the results for this hit.
101  Result result;
102  result.detLayer = detLayer;
103 
104  // Check that the track crosses this layer, and get the track trajectory at the crossing point.
105  std::pair<bool, TrajectoryStateOnSurface> layCross = detLayer->compatible(initTSOS, propagator, estimator);
106  if (layCross.first) {
107  LogDebug("GTTI")<<"crossed layer at "<<" x="<<layCross.second.globalPosition().x()<<" y="<<layCross.second.globalPosition().y()<<" z="<<layCross.second.globalPosition().z();
108 
109  // Find the sensor in this layer which is closest to the track trajectory.
110  // And get the track trajectory at that sensor.
111  const PropagationDirection along = alongMomentum;
112  propagator.setPropagationDirection(along);
113  std::vector< GeometricSearchDet::DetWithState > detWithState = detLayer->compatibleDets(initTSOS, propagator, estimator);
114  // Check that at least one sensor was compatible with the track trajectory.
115  if(detWithState.size() > 0) {
116  // Store track trajectory at this sensor.
117  result.valid = true;
118  result.accurate = true;
119  result.detTSOS = detWithState.front().second;
120  LogDebug("GTTI")<<" Det in this layer compatible with TSOS: subdet="<<subDet<<" layer="<<layer;
121  LogDebug("GTTI")<<" crossed sensor at x="<<result.detTSOS.globalPosition().x()<<" y="<<result.detTSOS.globalPosition().y()<<" z="<<result.detTSOS.globalPosition().z();
122 
123  } else {
124  // Track did not cross a sensor, so store approximate result from its intercept with the layer.
125  result.valid = true;
126  result.accurate = false;
127  result.detTSOS = layCross.second;
128  LogDebug("GTTI")<<" WARNING: TSOS not compatible with any det in this layer, despite having a hit in it !";
129  }
130 
131  } else {
132  // Track trajectory did not cross layer. Pathological case.
133  result.valid = false;
134  LogDebug("GTTI")<<" WARNING: track failed to cross layer, despite having a hit in hit !";
135  }
136 
137  results.push_back(result);
138  }
139  }
140 
141  return results;
142 }
#define LogDebug(id)
virtual std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &ts, const Propagator &, const MeasurementEstimator &) const =0
int i
Definition: DBlmapReader.cc:9
static uint32_t getLayer(uint32_t pattern)
Definition: HitPattern.h:485
static bool trackerHitFilter(uint32_t pattern)
Definition: HitPattern.h:466
T y() const
Definition: PV3DBase.h:62
GlobalPoint globalPosition() const
PropagationDirection
virtual std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:141
T z() const
Definition: PV3DBase.h:63
tuple result
Definition: query.py:137
int numberOfHits() const
Definition: HitPattern.cc:213
static uint32_t getSubStructure(uint32_t pattern)
Definition: HitPattern.h:479
edm::ESHandle< TransientTrackBuilder > trkTool_
static bool validHitFilter(uint32_t pattern)
Definition: HitPattern.h:529
const HitPattern & hitPattern() const
Access the hit pattern, indicating in which Tracker layers the track has hits.
Definition: TrackBase.h:223
const T & get() const
Definition: EventSetup.h:55
TrajectoryStateOnSurface impactPointState() const
uint32_t getHitPattern(int position) const
Definition: HitPattern.cc:144
T x() const
Definition: PV3DBase.h:61
void GetTrackTrajInfo::init ( const edm::EventSetup iSetup)
private

Member Data Documentation

edm::ESHandle<TransientTrackBuilder> GetTrackTrajInfo::trkTool_
private

Definition at line 78 of file GetTrackTrajInfo.h.

Referenced by analyze().