CMS 3D CMS Logo

MTDDetRing.cc
Go to the documentation of this file.
1 //#define EDM_ML_DEBUG
2 
13 
14 #include <iostream>
15 #include <vector>
16 
17 using namespace std;
18 
19 MTDDetRing::MTDDetRing(vector<const GeomDet*>::const_iterator first, vector<const GeomDet*>::const_iterator last)
21  init();
22 }
23 
24 MTDDetRing::MTDDetRing(const vector<const GeomDet*>& vdets) : ForwardDetRingOneZ(vdets) { init(); }
25 
28 }
29 
31 
32 const vector<const GeometricSearchDet*>& MTDDetRing::components() const {
33  // FIXME dummy impl.
34  edm::LogError("MTDDetLayers") << "temporary dummy implementation of MTDDetRing::components()!!";
35  static const vector<const GeometricSearchDet*> result;
36  return result;
37 }
38 
39 pair<bool, TrajectoryStateOnSurface> MTDDetRing::compatible(const TrajectoryStateOnSurface& ts,
40  const Propagator& prop,
41  const MeasurementEstimator& est) const {
43 
44 #ifdef EDM_ML_DEBUG
45  LogTrace("MTDDetLayers") << "MTDDetRing::compatible, Surface at Z: " << specificSurface().position().z()
46  << " R1: " << specificSurface().innerRadius() << " R2: " << specificSurface().outerRadius()
47  << " TS at Z,R: " << ts.globalPosition().z() << "," << ts.globalPosition().perp();
48  if (ms.isValid()) {
49  LogTrace("MTDDetLayers") << " DEST at Z,R: " << ms.globalPosition().z() << "," << ms.globalPosition().perp()
50  << " local Z: " << ms.localPosition().z();
51  } else {
52  LogTrace("MTDDetLayers") << " DEST: not valid";
53  }
54 #endif
55 
56  return make_pair(ms.isValid() and est.estimate(ms, specificSurface()) != 0, ms);
57 }
58 
59 vector<GeometricSearchDet::DetWithState> MTDDetRing::compatibleDets(const TrajectoryStateOnSurface& startingState,
60  const Propagator& prop,
61  const MeasurementEstimator& est) const {
62  LogTrace("MTDDetLayers") << "MTDDetRing::compatibleDets, Surface at Z: " << surface().position().z()
63  << " R1: " << specificSurface().innerRadius() << " R2: " << specificSurface().outerRadius()
64  << " TS at Z,R: " << startingState.globalPosition().z() << ","
65  << startingState.globalPosition().perp() << " DetRing pos." << position();
66 
67  vector<DetWithState> result;
68 
69  // Propagate and check that the result is within bounds
70  pair<bool, TrajectoryStateOnSurface> compat = compatible(startingState, prop, est);
71  if (!compat.first) {
72  LogTrace("MTDDetLayers") << " MTDDetRing::compatibleDets: not compatible"
73  << " (should not have been selected!)";
74  return result;
75  }
76 
77  // Find the most probable destination component
78  TrajectoryStateOnSurface& tsos = compat.second;
79  GlobalPoint startPos = tsos.globalPosition();
80  int closest = theBinFinder.binIndex(startPos.phi());
81  const vector<const GeomDet*> dets = basicComponents();
82  LogTrace("MTDDetLayers") << " MTDDetRing::compatibleDets, closest det: " << closest
83  << " Phi: " << dets[closest]->surface().position().phi() << " impactPhi " << startPos.phi();
84 
85  // Add this detector, if it is compatible
86  // NOTE: add performs a null propagation
87  add(closest, result, tsos, prop, est);
88 
89 #ifdef EDM_ML_DEBUG
90  int nclosest = result.size();
91  int nnextdet = 0; // MDEBUG counters
92 
93  // Try the neighbors on each side until no more compatible.
94  float dphi = 0;
95  if (!result.empty()) { // If closest is not compatible the next cannot be either
96  float nSigmas = 3.;
97  if (result.back().second.hasError()) {
98  dphi = nSigmas * atan(sqrt(result.back().second.localError().positionError().xx()) /
99  result.back().second.globalPosition().perp());
100  }
101  } else {
102  LogTrace("MTDDetLayers") << " MTDDetRing::compatibleDets, closest not compatible!";
103  //FIXME: if closest is not compatible the next cannot be either
104  }
105 #endif
106 
107  for (int idet = closest + 1; idet < closest + int(dets.size()) / 4 + 1; idet++) {
108  // FIXME: should use dphi to decide if det must be queried.
109  // Right now query until not compatible.
110  int idetp = theBinFinder.binIndex(idet);
111  {
112 #ifdef EDM_ML_DEBUG
113  LogTrace("MTDDetLayers") << " next det:" << idetp << " at Z: " << dets[idetp]->position().z()
114  << " phi: " << dets[idetp]->position().phi() << " FTS phi " << startPos.phi()
115  << " max dphi " << dphi;
116  nnextdet++;
117 #endif
118  if (!add(idetp, result, tsos, prop, est))
119  break;
120  }
121  }
122 
123  for (int idet = closest - 1; idet > closest - int(dets.size()) / 4 - 1; idet--) {
124  // FIXME: should use dphi to decide if det must be queried.
125  // Right now query until not compatible.
126  int idetp = theBinFinder.binIndex(idet);
127  {
128 #ifdef EDM_ML_DEBUG
129  LogTrace("MTDDetLayers") << " previous det:" << idetp << " " << idet << " " << closest - dets.size() / 4 - 1
130  << " at Z: " << dets[idetp]->position().z() << " phi: " << dets[idetp]->position().phi()
131  << " FTS phi " << startPos.phi() << " max dphi" << dphi;
132  nnextdet++;
133 #endif
134  if (!add(idetp, result, tsos, prop, est))
135  break;
136  }
137  }
138 
139 #ifdef EDM_ML_DEBUG
140  LogTrace("MTDDetLayers") << " MTDDetRing::compatibleDets, size: " << result.size() << " on closest: " << nclosest
141  << " # checked dets: " << nnextdet + 1;
142 
143  if (result.empty()) {
144  LogTrace("MTDDetLayers") << " ***Ring not compatible,should have been discarded before!!!";
145  }
146 #endif
147 
148  return result;
149 }
150 
151 vector<DetGroup> MTDDetRing::groupedCompatibleDets(const TrajectoryStateOnSurface& startingState,
152  const Propagator& prop,
153  const MeasurementEstimator& est) const {
154  // FIXME should be implemented to allow returning overlapping chambers
155  // as separate groups!
156  edm::LogError("MTDDetLayers") << "dummy implementation of MTDDetRing::groupedCompatibleDets()";
157  vector<DetGroup> result;
158  return result;
159 }
BinFinderType theBinFinder
Definition: MTDDetRing.h:44
size
Write out results.
virtual const Surface::PositionType & position() const
Returns position of the surface.
T perp() const
Definition: PV3DBase.h:69
std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &ts, const Propagator &prop, const MeasurementEstimator &est) const override
Definition: MTDDetRing.cc:39
int binIndex(T phi) const override
returns an index in the valid range for the bin that contains phi
const std::vector< const GeomDet * > & basicComponents() const override
T z() const
Definition: PV3DBase.h:61
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
int closest(std::vector< int > const &vec, int value)
const BoundDisk & specificSurface() const
Return the ring surface as a BoundDisk.
const std::vector< const GeometricSearchDet * > & components() const override
Returns basic components, if any.
Definition: MTDDetRing.cc:32
Log< level::Error, false > LogError
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
Definition: Propagator.h:50
#define LogTrace(id)
GlobalPoint globalPosition() const
std::vector< DetGroup > groupedCompatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
Definition: MTDDetRing.cc:151
T sqrt(T t)
Definition: SSEVec.h:19
virtual HitReturnType estimate(const TrajectoryStateOnSurface &ts, const TrackingRecHit &hit) const =0
std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
Definition: MTDDetRing.cc:59
void init()
Definition: MTDDetRing.cc:26
const PositionType & position() const
MTDDetRing(std::vector< const GeomDet *>::const_iterator first, std::vector< const GeomDet *>::const_iterator last)
Construct from iterators on GeomDet*.
Definition: MTDDetRing.cc:19
PeriodicBinFinderInPhi< float > BinFinderType
Definition: MTDDetRing.h:43
const BoundSurface & surface() const final
The surface of the GeometricSearchDet.
bool add(int idet, std::vector< DetWithState > &result, const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est) const
~MTDDetRing() override
Definition: MTDDetRing.cc:30