CMS 3D CMS Logo

SimpleForwardNavigableLayer.cc
Go to the documentation of this file.
2 
6 
9 
12 
13 
14 using namespace std;
15 
18  const BDLC& outerBL,
19  const FDLC& outerFL,
20  const MagneticField* field,
21  float epsilon,
22  bool checkCrossingSide) :
23  SimpleNavigableLayer(field,epsilon,checkCrossingSide),
24  theDetLayer(detLayer),
25  theOuterBarrelLayers(outerBL),
26  theInnerBarrelLayers(0),
27  theOuterForwardLayers(outerFL),
28  theInnerForwardLayers(0),
29  theOuterLayers(0),
30  theInnerLayers(0)
31 {
32 
33  // put barrel and forward layers together
34  theOuterLayers.reserve(outerBL.size() + outerFL.size());
35  for ( ConstBDLI bl = outerBL.begin(); bl != outerBL.end(); bl++ )
36  theOuterLayers.push_back(*bl);
37  for ( ConstFDLI fl = outerFL.begin(); fl != outerFL.end(); fl++ )
38  theOuterLayers.push_back(*fl);
39 
40  // sort the outer layers
41  sort(theOuterLayers.begin(), theOuterLayers.end(), TkLayerLess());
44 
45 }
46 
47 
48 
49 
50 vector<const DetLayer*>
52 {
53  vector<const DetLayer*> result;
54 
55  // the order is the one in which layers
56  // should be checked for a reasonable trajectory
57 
58  if ( dir == insideOut ) {
59  return theOuterLayers;
60  }
61  else {
62  return theInnerLayers;
63  }
64 
65  return result;
66 }
67 
68 vector<const DetLayer*>
71 {
72  // This method contains the sequence in which the layers are tested.
73  // The iteration stops as soon as a layer contains the propagated state
74  // within epsilon
75 
76  vector<const DetLayer*> result;
77 
78  FreeTrajectoryState ftsWithoutErrors = (fts.hasError()) ?
79  FreeTrajectoryState(fts.parameters()) : fts;
80 
81  auto const position = fts.position();
82  auto const momentum = fts.momentum();
83 
84 
85  //establish whether the tracks is crossing the tracker from outer layers to inner ones
86  //or from inner to outer
87  float zpos = position.z();
88  bool isInOutTrackFWD = momentum.z()*zpos>0;
89  GlobalVector transversePosition(position.x(), position.y(), 0);
90  bool isInOutTrackBarrel = (transversePosition.dot(momentum)>0);
91 
92  //establish whether inner or outer layers are crossed after propagation, according
93  //to BOTH propagationDirection AND track momentum
94  bool dirOppositeXORisInOutTrackBarrel = ( !(dir == oppositeToMomentum) && isInOutTrackBarrel) || ( (dir == oppositeToMomentum) && !isInOutTrackBarrel);
95  bool dirOppositeXORisInOutTrackFWD = ( !(dir == oppositeToMomentum) && isInOutTrackFWD) || ( (dir == oppositeToMomentum) && !isInOutTrackFWD);
96  //bool dirOppositeXORisInOutTrack = ( !(dir == oppositeToMomentum) && isInOutTrack) || ( (dir == oppositeToMomentum) && !isInOutTrack);
97 
98  if LIKELY( dirOppositeXORisInOutTrackFWD && dirOppositeXORisInOutTrackBarrel ) { //standard tracks
99  wellInside(ftsWithoutErrors, dir, theOuterLayers, result);
100  }
101  else if (!dirOppositeXORisInOutTrackFWD && !dirOppositeXORisInOutTrackBarrel){ // !dirOppositeXORisInOutTrack
102  wellInside(ftsWithoutErrors, dir, theInnerLayers, result);
103  } else if (!dirOppositeXORisInOutTrackFWD && dirOppositeXORisInOutTrackBarrel ) {
104  wellInside(ftsWithoutErrors, dir, theInnerForwardLayers.begin(), theInnerForwardLayers.end(), result);
105  wellInside(ftsWithoutErrors, dir, theOuterBarrelLayers.begin(), theOuterBarrelLayers.end(), result);
106  } else {
107  wellInside(ftsWithoutErrors, dir, theInnerBarrelLayers.begin(), theInnerBarrelLayers.end(), result);
108  wellInside(ftsWithoutErrors, dir, theOuterForwardLayers.begin(), theOuterForwardLayers.end(), result);
109  }
110 
111  return result;
112 }
113 
114 
115 vector<const DetLayer*>
117  edm::LogError("TkNavigation") << "ERROR: compatibleLayers() method used without all reachableLayers are set" ;
118  throw DetLayerException("compatibleLayers() method used without all reachableLayers are set");
119  return vector<const DetLayer*>();
120 
121 }
122 
123 
125  cerr << "Warning: SimpleForwardNavigableLayer::setDetLayer called."
126  << endl << "This should never happen!" << endl;
127 }
128 
130  const FDLC& innerFL,
132 
133  theInnerBarrelLayers = innerBL;
134  theInnerForwardLayers = innerFL;
135 
136  theInnerLayers.clear();
137  theInnerLayers.reserve(innerBL.size() + innerFL.size());
138  for ( ConstBDLI bl = innerBL.begin(); bl != innerBL.end(); bl++ )
139  theInnerLayers.push_back(*bl);
140  for ( ConstFDLI fl = innerFL.begin(); fl != innerFL.end(); fl++ )
141  theInnerLayers.push_back(*fl);
142 
143  // sort the inner layers
144  sort(theInnerLayers.begin(), theInnerLayers.end(),sorter);
146  sort(theInnerBarrelLayers.begin(), theInnerBarrelLayers.end(), sorter);
147 
148 }
149 
151  const ForwardDetLayer* fadditional = dynamic_cast<const ForwardDetLayer*>(additional);
152  const BarrelDetLayer* badditional = dynamic_cast<const BarrelDetLayer*>(additional);
153  if (badditional){
154  if (direction==insideOut){
155  theOuterBarrelLayers.push_back(badditional);
156  theOuterLayers.push_back(badditional);
157  return;
158  }
159  theInnerBarrelLayers.push_back(badditional);
160  theInnerLayers.push_back(badditional);
161  return;
162  } else if (fadditional){
163  if (direction==insideOut){
164  theOuterForwardLayers.push_back(fadditional);
165  theOuterLayers.push_back(badditional);
166  return;
167  }
168  theInnerForwardLayers.push_back(fadditional);
169  theInnerLayers.push_back(badditional);
170  return;
171  }
172  edm::LogError("TkNavigation") << "trying to add neither a ForwardDetLayer nor a BarrelDetLayer";
173  return;
174 }
void setDetLayer(const DetLayer *dl) override
Common base class.
const GlobalTrajectoryParameters & parameters() const
std::vector< const DetLayer * > compatibleLayers(NavigationDirection direction) const override
#define LIKELY(x)
Definition: Likely.h:20
PropagationDirection
SimpleForwardNavigableLayer(const ForwardDetLayer *detLayer, const BDLC &outerBL, const FDLC &outerFL, const MagneticField *field, float epsilon, bool checkCrossingSide=true)
std::vector< const DetLayer * > nextLayers(NavigationDirection direction) const override
std::vector< const ForwardDetLayer * > FDLC
FDLC::const_iterator ConstFDLI
GlobalVector momentum() const
GlobalPoint position() const
bool wellInside(const FreeTrajectoryState &fts, PropagationDirection dir, const BarrelDetLayer *bl, DLC &result) const
static int position[264][3]
Definition: ReadPGInfo.cc:509
dbl *** dir
Definition: mlp_gen.cc:35
void setAdditionalLink(const DetLayer *, NavigationDirection direction=insideOut) override
BDLC::const_iterator ConstBDLI
void setInwardLinks(const BDLC &, const FDLC &, TkLayerLess sorter=TkLayerLess(outsideIn)) override
std::vector< const BarrelDetLayer * > BDLC