ATLAS Offline Software
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 
5 #include "MuonGeoModel/Spacer.h"
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"
25 #include "MuonGeoModel/Station.h"
27 // for cutouts:
28 #include "GeoModelKernel/GeoShapeSubtraction.h"
29 
30 #define skip_spacer false
31 
32 namespace 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
MuonGM::SpaComponent
Definition: SpaComponent.h:12
MuonGM::MYSQL::GetTechnology
Technology * GetTechnology(const std::string &name)
Definition: MYSQL.cxx:105
MuonGM::DetectorElement::name
std::string name
Definition: DetectorElement.h:17
MuonGM
Ensure that the Athena extensions are properly loaded.
Definition: GeoMuonHits.h:27
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
getMessageSvc.h
singleton-like access to IMessageSvc via open function and helper
Spacer.h
MuonGM::Spacer::width
double width
Definition: MuonSpectrometer/MuonDetDescr/MuonGeoModel/MuonGeoModel/Spacer.h:19
MuonGM::SpaComponent::maxwdy
double maxwdy
Definition: SpaComponent.h:14
deg
#define deg
Definition: SbPolyhedron.cxx:17
MuonGM::MYSQL
Definition: MYSQL.h:43
MuonGM::Spacer::longWidth
double longWidth
Definition: MuonSpectrometer/MuonDetDescr/MuonGeoModel/MuonGeoModel/Spacer.h:22
MuonGM::DetectorElement
Definition: DetectorElement.h:15
Athena::getMessageSvc
IMessageSvc * getMessageSvc(bool quiet=false)
Definition: getMessageSvc.cxx:20
Station.h
python.selector.AtlRunQuerySelectorLhcOlc.sd
sd
Definition: AtlRunQuerySelectorLhcOlc.py:612
MuonGM::Component
Definition: Component.h:11
skip_spacer
#define skip_spacer
Definition: MuonSpectrometer/MuonDetDescr/MuonGeoModel/src/Spacer.cxx:30
SpaComponent.h
lumiFormat.i
int i
Definition: lumiFormat.py:92
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
MuonGM::Spacer::print
virtual void print() const override
Definition: MuonSpectrometer/MuonDetDescr/MuonGeoModel/src/Spacer.cxx:141
MuonGM::Spacer::build
GeoVPhysVol * build(StoredMaterialManager &matManager)
Definition: MuonSpectrometer/MuonDetDescr/MuonGeoModel/src/Spacer.cxx:43
MuonGM::StandardComponent::excent
double excent
Definition: StandardComponent.h:25
MYSQL.h
MuonGM::Technology::thickness
double thickness
Definition: Technology.h:20
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
MuonGM::Spacer::m_component
SpaComponent m_component
Definition: MuonSpectrometer/MuonDetDescr/MuonGeoModel/MuonGeoModel/Spacer.h:30
makeTRTBarrelCans.dy
tuple dy
Definition: makeTRTBarrelCans.py:21
makeTRTBarrelCans.dx
tuple dx
Definition: makeTRTBarrelCans.py:20
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
StoredMaterialManager::getMaterial
virtual const GeoMaterial * getMaterial(const std::string &name)=0
StoredMaterialManager
This class holds one or more material managers and makes them storeable, under StoreGate.
Definition: StoredMaterialManager.h:28
MuonGM::Spacer::Spacer
Spacer(const MYSQL &mysql, Component *s)
Definition: MuonSpectrometer/MuonDetDescr/MuonGeoModel/src/Spacer.cxx:34
MuonGM::Spacer::length
double length
Definition: MuonSpectrometer/MuonDetDescr/MuonGeoModel/MuonGeoModel/Spacer.h:20
MuonGM::Spacer::thickness
double thickness
Definition: MuonSpectrometer/MuonDetDescr/MuonGeoModel/MuonGeoModel/Spacer.h:21
Technology.h
fitman.k
k
Definition: fitman.py:528