CMS 3D CMS Logo

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