CMS 3D CMS Logo

Phase2OTBarrelRod.cc
Go to the documentation of this file.
1 #include "Phase2OTBarrelRod.h"
2 
4 
9 
10 #include "LayerCrossingSide.h"
11 #include "DetGroupMerger.h"
13 
14 using namespace std;
15 
17 
18 namespace {
19  class DetGroupElementPerpLess {
20  public:
21  bool operator()(DetGroup a, DetGroup b) const {
22  return (a.front().det()->position().perp() < b.front().det()->position().perp());
23  }
24  };
25 } // namespace
26 
27 Phase2OTBarrelRod::Phase2OTBarrelRod(vector<const GeomDet*>& innerDets,
28  vector<const GeomDet*>& outerDets,
29  vector<const GeomDet*>& innerDetBrothers,
30  vector<const GeomDet*>& outerDetBrothers)
31  : DetRod(true),
32  theInnerDets(innerDets),
33  theOuterDets(outerDets),
34  theInnerDetBrothers(innerDetBrothers),
35  theOuterDetBrothers(outerDetBrothers) {
36  theDets.assign(theInnerDets.begin(), theInnerDets.end());
37  theDets.insert(theDets.end(), theOuterDets.begin(), theOuterDets.end());
38  theDets.insert(theDets.end(), theInnerDetBrothers.begin(), theInnerDetBrothers.end());
39  theDets.insert(theDets.end(), theOuterDetBrothers.begin(), theOuterDetBrothers.end());
40 
41  RodPlaneBuilderFromDet planeBuilder;
42  setPlane(planeBuilder(theDets));
43  theInnerPlane = planeBuilder(theInnerDets);
44  theOuterPlane = planeBuilder(theOuterDets);
45 
46  // modules be already sorted in z
47 
50 
51 #ifdef EDM_ML_DEBUG
52  LogDebug("TkDetLayers") << "==== DEBUG Phase2OTBarrelRod =====";
53  for (vector<const GeomDet*>::const_iterator i = theInnerDets.begin(); i != theInnerDets.end(); i++) {
54  LogDebug("TkDetLayers") << "inner Phase2OTBarrelRod's Det pos z,perp,eta,phi: " << (**i).position().z() << " , "
55  << (**i).position().perp() << " , " << (**i).position().eta() << " , "
56  << (**i).position().phi();
57  }
58 
59  for (vector<const GeomDet*>::const_iterator i = theInnerDetBrothers.begin(); i != theInnerDetBrothers.end(); i++) {
60  LogDebug("TkDetLayers") << "inner Phase2OTBarrelRod's Det Brother pos z,perp,eta,phi: " << (**i).position().z()
61  << " , " << (**i).position().perp() << " , " << (**i).position().eta() << " , "
62  << (**i).position().phi();
63  }
64 
65  for (vector<const GeomDet*>::const_iterator i = theOuterDets.begin(); i != theOuterDets.end(); i++) {
66  LogDebug("TkDetLayers") << "outer Phase2OTBarrelRod's Det pos z,perp,eta,phi: " << (**i).position().z() << " , "
67  << (**i).position().perp() << " , " << (**i).position().eta() << " , "
68  << (**i).position().phi();
69  }
70 
71  for (vector<const GeomDet*>::const_iterator i = theOuterDetBrothers.begin(); i != theOuterDetBrothers.end(); i++) {
72  LogDebug("TkDetLayers") << "outer Phase2OTBarrelRod's Det Brother pos z,perp,eta,phi: " << (**i).position().z()
73  << " , " << (**i).position().perp() << " , " << (**i).position().eta() << " , "
74  << (**i).position().phi();
75  }
76  LogDebug("TkDetLayers") << "==== end DEBUG Phase2OTBarrelRod =====";
77 #endif
78 }
79 
81 
82 const vector<const GeometricSearchDet*>& Phase2OTBarrelRod::components() const {
83  throw DetLayerException("Phase2OTBarrelRod doesn't have GeometricSearchDet components");
84 }
85 
86 pair<bool, TrajectoryStateOnSurface> Phase2OTBarrelRod::compatible(const TrajectoryStateOnSurface& ts,
87  const Propagator&,
88  const MeasurementEstimator&) const {
89  edm::LogError("TkDetLayers") << "temporary dummy implementation of Phase2OTBarrelRod::compatible()!!";
90  return pair<bool, TrajectoryStateOnSurface>();
91 }
92 
94  const Propagator& prop,
95  const MeasurementEstimator& est,
96  std::vector<DetGroup>& result) const {
97  SubLayerCrossings crossings;
98  crossings = computeCrossings(tsos, prop.propagationDirection());
99  if (!crossings.isValid())
100  return;
101 
102  std::vector<DetGroup> closestResult;
103  std::vector<DetGroup> closestBrotherResult;
104  addClosest(tsos, prop, est, crossings.closest(), closestResult, closestBrotherResult);
105  if (closestResult.empty()) {
106  std::vector<DetGroup> nextResult;
107  std::vector<DetGroup> nextBrotherResult;
108  addClosest(tsos, prop, est, crossings.other(), nextResult, nextBrotherResult);
109  if (nextResult.empty())
110  return;
111 
112  DetGroupElement nextGel(nextResult.front().front());
113  int crossingSide = LayerCrossingSide().barrelSide(nextGel.trajectoryState(), prop);
114  std::vector<DetGroup> closestCompleteResult;
116  std::move(closestResult), std::move(closestBrotherResult), closestCompleteResult, 0, crossingSide);
117  std::vector<DetGroup> nextCompleteResult;
119  std::move(nextResult), std::move(nextBrotherResult), nextCompleteResult, 0, crossingSide);
120 
122  std::move(closestCompleteResult), std::move(nextCompleteResult), result, crossings.closestIndex(), crossingSide);
123  } else {
124  DetGroupElement closestGel(closestResult.front().front());
125  int crossingSide = LayerCrossingSide().barrelSide(closestGel.trajectoryState(), prop);
126  float window = computeWindowSize(closestGel.det(), closestGel.trajectoryState(), est);
127 
128  searchNeighbors(tsos, prop, est, crossings.closest(), window, closestResult, closestBrotherResult, false);
129 
130  std::vector<DetGroup> closestCompleteResult;
132  std::move(closestResult), std::move(closestBrotherResult), closestCompleteResult, 0, crossingSide);
133 
134  std::vector<DetGroup> nextResult;
135  std::vector<DetGroup> nextBrotherResult;
136  searchNeighbors(tsos, prop, est, crossings.other(), window, nextResult, nextBrotherResult, true);
137 
138  std::vector<DetGroup> nextCompleteResult;
140  std::move(nextResult), std::move(nextBrotherResult), nextCompleteResult, 0, crossingSide);
141 
143  std::move(closestCompleteResult), std::move(nextCompleteResult), result, crossings.closestIndex(), crossingSide);
144  }
145 
146  //due to propagator problems, when we add single pt sub modules, we should order them in r (barrel)
147  sort(result.begin(), result.end(), DetGroupElementPerpLess());
148  for (auto& grp : result) {
149  if (grp.empty())
150  continue;
151  LogTrace("TkDetLayers") << "New group in Phase2OTBarrelRod made by : ";
152  for (auto const& det : grp) {
153  LogTrace("TkDetLayers") << " geom det at r: " << det.det()->position().perp()
154  << " id:" << det.det()->geographicalId().rawId()
155  << " tsos at:" << det.trajectoryState().globalPosition();
156  }
157  }
158 }
159 
161  PropagationDirection propDir) const {
162  GlobalPoint startPos(startingState.globalPosition());
163  GlobalVector startDir(startingState.globalMomentum());
164  double rho(startingState.transverseCurvature());
165 
166  HelixBarrelPlaneCrossingByCircle crossing(startPos, startDir, rho, propDir);
167 
168  std::pair<bool, double> outerPath = crossing.pathLength(*theOuterPlane);
169  if (!outerPath.first)
170  return SubLayerCrossings();
171  GlobalPoint gOuterPoint(crossing.position(outerPath.second));
172 
173  std::pair<bool, double> innerPath = crossing.pathLength(*theInnerPlane);
174  if (!innerPath.first)
175  return SubLayerCrossings();
176  GlobalPoint gInnerPoint(crossing.position(innerPath.second));
177 
178  int innerIndex = theInnerBinFinder.binIndex(gInnerPoint.z());
179  float innerDist = std::abs(theInnerBinFinder.binPosition(innerIndex) - gInnerPoint.z());
180  SubLayerCrossing innerSLC(0, innerIndex, gInnerPoint);
181 
182  int outerIndex = theOuterBinFinder.binIndex(gOuterPoint.z());
183  float outerDist = std::abs(theOuterBinFinder.binPosition(outerIndex) - gOuterPoint.z());
184  SubLayerCrossing outerSLC(1, outerIndex, gOuterPoint);
185 
186  if (innerDist < outerDist) {
187  return SubLayerCrossings(innerSLC, outerSLC, 0);
188  } else {
189  return SubLayerCrossings(outerSLC, innerSLC, 1);
190  }
191 }
192 
194  const Propagator& prop,
195  const MeasurementEstimator& est,
196  const SubLayerCrossing& crossing,
197  vector<DetGroup>& result,
198  vector<DetGroup>& brotherresult) const {
199  const vector<const GeomDet*>& sRod(subRod(crossing.subLayerIndex()));
200  bool firstgroup = CompatibleDetToGroupAdder::add(*sRod[crossing.closestDetIndex()], tsos, prop, est, result);
201  // it assumes that the closestDetIndex is ok also for the brother detectors: the crossing is NOT recomputed
202  const vector<const GeomDet*>& sRodBrothers(subRodBrothers(crossing.subLayerIndex()));
203  bool brothergroup =
204  CompatibleDetToGroupAdder::add(*sRodBrothers[crossing.closestDetIndex()], tsos, prop, est, brotherresult);
205 
206  return firstgroup || brothergroup;
207 }
208 
210  const TrajectoryStateOnSurface& tsos,
211  const MeasurementEstimator& est) const {
212  return est.maximalLocalDisplacement(tsos, det->surface()).y();
213 }
214 
215 namespace {
216 
217  inline bool overlap(const GlobalPoint& crossPoint, const GeomDet& det, float window) {
218  // check if the z window around TSOS overlaps with the detector theDet (with a 1% margin added)
219 
220  // const float tolerance = 0.1;
221  constexpr float relativeMargin = 1.01;
222 
223  LocalPoint localCrossPoint(det.surface().toLocal(crossPoint));
224  // if (std::abs(localCrossPoint.z()) > tolerance) {
225  // edm::LogInfo(TkDetLayers) << "TOBRod::overlap calculation assumes point on surface, but it is off by "
226  // << localCrossPoint.z() ;
227  // }
228 
229  float localY = localCrossPoint.y();
230  float detHalfLength = 0.5f * det.surface().bounds().length();
231 
232  // edm::LogInfo(TkDetLayers) << "TOBRod::overlap: Det at " << det.position() << " hit at " << localY
233  // << " Window " << window << " halflength " << detHalfLength ;
234 
235  return (std::abs(localY) - window) < relativeMargin * detHalfLength;
236  }
237 
238 } // namespace
239 
241  const Propagator& prop,
242  const MeasurementEstimator& est,
243  const SubLayerCrossing& crossing,
244  float window,
245  vector<DetGroup>& result,
246  vector<DetGroup>& brotherresult,
247  bool checkClosest) const {
248  const GlobalPoint& gCrossingPos = crossing.position();
249 
250  const vector<const GeomDet*>& sRod(subRod(crossing.subLayerIndex()));
251  const vector<const GeomDet*>& sBrotherRod(subRodBrothers(crossing.subLayerIndex()));
252 
253  int closestIndex = crossing.closestDetIndex();
254  int negStartIndex = closestIndex - 1;
255  int posStartIndex = closestIndex + 1;
256 
257  if (checkClosest) { // must decide if the closest is on the neg or pos side
258  if (gCrossingPos.z() < sRod[closestIndex]->surface().position().z()) {
259  posStartIndex = closestIndex;
260  } else {
261  negStartIndex = closestIndex;
262  }
263  }
264 
265  typedef CompatibleDetToGroupAdder Adder;
266  for (int idet = negStartIndex; idet >= 0; idet--) {
267  if (!overlap(gCrossingPos, *sRod[idet], window))
268  break;
269  if (!Adder::add(*sRod[idet], tsos, prop, est, result))
270  break;
271  // If the two above checks are passed also the brother module will be added with no further checks
272  Adder::add(*sBrotherRod[idet], tsos, prop, est, brotherresult);
273  }
274  for (int idet = posStartIndex; idet < static_cast<int>(sRod.size()); idet++) {
275  if (!overlap(gCrossingPos, *sRod[idet], window))
276  break;
277  if (!Adder::add(*sRod[idet], tsos, prop, est, result))
278  break;
279  // If the two above checks are passed also the brother module will be added with no further checks
280  Adder::add(*sBrotherRod[idet], tsos, prop, est, brotherresult);
281  }
282 }
Vector3DBase
Definition: Vector3DBase.h:8
SubLayerCrossing::position
const GlobalPoint & position() const
Definition: SubLayerCrossings.h:14
MeasurementEstimator
Definition: MeasurementEstimator.h:19
SubLayerCrossings::isValid
bool isValid()
Definition: SubLayerCrossings.h:28
DDAxes::y
mps_fire.i
i
Definition: mps_fire.py:355
DetWithState
GeometricSearchDet::DetWithState DetWithState
Definition: Phase2OTBarrelRod.cc:16
MessageLogger.h
Phase2OTBarrelRod.h
GeomDet
Definition: GeomDet.h:27
LayerCrossingSide
Definition: LayerCrossingSide.h:15
LayerCrossingSide.h
phase1PixelTopology::localY
constexpr uint16_t localY(uint16_t py)
Definition: phase1PixelTopology.h:58
Phase2OTBarrelRod::~Phase2OTBarrelRod
~Phase2OTBarrelRod() override __attribute__((cold))
Definition: Phase2OTBarrelRod.cc:80
SubLayerCrossings::closestIndex
int closestIndex() const
Definition: SubLayerCrossings.h:31
Phase2OTBarrelRod::subRod
const std::vector< const GeomDet * > & subRod(int ind) const
Definition: Phase2OTBarrelRod.h:66
TrajectoryStateOnSurface::globalPosition
GlobalPoint globalPosition() const
Definition: TrajectoryStateOnSurface.h:65
RodPlaneBuilderFromDet.h
svgfig.window
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
Phase2OTBarrelRod::theInnerDetBrothers
std::vector< const GeomDet * > theInnerDetBrothers
Definition: Phase2OTBarrelRod.h:76
Phase2OTBarrelRod::theOuterDets
std::vector< const GeomDet * > theOuterDets
Definition: Phase2OTBarrelRod.h:75
TrajectoryStateOnSurface::transverseCurvature
double transverseCurvature() const
Definition: TrajectoryStateOnSurface.h:70
Phase2OTBarrelRod::groupedCompatibleDetsV
void groupedCompatibleDetsV(const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, std::vector< DetGroup > &result) const override __attribute__((hot))
Definition: Phase2OTBarrelRod.cc:93
GenericBinFinderInZ::binPosition
T binPosition(int ind) const override
the middle of the bin.
Definition: GenericBinFinderInZ.h:74
Bounds::length
virtual float length() const =0
Phase2OTBarrelRod::compatible
std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &ts, const Propagator &, const MeasurementEstimator &) const override __attribute__((cold))
Definition: Phase2OTBarrelRod.cc:86
Phase2OTBarrelRod::Phase2OTBarrelRod
Phase2OTBarrelRod(std::vector< const GeomDet * > &innerDets, std::vector< const GeomDet * > &outerDets, std::vector< const GeomDet * > &innerDetBrothers, std::vector< const GeomDet * > &outerDetBrothers) __attribute__((cold))
Definition: Phase2OTBarrelRod.cc:27
PV3DBase::z
T z() const
Definition: PV3DBase.h:61
Propagator
Definition: Propagator.h:44
GeomDet::surface
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:37
TrajectoryStateOnSurface
Definition: TrajectoryStateOnSurface.h:16
DetLayerException.h
Phase2OTBarrelRod::searchNeighbors
void searchNeighbors(const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, const SubLayerCrossing &crossing, float window, std::vector< DetGroup > &result, std::vector< DetGroup > &brotherresult, bool checkClosest) const __attribute__((hot))
Definition: Phase2OTBarrelRod.cc:240
MeasurementEstimator.h
DetRod
Definition: DetRod.h:13
Surface::bounds
const Bounds & bounds() const
Definition: Surface.h:87
Propagator::propagationDirection
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:139
DetGroupMerger.h
Phase2OTBarrelRod::components
const std::vector< const GeometricSearchDet * > & components() const override __attribute__((cold))
Returns basic components, if any.
Definition: Phase2OTBarrelRod.cc:82
Point3DBase< float, GlobalTag >
b
double b
Definition: hdecay.h:118
GenericBinFinderInZ::binIndex
int binIndex(T z) const override
returns an index in the valid range for the bin closest to Z
Definition: GenericBinFinderInZ.h:35
Phase2OTBarrelRod::subRodBrothers
const std::vector< const GeomDet * > & subRodBrothers(int ind) const
Definition: Phase2OTBarrelRod.h:68
DDAxes::rho
DetGroupMerger::orderAndMergeTwoLevels
static void orderAndMergeTwoLevels(std::vector< DetGroup > &&one, std::vector< DetGroup > &&two, std::vector< DetGroup > &result, int firstIndex, int firstCrossed)
Definition: DetGroupMerger.cc:6
funct::true
true
Definition: Factorize.h:173
RodPlaneBuilderFromDet
Definition: RodPlaneBuilderFromDet.h:15
CompatibleDetToGroupAdder::add
static bool add(const GeometricSearchDet &det, const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, std::vector< DetGroup > &result) __attribute__((hot))
Definition: CompatibleDetToGroupAdder.cc:7
SubLayerCrossings::closest
const SubLayerCrossing & closest() const
Definition: SubLayerCrossings.h:29
Phase2OTBarrelRod::theOuterPlane
ReferenceCountingPointer< Plane > theOuterPlane
Definition: Phase2OTBarrelRod.h:80
Phase2OTBarrelRod::theDets
std::vector< const GeomDet * > theDets
Definition: Phase2OTBarrelRod.h:73
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:670
edm::LogError
Definition: MessageLogger.h:183
a
double a
Definition: hdecay.h:119
DetRod::setPlane
void setPlane(Plane *plane)
Set the rod's plane.
Definition: DetRod.h:28
HelixBarrelPlaneCrossingByCircle
Definition: HelixBarrelPlaneCrossingByCircle.h:13
Phase2OTBarrelRod::computeCrossings
SubLayerCrossings computeCrossings(const TrajectoryStateOnSurface &tsos, PropagationDirection propDir) const __attribute__((hot))
Definition: Phase2OTBarrelRod.cc:160
PVValHelper::add
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
Definition: PVValidationHelpers.cc:12
Phase2OTBarrelRod::theInnerPlane
ReferenceCountingPointer< Plane > theInnerPlane
Definition: Phase2OTBarrelRod.h:79
SubLayerCrossing::closestDetIndex
int closestDetIndex() const
Definition: SubLayerCrossings.h:13
Phase2OTBarrelRod::theInnerBinFinder
BinFinderType theInnerBinFinder
Definition: Phase2OTBarrelRod.h:82
DetGroupElement
Definition: DetGroup.h:10
goodZToMuMu_cfi.overlap
overlap
Definition: goodZToMuMu_cfi.py:108
GeometricSearchDet::DetWithState
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
Definition: GeometricSearchDet.h:19
Phase2OTBarrelRod::addClosest
bool addClosest(const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, const SubLayerCrossing &crossing, std::vector< DetGroup > &result, std::vector< DetGroup > &brotherresult) const __attribute__((hot))
Definition: Phase2OTBarrelRod.cc:193
CompatibleDetToGroupAdder.h
Phase2OTBarrelRod::theOuterDetBrothers
std::vector< const GeomDet * > theOuterDetBrothers
Definition: Phase2OTBarrelRod.h:77
DetLayerException
Common base class.
Definition: DetLayerException.h:15
TrajectoryStateOnSurface::globalMomentum
GlobalVector globalMomentum() const
Definition: TrajectoryStateOnSurface.h:66
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
GloballyPositioned::toLocal
LocalPoint toLocal(const GlobalPoint &gp) const
Definition: GloballyPositioned.h:98
Phase2OTBarrelRod::theInnerDets
std::vector< const GeomDet * > theInnerDets
Definition: Phase2OTBarrelRod.h:74
PropagationDirection
PropagationDirection
Definition: PropagationDirection.h:4
CompatibleDetToGroupAdder
Definition: CompatibleDetToGroupAdder.h:13
LayerCrossingSide::barrelSide
static int barrelSide(const TrajectoryStateOnSurface &startingState, const Propagator &prop)
returns 0 if barrel layer crossed from inside, 1 if from outside
Definition: LayerCrossingSide.h:18
SubLayerCrossings::other
const SubLayerCrossing & other() const
Definition: SubLayerCrossings.h:30
SubLayerCrossing
Definition: SubLayerCrossings.h:7
SubLayerCrossing::subLayerIndex
int subLayerIndex() const
Definition: SubLayerCrossings.h:12
DetGroup
Definition: DetGroup.h:41
mps_fire.result
result
Definition: mps_fire.py:303
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
LogTrace
#define LogTrace(id)
Definition: MessageLogger.h:671
Phase2OTBarrelRod::theOuterBinFinder
BinFinderType theOuterBinFinder
Definition: Phase2OTBarrelRod.h:83
Phase2OTBarrelRod::computeWindowSize
float computeWindowSize(const GeomDet *det, const TrajectoryStateOnSurface &tsos, const MeasurementEstimator &est) const __attribute__((hot))
Definition: Phase2OTBarrelRod.cc:209
MeasurementEstimator::maximalLocalDisplacement
virtual Local2DVector maximalLocalDisplacement(const TrajectoryStateOnSurface &ts, const Plane &plane) const =0
SubLayerCrossings
Definition: SubLayerCrossings.h:22
Phase2OTBarrelRod::BinFinderType
GenericBinFinderInZ< float, GeomDet > BinFinderType
Definition: Phase2OTBarrelRod.h:16
HelixBarrelPlaneCrossingByCircle.h