CMS 3D CMS Logo

SimpleBarrelNavigableLayer.cc
Go to the documentation of this file.
2 
5 
9 
13 
14 #include <algorithm>
15 #include <map>
16 #include <cmath>
17 
18 using namespace std;
19 
21  const BDLC& outerBLC,
22  const FDLC& outerLeftFL,
23  const FDLC& outerRightFL,
24  const MagneticField* field,
25  float epsilon,
26  bool checkCrossingSide)
27  : SimpleNavigableLayer(field, epsilon, checkCrossingSide),
28  theDetLayer(detLayer),
29  theOuterBarrelLayers(outerBLC),
30  theOuterLeftForwardLayers(outerLeftFL),
31  theOuterRightForwardLayers(outerRightFL)
32 
33 {
34  // put barrel and forward layers together
35  theNegOuterLayers.reserve(outerBLC.size() + outerLeftFL.size());
36  thePosOuterLayers.reserve(outerBLC.size() + outerRightFL.size());
37 
38  for (ConstBDLI bl = outerBLC.begin(); bl != outerBLC.end(); bl++)
39  theNegOuterLayers.push_back(*bl);
40  thePosOuterLayers = theNegOuterLayers; // barrel part the same
41 
42  for (ConstFDLI fl = outerLeftFL.begin(); fl != outerLeftFL.end(); fl++)
43  theNegOuterLayers.push_back(*fl);
44  for (ConstFDLI fl = outerRightFL.begin(); fl != outerRightFL.end(); fl++)
45  thePosOuterLayers.push_back(*fl);
46 
47  // sort the outer layers
53 }
54 
56  vector<const DetLayer*> result;
57 
58  // the order is the one in which layers
59  // should be checked for a reasonable trajectory
60 
61  if (dir == insideOut) {
63  for (DLC::const_iterator i = thePosOuterLayers.begin(); i != thePosOuterLayers.end(); i++) {
64  // avoid duplication of barrel layers
65  if ((**i).location() == GeomDetEnumerators::endcap)
66  result.push_back(*i);
67  }
68  } else {
70  for (DLC::const_iterator i = thePosInnerLayers.begin(); i != thePosInnerLayers.end(); i++) {
71  // avoid duplication of barrel layers
72  if ((**i).location() == GeomDetEnumerators::endcap)
73  result.push_back(*i);
74  }
75  }
76  return result;
77 }
78 
80  PropagationDirection dir) const {
81  // This method contains the sequence in which the layers are tested.
82  // The iteration stops as soon as a layer contains the propagated state
83  // within epsilon.
84 
85  vector<const DetLayer*> result;
86 
87  FreeTrajectoryState ftsWithoutErrors = (fts.hasError()) ? FreeTrajectoryState(fts.parameters()) : fts;
88 
89  auto const position = fts.position();
90  auto const momentum = fts.momentum();
91 
92  //establish whether the tracks is crossing the tracker from outer layers to inner ones
93  //or from inner to outer.
94  GlobalVector transversePosition(position.x(), position.y(), 0);
95  bool isInOutTrackBarrel = (transversePosition.dot(momentum) > 0);
96 
97  float zpos = position.z();
98  bool isInOutTrackFWD = momentum.z() * zpos > 0;
99 
100  //establish whether inner or outer layers are crossed after propagation, according
101  //to BOTH propagationDirection AND track momentum
102  bool dirOppositeXORisInOutTrackBarrel =
103  (!(dir == oppositeToMomentum) && isInOutTrackBarrel) || ((dir == oppositeToMomentum) && !isInOutTrackBarrel);
104  bool dirOppositeXORisInOutTrackFWD =
105  (!(dir == oppositeToMomentum) && isInOutTrackFWD) || ((dir == oppositeToMomentum) && !isInOutTrackFWD);
106 
107  LogDebug("SimpleBarrelNavigableLayer") << "is alongMomentum? " << (dir == alongMomentum) << endl
108  << "isInOutTrackBarrel: " << isInOutTrackBarrel << endl
109  << "isInOutTrackFWD: " << isInOutTrackFWD << endl
110  << "dirOppositeXORisInOutTrackFWD: " << dirOppositeXORisInOutTrackFWD << endl
111  << "dirOppositeXORisInOutTrackBarrel: " << dirOppositeXORisInOutTrackBarrel
112  << endl;
113 
114  bool signZmomentumXORdir =
115  (((momentum.z() > 0) && !(dir == alongMomentum)) || (!(momentum.z() > 0) && (dir == alongMomentum)));
116 
117  if LIKELY (dirOppositeXORisInOutTrackBarrel && dirOppositeXORisInOutTrackFWD) {
118  if (signZmomentumXORdir) {
119  wellInside(ftsWithoutErrors, dir, theNegOuterLayers, result);
120  } else {
121  wellInside(ftsWithoutErrors, dir, thePosOuterLayers, result);
122  }
123  } else if (!dirOppositeXORisInOutTrackBarrel && !dirOppositeXORisInOutTrackFWD) {
124  if (signZmomentumXORdir) {
125  wellInside(ftsWithoutErrors, dir, thePosInnerLayers, result);
126  } else {
127  wellInside(ftsWithoutErrors, dir, theNegInnerLayers, result);
128  }
129  } else if (!dirOppositeXORisInOutTrackBarrel && dirOppositeXORisInOutTrackFWD) {
130  wellInside(ftsWithoutErrors, dir, theInnerBarrelLayers.begin(), theInnerBarrelLayers.end(), result);
131 
132  if (signZmomentumXORdir) {
133  wellInside(ftsWithoutErrors, dir, theInnerLeftForwardLayers.begin(), theInnerLeftForwardLayers.end(), result);
134  wellInside(ftsWithoutErrors, dir, theOuterLeftForwardLayers.begin(), theOuterLeftForwardLayers.end(), result);
135  } else {
136  wellInside(ftsWithoutErrors, dir, theInnerRightForwardLayers.begin(), theInnerRightForwardLayers.end(), result);
137  wellInside(ftsWithoutErrors, dir, theOuterRightForwardLayers.begin(), theOuterRightForwardLayers.end(), result);
138  }
139  } else {
140  if (signZmomentumXORdir) {
141  wellInside(ftsWithoutErrors, dir, theInnerLeftForwardLayers.begin(), theInnerLeftForwardLayers.end(), result);
142  } else {
143  wellInside(ftsWithoutErrors, dir, theInnerRightForwardLayers.begin(), theInnerRightForwardLayers.end(), result);
144  }
145  wellInside(ftsWithoutErrors, dir, theOuterBarrelLayers.begin(), theOuterBarrelLayers.end(), result);
146  }
147 
148  bool goingIntoTheBarrel =
149  (!isInOutTrackBarrel && dir == alongMomentum) || (isInOutTrackBarrel && dir == oppositeToMomentum);
150 
151  LogDebug("SimpleBarrelNavigableLayer") << "goingIntoTheBarrel: " << goingIntoTheBarrel;
152 
153  if UNLIKELY (theSelfSearch && result.empty()) {
154  if (!goingIntoTheBarrel) {
155  LogDebug("SimpleBarrelNavigableLayer")
156  << " state is not going toward the center of the barrel. not adding self search.";
157  } else {
158  const BarrelDetLayer* bl = reinterpret_cast<const BarrelDetLayer*>(detLayer());
159  unsigned int before = result.size();
160  LogDebug("SimpleBarrelNavigableLayer") << " I am trying to added myself as a next layer.";
161  wellInside(ftsWithoutErrors, dir, bl, result);
162  unsigned int after = result.size();
163  if (before != after)
164  LogDebug("SimpleBarrelNavigableLayer") << " I have added myself as a next layer.";
165  }
166  }
167 
168  return result;
169 }
170 
172  edm::LogError("TkNavigation") << "ERROR: compatibleLayers() method used without all reachableLayers are set";
173  throw DetLayerException("compatibleLayers() method used without all reachableLayers are set");
174  return vector<const DetLayer*>();
175 }
176 
178  cerr << "Warniong: SimpleBarrelNavigableLayer::setDetLayer called." << endl << "This should never happen!" << endl;
179 }
180 
181 void SimpleBarrelNavigableLayer::setInwardLinks(const BDLC& theBarrelv, const FDLC& theForwardv, TkLayerLess sorter) {
182  theInnerBarrelLayers = theBarrelv;
183  // sort the inner layers
185 
186  ConstFDLI middle = find_if(
187  theForwardv.begin(), theForwardv.end(), [](const GeometricSearchDet* a) { return a->position().z() >= 0.0; });
188  theInnerLeftForwardLayers = FDLC(theForwardv.begin(), middle);
189  theInnerRightForwardLayers = FDLC(middle, theForwardv.end());
190 
191  // sort the inner layers
194 
195  // put barrel and forward layers together
198 
199  for (ConstBDLI bl = theInnerBarrelLayers.begin(); bl != theInnerBarrelLayers.end(); bl++)
200  theNegInnerLayers.push_back(*bl);
201  thePosInnerLayers = theNegInnerLayers; // barrel part the same
202 
203  for (ConstFDLI fl = theInnerLeftForwardLayers.begin(); fl != theInnerLeftForwardLayers.end(); fl++)
204  theNegInnerLayers.push_back(*fl);
205  for (ConstFDLI fl = theInnerRightForwardLayers.begin(); fl != theInnerRightForwardLayers.end(); fl++)
206  thePosInnerLayers.push_back(*fl);
207 
208  // sort the inner layers
214 }
215 
217  const ForwardDetLayer* fadditional = dynamic_cast<const ForwardDetLayer*>(additional);
218  const BarrelDetLayer* badditional = dynamic_cast<const BarrelDetLayer*>(additional);
219  if (badditional) {
220  if (direction == insideOut) {
221  theOuterBarrelLayers.push_back(badditional);
222  theNegOuterLayers.push_back(badditional);
223  thePosOuterLayers.push_back(badditional);
224  return;
225  }
226  theInnerBarrelLayers.push_back(badditional);
227  theNegInnerLayers.push_back(badditional);
228  thePosInnerLayers.push_back(badditional);
229  return;
230  } else if (fadditional) {
231  double zpos = fadditional->position().z();
232  if (direction == insideOut) {
233  if (zpos > 0) {
234  theOuterRightForwardLayers.push_back(fadditional);
235  thePosOuterLayers.push_back(fadditional);
236  return;
237  }
238  theOuterLeftForwardLayers.push_back(fadditional);
239  theNegOuterLayers.push_back(fadditional);
240  return;
241  }
242  if (zpos > 0) {
243  theInnerRightForwardLayers.push_back(fadditional);
244  thePosInnerLayers.push_back(fadditional);
245  return;
246  }
247  theInnerLeftForwardLayers.push_back(fadditional);
248  theNegInnerLayers.push_back(fadditional);
249  return;
250  }
251  edm::LogError("TkNavigation") << "trying to add neither a ForwardDetLayer nor a BarrelDetLayer";
252  return;
253 }
Vector3DBase
Definition: Vector3DBase.h:8
Likely.h
SimpleBarrelNavigableLayer::SimpleBarrelNavigableLayer
SimpleBarrelNavigableLayer(BarrelDetLayer const *detLayer, const BDLC &outerBLC, const FDLC &outerLeftFL, const FDLC &outerRightFL, const MagneticField *field, float epsilon, bool checkCrossingSide=true)
Definition: SimpleBarrelNavigableLayer.cc:20
FreeTrajectoryState::momentum
GlobalVector momentum() const
Definition: FreeTrajectoryState.h:68
SimpleBarrelNavigableLayer::compatibleLayers
std::vector< const DetLayer * > compatibleLayers(NavigationDirection direction) const override
Definition: SimpleBarrelNavigableLayer.cc:171
SimpleBarrelNavigableLayer::theOuterRightForwardLayers
FDLC theOuterRightForwardLayers
Definition: SimpleBarrelNavigableLayer.h:53
mps_fire.i
i
Definition: mps_fire.py:428
MessageLogger.h
FreeTrajectoryState::hasError
bool hasError() const
Definition: FreeTrajectoryState.h:77
DetLayer
Definition: DetLayer.h:21
SimpleBarrelNavigableLayer::setAdditionalLink
void setAdditionalLink(const DetLayer *, NavigationDirection direction=insideOut) override
Definition: SimpleBarrelNavigableLayer.cc:216
BoundDisk.h
TkLayerLess.h
oppositeToMomentum
Definition: PropagationDirection.h:4
BoundCylinder.h
FreeTrajectoryState::position
GlobalPoint position() const
Definition: FreeTrajectoryState.h:67
SimpleBarrelNavigableLayer::theOuterBarrelLayers
BDLC theOuterBarrelLayers
Definition: SimpleBarrelNavigableLayer.h:49
GeometricSearchDet::position
virtual const Surface::PositionType & position() const
Returns position of the surface.
Definition: GeometricSearchDet.h:31
SimpleBarrelNavigableLayer::theInnerBarrelLayers
BDLC theInnerBarrelLayers
Definition: SimpleBarrelNavigableLayer.h:50
geometryDiff.epsilon
int epsilon
Definition: geometryDiff.py:26
PV3DBase::z
T z() const
Definition: PV3DBase.h:61
SimpleNavigableLayer::wellInside
bool wellInside(const FreeTrajectoryState &fts, PropagationDirection dir, const BarrelDetLayer *bl, DLC &result) const
Definition: SimpleNavigableLayer.cc:65
UNLIKELY
#define UNLIKELY(x)
Definition: Likely.h:21
DetLayerException.h
SimpleBarrelNavigableLayer::theNegInnerLayers
DLC theNegInnerLayers
Definition: SimpleBarrelNavigableLayer.h:60
SimpleNavigableLayer::theSelfSearch
bool theSelfSearch
Definition: SimpleNavigableLayer.h:46
SimpleBarrelNavigableLayer::nextLayers
std::vector< const DetLayer * > nextLayers(NavigationDirection direction) const override
Definition: SimpleBarrelNavigableLayer.cc:55
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:233
a
double a
Definition: hdecay.h:119
SimpleBarrelNavigableLayer::theNegOuterLayers
DLC theNegOuterLayers
Definition: SimpleBarrelNavigableLayer.h:58
GeomDetEnumerators::endcap
Definition: GeomDetEnumerators.h:9
jetUpdater_cfi.sort
sort
Definition: jetUpdater_cfi.py:29
position
static int position[264][3]
Definition: ReadPGInfo.cc:289
SimpleBarrelNavigableLayer::theInnerLeftForwardLayers
FDLC theInnerLeftForwardLayers
Definition: SimpleBarrelNavigableLayer.h:55
FreeTrajectoryState::parameters
const GlobalTrajectoryParameters & parameters() const
Definition: FreeTrajectoryState.h:79
BarrelDetLayer.h
edm::LogError
Log< level::Error, false > LogError
Definition: MessageLogger.h:123
SimpleNavigableLayer::ConstFDLI
FDLC::const_iterator ConstFDLI
Definition: SimpleNavigableLayer.h:52
SimpleBarrelNavigableLayer::theOuterLeftForwardLayers
FDLC theOuterLeftForwardLayers
Definition: SimpleBarrelNavigableLayer.h:52
BarrelDetLayer
Definition: BarrelDetLayer.h:22
SimpleBarrelNavigableLayer::detLayer
const DetLayer * detLayer() const override
Definition: SimpleBarrelNavigableLayer.h:40
SimpleNavigableLayer
Definition: SimpleNavigableLayer.h:20
SimpleBarrelNavigableLayer::thePosOuterLayers
DLC thePosOuterLayers
Definition: SimpleBarrelNavigableLayer.h:59
SimpleBarrelNavigableLayer::thePosInnerLayers
DLC thePosInnerLayers
Definition: SimpleBarrelNavigableLayer.h:61
DetLayerException
Common base class.
Definition: DetLayerException.h:15
MCScenario_CRAFT1_22X.sorter
def sorter(a, b)
Definition: MCScenario_CRAFT1_22X.py:97
std
Definition: JetResolutionObject.h:76
NavigationDirection
NavigationDirection
Definition: NavigationDirection.h:4
ForwardDetLayer
Definition: ForwardDetLayer.h:22
FreeTrajectoryState
Definition: FreeTrajectoryState.h:27
SimpleBarrelNavigableLayer::theInnerRightForwardLayers
FDLC theInnerRightForwardLayers
Definition: SimpleBarrelNavigableLayer.h:56
LIKELY
#define LIKELY(x)
Definition: Likely.h:20
SimpleNavigableLayer::FDLC
std::vector< const ForwardDetLayer * > FDLC
Definition: SimpleNavigableLayer.h:24
ForwardDetLayer.h
SimpleNavigableLayer::BDLC
std::vector< const BarrelDetLayer * > BDLC
Definition: SimpleNavigableLayer.h:23
PropagationDirection
PropagationDirection
Definition: PropagationDirection.h:4
insideOut
Definition: NavigationDirection.h:4
mps_fire.result
result
Definition: mps_fire.py:311
SimpleNavigableLayer::ConstBDLI
BDLC::const_iterator ConstBDLI
Definition: SimpleNavigableLayer.h:51
SimpleBarrelNavigableLayer.h
SimpleBarrelNavigableLayer::setInwardLinks
void setInwardLinks(const BDLC &theBarrelv, const FDLC &theForwardv, TkLayerLess sorter=TkLayerLess(outsideIn)) override
Definition: SimpleBarrelNavigableLayer.cc:181
GeometricSearchDet
Definition: GeometricSearchDet.h:17
SimpleBarrelNavigableLayer::setDetLayer
void setDetLayer(const DetLayer *dl) override
Definition: SimpleBarrelNavigableLayer.cc:177
MagneticField
Definition: MagneticField.h:19
EcnaPython_AdcPeg12_S1_10_R170298_1_0_150_Dee0.cerr
cerr
Definition: EcnaPython_AdcPeg12_S1_10_R170298_1_0_150_Dee0.py:8
TkLayerLess
Definition: TkLayerLess.h:14
alongMomentum
Definition: PropagationDirection.h:4
DeadROC_duringRun.dir
dir
Definition: DeadROC_duringRun.py:23