Analysis Software
Documentation for sPHENIX simulation software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
PHG4BlockDetector.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file PHG4BlockDetector.cc
1 #include "PHG4BlockDetector.h"
2 
4 
5 #include <phparameter/PHParameters.h>
6 
7 #include <g4main/PHG4Detector.h> // for PHG4Detector
8 #include <g4main/PHG4DisplayAction.h> // for PHG4DisplayAction
9 #include <g4main/PHG4Subsystem.h>
10 
11 #include <Geant4/G4Box.hh>
12 #include <Geant4/G4LogicalVolume.hh>
13 #include <Geant4/G4PVPlacement.hh>
14 #include <Geant4/G4RotationMatrix.hh> // for G4RotationMatrix
15 #include <Geant4/G4String.hh> // for G4String
16 #include <Geant4/G4SystemOfUnits.hh>
17 #include <Geant4/G4ThreeVector.hh> // for G4ThreeVector
18 #include <Geant4/G4UserLimits.hh>
19 
20 #include <CLHEP/Units/SystemOfUnits.h> // for cm, deg
21 
22 #include <cmath> // for isfinite
23 #include <iostream> // for operator<<, endl, basic_ostream
24 #include <sstream>
25 
26 class G4Material;
27 class G4VSolid;
28 class PHCompositeNode;
29 
30 using namespace std;
31 
32 //_______________________________________________________________
34  : PHG4Detector(subsys, Node, dnam)
35  , m_Params(parameters)
36  , m_BlockPhysi(nullptr)
37  , m_DisplayAction(dynamic_cast<PHG4BlockDisplayAction *>(subsys->GetDisplayAction()))
38  , m_Layer(lyr)
39 {
40 }
41 
42 //_______________________________________________________________
44 {
45  if (volume == m_BlockPhysi)
46  {
47  return true;
48  }
49  return false;
50 }
51 
52 //_______________________________________________________________
53 void PHG4BlockDetector::ConstructMe(G4LogicalVolume *logicWorld)
54 {
55  G4Material *TrackerMaterial = GetDetectorMaterial(m_Params->get_string_param("material"));
56 
57  G4VSolid *block_solid = new G4Box(G4String(GetName()),
58  m_Params->get_double_param("size_x") / 2. * cm,
59  m_Params->get_double_param("size_y") / 2. * cm,
60  m_Params->get_double_param("size_z") / 2. * cm);
61 
62  double steplimits = m_Params->get_double_param("steplimits") * cm;
63  G4UserLimits *g4userlimits = nullptr;
64  if (isfinite(steplimits))
65  {
66  g4userlimits = new G4UserLimits(steplimits);
67  }
68 
69  G4LogicalVolume *block_logic = new G4LogicalVolume(block_solid,
70  TrackerMaterial,
71  G4String(GetName()),
72  nullptr, nullptr, g4userlimits);
73 
74  PHG4Subsystem *mysys = GetMySubsystem();
75  mysys->SetLogicalVolume(block_logic);
76 
77  G4RotationMatrix *rotm = new G4RotationMatrix();
78  int nRotation(0);
79  if (m_Params->get_double_param("rot_x") != 0)
80  {
81  ++nRotation;
82  rotm->rotateX(m_Params->get_double_param("rot_x") * deg);
83  }
84  if (m_Params->get_double_param("rot_y") != 0)
85  {
86  ++nRotation;
87  rotm->rotateY(m_Params->get_double_param("rot_y") * deg);
88  }
89  if (m_Params->get_double_param("rot_z") != 0)
90  {
91  ++nRotation;
92  rotm->rotateZ(m_Params->get_double_param("rot_z") * deg);
93  }
94 
95  if (nRotation >= 2)
96  {
97  cout << __PRETTY_FUNCTION__ << ": Warning : " << GetName() << " is configured with more than one of the x-y-z rotations of "
98  << "(" << m_Params->get_double_param("rot_x") << ", "
99  << m_Params->get_double_param("rot_x") << ", "
100  << m_Params->get_double_param("rot_x") << ") degrees. "
101  << "The rotation is instruction is ambiguous and they are performed in the order of X->Y->Z rotations with result rotation matrix of:";
102  rotm->print(cout);
103  }
104 
105  m_BlockPhysi = new G4PVPlacement(rotm, G4ThreeVector(m_Params->get_double_param("place_x") * cm, m_Params->get_double_param("place_y") * cm, m_Params->get_double_param("place_z") * cm),
106  block_logic,
107  G4String(GetName()),
108  logicWorld, false, false, OverlapCheck());
109  m_DisplayAction->SetMyVolume(block_logic);
110 }