ATLAS Offline Software
Loading...
Searching...
No Matches
Cutout.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include "GaudiKernel/SystemOfUnits.h"
8#include "GeoModelKernel/GeoBox.h"
9#include "GeoModelKernel/GeoDefinitions.h"
10#include "GeoModelKernel/GeoPara.h"
11#include "GeoModelKernel/GeoShape.h"
12#include "GeoModelKernel/GeoShapeShift.h"
13#include "GeoModelKernel/GeoTransform.h"
14#include "GeoModelKernel/GeoTrap.h"
15#include "GeoModelKernel/GeoTrd.h"
16
17namespace MuonGM {
18
19 void Cutout::setThickness(double compThickness) { thickness = compThickness; }
20
21 const GeoShape *Cutout::build() {
22 // position it with its intrinsic position info:
23 double zpos = dy + lengthY / 2.;
24
25 GeoTrf::Transform3D xfTemp = GeoTrf::Translate3D(0., dx, zpos);
26 const GeoShape *sCutout;
27 /*
28 // This is just to make sure we are putting stuff in the right place:
29 GeoBox *cutoutbox = new GeoBox(thickness/2.,widthXl/2.,lengthY/2.);
30 sCutout = & ( (*cutoutbox) <<xfTemp);
31 */
32 // This is the proper way to do it, but not sure if complicated working...
33 if (widthXl == widthXs && dead1 == 0.) {
34 GeoIntrusivePtr<GeoBox> cutoutbox{new GeoBox(thickness / 2., widthXs / 2., lengthY / 2.)};
35 sCutout = &((*cutoutbox) << xfTemp);
36 } else if (dead1 == 0.) {
37 GeoTrd *cutouttrd = new GeoTrd(thickness / 2., thickness / 2., widthXs / 2., widthXl / 2., lengthY / 2.);
38 sCutout = &((*cutouttrd) << xfTemp);
39 } else if (widthXl == widthXs) {
40 // angle between length-axis and HV/RO ends of chamber:
41 double alpha = atan(2. * excent / lengthY);
42 // polar and azimuthal angles of vector describing offset of
43 // cutout planes:
44 double theta = -dead1 * Gaudi::Units::degree;
45 double phi = -90. * Gaudi::Units::degree;
46 // GeoPara requires the +/- z faces be parallel to the x-y plane,
47 // so choose x = width, y=length, z=thickness:
48 GeoIntrusivePtr<GeoPara> cutoutpara{new GeoPara(widthXs / 2., lengthY / 2., thickness / 2., alpha, theta, phi)};
49 // now rotate it so thickness is x-axis, width is y-axis, length z-axis:
50 GeoTrf::Transform3D xRot = GeoTrf::RotateX3D(-90. * Gaudi::Units::degree) * GeoTrf::RotateY3D(-90. * Gaudi::Units::degree);
51 xfTemp = xfTemp * xRot;
52 sCutout = &((*cutoutpara) << xfTemp);
53 } else {
54 GeoIntrusivePtr<GeoTrap> cutouttrap{
55 new GeoTrap(thickness / 2., dead1 * Gaudi::Units::degree, 90. * Gaudi::Units::degree, excent, widthXs / 2., widthXl / 2.,
56 atan((2. * excent + (widthXl - widthXs) / 2.) / lengthY), excent, widthXs / 2., widthXl / 2., atan((2. * excent + (widthXl - widthXs) / 2.) / lengthY))};
57
58 // now rotate it so thickness is x-axis, width is y-axis, length z-axis:
59 GeoTrf::Transform3D xRot = GeoTrf::RotateX3D(-90. * Gaudi::Units::degree) * GeoTrf::RotateY3D(-90. * Gaudi::Units::degree);
60 xfTemp = xfTemp * xRot;
61 sCutout = &((*cutouttrap) << xfTemp);
62 }
63
64 return sCutout;
65 }
66
67 std::ostream &operator<<(std::ostream &os, const Cutout &p) {
68 os << " Cutout: "
69 << " x/y/width_s/width_l/length/excent/dead1: " << p.dx << " " << p.dy << " " << p.widthXs << " " << p.widthXl << " " << p.lengthY << " " << p.excent << " " << p.dead1
70 << " component index=" << p.ijob;
71
72 return os;
73 }
74
75} // namespace MuonGM
Scalar phi() const
phi method
Scalar theta() const
theta method
double thickness
Definition Cutout.h:30
double widthXl
Definition Cutout.h:26
double dy
Definition Cutout.h:24
Cutout()=default
double dead1
Definition Cutout.h:29
const GeoShape * build()
Definition Cutout.cxx:21
double widthXs
Definition Cutout.h:25
double lengthY
Definition Cutout.h:27
void setThickness(double compThickness)
Definition Cutout.cxx:19
double excent
Definition Cutout.h:28
double dx
Definition Cutout.h:23
Ensure that the Athena extensions are properly loaded.
Definition GeoMuonHits.h:27
std::ostream & operator<<(std::ostream &os, const AlignPos &p)
Definition AlignPos.cxx:8