CMS 3D CMS Logo

MTDNavigationSchool.cc
Go to the documentation of this file.
1 
16 
17 /* Collaborating Class Header */
28 
29 #include <algorithm>
30 #include <iostream>
31 using namespace std;
32 
34 MTDNavigationSchool::MTDNavigationSchool(const MTDDetLayerGeometry* mtdLayout, bool enableBTL, bool enableETL)
35  : theMTDDetLayerGeometry(mtdLayout) {
36  theAllDetLayersInSystem = &mtdLayout->allLayers();
37  theAllNavigableLayer.resize(mtdLayout->allLayers().size(), nullptr);
38 
39  // get all barrel DetLayers (BTL)
40  vector<const DetLayer*> barrel;
41  if (enableBTL)
42  barrel = mtdLayout->allBarrelLayers();
43  else
44  barrel = mtdLayout->allBarrelLayers();
45 
46  for (auto i = barrel.begin(); i != barrel.end(); i++) {
47  const BarrelDetLayer* mbp = dynamic_cast<const BarrelDetLayer*>(*i);
48  if (mbp == nullptr)
49  throw cms::Exception("MTDNavigationSchool", "Bad BarrelDetLayer");
50  addBarrelLayer(mbp);
51  }
52 
53  // get all endcap DetLayers (ETL)
54  vector<const DetLayer*> endcap;
55  if (enableETL)
56  endcap = mtdLayout->allEndcapLayers();
57  else
58  endcap = mtdLayout->allEndcapLayers();
59 
60  for (auto i = endcap.begin(); i != endcap.end(); i++) {
61  const ForwardDetLayer* mep = dynamic_cast<const ForwardDetLayer*>(*i);
62  if (mep == nullptr)
63  throw cms::Exception("MTDNavigationSchool", "Bad ForwardDetLayer");
64  addEndcapLayer(mep);
65  }
66 
67  // create outward links for all DetLayers
71 
72  // create inverse links
74 }
75 
78  for_each(theBarrelNLC.begin(), theBarrelNLC.end(), delete_layer());
79  for_each(theForwardNLC.begin(), theForwardNLC.end(), delete_layer());
80  for_each(theBackwardNLC.begin(), theBackwardNLC.end(), delete_layer());
81 }
82 
86 
87  vector<BTLNavigableLayer*>::const_iterator ib;
88  vector<ETLNavigableLayer*>::const_iterator ie;
89 
90  for (ib = theBarrelNLC.begin(); ib != theBarrelNLC.end(); ib++) {
91  result.push_back(*ib);
92  }
93 
94  for (ie = theForwardNLC.begin(); ie != theForwardNLC.end(); ie++) {
95  result.push_back(*ie);
96  }
97 
98  for (ie = theBackwardNLC.begin(); ie != theBackwardNLC.end(); ie++) {
99  result.push_back(*ie);
100  }
101 
102  return result;
103 }
104 
107  const BoundCylinder& bc = mbp->specificSurface();
108  float radius = bc.radius();
109  float length = bc.bounds().length() / 2.;
110 
111  float eta_max = calculateEta(radius, length);
112  float eta_min = -eta_max;
113 
114  theBarrelLayers[mbp] = MTDEtaRange(eta_max, eta_min);
115 }
116 
119  const BoundDisk& bd = mep->specificSurface();
120  float outRadius = bd.outerRadius();
121  float inRadius = bd.innerRadius();
122  float thick = bd.bounds().length() / 2.;
123  float z = bd.position().z();
124 
125  if (z > 0.) {
126  float eta_min = calculateEta(outRadius, z - thick);
127  float eta_max = calculateEta(inRadius, z + thick);
128  theForwardLayers[mep] = MTDEtaRange(eta_max, eta_min);
129  } else {
130  float eta_max = calculateEta(outRadius, z + thick);
131  float eta_min = calculateEta(inRadius, z - thick);
132  theBackwardLayers[mep] = MTDEtaRange(eta_max, eta_min);
133  }
134 }
135 
137 float MTDNavigationSchool::calculateEta(const float& r, const float& z) const {
138  if (z > 0)
139  return -log((tan(atan(r / z) / 2.)));
140  return log(-(tan(atan(r / z) / 2.)));
141 }
142 
145  for (MapBI bl = theBarrelLayers.begin(); bl != theBarrelLayers.end(); bl++) {
146  MTDEtaRange range = (*bl).second;
147 
148  // first add next barrel layer
149  MapBI plusOne(bl);
150  plusOne++;
151  MapB outerBarrel;
152  MapB allOuterBarrel;
153  if (plusOne != theBarrelLayers.end()) {
154  outerBarrel.insert(*plusOne);
155  }
156  // add all outer barrel layers
157  for (MapBI iMBI = plusOne; iMBI != theBarrelLayers.end(); iMBI++) {
158  allOuterBarrel.insert(*iMBI);
159  }
160  // then add all compatible backward layers with an eta criteria
161  MapE allOuterBackward;
162  for (MapEI el = theBackwardLayers.begin(); el != theBackwardLayers.end(); el++) {
163  if ((*el).second.isCompatible(range)) {
164  allOuterBackward.insert(*el);
165  }
166  }
167  //add the backward next layer with an eta criteria
168  MapE outerBackward;
169  for (MapEI el = theBackwardLayers.begin(); el != theBackwardLayers.end(); el++) {
170  if ((*el).second.isCompatible(range)) {
171  outerBackward.insert(*el);
172  break;
173  }
174  }
175 
176  // then add all compatible forward layers with an eta criteria
177  MapE allOuterForward;
178  for (MapEI el = theForwardLayers.begin(); el != theForwardLayers.end(); el++) {
179  if ((*el).second.isCompatible(range)) {
180  allOuterForward.insert(*el);
181  }
182  }
183 
184  // then add forward next layer with an eta criteria
185  MapE outerForward;
186  for (MapEI el = theForwardLayers.begin(); el != theForwardLayers.end(); el++) {
187  if ((*el).second.isCompatible(range)) {
188  outerForward.insert(*el);
189  break;
190  }
191  }
192 
193  theBarrelNLC.push_back(new BTLNavigableLayer(
194  (*bl).first, outerBarrel, outerBackward, outerForward, allOuterBarrel, allOuterBackward, allOuterForward));
195  }
196 }
198 void MTDNavigationSchool::linkEndcapLayers(const MapE& layers, vector<ETLNavigableLayer*>& result) {
199  for (MapEI el = layers.begin(); el != layers.end(); el++) {
200  MTDEtaRange range = (*el).second;
201  // first add next endcap layer (if compatible)
202  MapEI plusOne(el);
203  plusOne++;
204  MapE outerLayers;
205  if (plusOne != layers.end() && (*plusOne).second.isCompatible(range)) {
206  outerLayers.insert(*plusOne);
207  if (!range.isInside((*plusOne).second)) {
208  // then look if the next layer has a wider eta range, if so add it
209  MapEI tmpel(plusOne);
210  tmpel++;
211  MTDEtaRange max((*plusOne).second);
212  for (MapEI l = tmpel; l != layers.end(); l++) {
213  MTDEtaRange next = (*l).second;
214  if (next.isCompatible(max) && !range.isInside(next) && !next.isInside(max) &&
215  next.subtract(max).isInside(range)) {
216  max = max.add(next);
217  outerLayers.insert(*l);
218  }
219  }
220  }
221  }
222 
223  MapE allOuterLayers;
224  for (MapEI iMEI = plusOne; iMEI != layers.end(); iMEI++) {
225  if ((*iMEI).second.isCompatible(range))
226  allOuterLayers.insert(*iMEI);
227  }
228 
229  result.push_back(new ETLNavigableLayer((*el).first, outerLayers, allOuterLayers));
230  }
231 }
232 
235  // set outward link
236  // NavigationSetter setter(*this);
237 
239 
240  // find for each layer which are the layers pointing to it
241  typedef map<const DetLayer*, MapB, less<const DetLayer*> > BarrelMapType;
242  typedef map<const DetLayer*, MapE, less<const DetLayer*> > ForwardMapType;
243 
244  // map of all DetLayers which can reach a specific DetLayer
245  BarrelMapType reachedBarrelLayersMap;
246  ForwardMapType reachedForwardLayersMap;
247 
248  // map of all DetLayers which is compatible with a specific DetLayer
249  BarrelMapType compatibleBarrelLayersMap;
250  ForwardMapType compatibleForwardLayersMap;
251 
252  // collect all reacheable layers starting from a barrel layer
253  for (MapBI bli = theBarrelLayers.begin(); bli != theBarrelLayers.end(); bli++) {
254  // barrel
255  BTLNavigableLayer* mbnl = dynamic_cast<BTLNavigableLayer*>(theAllNavigableLayer[((*bli).first)->seqNum()]);
256  MapB reacheableB = mbnl->getOuterBarrelLayers();
257  for (MapBI i = reacheableB.begin(); i != reacheableB.end(); i++) {
258  reachedBarrelLayersMap[(*i).first].insert(*bli);
259  }
260  MapB compatibleB = mbnl->getAllOuterBarrelLayers();
261  for (MapBI i = compatibleB.begin(); i != compatibleB.end(); i++) {
262  compatibleBarrelLayersMap[(*i).first].insert(*bli);
263  }
264  MapE reacheableE = mbnl->getOuterBackwardLayers();
265  for (MapEI i = reacheableE.begin(); i != reacheableE.end(); i++) {
266  reachedBarrelLayersMap[(*i).first].insert(*bli);
267  }
268  reacheableE = mbnl->getOuterForwardLayers();
269  for (MapEI i = reacheableE.begin(); i != reacheableE.end(); i++) {
270  reachedBarrelLayersMap[(*i).first].insert(*bli);
271  }
272  MapE compatibleE = mbnl->getAllOuterBackwardLayers();
273  for (MapEI i = compatibleE.begin(); i != compatibleE.end(); i++) {
274  compatibleBarrelLayersMap[(*i).first].insert(*bli);
275  }
276  compatibleE = mbnl->getAllOuterForwardLayers();
277  for (MapEI i = compatibleE.begin(); i != compatibleE.end(); i++) {
278  compatibleBarrelLayersMap[(*i).first].insert(*bli);
279  }
280  }
281 
282  // collect all reacheable layer starting from a backward layer
283  for (MapEI eli = theBackwardLayers.begin(); eli != theBackwardLayers.end(); eli++) {
284  MapE reacheableE =
285  dynamic_cast<ETLNavigableLayer*>(theAllNavigableLayer[((*eli).first)->seqNum()])->getOuterEndcapLayers();
286  for (MapEI i = reacheableE.begin(); i != reacheableE.end(); i++) {
287  reachedForwardLayersMap[(*i).first].insert(*eli);
288  }
289  // collect all compatible layer starting from a backward layer
290  MapE compatibleE =
291  dynamic_cast<ETLNavigableLayer*>(theAllNavigableLayer[((*eli).first)->seqNum()])->getAllOuterEndcapLayers();
292  for (MapEI i = compatibleE.begin(); i != compatibleE.end(); i++) {
293  compatibleForwardLayersMap[(*i).first].insert(*eli);
294  }
295  }
296 
297  for (MapEI eli = theForwardLayers.begin(); eli != theForwardLayers.end(); eli++) {
298  // collect all reacheable layer starting from a forward layer
299  MapE reacheableE =
300  dynamic_cast<ETLNavigableLayer*>(theAllNavigableLayer[((*eli).first)->seqNum()])->getOuterEndcapLayers();
301  for (MapEI i = reacheableE.begin(); i != reacheableE.end(); i++) {
302  reachedForwardLayersMap[(*i).first].insert(*eli);
303  }
304  // collect all compatible layer starting from a forward layer
305  MapE compatibleE =
306  dynamic_cast<ETLNavigableLayer*>(theAllNavigableLayer[((*eli).first)->seqNum()])->getAllOuterEndcapLayers();
307  for (MapEI i = compatibleE.begin(); i != compatibleE.end(); i++) {
308  compatibleForwardLayersMap[(*i).first].insert(*eli);
309  }
310  }
311 
312  // now set inverse link for barrel layers
313  for (MapBI bli = theBarrelLayers.begin(); bli != theBarrelLayers.end(); bli++) {
314  BTLNavigableLayer* mbnl = dynamic_cast<BTLNavigableLayer*>(theAllNavigableLayer[((*bli).first)->seqNum()]);
315  mbnl->setInwardLinks(reachedBarrelLayersMap[(*bli).first]);
316  mbnl->setInwardCompatibleLinks(compatibleBarrelLayersMap[(*bli).first]);
317  }
318  //BACKWARD
319  for (MapEI eli = theBackwardLayers.begin(); eli != theBackwardLayers.end(); eli++) {
320  ETLNavigableLayer* mfnl = dynamic_cast<ETLNavigableLayer*>(theAllNavigableLayer[((*eli).first)->seqNum()]);
321  // for backward next layers
322  mfnl->setInwardLinks(reachedBarrelLayersMap[(*eli).first], reachedForwardLayersMap[(*eli).first]);
323  // for backward compatible layers
324  mfnl->setInwardCompatibleLinks(compatibleBarrelLayersMap[(*eli).first], compatibleForwardLayersMap[(*eli).first]);
325  }
326  //FORWARD
327  for (MapEI eli = theForwardLayers.begin(); eli != theForwardLayers.end(); eli++) {
328  ETLNavigableLayer* mfnl = dynamic_cast<ETLNavigableLayer*>(theAllNavigableLayer[((*eli).first)->seqNum()]);
329  // and for forward next layers
330  mfnl->setInwardLinks(reachedBarrelLayersMap[(*eli).first], reachedForwardLayersMap[(*eli).first]);
331  // and for forward compatible layers
332  mfnl->setInwardCompatibleLinks(compatibleBarrelLayersMap[(*eli).first], compatibleForwardLayersMap[(*eli).first]);
333  }
334 }
const std::vector< const DetLayer * > & allLayers() const
return all DetLayers (barrel + endcap), -Z to +Z
std::vector< BTLNavigableLayer * > theBarrelNLC
-z endcap
MapB::const_iterator MapBI
StateType navigableLayers() override
return navigable layers, from base class
std::map< const BarrelDetLayer *, MTDEtaRange, MTDDetLayerComp > MapB
const std::vector< const DetLayer * > & allEndcapLayers() const
return all endcap layers
std::vector< ETLNavigableLayer * > theBackwardNLC
MapB getOuterBarrelLayers() const
void linkBarrelLayers()
link barrel layers
MapE getOuterForwardLayers() const
virtual const BoundCylinder & specificSurface() const final
Extension of the interface.
void linkEndcapLayers(const MapE &, std::vector< ETLNavigableLayer * > &)
link endcap layers
~MTDNavigationSchool() override
Destructor.
std::vector< ETLNavigableLayer * > theForwardNLC
MapE getAllOuterForwardLayers() const
MTDEtaRange add(const MTDEtaRange &) const
create maximum of ranges
Definition: MTDEtaRange.cc:57
MapE getOuterBackwardLayers() const
MTDNavigationSchool(const MTDDetLayerGeometry *, bool enableBTL=true, bool enableETL=true)
Constructor.
StateType theAllNavigableLayer
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
void createInverseLinks()
establish inward links
std::vector< NavigableLayer * > StateType
float calculateEta(const float &, const float &) const
calculate pseudorapidity from r and z
const std::vector< const DetLayer * > * theAllDetLayersInSystem
MapE theBackwardLayers
+z endcap
MapE getAllOuterBackwardLayers() const
virtual const BoundDisk & specificSurface() const final
bool isInside(float eta, float error=0.) const
Definition: MTDEtaRange.cc:39
void setInwardCompatibleLinks(const MapB &, const MapE &)
const std::vector< const DetLayer * > & allBarrelLayers() const
return all barrel layers
void addEndcapLayer(const ForwardDetLayer *)
add endcap layer (backward and forward)
MTDEtaRange subtract(const MTDEtaRange &) const
create new range of size this minus range
Definition: MTDEtaRange.cc:63
MapE::const_iterator MapEI
void addBarrelLayer(const BarrelDetLayer *)
add barrel layer
MapB getAllOuterBarrelLayers() const
void setInwardLinks(const MapB &)
set inward links
void setState(const StateType &state)
void setInwardCompatibleLinks(const MapB &)
bool isCompatible(const MTDEtaRange &range) const
true if this overlaps with range
Definition: MTDEtaRange.cc:51
ib
Definition: cuy.py:662
void setInwardLinks(const MapB &, const MapE &)
set inward links
std::map< const ForwardDetLayer *, MTDEtaRange, MTDDetLayerComp > MapE