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
std::string intToString (int i) 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 39 of file SCT_Ski.cxx.

50 : SCT_UniqueComponentFactory(name, detectorManager, geometryManager, materials, sqliteReader, std::move(mapFPV), std::move(mapAX)),
52 m_tilt(tilt),
55{
57 if(!m_sqliteReader) {
59 }
60}
double length() const
Definition SCT_Ski.h:50
int stereoSign() const
Definition SCT_Ski.h:59
virtual const GeoLogVol * preBuild()
Definition SCT_Ski.cxx:102
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:66
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 341 of file SCT_Ski.cxx.

342{
343 GeoPhysVol * ski=nullptr;
344
345 if(!m_sqliteReader){
346
347 ski= new GeoPhysVol(m_logVolume);
348
349 for (int iModule = 0; iModule < m_modulesPerSki; iModule++) {
350
351 // Add modules.
352 ski->add(m_refPointTransform);
353 GeoAlignableTransform * moduleTransform = new GeoAlignableTransform(m_modulePos[iModule]);
354 ski->add(moduleTransform);
355 ski->add(m_nameTag[iModule]);
356 ski->add(new GeoIdentifierTag(m_id[iModule]));
357 id.setEtaModule(m_id[iModule]); // Set identifier.
358 GeoVPhysVol * modulePV = m_module->build(id);
359 ski->add(modulePV);
360
361 // Store alignable transform
362 m_detectorManager->addAlignableTransform(1, id.getWaferId(), moduleTransform, modulePV);
363
364 // Add dogleg
365 ski->add(m_refPointTransform);
366 ski->add(m_doglegPos[iModule]);
367 ski->add(m_dogleg->getVolume());
368
369 // and coolingblock
370 ski->add(m_refPointTransform);
371 ski->add(m_coolingBlockPos[iModule]);
372 ski->add(m_coolingBlock->getVolume());
373 }
374
375 // Add Cooling pipe
376 ski->add(m_refPointTransform);
377 ski->add(m_coolingPipePos);
378 ski->add(m_coolingPipe->getVolume());
379 }
380 else{
381
382 for (int iModule = 0; iModule < m_modulesPerSki; iModule++) {
383
384 // Add modules.
385 id.setEtaModule(m_id[iModule]); // Set identifier.
386 m_module->build(id);
387
388 std::string key="ModuleSKI_"+std::to_string(id.getLayerDisk())+"_"+std::to_string(id.getEtaModule())+"_"+std::to_string(id.getPhiModule());
389
390 // Store alignable transform
391 m_detectorManager->addAlignableTransform(1, id.getWaferId(), (*m_mapAX)[key], (*m_mapFPV)[key]);
392
393 }
394 }
395 return ski;
396}
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 38 of file SCT_ComponentFactory.cxx.

39{
40 return s_epsilon;
41}
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 66 of file SCT_Ski.cxx.

67{
68
69 const SCT_BarrelParameters * parameters = m_geometryManager->barrelParameters();
70 const SCT_GeneralParameters * generalParameters = m_geometryManager->generalParameters();
71
72 m_safety = generalParameters->safety();
73
74 m_radialSep = parameters->skiRadialSep();
75 m_firstStagger = parameters->skiFirstStagger();
76 m_modulesPerSki = parameters->modulesPerSki();
77 for (int iModule = 0; iModule < m_modulesPerSki; iModule++){
78 m_zPos.push_back(parameters->skiZPosition(iModule));
79 m_id.push_back(parameters->skiModuleIdentifier(iModule));
80 }
81
82 // Various offset for the doglegs, cooling blocks and cooling pipe.
83 // These are not currently needed and are all set to zero.
90
91 m_coolingBlockOffsetX = parameters->coolingBlockOffsetX();
92 m_coolingBlockOffsetY = parameters->coolingBlockOffsetY();
93 m_coolingBlockOffsetZ = parameters->coolingBlockOffsetZ();
94 m_coolingPipeOffsetX = parameters->coolingPipeOffsetX();
95 m_coolingPipeOffsetY = parameters->coolingPipeOffsetY();
96
97 m_doglegOffsetX = parameters->doglegOffsetX();
98 m_doglegOffsetY = parameters->doglegOffsetY();
99}
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];}

◆ intToString()

std::string SCT_ComponentFactory::intToString ( int i) const
inherited

Definition at line 30 of file SCT_ComponentFactory.cxx.

31{
32 std::ostringstream str;
33 str << i;
34 return str.str();
35}

◆ 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 102 of file SCT_Ski.cxx.

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

◆ 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 42 of file SCT_ComponentFactory.h.

◆ 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 90 of file SCT_ComponentFactory.h.

◆ m_mapAX

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

Definition at line 96 of file SCT_ComponentFactory.h.

◆ m_mapFPV

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

Definition at line 95 of file SCT_ComponentFactory.h.

◆ m_materials

SCT_MaterialManager* SCT_ComponentFactory::m_materials
protectedinherited

Definition at line 43 of file SCT_ComponentFactory.h.

◆ 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 49 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 91 of file SCT_ComponentFactory.h.

◆ 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 50 of file SCT_ComponentFactory.h.


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