CMS 3D CMS Logo

MTDRingForwardLayer.cc
Go to the documentation of this file.
1 //#define EDM_ML_DEBUG
2 
15 
18 
19 #include <algorithm>
20 #include <iostream>
21 #include <vector>
22 
23 using namespace std;
24 
25 MTDRingForwardLayer::MTDRingForwardLayer(const vector<const ForwardDetRing*>& rings)
27  theRings(rings),
28  theComponents(theRings.begin(), theRings.end()),
29  theBinFinder(nullptr),
30  isOverlapping(false) {
31  // Initial values for R and Z bounds
32  float theRmin = rings.front()->basicComponents().front()->position().perp();
33  float theRmax = theRmin;
34  float theZmin = rings.front()->position().z();
35  float theZmax = theZmin;
36 
37  // Cache chamber pointers (the basic components_)
38  // and find extension in R and Z
39  for (const auto& it : rings) {
40  vector<const GeomDet*> tmp2 = it->basicComponents();
41  theBasicComps.insert(theBasicComps.end(), tmp2.begin(), tmp2.end());
42 
43  theRmin = min(theRmin, it->specificSurface().innerRadius());
44  theRmax = max(theRmax, it->specificSurface().outerRadius());
45  float halfThick = it->surface().bounds().thickness() / 2.;
46  float zCenter = it->surface().position().z();
47  theZmin = min(theZmin, zCenter - halfThick);
48  theZmax = max(theZmax, zCenter + halfThick);
49  }
50 
54 
55  // Build surface
56 
57  float zPos = (theZmax + theZmin) / 2.;
58  PositionType pos(0., 0., zPos);
60 
61  setSurface(new BoundDisk(pos, rot, new SimpleDiskBounds(theRmin, theRmax, theZmin - zPos, theZmax - zPos)));
62 
63  LogTrace("MTDDetLayers") << "Constructing MTDRingForwardLayer: " << basicComponents().size() << " Dets "
64  << theRings.size() << " Rings "
65  << " Z: " << specificSurface().position().z() << " R1: " << specificSurface().innerRadius()
66  << " R2: " << specificSurface().outerRadius() << " Per.: " << bf.isRPeriodic()
67  << " Overl.: " << bf.isROverlapping();
68 }
69 
71  delete theBinFinder;
72  for (auto& i : theRings) {
73  delete i;
74  }
75 }
76 
77 vector<GeometricSearchDet::DetWithState> MTDRingForwardLayer::compatibleDets(
78  const TrajectoryStateOnSurface& startingState, const Propagator& prop, const MeasurementEstimator& est) const {
79  vector<DetWithState> result;
80 
81  LogTrace("MTDDetLayers") << "MTDRingForwardLayer::compatibleDets,"
82  << " R1 " << specificSurface().innerRadius() << " R2: " << specificSurface().outerRadius()
83  << " FTS at R: " << startingState.globalPosition().perp();
84 
85  pair<bool, TrajectoryStateOnSurface> compat = compatible(startingState, prop, est);
86 
87  if (!compat.first) {
88  LogTrace("MTDDetLayers") << " MTDRingForwardLayer::compatibleDets: not compatible"
89  << " (should not have been selected!)";
90  return result;
91  }
92 
93  TrajectoryStateOnSurface& tsos = compat.second;
94 
96  const ForwardDetRing* closestRing = theRings[closest];
97 
98  // Check the closest ring
99 
100  LogTrace("MTDDetLayers") << " MTDRingForwardLayer::fastCompatibleDets, closestRing: " << closest << " R1 "
101  << closestRing->specificSurface().innerRadius()
102  << " R2: " << closestRing->specificSurface().outerRadius()
103  << " FTS R: " << tsos.globalPosition().perp();
104  if (tsos.hasError()) {
105  LogTrace("MTDDetLayers") << " sR: " << sqrt(tsos.localError().positionError().yy())
106  << " sX: " << sqrt(tsos.localError().positionError().xx());
107  }
108 
109  result = closestRing->compatibleDets(tsos, prop, est);
110 
111 #ifdef EDM_ML_DEBUG
112  int nclosest = result.size();
113  int nnextdet = 0; // MDEBUG counters
114 #endif
115 
116  //FIXME: if closest is not compatible next cannot be either?
117 
118  // Use state on layer surface. Note that local coordinates and errors
119  // are the same on the layer and on all rings surfaces, since
120  // all BoundDisks are centered in 0,0 and have the same rotation.
121  // CAVEAT: if the rings are not at the same Z, the local position and error
122  // will be "Z-projected" to the rings. This is a fairly good approximation.
123  // However in this case additional propagation will be done when calling
124  // compatibleDets.
125  GlobalPoint startPos = tsos.globalPosition();
126  LocalPoint nextPos(surface().toLocal(startPos));
127 
128  for (unsigned int idet = closest + 1; idet < theRings.size(); idet++) {
129  bool inside = false;
130  if (tsos.hasError()) {
131  inside = theRings[idet]->specificSurface().bounds().inside(nextPos, tsos.localError().positionError());
132  } else {
133  inside = theRings[idet]->specificSurface().bounds().inside(nextPos);
134  }
135  if (inside) {
136 #ifdef EDM_ML_DEBUG
137  LogTrace("MTDDetLayers") << " MTDRingForwardLayer::fastCompatibleDets:NextRing" << idet << " R1 "
138  << theRings[idet]->specificSurface().innerRadius()
139  << " R2: " << theRings[idet]->specificSurface().outerRadius() << " FTS R "
140  << nextPos.perp();
141  nnextdet++;
142 #endif
143  vector<DetWithState> nextRodDets = theRings[idet]->compatibleDets(tsos, prop, est);
144  if (!nextRodDets.empty()) {
145  result.insert(result.end(), nextRodDets.begin(), nextRodDets.end());
146  } else {
147  break;
148  }
149  }
150  }
151 
152  for (int idet = closest - 1; idet >= 0; idet--) {
153  bool inside = false;
154  if (tsos.hasError()) {
155  inside = theRings[idet]->specificSurface().bounds().inside(nextPos, tsos.localError().positionError());
156  } else {
157  inside = theRings[idet]->specificSurface().bounds().inside(nextPos);
158  }
159  if (inside) {
160 #ifdef EDM_ML_DEBUG
161  LogTrace("MTDDetLayers") << " MTDRingForwardLayer::fastCompatibleDets:PreviousRing:" << idet << " R1 "
162  << theRings[idet]->specificSurface().innerRadius()
163  << " R2: " << theRings[idet]->specificSurface().outerRadius() << " FTS R "
164  << nextPos.perp();
165  nnextdet++;
166 #endif
167  vector<DetWithState> nextRodDets = theRings[idet]->compatibleDets(tsos, prop, est);
168  if (!nextRodDets.empty()) {
169  result.insert(result.end(), nextRodDets.begin(), nextRodDets.end());
170  } else {
171  break;
172  }
173  }
174  }
175 
176 #ifdef EDM_ML_DEBUG
177  LogTrace("MTDDetLayers") << " MTDRingForwardLayer::fastCompatibleDets: found: " << result.size()
178  << " on closest: " << nclosest << " # checked rings: " << 1 + nnextdet;
179 #endif
180 
181  return result;
182 }
183 
185  const Propagator& prop,
186  const MeasurementEstimator& est) const {
187  // FIXME should return only 1 group
188  edm::LogError("MTDDetLayers") << "dummy implementation of MTDRingForwardLayer::groupedCompatibleDets()";
189  return vector<DetGroup>();
190 }
191 
193  return theBasicComps.front()->subDetector();
194 }
195 
196 const vector<const GeometricSearchDet*>& MTDRingForwardLayer::components() const { return theComponents; }
TkRotation< Scalar > RotationType
Definition: Definitions.h:27
const std::vector< const GeometricSearchDet * > & components() const override
T perp() const
Definition: PV3DBase.h:69
const std::vector< const GeomDet * > & basicComponents() const override
virtual std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
const LocalTrajectoryError & localError() const
int closest(std::vector< int > const &vec, int value)
std::vector< const ForwardDetRing * > theRings
virtual int binIndex(T pos) const =0
Return the index of bin at given position.
const BoundDisk & specificSurface() const
Return the ring surface as a BoundDisk.
Log< level::Error, false > LogError
LocalError positionError() const
std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
virtual const std::vector< const ForwardDetRing * > & rings() const
Return the vector of rings.
#define LogTrace(id)
Point3DBase< Scalar, GlobalTag > PositionType
Definition: Definitions.h:28
bool isROverlapping() const
Returns true if any 2 of the Det overlap in R.
Definition: RBorderFinder.h:35
float yy() const
Definition: LocalError.h:24
MTDRingForwardLayer(const std::vector< const ForwardDetRing *> &rings)
Constructor, takes ownership of pointers.
GlobalPoint globalPosition() const
T sqrt(T t)
Definition: SSEVec.h:19
BaseBinFinder< double > * theBinFinder
bool isRPeriodic() const
Returns true if the Dets are periodic in R.
Definition: RBorderFinder.h:32
LocalVector toLocal(const reco::Track::Vector &v, const Surface &s)
std::vector< DetGroup > groupedCompatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
std::vector< const GeometricSearchDet * > theComponents
Disk BoundDisk
Definition: BoundDisk.h:54
SubDetector subDetector() const override
float xx() const
Definition: LocalError.h:22
std::vector< const GeomDet * > theBasicComps