26 theAllDetLayersInSystem = &theTracker->allLayers();
27 theAllNavigableLayer.resize(theTracker->allLayers().size(),
nullptr);
30 for (
auto i : theTracker->barrelLayers()) {
31 theBarrelLayers.push_back(
i);
35 for (
auto i : theTracker->forwardLayers()) {
36 theForwardLayers.push_back(
i);
40 return a->position().z() >= 0.0;
42 theLeftLayers =
FDLC(theForwardLayers.begin(), middle);
43 theRightLayers =
FDLC(middle, theForwardLayers.end());
48 linkBarrelLayers(symFinder);
49 linkForwardLayers(symFinder);
50 establishInverseRelations();
55 for (vector<SimpleBarrelNavigableLayer*>::const_iterator
ib = theBarrelNLC.begin();
ib != theBarrelNLC.end();
ib++) {
59 for (vector<SimpleForwardNavigableLayer*>::const_iterator ifl = theForwardNLC.begin(); ifl != theForwardNLC.end();
63 theForwardNLC.clear();
68 for (vector<SimpleBarrelNavigableLayer*>::const_iterator
ib = theBarrelNLC.begin();
ib != theBarrelNLC.end();
ib++) {
69 result.push_back(*
ib);
71 for (vector<SimpleForwardNavigableLayer*>::const_iterator ifl = theForwardNLC.begin(); ifl != theForwardNLC.end();
73 result.push_back(*ifl);
80 for (
BDLI i = theBarrelLayers.begin();
i != theBarrelLayers.end();
i++) {
86 if (
i + 1 != theBarrelLayers.end())
87 reachableBL.push_back(*(
i + 1));
90 if (
i != theBarrelLayers.end() - 1) {
91 linkNextForwardLayer(*
i, rightFL);
95 if (
i + 2 < theBarrelLayers.end()) {
96 linkNextLargerLayer(
i, theBarrelLayers.end(), reachableBL);
99 theBarrelNLC.push_back(
108 for (
FDLI fli = theRightLayers.begin(); fli != theRightLayers.end(); fli++) {
109 if (length < (**fli).position().z() && radius < (**fli).specificSurface().outerRadius()) {
111 for (
FDLI fliNext = fli; fliNext != theRightLayers.end(); fliNext++) {
112 if ((**fliNext).position().z() < (**fli).position().z() &&
113 (**fliNext).specificSurface().innerRadius() < (**fli).specificSurface().outerRadius()) {
114 rightFL.push_back(*fliNext);
118 rightFL.push_back(*fli);
126 float length = (**(bli + 1)).surface().bounds().length();
130 if (length + epsilon < (**i).surface().bounds().length()) {
131 reachableBL.push_back(*
i);
139 vector<FDLC> groups = splitForwardLayers();
141 LogDebug(
"TkNavigation") <<
"SimpleNavigationSchool, Forward groups size = " << groups.size();
142 for (vector<FDLC>::iterator
g = groups.begin();
g != groups.end();
g++) {
143 LogDebug(
"TkNavigation") <<
"group " <<
g - groups.begin() <<
" has " <<
g->size() <<
" layers ";
146 for (vector<FDLC>::iterator
group = groups.begin();
group != groups.end();
group++) {
152 linkNextBarrelLayer(*
i, reachableBL);
156 linkNextLayerInGroup(
i, *
group, reachableFL);
159 if (
group + 1 != groups.end()) {
160 linkOuterGroup(*
i, *(
group + 1), reachableFL);
164 linkWithinGroup(
i, *
group, reachableFL);
168 symFinder.
mirror(*
i), reachableBL, symFinder.
mirror(reachableFL), theField, 5.));
189 for (
BDLI bli = theBarrelLayers.begin(); bli != theBarrelLayers.end(); bli++) {
190 if (outerRadius < (**bli).specificSurface().radius() && zpos < (**bli).surface().bounds().length() / 2.) {
191 reachableBL.push_back(*bli);
199 if (fli + 1 != group.end()) {
200 reachableFL.push_back(*(fli + 1));
203 float innerRThis = (**fli).specificSurface().innerRadius();
204 float innerRNext = (**(fli + 1)).specificSurface().innerRadius();
207 if (innerRNext > innerRThis + epsilon) {
212 while ((fli + i) != group.end()) {
213 if ((**(fli + i)).specificSurface().innerRadius() < innerRNext +
epsilon) {
215 reachableFL.push_back(*(fli + i));
229 return a->position().z() >= fl->
position().
z();
231 if (first != group.end()) {
235 reachableFL.insert(reachableFL.end(),
first,
last);
240 ConstFDLI biggerLayer = outerRadiusIncrease(fl, group);
241 if (biggerLayer != group.end() && biggerLayer != fl + 1) {
242 reachableFL.push_back(*biggerLayer);
248 float outerRadius = (**fl).specificSurface().outerRadius();
249 while (++fl != group.end()) {
250 if ((**fl).specificSurface().outerRadius() > outerRadius +
epsilon) {
260 FDLC myRightLayers(theRightLayers);
262 FDLI end = myRightLayers.end();
272 current.push_back(*begin);
275 LogDebug(
"TkNavigation") <<
"(**i).specificSurface().innerRadius() = " << (**i).specificSurface().innerRadius()
277 <<
"(**(i-1)).specificSurface().outerRadius()) = " 278 << (**(
i - 1)).specificSurface().outerRadius();
279 LogDebug(
"TkNavigation") <<
"(**i).specificSurface().position().z() = " 280 << (**i).specificSurface().position().z() << endl
281 <<
"(**(i-1)).specificSurface().position().z() = " 282 << (**(
i - 1)).specificSurface().position().z();
288 if ((**i).specificSurface().innerRadius() > (**(
i - 1)).specificSurface().outerRadius() ||
289 (theTracker->posPixelForwardLayers().back()->specificSurface().position().z() >
290 theTracker->posTidLayers().front()->specificSurface().position().z() &&
291 (**i).specificSurface().position().z() < (**(
i - 1)).specificSurface().position().z())) {
292 LogDebug(
"TkNavigation") <<
"found break between groups";
295 std::stable_sort(current.begin(), current.end(),
isDetLessZ);
297 result.push_back(current);
300 current.push_back(*
i);
302 result.push_back(current);
305 for (vector<FDLC>::iterator ivec = result.begin(); ivec != result.end(); ivec++) {
306 std::stable_sort(ivec->begin(), ivec->end(),
isDetLessZ);
313 if (theBarrelLength < 1.) {
314 for (
BDLI i = theBarrelLayers.begin();
i != theBarrelLayers.end();
i++) {
315 theBarrelLength =
max(theBarrelLength, (**i).surface().bounds().length() / 2.f);
318 LogDebug(
"TkNavigation") <<
"The barrel length is " << theBarrelLength;
320 return theBarrelLength;
326 setState(navigableLayers());
330 typedef map<const DetLayer*, vector<const BarrelDetLayer*>, less<const DetLayer*> > BarrelMapType;
331 typedef map<const DetLayer*, vector<const ForwardDetLayer*>, less<const DetLayer*> > ForwardMapType;
333 BarrelMapType reachedBarrelLayersMap;
334 ForwardMapType reachedForwardLayersMap;
336 for (
auto bli : theBarrelLayers) {
337 auto reachedLC = nextLayers(*bli,
insideOut);
338 for (
auto i : reachedLC) {
339 reachedBarrelLayersMap[
i].push_back(bli);
343 for (
auto fli : theForwardLayers) {
344 auto reachedLC = nextLayers(*fli,
insideOut);
345 for (
auto i : reachedLC) {
346 reachedForwardLayersMap[
i].push_back(fli);
359 for (
auto nl : theAllNavigableLayer) {
364 navigableLayer->setInwardLinks(reachedBarrelLayersMap[dl], reachedForwardLayersMap[dl]);
virtual float length() const =0
std::vector< const BarrelDetLayer * > BDLC
virtual void linkNextBarrelLayer(ForwardDetLayer const *fl, BDLC &)
const Bounds & bounds() const
StateType navigableLayers() override
virtual const BoundCylinder & specificSurface() const final
Extension of the interface.
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
const ForwardDetLayer * mirror(const ForwardDetLayer *layer)
FDLC::const_iterator ConstFDLI
bool isDetLessZ(const GeometricSearchDet *a, const GeometricSearchDet *b)
virtual void linkNextLayerInGroup(FDLI fli, const FDLC &group, FDLC &reachableFL)
std::vector< NavigableLayer * > StateType
virtual void linkWithinGroup(FDLI fl, const FDLC &group, FDLC &reachableFL)
virtual void linkForwardLayers(SymmetricLayerFinder &symFinder)
virtual void establishInverseRelations()
std::vector< const ForwardDetLayer * > FDLC
virtual void linkBarrelLayers(SymmetricLayerFinder &symFinder)
virtual const BoundDisk & specificSurface() const final
virtual const Surface::PositionType & position() const
Returns position of the surface.
virtual ConstFDLI outerRadiusIncrease(FDLI fl, const FDLC &group)
virtual std::vector< FDLC > splitForwardLayers()
virtual void linkNextLargerLayer(BDLI, BDLI, BDLC &)
virtual DetLayer const * detLayer() const =0
#define DEFINE_EDM_PLUGIN(factory, type, name)
virtual void linkNextForwardLayer(BarrelDetLayer const *, FDLC &)
const BoundSurface & surface() const final
GeometricSearchDet interface.
virtual void linkOuterGroup(ForwardDetLayer const *fl, const FDLC &group, FDLC &reachableFL)
virtual float barrelLength()