Belle II Software development
CsiGeometryPar.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8#include <geometry/Materials.h>
9#include <framework/gearbox/GearDir.h>
10#include <framework/logging/Logger.h>
11#include <boost/format.hpp>
12#include <boost/lexical_cast.hpp>
13#include <boost/algorithm/string.hpp>
14#include <beast/csi/geometry/CsiGeometryPar.h>
15#include <cmath>
16#include <fstream>
17
18
19using namespace std;
20using namespace boost;
21using namespace Belle2;
22using namespace csi;
23
25
27{
30}
31
33{
34 clear();
35 read();
36
37 PrintAll();
38}
39
41{
44 B2INFO("m_B4CsiGeometryParDB deleted ");
45 }
46}
47
49{
50 m_cellID = 0;
51
52 m_Position.clear();
53 m_Orientation.clear();
54 m_BoxID.clear();
55 m_SlotID.clear();
56 m_thetaID.clear();
57 m_phiID.clear();
58
59}
60
62{
63
64 GearDir content = GearDir("/Detector/DetectorComponent[@name=\"CSI\"]/Content/");
65 string gearPath = "Enclosures/Enclosure";
66 int nEnc = content.getNumberNodes(gearPath);
67
68 int iCell = 0;
69
70 for (int iEnc = 1; iEnc <= nEnc; iEnc++) {
71 // Build the box (same for all)
72 //double length = content.getLength("Enclosures/Length") * CLHEP::cm;
73 //double thk = content.getLength("Enclosures/Thickness") * CLHEP::cm;
74 //double halflength = 15.0 * CLHEP::cm;
75 //double zshift = 0.5 * length - thk - halflength; /*< Shift of the box along z-axis (cry touches panel) **/
76
77 string enclosurePath = (boost::format("/%1%[%2%]") % gearPath % iEnc).str();
78
79 // Connect the appropriate Gearbox path
80 GearDir enclosureContent(content);
81 enclosureContent.append(enclosurePath);
82
83 // Read position
84 double PosZ = enclosureContent.getLength("PosZ") * CLHEP::cm;
85 double PosR = enclosureContent.getLength("PosR") * CLHEP::cm;
86 double PosT = enclosureContent.getAngle("PosT") ;
87
88 // Read Orientation
89 double Phi1 = enclosureContent.getAngle("AngPhi1") ;
90 double Theta = enclosureContent.getAngle("AngTheta") ;
91 double Phi2 = enclosureContent.getAngle("AngPhi2") ;
92
93 //Transform3D zsh = Translate3D(0, 0, zshift);
94 Transform3D m1 = RotateZ3D(Phi1);
95 Transform3D m2 = RotateY3D(Theta);
96 Transform3D m3 = RotateZ3D(Phi2);
97 Transform3D position = Translate3D(PosR * cos(PosT), PosR * sin(PosT), PosZ);
98
100 Transform3D Tr = position * m3 * m2 * m1;
101
102 int nSlots = enclosureContent.getNumberNodes("CrystalInSlot");
103 for (int iSlot = 1; iSlot <= nSlots; iSlot++) {
104 iCell++;
105
106 //Thread the strings
107 string slotPath = (boost::format("/Enclosures/Slot[%1%]") % iSlot).str();
108
109 GearDir slotContent(content);
110 slotContent.append(slotPath);
111
112 double SlotX = slotContent.getLength("PosX") * CLHEP::cm;
113 double SlotY = slotContent.getLength("PosY") * CLHEP::cm;
114 double SlotZ = slotContent.getLength("PosZ") * CLHEP::cm;
115 Transform3D Pos = Translate3D(SlotX, SlotY, SlotZ);
116
117 Transform3D CrystalPos = Tr * Pos;
118 RotationMatrix CrystalRot = CrystalPos.getRotation();
119
120 m_Position.push_back(ROOT::Math::XYZVector(CrystalPos.getTranslation()) * 1.0 / CLHEP::cm);
121 m_Orientation.push_back(ROOT::Math::XYZVector(CrystalRot.colZ()));
122
123 m_thetaID.push_back(CrystalPos.getTranslation().z() > 0 ? 0 : 1);
124 m_phiID.push_back(iCell - 9 * m_thetaID.back());
125
126 m_BoxID.push_back(iEnc - 1);
127 m_SlotID.push_back(iSlot - 1);
128 }
129 //
130 }
131}
132
133
134int CsiGeometryPar::CsiVolNameToCellID(const G4String VolumeName)
135{
136 int cellID = 0;
137
138 vector< string > partName;
139 split(partName, VolumeName, is_any_of("_"));
140
141 int iEnclosure = -1;
142 int iCrystal = -1;
143 for (std::vector<string>::iterator it = partName.begin() ; it != partName.end(); ++it) {
144 if (equals(*it, "Enclosure")) iEnclosure = boost::lexical_cast<int>(*(it + 1)) - 1;
145 else if (equals(*it, "Crystal")) iCrystal = boost::lexical_cast<int>(*(it + 1)) - 1;
146 }
147
148 cellID = 3 * iEnclosure + iCrystal;
149
150 if (cellID < 0) B2WARNING("CsiGeometryPar: volume " << VolumeName << " is not a crystal");
151
152 return cellID;
153}
154
155
156G4Material* CsiGeometryPar::GetMaterial(int cid)
157{
158 int iEnclosure = GetEnclosureID(cid) + 1;
159 int iSlot = GetSlotID(cid) + 1;
160
161 GearDir content = GearDir("/Detector/DetectorComponent[@name=\"CSI\"]/Content/");
162
163 GearDir enclosureContent(content);
164 string gearPath = "Enclosures/Enclosure";
165 string enclosurePath = (format("/%1%[%2%]") % gearPath % iEnclosure).str();
166 enclosureContent.append(enclosurePath);
167
168 string slotName = (format("CrystalInSlot[%1%]") % iSlot).str();
169 int iCry = enclosureContent.getInt(slotName);
170
171
172 GearDir crystalContent(content);
173 crystalContent.append((format("/EndCapCrystals/EndCapCrystal[%1%]/") % (iCry)).str());
174 string strMatCrystal = crystalContent.getString("Material", "Air");
175
176 return geometry::Materials::get(strMatCrystal);
177
178}
179
180
181double CsiGeometryPar::GetMaterialProperty(int cid, const char* propertyname)
182{
183 G4Material* mat = GetMaterial(cid);
184 G4MaterialPropertiesTable* properties = mat->GetMaterialPropertiesTable();
185 G4MaterialPropertyVector* property = properties->GetProperty(propertyname);
186
187 return property->Value(0);
188}
189
190void CsiGeometryPar::Print(int cid, int debuglevel)
191{
192 B2DEBUG(debuglevel, "Cell ID : " << cid);
193
194 B2DEBUG(debuglevel, " Position x : " << GetPosition(cid).x());
195 B2DEBUG(debuglevel, " Position y : " << GetPosition(cid).y());
196 B2DEBUG(debuglevel, " Position z : " << GetPosition(cid).z());
197
198 B2DEBUG(debuglevel, " Orientation x : " << GetOrientation(cid).x());
199 B2DEBUG(debuglevel, " Orientation y : " << GetOrientation(cid).y());
200 B2DEBUG(debuglevel, " Orientation z : " << GetOrientation(cid).z());
201
202 B2DEBUG(debuglevel, " Material : " << GetMaterial(cid)->GetName());
203
204 B2DEBUG(debuglevel, " Slow time constatnt : " << GetMaterialProperty(cid, "SLOWTIMECONSTANT"));
205 B2DEBUG(debuglevel, " Fast time constatnt : " << GetMaterialProperty(cid, "FASTTIMECONSTANT"));
206 B2DEBUG(debuglevel, " Light yield : " << GetMaterialProperty(cid, "SCINTILLATIONYIELD"));
207
208 //GetMaterial(cid)->GetMaterialPropertiesTable()->DumpTable();
209}
210
211void CsiGeometryPar::PrintAll(int debuglevel)
212{
213 for (uint i = 0; i < m_thetaID.size(); i++)
214 Print(i, debuglevel);
215}
GearDir is the basic class used for accessing the parameter store.
Definition: GearDir.h:31
void append(const std::string &path)
Append something to the current path, modifying the GearDir in place.
Definition: GearDir.h:52
virtual int getNumberNodes(const std::string &path="") const override
Return the number of nodes a given path will expand to.
Definition: GearDir.h:58
virtual std::string getString(const std::string &path="") const noexcept(false) override
Get the parameter path as a string.
Definition: GearDir.h:69
The Class for CSI Geometry Parameters.
void PrintAll(int debuglevel=80)
Print all crystals information.
std::vector< ROOT::Math::XYZVector > m_Position
Position of the nominal centre of the crystal.
int GetEnclosureID(int cid)
Get Enclosure ID from cell ID.
ROOT::Math::XYZVector GetOrientation(int cid)
Get the orientation of the crystal.
std::vector< ROOT::Math::XYZVector > m_Orientation
Orientation of the crystal.
std::vector< int > m_thetaID
The Theta ID information.
void Print(const int cid, int debuglevel=80)
Print crystal information.
int m_cellID
The Cell ID information.
ROOT::Math::XYZVector GetPosition(int cid)
Get the position of the crystal.
std::vector< int > m_phiID
The Phi ID information.
void read()
Gets geometry parameters from gearbox.
virtual ~CsiGeometryPar()
Destructor.
std::vector< int > m_BoxID
The index of the enclosure.
G4Material * GetMaterial(int cid)
Get pointer to the Geant4 Material.
static CsiGeometryPar * Instance()
Static method to get a reference to the CsiGeometryPar instance.
int CsiVolNameToCellID(const G4String VolumeName)
Get Cell Id.
std::vector< int > m_SlotID
The slot index of the crystal in the enclosure.
int GetSlotID(int cid)
Get Slot ID in the Enclosure from cell ID.
static CsiGeometryPar * m_B4CsiGeometryParDB
Pointer that saves the instance of this class.
double GetMaterialProperty(int cid, const char *propertyname)
Get material property.
double getAngle(const std::string &path="") const noexcept(false)
Get the parameter path as a double converted to the standard angle unit.
Definition: Interface.h:299
double getLength(const std::string &path="") const noexcept(false)
Get the parameter path as a double converted to the standard length unit.
Definition: Interface.h:259
int getInt(const std::string &path="") const noexcept(false)
Get the parameter path as a int.
Definition: Interface.cc:60
static G4Material * get(const std::string &name)
Find given material.
Definition: Materials.h:63
Abstract base class for different kinds of events.
STL namespace.