56 int minimalgeo,
int cutoutson,
57 const std::vector<Cutout *>& vcutdef) {
63 if (cutoutson && !vcutdef.empty()) {
65 GeoShape *cutoutShape =
nullptr;
66 GeoTrf::Transform3D cutTrans{GeoTrf::Transform3D::Identity()};
67 for (
unsigned i = 0; i < vcutdef.size(); 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));
75 const GeoMaterial *mtrd = matManager.
getMaterial(
"std::G10");
76 GeoLogVol *ltrd =
new GeoLogVol(
logVolName, strd, mtrd);
77 GeoFullPhysVol *ptrd =
new GeoFullPhysVol(ltrd);
84 ptrd->add(
new GeoSerialIdentifier(0));
90 for (
int i = 0; i < t->nlayers; i++) {
92 double longWidthActive;
95 if (t->materials[i] ==
"muo::TGCGas") {
99 ptrd->add(
new GeoIdentifierTag(igl));
101 widthActive =
width - (t->frame_ab) * 2;
102 longWidthActive =
longWidth - (t->frame_ab) * 2;
103 lengthActive =
length - (t->frame_h) * 2;
105 const GeoShape *sGasVolume =
new GeoTrd(t->tck[i] / 2, t->tck[i] / 2, widthActive / 2, longWidthActive / 2, lengthActive / 2);
107 if (t->widthWireSupport != 0. && t->radiusButton != 0.) {
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);
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);
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);
120 for (
int isup = iymin; isup <= iymax; isup++) {
123 if (t->offsetWireSupport[iSenLyr] + t->distanceWireSupport * isup > 0.) {
125 }
else if (t->offsetWireSupport[iSenLyr] + t->distanceWireSupport * isup == 0.) {
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.);
131 sGasVolume = &(sGasVolume->subtract((*strdsup) << GeoTrf::Transform3D(vtransWS * rotX)));
135 izmax = int((lengthActive / 2. - t->radiusButton) / (t->pitchButton[1] / 2.));
139 double yposCentre[2], angleTiltButton[2];
141 double yLongBase, yShortBase;
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);
149 yShortBase = yLongBase;
153 yposCentre[0] = yLongBase;
154 angleTiltButton[0] = atan((yShortBase - yLongBase) / lengthActive);
156 }
else if (isup == iymax) {
158 if (
name ==
"TGC01" ||
name ==
"TGC06" ||
name ==
"TGC12") {
159 for (
int iside = 0; iside < 2; iside++) {
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.);
176 sGasVolume = &(sGasVolume->subtract((*strdsupex) << GeoTrf::Transform3D(vtrans * rotX)));
181 double widthLeftTrd = (t->distanceWireSupport * iymin + t->offsetWireSupport[iSenLyr] + lengthActive * tan(t->angleTilt)) - (-widthActive / 2.);
182 if (widthLeftTrd > 8. * Gaudi::Units::cm) {
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])) /
190 yLongBase = ((t->distanceWireSupport * iymin + t->offsetWireSupport[iSenLyr]) + (-longWidthActive / 2.)) / 2.;
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);
199 double widthRightTrd = widthActive / 2. - (t->distanceWireSupport * iymax + t->offsetWireSupport[iSenLyr] + lengthActive * tan(-t->angleTilt));
201 if (widthRightTrd > 8. * Gaudi::Units::cm) {
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])) /
209 yLongBase = ((t->distanceWireSupport * iymax + t->offsetWireSupport[iSenLyr]) + longWidthActive / 2.) / 2.;
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);
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)));
231 if (cutoutson && !vcutdef.empty()) {
235 GeoShape *cutoutShape =
nullptr;
236 GeoTrf::Transform3D cutTrans{GeoTrf::Transform3D::Identity()};
237 for (
unsigned i = 0; i < vcutdef.size(); 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));
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)));
261 }
else if (t->materials[i] !=
"std:G10") {
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()) {
267 GeoShape *cutoutShape =
nullptr;
268 GeoTrf::Transform3D cutTrans{GeoTrf::Transform3D::Identity()};
269 for (
unsigned i = 0; i < vcutdef.size(); 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));
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)));