CMS 3D CMS Logo

AlignableDataIORoot.cc
Go to the documentation of this file.
1 #include "TTree.h"
2 
5 
7 
8 // ----------------------------------------------------------------------------
9 // constructor
11  if (thePosType == Abs) {
12  treename = "AlignablesAbsPos";
13  treetxt = "Alignables abs.Pos";
14  } else if (thePosType == Org) {
15  treename = "AlignablesOrgPos";
16  treetxt = "Alignables org.Pos";
17  } else if (thePosType == Rel) {
18  treename = "AlignablesRelPos";
19  treetxt = "Alignables rel.Pos";
20  }
21 }
22 
23 // ----------------------------------------------------------------------------
24 // create root tree branches (for writing)
25 
27  tree->Branch("Id", &Id, "Id/i");
28  tree->Branch("ObjId", &ObjId, "ObjId/I");
29  tree->Branch("Pos", &Pos, "Pos[3]/D");
30  tree->Branch("Rot", &Rot, "Rot[9]/D");
31 
32  tree->Branch("NumDeform", &numDeformationValues_, "NumDeform/i");
33  tree->Branch("DeformValues", deformationValues_, "DeformValues[NumDeform]/F");
34 }
35 
36 // ----------------------------------------------------------------------------
37 // set root tree branch addresses (for reading)
38 
40  tree->SetBranchAddress("Id", &Id);
41  tree->SetBranchAddress("ObjId", &ObjId);
42  tree->SetBranchAddress("Pos", &Pos);
43  tree->SetBranchAddress("Rot", &Rot);
44 
45  tree->SetBranchAddress("NumDeform", &numDeformationValues_);
46  tree->SetBranchAddress("DeformValues", deformationValues_);
47 }
48 
49 // ----------------------------------------------------------------------------
50 // find root tree entry based on IDs
51 
53  if (newopen) { // we're here first time
54  edm::LogInfo("Alignment") << "@SUB=AlignableDataIORoot::findEntry"
55  << "Filling map ...";
56  treemap.erase(treemap.begin(), treemap.end());
57  for (int ev = 0; ev < tree->GetEntries(); ev++) {
58  tree->GetEntry(ev);
59  treemap[std::make_pair(Id, ObjId)] = ev;
60  }
61  newopen = false;
62  }
63 
64  // now we have filled the map
65  treemaptype::iterator imap = treemap.find(std::make_pair(id, comp));
66  int result = -1;
67  if (imap != treemap.end())
68  result = (*imap).second;
69  return result;
70 }
71 
72 // ----------------------------------------------------------------------------
74  const align::GlobalPoint& pos = ad.pos();
76  Id = ad.id();
77  ObjId = ad.objId();
78  Pos[0] = pos.x();
79  Pos[1] = pos.y();
80  Pos[2] = pos.z();
81  Rot[0] = rot.xx();
82  Rot[1] = rot.xy();
83  Rot[2] = rot.xz();
84  Rot[3] = rot.yx();
85  Rot[4] = rot.yy();
86  Rot[5] = rot.yz();
87  Rot[6] = rot.zx();
88  Rot[7] = rot.zy();
89  Rot[8] = rot.zz();
90 
91  const std::vector<double>& deformPars = ad.deformationParameters();
92  numDeformationValues_ = (deformPars.size() > kMaxNumPar ? (unsigned)kMaxNumPar : deformPars.size());
93  for (unsigned int i = 0; i < numDeformationValues_; ++i) {
94  deformationValues_[i] = deformPars[i];
95  }
96 
97  tree->Fill();
98  return 0;
99 }
100 
101 // ----------------------------------------------------------------------------
103  const align::GlobalVector& pos = ad.pos();
104  align::RotationType rot = ad.rot();
105  Id = ad.id();
106  ObjId = ad.objId();
107  Pos[0] = pos.x();
108  Pos[1] = pos.y();
109  Pos[2] = pos.z();
110  Rot[0] = rot.xx();
111  Rot[1] = rot.xy();
112  Rot[2] = rot.xz();
113  Rot[3] = rot.yx();
114  Rot[4] = rot.yy();
115  Rot[5] = rot.yz();
116  Rot[6] = rot.zx();
117  Rot[7] = rot.zy();
118  Rot[8] = rot.zz();
119 
120  const std::vector<double>& deformPars = ad.deformationParameters();
121  numDeformationValues_ = (deformPars.size() > kMaxNumPar ? (unsigned)kMaxNumPar : deformPars.size());
122  for (unsigned int i = 0; i < numDeformationValues_; ++i) {
123  deformationValues_[i] = deformPars[i];
124  }
125 
126  tree->Fill();
127  return 0;
128 }
129 
130 // ----------------------------------------------------------------------------
134 
135  align::StructureType typeId = ali->alignableObjectId();
136  align::ID id = ali->id();
137  std::vector<double> deformPars;
138  deformPars.reserve(numDeformationValues_);
139  int entry = findEntry(id, typeId);
140  if (entry != -1) {
141  tree->GetEntry(entry);
142  align::GlobalPoint pos2(Pos[0], Pos[1], Pos[2]);
143  align::RotationType rot2(Rot[0], Rot[1], Rot[2], Rot[3], Rot[4], Rot[5], Rot[6], Rot[7], Rot[8]);
144  pos = pos2;
145  rot = rot2;
146 
147  for (unsigned int i = 0; i < numDeformationValues_; ++i) {
148  deformPars.push_back((double)deformationValues_[i]);
149  }
150 
151  ierr = 0;
152  } else
153  ierr = -1;
154 
155  return AlignableAbsData(pos, rot, id, typeId, deformPars);
156 }
157 
158 // ----------------------------------------------------------------------------
159 
163 
164  align::StructureType typeId = ali->alignableObjectId();
165  align::ID id = ali->id();
166  std::vector<double> deformPars;
167  deformPars.reserve(numDeformationValues_);
168  int entry = findEntry(id, typeId);
169  if (entry != -1) {
170  tree->GetEntry(entry);
171  align::GlobalVector pos2(Pos[0], Pos[1], Pos[2]);
172  align::RotationType rot2(Rot[0], Rot[1], Rot[2], Rot[3], Rot[4], Rot[5], Rot[6], Rot[7], Rot[8]);
173  pos = pos2;
174  rot = rot2;
175 
176  for (unsigned int i = 0; i < numDeformationValues_; ++i) {
177  deformPars.push_back((double)deformationValues_[i]);
178  }
179 
180  ierr = 0;
181  } else
182  ierr = -1;
183 
184  return AlignableRelData(pos, rot, id, typeId, deformPars);
185 }
align::ID id() const
Definition: AlignableData.h:29
AlignableDataIORoot(PosType p)
constructor
void setBranchAddresses(void) override
set root branches
AlignableAbsData readAbsRaw(Alignable *ali, int &ierr) override
read absolute positions
align::StructureType objId() const
Definition: AlignableData.h:28
uint32_t ID
Definition: Definitions.h:24
AlignableRelData readRelRaw(Alignable *ali, int &ierr) override
read relative positions
const std::vector< double > deformationParameters() const
Definition: AlignableData.h:30
AlignableData< align::GlobalVector > AlignableRelData
relative position/rotation
Definition: AlignableData.h:45
Float_t deformationValues_[kMaxNumPar]
int findEntry(align::ID, align::StructureType)
virtual StructureType alignableObjectId() const =0
Return the alignable type identifier.
void createBranches(void) override
create root branches
int writeRelRaw(const AlignableRelData &ad) override
write relative positions
Log< level::Info, false > LogInfo
align::ID id() const
Return the ID of Alignable, i.e. DetId of &#39;first&#39; component GeomDet(Unit).
Definition: Alignable.h:180
align::StructureType ObjId
root tree contents
int writeAbsRaw(const AlignableAbsData &ad) override
write absolute positions
AlignableData< align::GlobalPoint > AlignableAbsData
Absolute position/rotation.
Definition: AlignableData.h:43
const T & pos() const
accessors
Definition: AlignableData.h:26
const align::RotationType & rot() const
Definition: AlignableData.h:27
Definition: tree.py:1