CMS 3D CMS Logo

TIBRing.cc
Go to the documentation of this file.
1 #include "TIBRing.h"
2 
4 
12 
13 #include "LayerCrossingSide.h"
14 #include "DetGroupMerger.h"
16 
17 using namespace std;
18 
20 
21 TIBRing::TIBRing(vector<const GeomDet*>& theGeomDets)
22  : GeometricSearchDet(true), theDets(theGeomDets.begin(), theGeomDets.end()) {
23  //checkRadius( first, last);
24  //sort( theDets.begin(), theDets.end(), DetLessPhi());
25  //checkPeriodicity( theDets.begin(), theDets.end());
26 
27  theBinFinder = BinFinderType(theDets.front()->surface().position().phi(), theDets.size());
28 
30 
32 
33  LogDebug("TkDetLayers") << "==== DEBUG TIBRing =====";
34  LogDebug("TkDetLayers") << "radius, thickness, lenght: " << theCylinder->radius() << " , "
35  << theCylinder->bounds().thickness() << " , " << theCylinder->bounds().length();
36 
37  for (vector<const GeomDet*>::const_iterator i = theDets.begin(); i != theDets.end(); i++) {
38  LogDebug("TkDetLayers") << "Ring's Det pos z,perp,eta,phi: " << (**i).position().z() << " , "
39  << (**i).position().perp() << " , " << (**i).position().eta() << " , "
40  << (**i).position().phi();
41  }
42  LogDebug("TkDetLayers") << "==== end DEBUG TIBRing =====";
43 }
44 
45 const vector<const GeometricSearchDet*>& TIBRing::components() const {
46  throw DetLayerException("TIBRing doesn't have GeometricSearchDet components");
47 }
48 
49 void TIBRing::checkRadius(vector<const GeomDet*>::const_iterator first, vector<const GeomDet*>::const_iterator last) {
50  // check radius range
51  float rMin = 10000.;
52  float rMax = 0.;
53  for (vector<const GeomDet*>::const_iterator i = first; i != last; i++) {
54  float r = (**i).surface().position().perp();
55  if (r < rMin)
56  rMin = r;
57  if (r > rMax)
58  rMax = r;
59  }
60  if (rMax - rMin > 0.1)
61  throw DetLayerException("TIBRing construction failed: detectors not at constant radius");
62 }
63 
64 void TIBRing::checkPeriodicity(vector<const GeomDet*>::const_iterator first,
65  vector<const GeomDet*>::const_iterator last) {
66  vector<double> adj_diff(last - first - 1);
67  for (int i = 0; i < static_cast<int>(adj_diff.size()); i++) {
68  vector<const GeomDet*>::const_iterator curent = first + i;
69  adj_diff[i] = (**(curent + 1)).surface().position().phi() - (**curent).surface().position().phi();
70  }
71  double step = stat_mean(adj_diff);
72  double phi_step = 2. * Geom::pi() / (last - first);
73 
74  if (std::abs(step - phi_step) / phi_step > 0.01) {
75  int ndets = last - first;
76  edm::LogError("TkDetLayers") << "TIBRing Warning: not periodic. ndets=" << ndets;
77  for (int j = 0; j < ndets; j++) {
78  edm::LogError("TkDetLayers") << "Dets(r,phi): (" << theDets[j]->surface().position().perp() << ","
79  << theDets[j]->surface().position().phi() << ") ";
80  }
81  throw DetLayerException("Error: TIBRing is not periodic");
82  }
83 }
84 
86  const GeomDet& det = *theDets.front();
87  GlobalVector radial = det.surface().position() - GlobalPoint(0, 0, 0);
88  GlobalVector normal = det.surface().toGlobal(LocalVector(0, 0, 1));
89  if (normal.dot(radial) <= 0)
90  normal *= -1;
91  // edm::LogInfo(TkDetLayers) << "BarrelDetRing::computeHelicity: phi(normal) " << normal.phi()
92  // << " phi(radial) " << radial.phi() ;
93  if (Geom::phiLess(normal.phi(), radial.phi())) {
94  theHelicity = 1; // smaller phi angles mean "inner" group
95  } else {
96  theHelicity = 0; // smaller phi angles mean "outer" group
97  }
98 }
99 
101 
102 pair<bool, TrajectoryStateOnSurface> TIBRing::compatible(const TrajectoryStateOnSurface& ts,
103  const Propagator&,
104  const MeasurementEstimator&) const {
105  edm::LogError("TkDetLayers") << "temporary dummy implementation of TIBRing::compatible()!!";
106  return pair<bool, TrajectoryStateOnSurface>();
107 }
108 
110  const Propagator& prop,
111  const MeasurementEstimator& est,
112  vector<DetGroup>& result) const {
113  vector<DetGroup> closestResult;
114  SubRingCrossings crossings;
115  crossings = computeCrossings(tsos, prop.propagationDirection());
116  if (!crossings.isValid_)
117  return;
118 
119  typedef CompatibleDetToGroupAdder Adder;
120  Adder::add(*theDets[theBinFinder.binIndex(crossings.closestIndex)], tsos, prop, est, closestResult);
121 
122  if (closestResult.empty()) {
123  Adder::add(*theDets[theBinFinder.binIndex(crossings.nextIndex)], tsos, prop, est, result);
124  return;
125  }
126 
127  DetGroupElement closestGel(closestResult.front().front());
128  float window = computeWindowSize(closestGel.det(), closestGel.trajectoryState(), est);
129 
130  float detWidth = closestGel.det()->surface().bounds().width();
131  if (crossings.nextDistance < detWidth + window) {
132  vector<DetGroup> nextResult;
133  if (Adder::add(*theDets[theBinFinder.binIndex(crossings.nextIndex)], tsos, prop, est, nextResult)) {
134  int crossingSide = LayerCrossingSide::barrelSide(tsos, prop);
135  if (crossings.closestIndex < crossings.nextIndex) {
137  std::move(closestResult), std::move(nextResult), result, theHelicity, crossingSide);
138  } else {
140  std::move(nextResult), std::move(closestResult), result, theHelicity, crossingSide);
141  }
142  } else {
143  result.swap(closestResult);
144  }
145  } else {
146  result.swap(closestResult);
147  }
148 
149  // only loop over neighbors (other than closest and next) if window is BIG
150  if (window > 0.5f * detWidth) {
151  searchNeighbors(tsos, prop, est, crossings, window, result);
152  }
153 }
154 
156  const Propagator& prop,
157  const MeasurementEstimator& est,
158  const SubRingCrossings& crossings,
159  float window,
160  vector<DetGroup>& result) const {
161  typedef CompatibleDetToGroupAdder Adder;
162  int crossingSide = LayerCrossingSide::barrelSide(tsos, prop);
163  typedef DetGroupMerger Merger;
164 
165  int negStart = std::min(crossings.closestIndex, crossings.nextIndex) - 1;
166  int posStart = std::max(crossings.closestIndex, crossings.nextIndex) + 1;
167 
168  int quarter = theDets.size() / 4;
169  for (int idet = negStart; idet >= negStart - quarter + 1; idet--) {
170  const GeomDet* neighbor = theDets[theBinFinder.binIndex(idet)];
171  // if (!overlap( gCrossingPos, *neighbor, window)) break; // mybe not needed?
172  // maybe also add shallow crossing angle test here???
173  vector<DetGroup> tmp1;
174  if (!Adder::add(*neighbor, tsos, prop, est, tmp1))
175  break;
176  vector<DetGroup> tmp2;
177  tmp2.swap(result);
178  vector<DetGroup> newResult;
179  Merger::orderAndMergeTwoLevels(std::move(tmp1), std::move(tmp2), newResult, theHelicity, crossingSide);
180  result.swap(newResult);
181  }
182  for (int idet = posStart; idet < posStart + quarter - 1; idet++) {
183  const GeomDet* neighbor = theDets[theBinFinder.binIndex(idet)];
184  // if (!overlap( gCrossingPos, *neighbor, window)) break; // mybe not needed?
185  // maybe also add shallow crossing angle test here???
186  vector<DetGroup> tmp1;
187  if (!Adder::add(*neighbor, tsos, prop, est, tmp1))
188  break;
189  vector<DetGroup> tmp2;
190  tmp2.swap(result);
191  vector<DetGroup> newResult;
192  Merger::orderAndMergeTwoLevels(std::move(tmp2), std::move(tmp1), newResult, theHelicity, crossingSide);
193  result.swap(newResult);
194  }
195 }
196 
198  PropagationDirection propDir) const {
199  typedef HelixBarrelPlaneCrossing2OrderLocal Crossing;
201 
202  GlobalPoint startPos(startingState.globalPosition());
203  GlobalVector startDir(startingState.globalMomentum());
204  auto rho = startingState.transverseCurvature();
205 
206  HelixBarrelCylinderCrossing cylCrossing(
207  startPos, startDir, rho, propDir, specificSurface(), HelixBarrelCylinderCrossing::bestSol);
208 
209  if (!cylCrossing.hasSolution())
210  return SubRingCrossings();
211 
212  GlobalPoint cylPoint(cylCrossing.position());
213  GlobalVector cylDir(cylCrossing.direction());
214  int closestIndex = theBinFinder.binIndex(cylPoint.barePhi());
215 
216  const Plane& closestPlane(theDets[closestIndex]->surface());
217 
218  LocalPoint closestPos = Crossing::positionOnly(cylPoint, cylDir, rho, closestPlane);
219  float closestDist = closestPos.x(); // use fact that local X perp to global Z
220 
221  //int next = cylPoint.phi() - closestPlane.position().phi() > 0 ? closest+1 : closest-1;
222  int nextIndex =
223  Geom::phiLess(closestPlane.position().barePhi(), cylPoint.barePhi()) ? closestIndex + 1 : closestIndex - 1;
224 
225  const Plane& nextPlane(theDets[theBinFinder.binIndex(nextIndex)]->surface());
226  LocalPoint nextPos = Crossing::positionOnly(cylPoint, cylDir, rho, nextPlane);
227  float nextDist = nextPos.x();
228 
229  if (std::abs(closestDist) < std::abs(nextDist)) {
230  return SubRingCrossings(closestIndex, nextIndex, nextDist);
231  } else {
232  return SubRingCrossings(nextIndex, closestIndex, closestDist);
233  }
234 }
235 
237  const TrajectoryStateOnSurface& tsos,
238  const MeasurementEstimator& est) const {
239  return est.maximalLocalDisplacement(tsos, det->surface()).x();
240 }
#define LogDebug(id)
const BoundSurface & surface() const override
The surface of the GeometricSearchDet.
Definition: TIBRing.h:18
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
Definition: Surface.h:81
Common base class.
Local3DVector LocalVector
Definition: LocalVector.h:12
static int barrelSide(const TrajectoryStateOnSurface &startingState, const Propagator &prop)
returns 0 if barrel layer crossed from inside, 1 if from outside
BinFinderType theBinFinder
Definition: TIBRing.h:77
TIBRing(std::vector< const GeomDet * > &theGeomDets) __attribute__((cold))
Definition: TIBRing.cc:21
void computeHelicity() __attribute__((cold))
Definition: TIBRing.cc:85
std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &ts, const Propagator &, const MeasurementEstimator &) const override __attribute__((cold))
Definition: TIBRing.cc:102
GeometricSearchDet::DetWithState DetWithState
Definition: TIBRing.cc:19
Geom::Phi< T > phi() const
Definition: PV3DBase.h:66
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
std::vector< const GeomDet * > theDets
Definition: TIBRing.h:79
int binIndex(T phi) const override
returns an index in the valid range for the bin that contains phi
GlobalPoint globalPosition() const
PreciseFloatType< T, U >::Type dot(const Vector3DBase< U, FrameTag > &v) const
Definition: Vector3DBase.h:99
PropagationDirection
const std::vector< const GeometricSearchDet * > & components() const override __attribute__((cold))
Returns basic components, if any.
Definition: TIBRing.cc:45
double stat_mean(const CONT &cont)
Definition: simple_stat.h:13
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
Definition: Plane.h:16
void checkRadius(std::vector< const GeomDet * >::const_iterator first, std::vector< const GeomDet * >::const_iterator last) __attribute__((cold))
Definition: TIBRing.cc:49
ReferenceCountingPointer< BoundCylinder > theCylinder
Definition: TIBRing.h:80
void groupedCompatibleDetsV(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est, std::vector< DetGroup > &result) const override __attribute__((hot))
Definition: TIBRing.cc:109
T barePhi() const
Definition: PV3DBase.h:65
int theHelicity
Definition: TIBRing.h:81
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:139
float computeWindowSize(const GeomDet *det, const TrajectoryStateOnSurface &tsos, const MeasurementEstimator &est) const __attribute__((hot))
Definition: TIBRing.cc:236
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
def window(xmin, xmax, ymin, ymax, x=0, y=0, width=100, height=100, xlogbase=None, ylogbase=None, minusInfinity=-1000, flipx=False, flipy=True)
Definition: svgfig.py:643
#define end
Definition: vmac.h:39
T min(T a, T b)
Definition: MathUtil.h:58
void searchNeighbors(const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, const SubRingCrossings &crossings, float window, std::vector< DetGroup > &result) const __attribute__((hot))
Definition: TIBRing.cc:155
bool phiLess(float phi1, float phi2)
Definition: VectorUtil.h:18
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
PeriodicBinFinderInPhi< float > BinFinderType
Definition: TIBRing.h:76
virtual const BoundCylinder & specificSurface() const
Return the ring surface as a.
Definition: TIBRing.h:37
~TIBRing() override __attribute__((cold))
Definition: TIBRing.cc:100
SubRingCrossings computeCrossings(const TrajectoryStateOnSurface &startingState, PropagationDirection propDir) const __attribute__((hot))
Definition: TIBRing.cc:197
#define begin
Definition: vmac.h:32
GlobalVector globalMomentum() const
virtual Local2DVector maximalLocalDisplacement(const TrajectoryStateOnSurface &ts, const Plane &plane) const =0
Vector2DBase< float, LocalTag > Local2DVector
void checkPeriodicity(std::vector< const GeomDet * >::const_iterator first, std::vector< const GeomDet * >::const_iterator last) __attribute__((cold))
Definition: TIBRing.cc:64
static void orderAndMergeTwoLevels(std::vector< DetGroup > &&one, std::vector< DetGroup > &&two, std::vector< DetGroup > &result, int firstIndex, int firstCrossed)
step
Definition: StallMonitor.cc:94
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
constexpr double pi()
Definition: Pi.h:31
T x() const
Definition: PV3DBase.h:59
const PositionType & position() const
def move(src, dest)
Definition: eostools.py:511