226 const double rndm = fMC->GetRandom()->Rndm();
227 const double eDep = TMath::Power((kMax - kMin) * rndm + kMin, oneOverAlpha_p1);
228 int nel_step =
static_cast<int>(((eDep - eMin) / wIon) + 1);
229 nel_step = TMath::Min(nel_step, 300);
230 numberOfElectrons += nel_step;
237 if (numberOfElectrons <= 0) {
242 static thread_local int oldTrackId = trackID;
243 static thread_local int oldDetId = detID;
244 static thread_local int groupCounter = 0;
245 static thread_local int oldSectorId = sectorID;
248 static thread_local HitGroup* currentgroup =
nullptr;
249 if (groupCounter == 0) {
250 mHitsPerSectorCollection[sectorID]->emplace_back(trackID);
251 currentgroup = &(mHitsPerSectorCollection[sectorID]->back());
253 if (trackID == oldTrackId && oldSectorId == sectorID) {
256 mElectronCounter += numberOfElectrons;
257 currentgroup->
addHit(position.X(), position.Y(), position.Z(),
time, numberOfElectrons);
260 if (mHitLast.GetEnergyLoss() >= 0) {
261 currentgroup->
addHit(mHitLast.GetX(), mHitLast.GetY(), mHitLast.GetZ(), mHitLast.GetTime(), mHitLast.GetEnergyLoss());
262 mHitLast.mELoss = -1;
265 mElectronCounter += mHitLast.GetEnergyLoss();
270 oldTrackId = trackID;
271 oldSectorId = sectorID;
275 mHitLast =
ElementalHit(position.X(), position.Y(), position.Z(),
time, numberOfElectrons);
287 stack->addHit(GetDetId());
296 mHitsPerSectorCollection[
i]->clear();
309 auto* mgr = FairRootManager::Instance();
319 mHitsPerSectorCollection[
i]->clear();
330 ConstructTPCGeometry();
333void Detector::CreateMaterials()
343 const auto& gasParam = ParameterGas::Instance();
357 const Double_t pressure = gasParam.Pressure;
358 const Double_t temperature = gasParam.Temperature + 273.15;
361 const Double_t
t1 = 293.15;
362 const Double_t
p1 = 1013.25;
365 Double_t ptCorr = 1.;
366 if (TMath::Abs(temperature - 293.15) > 10. || TMath::Abs(pressure - 1000.) > 200.) {
369 ptCorr = (pressure *
t1) / (
p1 * temperature);
371 LOG(info) <<
"Setting gas density correction to: " << ptCorr;
421 TString names[6] = {
"Ne",
"Ar",
"CO2",
"N",
"CF4",
"CH4"};
426 Float_t comp[6] = {90. / 105., 0., 10. / 105., 5. / 105., 0., 0.};
457 wmol[3] = 2. * 14.0067;
462 for (Int_t
i = 0;
i < 6;
i++) {
463 wtot += *(comp +
i) * wmol[
i];
465 wmat[0] = comp[0] * amat[0] / wtot;
466 wmat[1] = comp[1] * amat[1] / wtot;
467 wmat[2] = (comp[2] * amat[2] + comp[4] * amat[2] + comp[5] * amat[2]) / wtot;
468 wmat[3] = comp[2] * amat[3] * 2. / wtot;
469 wmat[4] = comp[3] * amat[4] * 2. / wtot;
470 wmat[5] = comp[4] * amat[5] * 4. / wtot;
471 wmat[6] = comp[5] * amat[6] * 4. / wtot;
475 Float_t dens[6] = {0.839e-3, 1.661e-3, 1.842e-3, 1.165e-3, 3.466e-3, 0.668e-3};
478 for (Int_t
i = 0;
i < 6;
i++) {
479 density += comp[
i] * dens[
i];
485 for (Int_t
i = 0;
i < 6;
i++) {
494 TString gname1, gname2, gname3;
495 gname1 = gname +
"-1";
496 gname2 = gname +
"-2";
497 gname3 = gname +
"-3";
501 Float_t amat1[6], zmat1[6], wmat1[6];
503 for (Int_t
i = 0;
i < 7;
i++) {
505 zmat1[cnt] = zmat[
i];
506 amat1[cnt] = amat[
i];
507 wmat1[cnt] = wmat[
i];
910 o2::base::Detector::Medium(kAir,
"Air", 11, 0, iSXFLD, sXMGMX, 10., 999., .1, .01, .1);
911 o2::base::Detector::Medium(kDriftGas1,
"DriftGas1", 12, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
912 o2::base::Detector::Medium(kDriftGas2,
"DriftGas2", 13, 1, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
913 o2::base::Detector::Medium(kCO2,
"CO2", 10, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
914 o2::base::Detector::Medium(kDriftGas3,
"DriftGas3", 40, 1, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
919 o2::base::Detector::Medium(kAl,
"Al", 23, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
920 o2::base::Detector::Medium(kKevlar,
"Kevlar", 14, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
921 o2::base::Detector::Medium(kNomex,
"Nomex", 15, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
922 o2::base::Detector::Medium(kMakrolon,
"Makrolon", 16, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
923 o2::base::Detector::Medium(kMylar,
"Mylar", 18, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
924 o2::base::Detector::Medium(kTedlar,
"Tedlar", 17, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
926 o2::base::Detector::Medium(kPrepreg1,
"Prepreg1", 19, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
927 o2::base::Detector::Medium(kPrepreg2,
"Prepreg2", 20, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
928 o2::base::Detector::Medium(kPrepreg3,
"Prepreg3", 21, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
929 o2::base::Detector::Medium(kEpoxy,
"Epoxy", 26, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
931 o2::base::Detector::Medium(kCu,
"Cu", 25, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
932 o2::base::Detector::Medium(kSi,
"Si", 24, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
933 o2::base::Detector::Medium(kG10,
"G10", 22, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
934 o2::base::Detector::Medium(kPlexiglas,
"Plexiglas", 27, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
935 o2::base::Detector::Medium(kSteel,
"Steel", 29, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
936 o2::base::Detector::Medium(kPeek,
"Peek", 30, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
937 o2::base::Detector::Medium(kAlumina,
"Alumina", 31, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
938 o2::base::Detector::Medium(kWater,
"Water", 32, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
939 o2::base::Detector::Medium(kBrass,
"Brass", 33, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
940 o2::base::Detector::Medium(kEpoxyfm,
"Epoxyfm", 34, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
941 o2::base::Detector::Medium(kEpoxy1,
"Epoxy1", 35, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
942 o2::base::Detector::Medium(kAlumina1,
"Alumina1", 36, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
945void Detector::ConstructTPCGeometry()
979 auto* tpc =
new TGeoPcon(0., 360., 30);
981 tpc->DefineSection(0, -289.6, 77., 278.);
982 tpc->DefineSection(1, -262.1, 77., 278.);
984 tpc->DefineSection(2, -262.1, 83.1, 278.);
985 tpc->DefineSection(3, -260., 83.1, 278.);
987 tpc->DefineSection(4, -260., 70., 278.);
988 tpc->DefineSection(5, -259.6, 70., 278.);
990 tpc->DefineSection(6, -259.6, 68.1, 278.);
991 tpc->DefineSection(7, -253.6, 68.1, 278.);
993 tpc->DefineSection(8, -253.6, 67.88, 278.);
994 tpc->DefineSection(9, -74.0, 60.68, 278.);
996 tpc->DefineSection(10, -74.0, 60.1, 278.);
997 tpc->DefineSection(11, -73.3, 60.1, 278.);
999 tpc->DefineSection(12, -73.3, 56.9, 278.);
1000 tpc->DefineSection(13, -68.5, 56.9, 278.);
1002 tpc->DefineSection(14, -68.5, 60., 278.);
1003 tpc->DefineSection(15, -64.7, 60., 278.);
1005 tpc->DefineSection(16, -64.7, 56.9, 278.);
1006 tpc->DefineSection(17, 73.3, 56.9, 278.);
1008 tpc->DefineSection(18, 73.3, 60.1, 278.);
1009 tpc->DefineSection(19, 74.0, 60.1, 278.);
1011 tpc->DefineSection(20, 74.0, 60.68, 278.);
1012 tpc->DefineSection(21, 253.6, 65.38, 278.);
1014 tpc->DefineSection(22, 253.6, 65.6, 278.);
1015 tpc->DefineSection(23, 259.6, 65.6, 278.);
1017 tpc->DefineSection(24, 259.6, 70.0, 278.);
1018 tpc->DefineSection(25, 260., 70.0, 278.);
1020 tpc->DefineSection(26, 260., 83.1, 278.);
1021 tpc->DefineSection(27, 262.1, 83.1, 278.);
1023 tpc->DefineSection(28, 262.1, 77., 278);
1024 tpc->DefineSection(29, 289.6, 77., 278.);
1026 TGeoMedium*
m1 = gGeoManager->GetMedium(
"TPC_Air");
1027 auto*
v1 =
new TGeoVolume(
"TPC_M", tpc, m1);
1032 auto* dvol =
new TGeoPcon(0., 360., 6);
1033 dvol->DefineSection(0, -260., 74.5, 264.4);
1034 dvol->DefineSection(1, -253.6, 74.5, 264.4);
1036 dvol->DefineSection(2, -253.6, 76.6774, 258.);
1037 dvol->DefineSection(3, 253.6, 76.6774, 258.);
1039 dvol->DefineSection(4, 253.6, 74.5, 264.4);
1040 dvol->DefineSection(5, 260., 74.5, 264.4);
1042 TGeoMedium*
m5 = gGeoManager->GetMedium(
"TPC_DriftGas2");
1043 auto* v9 =
new TGeoVolume(
"TPC_Drift", dvol, m5);
1049 auto* tpco =
new TGeoPcon(0., 360., 6);
1051 tpco->DefineSection(0, -256.6, 264.8, 278.);
1052 tpco->DefineSection(1, -253.6, 264.8, 278.);
1054 tpco->DefineSection(2, -253.6, 258., 278.);
1055 tpco->DefineSection(3, 250.6, 258., 278.);
1057 tpco->DefineSection(4, 250.6, 258., 275.5);
1058 tpco->DefineSection(5, 253.6, 258., 275.5);
1060 TGeoMedium*
m2 = gGeoManager->GetMedium(
"TPC_CO2");
1061 auto*
v2 =
new TGeoVolume(
"TPC_OI", tpco, m2);
1063 TGeoRotation* segrot;
1067 auto* tocv =
new TGeoPcon(0., 360., 6);
1069 tocv->DefineSection(0, -256.6, 264.8, 278.);
1070 tocv->DefineSection(1, -253.6, 264.8, 278.);
1072 tocv->DefineSection(2, -253.6, 274.8124, 278.);
1073 tocv->DefineSection(3, 247.6, 274.8124, 278.);
1075 tocv->DefineSection(4, 247.6, 270.4, 278.);
1076 tocv->DefineSection(5, 250.6, 270.4, 278.);
1078 TGeoMedium*
m3 = gGeoManager->GetMedium(
"TPC_Al");
1079 auto*
v3 =
new TGeoVolume(
"TPC_OCV", tocv, m3);
1081 auto* to1 =
new TGeoTubeSeg(274.8174, 277.995, 252.1, 0., 59.9);
1082 auto* to2 =
new TGeoTubeSeg(274.8274, 277.985, 252.1, 0., 59.9);
1083 auto* to3 =
new TGeoTubeSeg(274.8312, 277.9812, 252.1, 0., 59.9);
1084 auto* to4 =
new TGeoTubeSeg(274.9062, 277.9062, 252.1, 0., 59.9);
1085 auto* tog5 =
new TGeoTubeSeg(274.8174, 277.995, 252.1, 59.9, 60.);
1087 TGeoMedium* sm1 = gGeoManager->GetMedium(
"TPC_Epoxy");
1088 TGeoMedium* sm2 = gGeoManager->GetMedium(
"TPC_Tedlar");
1089 TGeoMedium* sm3 = gGeoManager->GetMedium(
"TPC_Prepreg2");
1090 TGeoMedium* sm4 = gGeoManager->GetMedium(
"TPC_Nomex");
1092 TGeoMedium* smep = gGeoManager->GetMedium(
"TPC_Epoxy1");
1094 auto* tov1 =
new TGeoVolume(
"TPC_OCV1", to1, sm1);
1095 auto* tov2 =
new TGeoVolume(
"TPC_OCV2", to2, sm2);
1096 auto* tov3 =
new TGeoVolume(
"TPC_OCV3", to3, sm3);
1097 auto* tov4 =
new TGeoVolume(
"TPC_OCV4", to4, sm4);
1098 auto* togv5 =
new TGeoVolume(
"TPC_OCVG5", tog5, sm1);
1100 TGeoMedium* mhs = gGeoManager->GetMedium(
"TPC_Steel");
1101 TGeoMedium* m12 = gGeoManager->GetMedium(
"TPC_Water");
1107 auto* tofc =
new TGeoPcon(0., 360., 6);
1109 tofc->DefineSection(0, -253.6, 258., 269.6);
1110 tofc->DefineSection(1, -250.6, 258., 269.6);
1112 tofc->DefineSection(2, -250.6, 258., 260.0676);
1113 tofc->DefineSection(3, 250.6, 258., 260.0676);
1115 tofc->DefineSection(4, 250.6, 258., 275.5);
1116 tofc->DefineSection(5, 253.6, 258., 275.5);
1118 auto* v4 =
new TGeoVolume(
"TPC_TOFC", tofc, m3);
1120 auto* tf1 =
new TGeoTubeSeg(258.0, 260.0676, 252.1, 0., 59.9);
1121 auto* tf2 =
new TGeoTubeSeg(258.0038, 260.0638, 252.1, 0., 59.9);
1122 auto* tf3 =
new TGeoTubeSeg(258.0338, 260.0338, 252.1, 0., 59.9);
1123 auto* tfg4 =
new TGeoTubeSeg(258.0, 260.0676, 252.1, 59.9, 60.);
1125 TGeoMedium* sm5 = gGeoManager->GetMedium(
"TPC_Prepreg3");
1127 auto* tf1v =
new TGeoVolume(
"TPC_OFC1", tf1, sm2);
1128 auto* tf2v =
new TGeoVolume(
"TPC_OFC2", tf2, sm5);
1129 auto* tf3v =
new TGeoVolume(
"TPC_OFC3", tf3, sm4);
1130 auto* tfg4v =
new TGeoVolume(
"TPC_OFCG4", tfg4, smep);
1134 tov1->AddNode(tov2, 1);
1135 tov2->AddNode(tov3, 1);
1136 tov3->AddNode(tov4, 1);
1138 tf1v->AddNode(tf2v, 1);
1139 tf2v->AddNode(tf3v, 1);
1141 auto* t200 =
new TGeoVolumeAssembly(
"TPC_OCVSEG");
1142 auto* t300 =
new TGeoVolumeAssembly(
"TPC_OFCSEG");
1147 t200->AddNode(tov1, 1);
1148 t200->AddNode(togv5, 1);
1149 t300->AddNode(tf1v, 1);
1150 t300->AddNode(tfg4v, 1);
1152 segrot =
new TGeoRotation();
1153 segrot->RotateZ(60.);
1154 t200->AddNode(tov1, 2, segrot);
1155 t200->AddNode(togv5, 2, segrot);
1156 t300->AddNode(tf1v, 2, segrot);
1157 t300->AddNode(tfg4v, 2, segrot);
1159 segrot =
new TGeoRotation();
1160 segrot->RotateZ(120.);
1161 t200->AddNode(tov1, 3, segrot);
1162 t200->AddNode(togv5, 3, segrot);
1163 t300->AddNode(tf1v, 3, segrot);
1164 t300->AddNode(tfg4v, 3, segrot);
1166 segrot =
new TGeoRotation();
1167 segrot->RotateZ(180.);
1168 t200->AddNode(tov1, 4, segrot);
1169 t200->AddNode(togv5, 4, segrot);
1170 t300->AddNode(tf1v, 4, segrot);
1171 t300->AddNode(tfg4v, 4, segrot);
1173 segrot =
new TGeoRotation();
1174 segrot->RotateZ(240.);
1175 t200->AddNode(tov1, 5, segrot);
1176 t200->AddNode(togv5, 5, segrot);
1177 t300->AddNode(tf1v, 5, segrot);
1178 t300->AddNode(tfg4v, 5, segrot);
1180 segrot =
new TGeoRotation();
1181 segrot->RotateZ(300.);
1182 t200->AddNode(tov1, 6, segrot);
1183 t200->AddNode(togv5, 6, segrot);
1184 t300->AddNode(tf1v, 6, segrot);
1185 t300->AddNode(tfg4v, 6, segrot);
1187 v3->AddNode(t200, 1,
new TGeoTranslation(0., 0., -1.5));
1188 v4->AddNode(t300, 1);
1197 auto* ogri =
new TGeoTube(257.985, 258., 0.6);
1198 auto* ogro =
new TGeoTube(260.0676, 260.0826, 0.6);
1200 auto* ogriv =
new TGeoVolume(
"TPC_OGRI", ogri, m3);
1201 auto* ogrov =
new TGeoVolume(
"TPC_OGRO", ogro, m3);
1203 for (Int_t
i = 0;
i < 24;
i++) {
1204 v9->AddNode(ogriv, (
i + 1),
new TGeoTranslation(0., 0., (
i + 1) * 10));
1205 v9->AddNode(ogriv, (
i + 25),
new TGeoTranslation(0., 0., -(
i + 1) * 10));
1206 v2->AddNode(ogrov, (
i + 1),
new TGeoTranslation(0., 0., (
i + 1) * 10));
1207 v2->AddNode(ogrov, (
i + 25),
new TGeoTranslation(0., 0., -(
i + 1) * 10));
1214 auto* tpci =
new TGeoPcon(0., 360., 4);
1216 tpci->DefineSection(0, -253.6, 68.4, 76.6774);
1217 tpci->DefineSection(1, -74.0, 61.2, 76.6774);
1219 tpci->DefineSection(2, 74.0, 61.2, 76.6774);
1221 tpci->DefineSection(3, 253.6, 65.9, 76.6774);
1223 auto* v5 =
new TGeoVolume(
"TPC_INI", tpci, m2);
1227 auto* tif1 =
new TGeoTube(69.9, 76.6774, 1.5);
1228 auto* v6 =
new TGeoVolume(
"TPC_IFC1", tif1, m3);
1233 auto* tcms =
new TGeoPcon(0., 360., 10);
1235 tcms->DefineSection(0, -259.1, 68.1, 74.2);
1236 tcms->DefineSection(1, -253.6, 68.1, 74.2);
1238 tcms->DefineSection(2, -253.6, 68.1, 68.4);
1239 tcms->DefineSection(3, -74.0, 60.9, 61.2);
1241 tcms->DefineSection(4, -74.0, 60.1, 61.2);
1242 tcms->DefineSection(5, -73.3, 60.1, 61.2);
1244 tcms->DefineSection(6, -73.3, 56.9, 61.2);
1245 tcms->DefineSection(7, -73.0, 56.9, 61.2);
1247 tcms->DefineSection(8, -73.0, 56.9, 58.8);
1248 tcms->DefineSection(9, -71.3, 56.9, 58.8);
1250 auto* v7 =
new TGeoVolume(
"TPC_ICVM", tcms, m3);
1255 auto* thsm =
new TGeoCone(89.8, 67.88, 68.1, 60.68, 60.9);
1256 auto* thsmw =
new TGeoCone(89.8, 67.94, 68.04, 60.74, 60.84);
1257 auto* hvsm =
new TGeoVolume(
"TPC_HSM", thsm, mhs);
1258 auto* hvsmw =
new TGeoVolume(
"TPC_HSMW", thsmw, m12);
1260 hvsm->AddNode(hvsmw, 1);
1264 auto* tcss =
new TGeoPcon(0., 360., 10);
1266 tcss->DefineSection(0, 71.3, 56.9, 58.8);
1267 tcss->DefineSection(1, 73.0, 56.9, 58.8);
1269 tcss->DefineSection(2, 73.0, 56.9, 61.2);
1270 tcss->DefineSection(3, 73.3, 56.9, 61.2);
1272 tcss->DefineSection(4, 73.3, 60.1, 61.2);
1273 tcss->DefineSection(5, 74.0, 60.1, 61.2);
1275 tcss->DefineSection(6, 74.0, 60.9, 61.2);
1276 tcss->DefineSection(7, 253.6, 65.6, 65.9);
1278 tcss->DefineSection(8, 253.6, 65.6, 74.2);
1279 tcss->DefineSection(9, 258.1, 65.6, 74.2);
1281 auto* v8 =
new TGeoVolume(
"TPC_ICVS", tcss, m3);
1285 auto* thss =
new TGeoCone(89.8, 60.68, 60.9, 65.38, 65.6);
1286 auto* thssw =
new TGeoCone(89.8, 60.74, 60.84, 65.44, 65.54);
1287 auto* hvss =
new TGeoVolume(
"TPC_HSS", thss, mhs);
1288 auto* hvssw =
new TGeoVolume(
"TPC_HSSW", thssw, m12);
1290 hvss->AddNode(hvssw, 1);
1296 auto*
t1 =
new TGeoTube(76.6774, 78.845, 0.75);
1297 auto* tv1 =
new TGeoVolume(
"TPC_IFC2",
t1, m3);
1302 auto* t2 =
new TGeoTubeSeg(76.6774, 78.845, 74.175, 350., 109.4);
1303 auto* t3 =
new TGeoTubeSeg(76.6812, 78.8412, 74.175, 350., 109.4);
1304 auto* t4 =
new TGeoTubeSeg(76.7312, 78.7912, 74.175, 350., 109.4);
1305 auto* t5 =
new TGeoTubeSeg(76.7612, 78.7612, 74.175, 350., 109.4);
1306 auto* tepox1 =
new TGeoTubeSeg(76.6774, 78.845, 74.175, 109.4, 110.);
1307 auto* tpr1 =
new TGeoTubeSeg(78.845, 78.885, 74.175, 109., 111.);
1310 auto* tv2 =
new TGeoVolume(
"TPC_IFC3", t2, sm2);
1311 auto* tv3 =
new TGeoVolume(
"TPC_IFC4", t3, sm3);
1312 auto* tv4 =
new TGeoVolume(
"TPC_IFC5", t4, sm5);
1313 auto* tv5 =
new TGeoVolume(
"TPC_IFC6", t5, sm4);
1314 auto* tvep1 =
new TGeoVolume(
"TPC_IFEPOX1", tepox1, smep);
1315 auto* tvpr1 =
new TGeoVolume(
"TPC_PRSTR1", tpr1, sm2);
1321 auto* t6 =
new TGeoTubeSeg(76.6774, 78.795, 5., 350., 109.4);
1322 auto* t7 =
new TGeoTubeSeg(76.6812, 78.7912, 5., 350., 109.4);
1323 auto* t8 =
new TGeoTubeSeg(76.7062, 78.7662, 5., 350., 109.4);
1324 auto* t9 =
new TGeoTubeSeg(76.7362, 78.7362, 5., 350., 109.4);
1325 auto* tepox2 =
new TGeoTubeSeg(76.6774, 78.795, 5., 109.4, 110.);
1326 auto* tpr2 =
new TGeoTubeSeg(78.795, 78.835, 5., 109., 111.);
1328 auto* tv6 =
new TGeoVolume(
"TPC_IFC7", t6, sm2);
1329 auto* tv7 =
new TGeoVolume(
"TPC_IFC8", t7, sm3);
1330 auto* tv8 =
new TGeoVolume(
"TPC_IFC9", t8, sm5);
1331 auto* tv9 =
new TGeoVolume(
"TPC_IFC10", t9, sm4);
1332 auto* tvep2 =
new TGeoVolume(
"TPC_IFEPOX2", tepox2, smep);
1333 auto* tvpr2 =
new TGeoVolume(
"TPC_PRSTR2", tpr2, sm2);
1338 auto* t10 =
new TGeoTubeSeg(76.6774, 78.785, 93.75, 350., 109.4);
1339 auto* t11 =
new TGeoTubeSeg(76.6812, 78.7812, 93.75, 350., 109.4);
1340 auto* t12 =
new TGeoTubeSeg(76.7312, 78.7312, 93.75, 350., 109.4);
1341 auto* tepox3 =
new TGeoTubeSeg(76.6774, 78.785, 93.75, 109.4, 110.);
1342 auto* tpr3 =
new TGeoTubeSeg(78.785, 78.825, 93.75, 109., 111.);
1344 auto* tv10 =
new TGeoVolume(
"TPC_IFC11", t10, sm2);
1345 auto* tv11 =
new TGeoVolume(
"TPC_IFC12", t11, sm5);
1346 auto* tv12 =
new TGeoVolume(
"TPC_IFC13", t12, sm4);
1347 auto* tvep3 =
new TGeoVolume(
"TPC_IFEPOX3", tepox3, smep);
1348 auto* tvpr3 =
new TGeoVolume(
"TPC_PRSTR3", tpr3, sm2);
1352 tv2->AddNode(tv3, 1);
1353 tv3->AddNode(tv4, 1);
1354 tv4->AddNode(tv5, 1);
1358 tv6->AddNode(tv7, 1);
1359 tv7->AddNode(tv8, 1);
1360 tv8->AddNode(tv9, 1);
1364 tv10->AddNode(tv11, 1);
1365 tv11->AddNode(tv12, 1);
1367 auto* tv100 =
new TGeoVolumeAssembly(
"TPC_IFC");
1373 tv100->AddNode(tv10, 1);
1374 tv100->AddNode(tvep3, 1);
1375 tv100->AddNode(tvpr3, 1);
1377 tv100->AddNode(tv6, 1,
new TGeoTranslation(0., 0., -98.75));
1378 tv100->AddNode(tv6, 2,
new TGeoTranslation(0., 0., 98.75));
1379 tv100->AddNode(tvep2, 1,
new TGeoTranslation(0., 0., -98.75));
1380 tv100->AddNode(tvep2, 2,
new TGeoTranslation(0., 0., 98.75));
1381 tv100->AddNode(tvpr2, 1,
new TGeoTranslation(0., 0., -98.75));
1382 tv100->AddNode(tvpr2, 2,
new TGeoTranslation(0., 0., 98.75));
1384 tv100->AddNode(tv2, 1,
new TGeoTranslation(0., 0., -177.925));
1385 tv100->AddNode(tv2, 2,
new TGeoTranslation(0., 0., 177.925));
1386 tv100->AddNode(tvep1, 1,
new TGeoTranslation(0., 0., -177.925));
1387 tv100->AddNode(tvep1, 2,
new TGeoTranslation(0., 0., 177.925));
1388 tv100->AddNode(tvpr1, 1,
new TGeoTranslation(0., 0., -177.925));
1389 tv100->AddNode(tvpr1, 2,
new TGeoTranslation(0., 0., -177.925));
1393 segrot =
new TGeoRotation();
1394 segrot->RotateZ(120.);
1397 tv100->AddNode(tv10, 2, segrot);
1398 tv100->AddNode(tvep3, 2, segrot);
1399 tv100->AddNode(tvpr3, 2, segrot);
1401 tv100->AddNode(tv6, 3,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1402 tv100->AddNode(tv6, 4,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1403 tv100->AddNode(tvep2, 3,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1404 tv100->AddNode(tvep2, 4,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1405 tv100->AddNode(tvpr2, 3,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1406 tv100->AddNode(tvpr2, 4,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1408 tv100->AddNode(tv2, 3,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1409 tv100->AddNode(tv2, 4,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1410 tv100->AddNode(tvep1, 3,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1411 tv100->AddNode(tvep1, 4,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1412 tv100->AddNode(tvpr1, 3,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1413 tv100->AddNode(tvpr1, 4,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1417 segrot =
new TGeoRotation();
1418 segrot->RotateZ(240.);
1421 tv100->AddNode(tv10, 3, segrot);
1422 tv100->AddNode(tvep3, 3, segrot);
1423 tv100->AddNode(tvpr3, 3, segrot);
1425 tv100->AddNode(tv6, 5,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1426 tv100->AddNode(tv6, 6,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1427 tv100->AddNode(tvep2, 5,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1428 tv100->AddNode(tvep2, 6,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1429 tv100->AddNode(tvpr2, 5,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1430 tv100->AddNode(tvpr2, 6,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1432 tv100->AddNode(tv2, 5,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1433 tv100->AddNode(tv2, 6,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1434 tv100->AddNode(tvep1, 5,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1435 tv100->AddNode(tvep1, 6,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1436 tv100->AddNode(tvpr1, 5,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1437 tv100->AddNode(tvpr1, 6,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1439 tv100->AddNode(tv1, 1,
new TGeoTranslation(0., 0., -252.85));
1440 tv100->AddNode(tv1, 2,
new TGeoTranslation(0., 0., 252.85));
1442 v5->AddNode(v6, 1,
new TGeoTranslation(0., 0., -252.1));
1443 v5->AddNode(v6, 2,
new TGeoTranslation(0., 0., 252.1));
1447 v1->AddNode(hvsm, 1,
new TGeoTranslation(0., 0., -163.8));
1448 v1->AddNode(hvss, 1,
new TGeoTranslation(0., 0., 163.8));
1449 v9->AddNode(tv100, 1);
1454 auto* igro =
new TGeoTube(76.6624, 76.6774, 0.6);
1455 auto* igrio =
new TGeoTube(78.845, 78.86, 0.6);
1456 auto* igrim =
new TGeoTube(78.795, 78.81, 0.6);
1457 auto* igric =
new TGeoTube(78.785, 78.8, 0.6);
1461 auto* igrov =
new TGeoVolume(
"TPC_IGR1", igro, m3);
1462 auto* igriov =
new TGeoVolume(
"TPC_IGR2", igrio, m3);
1463 auto* igrimv =
new TGeoVolume(
"TPC_IGR3", igrim, m3);
1464 auto* igricv =
new TGeoVolume(
"TPC_IGR4", igric, m3);
1468 for (Int_t
i = 0;
i < 24;
i++) {
1469 v5->AddNode(igrov, (
i + 1),
new TGeoTranslation(0., 0., (
i + 1) * 10));
1470 v5->AddNode(igrov, (
i + 25),
new TGeoTranslation(0., 0., -(
i + 1) * 10));
1475 for (Int_t
i = 0;
i < 9;
i++) {
1476 v9->AddNode(igricv, (
i + 1),
new TGeoTranslation(0., 0., (
i + 1) * 10));
1477 v9->AddNode(igricv, (
i + 10),
new TGeoTranslation(0., 0., -(
i + 1) * 10));
1479 v9->AddNode(igrimv, 1,
new TGeoTranslation(0., 0., 100.));
1480 v9->AddNode(igrimv, 2,
new TGeoTranslation(0., 0., -100.));
1482 for (Int_t
i = 0;
i < 13;
i++) {
1483 v9->AddNode(igriov,
i + 1,
new TGeoTranslation(0., 0., 100 + (
i + 1) * 10));
1484 v9->AddNode(igriov,
i + 14,
new TGeoTranslation(0., 0., -(100 + (
i + 1) * 10)));
1491 auto* cfl =
new TGeoPcon(0., 360., 6);
1492 cfl->DefineSection(0, -71.1, 59.7, 61.2);
1493 cfl->DefineSection(1, -68.6, 59.7, 61.2);
1495 cfl->DefineSection(2, -68.6, 60.6124, 61.2);
1496 cfl->DefineSection(3, 68.6, 60.6124, 61.2);
1498 cfl->DefineSection(4, 68.6, 59.7, 61.2);
1499 cfl->DefineSection(5, 71.1, 59.7, 61.2);
1501 auto* cflv =
new TGeoVolume(
"TPC_CDR", cfl, m3);
1503 auto* cd1 =
new TGeoTubeSeg(60.6224, 61.19, 69.8, 0.05, 119.95);
1504 auto* cd2 =
new TGeoTubeSeg(60.6262, 61.1862, 69.8, 0.05, 119.95);
1505 auto* cd3 =
new TGeoTubeSeg(60.6462, 61.1662, 69.8, 0.05, 119.95);
1506 auto* cd4 =
new TGeoTubeSeg(60.6562, 61.1562, 69.8, 0.05, 119.95);
1507 auto* tepox4 =
new TGeoTubeSeg(60.6224, 61.19, 69.8, 359.95, 0.05);
1509 TGeoMedium* sm6 = gGeoManager->GetMedium(
"TPC_Prepreg1");
1510 TGeoMedium* sm8 = gGeoManager->GetMedium(
"TPC_Epoxyfm");
1511 auto* cd1v =
new TGeoVolume(
"TPC_CDR1", cd1, sm2);
1512 auto* cd2v =
new TGeoVolume(
"TPC_CDR2", cd2, sm6);
1513 auto* cd3v =
new TGeoVolume(
"TPC_CDR3", cd3, sm8);
1514 auto* cd4v =
new TGeoVolume(
"TPC_CDR4", cd4, sm4);
1515 auto* tvep4 =
new TGeoVolume(
"TPC_IFEPOX4", tepox4, smep);
1519 auto* cdjl =
new TGeoTubeSeg(60.6562, 60.6762, 69.8, 0., 1.0);
1520 auto* cdju =
new TGeoTubeSeg(61.1362, 61.1562, 69.8, 0., 1.0);
1522 auto* cdjlv =
new TGeoVolume(
"TPC_CDJL", cdjl, sm6);
1523 auto* cdjuv =
new TGeoVolume(
"TPC_CDJU", cdju, sm6);
1527 auto* cs =
new TGeoTube(56.9, 61.2, 0.1);
1528 TGeoMedium* sm7 = gGeoManager->GetMedium(
"TPC_Mylar");
1529 auto* csv =
new TGeoVolume(
"TPC_CDRS", cs, sm7);
1530 v1->AddNode(csv, 1,
new TGeoTranslation(0., 0., -71.2));
1531 v1->AddNode(csv, 2,
new TGeoTranslation(0., 0., 71.2));
1534 auto* se =
new TGeoPcon(0., 360., 6);
1535 se->DefineSection(0, -72.8, 59.7, 61.2);
1536 se->DefineSection(1, -72.3, 59.7, 61.2);
1538 se->DefineSection(2, -72.3, 58.85, 61.2);
1539 se->DefineSection(3, -71.6, 58.85, 61.2);
1541 se->DefineSection(4, -71.6, 59.7, 61.2);
1542 se->DefineSection(5, -71.3, 59.7, 61.2);
1544 auto* sev =
new TGeoVolume(
"TPC_CDCE", se, m3);
1546 auto* si =
new TGeoTube(56.9, 58.8, 1.);
1547 auto* siv =
new TGeoVolume(
"TPC_CDCI", si, m3);
1551 auto*
ref =
new TGeoRotation(
"ref", 90., 0., 90., 90., 180., 0.);
1553 cd1v->AddNode(cd2v, 1);
1554 cd2v->AddNode(cd3v, 1);
1555 cd3v->AddNode(cd4v, 1);
1559 segrot =
new TGeoRotation();
1560 segrot->RotateZ(0.05);
1561 cd4v->AddNode(cdjlv, 1, segrot);
1562 cd4v->AddNode(cdjuv, 1, segrot);
1563 segrot =
new TGeoRotation();
1564 segrot->RotateZ(118.95);
1565 cd4v->AddNode(cdjlv, 2, segrot);
1566 cd4v->AddNode(cdjuv, 2, segrot);
1571 segrot =
new TGeoRotation();
1572 segrot->RotateZ(4.6);
1573 cflv->AddNode(cd1v, 1, segrot);
1574 cflv->AddNode(tvep4, 1, segrot);
1576 segrot =
new TGeoRotation();
1577 segrot->RotateZ(124.6);
1578 cflv->AddNode(cd1v, 2, segrot);
1579 cflv->AddNode(tvep4, 2, segrot);
1581 segrot =
new TGeoRotation();
1582 segrot->RotateZ(244.6);
1583 cflv->AddNode(cd1v, 3, segrot);
1584 cflv->AddNode(tvep4, 3, segrot);
1588 auto* hstr =
new TGeoTubeSeg(60.6124, 60.6224, 68.5, 0., 1.25);
1589 auto* hstrv =
new TGeoVolume(
"TPC_HSTR", hstr, m1);
1590 for (Int_t
i = 0;
i < 144;
i++) {
1591 Double_t
alpha = 1.25 +
i * 2.5;
1592 segrot =
new TGeoRotation();
1593 segrot->RotateZ(
alpha);
1594 cflv->AddNode(hstrv,
i + 1, segrot);
1597 v1->AddNode(siv, 1,
new TGeoTranslation(0., 0., -69.9));
1598 v1->AddNode(siv, 2,
new TGeoTranslation(0., 0., 69.9));
1599 v1->AddNode(sev, 1);
1600 v1->AddNode(sev, 2,
ref);
1601 v1->AddNode(cflv, 1);
1605 auto* ih =
new TGeoTube(81.05, 84.05, 0.3);
1606 auto* oh =
new TGeoTube(250., 256., 0.5);
1607 auto* mem =
new TGeoTube(84.05, 250., 0.00115);
1610 TGeoMedium*
m4 = gGeoManager->GetMedium(
"TPC_G10");
1612 auto* ihv =
new TGeoVolume(
"TPC_IHVH", ih, m3);
1613 auto* ohv =
new TGeoVolume(
"TPC_OHVH", oh, m3);
1615 auto* memv =
new TGeoVolume(
"TPC_HV", mem, sm7);
1617 auto*
cm =
new TGeoVolumeAssembly(
"TPC_HVMEM");
1618 cm->AddNode(ihv, 1);
1619 cm->AddNode(ohv, 1);
1620 cm->AddNode(memv, 1);
1627 Double_t openingAngle = 10. * TMath::DegToRad();
1628 Double_t thick = 1.5;
1629 Double_t shift = thick / TMath::Sin(openingAngle);
1631 Double_t lowEdge = 86.3;
1632 Double_t upEdge = 240.4;
1634 new TGeoTubeSeg(
"tpc_ssec", 74.5, 264.4, 3., 0., 20.);
1636 auto* tpc_hole =
new TGeoPgon(
"tpc_hole", 0., 20., 1, 4);
1638 tpc_hole->DefineSection(0, -3.5, lowEdge - shift, upEdge - shift);
1639 tpc_hole->DefineSection(1, -1.5, lowEdge - shift, upEdge - shift);
1641 tpc_hole->DefineSection(2, -1.5, lowEdge - shift, upEdge + 3. - shift);
1642 tpc_hole->DefineSection(3, 3.5, lowEdge - shift, upEdge + 3. - shift);
1644 Double_t ys = shift * TMath::Sin(openingAngle);
1645 Double_t xs = shift * TMath::Cos(openingAngle);
1646 auto* tr =
new TGeoTranslation(
"tr", xs, ys, 0.);
1647 tr->RegisterYourself();
1648 auto*
chamber =
new TGeoCompositeShape(
"tpc_ssec-tpc_hole:tr");
1649 auto* sv =
new TGeoVolume(
"TPC_WSEG", chamber, m3);
1650 auto* bar =
new TGeoPgon(
"bar", 0., 20., 1, 2);
1651 bar->DefineSection(0, -3., 131.5 - shift, 136.5 - shift);
1652 bar->DefineSection(1, 1.5, 131.5 - shift, 136.5 - shift);
1653 auto* barv =
new TGeoVolume(
"TPC_WBAR", bar, m3);
1654 auto* ch =
new TGeoVolumeAssembly(
"TPC_WCH");
1657 ch->AddNode(barv, 1, tr);
1663 TGeoMedium* m6 = gGeoManager->GetMedium(
"TPC_Makrolon");
1665 auto* ibody =
new TGeoTrd1(13.8742, 21.3328, 4.29, 21.15);
1666 auto* ibdv =
new TGeoVolume(
"TPC_IROCB", ibody, m3);
1668 auto* emp =
new TGeoTrd1(12.3742, 19.8328, 4.05, 19.65);
1669 auto* empv =
new TGeoVolume(
"TPC_IROCE", emp, m1);
1670 ibdv->AddNode(empv, 1,
new TGeoTranslation(0., -0.24, 0.));
1672 Double_t tga = (19.8328 - 12.3742) / 39.3;
1673 Double_t xmin, xmax;
1675 xmin = 9.65 * tga + 12.3742;
1676 xmax = 10.05 * tga + 12.3742;
1678 auto* ib1 =
new TGeoTrd1(xmin, xmax, 2.06, 0.2);
1679 auto* ib1v =
new TGeoVolume(
"TPC_IRB1", ib1, m3);
1680 empv->AddNode(ib1v, 1,
new TGeoTranslation(
"tt1", 0., 1.99, -9.8));
1682 xmin = 19.5 * tga + 12.3742;
1683 xmax = 19.9 * tga + 12.3742;
1685 auto* ib2 =
new TGeoTrd1(xmin, xmax, 2.06, 0.2);
1686 auto* ib2v =
new TGeoVolume(
"TPC_TRB2", ib2, m3);
1687 empv->AddNode(ib2v, 1,
new TGeoTranslation(0., 1.99, 0.05));
1689 xmin = 29.35 * tga + 12.3742;
1690 xmax = 29.75 * tga + 12.3742;
1692 auto* ib3 =
new TGeoTrd1(xmin, xmax, 2.06, 0.2);
1693 auto* ib3v =
new TGeoVolume(
"TPC_IRB3", ib3, m3);
1694 empv->AddNode(ib3v, 1,
new TGeoTranslation(0., 1.99, 9.9));
1698 auto* conn =
new TGeoBBox(0.4, 0.24, 1.937);
1699 auto* connv =
new TGeoVolume(
"TPC_RCCON", conn, m6);
1701 auto* connb =
new TGeoBBox(0.5, 0.25, 2.375);
1702 auto* connbv =
new TGeoVolume(
"TPC_RCCONB", connb, m6);
1706 auto* icsb =
new TGeoTrd1(14.5974, 23.3521, 0.25, 24.825);
1707 auto* icsbv =
new TGeoVolume(
"TPC_ISB", icsb, m4);
1711 TString fileName(gSystem->Getenv(
"VMCWORKDIR"));
1712 fileName +=
"/Detectors/Geometry/TPC/conn_iroc.dat";
1714 in.open(fileName.Data(), ios_base::in);
1715 if (!in.is_open()) {
1716 LOG(fatal) <<
"Cannot open input file : " << fileName.Data();
1718 for (Int_t
i = 0;
i < 132;
i++) {
1720 in >> ang >>
x >>
z;
1727 auto* rrr =
new TGeoRotation();
1730 ibdv->AddNode(connv,
i + 1,
new TGeoCombiTrans(
x, 4.05,
z, rrr));
1731 icsbv->AddNode(connbv,
i + 1,
new TGeoCombiTrans(
x, 0.,
z + 1.725, rrr));
1736 new TGeoTrd1(
"icap", 14.5974, 23.3521, 1.19, 24.825);
1738 new TGeoTrd1(
"ihole", 13.8742, 21.3328, 1.2, 21.15);
1739 auto* tr1 =
new TGeoTranslation(
"tr1", 0., 0., 1.725);
1740 tr1->RegisterYourself();
1741 auto* ic =
new TGeoCompositeShape(
"icap-ihole:tr1");
1742 auto* icv =
new TGeoVolume(
"TPC_IRCAP", ic, m3);
1746 auto* icpp =
new TGeoTrd1(14.5974, 23.3521, 0.16, 24.825);
1747 auto* icppv =
new TGeoVolume(
"TPC_IPP", icpp, m4);
1751 new TGeoTrd1(
"igem", 14.5974, 23.3521, 0.1, 24.825);
1752 new TGeoTrd1(
"igemh", 14.5974 - .5, 23.3521 - .5, 0.11, 24.825 - .5);
1753 auto* icgem =
new TGeoCompositeShape(
"igem-igemh");
1754 auto* icgemv =
new TGeoVolume(
"TPC_ICGEM", icgem, m4);
1758 auto* iroc =
new TGeoVolumeAssembly(
"TPC_IROC");
1760 iroc->AddNode(ibdv, 1);
1761 iroc->AddNode(icv, 1,
new TGeoTranslation(0., 3.1, -1.725));
1762 iroc->AddNode(icsbv, 1,
new TGeoTranslation(0., 4.54, -1.725));
1763 iroc->AddNode(icppv, 1,
new TGeoTranslation(0., 4.95, -1.725));
1764 iroc->AddNode(icgemv, 1,
new TGeoTranslation(0., 5.21, -1.725));
1768 auto* obody =
new TGeoTrd1(22.2938, 40.5084, 4.29, 51.65);
1769 auto* obdv =
new TGeoVolume(
"TPC_OROCB", obody, m3);
1770 auto* oemp =
new TGeoTrd1(20.7938, 39.0084, 3.89, 50.15);
1771 auto* oempv =
new TGeoVolume(
"TPC_OROCE", oemp, m1);
1772 obdv->AddNode(oempv, 1,
new TGeoTranslation(0., -0.4, 0.));
1776 tga = (39.0084 - 20.7938) / 100.3;
1777 xmin = tga * 14.2 + 20.7938;
1778 xmax = tga * 14.6 + 20.7938;
1779 auto* ob1 =
new TGeoTrd1(xmin, xmax, 2.94, 0.2);
1780 auto* ob1v =
new TGeoVolume(
"TPC_ORB1", ob1, m3);
1782 xmin = 30.4 * tga + 20.7938;
1783 xmax = 32.1 * tga + 20.7938;
1784 auto* ob2 =
new TGeoTrd1(xmin, xmax, 2.94, 1.05);
1785 auto* ob2v =
new TGeoVolume(
"TPC_ORB2", ob2, m3);
1787 xmin = 51.5 * tga + 20.7938;
1788 xmax = 51.9 * tga + 20.7938;
1789 auto* ob3 =
new TGeoTrd1(xmin, xmax, 2.94, 0.2);
1790 auto* ob3v =
new TGeoVolume(
"TPC_ORB3", ob3, m3);
1792 xmin = 68.5 * tga + 20.7938;
1793 xmax = 70.6 * tga + 20.7938;
1794 auto* ob4 =
new TGeoTrd1(xmin, xmax, 2.94, 1.05);
1795 auto* ob4v =
new TGeoVolume(
"TPC_ORB4", ob4, m3);
1797 xmin = 89.9 * tga + 20.7938;
1798 xmax = 90.3 * tga + 20.7938;
1799 auto* ob5 =
new TGeoTrd1(xmin, xmax, 2.94, 0.2);
1800 auto* ob5v =
new TGeoVolume(
"TPC_ORB5", ob5, m3);
1802 oempv->AddNode(ob1v, 1,
new TGeoTranslation(0., 0.59, -35.75));
1803 oempv->AddNode(ob2v, 1,
new TGeoTranslation(0., 0.59, -18.7));
1804 oempv->AddNode(ob3v, 1,
new TGeoTranslation(0., 0.59, 1.55));
1805 oempv->AddNode(ob4v, 1,
new TGeoTranslation(0., 0.59, 19.4));
1806 oempv->AddNode(ob5v, 1,
new TGeoTranslation(0., 0.59, 39.95));
1810 auto* conno =
new TGeoBBox(0.4, 0.4, 1.937);
1811 auto* connov =
new TGeoVolume(
"TPC_RCCONO", conno, m6);
1813 auto* connob =
new TGeoBBox(0.5, 0.25, 2.375);
1814 auto* connobv =
new TGeoVolume(
"TPC_RCCONOB", connob, m6);
1818 new TGeoTrd1(
"ocap", 23.3875, 43.524, 1.19, 57.1);
1819 new TGeoTrd1(
"ohole", 22.2938, 40.5084, 1.19, 51.65);
1820 auto* tr5 =
new TGeoTranslation(
"tr5", 0., 0., -2.15);
1821 tr5->RegisterYourself();
1822 auto* oc =
new TGeoCompositeShape(
"ocap-ohole:tr5");
1823 auto* ocv =
new TGeoVolume(
"TPC_ORCAP", oc, m3);
1827 auto* osb =
new TGeoTrd1(23.3874, 43.524, 0.25, 57.1);
1828 auto* osbv =
new TGeoVolume(
"TPC_OSB", osb, m4);
1832 auto* opp =
new TGeoTrd1(23.3874, 43.524, 0.16, 57.1);
1833 auto* oppv =
new TGeoVolume(
"TPC_OPP", opp, m4);
1837 new TGeoTrd1(
"ogem", 23.3874, 43.524, 0.1, 57.1);
1841 new TGeoTrd1(
"ogemh1", 22.548, 28.579, 0.1, 17.625);
1842 new TGeoTrd1(
"ogemh2", 28.949, 35.297, 0.1, 18.45);
1843 new TGeoTrd1(
"ogemh3", 35.667, 42.332, 0.1, 19.425);
1845 auto* tr2 =
new TGeoTranslation(
"tr2", 0., 0., 18.125 - 57.1);
1846 auto* tr3 =
new TGeoTranslation(
"tr3", 0., 0., 55.2 - 57.1);
1847 auto* tr4 =
new TGeoTranslation(
"tr4", 0., 0., 94.175 - 57.1);
1848 tr2->RegisterYourself();
1849 tr3->RegisterYourself();
1850 tr4->RegisterYourself();
1851 auto* ocgem =
new TGeoCompositeShape(
"ogem-ogemh1:tr2-ogemh2:tr3-ogemh3:tr4");
1852 auto* ocgemv =
new TGeoVolume(
"TPC_OCGEM", ocgem, m4);
1856 fileName = gSystem->Getenv(
"VMCWORKDIR");
1857 fileName +=
"/Detectors/Geometry/TPC/conn_oroc.dat";
1858 in.open(fileName.Data(), ios_base::in);
1859 if (!in.is_open()) {
1860 LOG(fatal) <<
"Cannot open input file : " << fileName.Data();
1862 for (Int_t
i = 0;
i < 232;
i++) {
1864 in >> ang >>
x >>
z;
1870 auto* rrr =
new TGeoRotation();
1872 obdv->AddNode(connov,
i + 1,
new TGeoCombiTrans(
x, 3.89,
z, rrr));
1873 osbv->AddNode(connobv,
i + 1,
new TGeoCombiTrans(
x, 0.,
z - 2.15, rrr));
1877 auto* oroc =
new TGeoVolumeAssembly(
"TPC_OROC");
1879 oroc->AddNode(obdv, 1);
1880 oroc->AddNode(ocv, 1,
new TGeoTranslation(0., 3.1, 2.15));
1881 oroc->AddNode(osbv, 1,
new TGeoTranslation(0., 4.54, 2.15));
1882 oroc->AddNode(oppv, 1,
new TGeoTranslation(0., 4.95, 2.15));
1883 oroc->AddNode(ocgemv, 1,
new TGeoTranslation(0., 5.21, 2.15));
1887 auto* secta =
new TGeoVolumeAssembly(
"TPC_SECT");
1888 auto* sectc =
new TGeoVolumeAssembly(
"TPC_SECT");
1889 TGeoRotation rot1(
"rot1", 90., 90., 0.);
1890 TGeoRotation rot2(
"rot2");
1892 auto* rot =
new TGeoRotation(
"rot");
1899 x0 = 110.2 * TMath::Cos(openingAngle);
1900 y0 = 110.2 * TMath::Sin(openingAngle);
1901 auto* combi1a =
new TGeoCombiTrans(
"combi1",
x0,
y0, 1.09, rot);
1902 auto* combi1c =
new TGeoCombiTrans(
"combi1",
x0,
y0, 1.09, rot);
1903 x0 = 188.45 * TMath::Cos(openingAngle);
1904 y0 = 188.45 * TMath::Sin(openingAngle);
1905 auto* combi2a =
new TGeoCombiTrans(
"combi2",
x0,
y0, 1.09, rot);
1906 auto* combi2c =
new TGeoCombiTrans(
"combi2",
x0,
y0, 1.09, rot);
1911 secta->AddNode(ch, 1);
1912 secta->AddNode(iroc, 1, combi1a);
1913 secta->AddNode(oroc, 1, combi2a);
1917 sectc->AddNode(ch, 1);
1918 sectc->AddNode(iroc, 1, combi1c);
1919 sectc->AddNode(oroc, 1, combi2c);
1923 auto* wheela =
new TGeoVolumeAssembly(
"TPC_ENDCAP");
1924 auto* wheelc =
new TGeoVolumeAssembly(
"TPC_ENDCAP");
1926 for (Int_t
i = 0;
i < 18;
i++) {
1927 Double_t
phi = (20. *
i);
1928 auto* rwh =
new TGeoRotation();
1930 wheela->AddNode(secta,
i + 1, rwh);
1931 wheelc->AddNode(sectc,
i + 1, rwh);
1935 auto* combi3 =
new TGeoCombiTrans(
"combi3", 0., 0., 256.6,
ref);
1936 v9->AddNode(wheela, 1, combi3);
1937 v9->AddNode(wheelc, 2,
new TGeoTranslation(0., 0., -256.6));
1941 auto*
sw =
new TGeoPgon(0., 20., 1, 2);
1942 sw->DefineSection(0, -4., 80.5, 251.75);
1943 sw->DefineSection(1, 4., 80.5, 251.75);
1944 auto* swv =
new TGeoVolume(
"TPC_SWSEG",
sw, m3);
1947 shift = thick / TMath::Sin(openingAngle);
1948 auto* sh =
new TGeoPgon(0., 20., 1, 2);
1949 sh->DefineSection(0, -4., 81.5 - shift, 250.75 - shift);
1950 sh->DefineSection(1, 4., 81.5 - shift, 250.75 - shift);
1951 auto* shv =
new TGeoVolume(
"TPC_SWS1", sh, m1);
1953 TGeoMedium* m9 = gGeoManager->GetMedium(
"TPC_Si");
1954 auto* el =
new TGeoPgon(0., 20., 1, 2);
1955 el->DefineSection(0, -1.872, 81.5 - shift, 250.75 - shift);
1956 el->DefineSection(1, 1.872, 81.5 - shift, 250.75 - shift);
1957 auto* elv =
new TGeoVolume(
"TPC_ELEC", el, m9);
1959 shv->AddNode(elv, 1);
1962 ys = shift * TMath::Sin(openingAngle);
1963 xs = shift * TMath::Cos(openingAngle);
1964 swv->AddNode(shv, 1,
new TGeoTranslation(xs, ys, 0.));
1966 auto* co =
new TGeoPgon(0., 20., 1, 2);
1967 co->DefineSection(0, -0.5, 77., 255.25);
1968 co->DefineSection(1, 0.5, 77., 255.25);
1969 auto* cov =
new TGeoVolume(
"TPC_SWC1", co, m3);
1971 auto* coh =
new TGeoPgon(0., 20., 1, 2);
1972 shift = 4. / TMath::Sin(openingAngle);
1973 coh->DefineSection(0, -0.5, 85. - shift, 247.25 - shift);
1974 coh->DefineSection(1, 0.5, 85. - shift, 247.25 - shift);
1976 auto* cohv =
new TGeoVolume(
"TPC_SWC2", coh, m1);
1978 ys = shift * TMath::Sin(openingAngle);
1979 xs = shift * TMath::Cos(openingAngle);
1980 cov->AddNode(cohv, 1,
new TGeoTranslation(xs, ys, 0.));
1984 auto* swhs =
new TGeoVolumeAssembly(
"TPC_SSWSEC");
1985 swhs->AddNode(swv, 1);
1986 swhs->AddNode(cov, 1,
new TGeoTranslation(0., 0., -4.5));
1987 swhs->AddNode(cov, 2,
new TGeoTranslation(0., 0., 4.5));
1991 TGeoRotation* rsw[18];
1992 auto* swheel =
new TGeoVolumeAssembly(
"TPC_SSWHEEL");
1993 for (Int_t
i = 0;
i < 18;
i++) {
1994 Double_t
phi = (20. *
i);
1995 rsw[
i] =
new TGeoRotation();
1996 rsw[
i]->RotateZ(phi);
1997 swheel->AddNode(swhs,
i + 1, rsw[
i]);
1999 v1->AddNode(swheel, 1,
new TGeoTranslation(0., 0., -284.6));
2000 v1->AddNode(swheel, 2,
new TGeoTranslation(0., 0., 284.6));
2005 Int_t totrows = 159;
2009 gGeoManager->Volume(
"TPC_Strip",
"PGON",
m5->GetId(), upar);
2010 upar =
new Double_t[10];
2021 Double_t rlow = 85.225;
2024 upar[6] = rlow + .01;
2028 gGeoManager->Node(
"TPC_Strip", 1,
"TPC_Drift", 0., 0., 124.82, 0, kTRUE, upar, 10);
2029 gGeoManager->Node(
"TPC_Strip", totrows + 1,
"TPC_Drift", 0., 0., -124.82, 0, kTRUE, upar, 10);
2063 TGeoMedium* m7 = gGeoManager->GetMedium(
"TPC_Cu");
2064 TGeoMedium* m10 = gGeoManager->GetMedium(
"TPC_Alumina");
2065 TGeoMedium* m11 = gGeoManager->GetMedium(
"TPC_Peek");
2066 TGeoMedium* m13 = gGeoManager->GetMedium(
"TPC_Brass");
2067 TGeoMedium* m14 = gGeoManager->GetMedium(
"TPC_Alumina1");
2075 auto* rod =
new TGeoPcon(
"rod", 0., 360., 6);
2076 rod->DefineSection(0, -10.43, 1.92, 2.08);
2077 rod->DefineSection(1, -9.75, 1.92, 2.08);
2079 rod->DefineSection(2, -9.75, 1.8, 2.2);
2080 rod->DefineSection(3, 9.75, 1.8, 2.2);
2082 rod->DefineSection(4, 9.75, 1.92, 2.08);
2083 rod->DefineSection(5, 10.43, 1.92, 2.08);
2085 auto* mrodl =
new TGeoVolume(
"TPC_mrodl", rod, m6);
2089 auto* rod1 =
new TGeoPcon(
"rod1", 0., 360., 6);
2090 rod1->DefineSection(0, -8.93, 1.92, 2.08);
2091 rod1->DefineSection(1, -8.25, 1.92, 2.08);
2093 rod1->DefineSection(2, -8.25, 1.8, 2.2);
2094 rod1->DefineSection(3, 8.25, 1.8, 2.2);
2096 rod1->DefineSection(4, 8.25, 1.92, 2.08);
2097 rod1->DefineSection(5, 8.93, 1.92, 2.08);
2099 auto* mrods =
new TGeoVolume(
"TPC_mrods", rod1, m6);
2106 new TGeoTube(
"hhole", 0., 0.3, 0.3);
2111 auto* rhole =
new TGeoRotation();
2112 rhole->RotateX(90.);
2113 TGeoCombiTrans* transf[13];
2115 for (Int_t
i = 0;
i < 13;
i++) {
2116 snprintf(
name, 30,
"transf%d",
i);
2117 transf[
i] =
new TGeoCombiTrans(
name, 0., -2., -9. +
i * 1.5, rhole);
2118 transf[
i]->RegisterYourself();
2121 TString operl(
"hhole:transf0");
2122 for (Int_t
i = 1;
i < 13;
i++) {
2123 snprintf(
name, 30,
"+hhole:transf%d",
i);
2127 TString opers(
"hhole:transf1");
2128 for (Int_t
i = 2;
i < 12;
i++) {
2129 snprintf(
name, 30,
"+hhole:transf%d",
i);
2133 new TGeoCompositeShape(
"hlv", operl.Data());
2134 new TGeoCompositeShape(
"hsv", opers.Data());
2136 auto* rodl =
new TGeoCompositeShape(
"rodl",
"rod-hlv");
2137 auto* rods =
new TGeoCompositeShape(
"rods",
"rod1-hsv");
2139 auto* rodlv =
new TGeoVolume(
"TPC_rodl", rodl, m6);
2140 auto* rodsv =
new TGeoVolume(
"TPC_rods", rods, m6);
2143 auto* bcon =
new TGeoTube(0., 0.3, 0.3);
2144 auto* bconv =
new TGeoVolume(
"TPC_bcon", bcon, m13);
2148 new TGeoBBox(
"hk1", 0.625, 0.015, 0.75);
2149 new TGeoBBox(
"hk2", 0.625, 0.015, 0.15);
2150 auto* tr21 =
new TGeoTranslation(
"tr21", 0., -0.03, -0.6);
2151 auto* tr12 =
new TGeoTranslation(
"tr12", 0., -0.03, 0.6);
2152 tr21->RegisterYourself();
2153 tr12->RegisterYourself();
2155 auto* hook =
new TGeoCompositeShape(
"hook",
"hk1+hk2:tr21+hk2:tr12");
2156 auto* hookv =
new TGeoVolume(
"TPC_hook", hook, m13);
2163 auto* spart =
new TGeoVolumeAssembly(
"TPC_spart");
2165 spart->AddNode(rodsv, 1);
2166 for (Int_t
i = 1;
i < 12;
i++) {
2167 spart->AddNode(bconv,
i, transf[
i]);
2169 for (Int_t
i = 0;
i < 11;
i++) {
2170 spart->AddNode(hookv,
i + 1,
new TGeoTranslation(0., -2.315, -7.5 +
i * 1.5));
2175 auto* lpart =
new TGeoVolumeAssembly(
"TPC_lpart");
2177 lpart->AddNode(rodlv, 1);
2178 for (Int_t
i = 0;
i < 13;
i++) {
2179 lpart->AddNode(bconv,
i + 12, transf[
i]);
2181 for (Int_t
i = 0;
i < 13;
i++) {
2182 lpart->AddNode(hookv,
i + 12,
new TGeoTranslation(0., -2.315, -9. +
i * 1.5));
2187 new TGeoTube(
"ring1", 2.1075, 2.235, 0.53);
2188 new TGeoTube(
"ring2", 1.7925, 1.89, 0.43);
2189 new TGeoTube(
"ring3", 1.89, 2.1075, 0.05);
2190 auto* ring =
new TGeoCompositeShape(
"ring",
"ring1+ring2+ring3");
2191 auto* ringv =
new TGeoVolume(
"TPC_ring", ring, m3);
2195 auto* tpcrrod =
new TGeoVolumeAssembly(
"TPC_rrod");
2196 auto* tpcmrod =
new TGeoVolumeAssembly(
"TPC_mrod");
2198 for (Int_t
i = 0;
i < 11;
i++) {
2199 tpcrrod->AddNode(ringv,
i + 1,
new TGeoTranslation(0., 0., -105. +
i * 21));
2200 tpcmrod->AddNode(ringv,
i + 12,
new TGeoTranslation(0., 0., -105. +
i * 21));
2202 for (Int_t
i = 0;
i < 10;
i++) {
2203 tpcrrod->AddNode(lpart,
i + 1,
new TGeoTranslation(0., 0., -94.5 +
i * 21));
2204 tpcmrod->AddNode(mrodl,
i + 1,
new TGeoTranslation(0., 0., -94.5 +
i * 21));
2209 auto* tpcrp =
new TGeoPcon(0., 360., 6);
2211 tpcrp->DefineSection(0, 123.05, 1.89, 2.1075);
2212 tpcrp->DefineSection(1, 123.59, 1.89, 2.1075);
2214 tpcrp->DefineSection(2, 123.59, 1.8, 2.2);
2215 tpcrp->DefineSection(3, 127., 1.8, 2.2);
2217 tpcrp->DefineSection(4, 127., 0., 2.2);
2218 tpcrp->DefineSection(5, 127.5, 0., 2.2);
2220 auto* tpcrpv =
new TGeoVolume(
"TPC_RP", tpcrp, m6);
2224 tpcrrod->AddNode(spart, 1,
new TGeoTranslation(0., 0., -114.));
2225 tpcrrod->AddNode(spart, 2,
new TGeoTranslation(0., 0., 114.));
2226 tpcrrod->AddNode(ringv, 23,
new TGeoTranslation(0., 0., -123.));
2227 tpcrrod->AddNode(ringv, 24,
new TGeoTranslation(0., 0., 123.));
2228 tpcrrod->AddNode(tpcrpv, 1);
2230 tpcmrod->AddNode(mrods, 1,
new TGeoTranslation(0., 0., -114.));
2231 tpcmrod->AddNode(mrods, 2,
new TGeoTranslation(0., 0., 114.));
2232 tpcmrod->AddNode(ringv, 25,
new TGeoTranslation(0., 0., -123.));
2233 tpcmrod->AddNode(ringv, 26,
new TGeoTranslation(0., 0., 123.));
2234 tpcmrod->AddNode(tpcrpv, 2);
2241 auto* hvr =
new TGeoTube(0., 1.465, 123.);
2242 auto* hvc =
new TGeoTube(0., 0.29, 123.);
2244 auto* hvrv =
new TGeoVolume(
"TPC_HV_Rod", hvr, m6);
2245 auto* hvcv =
new TGeoVolume(
"TPC_HV_Cable", hvc, m7);
2246 hvrv->AddNode(hvcv, 1);
2250 auto* cr =
new TGeoTube(0., 0.45, 123.);
2251 auto* cw =
new TGeoTube(0., 0.15, 123.);
2252 auto* crv =
new TGeoVolume(
"TPC_CR", cr, m10);
2253 auto* cwv =
new TGeoVolume(
"TPC_W", cw, m12);
2257 crv->AddNode(cwv, 1);
2261 auto* pr =
new TGeoTube(0.2, 0.35, 123.);
2262 auto* prv =
new TGeoVolume(
"TPC_PR", pr, m11);
2266 new TGeoTube(
"tub", 0., 1.7, 0.025);
2270 Double_t
n[3], p[3];
2271 Double_t
slope = TMath::Tan(22. * TMath::DegToRad());
2272 Double_t intp = 1.245;
2283 norm = TMath::Sqrt(
n[0] *
n[0] +
n[1] *
n[1]);
2287 new TGeoHalfSpace(
"sp1", p,
n);
2296 norm = TMath::Sqrt(
n[0] *
n[0] +
n[1] *
n[1]);
2300 new TGeoHalfSpace(
"sp2", p,
n);
2303 new TGeoTube(
"h1", 0., 0.5, 0.025);
2304 new TGeoTube(
"h2", 0., 0.35, 0.025);
2306 auto* ttr11 =
new TGeoTranslation(
"ttr11", -0.866, 0.5, 0.);
2307 auto* ttr22 =
new TGeoTranslation(
"ttr22", 0.866, 0.5, 0.);
2308 ttr11->RegisterYourself();
2309 ttr22->RegisterYourself();
2311 new TGeoBBox(
"elcon", 0.72, 0.005, 0.3);
2312 auto* crr1 =
new TGeoRotation();
2313 crr1->RotateZ(-22.);
2314 auto* ctr1 =
new TGeoCombiTrans(
"ctr1", -0.36011, -1.09951, -0.325, crr1);
2315 ctr1->RegisterYourself();
2316 auto* cs1 =
new TGeoCompositeShape(
"cs1",
"(((((tub-h1:ttr11)-h1:ttr22)-sp1)-sp2)-h2)+elcon:ctr1");
2318 auto* csvv =
new TGeoVolume(
"TPC_RR_CU", cs1, m7);
2323 auto* rrod =
new TGeoVolumeAssembly(
"TPC_RRIN");
2325 rrod->AddNode(crv, 1, ttr11);
2326 rrod->AddNode(crv, 2, ttr22);
2327 rrod->AddNode(prv, 1);
2329 for (Int_t
i = 0;
i < 165;
i++) {
2330 rrod->AddNode(csvv,
i + 1,
new TGeoTranslation(0., 0., -122.675 +
i * 1.5));
2333 auto*
res =
new TGeoTube(0., 0.15, 0.5);
2334 auto* resv =
new TGeoVolume(
"TPC_RES",
res, m14);
2335 auto* ress =
new TGeoVolumeAssembly(
"TPC_RES_CH");
2336 ress->AddNode(resv, 1,
new TGeoTranslation(0.2, 0., 0.));
2337 ress->AddNode(resv, 2,
new TGeoTranslation(-0.2, 0., 0.));
2339 auto* crr2 =
new TGeoRotation();
2341 auto* crr3 =
new TGeoRotation();
2342 crr3->RotateY(-30.);
2344 for (Int_t
i = 0;
i < 164;
i += 2) {
2345 rrod->AddNode(ress,
i + 1,
new TGeoCombiTrans(0., 1.2, -121.925 +
i * 1.5, crr2));
2346 rrod->AddNode(ress,
i + 2,
new TGeoCombiTrans(0., 1.2, -121.925 + (
i + 1) * 1.5, crr3));
2349 tpcrrod->AddNode(rrod, 1,
new TGeoCombiTrans(0., 0., 0.5, crr1));
2354 Double_t shift1[3] = {0.0, -0.175, 0.0};
2356 new TGeoBBox(
"tpcihs1", 4.7, 0.66, 2.35);
2357 new TGeoBBox(
"tpcihs2", 4.7, 0.485, 1.0, shift1);
2358 new TGeoBBox(
"tpcihs3", 1.5, 0.485, 2.35, shift1);
2359 new TGeoTube(
"tpcihs4", 0.0, 2.38, 0.1);
2361 Double_t pointstrap[16];
2362 pointstrap[0] = 0.0;
2363 pointstrap[1] = 0.0;
2364 pointstrap[2] = 0.0;
2365 pointstrap[3] = 1.08;
2366 pointstrap[4] = 2.3;
2367 pointstrap[5] = 1.08;
2368 pointstrap[6] = 3.38;
2369 pointstrap[7] = 0.0;
2370 pointstrap[8] = 0.0;
2371 pointstrap[9] = 0.0;
2372 pointstrap[10] = 0.0;
2373 pointstrap[11] = 1.08;
2374 pointstrap[12] = 2.3;
2375 pointstrap[13] = 1.08;
2376 pointstrap[14] = 3.38;
2377 pointstrap[15] = 0.0;
2379 auto* tpcihs5 =
new TGeoArb8(
"tpcihs5", 0.6, pointstrap);
2391 new TGeoHalfSpace(
"cutil1", p,
n);
2396 auto* trans2 =
new TGeoTranslation(
"trans2", 0.0, 2.84, 2.25);
2397 trans2->RegisterYourself();
2398 auto* trans3 =
new TGeoTranslation(
"trans3", 0.0, 2.84, -2.25);
2399 trans3->RegisterYourself();
2403 new TGeoCompositeShape(
"tpcihs6",
"tpcihs1-(tpcihs2+tpcihs3)-(tpcihs4:trans2)-(tpcihs4:trans3)-cutil1");
2407 auto* tpcihss =
new TGeoVolume(
"TPC_IHSS", tpcihs6, m6);
2408 auto* tpcihst =
new TGeoVolume(
"TPC_IHSTR", tpcihs5, m6);
2410 auto* rot111 =
new TGeoRotation();
2411 rot111->RotateY(180.0);
2413 auto* tpcihs =
new TGeoVolumeAssembly(
"TPC_IHS");
2414 tpcihs->AddNode(tpcihss, 1);
2415 tpcihs->AddNode(tpcihst, 1,
new TGeoTranslation(-4.7, 0.66, 0.0));
2416 tpcihs->AddNode(tpcihst, 2,
new TGeoCombiTrans(4.7, 0.66, 0.0, rot111));
2420 new TGeoBBox(
"tpcirh1", 4.7, 1.33, 0.5);
2424 new TGeoBBox(
"tpcirh2", 1.05, 0.8, 0.5, shift1);
2428 new TGeoBBox(
"tpcirh3", 1.05, 0.8, 0.5, shift1);
2432 new TGeoBBox(
"tpcirh4", 1.9, 0.25, 0.5, shift1);
2433 new TGeoTube(
"tpcirh5", 0, 1.9, 5);
2435 auto* trans4 =
new TGeoTranslation(
"trans4", 0, 0.83, 0.0);
2436 trans4->RegisterYourself();
2438 auto* tpcirh6 =
new TGeoCompositeShape(
"tpcirh6",
"tpcirh1-tpcirh2-tpcirh3-(tpcirh5:trans4)-tpcirh4");
2442 auto* tpcirh =
new TGeoVolume(
"TPC_IRH", tpcirh6, m6);
2446 TGeoVolume* tpciclamp =
new TGeoVolumeAssembly(
"TPC_ICLP");
2447 tpciclamp->AddNode(tpcihs, 1);
2448 tpciclamp->AddNode(tpcirh, 1,
new TGeoTranslation(0, 1.99, 1.1));
2449 tpciclamp->AddNode(tpcirh, 2,
new TGeoTranslation(0, 1.99, -1.1));
2453 auto* inplug =
new TGeoPcon(
"inplug", 0.0, 360.0, 13);
2455 inplug->DefineSection(0, 0.3, 0.0, 2.2);
2456 inplug->DefineSection(1, 0.6, 0.0, 2.2);
2458 inplug->DefineSection(2, 0.6, 0.0, 1.75);
2459 inplug->DefineSection(3, 0.7, 0.0, 1.75);
2461 inplug->DefineSection(4, 0.7, 1.55, 1.75);
2462 inplug->DefineSection(5, 1.6, 1.55, 1.75);
2464 inplug->DefineSection(6, 1.6, 1.55, 2.2);
2465 inplug->DefineSection(7, 1.875, 1.55, 2.2);
2467 inplug->DefineSection(8, 2.47, 1.75, 2.2);
2469 inplug->DefineSection(9, 2.47, 1.75, 2.08);
2470 inplug->DefineSection(10, 2.57, 1.8, 2.08);
2472 inplug->DefineSection(11, 2.57, 1.92, 2.08);
2473 inplug->DefineSection(12, 2.95, 1.92, 2.08);
2479 new TGeoBBox(
"pcuti", 1.5, 0.11, 1.075, shift1);
2481 auto* inplleft =
new TGeoCompositeShape(
"inplleft",
"inplug-pcuti");
2482 auto* tpcinlplug =
new TGeoVolume(
"TPC_INPLL", inplleft, m6);
2486 TGeoVolume* tpcihpl =
new TGeoVolumeAssembly(
"TPC_IHPL");
2487 tpcihpl->AddNode(tpcinlplug, 1);
2488 tpcihpl->AddNode(tpcinlplug, 2,
ref);
2489 tpcihpl->AddNode(tpciclamp, 1,
new TGeoTranslation(0.0, -2.765, 0.0));
2495 pointstrap[0] = 0.0;
2496 pointstrap[1] = 0.0;
2497 pointstrap[2] = 0.0;
2498 pointstrap[3] = 2.8;
2499 pointstrap[4] = 3.1;
2500 pointstrap[5] = 2.8 - 3.1 * TMath::Tan(15. * TMath::DegToRad());
2501 pointstrap[6] = 3.1;
2502 pointstrap[7] = 0.0;
2503 pointstrap[8] = 0.0;
2504 pointstrap[9] = 0.0;
2505 pointstrap[10] = 0.0;
2506 pointstrap[11] = 2.8;
2507 pointstrap[12] = 3.1;
2508 pointstrap[13] = 2.8 - 3.1 * TMath::Tan(15. * TMath::DegToRad());
2509 pointstrap[14] = 3.1;
2510 pointstrap[15] = 0.0;
2512 auto* tpcomh1 =
new TGeoArb8(
"tpcomh1", 1.05, pointstrap);
2513 auto* tpcomh2 =
new TGeoBBox(
"tpcomh2", 0.8, 1.4, 6);
2515 auto* tpcomh1v =
new TGeoVolume(
"TPC_OMH1", tpcomh1, m7);
2516 auto* tpcomh2v =
new TGeoVolume(
"TPC_OMH2", tpcomh2, m7);
2518 TGeoVolume* tpcomh3v =
new TGeoVolumeAssembly(
"TPC_OMH3");
2519 tpcomh3v->AddNode(tpcomh1v, 1,
new TGeoTranslation(0.8, -1.4, 4.95));
2520 tpcomh3v->AddNode(tpcomh1v, 2,
new TGeoTranslation(0.8, -1.4, -4.95));
2521 tpcomh3v->AddNode(tpcomh2v, 1);
2527 new TGeoBBox(
"tpcomh3", 1.65, 1.15, 3.4);
2528 auto* tpcomh4 =
new TGeoBBox(
"tpcomh4", 0.75, 0.7, 3.4, shift1);
2537 n[1] = -1.0 * TMath::Tan(30. * TMath::DegToRad());
2540 new TGeoHalfSpace(
"cutomh1", p,
n);
2549 n[1] = -1.0 * TMath::Tan(30. * TMath::DegToRad());
2552 new TGeoHalfSpace(
"cutomh2", p,
n);
2560 n[0] = 1.0 * TMath::Tan(75. * TMath::DegToRad());
2564 new TGeoHalfSpace(
"cutomh3", p,
n);
2572 n[0] = 1.0 * TMath::Tan(75 * TMath::DegToRad());
2576 new TGeoHalfSpace(
"cutomh4", p,
n);
2585 n[1] = -1.0 * TMath::Tan(20. * TMath::DegToRad());
2588 new TGeoHalfSpace(
"cutomh5", p,
n);
2590 auto* tpcomh5 =
new TGeoCompositeShape(
"tpcomh5",
"tpcomh3-cutomh1-cutomh2-cutomh3-cutomh4-cutomh5");
2592 auto* tpcomh5v =
new TGeoVolume(
"TPC_OMH5", tpcomh5, m6);
2593 auto* tpcomh4v =
new TGeoVolume(
"TPC_OMH6", tpcomh4, m6);
2595 auto* tpcomh7v =
new TGeoVolumeAssembly(
"TPC_OMH7");
2596 tpcomh7v->AddNode(tpcomh5v, 1);
2597 tpcomh7v->AddNode(tpcomh4v, 1);
2601 auto* tpcomh =
new TGeoVolumeAssembly(
"TPC_OMH");
2602 tpcomh->AddNode(tpcomh3v, 1,
new TGeoTranslation(1.5, 0., 0.));
2603 tpcomh->AddNode(tpcomh3v, 2,
new TGeoCombiTrans(-1.5, 0., 0., rot111));
2604 tpcomh->AddNode(tpcomh7v, 1,
new TGeoTranslation(0.65 + 1.5, 2.55, 0.0));
2605 tpcomh->AddNode(tpcomh7v, 2,
new TGeoCombiTrans(-0.65 - 1.5, 2.55, 0.0, rot111));
2609 new TGeoBBox(
"tpcohs1", 3.8, 0.675, 2.35);
2615 new TGeoBBox(
"tpcohs2", 1.5, 0.5, 2.35, shift1);
2616 new TGeoBBox(
"tpcohs3", 3.8, 0.5, 0.85, shift1);
2622 auto* tpcohs4 =
new TGeoBBox(
"tpsohs4", 3.1, 0.5, 0.7, shift1);
2624 auto* tpcohs4v =
new TGeoVolume(
"TPC_OHS4", tpcohs4, m6);
2634 new TGeoHalfSpace(
"cutohs1", p,
n);
2636 auto* tpcohs5 =
new TGeoCompositeShape(
"tpcohs5",
"tpcohs1-tpcohs2-tpcohs3-cutohs1");
2637 auto* tpcohs5v =
new TGeoVolume(
"TPC_OHS5", tpcohs5, m6);
2639 auto* tpcohs =
new TGeoVolumeAssembly(
"TPC_OHS");
2640 tpcohs->AddNode(tpcohs5v, 1);
2641 tpcohs->AddNode(tpcohs4v, 1);
2648 new TGeoBBox(
"tpcorh1", 3.1, 1.825, 0.55);
2654 new TGeoBBox(
"tpcorh2", 0.5, 2.75, 1.1, shift1);
2660 new TGeoBBox(
"tpcorh3", 0.5, 2.75, 1.1, shift1);
2666 new TGeoBBox(
"tpcorh4", 3.9, 2.75, 0.5, shift1);
2672 new TGeoBBox(
"tpcorh5", 1.95, 0.5, 1.1, shift1);
2678 new TGeoBBox(
"tpcorh6", 2.4, 0.5, 0.6, shift1);
2680 new TGeoTube(
"tpcorh7", 0, 1.95, 0.85);
2681 new TGeoTube(
"tpcorh8", 0, 2.4, 0.6);
2683 auto* trans33 =
new TGeoTranslation(
"trans33", 0.0, 0.0, 0.55);
2684 trans33->RegisterYourself();
2687 new TGeoCompositeShape(
"tpcorh9",
"tpcorh1-tpcorh2-tpcorh3-tpcorh4-tpcorh5-tpcorh6-(tpcorh8:trans33)-tpcorh7");
2689 auto* tpcorh9v =
new TGeoVolume(
"TPC_ORH", tpcorh9, m6);
2693 auto* tpcorh =
new TGeoVolumeAssembly(
"TPC_ORH2");
2695 tpcorh->AddNode(tpcorh9v, 1,
new TGeoTranslation(0.0, 0.0, 1.25));
2696 tpcorh->AddNode(tpcorh9v, 2,
new TGeoCombiTrans(0.0, 0.0, -1.25, rot111));
2700 auto* outplug =
new TGeoPcon(
"outplug", 0.0, 360.0, 13);
2702 outplug->DefineSection(0, 0.5, 0.0, 2.2);
2703 outplug->DefineSection(1, 0.7, 0.0, 2.2);
2704 outplug->DefineSection(2, 0.7, 1.55, 2.2);
2705 outplug->DefineSection(3, 0.8, 1.55, 2.2);
2706 outplug->DefineSection(4, 0.8, 1.55, 1.75);
2707 outplug->DefineSection(5, 1.2, 1.55, 1.75);
2708 outplug->DefineSection(6, 1.2, 1.55, 2.2);
2709 outplug->DefineSection(7, 1.875, 1.55, 2.2);
2710 outplug->DefineSection(8, 2.47, 1.75, 2.2);
2711 outplug->DefineSection(9, 2.47, 1.75, 2.08);
2712 outplug->DefineSection(10, 2.57, 1.8, 2.08);
2713 outplug->DefineSection(11, 2.57, 1.92, 2.08);
2714 outplug->DefineSection(12, 2.95, 1.92, 2.08);
2720 new TGeoBBox(
"cutout", 2.5, 0.11, 1.01, shift1);
2723 auto* outplleft =
new TGeoCompositeShape(
"outplleft",
"outplug-cutout");
2724 auto* outplleftv =
new TGeoVolume(
"TPC_OPLL", outplleft, m6);
2729 auto* tpcohpl =
new TGeoVolumeAssembly(
"TPC_OHPL");
2731 tpcohpl->AddNode(outplleftv, 1);
2732 tpcohpl->AddNode(outplleftv, 2,
ref);
2733 tpcohpl->AddNode(tpcorh, 1);
2734 tpcohpl->AddNode(tpcohs, 1,
new TGeoTranslation(0.0, 3.925, 0));
2740 pointstrap[0] = 0.0;
2741 pointstrap[1] = 0.0;
2742 pointstrap[2] = 0.0;
2743 pointstrap[3] = 2.8;
2744 pointstrap[4] = 3.1;
2745 pointstrap[5] = 1.96;
2746 pointstrap[6] = 3.1;
2747 pointstrap[7] = 0.0;
2748 pointstrap[8] = 0.0;
2749 pointstrap[9] = 0.0;
2750 pointstrap[10] = 0.0;
2751 pointstrap[11] = 2.8;
2752 pointstrap[12] = 3.1;
2753 pointstrap[13] = 1.96;
2754 pointstrap[14] = 3.1;
2755 pointstrap[15] = 0.0;
2757 auto* tpcmmh1 =
new TGeoArb8(
"tpcmmh1", 1.75, pointstrap);
2758 auto* tpcmmh2 =
new TGeoBBox(
"tpcmmh2", 0.8, 1.4, 12.5);
2760 auto* tpcmmh1v =
new TGeoVolume(
"TPC_MMH1", tpcmmh1, m6);
2761 auto* tpcmmh2v =
new TGeoVolume(
"TPC_MMH2", tpcmmh2, m6);
2763 auto* tpcmmhs =
new TGeoVolumeAssembly(
"TPC_MMHS");
2764 tpcmmhs->AddNode(tpcmmh1v, 1,
new TGeoTranslation(0.8, -1.4, 10.75));
2765 tpcmmhs->AddNode(tpcmmh1v, 2,
new TGeoTranslation(0.8, -1.4, -10.75));
2766 tpcmmhs->AddNode(tpcmmh2v, 1);
2774 new TGeoBBox(
"tpcmmhc1", 1.65, 1.85, 8.9);
2775 new TGeoBBox(
"tpcmmhc2", 0.9, 0.7, 8.9, shift1);
2785 n[2] = 8.0 * TMath::Tan(13. * TMath::DegToRad());
2787 new TGeoHalfSpace(
"cutmmh1", p,
n);
2795 n[2] = -8.0 * TMath::Tan(13. * TMath::DegToRad());
2797 new TGeoHalfSpace(
"cutmmh2", p,
n);
2805 n[2] = 6.1 * TMath::Tan(20. * TMath::DegToRad());
2807 new TGeoHalfSpace(
"cutmmh3", p,
n);
2815 n[2] = -6.1 * TMath::Tan(20 * TMath::DegToRad());
2817 new TGeoHalfSpace(
"cutmmh4", p,
n);
2823 n[0] = 2.4 * TMath::Tan(30 * TMath::DegToRad());
2827 new TGeoHalfSpace(
"cutmmh5", p,
n);
2833 n[0] = 2.4 * TMath::Tan(30 * TMath::DegToRad());
2837 new TGeoHalfSpace(
"cutmmh6", p,
n);
2840 new TGeoCompositeShape(
"TPC_MMHC",
"tpcmmhc1-tpcmmhc2-cutmmh1-cutmmh2-cutmmh3-cutmmh4-cutmmh5-cutmmh6");
2842 auto* tpcmmhcv =
new TGeoVolume(
"TPC_MMHC", tpcmmhc, m6);
2844 TGeoVolume* tpcmmh =
new TGeoVolumeAssembly(
"TPC_MMH");
2846 tpcmmh->AddNode(tpcmmhcv, 1,
new TGeoTranslation(0.65 + 1.5, 1.85, 0.0));
2847 tpcmmh->AddNode(tpcmmhcv, 2,
new TGeoCombiTrans(-0.65 - 1.5, 1.85, 0.0, rot111));
2848 tpcmmh->AddNode(tpcmmhs, 1,
new TGeoTranslation(1.5, 0.0, 0.0));
2849 tpcmmh->AddNode(tpcmmhs, 2,
new TGeoCombiTrans(-1.5, 0.0, 0.0, rot111));
2859 auto* gres1 =
new TGeoTube(0., 0.375, 125.);
2861 auto* vgres1 =
new TGeoVolume(
"TPC_GRES1", gres1, m14);
2866 xrc = 79.3 * TMath::Cos(350. * TMath::DegToRad());
2867 yrc = 79.3 * TMath::Sin(350. * TMath::DegToRad());
2869 v9->AddNode(vgres1, 1,
new TGeoTranslation(xrc, yrc, 126.9));
2870 v9->AddNode(vgres1, 2,
new TGeoTranslation(xrc, yrc, -126.9));
2872 xrc = 79.3 * TMath::Cos(190. * TMath::DegToRad());
2873 yrc = 79.3 * TMath::Sin(190. * TMath::DegToRad());
2875 v9->AddNode(vgres1, 3,
new TGeoTranslation(xrc, yrc, 126.9));
2876 v9->AddNode(vgres1, 4,
new TGeoTranslation(xrc, yrc, -126.9));
2878 TGeoRotation refl(
"refl", 90., 0., 90., 90., 180., 0.);
2879 TGeoRotation rotrod(
"rotrod");
2881 TGeoRotation* rotpos[2];
2883 TGeoRotation* rotrod1[2];
2887 auto* clampi1 =
new TGeoBBox(
"clampi1", 0.2, 3.1, 0.8);
2888 auto* clampi1v =
new TGeoVolume(
"TPC_clampi1v", clampi1, m6);
2890 pointstrap[0] = 0.49;
2891 pointstrap[1] = 0.375;
2893 pointstrap[2] = 0.49;
2894 pointstrap[3] = -0.375;
2896 pointstrap[4] = -0.49;
2897 pointstrap[5] = -0.375;
2899 pointstrap[6] = -0.49;
2900 pointstrap[7] = 1.225;
2902 pointstrap[8] = 0.49;
2903 pointstrap[9] = 0.375;
2905 pointstrap[10] = 0.49;
2906 pointstrap[11] = -0.375;
2908 pointstrap[12] = -0.49;
2909 pointstrap[13] = -0.375;
2911 pointstrap[14] = -0.49;
2912 pointstrap[15] = 1.225;
2914 auto* clitrap =
new TGeoArb8(
"clitrap", 0.25, pointstrap);
2915 auto* clitrapv =
new TGeoVolume(
"TPC_clitrapv", clitrap, m6);
2917 auto* clamprot =
new TGeoRotation();
2918 clamprot->RotateX(180.);
2920 new TGeoBBox(
"clibox", 1.125, 3.1, .1);
2921 new TGeoTube(
"clitub", 0., 2.2, 0.1);
2925 auto* clitr1 =
new TGeoTranslation(
"clitr1", 1.125, 0., 0.);
2926 clitr1->RegisterYourself();
2927 auto* clihold =
new TGeoCompositeShape(
"clihold",
"clibox-clitub:clitr1");
2928 auto* cliholdv =
new TGeoVolume(
"TPC_cliholdv", clihold, m6);
2932 TGeoVolume* iclamp =
new TGeoVolumeAssembly(
"TPC_iclamp");
2934 iclamp->AddNode(clampi1v, 1);
2935 iclamp->AddNode(clitrapv, 1,
new TGeoTranslation(0.69, -2.725, 0.35));
2936 iclamp->AddNode(clitrapv, 2,
new TGeoTranslation(0.69, -2.725, -0.35));
2937 iclamp->AddNode(clitrapv, 3,
new TGeoCombiTrans(0.69, 2.725, 0.35, clamprot));
2938 iclamp->AddNode(clitrapv, 4,
new TGeoCombiTrans(0.69, 2.725, -0.35, clamprot));
2939 iclamp->AddNode(cliholdv, 1,
new TGeoTranslation(1.325, 0., 0.));
2943 auto* clampo1 =
new TGeoBBox(
"clampo1", 0.25, 3.1, 1.);
2944 auto* clampo2 =
new TGeoBBox(
"clampo2", 0.4, 0.85, 1.);
2946 auto* clampo1v =
new TGeoVolume(
"TPC_clampo1v", clampo1, m6);
2947 auto* clampo2v =
new TGeoVolume(
"TPC_clampo2v", clampo2, m6);
2949 auto* oclamp =
new TGeoVolumeAssembly(
"TPC_oclamp");
2951 oclamp->AddNode(clampo1v, 1);
2953 oclamp->AddNode(clampo2v, 1,
new TGeoTranslation(0.65, -2.25, 0));
2954 oclamp->AddNode(clampo2v, 2,
new TGeoTranslation(0.65, 2.25, 0));
2957 pointstrap[0] = 0.375;
2958 pointstrap[1] = 0.75;
2959 pointstrap[2] = 0.375;
2960 pointstrap[3] = -0.35;
2961 pointstrap[4] = -0.375;
2962 pointstrap[5] = -0.35;
2963 pointstrap[6] = -0.375;
2964 pointstrap[7] = 0.35;
2966 pointstrap[8] = 0.375;
2967 pointstrap[9] = 0.75;
2968 pointstrap[10] = 0.375;
2969 pointstrap[11] = -0.35;
2970 pointstrap[12] = -0.375;
2971 pointstrap[13] = -0.35;
2972 pointstrap[14] = -0.375;
2973 pointstrap[15] = 0.35;
2975 auto* clotrap =
new TGeoArb8(
"clotrap", 0.25, pointstrap);
2976 auto* clotrapv =
new TGeoVolume(
"TPC_clotrapv", clotrap, m6);
2978 oclamp->AddNode(clotrapv, 1,
new TGeoTranslation(-0.625, -2.75, 0.35));
2979 oclamp->AddNode(clotrapv, 2,
new TGeoTranslation(-0.625, -2.75, -0.35));
2980 oclamp->AddNode(clotrapv, 3,
new TGeoCombiTrans(-0.625, 2.75, 0.35, clamprot));
2981 oclamp->AddNode(clotrapv, 4,
new TGeoCombiTrans(-0.625, 2.75, -0.35, clamprot));
2983 auto* clampo3 =
new TGeoBBox(
"clampo3", 1.6, 0.45, .1);
2984 auto* clampo3v =
new TGeoVolume(
"TPC_clampo3v", clampo3, m6);
2986 oclamp->AddNode(clampo3v, 1,
new TGeoTranslation(-1.85, 2.625, 0.));
2987 oclamp->AddNode(clampo3v, 2,
new TGeoTranslation(-1.85, -2.625, 0));
2989 auto* clampo4 =
new TGeoTubeSeg(
"clampo4", 2.2, 3.1, 0.1, 90., 270.);
2990 auto* clampo4v =
new TGeoVolume(
"TPC_clampo4v", clampo4, m6);
2992 oclamp->AddNode(clampo4v, 1,
new TGeoTranslation(-3.45, 0., 0.));
2996 TGeoRotation rot102(
"rot102");
2997 rot102.RotateY(-90.);
2999 for (Int_t
i = 0;
i < 18;
i++) {
3002 angle = TMath::DegToRad() * 20. * (Double_t)
i;
3008 auto* rot12 =
new TGeoRotation();
3009 rot12->RotateZ(-90.0 +
i * 20.);
3010 v9->AddNode(tpcihpl,
i + 1,
new TGeoCombiTrans(
x,
y, 0., rot12));
3013 rotrod.RotateZ(-90. +
i * 20.);
3014 rotrod1[0] =
new TGeoRotation();
3015 rotpos[0] =
new TGeoRotation();
3017 rotrod1[0]->RotateZ(90. +
i * 20.);
3018 *rotpos[0] = refl * rotrod;
3019 v9->AddNode(tpcrrod, 1,
new TGeoCombiTrans(
x,
y,
z, rotrod1[0]));
3020 v9->AddNode(tpcrrod, 2,
new TGeoCombiTrans(
x,
y, -
z, rotpos[0]));
3022 v9->AddNode(tpcmrod,
i + 1,
new TGeoTranslation(
x,
y,
z));
3023 v9->AddNode(tpcmrod,
i + 19,
new TGeoCombiTrans(
x,
y, -
z,
ref));
3031 rot12 =
new TGeoRotation();
3032 rot12->RotateZ(
i * 20.);
3035 v9->AddNode(iclamp, 7 *
i + 1,
new TGeoCombiTrans(
x,
y, 5.25, rot12));
3036 v9->AddNode(iclamp, 7 *
i + 2,
new TGeoCombiTrans(
x,
y, 38.25, rot12));
3037 v9->AddNode(iclamp, 7 *
i + 3,
new TGeoCombiTrans(
x,
y, 80.25, rot12));
3038 v9->AddNode(iclamp, 7 *
i + 4,
new TGeoCombiTrans(
x,
y, 122.25, rot12));
3039 v9->AddNode(iclamp, 7 *
i + 5,
new TGeoCombiTrans(
x,
y, 164.25, rot12));
3040 v9->AddNode(iclamp, 7 *
i + 6,
new TGeoCombiTrans(
x,
y, 206.25, rot12));
3041 v9->AddNode(iclamp, 7 *
i + 7,
new TGeoCombiTrans(
x,
y, 246.75, rot12));
3043 v9->AddNode(iclamp, 7 *
i + 127,
new TGeoCombiTrans(
x,
y, -5.25, rot12));
3044 v9->AddNode(iclamp, 7 *
i + 128,
new TGeoCombiTrans(
x,
y, -38.25, rot12));
3045 v9->AddNode(iclamp, 7 *
i + 129,
new TGeoCombiTrans(
x,
y, -80.25, rot12));
3046 v9->AddNode(iclamp, 7 *
i + 130,
new TGeoCombiTrans(
x,
y, -122.25, rot12));
3047 v9->AddNode(iclamp, 7 *
i + 131,
new TGeoCombiTrans(
x,
y, -164.25, rot12));
3048 v9->AddNode(iclamp, 7 *
i + 132,
new TGeoCombiTrans(
x,
y, -206.25, rot12));
3049 v9->AddNode(iclamp, 7 *
i + 133,
new TGeoCombiTrans(
x,
y, -246.75, rot12));
3061 auto* rot33 =
new TGeoRotation();
3062 rot33->RotateZ(-90 +
i * 20.);
3064 v9->AddNode(tpcohpl,
i + 1,
new TGeoCombiTrans(
x,
y, 0., rot33));
3066 Double_t xxx = 256.297 * TMath::Cos((
i * 20. + 10.) * TMath::DegToRad());
3067 Double_t yyy = 256.297 * TMath::Sin((
i * 20. + 10.) * TMath::DegToRad());
3069 TGeoRotation rot101(
"rot101");
3070 rot101.RotateZ(90. +
i * 20. + 10.);
3071 auto* rot103 =
new TGeoRotation(
"rot103");
3072 *rot103 = rot101 * rot102;
3074 auto* trh100 =
new TGeoCombiTrans(xxx, yyy, 0., rot103);
3078 v9->AddNode(tpcmmh, 1, trh100);
3081 v9->AddNode(tpcomh,
i + 1, trh100);
3086 rotrod.RotateZ(90. +
i * 20.);
3087 rotrod1[1] =
new TGeoRotation();
3088 rotpos[1] =
new TGeoRotation();
3089 rotrod1[1]->RotateZ(90. +
i * 20.);
3090 *rotpos[1] = refl * rotrod;
3091 v9->AddNode(tpcrrod, 3,
new TGeoCombiTrans(
x,
y,
z, rotrod1[1]));
3092 v9->AddNode(tpcrrod, 4,
new TGeoCombiTrans(
x,
y, -
z, rotpos[1]));
3094 v9->AddNode(tpcmrod,
i + 37,
new TGeoTranslation(
x,
y,
z));
3095 v9->AddNode(tpcmrod,
i + 55,
new TGeoCombiTrans(
x,
y, -
z,
ref));
3098 v9->AddNode(hvrv, 1,
new TGeoTranslation(
x,
y,
z + 0.7));
3106 rot12 =
new TGeoRotation();
3107 rot12->RotateZ(
i * 20.);
3110 v9->AddNode(oclamp, 7 *
i + 1,
new TGeoCombiTrans(
x,
y, 5.25, rot12));
3111 v9->AddNode(oclamp, 7 *
i + 2,
new TGeoCombiTrans(
x,
y, 38.25, rot12));
3112 v9->AddNode(oclamp, 7 *
i + 3,
new TGeoCombiTrans(
x,
y, 80.25, rot12));
3113 v9->AddNode(oclamp, 7 *
i + 4,
new TGeoCombiTrans(
x,
y, 122.25, rot12));
3114 v9->AddNode(oclamp, 7 *
i + 5,
new TGeoCombiTrans(
x,
y, 164.25, rot12));
3115 v9->AddNode(oclamp, 7 *
i + 6,
new TGeoCombiTrans(
x,
y, 206.25, rot12));
3116 v9->AddNode(oclamp, 7 *
i + 7,
new TGeoCombiTrans(
x,
y, 246.75, rot12));
3118 v9->AddNode(oclamp, 7 *
i + 127,
new TGeoCombiTrans(
x,
y, -5.25, rot12));
3119 v9->AddNode(oclamp, 7 *
i + 128,
new TGeoCombiTrans(
x,
y, -38.25, rot12));
3120 v9->AddNode(oclamp, 7 *
i + 129,
new TGeoCombiTrans(
x,
y, -80.25, rot12));
3121 v9->AddNode(oclamp, 7 *
i + 130,
new TGeoCombiTrans(
x,
y, -122.25, rot12));
3122 v9->AddNode(oclamp, 7 *
i + 131,
new TGeoCombiTrans(
x,
y, -164.25, rot12));
3123 v9->AddNode(oclamp, 7 *
i + 132,
new TGeoCombiTrans(
x,
y, -206.25, rot12));
3124 v9->AddNode(oclamp, 7 *
i + 133,
new TGeoCombiTrans(
x,
y, -246.75, rot12));
3128 TGeoVolume* alice = gGeoManager->GetVolume(
"barrel");
3129 alice->AddNode(
v1, 1,
new TGeoTranslation(0., 30., 0.));
3133void Detector::LoadGeometryFromFile()
3136 if (mGeoFileName.IsNull()) {
3137 LOG(fatal) <<
"TPC geometry file name not set";
3141 TFile* fGeoFile = TFile::Open(mGeoFileName);
3142 if (!fGeoFile || !fGeoFile->IsOpen() || fGeoFile->IsZombie()) {
3143 LOG(fatal) <<
"Could not open TPC geometry file '" << mGeoFileName <<
"'";
3147 TGeoVolume* tpcVolume =
dynamic_cast<TGeoVolume*
>(fGeoFile->Get(
"TPC_M"));
3149 LOG(fatal) <<
"Could not retrieve TPC geometry from file '" << mGeoFileName <<
"'";
3153 LOG(info) <<
"Loaded TPC geometry from file '" << mGeoFileName <<
"'";
3154 TGeoVolume* alice = gGeoManager->GetVolume(
"barrel");
3155 alice->AddNode(tpcVolume, 1,
new TGeoTranslation(0., 30., 0.));
3158void Detector::defineSensitiveVolumes()
3160 TGeoManager* geoManager = gGeoManager;
3161 TGeoVolume*
v =
nullptr;
3165 const Int_t nSensitive = 1;
3166 const char* volumeNames[nSensitive] = {
"TPC_Drift"};
3169 for (Int_t ivol = 0; ivol < nSensitive; ++ivol) {
3170 TString volumeName = volumeNames[ivol];
3171 v = geoManager->GetVolume(volumeName.Data());
3173 LOG(error) <<
"Could not find volume '" << volumeName <<
"'";
3178 AddSensitiveVolume(
v);
3182 auto vmc = TVirtualMC::GetMC();
3183 if (strcmp(vmc->GetName(),
"TFluka") == 0) {
3184 LOG(info) <<
"Setting special FLUKA parameters for TPC Driftgas";
3186 Int_t
index = mgr.getMediumID(
"TPC", kDriftGas2);
3187 vmc->Gstpar(
index,
"PRIMIO_E", 20.77);
3188 vmc->Gstpar(
index,
"PRIMIO_N", 14.35);
3189 vmc->Gstpar(
index,
"LOSS", 14);
3190 vmc->Gstpar(
index,
"STRA", 4);
3196 static thread_local Double_t
n = 0;
3197 static thread_local Double_t
c1 = 0;
3198 static thread_local Double_t
c2 = 0;
3199 static thread_local Double_t
b1 = 0;
3200 static thread_local Double_t b2 = 0;
3204 }
else if (k >= 0.4 && k < 4) {
3205 n = 1. / k + (k - 0.4) / k / 3.6;
3206 }
else if (k >= 4.) {
3207 n = 1. / TMath::Sqrt(k);
3211 c1 = (k < 0.4) ? 0 :
b1 * (TMath::Log(
b1) - 1.) / 2.;
3212 c2 = b2 * (TMath::Log(b2) - 1.) / 2.;
3217 Double_t nu1 = gRandom->Rndm();
3218 Double_t nu2 = gRandom->Rndm();
3219 Double_t w1 =
c1 + TMath::Log(nu1);
3220 Double_t w2 =
c2 + TMath::Log(nu2);
3221 y =
n * (
b1 * w2 - b2 * w1);
3226 if (TMath::Log(
y) >=
x) {
3230 return TMath::Exp(
x);
3237 name.Form(
"%sHitsShiftedSector%d", GetName(), probe);
3238 return std::string(
name.Data());
3240 return std::string();