CMS 3D CMS Logo

CompositeTECPetal.cc
Go to the documentation of this file.
1 #include "CompositeTECPetal.h"
2 
4 
6 #include "LayerCrossingSide.h"
7 #include "DetGroupMerger.h"
9 
13 
14 #include "TkDetUtil.h"
16 
17 #include <boost/function.hpp>
18 #include <boost/bind.hpp>
19 #include <algorithm>
20 #include <numeric>
21 #include <iterator>
22 
23 using namespace std;
24 
26 
27 namespace {
28  namespace details {
29 
30  struct Mean {
31  float operator()(const GeometricSearchDet* a, const GeometricSearchDet* b) const {
32  return 0.5 * (b->position().perp() + a->position().perp());
33  }
34  float operator()(float a, float b) const { return 0.5 * (b + a); }
35  };
36 
37  void fillBoundaries(std::vector<const TECWedge*> const& dets, std::vector<float>& boundaries) {
38  boundaries.resize(dets.size());
39  std::transform(dets.begin(),
40  dets.end(),
41  boundaries.begin(),
42  boost::bind(&GlobalPoint::perp, boost::bind(&GeometricSearchDet::position, _1)));
43  std::adjacent_difference(boundaries.begin(), boundaries.end(), boundaries.begin(), Mean());
44  }
45 
46  inline int findBin(std::vector<float> const& boundaries, float r) {
47  return std::lower_bound(boundaries.begin() + 1, boundaries.end(), r) - boundaries.begin() - 1;
48  }
49 
50  void fillPars(std::vector<const TECWedge*> const& dets, std::vector<CompositeTECPetal::WedgePar>& pars) {
51  for (auto gsdet : dets) {
52  const BoundDiskSector& wedgeSector = static_cast<const BoundDiskSector&>(gsdet->surface());
53  float wedgeMinZ = std::abs(wedgeSector.position().z()) - 0.5 * wedgeSector.bounds().thickness();
54  float wedgeMaxZ = std::abs(wedgeSector.position().z()) + 0.5 * wedgeSector.bounds().thickness();
55  float thetaWedgeMin = wedgeSector.innerRadius() / wedgeMaxZ;
56  float thetaWedgeMax = wedgeSector.outerRadius() / wedgeMinZ;
57  CompositeTECPetal::WedgePar apar = {gsdet->position().perp(), thetaWedgeMin, thetaWedgeMax};
58  pars.push_back(apar);
59  }
60  }
61 
62  inline bool overlap(const GlobalPoint& gpos, const CompositeTECPetal::WedgePar& wpar, float ymax) {
63  // this method is just a duplication of overlapInR
64  // adapeted for groupedCompatibleDets() needs
65 
66  // assume "fixed theta window", i.e. margin in local y = r is changing linearly with z
67  auto tsRadius = gpos.perp();
68  auto rmin = std::max(0.f, tsRadius - ymax);
69  auto zmax = std::abs(gpos.z()) + 10.f; // add 10 cm contingency
70  auto rmax = (tsRadius + ymax);
71  auto zmin = std::abs(gpos.z()) - 10.f;
72 
73  // do the theta regions overlap ?
74 
75  return !((rmin > zmax * wpar.thetaMax) | (zmin * wpar.thetaMin > rmax));
76  }
77 
78  } // namespace details
79 } // namespace
80 
81 CompositeTECPetal::CompositeTECPetal(vector<const TECWedge*>& innerWedges, vector<const TECWedge*>& outerWedges)
82  : GeometricSearchDet(true), theFrontComps(innerWedges), theBackComps(outerWedges) {
83  theComps.assign(theFrontComps.begin(), theFrontComps.end());
84  theComps.insert(theComps.end(), theBackComps.begin(), theBackComps.end());
85 
86  details::fillBoundaries(theFrontComps, theFrontBoundaries);
87  details::fillBoundaries(theBackComps, theBackBoundaries);
88  details::fillPars(theFrontComps, theFrontPars);
89  details::fillPars(theBackComps, theBackPars);
90 
91  for (vector<const GeometricSearchDet*>::const_iterator it = theComps.begin(); it != theComps.end(); it++) {
92  theBasicComps.insert(theBasicComps.end(), (**it).basicComponents().begin(), (**it).basicComponents().end());
93  }
94 
95  //the Wedge are already R ordered
96  //sort( theWedges.begin(), theWedges.end(), DetLessR());
97  //sort( theFrontWedges.begin(), theFrontWedges.end(), DetLessR() );
98  //sort( theBackWedges.begin(), theBackWedges.end(), DetLessR() );
99  vector<const TECWedge*> allWedges;
100  allWedges.assign(innerWedges.begin(), innerWedges.end());
101  allWedges.insert(allWedges.end(), outerWedges.begin(), outerWedges.end());
102 
106 
107  //--------- DEBUG INFO --------------
108  LogDebug("TkDetLayers") << "DEBUG INFO for CompositeTECPetal";
109 
110  for (auto it = theFrontComps.begin(); it != theFrontComps.end(); it++) {
111  LogDebug("TkDetLayers") << "frontWedge phi,z,r: " << (*it)->surface().position().phi() << " , "
112  << (*it)->surface().position().z() << " , " << (*it)->surface().position().perp();
113  }
114 
115  for (auto it = theBackComps.begin(); it != theBackComps.end(); it++) {
116  LogDebug("TkDetLayers") << "backWedge phi,z,r: " << (*it)->surface().position().phi() << " , "
117  << (*it)->surface().position().z() << " , " << (*it)->surface().position().perp();
118  }
119  //-----------------------------------
120 }
121 
123  vector<const GeometricSearchDet*>::const_iterator i;
124  for (i = theComps.begin(); i != theComps.end(); i++) {
125  delete *i;
126  }
127 }
128 
129 pair<bool, TrajectoryStateOnSurface> CompositeTECPetal::compatible(const TrajectoryStateOnSurface& ts,
130  const Propagator&,
131  const MeasurementEstimator&) const {
132  edm::LogError("TkDetLayers") << "temporary dummy implementation of CompositeTECPetal::compatible()!!";
133  return pair<bool, TrajectoryStateOnSurface>();
134 }
135 
137  const Propagator& prop,
138  const MeasurementEstimator& est,
139  std::vector<DetGroup>& result) const {
140  vector<DetGroup> closestResult;
141  SubLayerCrossings crossings;
142  crossings = computeCrossings(tsos, prop.propagationDirection());
143  if (!crossings.isValid())
144  return;
145 
146  addClosest(tsos, prop, est, crossings.closest(), closestResult);
147  LogDebug("TkDetLayers") << "in TECPetal, closestResult.size(): " << closestResult.size();
148 
149  if (closestResult.empty()) {
150  vector<DetGroup> nextResult;
151  addClosest(tsos, prop, est, crossings.other(), nextResult);
152  LogDebug("TkDetLayers") << "in TECPetal, nextResult.size(): " << nextResult.size();
153  if (nextResult.empty())
154  return;
155 
156  DetGroupElement nextGel(nextResult.front().front());
157  int crossingSide = LayerCrossingSide::endcapSide(nextGel.trajectoryState(), prop);
159  std::move(closestResult), std::move(nextResult), result, crossings.closestIndex(), crossingSide);
160  } else {
161  DetGroupElement closestGel(closestResult.front().front());
162  float window = computeWindowSize(closestGel.det(), closestGel.trajectoryState(), est);
163 
164  searchNeighbors(tsos, prop, est, crossings.closest(), window, closestResult, false);
165 
166  vector<DetGroup> nextResult;
167  searchNeighbors(tsos, prop, est, crossings.other(), window, nextResult, true);
168 
169  int crossingSide = LayerCrossingSide::endcapSide(closestGel.trajectoryState(), prop);
171  std::move(closestResult), std::move(nextResult), result, crossings.closestIndex(), crossingSide);
172  }
173 }
174 
176  PropagationDirection propDir) const {
177  HelixPlaneCrossing::PositionType startPos(startingState.globalPosition());
178  HelixPlaneCrossing::DirectionType startDir(startingState.globalMomentum());
179 
180  auto rho = startingState.transverseCurvature();
181 
182  HelixForwardPlaneCrossing crossing(startPos, startDir, rho, propDir);
183 
184  pair<bool, double> frontPath = crossing.pathLength(*theFrontSector);
185  if (!frontPath.first)
186  return SubLayerCrossings();
187 
188  pair<bool, double> backPath = crossing.pathLength(*theBackSector);
189  if (!backPath.first)
190  return SubLayerCrossings();
191 
192  GlobalPoint gFrontPoint(crossing.position(frontPath.second));
193  GlobalPoint gBackPoint(crossing.position(backPath.second));
194 
195  LogDebug("TkDetLayers") << "in TECPetal,front crossing : r,z,phi: (" << gFrontPoint.perp() << "," << gFrontPoint.z()
196  << "," << gFrontPoint.phi() << ")";
197 
198  LogDebug("TkDetLayers") << "in TECPetal,back crossing r,z,phi: (" << gBackPoint.perp() << "," << gBackPoint.z() << ","
199  << gBackPoint.phi() << ")";
200 
201  int frontIndex = findBin(gFrontPoint.perp(), 0);
202  SubLayerCrossing frontSLC(0, frontIndex, gFrontPoint);
203 
204  int backIndex = findBin(gBackPoint.perp(), 1);
205  SubLayerCrossing backSLC(1, backIndex, gBackPoint);
206 
207  auto frontDist = std::abs(theFrontPars[frontIndex].theR - gFrontPoint.perp());
208  auto backDist = std::abs(theBackPars[backIndex].theR - gBackPoint.perp());
209 
210  // 0ss: frontDisk has index=0, backDisk has index=1
211  if (frontDist < backDist) {
212  return SubLayerCrossings(frontSLC, backSLC, 0);
213  } else {
214  return SubLayerCrossings(backSLC, frontSLC, 1);
215  }
216 }
217 
219  const Propagator& prop,
220  const MeasurementEstimator& est,
221  const SubLayerCrossing& crossing,
222  vector<DetGroup>& result) const {
223  auto det = subLayer(crossing.subLayerIndex())[crossing.closestDetIndex()];
224 
225  LogDebug("TkDetLayers") << "in TECPetal, adding Wedge at r,z,phi: (" << det->position().perp() << ","
226  << det->position().z() << "," << det->position().phi() << ")";
227  LogDebug("TkDetLayers") << "wedge comps size: " << det->basicComponents().size();
228 
229  return CompatibleDetToGroupAdder::add(*det, tsos, prop, est, result);
230 }
231 
233  const Propagator& prop,
234  const MeasurementEstimator& est,
235  const SubLayerCrossing& crossing,
236  float window,
237  vector<DetGroup>& result,
238  bool checkClosest) const {
239  const GlobalPoint& gCrossingPos = crossing.position();
240 
241  int closestIndex = crossing.closestDetIndex();
242  int negStartIndex = closestIndex - 1;
243  int posStartIndex = closestIndex + 1;
244 
245  float detR = findPar(closestIndex, crossing.subLayerIndex()).theR;
246 
247  if (checkClosest) { // must decide if the closest is on the neg or pos side
248  if (gCrossingPos.perp2() < detR * detR) {
249  posStartIndex = closestIndex;
250  } else {
251  negStartIndex = closestIndex;
252  }
253  }
254 
255  const std::vector<const TECWedge*>& sLayer = subLayer(crossing.subLayerIndex());
256 
257  //const BinFinderType& binFinder = (crossing.subLayerIndex()==0 ? theFrontBinFinder : theBackBinFinder);
258  int theSize = crossing.subLayerIndex() == 0 ? theFrontComps.size() : theBackComps.size();
259 
260  typedef CompatibleDetToGroupAdder Adder;
261  for (int idet = negStartIndex; idet >= 0; idet--) {
262  //if(idet<0 || idet>= theSize) {edm::LogInfo(TkDetLayers) << "===== error! gone out vector bounds.idet: " << idet ;exit;}
263  const GeometricSearchDet& neighborWedge = *sLayer[idet];
264  WedgePar const& wpar = findPar(idet, crossing.subLayerIndex());
265  if (!details::overlap(gCrossingPos, wpar, window))
266  break; // --- to check
267  if (!Adder::add(neighborWedge, tsos, prop, est, result))
268  break;
269  // maybe also add shallow crossing angle test here???
270  }
271  for (int idet = posStartIndex; idet < theSize; idet++) {
272  //if(idet<0 || idet>= theSize) {edm::LogInfo(TkDetLayers) << "===== error! gone out vector bounds.idet: " << idet ;exit;}
273  const GeometricSearchDet& neighborWedge = *sLayer[idet];
274  WedgePar const& wpar = findPar(idet, crossing.subLayerIndex());
275  if (!details::overlap(gCrossingPos, wpar, window))
276  break; // ---- to check
277  if (!Adder::add(neighborWedge, tsos, prop, est, result))
278  break;
279  // maybe also add shallow crossing angle test here???
280  }
281 }
282 
284  const TrajectoryStateOnSurface& tsos,
285  const MeasurementEstimator& est) {
286  return est.maximalLocalDisplacement(tsos, det->surface()).y();
287 }
288 
289 int CompositeTECPetal::findBin(float R, int diskSectorType) const {
290  return details::findBin(diskSectorType == 0 ? theFrontBoundaries : theBackBoundaries, R);
291 }
SubLayerCrossing::position
const GlobalPoint & position() const
Definition: SubLayerCrossings.h:14
BoundDiskSector::bounds
DiskSectorBounds const & bounds() const
Definition: BoundDiskSector.h:19
MeasurementEstimator
Definition: MeasurementEstimator.h:19
SubLayerCrossings::isValid
bool isValid()
Definition: SubLayerCrossings.h:28
DDAxes::y
mps_fire.i
i
Definition: mps_fire.py:355
MessageLogger.h
CompositeTECPetal::theBasicComps
std::vector< const GeomDet * > theBasicComps
Definition: CompositeTECPetal.h:85
GeomDet
Definition: GeomDet.h:27
CompositeTECPetal::groupedCompatibleDetsV
void groupedCompatibleDetsV(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est, std::vector< DetGroup > &result) const override __attribute__((hot))
Definition: CompositeTECPetal.cc:136
LayerCrossingSide.h
CompositeTECPetal::theBackSector
ReferenceCountingPointer< BoundDiskSector > theBackSector
Definition: CompositeTECPetal.h:97
f
double f[11][100]
Definition: MuScleFitUtils.cc:78
SubLayerCrossings::closestIndex
int closestIndex() const
Definition: SubLayerCrossings.h:31
VectorUtil.h
CompositeTECPetal::theFrontPars
std::vector< WedgePar > theFrontPars
Definition: CompositeTECPetal.h:93
TrajectoryStateOnSurface::globalPosition
GlobalPoint globalPosition() const
Definition: TrajectoryStateOnSurface.h:65
CompositeTECPetal.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
TrajectoryStateOnSurface::transverseCurvature
double transverseCurvature() const
Definition: TrajectoryStateOnSurface.h:70
GeometricSearchDet::position
virtual const Surface::PositionType & position() const
Returns position of the surface.
Definition: GeometricSearchDet.h:31
SiStripMonitorCluster_cfi.zmin
zmin
Definition: SiStripMonitorCluster_cfi.py:200
CompositeTECPetal::subLayer
const std::vector< const TECWedge * > & subLayer(int ind) const
Definition: CompositeTECPetal.h:80
Mean
Definition: SiPixelActionExecutor.h:21
CompositeTECPetal::findBin
int findBin(float R, int layer) const
Definition: CompositeTECPetal.cc:289
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
L1TOccupancyClient_cfi.ymax
ymax
Definition: L1TOccupancyClient_cfi.py:43
LayerCrossingSide::endcapSide
static int endcapSide(const TrajectoryStateOnSurface &startingState, const Propagator &prop)
Definition: LayerCrossingSide.h:31
SiStripMonitorCluster_cfi.zmax
zmax
Definition: SiStripMonitorCluster_cfi.py:201
MeasurementEstimator.h
Propagator::propagationDirection
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:139
CompositeTECPetal::theFrontComps
std::vector< const TECWedge * > theFrontComps
Definition: CompositeTECPetal.h:88
details
Definition: helper.h:56
HcalDetIdTransform::transform
unsigned transform(const HcalDetId &id, unsigned transformCode)
Definition: HcalDetIdTransform.cc:7
DetGroupMerger.h
Point3DBase< float, GlobalTag >
b
double b
Definition: hdecay.h:118
cuda_std::lower_bound
__host__ constexpr __device__ RandomIt lower_bound(RandomIt first, RandomIt last, const T &value, Compare comp={})
Definition: cudastdAlgorithm.h:27
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
TkDetUtil.h
CompositeTECPetal::theFrontSector
ReferenceCountingPointer< BoundDiskSector > theFrontSector
Definition: CompositeTECPetal.h:96
CompositeTECPetal::CompositeTECPetal
CompositeTECPetal(std::vector< const TECWedge * > &innerWedges, std::vector< const TECWedge * > &outerWedges) __attribute__((cold))
Definition: CompositeTECPetal.cc:81
funct::true
true
Definition: Factorize.h:173
CompositeTECPetal::~CompositeTECPetal
~CompositeTECPetal() override __attribute__((cold))
Definition: CompositeTECPetal.cc:122
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
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:670
edm::LogError
Definition: MessageLogger.h:183
a
double a
Definition: hdecay.h:119
SiStripPI::max
Definition: SiStripPayloadInspectorHelper.h:169
PVValHelper::add
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
Definition: PVValidationHelpers.cc:12
CompositeTECPetal::findPar
WedgePar const & findPar(int index, int diskSectorType) const
Definition: CompositeTECPetal.h:76
CompositeTECPetal::theComps
std::vector< const GeometricSearchDet * > theComps
Definition: CompositeTECPetal.h:86
SubLayerCrossing::closestDetIndex
int closestDetIndex() const
Definition: SubLayerCrossings.h:13
CompositeTECPetal::theBackComps
std::vector< const TECWedge * > theBackComps
Definition: CompositeTECPetal.h:89
DetGroupElement
Definition: DetGroup.h:10
goodZToMuMu_cfi.overlap
overlap
Definition: goodZToMuMu_cfi.py:108
ForwardDiskSectorBuilderFromWedges
Definition: ForwardDiskSectorBuilderFromWedges.h:15
CompositeTECPetal::computeCrossings
SubLayerCrossings computeCrossings(const TrajectoryStateOnSurface &tsos, PropagationDirection propDir) const __attribute__((hot))
Definition: CompositeTECPetal.cc:175
GeometricSearchDet::DetWithState
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
Definition: GeometricSearchDet.h:19
BoundDiskSector::outerRadius
float outerRadius() const
Definition: BoundDiskSector.h:15
CompositeTECPetal::theBackBoundaries
std::vector< float > theBackBoundaries
Definition: CompositeTECPetal.h:92
CompatibleDetToGroupAdder.h
HelixForwardPlaneCrossing::position
PositionType position(double s) const override
Definition: HelixForwardPlaneCrossing.cc:38
BoundDiskSector
Definition: BoundDiskSector.h:8
alignCSCRings.r
r
Definition: alignCSCRings.py:93
GloballyPositioned::position
const PositionType & position() const
Definition: GloballyPositioned.h:36
CompositeTECPetal::WedgePar::thetaMax
float thetaMax
Definition: CompositeTECPetal.h:21
TrajectoryStateOnSurface::globalMomentum
GlobalVector globalMomentum() const
Definition: TrajectoryStateOnSurface.h:66
CompositeTECPetal::WedgePar::thetaMin
float thetaMin
Definition: CompositeTECPetal.h:21
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
CompositeTECPetal::computeWindowSize
static float computeWindowSize(const GeomDet *det, const TrajectoryStateOnSurface &tsos, const MeasurementEstimator &est) __attribute__((hot))
Definition: CompositeTECPetal.cc:283
CompositeTECPetal::theDiskSector
ReferenceCountingPointer< BoundDiskSector > theDiskSector
Definition: CompositeTECPetal.h:50
HelixForwardPlaneCrossing::pathLength
std::pair< bool, double > pathLength(const Plane &plane) override
Definition: HelixForwardPlaneCrossing.h:27
PropagationDirection
PropagationDirection
Definition: PropagationDirection.h:4
CompatibleDetToGroupAdder
Definition: CompatibleDetToGroupAdder.h:13
CompositeTECPetal::WedgePar
Definition: CompositeTECPetal.h:20
SubLayerCrossings::other
const SubLayerCrossing & other() const
Definition: SubLayerCrossings.h:30
CompositeTECPetal::compatible
std::pair< bool, TrajectoryStateOnSurface > compatible(const TrajectoryStateOnSurface &ts, const Propagator &, const MeasurementEstimator &) const override __attribute__((cold))
Definition: CompositeTECPetal.cc:129
SubLayerCrossing
Definition: SubLayerCrossings.h:7
SubLayerCrossing::subLayerIndex
int subLayerIndex() const
Definition: SubLayerCrossings.h:12
BoundDiskSector::innerRadius
float innerRadius() const
Definition: BoundDiskSector.h:14
mps_fire.result
result
Definition: mps_fire.py:303
HelixForwardPlaneCrossing
Definition: HelixForwardPlaneCrossing.h:13
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
GeometricSearchDet
Definition: GeometricSearchDet.h:17
dttmaxenums::R
Definition: DTTMax.h:29
CompositeTECPetal::theBackPars
std::vector< WedgePar > theBackPars
Definition: CompositeTECPetal.h:94
PV3DBase< float, PointTag, GlobalTag >::perp
float perp() const
Definition: PV3DBase.h:69
CompositeTECPetal::addClosest
bool addClosest(const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, const SubLayerCrossing &crossing, std::vector< DetGroup > &result) const __attribute__((hot))
Definition: CompositeTECPetal.cc:218
CompositeTECPetal::theFrontBoundaries
std::vector< float > theFrontBoundaries
Definition: CompositeTECPetal.h:91
Basic3DVector< float >
HelixForwardPlaneCrossing.h
PV3DBase::perp2
T perp2() const
Definition: PV3DBase.h:68
DetWithState
GeometricSearchDet::DetWithState DetWithState
Definition: CompositeTECPetal.cc:25
ForwardDiskSectorBuilderFromWedges.h
DiskSectorBounds::thickness
float thickness() const override
Definition: DiskSectorBounds.h:26
MeasurementEstimator::maximalLocalDisplacement
virtual Local2DVector maximalLocalDisplacement(const TrajectoryStateOnSurface &ts, const Plane &plane) const =0
SubLayerCrossings
Definition: SubLayerCrossings.h:22
CompositeTECPetal::searchNeighbors
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: CompositeTECPetal.cc:232