11 #include <framework/gearbox/GearDir.h>
12 #include <framework/logging/Logger.h>
13 #include <framework/gearbox/Unit.h>
15 #include <arich/dbobjects/ARICHGeometryConfig.h>
16 #include <arich/dbobjects/tessellatedSolidStr.h>
18 #include <geometry/Materials.h>
19 #include <arich/dbobjects/ARICHGeoHAPD.h>
27 ARICHGeometryConfig::ARICHGeometryConfig(
const GearDir& content)
32 void ARICHGeometryConfig::read(
const GearDir& content)
37 m_bbstudy = content.getInt(
"BeamBackgroundStudy");
39 GearDir envParams(content,
"Envelope");
41 std::string(
"ARICH_Air"));
42 m_masterVolume.setPlacement(envParams.
getLength(
"xPosition"), envParams.
getLength(
"yPosition"),
46 GearDir displParams(content,
"GlobalDisplacement");
47 m_displaceGlobal = !displParams.
getBool(
"Disable");
48 m_globalDispl.setX(displParams.
getLength(
"x"));
49 m_globalDispl.setY(displParams.
getLength(
"y"));
50 m_globalDispl.setZ(displParams.
getLength(
"z"));
51 m_globalDispl.setAlpha(displParams.
getAngle(
"alpha"));
52 m_globalDispl.setBeta(displParams.
getAngle(
"beta"));
53 m_globalDispl.setGamma(displParams.
getAngle(
"gamma"));
55 auto& materials = geometry::Materials::getInstance();
57 GearDir detParams(content,
"Detector/Module");
59 m_hapd.setWallThickness(detParams.
getLength(
"HAPD/windowThickness"));
60 m_hapd.setPadSize(detParams.
getLength(
"HAPD/padSize"));
61 m_hapd.setChipGap(detParams.
getLength(
"HAPD/chipGap"));
62 m_hapd.setNPads(
int(sqrt(detParams.
getInt(
"HAPD/padNum"))),
int(sqrt(detParams.
getInt(
"HAPD/padNum"))));
63 m_hapd.setWinThickness(detParams.
getLength(
"HAPD/windowThickness"));
64 m_hapd.setWinRefIndex(detParams.
getDouble(
"HAPD/windowRefIndex"));
65 m_hapd.setModuleSizeZ(detParams.
getLength(
"height"));
66 m_hapd.setWallMaterial(detParams.
getString(
"HAPD/wallMaterial"));
67 m_hapd.setWinMaterial(detParams.
getString(
"HAPD/windowMaterial"));
72 detParams.
getString(
"HAPD/fillMaterial"));
74 GearDir apdSurfParams(detParams,
"HAPD/Surface");
75 m_hapd.setAPDVolume(detParams.
getLength(
"HAPD/apdSize"), detParams.
getLength(
"HAPD/apdSize"),
77 materials.createOpticalSurfaceConfig(apdSurfParams));
79 GearDir mergerParams(content,
"MergerPCB");
81 m_merger.setMergerPCBMaterialName(mergerParams.
getString(
"merger/material"));
82 m_merger.setMergerPCBLenght(mergerParams.
getDouble(
"merger/sizeL"));
83 m_merger.setMergerPCBWidth(mergerParams.
getDouble(
"merger/sizeW"));
84 m_merger.setMergerPCBThickness(mergerParams.
getDouble(
"merger/thickness"));
85 m_merger.setMergerPCBscrewholeR(mergerParams.
getDouble(
"merger/mergerPCBscrewholeR"));
86 m_merger.setMergerPCBscrewholePosdY(mergerParams.
getDouble(
"merger/mergerPCBscrewholePosdY"));
87 m_merger.setMergerPCBscrewholePosdX1(mergerParams.
getDouble(
"merger/mergerPCBscrewholePosdX1"));
88 m_merger.setMergerPCBscrewholePosdX2(mergerParams.
getDouble(
"merger/mergerPCBscrewholePosdX2"));
89 m_merger.setSingleMergerEnvelopeSizeL(mergerParams.
getDouble(
"merger/envelopeSizeL"));
90 m_merger.setSingleMergerEnvelopeSizeW(mergerParams.
getDouble(
"merger/envelopeSizeW"));
91 m_merger.setSingleMergerEnvelopeThickness(mergerParams.
getDouble(
"merger/envelopeThickness"));
92 m_merger.setSingleMergerenvelopeDeltaZ(mergerParams.
getArray(
"merger/envelopeDeltaZ"));
93 m_merger.setMergerSlotID(mergerParams.
getArray(
"merger/mergerSlotID"));
94 m_merger.setMergerPosR(mergerParams.
getArray(
"merger/mergerPosR"));
95 m_merger.setMergerAngle(mergerParams.
getArray(
"merger/mergerAngle"));
96 m_merger.setMergerOrientation(mergerParams.
getArray(
"merger/mergerOrientation"));
97 m_merger.setEnvelopeCenterPosition(mergerParams.
getDouble(
"mergerEnvelope/x0"),
98 mergerParams.
getDouble(
"mergerEnvelope/y0"),
99 mergerParams.
getDouble(
"mergerEnvelope/z0"));
100 m_merger.setSingleMergeEnvelopePosition(mergerParams.
getDouble(
"merger/envelopePosX0"),
101 mergerParams.
getDouble(
"merger/envelopePosY0"),
102 mergerParams.
getDouble(
"merger/envelopePosZ0"));
103 m_merger.setEnvelopeOuterRadius(mergerParams.
getDouble(
"mergerEnvelope/outerRadius"));
104 m_merger.setEnvelopeInnerRadius(mergerParams.
getDouble(
"mergerEnvelope/innerRadius"));
105 m_merger.setEnvelopeThickness(mergerParams.
getDouble(
"mergerEnvelope/thickness"));
106 m_merger.checkMergerPositionsDataConsistency();
109 GearDir cablesEnvelopParams(content,
"cablesEnvelope");
111 m_cablesenvelope.setCablesEffectiveMaterialName(cablesEnvelopParams.
getString(
"material"));
112 m_cablesenvelope.setEnvelopeOuterRadius(cablesEnvelopParams.
getDouble(
"outerRadius"));
113 m_cablesenvelope.setEnvelopeInnerRadius(cablesEnvelopParams.
getDouble(
"innerRadius"));
114 m_cablesenvelope.setEnvelopeThickness(cablesEnvelopParams.
getDouble(
"thickness"));
115 m_cablesenvelope.setEnvelopeCenterPosition(cablesEnvelopParams.
getDouble(
"x0"), cablesEnvelopParams.
getDouble(
"y0"),
117 m_cablesenvelope.checkCablesEnvelopDataConsistency();
120 GearDir coolingParams(content,
"coolingPipe");
122 m_cooling.setEnvelopeOuterRadius(coolingParams.
getDouble(
"coolingEnvelope/outerRadius"));
123 m_cooling.setEnvelopeInnerRadius(coolingParams.
getDouble(
"coolingEnvelope/innerRadius"));
124 m_cooling.setEnvelopeThickness(coolingParams.
getDouble(
"coolingEnvelope/thickness"));
125 m_cooling.setEnvelopeCenterPosition(coolingParams.
getDouble(
"coolingEnvelope/x0"), coolingParams.
getDouble(
"coolingEnvelope/y0"),
126 coolingParams.
getDouble(
"coolingEnvelope/z0"));
127 m_cooling.setCoolingPipeMaterialName(coolingParams.
getString(
"cooling/material"));
128 m_cooling.setRmin(coolingParams.
getDouble(
"cooling/Rmin"));
129 m_cooling.setRmax(coolingParams.
getDouble(
"cooling/Rmax"));
130 m_cooling.setCoolingGeometryID(coolingParams.
getArray(
"cooling/coolingGeometryID"));
131 m_cooling.setCoolingL(coolingParams.
getArray(
"cooling/coolingL"));
132 m_cooling.setCoolingPosPhi(coolingParams.
getArray(
"cooling/coolingPosPhi"));
133 m_cooling.setCoolingPosR(coolingParams.
getArray(
"cooling/coolingPosR"));
134 m_cooling.setCoolinRotationAngle(coolingParams.
getArray(
"cooling/coolinRotationAngle"));
135 m_cooling.setCoolingTestPlateMaterialName(coolingParams.
getString(
"coolingTestPlate/material"));
136 m_cooling.setColdTubeMaterialName(coolingParams.
getString(
"coolingTestPlate/materialColdTube"));
137 m_cooling.setCoolingTestPlateslengths(coolingParams.
getDouble(
"coolingTestPlate/lengthX"),
138 coolingParams.
getDouble(
"coolingTestPlate/lengthY"), coolingParams.
getDouble(
"coolingTestPlate/lengthZ"));
139 m_cooling.setColdTubeR(coolingParams.
getDouble(
"coolingTestPlate/coldTubeR"));
140 m_cooling.setColdTubeSubtractedR(coolingParams.
getDouble(
"coolingTestPlate/coldTubeSubtractedR"));
141 m_cooling.setColdTubeWallThickness(coolingParams.
getDouble(
"coolingTestPlate/coldTubeWallThickness"));
142 m_cooling.setDepthColdTubeInPlate(coolingParams.
getDouble(
"coolingTestPlate/depthColdTubeInPlate"));
143 m_cooling.setColdTubeSpacing(coolingParams.
getDouble(
"coolingTestPlate/coldTubeSpacing"));
144 m_cooling.setColdTubeNumber(coolingParams.
getInt(
"coolingTestPlate/coldTubeNumber"));
145 m_cooling.setCoolingTestPlatePosR(coolingParams.
getArray(
"coolingTestPlate/coolingTestPlatePosR"));
146 m_cooling.setCoolingTestPlatePosPhi(coolingParams.
getArray(
"coolingTestPlate/coolingTestPlatePosPhi"));
147 m_cooling.setCoolingTestPlatePosZ0(coolingParams.
getArray(
"coolingTestPlate/coolingTestPlatePosZ0"));
148 m_cooling.checkCoolingSystemDataConsistency();
151 GearDir coolingFEBParams(content,
"febcoolingv2");
154 m_coolingv2.setSmallSquareSize(coolingFEBParams.
getDouble(
"smallSquareSize"));
155 m_coolingv2.setSmallSquareThickness(coolingFEBParams.
getDouble(
"smallSquareThickness"));
156 m_coolingv2.setBigSquareSize(coolingFEBParams.
getDouble(
"bigSquareSize"));
157 m_coolingv2.setBigSquareThickness(coolingFEBParams.
getDouble(
"bigSquareThickness"));
158 m_coolingv2.setRectangleL(coolingFEBParams.
getDouble(
"rectangleL"));
159 m_coolingv2.setRectangleW(coolingFEBParams.
getDouble(
"rectangleW"));
160 m_coolingv2.setRectangleThickness(coolingFEBParams.
getDouble(
"rectangleThickness"));
161 m_coolingv2.setRectangleDistanceFromCenter(coolingFEBParams.
getDouble(
"rectangleDistanceFromCenter"));
162 m_coolingv2.setFebcoolingv2GeometryID(coolingFEBParams.
getArray(
"febcoolingv2GeometryID"));
165 modulesPosition(content);
167 GearDir mirrParams(content,
"Mirrors");
169 m_mirrors.setNMirrors(mirrParams.
getInt(
"nMirrors"));
170 m_mirrors.setStartAngle(mirrParams.
getAngle(
"startAngle"));
171 GearDir surfParams(mirrParams,
"Surface");
173 mirrParams.
getString(
"material"), materials.createOpticalSurfaceConfig(surfParams));
174 m_mirrors.setZPosition(mirrParams.
getLength(
"zPosition") + mirrParams.
getLength(
"width") / 2. - m_masterVolume.getLength() / 2.);
175 m_mirrors.setRadius(mirrParams.
getLength(
"radius"));
176 m_mirrors.initializeDefault();
179 GearDir mirrDisplParams(content,
"MirrorDisplacement");
180 if (mirrDisplParams) {
181 m_displaceMirrors = !mirrDisplParams.
getBool(
"Disable");
182 for (
auto plate : mirrDisplParams.
getNodes(
"Plate")) {
183 int id = plate.getInt(
"@id");
184 double r = plate.getLength(
"r");
185 double phi = plate.getAngle(
"phi");
186 double z = plate.getLength(
"z");
187 double alpha = plate.getLength(
"alpha");
188 double beta = plate.getLength(
"beta");
189 double gamma = plate.getLength(
"gamma");
190 double origPhi = m_mirrors.getPoint(
id).Phi();
191 ARICHPositionElement displEl(r * cos(origPhi + phi), r * sin(origPhi + phi), z, alpha, beta, gamma);
192 m_mirrorDispl.setDisplacementElement(
id, displEl);
197 GearDir aerogel(content,
"Aerogel");
199 std::vector<double> dPhi;
200 std::vector<int> nAeroSlotsIndividualRing;
201 for (
auto ring : aerogel.
getNodes(
"slotInRing/Ring")) {
202 dPhi.push_back(2.* M_PI / ring.getInt());
203 nAeroSlotsIndividualRing.push_back(ring.getInt());
205 std::vector<double> slotR;
206 for (
auto ring : aerogel.
getNodes(
"slotR/Ring")) {
207 slotR.push_back(ring.getLength());
210 m_aerogelPlane.setWallRadius(slotR);
211 m_aerogelPlane.setWallDPhi(dPhi);
212 m_aerogelPlane.setNAeroSlotsIndividualRing(nAeroSlotsIndividualRing);
213 m_aerogelPlane.setTileGap(aerogel.
getLength(
"tileGap"));
216 m_aerogelPlane.setWallThickness(aerogel.
getLength(
"wallThickness"));
217 m_aerogelPlane.setWallHeight(aerogel.
getLength(
"wallHeight"));
218 m_aerogelPlane.addSupportPlate(aerogel.
getLength(
"plateInnerR"), aerogel.
getLength(
"plateOuterR"),
221 for (
auto layer : aerogel.
getNodes(
"Layers/Layer")) {
222 double thick = layer.getLength(
"thickness") / Unit::cm;
223 std::string material = layer.getString(
"material");
224 double refIndex = layer.getDouble(
"refIndex");
225 double trLen = layer.getLength(
"trLength");
226 m_aerogelPlane.setAerogelLayer(ilayer, thick, refIndex, trLen, material);
230 m_aerogelPlane.setFullAerogelMaterialDescriptionKey(aerogel.
getInt(
"fullAerogelMaterialDescriptionKey"));
231 m_aerogelPlane.setImgTubeThickness(aerogel.
getDouble(
"imgTubeThickness"));
232 m_aerogelPlane.setCompensationARICHairVolumeThick_min(aerogel.
getDouble(
"compensationARICHairVolumeThick_min"));
235 GearDir aerotilesDir(content,
"AerogelTiles");
236 for (
int il = 0; il < ilayer - 1; il++) {
238 for (
auto ns_ring : nAeroSlotsIndividualRing) {
240 for (
int islot = 1; islot < ns_ring + 1; islot++) {
241 for (
auto tileNode : aerotilesDir.
getNodes(
"Tiles/Tile")) {
242 int ring = tileNode.getInt(
"ring");
243 int column = tileNode.getInt(
"column");
244 int layerN = tileNode.getInt(
"layer");
245 if (iring == ring && column == islot && il == layerN) {
246 double n = tileNode.getDouble(
"n");
247 double transmL = tileNode.getDouble(
"transmL");
248 double thick = tileNode.getDouble(
"thick");
249 std::string materialName = tileNode.getString(
"material");
250 m_aerogelPlane.addTileParameters(ring, column, layerN, n, transmL, thick, materialName);
257 if (m_aerogelPlane.getFullAerogelMaterialDescriptionKey() == 0) {
258 m_aerogelPlane.setPlacement(0.0, 0.0,
261 m_masterVolume.getLength() / 2.0,
263 }
else if (m_aerogelPlane.getFullAerogelMaterialDescriptionKey() == 1) {
264 double wallHeightNew = m_aerogelPlane.getMaximumTotalTileThickness() + m_aerogelPlane.getCompensationARICHairVolumeThick_min();
265 wallHeightNew = wallHeightNew / 10.0;
269 m_aerogelPlane.setPlacement(0.0, 0.0,
271 (wallHeightNew + aerogel.
getLength(
"plateThickness") + aerogel.
getLength(
"imgTubeThickness")) / 2.0 - m_masterVolume.getLength() /
275 B2ERROR(
"ARICHGeometryConfig::read --> getFullAerogelMaterialDescriptionKey() is wrong");
281 m_aerogelPlane.isConsistent();
284 GearDir supportDir(content,
"SupportStructure");
285 for (
auto tube : supportDir.
getNodes(
"Tubes/Tube")) {
286 std::string material = tube.getString(
"material");
287 double innerR = tube.getLength(
"innerR");
288 double outerR = tube.getLength(
"outerR");
289 double length = tube.getLength(
"length");
290 double zPosition = tube.getLength(
"zPosition") - m_masterVolume.getLength() / 2.;
291 std::string name = tube.getString(
"name");
292 m_supportStructure.addTube(innerR, outerR, length, zPosition, material, name);
296 m_supportStructure.setMaterial(supportDir.
getString(
"material"));
298 for (
auto wedge : supportDir.
getNodes(
"Wedges/Wedge")) {
299 std::vector<double> pars;
300 int id = wedge.getInt(
"@id");
301 if (
id > 3 ||
id < 1)
continue;
302 for (
auto par : wedge.getNodes(
"par")) {
303 pars.push_back(par.getLength());
305 m_supportStructure.setWedge(
id, pars);
308 for (
auto wedge : supportDir.
getNodes(
"Wedges/Placements/Placement")) {
309 int type = wedge.getInt(
"type");
310 double r = wedge.getLength(
"r");
311 double phi = wedge.getAngle(
"phi");
312 double z = wedge.getLength(
"z") - m_masterVolume.getLength() / 2.;
313 m_supportStructure.addWedge(type, r, phi, z, supportDir.
getString(
"material"));
320 void ARICHGeometryConfig::print(
const std::string& title)
const
322 ARICHGeoBase::print(title);
323 m_detectorPlane.print();
326 m_cablesenvelope.print();
328 m_masterVolume.print();
329 m_aerogelPlane.print();
330 m_aerogelPlane.printTileParameters();
332 m_supportStructure.print();
335 void ARICHGeometryConfig::modulesPosition(
const GearDir& content)
338 GearDir detParams(content,
"Detector/Plane");
340 std::vector<std::pair<double, double>> ringPar;
342 for (
auto ring : detParams.
getNodes(
"Rings/Ring")) {
343 double r = ring.getLength(
"r");
344 int nMod = ring.getInt(
"nModules");
345 ringPar.push_back({r, 2.*M_PI / nMod});
348 m_detectorPlane.setRingPar(ringPar);
350 GearDir supportParams(content,
"Detector/supportPlate");
351 double modHeight = content.getLength(
"Detector/Module/height");
352 m_detectorPlane.addSupportPlate(supportParams.
getLength(
"innerRadius"), supportParams.
getLength(
"outerRadius"),
354 m_detectorPlane.setModuleHoleSize(supportParams.
getLength(
"moduleHoleSize"));
355 m_detectorPlane.setSupportZPosition(supportParams.
getLength(
"zPosition") + (supportParams.
getLength(
"thickness") +
356 supportParams.
getLength(
"backWallHeight")) / 2. - m_masterVolume.getLength() / 2.);
357 m_detectorPlane.setSupportBackWallHeight(supportParams.
getLength(
"backWallHeight"));
358 m_detectorPlane.setSupportBackWallThickness(supportParams.
getLength(
"backWallThickness"));
360 m_detectorPlane.setPlacement(0.0, 0.0, detParams.
getLength(
"zPosition") + modHeight / 2. - m_masterVolume.getLength() / 2., 0.0,
380 TVector2 ARICHGeometryConfig::getChannelPosition(
unsigned moduleID,
unsigned chX,
unsigned chY)
const
383 origin.SetMagPhi(m_detectorPlane.getSlotR(moduleID), m_detectorPlane.getSlotPhi(moduleID));
385 m_hapd.getXYChannelPos(chX, chY, x, y);
386 TVector2 locPos(x, y);
387 return origin + locPos.Rotate(m_detectorPlane.getSlotPhi(moduleID));