CMS 3D CMS Logo

TIDRing.cc
Go to the documentation of this file.
1 #include "TIDRing.h"
2 
4 
11 
12 #include "LayerCrossingSide.h"
13 #include "DetGroupMerger.h"
15 
16 #include "TkDetUtil.h"
18 #include <boost/function.hpp>
19 
20 using namespace std;
21 
23 
24 TIDRing::TIDRing(std::vector<const GeomDet*>& innerDets, std::vector<const GeomDet*>& outerDets)
26  theFrontDets(innerDets.begin(), innerDets.end()),
27  theBackDets(outerDets.begin(), outerDets.end()) {
28  theDets.assign(theFrontDets.begin(), theFrontDets.end());
29  theDets.insert(theDets.end(), theBackDets.begin(), theBackDets.end());
30 
31  // the dets should be already phi-ordered. TO BE CHECKED
32  //sort( theFrontDets.begin(), theFrontDets.end(), DetLessPhi() );
33  //sort( theBackDets.begin(), theBackDets.end(), DetLessPhi() );
34 
36 
39 
40  theFrontBinFinder = BinFinderType(theFrontDets.front()->surface().position().phi(), theFrontDets.size());
41  theBackBinFinder = BinFinderType(theBackDets.front()->surface().position().phi(), theBackDets.size());
42 
43  LogDebug("TkDetLayers") << "DEBUG INFO for TIDRing";
44  for (vector<const GeomDet*>::const_iterator it = theFrontDets.begin(); it != theFrontDets.end(); it++) {
45  LogDebug("TkDetLayers") << "frontDet phi,z,r: " << (*it)->surface().position().phi() << " , "
46  << (*it)->surface().position().z() << " , " << (*it)->surface().position().perp();
47  }
48 
49  for (vector<const GeomDet*>::const_iterator it = theBackDets.begin(); it != theBackDets.end(); it++) {
50  LogDebug("TkDetLayers") << "backDet phi,z,r: " << (*it)->surface().position().phi() << " , "
51  << (*it)->surface().position().z() << " , " << (*it)->surface().position().perp();
52  }
53 }
54 
56 
57 const vector<const GeometricSearchDet*>& TIDRing::components() const {
58  throw DetLayerException("TIDRing doesn't have GeometricSearchDet components");
59 }
60 
61 pair<bool, TrajectoryStateOnSurface> TIDRing::compatible(const TrajectoryStateOnSurface&,
62  const Propagator&,
63  const MeasurementEstimator&) const {
64  edm::LogError("TkDetLayers") << "temporary dummy implementation of TIDRing::compatible()!!";
65  return pair<bool, TrajectoryStateOnSurface>();
66 }
67 
69  const Propagator& prop,
70  const MeasurementEstimator& est,
71  std::vector<DetGroup>& result) const {
72  SubLayerCrossings crossings;
73  crossings = computeCrossings(tsos, prop.propagationDirection());
74  if (!crossings.isValid())
75  return;
76 
77  std::vector<DetGroup> closestResult;
78  addClosest(tsos, prop, est, crossings.closest(), closestResult);
79  if (closestResult.empty())
80  return;
81 
82  DetGroupElement closestGel(closestResult.front().front());
83  float phiWindow = tkDetUtil::computeWindowSize(closestGel.det(), closestGel.trajectoryState(), est);
84  searchNeighbors(tsos, prop, est, crossings.closest(), phiWindow, closestResult, false);
85 
86  vector<DetGroup> nextResult;
87  searchNeighbors(tsos, prop, est, crossings.other(), phiWindow, nextResult, true);
88 
89  int crossingSide = LayerCrossingSide().endcapSide(closestGel.trajectoryState(), prop);
91  std::move(closestResult), std::move(nextResult), result, crossings.closestIndex(), crossingSide);
92 }
93 
94 // indentical in CompositeTECWedge
96  PropagationDirection propDir) const {
97  HelixPlaneCrossing::PositionType startPos(startingState.globalPosition());
98  HelixPlaneCrossing::DirectionType startDir(startingState.globalMomentum());
99 
100  auto rho = startingState.transverseCurvature();
101 
102  HelixForwardPlaneCrossing crossing(startPos, startDir, rho, propDir);
103 
104  pair<bool, double> frontPath = crossing.pathLength(*theFrontDisk);
105  if (!frontPath.first)
106  return SubLayerCrossings();
107 
108  pair<bool, double> backPath = crossing.pathLength(*theBackDisk);
109  if (!backPath.first)
110  return SubLayerCrossings();
111 
112  GlobalPoint gFrontPoint(crossing.position(frontPath.second));
113  GlobalPoint gBackPoint(crossing.position(backPath.second));
114 
115  int frontIndex = theFrontBinFinder.binIndex(gFrontPoint.barePhi());
116  SubLayerCrossing frontSLC(0, frontIndex, gFrontPoint);
117 
118  int backIndex = theBackBinFinder.binIndex(gBackPoint.barePhi());
119  SubLayerCrossing backSLC(1, backIndex, gBackPoint);
120 
121  // 0ss: frontDisk has index=0, backDisk has index=1
122  float frontDist = std::abs(Geom::deltaPhi(gFrontPoint.barePhi(), theFrontDets[frontIndex]->surface().phi()));
123  float backDist = std::abs(Geom::deltaPhi(gBackPoint.barePhi(), theBackDets[backIndex]->surface().phi()));
124 
125  if (frontDist < backDist) {
126  return SubLayerCrossings(frontSLC, backSLC, 0);
127  } else {
128  return SubLayerCrossings(backSLC, frontSLC, 1);
129  }
130 }
131 
133  const Propagator& prop,
134  const MeasurementEstimator& est,
135  const SubLayerCrossing& crossing,
136  vector<DetGroup>& result) const {
137  const vector<const GeomDet*>& sub(subLayer(crossing.subLayerIndex()));
138  const GeomDet* det(sub[crossing.closestDetIndex()]);
139  return CompatibleDetToGroupAdder::add(*det, tsos, prop, est, result);
140 }
141 
143  const Propagator& prop,
144  const MeasurementEstimator& est,
145  const SubLayerCrossing& crossing,
146  float window,
147  vector<DetGroup>& result,
148  bool checkClosest) const {
149  const GlobalPoint& gCrossingPos = crossing.position();
150 
151  const vector<const GeomDet*>& sLayer(subLayer(crossing.subLayerIndex()));
152 
153  int closestIndex = crossing.closestDetIndex();
154  int negStartIndex = closestIndex - 1;
155  int posStartIndex = closestIndex + 1;
156 
157  if (checkClosest) { // must decide if the closest is on the neg or pos side
158  if (Geom::phiLess(gCrossingPos.barePhi(), sLayer[closestIndex]->surface().phi())) {
159  posStartIndex = closestIndex;
160  } else {
161  negStartIndex = closestIndex;
162  }
163  }
164 
165  const BinFinderType& binFinder = (crossing.subLayerIndex() == 0 ? theFrontBinFinder : theBackBinFinder);
166 
167  typedef CompatibleDetToGroupAdder Adder;
168  int half = sLayer.size() / 2; // to check if dets are called twice....
169  for (int idet = negStartIndex; idet >= negStartIndex - half; idet--) {
170  const GeomDet& neighborDet = *sLayer[binFinder.binIndex(idet)];
171  if (!tkDetUtil::overlapInPhi(gCrossingPos, neighborDet, window))
172  break;
173  if (!Adder::add(neighborDet, tsos, prop, est, result))
174  break;
175  // maybe also add shallow crossing angle test here???
176  }
177  for (int idet = posStartIndex; idet < posStartIndex + half; idet++) {
178  const GeomDet& neighborDet = *sLayer[binFinder.binIndex(idet)];
179  if (!tkDetUtil::overlapInPhi(gCrossingPos, neighborDet, window))
180  break;
181  if (!Adder::add(neighborDet, tsos, prop, est, result))
182  break;
183  // maybe also add shallow crossing angle test here???
184  }
185 }
#define LogDebug(id)
PeriodicBinFinderInPhi< float > BinFinderType
Definition: TIDRing.h:68
Common base class.
void searchNeighbors(const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, const SubLayerCrossing &crossing, float window, std::vector< DetGroup > &result, bool checkClosest) const __attribute__((hot))
Definition: TIDRing.cc:142
std::vector< const GeomDet * > theDets
Definition: TIDRing.h:60
SubLayerCrossings computeCrossings(const TrajectoryStateOnSurface &tsos, PropagationDirection propDir) const __attribute__((hot))
Definition: TIDRing.cc:95
int closestIndex() const
int closestDetIndex() const
GeometricSearchDet::DetWithState DetWithState
Definition: TIDRing.cc:22
std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &, const Propagator &, const MeasurementEstimator &) const override
Definition: TIDRing.cc:61
void groupedCompatibleDetsV(const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, std::vector< DetGroup > &result) const override __attribute__((hot))
Definition: TIDRing.cc:68
int binIndex(T phi) const override
returns an index in the valid range for the bin that contains phi
GlobalPoint globalPosition() const
PropagationDirection
BinFinderType theFrontBinFinder
Definition: TIDRing.h:70
bool overlapInPhi(float phi, const GeomDet &det, float phiWindow)
Definition: TkDetUtil.h:18
const std::vector< const GeometricSearchDet * > & components() const override __attribute__((cold))
Returns basic components, if any.
Definition: TIDRing.cc:57
bool addClosest(const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, const SubLayerCrossing &crossing, std::vector< DetGroup > &result) const __attribute__((hot))
Definition: TIDRing.cc:132
const GlobalPoint & position() const
float computeWindowSize(const GeomDet *det, const TrajectoryStateOnSurface &tsos, const MeasurementEstimator &est)
Definition: TkDetUtil.cc:10
T barePhi() const
Definition: PV3DBase.h:65
std::pair< bool, double > pathLength(const Plane &plane) override
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:139
~TIDRing() override
Definition: TIDRing.cc:55
std::vector< const GeomDet * > theFrontDets
Definition: TIDRing.h:61
int subLayerIndex() const
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static int endcapSide(const TrajectoryStateOnSurface &startingState, const Propagator &prop)
ReferenceCountingPointer< BoundDisk > theBackDisk
Definition: TIDRing.h:66
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
bool phiLess(float phi1, float phi2)
Definition: VectorUtil.h:18
const SubLayerCrossing & other() const
static bool add(const GeometricSearchDet &det, const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, std::vector< DetGroup > &result) __attribute__((hot))
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
ReferenceCountingPointer< BoundDisk > theFrontDisk
Definition: TIDRing.h:65
ReferenceCountingPointer< BoundDisk > theDisk
Definition: TIDRing.h:64
BinFinderType theBackBinFinder
Definition: TIDRing.h:71
const SubLayerCrossing & closest() const
#define begin
Definition: vmac.h:32
GlobalVector globalMomentum() const
static void orderAndMergeTwoLevels(std::vector< DetGroup > &&one, std::vector< DetGroup > &&two, std::vector< DetGroup > &result, int firstIndex, int firstCrossed)
const std::vector< const GeomDet * > & subLayer(int ind) const
Definition: TIDRing.h:57
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
TIDRing(std::vector< const GeomDet * > &innerDets, std::vector< const GeomDet * > &outerDets)
Definition: TIDRing.cc:24
PositionType position(double s) const override
def move(src, dest)
Definition: eostools.py:511
std::vector< const GeomDet * > theBackDets
Definition: TIDRing.h:62