3 #include <fwk/RunController.h>
4 #include <fwk/CentralConfig.h>
6 #include <utl/CoordinateSystem.h>
8 #include <utl/TabulatedFunction.h>
9 #include <utl/Reader.h>
10 #include <utl/AugerUnits.h>
11 #include <utl/AugerException.h>
14 #include <G4PhysicalConstants.hh>
15 #include <G4SystemOfUnits.hh>
16 #include <G4PVReplica.hh>
34 namespace G4StationSimulatorOG {
37 G4ThreeVector G4StationConstruction::fgTankCenter;
39 double G4StationConstruction::fgTankRadius = 0;
40 double G4StationConstruction::fgTankHalfHeight = 0;
41 double G4StationConstruction::fgTankThickness = 0;
43 double G4StationConstruction::fgHeightz = 0;
44 double G4StationConstruction::fgPmtRmax = 0;
45 double G4StationConstruction::fgPmtRzmax = 0;
46 double G4StationConstruction::fgInterfaceRmax = 0;
47 double G4StationConstruction::fgInterfaceRzmax = 0;
48 double G4StationConstruction::fgDomeRmax = 0;
49 double G4StationConstruction::fgDomeRzmax = 0;
51 double G4StationConstruction::fPmtRmin_SPMT = 0;
52 double G4StationConstruction::fPmtRmax_SPMT = 0;
53 double G4StationConstruction::fInterfaceRadius_SPMT = 0;
54 double G4StationConstruction::fDomeRadius_SPMT = 0;
55 double G4StationConstruction::fGlassThickness_SPMT = 0;
56 double G4StationConstruction::fInterfaceThickness_SPMT = 0;
57 double G4StationConstruction::fDomeThickness_SPMT = 0;
64 double G4StationConstruction::fgSIGMA_ALPHA = 0;
83 Scale(T& v,
const double factor)
93 Scale(
const T&
b,
const T& e,
const double factor)
95 for (
auto it = b; it != e; ++it)
103 Renew(T* (&
p), T*
const val)
116 NotRenew(T* (&
p), T*
const val)
127 return kDistanceToG4 * G4ThreeVector(t.get<0>(), t.get<1>(), t.get<2>());
131 template<
class Material>
141 G4StationConstruction::G4StationConstruction(
const double simRadius,
const bool umdEnabled,
142 const double scintYield,
const bool martaEnabled) :
207 const auto cs = dStation.GetLocalCoordinateSystem();
212 for (
const auto& dpmt : dStation.PMTsRange()) {
215 pmt.
fId = dpmt.GetId();
217 fPMTs.push_back(pmt);
268 Scale(fgLinerSPECULARLOBECONSTANT.XBegin(), fgLinerSPECULARLOBECONSTANT.XEnd(),
kEnergyToG4);
271 Scale(fgLinerSPECULARSPIKECONSTANT.XBegin(), fgLinerSPECULARSPIKECONSTANT.XEnd(),
kEnergyToG4);
284 if (dStation.HasScintillator()) {
320 if (!dStation.ExistsAssociatedCounter()) {
322 err <<
"Trying to simulate the UMD in a WCD (Id "<< dStation.GetId()
323 <<
") that has not an underground AMIGA scintillator associated!";
335 const double martaSupportHeight =
355 const mdet::MDetector& mDetector = det::Detector::GetInstance().GetMDetector();
378 fUMDScints = mmDet->GetNumberOfScintillators();
392 const int sId = dStation.
GetId();
393 const cdet::Station& station = det::Detector::GetInstance().GetCDetector().GetStation(sId);
432 msg <<
"Number of RPC chambers " << nRPC;
438 for (
unsigned int i = 1; i <= nRPC; ++i) {
445 INFO(
"RPC positions and rotation in SD station coordinate system:");
469 WARNING(
"Tank support will not be build!");
475 const string err =
"Feet of tank support have different heights! "
476 "Refuse to simulate this configuration!";
483 const string err =
"Feet of tank support have different lengths! "
484 "Refuse to simulate this configuration!";
491 const string err =
"Outer feet of tank support stick out of top slab! "
492 "Refuse to simulate this configuration!";
498 const string err =
"Central foot overlaps outer feet! "
499 "Refuse to simulate this configuration !";
504 const string err =
"Base of central foot overlap base of outer feet! "
505 "Refuse to simulate this configuration !";
513 const G4ThreeVector precastHoleDimensions(
520 if (alBoxDimensions[0] >= precastHoleDimensions[0] ||
521 alBoxDimensions[1] >= precastHoleDimensions[1] ||
522 alBoxDimensions[2] >= precastHoleDimensions[2]) {
524 err <<
"RPC housing larger than inner size of concrete tank support!\n"
526 << alBoxDimensions[0]/
CLHEP::m <<
", "
527 << alBoxDimensions[1]/
CLHEP::m <<
", "
528 << alBoxDimensions[2]/
CLHEP::m <<
") > ("
529 << precastHoleDimensions[0]/
CLHEP::m <<
", "
530 << precastHoleDimensions[1]/
CLHEP::m <<
", "
531 << precastHoleDimensions[2]/
CLHEP::m <<
')';
538 err <<
"Dimensions of RPC chamber greater than inner size of Al box!\n"
556 vector<double> pmt_pp;
559 vector<double> pmt_face_abs;
562 vector<double> pmt_interface_abs;
565 vector<double> pmt_dome_abs;
575 const unsigned int size = pmt_pp.size();
577 if (pmt_face_abs.size() != size ||
578 pmt_interface_abs.size() != size ||
579 pmt_dome_abs.size() != size) {
580 const string err =
"TabulatedFunction size mismatch for pmt properties";
585 for (
unsigned int i = 0; i < size; ++i) {
623 vector<double> liner_pp;
626 vector<double> liner_rindex;
629 vector<double> liner_abs;
632 vector<double> liner_backscatter;
639 const unsigned int size = liner_pp.size();
641 if (liner_rindex.size() != size ||
642 liner_abs.size() != size ||
643 liner_backscatter.size() != size) {
644 const string err =
"Tabulated function size mismatch for liner properties";
649 for (
unsigned int i = 0; i < size; ++i) {
674 Renew(
elN,
new G4Element(
"Nitrogen",
"N", 7, 14.01 *
g/
mole));
675 Renew(
elO,
new G4Element(
"Oxygen",
"O", 8, 16.00 *
g/
mole));
676 Renew(
elAl,
new G4Element(
"Aluminum",
"Al", 13, 29.98 *
g/
mole));
677 Renew(
elFe,
new G4Element(
"Iron",
"Fe", 26, 55.85 *
g/
mole));
678 Renew(
elH,
new G4Element(
"Hydrogen",
"H", 1, 1.01 *
g/
mole));
679 Renew(
elSi,
new G4Element(
"Silicon",
"Si", 14, 28.09 *
g/
mole));
680 Renew(
elB,
new G4Element(
"Boron",
"B", 5, 10.811 *
g/
mole));
681 Renew(
elNa,
new G4Element(
"Sodium",
"Na", 11, 22.98977 *
g/
mole));
682 Renew(
elC,
new G4Element(
"Carbon",
"C", 6, 12.0107 *
g/
mole));
683 Renew(
elCl,
new G4Element(
"Chlorine",
"Cl", 17, 35.453 *
g/
mole));
684 Renew(
elTi,
new G4Element(
"Titanium",
"Ti", 22, 47.867 *
g/
mole));
687 const G4double density = 2.23*
g/
cm3;
690 Renew(
SiO2,
new G4Material(
"SiO2", density, 2));
695 Renew(
B2O2,
new G4Material(
"B2O2", density, 2));
699 Renew(
Na2O,
new G4Material(
"Na2O", density, 2));
703 Renew(
TiO2,
new G4Material(
"TiO2", 1.060 *
g/
cm3, 2));
751 Renew(
Air,
new G4Material(
"Air", 1.29e-3 *
g/
cm3, 2));
752 Air->AddElement(
elN, 0.7);
753 Air->AddElement(
elO, 0.3);
756 double airPP[2] = { 2.08*
eV, 4.20*
eV };
757 double airRINDEX[2] = { 1.000273, 1.000273 };
758 double airABSLENGTH[2] = { 10000*
m, 10000*
m };
760 Renew(
airMPT,
new G4MaterialPropertiesTable());
761 airMPT->AddProperty(
"RINDEX", airPP, airRINDEX, 2);
762 airMPT->AddProperty(
"ABSLENGTH", airPP, airABSLENGTH, 2);
771 Renew(
Water,
new G4Material(
"Water", 1 *
g/
cm3, 2));
776 Renew(
waterMPT,
new G4MaterialPropertiesTable());
792 Renew(
Vacuum,
new G4Material(
"Vacuum", 1, 1 *
g/
mole, universe_mean_density,
793 kStateUndefined, STP_Temperature, STP_Pressure));
815 Renew(
Pyrex,
new G4Material(
"Pyrex", 2.23 *
g/
cm3, 3));
821 Renew(
pmtfaceMPT,
new G4MaterialPropertiesTable());
844 const G4double density = 2.23 *
g/
cm3;
846 Renew(
Pyrex1,
new G4Material(
"Pyrex1", density, 3));
851 Renew(
pmtfaceMPT1,
new G4MaterialPropertiesTable());
869 const G4double density = 1.20 *
g/
cm3;
871 Renew(
CH3,
new G4Material(
"CH3", density, 2));
875 Renew(
CH2,
new G4Material(
"CH2", density, 2));
879 Renew(
C,
new G4Material(
"C", density, 1));
880 C->AddElement(
elC, 1);
882 Renew(
CO2,
new G4Material(
"CO2", density, 2));
894 Renew(
Lucite,
new G4Material(
"Lucite", density, 3));
899 Renew(
pmtdomeMPT,
new G4MaterialPropertiesTable());
915 const G4double density = 0.97 *
g/
cm3;
917 Renew(
Interface,
new G4Material(
"Interface", density, 3));
938 const G4double density = 0.94 *
g/
cm3;
940 Renew(
HDPE,
new G4Material(
"HDPE", density, 2));
944 Renew(
linerMPT,
new G4MaterialPropertiesTable());
984 const G4double density = 2.700 *
g/
cm3;
985 const G4double
a = 29.98 *
g/
mole;
986 Renew(
Al,
new G4Material(
"Aluminum", 13, a, density));
1000 const G4double density = (
1001 2.43 + 2.39 + 2.41 +
1002 2.39 + 2.45 + 2.32 +
1005 Renew(
Dirt,
new G4Material(
"Dirt", density, 4));
1017 const G4double density = 1.04 *
g/
cm3;
1018 Renew(
Polystyrene,
new G4Material(
"Polystyrene", density, 2));
1042 const G4double density = 1.060 *
g/
cm3;
1044 Renew(
PPO,
new G4Material(
"PPO", density, 4));
1045 PPO->AddElement(
elC, 15);
1046 PPO->AddElement(
elH, 11);
1050 Renew(
POPOP,
new G4Material(
"POPOP", density, 4));
1056 Renew(
ScintMat,
new G4Material(
"ScintMat", density, 3));
1063 const G4double density = 1.52 *
g/
cm3;
1064 Renew(
ScintCoating,
new G4Material(
"ScintCoating", density, 2));
1079 Renew(
PMMA,
new G4Material(
"PMMA", 1.190 *
g/
cm3, 3));
1085 Renew(
Pethylene,
new G4Material(
"Pethylene", 1.200 *
g/
cm3, 2));
1094 G4double photonEnergy[] = {
1095 2.00, 2.03, 2.06, 2.09, 2.12,
1096 2.15, 2.18, 2.21, 2.24, 2.27,
1097 2.30, 2.33, 2.36, 2.39, 2.42,
1098 2.45, 2.48, 2.51, 2.54, 2.57,
1099 2.60, 2.63, 2.66, 2.69, 2.72,
1100 2.75, 2.78, 2.81, 2.84, 2.87,
1101 2.90, 2.93, 2.96, 2.99, 3.02,
1102 3.05, 3.08, 3.11, 3.14, 3.17,
1103 3.20, 3.23, 3.26, 3.29, 3.32,
1104 3.35, 3.38, 3.41, 3.44, 3.47
1108 const auto n = utl::Length(photonEnergy);
1111 G4double refractiveIndexWLSfiber[] = {
1112 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60,
1113 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60,
1114 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60,
1115 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60,
1116 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60, 1.60
1118 assert(utl::Length(refractiveIndexWLSfiber) == n);
1120 G4double absWLSfiber[] = {
1121 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00,
1122 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00,
1123 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 10.00, 1.0,
1124 0.0001, 0.0001, 0.0001, 0.0001, 0.0001,0.0001, 0.0001, 0.0001, 0.0001, 0.0001,
1125 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001
1128 assert(utl::Length(absWLSfiber) == n);
1130 G4double emissionFib[] = {
1131 0.05, 0.10, 0.30, 0.50, 0.75, 1.00, 1.50, 1.85, 2.30, 2.75,
1132 3.25, 3.80, 4.50, 5.20, 6.00, 7.00, 8.50, 9.50, 11.1, 12.4,
1133 12.9, 13.0, 12.8, 12.3, 11.1, 11.0, 12.0, 11.0, 17.0, 16.9,
1134 15.0, 9.00, 2.50, 1.00, 0.05, 0.00, 0.00, 0.00, 0.00, 0.00,
1135 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00
1137 assert(utl::Length(emissionFib) == n);
1140 G4MaterialPropertiesTable*
const mptWLSfiber =
new G4MaterialPropertiesTable();
1141 mptWLSfiber->AddProperty(
"RINDEX", photonEnergy, refractiveIndexWLSfiber, n);
1142 mptWLSfiber->AddProperty(
"WLSABSLENGTH", photonEnergy, absWLSfiber, n);
1143 mptWLSfiber->AddProperty(
"WLSCOMPONENT", photonEnergy, emissionFib, n);
1144 mptWLSfiber->AddConstProperty(
"WLSTIMECONSTANT", 20*
ns);
1146 PMMA->SetMaterialPropertiesTable(mptWLSfiber);
1150 G4double refractiveIndexClad1[] = {
1151 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49,
1152 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49,
1153 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49,
1154 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49,
1155 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49, 1.49
1158 assert(utl::Length(refractiveIndexClad1) == n);
1160 G4double absClad[] = {
1161 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0,
1162 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0,
1163 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0,
1164 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0,
1165 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0
1168 assert(utl::Length(absClad) == n);
1171 G4MaterialPropertiesTable*
const mptClad1 =
new G4MaterialPropertiesTable();
1172 mptClad1->AddProperty(
"RINDEX", photonEnergy, refractiveIndexClad1, n);
1173 mptClad1->AddProperty(
"ABSLENGTH", photonEnergy, absClad, n);
1175 Pethylene->SetMaterialPropertiesTable(mptClad1);
1179 G4double refractiveIndexClad2[] = {
1180 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42,
1181 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42,
1182 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42,
1183 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42,
1184 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42, 1.42
1187 assert(utl::Length(refractiveIndexClad2) == n);
1190 G4MaterialPropertiesTable*
const mptClad2 =
new G4MaterialPropertiesTable();
1191 mptClad2->AddProperty(
"RINDEX", photonEnergy, refractiveIndexClad2, n);
1192 mptClad2->AddProperty(
"ABSLENGTH", photonEnergy, absClad, n);
1194 FPethylene->SetMaterialPropertiesTable(mptClad2);
1203 G4double photonEnergy[] = {
1204 2.00, 2.03, 2.06, 2.09, 2.12,
1205 2.15, 2.18, 2.21, 2.24, 2.27,
1206 2.30, 2.33, 2.36, 2.39, 2.42,
1207 2.45, 2.48, 2.51, 2.54, 2.57,
1208 2.60, 2.63, 2.66, 2.69, 2.72,
1209 2.75, 2.78, 2.81, 2.84, 2.87,
1210 2.90, 2.93, 2.96, 2.99, 3.02,
1211 3.05, 3.08, 3.11, 3.14, 3.17,
1212 3.20, 3.23, 3.26, 3.29, 3.32,
1213 3.35, 3.38, 3.41, 3.44, 3.47
1216 const auto n = utl::Length(photonEnergy);
1220 G4double refractiveIndexPS[] = {
1221 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50,
1222 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50,
1223 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50,
1224 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50,
1225 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50, 1.50
1227 assert(utl::Length(refractiveIndexPS) == n);
1229 G4double absPS[] = {
1230 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1231 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1232 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1233 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0,
1234 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0
1237 assert(utl::Length(absPS) == n);
1239 G4double scintilFast[] = {
1240 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
1241 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
1242 0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
1243 1, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1244 1, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
1246 assert(utl::Length(scintilFast) == n);
1248 G4double scintilSlow[] = {
1249 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1250 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1251 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1252 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
1253 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
1255 assert(utl::Length(scintilSlow) == n);
1258 G4MaterialPropertiesTable*
const mptPolystyrene =
new G4MaterialPropertiesTable();
1259 mptPolystyrene->AddProperty(
"RINDEX", photonEnergy, refractiveIndexPS, n);
1260 mptPolystyrene->AddProperty(
"ABSLENGTH", photonEnergy, absPS, n);
1261 mptPolystyrene->AddProperty(
"FASTCOMPONENT", photonEnergy, scintilFast, n);
1262 mptPolystyrene->AddProperty(
"SLOWCOMPONENT", photonEnergy, scintilSlow, n);
1265 mptPolystyrene->AddConstProperty(
"RESOLUTIONSCALE", 1);
1266 mptPolystyrene->AddConstProperty(
"FASTTIMECONSTANT", 5.*
CLHEP::ns);
1267 mptPolystyrene->AddConstProperty(
"SLOWTIMECONSTANT", 50.*
CLHEP::ns);
1268 mptPolystyrene->AddConstProperty(
"YIELDRATIO", 1);
1270 ScintMat->SetMaterialPropertiesTable(mptPolystyrene);
1277 const double extrusion_polish = 1;
1278 Renew(
fUMDScintSkinSurf,
new G4OpticalSurface(
"StripSkin", glisur, ground, dielectric_metal, extrusion_polish));
1279 Renew(
fUMDScintSkinSurfBack,
new G4OpticalSurface(
"StripSkinBack", glisur, ground, dielectric_metal, extrusion_polish));
1281 const double refl = 1;
1282 G4double skin_refl[] = {
1283 refl, refl, refl, refl, refl, refl, refl, refl, refl, refl,
1284 refl, refl, refl, refl, refl, refl, refl, refl, refl, refl,
1285 refl, refl, refl, refl, refl, refl, refl, refl, refl, refl,
1286 refl, refl, refl, refl, refl, refl, refl, refl, refl, refl,
1287 refl, refl, refl, refl, refl, refl, refl, refl, refl, refl
1289 assert(utl::Length(skin_refl) == n);
1291 G4double skin_effi[] = {
1292 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1293 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1294 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1295 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1296 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1298 assert(utl::Length(skin_effi) == n);
1300 G4MaterialPropertiesTable*
const scint_skin_MPT =
new G4MaterialPropertiesTable();
1301 G4MaterialPropertiesTable*
const scint_skin_back_MPT =
new G4MaterialPropertiesTable();
1302 scint_skin_MPT->AddProperty(
"REFLECTIVITY", photonEnergy, skin_refl, n);
1303 scint_skin_MPT->AddProperty(
"EFFICIENCY", photonEnergy, skin_effi, n);
1305 scint_skin_back_MPT->AddProperty(
"REFLECTIVITY", photonEnergy, skin_effi, n);
1306 scint_skin_back_MPT->AddProperty(
"EFFICIENCY", photonEnergy, skin_effi, n);
1349 Renew(
PVC,
new G4Material(
"PVC", 1.35 *
g/
cm3, 3));
1373 G4Material*
const G4_CaO =
fNistManager->FindOrBuildMaterial(
"G4_CALCIUM_OXIDE");
1374 G4Material*
const G4_MgO =
fNistManager->FindOrBuildMaterial(
"G4_MAGNESIUM_OXIDE");
1387 const vector<G4String> elements({
"H",
"C",
"F" });
1388 const vector<G4int> nbAtoms({ 2, 2, 4 });
1390 "TetraFluoroethane_STP",
1391 elements, nbAtoms, 0.00425 *
g/
cm3,
1395 "TetraFluoroethane",
"TetraFluoroethane_STP",
1446 if (!dStation.ExistsAssociatedCounter()) {
1448 err <<
"Trying to simulate the UMD in a WCD (Id "<< dStation.
GetId() <<
") "
1449 "that has not an underground AMIGA scintillator associated!";
1471 const auto module = ml.first;
1472 const auto len = ml.second;
1477 if (module == mdet::Module::AreaKind::eLarge) {
1518 G4Box*
const alBox_hole =
new G4Box(
"AlBox_hole", alBoxHoleSize[0]/2, alBoxHoleSize[1]/2, alBoxHoleSize[2]/2);
1520 G4Box*
const alBox_out =
new G4Box(
"AlBox_out", alBoxSize[0]/2, alBoxSize[1]/2, alBoxSize[2]/2);
1522 Renew(
AlBox_solid,
new G4SubtractionSolid(
"AlBox_solid", alBox_out, alBox_hole));
1525 const double rpcAcrylicThickness = 0.80*
CLHEP::mm;
1526 const double rpcGlassThickness = 1.85*
CLHEP::mm;
1527 const double rpcGasThickness = 1.0*
CLHEP::mm;
1528 const double rpcHeight = 2*rpcAcrylicThickness + 3*rpcGlassThickness + 2*rpcGasThickness;
1532 const double rpc_halfZ = rpcHeight/2;
1534 const double glass_halfX = rpc_halfX - 0.5*
CLHEP::mm;
1535 const double glass_halfY = rpc_halfY - 0.5*
CLHEP::mm;
1536 const double glass_halfZ = (3*rpcGlassThickness + 2*rpcGasThickness)/2;
1538 const double gas_halfX = glass_halfX - 0.5*
CLHEP::mm;
1539 const double gas_halfY = glass_halfY - 0.5*
CLHEP::mm;
1540 const double gas_halfZ = rpcGasThickness/2;
1542 const double pcb_halfX = rpc_halfX;
1543 const double pcb_halfY = rpc_halfY;
1547 const double spacer_halfX = rpc_halfX;
1548 const double spacer_halfY = rpc_halfY;
1549 const double spacer_halfZ = spacer_thickness/2;
1552 ostringstream errMsg;
1553 errMsg <<
"Total height of RPC + 2 x PCB + Spacer = "
1557 <<
" greater than inner height of Al box ("
1563 Renew(
rpc_solid,
new G4Box(
"rpc_solid", rpc_halfX, rpc_halfY, rpc_halfZ));
1564 Renew(
glass_solid,
new G4Box(
"rpc_glass_solid", glass_halfX, glass_halfY, glass_halfZ));
1565 Renew(
gas_solid,
new G4Box(
"rpc_gas_solid", gas_halfX, gas_halfY, gas_halfZ));
1566 Renew(
pcb_solid,
new G4Box(
"pcb_solid", pcb_halfX, pcb_halfY, pcb_halfZ));
1567 Renew(
spacer_solid,
new G4Box(
"spacer_solid", spacer_halfX, spacer_halfY, spacer_halfZ));
1577 expHall_log->SetVisAttributes(G4VisAttributes::Invisible);
1584 G4VisAttributes gVisatt(G4Colour::Brown());
1588 G4SDManager*
const sdMan = G4SDManager::GetSDMpointer();
1589 sdMan->AddNewDetector(soilSD);
1598 G4SDManager*
const sdMan = G4SDManager::GetSDMpointer();
1623 for (
auto& pmt :
fPMTs) {
1624 const unsigned int id = pmt.fId;
1625 const int pmtType = pmt.fPMTType;
1629 const auto& pos = pmt.fPMTPosition;
1630 const double x = pos.x();
1631 const double y = pos.y();
1634 const G4ThreeVector
p(x, y, z);
1637 name <<
"inner" << id;
1638 Renew(pmt.fInner_phys,
new G4PVPlacement(
nullptr, p,
inner_log, name.str().c_str(),
tank_log,
false, 0));
1642 name <<
"pmt" <<
id <<
"_log";
1643 Renew(pmt.fPMT_log,
new G4LogicalVolume(
pmt_solid,
Pyrex, name.str().c_str(), 0, 0, 0));
1646 name <<
"pmt" << id;
1647 Renew(pmt.fPMT_phys,
new G4PVPlacement(
nullptr, p, pmt.fPMT_log, name.str().c_str(),
tank_log,
false, 0));
1651 name <<
"pmt" <<
id <<
"_log1";
1652 Renew(pmt.fPMT_log1,
new G4LogicalVolume(
pmt_solid1,
Pyrex1, name.str().c_str(), 0, 0, 0));
1655 name <<
"pmt" <<
id <<
"1";
1656 Renew(pmt.fPMT_phys1,
new G4PVPlacement(
nullptr, p, pmt.fPMT_log1, name.str().c_str(),
tank_log,
false, 0));
1660 name <<
"interface" <<
id <<
"_log";
1664 name <<
"interface" << id;
1665 Renew(pmt.fInterface_phys,
new G4PVPlacement(
nullptr, p, pmt.fInterface_log, name.str().c_str(),
tank_log,
false, 0));
1669 name <<
"dome" <<
id <<
"_log";
1670 Renew(pmt.fDome_log,
new G4LogicalVolume(
dome_solid,
Lucite, name.str().c_str(), 0, 0, 0));
1673 name <<
"dome" << id;
1674 Renew(pmt.fDome_phys,
new G4PVPlacement(
nullptr, p, pmt.fDome_log, name.str().c_str(),
tank_log,
false, 0));
1678 name <<
"/Tank/pmt" << id;
1680 sdMan->AddNewDetector(pmtSD);
1681 pmt.fPMT_log->SetSensitiveDetector(pmtSD);
1689 G4RotationMatrix*
const solarPanelRot =
new G4RotationMatrix();
1690 solarPanelRot->rotate(M_PI/2, G4ThreeVector(0, 0, 1));
1701 G4RotationMatrix*
const elecBoxRot =
new G4RotationMatrix();
1702 elecBoxRot->rotate(M_PI/2, G4ThreeVector(0, 0, 1));
1715 for (
auto& pmt : fPMTs) {
1717 const unsigned int id = pmt.fId;
1718 const int pmtType = pmt.fPMTType;
1722 const auto& pos = pmt.fPMTPosition;
1723 const double x = pos.x();
1724 const double y = pos.y();
1730 name <<
"pmt" <<
id <<
"_log";
1731 Renew(pmt.fPMT_log,
new G4LogicalVolume(
s_pmt_solid,
Pyrex, name.str().c_str(), 0, 0, 0));
1734 name <<
"pmt" << id;
1735 Renew(pmt.fPMT_phys,
new G4PVPlacement(
nullptr, G4ThreeVector(x, y, z +
fPmtZ_SPMT), pmt.fPMT_log, name.str().c_str(),
top_log,
false, 0));
1739 name <<
"pmt" <<
id <<
"_log1";
1740 Renew(pmt.fPMT_log1,
new G4LogicalVolume(
s_pmt_solid1,
Pyrex1, name.str().c_str(), 0, 0, 0));
1743 name <<
"pmt" <<
id <<
"1";
1744 Renew(pmt.fPMT_phys1,
new G4PVPlacement(
nullptr, G4ThreeVector(x, y, z +
fPmtZ_SPMT), pmt.fPMT_log1, name.str().c_str(),
top_log,
false, 0));
1748 name <<
"interface" <<
id <<
"_log";
1752 name <<
"interface" << id;
1753 Renew(pmt.fInterface_phys,
new G4PVPlacement(
nullptr, G4ThreeVector(x, y, z +
fInterfaceZ_SPMT), pmt.fInterface_log, name.str().c_str(),
top_log,
false, 0));
1757 name <<
"dome" <<
id <<
"_log";
1758 Renew(pmt.fDome_log,
new G4LogicalVolume(
s_dome_solid,
Lucite, name.str().c_str(), 0, 0, 0));
1761 name <<
"dome" << id;
1762 Renew(pmt.fDome_phys,
new G4PVPlacement(
nullptr, G4ThreeVector(x, y, z +
fDomeZ_SPMT), pmt.fDome_log, name.str().c_str(),
top_log,
false, 0));
1766 name <<
"/Tank/pmt" << id;
1768 sdMan->AddNewDetector(pmtSD);
1769 pmt.fPMT_log->SetSensitiveDetector(pmtSD);
1806 sdMan->AddNewDetector(scintillatorSD);
1807 scin_log->SetSensitiveDetector(scintillatorSD);
1818 if (!dStation.ExistsAssociatedCounter()) {
1820 err <<
"Trying to simulate the UMD in a WCD (Id " << dStation.
GetId() <<
") that has not an underground AMIGA scintillator associated!";
1836 G4SDManager*
const sdMan = G4SDManager::GetSDMpointer();
1844 const G4VisAttributes
blue(G4Colour::Blue());
1849 sdMan->AddNewDetector(umdScintStripLargeSD);
1856 sdMan->AddNewDetector(umdScintStripSmallSD);
1861 const G4VisAttributes black(G4Colour::Black());
1874 const G4VisAttributes brown(G4Colour::Brown());
1877 const G4VisAttributes
green(G4Colour::Green());
1904 sdMan->AddNewDetector(umdPixelSD);
1905 pixel_log->SetSensitiveDetector(umdPixelSD);
1911 const mdet::MDetector& mDet = det::Detector::GetInstance().GetMDetector();
1923 std::cout << (area == mdet::Module::AreaKind::eLarge ?
"10m2" :
"5m2") << std::endl;
1931 const G4ThreeVector pos(x, y, z);
1934 G4RotationMatrix*
const rotMod =
new G4RotationMatrix();
1935 rotMod->rotateZ(-mod.
GetPhi0());
1939 name <<
"module_" << mod.
GetId() <<
'_' << dCounter.
GetId();
1941 if (area == mdet::Module::AreaKind::eLarge)
1952 const auto area = ml.first;
1953 std::cout <<
"Creating G4 physcal volume for " << (area == mdet::Module::AreaKind::eLarge ?
"10m2" :
"5m2") <<
" module" << std::endl;
1957 if (mIt->GetAreaKind() == area)
1982 const double dx = (x > 0 ? -1 : 1) * (fModAreaLenghts[area]/2 + onManiFold/2 -
fCoatingThickness);
1996 if (area == mdet::Module::AreaKind::eLarge) {
1999 name <<
"umd_strip_" << sc.
GetId();
2004 string nm =
"umd_top_coat";
2007 nm =
"umd_bot_coat";
2010 nm =
"umd_side1_coat";
2013 nm =
"umd_side2_coat";
2016 nm =
"umd_back_side_coat";
2017 const double xx = (x > 0 ? 1 : -1) * (fModAreaLenghts[area]/2 -
fCoatingThickness/2);
2020 G4RotationMatrix*
const erot =
new G4RotationMatrix();
2021 erot->rotateY(M_PI/2);
2030 G4RotationMatrix*
const prot =
new G4RotationMatrix();
2031 prot->rotateY(M_PI/2);
2034 name <<
"mod_pix_" << sc.
GetId();
2041 name <<
"umd_strip_" << sc.
GetId();
2053 const double xx = (x > 0 ? 1 : -1) * (fModAreaLenghts[area]/2 -
fCoatingThickness/2);
2056 G4RotationMatrix*
const erot =
new G4RotationMatrix();
2057 erot->rotateY(M_PI/2);
2060 NotRenew(
extra_clad2_phy,
new G4PVPlacement(erot, G4ThreeVector(x + dx, y, z),
"extra_clad2",
extra_clad2_log, umd_casing_phys_small,
false, 0));
2066 G4RotationMatrix*
const prot =
new G4RotationMatrix();
2067 prot->rotateY(M_PI/2);
2070 name <<
"mod_pix_" << sc.
GetId();
2087 G4RotationMatrix*
const frotMod_large =
new G4RotationMatrix();
2088 frotMod_large->rotateY(M_PI/2);
2109 G4RotationMatrix*
const frotMod_small =
new G4RotationMatrix();
2110 frotMod_small->rotateY(M_PI/2);
2140 const double rpcAcrylicThickness = 0.80*
CLHEP::mm;
2141 const double rpcGlassThickness = 1.85*
CLHEP::mm;
2142 const double rpcGasThickness = 1.0*
CLHEP::mm;
2143 const double rpcHeight = 2.0*rpcAcrylicThickness + 3.0*rpcGlassThickness + 2.0*rpcGasThickness;
2148 const double spacer_halfZ = spacer_thickness/2;
2158 const G4ThreeVector gasPos1(0, 0, (rpcGlassThickness + rpcGasThickness)/2);
2159 const G4ThreeVector gasPos2 = -gasPos1;
2161 new G4PVPlacement(
nullptr, gasPos1,
gas_log,
"rpc_gas",
glass_log,
false, 0);
2162 new G4PVPlacement(
nullptr, gasPos2,
gas_log,
"rpc_gas",
glass_log,
false, 1);
2166 const G4ThreeVector glassPos;
2167 new G4PVPlacement(
nullptr, glassPos,
glass_log,
"rpc_glass",
rpc_log,
false, 0);
2180 const G4ThreeVector alBox_pos =
2185 const G4ThreeVector rpc_pos =
2190 const G4ThreeVector pcb_1_pos =
2191 rpc_pos + G4ThreeVector(0, 0, (rpcHeight/2 + pcb_halfZ)) + G4ThreeVector(0, 0, 0.1*
CLHEP::mm);
2193 const G4ThreeVector spacer_pos =
2194 pcb_1_pos + G4ThreeVector(0, 0, (pcb_halfZ + spacer_halfZ)) + G4ThreeVector(0, 0, 0.1*
CLHEP::mm);
2196 const G4ThreeVector pcb_2_pos =
2197 spacer_pos + G4ThreeVector(0, 0, (spacer_halfZ + pcb_halfZ)) + G4ThreeVector(0, 0, 0.1*
CLHEP::mm);
2200 G4RotationMatrix*
const r =
new G4RotationMatrix();
2212 G4VisAttributes*
const rpcVisAtt =
new G4VisAttributes(
G4Colour::Red());
2213 rpcVisAtt->SetForceWireframe(
true);
2214 rpc_log->SetVisAttributes(rpcVisAtt);
2216 G4VisAttributes*
const glassVisAtt =
new G4VisAttributes(G4Colour::Yellow());
2217 glassVisAtt->SetForceWireframe(
true);
2218 glass_log->SetVisAttributes(glassVisAtt);
2220 G4VisAttributes*
const gasVisAtt =
new G4VisAttributes(G4Colour::Cyan());
2221 gasVisAtt->SetForceWireframe(
true);
2222 gas_log->SetVisAttributes(gasVisAtt);
2224 G4VisAttributes*
const alBoxVisAtt =
new G4VisAttributes(G4Colour::Grey());
2225 alBoxVisAtt->SetForceSolid(
true);
2226 alBoxVisAtt->SetVisibility(
true);
2227 alBoxVisAtt->SetForceWireframe(
true);
2230 G4VisAttributes*
const pcbVisAtt =
new G4VisAttributes(G4Colour::Green());
2231 pcbVisAtt->SetForceSolid(
true);
2233 pcb_log->SetVisAttributes(pcbVisAtt);
2235 spacer_log->SetVisAttributes(
new G4VisAttributes(G4Colour::White()));
2243 const G4ThreeVector tankSupport_pos =
2254 G4BooleanSolid*
const centralFoot_solid =
new G4UnionSolid(
"centralFoot_solid", centralFoot, centralFootBase, 0, trans1);
2263 G4BooleanSolid*
const outerFoot_solid =
new G4UnionSolid(
"outerFoot_solid", outerFoot, outerFootBase, 0, trans2);
2268 G4BooleanSolid*
const tankSupport_solid_0 =
new G4UnionSolid(
"tank_support_0", topSlab, centralFoot_solid, 0, trans3);
2272 G4BooleanSolid*
const tankSupport_solid_1 =
new G4UnionSolid(
"tank_support_1", tankSupport_solid_0, outerFoot_solid, 0, trans4);
2276 G4BooleanSolid*
const tankSupport_solid =
new G4UnionSolid(
"tank_support", tankSupport_solid_1, outerFoot_solid, 0, trans5);
2279 G4LogicalVolume*
const tankSupport_log =
new G4LogicalVolume(tankSupport_solid,
fG4_Concrete,
"tank_support_log", 0, 0, 0);
2281 new G4PVPlacement(
nullptr, tankSupport_pos,
"tank_support", tankSupport_log,
expHall_phys,
false, 0);
2283 G4VisAttributes*
const tankSupportVisAtt =
new G4VisAttributes(G4Colour::Grey());
2284 tankSupportVisAtt->SetForceSolid(
true);
2285 tankSupportVisAtt->SetVisibility(
true);
2286 tankSupportVisAtt->SetForceWireframe(
true);
2287 if (tankSupport_log)
2288 tankSupport_log->SetVisAttributes(tankSupportVisAtt);
2298 G4GeometryManager::GetInstance()->OpenGeometry();
2299 G4PhysicalVolumeStore::GetInstance()->Clean();
2300 G4LogicalVolumeStore::GetInstance()->Clean();
2301 G4SolidStore::GetInstance()->Clean();
2313 G4RunManager::GetRunManager()->DefineWorldVolume(
CreateTank(),
true);
G4LogicalVolume * umd_side_coat_log_small
std::vector< PMTConstruction > fPMTs
G4LogicalVolume * extra_clad1_log
G4PVPlacement * umd_strip_phys_small
double fWindowRadius_SPMT
G4Material * fG4_Concrete
std::vector< G4ThreeVector > fRPCPositions
void Convert(std::vector< T1, A1 > &destination, const std::vector< T2, A2 > &source)
static double fgTankHalfHeight
G4PVPlacement * pixel_phy
G4LogicalVolume * gas_log
double fScintillatorSandwichPanelThickness
double fSolarPanelTiltAngle
G4LogicalVolume * scin_sandwich_log
unsigned int GetNPoints() const
G4Material * ExpandedPolystyreneFoam
G4PVPlacement * elecBox_phys
G4PVPlacement * extra_clad2_phy
G4PVPlacement * tank_phys
double fUMDThicknessCasing
G4LogicalVolume * elecBox_log
G4Box * scin_sandwich_solid
constexpr double atmosphere
G4MaterialPropertiesTable * linerMPT
static double fgTankRadius
void SetScintCoatingProperties()
G4ThreeVector fAlBoxThickness
double fFaceActiveRadius_SPMT
const double kDistanceToG4
G4Box * umd_top_bot_coat_solid_small
G4LogicalVolume * top_log
G4Box * umd_strip_solid_large
G4LogicalVolume * ground_log
G4Box * umd_strip_solid_small
static const G4Colour green(0.0, 1.0, 0.0)
G4LogicalVolume * tank_log
G4LogicalVolume * pcb_log
boost::tuple< double, double, double > Triple
Coordinate triple for easy getting or setting of coordinates.
G4PVPlacement * scin_sandwich_phys
G4MaterialPropertiesTable * linerOpticalMPT
G4PVPlacement * umd_side1_coat_phys_large
G4LogicalVolume * side_log
ArrayIterator XEnd()
end of array of X
Base class for exceptions arising because configuration data are not valid.
G4LogicalVolume * umd_top_bot_coat_log_small
static double fDomeThickness_SPMT
Class to hold collection (x,y) points and provide interpolation between them.
virtual G4VPhysicalVolume * Construct() override
G4Ellipsoid * inner_solid
G4LogicalVolume * bottom_log
G4PVPlacement * scin_phys1
void CreateExpandedPolystyreneFoam()
G4PVPlacement * bottom_phys
double GetRPCSizeX() const
Dimensions of the RPC chamber.
utl::CoordinateSystemPtr GetLocalCoordinateSystem() const
Local system based on position and configured rotations.
const Fiber & GetFiberFor(const Component &c) const
Linking between fibers, scintillators, channels and pixels.
G4Box * umd_top_bot_coat_solid_large
G4PVPlacement * extra_clad1_phy
double GetHousingWidth() const
G4Ellipsoid * interface_out_aux
#define INFO(message)
Macro for logging informational messages.
double GetRoofOffset() const
static utl::TabulatedFunction fgWaterABSORPTION
ScintillatorConstIterator ScintillatorsBegin() const
Begin iterator over the contained scitillators.
utl::Point GetPosition() const
G4LogicalVolume * umd_fiber_core_log_large
G4PVPlacement * umd_side1_coat_phys_small
std::vector< double > GetTankSupportOuterFootBaseDimensions() const
void PushBack(const double x, const double y)
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
static utl::TabulatedFunction fgLinerSPECULARLOBECONSTANT
G4LogicalVolume * umd_fiber_core_log_small
G4LogicalVolume * inner_log
G4LogicalVolume * scin_casing_log
ModuleConstIterator ModulesEnd() const
Begin iterator for the Modules contained in the Counter.
Detector associated to muon detector hierarchy.
G4LogicalVolume * umd_fiber_clad2_log_large
TransformerConstructor< DerivedCSPolicy > CoordinateSystem
The normal coordinate system type.
void CreatePrimitivesUMD()
G4Tubs * umd_fiber_clad2_solid_large
static double fPmtRmin_SPMT
double GetSandwichPanelThickness() const
G4PVPlacement * scin_casing_phys
G4Tubs * extra_clad2_solid
double fSolarPanelThickness
Detector description interface for MARTA Station-related data.
Exception for reporting variable out of valid range.
G4LogicalVolume * umd_fiber_clad1_log_large
static double fgInterfaceRmax
G4PVPlacement * umd_casing_phys_small
G4LogicalVolume * scin_roof_log
G4PVPlacement * umd_strip_phys_large
G4LogicalVolume * umd_side_coat_log_large
G4Material * ExtrudedPolystyreneFoam
unsigned int GetNBars() const
Actual muon-sensitive objects.
const sdet::Station & GetDetectorStation() const
void CreateScintillator()
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
class that handles PMT hits
static double fgTankThickness
std::vector< double > GetRPCHousingInnerDimensions() const
Size of the RPC aluminum housing.
G4SubtractionSolid * pmt_solid
G4ThreeVector fTankSupportCentralFootDimensions
Class representing a document branch.
std::vector< double > GetTankSupportOuterFootDimensions() const
G4ThreeVector Convert(const utl::Point p, const utl::CoordinateSystemPtr cs)
G4LogicalVolume * spacer_log
G4PVPlacement * umd_bot_coat_phys_small
G4PVPlacement * umd_fiber_clad2_phys_small
G4PVPlacement * umd_casing_phys_large
G4LogicalVolume * glass_log
ArrayConstReference XFront() const
read-only reference to front of array of X
G4PVPlacement * umd_side2_coat_phys_large
double GetHousingThickness() const
G4LogicalVolume * umd_back_side_coat_log
double GetX(const CoordinateSystemPtr &coordinateSystem) const
class that handles hits to scintillator bars
G4LogicalVolume * al_box_log
utl::TabulatedFunction fPmtfaceRINDEX
G4Box * umd_back_side_coat_solid
G4PVPlacement * umd_fiber_clad1_phys_large
unsigned int fNScintillatorBars
int GetNumberRPCChambers() const
Number of RPC Chambers.
G4Tubs * umd_fiber_clad1_solid_small
void SetDetectorParameters()
G4Tubs * extra_clad1_solid
G4Material * ScintCoating
std::vector< double > GetTankSupportCentralFootDimensions() const
G4LogicalVolume * scin_styro_log
G4SubtractionSolid * interface_solid
G4Material * fG4_Bakelite
G4PVPlacement * scin_roof_phys
double GetRPCSizeY() const
G4SubtractionSolid * s_pmt_solid1
G4LogicalVolume * umd_fiber_clad2_log_small
double GetBarLength() const
utl::TabulatedFunction fPmtfaceABSORPTION
G4Tubs * umd_fiber_core_solid_large
double fScintillatorBarThickness
G4PVPlacement * extra_fiber_phy
Auger Software Run Control.
V & VisitShape(V &v) const
Callback method for inspecting shape-aware properties.
G4ThreeVector fAlBoxInnerDimensions
G4StationSimulator & fG4StationSimulator
G4LogicalVolume * umd_casing_log_large
double fScintillatorRoofOffset
G4LogicalVolume * scin_log
ArrayConstReference YFront() const
read-only reference to front of array of Y
double fTankSupportOuterFootDistanceToCenter
G4MaterialPropertiesTable * interfaceMPT
double fScintillatorRoofThickness
G4Box * umd_casing_solid_small
utl::TabulatedFunction fLinerTYVEK_RINDEX
#define WARNING(message)
Macro for logging warning messages.
void CreateSodaLimeGlass()
G4SubtractionSolid * AlBox_solid
void GetData(bool &b) const
Overloads of the GetData member template function.
static double fInterfaceRadius_SPMT
G4ThreeVector fScintillatorPosition
double GetShortestFiber() const
G4ThreeVector fTankSupportCentralFootBaseDimensions
static double fGlassThickness_SPMT
G4OpticalSurface * fUMDScintSkinSurf
G4LogicalVolume * expHall_log
G4Box * umd_side_coat_solid_small
static double fgSIGMA_ALPHA
G4LogicalVolume * umd_strip_log_large
Root detector of the muon detector hierarchy.
G4LogicalBorderSurface * topsurface
V & VisitShape(V &v) const
Callback method to query shape specific properties.
std::vector< double > GetRPCHousingThickness() const
Thickness of walls of the RPC aluminum housing.
G4PVPlacement * umd_back_side_coat_phys
G4PVPlacement * umd_fiber_core_phys_small
G4PVPlacement * umd_side2_coat_phys_small
void AssembleTankSupport()
double fScintillatorHousingThickness
G4MaterialPropertiesTable * pmtdomeMPT
G4Tubs * umd_fiber_clad2_solid_small
static utl::TabulatedFunction fgLinerBACKSCATTERCONSTANT
G4OpticalSurface * fUMDScintSkinSurfBack
G4PVPlacement * scin_styro_phys
G4OpticalSurface * OpLinerSurface
std::vector< double > GetTankSupportCentralFootBaseDimensions() const
G4LogicalVolume * umd_strip_log_small
double GetTankSupportOuterFootDistanceToCenter() const
double GetY(const CoordinateSystemPtr &coordinateSystem) const
G4ThreeVector fTankSupportOuterFootBaseDimensions
static utl::TabulatedFunction fgPmtdomeRINDEX
double fInterfaceThickness
G4MaterialPropertiesTable * pmtfaceMPT
static double fgDomeRzmax
double GetCasingThickness() const
ScintillatorConstIterator ScintillatorsEnd() const
End iterator over the contained scintillators.
void Scale(T &v, const double factor)
G4Box * scin_casing_solid
static double fPmtRmax_SPMT
ArrayIterator XBegin()
begin of array of X
static utl::TabulatedFunction fgLinerREFLECTIVITY
class that handles Geant4 SD Station simulation adopted from G4TankSimulator
const utl::Point & GetRPCPosition(const unsigned int id) const
RPC position.
G4Ellipsoid * interface_in_aux
double GetBarWidth() const
utl::Point GetPosition() const
G4LogicalVolume * extra_fiber_log
G4LogicalVolume * solarPanel_log
G4NistManager * fNistManager
G4SubtractionSolid * dome_solid
double GetBarThickness() const
string Red(const string &str)
G4PVPlacement * umd_bot_coat_phys_large
ModuleConstIterator ModulesBegin() const
Begin iterator for the Modules contained in the Counter.
G4Box * umd_casing_solid_large
G4ThreeVector fTankSupportOuterFootDimensions
double fScintillatorCasingThickness
Detector description interface for SDetector-related data.
AreaKind
Kind of module based on its area.
void SetRequiredParameters()
G4PVPlacement * umd_top_coat_phys_small
double GetRPCRotation(const unsigned int id) const
RPC rotation around its Z axis (axis perpendicular to RPC plane.
double GetHousingLength() const
static utl::TabulatedFunction fgLinerSPECULARSPIKECONSTANT
double GetRoofThickness() const
G4PVPlacement * ground_phys
static double fInterfaceThickness_SPMT
Main configuration utility.
G4SubtractionSolid * pmt_solid1
void SetScintPropertyTable()
void AddProperty(Material *const m, const char *const name, const TabulatedFunction &f)
G4LogicalBorderSurface * sidesurface
G4MaterialPropertiesTable * waterMPT
static G4ThreeVector fgTankCenter
G4PVPlacement * umd_fiber_clad1_phys_small
G4Tubs * umd_fiber_core_solid_small
int GetId() const
The id of this component.
void CreatePrimitivesMARTA()
G4LogicalVolume * umd_fiber_clad1_log_small
static double fDomeRadius_SPMT
G4LogicalVolume * rpc_log
G4LogicalVolume * umd_casing_log_small
double fScintillatorHousingLength
G4PVPlacement * umd_fiber_core_phys_large
G4Tubs * extra_fiber_solid
G4Material * fSoda_lime_glass
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
utl::TabulatedFunction fLinerABSORPTION
Optical mdet::Fiber used to conect mdet::Scintillator to mdet::Pixel.
G4Ellipsoid * dome_in_aux
double mod(const double d, const double periode)
static double fgInterfaceRzmax
G4PVPlacement * umd_fiber_clad2_phys_large
static utl::TabulatedFunction fgInterfaceRINDEX
const Counter & GetCounter(int id) const
Retrieve Counter by id.
utl::TabulatedFunction fWaterRINDEX
int GetId() const
Station ID.
std::map< mdet::Module::AreaKind, double > fModAreaLenghts
#define ERROR(message)
Macro for logging error messages.
void GetDataForThisTank()
double fScintillatorBarWidth
G4ThreeVector fTankSupportTopSlabDimensions
G4PVPlacement * solarPanel_phys
static utl::TabulatedFunction fgPmtdomeABSORPTION
G4LogicalVolume * extra_clad2_log
G4Tubs * umd_fiber_clad1_solid_large
G4LogicalVolume * pixel_log
G4LogicalBorderSurface * bottomsurface
std::vector< G4double > fRPCRotations
G4Tubs * s_interface_solid
G4PVPlacement * expHall_phys
G4PVPlacement * umd_top_coat_phys_large
utl::Branch GetTopBranch(const std::string &id)
Get top branch for moduleConfigLink with given id (XML files)
G4Ellipsoid * dome_out_aux
G4PVPlacement * side_phys
std::vector< double > GetTankSupportTopSlabDimensions() const
void CreateExtrudedPolystyreneFoam()
double fScintillatorBarLength
static utl::TabulatedFunction fgInterfaceABSORPTION
G4ThreeVector fPMTPosition
static const G4Colour blue(0.0, 0.0, 1.0)
G4VPhysicalVolume * CreateTank()
G4Box * umd_side_coat_solid_large
G4MaterialPropertiesTable * airMPT
G4MaterialPropertiesTable * pmtfaceMPT1
double GetOnManifoldLength() const
The length of the fiber along the path that joins the scintillator to its pixel on the PMT...
double fScintillatorHousingWidth
G4LogicalVolume * umd_top_bot_coat_log_large
G4PVPlacement * scin_phys2
void SetMARTAParameters()