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