test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
AlignableCompositeBuilder.cc
Go to the documentation of this file.
2 
3 // Original Author: Max Stark
4 // Created: Thu, 13 Jan 2016 10:22:57 CET
5 
6 // core framework functionality
8 
9 // alignment
11 
12 
13 
14 //=============================================================================
15 //=== PUBLIC METHOD IMPLEMENTATION ===
16 //=============================================================================
17 
18 //_____________________________________________________________________________
21  AlignableIndexer& alignableIndexer) :
22  trackerTopology_(trackerTopology),
23  alignableIndexer_(alignableIndexer)
24 {
25 }
26 
27 //_____________________________________________________________________________
29 ::addAlignmentLevel(std::unique_ptr<AlignmentLevel> level) {
30  alignmentLevels_.push_back(std::move(level));
31 }
32 
33 //_____________________________________________________________________________
36  alignmentLevels_.clear();
37 }
38 
39 //_____________________________________________________________________________
40 unsigned int AlignableCompositeBuilder
41 ::buildAll(AlignableMap& alignableMap)
42 {
43  auto highestLevel = alignmentLevels_.back()->levelType;
44 
45  std::ostringstream ss;
46  ss << "building CompositeAlignables for "
47  << AlignableObjectId::idToString(highestLevel) << "\n";
48 
49  unsigned int numCompositeAlignables = 0;
50  for (unsigned int level = 1; level < alignmentLevels_.size(); ++level) {
51  numCompositeAlignables += buildLevel(level, alignableMap, ss);
52  }
53 
54  ss << "built " << numCompositeAlignables << " CompositeAlignables for "
55  << AlignableObjectId::idToString(highestLevel);
56  edm::LogInfo("AlignableBuildProcess")
57  << "@SUB=AlignableCompositeBuilder::buildAll" << ss.str();
58 
59  return numCompositeAlignables;
60 }
61 
62 
63 
64 //=============================================================================
65 //=== PRIVATE METHOD IMPLEMENTATION ===
66 //=============================================================================
67 
68 //_____________________________________________________________________________
69 unsigned int AlignableCompositeBuilder
70 ::buildLevel(unsigned int parentLevel,
71  AlignableMap& alignableMap,
72  std::ostringstream& ss)
73 {
74  unsigned int childLevel = parentLevel - 1;
75  unsigned int maxNumParents = maxNumComponents(parentLevel);
76 
77  auto childType = alignmentLevels_[childLevel] ->levelType;
78  auto parentType = alignmentLevels_[parentLevel]->levelType;
79 
80  auto& children = alignableMap.find(AlignableObjectId::idToString(childType));
81  auto& parents = alignableMap.get (AlignableObjectId::idToString(parentType));
82  parents.reserve(maxNumParents);
83 
84  // This vector is used indicate if a parent already exists. It is initialized
85  // with 'naked' Alignables-pointers; if the pointer is not naked (!= nullptr)
86  // for one of the child-IDs, its parent was already built before.
87  Alignables tmpParents(maxNumParents, nullptr);
88 
89  for (auto* child: children) {
90  // get the number of the child-Alignable ...
91  const auto index = getIndexOfStructure(child->id(), parentLevel);
92  // ... and use it as index to get the parent of this child
93  auto& parent = tmpParents[index];
94 
95  // if parent was not built yet ...
96  if (!parent) {
97  // ... build new composite Alignable with ID of child (obviously its the
98  // first child of the Alignable)
99  if (alignmentLevels_[parentLevel]->isFlat) {
100  parent = new AlignableComposite(child->id(), parentType,
101  child->globalRotation());
102  } else {
103  parent = new AlignableComposite(child->id(), parentType,
105  }
106  parents.push_back(parent);
107  }
108 
109  // in all cases add the child to the parent Alignable
110  parent->addComponent(child);
111  }
112 
113  ss << " built " << parents.size() << " "
114  << AlignableObjectId::idToString(alignmentLevels_[parentLevel]->levelType)
115  << "(s) (theoretical maximum: " << maxNumParents
116  << ") consisting of " << children.size() << " "
117  << AlignableObjectId::idToString(alignmentLevels_[childLevel]->levelType)
118  << "(s)\n";
119 
120  return parents.size();
121 }
122 
123 //_____________________________________________________________________________
124 unsigned int AlignableCompositeBuilder
125 ::maxNumComponents(unsigned int startLevel) const
126 {
127  unsigned int components = 1;
128 
129  for (unsigned int level = startLevel;
130  level < alignmentLevels_.size();
131  ++level) {
132  components *= alignmentLevels_[level]->maxNumComponents;
133  }
134 
135  return components;
136 }
137 
138 //_____________________________________________________________________________
139 unsigned int AlignableCompositeBuilder
140 ::getIndexOfStructure(align::ID id, unsigned int level) const
141 {
142  // indexer returns a function pointer for the structure-type
143  auto indexOf = alignableIndexer_.get(alignmentLevels_[level]->levelType);
144 
145  if (alignmentLevels_.size() - 1 > level) {
146  return getIndexOfStructure(id, level + 1)
147  * alignmentLevels_[level]->maxNumComponents
148  + indexOf(id, trackerTopology_) - 1;
149  }
150 
151  return indexOf(id, trackerTopology_) - 1;
152 }
TkRotation< Scalar > RotationType
Definition: Definitions.h:29
TPRegexp parents
Definition: eve_filter.cc:21
unsigned int buildLevel(unsigned int parentLevel, AlignableMap &, std::ostringstream &)
Builds the components for a given level in the hierarchy.
std::vector< Alignable * > Alignables
Definition: Alignable.h:251
unsigned int getIndexOfStructure(align::ID, unsigned int level) const
uint32_t ID
Definition: Definitions.h:26
unsigned int buildAll(AlignableMap &)
Alignables & get(const std::string &name="")
Definition: AlignableMap.cc:9
def move
Definition: eostools.py:510
Alignables & find(const std::string &name="")
Definition: AlignableMap.cc:15
void clearAlignmentLevels()
Resets the alignment-levels.
unsigned int maxNumComponents(unsigned int startLevel) const
tuple level
Definition: testEve_cfg.py:34
static const char * idToString(align::StructureType type)
AlignableCompositeBuilder(const TrackerTopology *, AlignableIndexer &)
void addAlignmentLevel(std::unique_ptr< AlignmentLevel > level)