CMS 3D CMS Logo

MTDTrayBarrelLayer.cc
Go to the documentation of this file.
1 //#define EDM_ML_DEBUG
2 
15 
18 
21 
22 #include <algorithm>
23 #include <iostream>
24 
25 using namespace std;
26 
27 MTDTrayBarrelLayer::MTDTrayBarrelLayer(vector<const DetRod*>& rods)
28  : RodBarrelLayer(false), theRods(rods), theBinFinder(nullptr), isOverlapping(false) {
29  // Sort rods in phi
31 
32  theComponents.reserve(theRods.size());
33  std::copy(theRods.begin(), theRods.end(), back_inserter(theComponents));
34 
35  // Cache chamber pointers (the basic components_)
36  for (const auto& it : rods) {
37  vector<const GeomDet*> tmp2 = it->basicComponents();
38  theBasicComps.insert(theBasicComps.end(), tmp2.begin(), tmp2.end());
39  }
40 
41  // Initialize the binfinder
44 
45  if (bf.isPhiPeriodic()) {
46  theBinFinder = new PeriodicBinFinderInPhi<double>(theRods.front()->position().phi(), theRods.size());
47  } else {
49  }
50 
51  // Compute the layer's surface and bounds (from the components())
53 
54  LogTrace("MTDDetLayers") << "Constructing MTDTrayBarrelLayer: " << basicComponents().size() << " Dets "
55  << theRods.size() << " Rods "
56  << " R: " << specificSurface().radius() << " Per.: " << bf.isPhiPeriodic()
57  << " Overl.: " << isOverlapping;
58 }
59 
61  delete theBinFinder;
62  for (auto& i : theRods) {
63  delete i;
64  }
65 }
66 
67 vector<GeometricSearchDet::DetWithState> MTDTrayBarrelLayer::compatibleDets(
68  const TrajectoryStateOnSurface& startingState, const Propagator& prop, const MeasurementEstimator& est) const {
69  vector<DetWithState> result;
70 
71  LogTrace("MTDDetLayers") << "MTDTrayBarrelLayer::compatibleDets, Cyl R: " << specificSurface().radius()
72  << " TSOS at R= " << startingState.globalPosition().perp()
73  << " phi= " << startingState.globalPosition().phi();
74 
75  pair<bool, TrajectoryStateOnSurface> compat = compatible(startingState, prop, est);
76  if (!compat.first) {
77  LogTrace("MTDDetLayers") << " MTDTrayBarrelLayer::compatibleDets: not compatible"
78  << " (should not have been selected!)";
79  return vector<DetWithState>();
80  }
81 
82  TrajectoryStateOnSurface& tsos = compat.second;
83 
84  LogTrace("MTDDetLayers") << " MTDTrayBarrelLayer::compatibleDets, reached layer at: " << tsos.globalPosition()
85  << " R = " << tsos.globalPosition().perp() << " phi = " << tsos.globalPosition().phi();
86 
87  int closest = theBinFinder->binIndex(tsos.globalPosition().phi());
88  const DetRod* closestRod = theRods[closest];
89 
90  // Check the closest rod
91  LogTrace("MTDDetLayers") << " MTDTrayBarrelLayer::compatibleDets, closestRod: " << closest
92  << " phi : " << closestRod->surface().position().phi()
93  << " FTS phi: " << tsos.globalPosition().phi();
94 
95  result = closestRod->compatibleDets(tsos, prop, est);
96 
97 #ifdef EDM_ML_DEBUG
98  int nclosest = result.size(); // Debug counter
99 #endif
100 
101  bool checknext = false;
102  double dist;
103 
104  if (!result.empty()) {
105  // Check if the track go outside closest rod, then look for closest.
106  TrajectoryStateOnSurface& predictedState = result.front().second;
107  float xErr = xError(predictedState, est);
108  float halfWid = closestRod->surface().bounds().width() / 2.;
109  dist = predictedState.localPosition().x();
110 
111  // If the layer is overlapping, additionally reduce halfWid by 10%
112  // to account for overlap.
113  // FIXME: should we account for the real amount of overlap?
114  if (isOverlapping)
115  halfWid *= 0.9;
116 
117  if (fabs(dist) + xErr > halfWid) {
118  checknext = true;
119  }
120  } else { // Rod is not compatible
121  //FIXME: Usually next cannot be either. Implement proper logic.
122  // (in general at least one rod should be when this method is called by
123  // compatibleDets() which calls compatible())
124  checknext = true;
125 
126  // Look for the next-to closest in phi.
127  // Note Geom::Phi, subtraction is pi-border-safe
128  if (tsos.globalPosition().phi() - closestRod->surface().position().phi() > 0.) {
129  dist = -1.;
130  } else {
131  dist = +1.;
132  }
133 
134  LogTrace("MTDDetLayers") << " MTDTrayBarrelLayer::fastCompatibleDets, none on closest rod!";
135  }
136 
137  if (checknext) {
138  int next;
139  if (dist < 0.)
140  next = closest + 1;
141  else
142  next = closest - 1;
143 
144  next = theBinFinder->binIndex(next); // Bin Periodicity
145  const DetRod* nextRod = theRods[next];
146 
147  LogTrace("MTDDetLayers") << " MTDTrayBarrelLayer::fastCompatibleDets, next-to closest"
148  << " rod: " << next << " dist " << dist << " phi : " << nextRod->surface().position().phi()
149  << " FTS phi: " << tsos.globalPosition().phi();
150 
151  vector<DetWithState> nextRodDets = nextRod->compatibleDets(tsos, prop, est);
152  result.insert(result.end(), nextRodDets.begin(), nextRodDets.end());
153  }
154 
155 #ifdef EDM_ML_DEBUG
156  LogTrace("MTDDetLayers") << " MTDTrayBarrelLayer::fastCompatibleDets: found: " << result.size()
157  << " on closest: " << nclosest << " # checked rods: " << 1 + int(checknext);
158 #endif
159 
160  return result;
161 }
162 
164  const Propagator& prop,
165  const MeasurementEstimator& est) const {
166  vector<GeometricSearchDet::DetWithState> detWithStates;
167 
168  detWithStates = compatibleDets(startingState, prop, est);
169 
170  vector<DetGroup> result;
171  if (!detWithStates.empty()) {
172  result.push_back(DetGroup(detWithStates));
173  }
174  LogTrace("MTDDetLayers") << "MTDTrayBarrelLayer Compatible rods: " << result.size();
175  return result;
176 }
177 
179 
180 const vector<const GeometricSearchDet*>& MTDTrayBarrelLayer::components() const { return theComponents; }
181 
183  const float nSigmas = 3.f;
184  if (tsos.hasError()) {
185  return nSigmas * sqrt(tsos.localError().positionError().xx());
186  } else
187  return nSigmas * 0.5;
188 }
const std::vector< const GeomDet * > & basicComponents() const override
const BoundSurface & surface() const final
The surface of the GeometricSearchDet.
Definition: DetRod.h:19
T perp() const
Definition: PV3DBase.h:69
virtual std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
const LocalTrajectoryError & localError() const
virtual void initialize()
std::vector< DetGroup > groupedCompatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
std::vector< const DetRod * > theRods
virtual int binIndex(T pos) const =0
Return the index of bin at given position.
~MTDTrayBarrelLayer() override
LocalError positionError() const
std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
#define LogTrace(id)
std::vector< const GeomDet * > theBasicComps
T x() const
Definition: PV3DBase.h:59
GlobalPoint globalPosition() const
T sqrt(T t)
Definition: SSEVec.h:19
Definition: DetRod.h:13
virtual const std::vector< const DetRod * > & rods() const
Return the vector of rods.
void precomputed_value_sort(RandomAccessIterator begin, RandomAccessIterator end, const Extractor &extr, const Compare &comp)
const PositionType & position() const
bool isPhiOverlapping() const
Returns true if any 2 of the Det overlap in phi.
BaseBinFinder< double > * theBinFinder
float xError(const TrajectoryStateOnSurface &tsos, const MeasurementEstimator &est) const
MTDTrayBarrelLayer(std::vector< const DetRod *> &rods)
Constructor, takes ownership of pointers.
SubDetector subDetector() const override
bool isPhiPeriodic() const
Returns true if the Dets are periodic in phi.
virtual float width() const =0
float xx() const
Definition: LocalError.h:22
std::vector< const GeometricSearchDet * > theComponents
const std::vector< const GeometricSearchDet * > & components() const override
const Bounds & bounds() const
Definition: Surface.h:87