338 mHitsPerSectorCollection[
i]->clear();
349 ConstructTPCGeometry();
352void Detector::CreateMaterials()
362 const auto& gasParam = ParameterGas::Instance();
376 const Double_t pressure = gasParam.Pressure;
377 const Double_t temperature = gasParam.Temperature + 273.15;
380 const Double_t
t1 = 293.15;
381 const Double_t
p1 = 1013.25;
384 Double_t ptCorr = 1.;
385 if (TMath::Abs(temperature - 293.15) > 10. || TMath::Abs(pressure - 1000.) > 200.) {
388 ptCorr = (pressure *
t1) / (
p1 * temperature);
390 LOG(info) <<
"Setting gas density correction to: " << ptCorr;
440 TString names[6] = {
"Ne",
"Ar",
"CO2",
"N",
"CF4",
"CH4"};
445 Float_t comp[6] = {90. / 105., 0., 10. / 105., 5. / 105., 0., 0.};
476 wmol[3] = 2. * 14.0067;
481 for (Int_t
i = 0;
i < 6;
i++) {
482 wtot += *(comp +
i) * wmol[
i];
484 wmat[0] = comp[0] * amat[0] / wtot;
485 wmat[1] = comp[1] * amat[1] / wtot;
486 wmat[2] = (comp[2] * amat[2] + comp[4] * amat[2] + comp[5] * amat[2]) / wtot;
487 wmat[3] = comp[2] * amat[3] * 2. / wtot;
488 wmat[4] = comp[3] * amat[4] * 2. / wtot;
489 wmat[5] = comp[4] * amat[5] * 4. / wtot;
490 wmat[6] = comp[5] * amat[6] * 4. / wtot;
494 Float_t dens[6] = {0.839e-3, 1.661e-3, 1.842e-3, 1.165e-3, 3.466e-3, 0.668e-3};
497 for (Int_t
i = 0;
i < 6;
i++) {
498 density += comp[
i] * dens[
i];
504 for (Int_t
i = 0;
i < 6;
i++) {
513 TString gname1, gname2, gname3;
514 gname1 = gname +
"-1";
515 gname2 = gname +
"-2";
516 gname3 = gname +
"-3";
520 Float_t amat1[6], zmat1[6], wmat1[6];
522 for (Int_t
i = 0;
i < 7;
i++) {
524 zmat1[cnt] = zmat[
i];
525 amat1[cnt] = amat[
i];
526 wmat1[cnt] = wmat[
i];
929 o2::base::Detector::Medium(kAir,
"Air", 11, 0, iSXFLD, sXMGMX, 10., 999., .1, .01, .1);
930 o2::base::Detector::Medium(kDriftGas1,
"DriftGas1", 12, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
931 o2::base::Detector::Medium(kDriftGas2,
"DriftGas2", 13, 1, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
932 o2::base::Detector::Medium(kCO2,
"CO2", 10, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
933 o2::base::Detector::Medium(kDriftGas3,
"DriftGas3", 40, 1, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
938 o2::base::Detector::Medium(kAl,
"Al", 23, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
939 o2::base::Detector::Medium(kKevlar,
"Kevlar", 14, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
940 o2::base::Detector::Medium(kNomex,
"Nomex", 15, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
941 o2::base::Detector::Medium(kMakrolon,
"Makrolon", 16, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
942 o2::base::Detector::Medium(kMylar,
"Mylar", 18, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
943 o2::base::Detector::Medium(kTedlar,
"Tedlar", 17, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
945 o2::base::Detector::Medium(kPrepreg1,
"Prepreg1", 19, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
946 o2::base::Detector::Medium(kPrepreg2,
"Prepreg2", 20, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
947 o2::base::Detector::Medium(kPrepreg3,
"Prepreg3", 21, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
948 o2::base::Detector::Medium(kEpoxy,
"Epoxy", 26, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
950 o2::base::Detector::Medium(kCu,
"Cu", 25, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
951 o2::base::Detector::Medium(kSi,
"Si", 24, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
952 o2::base::Detector::Medium(kG10,
"G10", 22, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
953 o2::base::Detector::Medium(kPlexiglas,
"Plexiglas", 27, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
954 o2::base::Detector::Medium(kSteel,
"Steel", 29, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
955 o2::base::Detector::Medium(kPeek,
"Peek", 30, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
956 o2::base::Detector::Medium(kAlumina,
"Alumina", 31, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
957 o2::base::Detector::Medium(kWater,
"Water", 32, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
958 o2::base::Detector::Medium(kBrass,
"Brass", 33, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
959 o2::base::Detector::Medium(kEpoxyfm,
"Epoxyfm", 34, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
960 o2::base::Detector::Medium(kEpoxy1,
"Epoxy1", 35, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
961 o2::base::Detector::Medium(kAlumina1,
"Alumina1", 36, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
964void Detector::ConstructTPCGeometry()
998 auto* tpc =
new TGeoPcon(0., 360., 30);
1000 tpc->DefineSection(0, -289.6, 77., 278.);
1001 tpc->DefineSection(1, -262.1, 77., 278.);
1003 tpc->DefineSection(2, -262.1, 83.1, 278.);
1004 tpc->DefineSection(3, -260., 83.1, 278.);
1006 tpc->DefineSection(4, -260., 70., 278.);
1007 tpc->DefineSection(5, -259.6, 70., 278.);
1009 tpc->DefineSection(6, -259.6, 68.1, 278.);
1010 tpc->DefineSection(7, -253.6, 68.1, 278.);
1012 tpc->DefineSection(8, -253.6, 67.88, 278.);
1013 tpc->DefineSection(9, -74.0, 60.68, 278.);
1015 tpc->DefineSection(10, -74.0, 60.1, 278.);
1016 tpc->DefineSection(11, -73.3, 60.1, 278.);
1018 tpc->DefineSection(12, -73.3, 56.9, 278.);
1019 tpc->DefineSection(13, -68.5, 56.9, 278.);
1021 tpc->DefineSection(14, -68.5, 60., 278.);
1022 tpc->DefineSection(15, -64.7, 60., 278.);
1024 tpc->DefineSection(16, -64.7, 56.9, 278.);
1025 tpc->DefineSection(17, 73.3, 56.9, 278.);
1027 tpc->DefineSection(18, 73.3, 60.1, 278.);
1028 tpc->DefineSection(19, 74.0, 60.1, 278.);
1030 tpc->DefineSection(20, 74.0, 60.68, 278.);
1031 tpc->DefineSection(21, 253.6, 65.38, 278.);
1033 tpc->DefineSection(22, 253.6, 65.6, 278.);
1034 tpc->DefineSection(23, 259.6, 65.6, 278.);
1036 tpc->DefineSection(24, 259.6, 70.0, 278.);
1037 tpc->DefineSection(25, 260., 70.0, 278.);
1039 tpc->DefineSection(26, 260., 83.1, 278.);
1040 tpc->DefineSection(27, 262.1, 83.1, 278.);
1042 tpc->DefineSection(28, 262.1, 77., 278);
1043 tpc->DefineSection(29, 289.6, 77., 278.);
1045 TGeoMedium*
m1 = gGeoManager->GetMedium(
"TPC_Air");
1046 auto*
v1 =
new TGeoVolume(
"TPC_M", tpc, m1);
1051 auto* dvol =
new TGeoPcon(0., 360., 6);
1052 dvol->DefineSection(0, -260., 74.5, 264.4);
1053 dvol->DefineSection(1, -253.6, 74.5, 264.4);
1055 dvol->DefineSection(2, -253.6, 76.6774, 258.);
1056 dvol->DefineSection(3, 253.6, 76.6774, 258.);
1058 dvol->DefineSection(4, 253.6, 74.5, 264.4);
1059 dvol->DefineSection(5, 260., 74.5, 264.4);
1061 TGeoMedium*
m5 = gGeoManager->GetMedium(
"TPC_DriftGas2");
1062 auto* v9 =
new TGeoVolume(
"TPC_Drift", dvol, m5);
1068 auto* tpco =
new TGeoPcon(0., 360., 6);
1070 tpco->DefineSection(0, -256.6, 264.8, 278.);
1071 tpco->DefineSection(1, -253.6, 264.8, 278.);
1073 tpco->DefineSection(2, -253.6, 258., 278.);
1074 tpco->DefineSection(3, 250.6, 258., 278.);
1076 tpco->DefineSection(4, 250.6, 258., 275.5);
1077 tpco->DefineSection(5, 253.6, 258., 275.5);
1079 TGeoMedium*
m2 = gGeoManager->GetMedium(
"TPC_CO2");
1080 auto*
v2 =
new TGeoVolume(
"TPC_OI", tpco, m2);
1082 TGeoRotation* segrot;
1086 auto* tocv =
new TGeoPcon(0., 360., 6);
1088 tocv->DefineSection(0, -256.6, 264.8, 278.);
1089 tocv->DefineSection(1, -253.6, 264.8, 278.);
1091 tocv->DefineSection(2, -253.6, 274.8124, 278.);
1092 tocv->DefineSection(3, 247.6, 274.8124, 278.);
1094 tocv->DefineSection(4, 247.6, 270.4, 278.);
1095 tocv->DefineSection(5, 250.6, 270.4, 278.);
1097 TGeoMedium*
m3 = gGeoManager->GetMedium(
"TPC_Al");
1098 auto*
v3 =
new TGeoVolume(
"TPC_OCV", tocv, m3);
1100 auto* to1 =
new TGeoTubeSeg(274.8174, 277.995, 252.1, 0., 59.9);
1101 auto* to2 =
new TGeoTubeSeg(274.8274, 277.985, 252.1, 0., 59.9);
1102 auto* to3 =
new TGeoTubeSeg(274.8312, 277.9812, 252.1, 0., 59.9);
1103 auto* to4 =
new TGeoTubeSeg(274.9062, 277.9062, 252.1, 0., 59.9);
1104 auto* tog5 =
new TGeoTubeSeg(274.8174, 277.995, 252.1, 59.9, 60.);
1106 TGeoMedium* sm1 = gGeoManager->GetMedium(
"TPC_Epoxy");
1107 TGeoMedium* sm2 = gGeoManager->GetMedium(
"TPC_Tedlar");
1108 TGeoMedium* sm3 = gGeoManager->GetMedium(
"TPC_Prepreg2");
1109 TGeoMedium* sm4 = gGeoManager->GetMedium(
"TPC_Nomex");
1111 TGeoMedium* smep = gGeoManager->GetMedium(
"TPC_Epoxy1");
1113 auto* tov1 =
new TGeoVolume(
"TPC_OCV1", to1, sm1);
1114 auto* tov2 =
new TGeoVolume(
"TPC_OCV2", to2, sm2);
1115 auto* tov3 =
new TGeoVolume(
"TPC_OCV3", to3, sm3);
1116 auto* tov4 =
new TGeoVolume(
"TPC_OCV4", to4, sm4);
1117 auto* togv5 =
new TGeoVolume(
"TPC_OCVG5", tog5, sm1);
1119 TGeoMedium* mhs = gGeoManager->GetMedium(
"TPC_Steel");
1120 TGeoMedium* m12 = gGeoManager->GetMedium(
"TPC_Water");
1126 auto* tofc =
new TGeoPcon(0., 360., 6);
1128 tofc->DefineSection(0, -253.6, 258., 269.6);
1129 tofc->DefineSection(1, -250.6, 258., 269.6);
1131 tofc->DefineSection(2, -250.6, 258., 260.0676);
1132 tofc->DefineSection(3, 250.6, 258., 260.0676);
1134 tofc->DefineSection(4, 250.6, 258., 275.5);
1135 tofc->DefineSection(5, 253.6, 258., 275.5);
1137 auto* v4 =
new TGeoVolume(
"TPC_TOFC", tofc, m3);
1139 auto* tf1 =
new TGeoTubeSeg(258.0, 260.0676, 252.1, 0., 59.9);
1140 auto* tf2 =
new TGeoTubeSeg(258.0038, 260.0638, 252.1, 0., 59.9);
1141 auto* tf3 =
new TGeoTubeSeg(258.0338, 260.0338, 252.1, 0., 59.9);
1142 auto* tfg4 =
new TGeoTubeSeg(258.0, 260.0676, 252.1, 59.9, 60.);
1144 TGeoMedium* sm5 = gGeoManager->GetMedium(
"TPC_Prepreg3");
1146 auto* tf1v =
new TGeoVolume(
"TPC_OFC1", tf1, sm2);
1147 auto* tf2v =
new TGeoVolume(
"TPC_OFC2", tf2, sm5);
1148 auto* tf3v =
new TGeoVolume(
"TPC_OFC3", tf3, sm4);
1149 auto* tfg4v =
new TGeoVolume(
"TPC_OFCG4", tfg4, smep);
1153 tov1->AddNode(tov2, 1);
1154 tov2->AddNode(tov3, 1);
1155 tov3->AddNode(tov4, 1);
1157 tf1v->AddNode(tf2v, 1);
1158 tf2v->AddNode(tf3v, 1);
1160 auto* t200 =
new TGeoVolumeAssembly(
"TPC_OCVSEG");
1161 auto* t300 =
new TGeoVolumeAssembly(
"TPC_OFCSEG");
1166 t200->AddNode(tov1, 1);
1167 t200->AddNode(togv5, 1);
1168 t300->AddNode(tf1v, 1);
1169 t300->AddNode(tfg4v, 1);
1171 segrot =
new TGeoRotation();
1172 segrot->RotateZ(60.);
1173 t200->AddNode(tov1, 2, segrot);
1174 t200->AddNode(togv5, 2, segrot);
1175 t300->AddNode(tf1v, 2, segrot);
1176 t300->AddNode(tfg4v, 2, segrot);
1178 segrot =
new TGeoRotation();
1179 segrot->RotateZ(120.);
1180 t200->AddNode(tov1, 3, segrot);
1181 t200->AddNode(togv5, 3, segrot);
1182 t300->AddNode(tf1v, 3, segrot);
1183 t300->AddNode(tfg4v, 3, segrot);
1185 segrot =
new TGeoRotation();
1186 segrot->RotateZ(180.);
1187 t200->AddNode(tov1, 4, segrot);
1188 t200->AddNode(togv5, 4, segrot);
1189 t300->AddNode(tf1v, 4, segrot);
1190 t300->AddNode(tfg4v, 4, segrot);
1192 segrot =
new TGeoRotation();
1193 segrot->RotateZ(240.);
1194 t200->AddNode(tov1, 5, segrot);
1195 t200->AddNode(togv5, 5, segrot);
1196 t300->AddNode(tf1v, 5, segrot);
1197 t300->AddNode(tfg4v, 5, segrot);
1199 segrot =
new TGeoRotation();
1200 segrot->RotateZ(300.);
1201 t200->AddNode(tov1, 6, segrot);
1202 t200->AddNode(togv5, 6, segrot);
1203 t300->AddNode(tf1v, 6, segrot);
1204 t300->AddNode(tfg4v, 6, segrot);
1206 v3->AddNode(t200, 1,
new TGeoTranslation(0., 0., -1.5));
1207 v4->AddNode(t300, 1);
1216 auto* ogri =
new TGeoTube(257.985, 258., 0.6);
1217 auto* ogro =
new TGeoTube(260.0676, 260.0826, 0.6);
1219 auto* ogriv =
new TGeoVolume(
"TPC_OGRI", ogri, m3);
1220 auto* ogrov =
new TGeoVolume(
"TPC_OGRO", ogro, m3);
1222 for (Int_t
i = 0;
i < 24;
i++) {
1223 v9->AddNode(ogriv, (
i + 1),
new TGeoTranslation(0., 0., (
i + 1) * 10));
1224 v9->AddNode(ogriv, (
i + 25),
new TGeoTranslation(0., 0., -(
i + 1) * 10));
1225 v2->AddNode(ogrov, (
i + 1),
new TGeoTranslation(0., 0., (
i + 1) * 10));
1226 v2->AddNode(ogrov, (
i + 25),
new TGeoTranslation(0., 0., -(
i + 1) * 10));
1233 auto* tpci =
new TGeoPcon(0., 360., 4);
1235 tpci->DefineSection(0, -253.6, 68.4, 76.6774);
1236 tpci->DefineSection(1, -74.0, 61.2, 76.6774);
1238 tpci->DefineSection(2, 74.0, 61.2, 76.6774);
1240 tpci->DefineSection(3, 253.6, 65.9, 76.6774);
1242 auto* v5 =
new TGeoVolume(
"TPC_INI", tpci, m2);
1246 auto* tif1 =
new TGeoTube(69.9, 76.6774, 1.5);
1247 auto* v6 =
new TGeoVolume(
"TPC_IFC1", tif1, m3);
1252 auto* tcms =
new TGeoPcon(0., 360., 10);
1254 tcms->DefineSection(0, -259.1, 68.1, 74.2);
1255 tcms->DefineSection(1, -253.6, 68.1, 74.2);
1257 tcms->DefineSection(2, -253.6, 68.1, 68.4);
1258 tcms->DefineSection(3, -74.0, 60.9, 61.2);
1260 tcms->DefineSection(4, -74.0, 60.1, 61.2);
1261 tcms->DefineSection(5, -73.3, 60.1, 61.2);
1263 tcms->DefineSection(6, -73.3, 56.9, 61.2);
1264 tcms->DefineSection(7, -73.0, 56.9, 61.2);
1266 tcms->DefineSection(8, -73.0, 56.9, 58.8);
1267 tcms->DefineSection(9, -71.3, 56.9, 58.8);
1269 auto* v7 =
new TGeoVolume(
"TPC_ICVM", tcms, m3);
1274 auto* thsm =
new TGeoCone(89.8, 67.88, 68.1, 60.68, 60.9);
1275 auto* thsmw =
new TGeoCone(89.8, 67.94, 68.04, 60.74, 60.84);
1276 auto* hvsm =
new TGeoVolume(
"TPC_HSM", thsm, mhs);
1277 auto* hvsmw =
new TGeoVolume(
"TPC_HSMW", thsmw, m12);
1279 hvsm->AddNode(hvsmw, 1);
1283 auto* tcss =
new TGeoPcon(0., 360., 10);
1285 tcss->DefineSection(0, 71.3, 56.9, 58.8);
1286 tcss->DefineSection(1, 73.0, 56.9, 58.8);
1288 tcss->DefineSection(2, 73.0, 56.9, 61.2);
1289 tcss->DefineSection(3, 73.3, 56.9, 61.2);
1291 tcss->DefineSection(4, 73.3, 60.1, 61.2);
1292 tcss->DefineSection(5, 74.0, 60.1, 61.2);
1294 tcss->DefineSection(6, 74.0, 60.9, 61.2);
1295 tcss->DefineSection(7, 253.6, 65.6, 65.9);
1297 tcss->DefineSection(8, 253.6, 65.6, 74.2);
1298 tcss->DefineSection(9, 258.1, 65.6, 74.2);
1300 auto* v8 =
new TGeoVolume(
"TPC_ICVS", tcss, m3);
1304 auto* thss =
new TGeoCone(89.8, 60.68, 60.9, 65.38, 65.6);
1305 auto* thssw =
new TGeoCone(89.8, 60.74, 60.84, 65.44, 65.54);
1306 auto* hvss =
new TGeoVolume(
"TPC_HSS", thss, mhs);
1307 auto* hvssw =
new TGeoVolume(
"TPC_HSSW", thssw, m12);
1309 hvss->AddNode(hvssw, 1);
1315 auto*
t1 =
new TGeoTube(76.6774, 78.845, 0.75);
1316 auto* tv1 =
new TGeoVolume(
"TPC_IFC2",
t1, m3);
1321 auto* t2 =
new TGeoTubeSeg(76.6774, 78.845, 74.175, 350., 109.4);
1322 auto* t3 =
new TGeoTubeSeg(76.6812, 78.8412, 74.175, 350., 109.4);
1323 auto* t4 =
new TGeoTubeSeg(76.7312, 78.7912, 74.175, 350., 109.4);
1324 auto* t5 =
new TGeoTubeSeg(76.7612, 78.7612, 74.175, 350., 109.4);
1325 auto* tepox1 =
new TGeoTubeSeg(76.6774, 78.845, 74.175, 109.4, 110.);
1326 auto* tpr1 =
new TGeoTubeSeg(78.845, 78.885, 74.175, 109., 111.);
1329 auto* tv2 =
new TGeoVolume(
"TPC_IFC3", t2, sm2);
1330 auto* tv3 =
new TGeoVolume(
"TPC_IFC4", t3, sm3);
1331 auto* tv4 =
new TGeoVolume(
"TPC_IFC5", t4, sm5);
1332 auto* tv5 =
new TGeoVolume(
"TPC_IFC6", t5, sm4);
1333 auto* tvep1 =
new TGeoVolume(
"TPC_IFEPOX1", tepox1, smep);
1334 auto* tvpr1 =
new TGeoVolume(
"TPC_PRSTR1", tpr1, sm2);
1340 auto* t6 =
new TGeoTubeSeg(76.6774, 78.795, 5., 350., 109.4);
1341 auto* t7 =
new TGeoTubeSeg(76.6812, 78.7912, 5., 350., 109.4);
1342 auto* t8 =
new TGeoTubeSeg(76.7062, 78.7662, 5., 350., 109.4);
1343 auto* t9 =
new TGeoTubeSeg(76.7362, 78.7362, 5., 350., 109.4);
1344 auto* tepox2 =
new TGeoTubeSeg(76.6774, 78.795, 5., 109.4, 110.);
1345 auto* tpr2 =
new TGeoTubeSeg(78.795, 78.835, 5., 109., 111.);
1347 auto* tv6 =
new TGeoVolume(
"TPC_IFC7", t6, sm2);
1348 auto* tv7 =
new TGeoVolume(
"TPC_IFC8", t7, sm3);
1349 auto* tv8 =
new TGeoVolume(
"TPC_IFC9", t8, sm5);
1350 auto* tv9 =
new TGeoVolume(
"TPC_IFC10", t9, sm4);
1351 auto* tvep2 =
new TGeoVolume(
"TPC_IFEPOX2", tepox2, smep);
1352 auto* tvpr2 =
new TGeoVolume(
"TPC_PRSTR2", tpr2, sm2);
1357 auto* t10 =
new TGeoTubeSeg(76.6774, 78.785, 93.75, 350., 109.4);
1358 auto* t11 =
new TGeoTubeSeg(76.6812, 78.7812, 93.75, 350., 109.4);
1359 auto* t12 =
new TGeoTubeSeg(76.7312, 78.7312, 93.75, 350., 109.4);
1360 auto* tepox3 =
new TGeoTubeSeg(76.6774, 78.785, 93.75, 109.4, 110.);
1361 auto* tpr3 =
new TGeoTubeSeg(78.785, 78.825, 93.75, 109., 111.);
1363 auto* tv10 =
new TGeoVolume(
"TPC_IFC11", t10, sm2);
1364 auto* tv11 =
new TGeoVolume(
"TPC_IFC12", t11, sm5);
1365 auto* tv12 =
new TGeoVolume(
"TPC_IFC13", t12, sm4);
1366 auto* tvep3 =
new TGeoVolume(
"TPC_IFEPOX3", tepox3, smep);
1367 auto* tvpr3 =
new TGeoVolume(
"TPC_PRSTR3", tpr3, sm2);
1371 tv2->AddNode(tv3, 1);
1372 tv3->AddNode(tv4, 1);
1373 tv4->AddNode(tv5, 1);
1377 tv6->AddNode(tv7, 1);
1378 tv7->AddNode(tv8, 1);
1379 tv8->AddNode(tv9, 1);
1383 tv10->AddNode(tv11, 1);
1384 tv11->AddNode(tv12, 1);
1386 auto* tv100 =
new TGeoVolumeAssembly(
"TPC_IFC");
1392 tv100->AddNode(tv10, 1);
1393 tv100->AddNode(tvep3, 1);
1394 tv100->AddNode(tvpr3, 1);
1396 tv100->AddNode(tv6, 1,
new TGeoTranslation(0., 0., -98.75));
1397 tv100->AddNode(tv6, 2,
new TGeoTranslation(0., 0., 98.75));
1398 tv100->AddNode(tvep2, 1,
new TGeoTranslation(0., 0., -98.75));
1399 tv100->AddNode(tvep2, 2,
new TGeoTranslation(0., 0., 98.75));
1400 tv100->AddNode(tvpr2, 1,
new TGeoTranslation(0., 0., -98.75));
1401 tv100->AddNode(tvpr2, 2,
new TGeoTranslation(0., 0., 98.75));
1403 tv100->AddNode(tv2, 1,
new TGeoTranslation(0., 0., -177.925));
1404 tv100->AddNode(tv2, 2,
new TGeoTranslation(0., 0., 177.925));
1405 tv100->AddNode(tvep1, 1,
new TGeoTranslation(0., 0., -177.925));
1406 tv100->AddNode(tvep1, 2,
new TGeoTranslation(0., 0., 177.925));
1407 tv100->AddNode(tvpr1, 1,
new TGeoTranslation(0., 0., -177.925));
1408 tv100->AddNode(tvpr1, 2,
new TGeoTranslation(0., 0., 177.925));
1412 segrot =
new TGeoRotation();
1413 segrot->RotateZ(120.);
1416 tv100->AddNode(tv10, 2, segrot);
1417 tv100->AddNode(tvep3, 2, segrot);
1418 tv100->AddNode(tvpr3, 2, segrot);
1420 tv100->AddNode(tv6, 3,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1421 tv100->AddNode(tv6, 4,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1422 tv100->AddNode(tvep2, 3,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1423 tv100->AddNode(tvep2, 4,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1424 tv100->AddNode(tvpr2, 3,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1425 tv100->AddNode(tvpr2, 4,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1427 tv100->AddNode(tv2, 3,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1428 tv100->AddNode(tv2, 4,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1429 tv100->AddNode(tvep1, 3,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1430 tv100->AddNode(tvep1, 4,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1431 tv100->AddNode(tvpr1, 3,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1432 tv100->AddNode(tvpr1, 4,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1436 segrot =
new TGeoRotation();
1437 segrot->RotateZ(240.);
1440 tv100->AddNode(tv10, 3, segrot);
1441 tv100->AddNode(tvep3, 3, segrot);
1442 tv100->AddNode(tvpr3, 3, segrot);
1444 tv100->AddNode(tv6, 5,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1445 tv100->AddNode(tv6, 6,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1446 tv100->AddNode(tvep2, 5,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1447 tv100->AddNode(tvep2, 6,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1448 tv100->AddNode(tvpr2, 5,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1449 tv100->AddNode(tvpr2, 6,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1451 tv100->AddNode(tv2, 5,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1452 tv100->AddNode(tv2, 6,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1453 tv100->AddNode(tvep1, 5,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1454 tv100->AddNode(tvep1, 6,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1455 tv100->AddNode(tvpr1, 5,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1456 tv100->AddNode(tvpr1, 6,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1458 tv100->AddNode(tv1, 1,
new TGeoTranslation(0., 0., -252.85));
1459 tv100->AddNode(tv1, 2,
new TGeoTranslation(0., 0., 252.85));
1461 v5->AddNode(v6, 1,
new TGeoTranslation(0., 0., -252.1));
1462 v5->AddNode(v6, 2,
new TGeoTranslation(0., 0., 252.1));
1466 v1->AddNode(hvsm, 1,
new TGeoTranslation(0., 0., -163.8));
1467 v1->AddNode(hvss, 1,
new TGeoTranslation(0., 0., 163.8));
1468 v9->AddNode(tv100, 1);
1473 auto* igro =
new TGeoTube(76.6624, 76.6774, 0.6);
1474 auto* igrio =
new TGeoTube(78.845, 78.86, 0.6);
1475 auto* igrim =
new TGeoTube(78.795, 78.81, 0.6);
1476 auto* igric =
new TGeoTube(78.785, 78.8, 0.6);
1480 auto* igrov =
new TGeoVolume(
"TPC_IGR1", igro, m3);
1481 auto* igriov =
new TGeoVolume(
"TPC_IGR2", igrio, m3);
1482 auto* igrimv =
new TGeoVolume(
"TPC_IGR3", igrim, m3);
1483 auto* igricv =
new TGeoVolume(
"TPC_IGR4", igric, m3);
1487 for (Int_t
i = 0;
i < 24;
i++) {
1488 v5->AddNode(igrov, (
i + 1),
new TGeoTranslation(0., 0., (
i + 1) * 10));
1489 v5->AddNode(igrov, (
i + 25),
new TGeoTranslation(0., 0., -(
i + 1) * 10));
1494 for (Int_t
i = 0;
i < 9;
i++) {
1495 v9->AddNode(igricv, (
i + 1),
new TGeoTranslation(0., 0., (
i + 1) * 10));
1496 v9->AddNode(igricv, (
i + 10),
new TGeoTranslation(0., 0., -(
i + 1) * 10));
1498 v9->AddNode(igrimv, 1,
new TGeoTranslation(0., 0., 100.));
1499 v9->AddNode(igrimv, 2,
new TGeoTranslation(0., 0., -100.));
1501 for (Int_t
i = 0;
i < 13;
i++) {
1502 v9->AddNode(igriov,
i + 1,
new TGeoTranslation(0., 0., 100 + (
i + 1) * 10));
1503 v9->AddNode(igriov,
i + 14,
new TGeoTranslation(0., 0., -(100 + (
i + 1) * 10)));
1510 auto* cfl =
new TGeoPcon(0., 360., 6);
1511 cfl->DefineSection(0, -71.1, 59.7, 61.2);
1512 cfl->DefineSection(1, -68.6, 59.7, 61.2);
1514 cfl->DefineSection(2, -68.6, 60.6124, 61.2);
1515 cfl->DefineSection(3, 68.6, 60.6124, 61.2);
1517 cfl->DefineSection(4, 68.6, 59.7, 61.2);
1518 cfl->DefineSection(5, 71.1, 59.7, 61.2);
1520 auto* cflv =
new TGeoVolume(
"TPC_CDR", cfl, m3);
1522 auto* cd1 =
new TGeoTubeSeg(60.6224, 61.19, 69.8, 0.05, 119.95);
1523 auto* cd2 =
new TGeoTubeSeg(60.6262, 61.1862, 69.8, 0.05, 119.95);
1524 auto* cd3 =
new TGeoTubeSeg(60.6462, 61.1662, 69.8, 0.05, 119.95);
1525 auto* cd4 =
new TGeoTubeSeg(60.6562, 61.1562, 69.8, 0.05, 119.95);
1526 auto* tepox4 =
new TGeoTubeSeg(60.6224, 61.19, 69.8, 359.95, 0.05);
1528 TGeoMedium* sm6 = gGeoManager->GetMedium(
"TPC_Prepreg1");
1529 TGeoMedium* sm8 = gGeoManager->GetMedium(
"TPC_Epoxyfm");
1530 auto* cd1v =
new TGeoVolume(
"TPC_CDR1", cd1, sm2);
1531 auto* cd2v =
new TGeoVolume(
"TPC_CDR2", cd2, sm6);
1532 auto* cd3v =
new TGeoVolume(
"TPC_CDR3", cd3, sm8);
1533 auto* cd4v =
new TGeoVolume(
"TPC_CDR4", cd4, sm4);
1534 auto* tvep4 =
new TGeoVolume(
"TPC_IFEPOX4", tepox4, smep);
1538 auto* cdjl =
new TGeoTubeSeg(60.6562, 60.6762, 69.8, 0., 1.0);
1539 auto* cdju =
new TGeoTubeSeg(61.1362, 61.1562, 69.8, 0., 1.0);
1541 auto* cdjlv =
new TGeoVolume(
"TPC_CDJL", cdjl, sm6);
1542 auto* cdjuv =
new TGeoVolume(
"TPC_CDJU", cdju, sm6);
1546 auto* cs =
new TGeoTube(56.9, 61.2, 0.1);
1547 TGeoMedium* sm7 = gGeoManager->GetMedium(
"TPC_Mylar");
1548 auto* csv =
new TGeoVolume(
"TPC_CDRS", cs, sm7);
1549 v1->AddNode(csv, 1,
new TGeoTranslation(0., 0., -71.2));
1550 v1->AddNode(csv, 2,
new TGeoTranslation(0., 0., 71.2));
1553 auto* se =
new TGeoPcon(0., 360., 6);
1554 se->DefineSection(0, -72.8, 59.7, 61.2);
1555 se->DefineSection(1, -72.3, 59.7, 61.2);
1557 se->DefineSection(2, -72.3, 58.85, 61.2);
1558 se->DefineSection(3, -71.6, 58.85, 61.2);
1560 se->DefineSection(4, -71.6, 59.7, 61.2);
1561 se->DefineSection(5, -71.3, 59.7, 61.2);
1563 auto* sev =
new TGeoVolume(
"TPC_CDCE", se, m3);
1565 auto* si =
new TGeoTube(56.9, 58.8, 1.);
1566 auto* siv =
new TGeoVolume(
"TPC_CDCI", si, m3);
1570 auto*
ref =
new TGeoRotation(
"ref", 90., 0., 90., 90., 180., 0.);
1572 cd1v->AddNode(cd2v, 1);
1573 cd2v->AddNode(cd3v, 1);
1574 cd3v->AddNode(cd4v, 1);
1578 segrot =
new TGeoRotation();
1579 segrot->RotateZ(0.05);
1580 cd4v->AddNode(cdjlv, 1, segrot);
1581 cd4v->AddNode(cdjuv, 1, segrot);
1582 segrot =
new TGeoRotation();
1583 segrot->RotateZ(118.95);
1584 cd4v->AddNode(cdjlv, 2, segrot);
1585 cd4v->AddNode(cdjuv, 2, segrot);
1590 segrot =
new TGeoRotation();
1591 segrot->RotateZ(4.6);
1592 cflv->AddNode(cd1v, 1, segrot);
1593 cflv->AddNode(tvep4, 1, segrot);
1595 segrot =
new TGeoRotation();
1596 segrot->RotateZ(124.6);
1597 cflv->AddNode(cd1v, 2, segrot);
1598 cflv->AddNode(tvep4, 2, segrot);
1600 segrot =
new TGeoRotation();
1601 segrot->RotateZ(244.6);
1602 cflv->AddNode(cd1v, 3, segrot);
1603 cflv->AddNode(tvep4, 3, segrot);
1607 auto* hstr =
new TGeoTubeSeg(60.6124, 60.6224, 68.5, 0., 1.25);
1608 auto* hstrv =
new TGeoVolume(
"TPC_HSTR", hstr, m1);
1609 for (Int_t
i = 0;
i < 144;
i++) {
1610 Double_t
alpha = 1.25 +
i * 2.5;
1611 segrot =
new TGeoRotation();
1612 segrot->RotateZ(
alpha);
1613 cflv->AddNode(hstrv,
i + 1, segrot);
1616 v1->AddNode(siv, 1,
new TGeoTranslation(0., 0., -69.9));
1617 v1->AddNode(siv, 2,
new TGeoTranslation(0., 0., 69.9));
1618 v1->AddNode(sev, 1);
1619 v1->AddNode(sev, 2,
ref);
1620 v1->AddNode(cflv, 1);
1624 auto* ih =
new TGeoTube(81.05, 84.05, 0.3);
1625 auto* oh =
new TGeoTube(250., 256., 0.5);
1626 auto* mem =
new TGeoTube(84.05, 250., 0.00115);
1629 TGeoMedium*
m4 = gGeoManager->GetMedium(
"TPC_G10");
1631 auto* ihv =
new TGeoVolume(
"TPC_IHVH", ih, m3);
1632 auto* ohv =
new TGeoVolume(
"TPC_OHVH", oh, m3);
1634 auto* memv =
new TGeoVolume(
"TPC_HV", mem, sm7);
1636 auto*
cm =
new TGeoVolumeAssembly(
"TPC_HVMEM");
1637 cm->AddNode(ihv, 1);
1638 cm->AddNode(ohv, 1);
1639 cm->AddNode(memv, 1);
1646 Double_t openingAngle = 10. * TMath::DegToRad();
1647 Double_t thick = 1.5;
1648 Double_t shift = thick / TMath::Sin(openingAngle);
1650 Double_t lowEdge = 86.3;
1651 Double_t upEdge = 240.4;
1653 new TGeoTubeSeg(
"tpc_ssec", 74.5, 264.4, 3., 0., 20.);
1655 auto* tpc_hole =
new TGeoPgon(
"tpc_hole", 0., 20., 1, 4);
1657 tpc_hole->DefineSection(0, -3.5, lowEdge - shift, upEdge - shift);
1658 tpc_hole->DefineSection(1, -1.5, lowEdge - shift, upEdge - shift);
1660 tpc_hole->DefineSection(2, -1.5, lowEdge - shift, upEdge + 3. - shift);
1661 tpc_hole->DefineSection(3, 3.5, lowEdge - shift, upEdge + 3. - shift);
1663 Double_t ys = shift * TMath::Sin(openingAngle);
1664 Double_t xs = shift * TMath::Cos(openingAngle);
1665 auto* tr =
new TGeoTranslation(
"tr", xs, ys, 0.);
1666 tr->RegisterYourself();
1667 auto*
chamber =
new TGeoCompositeShape(
"tpc_ssec-tpc_hole:tr");
1668 auto* sv =
new TGeoVolume(
"TPC_WSEG", chamber, m3);
1669 auto* bar =
new TGeoPgon(
"bar", 0., 20., 1, 2);
1670 bar->DefineSection(0, -3., 131.5 - shift, 136.5 - shift);
1671 bar->DefineSection(1, 1.5, 131.5 - shift, 136.5 - shift);
1672 auto* barv =
new TGeoVolume(
"TPC_WBAR", bar, m3);
1673 auto* ch =
new TGeoVolumeAssembly(
"TPC_WCH");
1676 ch->AddNode(barv, 1, tr);
1682 TGeoMedium* m6 = gGeoManager->GetMedium(
"TPC_Makrolon");
1684 auto* ibody =
new TGeoTrd1(13.8742, 21.3328, 4.29, 21.15);
1685 auto* ibdv =
new TGeoVolume(
"TPC_IROCB", ibody, m3);
1687 auto* emp =
new TGeoTrd1(12.3742, 19.8328, 4.05, 19.65);
1688 auto* empv =
new TGeoVolume(
"TPC_IROCE", emp, m1);
1689 ibdv->AddNode(empv, 1,
new TGeoTranslation(0., -0.24, 0.));
1691 Double_t tga = (19.8328 - 12.3742) / 39.3;
1692 Double_t xmin, xmax;
1694 xmin = 9.65 * tga + 12.3742;
1695 xmax = 10.05 * tga + 12.3742;
1697 auto* ib1 =
new TGeoTrd1(xmin, xmax, 2.06, 0.2);
1698 auto* ib1v =
new TGeoVolume(
"TPC_IRB1", ib1, m3);
1699 empv->AddNode(ib1v, 1,
new TGeoTranslation(
"tt1", 0., 1.99, -9.8));
1701 xmin = 19.5 * tga + 12.3742;
1702 xmax = 19.9 * tga + 12.3742;
1704 auto* ib2 =
new TGeoTrd1(xmin, xmax, 2.06, 0.2);
1705 auto* ib2v =
new TGeoVolume(
"TPC_TRB2", ib2, m3);
1706 empv->AddNode(ib2v, 1,
new TGeoTranslation(0., 1.99, 0.05));
1708 xmin = 29.35 * tga + 12.3742;
1709 xmax = 29.75 * tga + 12.3742;
1711 auto* ib3 =
new TGeoTrd1(xmin, xmax, 2.06, 0.2);
1712 auto* ib3v =
new TGeoVolume(
"TPC_IRB3", ib3, m3);
1713 empv->AddNode(ib3v, 1,
new TGeoTranslation(0., 1.99, 9.9));
1717 auto* conn =
new TGeoBBox(0.4, 0.24, 1.937);
1718 auto* connv =
new TGeoVolume(
"TPC_RCCON", conn, m6);
1720 auto* connb =
new TGeoBBox(0.5, 0.25, 2.375);
1721 auto* connbv =
new TGeoVolume(
"TPC_RCCONB", connb, m6);
1725 auto* icsb =
new TGeoTrd1(14.5974, 23.3521, 0.25, 24.825);
1726 auto* icsbv =
new TGeoVolume(
"TPC_ISB", icsb, m4);
1730 TString fileName(gSystem->Getenv(
"VMCWORKDIR"));
1731 fileName +=
"/Detectors/Geometry/TPC/conn_iroc.dat";
1733 in.open(fileName.Data(), ios_base::in);
1734 if (!in.is_open()) {
1735 LOG(fatal) <<
"Cannot open input file : " << fileName.Data();
1737 for (Int_t
i = 0;
i < 132;
i++) {
1739 in >> ang >>
x >>
z;
1746 auto* rrr =
new TGeoRotation();
1749 ibdv->AddNode(connv,
i + 1,
new TGeoCombiTrans(
x, 4.05,
z, rrr));
1750 icsbv->AddNode(connbv,
i + 1,
new TGeoCombiTrans(
x, 0.,
z + 1.725, rrr));
1755 new TGeoTrd1(
"icap", 14.5974, 23.3521, 1.19, 24.825);
1757 new TGeoTrd1(
"ihole", 13.8742, 21.3328, 1.2, 21.15);
1758 auto* tr1 =
new TGeoTranslation(
"tr1", 0., 0., 1.725);
1759 tr1->RegisterYourself();
1760 auto* ic =
new TGeoCompositeShape(
"icap-ihole:tr1");
1761 auto* icv =
new TGeoVolume(
"TPC_IRCAP", ic, m3);
1765 auto* icpp =
new TGeoTrd1(14.5974, 23.3521, 0.16, 24.825);
1766 auto* icppv =
new TGeoVolume(
"TPC_IPP", icpp, m4);
1770 new TGeoTrd1(
"igem", 14.5974, 23.3521, 0.1, 24.825);
1771 new TGeoTrd1(
"igemh", 14.5974 - .5, 23.3521 - .5, 0.11, 24.825 - .5);
1772 auto* icgem =
new TGeoCompositeShape(
"igem-igemh");
1773 auto* icgemv =
new TGeoVolume(
"TPC_ICGEM", icgem, m4);
1777 auto* iroc =
new TGeoVolumeAssembly(
"TPC_IROC");
1779 iroc->AddNode(ibdv, 1);
1780 iroc->AddNode(icv, 1,
new TGeoTranslation(0., 3.1, -1.725));
1781 iroc->AddNode(icsbv, 1,
new TGeoTranslation(0., 4.54, -1.725));
1782 iroc->AddNode(icppv, 1,
new TGeoTranslation(0., 4.95, -1.725));
1783 iroc->AddNode(icgemv, 1,
new TGeoTranslation(0., 5.21, -1.725));
1787 auto* obody =
new TGeoTrd1(22.2938, 40.5084, 4.29, 51.65);
1788 auto* obdv =
new TGeoVolume(
"TPC_OROCB", obody, m3);
1789 auto* oemp =
new TGeoTrd1(20.7938, 39.0084, 3.89, 50.15);
1790 auto* oempv =
new TGeoVolume(
"TPC_OROCE", oemp, m1);
1791 obdv->AddNode(oempv, 1,
new TGeoTranslation(0., -0.4, 0.));
1795 tga = (39.0084 - 20.7938) / 100.3;
1796 xmin = tga * 14.2 + 20.7938;
1797 xmax = tga * 14.6 + 20.7938;
1798 auto* ob1 =
new TGeoTrd1(xmin, xmax, 2.94, 0.2);
1799 auto* ob1v =
new TGeoVolume(
"TPC_ORB1", ob1, m3);
1801 xmin = 30.4 * tga + 20.7938;
1802 xmax = 32.1 * tga + 20.7938;
1803 auto* ob2 =
new TGeoTrd1(xmin, xmax, 2.94, 1.05);
1804 auto* ob2v =
new TGeoVolume(
"TPC_ORB2", ob2, m3);
1806 xmin = 51.5 * tga + 20.7938;
1807 xmax = 51.9 * tga + 20.7938;
1808 auto* ob3 =
new TGeoTrd1(xmin, xmax, 2.94, 0.2);
1809 auto* ob3v =
new TGeoVolume(
"TPC_ORB3", ob3, m3);
1811 xmin = 68.5 * tga + 20.7938;
1812 xmax = 70.6 * tga + 20.7938;
1813 auto* ob4 =
new TGeoTrd1(xmin, xmax, 2.94, 1.05);
1814 auto* ob4v =
new TGeoVolume(
"TPC_ORB4", ob4, m3);
1816 xmin = 89.9 * tga + 20.7938;
1817 xmax = 90.3 * tga + 20.7938;
1818 auto* ob5 =
new TGeoTrd1(xmin, xmax, 2.94, 0.2);
1819 auto* ob5v =
new TGeoVolume(
"TPC_ORB5", ob5, m3);
1821 oempv->AddNode(ob1v, 1,
new TGeoTranslation(0., 0.59, -35.75));
1822 oempv->AddNode(ob2v, 1,
new TGeoTranslation(0., 0.59, -18.7));
1823 oempv->AddNode(ob3v, 1,
new TGeoTranslation(0., 0.59, 1.55));
1824 oempv->AddNode(ob4v, 1,
new TGeoTranslation(0., 0.59, 19.4));
1825 oempv->AddNode(ob5v, 1,
new TGeoTranslation(0., 0.59, 39.95));
1829 auto* conno =
new TGeoBBox(0.4, 0.4, 1.937);
1830 auto* connov =
new TGeoVolume(
"TPC_RCCONO", conno, m6);
1832 auto* connob =
new TGeoBBox(0.5, 0.25, 2.375);
1833 auto* connobv =
new TGeoVolume(
"TPC_RCCONOB", connob, m6);
1837 new TGeoTrd1(
"ocap", 23.3875, 43.524, 1.19, 57.1);
1838 new TGeoTrd1(
"ohole", 22.2938, 40.5084, 1.19, 51.65);
1839 auto* tr5 =
new TGeoTranslation(
"tr5", 0., 0., -2.15);
1840 tr5->RegisterYourself();
1841 auto* oc =
new TGeoCompositeShape(
"ocap-ohole:tr5");
1842 auto* ocv =
new TGeoVolume(
"TPC_ORCAP", oc, m3);
1846 auto* osb =
new TGeoTrd1(23.3874, 43.524, 0.25, 57.1);
1847 auto* osbv =
new TGeoVolume(
"TPC_OSB", osb, m4);
1851 auto* opp =
new TGeoTrd1(23.3874, 43.524, 0.16, 57.1);
1852 auto* oppv =
new TGeoVolume(
"TPC_OPP", opp, m4);
1856 new TGeoTrd1(
"ogem", 23.3874, 43.524, 0.1, 57.1);
1860 new TGeoTrd1(
"ogemh1", 22.548, 28.579, 0.1, 17.625);
1861 new TGeoTrd1(
"ogemh2", 28.949, 35.297, 0.1, 18.45);
1862 new TGeoTrd1(
"ogemh3", 35.667, 42.332, 0.1, 19.425);
1864 auto* tr2 =
new TGeoTranslation(
"tr2", 0., 0., 18.125 - 57.1);
1865 auto* tr3 =
new TGeoTranslation(
"tr3", 0., 0., 55.2 - 57.1);
1866 auto* tr4 =
new TGeoTranslation(
"tr4", 0., 0., 94.175 - 57.1);
1867 tr2->RegisterYourself();
1868 tr3->RegisterYourself();
1869 tr4->RegisterYourself();
1870 auto* ocgem =
new TGeoCompositeShape(
"ogem-ogemh1:tr2-ogemh2:tr3-ogemh3:tr4");
1871 auto* ocgemv =
new TGeoVolume(
"TPC_OCGEM", ocgem, m4);
1875 fileName = gSystem->Getenv(
"VMCWORKDIR");
1876 fileName +=
"/Detectors/Geometry/TPC/conn_oroc.dat";
1877 in.open(fileName.Data(), ios_base::in);
1878 if (!in.is_open()) {
1879 LOG(fatal) <<
"Cannot open input file : " << fileName.Data();
1881 for (Int_t
i = 0;
i < 232;
i++) {
1883 in >> ang >>
x >>
z;
1889 auto* rrr =
new TGeoRotation();
1891 obdv->AddNode(connov,
i + 1,
new TGeoCombiTrans(
x, 3.89,
z, rrr));
1892 osbv->AddNode(connobv,
i + 1,
new TGeoCombiTrans(
x, 0.,
z - 2.15, rrr));
1896 auto* oroc =
new TGeoVolumeAssembly(
"TPC_OROC");
1898 oroc->AddNode(obdv, 1);
1899 oroc->AddNode(ocv, 1,
new TGeoTranslation(0., 3.1, 2.15));
1900 oroc->AddNode(osbv, 1,
new TGeoTranslation(0., 4.54, 2.15));
1901 oroc->AddNode(oppv, 1,
new TGeoTranslation(0., 4.95, 2.15));
1902 oroc->AddNode(ocgemv, 1,
new TGeoTranslation(0., 5.21, 2.15));
1906 auto* secta =
new TGeoVolumeAssembly(
"TPC_SECT");
1907 auto* sectc =
new TGeoVolumeAssembly(
"TPC_SECT");
1908 TGeoRotation rot1(
"rot1", 90., 90., 0.);
1909 TGeoRotation rot2(
"rot2");
1911 auto* rot =
new TGeoRotation(
"rot");
1918 x0 = 110.2 * TMath::Cos(openingAngle);
1919 y0 = 110.2 * TMath::Sin(openingAngle);
1920 auto* combi1a =
new TGeoCombiTrans(
"combi1",
x0,
y0, 1.09, rot);
1921 auto* combi1c =
new TGeoCombiTrans(
"combi1",
x0,
y0, 1.09, rot);
1922 x0 = 188.45 * TMath::Cos(openingAngle);
1923 y0 = 188.45 * TMath::Sin(openingAngle);
1924 auto* combi2a =
new TGeoCombiTrans(
"combi2",
x0,
y0, 1.09, rot);
1925 auto* combi2c =
new TGeoCombiTrans(
"combi2",
x0,
y0, 1.09, rot);
1930 secta->AddNode(ch, 1);
1931 secta->AddNode(iroc, 1, combi1a);
1932 secta->AddNode(oroc, 1, combi2a);
1936 sectc->AddNode(ch, 1);
1937 sectc->AddNode(iroc, 1, combi1c);
1938 sectc->AddNode(oroc, 1, combi2c);
1942 auto* wheela =
new TGeoVolumeAssembly(
"TPC_ENDCAP");
1943 auto* wheelc =
new TGeoVolumeAssembly(
"TPC_ENDCAP");
1945 for (Int_t
i = 0;
i < 18;
i++) {
1946 Double_t
phi = (20. *
i);
1947 auto* rwh =
new TGeoRotation();
1949 wheela->AddNode(secta,
i + 1, rwh);
1950 wheelc->AddNode(sectc,
i + 1, rwh);
1954 auto* combi3 =
new TGeoCombiTrans(
"combi3", 0., 0., 256.6,
ref);
1955 v9->AddNode(wheela, 1, combi3);
1956 v9->AddNode(wheelc, 2,
new TGeoTranslation(0., 0., -256.6));
1960 auto*
sw =
new TGeoPgon(0., 20., 1, 2);
1961 sw->DefineSection(0, -4., 80.5, 251.75);
1962 sw->DefineSection(1, 4., 80.5, 251.75);
1963 auto* swv =
new TGeoVolume(
"TPC_SWSEG",
sw, m3);
1966 shift = thick / TMath::Sin(openingAngle);
1967 auto* sh =
new TGeoPgon(0., 20., 1, 2);
1968 sh->DefineSection(0, -4., 81.5 - shift, 250.75 - shift);
1969 sh->DefineSection(1, 4., 81.5 - shift, 250.75 - shift);
1970 auto* shv =
new TGeoVolume(
"TPC_SWS1", sh, m1);
1972 TGeoMedium* m9 = gGeoManager->GetMedium(
"TPC_Si");
1973 auto* el =
new TGeoPgon(0., 20., 1, 2);
1974 el->DefineSection(0, -1.872, 81.5 - shift, 250.75 - shift);
1975 el->DefineSection(1, 1.872, 81.5 - shift, 250.75 - shift);
1976 auto* elv =
new TGeoVolume(
"TPC_ELEC", el, m9);
1978 shv->AddNode(elv, 1);
1981 ys = shift * TMath::Sin(openingAngle);
1982 xs = shift * TMath::Cos(openingAngle);
1983 swv->AddNode(shv, 1,
new TGeoTranslation(xs, ys, 0.));
1985 auto* co =
new TGeoPgon(0., 20., 1, 2);
1986 co->DefineSection(0, -0.5, 77., 255.25);
1987 co->DefineSection(1, 0.5, 77., 255.25);
1988 auto* cov =
new TGeoVolume(
"TPC_SWC1", co, m3);
1990 auto* coh =
new TGeoPgon(0., 20., 1, 2);
1991 shift = 4. / TMath::Sin(openingAngle);
1992 coh->DefineSection(0, -0.5, 85. - shift, 247.25 - shift);
1993 coh->DefineSection(1, 0.5, 85. - shift, 247.25 - shift);
1995 auto* cohv =
new TGeoVolume(
"TPC_SWC2", coh, m1);
1997 ys = shift * TMath::Sin(openingAngle);
1998 xs = shift * TMath::Cos(openingAngle);
1999 cov->AddNode(cohv, 1,
new TGeoTranslation(xs, ys, 0.));
2003 auto* swhs =
new TGeoVolumeAssembly(
"TPC_SSWSEC");
2004 swhs->AddNode(swv, 1);
2005 swhs->AddNode(cov, 1,
new TGeoTranslation(0., 0., -4.5));
2006 swhs->AddNode(cov, 2,
new TGeoTranslation(0., 0., 4.5));
2010 TGeoRotation* rsw[18];
2011 auto* swheel =
new TGeoVolumeAssembly(
"TPC_SSWHEEL");
2012 for (Int_t
i = 0;
i < 18;
i++) {
2013 Double_t
phi = (20. *
i);
2014 rsw[
i] =
new TGeoRotation();
2015 rsw[
i]->RotateZ(phi);
2016 swheel->AddNode(swhs,
i + 1, rsw[
i]);
2018 v1->AddNode(swheel, 1,
new TGeoTranslation(0., 0., -284.6));
2019 v1->AddNode(swheel, 2,
new TGeoTranslation(0., 0., 284.6));
2024 Int_t totrows = 159;
2028 gGeoManager->Volume(
"TPC_Strip",
"PGON",
m5->GetId(), upar);
2029 upar =
new Double_t[10];
2040 Double_t rlow = 85.225;
2043 upar[6] = rlow + .01;
2047 gGeoManager->Node(
"TPC_Strip", 1,
"TPC_Drift", 0., 0., 124.82, 0, kTRUE, upar, 10);
2048 gGeoManager->Node(
"TPC_Strip", totrows + 1,
"TPC_Drift", 0., 0., -124.82, 0, kTRUE, upar, 10);
2082 TGeoMedium* m7 = gGeoManager->GetMedium(
"TPC_Cu");
2083 TGeoMedium* m10 = gGeoManager->GetMedium(
"TPC_Alumina");
2084 TGeoMedium* m11 = gGeoManager->GetMedium(
"TPC_Peek");
2085 TGeoMedium* m13 = gGeoManager->GetMedium(
"TPC_Brass");
2086 TGeoMedium* m14 = gGeoManager->GetMedium(
"TPC_Alumina1");
2094 auto* rod =
new TGeoPcon(
"rod", 0., 360., 6);
2095 rod->DefineSection(0, -10.43, 1.92, 2.08);
2096 rod->DefineSection(1, -9.75, 1.92, 2.08);
2098 rod->DefineSection(2, -9.75, 1.8, 2.2);
2099 rod->DefineSection(3, 9.75, 1.8, 2.2);
2101 rod->DefineSection(4, 9.75, 1.92, 2.08);
2102 rod->DefineSection(5, 10.43, 1.92, 2.08);
2104 auto* mrodl =
new TGeoVolume(
"TPC_mrodl", rod, m6);
2108 auto* rod1 =
new TGeoPcon(
"rod1", 0., 360., 6);
2109 rod1->DefineSection(0, -8.93, 1.92, 2.08);
2110 rod1->DefineSection(1, -8.25, 1.92, 2.08);
2112 rod1->DefineSection(2, -8.25, 1.8, 2.2);
2113 rod1->DefineSection(3, 8.25, 1.8, 2.2);
2115 rod1->DefineSection(4, 8.25, 1.92, 2.08);
2116 rod1->DefineSection(5, 8.93, 1.92, 2.08);
2118 auto* mrods =
new TGeoVolume(
"TPC_mrods", rod1, m6);
2125 new TGeoTube(
"hhole", 0., 0.3, 0.3);
2130 auto* rhole =
new TGeoRotation();
2131 rhole->RotateX(90.);
2132 TGeoCombiTrans* transf[13];
2134 for (Int_t
i = 0;
i < 13;
i++) {
2135 snprintf(
name, 30,
"transf%d",
i);
2136 transf[
i] =
new TGeoCombiTrans(
name, 0., -2., -9. +
i * 1.5, rhole);
2137 transf[
i]->RegisterYourself();
2140 TString operl(
"hhole:transf0");
2141 for (Int_t
i = 1;
i < 13;
i++) {
2142 snprintf(
name, 30,
"+hhole:transf%d",
i);
2146 TString opers(
"hhole:transf1");
2147 for (Int_t
i = 2;
i < 12;
i++) {
2148 snprintf(
name, 30,
"+hhole:transf%d",
i);
2152 new TGeoCompositeShape(
"hlv", operl.Data());
2153 new TGeoCompositeShape(
"hsv", opers.Data());
2155 auto* rodl =
new TGeoCompositeShape(
"rodl",
"rod-hlv");
2156 auto* rods =
new TGeoCompositeShape(
"rods",
"rod1-hsv");
2158 auto* rodlv =
new TGeoVolume(
"TPC_rodl", rodl, m6);
2159 auto* rodsv =
new TGeoVolume(
"TPC_rods", rods, m6);
2162 auto* bcon =
new TGeoTube(0., 0.3, 0.3);
2163 auto* bconv =
new TGeoVolume(
"TPC_bcon", bcon, m13);
2167 new TGeoBBox(
"hk1", 0.625, 0.015, 0.75);
2168 new TGeoBBox(
"hk2", 0.625, 0.015, 0.15);
2169 auto* tr21 =
new TGeoTranslation(
"tr21", 0., -0.03, -0.6);
2170 auto* tr12 =
new TGeoTranslation(
"tr12", 0., -0.03, 0.6);
2171 tr21->RegisterYourself();
2172 tr12->RegisterYourself();
2174 auto* hook =
new TGeoCompositeShape(
"hook",
"hk1+hk2:tr21+hk2:tr12");
2175 auto* hookv =
new TGeoVolume(
"TPC_hook", hook, m13);
2182 auto* spart =
new TGeoVolumeAssembly(
"TPC_spart");
2184 spart->AddNode(rodsv, 1);
2185 for (Int_t
i = 1;
i < 12;
i++) {
2186 spart->AddNode(bconv,
i, transf[
i]);
2188 for (Int_t
i = 0;
i < 11;
i++) {
2189 spart->AddNode(hookv,
i + 1,
new TGeoTranslation(0., -2.315, -7.5 +
i * 1.5));
2194 auto* lpart =
new TGeoVolumeAssembly(
"TPC_lpart");
2196 lpart->AddNode(rodlv, 1);
2197 for (Int_t
i = 0;
i < 13;
i++) {
2198 lpart->AddNode(bconv,
i + 12, transf[
i]);
2200 for (Int_t
i = 0;
i < 13;
i++) {
2201 lpart->AddNode(hookv,
i + 12,
new TGeoTranslation(0., -2.315, -9. +
i * 1.5));
2206 new TGeoTube(
"ring1", 2.1075, 2.235, 0.53);
2207 new TGeoTube(
"ring2", 1.7925, 1.89, 0.43);
2208 new TGeoTube(
"ring3", 1.89, 2.1075, 0.05);
2209 auto* ring =
new TGeoCompositeShape(
"ring",
"ring1+ring2+ring3");
2210 auto* ringv =
new TGeoVolume(
"TPC_ring", ring, m3);
2214 auto* tpcrrod =
new TGeoVolumeAssembly(
"TPC_rrod");
2215 auto* tpcmrod =
new TGeoVolumeAssembly(
"TPC_mrod");
2217 for (Int_t
i = 0;
i < 11;
i++) {
2218 tpcrrod->AddNode(ringv,
i + 1,
new TGeoTranslation(0., 0., -105. +
i * 21));
2219 tpcmrod->AddNode(ringv,
i + 12,
new TGeoTranslation(0., 0., -105. +
i * 21));
2221 for (Int_t
i = 0;
i < 10;
i++) {
2222 tpcrrod->AddNode(lpart,
i + 1,
new TGeoTranslation(0., 0., -94.5 +
i * 21));
2223 tpcmrod->AddNode(mrodl,
i + 1,
new TGeoTranslation(0., 0., -94.5 +
i * 21));
2228 auto* tpcrp =
new TGeoPcon(0., 360., 6);
2230 tpcrp->DefineSection(0, 123.05, 1.89, 2.1075);
2231 tpcrp->DefineSection(1, 123.59, 1.89, 2.1075);
2233 tpcrp->DefineSection(2, 123.59, 1.8, 2.2);
2234 tpcrp->DefineSection(3, 127., 1.8, 2.2);
2236 tpcrp->DefineSection(4, 127., 0., 2.2);
2237 tpcrp->DefineSection(5, 127.5, 0., 2.2);
2239 auto* tpcrpv =
new TGeoVolume(
"TPC_RP", tpcrp, m6);
2243 tpcrrod->AddNode(spart, 1,
new TGeoTranslation(0., 0., -114.));
2244 tpcrrod->AddNode(spart, 2,
new TGeoTranslation(0., 0., 114.));
2245 tpcrrod->AddNode(ringv, 23,
new TGeoTranslation(0., 0., -123.));
2246 tpcrrod->AddNode(ringv, 24,
new TGeoTranslation(0., 0., 123.));
2247 tpcrrod->AddNode(tpcrpv, 1);
2249 tpcmrod->AddNode(mrods, 1,
new TGeoTranslation(0., 0., -114.));
2250 tpcmrod->AddNode(mrods, 2,
new TGeoTranslation(0., 0., 114.));
2251 tpcmrod->AddNode(ringv, 25,
new TGeoTranslation(0., 0., -123.));
2252 tpcmrod->AddNode(ringv, 26,
new TGeoTranslation(0., 0., 123.));
2253 tpcmrod->AddNode(tpcrpv, 2);
2260 auto* hvr =
new TGeoTube(0., 1.465, 123.);
2261 auto* hvc =
new TGeoTube(0., 0.29, 123.);
2263 auto* hvrv =
new TGeoVolume(
"TPC_HV_Rod", hvr, m6);
2264 auto* hvcv =
new TGeoVolume(
"TPC_HV_Cable", hvc, m7);
2265 hvrv->AddNode(hvcv, 1);
2269 auto* cr =
new TGeoTube(0., 0.45, 123.);
2270 auto* cw =
new TGeoTube(0., 0.15, 123.);
2271 auto* crv =
new TGeoVolume(
"TPC_CR", cr, m10);
2272 auto* cwv =
new TGeoVolume(
"TPC_W", cw, m12);
2276 crv->AddNode(cwv, 1);
2280 auto* pr =
new TGeoTube(0.2, 0.35, 123.);
2281 auto* prv =
new TGeoVolume(
"TPC_PR", pr, m11);
2285 new TGeoTube(
"tub", 0., 1.7, 0.025);
2289 Double_t
n[3],
p[3];
2290 Double_t
slope = TMath::Tan(22. * TMath::DegToRad());
2291 Double_t intp = 1.245;
2302 norm = TMath::Sqrt(
n[0] *
n[0] +
n[1] *
n[1]);
2315 norm = TMath::Sqrt(
n[0] *
n[0] +
n[1] *
n[1]);
2322 new TGeoTube(
"h1", 0., 0.5, 0.025);
2323 new TGeoTube(
"h2", 0., 0.35, 0.025);
2325 auto* ttr11 =
new TGeoTranslation(
"ttr11", -0.866, 0.5, 0.);
2326 auto* ttr22 =
new TGeoTranslation(
"ttr22", 0.866, 0.5, 0.);
2327 ttr11->RegisterYourself();
2328 ttr22->RegisterYourself();
2330 new TGeoBBox(
"elcon", 0.72, 0.005, 0.3);
2331 auto* crr1 =
new TGeoRotation();
2332 crr1->RotateZ(-22.);
2333 auto* ctr1 =
new TGeoCombiTrans(
"ctr1", -0.36011, -1.09951, -0.325, crr1);
2334 ctr1->RegisterYourself();
2335 auto* cs1 =
new TGeoCompositeShape(
"cs1",
"(((((tub-h1:ttr11)-h1:ttr22)-(sp1:sp1_tr))-(sp2:sp2_tr))-h2)+elcon:ctr1");
2337 auto* csvv =
new TGeoVolume(
"TPC_RR_CU", cs1, m7);
2342 auto* rrod =
new TGeoVolumeAssembly(
"TPC_RRIN");
2344 rrod->AddNode(crv, 1, ttr11);
2345 rrod->AddNode(crv, 2, ttr22);
2346 rrod->AddNode(prv, 1);
2348 for (Int_t
i = 0;
i < 165;
i++) {
2349 rrod->AddNode(csvv,
i + 1,
new TGeoTranslation(0., 0., -122.675 +
i * 1.5));
2352 auto*
res =
new TGeoTube(0., 0.15, 0.5);
2353 auto* resv =
new TGeoVolume(
"TPC_RES",
res, m14);
2354 auto* ress =
new TGeoVolumeAssembly(
"TPC_RES_CH");
2355 ress->AddNode(resv, 1,
new TGeoTranslation(0.2, 0., 0.));
2356 ress->AddNode(resv, 2,
new TGeoTranslation(-0.2, 0., 0.));
2358 auto* crr2 =
new TGeoRotation();
2360 auto* crr3 =
new TGeoRotation();
2361 crr3->RotateY(-30.);
2363 for (Int_t
i = 0;
i < 164;
i += 2) {
2364 rrod->AddNode(ress,
i + 1,
new TGeoCombiTrans(0., 1.2, -121.925 +
i * 1.5, crr2));
2365 rrod->AddNode(ress,
i + 2,
new TGeoCombiTrans(0., 1.2, -121.925 + (
i + 1) * 1.5, crr3));
2368 tpcrrod->AddNode(rrod, 1,
new TGeoCombiTrans(0., 0., 0.5, crr1));
2373 Double_t shift1[3] = {0.0, -0.175, 0.0};
2375 new TGeoBBox(
"tpcihs1", 4.7, 0.66, 2.35);
2376 new TGeoBBox(
"tpcihs2", 4.7, 0.485, 1.0, shift1);
2377 new TGeoBBox(
"tpcihs3", 1.5, 0.485, 2.35, shift1);
2378 new TGeoTube(
"tpcihs4", 0.0, 2.38, 0.1);
2380 Double_t pointstrap[16];
2381 pointstrap[0] = 0.0;
2382 pointstrap[1] = 0.0;
2383 pointstrap[2] = 0.0;
2384 pointstrap[3] = 1.08;
2385 pointstrap[4] = 2.3;
2386 pointstrap[5] = 1.08;
2387 pointstrap[6] = 3.38;
2388 pointstrap[7] = 0.0;
2389 pointstrap[8] = 0.0;
2390 pointstrap[9] = 0.0;
2391 pointstrap[10] = 0.0;
2392 pointstrap[11] = 1.08;
2393 pointstrap[12] = 2.3;
2394 pointstrap[13] = 1.08;
2395 pointstrap[14] = 3.38;
2396 pointstrap[15] = 0.0;
2398 auto* tpcihs5 =
new TGeoArb8(
"tpcihs5", 0.6, pointstrap);
2415 auto* trans2 =
new TGeoTranslation(
"trans2", 0.0, 2.84, 2.25);
2416 trans2->RegisterYourself();
2417 auto* trans3 =
new TGeoTranslation(
"trans3", 0.0, 2.84, -2.25);
2418 trans3->RegisterYourself();
2422 new TGeoCompositeShape(
"tpcihs6",
"tpcihs1-(tpcihs2+tpcihs3)-(tpcihs4:trans2)-(tpcihs4:trans3)-(cutil1:cutil1_tr)");
2426 auto* tpcihss =
new TGeoVolume(
"TPC_IHSS", tpcihs6, m6);
2427 auto* tpcihst =
new TGeoVolume(
"TPC_IHSTR", tpcihs5, m6);
2429 auto* rot111 =
new TGeoRotation();
2430 rot111->RotateY(180.0);
2432 auto* tpcihs =
new TGeoVolumeAssembly(
"TPC_IHS");
2433 tpcihs->AddNode(tpcihss, 1);
2434 tpcihs->AddNode(tpcihst, 1,
new TGeoTranslation(-4.7, 0.66, 0.0));
2435 tpcihs->AddNode(tpcihst, 2,
new TGeoCombiTrans(4.7, 0.66, 0.0, rot111));
2439 new TGeoBBox(
"tpcirh1", 4.7, 1.33, 0.5);
2443 new TGeoBBox(
"tpcirh2", 1.05, 0.8, 0.5, shift1);
2447 new TGeoBBox(
"tpcirh3", 1.05, 0.8, 0.5, shift1);
2451 new TGeoBBox(
"tpcirh4", 1.9, 0.25, 0.5, shift1);
2452 new TGeoTube(
"tpcirh5", 0, 1.9, 5);
2454 auto* trans4 =
new TGeoTranslation(
"trans4", 0, 0.83, 0.0);
2455 trans4->RegisterYourself();
2457 auto* tpcirh6 =
new TGeoCompositeShape(
"tpcirh6",
"tpcirh1-tpcirh2-tpcirh3-(tpcirh5:trans4)-tpcirh4");
2461 auto* tpcirh =
new TGeoVolume(
"TPC_IRH", tpcirh6, m6);
2465 TGeoVolume* tpciclamp =
new TGeoVolumeAssembly(
"TPC_ICLP");
2466 tpciclamp->AddNode(tpcihs, 1);
2467 tpciclamp->AddNode(tpcirh, 1,
new TGeoTranslation(0, 1.99, 1.1));
2468 tpciclamp->AddNode(tpcirh, 2,
new TGeoTranslation(0, 1.99, -1.1));
2472 auto* inplug =
new TGeoPcon(
"inplug", 0.0, 360.0, 13);
2474 inplug->DefineSection(0, 0.3, 0.0, 2.2);
2475 inplug->DefineSection(1, 0.6, 0.0, 2.2);
2477 inplug->DefineSection(2, 0.6, 0.0, 1.75);
2478 inplug->DefineSection(3, 0.7, 0.0, 1.75);
2480 inplug->DefineSection(4, 0.7, 1.55, 1.75);
2481 inplug->DefineSection(5, 1.6, 1.55, 1.75);
2483 inplug->DefineSection(6, 1.6, 1.55, 2.2);
2484 inplug->DefineSection(7, 1.875, 1.55, 2.2);
2486 inplug->DefineSection(8, 2.47, 1.75, 2.2);
2488 inplug->DefineSection(9, 2.47, 1.75, 2.08);
2489 inplug->DefineSection(10, 2.57, 1.8, 2.08);
2491 inplug->DefineSection(11, 2.57, 1.92, 2.08);
2492 inplug->DefineSection(12, 2.95, 1.92, 2.08);
2498 new TGeoBBox(
"pcuti", 1.5, 0.11, 1.075, shift1);
2500 auto* inplleft =
new TGeoCompositeShape(
"inplleft",
"inplug-pcuti");
2501 auto* tpcinlplug =
new TGeoVolume(
"TPC_INPLL", inplleft, m6);
2505 TGeoVolume* tpcihpl =
new TGeoVolumeAssembly(
"TPC_IHPL");
2506 tpcihpl->AddNode(tpcinlplug, 1);
2507 tpcihpl->AddNode(tpcinlplug, 2,
ref);
2508 tpcihpl->AddNode(tpciclamp, 1,
new TGeoTranslation(0.0, -2.765, 0.0));
2514 pointstrap[0] = 0.0;
2515 pointstrap[1] = 0.0;
2516 pointstrap[2] = 0.0;
2517 pointstrap[3] = 2.8;
2518 pointstrap[4] = 3.1;
2519 pointstrap[5] = 2.8 - 3.1 * TMath::Tan(15. * TMath::DegToRad());
2520 pointstrap[6] = 3.1;
2521 pointstrap[7] = 0.0;
2522 pointstrap[8] = 0.0;
2523 pointstrap[9] = 0.0;
2524 pointstrap[10] = 0.0;
2525 pointstrap[11] = 2.8;
2526 pointstrap[12] = 3.1;
2527 pointstrap[13] = 2.8 - 3.1 * TMath::Tan(15. * TMath::DegToRad());
2528 pointstrap[14] = 3.1;
2529 pointstrap[15] = 0.0;
2531 auto* tpcomh1 =
new TGeoArb8(
"tpcomh1", 1.05, pointstrap);
2532 auto* tpcomh2 =
new TGeoBBox(
"tpcomh2", 0.8, 1.4, 6);
2534 auto* tpcomh1v =
new TGeoVolume(
"TPC_OMH1", tpcomh1, m7);
2535 auto* tpcomh2v =
new TGeoVolume(
"TPC_OMH2", tpcomh2, m7);
2537 TGeoVolume* tpcomh3v =
new TGeoVolumeAssembly(
"TPC_OMH3");
2538 tpcomh3v->AddNode(tpcomh1v, 1,
new TGeoTranslation(0.8, -1.4, 4.95));
2539 tpcomh3v->AddNode(tpcomh1v, 2,
new TGeoTranslation(0.8, -1.4, -4.95));
2540 tpcomh3v->AddNode(tpcomh2v, 1);
2546 new TGeoBBox(
"tpcomh3", 1.65, 1.15, 3.4);
2547 auto* tpcomh4 =
new TGeoBBox(
"tpcomh4", 0.75, 0.7, 3.4, shift1);
2556 n[1] = -1.0 * TMath::Tan(30. * TMath::DegToRad());
2568 n[1] = -1.0 * TMath::Tan(30. * TMath::DegToRad());
2579 n[0] = 1.0 * TMath::Tan(75. * TMath::DegToRad());
2591 n[0] = 1.0 * TMath::Tan(75 * TMath::DegToRad());
2604 n[1] = -1.0 * TMath::Tan(20. * TMath::DegToRad());
2609 auto* tpcomh5 =
new TGeoCompositeShape(
"tpcomh5",
"tpcomh3-(cutomh1:cutomh1_tr)-(cutomh2:cutomh2_tr)-(cutomh3:cutomh3_tr)-(cutomh4:cutomh4_tr)-(cutomh5:cutomh5_tr)");
2611 auto* tpcomh5v =
new TGeoVolume(
"TPC_OMH5", tpcomh5, m6);
2612 auto* tpcomh4v =
new TGeoVolume(
"TPC_OMH6", tpcomh4, m6);
2614 auto* tpcomh7v =
new TGeoVolumeAssembly(
"TPC_OMH7");
2615 tpcomh7v->AddNode(tpcomh5v, 1);
2616 tpcomh7v->AddNode(tpcomh4v, 1);
2620 auto* tpcomh =
new TGeoVolumeAssembly(
"TPC_OMH");
2621 tpcomh->AddNode(tpcomh3v, 1,
new TGeoTranslation(1.5, 0., 0.));
2622 tpcomh->AddNode(tpcomh3v, 2,
new TGeoCombiTrans(-1.5, 0., 0., rot111));
2623 tpcomh->AddNode(tpcomh7v, 1,
new TGeoTranslation(0.65 + 1.5, 2.55, 0.0));
2624 tpcomh->AddNode(tpcomh7v, 2,
new TGeoCombiTrans(-0.65 - 1.5, 2.55, 0.0, rot111));
2628 new TGeoBBox(
"tpcohs1", 3.8, 0.675, 2.35);
2634 new TGeoBBox(
"tpcohs2", 1.5, 0.5, 2.35, shift1);
2635 new TGeoBBox(
"tpcohs3", 3.8, 0.5, 0.85, shift1);
2641 auto* tpcohs4 =
new TGeoBBox(
"tpsohs4", 3.1, 0.5, 0.7, shift1);
2643 auto* tpcohs4v =
new TGeoVolume(
"TPC_OHS4", tpcohs4, m6);
2655 auto* tpcohs5 =
new TGeoCompositeShape(
"tpcohs5",
"tpcohs1-tpcohs2-tpcohs3-(cutohs1:cutohs1_tr)");
2656 auto* tpcohs5v =
new TGeoVolume(
"TPC_OHS5", tpcohs5, m6);
2658 auto* tpcohs =
new TGeoVolumeAssembly(
"TPC_OHS");
2659 tpcohs->AddNode(tpcohs5v, 1);
2660 tpcohs->AddNode(tpcohs4v, 1);
2667 new TGeoBBox(
"tpcorh1", 3.1, 1.825, 0.55);
2673 new TGeoBBox(
"tpcorh2", 0.5, 2.75, 1.1, shift1);
2679 new TGeoBBox(
"tpcorh3", 0.5, 2.75, 1.1, shift1);
2685 new TGeoBBox(
"tpcorh4", 3.9, 2.75, 0.5, shift1);
2691 new TGeoBBox(
"tpcorh5", 1.95, 0.5, 1.1, shift1);
2697 new TGeoBBox(
"tpcorh6", 2.4, 0.5, 0.6, shift1);
2699 new TGeoTube(
"tpcorh7", 0, 1.95, 0.85);
2700 new TGeoTube(
"tpcorh8", 0, 2.4, 0.6);
2702 auto* trans33 =
new TGeoTranslation(
"trans33", 0.0, 0.0, 0.55);
2703 trans33->RegisterYourself();
2706 new TGeoCompositeShape(
"tpcorh9",
"tpcorh1-tpcorh2-tpcorh3-tpcorh4-tpcorh5-tpcorh6-(tpcorh8:trans33)-tpcorh7");
2708 auto* tpcorh9v =
new TGeoVolume(
"TPC_ORH", tpcorh9, m6);
2712 auto* tpcorh =
new TGeoVolumeAssembly(
"TPC_ORH2");
2714 tpcorh->AddNode(tpcorh9v, 1,
new TGeoTranslation(0.0, 0.0, 1.25));
2715 tpcorh->AddNode(tpcorh9v, 2,
new TGeoCombiTrans(0.0, 0.0, -1.25, rot111));
2719 auto* outplug =
new TGeoPcon(
"outplug", 0.0, 360.0, 13);
2721 outplug->DefineSection(0, 0.5, 0.0, 2.2);
2722 outplug->DefineSection(1, 0.7, 0.0, 2.2);
2723 outplug->DefineSection(2, 0.7, 1.55, 2.2);
2724 outplug->DefineSection(3, 0.8, 1.55, 2.2);
2725 outplug->DefineSection(4, 0.8, 1.55, 1.75);
2726 outplug->DefineSection(5, 1.2, 1.55, 1.75);
2727 outplug->DefineSection(6, 1.2, 1.55, 2.2);
2728 outplug->DefineSection(7, 1.875, 1.55, 2.2);
2729 outplug->DefineSection(8, 2.47, 1.75, 2.2);
2730 outplug->DefineSection(9, 2.47, 1.75, 2.08);
2731 outplug->DefineSection(10, 2.57, 1.8, 2.08);
2732 outplug->DefineSection(11, 2.57, 1.92, 2.08);
2733 outplug->DefineSection(12, 2.95, 1.92, 2.08);
2739 new TGeoBBox(
"cutout", 2.5, 0.11, 1.01, shift1);
2742 auto* outplleft =
new TGeoCompositeShape(
"outplleft",
"outplug-cutout");
2743 auto* outplleftv =
new TGeoVolume(
"TPC_OPLL", outplleft, m6);
2748 auto* tpcohpl =
new TGeoVolumeAssembly(
"TPC_OHPL");
2750 tpcohpl->AddNode(outplleftv, 1);
2751 tpcohpl->AddNode(outplleftv, 2,
ref);
2752 tpcohpl->AddNode(tpcorh, 1);
2753 tpcohpl->AddNode(tpcohs, 1,
new TGeoTranslation(0.0, 3.925, 0));
2759 pointstrap[0] = 0.0;
2760 pointstrap[1] = 0.0;
2761 pointstrap[2] = 0.0;
2762 pointstrap[3] = 2.8;
2763 pointstrap[4] = 3.1;
2764 pointstrap[5] = 1.96;
2765 pointstrap[6] = 3.1;
2766 pointstrap[7] = 0.0;
2767 pointstrap[8] = 0.0;
2768 pointstrap[9] = 0.0;
2769 pointstrap[10] = 0.0;
2770 pointstrap[11] = 2.8;
2771 pointstrap[12] = 3.1;
2772 pointstrap[13] = 1.96;
2773 pointstrap[14] = 3.1;
2774 pointstrap[15] = 0.0;
2776 auto* tpcmmh1 =
new TGeoArb8(
"tpcmmh1", 1.75, pointstrap);
2777 auto* tpcmmh2 =
new TGeoBBox(
"tpcmmh2", 0.8, 1.4, 12.5);
2779 auto* tpcmmh1v =
new TGeoVolume(
"TPC_MMH1", tpcmmh1, m6);
2780 auto* tpcmmh2v =
new TGeoVolume(
"TPC_MMH2", tpcmmh2, m6);
2782 auto* tpcmmhs =
new TGeoVolumeAssembly(
"TPC_MMHS");
2783 tpcmmhs->AddNode(tpcmmh1v, 1,
new TGeoTranslation(0.8, -1.4, 10.75));
2784 tpcmmhs->AddNode(tpcmmh1v, 2,
new TGeoTranslation(0.8, -1.4, -10.75));
2785 tpcmmhs->AddNode(tpcmmh2v, 1);
2793 new TGeoBBox(
"tpcmmhc1", 1.65, 1.85, 8.9);
2794 new TGeoBBox(
"tpcmmhc2", 0.9, 0.7, 8.9, shift1);
2804 n[2] = 8.0 * TMath::Tan(13. * TMath::DegToRad());
2814 n[2] = -8.0 * TMath::Tan(13. * TMath::DegToRad());
2824 n[2] = 6.1 * TMath::Tan(20. * TMath::DegToRad());
2834 n[2] = -6.1 * TMath::Tan(20 * TMath::DegToRad());
2842 n[0] = 2.4 * TMath::Tan(30 * TMath::DegToRad());
2852 n[0] = 2.4 * TMath::Tan(30 * TMath::DegToRad());
2859 new TGeoCompositeShape(
"TPC_MMHC",
"tpcmmhc1-tpcmmhc2-(cutmmh1:cutmmh1_tr)-(cutmmh2:cutmmh2_tr)-(cutmmh3:cutmmh3_tr)-(cutmmh4:cutmmh4_tr)-(cutmmh5:cutmmh5_tr)-(cutmmh6:cutmmh6_tr)");
2861 auto* tpcmmhcv =
new TGeoVolume(
"TPC_MMHC", tpcmmhc, m6);
2863 TGeoVolume* tpcmmh =
new TGeoVolumeAssembly(
"TPC_MMH");
2865 tpcmmh->AddNode(tpcmmhcv, 1,
new TGeoTranslation(0.65 + 1.5, 1.85, 0.0));
2866 tpcmmh->AddNode(tpcmmhcv, 2,
new TGeoCombiTrans(-0.65 - 1.5, 1.85, 0.0, rot111));
2867 tpcmmh->AddNode(tpcmmhs, 1,
new TGeoTranslation(1.5, 0.0, 0.0));
2868 tpcmmh->AddNode(tpcmmhs, 2,
new TGeoCombiTrans(-1.5, 0.0, 0.0, rot111));
2878 auto* gres1 =
new TGeoTube(0., 0.375, 125.);
2880 auto* vgres1 =
new TGeoVolume(
"TPC_GRES1", gres1, m14);
2885 xrc = 79.3 * TMath::Cos(350. * TMath::DegToRad());
2886 yrc = 79.3 * TMath::Sin(350. * TMath::DegToRad());
2888 v9->AddNode(vgres1, 1,
new TGeoTranslation(xrc, yrc, 126.9));
2889 v9->AddNode(vgres1, 2,
new TGeoTranslation(xrc, yrc, -126.9));
2891 xrc = 79.3 * TMath::Cos(190. * TMath::DegToRad());
2892 yrc = 79.3 * TMath::Sin(190. * TMath::DegToRad());
2894 v9->AddNode(vgres1, 3,
new TGeoTranslation(xrc, yrc, 126.9));
2895 v9->AddNode(vgres1, 4,
new TGeoTranslation(xrc, yrc, -126.9));
2897 TGeoRotation refl(
"refl", 90., 0., 90., 90., 180., 0.);
2898 TGeoRotation rotrod(
"rotrod");
2900 TGeoRotation* rotpos[2];
2902 TGeoRotation* rotrod1[2];
2906 auto* clampi1 =
new TGeoBBox(
"clampi1", 0.2, 3.1, 0.8);
2907 auto* clampi1v =
new TGeoVolume(
"TPC_clampi1v", clampi1, m6);
2909 pointstrap[0] = 0.49;
2910 pointstrap[1] = 0.375;
2912 pointstrap[2] = 0.49;
2913 pointstrap[3] = -0.375;
2915 pointstrap[4] = -0.49;
2916 pointstrap[5] = -0.375;
2918 pointstrap[6] = -0.49;
2919 pointstrap[7] = 1.225;
2921 pointstrap[8] = 0.49;
2922 pointstrap[9] = 0.375;
2924 pointstrap[10] = 0.49;
2925 pointstrap[11] = -0.375;
2927 pointstrap[12] = -0.49;
2928 pointstrap[13] = -0.375;
2930 pointstrap[14] = -0.49;
2931 pointstrap[15] = 1.225;
2933 auto* clitrap =
new TGeoArb8(
"clitrap", 0.25, pointstrap);
2934 auto* clitrapv =
new TGeoVolume(
"TPC_clitrapv", clitrap, m6);
2936 auto* clamprot =
new TGeoRotation();
2937 clamprot->RotateX(180.);
2939 new TGeoBBox(
"clibox", 1.125, 3.1, .1);
2940 new TGeoTube(
"clitub", 0., 2.2, 0.1);
2944 auto* clitr1 =
new TGeoTranslation(
"clitr1", 1.125, 0., 0.);
2945 clitr1->RegisterYourself();
2946 auto* clihold =
new TGeoCompositeShape(
"clihold",
"clibox-clitub:clitr1");
2947 auto* cliholdv =
new TGeoVolume(
"TPC_cliholdv", clihold, m6);
2951 TGeoVolume* iclamp =
new TGeoVolumeAssembly(
"TPC_iclamp");
2953 iclamp->AddNode(clampi1v, 1);
2954 iclamp->AddNode(clitrapv, 1,
new TGeoTranslation(0.69, -2.725, 0.35));
2955 iclamp->AddNode(clitrapv, 2,
new TGeoTranslation(0.69, -2.725, -0.35));
2956 iclamp->AddNode(clitrapv, 3,
new TGeoCombiTrans(0.69, 2.725, 0.35, clamprot));
2957 iclamp->AddNode(clitrapv, 4,
new TGeoCombiTrans(0.69, 2.725, -0.35, clamprot));
2958 iclamp->AddNode(cliholdv, 1,
new TGeoTranslation(1.325, 0., 0.));
2962 auto* clampo1 =
new TGeoBBox(
"clampo1", 0.25, 3.1, 1.);
2963 auto* clampo2 =
new TGeoBBox(
"clampo2", 0.4, 0.85, 1.);
2965 auto* clampo1v =
new TGeoVolume(
"TPC_clampo1v", clampo1, m6);
2966 auto* clampo2v =
new TGeoVolume(
"TPC_clampo2v", clampo2, m6);
2968 auto* oclamp =
new TGeoVolumeAssembly(
"TPC_oclamp");
2970 oclamp->AddNode(clampo1v, 1);
2972 oclamp->AddNode(clampo2v, 1,
new TGeoTranslation(0.65, -2.25, 0));
2973 oclamp->AddNode(clampo2v, 2,
new TGeoTranslation(0.65, 2.25, 0));
2976 pointstrap[0] = 0.375;
2977 pointstrap[1] = 0.75;
2978 pointstrap[2] = 0.375;
2979 pointstrap[3] = -0.35;
2980 pointstrap[4] = -0.375;
2981 pointstrap[5] = -0.35;
2982 pointstrap[6] = -0.375;
2983 pointstrap[7] = 0.35;
2985 pointstrap[8] = 0.375;
2986 pointstrap[9] = 0.75;
2987 pointstrap[10] = 0.375;
2988 pointstrap[11] = -0.35;
2989 pointstrap[12] = -0.375;
2990 pointstrap[13] = -0.35;
2991 pointstrap[14] = -0.375;
2992 pointstrap[15] = 0.35;
2994 auto* clotrap =
new TGeoArb8(
"clotrap", 0.25, pointstrap);
2995 auto* clotrapv =
new TGeoVolume(
"TPC_clotrapv", clotrap, m6);
2997 oclamp->AddNode(clotrapv, 1,
new TGeoTranslation(-0.625, -2.75, 0.35));
2998 oclamp->AddNode(clotrapv, 2,
new TGeoTranslation(-0.625, -2.75, -0.35));
2999 oclamp->AddNode(clotrapv, 3,
new TGeoCombiTrans(-0.625, 2.75, 0.35, clamprot));
3000 oclamp->AddNode(clotrapv, 4,
new TGeoCombiTrans(-0.625, 2.75, -0.35, clamprot));
3002 auto* clampo3 =
new TGeoBBox(
"clampo3", 1.6, 0.45, .1);
3003 auto* clampo3v =
new TGeoVolume(
"TPC_clampo3v", clampo3, m6);
3005 oclamp->AddNode(clampo3v, 1,
new TGeoTranslation(-1.85, 2.625, 0.));
3006 oclamp->AddNode(clampo3v, 2,
new TGeoTranslation(-1.85, -2.625, 0));
3008 auto* clampo4 =
new TGeoTubeSeg(
"clampo4", 2.2, 3.1, 0.1, 90., 270.);
3009 auto* clampo4v =
new TGeoVolume(
"TPC_clampo4v", clampo4, m6);
3011 oclamp->AddNode(clampo4v, 1,
new TGeoTranslation(-3.45, 0., 0.));
3015 TGeoRotation rot102(
"rot102");
3016 rot102.RotateY(-90.);
3018 for (Int_t
i = 0;
i < 18;
i++) {
3021 angle = TMath::DegToRad() * 20. * (Double_t)
i;
3027 auto* rot12 =
new TGeoRotation();
3028 rot12->RotateZ(-90.0 +
i * 20.);
3029 v9->AddNode(tpcihpl,
i + 1,
new TGeoCombiTrans(
x,
y, 0., rot12));
3032 rotrod.RotateZ(-90. +
i * 20.);
3033 rotrod1[0] =
new TGeoRotation();
3034 rotpos[0] =
new TGeoRotation();
3036 rotrod1[0]->RotateZ(90. +
i * 20.);
3037 *rotpos[0] = refl * rotrod;
3038 v9->AddNode(tpcrrod, 1,
new TGeoCombiTrans(
x,
y,
z, rotrod1[0]));
3039 v9->AddNode(tpcrrod, 2,
new TGeoCombiTrans(
x,
y, -
z, rotpos[0]));
3041 v9->AddNode(tpcmrod,
i + 1,
new TGeoTranslation(
x,
y,
z));
3042 v9->AddNode(tpcmrod,
i + 19,
new TGeoCombiTrans(
x,
y, -
z,
ref));
3050 rot12 =
new TGeoRotation();
3051 rot12->RotateZ(
i * 20.);
3054 v9->AddNode(iclamp, 7 *
i + 1,
new TGeoCombiTrans(
x,
y, 5.25, rot12));
3055 v9->AddNode(iclamp, 7 *
i + 2,
new TGeoCombiTrans(
x,
y, 38.25, rot12));
3056 v9->AddNode(iclamp, 7 *
i + 3,
new TGeoCombiTrans(
x,
y, 80.25, rot12));
3057 v9->AddNode(iclamp, 7 *
i + 4,
new TGeoCombiTrans(
x,
y, 122.25, rot12));
3058 v9->AddNode(iclamp, 7 *
i + 5,
new TGeoCombiTrans(
x,
y, 164.25, rot12));
3059 v9->AddNode(iclamp, 7 *
i + 6,
new TGeoCombiTrans(
x,
y, 206.25, rot12));
3060 v9->AddNode(iclamp, 7 *
i + 7,
new TGeoCombiTrans(
x,
y, 246.75, rot12));
3062 v9->AddNode(iclamp, 7 *
i + 127,
new TGeoCombiTrans(
x,
y, -5.25, rot12));
3063 v9->AddNode(iclamp, 7 *
i + 128,
new TGeoCombiTrans(
x,
y, -38.25, rot12));
3064 v9->AddNode(iclamp, 7 *
i + 129,
new TGeoCombiTrans(
x,
y, -80.25, rot12));
3065 v9->AddNode(iclamp, 7 *
i + 130,
new TGeoCombiTrans(
x,
y, -122.25, rot12));
3066 v9->AddNode(iclamp, 7 *
i + 131,
new TGeoCombiTrans(
x,
y, -164.25, rot12));
3067 v9->AddNode(iclamp, 7 *
i + 132,
new TGeoCombiTrans(
x,
y, -206.25, rot12));
3068 v9->AddNode(iclamp, 7 *
i + 133,
new TGeoCombiTrans(
x,
y, -246.75, rot12));
3080 auto* rot33 =
new TGeoRotation();
3081 rot33->RotateZ(-90 +
i * 20.);
3083 v9->AddNode(tpcohpl,
i + 1,
new TGeoCombiTrans(
x,
y, 0., rot33));
3085 Double_t xxx = 256.297 * TMath::Cos((
i * 20. + 10.) * TMath::DegToRad());
3086 Double_t yyy = 256.297 * TMath::Sin((
i * 20. + 10.) * TMath::DegToRad());
3088 TGeoRotation rot101(
"rot101");
3089 rot101.RotateZ(90. +
i * 20. + 10.);
3090 auto* rot103 =
new TGeoRotation(
"rot103");
3091 *rot103 = rot101 * rot102;
3093 auto* trh100 =
new TGeoCombiTrans(xxx, yyy, 0., rot103);
3097 v9->AddNode(tpcmmh, 1, trh100);
3100 v9->AddNode(tpcomh,
i + 1, trh100);
3105 rotrod.RotateZ(90. +
i * 20.);
3106 rotrod1[1] =
new TGeoRotation();
3107 rotpos[1] =
new TGeoRotation();
3108 rotrod1[1]->RotateZ(90. +
i * 20.);
3109 *rotpos[1] = refl * rotrod;
3110 v9->AddNode(tpcrrod, 3,
new TGeoCombiTrans(
x,
y,
z, rotrod1[1]));
3111 v9->AddNode(tpcrrod, 4,
new TGeoCombiTrans(
x,
y, -
z, rotpos[1]));
3113 v9->AddNode(tpcmrod,
i + 37,
new TGeoTranslation(
x,
y,
z));
3114 v9->AddNode(tpcmrod,
i + 55,
new TGeoCombiTrans(
x,
y, -
z,
ref));
3117 v9->AddNode(hvrv, 1,
new TGeoTranslation(
x,
y,
z + 0.7));
3125 rot12 =
new TGeoRotation();
3126 rot12->RotateZ(
i * 20.);
3129 v9->AddNode(oclamp, 7 *
i + 1,
new TGeoCombiTrans(
x,
y, 5.25, rot12));
3130 v9->AddNode(oclamp, 7 *
i + 2,
new TGeoCombiTrans(
x,
y, 38.25, rot12));
3131 v9->AddNode(oclamp, 7 *
i + 3,
new TGeoCombiTrans(
x,
y, 80.25, rot12));
3132 v9->AddNode(oclamp, 7 *
i + 4,
new TGeoCombiTrans(
x,
y, 122.25, rot12));
3133 v9->AddNode(oclamp, 7 *
i + 5,
new TGeoCombiTrans(
x,
y, 164.25, rot12));
3134 v9->AddNode(oclamp, 7 *
i + 6,
new TGeoCombiTrans(
x,
y, 206.25, rot12));
3135 v9->AddNode(oclamp, 7 *
i + 7,
new TGeoCombiTrans(
x,
y, 246.75, rot12));
3137 v9->AddNode(oclamp, 7 *
i + 127,
new TGeoCombiTrans(
x,
y, -5.25, rot12));
3138 v9->AddNode(oclamp, 7 *
i + 128,
new TGeoCombiTrans(
x,
y, -38.25, rot12));
3139 v9->AddNode(oclamp, 7 *
i + 129,
new TGeoCombiTrans(
x,
y, -80.25, rot12));
3140 v9->AddNode(oclamp, 7 *
i + 130,
new TGeoCombiTrans(
x,
y, -122.25, rot12));
3141 v9->AddNode(oclamp, 7 *
i + 131,
new TGeoCombiTrans(
x,
y, -164.25, rot12));
3142 v9->AddNode(oclamp, 7 *
i + 132,
new TGeoCombiTrans(
x,
y, -206.25, rot12));
3143 v9->AddNode(oclamp, 7 *
i + 133,
new TGeoCombiTrans(
x,
y, -246.75, rot12));
3147 TGeoVolume* alice = gGeoManager->GetVolume(
"barrel");
3148 alice->AddNode(
v1, 1,
new TGeoTranslation(0., 30., 0.));
3152void Detector::LoadGeometryFromFile()
3155 if (mGeoFileName.IsNull()) {
3156 LOG(fatal) <<
"TPC geometry file name not set";
3160 TFile* fGeoFile = TFile::Open(mGeoFileName);
3161 if (!fGeoFile || !fGeoFile->IsOpen() || fGeoFile->IsZombie()) {
3162 LOG(fatal) <<
"Could not open TPC geometry file '" << mGeoFileName <<
"'";
3166 TGeoVolume* tpcVolume =
dynamic_cast<TGeoVolume*
>(fGeoFile->Get(
"TPC_M"));
3168 LOG(fatal) <<
"Could not retrieve TPC geometry from file '" << mGeoFileName <<
"'";
3172 LOG(info) <<
"Loaded TPC geometry from file '" << mGeoFileName <<
"'";
3173 TGeoVolume* alice = gGeoManager->GetVolume(
"barrel");
3174 alice->AddNode(tpcVolume, 1,
new TGeoTranslation(0., 30., 0.));
3177void Detector::defineSensitiveVolumes()
3179 TGeoManager* geoManager = gGeoManager;
3180 TGeoVolume*
v =
nullptr;
3184 const Int_t nSensitive = 1;
3185 const char* volumeNames[nSensitive] = {
"TPC_Drift"};
3188 for (Int_t ivol = 0; ivol < nSensitive; ++ivol) {
3189 TString volumeName = volumeNames[ivol];
3190 v = geoManager->GetVolume(volumeName.Data());
3192 LOG(error) <<
"Could not find volume '" << volumeName <<
"'";
3197 AddSensitiveVolume(
v);
3201 auto vmc = TVirtualMC::GetMC();
3202 if (strcmp(vmc->GetName(),
"TFluka") == 0) {
3203 LOG(info) <<
"Setting special FLUKA parameters for TPC Driftgas";
3205 Int_t
index = mgr.getMediumID(
"TPC", kDriftGas2);
3206 vmc->Gstpar(
index,
"PRIMIO_E", 20.77);
3207 vmc->Gstpar(
index,
"PRIMIO_N", 14.35);
3208 vmc->Gstpar(
index,
"LOSS", 14);
3209 vmc->Gstpar(
index,
"STRA", 4);
3215 static thread_local Double_t
n = 0;
3216 static thread_local Double_t c1 = 0;
3217 static thread_local Double_t c2 = 0;
3218 static thread_local Double_t b1 = 0;
3219 static thread_local Double_t b2 = 0;
3223 }
else if (k >= 0.4 && k < 4) {
3224 n = 1. / k + (k - 0.4) / k / 3.6;
3225 }
else if (k >= 4.) {
3226 n = 1. / TMath::Sqrt(k);
3230 c1 = (k < 0.4) ? 0 : b1 * (TMath::Log(b1) - 1.) / 2.;
3231 c2 = b2 * (TMath::Log(b2) - 1.) / 2.;
3236 Double_t nu1 = gRandom->Rndm();
3237 Double_t nu2 = gRandom->Rndm();
3238 Double_t w1 = c1 + TMath::Log(nu1);
3239 Double_t w2 = c2 + TMath::Log(nu2);
3240 y =
n * (b1 * w2 - b2 * w1);
3245 if (TMath::Log(
y) >=
x) {
3249 return TMath::Exp(
x);
3256 name.Form(
"%sHitsShiftedSector%d", GetName(), probe);
3257 return std::string(
name.Data());
3259 return std::string();
3265 auto const& detParam = ParameterDetector::Instance();
3266 LOG(info) <<
"TPC SetSpecialPhysicsCuts: UseGeant4Edep=" << detParam.UseGeant4Edep;
3267 if (detParam.UseGeant4Edep) {
3269 const float specialCut = detParam.SpecialCutsGeV;
3270 for (
int med : {(int)kDriftGas1, (
int)kDriftGas2, (int)kCO2}) {