ATLAS Offline Software
Loading...
Searching...
No Matches
SCT_InnerSide.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5//
6// 13rd Mar 2005 D.Naito
7// 28th Mar 2005 S.Mima
8// Wed 15th Jun 2005 D.Naito modified.
9//
10#include "SCT_InnerSide.h"
11
12#include "SCT_MaterialManager.h"
13
14#include "SCT_GeometryManager.h"
17#include "SCT_Identifier.h"
18
19// module parts.
20#include "SCT_Sensor.h"
21#include "SCT_Hybrid.h"
22
24
25#include "GeoModelRead/ReadGeoModel.h"
26#include "GeoModelKernel/GeoBox.h"
27#include "GeoModelKernel/GeoLogVol.h"
28#include "GeoModelKernel/GeoPhysVol.h"
29#include "GeoModelKernel/GeoFullPhysVol.h"
30#include "GeoModelKernel/GeoNameTag.h"
31#include "GeoModelKernel/GeoIdentifierTag.h"
32#include "GeoModelKernel/GeoTransform.h"
33#include "GeoModelKernel/GeoShape.h"
34#include "GeoModelKernel/GeoShapeUnion.h"
35#include "GeoModelKernel/GeoShapeShift.h"
36#include "GeoModelKernel/GeoDefinitions.h"
37#include "GaudiKernel/SystemOfUnits.h"
38
39#include <cmath>
40#include <utility>
41
42SCT_InnerSide::SCT_InnerSide(const std::string & name,
43 InDetDD::SCT_DetectorManager* detectorManager,
44 SCT_GeometryManager* geometryManager,
45 SCT_MaterialManager* materials,
46 GeoModelIO::ReadGeoModel* sqliteReader,
47 std::shared_ptr<std::map<std::string, GeoFullPhysVol*>> mapFPV,
48 std::shared_ptr<std::map<std::string, GeoAlignableTransform*>> mapAX)
49 : SCT_UniqueComponentFactory(name, detectorManager, geometryManager, materials, sqliteReader, std::move(mapFPV), std::move(mapAX))
50{
53}
54
55
57
58void
60{
61 const SCT_BarrelModuleParameters * parameters = m_geometryManager->barrelModuleParameters();
62 const SCT_GeneralParameters * generalParameters = m_geometryManager->generalParameters();
63
64 m_safety = generalParameters->safety();
65 m_hybridOffsetZ = parameters->hybridOffsetZ();
66 m_hybridOffsetX = parameters->hybridOffsetX();
67}
68
69
70const GeoLogVol *
72{
73 // Create child components
74 m_sensor = std::make_unique<SCT_Sensor>("BRLSensor", m_detectorManager, m_geometryManager, m_materials, m_sqliteReader, m_mapFPV, m_mapAX);
75
76 if(m_sqliteReader) return nullptr;
77
78 m_hybrid = std::make_unique<SCT_Hybrid>("Hybrid", m_detectorManager, m_geometryManager, m_materials);
79
80 //
81 // Define constants for convenience.
82 // t_XXX: thickness of XXX.
83 // w_XXX: width of XXX.
84 // l_XXX: length of XXX.
85 //
86 const double t_hybrid = m_hybrid->thickness();
87 const double w_hybrid = m_hybrid->width();
88 const double l_hybrid = m_hybrid->length();
89
90 const double t_sensor = m_sensor->thickness();
91 const double w_sensor = m_sensor->width();
92 const double l_sensor = m_sensor->length();
93
94 //
95 // Calculate a few things.
96 //
97 const double sensorPosX = 0.0;
98 const double sensorPosY = 0.0;
99 const double sensorPosZ = 0.0;
100
101 const double hybridPosX = m_hybridOffsetX;
102 const double hybridPosY = 0.0;
103 const double hybridPosZ = m_hybridOffsetZ;
104
105 //
106 // ise : InnerSideEnvelope
107 // Reference: sct_module_geometry.ps
108 //
109 const double w_ise1 = w_sensor + m_safety;
110 const double t_ise1 = t_sensor + m_safety;
111 const double l_ise1 = l_sensor + m_safety;
112
113 const double t_ise2 = t_hybrid + m_safety;
114 const double w_ise2 = w_hybrid + m_safety;
115 const double l_ise2 = l_hybrid + m_safety;
116
117 const double ise2PosX = hybridPosX;
118 const double ise2PosY = hybridPosY;
119 const double ise2PosZ = hybridPosZ;
120
121 m_env1RefPointVector = std::make_unique<GeoTrf::Vector3D>(0.0, 0.0, 0.0);
122 m_env2RefPointVector = std::make_unique<GeoTrf::Vector3D>(-ise2PosX, -ise2PosY, -ise2PosZ);
123
124 m_hybridPos = new GeoTransform(GeoTrf::Translate3D(hybridPosX, hybridPosY, hybridPosZ));
125
126 // The depth axis goes from the backside to the implant side
127 // and so point away from the module center.
128 // The two sensor+hybrid combinations are built in a similar way.
129 //
130 // ^
131 // --- hybrid |
132 // ------- sensor | x-axis
133 //
134 // Shown is the outer side. The inner side is the same but with a rotation of 180 deg around the z-axis.
135 //
136 //Gaudi::Units::HepRotation rotSensor;
137 //rotSensor.rotateZ(180*Gaudi::Units::deg);
138 m_sensorPos = new GeoTransform(GeoTrf::Translate3D(sensorPosX, sensorPosY, sensorPosZ));
139
140 //
141 // Make an envelope for the whole module.
142 //
143 const GeoBox * ise1Shape = new GeoBox(0.5 * t_ise1,
144 0.5 * w_ise1,
145 0.5 * l_ise1);
146 const GeoBox * ise2Shape = new GeoBox(0.5 * t_ise2,
147 0.5 * w_ise2,
148 0.5 * l_ise2);
149
150 const GeoShape & InnerSideEnvelopeShape = (*ise1Shape).
151 add(*ise2Shape << GeoTrf::Translate3D(ise2PosX, ise2PosY, ise2PosZ));
152
153 const GeoLogVol * InnerSideEnvelopeLog = new GeoLogVol("InnerSideEnvelope",
154 &InnerSideEnvelopeShape,
155 m_materials->gasMaterial());
156 m_thickness = 0.5*t_ise1 + hybridPosX + 0.5*t_ise2;
157 m_width = w_ise1;
158 m_length = l_ise1;
159
160 return InnerSideEnvelopeLog;
161}
162
163
164GeoVPhysVol *
166{
167
168 if(m_sqliteReader){
169
170 m_sensor->build(id);
171 return nullptr;
172
173 }
174 GeoFullPhysVol * innerSide = new GeoFullPhysVol(m_logVolume);
175
176 //
177 // Build the innerSide
178 //
179 // Add Sensor
180 innerSide->add(new GeoIdentifierTag(1000));
181 innerSide->add(m_sensorPos);
182 innerSide->add(m_sensor->build(id));
183
184 // Add Hybrid
185 innerSide->add(m_hybridPos);
186 innerSide->add(m_hybrid->getVolume());
187
188 return innerSide;
189}
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated SCT in...
InDetDD::SCT_DetectorManager * m_detectorManager
SCT_GeometryManager * m_geometryManager
SCT_MaterialManager * m_materials
SCT_InnerSide(const std::string &name, InDetDD::SCT_DetectorManager *detectorManager, SCT_GeometryManager *geometryManager, SCT_MaterialManager *materials, GeoModelIO::ReadGeoModel *sqliteReader, std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > mapFPV, std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > mapAX)
GeoIntrusivePtr< GeoTransform > m_sensorPos
std::unique_ptr< SCT_Sensor > m_sensor
GeoIntrusivePtr< GeoTransform > m_hybridPos
std::unique_ptr< GeoTrf::Vector3D > m_env1RefPointVector
virtual const GeoLogVol * preBuild()
std::unique_ptr< SCT_Hybrid > m_hybrid
virtual GeoVPhysVol * build(SCT_Identifier id)
std::unique_ptr< GeoTrf::Vector3D > m_env2RefPointVector
double m_hybridOffsetZ
double m_hybridOffsetX
SCT_UniqueComponentFactory(const std::string &name, InDetDD::SCT_DetectorManager *detectorManager, SCT_GeometryManager *geometryManager, SCT_MaterialManager *materials=nullptr, GeoModelIO::ReadGeoModel *sqliteReader=nullptr, std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > mapFPV=nullptr, std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > mapAX=nullptr)
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > m_mapFPV
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > m_mapAX
GeoModelIO::ReadGeoModel * m_sqliteReader
bool add(const std::string &hname, TKey *tobj)
Definition fastadd.cxx:55
STL namespace.