CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
MuonNavigationSchool.cc
Go to the documentation of this file.
1 
21 
22 /* Collaborating Class Header */
34 
35 #include <algorithm>
36 #include <iostream>
37 using namespace std;
38 
40 MuonNavigationSchool::MuonNavigationSchool(const MuonDetLayerGeometry * muonLayout, bool enableRPC ) : theMuonDetLayerGeometry(muonLayout) {
41 
42  theAllDetLayersInSystem=&muonLayout->allLayers();
43 
44  // get all barrel DetLayers (DT + optional RPC)
45  vector<DetLayer*> barrel;
46  if ( enableRPC ) barrel = muonLayout->allBarrelLayers();
47  else barrel = muonLayout->allDTLayers();
48 
49  for ( vector<DetLayer*>::const_iterator i = barrel.begin(); i != barrel.end(); i++ ) {
50  BarrelDetLayer* mbp = dynamic_cast<BarrelDetLayer*>(*i);
51  if ( mbp == 0 ) throw Genexception("Bad BarrelDetLayer");
52  addBarrelLayer(mbp);
53  }
54 
55  // get all endcap DetLayers (CSC + optional RPC)
56  vector<DetLayer*> endcap;
57  if ( enableRPC ) endcap = muonLayout->allEndcapLayers();
58  else endcap = muonLayout->allCSCLayers();
59 
60  for ( vector<DetLayer*>::const_iterator i = endcap.begin(); i != endcap.end(); i++ ) {
61  ForwardDetLayer* mep = dynamic_cast<ForwardDetLayer*>(*i);
62  if ( mep == 0 ) throw Genexception("Bad ForwardDetLayer");
63  addEndcapLayer(mep);
64  }
65 
66  // create outward links for all DetLayers
70 
71  // create inverse links
73 
74 }
75 
76 
79 
80  for_each(theBarrelNLC.begin(),theBarrelNLC.end(), delete_layer());
81  for_each(theForwardNLC.begin(),theForwardNLC.end(), delete_layer());
82  for_each(theBackwardNLC.begin(),theBackwardNLC.end(), delete_layer());
83 
84 }
85 
86 
90 
92 
93  vector<MuonBarrelNavigableLayer*>::const_iterator ib;
94  vector<MuonForwardNavigableLayer*>::const_iterator ie;
95 
96  for ( ib = theBarrelNLC.begin(); ib != theBarrelNLC.end(); ib++ ) {
97  result.push_back(*ib);
98  }
99 
100  for ( ie = theForwardNLC.begin(); ie != theForwardNLC.end(); ie++ ) {
101  result.push_back(*ie);
102  }
103 
104  for ( ie = theBackwardNLC.begin(); ie != theBackwardNLC.end(); ie++ ) {
105  result.push_back(*ie);
106  }
107 
108  return result;
109 
110 }
111 
112 
115 
116  const BoundCylinder& bc = mbp->specificSurface();
117  float radius = bc.radius();
118  float length = bc.bounds().length()/2.;
119 
120  float eta_max = calculateEta(radius, length);
121  float eta_min = -eta_max;
122 
123  theBarrelLayers[mbp] = MuonEtaRange(eta_max, eta_min);
124 
125 }
126 
127 
130 
131  const BoundDisk& bd = mep->specificSurface();
132  float outRadius = bd.outerRadius();
133  float inRadius = bd.innerRadius();
134  float thick = bd.bounds().length()/2.;
135  float z = bd.position().z();
136 
137  if ( z > 0. ) {
138  float eta_min = calculateEta(outRadius, z-thick);
139  float eta_max = calculateEta(inRadius, z+thick);
140  theForwardLayers[mep] = MuonEtaRange(eta_max, eta_min);
141  } else {
142  float eta_max = calculateEta(outRadius, z+thick);
143  float eta_min = calculateEta(inRadius, z-thick);
144  theBackwardLayers[mep] = MuonEtaRange(eta_max, eta_min);
145  }
146 
147 }
148 
149 
151 float MuonNavigationSchool::calculateEta(const float& r, const float& z) const {
152 
153  if ( z > 0 ) return -log((tan(atan(r/z)/2.)));
154  return log(-(tan(atan(r/z)/2.)));
155 
156 }
157 
160 
161  for (MapBI bl = theBarrelLayers.begin();
162  bl != theBarrelLayers.end(); bl++) {
163 
164  MuonEtaRange range = (*bl).second;
165 
166  // first add next barrel layer
167  MapBI plusOne(bl);
168  plusOne++;
169  MapB outerBarrel;
170  MapB allOuterBarrel;
171  if ( plusOne != theBarrelLayers.end() ) { outerBarrel.insert(*plusOne);}
172  // add all outer barrel layers
173  for ( MapBI iMBI = plusOne; iMBI!= theBarrelLayers.end(); iMBI++){
174  allOuterBarrel.insert(*iMBI);
175  }
176  // then add all compatible backward layers with an eta criteria
177  MapE allOuterBackward;
178  for (MapEI el = theBackwardLayers.begin();
179  el != theBackwardLayers.end(); el++) {
180  if ( (*el).second.isCompatible(range) ) {
181  allOuterBackward.insert(*el);
182  }
183  }
184  //add the backward next layer with an eta criteria
185  MapE outerBackward;
186  for (MapEI el = theBackwardLayers.begin();
187  el != theBackwardLayers.end(); el++) {
188  if ( (*el).second.isCompatible(range) ) {
189  outerBackward.insert(*el);
190  break;
191  }
192  }
193 
194  // then add all compatible forward layers with an eta criteria
195  MapE allOuterForward;
196  for (MapEI el = theForwardLayers.begin();
197  el != theForwardLayers.end(); el++) {
198  if ( (*el).second.isCompatible(range) ) {
199  allOuterForward.insert(*el);
200  }
201  }
202 
203  // then add forward next layer with an eta criteria
204  MapE outerForward;
205  for (MapEI el = theForwardLayers.begin();
206  el != theForwardLayers.end(); el++) {
207  if ( (*el).second.isCompatible(range) ) {
208  outerForward.insert(*el);
209  break;
210  }
211  }
212 
214  (*bl).first,outerBarrel, outerBackward, outerForward,
215  allOuterBarrel,allOuterBackward,allOuterForward));
216 
217  }
218 
219 }
222  vector<MuonForwardNavigableLayer*>& result) {
223 
224  for (MapEI el = layers.begin(); el != layers.end(); el++) {
225 
226  MuonEtaRange range = (*el).second;
227  // first add next endcap layer (if compatible)
228  MapEI plusOne(el);
229  plusOne++;
230  MapE outerLayers;
231  if ( plusOne != layers.end() && (*plusOne).second.isCompatible(range) ) {
232  outerLayers.insert(*plusOne);
233  if ( !range.isInside((*plusOne).second) ) {
234  // then look if the next layer has a wider eta range, if so add it
235  MapEI tmpel(plusOne);
236  tmpel++;
237  MuonEtaRange max((*plusOne).second);
238  for ( MapEI l = tmpel; l != layers.end(); l++ ) {
239  MuonEtaRange next = (*l).second;
240  if ( next.isCompatible(max) && !range.isInside(next) &&
241  !next.isInside(max) && next.subtract(max).isInside(range) ) {
242  max = max.add(next);
243  outerLayers.insert(*l);
244  }
245  }
246  }
247  }
248 
249  MapE allOuterLayers;
250  for (MapEI iMEI = plusOne; iMEI!=layers.end(); iMEI++){
251  if ((*iMEI).second.isCompatible(range)) allOuterLayers.insert(*iMEI);
252  }
253 
254  result.push_back(new MuonForwardNavigableLayer(
255  (*el).first,outerLayers, allOuterLayers));
256  }
257 
258 }
259 
260 
263 
264  // set outward link
265  NavigationSetter setter(*this);
266 
267  // find for each layer which are the layers pointing to it
268  typedef map<const DetLayer*, MapB, less<const DetLayer*> > BarrelMapType;
269  typedef map<const DetLayer*, MapE, less<const DetLayer*> > ForwardMapType;
270 
271  // map of all DetLayers which can reach a specific DetLayer
272  BarrelMapType reachedBarrelLayersMap;
273  ForwardMapType reachedForwardLayersMap;
274 
275  // map of all DetLayers which is compatible with a specific DetLayer
276  BarrelMapType compatibleBarrelLayersMap;
277  ForwardMapType compatibleForwardLayersMap;
278 
279  // collect all reacheable layers starting from a barrel layer
280  for ( MapBI bli = theBarrelLayers.begin();
281  bli != theBarrelLayers.end(); bli++ ) {
282  // barrel
284  dynamic_cast<MuonBarrelNavigableLayer*>(((*bli).first)->navigableLayer());
285  MapB reacheableB = mbnl->getOuterBarrelLayers();
286  for (MapBI i = reacheableB.begin(); i != reacheableB.end(); i++ ) {
287  reachedBarrelLayersMap[(*i).first].insert(*bli);
288  }
289  MapB compatibleB = mbnl->getAllOuterBarrelLayers();
290  for (MapBI i = compatibleB.begin(); i != compatibleB.end(); i++ ) {
291  compatibleBarrelLayersMap[(*i).first].insert(*bli);
292  }
293  MapE reacheableE = mbnl->getOuterBackwardLayers();
294  for (MapEI i = reacheableE.begin(); i != reacheableE.end(); i++ ) {
295  reachedBarrelLayersMap[(*i).first].insert(*bli);
296  }
297  reacheableE = mbnl->getOuterForwardLayers();
298  for (MapEI i = reacheableE.begin(); i != reacheableE.end(); i++ ) {
299  reachedBarrelLayersMap[(*i).first].insert(*bli);
300  }
301  MapE compatibleE = mbnl->getAllOuterBackwardLayers();
302  for (MapEI i = compatibleE.begin(); i != compatibleE.end(); i++ ) {
303  compatibleBarrelLayersMap[(*i).first].insert(*bli);
304  }
305  compatibleE = mbnl->getAllOuterForwardLayers();
306  for (MapEI i = compatibleE.begin(); i != compatibleE.end(); i++ ) {
307  compatibleBarrelLayersMap[(*i).first].insert(*bli);
308  }
309 
310  }
311 
312  // collect all reacheable layer starting from a backward layer
313  for ( MapEI eli = theBackwardLayers.begin();
314  eli != theBackwardLayers.end(); eli++ ) {
315  MapE reacheableE =
316  dynamic_cast<MuonForwardNavigableLayer*>(((*eli).first)->navigableLayer())->getOuterEndcapLayers();
317  for (MapEI i = reacheableE.begin(); i != reacheableE.end(); i++ ) {
318  reachedForwardLayersMap[(*i).first].insert(*eli);
319  }
320  // collect all compatible layer starting from a backward layer
321  MapE compatibleE =
322  dynamic_cast<MuonForwardNavigableLayer*>(((*eli).first)->navigableLayer())->getAllOuterEndcapLayers();
323  for (MapEI i = compatibleE.begin(); i != compatibleE.end(); i++ ) {
324  compatibleForwardLayersMap[(*i).first].insert(*eli);
325  }
326  }
327 
328  for ( MapEI eli = theForwardLayers.begin();
329  eli != theForwardLayers.end(); eli++ ) {
330  // collect all reacheable layer starting from a forward layer
331  MapE reacheableE =
332  dynamic_cast<MuonForwardNavigableLayer*>(((*eli).first)->navigableLayer())->getOuterEndcapLayers();
333  for (MapEI i = reacheableE.begin(); i != reacheableE.end(); i++ ) {
334  reachedForwardLayersMap[(*i).first].insert(*eli);
335  }
336  // collect all compatible layer starting from a forward layer
337  MapE compatibleE =
338  dynamic_cast<MuonForwardNavigableLayer*>(((*eli).first)->navigableLayer())->getAllOuterEndcapLayers();
339  for (MapEI i = compatibleE.begin(); i != compatibleE.end(); i++ ) {
340  compatibleForwardLayersMap[(*i).first].insert(*eli);
341  }
342  }
343 
344  // now set inverse link for barrel layers
345  for ( MapBI bli = theBarrelLayers.begin();
346  bli != theBarrelLayers.end(); bli++ ) {
348  dynamic_cast<MuonBarrelNavigableLayer*>(((*bli).first)->navigableLayer());
349  mbnl->setInwardLinks(reachedBarrelLayersMap[(*bli).first]);
350  mbnl->setInwardCompatibleLinks(compatibleBarrelLayersMap[(*bli).first]);
351 
352  }
353  //BACKWARD
354  for ( MapEI eli = theBackwardLayers.begin();
355  eli != theBackwardLayers.end(); eli++ ) {
357  dynamic_cast<MuonForwardNavigableLayer*>(((*eli).first)->navigableLayer());
358  // for backward next layers
359  mfnl->setInwardLinks(reachedBarrelLayersMap[(*eli).first],
360  reachedForwardLayersMap[(*eli).first]);
361  // for backward compatible layers
362  mfnl->setInwardCompatibleLinks(compatibleBarrelLayersMap[(*eli).first],
363  compatibleForwardLayersMap[(*eli).first]);
364  }
365  //FORWARD
366  for ( MapEI eli = theForwardLayers.begin();
367  eli != theForwardLayers.end(); eli++ ) {
369  dynamic_cast<MuonForwardNavigableLayer*>(((*eli).first)->navigableLayer());
370  // and for forward next layers
371  mfnl->setInwardLinks(reachedBarrelLayersMap[(*eli).first],
372  reachedForwardLayersMap[(*eli).first]);
373  // and for forward compatible layers
374  mfnl->setInwardCompatibleLinks(compatibleBarrelLayersMap[(*eli).first],
375  compatibleForwardLayersMap[(*eli).first]);
376  }
377 
378 }
std::vector< MuonForwardNavigableLayer * > theForwardNLC
int i
Definition: DBlmapReader.cc:9
MuonEtaRange add(const MuonEtaRange &) const
create maximum of ranges
Definition: MuonEtaRange.cc:61
virtual float length() const =0
MapE theBackwardLayers
+z endcap
const std::vector< DetLayer * > & allCSCLayers() const
return the CSC DetLayers (endcap), -Z to +Z
std::map< ForwardDetLayer *, MuonEtaRange, MuonDetLayerComp > MapE
MapB::const_iterator MapBI
const std::vector< DetLayer * > & allDTLayers() const
return the DT DetLayers (barrel), inside-out
double double double z
MuonNavigationSchool(const MuonDetLayerGeometry *, bool enableRPC=true)
Constructor.
void setInwardLinks(const MapB &, const MapE &)
set inward links
std::map< BarrelDetLayer *, MuonEtaRange, MuonDetLayerComp > MapB
void createInverseLinks() const
establish inward links
void setInwardCompatibleLinks(const MapB &)
std::vector< MuonForwardNavigableLayer * > theBackwardNLC
float calculateEta(const float &, const float &) const
calculate pseudorapidity from r and z
MapE::const_iterator MapEI
Scalar radius() const
Radius of the cylinder.
Definition: Cylinder.h:55
const T & max(const T &a, const T &b)
std::vector< MuonBarrelNavigableLayer * > theBarrelNLC
-z endcap
T z() const
Definition: PV3DBase.h:58
tuple result
Definition: query.py:137
virtual const BoundDisk & specificSurface() const
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
void linkBarrelLayers()
link barrel layers
std::vector< NavigableLayer * > StateType
const std::vector< DetLayer * > & allEndcapLayers() const
return all endcap DetLayers (CSC+RPC), -Z to +Z
const Bounds & bounds() const
Definition: BoundSurface.h:89
Log< T >::type log(const T &t)
Definition: Log.h:22
bool isInside(float eta, float error=0.) const
Definition: MuonEtaRange.cc:45
virtual const BoundCylinder & specificSurface() const
Extension of the interface.
const std::vector< DetLayer * > & allLayers() const
return all layers (DT+CSC+RPC), order: backward, barrel, forward
void linkEndcapLayers(const MapE &, std::vector< MuonForwardNavigableLayer * > &)
link endcap layers
~MuonNavigationSchool()
Destructor.
bool isCompatible(const MuonEtaRange &range) const
true if this overlaps with range
Definition: MuonEtaRange.cc:56
void setInwardLinks(const MapB &)
set inward links
float outerRadius() const
The outer radius of the disk.
Definition: BoundDisk.cc:10
void setInwardCompatibleLinks(const MapB &, const MapE &)
void addEndcapLayer(ForwardDetLayer *)
add endcap layer (backward and forward)
float innerRadius() const
The inner radius of the disk.
Definition: BoundDisk.cc:6
MuonEtaRange subtract(const MuonEtaRange &) const
create new range of size this minus range
Definition: MuonEtaRange.cc:67
const std::vector< DetLayer * > * theAllDetLayersInSystem
const PositionType & position() const
void addBarrelLayer(BarrelDetLayer *)
add barrel layer
const std::vector< DetLayer * > & allBarrelLayers() const
return all barrel DetLayers (DT+RPC), inside-out
virtual StateType navigableLayers() const
return navigable layers, from base class