test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TrackerAlignmentLevelBuilder.cc
Go to the documentation of this file.
1 
3 
4 // Original Author: Max Stark
5 // Created: Wed, 10 Feb 2016 13:48:41 CET
6 
8 
9 // these extern defined fields (see files TPBNameSpace.h etc.) hold some
10 // geometry-dependent values -> they will be set in this class
11 namespace align
12 {
13  namespace tpb { extern std::vector<unsigned int> lpqc; }
14  namespace tpe { extern unsigned int bpqd; }
15  namespace tib { extern std::vector<unsigned int> sphs; }
16 }
17 
18 
19 
20 //=============================================================================
21 //=== PUBLIC METHOD IMPLEMENTATION ===
22 //=============================================================================
23 
24 //_____________________________________________________________________________
27  trackerTopology_(trackerTopology)
28 {
29 }
30 
31 //_____________________________________________________________________________
34 {
35 }
36 
37 //_____________________________________________________________________________
39 ::addDetUnitInfo(const DetId& detId)
40 {
41  int subdetId = detId.subdetId();
42 
43  switch (subdetId) {
44  case PixelSubdetector::PixelBarrel: addPXBDetUnitInfo(detId); break;
45  case PixelSubdetector::PixelEndcap: addPXEDetUnitInfo(detId); break;
46  case StripSubdetector::TIB: addTIBDetUnitInfo(detId); break;
47  case StripSubdetector::TID: addTIDDetUnitInfo(detId); break;
48  case StripSubdetector::TOB: addTOBDetUnitInfo(detId); break;
49  case StripSubdetector::TEC: addTECDetUnitInfo(detId); break;
50  }
51 }
52 
53 //_____________________________________________________________________________
54 std::vector<align::AlignmentLevels> TrackerAlignmentLevelBuilder
56 {
57  std::vector<align::AlignmentLevels> levels;
58  levels.push_back(buildPXBAlignmentLevels());
59  levels.push_back(buildPXEAlignmentLevels());
60  levels.push_back(buildTIBAlignmentLevels());
61  levels.push_back(buildTIDAlignmentLevels());
62  levels.push_back(buildTOBAlignmentLevels());
63  levels.push_back(buildTECAlignmentLevels());
64  return levels;
65 }
66 
67 
68 
69 //=============================================================================
70 //=== PRIVATE METHOD IMPLEMENTATION ===
71 //=============================================================================
72 
73 //_____________________________________________________________________________
76 {
77  auto layerID = trackerTopology_->pxbLayer(detId);
78  auto ladderID = trackerTopology_->pxbLadder(detId);
79  auto moduleID = trackerTopology_->module(detId);
80 
81  if (pxbLaddersPerLayer_[layerID-1] < ladderID) {
82  pxbLaddersPerLayer_[layerID-1] = ladderID;
83  }
84 
85  pxbLayerIDs_. insert(layerID);
86  pxbLadderIDs_.insert(ladderID);
87  pxbModuleIDs_.insert(moduleID);
88 }
89 
90 //_____________________________________________________________________________
93 {
94  auto sideID = trackerTopology_->pxfSide(detId);
95  auto diskID = trackerTopology_->pxfDisk(detId);
96  auto bladeID = trackerTopology_->pxfBlade(detId);
97  auto panelID = trackerTopology_->pxfPanel(detId);
98  auto moduleID = trackerTopology_->module(detId);
99 
100  pxeSideIDs_. insert(sideID);
101  pxeDiskIDs_. insert(diskID);
102  pxeBladeIDs_. insert(bladeID);
103  pxePanelIDs_. insert(panelID);
104  pxeModuleIDs_.insert(moduleID);
105 }
106 
107 //_____________________________________________________________________________
110 {
111  auto sideID = trackerTopology_->tibSide(detId);
112  auto layerID = trackerTopology_->tibLayer(detId);
113  auto layerSide = trackerTopology_->tibOrder(detId);
114  auto stringID = trackerTopology_->tibString(detId);
115  auto moduleID = trackerTopology_->module(detId);
116 
117  if (layerSide == 1) {
118  if (tidStringsInnerLayer_[layerID-1] < stringID) {
119  tidStringsInnerLayer_[layerID-1] = stringID;
120  }
121  } else {
122  if (tidStringsOuterLayer_[layerID-1] < stringID) {
123  tidStringsOuterLayer_[layerID-1] = stringID;
124  }
125  }
126 
127  tibSideIDs_. insert(sideID);
128  tibLayerIDs_. insert(layerID);
129  tibStringIDs_.insert(stringID);
130  tibModuleIDs_.insert(moduleID);
131 }
132 
133 //_____________________________________________________________________________
136 {
137  auto sideID = trackerTopology_->tidSide(detId);
138  auto wheelID = trackerTopology_->tidWheel(detId);
139  auto ringID = trackerTopology_->tidRing(detId);
140  auto moduleID = trackerTopology_->module(detId);
141 
142  // tidOrder
143  tidSideIDs_. insert(sideID);
144  tidWheelIDs_. insert(wheelID);
145  tidRingIDs_. insert(ringID);
146  tidModuleIDs_.insert(moduleID);
147 }
148 
149 //_____________________________________________________________________________
152 {
153  auto layerID = trackerTopology_->tobLayer(detId);
154  auto sideID = trackerTopology_->tobSide(detId);
155  auto rodID = trackerTopology_->tobRod(detId);
156  auto moduleID = trackerTopology_->module(detId);
157 
158  tobLayerIDs_. insert(layerID);
159  tobSideIDs_. insert(sideID);
160  tobRodIDs_. insert(rodID);
161  tobModuleIDs_.insert(moduleID);
162 }
163 
164 //_____________________________________________________________________________
167 {
168  auto sideID = trackerTopology_->tecSide(detId);
169  auto wheelID = trackerTopology_->tecWheel(detId);
170  auto petalID = trackerTopology_->tecPetalNumber(detId);
171  auto ringID = trackerTopology_->tecRing(detId);
172  auto moduleID = trackerTopology_->module(detId);
173 
174  tecSideIDs_. insert(sideID);
175  tecWheelIDs_. insert(wheelID);
176  tecPetalIDs_. insert(petalID);
177  tecRingIDs_. insert(ringID);
178  tecModuleIDs_.insert(moduleID);
179 }
180 
181 
182 
183 //_____________________________________________________________________________
186 {
187  int maxNumModules = pxbModuleIDs_.size();
188  int maxNumLadders = pxbLadderIDs_.size() / 2; // divide by 2 since we have
189  // HalfBarrels
190  int maxNumLayers = pxbLayerIDs_.size();
191 
192  std::ostringstream ss;
193  ss << "determined following numbers for "
194  << AlignableObjectId::idToString(align::TPBBarrel) << " geometry:" << "\n"
195  << " max. number of modules: " << maxNumModules << "\n"
196  << " max. number of ladders: " << maxNumLadders << "\n";
197 
198  for (size_t layer = 0; layer < pxbLaddersPerLayer_.size(); ++layer) {
199  // divide by 4, because we need the ladders per quarter cylinder
200  align::tpb::lpqc.push_back(pxbLaddersPerLayer_[layer] / 4);
201  ss << " ladders in layer-" << layer << ": "
202  << pxbLaddersPerLayer_[layer] << "\n";
203  }
204 
205  ss << " max. number of layers: " << maxNumLayers;
206  edm::LogInfo("AlignableBuildProcess")
207  << "@SUB=TrackerAlignmentLevelBuilder::buildPXBAlignmentLevels"
208  << ss.str();
209 
211  pxb.push_back(std::make_unique<AlignmentLevel>(align::TPBModule, maxNumModules, false));
212  pxb.push_back(std::make_unique<AlignmentLevel>(align::TPBLadder, maxNumLadders, true));
213  pxb.push_back(std::make_unique<AlignmentLevel>(align::TPBLayer, maxNumLayers, false));
214  pxb.push_back(std::make_unique<AlignmentLevel>(align::TPBHalfBarrel, 2, false));
215  pxb.push_back(std::make_unique<AlignmentLevel>(align::TPBBarrel, 1, false));
216  return pxb;
217 }
218 
219 //_____________________________________________________________________________
222 {
223  int maxNumModules = pxeModuleIDs_.size();
224  int maxNumPanels = pxePanelIDs_.size();
225  int maxNumBlades = pxeBladeIDs_.size() / 2;
226  int maxNumDisks = pxeDiskIDs_.size();
227  int maxNumSides = pxeSideIDs_.size();
228 
229  std::ostringstream ss;
230  ss << "determined following numbers for "
231  << AlignableObjectId::idToString(align::TPEEndcap) << " geometry:" << "\n"
232  << " max. number of modules: " << maxNumModules << "\n"
233  << " max. number of panels: " << maxNumPanels << "\n"
234  << " max. number of blades: " << maxNumBlades << "\n";
235 
236  align::tpe::bpqd = maxNumBlades / 2;
237 
238  ss << " blades per quarter disk: " << align::tpe::bpqd << "\n"
239  << " max. number of disks: " << maxNumDisks << "\n"
240  << " max. number of sides: " << maxNumSides;
241  edm::LogInfo("AlignableBuildProcess")
242  << "@SUB=TrackerAlignmentLevelBuilder::buildPXEAlignmentLevels"
243  << ss.str();
244 
246  pxe.push_back(std::make_unique<AlignmentLevel>(align::TPEModule, maxNumModules, false));
247  pxe.push_back(std::make_unique<AlignmentLevel>(align::TPEPanel, maxNumPanels, true));
248  pxe.push_back(std::make_unique<AlignmentLevel>(align::TPEBlade, maxNumBlades, true));
249  pxe.push_back(std::make_unique<AlignmentLevel>(align::TPEHalfDisk, maxNumDisks, false));
250  pxe.push_back(std::make_unique<AlignmentLevel>(align::TPEHalfCylinder, 2, false));
251  pxe.push_back(std::make_unique<AlignmentLevel>(align::TPEEndcap, maxNumSides, false));
252  return pxe;
253 }
254 
255 //_____________________________________________________________________________
258 {
259  int maxNumModules = tibModuleIDs_.size();
260  int maxNumStrings = tibStringIDs_.size();
261  int maxNumLayers = tibLayerIDs_.size();
262  int maxNumSides = tibSideIDs_.size();
263 
264  std::ostringstream ss;
265  ss << "determined following numbers for "
266  << AlignableObjectId::idToString(align::TIBBarrel) << " geometry:" << "\n"
267  << " max. number of modules: " << maxNumModules << "\n"
268  << " max. number of strings: " << maxNumStrings << "\n";
269 
270  for (size_t layer = 0; layer < tidStringsInnerLayer_.size(); ++layer) {
271  // divide by 2, because we have HalfShells
272  align::tib::sphs.push_back(tidStringsInnerLayer_[layer] / 2);
273  align::tib::sphs.push_back(tidStringsOuterLayer_[layer] / 2);
274 
275  ss << " strings in layer-" << layer << " (inside): "
276  << tidStringsInnerLayer_[layer] << "\n"
277  << " strings in layer-" << layer << " (outside): "
278  << tidStringsOuterLayer_[layer] << "\n";
279  }
280 
281  ss << " max. number of layers: " << maxNumLayers << "\n"
282  << " max. number of sides: " << maxNumSides;
283  edm::LogInfo("AlignableBuildProcess")
284  << "@SUB=TrackerAlignmentLevelBuilder::buildTIBAlignmentLevels"
285  << ss.str();
286 
288  tib.push_back(std::make_unique<AlignmentLevel>(align::TIBModule, maxNumModules, false));
289  tib.push_back(std::make_unique<AlignmentLevel>(align::TIBString, maxNumStrings, true));
290  tib.push_back(std::make_unique<AlignmentLevel>(align::TIBSurface, 2, false)); // 2 surfaces per half shell
291  tib.push_back(std::make_unique<AlignmentLevel>(align::TIBHalfShell, 2, false)); // 2 half shells per layer
292  tib.push_back(std::make_unique<AlignmentLevel>(align::TIBLayer, maxNumLayers, false));
293  tib.push_back(std::make_unique<AlignmentLevel>(align::TIBHalfBarrel, 2, false));
294  tib.push_back(std::make_unique<AlignmentLevel>(align::TIBBarrel, 1, false));
295  return tib;
296 }
297 
298 //_____________________________________________________________________________
301 {
302  int maxNumModules = tidModuleIDs_.size();
303  int maxNumRings = tidRingIDs_.size();
304  // TODO: for PhaseII geometry the method name for tidWheel changes:
305  // -> trackerTopology->tidDisk(detId);
306  int maxNumWheels = tidWheelIDs_.size();
307  int maxNumSides = tidSideIDs_.size();
308 
309  edm::LogInfo("AlignableBuildProcess")
310  << "@SUB=TrackerAlignmentLevelBuilder::buildTIDAlignmentLevels"
311  << "determined following numbers for "
312  << AlignableObjectId::idToString(align::TIDEndcap) << " geometry:" << "\n"
313  << " max. number of modules: " << maxNumModules << "\n"
314  << " max. number of rings: " << maxNumRings << "\n"
315  << " max. number of wheels: " << maxNumWheels << "\n"
316  << " max. number of sides: " << maxNumSides;
317 
319  tid.push_back(std::make_unique<AlignmentLevel>(align::TIDModule, maxNumModules, false));
320  tid.push_back(std::make_unique<AlignmentLevel>(align::TIDSide, 2, false)); // 2 sides per ring
321  tid.push_back(std::make_unique<AlignmentLevel>(align::TIDRing, maxNumRings, false));
322  tid.push_back(std::make_unique<AlignmentLevel>(align::TIDDisk, maxNumWheels, false));
323  tid.push_back(std::make_unique<AlignmentLevel>(align::TIDEndcap, 2, false)); // 2 endcaps in TID
324  return tid;
325 }
326 
327 //_____________________________________________________________________________
330 {
331  int maxNumModules = tobModuleIDs_.size();
332  int maxNumRods = tobRodIDs_.size();
333  int maxNumSides = tobSideIDs_.size();
334  int maxNumLayers = tobLayerIDs_.size();
335 
336  edm::LogInfo("AlignableBuildProcess")
337  << "@SUB=TrackerAlignmentLevelBuilder::buildTOBAlignmentLevels"
338  << "determined following numbers for "
339  << AlignableObjectId::idToString(align::TOBBarrel) << " geometry:" << "\n"
340  << " max. number of modules: " << maxNumModules << "\n"
341  << " max. number of rods: " << maxNumRods << "\n"
342  << " max. number of sides: " << maxNumSides << "\n"
343  << " max. number of layers: " << maxNumLayers;
344 
346  tob.push_back(std::make_unique<AlignmentLevel>(align::TOBModule, maxNumModules, false));
347  tob.push_back(std::make_unique<AlignmentLevel>(align::TOBRod, maxNumRods, true));
348  tob.push_back(std::make_unique<AlignmentLevel>(align::TOBLayer, maxNumLayers, false));
349  tob.push_back(std::make_unique<AlignmentLevel>(align::TOBHalfBarrel, maxNumSides, false));
350  tob.push_back(std::make_unique<AlignmentLevel>(align::TOBBarrel, 1, false));
351  return tob;
352 }
353 
354 //_____________________________________________________________________________
357 {
358  int maxNumModules = tecModuleIDs_.size();
359  int maxNumRings = tecRingIDs_.size();
360  int maxNumPetals = tecPetalIDs_.size();
361  int maxNumDisks = tecWheelIDs_.size();
362  int maxNumSides = tecSideIDs_.size();
363 
364  edm::LogInfo("AlignableBuildProcess")
365  << "@SUB=TrackerAlignmentLevelBuilder::buildTECAlignmentLevels"
366  << "determined following numbers for "
367  << AlignableObjectId::idToString(align::TECEndcap) << " geometry:" << "\n"
368  << " max. number of modules: " << maxNumModules << "\n"
369  << " max. number of rings: " << maxNumRings << "\n"
370  << " max. number of petals: " << maxNumPetals << "\n"
371  << " max. number of wheels: " << maxNumDisks << "\n"
372  << " max. number of sides: " << maxNumSides;
373 
375  tec.push_back(std::make_unique<AlignmentLevel>(align::TECModule, maxNumModules, false));
376  tec.push_back(std::make_unique<AlignmentLevel>(align::TECRing, maxNumRings, true));
377  tec.push_back(std::make_unique<AlignmentLevel>(align::TECPetal, maxNumPetals, true));
378  tec.push_back(std::make_unique<AlignmentLevel>(align::TECSide, 2, false)); // 2 sides per disk
379  tec.push_back(std::make_unique<AlignmentLevel>(align::TECDisk, maxNumDisks, false));
380  tec.push_back(std::make_unique<AlignmentLevel>(align::TECEndcap, 2, false));
381  return tec;
382 }
std::vector< std::unique_ptr< AlignmentLevel > > AlignmentLevels
Definition: Utilities.h:31
align::AlignmentLevels buildTOBAlignmentLevels()
align::AlignmentLevels buildPXEAlignmentLevels()
std::vector< align::AlignmentLevels > build()
TrackerAlignmentLevelBuilder(const TrackerTopology *)
align::AlignmentLevels buildTIDAlignmentLevels()
align::AlignmentLevels buildPXBAlignmentLevels()
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
Definition: HCMethods.h:49
int subdetId() const
get the contents of the subdetector field (not cast into any detector&#39;s numbering enum) ...
Definition: DetId.h:37
unsigned int bpqd
no. of blades per quarter disk
Definition: TPENameSpace.h:27
Definition: DetId.h:18
void addPXBDetUnitInfo(const DetId &detId)
align::AlignmentLevels buildTIBAlignmentLevels()
std::vector< unsigned int > sphs
Number of strings for each surface of a half shell.
Definition: TIBNameSpace.h:27
static const char * idToString(align::StructureType type)
align::AlignmentLevels buildTECAlignmentLevels()
std::vector< unsigned int > lpqc
Number of ladders for each quarter cylinder.
Definition: TPBNameSpace.h:27
void addPXEDetUnitInfo(const DetId &detId)