File indexing completed on 2025-12-16 09:24:03
0001 #ifndef MACRO_G4PLUGDOOR_C
0002 #define MACRO_G4PLUGDOOR_C
0003
0004 #include <GlobalVariables.C>
0005
0006 #include <g4detectors/PHG4CylinderSubsystem.h>
0007
0008 #include <g4main/PHG4Reco.h>
0009
0010 #include <TSystem.h>
0011
0012 R__LOAD_LIBRARY(libg4detectors.so)
0013
0014 void common_color(PHG4CylinderSubsystem *subsys);
0015
0016 namespace Enable
0017 {
0018 bool PLUGDOOR = false;
0019 bool PLUGDOOR_ABSORBER = false;
0020 bool PLUGDOOR_OVERLAPCHECK = false;
0021 bool PLUGDOOR_BLACKHOLE = false;
0022
0023 bool BEAMPIPE_ABSORBER = false;
0024 bool BEAMPIPE_ABSORBER_ACTIVE = false;
0025 bool BEAMPIPE_ABSORBER_OVERLAPCHECK = false;
0026 bool BEAMPIPE_ABSORBER_BLACKHOLE = false;
0027 }
0028
0029 namespace G4PLUGDOOR
0030 {
0031
0032
0033 double z_1 = 330.81;
0034 double z_2 = 360.81;
0035 double r_1 = (12. / 2.) * 2.54;
0036 double r_2 = 263.5;
0037
0038 double length = z_2 - z_1;
0039 double place_z = (z_1 + z_2) / 2.;
0040 double thickness = 2.;
0041 }
0042
0043 namespace G4ABSORBER
0044 {
0045
0046
0047 double l_1 = 7.62;
0048 double l_2 = 20.64;
0049 double l_3 = 10.16;
0050 double l_4 = 25.40;
0051 double z_1 = 330.84 - l_1;
0052 double z_2 = z_1 + l_1;
0053 double z_3 = z_2 + l_2;
0054 double z_4 = z_3 + l_3;
0055 double r_in = 6.34;
0056 double r_out_1 = 55.8 / 2.;
0057 double r_out_2 = 27.93 / 2.;
0058 double r_out_3 = r_out_1;
0059 double r_out_4 = 35.55 / 2.;
0060 }
0061
0062 void PlugDoorInit()
0063 {
0064 BlackHoleGeometry::max_radius = std::max(BlackHoleGeometry::max_radius, G4PLUGDOOR::r_2);
0065 BlackHoleGeometry::max_z = std::max(BlackHoleGeometry::max_z, G4PLUGDOOR::place_z + G4PLUGDOOR::length / 2.);
0066 BlackHoleGeometry::min_z = std::min(BlackHoleGeometry::min_z, -(G4PLUGDOOR::place_z + G4PLUGDOOR::length / 2.));
0067 if (Enable::PLUGDOOR_BLACKHOLE)
0068 {
0069 if (G4PLUGDOOR::thickness >= G4PLUGDOOR::z_2 - G4PLUGDOOR::z_1)
0070 {
0071 std::cout << "G4_PlugDoor::PlugDoorInit(): thickness " << G4PLUGDOOR::thickness
0072 << " exceeds door thickness " << G4PLUGDOOR::z_2 - G4PLUGDOOR::z_1
0073 << std::endl;
0074 gSystem->Exit(1);
0075 }
0076 }
0077 }
0078 void PlugDoor(PHG4Reco *g4Reco)
0079 {
0080 bool OverlapCheck = Enable::OVERLAPCHECK || Enable::PLUGDOOR_OVERLAPCHECK;
0081 bool flux_door_active = Enable::ABSORBER || Enable::PLUGDOOR_ABSORBER;
0082
0083 const std::string material("Steel_1006");
0084
0085 const std::string absorber_material("G4_STAINLESS-STEEL");
0086
0087 if (Enable::PLUGDOOR_BLACKHOLE)
0088 {
0089 double place_z_plate = G4PLUGDOOR::z_1 + G4PLUGDOOR::thickness / 2.;
0090 double place_z_cyl = (G4PLUGDOOR::z_1 + G4PLUGDOOR::z_2 + G4PLUGDOOR::thickness) / 2.;
0091 PHG4CylinderSubsystem *flux_return_plus = new PHG4CylinderSubsystem("FLUXRET_ETA_PLUS", 0);
0092 flux_return_plus->set_double_param("length", G4PLUGDOOR::thickness);
0093 flux_return_plus->set_double_param("radius", G4PLUGDOOR::r_1);
0094 flux_return_plus->set_double_param("place_z", place_z_plate);
0095 flux_return_plus->set_double_param("thickness", G4PLUGDOOR::r_2 - G4PLUGDOOR::r_1);
0096 flux_return_plus->set_string_param("material", material);
0097 flux_return_plus->SetActive(flux_door_active);
0098 flux_return_plus->SuperDetector("FLUXRET_ETA_PLUS");
0099 flux_return_plus->OverlapCheck(OverlapCheck);
0100 common_color(flux_return_plus);
0101 g4Reco->registerSubsystem(flux_return_plus);
0102
0103 flux_return_plus = new PHG4CylinderSubsystem("FLUXRET_ETA_PLUS", 1);
0104 flux_return_plus->set_double_param("length", G4PLUGDOOR::length - G4PLUGDOOR::thickness);
0105 flux_return_plus->set_double_param("radius", G4PLUGDOOR::r_1);
0106 flux_return_plus->set_double_param("place_z", place_z_cyl);
0107 flux_return_plus->set_double_param("thickness", G4PLUGDOOR::thickness);
0108 flux_return_plus->set_string_param("material", material);
0109 flux_return_plus->SetActive(flux_door_active);
0110 flux_return_plus->SuperDetector("FLUXRET_ETA_PLUS");
0111 flux_return_plus->OverlapCheck(OverlapCheck);
0112 common_color(flux_return_plus);
0113 g4Reco->registerSubsystem(flux_return_plus);
0114
0115
0116
0117 flux_return_plus = new PHG4CylinderSubsystem("FLUXRET_ETA_PLUS", 2);
0118 flux_return_plus->set_double_param("length", G4PLUGDOOR::length - G4PLUGDOOR::thickness);
0119 flux_return_plus->set_double_param("radius", G4PLUGDOOR::r_1 + G4PLUGDOOR::thickness);
0120 flux_return_plus->set_double_param("place_z", place_z_cyl);
0121 flux_return_plus->set_double_param("thickness", G4PLUGDOOR::r_2 - G4PLUGDOOR::r_1 - G4PLUGDOOR::thickness);
0122 flux_return_plus->set_string_param("material", material);
0123 flux_return_plus->SetActive(flux_door_active);
0124 flux_return_plus->SuperDetector("FLUXRET_ETA_PLUS");
0125 flux_return_plus->OverlapCheck(OverlapCheck);
0126 flux_return_plus->BlackHole();
0127 common_color(flux_return_plus);
0128 g4Reco->registerSubsystem(flux_return_plus);
0129
0130 PHG4CylinderSubsystem *flux_return_minus = new PHG4CylinderSubsystem("FLUXRET_ETA_MINUS", 0);
0131 flux_return_minus->set_double_param("length", G4PLUGDOOR::thickness);
0132 flux_return_minus->set_double_param("radius", G4PLUGDOOR::r_1);
0133 flux_return_minus->set_double_param("place_z", -place_z_plate);
0134 flux_return_minus->set_double_param("thickness", G4PLUGDOOR::r_2 - G4PLUGDOOR::r_1);
0135 flux_return_minus->set_string_param("material", material);
0136 flux_return_minus->SetActive(flux_door_active);
0137 flux_return_minus->SuperDetector("FLUXRET_ETA_MINUS");
0138 flux_return_minus->OverlapCheck(OverlapCheck);
0139 common_color(flux_return_minus);
0140 g4Reco->registerSubsystem(flux_return_minus);
0141
0142 flux_return_minus = new PHG4CylinderSubsystem("FLUXRET_ETA_MINUS", 1);
0143 flux_return_minus->set_double_param("length", G4PLUGDOOR::length - G4PLUGDOOR::thickness);
0144 flux_return_minus->set_double_param("radius", G4PLUGDOOR::r_1);
0145 flux_return_minus->set_double_param("place_z", -place_z_cyl);
0146 flux_return_minus->set_double_param("thickness", G4PLUGDOOR::thickness);
0147 flux_return_minus->set_string_param("material", material);
0148 flux_return_minus->SetActive(flux_door_active);
0149 flux_return_minus->SuperDetector("FLUXRET_ETA_MINUS");
0150 flux_return_minus->OverlapCheck(OverlapCheck);
0151 common_color(flux_return_minus);
0152 g4Reco->registerSubsystem(flux_return_minus);
0153
0154
0155
0156 flux_return_minus = new PHG4CylinderSubsystem("FLUXRET_ETA_MINUS", 2);
0157 flux_return_minus->set_double_param("length", G4PLUGDOOR::length - G4PLUGDOOR::thickness);
0158 flux_return_minus->set_double_param("radius", G4PLUGDOOR::r_1 + G4PLUGDOOR::thickness);
0159 flux_return_minus->set_double_param("place_z", -place_z_cyl);
0160 flux_return_minus->set_double_param("thickness", G4PLUGDOOR::r_2 - G4PLUGDOOR::r_1 - G4PLUGDOOR::thickness);
0161 flux_return_minus->set_string_param("material", material);
0162 flux_return_minus->SetActive(flux_door_active);
0163 flux_return_minus->SuperDetector("FLUXRET_ETA_MINUS");
0164 flux_return_minus->OverlapCheck(OverlapCheck);
0165 flux_return_minus->BlackHole();
0166 common_color(flux_return_minus);
0167 g4Reco->registerSubsystem(flux_return_minus);
0168 }
0169 else
0170 {
0171 PHG4CylinderSubsystem *flux_return_plus = new PHG4CylinderSubsystem("FLUXRET_ETA_PLUS", 3);
0172 flux_return_plus->set_double_param("length", G4PLUGDOOR::length);
0173 flux_return_plus->set_double_param("radius", G4PLUGDOOR::r_1);
0174 flux_return_plus->set_double_param("place_z", G4PLUGDOOR::place_z);
0175 flux_return_plus->set_double_param("thickness", G4PLUGDOOR::r_2 - G4PLUGDOOR::r_1);
0176 flux_return_plus->set_string_param("material", material);
0177 flux_return_plus->SetActive(flux_door_active);
0178 flux_return_plus->SuperDetector("FLUXRET_ETA_PLUS");
0179 flux_return_plus->OverlapCheck(OverlapCheck);
0180 common_color(flux_return_plus);
0181 g4Reco->registerSubsystem(flux_return_plus);
0182
0183 PHG4CylinderSubsystem *flux_return_minus = new PHG4CylinderSubsystem("FLUXRET_ETA_MINUS", 3);
0184 flux_return_minus->set_double_param("length", G4PLUGDOOR::length);
0185 flux_return_minus->set_double_param("radius", G4PLUGDOOR::r_1);
0186 flux_return_minus->set_double_param("place_z", -G4PLUGDOOR::place_z);
0187 flux_return_minus->set_double_param("thickness", G4PLUGDOOR::r_2 - G4PLUGDOOR::r_1);
0188 flux_return_minus->set_string_param("material", material);
0189 flux_return_minus->SetActive(flux_door_active);
0190 flux_return_minus->SuperDetector("FLUXRET_ETA_MINUS");
0191 flux_return_minus->OverlapCheck(OverlapCheck);
0192 common_color(flux_return_minus);
0193 g4Reco->registerSubsystem(flux_return_minus);
0194 }
0195
0196 if (Enable::BEAMPIPE_ABSORBER)
0197 {
0198 double lengths[] = {G4ABSORBER::l_1, G4ABSORBER::l_2, G4ABSORBER::l_3, G4ABSORBER::l_4};
0199 double z_positions[] = {G4ABSORBER::z_1, G4ABSORBER::z_2, G4ABSORBER::z_3, G4ABSORBER::z_4};
0200 double r_out_values[] = {G4ABSORBER::r_out_1, G4ABSORBER::r_out_2, G4ABSORBER::r_out_3, G4ABSORBER::r_out_4};
0201 double radius_in = G4ABSORBER::r_in;
0202 for (int i = 0; i < 4; ++i)
0203 {
0204 PHG4CylinderSubsystem *absorber = new PHG4CylinderSubsystem("BEAMPIPE_ABSORBER_PLUS", i);
0205 absorber->set_double_param("length", lengths[i]);
0206 absorber->set_double_param("radius", radius_in);
0207 absorber->set_double_param("place_z", z_positions[i] + lengths[i] / 2.);
0208 absorber->set_double_param("thickness", r_out_values[i] - radius_in);
0209 absorber->set_string_param("material", absorber_material);
0210 absorber->SetActive(Enable::BEAMPIPE_ABSORBER_ACTIVE);
0211 absorber->SuperDetector("BEAMPIPE_ABSORBER_PLUS");
0212 absorber->OverlapCheck(Enable::ABSORBER || Enable::BEAMPIPE_ABSORBER_OVERLAPCHECK);
0213 absorber->BlackHole(Enable::BEAMPIPE_ABSORBER_BLACKHOLE);
0214 common_color(absorber);
0215 g4Reco->registerSubsystem(absorber);
0216
0217 absorber = new PHG4CylinderSubsystem("BEAMPIPE_ABSORBER_MINUS", i);
0218 absorber->set_double_param("length", lengths[i]);
0219 absorber->set_double_param("radius", radius_in);
0220 absorber->set_double_param("place_z", -z_positions[i] - lengths[i] / 2.);
0221 absorber->set_double_param("thickness", r_out_values[i] - radius_in);
0222 absorber->set_string_param("material", absorber_material);
0223 absorber->SetActive(Enable::ABSORBER || Enable::BEAMPIPE_ABSORBER_ACTIVE);
0224 absorber->SuperDetector("BEAMPIPE_ABSORBER_MINUS");
0225 absorber->OverlapCheck(Enable::BEAMPIPE_ABSORBER_OVERLAPCHECK);
0226 absorber->BlackHole(Enable::BEAMPIPE_ABSORBER_BLACKHOLE);
0227 common_color(absorber);
0228 g4Reco->registerSubsystem(absorber);
0229 }
0230 BlackHoleGeometry::max_z = std::max(BlackHoleGeometry::max_z, G4ABSORBER::z_4 + G4ABSORBER::l_4);
0231 BlackHoleGeometry::min_z = std::min(BlackHoleGeometry::min_z, -(G4ABSORBER::z_4 + G4ABSORBER::l_4));
0232 }
0233
0234 return;
0235 }
0236
0237 void common_color(PHG4CylinderSubsystem *subsys)
0238 {
0239 subsys->set_color(0.29, 0.44, 0.54);
0240 }
0241 #endif