244 const double eDep = TMath::Power((kMax - kMin) * rndm + kMin, oneOverAlpha_p1);
245 int nel_step =
static_cast<int>(((eDep - eMin) / wIon) + 1);
246 nel_step = TMath::Min(nel_step, gasParam.MaxElePerStep);
247 numberOfElectrons += nel_step;
255 if (numberOfElectrons <= 0) {
261 if (!mCurrentGroup) {
262 mOldTrackId = trackID;
263 mOldSectorId = sectorID;
268 if (mGroupCounter == 0) {
269 mHitsPerSectorCollection[sectorID]->emplace_back(trackID);
270 mCurrentGroup = &(mHitsPerSectorCollection[sectorID]->back());
272 if (trackID == mOldTrackId && mOldSectorId == sectorID) {
275 mElectronCounter += numberOfElectrons;
276 mCurrentGroup->addHit(position.X(), position.Y(), position.Z(),
time, numberOfElectrons);
279 if (mHitLast.GetEnergyLoss() >= 0) {
280 mCurrentGroup->addHit(mHitLast.GetX(), mHitLast.GetY(), mHitLast.GetZ(), mHitLast.GetTime(), mHitLast.GetEnergyLoss());
283 mElectronCounter += mHitLast.GetEnergyLoss();
284 mHitLast.mELoss = -1;
289 mOldTrackId = trackID;
290 mOldSectorId = sectorID;
294 mHitLast =
ElementalHit(position.X(), position.Y(), position.Z(),
time, numberOfElectrons);
306 stack->addHit(GetDetId());
314 mCurrentGroup =
nullptr;
315 mHitLast.mELoss = -1;
318 mHitsPerSectorCollection[
i]->clear();
331 auto* mgr = FairRootManager::Instance();
341 mHitsPerSectorCollection[
i]->clear();
352 ConstructTPCGeometry();
355void Detector::CreateMaterials()
365 const auto& gasParam = ParameterGas::Instance();
379 const Double_t pressure = gasParam.Pressure;
380 const Double_t temperature = gasParam.Temperature + 273.15;
383 const Double_t
t1 = 293.15;
384 const Double_t
p1 = 1013.25;
387 Double_t ptCorr = 1.;
388 if (TMath::Abs(temperature - 293.15) > 10. || TMath::Abs(pressure - 1000.) > 200.) {
391 ptCorr = (pressure *
t1) / (
p1 * temperature);
393 LOG(info) <<
"Setting gas density correction to: " << ptCorr;
443 TString names[6] = {
"Ne",
"Ar",
"CO2",
"N",
"CF4",
"CH4"};
448 Float_t comp[6] = {90. / 105., 0., 10. / 105., 5. / 105., 0., 0.};
479 wmol[3] = 2. * 14.0067;
484 for (Int_t
i = 0;
i < 6;
i++) {
485 wtot += *(comp +
i) * wmol[
i];
487 wmat[0] = comp[0] * amat[0] / wtot;
488 wmat[1] = comp[1] * amat[1] / wtot;
489 wmat[2] = (comp[2] * amat[2] + comp[4] * amat[2] + comp[5] * amat[2]) / wtot;
490 wmat[3] = comp[2] * amat[3] * 2. / wtot;
491 wmat[4] = comp[3] * amat[4] * 2. / wtot;
492 wmat[5] = comp[4] * amat[5] * 4. / wtot;
493 wmat[6] = comp[5] * amat[6] * 4. / wtot;
497 Float_t dens[6] = {0.839e-3, 1.661e-3, 1.842e-3, 1.165e-3, 3.466e-3, 0.668e-3};
500 for (Int_t
i = 0;
i < 6;
i++) {
501 density += comp[
i] * dens[
i];
507 for (Int_t
i = 0;
i < 6;
i++) {
516 TString gname1, gname2, gname3;
517 gname1 = gname +
"-1";
518 gname2 = gname +
"-2";
519 gname3 = gname +
"-3";
523 Float_t amat1[6], zmat1[6], wmat1[6];
525 for (Int_t
i = 0;
i < 7;
i++) {
527 zmat1[cnt] = zmat[
i];
528 amat1[cnt] = amat[
i];
529 wmat1[cnt] = wmat[
i];
932 o2::base::Detector::Medium(kAir,
"Air", 11, 0, iSXFLD, sXMGMX, 10., 999., .1, .01, .1);
933 o2::base::Detector::Medium(kDriftGas1,
"DriftGas1", 12, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
934 o2::base::Detector::Medium(kDriftGas2,
"DriftGas2", 13, 1, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
935 o2::base::Detector::Medium(kCO2,
"CO2", 10, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
936 o2::base::Detector::Medium(kDriftGas3,
"DriftGas3", 40, 1, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
941 o2::base::Detector::Medium(kAl,
"Al", 23, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
942 o2::base::Detector::Medium(kKevlar,
"Kevlar", 14, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
943 o2::base::Detector::Medium(kNomex,
"Nomex", 15, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
944 o2::base::Detector::Medium(kMakrolon,
"Makrolon", 16, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
945 o2::base::Detector::Medium(kMylar,
"Mylar", 18, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
946 o2::base::Detector::Medium(kTedlar,
"Tedlar", 17, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
948 o2::base::Detector::Medium(kPrepreg1,
"Prepreg1", 19, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
949 o2::base::Detector::Medium(kPrepreg2,
"Prepreg2", 20, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
950 o2::base::Detector::Medium(kPrepreg3,
"Prepreg3", 21, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
951 o2::base::Detector::Medium(kEpoxy,
"Epoxy", 26, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
953 o2::base::Detector::Medium(kCu,
"Cu", 25, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
954 o2::base::Detector::Medium(kSi,
"Si", 24, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
955 o2::base::Detector::Medium(kG10,
"G10", 22, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
956 o2::base::Detector::Medium(kPlexiglas,
"Plexiglas", 27, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
957 o2::base::Detector::Medium(kSteel,
"Steel", 29, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
958 o2::base::Detector::Medium(kPeek,
"Peek", 30, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
959 o2::base::Detector::Medium(kAlumina,
"Alumina", 31, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
960 o2::base::Detector::Medium(kWater,
"Water", 32, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
961 o2::base::Detector::Medium(kBrass,
"Brass", 33, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
962 o2::base::Detector::Medium(kEpoxyfm,
"Epoxyfm", 34, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
963 o2::base::Detector::Medium(kEpoxy1,
"Epoxy1", 35, 0, iSXFLD, sXMGMX, 10., 999., .1, .0005, .001);
964 o2::base::Detector::Medium(kAlumina1,
"Alumina1", 36, 0, iSXFLD, sXMGMX, 10., 999., .1, .001, .001);
967void Detector::ConstructTPCGeometry()
1001 auto* tpc =
new TGeoPcon(0., 360., 30);
1003 tpc->DefineSection(0, -289.6, 77., 278.);
1004 tpc->DefineSection(1, -262.1, 77., 278.);
1006 tpc->DefineSection(2, -262.1, 83.1, 278.);
1007 tpc->DefineSection(3, -260., 83.1, 278.);
1009 tpc->DefineSection(4, -260., 70., 278.);
1010 tpc->DefineSection(5, -259.6, 70., 278.);
1012 tpc->DefineSection(6, -259.6, 68.1, 278.);
1013 tpc->DefineSection(7, -253.6, 68.1, 278.);
1015 tpc->DefineSection(8, -253.6, 67.88, 278.);
1016 tpc->DefineSection(9, -74.0, 60.68, 278.);
1018 tpc->DefineSection(10, -74.0, 60.1, 278.);
1019 tpc->DefineSection(11, -73.3, 60.1, 278.);
1021 tpc->DefineSection(12, -73.3, 56.9, 278.);
1022 tpc->DefineSection(13, -68.5, 56.9, 278.);
1024 tpc->DefineSection(14, -68.5, 60., 278.);
1025 tpc->DefineSection(15, -64.7, 60., 278.);
1027 tpc->DefineSection(16, -64.7, 56.9, 278.);
1028 tpc->DefineSection(17, 73.3, 56.9, 278.);
1030 tpc->DefineSection(18, 73.3, 60.1, 278.);
1031 tpc->DefineSection(19, 74.0, 60.1, 278.);
1033 tpc->DefineSection(20, 74.0, 60.68, 278.);
1034 tpc->DefineSection(21, 253.6, 65.38, 278.);
1036 tpc->DefineSection(22, 253.6, 65.6, 278.);
1037 tpc->DefineSection(23, 259.6, 65.6, 278.);
1039 tpc->DefineSection(24, 259.6, 70.0, 278.);
1040 tpc->DefineSection(25, 260., 70.0, 278.);
1042 tpc->DefineSection(26, 260., 83.1, 278.);
1043 tpc->DefineSection(27, 262.1, 83.1, 278.);
1045 tpc->DefineSection(28, 262.1, 77., 278);
1046 tpc->DefineSection(29, 289.6, 77., 278.);
1048 TGeoMedium*
m1 = gGeoManager->GetMedium(
"TPC_Air");
1049 auto*
v1 =
new TGeoVolume(
"TPC_M", tpc, m1);
1054 auto* dvol =
new TGeoPcon(0., 360., 6);
1055 dvol->DefineSection(0, -260., 74.5, 264.4);
1056 dvol->DefineSection(1, -253.6, 74.5, 264.4);
1058 dvol->DefineSection(2, -253.6, 76.6774, 258.);
1059 dvol->DefineSection(3, 253.6, 76.6774, 258.);
1061 dvol->DefineSection(4, 253.6, 74.5, 264.4);
1062 dvol->DefineSection(5, 260., 74.5, 264.4);
1064 TGeoMedium*
m5 = gGeoManager->GetMedium(
"TPC_DriftGas2");
1065 auto* v9 =
new TGeoVolume(
"TPC_Drift", dvol, m5);
1071 auto* tpco =
new TGeoPcon(0., 360., 6);
1073 tpco->DefineSection(0, -256.6, 264.8, 278.);
1074 tpco->DefineSection(1, -253.6, 264.8, 278.);
1076 tpco->DefineSection(2, -253.6, 258., 278.);
1077 tpco->DefineSection(3, 250.6, 258., 278.);
1079 tpco->DefineSection(4, 250.6, 258., 275.5);
1080 tpco->DefineSection(5, 253.6, 258., 275.5);
1082 TGeoMedium*
m2 = gGeoManager->GetMedium(
"TPC_CO2");
1083 auto*
v2 =
new TGeoVolume(
"TPC_OI", tpco, m2);
1085 TGeoRotation* segrot;
1089 auto* tocv =
new TGeoPcon(0., 360., 6);
1091 tocv->DefineSection(0, -256.6, 264.8, 278.);
1092 tocv->DefineSection(1, -253.6, 264.8, 278.);
1094 tocv->DefineSection(2, -253.6, 274.8124, 278.);
1095 tocv->DefineSection(3, 247.6, 274.8124, 278.);
1097 tocv->DefineSection(4, 247.6, 270.4, 278.);
1098 tocv->DefineSection(5, 250.6, 270.4, 278.);
1100 TGeoMedium*
m3 = gGeoManager->GetMedium(
"TPC_Al");
1101 auto*
v3 =
new TGeoVolume(
"TPC_OCV", tocv, m3);
1103 auto* to1 =
new TGeoTubeSeg(274.8174, 277.995, 252.1, 0., 59.9);
1104 auto* to2 =
new TGeoTubeSeg(274.8274, 277.985, 252.1, 0., 59.9);
1105 auto* to3 =
new TGeoTubeSeg(274.8312, 277.9812, 252.1, 0., 59.9);
1106 auto* to4 =
new TGeoTubeSeg(274.9062, 277.9062, 252.1, 0., 59.9);
1107 auto* tog5 =
new TGeoTubeSeg(274.8174, 277.995, 252.1, 59.9, 60.);
1109 TGeoMedium* sm1 = gGeoManager->GetMedium(
"TPC_Epoxy");
1110 TGeoMedium* sm2 = gGeoManager->GetMedium(
"TPC_Tedlar");
1111 TGeoMedium* sm3 = gGeoManager->GetMedium(
"TPC_Prepreg2");
1112 TGeoMedium* sm4 = gGeoManager->GetMedium(
"TPC_Nomex");
1114 TGeoMedium* smep = gGeoManager->GetMedium(
"TPC_Epoxy1");
1116 auto* tov1 =
new TGeoVolume(
"TPC_OCV1", to1, sm1);
1117 auto* tov2 =
new TGeoVolume(
"TPC_OCV2", to2, sm2);
1118 auto* tov3 =
new TGeoVolume(
"TPC_OCV3", to3, sm3);
1119 auto* tov4 =
new TGeoVolume(
"TPC_OCV4", to4, sm4);
1120 auto* togv5 =
new TGeoVolume(
"TPC_OCVG5", tog5, sm1);
1122 TGeoMedium* mhs = gGeoManager->GetMedium(
"TPC_Steel");
1123 TGeoMedium* m12 = gGeoManager->GetMedium(
"TPC_Water");
1129 auto* tofc =
new TGeoPcon(0., 360., 6);
1131 tofc->DefineSection(0, -253.6, 258., 269.6);
1132 tofc->DefineSection(1, -250.6, 258., 269.6);
1134 tofc->DefineSection(2, -250.6, 258., 260.0676);
1135 tofc->DefineSection(3, 250.6, 258., 260.0676);
1137 tofc->DefineSection(4, 250.6, 258., 275.5);
1138 tofc->DefineSection(5, 253.6, 258., 275.5);
1140 auto* v4 =
new TGeoVolume(
"TPC_TOFC", tofc, m3);
1142 auto* tf1 =
new TGeoTubeSeg(258.0, 260.0676, 252.1, 0., 59.9);
1143 auto* tf2 =
new TGeoTubeSeg(258.0038, 260.0638, 252.1, 0., 59.9);
1144 auto* tf3 =
new TGeoTubeSeg(258.0338, 260.0338, 252.1, 0., 59.9);
1145 auto* tfg4 =
new TGeoTubeSeg(258.0, 260.0676, 252.1, 59.9, 60.);
1147 TGeoMedium* sm5 = gGeoManager->GetMedium(
"TPC_Prepreg3");
1149 auto* tf1v =
new TGeoVolume(
"TPC_OFC1", tf1, sm2);
1150 auto* tf2v =
new TGeoVolume(
"TPC_OFC2", tf2, sm5);
1151 auto* tf3v =
new TGeoVolume(
"TPC_OFC3", tf3, sm4);
1152 auto* tfg4v =
new TGeoVolume(
"TPC_OFCG4", tfg4, smep);
1156 tov1->AddNode(tov2, 1);
1157 tov2->AddNode(tov3, 1);
1158 tov3->AddNode(tov4, 1);
1160 tf1v->AddNode(tf2v, 1);
1161 tf2v->AddNode(tf3v, 1);
1163 auto* t200 =
new TGeoVolumeAssembly(
"TPC_OCVSEG");
1164 auto* t300 =
new TGeoVolumeAssembly(
"TPC_OFCSEG");
1169 t200->AddNode(tov1, 1);
1170 t200->AddNode(togv5, 1);
1171 t300->AddNode(tf1v, 1);
1172 t300->AddNode(tfg4v, 1);
1174 segrot =
new TGeoRotation();
1175 segrot->RotateZ(60.);
1176 t200->AddNode(tov1, 2, segrot);
1177 t200->AddNode(togv5, 2, segrot);
1178 t300->AddNode(tf1v, 2, segrot);
1179 t300->AddNode(tfg4v, 2, segrot);
1181 segrot =
new TGeoRotation();
1182 segrot->RotateZ(120.);
1183 t200->AddNode(tov1, 3, segrot);
1184 t200->AddNode(togv5, 3, segrot);
1185 t300->AddNode(tf1v, 3, segrot);
1186 t300->AddNode(tfg4v, 3, segrot);
1188 segrot =
new TGeoRotation();
1189 segrot->RotateZ(180.);
1190 t200->AddNode(tov1, 4, segrot);
1191 t200->AddNode(togv5, 4, segrot);
1192 t300->AddNode(tf1v, 4, segrot);
1193 t300->AddNode(tfg4v, 4, segrot);
1195 segrot =
new TGeoRotation();
1196 segrot->RotateZ(240.);
1197 t200->AddNode(tov1, 5, segrot);
1198 t200->AddNode(togv5, 5, segrot);
1199 t300->AddNode(tf1v, 5, segrot);
1200 t300->AddNode(tfg4v, 5, segrot);
1202 segrot =
new TGeoRotation();
1203 segrot->RotateZ(300.);
1204 t200->AddNode(tov1, 6, segrot);
1205 t200->AddNode(togv5, 6, segrot);
1206 t300->AddNode(tf1v, 6, segrot);
1207 t300->AddNode(tfg4v, 6, segrot);
1209 v3->AddNode(t200, 1,
new TGeoTranslation(0., 0., -1.5));
1210 v4->AddNode(t300, 1);
1219 auto* ogri =
new TGeoTube(257.985, 258., 0.6);
1220 auto* ogro =
new TGeoTube(260.0676, 260.0826, 0.6);
1222 auto* ogriv =
new TGeoVolume(
"TPC_OGRI", ogri, m3);
1223 auto* ogrov =
new TGeoVolume(
"TPC_OGRO", ogro, m3);
1225 for (Int_t
i = 0;
i < 24;
i++) {
1226 v9->AddNode(ogriv, (
i + 1),
new TGeoTranslation(0., 0., (
i + 1) * 10));
1227 v9->AddNode(ogriv, (
i + 25),
new TGeoTranslation(0., 0., -(
i + 1) * 10));
1228 v2->AddNode(ogrov, (
i + 1),
new TGeoTranslation(0., 0., (
i + 1) * 10));
1229 v2->AddNode(ogrov, (
i + 25),
new TGeoTranslation(0., 0., -(
i + 1) * 10));
1236 auto* tpci =
new TGeoPcon(0., 360., 4);
1238 tpci->DefineSection(0, -253.6, 68.4, 76.6774);
1239 tpci->DefineSection(1, -74.0, 61.2, 76.6774);
1241 tpci->DefineSection(2, 74.0, 61.2, 76.6774);
1243 tpci->DefineSection(3, 253.6, 65.9, 76.6774);
1245 auto* v5 =
new TGeoVolume(
"TPC_INI", tpci, m2);
1249 auto* tif1 =
new TGeoTube(69.9, 76.6774, 1.5);
1250 auto* v6 =
new TGeoVolume(
"TPC_IFC1", tif1, m3);
1255 auto* tcms =
new TGeoPcon(0., 360., 10);
1257 tcms->DefineSection(0, -259.1, 68.1, 74.2);
1258 tcms->DefineSection(1, -253.6, 68.1, 74.2);
1260 tcms->DefineSection(2, -253.6, 68.1, 68.4);
1261 tcms->DefineSection(3, -74.0, 60.9, 61.2);
1263 tcms->DefineSection(4, -74.0, 60.1, 61.2);
1264 tcms->DefineSection(5, -73.3, 60.1, 61.2);
1266 tcms->DefineSection(6, -73.3, 56.9, 61.2);
1267 tcms->DefineSection(7, -73.0, 56.9, 61.2);
1269 tcms->DefineSection(8, -73.0, 56.9, 58.8);
1270 tcms->DefineSection(9, -71.3, 56.9, 58.8);
1272 auto* v7 =
new TGeoVolume(
"TPC_ICVM", tcms, m3);
1277 auto* thsm =
new TGeoCone(89.8, 67.88, 68.1, 60.68, 60.9);
1278 auto* thsmw =
new TGeoCone(89.8, 67.94, 68.04, 60.74, 60.84);
1279 auto* hvsm =
new TGeoVolume(
"TPC_HSM", thsm, mhs);
1280 auto* hvsmw =
new TGeoVolume(
"TPC_HSMW", thsmw, m12);
1282 hvsm->AddNode(hvsmw, 1);
1286 auto* tcss =
new TGeoPcon(0., 360., 10);
1288 tcss->DefineSection(0, 71.3, 56.9, 58.8);
1289 tcss->DefineSection(1, 73.0, 56.9, 58.8);
1291 tcss->DefineSection(2, 73.0, 56.9, 61.2);
1292 tcss->DefineSection(3, 73.3, 56.9, 61.2);
1294 tcss->DefineSection(4, 73.3, 60.1, 61.2);
1295 tcss->DefineSection(5, 74.0, 60.1, 61.2);
1297 tcss->DefineSection(6, 74.0, 60.9, 61.2);
1298 tcss->DefineSection(7, 253.6, 65.6, 65.9);
1300 tcss->DefineSection(8, 253.6, 65.6, 74.2);
1301 tcss->DefineSection(9, 258.1, 65.6, 74.2);
1303 auto* v8 =
new TGeoVolume(
"TPC_ICVS", tcss, m3);
1307 auto* thss =
new TGeoCone(89.8, 60.68, 60.9, 65.38, 65.6);
1308 auto* thssw =
new TGeoCone(89.8, 60.74, 60.84, 65.44, 65.54);
1309 auto* hvss =
new TGeoVolume(
"TPC_HSS", thss, mhs);
1310 auto* hvssw =
new TGeoVolume(
"TPC_HSSW", thssw, m12);
1312 hvss->AddNode(hvssw, 1);
1318 auto*
t1 =
new TGeoTube(76.6774, 78.845, 0.75);
1319 auto* tv1 =
new TGeoVolume(
"TPC_IFC2",
t1, m3);
1324 auto* t2 =
new TGeoTubeSeg(76.6774, 78.845, 74.175, 350., 109.4);
1325 auto* t3 =
new TGeoTubeSeg(76.6812, 78.8412, 74.175, 350., 109.4);
1326 auto* t4 =
new TGeoTubeSeg(76.7312, 78.7912, 74.175, 350., 109.4);
1327 auto* t5 =
new TGeoTubeSeg(76.7612, 78.7612, 74.175, 350., 109.4);
1328 auto* tepox1 =
new TGeoTubeSeg(76.6774, 78.845, 74.175, 109.4, 110.);
1329 auto* tpr1 =
new TGeoTubeSeg(78.845, 78.885, 74.175, 109., 111.);
1332 auto* tv2 =
new TGeoVolume(
"TPC_IFC3", t2, sm2);
1333 auto* tv3 =
new TGeoVolume(
"TPC_IFC4", t3, sm3);
1334 auto* tv4 =
new TGeoVolume(
"TPC_IFC5", t4, sm5);
1335 auto* tv5 =
new TGeoVolume(
"TPC_IFC6", t5, sm4);
1336 auto* tvep1 =
new TGeoVolume(
"TPC_IFEPOX1", tepox1, smep);
1337 auto* tvpr1 =
new TGeoVolume(
"TPC_PRSTR1", tpr1, sm2);
1343 auto* t6 =
new TGeoTubeSeg(76.6774, 78.795, 5., 350., 109.4);
1344 auto* t7 =
new TGeoTubeSeg(76.6812, 78.7912, 5., 350., 109.4);
1345 auto* t8 =
new TGeoTubeSeg(76.7062, 78.7662, 5., 350., 109.4);
1346 auto* t9 =
new TGeoTubeSeg(76.7362, 78.7362, 5., 350., 109.4);
1347 auto* tepox2 =
new TGeoTubeSeg(76.6774, 78.795, 5., 109.4, 110.);
1348 auto* tpr2 =
new TGeoTubeSeg(78.795, 78.835, 5., 109., 111.);
1350 auto* tv6 =
new TGeoVolume(
"TPC_IFC7", t6, sm2);
1351 auto* tv7 =
new TGeoVolume(
"TPC_IFC8", t7, sm3);
1352 auto* tv8 =
new TGeoVolume(
"TPC_IFC9", t8, sm5);
1353 auto* tv9 =
new TGeoVolume(
"TPC_IFC10", t9, sm4);
1354 auto* tvep2 =
new TGeoVolume(
"TPC_IFEPOX2", tepox2, smep);
1355 auto* tvpr2 =
new TGeoVolume(
"TPC_PRSTR2", tpr2, sm2);
1360 auto* t10 =
new TGeoTubeSeg(76.6774, 78.785, 93.75, 350., 109.4);
1361 auto* t11 =
new TGeoTubeSeg(76.6812, 78.7812, 93.75, 350., 109.4);
1362 auto* t12 =
new TGeoTubeSeg(76.7312, 78.7312, 93.75, 350., 109.4);
1363 auto* tepox3 =
new TGeoTubeSeg(76.6774, 78.785, 93.75, 109.4, 110.);
1364 auto* tpr3 =
new TGeoTubeSeg(78.785, 78.825, 93.75, 109., 111.);
1366 auto* tv10 =
new TGeoVolume(
"TPC_IFC11", t10, sm2);
1367 auto* tv11 =
new TGeoVolume(
"TPC_IFC12", t11, sm5);
1368 auto* tv12 =
new TGeoVolume(
"TPC_IFC13", t12, sm4);
1369 auto* tvep3 =
new TGeoVolume(
"TPC_IFEPOX3", tepox3, smep);
1370 auto* tvpr3 =
new TGeoVolume(
"TPC_PRSTR3", tpr3, sm2);
1374 tv2->AddNode(tv3, 1);
1375 tv3->AddNode(tv4, 1);
1376 tv4->AddNode(tv5, 1);
1380 tv6->AddNode(tv7, 1);
1381 tv7->AddNode(tv8, 1);
1382 tv8->AddNode(tv9, 1);
1386 tv10->AddNode(tv11, 1);
1387 tv11->AddNode(tv12, 1);
1389 auto* tv100 =
new TGeoVolumeAssembly(
"TPC_IFC");
1395 tv100->AddNode(tv10, 1);
1396 tv100->AddNode(tvep3, 1);
1397 tv100->AddNode(tvpr3, 1);
1399 tv100->AddNode(tv6, 1,
new TGeoTranslation(0., 0., -98.75));
1400 tv100->AddNode(tv6, 2,
new TGeoTranslation(0., 0., 98.75));
1401 tv100->AddNode(tvep2, 1,
new TGeoTranslation(0., 0., -98.75));
1402 tv100->AddNode(tvep2, 2,
new TGeoTranslation(0., 0., 98.75));
1403 tv100->AddNode(tvpr2, 1,
new TGeoTranslation(0., 0., -98.75));
1404 tv100->AddNode(tvpr2, 2,
new TGeoTranslation(0., 0., 98.75));
1406 tv100->AddNode(tv2, 1,
new TGeoTranslation(0., 0., -177.925));
1407 tv100->AddNode(tv2, 2,
new TGeoTranslation(0., 0., 177.925));
1408 tv100->AddNode(tvep1, 1,
new TGeoTranslation(0., 0., -177.925));
1409 tv100->AddNode(tvep1, 2,
new TGeoTranslation(0., 0., 177.925));
1410 tv100->AddNode(tvpr1, 1,
new TGeoTranslation(0., 0., -177.925));
1411 tv100->AddNode(tvpr1, 2,
new TGeoTranslation(0., 0., 177.925));
1415 segrot =
new TGeoRotation();
1416 segrot->RotateZ(120.);
1419 tv100->AddNode(tv10, 2, segrot);
1420 tv100->AddNode(tvep3, 2, segrot);
1421 tv100->AddNode(tvpr3, 2, segrot);
1423 tv100->AddNode(tv6, 3,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1424 tv100->AddNode(tv6, 4,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1425 tv100->AddNode(tvep2, 3,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1426 tv100->AddNode(tvep2, 4,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1427 tv100->AddNode(tvpr2, 3,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1428 tv100->AddNode(tvpr2, 4,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1430 tv100->AddNode(tv2, 3,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1431 tv100->AddNode(tv2, 4,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1432 tv100->AddNode(tvep1, 3,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1433 tv100->AddNode(tvep1, 4,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1434 tv100->AddNode(tvpr1, 3,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1435 tv100->AddNode(tvpr1, 4,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1439 segrot =
new TGeoRotation();
1440 segrot->RotateZ(240.);
1443 tv100->AddNode(tv10, 3, segrot);
1444 tv100->AddNode(tvep3, 3, segrot);
1445 tv100->AddNode(tvpr3, 3, segrot);
1447 tv100->AddNode(tv6, 5,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1448 tv100->AddNode(tv6, 6,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1449 tv100->AddNode(tvep2, 5,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1450 tv100->AddNode(tvep2, 6,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1451 tv100->AddNode(tvpr2, 5,
new TGeoCombiTrans(0., 0., -98.75, segrot));
1452 tv100->AddNode(tvpr2, 6,
new TGeoCombiTrans(0., 0., 98.75, segrot));
1454 tv100->AddNode(tv2, 5,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1455 tv100->AddNode(tv2, 6,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1456 tv100->AddNode(tvep1, 5,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1457 tv100->AddNode(tvep1, 6,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1458 tv100->AddNode(tvpr1, 5,
new TGeoCombiTrans(0., 0., -177.925, segrot));
1459 tv100->AddNode(tvpr1, 6,
new TGeoCombiTrans(0., 0., 177.925, segrot));
1461 tv100->AddNode(tv1, 1,
new TGeoTranslation(0., 0., -252.85));
1462 tv100->AddNode(tv1, 2,
new TGeoTranslation(0., 0., 252.85));
1464 v5->AddNode(v6, 1,
new TGeoTranslation(0., 0., -252.1));
1465 v5->AddNode(v6, 2,
new TGeoTranslation(0., 0., 252.1));
1469 v1->AddNode(hvsm, 1,
new TGeoTranslation(0., 0., -163.8));
1470 v1->AddNode(hvss, 1,
new TGeoTranslation(0., 0., 163.8));
1471 v9->AddNode(tv100, 1);
1476 auto* igro =
new TGeoTube(76.6624, 76.6774, 0.6);
1477 auto* igrio =
new TGeoTube(78.845, 78.86, 0.6);
1478 auto* igrim =
new TGeoTube(78.795, 78.81, 0.6);
1479 auto* igric =
new TGeoTube(78.785, 78.8, 0.6);
1483 auto* igrov =
new TGeoVolume(
"TPC_IGR1", igro, m3);
1484 auto* igriov =
new TGeoVolume(
"TPC_IGR2", igrio, m3);
1485 auto* igrimv =
new TGeoVolume(
"TPC_IGR3", igrim, m3);
1486 auto* igricv =
new TGeoVolume(
"TPC_IGR4", igric, m3);
1490 for (Int_t
i = 0;
i < 24;
i++) {
1491 v5->AddNode(igrov, (
i + 1),
new TGeoTranslation(0., 0., (
i + 1) * 10));
1492 v5->AddNode(igrov, (
i + 25),
new TGeoTranslation(0., 0., -(
i + 1) * 10));
1497 for (Int_t
i = 0;
i < 9;
i++) {
1498 v9->AddNode(igricv, (
i + 1),
new TGeoTranslation(0., 0., (
i + 1) * 10));
1499 v9->AddNode(igricv, (
i + 10),
new TGeoTranslation(0., 0., -(
i + 1) * 10));
1501 v9->AddNode(igrimv, 1,
new TGeoTranslation(0., 0., 100.));
1502 v9->AddNode(igrimv, 2,
new TGeoTranslation(0., 0., -100.));
1504 for (Int_t
i = 0;
i < 13;
i++) {
1505 v9->AddNode(igriov,
i + 1,
new TGeoTranslation(0., 0., 100 + (
i + 1) * 10));
1506 v9->AddNode(igriov,
i + 14,
new TGeoTranslation(0., 0., -(100 + (
i + 1) * 10)));
1513 auto* cfl =
new TGeoPcon(0., 360., 6);
1514 cfl->DefineSection(0, -71.1, 59.7, 61.2);
1515 cfl->DefineSection(1, -68.6, 59.7, 61.2);
1517 cfl->DefineSection(2, -68.6, 60.6124, 61.2);
1518 cfl->DefineSection(3, 68.6, 60.6124, 61.2);
1520 cfl->DefineSection(4, 68.6, 59.7, 61.2);
1521 cfl->DefineSection(5, 71.1, 59.7, 61.2);
1523 auto* cflv =
new TGeoVolume(
"TPC_CDR", cfl, m3);
1525 auto* cd1 =
new TGeoTubeSeg(60.6224, 61.19, 69.8, 0.05, 119.95);
1526 auto* cd2 =
new TGeoTubeSeg(60.6262, 61.1862, 69.8, 0.05, 119.95);
1527 auto* cd3 =
new TGeoTubeSeg(60.6462, 61.1662, 69.8, 0.05, 119.95);
1528 auto* cd4 =
new TGeoTubeSeg(60.6562, 61.1562, 69.8, 0.05, 119.95);
1529 auto* tepox4 =
new TGeoTubeSeg(60.6224, 61.19, 69.8, 359.95, 0.05);
1531 TGeoMedium* sm6 = gGeoManager->GetMedium(
"TPC_Prepreg1");
1532 TGeoMedium* sm8 = gGeoManager->GetMedium(
"TPC_Epoxyfm");
1533 auto* cd1v =
new TGeoVolume(
"TPC_CDR1", cd1, sm2);
1534 auto* cd2v =
new TGeoVolume(
"TPC_CDR2", cd2, sm6);
1535 auto* cd3v =
new TGeoVolume(
"TPC_CDR3", cd3, sm8);
1536 auto* cd4v =
new TGeoVolume(
"TPC_CDR4", cd4, sm4);
1537 auto* tvep4 =
new TGeoVolume(
"TPC_IFEPOX4", tepox4, smep);
1541 auto* cdjl =
new TGeoTubeSeg(60.6562, 60.6762, 69.8, 0., 1.0);
1542 auto* cdju =
new TGeoTubeSeg(61.1362, 61.1562, 69.8, 0., 1.0);
1544 auto* cdjlv =
new TGeoVolume(
"TPC_CDJL", cdjl, sm6);
1545 auto* cdjuv =
new TGeoVolume(
"TPC_CDJU", cdju, sm6);
1549 auto* cs =
new TGeoTube(56.9, 61.2, 0.1);
1550 TGeoMedium* sm7 = gGeoManager->GetMedium(
"TPC_Mylar");
1551 auto* csv =
new TGeoVolume(
"TPC_CDRS", cs, sm7);
1552 v1->AddNode(csv, 1,
new TGeoTranslation(0., 0., -71.2));
1553 v1->AddNode(csv, 2,
new TGeoTranslation(0., 0., 71.2));
1556 auto* se =
new TGeoPcon(0., 360., 6);
1557 se->DefineSection(0, -72.8, 59.7, 61.2);
1558 se->DefineSection(1, -72.3, 59.7, 61.2);
1560 se->DefineSection(2, -72.3, 58.85, 61.2);
1561 se->DefineSection(3, -71.6, 58.85, 61.2);
1563 se->DefineSection(4, -71.6, 59.7, 61.2);
1564 se->DefineSection(5, -71.3, 59.7, 61.2);
1566 auto* sev =
new TGeoVolume(
"TPC_CDCE", se, m3);
1568 auto* si =
new TGeoTube(56.9, 58.8, 1.);
1569 auto* siv =
new TGeoVolume(
"TPC_CDCI", si, m3);
1573 auto*
ref =
new TGeoRotation(
"ref", 90., 0., 90., 90., 180., 0.);
1575 cd1v->AddNode(cd2v, 1);
1576 cd2v->AddNode(cd3v, 1);
1577 cd3v->AddNode(cd4v, 1);
1581 segrot =
new TGeoRotation();
1582 segrot->RotateZ(0.05);
1583 cd4v->AddNode(cdjlv, 1, segrot);
1584 cd4v->AddNode(cdjuv, 1, segrot);
1585 segrot =
new TGeoRotation();
1586 segrot->RotateZ(118.95);
1587 cd4v->AddNode(cdjlv, 2, segrot);
1588 cd4v->AddNode(cdjuv, 2, segrot);
1593 segrot =
new TGeoRotation();
1594 segrot->RotateZ(4.6);
1595 cflv->AddNode(cd1v, 1, segrot);
1596 cflv->AddNode(tvep4, 1, segrot);
1598 segrot =
new TGeoRotation();
1599 segrot->RotateZ(124.6);
1600 cflv->AddNode(cd1v, 2, segrot);
1601 cflv->AddNode(tvep4, 2, segrot);
1603 segrot =
new TGeoRotation();
1604 segrot->RotateZ(244.6);
1605 cflv->AddNode(cd1v, 3, segrot);
1606 cflv->AddNode(tvep4, 3, segrot);
1610 auto* hstr =
new TGeoTubeSeg(60.6124, 60.6224, 68.5, 0., 1.25);
1611 auto* hstrv =
new TGeoVolume(
"TPC_HSTR", hstr, m1);
1612 for (Int_t
i = 0;
i < 144;
i++) {
1613 Double_t
alpha = 1.25 +
i * 2.5;
1614 segrot =
new TGeoRotation();
1615 segrot->RotateZ(
alpha);
1616 cflv->AddNode(hstrv,
i + 1, segrot);
1619 v1->AddNode(siv, 1,
new TGeoTranslation(0., 0., -69.9));
1620 v1->AddNode(siv, 2,
new TGeoTranslation(0., 0., 69.9));
1621 v1->AddNode(sev, 1);
1622 v1->AddNode(sev, 2,
ref);
1623 v1->AddNode(cflv, 1);
1627 auto* ih =
new TGeoTube(81.05, 84.05, 0.3);
1628 auto* oh =
new TGeoTube(250., 256., 0.5);
1629 auto* mem =
new TGeoTube(84.05, 250., 0.00115);
1632 TGeoMedium*
m4 = gGeoManager->GetMedium(
"TPC_G10");
1634 auto* ihv =
new TGeoVolume(
"TPC_IHVH", ih, m3);
1635 auto* ohv =
new TGeoVolume(
"TPC_OHVH", oh, m3);
1637 auto* memv =
new TGeoVolume(
"TPC_HV", mem, sm7);
1639 auto*
cm =
new TGeoVolumeAssembly(
"TPC_HVMEM");
1640 cm->AddNode(ihv, 1);
1641 cm->AddNode(ohv, 1);
1642 cm->AddNode(memv, 1);
1649 Double_t openingAngle = 10. * TMath::DegToRad();
1650 Double_t thick = 1.5;
1651 Double_t shift = thick / TMath::Sin(openingAngle);
1653 Double_t lowEdge = 86.3;
1654 Double_t upEdge = 240.4;
1656 new TGeoTubeSeg(
"tpc_ssec", 74.5, 264.4, 3., 0., 20.);
1658 auto* tpc_hole =
new TGeoPgon(
"tpc_hole", 0., 20., 1, 4);
1660 tpc_hole->DefineSection(0, -3.5, lowEdge - shift, upEdge - shift);
1661 tpc_hole->DefineSection(1, -1.5, lowEdge - shift, upEdge - shift);
1663 tpc_hole->DefineSection(2, -1.5, lowEdge - shift, upEdge + 3. - shift);
1664 tpc_hole->DefineSection(3, 3.5, lowEdge - shift, upEdge + 3. - shift);
1666 Double_t ys = shift * TMath::Sin(openingAngle);
1667 Double_t xs = shift * TMath::Cos(openingAngle);
1668 auto* tr =
new TGeoTranslation(
"tr", xs, ys, 0.);
1669 tr->RegisterYourself();
1670 auto*
chamber =
new TGeoCompositeShape(
"tpc_ssec-tpc_hole:tr");
1671 auto* sv =
new TGeoVolume(
"TPC_WSEG", chamber, m3);
1672 auto* bar =
new TGeoPgon(
"bar", 0., 20., 1, 2);
1673 bar->DefineSection(0, -3., 131.5 - shift, 136.5 - shift);
1674 bar->DefineSection(1, 1.5, 131.5 - shift, 136.5 - shift);
1675 auto* barv =
new TGeoVolume(
"TPC_WBAR", bar, m3);
1676 auto* ch =
new TGeoVolumeAssembly(
"TPC_WCH");
1679 ch->AddNode(barv, 1, tr);
1685 TGeoMedium* m6 = gGeoManager->GetMedium(
"TPC_Makrolon");
1687 auto* ibody =
new TGeoTrd1(13.8742, 21.3328, 4.29, 21.15);
1688 auto* ibdv =
new TGeoVolume(
"TPC_IROCB", ibody, m3);
1690 auto* emp =
new TGeoTrd1(12.3742, 19.8328, 4.05, 19.65);
1691 auto* empv =
new TGeoVolume(
"TPC_IROCE", emp, m1);
1692 ibdv->AddNode(empv, 1,
new TGeoTranslation(0., -0.24, 0.));
1694 Double_t tga = (19.8328 - 12.3742) / 39.3;
1695 Double_t xmin, xmax;
1697 xmin = 9.65 * tga + 12.3742;
1698 xmax = 10.05 * tga + 12.3742;
1700 auto* ib1 =
new TGeoTrd1(xmin, xmax, 2.06, 0.2);
1701 auto* ib1v =
new TGeoVolume(
"TPC_IRB1", ib1, m3);
1702 empv->AddNode(ib1v, 1,
new TGeoTranslation(
"tt1", 0., 1.99, -9.8));
1704 xmin = 19.5 * tga + 12.3742;
1705 xmax = 19.9 * tga + 12.3742;
1707 auto* ib2 =
new TGeoTrd1(xmin, xmax, 2.06, 0.2);
1708 auto* ib2v =
new TGeoVolume(
"TPC_TRB2", ib2, m3);
1709 empv->AddNode(ib2v, 1,
new TGeoTranslation(0., 1.99, 0.05));
1711 xmin = 29.35 * tga + 12.3742;
1712 xmax = 29.75 * tga + 12.3742;
1714 auto* ib3 =
new TGeoTrd1(xmin, xmax, 2.06, 0.2);
1715 auto* ib3v =
new TGeoVolume(
"TPC_IRB3", ib3, m3);
1716 empv->AddNode(ib3v, 1,
new TGeoTranslation(0., 1.99, 9.9));
1720 auto* conn =
new TGeoBBox(0.4, 0.24, 1.937);
1721 auto* connv =
new TGeoVolume(
"TPC_RCCON", conn, m6);
1723 auto* connb =
new TGeoBBox(0.5, 0.25, 2.375);
1724 auto* connbv =
new TGeoVolume(
"TPC_RCCONB", connb, m6);
1728 auto* icsb =
new TGeoTrd1(14.5974, 23.3521, 0.25, 24.825);
1729 auto* icsbv =
new TGeoVolume(
"TPC_ISB", icsb, m4);
1733 TString fileName(gSystem->Getenv(
"VMCWORKDIR"));
1734 fileName +=
"/Detectors/Geometry/TPC/conn_iroc.dat";
1736 in.open(fileName.Data(), ios_base::in);
1737 if (!in.is_open()) {
1738 LOG(fatal) <<
"Cannot open input file : " << fileName.Data();
1740 for (Int_t
i = 0;
i < 132;
i++) {
1742 in >> ang >>
x >>
z;
1749 auto* rrr =
new TGeoRotation();
1752 ibdv->AddNode(connv,
i + 1,
new TGeoCombiTrans(
x, 4.05,
z, rrr));
1753 icsbv->AddNode(connbv,
i + 1,
new TGeoCombiTrans(
x, 0.,
z + 1.725, rrr));
1758 new TGeoTrd1(
"icap", 14.5974, 23.3521, 1.19, 24.825);
1760 new TGeoTrd1(
"ihole", 13.8742, 21.3328, 1.2, 21.15);
1761 auto* tr1 =
new TGeoTranslation(
"tr1", 0., 0., 1.725);
1762 tr1->RegisterYourself();
1763 auto* ic =
new TGeoCompositeShape(
"icap-ihole:tr1");
1764 auto* icv =
new TGeoVolume(
"TPC_IRCAP", ic, m3);
1768 auto* icpp =
new TGeoTrd1(14.5974, 23.3521, 0.16, 24.825);
1769 auto* icppv =
new TGeoVolume(
"TPC_IPP", icpp, m4);
1773 new TGeoTrd1(
"igem", 14.5974, 23.3521, 0.1, 24.825);
1774 new TGeoTrd1(
"igemh", 14.5974 - .5, 23.3521 - .5, 0.11, 24.825 - .5);
1775 auto* icgem =
new TGeoCompositeShape(
"igem-igemh");
1776 auto* icgemv =
new TGeoVolume(
"TPC_ICGEM", icgem, m4);
1780 auto* iroc =
new TGeoVolumeAssembly(
"TPC_IROC");
1782 iroc->AddNode(ibdv, 1);
1783 iroc->AddNode(icv, 1,
new TGeoTranslation(0., 3.1, -1.725));
1784 iroc->AddNode(icsbv, 1,
new TGeoTranslation(0., 4.54, -1.725));
1785 iroc->AddNode(icppv, 1,
new TGeoTranslation(0., 4.95, -1.725));
1786 iroc->AddNode(icgemv, 1,
new TGeoTranslation(0., 5.21, -1.725));
1790 auto* obody =
new TGeoTrd1(22.2938, 40.5084, 4.29, 51.65);
1791 auto* obdv =
new TGeoVolume(
"TPC_OROCB", obody, m3);
1792 auto* oemp =
new TGeoTrd1(20.7938, 39.0084, 3.89, 50.15);
1793 auto* oempv =
new TGeoVolume(
"TPC_OROCE", oemp, m1);
1794 obdv->AddNode(oempv, 1,
new TGeoTranslation(0., -0.4, 0.));
1798 tga = (39.0084 - 20.7938) / 100.3;
1799 xmin = tga * 14.2 + 20.7938;
1800 xmax = tga * 14.6 + 20.7938;
1801 auto* ob1 =
new TGeoTrd1(xmin, xmax, 2.94, 0.2);
1802 auto* ob1v =
new TGeoVolume(
"TPC_ORB1", ob1, m3);
1804 xmin = 30.4 * tga + 20.7938;
1805 xmax = 32.1 * tga + 20.7938;
1806 auto* ob2 =
new TGeoTrd1(xmin, xmax, 2.94, 1.05);
1807 auto* ob2v =
new TGeoVolume(
"TPC_ORB2", ob2, m3);
1809 xmin = 51.5 * tga + 20.7938;
1810 xmax = 51.9 * tga + 20.7938;
1811 auto* ob3 =
new TGeoTrd1(xmin, xmax, 2.94, 0.2);
1812 auto* ob3v =
new TGeoVolume(
"TPC_ORB3", ob3, m3);
1814 xmin = 68.5 * tga + 20.7938;
1815 xmax = 70.6 * tga + 20.7938;
1816 auto* ob4 =
new TGeoTrd1(xmin, xmax, 2.94, 1.05);
1817 auto* ob4v =
new TGeoVolume(
"TPC_ORB4", ob4, m3);
1819 xmin = 89.9 * tga + 20.7938;
1820 xmax = 90.3 * tga + 20.7938;
1821 auto* ob5 =
new TGeoTrd1(xmin, xmax, 2.94, 0.2);
1822 auto* ob5v =
new TGeoVolume(
"TPC_ORB5", ob5, m3);
1824 oempv->AddNode(ob1v, 1,
new TGeoTranslation(0., 0.59, -35.75));
1825 oempv->AddNode(ob2v, 1,
new TGeoTranslation(0., 0.59, -18.7));
1826 oempv->AddNode(ob3v, 1,
new TGeoTranslation(0., 0.59, 1.55));
1827 oempv->AddNode(ob4v, 1,
new TGeoTranslation(0., 0.59, 19.4));
1828 oempv->AddNode(ob5v, 1,
new TGeoTranslation(0., 0.59, 39.95));
1832 auto* conno =
new TGeoBBox(0.4, 0.4, 1.937);
1833 auto* connov =
new TGeoVolume(
"TPC_RCCONO", conno, m6);
1835 auto* connob =
new TGeoBBox(0.5, 0.25, 2.375);
1836 auto* connobv =
new TGeoVolume(
"TPC_RCCONOB", connob, m6);
1840 new TGeoTrd1(
"ocap", 23.3875, 43.524, 1.19, 57.1);
1841 new TGeoTrd1(
"ohole", 22.2938, 40.5084, 1.19, 51.65);
1842 auto* tr5 =
new TGeoTranslation(
"tr5", 0., 0., -2.15);
1843 tr5->RegisterYourself();
1844 auto* oc =
new TGeoCompositeShape(
"ocap-ohole:tr5");
1845 auto* ocv =
new TGeoVolume(
"TPC_ORCAP", oc, m3);
1849 auto* osb =
new TGeoTrd1(23.3874, 43.524, 0.25, 57.1);
1850 auto* osbv =
new TGeoVolume(
"TPC_OSB", osb, m4);
1854 auto* opp =
new TGeoTrd1(23.3874, 43.524, 0.16, 57.1);
1855 auto* oppv =
new TGeoVolume(
"TPC_OPP", opp, m4);
1859 new TGeoTrd1(
"ogem", 23.3874, 43.524, 0.1, 57.1);
1863 new TGeoTrd1(
"ogemh1", 22.548, 28.579, 0.1, 17.625);
1864 new TGeoTrd1(
"ogemh2", 28.949, 35.297, 0.1, 18.45);
1865 new TGeoTrd1(
"ogemh3", 35.667, 42.332, 0.1, 19.425);
1867 auto* tr2 =
new TGeoTranslation(
"tr2", 0., 0., 18.125 - 57.1);
1868 auto* tr3 =
new TGeoTranslation(
"tr3", 0., 0., 55.2 - 57.1);
1869 auto* tr4 =
new TGeoTranslation(
"tr4", 0., 0., 94.175 - 57.1);
1870 tr2->RegisterYourself();
1871 tr3->RegisterYourself();
1872 tr4->RegisterYourself();
1873 auto* ocgem =
new TGeoCompositeShape(
"ogem-ogemh1:tr2-ogemh2:tr3-ogemh3:tr4");
1874 auto* ocgemv =
new TGeoVolume(
"TPC_OCGEM", ocgem, m4);
1878 fileName = gSystem->Getenv(
"VMCWORKDIR");
1879 fileName +=
"/Detectors/Geometry/TPC/conn_oroc.dat";
1880 in.open(fileName.Data(), ios_base::in);
1881 if (!in.is_open()) {
1882 LOG(fatal) <<
"Cannot open input file : " << fileName.Data();
1884 for (Int_t
i = 0;
i < 232;
i++) {
1886 in >> ang >>
x >>
z;
1892 auto* rrr =
new TGeoRotation();
1894 obdv->AddNode(connov,
i + 1,
new TGeoCombiTrans(
x, 3.89,
z, rrr));
1895 osbv->AddNode(connobv,
i + 1,
new TGeoCombiTrans(
x, 0.,
z - 2.15, rrr));
1899 auto* oroc =
new TGeoVolumeAssembly(
"TPC_OROC");
1901 oroc->AddNode(obdv, 1);
1902 oroc->AddNode(ocv, 1,
new TGeoTranslation(0., 3.1, 2.15));
1903 oroc->AddNode(osbv, 1,
new TGeoTranslation(0., 4.54, 2.15));
1904 oroc->AddNode(oppv, 1,
new TGeoTranslation(0., 4.95, 2.15));
1905 oroc->AddNode(ocgemv, 1,
new TGeoTranslation(0., 5.21, 2.15));
1909 auto* secta =
new TGeoVolumeAssembly(
"TPC_SECT");
1910 auto* sectc =
new TGeoVolumeAssembly(
"TPC_SECT");
1911 TGeoRotation rot1(
"rot1", 90., 90., 0.);
1912 TGeoRotation rot2(
"rot2");
1914 auto* rot =
new TGeoRotation(
"rot");
1921 x0 = 110.2 * TMath::Cos(openingAngle);
1922 y0 = 110.2 * TMath::Sin(openingAngle);
1923 auto* combi1a =
new TGeoCombiTrans(
"combi1",
x0,
y0, 1.09, rot);
1924 auto* combi1c =
new TGeoCombiTrans(
"combi1",
x0,
y0, 1.09, rot);
1925 x0 = 188.45 * TMath::Cos(openingAngle);
1926 y0 = 188.45 * TMath::Sin(openingAngle);
1927 auto* combi2a =
new TGeoCombiTrans(
"combi2",
x0,
y0, 1.09, rot);
1928 auto* combi2c =
new TGeoCombiTrans(
"combi2",
x0,
y0, 1.09, rot);
1933 secta->AddNode(ch, 1);
1934 secta->AddNode(iroc, 1, combi1a);
1935 secta->AddNode(oroc, 1, combi2a);
1939 sectc->AddNode(ch, 1);
1940 sectc->AddNode(iroc, 1, combi1c);
1941 sectc->AddNode(oroc, 1, combi2c);
1945 auto* wheela =
new TGeoVolumeAssembly(
"TPC_ENDCAP");
1946 auto* wheelc =
new TGeoVolumeAssembly(
"TPC_ENDCAP");
1948 for (Int_t
i = 0;
i < 18;
i++) {
1949 Double_t
phi = (20. *
i);
1950 auto* rwh =
new TGeoRotation();
1952 wheela->AddNode(secta,
i + 1, rwh);
1953 wheelc->AddNode(sectc,
i + 1, rwh);
1957 auto* combi3 =
new TGeoCombiTrans(
"combi3", 0., 0., 256.6,
ref);
1958 v9->AddNode(wheela, 1, combi3);
1959 v9->AddNode(wheelc, 2,
new TGeoTranslation(0., 0., -256.6));
1963 auto*
sw =
new TGeoPgon(0., 20., 1, 2);
1964 sw->DefineSection(0, -4., 80.5, 251.75);
1965 sw->DefineSection(1, 4., 80.5, 251.75);
1966 auto* swv =
new TGeoVolume(
"TPC_SWSEG",
sw, m3);
1969 shift = thick / TMath::Sin(openingAngle);
1970 auto* sh =
new TGeoPgon(0., 20., 1, 2);
1971 sh->DefineSection(0, -4., 81.5 - shift, 250.75 - shift);
1972 sh->DefineSection(1, 4., 81.5 - shift, 250.75 - shift);
1973 auto* shv =
new TGeoVolume(
"TPC_SWS1", sh, m1);
1975 TGeoMedium* m9 = gGeoManager->GetMedium(
"TPC_Si");
1976 auto* el =
new TGeoPgon(0., 20., 1, 2);
1977 el->DefineSection(0, -1.872, 81.5 - shift, 250.75 - shift);
1978 el->DefineSection(1, 1.872, 81.5 - shift, 250.75 - shift);
1979 auto* elv =
new TGeoVolume(
"TPC_ELEC", el, m9);
1981 shv->AddNode(elv, 1);
1984 ys = shift * TMath::Sin(openingAngle);
1985 xs = shift * TMath::Cos(openingAngle);
1986 swv->AddNode(shv, 1,
new TGeoTranslation(xs, ys, 0.));
1988 auto* co =
new TGeoPgon(0., 20., 1, 2);
1989 co->DefineSection(0, -0.5, 77., 255.25);
1990 co->DefineSection(1, 0.5, 77., 255.25);
1991 auto* cov =
new TGeoVolume(
"TPC_SWC1", co, m3);
1993 auto* coh =
new TGeoPgon(0., 20., 1, 2);
1994 shift = 4. / TMath::Sin(openingAngle);
1995 coh->DefineSection(0, -0.5, 85. - shift, 247.25 - shift);
1996 coh->DefineSection(1, 0.5, 85. - shift, 247.25 - shift);
1998 auto* cohv =
new TGeoVolume(
"TPC_SWC2", coh, m1);
2000 ys = shift * TMath::Sin(openingAngle);
2001 xs = shift * TMath::Cos(openingAngle);
2002 cov->AddNode(cohv, 1,
new TGeoTranslation(xs, ys, 0.));
2006 auto* swhs =
new TGeoVolumeAssembly(
"TPC_SSWSEC");
2007 swhs->AddNode(swv, 1);
2008 swhs->AddNode(cov, 1,
new TGeoTranslation(0., 0., -4.5));
2009 swhs->AddNode(cov, 2,
new TGeoTranslation(0., 0., 4.5));
2013 TGeoRotation* rsw[18];
2014 auto* swheel =
new TGeoVolumeAssembly(
"TPC_SSWHEEL");
2015 for (Int_t
i = 0;
i < 18;
i++) {
2016 Double_t
phi = (20. *
i);
2017 rsw[
i] =
new TGeoRotation();
2018 rsw[
i]->RotateZ(phi);
2019 swheel->AddNode(swhs,
i + 1, rsw[
i]);
2021 v1->AddNode(swheel, 1,
new TGeoTranslation(0., 0., -284.6));
2022 v1->AddNode(swheel, 2,
new TGeoTranslation(0., 0., 284.6));
2027 Int_t totrows = 159;
2031 gGeoManager->Volume(
"TPC_Strip",
"PGON",
m5->GetId(), upar);
2032 upar =
new Double_t[10];
2043 Double_t rlow = 85.225;
2046 upar[6] = rlow + .01;
2050 gGeoManager->Node(
"TPC_Strip", 1,
"TPC_Drift", 0., 0., 124.82, 0, kTRUE, upar, 10);
2051 gGeoManager->Node(
"TPC_Strip", totrows + 1,
"TPC_Drift", 0., 0., -124.82, 0, kTRUE, upar, 10);
2085 TGeoMedium* m7 = gGeoManager->GetMedium(
"TPC_Cu");
2086 TGeoMedium* m10 = gGeoManager->GetMedium(
"TPC_Alumina");
2087 TGeoMedium* m11 = gGeoManager->GetMedium(
"TPC_Peek");
2088 TGeoMedium* m13 = gGeoManager->GetMedium(
"TPC_Brass");
2089 TGeoMedium* m14 = gGeoManager->GetMedium(
"TPC_Alumina1");
2097 auto* rod =
new TGeoPcon(
"rod", 0., 360., 6);
2098 rod->DefineSection(0, -10.43, 1.92, 2.08);
2099 rod->DefineSection(1, -9.75, 1.92, 2.08);
2101 rod->DefineSection(2, -9.75, 1.8, 2.2);
2102 rod->DefineSection(3, 9.75, 1.8, 2.2);
2104 rod->DefineSection(4, 9.75, 1.92, 2.08);
2105 rod->DefineSection(5, 10.43, 1.92, 2.08);
2107 auto* mrodl =
new TGeoVolume(
"TPC_mrodl", rod, m6);
2111 auto* rod1 =
new TGeoPcon(
"rod1", 0., 360., 6);
2112 rod1->DefineSection(0, -8.93, 1.92, 2.08);
2113 rod1->DefineSection(1, -8.25, 1.92, 2.08);
2115 rod1->DefineSection(2, -8.25, 1.8, 2.2);
2116 rod1->DefineSection(3, 8.25, 1.8, 2.2);
2118 rod1->DefineSection(4, 8.25, 1.92, 2.08);
2119 rod1->DefineSection(5, 8.93, 1.92, 2.08);
2121 auto* mrods =
new TGeoVolume(
"TPC_mrods", rod1, m6);
2128 new TGeoTube(
"hhole", 0., 0.3, 0.3);
2133 auto* rhole =
new TGeoRotation();
2134 rhole->RotateX(90.);
2135 TGeoCombiTrans* transf[13];
2137 for (Int_t
i = 0;
i < 13;
i++) {
2138 snprintf(
name, 30,
"transf%d",
i);
2139 transf[
i] =
new TGeoCombiTrans(
name, 0., -2., -9. +
i * 1.5, rhole);
2140 transf[
i]->RegisterYourself();
2143 TString operl(
"hhole:transf0");
2144 for (Int_t
i = 1;
i < 13;
i++) {
2145 snprintf(
name, 30,
"+hhole:transf%d",
i);
2149 TString opers(
"hhole:transf1");
2150 for (Int_t
i = 2;
i < 12;
i++) {
2151 snprintf(
name, 30,
"+hhole:transf%d",
i);
2155 new TGeoCompositeShape(
"hlv", operl.Data());
2156 new TGeoCompositeShape(
"hsv", opers.Data());
2158 auto* rodl =
new TGeoCompositeShape(
"rodl",
"rod-hlv");
2159 auto* rods =
new TGeoCompositeShape(
"rods",
"rod1-hsv");
2161 auto* rodlv =
new TGeoVolume(
"TPC_rodl", rodl, m6);
2162 auto* rodsv =
new TGeoVolume(
"TPC_rods", rods, m6);
2165 auto* bcon =
new TGeoTube(0., 0.3, 0.3);
2166 auto* bconv =
new TGeoVolume(
"TPC_bcon", bcon, m13);
2170 new TGeoBBox(
"hk1", 0.625, 0.015, 0.75);
2171 new TGeoBBox(
"hk2", 0.625, 0.015, 0.15);
2172 auto* tr21 =
new TGeoTranslation(
"tr21", 0., -0.03, -0.6);
2173 auto* tr12 =
new TGeoTranslation(
"tr12", 0., -0.03, 0.6);
2174 tr21->RegisterYourself();
2175 tr12->RegisterYourself();
2177 auto* hook =
new TGeoCompositeShape(
"hook",
"hk1+hk2:tr21+hk2:tr12");
2178 auto* hookv =
new TGeoVolume(
"TPC_hook", hook, m13);
2185 auto* spart =
new TGeoVolumeAssembly(
"TPC_spart");
2187 spart->AddNode(rodsv, 1);
2188 for (Int_t
i = 1;
i < 12;
i++) {
2189 spart->AddNode(bconv,
i, transf[
i]);
2191 for (Int_t
i = 0;
i < 11;
i++) {
2192 spart->AddNode(hookv,
i + 1,
new TGeoTranslation(0., -2.315, -7.5 +
i * 1.5));
2197 auto* lpart =
new TGeoVolumeAssembly(
"TPC_lpart");
2199 lpart->AddNode(rodlv, 1);
2200 for (Int_t
i = 0;
i < 13;
i++) {
2201 lpart->AddNode(bconv,
i + 12, transf[
i]);
2203 for (Int_t
i = 0;
i < 13;
i++) {
2204 lpart->AddNode(hookv,
i + 12,
new TGeoTranslation(0., -2.315, -9. +
i * 1.5));
2209 new TGeoTube(
"ring1", 2.1075, 2.235, 0.53);
2210 new TGeoTube(
"ring2", 1.7925, 1.89, 0.43);
2211 new TGeoTube(
"ring3", 1.89, 2.1075, 0.05);
2212 auto* ring =
new TGeoCompositeShape(
"ring",
"ring1+ring2+ring3");
2213 auto* ringv =
new TGeoVolume(
"TPC_ring", ring, m3);
2217 auto* tpcrrod =
new TGeoVolumeAssembly(
"TPC_rrod");
2218 auto* tpcmrod =
new TGeoVolumeAssembly(
"TPC_mrod");
2220 for (Int_t
i = 0;
i < 11;
i++) {
2221 tpcrrod->AddNode(ringv,
i + 1,
new TGeoTranslation(0., 0., -105. +
i * 21));
2222 tpcmrod->AddNode(ringv,
i + 12,
new TGeoTranslation(0., 0., -105. +
i * 21));
2224 for (Int_t
i = 0;
i < 10;
i++) {
2225 tpcrrod->AddNode(lpart,
i + 1,
new TGeoTranslation(0., 0., -94.5 +
i * 21));
2226 tpcmrod->AddNode(mrodl,
i + 1,
new TGeoTranslation(0., 0., -94.5 +
i * 21));
2231 auto* tpcrp =
new TGeoPcon(0., 360., 6);
2233 tpcrp->DefineSection(0, 123.05, 1.89, 2.1075);
2234 tpcrp->DefineSection(1, 123.59, 1.89, 2.1075);
2236 tpcrp->DefineSection(2, 123.59, 1.8, 2.2);
2237 tpcrp->DefineSection(3, 127., 1.8, 2.2);
2239 tpcrp->DefineSection(4, 127., 0., 2.2);
2240 tpcrp->DefineSection(5, 127.5, 0., 2.2);
2242 auto* tpcrpv =
new TGeoVolume(
"TPC_RP", tpcrp, m6);
2246 tpcrrod->AddNode(spart, 1,
new TGeoTranslation(0., 0., -114.));
2247 tpcrrod->AddNode(spart, 2,
new TGeoTranslation(0., 0., 114.));
2248 tpcrrod->AddNode(ringv, 23,
new TGeoTranslation(0., 0., -123.));
2249 tpcrrod->AddNode(ringv, 24,
new TGeoTranslation(0., 0., 123.));
2250 tpcrrod->AddNode(tpcrpv, 1);
2252 tpcmrod->AddNode(mrods, 1,
new TGeoTranslation(0., 0., -114.));
2253 tpcmrod->AddNode(mrods, 2,
new TGeoTranslation(0., 0., 114.));
2254 tpcmrod->AddNode(ringv, 25,
new TGeoTranslation(0., 0., -123.));
2255 tpcmrod->AddNode(ringv, 26,
new TGeoTranslation(0., 0., 123.));
2256 tpcmrod->AddNode(tpcrpv, 2);
2263 auto* hvr =
new TGeoTube(0., 1.465, 123.);
2264 auto* hvc =
new TGeoTube(0., 0.29, 123.);
2266 auto* hvrv =
new TGeoVolume(
"TPC_HV_Rod", hvr, m6);
2267 auto* hvcv =
new TGeoVolume(
"TPC_HV_Cable", hvc, m7);
2268 hvrv->AddNode(hvcv, 1);
2272 auto* cr =
new TGeoTube(0., 0.45, 123.);
2273 auto* cw =
new TGeoTube(0., 0.15, 123.);
2274 auto* crv =
new TGeoVolume(
"TPC_CR", cr, m10);
2275 auto* cwv =
new TGeoVolume(
"TPC_W", cw, m12);
2279 crv->AddNode(cwv, 1);
2283 auto* pr =
new TGeoTube(0.2, 0.35, 123.);
2284 auto* prv =
new TGeoVolume(
"TPC_PR", pr, m11);
2288 new TGeoTube(
"tub", 0., 1.7, 0.025);
2292 Double_t
n[3],
p[3];
2293 Double_t
slope = TMath::Tan(22. * TMath::DegToRad());
2294 Double_t intp = 1.245;
2305 norm = TMath::Sqrt(
n[0] *
n[0] +
n[1] *
n[1]);
2318 norm = TMath::Sqrt(
n[0] *
n[0] +
n[1] *
n[1]);
2325 new TGeoTube(
"h1", 0., 0.5, 0.025);
2326 new TGeoTube(
"h2", 0., 0.35, 0.025);
2328 auto* ttr11 =
new TGeoTranslation(
"ttr11", -0.866, 0.5, 0.);
2329 auto* ttr22 =
new TGeoTranslation(
"ttr22", 0.866, 0.5, 0.);
2330 ttr11->RegisterYourself();
2331 ttr22->RegisterYourself();
2333 new TGeoBBox(
"elcon", 0.72, 0.005, 0.3);
2334 auto* crr1 =
new TGeoRotation();
2335 crr1->RotateZ(-22.);
2336 auto* ctr1 =
new TGeoCombiTrans(
"ctr1", -0.36011, -1.09951, -0.325, crr1);
2337 ctr1->RegisterYourself();
2338 auto* cs1 =
new TGeoCompositeShape(
"cs1",
"(((((tub-h1:ttr11)-h1:ttr22)-(sp1:sp1_tr))-(sp2:sp2_tr))-h2)+elcon:ctr1");
2340 auto* csvv =
new TGeoVolume(
"TPC_RR_CU", cs1, m7);
2345 auto* rrod =
new TGeoVolumeAssembly(
"TPC_RRIN");
2347 rrod->AddNode(crv, 1, ttr11);
2348 rrod->AddNode(crv, 2, ttr22);
2349 rrod->AddNode(prv, 1);
2351 for (Int_t
i = 0;
i < 165;
i++) {
2352 rrod->AddNode(csvv,
i + 1,
new TGeoTranslation(0., 0., -122.675 +
i * 1.5));
2355 auto*
res =
new TGeoTube(0., 0.15, 0.5);
2356 auto* resv =
new TGeoVolume(
"TPC_RES",
res, m14);
2357 auto* ress =
new TGeoVolumeAssembly(
"TPC_RES_CH");
2358 ress->AddNode(resv, 1,
new TGeoTranslation(0.2, 0., 0.));
2359 ress->AddNode(resv, 2,
new TGeoTranslation(-0.2, 0., 0.));
2361 auto* crr2 =
new TGeoRotation();
2363 auto* crr3 =
new TGeoRotation();
2364 crr3->RotateY(-30.);
2366 for (Int_t
i = 0;
i < 164;
i += 2) {
2367 rrod->AddNode(ress,
i + 1,
new TGeoCombiTrans(0., 1.2, -121.925 +
i * 1.5, crr2));
2368 rrod->AddNode(ress,
i + 2,
new TGeoCombiTrans(0., 1.2, -121.925 + (
i + 1) * 1.5, crr3));
2371 tpcrrod->AddNode(rrod, 1,
new TGeoCombiTrans(0., 0., 0.5, crr1));
2376 Double_t shift1[3] = {0.0, -0.175, 0.0};
2378 new TGeoBBox(
"tpcihs1", 4.7, 0.66, 2.35);
2379 new TGeoBBox(
"tpcihs2", 4.7, 0.485, 1.0, shift1);
2380 new TGeoBBox(
"tpcihs3", 1.5, 0.485, 2.35, shift1);
2381 new TGeoTube(
"tpcihs4", 0.0, 2.38, 0.1);
2383 Double_t pointstrap[16];
2384 pointstrap[0] = 0.0;
2385 pointstrap[1] = 0.0;
2386 pointstrap[2] = 0.0;
2387 pointstrap[3] = 1.08;
2388 pointstrap[4] = 2.3;
2389 pointstrap[5] = 1.08;
2390 pointstrap[6] = 3.38;
2391 pointstrap[7] = 0.0;
2392 pointstrap[8] = 0.0;
2393 pointstrap[9] = 0.0;
2394 pointstrap[10] = 0.0;
2395 pointstrap[11] = 1.08;
2396 pointstrap[12] = 2.3;
2397 pointstrap[13] = 1.08;
2398 pointstrap[14] = 3.38;
2399 pointstrap[15] = 0.0;
2401 auto* tpcihs5 =
new TGeoArb8(
"tpcihs5", 0.6, pointstrap);
2418 auto* trans2 =
new TGeoTranslation(
"trans2", 0.0, 2.84, 2.25);
2419 trans2->RegisterYourself();
2420 auto* trans3 =
new TGeoTranslation(
"trans3", 0.0, 2.84, -2.25);
2421 trans3->RegisterYourself();
2425 new TGeoCompositeShape(
"tpcihs6",
"tpcihs1-(tpcihs2+tpcihs3)-(tpcihs4:trans2)-(tpcihs4:trans3)-(cutil1:cutil1_tr)");
2429 auto* tpcihss =
new TGeoVolume(
"TPC_IHSS", tpcihs6, m6);
2430 auto* tpcihst =
new TGeoVolume(
"TPC_IHSTR", tpcihs5, m6);
2432 auto* rot111 =
new TGeoRotation();
2433 rot111->RotateY(180.0);
2435 auto* tpcihs =
new TGeoVolumeAssembly(
"TPC_IHS");
2436 tpcihs->AddNode(tpcihss, 1);
2437 tpcihs->AddNode(tpcihst, 1,
new TGeoTranslation(-4.7, 0.66, 0.0));
2438 tpcihs->AddNode(tpcihst, 2,
new TGeoCombiTrans(4.7, 0.66, 0.0, rot111));
2442 new TGeoBBox(
"tpcirh1", 4.7, 1.33, 0.5);
2446 new TGeoBBox(
"tpcirh2", 1.05, 0.8, 0.5, shift1);
2450 new TGeoBBox(
"tpcirh3", 1.05, 0.8, 0.5, shift1);
2454 new TGeoBBox(
"tpcirh4", 1.9, 0.25, 0.5, shift1);
2455 new TGeoTube(
"tpcirh5", 0, 1.9, 5);
2457 auto* trans4 =
new TGeoTranslation(
"trans4", 0, 0.83, 0.0);
2458 trans4->RegisterYourself();
2460 auto* tpcirh6 =
new TGeoCompositeShape(
"tpcirh6",
"tpcirh1-tpcirh2-tpcirh3-(tpcirh5:trans4)-tpcirh4");
2464 auto* tpcirh =
new TGeoVolume(
"TPC_IRH", tpcirh6, m6);
2468 TGeoVolume* tpciclamp =
new TGeoVolumeAssembly(
"TPC_ICLP");
2469 tpciclamp->AddNode(tpcihs, 1);
2470 tpciclamp->AddNode(tpcirh, 1,
new TGeoTranslation(0, 1.99, 1.1));
2471 tpciclamp->AddNode(tpcirh, 2,
new TGeoTranslation(0, 1.99, -1.1));
2475 auto* inplug =
new TGeoPcon(
"inplug", 0.0, 360.0, 13);
2477 inplug->DefineSection(0, 0.3, 0.0, 2.2);
2478 inplug->DefineSection(1, 0.6, 0.0, 2.2);
2480 inplug->DefineSection(2, 0.6, 0.0, 1.75);
2481 inplug->DefineSection(3, 0.7, 0.0, 1.75);
2483 inplug->DefineSection(4, 0.7, 1.55, 1.75);
2484 inplug->DefineSection(5, 1.6, 1.55, 1.75);
2486 inplug->DefineSection(6, 1.6, 1.55, 2.2);
2487 inplug->DefineSection(7, 1.875, 1.55, 2.2);
2489 inplug->DefineSection(8, 2.47, 1.75, 2.2);
2491 inplug->DefineSection(9, 2.47, 1.75, 2.08);
2492 inplug->DefineSection(10, 2.57, 1.8, 2.08);
2494 inplug->DefineSection(11, 2.57, 1.92, 2.08);
2495 inplug->DefineSection(12, 2.95, 1.92, 2.08);
2501 new TGeoBBox(
"pcuti", 1.5, 0.11, 1.075, shift1);
2503 auto* inplleft =
new TGeoCompositeShape(
"inplleft",
"inplug-pcuti");
2504 auto* tpcinlplug =
new TGeoVolume(
"TPC_INPLL", inplleft, m6);
2508 TGeoVolume* tpcihpl =
new TGeoVolumeAssembly(
"TPC_IHPL");
2509 tpcihpl->AddNode(tpcinlplug, 1);
2510 tpcihpl->AddNode(tpcinlplug, 2,
ref);
2511 tpcihpl->AddNode(tpciclamp, 1,
new TGeoTranslation(0.0, -2.765, 0.0));
2517 pointstrap[0] = 0.0;
2518 pointstrap[1] = 0.0;
2519 pointstrap[2] = 0.0;
2520 pointstrap[3] = 2.8;
2521 pointstrap[4] = 3.1;
2522 pointstrap[5] = 2.8 - 3.1 * TMath::Tan(15. * TMath::DegToRad());
2523 pointstrap[6] = 3.1;
2524 pointstrap[7] = 0.0;
2525 pointstrap[8] = 0.0;
2526 pointstrap[9] = 0.0;
2527 pointstrap[10] = 0.0;
2528 pointstrap[11] = 2.8;
2529 pointstrap[12] = 3.1;
2530 pointstrap[13] = 2.8 - 3.1 * TMath::Tan(15. * TMath::DegToRad());
2531 pointstrap[14] = 3.1;
2532 pointstrap[15] = 0.0;
2534 auto* tpcomh1 =
new TGeoArb8(
"tpcomh1", 1.05, pointstrap);
2535 auto* tpcomh2 =
new TGeoBBox(
"tpcomh2", 0.8, 1.4, 6);
2537 auto* tpcomh1v =
new TGeoVolume(
"TPC_OMH1", tpcomh1, m7);
2538 auto* tpcomh2v =
new TGeoVolume(
"TPC_OMH2", tpcomh2, m7);
2540 TGeoVolume* tpcomh3v =
new TGeoVolumeAssembly(
"TPC_OMH3");
2541 tpcomh3v->AddNode(tpcomh1v, 1,
new TGeoTranslation(0.8, -1.4, 4.95));
2542 tpcomh3v->AddNode(tpcomh1v, 2,
new TGeoTranslation(0.8, -1.4, -4.95));
2543 tpcomh3v->AddNode(tpcomh2v, 1);
2549 new TGeoBBox(
"tpcomh3", 1.65, 1.15, 3.4);
2550 auto* tpcomh4 =
new TGeoBBox(
"tpcomh4", 0.75, 0.7, 3.4, shift1);
2559 n[1] = -1.0 * TMath::Tan(30. * TMath::DegToRad());
2571 n[1] = -1.0 * TMath::Tan(30. * TMath::DegToRad());
2582 n[0] = 1.0 * TMath::Tan(75. * TMath::DegToRad());
2594 n[0] = 1.0 * TMath::Tan(75 * TMath::DegToRad());
2607 n[1] = -1.0 * TMath::Tan(20. * TMath::DegToRad());
2612 auto* tpcomh5 =
new TGeoCompositeShape(
"tpcomh5",
"tpcomh3-(cutomh1:cutomh1_tr)-(cutomh2:cutomh2_tr)-(cutomh3:cutomh3_tr)-(cutomh4:cutomh4_tr)-(cutomh5:cutomh5_tr)");
2614 auto* tpcomh5v =
new TGeoVolume(
"TPC_OMH5", tpcomh5, m6);
2615 auto* tpcomh4v =
new TGeoVolume(
"TPC_OMH6", tpcomh4, m6);
2617 auto* tpcomh7v =
new TGeoVolumeAssembly(
"TPC_OMH7");
2618 tpcomh7v->AddNode(tpcomh5v, 1);
2619 tpcomh7v->AddNode(tpcomh4v, 1);
2623 auto* tpcomh =
new TGeoVolumeAssembly(
"TPC_OMH");
2624 tpcomh->AddNode(tpcomh3v, 1,
new TGeoTranslation(1.5, 0., 0.));
2625 tpcomh->AddNode(tpcomh3v, 2,
new TGeoCombiTrans(-1.5, 0., 0., rot111));
2626 tpcomh->AddNode(tpcomh7v, 1,
new TGeoTranslation(0.65 + 1.5, 2.55, 0.0));
2627 tpcomh->AddNode(tpcomh7v, 2,
new TGeoCombiTrans(-0.65 - 1.5, 2.55, 0.0, rot111));
2631 new TGeoBBox(
"tpcohs1", 3.8, 0.675, 2.35);
2637 new TGeoBBox(
"tpcohs2", 1.5, 0.5, 2.35, shift1);
2638 new TGeoBBox(
"tpcohs3", 3.8, 0.5, 0.85, shift1);
2644 auto* tpcohs4 =
new TGeoBBox(
"tpsohs4", 3.1, 0.5, 0.7, shift1);
2646 auto* tpcohs4v =
new TGeoVolume(
"TPC_OHS4", tpcohs4, m6);
2658 auto* tpcohs5 =
new TGeoCompositeShape(
"tpcohs5",
"tpcohs1-tpcohs2-tpcohs3-(cutohs1:cutohs1_tr)");
2659 auto* tpcohs5v =
new TGeoVolume(
"TPC_OHS5", tpcohs5, m6);
2661 auto* tpcohs =
new TGeoVolumeAssembly(
"TPC_OHS");
2662 tpcohs->AddNode(tpcohs5v, 1);
2663 tpcohs->AddNode(tpcohs4v, 1);
2670 new TGeoBBox(
"tpcorh1", 3.1, 1.825, 0.55);
2676 new TGeoBBox(
"tpcorh2", 0.5, 2.75, 1.1, shift1);
2682 new TGeoBBox(
"tpcorh3", 0.5, 2.75, 1.1, shift1);
2688 new TGeoBBox(
"tpcorh4", 3.9, 2.75, 0.5, shift1);
2694 new TGeoBBox(
"tpcorh5", 1.95, 0.5, 1.1, shift1);
2700 new TGeoBBox(
"tpcorh6", 2.4, 0.5, 0.6, shift1);
2702 new TGeoTube(
"tpcorh7", 0, 1.95, 0.85);
2703 new TGeoTube(
"tpcorh8", 0, 2.4, 0.6);
2705 auto* trans33 =
new TGeoTranslation(
"trans33", 0.0, 0.0, 0.55);
2706 trans33->RegisterYourself();
2709 new TGeoCompositeShape(
"tpcorh9",
"tpcorh1-tpcorh2-tpcorh3-tpcorh4-tpcorh5-tpcorh6-(tpcorh8:trans33)-tpcorh7");
2711 auto* tpcorh9v =
new TGeoVolume(
"TPC_ORH", tpcorh9, m6);
2715 auto* tpcorh =
new TGeoVolumeAssembly(
"TPC_ORH2");
2717 tpcorh->AddNode(tpcorh9v, 1,
new TGeoTranslation(0.0, 0.0, 1.25));
2718 tpcorh->AddNode(tpcorh9v, 2,
new TGeoCombiTrans(0.0, 0.0, -1.25, rot111));
2722 auto* outplug =
new TGeoPcon(
"outplug", 0.0, 360.0, 13);
2724 outplug->DefineSection(0, 0.5, 0.0, 2.2);
2725 outplug->DefineSection(1, 0.7, 0.0, 2.2);
2726 outplug->DefineSection(2, 0.7, 1.55, 2.2);
2727 outplug->DefineSection(3, 0.8, 1.55, 2.2);
2728 outplug->DefineSection(4, 0.8, 1.55, 1.75);
2729 outplug->DefineSection(5, 1.2, 1.55, 1.75);
2730 outplug->DefineSection(6, 1.2, 1.55, 2.2);
2731 outplug->DefineSection(7, 1.875, 1.55, 2.2);
2732 outplug->DefineSection(8, 2.47, 1.75, 2.2);
2733 outplug->DefineSection(9, 2.47, 1.75, 2.08);
2734 outplug->DefineSection(10, 2.57, 1.8, 2.08);
2735 outplug->DefineSection(11, 2.57, 1.92, 2.08);
2736 outplug->DefineSection(12, 2.95, 1.92, 2.08);
2742 new TGeoBBox(
"cutout", 2.5, 0.11, 1.01, shift1);
2745 auto* outplleft =
new TGeoCompositeShape(
"outplleft",
"outplug-cutout");
2746 auto* outplleftv =
new TGeoVolume(
"TPC_OPLL", outplleft, m6);
2751 auto* tpcohpl =
new TGeoVolumeAssembly(
"TPC_OHPL");
2753 tpcohpl->AddNode(outplleftv, 1);
2754 tpcohpl->AddNode(outplleftv, 2,
ref);
2755 tpcohpl->AddNode(tpcorh, 1);
2756 tpcohpl->AddNode(tpcohs, 1,
new TGeoTranslation(0.0, 3.925, 0));
2762 pointstrap[0] = 0.0;
2763 pointstrap[1] = 0.0;
2764 pointstrap[2] = 0.0;
2765 pointstrap[3] = 2.8;
2766 pointstrap[4] = 3.1;
2767 pointstrap[5] = 1.96;
2768 pointstrap[6] = 3.1;
2769 pointstrap[7] = 0.0;
2770 pointstrap[8] = 0.0;
2771 pointstrap[9] = 0.0;
2772 pointstrap[10] = 0.0;
2773 pointstrap[11] = 2.8;
2774 pointstrap[12] = 3.1;
2775 pointstrap[13] = 1.96;
2776 pointstrap[14] = 3.1;
2777 pointstrap[15] = 0.0;
2779 auto* tpcmmh1 =
new TGeoArb8(
"tpcmmh1", 1.75, pointstrap);
2780 auto* tpcmmh2 =
new TGeoBBox(
"tpcmmh2", 0.8, 1.4, 12.5);
2782 auto* tpcmmh1v =
new TGeoVolume(
"TPC_MMH1", tpcmmh1, m6);
2783 auto* tpcmmh2v =
new TGeoVolume(
"TPC_MMH2", tpcmmh2, m6);
2785 auto* tpcmmhs =
new TGeoVolumeAssembly(
"TPC_MMHS");
2786 tpcmmhs->AddNode(tpcmmh1v, 1,
new TGeoTranslation(0.8, -1.4, 10.75));
2787 tpcmmhs->AddNode(tpcmmh1v, 2,
new TGeoTranslation(0.8, -1.4, -10.75));
2788 tpcmmhs->AddNode(tpcmmh2v, 1);
2796 new TGeoBBox(
"tpcmmhc1", 1.65, 1.85, 8.9);
2797 new TGeoBBox(
"tpcmmhc2", 0.9, 0.7, 8.9, shift1);
2807 n[2] = 8.0 * TMath::Tan(13. * TMath::DegToRad());
2817 n[2] = -8.0 * TMath::Tan(13. * TMath::DegToRad());
2827 n[2] = 6.1 * TMath::Tan(20. * TMath::DegToRad());
2837 n[2] = -6.1 * TMath::Tan(20 * TMath::DegToRad());
2845 n[0] = 2.4 * TMath::Tan(30 * TMath::DegToRad());
2855 n[0] = 2.4 * TMath::Tan(30 * TMath::DegToRad());
2862 new TGeoCompositeShape(
"TPC_MMHC",
"tpcmmhc1-tpcmmhc2-(cutmmh1:cutmmh1_tr)-(cutmmh2:cutmmh2_tr)-(cutmmh3:cutmmh3_tr)-(cutmmh4:cutmmh4_tr)-(cutmmh5:cutmmh5_tr)-(cutmmh6:cutmmh6_tr)");
2864 auto* tpcmmhcv =
new TGeoVolume(
"TPC_MMHC", tpcmmhc, m6);
2866 TGeoVolume* tpcmmh =
new TGeoVolumeAssembly(
"TPC_MMH");
2868 tpcmmh->AddNode(tpcmmhcv, 1,
new TGeoTranslation(0.65 + 1.5, 1.85, 0.0));
2869 tpcmmh->AddNode(tpcmmhcv, 2,
new TGeoCombiTrans(-0.65 - 1.5, 1.85, 0.0, rot111));
2870 tpcmmh->AddNode(tpcmmhs, 1,
new TGeoTranslation(1.5, 0.0, 0.0));
2871 tpcmmh->AddNode(tpcmmhs, 2,
new TGeoCombiTrans(-1.5, 0.0, 0.0, rot111));
2881 auto* gres1 =
new TGeoTube(0., 0.375, 125.);
2883 auto* vgres1 =
new TGeoVolume(
"TPC_GRES1", gres1, m14);
2888 xrc = 79.3 * TMath::Cos(350. * TMath::DegToRad());
2889 yrc = 79.3 * TMath::Sin(350. * TMath::DegToRad());
2891 v9->AddNode(vgres1, 1,
new TGeoTranslation(xrc, yrc, 126.9));
2892 v9->AddNode(vgres1, 2,
new TGeoTranslation(xrc, yrc, -126.9));
2894 xrc = 79.3 * TMath::Cos(190. * TMath::DegToRad());
2895 yrc = 79.3 * TMath::Sin(190. * TMath::DegToRad());
2897 v9->AddNode(vgres1, 3,
new TGeoTranslation(xrc, yrc, 126.9));
2898 v9->AddNode(vgres1, 4,
new TGeoTranslation(xrc, yrc, -126.9));
2900 TGeoRotation refl(
"refl", 90., 0., 90., 90., 180., 0.);
2901 TGeoRotation rotrod(
"rotrod");
2903 TGeoRotation* rotpos[2];
2905 TGeoRotation* rotrod1[2];
2909 auto* clampi1 =
new TGeoBBox(
"clampi1", 0.2, 3.1, 0.8);
2910 auto* clampi1v =
new TGeoVolume(
"TPC_clampi1v", clampi1, m6);
2912 pointstrap[0] = 0.49;
2913 pointstrap[1] = 0.375;
2915 pointstrap[2] = 0.49;
2916 pointstrap[3] = -0.375;
2918 pointstrap[4] = -0.49;
2919 pointstrap[5] = -0.375;
2921 pointstrap[6] = -0.49;
2922 pointstrap[7] = 1.225;
2924 pointstrap[8] = 0.49;
2925 pointstrap[9] = 0.375;
2927 pointstrap[10] = 0.49;
2928 pointstrap[11] = -0.375;
2930 pointstrap[12] = -0.49;
2931 pointstrap[13] = -0.375;
2933 pointstrap[14] = -0.49;
2934 pointstrap[15] = 1.225;
2936 auto* clitrap =
new TGeoArb8(
"clitrap", 0.25, pointstrap);
2937 auto* clitrapv =
new TGeoVolume(
"TPC_clitrapv", clitrap, m6);
2939 auto* clamprot =
new TGeoRotation();
2940 clamprot->RotateX(180.);
2942 new TGeoBBox(
"clibox", 1.125, 3.1, .1);
2943 new TGeoTube(
"clitub", 0., 2.2, 0.1);
2947 auto* clitr1 =
new TGeoTranslation(
"clitr1", 1.125, 0., 0.);
2948 clitr1->RegisterYourself();
2949 auto* clihold =
new TGeoCompositeShape(
"clihold",
"clibox-clitub:clitr1");
2950 auto* cliholdv =
new TGeoVolume(
"TPC_cliholdv", clihold, m6);
2954 TGeoVolume* iclamp =
new TGeoVolumeAssembly(
"TPC_iclamp");
2956 iclamp->AddNode(clampi1v, 1);
2957 iclamp->AddNode(clitrapv, 1,
new TGeoTranslation(0.69, -2.725, 0.35));
2958 iclamp->AddNode(clitrapv, 2,
new TGeoTranslation(0.69, -2.725, -0.35));
2959 iclamp->AddNode(clitrapv, 3,
new TGeoCombiTrans(0.69, 2.725, 0.35, clamprot));
2960 iclamp->AddNode(clitrapv, 4,
new TGeoCombiTrans(0.69, 2.725, -0.35, clamprot));
2961 iclamp->AddNode(cliholdv, 1,
new TGeoTranslation(1.325, 0., 0.));
2965 auto* clampo1 =
new TGeoBBox(
"clampo1", 0.25, 3.1, 1.);
2966 auto* clampo2 =
new TGeoBBox(
"clampo2", 0.4, 0.85, 1.);
2968 auto* clampo1v =
new TGeoVolume(
"TPC_clampo1v", clampo1, m6);
2969 auto* clampo2v =
new TGeoVolume(
"TPC_clampo2v", clampo2, m6);
2971 auto* oclamp =
new TGeoVolumeAssembly(
"TPC_oclamp");
2973 oclamp->AddNode(clampo1v, 1);
2975 oclamp->AddNode(clampo2v, 1,
new TGeoTranslation(0.65, -2.25, 0));
2976 oclamp->AddNode(clampo2v, 2,
new TGeoTranslation(0.65, 2.25, 0));
2979 pointstrap[0] = 0.375;
2980 pointstrap[1] = 0.75;
2981 pointstrap[2] = 0.375;
2982 pointstrap[3] = -0.35;
2983 pointstrap[4] = -0.375;
2984 pointstrap[5] = -0.35;
2985 pointstrap[6] = -0.375;
2986 pointstrap[7] = 0.35;
2988 pointstrap[8] = 0.375;
2989 pointstrap[9] = 0.75;
2990 pointstrap[10] = 0.375;
2991 pointstrap[11] = -0.35;
2992 pointstrap[12] = -0.375;
2993 pointstrap[13] = -0.35;
2994 pointstrap[14] = -0.375;
2995 pointstrap[15] = 0.35;
2997 auto* clotrap =
new TGeoArb8(
"clotrap", 0.25, pointstrap);
2998 auto* clotrapv =
new TGeoVolume(
"TPC_clotrapv", clotrap, m6);
3000 oclamp->AddNode(clotrapv, 1,
new TGeoTranslation(-0.625, -2.75, 0.35));
3001 oclamp->AddNode(clotrapv, 2,
new TGeoTranslation(-0.625, -2.75, -0.35));
3002 oclamp->AddNode(clotrapv, 3,
new TGeoCombiTrans(-0.625, 2.75, 0.35, clamprot));
3003 oclamp->AddNode(clotrapv, 4,
new TGeoCombiTrans(-0.625, 2.75, -0.35, clamprot));
3005 auto* clampo3 =
new TGeoBBox(
"clampo3", 1.6, 0.45, .1);
3006 auto* clampo3v =
new TGeoVolume(
"TPC_clampo3v", clampo3, m6);
3008 oclamp->AddNode(clampo3v, 1,
new TGeoTranslation(-1.85, 2.625, 0.));
3009 oclamp->AddNode(clampo3v, 2,
new TGeoTranslation(-1.85, -2.625, 0));
3011 auto* clampo4 =
new TGeoTubeSeg(
"clampo4", 2.2, 3.1, 0.1, 90., 270.);
3012 auto* clampo4v =
new TGeoVolume(
"TPC_clampo4v", clampo4, m6);
3014 oclamp->AddNode(clampo4v, 1,
new TGeoTranslation(-3.45, 0., 0.));
3018 TGeoRotation rot102(
"rot102");
3019 rot102.RotateY(-90.);
3021 for (Int_t
i = 0;
i < 18;
i++) {
3024 angle = TMath::DegToRad() * 20. * (Double_t)
i;
3030 auto* rot12 =
new TGeoRotation();
3031 rot12->RotateZ(-90.0 +
i * 20.);
3032 v9->AddNode(tpcihpl,
i + 1,
new TGeoCombiTrans(
x,
y, 0., rot12));
3035 rotrod.RotateZ(-90. +
i * 20.);
3036 rotrod1[0] =
new TGeoRotation();
3037 rotpos[0] =
new TGeoRotation();
3039 rotrod1[0]->RotateZ(90. +
i * 20.);
3040 *rotpos[0] = refl * rotrod;
3041 v9->AddNode(tpcrrod, 1,
new TGeoCombiTrans(
x,
y,
z, rotrod1[0]));
3042 v9->AddNode(tpcrrod, 2,
new TGeoCombiTrans(
x,
y, -
z, rotpos[0]));
3044 v9->AddNode(tpcmrod,
i + 1,
new TGeoTranslation(
x,
y,
z));
3045 v9->AddNode(tpcmrod,
i + 19,
new TGeoCombiTrans(
x,
y, -
z,
ref));
3053 rot12 =
new TGeoRotation();
3054 rot12->RotateZ(
i * 20.);
3057 v9->AddNode(iclamp, 7 *
i + 1,
new TGeoCombiTrans(
x,
y, 5.25, rot12));
3058 v9->AddNode(iclamp, 7 *
i + 2,
new TGeoCombiTrans(
x,
y, 38.25, rot12));
3059 v9->AddNode(iclamp, 7 *
i + 3,
new TGeoCombiTrans(
x,
y, 80.25, rot12));
3060 v9->AddNode(iclamp, 7 *
i + 4,
new TGeoCombiTrans(
x,
y, 122.25, rot12));
3061 v9->AddNode(iclamp, 7 *
i + 5,
new TGeoCombiTrans(
x,
y, 164.25, rot12));
3062 v9->AddNode(iclamp, 7 *
i + 6,
new TGeoCombiTrans(
x,
y, 206.25, rot12));
3063 v9->AddNode(iclamp, 7 *
i + 7,
new TGeoCombiTrans(
x,
y, 246.75, rot12));
3065 v9->AddNode(iclamp, 7 *
i + 127,
new TGeoCombiTrans(
x,
y, -5.25, rot12));
3066 v9->AddNode(iclamp, 7 *
i + 128,
new TGeoCombiTrans(
x,
y, -38.25, rot12));
3067 v9->AddNode(iclamp, 7 *
i + 129,
new TGeoCombiTrans(
x,
y, -80.25, rot12));
3068 v9->AddNode(iclamp, 7 *
i + 130,
new TGeoCombiTrans(
x,
y, -122.25, rot12));
3069 v9->AddNode(iclamp, 7 *
i + 131,
new TGeoCombiTrans(
x,
y, -164.25, rot12));
3070 v9->AddNode(iclamp, 7 *
i + 132,
new TGeoCombiTrans(
x,
y, -206.25, rot12));
3071 v9->AddNode(iclamp, 7 *
i + 133,
new TGeoCombiTrans(
x,
y, -246.75, rot12));
3083 auto* rot33 =
new TGeoRotation();
3084 rot33->RotateZ(-90 +
i * 20.);
3086 v9->AddNode(tpcohpl,
i + 1,
new TGeoCombiTrans(
x,
y, 0., rot33));
3088 Double_t xxx = 256.297 * TMath::Cos((
i * 20. + 10.) * TMath::DegToRad());
3089 Double_t yyy = 256.297 * TMath::Sin((
i * 20. + 10.) * TMath::DegToRad());
3091 TGeoRotation rot101(
"rot101");
3092 rot101.RotateZ(90. +
i * 20. + 10.);
3093 auto* rot103 =
new TGeoRotation(
"rot103");
3094 *rot103 = rot101 * rot102;
3096 auto* trh100 =
new TGeoCombiTrans(xxx, yyy, 0., rot103);
3100 v9->AddNode(tpcmmh, 1, trh100);
3103 v9->AddNode(tpcomh,
i + 1, trh100);
3108 rotrod.RotateZ(90. +
i * 20.);
3109 rotrod1[1] =
new TGeoRotation();
3110 rotpos[1] =
new TGeoRotation();
3111 rotrod1[1]->RotateZ(90. +
i * 20.);
3112 *rotpos[1] = refl * rotrod;
3113 v9->AddNode(tpcrrod, 3,
new TGeoCombiTrans(
x,
y,
z, rotrod1[1]));
3114 v9->AddNode(tpcrrod, 4,
new TGeoCombiTrans(
x,
y, -
z, rotpos[1]));
3116 v9->AddNode(tpcmrod,
i + 37,
new TGeoTranslation(
x,
y,
z));
3117 v9->AddNode(tpcmrod,
i + 55,
new TGeoCombiTrans(
x,
y, -
z,
ref));
3120 v9->AddNode(hvrv, 1,
new TGeoTranslation(
x,
y,
z + 0.7));
3128 rot12 =
new TGeoRotation();
3129 rot12->RotateZ(
i * 20.);
3132 v9->AddNode(oclamp, 7 *
i + 1,
new TGeoCombiTrans(
x,
y, 5.25, rot12));
3133 v9->AddNode(oclamp, 7 *
i + 2,
new TGeoCombiTrans(
x,
y, 38.25, rot12));
3134 v9->AddNode(oclamp, 7 *
i + 3,
new TGeoCombiTrans(
x,
y, 80.25, rot12));
3135 v9->AddNode(oclamp, 7 *
i + 4,
new TGeoCombiTrans(
x,
y, 122.25, rot12));
3136 v9->AddNode(oclamp, 7 *
i + 5,
new TGeoCombiTrans(
x,
y, 164.25, rot12));
3137 v9->AddNode(oclamp, 7 *
i + 6,
new TGeoCombiTrans(
x,
y, 206.25, rot12));
3138 v9->AddNode(oclamp, 7 *
i + 7,
new TGeoCombiTrans(
x,
y, 246.75, rot12));
3140 v9->AddNode(oclamp, 7 *
i + 127,
new TGeoCombiTrans(
x,
y, -5.25, rot12));
3141 v9->AddNode(oclamp, 7 *
i + 128,
new TGeoCombiTrans(
x,
y, -38.25, rot12));
3142 v9->AddNode(oclamp, 7 *
i + 129,
new TGeoCombiTrans(
x,
y, -80.25, rot12));
3143 v9->AddNode(oclamp, 7 *
i + 130,
new TGeoCombiTrans(
x,
y, -122.25, rot12));
3144 v9->AddNode(oclamp, 7 *
i + 131,
new TGeoCombiTrans(
x,
y, -164.25, rot12));
3145 v9->AddNode(oclamp, 7 *
i + 132,
new TGeoCombiTrans(
x,
y, -206.25, rot12));
3146 v9->AddNode(oclamp, 7 *
i + 133,
new TGeoCombiTrans(
x,
y, -246.75, rot12));
3150 TGeoVolume* alice = gGeoManager->GetVolume(
"barrel");
3151 alice->AddNode(
v1, 1,
new TGeoTranslation(0., 30., 0.));
3155void Detector::LoadGeometryFromFile()
3158 if (mGeoFileName.IsNull()) {
3159 LOG(fatal) <<
"TPC geometry file name not set";
3163 TFile* fGeoFile = TFile::Open(mGeoFileName);
3164 if (!fGeoFile || !fGeoFile->IsOpen() || fGeoFile->IsZombie()) {
3165 LOG(fatal) <<
"Could not open TPC geometry file '" << mGeoFileName <<
"'";
3169 TGeoVolume* tpcVolume =
dynamic_cast<TGeoVolume*
>(fGeoFile->Get(
"TPC_M"));
3171 LOG(fatal) <<
"Could not retrieve TPC geometry from file '" << mGeoFileName <<
"'";
3175 LOG(info) <<
"Loaded TPC geometry from file '" << mGeoFileName <<
"'";
3176 TGeoVolume* alice = gGeoManager->GetVolume(
"barrel");
3177 alice->AddNode(tpcVolume, 1,
new TGeoTranslation(0., 30., 0.));
3180void Detector::defineSensitiveVolumes()
3182 TGeoManager* geoManager = gGeoManager;
3183 TGeoVolume*
v =
nullptr;
3187 const Int_t nSensitive = 1;
3188 const char* volumeNames[nSensitive] = {
"TPC_Drift"};
3191 for (Int_t ivol = 0; ivol < nSensitive; ++ivol) {
3192 TString volumeName = volumeNames[ivol];
3193 v = geoManager->GetVolume(volumeName.Data());
3195 LOG(error) <<
"Could not find volume '" << volumeName <<
"'";
3200 AddSensitiveVolume(
v);
3204 auto vmc = TVirtualMC::GetMC();
3205 if (strcmp(vmc->GetName(),
"TFluka") == 0) {
3206 LOG(info) <<
"Setting special FLUKA parameters for TPC Driftgas";
3208 Int_t
index = mgr.getMediumID(
"TPC", kDriftGas2);
3209 vmc->Gstpar(
index,
"PRIMIO_E", 20.77);
3210 vmc->Gstpar(
index,
"PRIMIO_N", 14.35);
3211 vmc->Gstpar(
index,
"LOSS", 14);
3212 vmc->Gstpar(
index,
"STRA", 4);
3218 static thread_local Double_t
n = 0;
3219 static thread_local Double_t c1 = 0;
3220 static thread_local Double_t c2 = 0;
3221 static thread_local Double_t b1 = 0;
3222 static thread_local Double_t b2 = 0;
3226 }
else if (k >= 0.4 && k < 4) {
3227 n = 1. / k + (k - 0.4) / k / 3.6;
3228 }
else if (k >= 4.) {
3229 n = 1. / TMath::Sqrt(k);
3233 c1 = (k < 0.4) ? 0 : b1 * (TMath::Log(b1) - 1.) / 2.;
3234 c2 = b2 * (TMath::Log(b2) - 1.) / 2.;
3239 Double_t nu1 = gRandom->Rndm();
3240 Double_t nu2 = gRandom->Rndm();
3241 Double_t w1 = c1 + TMath::Log(nu1);
3242 Double_t w2 = c2 + TMath::Log(nu2);
3243 y =
n * (b1 * w2 - b2 * w1);
3248 if (TMath::Log(
y) >=
x) {
3252 return TMath::Exp(
x);
3259 name.Form(
"%sHitsShiftedSector%d", GetName(), probe);
3260 return std::string(
name.Data());
3262 return std::string();
3268 auto const& detParam = ParameterDetector::Instance();
3269 LOG(info) <<
"TPC SetSpecialPhysicsCuts: UseGeant4Edep=" << detParam.UseGeant4Edep;
3270 if (detParam.UseGeant4Edep) {
3272 const float specialCut = detParam.SpecialCutsGeV;
3273 for (
int med : {(int)kDriftGas1, (
int)kDriftGas2, (int)kCO2}) {