Belle II Software development
CDCGeometry.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <cdc/dbobjects/CDCGeometry.h>
10#include <framework/gearbox/GearDir.h>
11#include <boost/format.hpp>
12
13using namespace Belle2;
14using namespace std;
15
16void CDCGeometry::MotherVolume::appendNode(double rmin, double rmax, double z)
17{
18 m_rmin.push_back(rmin);
19 m_rmax.push_back(rmax);
20 m_z.push_back(z);
21}
22
23
25{
26 read(content);
27}
28
32
33void CDCGeometry::read(const GearDir& content)
34{
35 // Global.
36 m_globalOffsetX = content.getLength("OffsetX");
37 m_globalOffsetY = content.getLength("OffsetY");
38 m_globalOffsetZ = content.getLength("OffsetZ");
39 m_globalPhiRotation = content.getAngle("GlobalPhiRotation");
40 m_globalOffsetA = content.getAngle("OffsetA");
41 m_globalOffsetB = content.getAngle("OffsetB");
42 m_globalOffsetC = content.getAngle("OffsetC");
43
44 m_maxNSenseLayers = content.getInt("MaxNSenseLayers");
45 m_maxNFieldLayers = content.getInt("MaxNFieldLayers");
46 m_maxNSuperLayers = content.getInt("SuperLayers");
47 m_firstLayerOffset = content.getInt("FirstLayerOffset");
48 m_firstSuperLayerOffset = content.getInt("SuperLayerOffset");
49 m_maxNCellsPerLayer = content.getInt("MaxNCells");
50
51 // Mother volume.
52 const int nBound = content.getNumberNodes("MomVol/ZBound");
53 for (int iBound = 0; iBound < nBound; iBound++) {
54 const double rmin = content.getLength((boost::format("MomVol/ZBound[%1%]/Rmin") % (iBound + 1)).str()) / Unit::mm;
55 const double rmax = content.getLength((boost::format("MomVol/ZBound[%1%]/Rmax") % (iBound + 1)).str()) / Unit::mm;
56 const double z = content.getLength((boost::format("MomVol/ZBound[%1%]/Z") % (iBound + 1)).str()) / Unit::mm;
57 m_mother.appendNode(rmin, rmax, z);
58 }
59
60
61 // Sense layer.
62 const int nSLayer = content.getNumberNodes("SLayers/SLayer");
63
64 for (int iSLayer = 0; iSLayer < nSLayer; ++iSLayer) {
65 GearDir layerContent(content);
66 layerContent.append((boost::format("/SLayers/SLayer[%1%]/") % (iSLayer + 1)).str());
67 const double r = layerContent.getLength("Radius");
68 const double zfwd = layerContent.getLength("ForwardZ");
69 const double zbwd = layerContent.getLength("BackwardZ");
70 const double dzfwd = layerContent.getLength("FwdDeltaZ");
71 const double dzbwd = layerContent.getLength("BwdDeltaZ");
72 const double offset = atof((layerContent.getString("Offset")).c_str());
73 const int nWires = atoi((layerContent.getString("NHoles")).c_str()) / 2;
74 const double nShifts = atof((layerContent.getString("NShift")).c_str());
75
76 SenseLayer sense(iSLayer + m_firstLayerOffset, r, zfwd, zbwd,
77 dzfwd, dzbwd, offset, nWires, nShifts);
78
79 m_senseLayers.push_back(sense);
80 }
81
82 // Field layer.
83 const int nFLayer = content.getNumberNodes("FLayers/FLayer");
84
85 for (int iFLayer = 0; iFLayer < nFLayer; ++iFLayer) {
86 GearDir layerContent(content);
87 layerContent.append((boost::format("/FLayers/FLayer[%1%]/") % (iFLayer + 1)).str());
88 const double r = layerContent.getLength("Radius");
89 const double zfwd = layerContent.getLength("ForwardZ");
90 const double zbwd = layerContent.getLength("BackwardZ");
91 FieldLayer field(iFLayer + m_firstLayerOffset, r, zfwd, zbwd);
92 m_fieldLayers.push_back(field);
93 }
94
95 // Endplate.
96 const int nEndplates = content.getNumberNodes("Endplates/Endplate");
97 for (int i = 0; i < nEndplates; ++i) {
98
99 EndPlate ep(i);
100
101 GearDir epContent(content);
102 epContent.append((boost::format("/Endplates/Endplate[%1%]/") % (i + 1)).str());
103 const int nEPLayer = epContent.getNumberNodes("EndplateLayer");
104
105 for (int iEPLayer = 0; iEPLayer < nEPLayer; ++iEPLayer) {
106 GearDir epLayerContent(epContent);
107 epLayerContent.append((boost::format("/EndplateLayer[%1%]/") % (iEPLayer + 1)).str());
108 string epName = epLayerContent.getString("Name");
109 double rmin = epLayerContent.getLength("InnerR");
110 double rmax = epLayerContent.getLength("OuterR");
111 double zfwd = epLayerContent.getLength("ForwardZ");
112 double zbwd = epLayerContent.getLength("BackwardZ");
113 std::string name = "Layer" + to_string(i + m_firstLayerOffset) + epName + to_string(iEPLayer);
114
115 ep.appendNew(name, iEPLayer, rmin, rmax, zfwd, zbwd);
116 }
117 m_endplates.push_back(ep);
118 }
119
120 // Inner wall.
121 const int nInnerWall = content.getNumberNodes("InnerWalls/InnerWall");
122 for (int i = 0; i < nInnerWall; ++i) {
123 GearDir innerWallContent(content);
124 innerWallContent.append((boost::format("/InnerWalls/InnerWall[%1%]/") % (i + 1)).str());
125
126 string sInnerWallID = innerWallContent.getString("@id");
127 const string name = "InnerWall_" + sInnerWallID + "_" + innerWallContent.getString("Name");
128 const double rmin = innerWallContent.getLength("InnerR");
129 const double rmax = innerWallContent.getLength("OuterR");
130 const double zfwd = innerWallContent.getLength("ForwardZ");
131 const double zbwd = innerWallContent.getLength("BackwardZ");
132 const InnerWall wall(name, i, rmin, rmax, zfwd, zbwd);
133 m_innerWalls.push_back(wall);
134 if (innerWallContent.getString("Name") == "Shield") {
135 m_fiducialRmin = rmax;
136 }
137 }
138
139
140 // Outer wall.
141 const int nOuterWall = content.getNumberNodes("OuterWalls/OuterWall");
142 for (int i = 0; i < nOuterWall; ++i) {
143 GearDir outerWallContent(content);
144 outerWallContent.append((boost::format("/OuterWalls/OuterWall[%1%]/") % (i + 1)).str());
145
146 string sOuterWallID = outerWallContent.getString("@id");
147 const string name = "OuterWall_" + sOuterWallID + "_" + outerWallContent.getString("Name");
148 const double rmin = outerWallContent.getLength("InnerR");
149 const double rmax = outerWallContent.getLength("OuterR");
150 const double zfwd = outerWallContent.getLength("ForwardZ");
151 const double zbwd = outerWallContent.getLength("BackwardZ");
152 const OuterWall wall(name, i, rmin, rmax, zfwd, zbwd);
153 m_outerWalls.push_back(wall);
154 if (outerWallContent.getString("Name") == "Shield") {
155 m_fiducialRmax = rmin;
156 }
157 }
158
159
160 // Electronics board.
161 const int nEB = content.getNumberNodes("ElectronicsBoards/ElectronicsBoard");
162 for (int iEB = 0; iEB < nEB; ++iEB) {
163 GearDir ebContent(content);
164 ebContent.append((boost::format("/ElectronicsBoards/ElectronicsBoard[%1%]/") % (iEB + 1)).str());
165
166 const double rmin = ebContent.getLength("EBInnerR");
167 const double rmax = ebContent.getLength("EBOuterR");
168 const double zfwd = ebContent.getLength("EBForwardZ");
169 const double zbwd = ebContent.getLength("EBBackwardZ");
170 Frontend frontend(iEB, rmin, rmax, zfwd, zbwd);
171 m_frontends.push_back(frontend);
172 }
173
174 // Neutron shield.
175 const int nShields = content.getNumberNodes("Shields/Shield");
176 for (int i = 0; i < nShields; ++i) {
177 GearDir neuContent(content);
178 neuContent.append((boost::format("/Shields/Shield[%1%]/") % (i + 1)).str());
179
180 const double rmin1 = neuContent.getLength("InnerR1");
181 const double rmin2 = neuContent.getLength("InnerR2");
182 const double rmax1 = neuContent.getLength("OuterR1");
183 const double rmax2 = neuContent.getLength("OuterR2");
184 const double thick = neuContent.getLength("Thickness");
185 const double z = neuContent.getLength("PosZ");
186 const int ena = neuContent.getInt("Enable");
187
188 NeutronShield shield(i, rmin1, rmin2, rmax1, rmax2, thick, z, ena);
189 m_neutronShields.push_back(shield);
190 }
191
192 // Support structure.
193 const int nCovers = content.getNumberNodes("Covers/Cover");
194 for (int i = 0; i < nCovers; ++i) {
195 GearDir coverContent(content);
196 coverContent.append((boost::format("/Covers/Cover[%1%]/") % (i + 1)).str());
197
198 const int coverID = atoi((coverContent.getString("@id")).c_str());
199 const double rmin1 = coverContent.getLength("InnerR1");
200 const double rmin2 = coverContent.getLength("InnerR2");
201 const double rmax1 = coverContent.getLength("OuterR1");
202 const double rmax2 = coverContent.getLength("OuterR2");
203 const double thick = coverContent.getLength("Thickness");
204 const double z = coverContent.getLength("PosZ");
205 Cover cover(coverID, rmin1, rmin2, rmax1, rmax2, thick, z);
206 m_covers.push_back(cover);
207 }
208
209 const int nCover2s = content.getNumberNodes("Covers/Cover2");
210 for (int i = 0; i < nCover2s; ++i) {
211 GearDir cover2Content(content);
212 cover2Content.append((boost::format("/Covers/Cover2[%1%]/") % (i + 1)).str());
213
214 const int cover2ID = atoi((cover2Content.getString("@id")).c_str());
215 const double rmin = cover2Content.getLength("InnerR");
216 const double rmax = cover2Content.getLength("OuterR");
217 const double phis = cover2Content.getLength("StartPhi");
218 const double dphi = cover2Content.getLength("DeltaPhi");
219 const double thick = cover2Content.getLength("Thickness");
220 const double z = cover2Content.getLength("PosZ");
221 Cover2 cover2(cover2ID, rmin, rmax, phis, dphi, thick, z);
222 m_cover2s.push_back(cover2);
223 }
224
225 const int nRibs = content.getNumberNodes("Covers/Rib");
226 for (int i = 0; i < nRibs; ++i) {
227 GearDir ribContent(content);
228 ribContent.append((boost::format("/Covers/Rib[%1%]/") % (i + 1)).str());
229
230 const int ribID = atoi((ribContent.getString("@id")).c_str());
231 const double length = ribContent.getLength("Length");
232 const double width = ribContent.getLength("Width");
233 const double thick = ribContent.getLength("Thickness");
234 const double rotx = ribContent.getLength("RotX");
235 const double roty = ribContent.getLength("RotY");
236 const double rotz = ribContent.getLength("RotZ");
237 const double x = ribContent.getLength("PosX");
238 const double y = ribContent.getLength("PosY");
239 const double z = ribContent.getLength("PosZ");
240 const int offset = atoi((ribContent.getString("Offset")).c_str());
241 const int ndiv = atoi((ribContent.getString("NDiv")).c_str());
242 Rib rib(ribID, length, width, thick, rotx, roty, rotz, x, y, z, offset, ndiv);
243 m_ribs.push_back(rib);
244 }
245
246 const int nRib2s = content.getNumberNodes("Covers/Rib2");
247 for (int i = 0; i < nRib2s; ++i) {
248 GearDir rib2Content(content);
249 rib2Content.append((boost::format("/Covers/Rib2[%1%]/") % (i + 1)).str());
250
251 const int rib2ID = atoi((rib2Content.getString("@id")).c_str());
252 const double length = rib2Content.getLength("Length");
253 const double width = rib2Content.getLength("Width");
254 const double thick = rib2Content.getLength("Thickness");
255 const double width2 = rib2Content.getLength("Width2");
256 const double thick2 = rib2Content.getLength("Thickness2");
257 const double rotx = rib2Content.getLength("RotX");
258 const double roty = rib2Content.getLength("RotY");
259 const double rotz = rib2Content.getLength("RotZ");
260 const double x = rib2Content.getLength("PosX");
261 const double y = rib2Content.getLength("PosY");
262 const double z = rib2Content.getLength("PosZ");
263 const int ndiv = atoi((rib2Content.getString("NDiv")).c_str());
264 Rib2 rib2(rib2ID, length, width, thick, width2, thick2, rotx, roty, rotz,
265 x, y, z, ndiv);
266 m_rib2s.push_back(rib2);
267 }
268
269 const int nRib3s = content.getNumberNodes("Covers/Rib3");
270 for (int i = 0; i < nRib3s; ++i) {
271 GearDir rib3Content(content);
272 rib3Content.append((boost::format("/Covers/Rib3[%1%]/") % (i + 1)).str());
273
274 const int rib3ID = atoi((rib3Content.getString("@id")).c_str());
275 const double length = rib3Content.getLength("Length");
276 const double width = rib3Content.getLength("Width");
277 const double thick = rib3Content.getLength("Thickness");
278 const double r = rib3Content.getLength("HoleR");
279 const double x = rib3Content.getLength("PosX");
280 const double y = rib3Content.getLength("PosY");
281 const double z = rib3Content.getLength("PosZ");
282 const double rx = rib3Content.getLength("HoleX");
283 const double ry = rib3Content.getLength("HoleY");
284 const double rz = rib3Content.getLength("HoleZ");
285 const int offset = atoi((rib3Content.getString("Offset")).c_str());
286 const int ndiv = atoi((rib3Content.getString("NDiv")).c_str());
287 Rib3 rib3(rib3ID, length, width, thick, r, x, y, z, rx, ry, rz, offset, ndiv);
288 m_rib3s.push_back(rib3);
289 }
290
291 const int nRib4s = content.getNumberNodes("Covers/Rib4");
292 for (int i = 0; i < nRib4s; ++i) {
293 GearDir rib4Content(content);
294 rib4Content.append((boost::format("/Covers/Rib4[%1%]/") % (i + 1)).str());
295
296 const int rib4ID = atoi((rib4Content.getString("@id")).c_str());
297 const double length = rib4Content.getLength("Length");
298 const double width = rib4Content.getLength("Width");
299 const double thick = rib4Content.getLength("Thickness");
300 const double length2 = rib4Content.getLength("Length2");
301 const double width2 = rib4Content.getLength("Width2");
302 const double thick2 = rib4Content.getLength("Thickness2");
303 const double x = rib4Content.getLength("PosX");
304 const double y = rib4Content.getLength("PosY");
305 const double z = rib4Content.getLength("PosZ");
306 const double x2 = rib4Content.getLength("HoleX");
307 const double y2 = rib4Content.getLength("HoleY");
308 const double z2 = rib4Content.getLength("HoleZ");
309 const int offset = atoi((rib4Content.getString("Offset")).c_str());
310 const int ndiv = atoi((rib4Content.getString("NDiv")).c_str());
311 Rib4 rib4(rib4ID, length, width, thick, length2, width2, thick2, x, y, z, x2, y2, z2, offset, ndiv);
312 m_rib4s.push_back(rib4);
313 }
314
315 const int nRib5s = content.getNumberNodes("Covers/Rib5");
316 for (int i = 0; i < nRib5s; ++i) {
317 GearDir rib5Content(content);
318 rib5Content.append((boost::format("/Covers/Rib5[%1%]/") % (i + 1)).str());
319
320 const int rib5ID = atoi((rib5Content.getString("@id")).c_str());
321 const double dr = rib5Content.getLength("DR");
322 const double dz = rib5Content.getLength("DZ");
323 const double width = rib5Content.getLength("Width");
324 const double thick = rib5Content.getLength("Thickness");
325 const double rin = rib5Content.getLength("Rin");
326 const double x = rib5Content.getLength("PosX");
327 const double y = rib5Content.getLength("PosY");
328 const double z = rib5Content.getLength("PosZ");
329 const double rotx = rib5Content.getLength("RotX");
330 const double roty = rib5Content.getLength("RotY");
331 const double rotz = rib5Content.getLength("RotZ");
332 const int offset = atoi((rib5Content.getString("Offset")).c_str());
333 const int ndiv = atoi((rib5Content.getString("NDiv")).c_str());
334 Rib5 rib5(rib5ID, dr, dz, width, thick, rin, x, y, z,
335 rotx, roty, rotz, offset, ndiv);
336 m_rib5s.push_back(rib5);
337 }
338
339
340 // Sense wire.
341 GearDir senseWire(content);
342 senseWire.append("/SenseWire/");
343 m_senseWireDiameter = senseWire.getLength("Diameter");
344 // B2INFO("m_senseWireDiameter= " << m_senseWireDiameter);
345 m_senseWireNumbers = atoi((senseWire.getString("Number")).c_str());
346
347 // Field wire.
348 GearDir fieldWire(content);
349 fieldWire.append("/FieldWire/");
350 m_fieldWireDiameter = fieldWire.getLength("Diameter");
351 // B2INFO("m_fieldWireDiameter= " << m_fieldWireDiameter);
352 m_fieldWireNumbers = atoi((fieldWire.getString("Number")).c_str());
353
354
355 // Feedthrough.
356 m_feedThroughLength = content.getLength("/FeedThrough/Length");
357 // B2INFO("m_feedThroughLength= " << m_feedThroughLength);
358
359 // Get control switch for gas and wire material definition
360 m_clockFrequency = content.getDouble("ClockFrequencyForTDC");
361 m_nominalSpaceResolution = content.getLength("SenseWire/SpaceResol");
362
363}
Cover2 structure geometry parameters.
Cover structure geometry parameters.
Endplate geometry parameters.
void appendNew(const std::string &name, int ilay, double rmin, double rmax, double zfwd, double zbwd)
Add new endplate layer.
Field layer geometry parameters.
Frontend layer geometry parameters.
Inner wall geometry parameters.
std::vector< double > m_z
Z-cordinates list of the mother volume.
std::vector< double > m_rmin
Rmin list of the mother volume.
std::vector< double > m_rmax
Rmax list of the mother volume.
void appendNode(double rmin, double rmax, double z)
Append a new node.
Neutron shield geometry parameters.
Outer wall geometry parameters.
Rib2 structure geometry parameters.
Rib3 structure geometry parameters.
Rib4 structure geometry parameters.
Rib5 structure geometry parameters.
Rib structure geometry parameters.
Definition CDCGeometry.h:35
Sense layer geometry parameters.
double m_globalOffsetB
Offset angle b of the whole cdc wrt B2 coord system (rad).
ushort m_maxNSuperLayers
Maximum number of Super Layers.
MotherVolume m_mother
CDC mother volume.
double m_globalPhiRotation
Global rotation in phi (rad).
int m_senseWireNumbers
Number of sense wires.
std::vector< Rib5 > m_rib5s
Rib5s.
double m_globalOffsetZ
Offset z of the whole cdc wrt B2 coord system (cm).
int m_fieldWireNumbers
Number of field wires.
~CDCGeometry()
Destructor.
std::vector< NeutronShield > m_neutronShields
Neutron shields.
double m_globalOffsetX
Offset x of the whole cdc wrt B2 coord system (cm).
CDCGeometry()
Default constructor.
double m_feedThroughLength
Feedthrough length (cm).
ushort m_maxNSenseLayers
Maximum number of Sense Wire Layers.
std::vector< Cover2 > m_cover2s
Cover2s.
double m_senseWireDiameter
Sense wire diameter (cm).
double m_clockFrequency
Clock frequency.
std::vector< Cover > m_covers
Covers.
double m_globalOffsetY
Offset y of the whole cdc wrt B2 coord system (cm).
std::vector< EndPlate > m_endplates
Endplate.
ushort m_firstSuperLayerOffset
Offset of the first super layer (for reduced CDC studies)
std::vector< InnerWall > m_innerWalls
Inner wall.
double m_fiducialRmin
Minimum radius of the CDC fiducial volume.
double m_fieldWireDiameter
Field wire diameter (cm).
std::vector< OuterWall > m_outerWalls
Outer wall.
std::vector< Frontend > m_frontends
Electronics board.
double m_globalOffsetC
Offset angle c of the whole cdc wrt B2 coord system (rad).
std::vector< SenseLayer > m_senseLayers
Sense layer.
double m_fiducialRmax
Maximum radius of the CDC fiducial volume.
std::vector< FieldLayer > m_fieldLayers
Field layer.
ushort m_maxNCellsPerLayer
Maximum number wires within a layer.
std::vector< Rib > m_ribs
Ribs.
ushort m_maxNFieldLayers
Maximum number of Field Wire Layers.
void read(const GearDir &)
Get geometry parameters from Gearbox.
std::vector< Rib4 > m_rib4s
Rib4s.
double m_globalOffsetA
Offset angle a of the whole cdc wrt B2 coord system (rad).
ushort m_firstLayerOffset
Offset of the first layer (for reduced CDC studies)
double m_nominalSpaceResolution
Nominal space resolution.
std::vector< Rib2 > m_rib2s
Rib2s.
std::vector< Rib3 > m_rib3s
Rib3s.
GearDir is the basic class used for accessing the parameter store.
Definition GearDir.h:31
void append(const std::string &path)
Append something to the current path, modifying the GearDir in place.
Definition GearDir.h:52
virtual int getNumberNodes(const std::string &path="") const override
Return the number of nodes a given path will expand to.
Definition GearDir.h:58
virtual std::string getString(const std::string &path="") const noexcept(false) override
Get the parameter path as a string.
Definition GearDir.h:69
static const double mm
[millimeters]
Definition Unit.h:70
double getLength(const std::string &path="") const noexcept(false)
Get the parameter path as a double converted to the standard length unit.
Definition Interface.h:259
int getInt(const std::string &path="") const noexcept(false)
Get the parameter path as a int.
Definition Interface.cc:60
Abstract base class for different kinds of events.
STL namespace.