CMS 3D CMS Logo

PixelForwardLayer.cc
Go to the documentation of this file.
1 #include "PixelForwardLayer.h"
2 
4 
7 
13 
14 
15 #include "LayerCrossingSide.h"
16 #include "DetGroupMerger.h"
18 
19 using namespace std;
20 
22 
23 PixelForwardLayer::PixelForwardLayer(vector<const PixelBlade*>& blades):
25  theComps(blades.begin(),blades.end())
26 {
27  for(vector<const GeometricSearchDet*>::const_iterator it=theComps.begin();
28  it!=theComps.end();it++){
29  theBasicComps.insert(theBasicComps.end(),
30  (**it).basicComponents().begin(),
31  (**it).basicComponents().end());
32  }
33 
34  //They should be already phi-ordered. TO BE CHECKED!!
35  //sort( theBlades.begin(), theBlades.end(), PhiLess());
37 
38  //Is a "periodic" binFinderInPhi enough?. TO BE CHECKED!!
39  theBinFinder = BinFinderType( theComps.front()->surface().position().phi(),
40  theComps.size());
41 
42  //--------- DEBUG INFO --------------
43  LogDebug("TkDetLayers") << "DEBUG INFO for PixelForwardLayer" << "\n"
44  << "PixelForwardLayer.surfcace.phi(): "
45  << this->surface().position().phi() << "\n"
46  << "PixelForwardLayer.surfcace.z(): "
47  << this->surface().position().z() << "\n"
48  << "PixelForwardLayer.surfcace.innerR(): "
49  << this->specificSurface().innerRadius() << "\n"
50  << "PixelForwardLayer.surfcace.outerR(): "
51  << this->specificSurface().outerRadius() ;
52 
53  for(vector<const GeometricSearchDet*>::const_iterator it=theComps.begin();
54  it!=theComps.end(); it++){
55  LogDebug("TkDetLayers") << "blades phi,z,r: "
56  << (*it)->surface().position().phi() << " , "
57  << (*it)->surface().position().z() << " , "
58  << (*it)->surface().position().perp();
59  }
60  //-----------------------------------
61 
62 
63 }
64 
66  vector<const GeometricSearchDet*>::const_iterator i;
67  for (i=theComps.begin(); i!=theComps.end(); i++) {
68  delete *i;
69  }
70 }
71 
72 void
74  const Propagator& prop,
75  const MeasurementEstimator& est,
76  std::vector<DetGroup> & result) const {
77  std::vector<DetGroup> closestResult;
78  SubTurbineCrossings crossings;
79 
80  crossings = computeCrossings( tsos, prop.propagationDirection());
81  if (!crossings.isValid){
82  //edm::LogInfo("TkDetLayers") << "computeCrossings returns invalid in PixelForwardLayer::groupedCompatibleDets:";
83  return;
84  }
85 
86  typedef CompatibleDetToGroupAdder Adder;
88  tsos, prop, est, closestResult);
89 
90  if(closestResult.empty()){
92  tsos, prop, est, result);
93  return;
94  }
95 
96  DetGroupElement closestGel( closestResult.front().front());
97  float window = computeWindowSize( closestGel.det(), closestGel.trajectoryState(), est);
98 
99  //float detWidth = closestGel.det()->surface().bounds().width();
100  //if (crossings.nextDistance < detWidth + window) {
101  vector<DetGroup> nextResult;
103  tsos, prop, est, nextResult)) {
104  int crossingSide = LayerCrossingSide().endcapSide( tsos, prop);
105  int theHelicity = computeHelicity(theComps[theBinFinder.binIndex(crossings.closestIndex)],
106  theComps[theBinFinder.binIndex(crossings.nextIndex)] );
107  DetGroupMerger::orderAndMergeTwoLevels( std::move(closestResult), std::move(nextResult), result,
108  theHelicity, crossingSide);
109  }
110  else {
111  result.swap(closestResult);
112  }
113 
114  /*
115  }
116  else {
117  result.swap(closestResult);
118  }
119  */
120 
121  // --- THIS lines may speed up the reconstruction. But it reduces slightly the efficiency.
122  // only loop over neighbors (other than closest and next) if window is BIG
123  //if (window > 0.5*detWidth) {
124  searchNeighbors( tsos, prop, est, crossings, window, result);
125  //}
126 }
127 
128 
129 
130 void
132  const Propagator& prop,
133  const MeasurementEstimator& est,
134  const SubTurbineCrossings& crossings,
135  float window,
136  vector<DetGroup>& result) const
137 {
138  typedef CompatibleDetToGroupAdder Adder;
139  int crossingSide = LayerCrossingSide().endcapSide( tsos, prop);
140  typedef DetGroupMerger Merger;
141 
142  int negStart = min( crossings.closestIndex, crossings.nextIndex) - 1;
143  int posStart = max( crossings.closestIndex, crossings.nextIndex) + 1;
144 
145  int quarter = theComps.size()/4;
146 
147  for (int idet=negStart; idet >= negStart - quarter+1; idet--) {
148  std::vector<DetGroup> tmp1;
149  const GeometricSearchDet* neighbor = theComps[theBinFinder.binIndex(idet)];
150  // if (!overlap( gCrossingPos, *neighbor, window)) break; // mybe not needed?
151  // maybe also add shallow crossing angle test here???
152  if (!Adder::add( *neighbor, tsos, prop, est, tmp1)) break;
153  int theHelicity = computeHelicity(theComps[theBinFinder.binIndex(idet)],
154  theComps[theBinFinder.binIndex(idet+1)] );
155  std::vector<DetGroup> tmp2; tmp2.swap(result);
156  std::vector<DetGroup> newResult;
157  Merger::orderAndMergeTwoLevels( std::move(tmp1), std::move(tmp2), newResult, theHelicity, crossingSide);
158  result.swap(newResult);
159  }
160  for (int idet=posStart; idet < posStart + quarter-1; idet++) {
161  vector<DetGroup> tmp1;
162  const GeometricSearchDet* neighbor = theComps[theBinFinder.binIndex(idet)];
163  // if (!overlap( gCrossingPos, *neighbor, window)) break; // mybe not needed?
164  // maybe also add shallow crossing angle test here???
165  if (!Adder::add( *neighbor, tsos, prop, est, tmp1)) break;
166  int theHelicity = computeHelicity(theComps[theBinFinder.binIndex(idet-1)],
167  theComps[theBinFinder.binIndex(idet)] );
168  std::vector<DetGroup> tmp2; tmp2.swap(result);
169  std::vector<DetGroup> newResult;
170  Merger::orderAndMergeTwoLevels(std::move(tmp2), std::move(tmp1), newResult, theHelicity, crossingSide);
171  result.swap(newResult);
172  }
173 }
174 
175 int
177 {
178  return std::abs(firstBlade->position().z()) < std::abs(secondBlade->position().z()) ? 0 : 1;
179 }
180 
183  PropagationDirection propDir) const
184 {
186 
187  HelixPlaneCrossing::PositionType startPos( startingState.globalPosition());
188  HelixPlaneCrossing::DirectionType startDir( startingState.globalMomentum());
189 
190  auto rho = startingState.transverseCurvature();
191 
192  HelixArbitraryPlaneCrossing turbineCrossing( startPos, startDir, rho,
193  propDir);
194 
195  pair<bool,double> thePath = turbineCrossing.pathLength( specificSurface() );
196 
197  if (!thePath.first) {
198  //edm::LogInfo("TkDetLayers") << "ERROR in PixelForwardLayer: disk not crossed by track" ;
199  return SubTurbineCrossings();
200  }
201 
202  HelixPlaneCrossing::PositionType turbinePoint( turbineCrossing.position(thePath.second));
203  HelixPlaneCrossing::DirectionType turbineDir( turbineCrossing.direction(thePath.second));
204 
205  int closestIndex = theBinFinder.binIndex(turbinePoint.barePhi());
206 
207  const Plane& closestPlane( static_cast<const Plane&>(theComps[closestIndex]->surface()));
208 
209 
210  HelixArbitraryPlaneCrossing2Order theBladeCrossing(turbinePoint, turbineDir, rho);
211 
212  pair<bool,double> theClosestBladePath = theBladeCrossing.pathLength( closestPlane );
213  LocalPoint closestPos = closestPlane.toLocal(GlobalPoint(theBladeCrossing.position(theClosestBladePath.second)) );
214 
215  auto closestDist = closestPos.x(); // use fact that local X perp to global Y
216 
217  //int next = turbinePoint.phi() - closestPlane.position().phi() > 0 ? closest+1 : closest-1;
218 
219  int nextIndex = PhiLess()( closestPlane.phi(), turbinePoint.barePhi()) ?
220  closestIndex+1 : closestIndex-1;
221 
222  const Plane& nextPlane( static_cast<const Plane&>(
223  theComps[ theBinFinder.binIndex(nextIndex)]->surface()));
224 
225  pair<bool,double> theNextBladePath = theBladeCrossing.pathLength( nextPlane );
226  LocalPoint nextPos = nextPlane.toLocal(GlobalPoint(theBladeCrossing.position(theNextBladePath.second)) );
227 
228  auto nextDist = nextPos.x();
229 
230  if ( std::abs(closestDist) < std::abs(nextDist)) {
231  return SubTurbineCrossings( closestIndex, nextIndex, nextDist);
232  }
233  else {
234  return SubTurbineCrossings( nextIndex, closestIndex, closestDist);
235  }
236 }
237 
238 float
240  const TrajectoryStateOnSurface& tsos,
241  const MeasurementEstimator& est) {
242  return est.maximalLocalDisplacement(tsos, det->surface()).x();
243 }
244 
245 
#define LogDebug(id)
std::pair< bool, double > pathLength(const Plane &plane) override
virtual BoundDisk * computeSurface()
void setSurface(BoundDisk *cp)
Geom::Phi< T > phi() const
Definition: PV3DBase.h:69
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
GlobalPoint globalPosition() const
Vector2DBase< float, LocalTag > Local2DVector
GeometricSearchDet::DetWithState DetWithState
PropagationDirection
~PixelForwardLayer() override
const Plane & surface() const
The nominal surface of the GeomDet.
Definition: GeomDet.h:42
static int computeHelicity(const GeometricSearchDet *firstBlade, const GeometricSearchDet *secondBlade)
PixelForwardLayer(std::vector< const PixelBlade * > &blades)
Definition: Plane.h:17
virtual int binIndex(T phi) const
returns an index in the valid range for the bin that contains phi
virtual PropagationDirection propagationDirection() const final
Definition: Propagator.h:151
LocalPoint toLocal(const GlobalPoint &gp) const
T z() const
Definition: PV3DBase.h:64
PeriodicBinFinderInPhi< float > BinFinderType
std::vector< const GeometricSearchDet * > theComps
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
PositionType position(double s) const override
static int endcapSide(const TrajectoryStateOnSurface &startingState, const Propagator &prop)
PositionType position(double s) const override
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:642
#define end
Definition: vmac.h:37
T min(T a, T b)
Definition: MathUtil.h:58
static float computeWindowSize(const GeomDet *det, const TrajectoryStateOnSurface &tsos, const MeasurementEstimator &est)
DirectionType direction(double s) const override
SubTurbineCrossings computeCrossings(const TrajectoryStateOnSurface &startingState, PropagationDirection propDir) const __attribute__((hot))
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
virtual const BoundDisk & specificSurface() const final
virtual const Surface::PositionType & position() const
Returns position of the surface.
std::pair< bool, double > pathLength(const Plane &) override
#define begin
Definition: vmac.h:30
const BoundSurface & surface() const final
The surface of the GeometricSearchDet.
GlobalVector globalMomentum() const
virtual Local2DVector maximalLocalDisplacement(const TrajectoryStateOnSurface &ts, const Plane &plane) const =0
void groupedCompatibleDetsV(const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, std::vector< DetGroup > &result) const override __attribute__((hot))
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)
void searchNeighbors(const TrajectoryStateOnSurface &tsos, const Propagator &prop, const MeasurementEstimator &est, const SubTurbineCrossings &crossings, float window, std::vector< DetGroup > &result) const __attribute__((hot))
BinFinderType theBinFinder
T x() const
Definition: PV3DBase.h:62
const PositionType & position() const
std::vector< const GeomDet * > theBasicComps
def move(src, dest)
Definition: eostools.py:510