ATLAS Offline Software
Loading...
Searching...
No Matches
SCT_Ski Class Reference

#include <SCT_Ski.h>

Inheritance diagram for SCT_Ski:

Public Member Functions

 SCT_Ski (const std::string &name, SCT_Module *module, int stereoSign, double tilt, double length, 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)
 ~SCT_Ski ()
virtual GeoVPhysVol * build (SCT_Identifier id)
double thickness () const
double width () const
double length () const
double zPos (int i) const
int identifier (int i) const
double radialSep () const
int firstStagger () const
int modulesPerSki () const
double tilt () const
int stereoSign () const
const SCT_Modulemodule () const
const SCT_Doglegdogleg () const
const SCT_CoolingBlockcoolingBlock () const
const SCT_CoolingPipecoolingPipe () const
const GeoTransform * getRefPointTransform () const
const GeoTrf::Vector3D * env1RefPointVector () const
const GeoTrf::Vector3D * env2RefPointVector () const
double env1Thickness () const
double env1Width () const
double env2Thickness () const
double env2Width () const
double coolingBlockOffsetX () const
double coolingBlockOffsetY () const
double coolingBlockOffsetZ () const
double coolingPipeOffsetX () const
double coolingPipeOffsetY () const
double doglegOffsetX () const
double doglegOffsetY () const
const std::string & getName () const

Protected Member Functions

double epsilon () const

Protected Attributes

const GeoLogVol * m_logVolume {}
GeoModelIO::ReadGeoModel * m_sqliteReader {}
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > m_mapFPV
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > m_mapAX
InDetDD::SCT_DetectorManagerm_detectorManager {}
SCT_GeometryManagerm_geometryManager {}
SCT_MaterialManagerm_materials {}

Private Member Functions

 SCT_Ski (const SCT_Ski &ski)
SCT_Skioperator= (const SCT_Ski &ski)
void getParameters ()
virtual const GeoLogVol * preBuild ()

Private Attributes

double m_radialSep = 0.0
int m_firstStagger = 0
int m_modulesPerSki = 0
double m_safety = 0.0
std::vector< double > m_zPos
std::vector< int > m_id
int m_stereoSign
double m_tilt
double m_length
double m_width = 0.0
double m_thickness = 0.0
double m_doglegPhiOffset = 0.0
double m_doglegRadialOffset = 0.0
double m_coolingBlockPhiOffset = 0.0
double m_coolingBlockRadialOffset = 0.0
double m_coolingPipeRadialOffset = 0.0
double m_coolingPipePhiOffset = 0.0
double m_coolingBlockOffsetX = 0.0
double m_coolingBlockOffsetY = 0.0
double m_coolingBlockOffsetZ = 0.0
double m_coolingPipeOffsetX = 0.0
double m_coolingPipeOffsetY = 0.0
double m_doglegOffsetX = 0.0
double m_doglegOffsetY = 0.0
SCT_Modulem_module
std::unique_ptr< SCT_Doglegm_dogleg
std::unique_ptr< SCT_CoolingBlockm_coolingBlock
std::unique_ptr< SCT_CoolingPipem_coolingPipe
GeoIntrusivePtr< GeoTransform > m_refPointTransform {}
GeoIntrusivePtr< GeoTransform > m_coolingPipePos {}
std::unique_ptr< GeoTrf::Vector3D > m_env1RefPointVector
 For calculations of envelopes of SCT_DetailLayer.
std::unique_ptr< GeoTrf::Vector3D > m_env2RefPointVector
 For calculations of envelopes of SCT_DetailLayer.
double m_env1Thickness = 0.0
double m_env1Width = 0.0
double m_env2Thickness = 0.0
double m_env2Width = 0.0
std::vector< GeoNameTag * > m_nameTag
std::vector< GeoTrf::Transform3D > m_modulePos
std::vector< GeoTransform * > m_doglegPos
std::vector< GeoTransform * > m_coolingBlockPos
std::string m_name

Static Private Attributes

static const double s_epsilon = 1.0e-6 * Gaudi::Units::mm

Detailed Description

Definition at line 28 of file SCT_Ski.h.

Constructor & Destructor Documentation

◆ SCT_Ski() [1/2]

SCT_Ski::SCT_Ski ( const std::string & name,
SCT_Module * module,
int stereoSign,
double tilt,
double length,
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 )

Definition at line 38 of file SCT_Ski.cxx.

49 : SCT_UniqueComponentFactory(name, detectorManager, geometryManager, materials, sqliteReader, std::move(mapFPV), std::move(mapAX)),
51 m_tilt(tilt),
54{
56 if(!m_sqliteReader) {
58 }
59}
double length() const
Definition SCT_Ski.h:50
int stereoSign() const
Definition SCT_Ski.h:59
virtual const GeoLogVol * preBuild()
Definition SCT_Ski.cxx:101
double m_length
Definition SCT_Ski.h:101
double m_tilt
Definition SCT_Ski.h:99
SCT_Module * m_module
Definition SCT_Ski.h:124
void getParameters()
Definition SCT_Ski.cxx:65
const SCT_Module * module() const
Definition SCT_Ski.h:61
int m_stereoSign
Definition SCT_Ski.h:98
double tilt() const
Definition SCT_Ski.h:58
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)
GeoModelIO::ReadGeoModel * m_sqliteReader

◆ ~SCT_Ski()

SCT_Ski::~SCT_Ski ( )
default

◆ SCT_Ski() [2/2]

SCT_Ski::SCT_Ski ( const SCT_Ski & ski)
private

Member Function Documentation

◆ build()

GeoVPhysVol * SCT_Ski::build ( SCT_Identifier id)
virtual

Implements SCT_UniqueComponentFactory.

Definition at line 339 of file SCT_Ski.cxx.

340{
341 GeoPhysVol * ski=nullptr;
342
343 if(!m_sqliteReader){
344
345 ski= new GeoPhysVol(m_logVolume);
346
347 for (int iModule = 0; iModule < m_modulesPerSki; iModule++) {
348
349 // Add modules.
350 ski->add(m_refPointTransform);
351 GeoAlignableTransform * moduleTransform = new GeoAlignableTransform(m_modulePos[iModule]);
352 ski->add(moduleTransform);
353 ski->add(m_nameTag[iModule]);
354 ski->add(new GeoIdentifierTag(m_id[iModule]));
355 id.setEtaModule(m_id[iModule]); // Set identifier.
356 GeoVPhysVol * modulePV = m_module->build(id);
357 ski->add(modulePV);
358
359 // Store alignable transform
360 m_detectorManager->addAlignableTransform(1, id.getWaferId(), moduleTransform, modulePV);
361
362 // Add dogleg
363 ski->add(m_refPointTransform);
364 ski->add(m_doglegPos[iModule]);
365 ski->add(m_dogleg->getVolume());
366
367 // and coolingblock
368 ski->add(m_refPointTransform);
369 ski->add(m_coolingBlockPos[iModule]);
370 ski->add(m_coolingBlock->getVolume());
371 }
372
373 // Add Cooling pipe
374 ski->add(m_refPointTransform);
375 ski->add(m_coolingPipePos);
376 ski->add(m_coolingPipe->getVolume());
377 }
378 else{
379
380 for (int iModule = 0; iModule < m_modulesPerSki; iModule++) {
381
382 // Add modules.
383 id.setEtaModule(m_id[iModule]); // Set identifier.
384 m_module->build(id);
385
386 std::string key=std::format("ModuleSKI_{}_{}_{}",id.getLayerDisk(),id.getEtaModule(),id.getPhiModule());
387
388 // Store alignable transform
389 m_detectorManager->addAlignableTransform(1, id.getWaferId(), (*m_mapAX)[key], (*m_mapFPV)[key]);
390
391 }
392 }
393 return ski;
394}
InDetDD::SCT_DetectorManager * m_detectorManager
std::vector< GeoTransform * > m_coolingBlockPos
Definition SCT_Ski.h:145
std::unique_ptr< SCT_Dogleg > m_dogleg
Definition SCT_Ski.h:125
std::vector< GeoTrf::Transform3D > m_modulePos
Definition SCT_Ski.h:143
int m_modulesPerSki
Definition SCT_Ski.h:92
std::vector< GeoNameTag * > m_nameTag
Definition SCT_Ski.h:142
std::unique_ptr< SCT_CoolingBlock > m_coolingBlock
Definition SCT_Ski.h:126
GeoIntrusivePtr< GeoTransform > m_refPointTransform
Definition SCT_Ski.h:129
GeoIntrusivePtr< GeoTransform > m_coolingPipePos
Definition SCT_Ski.h:130
std::unique_ptr< SCT_CoolingPipe > m_coolingPipe
Definition SCT_Ski.h:127
std::vector< GeoTransform * > m_doglegPos
Definition SCT_Ski.h:144
std::vector< int > m_id
Definition SCT_Ski.h:96
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > m_mapFPV
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > m_mapAX

◆ coolingBlock()

const SCT_CoolingBlock * SCT_Ski::coolingBlock ( ) const
inline

Definition at line 63 of file SCT_Ski.h.

63{return m_coolingBlock.get();}

◆ coolingBlockOffsetX()

double SCT_Ski::coolingBlockOffsetX ( ) const
inline

Definition at line 73 of file SCT_Ski.h.

double m_coolingBlockOffsetX
Definition SCT_Ski.h:115

◆ coolingBlockOffsetY()

double SCT_Ski::coolingBlockOffsetY ( ) const
inline

Definition at line 74 of file SCT_Ski.h.

double m_coolingBlockOffsetY
Definition SCT_Ski.h:116

◆ coolingBlockOffsetZ()

double SCT_Ski::coolingBlockOffsetZ ( ) const
inline

Definition at line 75 of file SCT_Ski.h.

double m_coolingBlockOffsetZ
Definition SCT_Ski.h:117

◆ coolingPipe()

const SCT_CoolingPipe * SCT_Ski::coolingPipe ( ) const
inline

Definition at line 64 of file SCT_Ski.h.

64{return m_coolingPipe.get();}

◆ coolingPipeOffsetX()

double SCT_Ski::coolingPipeOffsetX ( ) const
inline

Definition at line 76 of file SCT_Ski.h.

double m_coolingPipeOffsetX
Definition SCT_Ski.h:118

◆ coolingPipeOffsetY()

double SCT_Ski::coolingPipeOffsetY ( ) const
inline

Definition at line 77 of file SCT_Ski.h.

double m_coolingPipeOffsetY
Definition SCT_Ski.h:119

◆ dogleg()

const SCT_Dogleg * SCT_Ski::dogleg ( ) const
inline

Definition at line 62 of file SCT_Ski.h.

62{return m_dogleg.get();}

◆ doglegOffsetX()

double SCT_Ski::doglegOffsetX ( ) const
inline

Definition at line 79 of file SCT_Ski.h.

79{return m_doglegOffsetX;}
double m_doglegOffsetX
Definition SCT_Ski.h:121

◆ doglegOffsetY()

double SCT_Ski::doglegOffsetY ( ) const
inline

Definition at line 80 of file SCT_Ski.h.

80{return m_doglegOffsetY;}
double m_doglegOffsetY
Definition SCT_Ski.h:122

◆ env1RefPointVector()

const GeoTrf::Vector3D * SCT_Ski::env1RefPointVector ( ) const
inline

Definition at line 67 of file SCT_Ski.h.

67{return m_env1RefPointVector.get();}
std::unique_ptr< GeoTrf::Vector3D > m_env1RefPointVector
For calculations of envelopes of SCT_DetailLayer.
Definition SCT_Ski.h:133

◆ env1Thickness()

double SCT_Ski::env1Thickness ( ) const
inline

Definition at line 69 of file SCT_Ski.h.

69{return m_env1Thickness;}
double m_env1Thickness
Definition SCT_Ski.h:137

◆ env1Width()

double SCT_Ski::env1Width ( ) const
inline

Definition at line 70 of file SCT_Ski.h.

70{return m_env1Width;}
double m_env1Width
Definition SCT_Ski.h:138

◆ env2RefPointVector()

const GeoTrf::Vector3D * SCT_Ski::env2RefPointVector ( ) const
inline

Definition at line 68 of file SCT_Ski.h.

68{return m_env2RefPointVector.get();}
std::unique_ptr< GeoTrf::Vector3D > m_env2RefPointVector
For calculations of envelopes of SCT_DetailLayer.
Definition SCT_Ski.h:135

◆ env2Thickness()

double SCT_Ski::env2Thickness ( ) const
inline

Definition at line 71 of file SCT_Ski.h.

71{return m_env2Thickness;}
double m_env2Thickness
Definition SCT_Ski.h:139

◆ env2Width()

double SCT_Ski::env2Width ( ) const
inline

Definition at line 72 of file SCT_Ski.h.

72{return m_env2Width;}
double m_env2Width
Definition SCT_Ski.h:140

◆ epsilon()

double SCT_ComponentFactory::epsilon ( ) const
protectedinherited

Definition at line 28 of file SCT_ComponentFactory.cxx.

29{
30 return s_epsilon;
31}
static const double s_epsilon

◆ firstStagger()

int SCT_Ski::firstStagger ( ) const
inline

Definition at line 55 of file SCT_Ski.h.

55{return m_firstStagger;}
int m_firstStagger
Definition SCT_Ski.h:91

◆ getName()

const std::string & SCT_ComponentFactory::getName ( ) const
inlineinherited

Definition at line 35 of file SCT_ComponentFactory.h.

35{return m_name;}

◆ getParameters()

void SCT_Ski::getParameters ( )
private

Definition at line 65 of file SCT_Ski.cxx.

66{
67
68 const SCT_BarrelParameters * parameters = m_geometryManager->barrelParameters();
69 const SCT_GeneralParameters * generalParameters = m_geometryManager->generalParameters();
70
71 m_safety = generalParameters->safety();
72
73 m_radialSep = parameters->skiRadialSep();
74 m_firstStagger = parameters->skiFirstStagger();
75 m_modulesPerSki = parameters->modulesPerSki();
76 for (int iModule = 0; iModule < m_modulesPerSki; iModule++){
77 m_zPos.push_back(parameters->skiZPosition(iModule));
78 m_id.push_back(parameters->skiModuleIdentifier(iModule));
79 }
80
81 // Various offset for the doglegs, cooling blocks and cooling pipe.
82 // These are not currently needed and are all set to zero.
89
90 m_coolingBlockOffsetX = parameters->coolingBlockOffsetX();
91 m_coolingBlockOffsetY = parameters->coolingBlockOffsetY();
92 m_coolingBlockOffsetZ = parameters->coolingBlockOffsetZ();
93 m_coolingPipeOffsetX = parameters->coolingPipeOffsetX();
94 m_coolingPipeOffsetY = parameters->coolingPipeOffsetY();
95
96 m_doglegOffsetX = parameters->doglegOffsetX();
97 m_doglegOffsetY = parameters->doglegOffsetY();
98}
SCT_GeometryManager * m_geometryManager
double m_doglegPhiOffset
Definition SCT_Ski.h:107
double m_radialSep
Definition SCT_Ski.h:90
double m_doglegRadialOffset
Definition SCT_Ski.h:108
std::vector< double > m_zPos
Definition SCT_Ski.h:95
double m_safety
Definition SCT_Ski.h:93
double m_coolingPipeRadialOffset
Definition SCT_Ski.h:111
double m_coolingPipePhiOffset
Definition SCT_Ski.h:112
double m_coolingBlockRadialOffset
Definition SCT_Ski.h:110
double m_coolingBlockPhiOffset
Definition SCT_Ski.h:109

◆ getRefPointTransform()

const GeoTransform * SCT_Ski::getRefPointTransform ( ) const
inline

Definition at line 66 of file SCT_Ski.h.

66{return m_refPointTransform;}

◆ identifier()

int SCT_Ski::identifier ( int i) const
inline

Definition at line 53 of file SCT_Ski.h.

53{return m_id[i];}

◆ length()

double SCT_Ski::length ( ) const
inline

Definition at line 50 of file SCT_Ski.h.

50{return m_length;}

◆ module()

const SCT_Module * SCT_Ski::module ( ) const
inline

Definition at line 61 of file SCT_Ski.h.

61{return m_module;}

◆ modulesPerSki()

int SCT_Ski::modulesPerSki ( ) const
inline

Definition at line 56 of file SCT_Ski.h.

56{return m_modulesPerSki;}

◆ operator=()

SCT_Ski & SCT_Ski::operator= ( const SCT_Ski & ski)
private

◆ preBuild()

const GeoLogVol * SCT_Ski::preBuild ( )
privatevirtual

Implements SCT_UniqueComponentFactory.

Definition at line 101 of file SCT_Ski.cxx.

102{
103 const double rphiClearance = 0.5*Gaudi::Units::mm;
104 const double radialClearance = 0.5*Gaudi::Units::mm;
105
106
107 // Make components.
108 m_dogleg = std::make_unique<SCT_Dogleg>(getName()+"Dogleg", m_detectorManager, m_geometryManager, m_materials);
109 m_coolingBlock = std::make_unique<SCT_CoolingBlock>(getName()+"CoolingBlock",
111 m_coolingPipe = std::make_unique<SCT_CoolingPipe>(getName()+"CoolingPipe", m_length,
113
114 // We need the sign of the tilt in numerous places
115 int tiltSign = (m_tilt < 0) ? -1 : +1;
116
117
118 // The two modules are lined up in x in the unrotated ski. The ski then gets tilted
119 // when placed in the layer.
120 // So the x offset is just the raidal separation and the y offset is zero.
121
122 double xModuleOffset = 0.5 * m_radialSep;
123
124 double yModuleOffset = 0.0;
125
126
127 //
128 // Calculate position of cooling block
129 //
130 // Position the cooling block m_coolingBlockPhiOffset from the lower egde
131 // of the module and m_coolingBlockRadialOffset from surface of the module.
132
133 double xCoolingBlockOffset = - m_coolingBlockRadialOffset + coolingBlockOffsetX();
134 double yCoolingBlockOffset = tiltSign *(coolingBlockOffsetY() - m_coolingBlockPhiOffset);
135 double zCoolingBlockOffset = coolingBlockOffsetZ();
136
137 //
138 // Calculate position of dogleg
139 //
140
141 double xDoglegOffset = doglegOffsetX() - m_doglegRadialOffset;
142
143 // NB length of dogleg runs in phi direction.
144 double yDoglegOffset = tiltSign * (doglegOffsetY() + m_doglegPhiOffset);
145
146 double zDoglegOffset = coolingBlockOffsetZ();
147
148 //
149 // Calculate position of cooling pipe.
150 //
151 double xCoolingPipePos = coolingPipeOffsetX() - m_coolingPipeRadialOffset;
152 double yCoolingPipePos = coolingPipeOffsetY() + m_coolingPipePhiOffset;
153 m_coolingPipePos = new GeoTransform(GeoTrf::Translate3D(xCoolingPipePos, yCoolingPipePos, 0));
154 //
155 //
156 //
157
158 int stagger_sign = m_firstStagger;
159 // Loop over modules in ski as we need their z positions.
160 for (int iModule = 0; iModule < m_modulesPerSki; iModule++) {
161
162 // For compatibility with AGE we need to offset the module in y by -0.5*sep*sin(tilt) so that center
163 // of module lines up with radial line. (Not sure if this is what is done in reality)
164
165 // Not sure if this needs to be alignable
166 double xModulePos = stagger_sign * xModuleOffset;
167 double yModulePos = yModuleOffset;
168 double zModulePos = m_zPos[iModule];
169
170 // There is only one type of module and this is rotated one way or the other
171 // to get the phi-v (-ve), u-phi (+ve) orientations
172 GeoTrf::RotateX3D rot(0.5 * m_stereoSign * m_module->stereoAngle());
173 GeoTrf::Translation3D pos(xModulePos, yModulePos, zModulePos);
174 m_modulePos.push_back(GeoTrf::Transform3D(pos*rot));
175
176 //
177 // Calculate position of cooling block
178 //
179
180 double xCoolingBlockPos = xCoolingBlockOffset + xModulePos;
181 double yCoolingBlockPos = yCoolingBlockOffset + yModulePos;
182 double zCoolingBlockPos = zCoolingBlockOffset + zModulePos;
183 m_coolingBlockPos.push_back(new GeoTransform(GeoTrf::Translate3D(xCoolingBlockPos, yCoolingBlockPos, zCoolingBlockPos)));
184
185
186 //
187 // Calculate position of dogleg
188 //
189 double xDoglegPos = xDoglegOffset + xModulePos;
190 double yDoglegPos = yDoglegOffset + yModulePos;
191 double zDoglegPos = zDoglegOffset + zModulePos;
192 m_doglegPos.push_back(new GeoTransform(GeoTrf::Translate3D(xDoglegPos, yDoglegPos, zDoglegPos)));
193
194 // alternate staggering
195 stagger_sign = - stagger_sign;
196
197
198 }
199
200 //
201 // calculate envelope for ski with just modules. Not all these are used.
202 // These are coordinates of corners of module's envelopes.
203 //
204
205 GeoTrf::Vector3D c0(0.0,
206 -(m_module->env1RefPointVector()->y()) + 0.5*(m_module->env1Width()),
207 -(m_module->env1RefPointVector()->z()) + 0.5*(m_module->env1Length()));
208 GeoTrf::Vector3D c1(0.0,
209 -(m_module->env1RefPointVector()->y()) - 0.5*(m_module->env1Width()),
210 -(m_module->env1RefPointVector()->z()) + 0.5*(m_module->env1Length()));
211 GeoTrf::Vector3D c2(0.0,
212 -(m_module->env1RefPointVector()->y()) - 0.5*(m_module->env1Width()),
213 -(m_module->env1RefPointVector()->z()) - 0.5*(m_module->env1Length()));
214 GeoTrf::Vector3D c3(0.0,
215 -(m_module->env1RefPointVector()->y()) + 0.5*(m_module->env1Width()),
216 -(m_module->env1RefPointVector()->z()) - 0.5*(m_module->env1Length()));
217 GeoTrf::Vector3D c4(0.0,
218 -(m_module->env2RefPointVector()->y()) + 0.5*(m_module->env2Width()),
219 -(m_module->env2RefPointVector()->z()) + 0.5*(m_module->env2Length()));
220 GeoTrf::Vector3D c5(0.0,
221 -(m_module->env2RefPointVector()->y()) - 0.5*(m_module->env2Width()),
222 -(m_module->env2RefPointVector()->z()) + 0.5*(m_module->env2Length()));
223 GeoTrf::Vector3D c6(0.0,
224 -(m_module->env2RefPointVector()->y()) - 0.5*(m_module->env2Width()),
225 -(m_module->env2RefPointVector()->z()) - 0.5*(m_module->env2Length()));
226 GeoTrf::Vector3D c7(0.0,
227 -(m_module->env2RefPointVector()->y()) + 0.5*(m_module->env2Width()),
228 -(m_module->env2RefPointVector()->z()) - 0.5*(m_module->env2Length()));
229
230 double moduleYMax = c4.y();
231 double moduleYMin = c5.y();
232 c0 = GeoTrf::RotateX3D(0.5 * m_stereoSign * m_module->stereoAngle())*c0;
233 c1 = GeoTrf::RotateX3D(0.5 * m_stereoSign * m_module->stereoAngle())*c1;
234 c2 = GeoTrf::RotateX3D(0.5 * m_stereoSign * m_module->stereoAngle())*c2;
235 c3 = GeoTrf::RotateX3D(0.5 * m_stereoSign * m_module->stereoAngle())*c3;
236 c4 = GeoTrf::RotateX3D(0.5 * m_stereoSign * m_module->stereoAngle())*c4;
237 c5 = GeoTrf::RotateX3D(0.5 * m_stereoSign * m_module->stereoAngle())*c5;
238 c6 = GeoTrf::RotateX3D(0.5 * m_stereoSign * m_module->stereoAngle())*c6;
239 c7 = GeoTrf::RotateX3D(0.5 * m_stereoSign * m_module->stereoAngle())*c7;
240
241 moduleYMax = std::max(std::max(c0.y(), c4.y()), std::max(c7.y(), c3.y()));
242 moduleYMin = std::min(std::min(c1.y(), c5.y()), std::min(c6.y(), c2.y()));
243
244 double skiWidth = moduleYMax - moduleYMin + 2*rphiClearance;
245
246 //
247 // NB. The envelope is centered on x.
248 //
249 double skiThickness = m_module->thickness() + 2 * std::abs(xModuleOffset) + radialClearance;
250
251 // Due to the cooling block and dogleg being next to the module and
252 // as the modules are staggered it is no longer possible to have a
253 // simple envelope around the ski.
254
255 // Calculate envelope needed. This is a boolean of two rectangles.
256 // 1. Contains the modules and dogleg.
257 // 2. Contains the cooling pipe and cooling block.
258
259 double xmax1 = 0.5*skiThickness;
260 double xmin1 = -xModuleOffset + xDoglegOffset - 0.5*m_dogleg->thickness();
261 double xmax2 = xmax1;
262 double xmin2 = xCoolingPipePos - m_coolingPipe->pipeRadius();
263
264 // Take into account possiblity that the dogleg extends past the module.
265
266 double ymax1 = moduleYMax + rphiClearance;
267 double ymin1 = moduleYMin - rphiClearance;
268 double ymin2,ymax2;
269 if (tiltSign > 0) {
270 ymax2 = std::max(-yModuleOffset + yCoolingBlockOffset + 0.5*m_coolingBlock->width(),
271 yCoolingPipePos + m_coolingPipe->pipeRadius());
272 ymin2 = ymin1;
273 } else {
274 ymax2 = ymax1;
275 ymin2 = std::min(-yModuleOffset + yCoolingBlockOffset - 0.5*m_coolingBlock->width(),
276 yCoolingPipePos - m_coolingPipe->pipeRadius());
277 }
278
279
280 // Add some safety
281 xmin1 -= m_safety;
282 xmax1 += m_safety;
283 ymin1 -= m_safety;
284 ymax1 += m_safety;
285
286 xmin2 -= m_safety;
287 xmax2 += m_safety;
288 ymin2 -= m_safety;
289 ymax2 += m_safety;
290
291 double xCenter = 0.5*(xmin1+xmax1);
292 double yCenter = 0.5*(ymin1+ymax1);
293 double xShift2 = 0.5*(xmin2+xmax2) - xCenter;
294 double yShift2 = 0.5*(ymin2+ymax2) - yCenter;
295
296 m_refPointTransform = new GeoTransform(GeoTrf::Translate3D(-xCenter, -yCenter, 0));
297
298 m_env1RefPointVector = std::make_unique<GeoTrf::Vector3D>(-xCenter, -yCenter, 0.0);
299 m_env2RefPointVector = std::make_unique<GeoTrf::Vector3D>(-xShift2, -yShift2, 0.0);
300 m_env1Thickness = xmax1-xmin1;
301 m_env1Width = ymax1-ymin1;
302 m_env2Thickness = xmax2-xmin2;
303 m_env2Width = ymax2-ymin2;
304
305 GeoBox * envelope1 = new GeoBox(0.5 * (xmax1-xmin1), 0.5 * (ymax1-ymin1), 0.5 * m_length);
306 GeoBox * envelope2 = new GeoBox(0.5 * (xmax2-xmin2), 0.5 * (ymax2-ymin2), 0.5 * m_length);
307
308 const GeoShape * skiEnvelopeShape = nullptr;
309
310 const GeoShape & tmpShape = (*envelope1).
311 add(*envelope2 << GeoTrf::Translate3D(xShift2, yShift2, 0));
312 skiEnvelopeShape = &tmpShape;
313
314 GeoLogVol * skiLog = new GeoLogVol(getName(), skiEnvelopeShape, m_materials->gasMaterial());
315
316 // Make names once only so we don't recreate them again again.
317 for (int iModule = 0; iModule < m_modulesPerSki; iModule++) {
318 // Add identifier to name.
319 std::string name = std::format("Module#{}",m_id[iModule]);
320 m_nameTag.push_back(new GeoNameTag(name));
321 }
322
323
324 // Define thickness, width, and length. This is chosen as bounding box centered on the ski rotation axis
325 // which contains the modules and dogleg (ie cooling blocks and cooling pipe is ignored.)
326 m_thickness = 2 * std::abs(xmin1);
327 m_width = skiWidth;
328
329
330 // Calculate the clearances. Module envelope1 is the thickness up to the sensors. This is used for the module to
331 // module distance
332
333 return skiLog;
334
335}
const std::string & getName() const
SCT_MaterialManager * m_materials
double doglegOffsetY() const
Definition SCT_Ski.h:80
double coolingBlockOffsetY() const
Definition SCT_Ski.h:74
double m_width
Definition SCT_Ski.h:102
double coolingBlockOffsetZ() const
Definition SCT_Ski.h:75
double coolingBlockOffsetX() const
Definition SCT_Ski.h:73
double coolingPipeOffsetY() const
Definition SCT_Ski.h:77
double doglegOffsetX() const
Definition SCT_Ski.h:79
double coolingPipeOffsetX() const
Definition SCT_Ski.h:76
double m_thickness
Definition SCT_Ski.h:103
bool add(const std::string &hname, TKey *tobj)
Definition fastadd.cxx:55

◆ radialSep()

double SCT_Ski::radialSep ( ) const
inline

Definition at line 54 of file SCT_Ski.h.

54{return m_radialSep;}

◆ stereoSign()

int SCT_Ski::stereoSign ( ) const
inline

Definition at line 59 of file SCT_Ski.h.

59{return m_stereoSign;}

◆ thickness()

double SCT_Ski::thickness ( ) const
inline

Definition at line 48 of file SCT_Ski.h.

48{return m_thickness;}

◆ tilt()

double SCT_Ski::tilt ( ) const
inline

Definition at line 58 of file SCT_Ski.h.

58{return m_tilt;}

◆ width()

double SCT_Ski::width ( ) const
inline

Definition at line 49 of file SCT_Ski.h.

49{return m_width;}

◆ zPos()

double SCT_Ski::zPos ( int i) const
inline

Definition at line 52 of file SCT_Ski.h.

52{return m_zPos[i];}

Member Data Documentation

◆ m_coolingBlock

std::unique_ptr<SCT_CoolingBlock> SCT_Ski::m_coolingBlock
private

Definition at line 126 of file SCT_Ski.h.

◆ m_coolingBlockOffsetX

double SCT_Ski::m_coolingBlockOffsetX = 0.0
private

Definition at line 115 of file SCT_Ski.h.

◆ m_coolingBlockOffsetY

double SCT_Ski::m_coolingBlockOffsetY = 0.0
private

Definition at line 116 of file SCT_Ski.h.

◆ m_coolingBlockOffsetZ

double SCT_Ski::m_coolingBlockOffsetZ = 0.0
private

Definition at line 117 of file SCT_Ski.h.

◆ m_coolingBlockPhiOffset

double SCT_Ski::m_coolingBlockPhiOffset = 0.0
private

Definition at line 109 of file SCT_Ski.h.

◆ m_coolingBlockPos

std::vector<GeoTransform *> SCT_Ski::m_coolingBlockPos
private

Definition at line 145 of file SCT_Ski.h.

◆ m_coolingBlockRadialOffset

double SCT_Ski::m_coolingBlockRadialOffset = 0.0
private

Definition at line 110 of file SCT_Ski.h.

◆ m_coolingPipe

std::unique_ptr<SCT_CoolingPipe> SCT_Ski::m_coolingPipe
private

Definition at line 127 of file SCT_Ski.h.

◆ m_coolingPipeOffsetX

double SCT_Ski::m_coolingPipeOffsetX = 0.0
private

Definition at line 118 of file SCT_Ski.h.

◆ m_coolingPipeOffsetY

double SCT_Ski::m_coolingPipeOffsetY = 0.0
private

Definition at line 119 of file SCT_Ski.h.

◆ m_coolingPipePhiOffset

double SCT_Ski::m_coolingPipePhiOffset = 0.0
private

Definition at line 112 of file SCT_Ski.h.

◆ m_coolingPipePos

GeoIntrusivePtr<GeoTransform> SCT_Ski::m_coolingPipePos {}
private

Definition at line 130 of file SCT_Ski.h.

130{};

◆ m_coolingPipeRadialOffset

double SCT_Ski::m_coolingPipeRadialOffset = 0.0
private

Definition at line 111 of file SCT_Ski.h.

◆ m_detectorManager

InDetDD::SCT_DetectorManager* SCT_ComponentFactory::m_detectorManager {}
protectedinherited

Definition at line 38 of file SCT_ComponentFactory.h.

38{};

◆ m_dogleg

std::unique_ptr<SCT_Dogleg> SCT_Ski::m_dogleg
private

Definition at line 125 of file SCT_Ski.h.

◆ m_doglegOffsetX

double SCT_Ski::m_doglegOffsetX = 0.0
private

Definition at line 121 of file SCT_Ski.h.

◆ m_doglegOffsetY

double SCT_Ski::m_doglegOffsetY = 0.0
private

Definition at line 122 of file SCT_Ski.h.

◆ m_doglegPhiOffset

double SCT_Ski::m_doglegPhiOffset = 0.0
private

Definition at line 107 of file SCT_Ski.h.

◆ m_doglegPos

std::vector<GeoTransform *> SCT_Ski::m_doglegPos
private

Definition at line 144 of file SCT_Ski.h.

◆ m_doglegRadialOffset

double SCT_Ski::m_doglegRadialOffset = 0.0
private

Definition at line 108 of file SCT_Ski.h.

◆ m_env1RefPointVector

std::unique_ptr<GeoTrf::Vector3D> SCT_Ski::m_env1RefPointVector
private

For calculations of envelopes of SCT_DetailLayer.

Definition at line 133 of file SCT_Ski.h.

◆ m_env1Thickness

double SCT_Ski::m_env1Thickness = 0.0
private

Definition at line 137 of file SCT_Ski.h.

◆ m_env1Width

double SCT_Ski::m_env1Width = 0.0
private

Definition at line 138 of file SCT_Ski.h.

◆ m_env2RefPointVector

std::unique_ptr<GeoTrf::Vector3D> SCT_Ski::m_env2RefPointVector
private

For calculations of envelopes of SCT_DetailLayer.

Definition at line 135 of file SCT_Ski.h.

◆ m_env2Thickness

double SCT_Ski::m_env2Thickness = 0.0
private

Definition at line 139 of file SCT_Ski.h.

◆ m_env2Width

double SCT_Ski::m_env2Width = 0.0
private

Definition at line 140 of file SCT_Ski.h.

◆ m_firstStagger

int SCT_Ski::m_firstStagger = 0
private

Definition at line 91 of file SCT_Ski.h.

◆ m_geometryManager

SCT_GeometryManager* SCT_ComponentFactory::m_geometryManager {}
protectedinherited

Definition at line 39 of file SCT_ComponentFactory.h.

39{};

◆ m_id

std::vector<int> SCT_Ski::m_id
private

Definition at line 96 of file SCT_Ski.h.

◆ m_length

double SCT_Ski::m_length
private

Definition at line 101 of file SCT_Ski.h.

◆ m_logVolume

const GeoLogVol* SCT_UniqueComponentFactory::m_logVolume {}
protectedinherited

Definition at line 86 of file SCT_ComponentFactory.h.

86{};

◆ m_mapAX

std::shared_ptr<std::map<std::string, GeoAlignableTransform*> > SCT_UniqueComponentFactory::m_mapAX
protectedinherited

Definition at line 92 of file SCT_ComponentFactory.h.

◆ m_mapFPV

std::shared_ptr<std::map<std::string, GeoFullPhysVol*> > SCT_UniqueComponentFactory::m_mapFPV
protectedinherited

Definition at line 91 of file SCT_ComponentFactory.h.

◆ m_materials

SCT_MaterialManager* SCT_ComponentFactory::m_materials {}
protectedinherited

Definition at line 40 of file SCT_ComponentFactory.h.

40{};

◆ m_module

SCT_Module* SCT_Ski::m_module
private

Definition at line 124 of file SCT_Ski.h.

◆ m_modulePos

std::vector<GeoTrf::Transform3D> SCT_Ski::m_modulePos
private

Definition at line 143 of file SCT_Ski.h.

◆ m_modulesPerSki

int SCT_Ski::m_modulesPerSki = 0
private

Definition at line 92 of file SCT_Ski.h.

◆ m_name

std::string SCT_ComponentFactory::m_name
privateinherited

Definition at line 46 of file SCT_ComponentFactory.h.

◆ m_nameTag

std::vector<GeoNameTag *> SCT_Ski::m_nameTag
private

Definition at line 142 of file SCT_Ski.h.

◆ m_radialSep

double SCT_Ski::m_radialSep = 0.0
private

Definition at line 90 of file SCT_Ski.h.

◆ m_refPointTransform

GeoIntrusivePtr<GeoTransform> SCT_Ski::m_refPointTransform {}
private

Definition at line 129 of file SCT_Ski.h.

129{};

◆ m_safety

double SCT_Ski::m_safety = 0.0
private

Definition at line 93 of file SCT_Ski.h.

◆ m_sqliteReader

GeoModelIO::ReadGeoModel* SCT_UniqueComponentFactory::m_sqliteReader {}
protectedinherited

Definition at line 87 of file SCT_ComponentFactory.h.

87{};

◆ m_stereoSign

int SCT_Ski::m_stereoSign
private

Definition at line 98 of file SCT_Ski.h.

◆ m_thickness

double SCT_Ski::m_thickness = 0.0
private

Definition at line 103 of file SCT_Ski.h.

◆ m_tilt

double SCT_Ski::m_tilt
private

Definition at line 99 of file SCT_Ski.h.

◆ m_width

double SCT_Ski::m_width = 0.0
private

Definition at line 102 of file SCT_Ski.h.

◆ m_zPos

std::vector<double> SCT_Ski::m_zPos
private

Definition at line 95 of file SCT_Ski.h.

◆ s_epsilon

const double SCT_ComponentFactory::s_epsilon = 1.0e-6 * Gaudi::Units::mm
staticprivateinherited

Definition at line 47 of file SCT_ComponentFactory.h.


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