ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
InnerDetector
InDetDetDescr
SCT_GeoModel
src
SCT_SkiPowerTape.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
//
6
// 1st Feb 2005 D.Naito modified.
7
// 28th Mar 2005 S.Mima modified.
8
//
9
#include "
SCT_SkiPowerTape.h
"
10
11
#include "
SCT_MaterialManager.h
"
12
13
#include "
SCT_GeometryManager.h
"
14
#include "
SCT_BarrelParameters.h
"
15
16
#include "
SCT_Ski.h
"
17
#include "
SCT_PowerTape.h
"
18
#include "
SCT_Module.h
"
19
20
#include "GeoModelKernel/GeoBox.h"
21
#include "GeoModelKernel/GeoLogVol.h"
22
#include "GeoModelKernel/GeoPhysVol.h"
23
#include "GeoModelKernel/GeoNameTag.h"
24
#include "GeoModelKernel/GeoTransform.h"
25
#include "GeoModelKernel/GeoMaterial.h"
26
#include "GeoModelKernel/Units.h"
27
#include "GeoModelKernel/GeoDefinitions.h"
28
#include "GaudiKernel/SystemOfUnits.h"
29
#include <cmath>
30
#include <format>
31
32
SCT_SkiPowerTape::SCT_SkiPowerTape
(
const
std::string & name,
33
const
SCT_Ski
* ski,
34
double
length
,
35
InDetDD::SCT_DetectorManager
* detectorManager,
36
SCT_GeometryManager
* geometryManager,
37
SCT_MaterialManager
* materials) :
38
SCT_SharedComponentFactory
(name, detectorManager, geometryManager, materials),
39
m_length
(
length
),
m_ski
(ski)
40
{
41
getParameters
();
42
m_physVolume
=
SCT_SkiPowerTape::build
();
43
}
44
45
void
46
SCT_SkiPowerTape::getParameters
()
47
{
48
const
SCT_BarrelParameters
* parameters =
m_geometryManager
->barrelParameters();
49
50
// Width is the same as the width of a single powertape.
51
m_powerTapeThickness
= parameters->powerTapeThickness();
52
m_width
= parameters->powerTapeWidth();
53
m_powerTapeStartPointOffset
= parameters->powerTapeStartPointOffset();
54
}
55
56
57
GeoVPhysVol *
58
SCT_SkiPowerTape::build
()
59
{
60
// The power tapes are stacked going from the nearest interlink to the
61
// nearset edge of the dogleg.
62
//
63
// --- ---
64
// ------ ------
65
// --------- ---------
66
67
68
int
nHalfModules =
m_ski
->modulesPerSki()/2;
69
70
// Thickness of the stack.
71
m_thickness
= nHalfModules *
m_powerTapeThickness
;
72
73
74
// This is a volume containing all the power tapes.
75
const
GeoBox * skiPowerTapeShape =
new
GeoBox(0.5*
m_thickness
, 0.5*
m_width
, 0.5*
m_length
);
76
const
GeoLogVol *skiPowerTapeLog =
77
new
GeoLogVol(
getName
(), skiPowerTapeShape,
m_materials
->gasMaterial());
78
GeoPhysVol * skiPowerTape =
new
GeoPhysVol(skiPowerTapeLog);
79
80
// Loop over modules in ski as we need their z positions.
81
for
(
int
iModule = 0; iModule <
m_ski
->modulesPerSki(); iModule++) {
82
83
// Position PowerTapes
84
// These run from the nearest interlink to the edge of the dogleg
85
double
tapeLength, tapeMid, tapeStart, tapeEnd;
86
87
// nPos is used to stack the power tapes. Modules closest to interlink are
88
// furthest from support. The positive and negative z positions are
89
// syGaudi::Units::mmetric. nPos = 5,4,3,2,1,0,0,1,2,3,4,5 for the 12 modules.
90
int
nPos;
91
92
// test sign of zpos to determine whether the tape runs to the
93
// high z end or low z end.
94
95
if
(
m_ski
->zPos(iModule) > 0) {
96
97
// Tape runs from high z end to edge of dogleg. NB width of dogleg is in z-direction
98
tapeStart =
m_ski
->zPos(iModule) +
m_ski
->coolingBlockOffsetZ() +
m_powerTapeStartPointOffset
;
99
tapeEnd = 0.5 *
m_length
;
100
101
// For 12 module: iModule = 6, 7, 8, ..., 11 --> nPos = 0, 1, 2, ..., 5
102
nPos = iModule - nHalfModules;
103
104
}
else
{
105
106
// Tape runs from low z end to edge of dogleg. NB width of dogleg is in z-direction
107
tapeStart =
m_ski
->zPos(iModule) +
m_ski
->coolingBlockOffsetZ() -
m_powerTapeStartPointOffset
;
108
tapeEnd = -0.5 *
m_length
;
109
110
// For 12 module: iModule = 0, 1, 2, ..., 5 --> nPos = 5, 4, 3, ..., 0
111
nPos = nHalfModules - iModule - 1;
112
113
}
114
115
tapeLength = std::abs(tapeEnd - tapeStart);
116
tapeMid = 0.5 * (tapeEnd + tapeStart);
117
118
119
// Make sure that first half are negative and secand half are positive.
120
// Checking that nPos is >= 0 is equivalent to this.
121
if
(nPos < 0) {
122
std::cout <<
"SCT_SkiPowerTape: Module position inconsistent with assumption that\n"
123
<<
" first half has z < 0 and second half has z > 0"
124
<< std::endl;
125
}
126
127
// Create the tape
128
129
// Label tape with M# at end of string
130
SCT_PowerTape
powerTape(std::format(
"{}PowerTapeM{}"
,
getName
(),iModule + 1), tapeLength,
131
m_detectorManager
,
m_geometryManager
,
m_materials
);
132
133
// Calculate x position of tape. This will depend on the module number.
134
// The reference point is the middle of the stack.
135
double
xTapePos = - 0.5 *
m_thickness
+
136
(nPos + 0.5) * powerTape.
thickness
();
137
double
yTapePos = 0;
138
139
140
// Position the tape
141
skiPowerTape->add(
new
GeoTransform(GeoTrf::Translate3D(xTapePos, yTapePos, tapeMid)));
142
skiPowerTape->add(powerTape.
getVolume
());
143
144
}
145
146
return
skiPowerTape;
147
}
SCT_BarrelParameters.h
SCT_GeometryManager.h
SCT_MaterialManager.h
SCT_Module.h
SCT_PowerTape.h
SCT_SkiPowerTape.h
SCT_Ski.h
InDetDD::SCT_DetectorManager
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated SCT in...
Definition
SCT_DetectorManager.h:50
SCT_BarrelParameters
Definition
SCT_BarrelParameters.h:12
SCT_ComponentFactory::getName
const std::string & getName() const
Definition
SCT_ComponentFactory.h:35
SCT_ComponentFactory::m_detectorManager
InDetDD::SCT_DetectorManager * m_detectorManager
Definition
SCT_ComponentFactory.h:38
SCT_ComponentFactory::m_geometryManager
SCT_GeometryManager * m_geometryManager
Definition
SCT_ComponentFactory.h:39
SCT_ComponentFactory::m_materials
SCT_MaterialManager * m_materials
Definition
SCT_ComponentFactory.h:40
SCT_GeometryManager
Definition
SCT_GeometryManager.h:25
SCT_MaterialManager
Definition
SCT_MaterialManager.h:21
SCT_PowerTape
Definition
SCT_PowerTape.h:18
SCT_PowerTape::thickness
double thickness() const
Definition
SCT_PowerTape.h:28
SCT_SharedComponentFactory::m_physVolume
GeoVPhysVol * m_physVolume
Definition
SCT_ComponentFactory.h:66
SCT_SharedComponentFactory::getVolume
GeoVPhysVol * getVolume()
Definition
SCT_ComponentFactory.h:63
SCT_SharedComponentFactory::SCT_SharedComponentFactory
SCT_SharedComponentFactory(const std::string &name, InDetDD::SCT_DetectorManager *detectorManager, SCT_GeometryManager *geometryManager, SCT_MaterialManager *materials=nullptr)
Definition
SCT_ComponentFactory.h:56
SCT_SkiPowerTape::SCT_SkiPowerTape
SCT_SkiPowerTape(const std::string &name, const SCT_Ski *ski, double length, InDetDD::SCT_DetectorManager *detectorManager, SCT_GeometryManager *geometryManager, SCT_MaterialManager *materials)
Definition
SCT_SkiPowerTape.cxx:32
SCT_SkiPowerTape::build
virtual GeoVPhysVol * build()
Definition
SCT_SkiPowerTape.cxx:58
SCT_SkiPowerTape::m_width
double m_width
Definition
SCT_SkiPowerTape.h:40
SCT_SkiPowerTape::m_ski
const SCT_Ski * m_ski
Definition
SCT_SkiPowerTape.h:45
SCT_SkiPowerTape::m_powerTapeStartPointOffset
double m_powerTapeStartPointOffset
Definition
SCT_SkiPowerTape.h:49
SCT_SkiPowerTape::m_length
double m_length
Definition
SCT_SkiPowerTape.h:39
SCT_SkiPowerTape::length
double length() const
Definition
SCT_SkiPowerTape.h:31
SCT_SkiPowerTape::m_thickness
double m_thickness
Definition
SCT_SkiPowerTape.h:41
SCT_SkiPowerTape::getParameters
void getParameters()
Definition
SCT_SkiPowerTape.cxx:46
SCT_SkiPowerTape::m_powerTapeThickness
double m_powerTapeThickness
Definition
SCT_SkiPowerTape.h:42
SCT_Ski
Definition
SCT_Ski.h:30
Generated on
for ATLAS Offline Software by
1.17.0