CMS 3D CMS Logo

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