CMS 3D CMS Logo

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