ATLAS Offline Software
Loading...
Searching...
No Matches
MuonGM::Tgc Class Reference

#include <Tgc.h>

Inheritance diagram for MuonGM::Tgc:
Collaboration diagram for MuonGM::Tgc:

Public Member Functions

 Tgc (const MYSQL &mysql, Component *s)
GeoFullPhysVol * build (StoredMaterialManager &matManager, const MYSQL &mysql, int minimalgeo)
GeoFullPhysVol * build (StoredMaterialManager &matManager, const MYSQL &mysql, int minimalgeo, int cutoutson, const std::vector< Cutout * > &)
virtual void print () const override
void setLogVolName (const std::string &str)

Public Attributes

double width {0.}
double length {0.}
double thickness {0.}
double longWidth {0.}
double irad {0.}
double orad {0.}
double dphi {0.}
int index {0}
std::string name {}
std::string logVolName {}

Private Attributes

TgcComponentm_component {nullptr}

Detailed Description

Definition at line 18 of file Tgc.h.

Constructor & Destructor Documentation

◆ Tgc()

MuonGM::Tgc::Tgc ( const MYSQL & mysql,
Component * s )

Definition at line 36 of file Tgc.cxx.

36 : DetectorElement(ss->name) {
37 TgcComponent *s = static_cast<TgcComponent *>(ss);
38 m_component = s;
39 width = s->dx1;
40 longWidth = s->dx2;
41 length = s->dy;
42 thickness = s->GetThickness(mysql);
43 index = s->index;
44 }
static Double_t ss
DetectorElement(const std::string &n)
double length
Definition Tgc.h:22
double thickness
Definition Tgc.h:23
TgcComponent * m_component
Definition Tgc.h:41
int index
Definition Tgc.h:28
double width
Definition Tgc.h:21
double longWidth
Definition Tgc.h:24

Member Function Documentation

◆ build() [1/2]

GeoFullPhysVol * MuonGM::Tgc::build ( StoredMaterialManager & matManager,
const MYSQL & mysql,
int minimalgeo )

Definition at line 46 of file Tgc.cxx.

48 {
49 std::vector<Cutout *> vcutdef;
50 int cutoutson = 0;
51 return build(matManager, mysql, minimalgeo, cutoutson, vcutdef);
52 }
GeoFullPhysVol * build(StoredMaterialManager &matManager, const MYSQL &mysql, int minimalgeo)
Definition Tgc.cxx:46

◆ build() [2/2]

GeoFullPhysVol * MuonGM::Tgc::build ( StoredMaterialManager & matManager,
const MYSQL & mysql,
int minimalgeo,
int cutoutson,
const std::vector< Cutout * > & vcutdef )

Definition at line 54 of file Tgc.cxx.

57 {
58 const TGC *t = dynamic_cast<const TGC*>(mysql.GetTechnology(name));
59 thickness = t->thickness;
60
61 // Build TGC mother volume out of G10
62 const GeoShape *strd = new GeoTrd(thickness / 2, thickness / 2, width / 2, longWidth / 2, length / 2);
63 if (cutoutson && !vcutdef.empty()) {
64 Cutout *cut = nullptr;
65 GeoShape *cutoutShape = nullptr;
66 GeoTrf::Transform3D cutTrans{GeoTrf::Transform3D::Identity()};
67 for (unsigned i = 0; i < vcutdef.size(); i++) {
68 cut = vcutdef[i];
69 cutoutShape = new GeoTrd(thickness / 2. + 1., thickness / 2. + 1., cut->widthXs / 2., cut->widthXl / 2., cut->lengthY / 2.);
70 cutTrans = GeoTrf::Translate3D(0.0, cut->dx, -length / 2 + cut->dy + cut->lengthY / 2.);
71 strd = &(strd->subtract((*cutoutShape) << cutTrans));
72 }
73 }
74
75 const GeoMaterial *mtrd = matManager.getMaterial("std::G10");
76 GeoLogVol *ltrd = new GeoLogVol(logVolName, strd, mtrd);
77 GeoFullPhysVol *ptrd = new GeoFullPhysVol(ltrd);
78
79 if (minimalgeo == 1)
80 return ptrd;
81
82 double newpos = -thickness / 2.;
83 if (!skip_tgc)
84 ptrd->add(new GeoSerialIdentifier(0));
85
86 int igl = 0;
87 int iSenLyr = 0;
88
89 // Loop over TGC layers
90 for (int i = 0; i < t->nlayers; i++) {
91 double widthActive;
92 double longWidthActive;
93 double lengthActive;
94
95 if (t->materials[i] == "muo::TGCGas") {
96 // sensitive volume with wire/button support
97 igl++;
98 if (!skip_tgc)
99 ptrd->add(new GeoIdentifierTag(igl));
100
101 widthActive = width - (t->frame_ab) * 2;
102 longWidthActive = longWidth - (t->frame_ab) * 2;
103 lengthActive = length - (t->frame_h) * 2;
104
105 const GeoShape *sGasVolume = new GeoTrd(t->tck[i] / 2, t->tck[i] / 2, widthActive / 2, longWidthActive / 2, lengthActive / 2);
106
107 if (t->widthWireSupport != 0. && t->radiusButton != 0.) {
108 // No supports for CTB simulation since their parameters are not in the DB
109 // Build wire supports and button supports in sensitive volume
110
111 // wire supports
112 GeoTrd *strdsup = new GeoTrd(t->tck[i] / 2, t->tck[i] / 2, t->widthWireSupport / 2, t->widthWireSupport / 2, lengthActive / 2 - 0.1 * Gaudi::Units::mm);
113 // button supports
114 GeoTube *stubesup = new GeoTube(0., t->radiusButton, t->tck[i] / 2. + 0.005 * Gaudi::Units::mm);
115 GeoTrf::RotateY3D rotY(M_PI_2 * Gaudi::Units::rad);
116
117 int iymin = int(-(widthActive / 2. + lengthActive * tan(t->angleTilt) - t->widthWireSupport / 2. + t->offsetWireSupport[iSenLyr]) / t->distanceWireSupport);
118 int iymax = int((widthActive / 2. + lengthActive * tan(t->angleTilt) - t->widthWireSupport / 2. - t->offsetWireSupport[iSenLyr]) / t->distanceWireSupport);
119
120 for (int isup = iymin; isup <= iymax; isup++) { // loop over wire supports
121 // place wire supports
122 double sign = 1.;
123 if (t->offsetWireSupport[iSenLyr] + t->distanceWireSupport * isup > 0.) {
124 sign = -1.;
125 } else if (t->offsetWireSupport[iSenLyr] + t->distanceWireSupport * isup == 0.) {
126 sign = 0;
127 }
128 GeoTrf::RotateX3D rotX(sign * t->angleTilt);
129 GeoTrf::Translate3D vtransWS(0., t->offsetWireSupport[iSenLyr] + t->distanceWireSupport * isup + lengthActive / 2. * tan(sign * t->angleTilt), 0.);
130
131 sGasVolume = &(sGasVolume->subtract((*strdsup) << GeoTrf::Transform3D(vtransWS * rotX)));
132
133 // place button supports
134 int izmin, izmax;
135 izmax = int((lengthActive / 2. - t->radiusButton) / (t->pitchButton[1] / 2.));
136 izmin = -izmax;
137
138 int nBS = 0;
139 double yposCentre[2], angleTiltButton[2];
140 if (isup < iymax) { // button support in rectangular sensitive area
141 double yLongBase, yShortBase;
142 yLongBase =
143 ((t->offsetWireSupport[iSenLyr] + t->distanceWireSupport * (isup + 1)) + (t->offsetWireSupport[iSenLyr] + t->distanceWireSupport * isup)) / 2.;
144 if (t->offsetWireSupport[iSenLyr] + t->distanceWireSupport * (isup + 1) < 0.) {
145 yShortBase = yLongBase + lengthActive * tan(t->angleTilt);
146 } else if (t->offsetWireSupport[iSenLyr] + t->distanceWireSupport * (isup) > 0.) {
147 yShortBase = yLongBase + lengthActive * tan(-t->angleTilt);
148 } else {
149 yShortBase = yLongBase;
150 }
151
152 nBS = 1;
153 yposCentre[0] = yLongBase;
154 angleTiltButton[0] = atan((yShortBase - yLongBase) / lengthActive);
155
156 } else if (isup == iymax) {
157 // place extra wire supports for TGC01, TGC06 and TGC12
158 if (name == "TGC01" || name == "TGC06" || name == "TGC12") {
159 for (int iside = 0; iside < 2; iside++) {
160 int isupy;
161 if (iside == 0) {
162 isupy = iymin - 1;
163 sign = 1.;
164 } else {
165 isupy = iymax + 1;
166 sign = -1.;
167 }
168 double lengthWireSupportEx;
169 lengthWireSupportEx = lengthActive / (longWidthActive / 2. - widthActive / 2.) *
170 (longWidthActive / 2. - fabs(t->distanceWireSupport * isupy + t->offsetWireSupport[iSenLyr]));
171 GeoTrd *strdsupex = new GeoTrd(t->tck[i] / 2, t->tck[i] / 2, t->widthWireSupport / 2, t->widthWireSupport / 2,
172 lengthWireSupportEx / 2 - 0.1 * Gaudi::Units::mm);
173 GeoTrf::Translate3D vtrans(0., t->offsetWireSupport[iSenLyr] + t->distanceWireSupport * isupy + lengthActive / 2. * tan(sign * t->angleTilt),
174 (lengthActive - lengthWireSupportEx) / 2.);
175
176 sGasVolume = &(sGasVolume->subtract((*strdsupex) << GeoTrf::Transform3D(vtrans * rotX)));
177 }
178 } // End special case for TGC01, 06, 12
179
180 // button supports in trapezoidal sensitive area
181 double widthLeftTrd = (t->distanceWireSupport * iymin + t->offsetWireSupport[iSenLyr] + lengthActive * tan(t->angleTilt)) - (-widthActive / 2.);
182 if (widthLeftTrd > 8. * Gaudi::Units::cm) {
183 double yLongBase;
184 if ((name == "TGC01" || name == "TGC06" || name == "TGC12") &&
185 t->distanceWireSupport * (iymin - 1) + t->offsetWireSupport[iSenLyr] > -longWidthActive / 2.) {
186 yLongBase = ((t->distanceWireSupport * (iymin - 1) + t->offsetWireSupport[iSenLyr]) +
187 (t->distanceWireSupport * iymin + t->offsetWireSupport[iSenLyr])) /
188 2.;
189 } else {
190 yLongBase = ((t->distanceWireSupport * iymin + t->offsetWireSupport[iSenLyr]) + (-longWidthActive / 2.)) / 2.;
191 }
192 double yShortBase =
193 ((t->distanceWireSupport * iymin + t->offsetWireSupport[iSenLyr] + lengthActive * tan(t->angleTilt)) + (-widthActive / 2.)) / 2.;
194 yposCentre[nBS] = yLongBase;
195 angleTiltButton[nBS] = atan((yShortBase - yLongBase) / lengthActive);
196 nBS++;
197 }
198
199 double widthRightTrd = widthActive / 2. - (t->distanceWireSupport * iymax + t->offsetWireSupport[iSenLyr] + lengthActive * tan(-t->angleTilt));
200
201 if (widthRightTrd > 8. * Gaudi::Units::cm) {
202 double yLongBase;
203 if ((name == "TGC01" || name == "TGC06" || name == "TGC12") &&
204 t->distanceWireSupport * (iymax + 1) + t->offsetWireSupport[iSenLyr] < longWidthActive / 2.) {
205 yLongBase = ((t->distanceWireSupport * (iymax + 1) + t->offsetWireSupport[iSenLyr]) +
206 (t->distanceWireSupport * iymax + t->offsetWireSupport[iSenLyr])) /
207 2.;
208 } else {
209 yLongBase = ((t->distanceWireSupport * iymax + t->offsetWireSupport[iSenLyr]) + longWidthActive / 2.) / 2.;
210 }
211 double yShortBase = ((t->distanceWireSupport * iymax + t->offsetWireSupport[iSenLyr] + lengthActive * tan(-t->angleTilt)) + widthActive / 2.) / 2.;
212 yposCentre[nBS] = yLongBase;
213 angleTiltButton[nBS] = atan((yShortBase - yLongBase) / lengthActive);
214 nBS++;
215 }
216
217 if (nBS == 0) { // no button support in trapezoidal sensitive area
218 break; // leave isup loop
219 }
220 } // isup, iymax
221 for (int iBS = 0; iBS < nBS; iBS++) {
222 for (int isupz = izmin; isupz <= izmax; isupz++) {
223 double yposleft = yposCentre[iBS] - t->pitchButton[0] / 2. + (lengthActive / 2. - t->pitchButton[1] / 2. * isupz) * tan(angleTiltButton[iBS]);
224 GeoTrf::Translate3D vtransBS(0., yposleft + t->pitchButton[0] * std::abs(isupz % 2), t->pitchButton[1] / 2. * isupz);
225 sGasVolume = &(sGasVolume->subtract((*stubesup) << GeoTrf::Transform3D(vtransBS * rotY)));
226 }
227 }
228 } // loop over wire supports
229 } // No supports for CTB Simulation
230
231 if (cutoutson && !vcutdef.empty()) {
232 // Make cutout in gas volume a bit larger so that G10 of mother volume
233 // makes a gas boundary
234 Cutout *cut = nullptr;
235 GeoShape *cutoutShape = nullptr;
236 GeoTrf::Transform3D cutTrans{GeoTrf::Transform3D::Identity()};
237 for (unsigned i = 0; i < vcutdef.size(); i++) {
238 cut = vcutdef[i];
239 cutoutShape = new GeoTrd(thickness / 2. + 1., thickness / 2. + 1., cut->widthXs / 2. + t->frame_ab / 2., cut->widthXl / 2. + t->frame_ab / 2.,
240 cut->lengthY / 2. + t->frame_h / 2.);
241 cutTrans = GeoTrf::Translate3D(0.0, cut->dx, -length / 2 + cut->dy + cut->lengthY / 2.);
242 sGasVolume = &(sGasVolume->subtract((*cutoutShape) << cutTrans));
243 }
244 }
245
246 GeoLogVol *ltrdtmp = new GeoLogVol(t->materials[i], sGasVolume, matManager.getMaterial(t->materials[i]));
247 GeoPhysVol *ptrdtmp = new GeoPhysVol(ltrdtmp);
248 GeoNameTag *ntrdtmp = new GeoNameTag(name + t->materials[i]);
249 GeoTransform *ttrdtmp = new GeoTransform(GeoTrf::TranslateX3D(newpos + (t->tck[i] / 2)));
250
251 // Place gas volume inside G10 mother volume so that
252 // subtractions from gas volume now become G10
253 if (!skip_tgc) {
254 ptrd->add(ntrdtmp);
255 ptrd->add(ttrdtmp);
256 ptrd->add(ptrdtmp);
257 }
258
259 iSenLyr++;
260
261 } else if (t->materials[i] != "std:G10") {
262 // passive structure, Copper, Honeycomb,
263 // except for G10 which is material of the mother volume
264 const GeoShape *strdtmp = new GeoTrd(t->tck[i] / 2, t->tck[i] / 2, width / 2, longWidth / 2, length / 2);
265 if (cutoutson && !vcutdef.empty()) {
266 Cutout *cut = nullptr;
267 GeoShape *cutoutShape = nullptr;
268 GeoTrf::Transform3D cutTrans{GeoTrf::Transform3D::Identity()};
269 for (unsigned i = 0; i < vcutdef.size(); i++) {
270 cut = vcutdef[i];
271 cutoutShape = new GeoTrd(thickness / 2. + 1., thickness / 2. + 1., cut->widthXs / 2., cut->widthXl / 2., cut->lengthY / 2.);
272 cutTrans = GeoTrf::Translate3D(0.0, cut->dx, -length / 2 + cut->dy + cut->lengthY / 2.);
273 strdtmp = &(strdtmp->subtract((*cutoutShape) << cutTrans));
274 }
275 }
276 GeoLogVol *ltrdtmp = new GeoLogVol(t->materials[i], strdtmp, matManager.getMaterial(t->materials[i]));
277 GeoPhysVol *ptrdtmp = new GeoPhysVol(ltrdtmp);
278 GeoNameTag *ntrdtmp = new GeoNameTag(name + t->materials[i]);
279 GeoTransform *ttrdtmp = new GeoTransform(GeoTrf::TranslateX3D(newpos + (t->tck[i] / 2)));
280
281 if (!skip_tgc) {
282 ptrd->add(ntrdtmp);
283 ptrd->add(ttrdtmp);
284 ptrd->add(ptrdtmp);
285 }
286 } // Active or passive layer
287
288 newpos += t->tck[i];
289 } // Loop over tgc layers
290
291 return ptrd;
292 }
@ TGC
Definition RegSelEnums.h:33
int sign(int a)
#define skip_tgc
Definition Tgc.cxx:32
Technology * GetTechnology(const std::string &name)
Definition MYSQL.cxx:105
virtual const GeoMaterial * getMaterial(const std::string &name)=0
cut
This script demonstrates how to call a C++ class from Python Also how to use PyROOT is shown.

◆ print()

void MuonGM::Tgc::print ( ) const
overridevirtual

Implements MuonGM::DetectorElement.

Definition at line 294 of file Tgc.cxx.

294 {
295 MsgStream log(Athena::getMessageSvc(), "MuGM::Tgc");
296 log << MSG::INFO << " Tgc " << name << " :" << endmsg;
297 }
#define endmsg
IMessageSvc * getMessageSvc(bool quiet=false)

◆ setLogVolName()

void MuonGM::DetectorElement::setLogVolName ( const std::string & str)
inlineinherited

Member Data Documentation

◆ dphi

double MuonGM::Tgc::dphi {0.}

Definition at line 27 of file Tgc.h.

27{0.};

◆ index

int MuonGM::Tgc::index {0}

Definition at line 28 of file Tgc.h.

28{0};

◆ irad

double MuonGM::Tgc::irad {0.}

Definition at line 25 of file Tgc.h.

25{0.};

◆ length

double MuonGM::Tgc::length {0.}

Definition at line 22 of file Tgc.h.

22{0.};

◆ logVolName

std::string MuonGM::DetectorElement::logVolName {}
inherited

Definition at line 18 of file DetectorElement.h.

18{};

◆ longWidth

double MuonGM::Tgc::longWidth {0.}

Definition at line 24 of file Tgc.h.

24{0.}; // for trapezoidal layers

◆ m_component

TgcComponent* MuonGM::Tgc::m_component {nullptr}
private

Definition at line 41 of file Tgc.h.

41{nullptr};

◆ name

std::string MuonGM::DetectorElement::name {}
inherited

Definition at line 17 of file DetectorElement.h.

17{};

◆ orad

double MuonGM::Tgc::orad {0.}

Definition at line 26 of file Tgc.h.

26{0.};

◆ thickness

double MuonGM::Tgc::thickness {0.}

Definition at line 23 of file Tgc.h.

23{0.};

◆ width

double MuonGM::Tgc::width {0.}

Definition at line 21 of file Tgc.h.

21{0.};

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