CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
MuRingForwardLayer.cc
Go to the documentation of this file.
1 
14 
16 
17 #include <algorithm>
18 #include <iostream>
19 #include <vector>
20 
21 using namespace std;
22 
23 MuRingForwardLayer::MuRingForwardLayer(const vector<const ForwardDetRing*>& rings)
25  theRings(rings),
26  theComponents(theRings.begin(), theRings.end()),
27  theBinFinder(nullptr),
28  isOverlapping(false) {
29  const std::string metname = "Muon|RecoMuon|RecoMuonDetLayers|MuRingForwardLayer";
30 
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 (vector<const ForwardDetRing*>::const_iterator it = rings.begin(); it != rings.end(); it++) {
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(metname) << "Constructing MuRingForwardLayer: " << basicComponents().size() << " Dets " << theRings.size()
64  << " 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 (vector<const ForwardDetRing*>::iterator i = theRings.begin(); i < theRings.end(); i++) {
73  delete *i;
74  }
75 }
76 
77 vector<GeometricSearchDet::DetWithState> MuRingForwardLayer::compatibleDets(
78  const TrajectoryStateOnSurface& startingState, const Propagator& prop, const MeasurementEstimator& est) const {
79  const std::string metname = "Muon|RecoMuon|RecoMuonDetLayers|MuRingForwardLayer";
80  vector<DetWithState> result;
81 
82  LogTrace(metname) << "MuRingForwardLayer::compatibleDets,"
83  << " R1 " << specificSurface().innerRadius() << " R2: " << specificSurface().outerRadius()
84  << " FTS at R: " << startingState.globalPosition().perp();
85 
86  pair<bool, TrajectoryStateOnSurface> compat = compatible(startingState, prop, est);
87 
88  if (!compat.first) {
89  LogTrace(metname) << " MuRingForwardLayer::compatibleDets: not compatible"
90  << " (should not have been selected!)";
91  return result;
92  }
93 
94  TrajectoryStateOnSurface& tsos = compat.second;
95 
96  int closest = theBinFinder->binIndex(tsos.globalPosition().perp());
97  const ForwardDetRing* closestRing = theRings[closest];
98 
99  // Check the closest ring
100 
101  LogTrace(metname) << " MuRingForwardLayer::fastCompatibleDets, closestRing: " << closest << " R1 "
102  << closestRing->specificSurface().innerRadius()
103  << " R2: " << closestRing->specificSurface().outerRadius()
104  << " FTS R: " << tsos.globalPosition().perp();
105  if (tsos.hasError()) {
106  LogTrace(metname) << " sR: " << sqrt(tsos.localError().positionError().yy())
107  << " sX: " << sqrt(tsos.localError().positionError().xx());
108  }
109  LogTrace(metname) << endl;
110 
111  result = closestRing->compatibleDets(tsos, prop, est);
112 
113  int nclosest = result.size();
114  int nnextdet = 0; // MDEBUG counters
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  LogTrace(metname) << " MuRingForwardLayer::fastCompatibleDets:NextRing" << idet << " R1 "
137  << theRings[idet]->specificSurface().innerRadius()
138  << " R2: " << theRings[idet]->specificSurface().outerRadius() << " FTS R " << nextPos.perp();
139  nnextdet++;
140  vector<DetWithState> nextRodDets = theRings[idet]->compatibleDets(tsos, prop, est);
141  if (!nextRodDets.empty()) {
142  result.insert(result.end(), nextRodDets.begin(), nextRodDets.end());
143  } else {
144  break;
145  }
146  }
147  }
148 
149  for (int idet = closest - 1; idet >= 0; idet--) {
150  bool inside = false;
151  if (tsos.hasError()) {
152  inside = theRings[idet]->specificSurface().bounds().inside(nextPos, tsos.localError().positionError());
153  } else {
154  inside = theRings[idet]->specificSurface().bounds().inside(nextPos);
155  }
156  if (inside) {
157  LogTrace(metname) << " MuRingForwardLayer::fastCompatibleDets:PreviousRing:" << idet << " R1 "
158  << theRings[idet]->specificSurface().innerRadius()
159  << " R2: " << theRings[idet]->specificSurface().outerRadius() << " FTS R " << nextPos.perp();
160  nnextdet++;
161  vector<DetWithState> nextRodDets = theRings[idet]->compatibleDets(tsos, prop, est);
162  if (!nextRodDets.empty()) {
163  result.insert(result.end(), nextRodDets.begin(), nextRodDets.end());
164  } else {
165  break;
166  }
167  }
168  }
169 
170  LogTrace(metname) << " MuRingForwardLayer::fastCompatibleDets: found: " << result.size()
171  << " on closest: " << nclosest << " # checked rings: " << 1 + nnextdet;
172 
173  return result;
174 }
175 
177  const Propagator& prop,
178  const MeasurementEstimator& est) const {
179  // FIXME should return only 1 group
180  cout << "dummy implementation of MuRingForwardLayer::groupedCompatibleDets()" << endl;
181  return vector<DetGroup>();
182 }
183 
185 
186 const vector<const GeometricSearchDet*>& MuRingForwardLayer::components() const { return theComponents; }
TkRotation< Scalar > RotationType
Definition: Definitions.h:27
float xx() const
Definition: LocalError.h:22
T perp() const
Definition: PV3DBase.h:69
std::vector< DetGroup > groupedCompatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
const std::string metname
MuRingForwardLayer(const std::vector< const ForwardDetRing * > &rings)
Constructor, takes ownership of pointers.
virtual int binIndex(T pos) const =0
Return the index of bin at given position.
GlobalPoint globalPosition() const
std::vector< const ForwardDetRing * > theRings
LocalError positionError() const
virtual std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
#define LogTrace(id)
tuple result
Definition: mps_fire.py:311
Point3DBase< Scalar, GlobalTag > PositionType
Definition: Definitions.h:28
float yy() const
Definition: LocalError.h:24
const std::vector< const GeometricSearchDet * > & components() const override
T sqrt(T t)
Definition: SSEVec.h:19
T min(T a, T b)
Definition: MathUtil.h:58
const LocalTrajectoryError & localError() const
~MuRingForwardLayer() override
LocalVector toLocal(const reco::Track::Vector &v, const Surface &s)
std::vector< const GeometricSearchDet * > theComponents
const std::vector< const GeomDet * > & basicComponents() const override
BaseBinFinder< double > * theBinFinder
Disk BoundDisk
Definition: BoundDisk.h:54
SubDetector subDetector() const override
string end
Definition: dataset.py:937
tuple cout
Definition: gather_cfg.py:144
bool isRPeriodic() const
Returns true if the Dets are periodic in R.
Definition: RBorderFinder.h:32
std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const override
const BoundDisk & specificSurface() const
Return the ring surface as a BoundDisk.
bool isROverlapping() const
Returns true if any 2 of the Det overlap in R.
Definition: RBorderFinder.h:35
std::vector< const GeomDet * > theBasicComps