File indexing completed on 2025-08-05 08:18:06
0001 #include "PHG4InttSubsystem.h"
0002 #include "PHG4InttDefs.h"
0003 #include "PHG4InttDetector.h"
0004 #include "PHG4InttDisplayAction.h"
0005 #include "PHG4InttSteppingAction.h"
0006
0007 #include <g4detectors/PHG4DetectorGroupSubsystem.h> // for PHG4DetectorGrou...
0008 #include <phparameter/PHParameters.h>
0009 #include <phparameter/PHParametersContainer.h>
0010
0011 #include <g4main/PHG4DisplayAction.h> // for PHG4DisplayAction
0012 #include <g4main/PHG4HitContainer.h>
0013 #include <g4main/PHG4SteppingAction.h> // for PHG4SteppingAction
0014
0015 #include <phool/PHCompositeNode.h>
0016 #include <phool/PHIODataNode.h> // for PHIODataNode
0017 #include <phool/PHNode.h> // for PHNode
0018 #include <phool/PHNodeIterator.h> // for PHNodeIterator
0019 #include <phool/PHObject.h> // for PHObject
0020 #include <phool/getClass.h>
0021
0022 #include <iostream> // for operator<<, basi...
0023 #include <set> // for _Rb_tree_const_i...
0024 #include <type_traits> // for __decay_and_stri...
0025
0026 class PHG4Detector;
0027
0028
0029 PHG4InttSubsystem::PHG4InttSubsystem(const std::string &detectorname, const vpair &layerconfig)
0030 : PHG4DetectorGroupSubsystem(detectorname)
0031 , m_LayerConfigVector(layerconfig)
0032 , m_DetectorType(detectorname)
0033 {
0034 for (const auto &piter : layerconfig)
0035 {
0036 AddDetId(piter.second);
0037 }
0038
0039 InitializeParameters();
0040
0041
0042 Name(detectorname);
0043 SuperDetector(detectorname);
0044 }
0045
0046 PHG4InttSubsystem::~PHG4InttSubsystem()
0047 {
0048 delete m_DisplayAction;
0049 }
0050
0051
0052 int PHG4InttSubsystem::InitRunSubsystem(PHCompositeNode *topNode)
0053 {
0054 if (Verbosity() > 0)
0055 {
0056 std::cout << "PHG4InttSubsystem::Init started" << std::endl;
0057 }
0058
0059 PHNodeIterator iter(topNode);
0060 PHCompositeNode *dstNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "DST"));
0061
0062
0063 m_DisplayAction = new PHG4InttDisplayAction(Name());
0064
0065 std::pair<std::vector<std::pair<int, int>>::const_iterator, std::vector<std::pair<int, int>>::const_iterator> layer_begin_end = std::make_pair(m_LayerConfigVector.begin(), m_LayerConfigVector.end());
0066 m_Detector = new PHG4InttDetector(this, topNode, GetParamsContainer(), Name(), layer_begin_end);
0067 m_Detector->Verbosity(Verbosity());
0068 m_Detector->SuperDetector(SuperDetector());
0069 m_Detector->Detector(m_DetectorType);
0070 m_Detector->OverlapCheck(CheckOverlap());
0071 m_Detector->useSurveyGeometry(m_UseSurveyGeometry);
0072
0073 int active = 0;
0074
0075 int absorberactive = GetParamsContainer()->GetParameters(PHG4InttDefs::SUPPORTPARAMS)->get_int_param("supportactive");
0076 int blackhole = 0;
0077 for (std::set<int>::const_iterator parcontaineriter = GetDetIds().first; parcontaineriter != GetDetIds().second; ++parcontaineriter)
0078 {
0079 if (active || GetParamsContainer()->GetParameters(*parcontaineriter)->get_int_param("active"))
0080 {
0081 active = 1;
0082 }
0083 if (absorberactive || GetParamsContainer()->GetParameters(*parcontaineriter)->get_int_param("absorberactive") || GetParamsContainer()->GetParameters(*parcontaineriter)->get_int_param("supportactive"))
0084 {
0085 absorberactive = 1;
0086 }
0087 if (blackhole || GetParamsContainer()->GetParameters(*parcontaineriter)->get_int_param("blackhole"))
0088 {
0089 blackhole = 1;
0090 }
0091 }
0092 std::set<std::string> nodes;
0093 if (active)
0094 {
0095 PHNodeIterator dstIter(dstNode);
0096 PHCompositeNode *DetNode = dstNode;
0097 if (SuperDetector() != "NONE" && !SuperDetector().empty())
0098 {
0099 PHNodeIterator iter_dst(dstNode);
0100 DetNode = dynamic_cast<PHCompositeNode *>(iter_dst.findFirst("PHCompositeNode", SuperDetector()));
0101 if (!DetNode)
0102 {
0103 DetNode = new PHCompositeNode(SuperDetector());
0104 dstNode->addNode(DetNode);
0105 }
0106 }
0107
0108 std::string detector_suffix = SuperDetector();
0109 if (detector_suffix == "NONE" || detector_suffix.empty())
0110 {
0111 detector_suffix = Name();
0112 }
0113 m_HitNodeName = "G4HIT_" + detector_suffix;
0114 nodes.insert(m_HitNodeName);
0115 m_AbsorberNodeName = "G4HIT_ABSORBER_" + detector_suffix;
0116 if (absorberactive)
0117 {
0118 nodes.insert(m_AbsorberNodeName);
0119 }
0120 for (const auto &nodename : nodes)
0121 {
0122 PHG4HitContainer *g4_hits = findNode::getClass<PHG4HitContainer>(topNode, nodename);
0123 if (!g4_hits)
0124 {
0125 g4_hits = new PHG4HitContainer(nodename);
0126 DetNode->addNode(new PHIODataNode<PHObject>(g4_hits, nodename, "PHObject"));
0127 }
0128 }
0129
0130 m_SteppingAction = new PHG4InttSteppingAction(m_Detector, GetParamsContainer(), layer_begin_end);
0131 m_SteppingAction->Verbosity(Verbosity());
0132 m_SteppingAction->SetHitNodeName("G4HIT", m_HitNodeName);
0133 m_SteppingAction->SetHitNodeName("G4HIT_ABSORBER", m_AbsorberNodeName);
0134 }
0135 else
0136 {
0137 if (blackhole)
0138 {
0139 m_SteppingAction = new PHG4InttSteppingAction(m_Detector, GetParamsContainer(), layer_begin_end);
0140 }
0141 }
0142
0143 return 0;
0144 }
0145
0146
0147 int PHG4InttSubsystem::process_event(PHCompositeNode *topNode)
0148 {
0149
0150
0151 if (m_SteppingAction)
0152 {
0153 m_SteppingAction->SetInterfacePointers(topNode);
0154 }
0155
0156 return 0;
0157 }
0158
0159
0160 PHG4Detector *PHG4InttSubsystem::GetDetector() const
0161 {
0162 return m_Detector;
0163 }
0164
0165 void PHG4InttSubsystem::SetDefaultParameters()
0166 {
0167 int laddertype[4] = {PHG4InttDefs::SEGMENTATION_PHI,
0168 PHG4InttDefs::SEGMENTATION_PHI,
0169 PHG4InttDefs::SEGMENTATION_PHI,
0170 PHG4InttDefs::SEGMENTATION_PHI};
0171
0172 int nladder[4] = {12, 12, 16, 16};
0173 double sensor_radius[4] = {7.188 - 36e-4, 7.732 - 36e-4, 9.680 - 36e-4, 10.262 - 36e-4};
0174 double offsetphi[4] = {-0.5 * 360.0 / nladder[0], 0.0, -0.5 * 360.0 / nladder[2], 0.0};
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204 auto detid = GetDetIds();
0205 for (auto detiter = detid.first; detiter != detid.second; ++detiter)
0206 {
0207 set_default_int_param(*detiter, "active", 1);
0208
0209
0210 set_default_int_param(*detiter, "laddertype", laddertype[*detiter]);
0211 set_default_int_param(*detiter, "nladder", nladder[*detiter]);
0212 set_default_double_param(*detiter, "sensor_radius", sensor_radius[*detiter]);
0213
0214
0215 set_default_double_param(*detiter, "offsetphi", offsetphi[*detiter]);
0216 set_default_double_param(*detiter, "offsetrot", 0.);
0217
0218
0219 }
0220
0221
0222
0223
0224 set_default_int_param(PHG4InttDefs::SEGMENTATION_Z, "nstrips_phi_cell", 1);
0225 set_default_int_param(PHG4InttDefs::SEGMENTATION_Z, "nstrips_phi_sensor", 1);
0226 set_default_int_param(PHG4InttDefs::SEGMENTATION_Z, "nstrips_z_sensor_0", 128 * 5);
0227 set_default_int_param(PHG4InttDefs::SEGMENTATION_Z, "nstrips_z_sensor_1", 128 * 5);
0228
0229
0230 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "fphx_x", 0.032);
0231 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "fphx_y", 0.27);
0232 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "fphx_z", 0.91);
0233 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "fphx_offset_z", 0.005);
0234 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "gap_sensor_fphx", 0.1);
0235 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "halfladder_z", 40.00);
0236 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "halfladder_inside_z", 23.28);
0237 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "hdi_copper_x", 0.0052);
0238 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "hdi_edge_z", 0.);
0239 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "hdi_kapton_x", 0.038);
0240 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "hdi_y", 2.55);
0241 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "pgs_x", 0.02);
0242 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "sensor_edge_phi", 0.13);
0243 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "sensor_edge_z", 0.1);
0244 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "sensor_offset_y", 0.304);
0245 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "strip_x", 0.032);
0246 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "strip_y", 1.6);
0247 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "strip_z_0", 0.01406);
0248 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "strip_z_1", 0.01406);
0249 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "stave_straight_cooler_x", 0.01905);
0250 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "stave_straight_cooler_y", 0.47);
0251 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "stave_slant_cooler_y", 1.4362);
0252 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "stave_straight_outer_y", 0.672);
0253 set_default_double_param(PHG4InttDefs::SEGMENTATION_Z, "stave_straight_rohacell_y", 0.57181);
0254
0255
0256
0257 set_default_int_param(PHG4InttDefs::SEGMENTATION_PHI, "nstrips_phi_cell", 256);
0258 set_default_int_param(PHG4InttDefs::SEGMENTATION_PHI, "nstrips_phi_sensor", 256);
0259 set_default_int_param(PHG4InttDefs::SEGMENTATION_PHI, "nstrips_z_sensor_0", 8);
0260 set_default_int_param(PHG4InttDefs::SEGMENTATION_PHI, "nstrips_z_sensor_1", 5);
0261
0262
0263 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "fphx_x", 0.032);
0264 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "fphx_y", 0.27);
0265 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "fphx_z", 0.91);
0266 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "fphx_offset_z", 0.005);
0267 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "gap_sensor_fphx", 0.1);
0268
0269 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "si_glue_x", 0.0014);
0270 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "fphx_glue_x", 0.005);
0271
0272 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "halfladder_z", 40.00);
0273 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "halfladder_inside_z", 23.28);
0274
0275 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "hdi_copper_x", 0.00376);
0276 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "hdi_edge_z", 0.);
0277 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "hdi_kapton_x", 0.038);
0278 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "hdi_y", 3.8);
0279
0280 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "sensor_edge_phi", 0.13);
0281 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "sensor_edge_z", 0.1);
0282 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "sensor_offset_y", 0.);
0283 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "strip_x", 0.032);
0284 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "strip_y", 0.0078);
0285 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "strip_z_0", 1.6);
0286 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "strip_z_1", 2.);
0287
0288 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "stave_straight_cooler_x", 0.03);
0289 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "stave_straight_cooler_y", 1.47684);
0290
0291 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "stave_slant_cooler_y", 0.6322614829);
0292
0293 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "stave_straight_outer_y", 0.33227);
0294 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "stave_straight_rohacell_y", 0.58842);
0295
0296
0297 set_default_double_param(PHG4InttDefs::SEGMENTATION_PHI, "ladder_center_avgshift_z", -4.724503928571429 / 10.);
0298
0299
0300
0301 set_default_int_param(PHG4InttDefs::SUPPORTPARAMS, "supportactive", 0);
0302
0303
0304
0305
0306
0307 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "inner_skin_inner_radius", 12.9667 / 2);
0308 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "inner_skin_outer_radius", 13.0175 / 2);
0309 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "inner_skin_length", 49.7);
0310
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "outer_skin_inner_radius", 23.4950 / 2);
0324 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "outer_skin_outer_radius", 23.5458 / 2);
0325 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "outer_skin_length", 49.7);
0326
0327
0328 set_default_int_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_ring_enabled", 1);
0329 set_default_int_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_ring_type", 2);
0330
0331
0332 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_ring_x", 0.4026857142857132 / 10.);
0333 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_ring_y", -2.886627321428573 / 10.);
0334 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_ring_z", 24.35);
0335
0336
0337 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_Alring_inner_radius", 6.267);
0338 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_Alring_outer_radius", 12.0444);
0339 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_Alring_length", 0.3645);
0340
0341
0342 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_SSring_inner_radius", 6.267);
0343 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_SSring_outer_radius", 12.0444);
0344 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_SSring_length", 0.0047);
0345
0346
0347 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_WGring_inner_radius", 6.267);
0348 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_WGring_outer_radius", 12.0444);
0349 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_WGring_length", 0.0186);
0350
0351
0352 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_CPring_z", 24.4185);
0353
0354
0355 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_CPring_inner_radius", 6.6675);
0356 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_CPring_outer_radius", 11.43);
0357 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_CPring_length", 0.6370);
0358
0359
0360
0361 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Alring_z", 24.4185);
0362
0363 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Alring_1_outer_radius", 11.7375);
0364 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Alring_1_inner_radius", 11.0683);
0365 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Cring_1_outer_radius", 10.6826);
0366 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Cring_1_inner_radius", 10.0984);
0367 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Alring_2_outer_radius", 9.7227);
0368 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Alring_2_inner_radius", 8.5485);
0369 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Cring_2_outer_radius", 8.1852);
0370 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Cring_2_inner_radius", 7.6518);
0371 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Alring_3_outer_radius", 7.2886);
0372 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Alring_3_inner_radius", 6.5188);
0373
0374 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Alring_length", 0.625 / 2.);
0375 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "endcap_AlPEEK_Cring_length", 0.75);
0376
0377
0378
0379 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "service_barrel_outer_inner_radius", 33.02 / 2);
0380 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "service_barrel_outer_outer_radius", 33.34 / 2);
0381 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "service_barrel_outer_length", 273.69);
0382
0383
0384
0385 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "support_tube_inner_radius", 37.47 / 2);
0386 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "support_tube_outer_radius", 38.10 / 2);
0387 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "support_tube_length", 273.69);
0388
0389
0390 set_default_int_param(PHG4InttDefs::SUPPORTPARAMS, "bus_extender", 1);
0391 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "bus_extender_length", 111.0);
0392 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "bus_extender_ends_at", 328.5);
0393 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "bus_extender_radius", 15.0);
0394 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "bus_extender_copper_x", 48.0e-4 * 1.5);
0395 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "bus_extender_kapton_x", 300.0e-4 * 1.5);
0396
0397 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "rail_dphi", 90.);
0398 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "rail_inner_radius", 0.45);
0399 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "rail_length", 410);
0400
0401 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "rail_outer_radius", 0.6);
0402 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "rail_phi_start", 45.);
0403
0404 set_default_double_param(PHG4InttDefs::SUPPORTPARAMS, "rail_radius", (33.34 + 0.6 * 2) / 2);
0405
0406 return;
0407 }
0408
0409 void PHG4InttSubsystem::Print(const std::string & ) const
0410 {
0411 PrintDefaultParams();
0412 std::cout << std::endl
0413 << "------" << std::endl;
0414 PrintMacroParams();
0415 std::cout << std::endl
0416 << "------" << std::endl
0417 << std::endl;
0418 GetParamsContainer()->Print();
0419 }