Belle II Software development
CsiCreator Class Reference

The creator for the CSI geometry. More...

#include <CsiCreator.h>

Inheritance diagram for CsiCreator:
CreatorBase

Public Member Functions

 CsiCreator ()
 Constructor.
 
virtual ~CsiCreator ()
 Destructor.
 
virtual void create (const GearDir &content, G4LogicalVolume &topVolume, geometry::GeometryTypes type)
 Creation of the detector geometry from Gearbox (XML).
 
 BELLE2_DEFINE_EXCEPTION (DBNotImplemented, "Cannot create geometry from Database.")
 Exception that will be thrown in createFromDB if member is not yet implemented by creator.
 
virtual void createFromDB (const std::string &name, G4LogicalVolume &topVolume, GeometryTypes type)
 Function to create the geometry from the Database.
 
virtual void createPayloads (const GearDir &content, const IntervalOfValidity &iov)
 Function to create the geometry database.
 

Protected Member Functions

void BuildEnclosure (const GearDir &content, G4AssemblyVolume *assembly, std::string side, int iEnclosure)
 Builds the crystals enclosures.
 
void PutCrystal (const GearDir &content, G4AssemblyVolume *assembly, G4Transform3D position, int iEnclosure, int iCry)
 Builds the crystals and their wrapping (foil)
 

Protected Attributes

SensitiveDetectorm_sensitive
 SensitiveDetector CSI.
 

Detailed Description

The creator for the CSI geometry.

Definition at line 30 of file CsiCreator.h.

Constructor & Destructor Documentation

◆ CsiCreator()

Constructor.

Definition at line 54 of file CsiCreator.cc.

54 : m_sensitive(0)
55 {
56 //m_sensitive = new SensitiveDetector();
57 }
SensitiveDetector * m_sensitive
SensitiveDetector CSI.
Definition: CsiCreator.h:49

◆ ~CsiCreator()

~CsiCreator ( )
virtual

Destructor.

Definition at line 59 of file CsiCreator.cc.

60 {
61 if (m_sensitive) delete m_sensitive;
62 }

Member Function Documentation

◆ BuildEnclosure()

void BuildEnclosure ( const GearDir content,
G4AssemblyVolume *  assembly,
std::string  side,
int  iEnclosure 
)
protected

Builds the crystals enclosures.

< Position of the nominal centre of crystals in the box

< Nominal position of the centre of the box

Definition at line 213 of file CsiCreator.cc.

214 {
215
216 string gearPath = "Enclosures/Enclosure";
217 int nEnclosures = content.getNumberNodes(gearPath);
218
219 if (iEnclosure > nEnclosures) {
220 B2ERROR("Enclosure index too high");
221 return ;
222 }
223
224 // Build the box (same for all)
225 double width = content.getLength("Enclosures/Width") * CLHEP::cm;
226 double length = content.getLength("Enclosures/Length") * CLHEP::cm;
227 double depth = content.getLength("Enclosures/Depth") * CLHEP::cm;
228 double thk = content.getLength("Enclosures/Thickness") * CLHEP::cm;
229 double fold = content.getLength("Enclosures/Fold") * CLHEP::cm;
230 double lidthk = content.getLength("Enclosures/LidThickness") * CLHEP::cm;
231 double halflength = 15.0 * CLHEP::cm;
232 double zshift = 0.5 * length - thk - halflength; /*< Shift of the box along z-axis to make crystal touch the panel **/
233
234 string strMatEnclosure = content.getString("Enclosures/Material", "5052-Alloy");
235 G4Material* EnclosureMat = geometry::Materials::get(strMatEnclosure);
236
237 string strMatEncloLid = content.getString("Enclosures/LidMaterial", "5052-Alloy");
238 G4Material* EncloLidMat = geometry::Materials::get(strMatEncloLid);
239
240 G4Box* outer = new G4Box("Outer", 0.5 * width, 0.5 * depth, 0.5 * length);
241 G4Box* inner = new G4Box("Inner", 0.5 * width - thk, 0.5 * depth - thk, 0.5 * length - thk);
242 G4Box* opening = new G4Box("Opening", 0.5 * width - fold, 0.5 * depth, 0.5 * length - fold);
243 G4Box* lid = new G4Box("Lid", 0.5 * width, 0.5 * lidthk, 0.5 * length);
244
245 G4ThreeVector translation(0, thk, 0);
246 G4Translate3D transform(translation);
247 G4SubtractionSolid* enclosureShapeT = new G4SubtractionSolid("EnclosureShapeT", outer, inner);
248 G4SubtractionSolid* enclosureShape = new G4SubtractionSolid("EnclosureShape",
249 enclosureShapeT, opening, transform);
250
251 //Thread the strings
252 string enclosurePath = (format("/%1%[%2%]") % gearPath % iEnclosure).str();
253 string logiVolName = (format("%1%Enclosure_%2%") % side % iEnclosure).str();
254 string logiLidVolName = (format("%1%EnclosureLid_%2%") % side % iEnclosure).str();
255
256 // Connect the appropriate Gearbox path
257 GearDir enclosureContent(content);
258 enclosureContent.append(enclosurePath);
259
260 // Create logical volumes
261 G4LogicalVolume* logiEnclosure = new G4LogicalVolume(enclosureShape, EnclosureMat, logiVolName, 0, 0, 0);
262 G4LogicalVolume* logiEncloLid = new G4LogicalVolume(lid, EncloLidMat, logiLidVolName, 0, 0, 0);
263
264 // Read position
265 double PosZ = enclosureContent.getLength("PosZ") * CLHEP::cm;
266 double PosR = enclosureContent.getLength("PosR") * CLHEP::cm;
267 double PosT = enclosureContent.getAngle("PosT") ;
268
269 // Read Orientation
270 double Phi1 = enclosureContent.getAngle("AngPhi1") ;
271 double Theta = enclosureContent.getAngle("AngTheta") ;
272 double Phi2 = enclosureContent.getAngle("AngPhi2") ;
273
274 //Read position adjustments from nominal
275 double AdjX = enclosureContent.getLength("ShiftX") * CLHEP::cm;
276 double AdjY = enclosureContent.getLength("ShiftY") * CLHEP::cm;
277 double AdjZ = enclosureContent.getLength("ShiftZ") * CLHEP::cm;
278
279 G4Transform3D zsh = G4Translate3D(0, 0, zshift);
280 //G4Transform3D invzsh = G4Translate3D(0, 0, -zshift);
281 G4Transform3D m1 = G4RotateZ3D(Phi1);
282 G4Transform3D m2 = G4RotateY3D(Theta);
283 G4Transform3D m3 = G4RotateZ3D(Phi2);
284 G4Transform3D position = G4Translate3D(PosR * cos(PosT), PosR * sin(PosT), PosZ);
285 G4Transform3D adjust = G4Translate3D(AdjX, AdjY, AdjZ);
286 G4Transform3D lidpos = G4Translate3D(0, 0.5 * (depth + lidthk), 0);
287
288 G4Transform3D Tr = position * m3 * m2 * m1;
289 G4Transform3D ZshTr = Tr * zsh;
290 G4Transform3D ZshTrAdj = adjust * ZshTr;
291 G4Transform3D LidTr = ZshTr * lidpos;
292 G4Transform3D LidTrAdj = adjust * LidTr;
293
294 G4VisAttributes* VisAtt = new G4VisAttributes(G4Colour(1.0, 0.5, 0.0, 0.5));
295 logiEnclosure->SetVisAttributes(VisAtt);
296
297 G4VisAttributes* LidVisAtt = new G4VisAttributes(G4Colour(0.8, 1.0, 0.4, 0.5));
298 logiEncloLid->SetVisAttributes(LidVisAtt);
299 //logiEncloLid->SetVisAttributes(G4VisAttributes::GetInvisible());
300
301 B2INFO("CsIBox No. " << iEnclosure << " Nominal pos. (mm): " << ZshTr.getTranslation());
302 B2INFO(" Installed pos. (mm): " << ZshTrAdj.getTranslation());
303 B2INFO(" Rotation matrix : " << ZshTrAdj.getRotation());
304 B2INFO(" ");
305
306 assembly->AddPlacedVolume(logiEnclosure, ZshTrAdj);
307 assembly->AddPlacedVolume(logiEncloLid, LidTrAdj);
308
309
310 int nSlots = enclosureContent.getNumberNodes("CrystalInSlot");
311
312 for (int iSlot = 1; iSlot <= nSlots; iSlot++) {
313 //Thread the strings
314 string slotPath = (format("/Enclosures/Slot[%1%]") % iSlot).str();
315
316 GearDir slotContent(content);
317 slotContent.append(slotPath);
318
319 double SlotX = slotContent.getLength("PosX") * CLHEP::cm;
320 double SlotY = slotContent.getLength("PosY") * CLHEP::cm;
321 double SlotZ = slotContent.getLength("PosZ") * CLHEP::cm;
322
323
324 G4Transform3D Pos = G4Translate3D(SlotX, SlotY, SlotZ);
325
326 int CryID = enclosureContent.getInt((format("/CrystalInSlot[%1%]") % iSlot).str());
327
328 PutCrystal(content, assembly, adjust * Tr * Pos, iEnclosure, CryID);
329 }
330
331 return;
332
333 }
void PutCrystal(const GearDir &content, G4AssemblyVolume *assembly, G4Transform3D position, int iEnclosure, int iCry)
Builds the crystals and their wrapping (foil)
Definition: CsiCreator.cc:112
static G4Material * get(const std::string &name)
Find given material.
Definition: Materials.h:63
void fold(double xu, double A, double &x, double &kx, int &nx)
fold a coordinate (inverse of unfold).
Definition: func.h:59

◆ create()

void create ( const GearDir content,
G4LogicalVolume &  topVolume,
geometry::GeometryTypes  type 
)
virtual

Creation of the detector geometry from Gearbox (XML).

Parameters
[in]contentXML data directory.
[in]topVolumeGeant world volume.
[in]typeGeometry type.

Implements CreatorBase.

Definition at line 64 of file CsiCreator.cc.

65 {
66
68
69 //Print the type (not used for now)
70 B2DEBUG(200, "CsI Geometry Type: " << type);
71
72 // Print list of defined materials
73 /*
74 G4NistManager* nistManager = G4NistManager::Instance();
75 cout << *(G4Material::GetMaterialTable()) << endl;
76 */
77
78 G4Transform3D BrR = G4RotateZ3D(0.0);
79
80 int nEnc = content.getNumberNodes("/Enclosures/Enclosure");
81
82 G4AssemblyVolume* assemblyEnclosures = new G4AssemblyVolume();
83 for (int iEnc = 1; iEnc <= nEnc; iEnc++) {
84 BuildEnclosure(content, assemblyEnclosures, "side", iEnc);
85 //
86 }
87
88 assemblyEnclosures->MakeImprint(&topVolume, BrR);
89
90 // Show cell IDs and volume names
91 B2INFO("Positions of the individual CsI crystals");
92 CsiGeometryPar* eclp = CsiGeometryPar::Instance();
93 unsigned int i = 0;
94 for (std::vector<G4VPhysicalVolume*>::iterator it = assemblyEnclosures->GetVolumesIterator();
95 i != assemblyEnclosures->TotalImprintedVolumes();
96 ++it, ++i) {
97
98 G4VPhysicalVolume* volume = *it;
99 string VolumeName = volume->GetName();
100 if (VolumeName.find("Crystal") < string::npos) {
101 B2INFO("Crystal Number " << eclp->CsiVolNameToCellID(VolumeName) <<
102 " placed at (r[cm],[deg],z[cm]) = (" << setprecision(1) << fixed <<
103 volume->GetTranslation().perp() / CLHEP::cm << "," <<
104 volume->GetTranslation().phi() * 180.0 / M_PI << "," <<
105 volume->GetTranslation().z() / CLHEP::cm << ")");
106 }
107
108
109 }// for all physical volumes in the assembly
110 }// create
void BuildEnclosure(const GearDir &content, G4AssemblyVolume *assembly, std::string side, int iEnclosure)
Builds the crystals enclosures.
Definition: CsiCreator.cc:213
static CsiGeometryPar * Instance()
Static method to get a reference to the CsiGeometryPar instance.
VXD::SensitiveDetector< PXDSimHit, PXDTrueHit > SensitiveDetector
The PXD Sensitive Detector class.

◆ createFromDB()

void createFromDB ( const std::string &  name,
G4LogicalVolume &  topVolume,
GeometryTypes  type 
)
virtualinherited

Function to create the geometry from the Database.

Parameters
namename of the component in the database, could be used to disambiguate multiple components created with the same creator
topVolumeTop volume in which the geometry has to be placed
typeType of geometry to be build

Reimplemented in GeoMagneticField, GeoARICHCreator, BeamabortCreator, GeoCDCCreator, GeoCDCCreatorReducedCDC, GeoECLCreator, MyDBCreator, GeoBeamPipeCreator, GeoCryostatCreator, GeoFarBeamLineCreator, GeoBKLMCreator, GeoEKLMCreator, GeoKLMCreator, GeoPXDCreator, GeoCOILCreator, GeoServiceMaterialCreator, GeoSTRCreator, GeoSVDCreator, GeoTOPCreator, GeoHeavyMetalShieldCreator, and GeoVXDServiceCreator.

Definition at line 17 of file CreatorBase.cc.

18 {
19 //Do nothing but raise exception that we don't do anything
20 throw DBNotImplemented();
21 }

◆ createPayloads()

void createPayloads ( const GearDir content,
const IntervalOfValidity iov 
)
virtualinherited

Function to create the geometry database.

This function should be implemented to convert Gearbox parameters to one ore more database payloads

Parameters
contentGearDir pointing to the parameters which should be used for construction
iovinterval of validity to use when generating payloads

Reimplemented in GeoARICHCreator, BeamabortCreator, GeoCDCCreator, GeoCDCCreatorReducedCDC, GeoECLCreator, GeoMagneticField, MyDBCreator, GeoBeamPipeCreator, GeoCryostatCreator, GeoFarBeamLineCreator, GeoBKLMCreator, GeoEKLMCreator, GeoKLMCreator, GeoPXDCreator, GeoCOILCreator, GeoServiceMaterialCreator, GeoSTRCreator, GeoSVDCreator, GeoTOPCreator, GeoHeavyMetalShieldCreator, and GeoVXDServiceCreator.

Definition at line 24 of file CreatorBase.cc.

24{}

◆ PutCrystal()

void PutCrystal ( const GearDir content,
G4AssemblyVolume *  assembly,
G4Transform3D  position,
int  iEnclosure,
int  iCry 
)
protected

Builds the crystals and their wrapping (foil)

Definition at line 112 of file CsiCreator.cc.

117 {
118 if (iCry <= 0) return;
119
120 GearDir counter(content);
121 double foilthickness = counter.getLength("/Wrapping/Thickness") * CLHEP::cm;
122 G4Material* foilMaterial = geometry::Materials::get(counter.getString("/Wrapping/Material"));
123
124
125 int nCry = content.getNumberNodes("/EndCapCrystals/EndCapCrystal");
126 if (iCry > nCry) {
127 B2ERROR("CsiCreator: Crystal index too high");
128 return ;
129 }
130
131 counter.append((format("/EndCapCrystals/EndCapCrystal[%1%]/") % (iCry)).str());
132 double h1 = counter.getLength("K_h1") * CLHEP::cm;
133 double h2 = counter.getLength("K_h2") * CLHEP::cm;
134 double bl1 = counter.getLength("K_bl1") * CLHEP::cm;
135 double bl2 = counter.getLength("K_bl2") * CLHEP::cm;
136 double tl1 = counter.getLength("K_tl1") * CLHEP::cm;
137 double tl2 = counter.getLength("K_tl2") * CLHEP::cm;
138 double alpha1 = counter.getAngle("K_alpha1");
139 double alpha2 = counter.getAngle("K_alpha2");
140 double halflength = counter.getLength("k_HalfLength") * CLHEP::cm;
141
142 // Read and create material
143 string strMatCrystal = counter.getString("Material", "Air");
144 G4Material* crystalMaterial = geometry::Materials::get(strMatCrystal);
145
146
147 G4VisAttributes* CrystalVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 0.0, 1.0));
148
149 if (strMatCrystal.compare("CsI") == 0) {
150 CrystalVisAtt->SetColour(18.0 / 256, 230.0 / 256, 3.0 / 256);
151 } else if (strMatCrystal.compare("CsI-Tl") == 0) {
152 CrystalVisAtt->SetColour(0.0, 0.5, 1.0);
153 } else if (strMatCrystal.compare("LYSO") == 0) {
154 CrystalVisAtt->SetColour(0.820, 0.148, 0.1875);
155 }
156
158 double fwtrapangle1 = atan(2 * h1 / (bl1 - tl1)); // the smaller angle of the trap
159 double fwtrapangle2 = atan(2 * h2 / (bl2 - tl2));
160 double foilh1 = h1 + foilthickness;
161 double foilh2 = h2 + foilthickness;
162 double foiltl1 = tl1 + foilthickness * tan(fwtrapangle1 / 2);
163 double foilbl1 = bl1 + foilthickness / tan(fwtrapangle1 / 2);
164 double foiltl2 = tl2 + foilthickness * tan(fwtrapangle2 / 2);
165 double foilbl2 = foiltl2 + (foilbl1 - foiltl1) * foilh2 / foilh1;
166
167 double foilhalflength = halflength + foilthickness;
169
170 string cryLogiVolName = (format("Enclosure_%1%_Crystal_%2%") % iEnclosure % iCry).str();
171 G4Trap* CrystalShape = new G4Trap((format("sCrystal_%1%") % iCry).str().c_str(),
172 halflength, 0, 0, h1, bl1, tl1, alpha1, h2, bl2, tl2, alpha2);
173 G4LogicalVolume* Crystal = new G4LogicalVolume(CrystalShape, crystalMaterial,
174 cryLogiVolName.c_str(),
175 0, 0, 0);
176
177 Crystal->SetVisAttributes(CrystalVisAtt);
178 Crystal->SetSensitiveDetector(m_sensitive);
179
180 //cout << "CSI volume " << CrystalShape->GetCubicVolume() / CLHEP::cm / CLHEP::cm / CLHEP::cm
181 //<< " density " << crystalMaterial->GetDensity() / CLHEP::g * CLHEP::cm * CLHEP::cm * CLHEP::cm << endl;
182
184 G4Trap* Foilout = new G4Trap((format("Foilout_%1%") % iCry).str().c_str(),
185 foilhalflength, 0, 0, foilh1, foilbl1,
186 foiltl1, alpha1, foilh2, foilbl2,
187 foiltl2, alpha2);
188
189 G4Trap* Foilin = new G4Trap((format("solidEclCrystal_%1%") % iCry).str().c_str(),
190 halflength * avoidov, 0, 0, h1 * avoidov,
191 bl1 * avoidov, tl1 * avoidov, alpha1, h2 * avoidov,
192 bl2 * avoidov, tl2 * avoidov, alpha2);
193 G4SubtractionSolid* FoilShape = new G4SubtractionSolid((format("sFoil_%1%") % iCry).str().c_str(),
194 Foilout, Foilin);
195
196 G4LogicalVolume* Foil = new G4LogicalVolume(FoilShape, foilMaterial,
197 (format("Foil_%1%") % iCry).str().c_str(),
198 0, 0, 0);
199
200 G4VisAttributes* FoilVisAtt = new G4VisAttributes(G4Colour(0.1, 0.1, 0.1, 0.5));
201 Foil->SetVisAttributes(FoilVisAtt);
202
203 //Hide the foils for now...
204 Foil->SetVisAttributes(G4VisAttributes::GetInvisible());
205
206 assembly->AddPlacedVolume(Crystal, position);
207 assembly->AddPlacedVolume(Foil, position);
208
209 return ;
210
211 }
double atan(double a)
atan for double
Definition: beamHelpers.h:34
const double avoidov
foil inside is a little bit lager than crystal to avoid overlap
Definition: CsiCreator.cc:50

Member Data Documentation

◆ m_sensitive

SensitiveDetector* m_sensitive
protected

SensitiveDetector CSI.

Definition at line 49 of file CsiCreator.h.


The documentation for this class was generated from the following files: