ATLAS Offline Software
Loading...
Searching...
No Matches
ForwardRegionGeoModelFactory Class Reference

#include <ForwardRegionGeoModelFactory.h>

Inheritance diagram for ForwardRegionGeoModelFactory:
Collaboration diagram for ForwardRegionGeoModelFactory:

Public Member Functions

 ForwardRegionGeoModelFactory (StoreGateSvc *pDetStore, const PFWD_CONFIGURATION pConfig)
 ~ForwardRegionGeoModelFactory ()
virtual void create (GeoPhysVol *world)
virtual const ForwardRegionGeoModelManagergetDetectorManager () const

Private Member Functions

void DefineMaterials ()
void constructElements (GeoPhysVol *fwrPhys, std::vector< std::vector< std::string > > loadedDataFile, int beam)
GeoPhysVol * insertMagnetEnvelope (const std::string &name, double x, double y, double z, double rotationAngle, double diameter, double halfL, double dL, GeoPhysVol *fwrPhys)
void insertCircularElement (const std::string &name, double x, double y, double z, double rotationAngle, double xAperture, double yAperture, double halfL, double dL, double tubeThickness, GeoPhysVol *fwrPhys)
void insertEllipticalElement (const std::string &name, double x, double y, double z, double rotationAngle, double xAperture, double yAperture, double halfL, double dL, double tubeThickness, GeoPhysVol *fwrPhys)
void insertXRecticircularElement (const std::string &name, double x, double y, double z, double rotationAngle, double xAperture, double yAperture, double halfL, double dL, double tubeThickness, GeoPhysVol *fwrPhys)
void insertYRecticircularElement (const std::string &name, double x, double y, double z, double rotationAngle, double xAperture, double yAperture, double halfL, double dL, double tubeThickness, GeoPhysVol *fwrPhys)
void insertTrousersElement (const std::string &name, double x, double y, double z, double rotationAngle, GeoPhysVol *fwrPhys)
void insertTCLElement (const std::string &name, double x, double y, double z, GeoPhysVol *fwrPhys, double TCLJawDistO, double TCLJawDistI, bool tungstenInsteadOfCopper=false)
std::vector< std::vector< std::string > > loadDataFile (const std::string &fileName, int cols)
template<class T>
std::string num2str (T)
template<typename T>
int sgn (T val)
const ForwardRegionGeoModelFactoryoperator= (const ForwardRegionGeoModelFactory &right)
 ForwardRegionGeoModelFactory (const ForwardRegionGeoModelFactory &right)

Private Attributes

StoreGateSvcm_detectorStore
std::map< std::string, const GeoMaterial * > m_MapMaterials
FWD_CONFIGURATION m_Config
FWDMg_CONFIGURATION m_MagConfig
ToolHandle< IForwardRegionPropertiesm_properties
ForwardRegionGeoModelManagerm_detectorManager

Detailed Description

Definition at line 49 of file ForwardRegionGeoModelFactory.h.

Constructor & Destructor Documentation

◆ ForwardRegionGeoModelFactory() [1/2]

ForwardRegionGeoModelFactory::ForwardRegionGeoModelFactory ( StoreGateSvc * pDetStore,
const PFWD_CONFIGURATION pConfig )

Definition at line 61 of file ForwardRegionGeoModelFactory.cxx.

62 :m_detectorStore(detStore),
63 m_properties("ForwardRegionProperties")
64{
65 m_detectorManager = NULL;
66 MsgStream LogStream(Athena::getMessageSvc(), "ForwardRegionGeoModel::ForwardRegionGeoModel()");
67
68 m_Config = *pConfig;
69
70 if(m_properties.retrieve().isFailure()){
71 LogStream << MSG::ERROR << ": Failed to load magnet properties" << endmsg;
72 return;
73 }
74
75 m_MagConfig = *(m_properties->getConf());
76}
#define endmsg
ToolHandle< IForwardRegionProperties > m_properties
ForwardRegionGeoModelManager * m_detectorManager
IMessageSvc * getMessageSvc(bool quiet=false)

◆ ~ForwardRegionGeoModelFactory()

ForwardRegionGeoModelFactory::~ForwardRegionGeoModelFactory ( )

Definition at line 79 of file ForwardRegionGeoModelFactory.cxx.

80{
81
82}

◆ ForwardRegionGeoModelFactory() [2/2]

ForwardRegionGeoModelFactory::ForwardRegionGeoModelFactory ( const ForwardRegionGeoModelFactory & right)
private

Member Function Documentation

◆ constructElements()

void ForwardRegionGeoModelFactory::constructElements ( GeoPhysVol * fwrPhys,
std::vector< std::vector< std::string > > loadedDataFile,
int beam )
private

Definition at line 211 of file ForwardRegionGeoModelFactory.cxx.

212{
213 //-------------------------------------------------------------------------------------
214 // Construction of geometry from geometry file
215
216 // indexes
217 int name, zStart, zEnd, type, xAperture, yAperture, xStart, xEnd, yStart, yEnd, tubeThickness;
218 name = 0;
219 type = 1;
220 zStart = 4;
221 zEnd = 5;
222 xAperture = 2;
223 yAperture = 3;
224 xStart = 6;
225 xEnd = 7;
226 yStart = 8;
227 yEnd = 9;
228 tubeThickness = 10;
229
230 int lDFSize = loadedDataFile.size();
231
232 // apply shifts of magnets defined by magnets properties in JO
233 for(int i=0; i < lDFSize; i++)
234 {
235 // get start and end points defined in JO
236 HepGeom::Point3D<double> pointMagStart;
237 HepGeom::Point3D<double> pointMagEnd;
238 if(m_properties.retrieve().isSuccess()) m_properties->getMagTransforms(loadedDataFile[i][name],beam,pointMagStart,pointMagEnd);
239
240 // are points defined (non-zero)? If not, shifts will not apply
241 bool pointsDefined = !(pointMagStart.distance2() == 0 || pointMagEnd.distance2() == 0);
242
243 if(pointsDefined)
244 {
245
246 // overlap correction for x rotation
247 double startZ = pointMagStart[2];
248 double endZ = pointMagEnd[2];
249 double startX = pointMagStart[0];
250 double endX = pointMagEnd[0];
251 double rotationAngle = atan2(endX - startX,endZ - startZ);
252 double r = atof(loadedDataFile[i][xAperture].c_str())*Gaudi::Units::mm/2;
253 double dL = abs(r*tan(rotationAngle))+0.2*Gaudi::Units::mm;
254
255
256 // move start and end points of the magnet element and neighbour elemens accordingly
257 // move (resize) neighbours only in z (needed to avoid overlaps)
258 loadedDataFile[i][xStart] = num2str(pointMagStart[0]/1000);
259 loadedDataFile[i][yStart] = num2str(pointMagStart[1]/1000);
260 loadedDataFile[i][zStart] = num2str(pointMagStart[2]/1000);
261 loadedDataFile[i-1][zEnd] = num2str(sgn(pointMagStart[2])*(abs(pointMagStart[2])-dL)/1000);
262
263 loadedDataFile[i][xEnd] = num2str(pointMagEnd[0]/1000);
264 loadedDataFile[i][yEnd] = num2str(pointMagEnd[1]/1000);
265 loadedDataFile[i+1][zStart] = num2str(sgn(pointMagEnd[2])*(abs(pointMagEnd[2])+dL)/1000);
266 loadedDataFile[i][zEnd] = num2str(pointMagEnd[2]/1000);
267
268 }
269 }
270
271 double x,y,z,halfL,rotationAngle,r,dL,startZ,endZ,startX,endX,startY,endY;
272
273 // ################ ELEMENTS ############################
274
275 // --------------- elements cycle -----------------
276 for(int i=0; i < lDFSize; i++)
277 {
278 startZ = atof(loadedDataFile[i][zStart].c_str())*Gaudi::Units::m;
279 endZ = atof(loadedDataFile[i][zEnd].c_str())*Gaudi::Units::m;
280 startX = atof(loadedDataFile[i][xStart].c_str())*Gaudi::Units::m;
281 endX = atof(loadedDataFile[i][xEnd].c_str())*Gaudi::Units::m;
282 startY = atof(loadedDataFile[i][yStart].c_str())*Gaudi::Units::m;
283 endY = atof(loadedDataFile[i][yEnd].c_str())*Gaudi::Units::m;
284
285 // translation of element
286 x = (startX + endX)/2;
287 y = (startY + endY)/2;
288 z = (startZ + endZ)/2;
289
290 // absolute rotation of element
291 //rotationAngle_old = rotationAngle;
292 rotationAngle = atan2(endX - startX,endZ - startZ);
293
294 // half-length of element
295 halfL = sqrt((endX - startX)*(endX - startX) + (endZ - startZ)*(endZ - startZ))/2;
296
297 r = atof(loadedDataFile[i][xAperture].c_str())*Gaudi::Units::mm/2;
298
299 // overlap correction
300 dL = abs(r*tan(rotationAngle))+0.2*Gaudi::Units::mm;
301
302 // do not shorten magnetic volumes
303 if(loadedDataFile[i][name].find("Mag") != std::string::npos)
304 dL = 0;
305
306 // construction of element
307
308 // circular aperture
309 if(atoi(loadedDataFile[i][type].c_str()) == 0){
310 // envelope to allow tracking with G4TrackAction
311 if(loadedDataFile[i][name] == "VCDBP.7R1.B"){
312 GeoPhysVol* trackEnv = insertMagnetEnvelope(loadedDataFile[i][name], x, y, z, rotationAngle, 100*Gaudi::Units::mm, halfL, dL, fwrPhys);
313 insertCircularElement(loadedDataFile[i][name], x, y, z, rotationAngle, atof(loadedDataFile[i][xAperture].c_str()), atof(loadedDataFile[i][yAperture].c_str()), halfL, dL, atof(loadedDataFile[i][tubeThickness].c_str()), trackEnv);
314 }
315 else
316 insertCircularElement(loadedDataFile[i][name], x, y, z, rotationAngle, atof(loadedDataFile[i][xAperture].c_str()), atof(loadedDataFile[i][yAperture].c_str()), halfL, dL, atof(loadedDataFile[i][tubeThickness].c_str()), fwrPhys);
317 }
318
319 // special volumes
320 if(atoi(loadedDataFile[i][type].c_str()) == 4){
321 if(loadedDataFile[i][name] == "VCTYF.A4R1.X") // Trousers -- transition from 1 to 2 beampipes
322 insertTrousersElement(loadedDataFile[i][name], x, y, z, rotationAngle, fwrPhys);
323 else if(loadedDataFile[i][name] == "TCL.5R1.B1") // TCL5 collimator
324 insertTCLElement(loadedDataFile[i][name], x, y, z, fwrPhys, (beam == 1 ? m_Config.TCL5JawDistB1O : m_Config.TCL5JawDistB2O), (beam == 1 ? m_Config.TCL5JawDistB1I : m_Config.TCL5JawDistB2I));
325 else if(m_Config.buildTCL4 && loadedDataFile[i][name] == "VCDSS.4R1.B") // TCL4 collimator
326 insertTCLElement(loadedDataFile[i][name], x, y, z, fwrPhys, (beam == 1 ? m_Config.TCL4JawDistB1O : m_Config.TCL4JawDistB2O), (beam == 1 ? m_Config.TCL4JawDistB1I : m_Config.TCL4JawDistB2I));
327 else if(m_Config.buildTCL6 && loadedDataFile[i][name] == "TCL6") // TCL6 collimator
328 insertTCLElement(loadedDataFile[i][name], x, y, z, fwrPhys, (beam == 1 ? m_Config.TCL6JawDistB1O : m_Config.TCL6JawDistB2O), (beam == 1 ? m_Config.TCL6JawDistB1I : m_Config.TCL6JawDistB2I), true);
329
330 // aproximate rest by circular apperture
331 else
332 insertCircularElement(loadedDataFile[i][name], x, y, z, rotationAngle, atof(loadedDataFile[i][xAperture].c_str()), atof(loadedDataFile[i][yAperture].c_str()), halfL, dL, atof(loadedDataFile[i][tubeThickness].c_str()), fwrPhys);
333 }
334
335 GeoPhysVol* magEnv;
336
337 // elliptical aperture
338 if(atoi(loadedDataFile[i][type].c_str()) == 1) {
339 magEnv = insertMagnetEnvelope(loadedDataFile[i][name], x, y, z, rotationAngle, 20*Gaudi::Units::cm, halfL, dL, fwrPhys);
340 insertEllipticalElement(loadedDataFile[i][name], x, y, z, rotationAngle, atof(loadedDataFile[i][xAperture].c_str()), atof(loadedDataFile[i][yAperture].c_str()), halfL, dL, atof(loadedDataFile[i][tubeThickness].c_str()), magEnv);
341 }
342
343
344 double magDiam = 19.4*Gaudi::Units::cm;
345 if(loadedDataFile[i][name].find("Mag") != std::string::npos)
346 magDiam= 19.4*Gaudi::Units::cm;
347 if(loadedDataFile[i][name] == "LQXAA.1R1MagQ1" || loadedDataFile[i][name] == "LQXAG.3R1MagQ3")
348 magDiam = 48*Gaudi::Units::cm;
349 if(loadedDataFile[i][name] == "LQXBA.2R1MagQ2a" || loadedDataFile[i][name] == "LQXBA.2R1MagQ2b")
350 magDiam = 52*Gaudi::Units::cm;
351 //else magDiam = std::max(atof(loadedDataFile[i][xAperture].c_str()), atof(loadedDataFile[i][yAperture].c_str()))+2*atof(loadedDataFile[i][tubeThickness].c_str());
352 //else magDiam = 19.4*Gaudi::Units::cm;
353
354 // rectcircular aperture with flats in x
355 if(atoi(loadedDataFile[i][type].c_str()) == 2) {
356 magEnv = insertMagnetEnvelope(loadedDataFile[i][name], x, y, z, rotationAngle, magDiam, halfL, dL, fwrPhys);
357 insertXRecticircularElement(loadedDataFile[i][name], x, y, z, rotationAngle, atof(loadedDataFile[i][xAperture].c_str()), atof(loadedDataFile[i][yAperture].c_str()), halfL, dL, atof(loadedDataFile[i][tubeThickness].c_str()), magEnv);
358 }
359
360 // rectcircular aperture with flats in y
361 if(atoi(loadedDataFile[i][type].c_str()) == 3) {
362 magEnv = insertMagnetEnvelope(loadedDataFile[i][name], x, y, z, rotationAngle, magDiam, halfL, dL, fwrPhys);
363 insertYRecticircularElement(loadedDataFile[i][name], x, y, z, rotationAngle, atof(loadedDataFile[i][xAperture].c_str()), atof(loadedDataFile[i][yAperture].c_str()), halfL, dL, atof(loadedDataFile[i][tubeThickness].c_str()), magEnv);
364 }
365 }
366 // ################ ELEMENTS - end ########################
367}
#define y
#define x
#define z
void insertTrousersElement(const std::string &name, double x, double y, double z, double rotationAngle, GeoPhysVol *fwrPhys)
GeoPhysVol * insertMagnetEnvelope(const std::string &name, double x, double y, double z, double rotationAngle, double diameter, double halfL, double dL, GeoPhysVol *fwrPhys)
void insertEllipticalElement(const std::string &name, double x, double y, double z, double rotationAngle, double xAperture, double yAperture, double halfL, double dL, double tubeThickness, GeoPhysVol *fwrPhys)
void insertYRecticircularElement(const std::string &name, double x, double y, double z, double rotationAngle, double xAperture, double yAperture, double halfL, double dL, double tubeThickness, GeoPhysVol *fwrPhys)
void insertTCLElement(const std::string &name, double x, double y, double z, GeoPhysVol *fwrPhys, double TCLJawDistO, double TCLJawDistI, bool tungstenInsteadOfCopper=false)
void insertCircularElement(const std::string &name, double x, double y, double z, double rotationAngle, double xAperture, double yAperture, double halfL, double dL, double tubeThickness, GeoPhysVol *fwrPhys)
void insertXRecticircularElement(const std::string &name, double x, double y, double z, double rotationAngle, double xAperture, double yAperture, double halfL, double dL, double tubeThickness, GeoPhysVol *fwrPhys)
int r
Definition globals.cxx:22
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:138
double atof(std::string_view str)
Converts a string into a double / float.
int atoi(std::string_view str)
Helper functions to unpack numbers decoded in string into integers and doubles The strings are requir...

◆ create()

void ForwardRegionGeoModelFactory::create ( GeoPhysVol * world)
virtual

Definition at line 370 of file ForwardRegionGeoModelFactory.cxx.

371{
372 m_detectorManager=new ForwardRegionGeoModelManager();
373
374 MsgStream LogStream(Athena::getMessageSvc(), "ForwardRegionGeoModel::create()");
375
376 LogStream << MSG::INFO << "Constructing forward region model" << endmsg;
377
379
380 // Load "geometry" files
381 std::vector<std::vector<std::string> > loadedDataFileR = this->loadDataFile("ForwardRegionGeoModel/LSS1Rout.csv",11);
382 std::vector<std::vector<std::string> > loadedDataFileL = this->loadDataFile("ForwardRegionGeoModel/LSS1Lout.csv",11);
383
384 double startZ,endZ;
385
386 if(m_Config.vp1Compatibility) startZ = 19.0*Gaudi::Units::m;
387 else startZ = 22.0*Gaudi::Units::m;
388 endZ = 268.904*Gaudi::Units::m;
389
390 //rotationAngle_old = 0;
391
392 // mother volume -- union of tubes, one for each side
393 //const GeoBox *fwrBox = new GeoBox(2*Gaudi::Units::m,0.5*Gaudi::Units::m,(endZ-startZ)/2);
394 const GeoTube *fwrTubeL = new GeoTube(0,2*Gaudi::Units::m,(endZ-startZ)/2);
395 GeoTube *fwrTubeR = new GeoTube(0,2*Gaudi::Units::m,(endZ-startZ)/2);
396 GeoTrf::Transform3D shiftL = GeoTrf::Translate3D(0,0,(endZ+startZ)/2);
397 GeoTrf::Transform3D shiftR = GeoTrf::Translate3D(0,0,-(endZ+startZ)/2);
398
399 const GeoShapeShift& fwrTube0 = (*fwrTubeL)<<shiftL;
400 const GeoShapeUnion& fwrTube1 = fwrTube0.add((*fwrTubeR)<<shiftR);
401
402 // cut out slots for ALFA
403 const GeoTube *alfa = new GeoTube(0, 2*Gaudi::Units::m, 500*Gaudi::Units::mm);
404 GeoTrf::Transform3D shiftAlfaL1 = GeoTrf::Translate3D(0,0,237388*Gaudi::Units::mm);
405 GeoTrf::Transform3D shiftAlfaR1 = GeoTrf::Translate3D(0,0,-237408*Gaudi::Units::mm);
406 GeoTrf::Transform3D shiftAlfaL2 = GeoTrf::Translate3D(0,0,(m_Config.ALFAInNewPosition ? m_Config.newPosB7L1 : 241528*Gaudi::Units::mm));
407 GeoTrf::Transform3D shiftAlfaR2 = GeoTrf::Translate3D(0,0,(m_Config.ALFAInNewPosition ? m_Config.newPosB7R1 :-241548*Gaudi::Units::mm));
408 const GeoShapeSubtraction& fwrTube2 = fwrTube1.subtract((*alfa)<<shiftAlfaL1).subtract((*alfa)<<shiftAlfaL2).subtract((*alfa)<<shiftAlfaR1).subtract((*alfa)<<shiftAlfaR2);
409
410 // cut out slots for AFP
411 const GeoTube *afp = new GeoTube(0, 2.5*Gaudi::Units::m, 280*Gaudi::Units::mm);
412 const GeoTube *afp2 = new GeoTube(0, 2.5*Gaudi::Units::m, 580*Gaudi::Units::mm);
413 GeoTrf::Transform3D shiftAfpL1 = GeoTrf::Translate3D(0,0,m_Config.posAFPL1);
414 GeoTrf::Transform3D shiftAfpR1 = GeoTrf::Translate3D(0,0,m_Config.posAFPR1);
415 GeoTrf::Transform3D shiftAfpL2 = GeoTrf::Translate3D(0,0,m_Config.posAFPL2);
416 GeoTrf::Transform3D shiftAfpR2 = GeoTrf::Translate3D(0,0,m_Config.posAFPR2);
417 const GeoShapeSubtraction& fwrTube3 = fwrTube2.subtract((*afp)<<shiftAfpL1).subtract((*afp)<<shiftAfpR1).subtract((*afp2)<<shiftAfpL2).subtract((*afp2)<<shiftAfpR2);
418
419 // cut out slots for ZDC
420 const GeoBox *zdc = new GeoBox( 9.1*Gaudi::Units::cm/2.0 ,18.1*Gaudi::Units::cm/2.0 , 94.4*Gaudi::Units::cm/2.0);
421 GeoTrf::Transform3D shiftZdcL1 = GeoTrf::Translate3D(0,0, m_Config.posZDC1);
422 GeoTrf::Transform3D shiftZdcR1 = GeoTrf::Translate3D(0,0, m_Config.posZDC2);
423 const GeoShapeSubtraction& fwrTube = fwrTube3.subtract((*zdc)<<shiftZdcL1).subtract((*zdc)<<shiftZdcR1);
424
425
426 const GeoLogVol *fwrLog = new GeoLogVol("ForwardRegionGeoModel", &fwrTube, m_MapMaterials[std::string("std::Vacuum")]);
427 GeoPhysVol *fwrPhys = new GeoPhysVol(fwrLog);
428 GeoNameTag *tag = new GeoNameTag("ForwardRegionGeoModel");
429 world->add(tag);
430 world->add(fwrPhys);
431 m_detectorManager->addTreeTop(fwrPhys);
432
433 constructElements(fwrPhys,std::move(loadedDataFileR),1);
434 constructElements(fwrPhys,std::move(loadedDataFileL),2);
435
436 LogStream << MSG::INFO << "Forward region model succesfully constructed." << endmsg;
437}
void constructElements(GeoPhysVol *fwrPhys, std::vector< std::vector< std::string > > loadedDataFile, int beam)
std::map< std::string, const GeoMaterial * > m_MapMaterials
std::vector< std::vector< std::string > > loadDataFile(const std::string &fileName, int cols)

◆ DefineMaterials()

void ForwardRegionGeoModelFactory::DefineMaterials ( )
private

Definition at line 85 of file ForwardRegionGeoModelFactory.cxx.

86{
87 std::string matName;
88
89 StoredMaterialManager* materialManager = nullptr;
90 if (StatusCode::SUCCESS != m_detectorStore->retrieve(materialManager, std::string("MATERIALS"))) {
91 return;
92 }
93
94
95 //-----------------------------------------------------------------------------------//
96 // Get the materials that we shall use. //
97 // ----------------------------------------------------------------------------------//
98
99 // vacuum
100 matName = "std::Vacuum";
101 const GeoMaterial *vacuum = materialManager->getMaterial(matName);
102 m_MapMaterials.emplace(matName,vacuum);
103
104 // water
105 matName = "water";
106 GeoMaterial *water = new GeoMaterial("H20", 1.0*GeoModelKernelUnits::gram/Gaudi::Units::cm3);
107 GeoElement *hydrogen = new GeoElement("Hydrogen","H",1.0, 1.010);
108 GeoElement *oxygen = new GeoElement("Oxygen", "O", 8.0, 16.0);
109 water->add(hydrogen,0.11);
110 water->add(oxygen,0.89);
111 water->lock();
112 m_MapMaterials.emplace(matName,water);
113
114 // elements
115 const GeoElement* C = materialManager->getElement("Carbon");
116 const GeoElement* N = materialManager->getElement("Nitrogen");
117 const GeoElement* Si = materialManager->getElement("Silicon");
118 const GeoElement* P = materialManager->getElement("Phosphorus");
119 const GeoElement* S = materialManager->getElement("Sulfur");
120 const GeoElement* Cr = materialManager->getElement("Chromium");
121 const GeoElement* Mn = materialManager->getElement("Manganese");
122 const GeoElement* Fe = materialManager->getElement("Iron");
123 const GeoElement* Ni = materialManager->getElement("Nickel");
124 const GeoElement* Mo = materialManager->getElement("Molybdenum");
125 const GeoElement* Cu = materialManager->getElement("Copper");
126
127
128 const GeoElement* Al = materialManager->getElement("Aluminium");
129 const GeoElement* B = materialManager->getElement("Boron");
130 const GeoElement* O = materialManager->getElement("Oxygen");
131
132 // Copper for beam screens
133 matName = "Copper";
134 GeoMaterial *copper = new GeoMaterial("Copper", 8.94*GeoModelKernelUnits::g/Gaudi::Units::cm3);
135 copper->add(const_cast<GeoElement*> (Cu),1.0);
136 copper->lock();
137 m_MapMaterials.insert(std::pair<std::string,GeoMaterial*>(matName,copper));
138
139 // Tungsten for TCL6
140 matName = "Tungsten";
141 const GeoElement* W = materialManager->getElement("Wolfram");
142 GeoMaterial *tungsten = new GeoMaterial("Tungsten", 19.25*GeoModelKernelUnits::g/Gaudi::Units::cm3);
143 tungsten->add(const_cast<GeoElement*> (W),1.0);
144 tungsten->lock();
145 m_MapMaterials.insert(std::pair<std::string,GeoMaterial*>(matName,tungsten));
146
147 // GlidCop AL15 copper -- aproximate composition (trace impurities (< 0.01 wt. %) not included)
148 // source: http://www-ferp.ucsd.edu/LIB/PROPS/compcu15.html
149 matName = "GlidCopAL15";
150 GeoMaterial *glidcop=new GeoMaterial("GlidCopAL15", 8.90*GeoModelKernelUnits::g/Gaudi::Units::cm3);
151
152 double aCu, aAl, aO, aB, aTot;
153
154 aCu=99.7*Cu->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
155 aAl=0.15*Al->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
156 aO=0.13*O->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
157 aB=0.02*B->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
158 aTot=aCu+aAl+aO+aB;
159
160 glidcop->add(const_cast<GeoElement*> (Cu), aCu/aTot);
161 glidcop->add(const_cast<GeoElement*> (Al), aAl/aTot);
162 glidcop->add(const_cast<GeoElement*> (O), aO/aTot);
163 glidcop->add(const_cast<GeoElement*> (B), aB/aTot);
164 glidcop->lock();
165 m_MapMaterials.insert(std::pair<std::string,GeoMaterial*>(matName,glidcop));
166
167 // Steel Grade 316L (Roman Pot)
168 matName = "Steel";
169 GeoMaterial *steel=new GeoMaterial("Steel", 8*GeoModelKernelUnits::g/Gaudi::Units::cm3);
170
171 double aC,aN,aSi,aP,aS,aCr,aMn,aFe,aNi,aMo,Atot;
172
173 aFe=62.045*Fe->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
174 aC =0.03*C ->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
175 aMn=2.0*Mn ->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
176 aSi=0.75*Si->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
177 aP =0.045*P->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
178 aS =0.03*S ->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
179 aCr=18.0*Cr->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
180 aMo=3.0*Mo ->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
181 aNi=14.0*Ni->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
182 aN =0.10*N ->getA()/(GeoModelKernelUnits::g/Gaudi::Units::mole);
183 Atot=aFe+aC+aMn+aSi+aP+aS+aCr+aMo+aNi+aN;
184
185 steel->add(const_cast<GeoElement*> (Fe),aFe/Atot);
186 steel->add(const_cast<GeoElement*> (C), aC/Atot);
187 steel->add(const_cast<GeoElement*> (Mn),aMn/Atot);
188 steel->add(const_cast<GeoElement*> (Si),aSi/Atot);
189 steel->add(const_cast<GeoElement*> (P), aP/Atot);
190 steel->add(const_cast<GeoElement*> (S), aS/Atot);
191 steel->add(const_cast<GeoElement*> (Cr),aCr/Atot);
192 steel->add(const_cast<GeoElement*> (Mo),aMo/Atot);
193 steel->add(const_cast<GeoElement*> (Ni),aNi/Atot);
194 steel->add(const_cast<GeoElement*> (N), aN/Atot);
195 steel->lock();
196 m_MapMaterials.insert(std::pair<std::string,GeoMaterial*>(matName,steel));
197}
static Double_t P(Double_t *tt, Double_t *par)
virtual const GeoElement * getElement(const std::string &name)=0
virtual const GeoMaterial * getMaterial(const std::string &name)=0
struct color C

◆ getDetectorManager()

const ForwardRegionGeoModelManager * ForwardRegionGeoModelFactory::getDetectorManager ( ) const
virtual

Definition at line 439 of file ForwardRegionGeoModelFactory.cxx.

440{
441 return m_detectorManager;
442}

◆ insertCircularElement()

void ForwardRegionGeoModelFactory::insertCircularElement ( const std::string & name,
double x,
double y,
double z,
double rotationAngle,
double xAperture,
double yAperture,
double halfL,
double dL,
double tubeThickness,
GeoPhysVol * fwrPhys )
private

Definition at line 49 of file ForwardRegionGeoModelElements.cxx.

50{
51 double r0 = std::max(xAperture,yAperture)*Gaudi::Units::mm/2;
52
53 const GeoTube *ringTube = new GeoTube(r0, r0+tubeThickness, halfL-dL);
54
55 const GeoLogVol *ringLog = new GeoLogVol(name+"Log", ringTube, m_MapMaterials[std::string("Steel")]);
56
57 GeoPhysVol *ringPhys = new GeoPhysVol(ringLog);
58
59 //create rotation and traslation and add them to the tree of volumes of the world (move and rotate the volume)
60 GeoTransform *move = new GeoTransform(GeoTrf::Translate3D(x,y,z));
61 fwrPhys->add(move);
62 GeoTransform *rotate = new GeoTransform(GeoTrf::RotateY3D(rotationAngle));
63 fwrPhys->add(rotate);
64
65 GeoNameTag *tag = new GeoNameTag(name);
66 fwrPhys->add(tag);
67
68 fwrPhys->add(ringPhys);
69
70// // The other side of the forward region may be obtained by rotation
71// GeoTransform *rotateX180 = new GeoTransform(GeoTrf::RotateX3D(180*Gaudi::Units::deg));
72
73// // the other side
74// fwrPhys->add(rotateX180);
75// fwrPhys->add(move);
76// fwrPhys->add(rotate);
77// tag = new GeoNameTag(name+"_L");
78// fwrPhys->add(tag);
79// fwrPhys->add(ringPhys);
80}
void rotate(double angler, GeoTrf::Vector2D &vector)
const double r0
electron radius{cm}

◆ insertEllipticalElement()

void ForwardRegionGeoModelFactory::insertEllipticalElement ( const std::string & name,
double x,
double y,
double z,
double rotationAngle,
double xAperture,
double yAperture,
double halfL,
double dL,
double tubeThickness,
GeoPhysVol * fwrPhys )
private

Definition at line 82 of file ForwardRegionGeoModelElements.cxx.

83{
84 const GeoShape * ringTube0;
85 GeoShape * ringTube2;
86
87 // GeoEllipticalTube causes VP1 to fall, so for visualization GeoBox is used
88 if(!m_Config.vp1Compatibility) {
89 ringTube0 = new GeoEllipticalTube(xAperture*Gaudi::Units::mm/2+tubeThickness, yAperture*Gaudi::Units::mm/2+tubeThickness, halfL-dL);
90 ringTube2 = new GeoEllipticalTube(xAperture*Gaudi::Units::mm/2, yAperture*Gaudi::Units::mm/2, halfL-dL);
91 }
92 else {
93 ringTube0 = new GeoBox(xAperture*Gaudi::Units::mm/2+tubeThickness, yAperture*Gaudi::Units::mm/2+tubeThickness, halfL-dL);
94 ringTube2 = new GeoBox(xAperture*Gaudi::Units::mm/2, yAperture*Gaudi::Units::mm/2, halfL-dL);
95 }
96 GeoShapeSubtraction * ringTube = new GeoShapeSubtraction(ringTube0, ringTube2);
97
98 const GeoLogVol *ringLog = new GeoLogVol(name+"Log", ringTube, m_MapMaterials[std::string("Steel")]);
99
100 GeoPhysVol *ringPhys = new GeoPhysVol(ringLog);
101
102 //create rotation and traslation and add them to the tree of volumes of the world (move and rotate the volume)
103 GeoTransform *move = new GeoTransform(GeoTrf::Translate3D(x,y,z));
104 fwrPhys->add(move);
105 GeoTransform *rotate = new GeoTransform(GeoTrf::RotateY3D(rotationAngle));
106 fwrPhys->add(rotate);
107
108 GeoNameTag *tag = new GeoNameTag(name);
109 fwrPhys->add(tag);
110
111 fwrPhys->add(ringPhys);
112
113// // The other side of the forward region may be obtained by rotation
114// GeoTransform *rotateX180 = new GeoTransform(GeoTrf::RotateX3D(180*Gaudi::Units::deg));
115
116// // the other side
117// fwrPhys->add(rotateX180);
118// fwrPhys->add(move);
119// fwrPhys->add(rotate);
120// tag = new GeoNameTag(name+"_L");
121// fwrPhys->add(tag);
122// fwrPhys->add(ringPhys);
123}

◆ insertMagnetEnvelope()

GeoPhysVol * ForwardRegionGeoModelFactory::insertMagnetEnvelope ( const std::string & name,
double x,
double y,
double z,
double rotationAngle,
double diameter,
double halfL,
double dL,
GeoPhysVol * fwrPhys )
private

Definition at line 26 of file ForwardRegionGeoModelElements.cxx.

27{
28 const GeoTube *tube = new GeoTube(0, diameter/2, halfL-dL);
29
30 GeoTrf::Transform3D shift = GeoTrf::Translate3D(x,y,z);
31 GeoTrf::Transform3D rotate = GeoTrf::RotateY3D(rotationAngle);
32// Transform3D rotateX180 = GeoTrf::RotateX3D(180*Gaudi::Units::deg);
33
34 const GeoShapeShift& magTube0 = (*tube)<<rotate<<shift;
35// const GeoShapeUnion& magTube = magTube0.add((*tube)<<rotate<<shift<<rotateX180);
36
37 const GeoLogVol *tubeLog = new GeoLogVol(name, &magTube0, m_MapMaterials[std::string("std::Vacuum")]);
38
39 GeoPhysVol *tubePhys = new GeoPhysVol(tubeLog);
40
41 GeoNameTag *tag = new GeoNameTag(name);
42 fwrPhys->add(tag);
43
44 fwrPhys->add(tubePhys);
45
46 return tubePhys;
47}

◆ insertTCLElement()

void ForwardRegionGeoModelFactory::insertTCLElement ( const std::string & name,
double x,
double y,
double z,
GeoPhysVol * fwrPhys,
double TCLJawDistO,
double TCLJawDistI,
bool tungstenInsteadOfCopper = false )
private

Definition at line 393 of file ForwardRegionGeoModelElements.cxx.

394{
395 // Constants
396 double TCL_BOX_halflength, TCL_BOX_halfwidth, TCL_BOX_halfheight, TCL_BOX_sideThickness, TCL_BOX_topBottomThickness, TCL_BOX_endThickness, TCL_TUBE_halflength, TCL_TUBE_halfapperture, TCL_TUBE_thickness;
397 TCL_BOX_sideThickness = 6*Gaudi::Units::mm;
398 TCL_BOX_topBottomThickness = 18*Gaudi::Units::mm;
399 TCL_BOX_endThickness = 18*Gaudi::Units::mm;
400
401 TCL_BOX_halflength = 621*Gaudi::Units::mm;
402 TCL_BOX_halfwidth = 132*Gaudi::Units::mm;
403 TCL_BOX_halfheight = 60+TCL_BOX_topBottomThickness;
404
405 TCL_TUBE_halflength = 59.5*Gaudi::Units::mm;
406 TCL_TUBE_halfapperture = 53*Gaudi::Units::mm;
407 TCL_TUBE_thickness = 2*Gaudi::Units::mm;
408
409 double TCL_CuBlock_halflength, TCL_CuBlock_halfwidth, TCL_CuBlock_halfheight, TCL_CuBlockCylCut_zDepth, TCL_CuBlockCylCut_angle, TCL_CuBlockCylCut_cylR, TCL_CuBlockCylCut_cylHalflength, TCL_CuBlockCylCut_xDepth, TCL_CuBlockCylCut_xShift;
410 TCL_CuBlock_halflength = 597*Gaudi::Units::mm;
411 TCL_CuBlock_halfwidth = 14.5*Gaudi::Units::mm;
412 TCL_CuBlock_halfheight = 40*Gaudi::Units::mm;
413
414 TCL_CuBlockCylCut_zDepth = 90*Gaudi::Units::mm;
415 TCL_CuBlockCylCut_angle = 12*Gaudi::Units::deg;
416 TCL_CuBlockCylCut_cylR = 40*Gaudi::Units::mm;
417
418 TCL_CuBlockCylCut_cylHalflength = TCL_CuBlockCylCut_zDepth/cos(TCL_CuBlockCylCut_angle);
419 TCL_CuBlockCylCut_xDepth = TCL_CuBlockCylCut_zDepth*tan(TCL_CuBlockCylCut_angle);
420 TCL_CuBlockCylCut_xShift = -TCL_CuBlock_halfwidth-TCL_CuBlockCylCut_cylR/cos(TCL_CuBlockCylCut_angle)+TCL_CuBlockCylCut_xDepth;
421
422 double TCL_CuBeam_halflength, TCL_CuBeam_halfwidth, TCL_CuBeam_halfheight, TCL_Cooling_width;
423 TCL_CuBeam_halflength = 530*Gaudi::Units::mm;
424 TCL_CuBeam_halfwidth = 15*Gaudi::Units::mm;
425 TCL_CuBeam_halfheight = 40*Gaudi::Units::mm;
426
427 TCL_Cooling_width = 9*Gaudi::Units::mm;
428
429
430
431 // rotate by 180 deg around X and Y
432 GeoTrf::Transform3D rotateX180 = GeoTrf::RotateX3D(180*Gaudi::Units::deg);
433 GeoTrf::Transform3D rotateY180 = GeoTrf::RotateY3D(180*Gaudi::Units::deg);
434
435 // inner vacuum volume solid
436 const GeoBox * boxIn = new GeoBox(TCL_BOX_halfwidth-TCL_BOX_sideThickness, TCL_BOX_halfheight-TCL_BOX_topBottomThickness, TCL_BOX_halflength-TCL_BOX_endThickness);
437 const GeoTube * tubeIn = new GeoTube(0, TCL_TUBE_halfapperture, TCL_TUBE_halflength+0.5*TCL_BOX_endThickness);
438 GeoTrf::Transform3D moveTubeIn = GeoTrf::Translate3D(0, 0, TCL_BOX_halflength+TCL_TUBE_halflength-0.5*TCL_BOX_endThickness);
439 const GeoShapeShift& tubeIn1 = (*tubeIn)<<moveTubeIn;
440 const GeoShapeShift& tubeIn2 = (*tubeIn)<<moveTubeIn<<rotateY180;
441 const GeoShapeUnion * innerVac0 = new GeoShapeUnion(boxIn,&tubeIn1);
442 GeoShapeUnion * innerVac = new GeoShapeUnion(innerVac0,&tubeIn2);
443
444 // outer steel case solid
445 const GeoBox * boxFull = new GeoBox(TCL_BOX_halfwidth, TCL_BOX_halfheight, TCL_BOX_halflength);
446 const GeoTube * tubeOut = new GeoTube(TCL_TUBE_halfapperture, TCL_TUBE_halfapperture+TCL_TUBE_thickness, TCL_TUBE_halflength);
447 GeoTrf::Transform3D moveTubeOut = GeoTrf::Translate3D(0, 0, TCL_BOX_halflength+TCL_TUBE_halflength);
448 const GeoShapeShift& tubeOut1 = (*tubeOut)<<moveTubeOut;
449 const GeoShapeShift& tubeOut2 = (*tubeOut)<<moveTubeOut<<rotateY180;
450 const GeoShapeUnion * outerSteelFull0 = new GeoShapeUnion(boxFull,&tubeOut1);
451 const GeoShapeUnion * outerSteelFull = new GeoShapeUnion(outerSteelFull0,&tubeOut2);
452 GeoShapeSubtraction * outerSteel = new GeoShapeSubtraction(outerSteelFull,innerVac);
453
454 // Copper block solid
455 const GeoBox * cuBoxFull = new GeoBox(TCL_CuBlock_halfwidth, TCL_CuBlock_halfheight, TCL_CuBlock_halflength);
456 const GeoTube * cylCut0 = new GeoTube(0, TCL_CuBlockCylCut_cylR, TCL_CuBlockCylCut_cylHalflength);
457 GeoTrf::Transform3D rotateCylCut = GeoTrf::RotateY3D(TCL_CuBlockCylCut_angle);
458 GeoTrf::Transform3D moveCylCut = GeoTrf::Translate3D(TCL_CuBlockCylCut_xShift, 0, TCL_CuBlock_halflength);
459 const GeoShapeShift& cylCut1 = (*cylCut0)<<rotateCylCut<<moveCylCut;
460 const GeoShapeShift& cylCut2 = (*cylCut0)<<rotateCylCut<<moveCylCut<<rotateX180;
461 const GeoShapeSubtraction * cuBox0 = new GeoShapeSubtraction(cuBoxFull, &cylCut1);
462 const GeoShapeSubtraction * cuBox1 = new GeoShapeSubtraction(cuBox0, &cylCut2);
463 GeoTrf::Transform3D moveCuBoxI = GeoTrf::Translate3D(TCLJawDistI+TCL_CuBlock_halfwidth, 0, 0);
464 const GeoShapeShift& cuBoxI = (*cuBox1)<<moveCuBoxI;
465 GeoTrf::Transform3D moveCuBoxO = GeoTrf::Translate3D(+TCLJawDistO+TCL_CuBlock_halfwidth, 0, 0);
466 const GeoShapeShift& cuBoxO = (*cuBox1)<<moveCuBoxO<<rotateY180;
467
468 // Copper beam solid
469 const GeoBox * cuBeamFull = new GeoBox(TCL_CuBeam_halfwidth, TCL_CuBeam_halfheight, TCL_CuBeam_halflength);
470 GeoTrf::Transform3D moveCuBeamI = GeoTrf::Translate3D(TCLJawDistI+2*TCL_CuBlock_halfwidth+TCL_Cooling_width+TCL_CuBeam_halfwidth, 0, 0);
471 const GeoShapeShift& cuBeamI = (*cuBeamFull)<<moveCuBeamI;
472 GeoTrf::Transform3D moveCuBeamO = GeoTrf::Translate3D(+TCLJawDistO+2*TCL_CuBlock_halfwidth+TCL_Cooling_width+TCL_CuBeam_halfwidth, 0, 0);
473 const GeoShapeShift& cuBeamO = (*cuBeamFull)<<moveCuBeamO<<rotateY180;
474
475 // Watter cooling in first aproximation (water box)
476 const GeoBox * waterBox = new GeoBox(0.5*TCL_Cooling_width, TCL_CuBlock_halfheight, TCL_CuBlock_halflength);
477 GeoTrf::Transform3D moveWaterBoxI = GeoTrf::Translate3D(TCLJawDistI+2*TCL_CuBlock_halfwidth+0.5*TCL_Cooling_width, 0, 0);
478 const GeoShapeShift& waterBoxI = (*waterBox)<<moveWaterBoxI;
479 GeoTrf::Transform3D moveWaterBoxO = GeoTrf::Translate3D(+TCLJawDistO+2*TCL_CuBlock_halfwidth+0.5*TCL_Cooling_width, 0, 0);
480 const GeoShapeShift& waterBoxO = (*waterBox)<<moveWaterBoxO<<rotateY180;
481
482
483 // Logical and physical volumes
484 const GeoLogVol *ringLog = new GeoLogVol(name+"Log", outerSteel, m_MapMaterials[std::string("Steel")]);
485 const GeoLogVol *ringLog2 = new GeoLogVol(name+"Fill", innerVac, m_MapMaterials[std::string("std::Vacuum")]);
486
487 GeoPhysVol *ringPhys = new GeoPhysVol(ringLog);
488 GeoPhysVol *ringPhys2 = new GeoPhysVol(ringLog2);
489
490 const GeoLogVol *cuBoxLogI = new GeoLogVol(name+"CuBoxI", &cuBoxI, m_MapMaterials[std::string(tungstenInsteadOfCopper ? "Tungsten" : "Copper")]);
491 GeoPhysVol *cuBoxPhysI = new GeoPhysVol(cuBoxLogI);
492 const GeoLogVol *cuBoxLogO = new GeoLogVol(name+"CuBoxO", &cuBoxO, m_MapMaterials[std::string(tungstenInsteadOfCopper ? "Tungsten" : "Copper")]);
493 GeoPhysVol *cuBoxPhysO = new GeoPhysVol(cuBoxLogO);
494
495 const GeoLogVol *cuBeamLogI = new GeoLogVol(name+"CuBeamI", &cuBeamI, m_MapMaterials[std::string("GlidCopAL15")]);
496 GeoPhysVol *cuBeamPhysI = new GeoPhysVol(cuBeamLogI);
497 const GeoLogVol *cuBeamLogO = new GeoLogVol(name+"CuBeamO", &cuBeamO, m_MapMaterials[std::string("GlidCopAL15")]);
498 GeoPhysVol *cuBeamPhysO = new GeoPhysVol(cuBeamLogO);
499
500 const GeoLogVol *waterBoxLogI = new GeoLogVol(name+"waterBoxI", &waterBoxI, m_MapMaterials[std::string("water")]);
501 GeoPhysVol *waterBoxPhysI = new GeoPhysVol(waterBoxLogI);
502 const GeoLogVol *waterBoxLogO = new GeoLogVol(name+"waterBoxO", &waterBoxO, m_MapMaterials[std::string("water")]);
503 GeoPhysVol *waterBoxPhysO = new GeoPhysVol(waterBoxLogO);
504
505 //create rotation and traslation and add them to the tree of volumes of the world (move and rotate the volume)
506 GeoTransform *move = new GeoTransform(GeoTrf::Translate3D(x,y,z));
507 fwrPhys->add(move);
508
509 GeoNameTag *tag = new GeoNameTag(name);
510 fwrPhys->add(tag);
511
512 fwrPhys->add(ringPhys);
513
514 // add filling (inside of the tube)
515 fwrPhys->add(move);
516 tag = new GeoNameTag(name+"Fill");
517 fwrPhys->add(tag);
518 fwrPhys->add(ringPhys2);
519
520 // add copper absorbers
521 ringPhys2->add(cuBoxPhysI);
522 ringPhys2->add(cuBoxPhysO);
523
524 ringPhys2->add(cuBeamPhysI);
525 ringPhys2->add(cuBeamPhysO);
526
527 ringPhys2->add(waterBoxPhysI);
528 ringPhys2->add(waterBoxPhysO);
529}

◆ insertTrousersElement()

void ForwardRegionGeoModelFactory::insertTrousersElement ( const std::string & name,
double x,
double y,
double z,
double rotationAngle,
GeoPhysVol * fwrPhys )
private

Definition at line 285 of file ForwardRegionGeoModelElements.cxx.

286{
287 // "Trousers" -- transition from 1 to 2 beampipes
288 // rewritten from Knut Dundas Moraa's AGDD file and modified
289
290 // CONSTANTS
291 double TAN_A, TAN_B, TAN_C, TAN_Dsmall, TAN_Dbig, TAN_thick1, TAN_xseparation;
292 TAN_A = 700*Gaudi::Units::mm;
293 TAN_B = 500*Gaudi::Units::mm;
294 TAN_C = 3700*Gaudi::Units::mm;
295 TAN_Dsmall = 52*Gaudi::Units::mm;
296 TAN_Dbig = 212*Gaudi::Units::mm;
297 TAN_thick1 = 4.5*Gaudi::Units::mm;
298 TAN_xseparation = 80*Gaudi::Units::mm;
299
300 // Derived constants
301 double TAN_Rsmall, TAN_Rbig, TAN_coneZh, TAN_coneR, TAN_coneXh;//, TAN_halflength;
302 TAN_Rsmall = 0.5*TAN_Dsmall;
303 TAN_Rbig = 0.5*TAN_Dbig;
304 TAN_coneZh = TAN_B*cos(5*M_PI/180);
305 TAN_coneR = 2*TAN_B*sin(5*M_PI/180)+TAN_Rsmall;
306 TAN_coneXh = TAN_Rbig-TAN_B*sin(5*M_PI/180)-TAN_Rsmall;
307 //TAN_halflength = 0.5*(TAN_A+TAN_B+TAN_C);
308
309 // volume construction
310
311 // inner part
312 GeoPcon *TANi_cone0 = new GeoPcon(0,360*Gaudi::Units::deg);
313 TANi_cone0->addPlane(2*TAN_coneZh, TAN_Rsmall, 2*TAN_Rbig);
314 TANi_cone0->addPlane(TAN_coneZh, TAN_Rsmall, 2*TAN_Rbig);
315 TANi_cone0->addPlane(-TAN_coneZh, TAN_coneR, 2*TAN_Rbig);
316 GeoTrf::Transform3D TAN_moveCone = GeoTrf::Translate3D(TAN_coneXh,0,0.5*(TAN_A-TAN_B));
317 GeoTrf::Transform3D TAN_rotateCone = GeoTrf::RotateY3D(5*Gaudi::Units::deg);
318 const GeoShapeShift& TANi_cone = (*TANi_cone0)<<TAN_rotateCone<<TAN_moveCone;
319
320 const GeoBox *TAN_box0 = new GeoBox(2*TAN_Rbig,2*TAN_Rbig,TAN_A+TAN_B);
321 GeoTrf::Transform3D TAN_moveBox = GeoTrf::Translate3D(-2*TAN_Rbig,0,0);
322 const GeoShapeShift& TAN_box = (*TAN_box0)<<TAN_moveBox;
323
324 const GeoTube *TANi_bigtube = new GeoTube(0, TAN_Rbig, 0.5*(TAN_A+TAN_B));
325
326 GeoShapeSubtraction *TANi_hcyl = new GeoShapeSubtraction(TANi_bigtube, &TAN_box);
327
328 GeoShapeSubtraction *TANi_h = new GeoShapeSubtraction(TANi_hcyl, &TANi_cone);
329 GeoTrf::Transform3D TAN_moveH = GeoTrf::Translate3D(0,0,-0.5*TAN_C);
330 GeoTrf::Transform3D TAN_rotateH = GeoTrf::RotateZ3D(180*Gaudi::Units::deg);
331
332 GeoTrf::Transform3D TAN_moveTube1 = GeoTrf::Translate3D(TAN_xseparation,0,0.5*(TAN_A+TAN_B));
333 GeoTrf::Transform3D TAN_moveTube2 = GeoTrf::Translate3D(-TAN_xseparation,0,0.5*(TAN_A+TAN_B));
334
335 // outer part
336 GeoPcon *TANo_cone0 = new GeoPcon(0,360*Gaudi::Units::deg);
337 TANo_cone0->addPlane(2*TAN_coneZh, TAN_Rsmall+TAN_thick1, 2*TAN_Rbig);
338 TANo_cone0->addPlane(TAN_coneZh, TAN_Rsmall+TAN_thick1, 2*TAN_Rbig);
339 TANo_cone0->addPlane(-TAN_coneZh, TAN_coneR+TAN_thick1, 2*TAN_Rbig);
340 const GeoShapeShift& TANo_cone = (*TANo_cone0)<<TAN_rotateCone<<TAN_moveCone;
341
342 const GeoTube *TANo_bigtube = new GeoTube(0, TAN_Rbig+TAN_thick1, 0.5*(TAN_A+TAN_B));
343
344 GeoShapeSubtraction *TANo_hcyl = new GeoShapeSubtraction(TANo_bigtube, &TAN_box);
345
346 GeoShapeSubtraction *TANo_h = new GeoShapeSubtraction(TANo_hcyl, &TANo_cone);
347
348 const GeoTube *TAN_antiblock0 = new GeoTube(0, TAN_Rsmall, 0.5*(TAN_A+2*TAN_B)); // antiblock tube -- just in case..
349 GeoTrf::Transform3D TAN_moveAntiblock = GeoTrf::Translate3D(TAN_xseparation,0,0);
350 const GeoShapeShift& TAN_antiblock = (*TAN_antiblock0)<<TAN_moveAntiblock;
351
352 GeoShapeSubtraction *TAN_shape0 = new GeoShapeSubtraction(TANo_h, TANi_h);
353 GeoShapeSubtraction *TAN_shape = new GeoShapeSubtraction(TAN_shape0, &TAN_antiblock);
354 const GeoShapeShift& TAN_shape1 = (*TAN_shape)<<TAN_moveH;
355 const GeoShapeShift& TAN_shape2 = (*TAN_shape)<<TAN_moveH<<TAN_rotateH;
356
357 const GeoTube *TANo_ftube = new GeoTube(TAN_Rsmall,TAN_Rsmall+TAN_thick1,0.5*TAN_C-0.1*Gaudi::Units::mm);
358 const GeoShapeShift& TANo_ftube1 = (*TANo_ftube)<<TAN_moveTube1;
359 const GeoShapeShift& TANo_ftube2 = (*TANo_ftube)<<TAN_moveTube2;
360
361 GeoShapeUnion *TANo0 = new GeoShapeUnion(&TAN_shape1, &TAN_shape2);
362 GeoShapeUnion *TANo1 = new GeoShapeUnion(TANo0, &TANo_ftube1);
363 GeoShapeUnion *TANo = new GeoShapeUnion(TANo1, &TANo_ftube2); // complete outer part
364
365 // PLACEMENT
366 const GeoLogVol *ringLog = new GeoLogVol(name+"Log", TANo, m_MapMaterials[std::string("Steel")]);
367
368 GeoPhysVol *ringPhys = new GeoPhysVol(ringLog);
369
370 //create rotation and traslation and add them to the tree of volumes of the world (move and rotate the volume)
371 GeoTransform *move = new GeoTransform(GeoTrf::Translate3D(x,y,z));
372 fwrPhys->add(move);
373 GeoTransform *rotate = new GeoTransform(GeoTrf::RotateY3D(rotationAngle));
374 fwrPhys->add(rotate);
375
376 GeoNameTag *tag = new GeoNameTag(name);
377 fwrPhys->add(tag);
378
379 fwrPhys->add(ringPhys);
380
381// // The other side of the forward region may be obtained by rotation
382// GeoTransform *rotateX180 = new GeoTransform(GeoTrf::RotateX3D(180*Gaudi::Units::deg));
383
384// // the other side
385// fwrPhys->add(rotateX180);
386// fwrPhys->add(move);
387// fwrPhys->add(rotate);
388// tag = new GeoNameTag(name+"_L");
389// fwrPhys->add(tag);
390// fwrPhys->add(ringPhys);
391}
#define M_PI

◆ insertXRecticircularElement()

void ForwardRegionGeoModelFactory::insertXRecticircularElement ( const std::string & name,
double x,
double y,
double z,
double rotationAngle,
double xAperture,
double yAperture,
double halfL,
double dL,
double tubeThickness,
GeoPhysVol * fwrPhys )
private

Definition at line 125 of file ForwardRegionGeoModelElements.cxx.

126{
127 double beamScreenSeparation = 1.5*Gaudi::Units::mm;
128 double beamScreenCuThick = 0.05*Gaudi::Units::mm;
129 double beamScreenSteelThick = 1*Gaudi::Units::mm;
130
131 const GeoTube *ringTube = new GeoTube(yAperture*Gaudi::Units::mm/2+beamScreenCuThick+beamScreenSteelThick+beamScreenSeparation, yAperture*Gaudi::Units::mm/2+beamScreenCuThick+beamScreenSteelThick+beamScreenSeparation+tubeThickness, halfL-dL);
132 const GeoTube *circ = new GeoTube(0, yAperture*Gaudi::Units::mm/2, halfL-dL);
133 const GeoBox *rect = new GeoBox(xAperture*Gaudi::Units::mm/2, yAperture*Gaudi::Units::mm/2, halfL-dL);
134 GeoShapeIntersection *innerVac = new GeoShapeIntersection(rect,circ);
135
136 const GeoTube *circ2 = new GeoTube(0, yAperture*Gaudi::Units::mm/2+beamScreenCuThick, halfL-dL);
137 const GeoBox *rect2 = new GeoBox(xAperture*Gaudi::Units::mm/2+beamScreenCuThick, yAperture*Gaudi::Units::mm/2+beamScreenCuThick, halfL-dL);
138 GeoShapeIntersection *beamScreenCu0 = new GeoShapeIntersection(rect2,circ2);
139 GeoShapeSubtraction *beamScreenCu = new GeoShapeSubtraction(beamScreenCu0, innerVac);
140
141 const GeoTube *circ3 = new GeoTube(0, yAperture*Gaudi::Units::mm/2+beamScreenCuThick+beamScreenSteelThick, halfL-dL);
142 const GeoBox *rect3 = new GeoBox(xAperture*Gaudi::Units::mm/2+beamScreenCuThick+beamScreenSteelThick, yAperture*Gaudi::Units::mm/2+beamScreenCuThick+beamScreenSteelThick, halfL-dL);
143 GeoShapeIntersection *beamScreenSteel01 = new GeoShapeIntersection(rect3,circ3);
144 GeoShapeSubtraction *beamScreenSteel02 = new GeoShapeSubtraction(beamScreenSteel01, innerVac);
145 GeoShapeSubtraction *beamScreenSteel = new GeoShapeSubtraction(beamScreenSteel02, beamScreenCu);
146
147 const GeoLogVol *ringLog = new GeoLogVol(name+"BeamPipe", ringTube, m_MapMaterials[std::string("Steel")]);
148 const GeoLogVol *ringLogCu = new GeoLogVol(name+"BeamScreenCu", beamScreenCu, m_MapMaterials[std::string("Copper")]);
149 const GeoLogVol *ringLogSteel = new GeoLogVol(name+"BeamScreenSteel", beamScreenSteel, m_MapMaterials[std::string("Steel")]);
150
151 GeoPhysVol *ringPhys = new GeoPhysVol(ringLog);
152 GeoPhysVol *ringPhysCu = new GeoPhysVol(ringLogCu);
153 GeoPhysVol *ringPhysSteel = new GeoPhysVol(ringLogSteel);
154
155 //create rotation and traslation and add them to the tree of volumes of the world (move and rotate the volume)
156 GeoTransform *move = new GeoTransform(GeoTrf::Translate3D(x,y,z));
157 fwrPhys->add(move);
158 GeoTransform *rotate = new GeoTransform(GeoTrf::RotateY3D(rotationAngle));
159 fwrPhys->add(rotate);
160
161 GeoNameTag *tag = new GeoNameTag(name+"BeamPipe");
162 fwrPhys->add(tag);
163
164 fwrPhys->add(ringPhys);
165 //detectorManager->addTreeTop(ringPhys);
166
167 // add beam scren
168 fwrPhys->add(move);
169 fwrPhys->add(rotate);
170 tag = new GeoNameTag(name+"BeamScreenCu");
171 fwrPhys->add(tag);
172 fwrPhys->add(ringPhysCu);
173 fwrPhys->add(move);
174 fwrPhys->add(rotate);
175 tag = new GeoNameTag(name+"BeamScreenSteel");
176 fwrPhys->add(tag);
177 fwrPhys->add(ringPhysSteel);
178
179
180// // The other side of the forward region may be obtain by rotation
181// GeoTransform *rotateX180 = new GeoTransform(GeoTrf::RotateX3D(180*Gaudi::Units::deg));
182
183// // the other side
184// fwrPhys->add(rotateX180);
185// fwrPhys->add(move);
186// fwrPhys->add(rotate);
187// tag = new GeoNameTag(name+"BeamPipe_L");
188// fwrPhys->add(tag);
189// fwrPhys->add(ringPhys);
190
191// fwrPhys->add(rotateX180);
192// fwrPhys->add(move);
193// fwrPhys->add(rotate);
194// tag = new GeoNameTag(name+"BeamScreenCu_L");
195// fwrPhys->add(tag);
196// fwrPhys->add(ringPhysCu);
197
198// fwrPhys->add(rotateX180);
199// fwrPhys->add(move);
200// fwrPhys->add(rotate);
201// tag = new GeoNameTag(name+"BeamScreenSteel_L");
202// fwrPhys->add(tag);
203// fwrPhys->add(ringPhysSteel);
204}

◆ insertYRecticircularElement()

void ForwardRegionGeoModelFactory::insertYRecticircularElement ( const std::string & name,
double x,
double y,
double z,
double rotationAngle,
double xAperture,
double yAperture,
double halfL,
double dL,
double tubeThickness,
GeoPhysVol * fwrPhys )
private

Definition at line 206 of file ForwardRegionGeoModelElements.cxx.

207{
208 double beamScreenSeparation = 1.5*Gaudi::Units::mm;
209 double beamScreenCuThick = 0.05*Gaudi::Units::mm;
210 double beamScreenSteelThick = 1*Gaudi::Units::mm;
211
212 const GeoTube *ringTube = new GeoTube(xAperture*Gaudi::Units::mm/2+beamScreenCuThick+beamScreenSteelThick+beamScreenSeparation, xAperture*Gaudi::Units::mm/2+beamScreenCuThick+beamScreenSteelThick+beamScreenSeparation+tubeThickness, halfL-dL);
213 const GeoTube *circ = new GeoTube(0, xAperture*Gaudi::Units::mm/2, halfL-dL);
214 const GeoBox *rect = new GeoBox(xAperture*Gaudi::Units::mm/2, yAperture*Gaudi::Units::mm/2, halfL-dL);
215 GeoShapeIntersection *innerVac = new GeoShapeIntersection(rect,circ);
216
217 const GeoTube *circ2 = new GeoTube(0, xAperture*Gaudi::Units::mm/2+beamScreenCuThick, halfL-dL);
218 const GeoBox *rect2 = new GeoBox(xAperture*Gaudi::Units::mm/2+beamScreenCuThick, yAperture*Gaudi::Units::mm/2+beamScreenCuThick, halfL-dL);
219 GeoShapeIntersection *beamScreenCu0 = new GeoShapeIntersection(rect2,circ2);
220 GeoShapeSubtraction *beamScreenCu = new GeoShapeSubtraction(beamScreenCu0, innerVac);
221
222 const GeoTube *circ3 = new GeoTube(0, xAperture*Gaudi::Units::mm/2+beamScreenCuThick+beamScreenSteelThick, halfL-dL);
223 const GeoBox *rect3 = new GeoBox(xAperture*Gaudi::Units::mm/2+beamScreenCuThick+beamScreenSteelThick, yAperture*Gaudi::Units::mm/2+beamScreenCuThick+beamScreenSteelThick, halfL-dL);
224 GeoShapeIntersection *beamScreenSteel01 = new GeoShapeIntersection(rect3,circ3);
225 GeoShapeSubtraction *beamScreenSteel02 = new GeoShapeSubtraction(beamScreenSteel01, innerVac);
226 GeoShapeSubtraction *beamScreenSteel = new GeoShapeSubtraction(beamScreenSteel02, beamScreenCu);
227
228 const GeoLogVol *ringLog = new GeoLogVol(name+"BeamPipe", ringTube, m_MapMaterials[std::string("Steel")]);
229 const GeoLogVol *ringLogCu = new GeoLogVol(name+"BeamScreenCu", beamScreenCu, m_MapMaterials[std::string("Copper")]);
230 const GeoLogVol *ringLogSteel = new GeoLogVol(name+"BeamScreenSteel", beamScreenSteel, m_MapMaterials[std::string("Steel")]);
231
232 GeoPhysVol *ringPhys = new GeoPhysVol(ringLog);
233 GeoPhysVol *ringPhysCu = new GeoPhysVol(ringLogCu);
234 GeoPhysVol *ringPhysSteel = new GeoPhysVol(ringLogSteel);
235
236 //create rotation and traslation and add them to the tree of volumes of the world (move and rotate the volume)
237 GeoTransform *move = new GeoTransform(GeoTrf::Translate3D(x,y,z));
238 fwrPhys->add(move);
239 GeoTransform *rotate = new GeoTransform(GeoTrf::RotateY3D(rotationAngle));
240 fwrPhys->add(rotate);
241
242 GeoNameTag *tag = new GeoNameTag(name+"BeamPipe");
243 fwrPhys->add(tag);
244
245 fwrPhys->add(ringPhys);
246
247 // add beam scren
248 fwrPhys->add(move);
249 fwrPhys->add(rotate);
250 tag = new GeoNameTag(name+"BeamScreenCu");
251 fwrPhys->add(tag);
252 fwrPhys->add(ringPhysCu);
253 fwrPhys->add(move);
254 fwrPhys->add(rotate);
255 tag = new GeoNameTag(name+"BeamScreenSteel");
256 fwrPhys->add(tag);
257 fwrPhys->add(ringPhysSteel);
258
259// // The other side of the forward region may be obtain by rotation
260// GeoTransform *rotateX180 = new GeoTransform(GeoTrf::RotateX3D(180*Gaudi::Units::deg));
261
262// // the other side
263// fwrPhys->add(rotateX180);
264// fwrPhys->add(move);
265// fwrPhys->add(rotate);
266// tag = new GeoNameTag(name+"BeamPipe_L");
267// fwrPhys->add(tag);
268// fwrPhys->add(ringPhys);
269
270// fwrPhys->add(rotateX180);
271// fwrPhys->add(move);
272// fwrPhys->add(rotate);
273// tag = new GeoNameTag(name+"BeamScreenCu_L");
274// fwrPhys->add(tag);
275// fwrPhys->add(ringPhysCu);
276
277// fwrPhys->add(rotateX180);
278// fwrPhys->add(move);
279// fwrPhys->add(rotate);
280// tag = new GeoNameTag(name+"BeamScreenSteel_L");
281// fwrPhys->add(tag);
282// fwrPhys->add(ringPhysSteel);
283}

◆ loadDataFile()

std::vector< std::vector< std::string > > ForwardRegionGeoModelFactory::loadDataFile ( const std::string & fileName,
int cols )
private

Definition at line 445 of file ForwardRegionGeoModelFactory.cxx.

446{
447 std::vector<std::vector<std::string> > loadedData;
448
449 MsgStream LogStream(Athena::getMessageSvc(), "ForwardRegionGeoModel::loadDataFile()");
450
451 std::ifstream file (fileName);
452 if(!file){
453 std::string datapath = PathResolverFindDataFile(fileName);
454 LogStream << MSG::DEBUG << "File " << fileName << " not found in run directory, trying to load it from DATAPATH" << endmsg;
455 file.open(datapath.c_str());
456 }
457
458 if(!file)
459 LogStream << MSG::FATAL << "Unable to load " << fileName << endmsg;
460
461 if(file.is_open())
462 {
463 std::vector<std::string> row (cols);
464 char c;
465
466 while(file.get(c))
467 {
468 if(c != '@' && c != '#' && c != '*' && c != '$' && c != '%')
469 {
470 file.unget();
471 for(int i = 0; i<cols; i++) // load desired columns
472 {
473 file >> row[i];
474 }
475 loadedData.push_back(row); //store them
476 file.ignore(1024,'\n'); // discard rest of line
477 }
478 else
479 file.ignore(1024, '\n'); // discard commented lines
480 }
481 LogStream << MSG::INFO << "File " << fileName << " succesfully loaded." << endmsg;
482 file.close();
483 }
484 return loadedData;
485}
std::string PathResolverFindDataFile(const std::string &logical_file_name)
row
Appending html table to final .html summary file.
TFile * file

◆ num2str()

template<class T>
std::string ForwardRegionGeoModelFactory::num2str ( T num)
private

Definition at line 200 of file ForwardRegionGeoModelFactory.cxx.

201{
202 std::ostringstream strs;
203 strs << num;
204 return strs.str();
205}

◆ operator=()

const ForwardRegionGeoModelFactory & ForwardRegionGeoModelFactory::operator= ( const ForwardRegionGeoModelFactory & right)
private

◆ sgn()

template<typename T>
int ForwardRegionGeoModelFactory::sgn ( T val)
private

Definition at line 207 of file ForwardRegionGeoModelFactory.cxx.

207 {
208 return (T(0) < val) - (val < T(0));
209}
unsigned long long T

Member Data Documentation

◆ m_Config

FWD_CONFIGURATION ForwardRegionGeoModelFactory::m_Config
private

Definition at line 73 of file ForwardRegionGeoModelFactory.h.

◆ m_detectorManager

ForwardRegionGeoModelManager* ForwardRegionGeoModelFactory::m_detectorManager
private

Definition at line 108 of file ForwardRegionGeoModelFactory.h.

◆ m_detectorStore

StoreGateSvc* ForwardRegionGeoModelFactory::m_detectorStore
private

Definition at line 67 of file ForwardRegionGeoModelFactory.h.

◆ m_MagConfig

FWDMg_CONFIGURATION ForwardRegionGeoModelFactory::m_MagConfig
private

Definition at line 74 of file ForwardRegionGeoModelFactory.h.

◆ m_MapMaterials

std::map<std::string,const GeoMaterial*> ForwardRegionGeoModelFactory::m_MapMaterials
private

Definition at line 70 of file ForwardRegionGeoModelFactory.h.

◆ m_properties

ToolHandle<IForwardRegionProperties> ForwardRegionGeoModelFactory::m_properties
private

Definition at line 76 of file ForwardRegionGeoModelFactory.h.


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