ATLAS Offline Software
Loading...
Searching...
No Matches
MuonSpectrometer/MuonDetDescr/MuonGeoModel/src/Spacer.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6
8#include "GaudiKernel/MsgStream.h"
9#include "GaudiKernel/SystemOfUnits.h"
10#include "GeoModelKernel/GeoDefinitions.h"
11#include "GeoModelKernel/GeoLogVol.h"
12#include "GeoModelKernel/GeoMaterial.h"
13#include "GeoModelKernel/GeoNameTag.h"
14#include "GeoModelKernel/GeoPhysVol.h"
15#include "GeoModelKernel/GeoSerialDenominator.h"
16#include "GeoModelKernel/GeoSerialIdentifier.h"
17#include "GeoModelKernel/GeoShapeShift.h"
18#include "GeoModelKernel/GeoShapeUnion.h"
19#include "GeoModelKernel/GeoTransform.h"
20#include "GeoModelKernel/GeoTrd.h"
21#include "GeoModelKernel/GeoTube.h"
22#include "GeoModelKernel/GeoVPhysVol.h"
23#include "MuonGeoModel/MYSQL.h"
27// for cutouts:
28#include "GeoModelKernel/GeoShapeSubtraction.h"
29
30#define skip_spacer false
31
32namespace MuonGM {
33
35 SpaComponent *s = dynamic_cast<SpaComponent *>(ss);
36 width = s->dx1;
37 longWidth = s->dx2;
38 thickness = mysql.GetTechnology(s->name)->thickness;
39 length = s->dy;
40 m_component = *s;
41 }
42
43 GeoVPhysVol *Spacer::build(StoredMaterialManager& matManager) {
44 int cutoutson = 0;
45 return build(matManager, cutoutson);
46 }
47
48 GeoVPhysVol *Spacer::build(StoredMaterialManager& matManager, int /*cutoutson*/) {
49 if (name == "SPA06" || name == "SPA01") {
50 double excent = m_component.excent;
51 double maxwLength = m_component.maxwdy;
52
53 const GeoShape *strd = new GeoTrd(thickness / 2., thickness / 2., width / 2., longWidth / 2., maxwLength / 2.);
54 double upWidth = 0.;
55 if (excent > length)
56 upWidth = longWidth * (excent - length) / (excent - maxwLength);
57
58 if (excent > length && (length - maxwLength) > 0) {
59 // std::cout<<" Here is an exagonal SPA ***** named "<<name<<" excent = "
60 // <<excent<<" length = "<<length<<std::endl;
61 GeoTrd *upTrd = new GeoTrd(thickness / 2., thickness / 2., longWidth / 2., upWidth / 2., (length - maxwLength) / 2.);
62 strd = &((strd->add((*upTrd) << GeoTrf::TranslateZ3D(length / 2.))) << GeoTrf::TranslateZ3D((maxwLength - length) / 2.));
63 }
64
65 const GeoMaterial *mtrd = matManager.getMaterial("std::Aluminium");
66 const GeoLogVol *lspa = new GeoLogVol("CSCspacer", strd, mtrd);
67 GeoPhysVol *pspa = new GeoPhysVol(lspa);
68 return pspa;
69
70 } else {
71 const GeoShape *strd = new GeoTrd(thickness / 2, thickness / 2, width / 2, longWidth / 2, length / 2);
72 const GeoMaterial *mtrd = matManager.getMaterial("std::Air");
73 GeoLogVol *ltrd = new GeoLogVol("Spacer", strd, mtrd);
74 GeoPhysVol *ptrd = new GeoPhysVol(ltrd);
75
76 double tckibeam = thickness / 5.;
77 double dx = tckibeam;
78 double dy = 3. * tckibeam;
79
80 GeoVPhysVol *ptrdtemp = nullptr;
81
82 GeoTrd *strd1 = new GeoTrd(dx / 2, dx / 2, dy / 2, dy / 2, length / 2);
83 const GeoMaterial *mtrd1 = matManager.getMaterial("std::Aluminium");
84 GeoLogVol *ltrd1 = new GeoLogVol("ibeam1", strd1, mtrd1);
85 GeoPhysVol *ptrd1 = new GeoPhysVol(ltrd1);
86
87 GeoTrd *strd2 = new GeoTrd(dy / 2, dy / 2, dx / 2, dx / 2, length / 2);
88 const GeoMaterial *mtrd2 = matManager.getMaterial("std::Aluminium");
89 GeoLogVol *ltrd2 = new GeoLogVol("ibeam2", strd2, mtrd2);
90 GeoPhysVol *ptrd2 = new GeoPhysVol(ltrd2);
91
92 GeoSerialDenominator *sd = new GeoSerialDenominator(name + " ibeam");
93 if (!skip_spacer) {
94 ptrd->add(sd);
95 ptrd->add(new GeoSerialIdentifier(0));
96 }
97
98 double newpos = -thickness / 2.;
99 double wherepos = newpos;
100 double wherewidth = -width / 2.;
101 for (int j = 0; j < 3; j++) {
102 for (int i = 0; i < 3; i++) {
103 ptrdtemp = ptrd1;
104 if (i == 1) {
105 ptrdtemp = ptrd2;
106 tckibeam = dy;
107 }
108 GeoTransform *xf = new GeoTransform(GeoTrf::Translate3D(wherepos + tckibeam / 2, wherewidth + dy / 2, 0));
109 if (!skip_spacer) {
110 ptrd->add(xf);
111 ptrd->add(ptrdtemp);
112 }
113 wherepos += tckibeam;
114 tckibeam = dx;
115 }
116 wherepos -= thickness;
117 wherewidth += (width / 2. - dy / 2.);
118 }
119
120 double vtubl = (width - 5 * tckibeam) / 2.;
121
122 GeoSerialDenominator *ntube = new GeoSerialDenominator(name + " vbeam");
123 if (!skip_spacer) {
124 ptrd->add(ntube);
125 ptrd->add(new GeoSerialIdentifier(0));
126 }
127
128 for (int k1 = 0; k1 < 2; k1++) {
129 for (int k = 0; k < 2; k++) {
130 GeoTransform *ttube = new GeoTransform(GeoTrf::RotateX3D(-90 * Gaudi::Units::deg) *
131 GeoTrf::Translate3D(0., -(vtubl + tckibeam) / 2. - (k - 1) * (vtubl + tckibeam), -length / 4. - (k1 - 1) * length / 2));
132 if (!skip_spacer)
133 ptrd->add(ttube);
134 }
135 }
136
137 return ptrd;
138 }
139 }
140
141 void Spacer::print() const {
142 MsgStream log(Athena::getMessageSvc(), "MuGM:MuonChamber:Spacer");
143 log << MSG::INFO << "Spacer " << name << " :" << endmsg;
144 }
145
146} // namespace MuonGM
#define endmsg
static Double_t ss
DetectorElement(const std::string &n)
Technology * GetTechnology(const std::string &name)
Definition MYSQL.cxx:105
GeoVPhysVol * build(StoredMaterialManager &matManager)
This class holds one or more material managers and makes them storeable, under StoreGate.
virtual const GeoMaterial * getMaterial(const std::string &name)=0
singleton-like access to IMessageSvc via open function and helper
IMessageSvc * getMessageSvc(bool quiet=false)
Ensure that the Athena extensions are properly loaded.
Definition GeoMuonHits.h:27