Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:19:31

0001 #include "PHG4TpcEndCapSubsystem.h"
0002 
0003 #include "PHG4TpcEndCapDetector.h"
0004 #include "PHG4TpcEndCapDisplayAction.h"
0005 #include "PHG4TpcEndCapSteppingAction.h"
0006 
0007 #include <phparameter/PHParameters.h>
0008 
0009 #include <g4detectors/PHG4DetectorSubsystem.h>  // for PHG4DetectorSubsystem
0010 
0011 #include <g4main/PHG4DisplayAction.h>  // for PHG4DisplayAction
0012 #include <g4main/PHG4HitContainer.h>
0013 #include <g4main/PHG4SteppingAction.h>
0014 
0015 #include <phool/PHCompositeNode.h>
0016 #include <phool/PHIODataNode.h>
0017 #include <phool/PHNode.h>
0018 #include <phool/PHNodeIterator.h>
0019 #include <phool/PHObject.h>
0020 #include <phool/getClass.h>
0021 
0022 //_______________________________________________________________________
0023 PHG4TpcEndCapSubsystem::PHG4TpcEndCapSubsystem(const std::string &name)
0024   : PHG4DetectorSubsystem(name)
0025 {
0026   // call base class method which will set up parameter infrastructure
0027   // and call our SetDefaultParameters() method
0028   InitializeParameters();
0029 }
0030 
0031 PHG4TpcEndCapSubsystem::~PHG4TpcEndCapSubsystem()
0032 {
0033   delete m_DisplayAction;
0034 }
0035 
0036 //_______________________________________________________________________
0037 int PHG4TpcEndCapSubsystem::InitRunSubsystem(PHCompositeNode *topNode)
0038 {
0039   PHNodeIterator iter(topNode);
0040   PHCompositeNode *dstNode = dynamic_cast<PHCompositeNode *>(iter.findFirst("PHCompositeNode", "DST"));
0041 
0042   // create display settings before detector (detector adds its volumes to it)
0043   m_DisplayAction = new PHG4TpcEndCapDisplayAction(Name());
0044 
0045   // create detector
0046   m_Detector = new PHG4TpcEndCapDetector(this, topNode, GetParams(), Name());
0047   m_Detector->SuperDetector(SuperDetector());
0048   m_Detector->OverlapCheck(CheckOverlap());
0049   m_Detector->Verbosity(Verbosity());
0050 
0051   if (GetParams()->get_int_param("active"))
0052   {
0053     PHNodeIterator dstIter(dstNode);
0054     PHCompositeNode *DetNode = dstNode;
0055     if (SuperDetector() != "NONE" && !SuperDetector().empty())
0056     {
0057       PHNodeIterator iter_dst(dstNode);
0058       DetNode = dynamic_cast<PHCompositeNode *>(iter_dst.findFirst("PHCompositeNode", SuperDetector()));
0059 
0060       if (!DetNode)
0061       {
0062         DetNode = new PHCompositeNode(SuperDetector());
0063         dstNode->addNode(DetNode);
0064       }
0065     }
0066     std::string detector_suffix = SuperDetector();
0067     if (detector_suffix == "NONE" || detector_suffix.empty())
0068     {
0069       detector_suffix = Name();
0070     }
0071     m_HitNodeName = "G4HIT_" + detector_suffix;
0072     PHG4HitContainer *g4_hits = findNode::getClass<PHG4HitContainer>(DetNode, m_HitNodeName);
0073     if (!g4_hits)
0074     {
0075       g4_hits = new PHG4HitContainer(m_HitNodeName);
0076       DetNode->addNode(new PHIODataNode<PHObject>(g4_hits, m_HitNodeName, "PHObject"));
0077     }
0078   }
0079   // create stepping action if detector is active
0080   if (GetParams()->get_int_param("active"))
0081   {
0082     m_SteppingAction = new PHG4TpcEndCapSteppingAction(m_Detector, GetParams());
0083     m_SteppingAction->SetHitNodeName("G4HIT", m_HitNodeName);
0084   }
0085   return 0;
0086 }
0087 //_______________________________________________________________________
0088 int PHG4TpcEndCapSubsystem::process_event(PHCompositeNode *topNode)
0089 {
0090   // pass top node to stepping action so that it gets
0091   // relevant nodes needed internally
0092   if (m_SteppingAction)
0093   {
0094     m_SteppingAction->SetInterfacePointers(topNode);
0095   }
0096   return 0;
0097 }
0098 //_______________________________________________________________________
0099 void PHG4TpcEndCapSubsystem::Print(const std::string &what) const
0100 {
0101   if (m_Detector)
0102   {
0103     m_Detector->Print(what);
0104   }
0105   return;
0106 }
0107 
0108 //_______________________________________________________________________
0109 PHG4Detector *PHG4TpcEndCapSubsystem::GetDetector() const
0110 {
0111   return m_Detector;
0112 }
0113 
0114 //_______________________________________________________________________
0115 void PHG4TpcEndCapSubsystem::SetDefaultParameters()
0116 {
0117   set_default_int_param("construction_verbosity", 0);
0118   // sizes are in cm
0119   // angles are in deg
0120   // units should be converted to G4 units when used
0121   // implement your own here//
0122   set_default_double_param("place_x", 0.);
0123   set_default_double_param("place_y", 0.);
0124   set_default_double_param("place_z", 0.);
0125   set_default_double_param("rot_x", 0.);
0126   set_default_double_param("rot_y", 0.);
0127   set_default_double_param("rot_z", 0.);
0128 
0129   set_default_double_param("envelop_r_min", 20.);
0130   set_default_double_param("envelop_r_max", 76.27);
0131   set_default_double_param("envelop_front_surface_z", 211. / 2.);
0132 
0133   set_default_int_param("n_GEM_layers", 4);
0134 
0135   const double inch_to_cm = 2.54;
0136 
0137   set_default_int_param("n_sectors", 12);
0138   set_default_int_param("n_radial_modules", 3);
0139 
0140   set_default_string_param("wagon_wheel_material", "G4_Al");
0141 
0142   set_default_double_param("wagon_wheel_sector_phi_offset_degree", 360. / 12. / 2.);
0143 
0144   set_default_double_param("wagon_wheel_front_frame_thickness", inch_to_cm * .38);
0145   set_default_double_param("wagon_wheel_front_frame_spoke_width", inch_to_cm * 1.12);
0146 
0147   set_default_double_param("wagon_wheel_front_frame_R_inner", inch_to_cm * 15.74 / 2.);
0148   set_default_double_param("wagon_wheel_front_frame_R_outer", inch_to_cm * 30.7);
0149 
0150   set_default_double_param("wagon_wheel_front_frame_R_R1_inner", inch_to_cm * 9.81);
0151   set_default_double_param("wagon_wheel_front_frame_R_R1_outer", inch_to_cm * 15.47);
0152 
0153   set_default_double_param("wagon_wheel_front_frame_R_R2_inner", inch_to_cm * 16.59);
0154   set_default_double_param("wagon_wheel_front_frame_R_R2_outer", inch_to_cm * 22.24);
0155 
0156   set_default_double_param("wagon_wheel_front_frame_R_R3_inner", inch_to_cm * 23.36);
0157   set_default_double_param("wagon_wheel_front_frame_R_R3_outer", inch_to_cm * 29.02);
0158 
0159   set_default_double_param("wagon_wheel_rim_outer_Rin", inch_to_cm * 29.58);
0160   set_default_double_param("wagon_wheel_rim_outer_Rout", inch_to_cm * 60.49 / 2.);
0161   set_default_double_param("wagon_wheel_rim_outer_thickness", inch_to_cm * (4.5 - .38));
0162 
0163   set_default_double_param("wagon_wheel_spoke_width", inch_to_cm * .36);
0164   set_default_double_param("wagon_wheel_spoke_height_inner", inch_to_cm * (1.715 - .38));
0165   set_default_double_param("wagon_wheel_spoke_height_outer", inch_to_cm * (4.5 - .38));
0166   set_default_double_param("wagon_wheel_spoke_R_inner", inch_to_cm * 9);
0167   set_default_double_param("wagon_wheel_spoke_R_outer", inch_to_cm * 29.5);
0168 
0169   set_default_int_param("electronics_enable", 1);
0170   set_default_int_param("electronics_nFEE_R1", 6);
0171   set_default_int_param("electronics_nFEE_R2", 8);
0172   set_default_int_param("electronics_nFEE_R3", 12);
0173 
0174   // 10 layer PCB: https://indico.bnl.gov/event/8332/
0175   set_default_double_param("electronics_FEE_depth", inch_to_cm * 5.57);
0176   set_default_double_param("electronics_FEE_Cu_thickness", 35e-4 * 10 * .8);  // 1.4mil Copper 80% filling factor
0177   set_default_double_param("electronics_FEE_PCB_thickness", inch_to_cm * 0.07);
0178   set_default_double_param("electronics_FEE_Al_thickness", inch_to_cm * .13);
0179 
0180   set_default_string_param("electronics_cooling_block_material", "G4_Al");
0181   set_default_double_param("electronics_cooling_block_thickness", inch_to_cm * 3.5);
0182 
0183   set_default_double_param("electronics_cooling_block_R_inner", inch_to_cm * 9.26);
0184   set_default_double_param("electronics_cooling_block_R_outer", inch_to_cm * 29.57);
0185 
0186   set_default_double_param("electronics_cooling_block_R_R1_inner", inch_to_cm * 9.81);
0187   set_default_double_param("electronics_cooling_block_R_R1_outer", inch_to_cm * 15.47);
0188 
0189   set_default_double_param("electronics_cooling_block_R_R2_inner", inch_to_cm * 16.59);
0190   set_default_double_param("electronics_cooling_block_R_R2_outer", inch_to_cm * 22.24);
0191 
0192   set_default_double_param("electronics_cooling_block_R_R3_inner", inch_to_cm * 23.36);
0193   set_default_double_param("electronics_cooling_block_R_R3_outer", inch_to_cm * 29.02);
0194 }