Belle II Software development
GeoARICHBtestCreator Class Reference

The creator for the PXD geometry of the Belle II detector. More...

#include <GeoARICHBtestCreator.h>

Inheritance diagram for GeoARICHBtestCreator:
CreatorBase

Public Member Functions

 GeoARICHBtestCreator ()
 Constructor of the GeoPXDCreator class.
 
 GeoARICHBtestCreator (const GeoARICHBtestCreator &)=delete
 Copy constructor (disabled).
 
virtual ~GeoARICHBtestCreator ()
 The destructor of the GeoPXDCreator class.
 
GeoARICHBtestCreatoroperator= (const GeoARICHBtestCreator &)=delete
 Operator = (disabled).
 
virtual void create (const GearDir &content, G4LogicalVolume &topVolume, geometry::GeometryTypes type)
 Creates the ROOT Objects for the ARICH Beamtest 2011 geometry.
 
 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 createBtestGeometry (const GearDir &content, G4LogicalVolume &topVolume)
 Creation of the beamtest geometry.
 
G4LogicalVolume * buildModule (GearDir Module)
 Build the module.
 
double getAvgRINDEX (G4Material *material)
 Get the average refractive index if the material.
 
G4Material * createAerogel (const char *aeroname, double rind, double trl)
 create aerogel material
 

Protected Attributes

SensitiveDetectorm_sensitive
 pointer to the sensitive detector
 
SensitiveAerom_sensitiveAero
 pointer to the sesnitive aerogel
 

Private Attributes

int m_runno
 Beamtest Run number.
 
std::string m_author
 Beamtest runlog record author.
 
int m_neve
 Number of event in the beamtest run.
 
std::string m_runtype
 Type of the beamtest run.
 
std::string m_hapdID
 ID of the HAPD configuration setup.
 
std::string m_aerogelID
 ID of the aerogel configuration setup.
 
std::string m_mirrorID
 ID of the mirror configuration setup.
 
double m_rotation
 rotation angle of the setup
 
double m_rx
 x shift of the prototype ARICH frame
 
double m_ry
 y shift of the prototype ARICH frame
 
std::string m_mytype
 type of the run
 
std::string m_daqqa
 classification of the run
 
std::string m_comment
 comment in the runlog
 
std::string m_datum
 datum of the runlog
 
int m_aerosupport
 Type of aerogel support - not used at the moment.
 
double m_aerogeldx
 shift of the aerogel center
 
double m_framedx
 shift of the frame
 
double m_rotation1
 rotation angle of the frame
 
int m_configuration
 configuration number of the HAPD
 
std::string m_comment1
 tbc
 
std::vector< double > m_agelrefind
 vector of aerogel refractive indices
 
std::vector< double > m_agelthickness
 vector of aerogel thicknesses
 
std::vector< double > m_ageltrlen
 vector of aerogel transmission lengths
 

Detailed Description

The creator for the PXD geometry of the Belle II detector.

Definition at line 32 of file GeoARICHBtestCreator.h.

Constructor & Destructor Documentation

◆ GeoARICHBtestCreator()

Constructor of the GeoPXDCreator class.

Definition at line 64 of file GeoARICHBtestCreator.cc.

64 :
65 m_sensitive(new SensitiveDetector),
66 m_sensitiveAero(new SensitiveAero),
67 m_runno(0),
68 m_neve(0),
69 m_rotation(0),
70 m_rx(0),
71 m_ry(0),
72 m_aerosupport(0),
73 m_aerogeldx(0),
74 m_framedx(0),
75 m_rotation1(0),
76 m_configuration(0)
77 {};

◆ ~GeoARICHBtestCreator()

~GeoARICHBtestCreator ( )
virtual

The destructor of the GeoPXDCreator class.

Definition at line 79 of file GeoARICHBtestCreator.cc.

80 {
81
82 }

Member Function Documentation

◆ buildModule()

G4LogicalVolume * buildModule ( GearDir Module)
protected

Build the module.

Definition at line 219 of file GeoARICHBtestCreator.cc.

220 {
221
222 // get detector module parameters
223
224 // get module materials
225 string wallMat = Module.getString("wallMaterial");
226 string winMat = Module.getString("windowMaterial");
227 string botMat = Module.getString("Bottom/material");
228 G4Material* wallMaterial = Materials::get(wallMat);
229 G4Material* windowMaterial = Materials::get(winMat);
230 G4Material* bottomMaterial = Materials::get(botMat);
231 G4Material* boxFill = Materials::get("ARICH_Vacuum");
232
233 // check that module window material has specified refractive index
234 double wref = getAvgRINDEX(windowMaterial);
235 if (!wref) B2WARNING("Material '" << winMat <<
236 "', required for ARICH photon detector window as no specified refractive index. Continuing, but no photons in ARICH will be detected.");
237 ARICHGeometryPar* m_arichgp = ARICHGeometryPar::Instance();
238 m_arichgp->setWindowRefIndex(wref);
239 // get module dimensions
240 double modXsize = Module.getLength("moduleXSize") / Unit::mm;
241 double modZsize = Module.getLength("moduleZSize") / Unit::mm;
242 double wallThick = Module.getLength("moduleWallThickness") / Unit::mm;
243 double winThick = Module.getLength("windowThickness") / Unit::mm ;
244 double sensXsize = m_arichgp->getSensitiveSurfaceSize() / Unit::mm;
245 double botThick = Module.getLength("Bottom/thickness") / Unit::mm;
246
247 // some trivial checks of overlaps
248 if (sensXsize > modXsize - 2 * wallThick)
249 B2FATAL("ARICH photon detector module: Sensitive surface is too big. Doesn't fit into module box.");
250 if (winThick + botThick > modZsize)
251 B2FATAL("ARICH photon detector module: window + bottom thickness larger than module thickness.");
252
253 // module master volume
254 G4Box* moduleBox = new G4Box("Box", modXsize / 2., modXsize / 2., modZsize / 2.);
255 G4LogicalVolume* lmoduleBox = new G4LogicalVolume(moduleBox, boxFill, "moduleBox");
256
257 // build and place module wall
258 G4Box* tempBox = new G4Box("tempBox", modXsize / 2. - wallThick, modXsize / 2. - wallThick,
259 modZsize / 2. + 0.1); // Don't care about "+0.1", needs to be there.
260 G4SubtractionSolid* moduleWall = new G4SubtractionSolid("Box-tempBox", moduleBox, tempBox);
261 G4LogicalVolume* lmoduleWall = new G4LogicalVolume(moduleWall, wallMaterial, "moduleWall");
262 setColor(*lmoduleWall, "rgb(1.0,0.0,0.0,1.0)");
263 new G4PVPlacement(G4Transform3D(), lmoduleWall, "moduleWall", lmoduleBox, false, 1);
264
265 // build module window
266 G4Box* winBox = new G4Box("winBox", modXsize / 2. - wallThick, modXsize / 2. - wallThick, winThick / 2.);
267 G4LogicalVolume* lmoduleWin = new G4LogicalVolume(winBox, windowMaterial, "moduleWindow");
268 setColor(*lmoduleWin, "rgb(0.7,0.7,0.7,1.0)");
269 G4Transform3D transform = G4Translate3D(0., 0., (-modZsize + winThick) / 2.);
270 new G4PVPlacement(transform, lmoduleWin, "moduleWindow", lmoduleBox, false, 1);
271
272 // build module bottom
273 G4Box* botBox = new G4Box("botBox", modXsize / 2. - wallThick, modXsize / 2. - wallThick, botThick / 2.);
274 G4LogicalVolume* lmoduleBot = new G4LogicalVolume(botBox, bottomMaterial, "moduleBottom");
275 // if (isBeamBkgStudy) lmoduleBot->SetSensitiveDetector(new BkgSensitiveDetector("ARICH", 1));
276 setColor(*lmoduleBot, "rgb(0.0,1.0,0.0,1.0)");
277 G4Transform3D transform1 = G4Translate3D(0., 0., (modZsize - botThick) / 2.);
278 // add surface optical properties if specified
279 Materials& materials = Materials::getInstance();
280 GearDir bottomParam(Module, "Bottom/Surface");
281 if (bottomParam) {
282 G4OpticalSurface* optSurf = materials.createOpticalSurface(bottomParam);
283 new G4LogicalSkinSurface("bottomSurface", lmoduleBot, optSurf);
284 } else B2INFO("ARICH: No optical properties are specified for detector module bottom surface.");
285 new G4PVPlacement(transform1, lmoduleBot, "moduleBottom", lmoduleBox, false, 1);
286
287 // build sensitive surface
288 G4Box* sensBox = new G4Box("sensBox", sensXsize / 2., sensXsize / 2., 0.1 * Unit::mm);
289 G4LogicalVolume* lmoduleSens = new G4LogicalVolume(sensBox, boxFill, "moduleSensitive");
290 lmoduleSens->SetSensitiveDetector(m_sensitive);
291 setColor(*lmoduleSens, "rgb(0.5,0.5,0.5,1.0)");
292 G4Transform3D transform2 = G4Translate3D(0., 0., (-modZsize + 0.1) / 2. + winThick);
293 new G4PVPlacement(transform2, lmoduleSens, "moduleSensitive", lmoduleBox, false, 1);
294
295 // module is build, return module logical volume
296 return lmoduleBox;
297 }
void setColor(G4LogicalVolume &volume, const std::string &color)
Set the color of a logical volume.
Definition utilities.cc:100

◆ create()

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

Creates the ROOT Objects for the ARICH Beamtest 2011 geometry.

Parameters
contentA reference to the content part of the parameter description, which should to be used to create the ROOT objects.
topVolumetop volume
typegeometry type

Implements CreatorBase.

Definition at line 85 of file GeoARICHBtestCreator.cc.

86 {
87
88 B2INFO("GeoARICHBtestCreator::create");
89 StoreObjPtr<EventMetaData> eventMetaDataPtr;
90
91 int run = 68;
92 [[clang::suppress]]
93 PyObject* m = PyImport_AddModule(strdup("__main__"));
94 if (m) {
95 [[clang::suppress]]
96 PyObject* v = PyObject_GetAttrString(m, strdup("runno"));
97 if (v) {
98 run = PyLong_AsLong(v);
99 Py_DECREF(v);
100 }
101 B2INFO("GeoARICHBtestCreator::create runno = " << run);
102 }
103
104 B2INFO("eventMetaDataPtr run:" << run);
105 // eventMetaDataPtr->setEndOfData();
106
107
108
109
110 string Type = content.getString("@type", "");
111
112 char nodestr[100];
113 sprintf(nodestr, "run[runno=%d]", run);
114 if (Type == "beamtest") {
115 for (const GearDir& runparam : content.getNodes(nodestr)) {
116 m_runno = runparam.getInt("runno", -1);
117 m_author = runparam.getString("author", "");
118 m_neve = runparam.getInt("neve", -1);
119 m_runtype = runparam.getString("calibration", "pion");
120 m_hapdID = runparam.getString("setup1", "unknown");
121 m_aerogelID = runparam.getString("aerogel1", "unknown");
122 m_mirrorID = runparam.getString("mirror", "unknown");
123 m_rotation = runparam.getDouble("rotation", 0);
124 m_rx = runparam.getDouble("positionx", 0);
125 m_ry = runparam.getDouble("positiony", 0);
126 m_mytype = runparam.getString("type1", "unknown");
127 m_daqqa = runparam.getString("daqqa1", "unknown");
128 m_comment = runparam.getString("comment1", "unknown");
129 m_datum = runparam.getString("datum", "unknown");
130
131
132 B2INFO("runno : " << m_runno);
133 B2INFO("author : " << m_author);
134 B2INFO("neve : " << m_neve);
135 B2INFO("runtype : " << m_runtype);
136 B2INFO("hapdID : " << m_hapdID);
137 B2INFO("aerogelID: " << m_aerogelID);
138 B2INFO("mirrorID : " << m_mirrorID);
139 B2INFO("rotation : " << m_rotation);
140 B2INFO("rx : " << m_rx);
141 B2INFO("ry : " << m_ry);
142 B2INFO("runtype : " << m_mytype);
143 B2INFO("daqqa : " << m_daqqa);
144 B2INFO("comment : " << m_comment);
145 B2INFO("datum : " << m_datum);
146
147
148 }
149 string aerogelname;
150 sprintf(nodestr, "setup/aerogel/row[@id=\"%s\"]", m_aerogelID.c_str());
151
152 GearDir runparam(content, nodestr);
153 B2INFO("id : " << runparam.getString("@id", ""));
154 for (const GearDir& aeroparam : runparam.getNodes("aerogel")) {
155 aerogelname = aeroparam.getString(".", "");
156 string stype = aeroparam.getString("@type", "");
157 B2INFO(stype << " aerogelname : " << aerogelname);
158 sprintf(nodestr, "setup/aerogelinfo/row[@id=\"%s\"]", aerogelname.c_str());
159 GearDir infoparam(content, nodestr);
160
161 double agelrefind = infoparam.getDouble("refind", 1);
162 double ageltrlen = infoparam.getLength("trlen", 0);
163 double agelthickness = infoparam.getLength("thickness", 0);
164 if (stype != string("left")) {
165 m_ageltrlen.push_back(ageltrlen);
166 m_agelrefind.push_back(agelrefind);
167 m_agelthickness.push_back(agelthickness);
168 }
169 B2INFO("refind : " << agelrefind);
170 B2INFO("trlen : " << ageltrlen / Unit::mm);
171 B2INFO("thickness : " << agelthickness / Unit::mm);
172
173 }
174 int size = m_hapdID.size();
175
176 m_aerosupport = 0;
177 if (size > 0) {
178 char agelsupport = m_hapdID.at(size - 1);
179 if (agelsupport == 'a') m_aerosupport = 1;
180 if (agelsupport == 'b') m_aerosupport = 2;
181 }
182
183 if (m_aerosupport) size--;
184 sprintf(nodestr, "setup/hapd/row[@id=\"%s\"]", m_hapdID.substr(0, size).c_str());
185 B2INFO("nodestr : " << nodestr);
186 B2INFO("aerogelsupport : " << m_aerosupport);
187 GearDir hapdparam(content, nodestr);
188 //for (const GearDir& runparam : content.getNodes(nodestr)) {
189 m_aerogeldx = hapdparam.getLength("aerogeldx", 0);
190 m_framedx = hapdparam.getLength("framedx", 0) * CLHEP::mm / Unit::mm ;
191 m_rotation1 = hapdparam.getDouble("rotation", 0);
192 m_configuration = hapdparam.getInt("setup", 0);
193 m_comment1 = hapdparam.getString("comment", "");
194
195
196 B2INFO("aerogeldx : " << m_aerogeldx);
197 B2INFO("framedx : " << m_framedx);
198 B2INFO("rotation : " << m_rotation1);
199 B2INFO("configuration : " << m_configuration);
200 B2INFO("comment : " << m_comment);
201 //}
202
203 GearDir setup(content, "setup");
204
205 createBtestGeometry(setup, topVolume);
206 }
207 }

◆ createAerogel()

G4Material * createAerogel ( const char * aeroname,
double rind,
double trl )
protected

create aerogel material

Definition at line 300 of file GeoARICHBtestCreator.cc.

301 {
302
303
304 G4double density = (RefractiveIndex - 1) / 0.21 * CLHEP::g / CLHEP::cm3;
305 B2INFO("Creating ARICH " << aeroname << " n=" << RefractiveIndex << " density=" << density / CLHEP::g * CLHEP::cm3 << " g/cm3");
306 Materials& materials = Materials::getInstance();
307 G4Material* _aerogel = new G4Material(aeroname, density, 4);
308 _aerogel->AddElement(materials.getElement("O"), 0.665);
309 _aerogel->AddElement(materials.getElement("H"), 0.042);
310 _aerogel->AddElement(materials.getElement("Si"), 0.292);
311 _aerogel->AddElement(materials.getElement("C"), 0.001);
312
313
314 const G4double AerogelAbsorbtionLength = 1000 * Unit::mm;
315
316 const G4int NBins = 40;
317 G4double MomentumBins[NBins];
318
319 G4double AerogelRindex[NBins];
320 G4double AerogelAbsorption[NBins];
321 G4double AerogelRayleigh[NBins];
322
323 G4double MaxPhotonEnergy = 5 * CLHEP::eV;
324 G4double MinPhotonEnergy = 1.5 * CLHEP::eV;
325
326 for (G4int i = 0; i < NBins; i++) {
327
328 const G4double energy = float(i) / NBins * (MaxPhotonEnergy - MinPhotonEnergy) + MinPhotonEnergy;
329
330 MomentumBins[i] = energy;
331 AerogelRindex[i] = RefractiveIndex;
332 AerogelAbsorption[i] = AerogelAbsorbtionLength;
333
334 const G4double Lambda0 = 400 * 1e-6 * CLHEP::mm;
335 const G4double Lambda = 1240 * CLHEP::eV / energy * 1e-6 * CLHEP::mm;
336 G4double x = Lambda / Lambda0;
337 AerogelRayleigh[i] = AerogelTransmissionLength * x * x * x * x;
338 }
339
340
341 G4MaterialPropertiesTable* AeroProperty = new G4MaterialPropertiesTable();
342 AeroProperty->AddProperty("RINDEX", MomentumBins, AerogelRindex, NBins);
343 AeroProperty->AddProperty("ABSLENGTH", MomentumBins, AerogelAbsorption, NBins);
344 AeroProperty->AddProperty("RAYLEIGH", MomentumBins, AerogelRayleigh, NBins);
345
346
347 _aerogel->SetMaterialPropertiesTable(AeroProperty);
348
349
350 return _aerogel;
351 }

◆ createBtestGeometry()

void createBtestGeometry ( const GearDir & content,
G4LogicalVolume & topVolume )
protected

Creation of the beamtest geometry.

Definition at line 354 of file GeoARICHBtestCreator.cc.

355 {
356
357 B2INFO("ARICH Btest geometry will be built.");
358 ARICHGeometryPar* m_arichgp = ARICHGeometryPar::Instance();
359
360 ARICHBtestGeometryPar* m_arichbtgp = ARICHBtestGeometryPar::Instance();
361
362 // experimental box
363
364 GearDir boxParams(content, "ExperimentalBox");
365 double xBox = boxParams.getLength("xSize") * CLHEP::mm / Unit::mm;
366 double yBox = boxParams.getLength("ySize") * CLHEP::mm / Unit::mm;
367 double zBox = boxParams.getLength("zSize") * CLHEP::mm / Unit::mm;
368
369 double xoffset = boxParams.getLength("beamcenter/x") * CLHEP::mm / Unit::mm;
370 double yoffset = boxParams.getLength("beamcenter/y") * CLHEP::mm / Unit::mm;
371 double zoffset = boxParams.getLength("beamcenter/z") * CLHEP::mm / Unit::mm - zBox / 2.;
372 G4ThreeVector roffset(xoffset, yoffset, zoffset);
373
374 ROOT::Math::XYZVector sh(boxParams.getLength("beamcenter/x"), boxParams.getLength("beamcenter/y"),
375 boxParams.getLength("beamcenter/z") - boxParams.getLength("zSize") / 2.);
376 m_arichbtgp->setOffset(sh);
377
378 string boxMat = boxParams.getString("material");
379 G4Material* boxMaterial = Materials::get(boxMat);
380 G4Box* expBox = new G4Box("ExperimentalBox", xBox / 2., yBox / 2., zBox / 2.);
381 G4LogicalVolume* topVolume = new G4LogicalVolume(expBox, boxMaterial, "ARICH.experimentalbox");
382 new G4PVPlacement(G4Transform3D(), topVolume, "ARICH.experimentalbox", &topWorld, false, 1);
383 setVisibility(*topVolume, false);
384
385 ROOT::Math::XYZVector trackingshift(content.getLength("tracking/shift/x"),
386 content.getLength("tracking/shift/y"),
387 content.getLength("tracking/shift/z"));
388
389 char mnodestr[256];
390 sprintf(mnodestr, "tracking/shift/run[@id=\"%d\"]", m_runno);
391 if (content.exists(mnodestr)) {
392 GearDir runtrackingshift(content, mnodestr);
393 trackingshift.SetXYZ(runtrackingshift.getLength("x"),
394 runtrackingshift.getLength("y"),
395 runtrackingshift.getLength("z"));
396 }
397 m_arichbtgp->setTrackingShift(trackingshift);
398 ARICHTracking* m_mwpc = new ARICHTracking[4];
399 m_arichbtgp->setMwpc(m_mwpc);
400 for (const GearDir& mwpc : content.getNodes("tracking/mwpc")) {
401 double x = mwpc.getLength("size/x") * CLHEP::mm / Unit::mm;
402 double y = mwpc.getLength("size/y") * CLHEP::mm / Unit::mm;
403 double z = mwpc.getLength("size/z") * CLHEP::mm / Unit::mm;
404
405 double px = mwpc.getLength("position/x") * CLHEP::mm / Unit::mm;
406 double py = mwpc.getLength("position/y") * CLHEP::mm / Unit::mm;
407 double pz = mwpc.getLength("position/z") * CLHEP::mm / Unit::mm;
408
409 G4Box* mwpcBox = new G4Box("MwpcBox", x / 2., y / 2., z / 2.);
410 G4LogicalVolume* mwpcVol = new G4LogicalVolume(mwpcBox, Materials::get(mwpc.getString("material")), "ARICH.mwpc");
411 new G4PVPlacement(G4Transform3D(G4RotationMatrix(), G4ThreeVector(px, py, pz) + roffset), mwpcVol, "ARICH.mwpc", topVolume, false,
412 1);
413 //setVisibility(*mwpc, true);
414
415 int id = mwpc.getInt("@id", -1);
416 B2INFO("GeoARICHBtestCreator::" << LogVar("MWPC ID", id));
417 if (id < 4 && id >= 0) {
418 m_mwpc[id].tdc[0] = mwpc.getInt("tdc/y/up");
419 m_mwpc[id].tdc[1] = mwpc.getInt("tdc/y/down");
420 m_mwpc[id].tdc[2] = mwpc.getInt("tdc/x/left");
421 m_mwpc[id].tdc[3] = mwpc.getInt("tdc/x/right");
422 m_mwpc[id].atdc = mwpc.getInt("tdc/anode", 0);
423 m_mwpc[id].slp[0] = mwpc.getDouble("slope/x");
424 m_mwpc[id].slp[1] = mwpc.getDouble("slope/y");
425 m_mwpc[id].offset[0] = mwpc.getDouble("offset/x");
426 m_mwpc[id].offset[1] = mwpc.getDouble("offset/y");
427 m_mwpc[id].cutll[0] = mwpc.getInt("tdccut/y/min");
428 m_mwpc[id].cutll[1] = mwpc.getInt("tdccut/x/min");
429 m_mwpc[id].cutul[0] = mwpc.getInt("tdccut/y/max");
430 m_mwpc[id].cutul[1] = mwpc.getInt("tdccut/x/max");
431 m_mwpc[id].pos[0] = mwpc.getDouble("position/x");
432 m_mwpc[id].pos[1] = mwpc.getDouble("position/y");
433 m_mwpc[id].pos[2] = mwpc.getDouble("position/z");
434 // m_mwpc[id].Print();
435 }
436
437 }
438 // physical position of the hapd channels
439
440 istringstream mapstream;
441 double mx, my;
442 mapstream.str(content.getString("hapdmap"));
443 while (mapstream >> mx >> my) {
444 m_arichbtgp->AddHapdChannelPositionPair(mx, my);
445 }
446 mapstream.clear();
447
448 // mapping of the electronic channels
449 int ipx, ipy;
450 mapstream.str(content.getString("hapdchmap"));
451 while (mapstream >> ipx >> ipy) {
452 m_arichbtgp->AddHapdElectronicMapPair(ipx, ipy);
453 }
454 // experimental frame consisting of detector plane, aerogel and mirrors
455
456 GearDir frameParams(content, "Frame");
457 double xFrame = frameParams.getLength("xSize") * CLHEP::mm / Unit::mm;
458 double yFrame = frameParams.getLength("ySize") * CLHEP::mm / Unit::mm;
459 double zFrame = frameParams.getLength("zSize") * CLHEP::mm / Unit::mm;
460 string envMat = frameParams.getString("material");
461
462 double px = frameParams.getLength("position/x") * CLHEP::mm / Unit::mm;
463 double py = frameParams.getLength("position/y") * CLHEP::mm / Unit::mm;
464 double pz = frameParams.getLength("position/z") * CLHEP::mm / Unit::mm;
465
466 G4Material* envMaterial = Materials::get(envMat);
467
468
469 G4Box* envBox = new G4Box("FrameBox", xFrame / 2., yFrame / 2., zFrame / 2.);
470 G4LogicalVolume* lenvBox = new G4LogicalVolume(envBox, envMaterial, "ARICH.frame");
471 G4ThreeVector frameOrigin0(m_framedx + px, py, pz); // rotation point of the detector frame wrt beamcenter
472 G4ThreeVector frameOrigin = frameOrigin0 + roffset;
473 G4RotationMatrix frameRotation;
474 frameRotation.rotateY(-m_rotation1 * CLHEP::degree);
475 G4Transform3D frameTransformation = G4Transform3D(frameRotation, frameOrigin);
476
477 new G4PVPlacement(frameTransformation, lenvBox, "ARICH.frame", topVolume, false, 1);
478 //setVisibility(*lenvBox, false);
479
480 ROOT::Math::XYZVector rotationCenter(frameOrigin0.x() * Unit::mm / CLHEP::mm,
481 frameOrigin0.y() * Unit::mm / CLHEP::mm,
482 frameOrigin0.z() * Unit::mm / CLHEP::mm);
483 m_arichbtgp->setFrameRotation(m_rotation1 * CLHEP::degree);
484 m_arichbtgp->setRotationCenter(rotationCenter);
485
486
487 char nodestr[256];
488 B2INFO(content.getPath());
489 sprintf(nodestr, "PhotonDetector/setup[@id=\"%d\"]", m_configuration);
490 GearDir hapdcontent(content, nodestr);
491 B2INFO(hapdcontent.getPath());
492
493
494
495 char mirrornodestr[256];
496 sprintf(mirrornodestr, "Mirrors/setup[@id=\"%s\"]", m_mirrorID.c_str());
497
498 GearDir mirrorcontent(content, mirrornodestr);
499 B2INFO(mirrorcontent.getPath());
500
501 // detectors
502 m_arichgp->Initialize(hapdcontent, mirrorcontent);
503
504
505 GearDir moduleParam(hapdcontent, "Detector/Module");
506 G4LogicalVolume* detModule = buildModule(moduleParam);
507
508 double detZpos = hapdcontent.getLength("Detector/Plane/zPosition") * CLHEP::mm / Unit::mm;
509 double detThick = hapdcontent.getLength("Detector/Module/moduleZSize") * CLHEP::mm / Unit::mm;
510 int nModules = m_arichgp->getNMCopies();
511
512 for (int i = 1; i <= nModules; i++) {
513 G4ThreeVector origin = m_arichgp->getOriginG4(i);
514 origin.setZ(detZpos + detThick / 2.);
515 double angle = m_arichgp->getModAngle(i);
516 G4RotationMatrix Ra;
517 Ra.rotateZ(angle);
518 G4Transform3D trans = G4Transform3D(Ra, origin);
519 new G4PVPlacement(G4Transform3D(Ra, origin), detModule, "detModule", lenvBox, false, i);
520 B2INFO(nodestr << "Module " << i << " is build ");
521 }
522 // mask hot channels
523 int npx = m_arichgp->getDetectorXPadNumber();
524 for (const double& ch : hapdcontent.getArray("HotChannels")) {
525 int channelID = (int) ch;
526 int moduleID = (npx) ? channelID / (npx * npx) : 0;
527 channelID %= (npx * npx);
528 m_arichgp->setActive(moduleID, channelID, false);
529 B2INFO("HotChannel " << ch << " : Module " << moduleID << "channelID " << channelID << " disabled");
530 }
531 // mask dead channels
532 for (const double& ch : hapdcontent.getArray("DeadChannels")) {
533 int channelID = (int) ch;
534 int moduleID = (npx) ? channelID / (npx * npx) : 0;
535 channelID %= (npx * npx);
536 m_arichgp->setActive(moduleID, channelID, false);
537 B2INFO("DeadChannel " << ch << " : Module " << moduleID << "channelID " << channelID << " disabled");
538 }
539 // place aerogel tiles
540 GearDir aerogelParam(content, "Aerogel");
541 double sizeX = aerogelParam.getLength("tileXSize") * CLHEP::mm / Unit::mm;
542 double sizeY = aerogelParam.getLength("tileYSize") * CLHEP::mm / Unit::mm;
543 double posX = aerogelParam.getLength("tileXPos") * CLHEP::mm / Unit::mm;
544 double posY = aerogelParam.getLength("tileYPos") * CLHEP::mm / Unit::mm;
545 double posZ = aerogelParam.getLength("tileZPos") * CLHEP::mm / Unit::mm;
546 double posZ0 = posZ;
547 double meanrefind = 0;
548 double meantrlen = 0;
549
550 // get parameter from python script
551 [[clang::suppress]]
552 PyObject* m = PyImport_AddModule(strdup("__main__"));
553 if (m) {
554 int averageagel = 0;
555 [[clang::suppress]]
556 PyObject* v = PyObject_GetAttrString(m, strdup("averageagel"));
557 if (v) {
558 averageagel = PyLong_AsLong(v);
559 Py_DECREF(v);
560 }
561 B2INFO("Python averageagel = " << averageagel);
562 m_arichbtgp->setAverageAgel(averageagel > 0);
563 }
564
565 for (unsigned int ilayer = 0; ilayer < m_agelthickness.size(); ilayer++) {
566 char aeroname[100];
567 sprintf(aeroname, "Aerogel%u", ilayer + 1);
568 G4Material* tileMaterial = createAerogel(aeroname, m_agelrefind[ilayer], m_ageltrlen[ilayer]);
569 double sizeZ = m_agelthickness[ilayer] * CLHEP::mm / Unit::mm;
570
571 if (!m_arichbtgp->getAverageAgel()) {
572 m_arichgp->setAeroRefIndex(ilayer, m_agelrefind[ilayer]);
573 m_arichgp->setAerogelZPosition(ilayer, (posZ - zFrame / 2.) * Unit::mm / CLHEP::mm);
574 m_arichgp->setAerogelThickness(ilayer, sizeZ * Unit::mm / CLHEP::mm);
575 m_arichgp->setAeroTransLength(ilayer, m_ageltrlen[ilayer]);
576 }
577
578 meantrlen += sizeZ / m_ageltrlen[ilayer];
579 meanrefind += m_agelrefind[ilayer];
580 G4Box* tileBox = new G4Box("tileBox", sizeX / 2., sizeY / 2., sizeZ / 2.);
581 G4LogicalVolume* lTile = new G4LogicalVolume(tileBox, tileMaterial, "Tile", 0, ilayer == 0 ? m_sensitiveAero : 0);
582 setColor(*lTile, "rgb(0.0, 1.0, 1.0,1.0)");
583 G4Transform3D trans = G4Translate3D(posX, posY, posZ + sizeZ / 2. - zFrame / 2.);
584 new G4PVPlacement(trans, lTile, "ARICH.tile", lenvBox, false, ilayer + 1);
585 posZ += sizeZ;
586 }
587 if (m_arichbtgp->getAverageAgel() && m_agelthickness.size()) {
588 B2INFO("Average aerogel will be used in the reconstruction ");
589 m_arichgp->setAeroRefIndex(0, meanrefind / m_agelthickness.size());
590 m_arichgp->setAerogelZPosition(0, (posZ0 - zFrame)* Unit::mm / CLHEP::mm);
591 m_arichgp->setAerogelThickness(0, posZ * Unit::mm / CLHEP::mm);
592 if (meantrlen > 0 && posZ > 0) meantrlen = 1 / meantrlen / posZ;
593 m_arichgp->setAeroTransLength(0, meantrlen);
594 }
595
596
597 // place mirrors
598 GearDir mirrorsParam(mirrorcontent, "Mirrors");
599 double height = mirrorsParam.getLength("height") * CLHEP::mm / Unit::mm;
600 double width = mirrorsParam.getLength("width") * CLHEP::mm / Unit::mm;
601 double thickness = mirrorsParam.getLength("thickness") * CLHEP::mm / Unit::mm;
602 string mirrMat = mirrorsParam.getString("material");
603 G4Material* mirrMaterial = Materials::get(mirrMat);
604 G4Box* mirrBox = new G4Box("mirrBox", thickness / 2., height / 2., width / 2.);
605 G4LogicalVolume* lmirror = new G4LogicalVolume(mirrBox, mirrMaterial, "mirror");
606
607 Materials& materials = Materials::getInstance();
608 GearDir surface(mirrorsParam, "Surface");
609 G4OpticalSurface* optSurf = materials.createOpticalSurface(surface);
610 new G4LogicalSkinSurface("mirrorsSurface", lmirror, optSurf);
611 int iMirror = 0;
612 for (const GearDir& mirror : mirrorsParam.getNodes("Mirror")) {
613 double xpos = mirror.getLength("xPos") * CLHEP::mm / Unit::mm;
614 double ypos = mirror.getLength("yPos") * CLHEP::mm / Unit::mm;
615 double zpos = mirror.getLength("zPos") * CLHEP::mm / Unit::mm;
616 double angle = mirror.getAngle("angle") / Unit::rad;
617 G4ThreeVector origin(xpos, ypos, zpos + width / 2. - zFrame / 2.);
618 G4RotationMatrix Ra;
619 Ra.rotateZ(angle);
620 G4Transform3D trans = G4Transform3D(Ra, origin);
621 new G4PVPlacement(G4Transform3D(Ra, origin), lmirror, "ARICH.mirror", lenvBox, false, iMirror);
622 iMirror++;
623 }
624 m_arichgp->Print();
625 m_arichbtgp->Print();
626 }
void setVisibility(G4LogicalVolume &volume, bool visible)
Helper function to quickly set the visibility of a given volume.
Definition utilities.cc:108

◆ 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 GeoARICHCreator, BeamabortCreator, GeoBKLMCreator, GeoCDCCreator, GeoCDCCreatorReducedCDC, GeoCOILCreator, GeoECLCreator, GeoEKLMCreator, GeoMagneticField, GeoBeamPipeCreator, GeoCryostatCreator, GeoFarBeamLineCreator, GeoKLMCreator, MyDBCreator, GeoPXDCreator, 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 or 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, GeoBKLMCreator, GeoCDCCreator, GeoCDCCreatorReducedCDC, GeoCOILCreator, GeoECLCreator, GeoEKLMCreator, GeoMagneticField, GeoBeamPipeCreator, GeoCryostatCreator, GeoFarBeamLineCreator, GeoKLMCreator, MyDBCreator, GeoPXDCreator, GeoServiceMaterialCreator, GeoSTRCreator, GeoSVDCreator, GeoTOPCreator, GeoHeavyMetalShieldCreator, and GeoVXDServiceCreator.

Definition at line 24 of file CreatorBase.cc.

24{}

◆ getAvgRINDEX()

double getAvgRINDEX ( G4Material * material)
protected

Get the average refractive index if the material.

Definition at line 209 of file GeoARICHBtestCreator.cc.

210 {
211 G4MaterialPropertiesTable* mTable = material->GetMaterialPropertiesTable();
212 if (!mTable) return 0;
213 G4MaterialPropertyVector* mVector = mTable->GetProperty("RINDEX");
214 if (!mVector) return 0;
215 G4bool b;
216 return mVector->GetValue(2 * Unit::eV / Unit::MeV, b);
217 }

Member Data Documentation

◆ m_aerogeldx

double m_aerogeldx
private

shift of the aerogel center

Definition at line 109 of file GeoARICHBtestCreator.h.

◆ m_aerogelID

std::string m_aerogelID
private

ID of the aerogel configuration setup.

Definition at line 88 of file GeoARICHBtestCreator.h.

◆ m_aerosupport

int m_aerosupport
private

Type of aerogel support - not used at the moment.

Definition at line 107 of file GeoARICHBtestCreator.h.

◆ m_agelrefind

std::vector<double> m_agelrefind
private

vector of aerogel refractive indices

Definition at line 120 of file GeoARICHBtestCreator.h.

◆ m_agelthickness

std::vector<double> m_agelthickness
private

vector of aerogel thicknesses

Definition at line 122 of file GeoARICHBtestCreator.h.

◆ m_ageltrlen

std::vector<double> m_ageltrlen
private

vector of aerogel transmission lengths

Definition at line 124 of file GeoARICHBtestCreator.h.

◆ m_author

std::string m_author
private

Beamtest runlog record author.

Definition at line 80 of file GeoARICHBtestCreator.h.

◆ m_comment

std::string m_comment
private

comment in the runlog

Definition at line 102 of file GeoARICHBtestCreator.h.

◆ m_comment1

std::string m_comment1
private

tbc

Definition at line 117 of file GeoARICHBtestCreator.h.

◆ m_configuration

int m_configuration
private

configuration number of the HAPD

Definition at line 115 of file GeoARICHBtestCreator.h.

◆ m_daqqa

std::string m_daqqa
private

classification of the run

Definition at line 100 of file GeoARICHBtestCreator.h.

◆ m_datum

std::string m_datum
private

datum of the runlog

Definition at line 104 of file GeoARICHBtestCreator.h.

◆ m_framedx

double m_framedx
private

shift of the frame

Definition at line 111 of file GeoARICHBtestCreator.h.

◆ m_hapdID

std::string m_hapdID
private

ID of the HAPD configuration setup.

Definition at line 86 of file GeoARICHBtestCreator.h.

◆ m_mirrorID

std::string m_mirrorID
private

ID of the mirror configuration setup.

Definition at line 90 of file GeoARICHBtestCreator.h.

◆ m_mytype

std::string m_mytype
private

type of the run

Definition at line 98 of file GeoARICHBtestCreator.h.

◆ m_neve

int m_neve
private

Number of event in the beamtest run.

Definition at line 82 of file GeoARICHBtestCreator.h.

◆ m_rotation

double m_rotation
private

rotation angle of the setup

Definition at line 92 of file GeoARICHBtestCreator.h.

◆ m_rotation1

double m_rotation1
private

rotation angle of the frame

Definition at line 113 of file GeoARICHBtestCreator.h.

◆ m_runno

int m_runno
private

Beamtest Run number.

Definition at line 78 of file GeoARICHBtestCreator.h.

◆ m_runtype

std::string m_runtype
private

Type of the beamtest run.

Definition at line 84 of file GeoARICHBtestCreator.h.

◆ m_rx

double m_rx
private

x shift of the prototype ARICH frame

Definition at line 94 of file GeoARICHBtestCreator.h.

◆ m_ry

double m_ry
private

y shift of the prototype ARICH frame

Definition at line 96 of file GeoARICHBtestCreator.h.

◆ m_sensitive

SensitiveDetector* m_sensitive
protected

pointer to the sensitive detector

Definition at line 69 of file GeoARICHBtestCreator.h.

◆ m_sensitiveAero

SensitiveAero* m_sensitiveAero
protected

pointer to the sesnitive aerogel

Definition at line 71 of file GeoARICHBtestCreator.h.


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