9#include <cdc/dbobjects/CDCGeometry.h>
10#include <framework/gearbox/GearDir.h>
11#include <boost/format.hpp>
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;
62 const int nSLayer = content.getNumberNodes(
"SLayers/SLayer");
64 for (
int iSLayer = 0; iSLayer < nSLayer; ++iSLayer) {
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());
77 dzfwd, dzbwd, offset, nWires, nShifts);
83 const int nFLayer = content.getNumberNodes(
"FLayers/FLayer");
85 for (
int iFLayer = 0; iFLayer < nFLayer; ++iFLayer) {
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");
96 const int nEndplates = content.getNumberNodes(
"Endplates/Endplate");
97 for (
int i = 0; i < nEndplates; ++i) {
102 epContent.
append((boost::format(
"/Endplates/Endplate[%1%]/") % (i + 1)).str());
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);
115 ep.
appendNew(name, iEPLayer, rmin, rmax, zfwd, zbwd);
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());
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);
134 if (innerWallContent.
getString(
"Name") ==
"Shield") {
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());
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);
154 if (outerWallContent.
getString(
"Name") ==
"Shield") {
161 const int nEB = content.getNumberNodes(
"ElectronicsBoards/ElectronicsBoard");
162 for (
int iEB = 0; iEB < nEB; ++iEB) {
164 ebContent.
append((boost::format(
"/ElectronicsBoards/ElectronicsBoard[%1%]/") % (iEB + 1)).str());
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);
175 const int nShields = content.getNumberNodes(
"Shields/Shield");
176 for (
int i = 0; i < nShields; ++i) {
178 neuContent.
append((boost::format(
"/Shields/Shield[%1%]/") % (i + 1)).str());
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 NeutronShield shield(i, rmin1, rmin2, rmax1, rmax2, thick, z);
191 const int nCovers = content.getNumberNodes(
"Covers/Cover");
192 for (
int i = 0; i < nCovers; ++i) {
194 coverContent.
append((boost::format(
"/Covers/Cover[%1%]/") % (i + 1)).str());
196 const int coverID = atoi((coverContent.
getString(
"@id")).c_str());
197 const double rmin1 = coverContent.
getLength(
"InnerR1");
198 const double rmin2 = coverContent.
getLength(
"InnerR2");
199 const double rmax1 = coverContent.
getLength(
"OuterR1");
200 const double rmax2 = coverContent.
getLength(
"OuterR2");
201 const double thick = coverContent.
getLength(
"Thickness");
202 const double z = coverContent.
getLength(
"PosZ");
203 Cover cover(coverID, rmin1, rmin2, rmax1, rmax2, thick, z);
207 const int nCover2s = content.getNumberNodes(
"Covers/Cover2");
208 for (
int i = 0; i < nCover2s; ++i) {
209 GearDir cover2Content(content);
210 cover2Content.
append((boost::format(
"/Covers/Cover2[%1%]/") % (i + 1)).str());
212 const int cover2ID = atoi((cover2Content.
getString(
"@id")).c_str());
213 const double rmin = cover2Content.
getLength(
"InnerR");
214 const double rmax = cover2Content.
getLength(
"OuterR");
215 const double phis = cover2Content.
getLength(
"StartPhi");
216 const double dphi = cover2Content.
getLength(
"DeltaPhi");
217 const double thick = cover2Content.
getLength(
"Thickness");
218 const double z = cover2Content.
getLength(
"PosZ");
219 Cover2 cover2(cover2ID, rmin, rmax, phis, dphi, thick, z);
223 const int nRibs = content.getNumberNodes(
"Covers/Rib");
224 for (
int i = 0; i < nRibs; ++i) {
226 ribContent.
append((boost::format(
"/Covers/Rib[%1%]/") % (i + 1)).str());
228 const int ribID = atoi((ribContent.
getString(
"@id")).c_str());
229 const double length = ribContent.
getLength(
"Length");
230 const double width = ribContent.
getLength(
"Width");
231 const double thick = ribContent.
getLength(
"Thickness");
232 const double rotx = ribContent.
getLength(
"RotX");
233 const double roty = ribContent.
getLength(
"RotY");
234 const double rotz = ribContent.
getLength(
"RotZ");
235 const double x = ribContent.
getLength(
"PosX");
236 const double y = ribContent.
getLength(
"PosY");
237 const double z = ribContent.
getLength(
"PosZ");
238 const int offset = atoi((ribContent.
getString(
"Offset")).c_str());
239 const int ndiv = atoi((ribContent.
getString(
"NDiv")).c_str());
240 Rib rib(ribID, length, width, thick, rotx, roty, rotz, x, y, z, offset, ndiv);
244 const int nRib2s = content.getNumberNodes(
"Covers/Rib2");
245 for (
int i = 0; i < nRib2s; ++i) {
247 rib2Content.
append((boost::format(
"/Covers/Rib2[%1%]/") % (i + 1)).str());
249 const int rib2ID = atoi((rib2Content.
getString(
"@id")).c_str());
250 const double length = rib2Content.
getLength(
"Length");
251 const double width = rib2Content.
getLength(
"Width");
252 const double thick = rib2Content.
getLength(
"Thickness");
253 const double width2 = rib2Content.
getLength(
"Width2");
254 const double thick2 = rib2Content.
getLength(
"Thickness2");
255 const double rotx = rib2Content.
getLength(
"RotX");
256 const double roty = rib2Content.
getLength(
"RotY");
257 const double rotz = rib2Content.
getLength(
"RotZ");
258 const double x = rib2Content.
getLength(
"PosX");
259 const double y = rib2Content.
getLength(
"PosY");
260 const double z = rib2Content.
getLength(
"PosZ");
261 const int ndiv = atoi((rib2Content.
getString(
"NDiv")).c_str());
262 Rib2 rib2(rib2ID, length, width, thick, width2, thick2, rotx, roty, rotz,
267 const int nRib3s = content.getNumberNodes(
"Covers/Rib3");
268 for (
int i = 0; i < nRib3s; ++i) {
270 rib3Content.
append((boost::format(
"/Covers/Rib3[%1%]/") % (i + 1)).str());
272 const int rib3ID = atoi((rib3Content.
getString(
"@id")).c_str());
273 const double length = rib3Content.
getLength(
"Length");
274 const double width = rib3Content.
getLength(
"Width");
275 const double thick = rib3Content.
getLength(
"Thickness");
276 const double r = rib3Content.
getLength(
"HoleR");
277 const double x = rib3Content.
getLength(
"PosX");
278 const double y = rib3Content.
getLength(
"PosY");
279 const double z = rib3Content.
getLength(
"PosZ");
280 const double rx = rib3Content.
getLength(
"HoleX");
281 const double ry = rib3Content.
getLength(
"HoleY");
282 const double rz = rib3Content.
getLength(
"HoleZ");
283 const int offset = atoi((rib3Content.
getString(
"Offset")).c_str());
284 const int ndiv = atoi((rib3Content.
getString(
"NDiv")).c_str());
285 Rib3 rib3(rib3ID, length, width, thick, r, x, y, z, rx, ry, rz, offset, ndiv);
289 const int nRib4s = content.getNumberNodes(
"Covers/Rib4");
290 for (
int i = 0; i < nRib4s; ++i) {
292 rib4Content.
append((boost::format(
"/Covers/Rib4[%1%]/") % (i + 1)).str());
294 const int rib4ID = atoi((rib4Content.
getString(
"@id")).c_str());
295 const double length = rib4Content.
getLength(
"Length");
296 const double width = rib4Content.
getLength(
"Width");
297 const double thick = rib4Content.
getLength(
"Thickness");
298 const double length2 = rib4Content.
getLength(
"Length2");
299 const double width2 = rib4Content.
getLength(
"Width2");
300 const double thick2 = rib4Content.
getLength(
"Thickness2");
301 const double x = rib4Content.
getLength(
"PosX");
302 const double y = rib4Content.
getLength(
"PosY");
303 const double z = rib4Content.
getLength(
"PosZ");
304 const double x2 = rib4Content.
getLength(
"HoleX");
305 const double y2 = rib4Content.
getLength(
"HoleY");
306 const double z2 = rib4Content.
getLength(
"HoleZ");
307 const int offset = atoi((rib4Content.
getString(
"Offset")).c_str());
308 const int ndiv = atoi((rib4Content.
getString(
"NDiv")).c_str());
309 Rib4 rib4(rib4ID, length, width, thick, length2, width2, thick2, x, y, z, x2, y2, z2, offset, ndiv);
313 const int nRib5s = content.getNumberNodes(
"Covers/Rib5");
314 for (
int i = 0; i < nRib5s; ++i) {
316 rib5Content.
append((boost::format(
"/Covers/Rib5[%1%]/") % (i + 1)).str());
318 const int rib5ID = atoi((rib5Content.
getString(
"@id")).c_str());
319 const double dr = rib5Content.
getLength(
"DR");
320 const double dz = rib5Content.
getLength(
"DZ");
321 const double width = rib5Content.
getLength(
"Width");
322 const double thick = rib5Content.
getLength(
"Thickness");
323 const double rin = rib5Content.
getLength(
"Rin");
324 const double x = rib5Content.
getLength(
"PosX");
325 const double y = rib5Content.
getLength(
"PosY");
326 const double z = rib5Content.
getLength(
"PosZ");
327 const double rotx = rib5Content.
getLength(
"RotX");
328 const double roty = rib5Content.
getLength(
"RotY");
329 const double rotz = rib5Content.
getLength(
"RotZ");
330 const int offset = atoi((rib5Content.
getString(
"Offset")).c_str());
331 const int ndiv = atoi((rib5Content.
getString(
"NDiv")).c_str());
332 Rib5 rib5(rib5ID, dr, dz, width, thick, rin, x, y, z,
333 rotx, roty, rotz, offset, ndiv);
340 senseWire.
append(
"/SenseWire/");
347 fieldWire.
append(
"/FieldWire/");
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.
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.
void append(const std::string &path)
Append something to the current path, modifying the GearDir in place.
virtual int getNumberNodes(const std::string &path="") const override
Return the number of nodes a given path will expand to.
virtual std::string getString(const std::string &path="") const noexcept(false) override
Get the parameter path as a string.
static const double mm
[millimeters]
double getLength(const std::string &path="") const noexcept(false)
Get the parameter path as a double converted to the standard length unit.
Abstract base class for different kinds of events.