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