20#include <TGeoCompositeShape.h>
21#include <TGeoManager.h>
22#include <TGeoMedium.h>
25#include <TGeoVolume.h>
28#include <rapidjson/document.h>
29#include <rapidjson/filereadstream.h>
35using namespace rapidjson;
111const map<string, array<int, 4>>
kPcbTypes = {{
"B1N1", {10, 10, 7, 7}}, {
"B2N2-", {5, 5, 4, 3}}, {
"B2N2+", {5, 5, 3, 4}}, {
"B3-N3", {3, 2, 2, 2}}, {
"B3+N3", {2, 3, 2, 2}}, {
"R1", {3, 4, 2, 3}}, {
"R2", {13, 4, 9, 3}}, {
"R3", {13, 1, 10, 0}}, {
"S2-", {4, 5, 3, 3}}, {
"S2+", {5, 4, 3, 3}}};
114const map<string, vector<string>>
kSlatTypes = {{
"122000SR1", {
"S2-",
"B2N2+",
"B1N1",
"R1"}},
115 {
"112200SR2", {
"S2-",
"B2N2+",
"B1N1",
"R2"}},
116 {
"122200S", {
"B1N1",
"B2N2-",
"B2N2-",
"S2+"}},
117 {
"222000N", {
"B2N2-",
"B2N2-",
"B2N2-"}},
118 {
"220000N", {
"B2N2-",
"B2N2-"}},
119 {
"122000NR1", {
"B2N2+",
"B2N2+",
"B1N1",
"R1"}},
120 {
"112200NR2", {
"B2N2+",
"B2N2+",
"B1N1",
"R2"}},
121 {
"122200N", {
"B1N1",
"B2N2-",
"B2N2-",
"B2N2-"}},
122 {
"122330N", {
"B1N1",
"B2N2+",
"B2N2-",
"B3-N3",
"B3-N3"}},
123 {
"112233NR3", {
"B3+N3",
"B3+N3",
"B2N2+",
"B2N2-",
"B1N1",
"R3"}},
124 {
"112230N", {
"B1N1",
"B1N1",
"B2N2-",
"B2N2-",
"B3-N3"}},
125 {
"222330N", {
"B2N2+",
"B2N2+",
"B2N2-",
"B3-N3",
"B3-N3"}},
126 {
"223300N", {
"B2N2+",
"B2N2-",
"B3-N3",
"B3-N3"}},
127 {
"333000N", {
"B3-N3",
"B3-N3",
"B3-N3"}},
128 {
"330000N", {
"B3-N3",
"B3-N3"}},
129 {
"112233N", {
"B1N1",
"B1N1",
"B2N2+",
"B2N2-",
"B3-N3",
"B3-N3"}},
131 {
"B2N2+",
"B2N2+",
"B2N2+",
"B3-N3",
"B3-N3",
"B3-N3"}},
132 {
"223330N", {
"B2N2+",
"B2N2+",
"B3-N3",
"B3-N3",
"B3-N3"}},
133 {
"333300N", {
"B3+N3",
"B3-N3",
"B3-N3",
"B3-N3"}}};
144 return name.find(
'R') <
name.size();
149 return name.find(
'S') <
name.size();
152TGeoCompositeShape*
getRoundedShape(
const char*
name,
float halfThickness,
float xPos,
float yPos,
float radius)
157 const char* shiftName = Form(
"%sX%.1fY%.1fShift",
name, TMath::Abs(xPos), TMath::Abs(yPos));
158 auto shift =
new TGeoTranslation(shiftName, xPos, yPos, 0.);
159 shift->RegisterYourself();
162 const char* tubeName = Form(
"%sR%.1fHole",
name, radius);
163 new TGeoTube(tubeName, 0., radius, halfThickness);
165 const char* shapeName = Form(
"%sX%.1fY%.1fR%.1fShape",
name, TMath::Abs(xPos), TMath::Abs(yPos), radius);
168 return new TGeoCompositeShape(shapeName, Form(
"%sBox-%s:%s",
name, tubeName, shiftName));
202 string bendName, nonbendName;
203 float y = 0., shift = 0.,
length = 0.;
209 for (
const auto& [pcbName, dualSampas] :
kPcbTypes) {
211 auto name = (
const char*)pcbName.data();
213 auto pcb =
new TGeoVolumeAssembly(
name);
216 float gasShift = 0., pcbShift = 0.;
221 int numb = pcbName[1] -
'0';
224 switch (pcbName.front()) {
226 numb = pcbName.back() -
'0';
232 bendName = Form(
"%sB",
name);
233 nonbendName = Form(
"%sN",
name);
238 bendName = Form(
"S2B%c", pcbName.back());
239 nonbendName = Form(
"S2N%c", pcbName.back());
242 bendName = (numb == 3) ? pcbName.substr(0, 3) : pcbName.substr(0, 2);
243 nonbendName = (numb == 3) ? pcbName.substr(3) : pcbName.substr(2);
246 float borderLength = pcbLength;
252 float x = pcbLength / 2;
297 if (pcbName.back() !=
'1') {
307 pcb->AddNode(gas, 1,
new TGeoTranslation(gasShift / 2, 0., 0.));
308 float z = halfThickness;
313 pcb->AddNode(bend, 1,
new TGeoTranslation(
x, 0.,
z));
314 pcb->AddNode(nonbend, 2,
new TGeoTranslation(
x, 0., -
z));
319 pcb->AddNode(insu, 1,
new TGeoTranslation(
x, 0.,
z));
320 pcb->AddNode(insu, 2,
new TGeoTranslation(
x, 0., -
z));
325 pcb->AddNode(gGeoManager->GetVolume(Form(
"Top spacer %.2f long", pcbLength)), 1,
new TGeoTranslation(
x,
y, 0.));
326 pcb->AddNode(spacer, 1,
new TGeoTranslation(
x, -
y, 0.));
330 pcb->AddNode(gGeoManager->GetVolume(Form(
"Top border %.2f long", pcbLength)), 1,
new TGeoTranslation(
x,
y, 0.));
331 x = (pcbShift - pcbLength + borderLength) / 2;
334 1,
new TGeoTranslation(
x, -
y, 0.));
339 for (
int i = 0;
i < dualSampas.size();
i++) {
341 nDualSampas = dualSampas[
i];
342 length = (
i % 2) ? borderLength : pcbLength;
343 shift = (
i % 2) ? TMath::Power(-1,
isRounded(pcbName)) * (pcbLength - borderLength) : 0.;
345 z = TMath::Power(-1,
i / 2) * TMath::Abs(
z);
347 for (
int j = 0;
j < nDualSampas;
j++) {
348 pcb->AddNode(dualSampaVol, 100 *
i +
j,
349 new TGeoTranslation((
j - nDualSampas / 2) * (
length / nDualSampas) - (nDualSampas % 2 - 1) * (
length / (2 * nDualSampas)) +
350 (pcbShift + shift) / 2,
364 auto leftSpacer = gGeoManager->GetVolume(
"Left spacer");
367 auto mirror =
new TGeoRotation();
368 mirror->ReflectZ(
true);
370 for (
const auto& [typeName, pcbVector] :
kSlatTypes) {
372 auto name = (
const char*)typeName.data();
375 auto slat =
new TGeoVolumeAssembly(
name);
378 float direction = TMath::Power(-1,
isRounded(typeName));
380 float center = (pcbVector.size() - 1) *
kGasLength / 2;
381 float panelShift = 0.;
385 for (
const auto& pcb : pcbVector) {
390 switch (pcb.front()) {
398 panelShift += direction * (pcbLength -
kPCBLength);
402 halfLength += pcbLength;
405 slat->AddNode(gGeoManager->GetVolume(pcb.data()), iVol + 1,
406 new TGeoTranslation(iVol *
kPCBLength - direction * (
kPCBLength - gasLength) / 2 - center, 0, 0));
415 if (typeName ==
"122200N") {
418 cableHalfLength -= halfLength;
419 if (typeName ==
"122330N") {
430 auto rightSpacer =
new TGeoVolume(Form(
"%s right spacer",
name),
434 auto panel =
new TGeoVolumeAssembly(Form(
"%s panel",
name));
436 float x = halfLength;
458 float angMin = 90., angMax = 180.;
463 float xRoundedPos =
x + panelShift;
469 switch (typeName.back()) {
488 cableHalfLength -= (
x + halfLength) / 2;
491 slat->AddNode(gGeoManager->MakeTubs(Form(
"%s rounded spacer",
name), kSpacerMed, radius,
493 1,
new TGeoTranslation(xRoundedPos, -
y, 0.));
510 float z = halfThickness;
511 panel->AddNode(glue, 1,
new TGeoTranslation(0., 0.,
z));
516 panel->AddNode(nomexBulk, 1,
new TGeoTranslation(0., 0.,
z));
521 panel->AddNode(glue, 2,
new TGeoTranslation(0., 0.,
z));
526 panel->AddNode(carbon, 1,
new TGeoTranslation(0., 0.,
z));
531 panel->AddNode(nomex, 1,
new TGeoTranslation(0., 0.,
z));
536 panel->AddNode(carbon, 2,
new TGeoTranslation(0., 0.,
z));
541 slat->AddNode(panel, 1,
new TGeoTranslation(
x, 0.,
z));
542 slat->AddNode(panel, 2,
new TGeoCombiTrans(
x, 0., -
z, mirror));
546 slat->AddNode(leftSpacer, 1,
new TGeoTranslation(-(
x - panelShift), 0., 0.));
548 if (typeName.back() !=
'1') {
549 slat->AddNode(rightSpacer, 1,
new TGeoTranslation(
x + panelShift, 0., 0.));
554 x = direction * (
x + cableHalfLength + direction * panelShift);
557 slat->AddNode(LVcable, 1,
new TGeoTranslation(
x,
y, 0));
558 slat->AddNode(LVcable, 2,
new TGeoTranslation(
x, -
y, 0));
569 float halfLength = 0., halfHeight = 0.;
571 for (
int i = 5;
i <= 10;
i++) {
574 auto support =
new TGeoVolumeAssembly(Form(
"Chamber %d support panel",
i));
593 const char* nomexName = Form(
"NomexSupportPanelCh%d",
i);
594 new TGeoBBox(Form(
"%sBox", nomexName), halfLength, halfHeight, halfThickness);
597 i,
new TGeoTranslation(halfLength, 0.,
z));
603 const char* glueName = Form(
"GlueSupportPanelCh%d",
i);
604 new TGeoBBox(Form(
"%sBox", glueName), halfLength, halfHeight, halfThickness);
610 support->AddNode(glue, 1,
new TGeoTranslation(halfLength, 0.,
z));
611 support->AddNode(glue, 2,
new TGeoTranslation(halfLength, 0., -
z));
616 const char* carbonName = Form(
"CarbonSupportPanelCh%d",
i);
617 new TGeoBBox(Form(
"%sBox", carbonName), halfLength, halfHeight, halfThickness);
623 support->AddNode(carbon, 1,
new TGeoTranslation(halfLength, 0.,
z));
624 support->AddNode(carbon, 2,
new TGeoTranslation(halfLength, 0., -
z));
642 Value& hChs = doc[
"HalfChambers"];
643 assert(hChs.IsArray());
646 auto motherVolume = &topVolume;
649 for (
const auto& halfCh : hChs.GetArray()) {
651 if (!halfCh.IsObject()) {
652 throw runtime_error(
"Can't create the half-chambers : wrong Value input");
655 int moduleID = halfCh[
"moduleID"].GetInt();
656 const string name = halfCh[
"name"].GetString();
659 int nCh = (
name.find(
'0') == 2) ?
name[3] -
'0' : 10;
661 auto halfChVol =
new TGeoVolumeAssembly(
name.data());
664 auto supRot =
new TGeoRotation();
666 supRot->RotateY(180.);
668 halfChVol->AddNode(gGeoManager->GetVolume(Form(
"Chamber %d support panel", nCh)), moduleID, supRot);
671 for (
const auto& slat : halfCh[
"nodes"].GetArray()) {
673 if (!slat.IsObject()) {
674 throw runtime_error(
"Can't create the slat : wrong Value input");
677 int detID = slat[
"detID"].GetInt();
681 gGeoManager->GetVolume(slat[
"type"].GetString()), detID,
682 new TGeoCombiTrans(slat[
"position"][0].GetDouble(), slat[
"position"][1].GetDouble(),
683 slat[
"position"][2].GetDouble(),
684 new TGeoRotation(Form(
"Slat%drotation", detID), slat[
"rotation"][0].GetDouble(),
685 slat[
"rotation"][1].GetDouble(), slat[
"rotation"][2].GetDouble(),
686 slat[
"rotation"][3].GetDouble(), slat[
"rotation"][4].GetDouble(),
687 slat[
"rotation"][5].GetDouble())));
691 auto halfChCTrans =
new TGeoCombiTrans(halfCh[
"position"][0].GetDouble(), halfCh[
"position"][1].GetDouble(), halfCh[
"position"][2].GetDouble(),
693 Form(
"%srotation",
name.data()),
694 halfCh[
"rotation"][0].GetDouble(), halfCh[
"rotation"][1].GetDouble(),
695 halfCh[
"rotation"][2].GetDouble(), halfCh[
"rotation"][3].GetDouble(),
696 halfCh[
"rotation"][4].GetDouble(), halfCh[
"rotation"][5].GetDouble()));
699 if ((nCh == 5 || nCh == 6) && gGeoManager->GetVolume(
"Dipole")) {
700 motherVolume = gGeoManager->GetVolume(
"DDIP");
705 halfChCTrans->RotateY(180.);
708 if (nCh > 6 && gGeoManager->GetVolume(
"YOUT2")) {
709 motherVolume = gGeoManager->GetVolume(
"YOUT2");
713 motherVolume->AddNode(halfChVol, moduleID, halfChCTrans);
723 vector<TGeoVolume*> sensitiveVolumeNames;
726 auto vol = gGeoManager->GetVolume(Form(
"%s gas",
name.c_str()));
731 sensitiveVolumeNames.push_back(vol);
734 return sensitiveVolumeNames;
769 "position":[0.00, -0.1074, -959.75],
770 "rotation":[90, 0, 90.794, 90, 0.794, 90],
775 "position":[81.25, 0.00, 4.00],
776 "rotation":[90, 180, 90, 90, 180, 0]
781 "position":[81.25, 37.80, -4.00],
782 "rotation":[90, 180, 90, 90, 180, 0]
787 "position":[81.25, 75.50, 4.00],
788 "rotation":[90, 0, 90, 270, 180, 0]
793 "position":[61.25, 112.80, -4.00],
794 "rotation":[90, 0, 90, 90, 0, 0]
799 "position":[41.25, 146.50, 4.00],
800 "rotation":[90, 0, 90, 270, 180, 0]
805 "position":[41.25, -146.50, 4.00],
806 "rotation":[90, 0, 90, 270, 180, 0]
811 "position":[61.25, -112.80, -4.00],
812 "rotation":[90, 0, 90, 90, 0, 0]
817 "position":[81.25, -75.50, 4.00],
818 "rotation":[90, 0, 90, 270, 180, 0]
823 "position":[81.25, -37.80, -4.00],
824 "rotation":[90, 180, 90, 270, 0, 0]
832 "position":[0.00, 0.1074, -975.25],
833 "rotation":[90, 0, 90.794, 90, 0.794, 90],
838 "position":[-41.25, 146.50, -4.00],
839 "rotation":[90, 180, 90, 270, 0, 0]
844 "position":[-61.25, 112.80, 4.00],
845 "rotation":[90, 180, 90, 90, 180, 0]
850 "position":[-81.25, 75.50, -4.00],
851 "rotation":[90, 180, 90, 270, 0, 0]
856 "position":[-81.25, 37.80, 4.00],
857 "rotation":[90, 0, 90, 90, 0, 0]
862 "position":[-81.25, 0.00, -4.00],
863 "rotation":[90, 0, 90, 90, 0, 0]
868 "position":[-81.25, -37.80, 4.00],
869 "rotation":[90, 0, 90, 270, 180, 0]
874 "position":[-81.25, -75.50, -4.00],
875 "rotation":[90, 180, 90, 270, 0, 0]
880 "position":[-61.25, -112.80, 4.00],
881 "rotation":[90, 180, 90, 90, 180, 0]
886 "position":[-41.25, -146.50, -4.00],
887 "rotation":[90, 180, 90, 270, 0, 0]
895 "position":[0.00, -0.1074, -990.75],
896 "rotation":[90, 0, 90.794, 90, 0.794, 90],
901 "position":[81.25, 0.00, 4.00],
902 "rotation":[90, 180, 90, 90, 180, 0]
907 "position":[81.25, 37.80, -4.00],
908 "rotation":[90, 180, 90, 90, 180, 0]
913 "position":[81.25, 75.50, 4.00],
914 "rotation":[90, 0, 90, 270, 180, 0]
919 "position":[61.25, 112.80, -4.00],
920 "rotation":[90, 0, 90, 90, 0, 0]
925 "position":[41.25, 146.50, 4.00],
926 "rotation":[90, 0, 90, 270, 180, 0]
931 "position":[41.25, -146.50, 4.00],
932 "rotation":[90, 0, 90, 270, 180, 0]
937 "position":[61.25, -112.80, -4.00],
938 "rotation":[90, 0, 90, 90, 0, 0]
943 "position":[81.25, -75.50, 4.00],
944 "rotation":[90, 0, 90, 270, 180, 0]
949 "position":[81.25, -37.80, -4.00],
950 "rotation":[90, 180, 90, 270, 0, 0]
958 "position":[0.00, 0.1074, -1006.25],
959 "rotation":[90, 0, 90.794, 90, 0.794, 90],
964 "position":[-41.25, 146.50, -4.00],
965 "rotation":[90, 180, 90, 270, 0, 0]
970 "position":[-61.25, 112.80, 4.00],
971 "rotation":[90, 180, 90, 90, 180, 0]
976 "position":[-81.25, 75.50, -4.00],
977 "rotation":[90, 180, 90, 270, 0, 0]
982 "position":[-81.25, 37.80, 4.00],
983 "rotation":[90, 0, 90, 90, 0, 0]
988 "position":[-81.25, 0.00, -4.00],
989 "rotation":[90, 0, 90, 90, 0, 0]
994 "position":[-81.25, -37.80, 4.00],
995 "rotation":[90, 0, 90, 270, 180, 0]
1000 "position":[-81.25, -75.5, -4.00],
1001 "rotation":[90, 180, 90, 270, 0, 0]
1006 "position":[-61.25, -112.80, 4.00],
1007 "rotation":[90, 180, 90, 90, 180, 0]
1012 "position":[-41.25, -146.50, -4.00],
1013 "rotation":[90, 180, 90, 270, 0, 0]
1021 "position":[0.00, -0.1074, -1268.75],
1022 "rotation":[90, 0, 90.794, 90, 0.794, 90],
1027 "position":[140.00, 0.00, 4.25],
1028 "rotation":[90, 0, 90, 270, 180, 0]
1033 "position":[121.25, 38.20, -4.25],
1034 "rotation":[90, 180, 90, 90, 180, 0]
1039 "position":[101.25, 72.60, 4.25],
1040 "rotation":[90, 0, 90, 270, 180, 0]
1045 "position":[101.25, 109.20, -4.25],
1046 "rotation":[90, 0, 90, 90, 0, 0]
1051 "position":[81.25, 138.50, 4.25],
1052 "rotation":[90, 0, 90, 270, 180, 0]
1057 "position":[61.25, 175.50, -4.25],
1058 "rotation":[90, 0, 90, 90, 0, 0]
1063 "position":[41.25, 204.50, 4.25],
1064 "rotation":[90, 0, 90, 270, 180, 0]
1069 "position":[41.25, -204.50, 4.25],
1070 "rotation":[90, 0, 90, 270, 180, 0]
1075 "position":[61.25, -175.50, -4.25],
1076 "rotation":[90, 0, 90, 90, 0, 0]
1081 "position":[81.25, -138.50, 4.25],
1082 "rotation":[90, 0, 90, 270, 180, 0]
1087 "position":[101.25, -109.20, -4.25],
1088 "rotation":[90, 0, 90, 90, 0, 0]
1093 "position":[101.25, -72.60, 4.25],
1094 "rotation":[90, 0, 90, 270, 180, 0]
1099 "position":[121.25, -38.20, -4.25],
1100 "rotation":[90, 180, 90, 270, 0, 0]
1108 "position":[0.00, -0.1074, -1284.25],
1109 "rotation":[90, 0, 90.794, 90, 0.794, 90],
1114 "position":[-41.25, 204.5, -4.25],
1115 "rotation":[90, 180, 90, 270, 0, 0]
1120 "position":[-61.25, 175.50, 4.25],
1121 "rotation":[90, 180, 90, 90, 180, 0]
1126 "position":[-81.25, 138.50, -4.25],
1127 "rotation":[90, 180, 90, 270, 0, 0]
1132 "position":[-101.25, 109.20, 4.25],
1133 "rotation":[90, 180, 90, 90, 180, 0]
1138 "position":[-101.25, 72.60, -4.25],
1139 "rotation":[90, 180, 90, 270, 0, 0]
1144 "position":[-121.25, 38.20, 4.25],
1145 "rotation":[90, 0, 90, 90, 0, 0]
1150 "position":[-140.00, 0.00, -4.25],
1151 "rotation":[90, 180, 90, 270, 0, 0]
1156 "position":[-121.25, -38.20, 4.25],
1157 "rotation":[90, 0, 90, 270, 180, 0]
1162 "position":[-101.25, -72.60, -4.25],
1163 "rotation":[90, 180, 90, 270, 0, 0]
1168 "position":[-101.25, -109.20, 4.25],
1169 "rotation":[90, 180, 90, 90, 180, 0]
1174 "position":[-81.25, -138.50, -4.25],
1175 "rotation":[90, 180, 90, 270, 0, 0]
1180 "position":[-61.25, -175.50, 4.25],
1181 "rotation":[90, 180, 90, 90, 180, 0]
1186 "position":[-41.25, -204.50, -4.25],
1187 "rotation":[90, 180, 90, 270, 0, 0]
1195 "position":[0.00, -0.1074, -1299.75],
1196 "rotation":[90, 0, 90.794, 90, 0.794, 90],
1201 "position":[140.00, 0.00, 4.25],
1202 "rotation":[90, 0, 90, 270, 180, 0]
1207 "position":[121.25, 38.20, -4.25],
1208 "rotation":[90, 180, 90, 90, 180, 0]
1213 "position":[101.25, 76.05, 4.25],
1214 "rotation":[90, 0, 90, 270, 180, 0]
1219 "position":[101.25, 113.60, -4.25],
1220 "rotation":[90, 0, 90, 90, 0, 0]
1225 "position":[81.25, 143.00, 4.25],
1226 "rotation":[90, 0, 90, 270, 180, 0]
1231 "position":[61.25, 180.00, -4.25],
1232 "rotation":[90, 0, 90, 90, 0, 0]
1237 "position":[41.25, 208.60, 4.25],
1238 "rotation":[90, 0, 90, 270, 180, 0]
1243 "position":[41.25, -208.60, 4.25],
1244 "rotation":[90, 0, 90, 270, 180, 0]
1249 "position":[61.25, -180.00, -4.25],
1250 "rotation":[90, 0, 90, 90, 0, 0]
1255 "position":[81.25, -143.00, 4.25],
1256 "rotation":[90, 0, 90, 270, 180, 0]
1261 "position":[101.25, -113.60, -4.25],
1262 "rotation":[90, 0, 90, 90, 0, 0]
1267 "position":[101.25, -76.05, 4.25],
1268 "rotation":[90, 0, 90, 270, 180, 0]
1273 "position":[121.25, -38.20, -4.25],
1274 "rotation":[90, 180, 90, 270, 180, 0]
1282 "position":[0.00, -0.1074, -1315.25],
1283 "rotation":[90, 0, 90.794, 90, 0.794, 90],
1288 "position":[-41.25, 208.60, -4.25],
1289 "rotation":[90, 180, 90, 270, 0, 0]
1294 "position":[-61.25, 180.00, 4.25],
1295 "rotation":[90, 180, 90, 90, 180, 0]
1300 "position":[-81.25, 143.00, -4.25],
1301 "rotation":[90, 180, 90, 270, 0, 0]
1306 "position":[-101.25, 113.60, 4.25],
1307 "rotation":[90, 180, 90, 90, 180, 0]
1312 "position":[-101.25, 76.05, -4.25],
1313 "rotation":[90, 180, 90, 270, 0, 0]
1318 "position":[-121.25, 38.20, 4.25],
1319 "rotation":[90, 0, 90, 90, 0, 0]
1324 "position":[-140.00, 0.00, -4.25],
1325 "rotation":[90, 180, 90, 270, 0, 0]
1330 "position":[-121.25, -38.20, 4.25],
1331 "rotation":[90, 0, 90, 270, 180, 0]
1336 "position":[-101.25, -76.05, -4.25],
1337 "rotation":[90, 180, 90, 270, 0, 0]
1342 "position":[-101.25, -113.60, 4.25],
1343 "rotation":[90, 180, 90, 90, 180, 0]
1348 "position":[-81.25, -143.00, -4.25],
1349 "rotation":[90, 180, 90, 270, 0, 0]
1354 "position":[-61.25, -180.00, 4.25],
1355 "rotation":[90, 180, 90, 90, 180, 0]
1360 "position":[-41.25, -208.60, -4.25],
1361 "rotation":[90, 180, 90, 270, 0, 0]
1369 "position":[0.00, -0.1074, -1398.85],
1370 "rotation":[90, 0, 90.794, 90, 0.794, 90],
1375 "position":[140.00, 0.00, 4.25],
1376 "rotation":[90, 0, 90, 270, 180, 0]
1381 "position":[121.25, 38.20, -4.25],
1382 "rotation":[90, 180, 90, 90, 180, 0]
1387 "position":[121.25, 76.10, 4.25],
1388 "rotation":[90, 0, 90, 270, 180, 0]
1393 "position":[121.25, 113.70, -4.25],
1394 "rotation":[90, 0, 90, 90, 0, 0]
1399 "position":[101.25, 151.00, 4.25],
1400 "rotation":[90, 0, 90, 270, 180, 0]
1405 "position":[81.25, 188.05, -4.25],
1406 "rotation":[90, 0, 90, 90, 0, 0]
1411 "position":[61.25, 224.80, 4.25],
1412 "rotation":[90, 0, 90, 270, 180, 0]
1417 "position":[61.25, -224.80, 4.25],
1418 "rotation":[90, 0, 90, 270, 180, 0]
1423 "position":[81.25, -188.05, -4.25],
1424 "rotation":[90, 0, 90, 90, 0, 0]
1429 "position":[101.25, -151.00, 4.25],
1430 "rotation":[90, 0, 90, 270, 180, 0]
1435 "position":[121.25, -113.70, -4.25],
1436 "rotation":[90, 0, 90, 90, 0, 0]
1441 "position":[121.25, -76.10, 4.25],
1442 "rotation":[90, 0, 90, 270, 180, 0]
1447 "position":[121.25, -38.20, -4.25],
1448 "rotation":[90, 180, 90, 270, 0, 0]
1456 "position":[0.00, -0.1074, -1414.35],
1457 "rotation":[90, 0, 90.794, 90, 0.794, 90],
1462 "position":[-61.25, 224.80, -4.25],
1463 "rotation":[90, 180, 90, 270, 0, 0]
1468 "position":[-81.25, 188.05, 4.25],
1469 "rotation":[90, 180, 90, 90, 180, 0]
1474 "position":[-101.25, 151.00, -4.25],
1475 "rotation":[90, 180, 90, 270, 0, 0]
1480 "position":[-121.25, 113.70, 4.25],
1481 "rotation":[90, 180, 90, 90, 180, 0]
1486 "position":[-121.25, 76.10, -4.25],
1487 "rotation":[90, 180, 90, 270, 0, 0]
1492 "position":[-121.25, 38.20, 4.25],
1493 "rotation":[90, 0, 90, 90, 0, 0]
1498 "position":[-140.00, 0.00, -4.25],
1499 "rotation":[90, 180, 90, 270, 0, 0]
1504 "position":[-121.25, -38.20, 4.25],
1505 "rotation":[90, 0, 90, 270, 180, 0]
1510 "position":[-121.25, -76.10, -4.25],
1511 "rotation":[90, 180, 90, 270, 0, 0]
1516 "position":[-121.25, -113.70, 4.25],
1517 "rotation":[90, 180, 90, 90, 180, 0]
1522 "position":[-101.25, -151, -4.25],
1523 "rotation":[90, 180, 90, 270, 0, 0]
1528 "position":[-81.25, -188.05, 4.25],
1529 "rotation":[90, 180, 90, 90, 180, 0]
1534 "position":[-61.25, -224.80, -4.25],
1535 "rotation":[90, 180, 90, 270, 0, 0]
1543 "position":[0.00, -0.1074, -1429.85],
1544 "rotation":[90, 0, 90.794, 90, 0.794, 90],
1549 "position":[140.00, 0.00, 4.25],
1550 "rotation":[90, 0, 90, 270, 180, 0]
1555 "position":[121.25, 38.20, -4.25],
1556 "rotation":[90, 180, 90, 90, 180, 0]
1561 "position":[121.25, 76.10, 4.25],
1562 "rotation":[90, 0, 90, 270, 180, 0]
1567 "position":[121.25, 113.70, -4.25],
1568 "rotation":[90, 0, 90, 90, 0, 0]
1573 "position":[101.25, 151.00, 4.25],
1574 "rotation":[90, 0, 90, 270, 180, 0]
1579 "position":[81.25, 188.05, -4.25],
1580 "rotation":[90, 0, 90, 90, 0, 0]
1585 "position":[61.25, 224.80, 4.25],
1586 "rotation":[90, 0, 90, 270, 180, 0]
1591 "position":[61.25, -224.80, 4.25],
1592 "rotation":[90, 0, 90, 270, 180, 0]
1597 "position":[81.25, -188.05, -4.25],
1598 "rotation":[90, 0, 90, 90, 0, 0]
1603 "position":[101.25, -151.00, 4.25],
1604 "rotation":[90, 0, 90, 270, 180, 0]
1609 "position":[121.25, -113.70, -4.25],
1610 "rotation":[90, 0, 90, 90, 0, 0]
1615 "position":[121.25, -76.10, 4.25],
1616 "rotation":[90, 0, 90, 270, 180, 0]
1621 "position":[121.25, -38.20, -4.25],
1622 "rotation":[90, 180, 90, 270, 0, 0]
1630 "position":[0.00, -0.1074, -1445.35],
1631 "rotation":[90, 0, 90.794, 90, 0.794, 90],
1636 "position":[-61.25, 224.80, -4.25],
1637 "rotation":[90, 180, 90, 270, 0, 0]
1642 "position":[-81.25, 188.05, 4.25],
1643 "rotation":[90, 180, 90, 90, 180, 0]
1648 "position":[-101.25, 151.00, -4.25],
1649 "rotation":[90, 180, 90, 270, 0, 0]
1654 "position":[-121.25, 113.70, 4.25],
1655 "rotation":[90, 180, 90, 90, 180, 0]
1660 "position":[-121.25, 76.10, -4.25],
1661 "rotation":[90, 180, 90, 270, 0, 0]
1666 "position":[-121.25, 38.20, 4.25],
1667 "rotation":[90, 0, 90, 90, 0, 0]
1672 "position":[-140.00, 0.00, -4.25],
1673 "rotation":[90, 180, 90, 270, 0, 0]
1678 "position":[-121.25, -38.20, 4.25],
1679 "rotation":[90, 0, 90, 270, 180, 0]
1684 "position":[-121.25, -76.10, -4.25],
1685 "rotation":[90, 180, 90, 270, 0, 0]
1690 "position":[-121.25, -113.70, 4.25],
1691 "rotation":[90, 180, 90, 90, 180, 0]
1696 "position":[-101.25, -151.00, -4.25],
1697 "rotation":[90, 180, 90, 270, 0, 0]
1702 "position":[-81.25, -188.05, 4.25],
1703 "rotation":[90, 180, 90, 90, 180, 0]
1708 "position":[-61.25, -224.80, -4.25],
1709 "rotation":[90, 180, 90, 270, 0, 0]
o2::monitoring::tags::Value Value
Implementation of the MID materials definitions.
Implementation of the slat-stations geometry.
GLuint const GLchar * name
GLuint GLsizei GLsizei * length
GLdouble GLdouble GLdouble z
RuntimeErrorRef runtime_error(const char *)
const float kHoriSpacerHalfHeight
TGeoVolume * getDualSampa()
const float kRoundedPCBLength
const float kSt45RoundedSlatYPos
const float kShortPCBLength
const float kGlueSupportHalfThickness
void createStation345Geometry(TGeoVolume &topVolume)
const float kGasLength
Constants.
const float kDualSampaHalfLength
const float kSt5SupportHalfHeight
const float kSt4SupportHalfHeight
const float kBorderHalfHeight
const double kGasHalfThickness
const float kVertSpacerHalfLength
const double kPCBHalfThickness
TGeoMedium * assertMedium(int imed)
const float kCarbonHalfThickness
const float kSt3SupportHalfHeight
const float kCh6SupportHalfLength
const float kLVCableHalfHeight
Cables (copper)
const float kSt45SupportHalfLength
TGeoCompositeShape * getRoundedShape(const char *name, float halfThickness, float xPos, float yPos, float radius)
const float kGasHalfHeight
const double kInsuHalfThickness
const float kLVCableHalfThickness
const float kNomexBulkHalfThickness
const float kDualSampaYPos
const float kBorderHalfThickness
const string jsonSlatDescription
Json string describing all the necessary parameters to place the slats in the half-chambers.
const map< string, vector< string > > kSlatTypes
vector< TGeoVolume * > getStation345SensitiveVolumes()
const float kRoundedSpacerHalfLength
const float kSt3RoundedSlatYPos
const float kDualSampaHalfHeight
const float kCh5SupportHalfLength
const map< string, array< int, 4 > > kPcbTypes
const float kNomexSupportHalfThickness
void buildHalfChambers(TGeoVolume &topVolume)
bool isRounded(string name)
const float kCarbonSupportHalfThickness
Support panels.
const float kSlatPanelHalfHeight
const float kPCBHalfHeight
const double kCathodeHalfThickness
const float kNomexHalfThickness
const float kGlueHalfThickness
bool isShort(string name)
void createSupportPanels()
const float kSpacerHalfThickness
void createCommonVolumes()
const float kDualSampaHalfThickness
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
Defining DataPointCompositeObject explicitly as copiable.