ATLAS Offline Software
Loading...
Searching...
No Matches
SCT_Sensor.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#include <utility>
6
7#include "SCT_Sensor.h"
8
10#include "SCT_MaterialManager.h"
11
13
14#include "GeoModelRead/ReadGeoModel.h"
15#include "GeoModelKernel/GeoBox.h"
16#include "GeoModelKernel/GeoLogVol.h"
17#include "GeoModelKernel/GeoFullPhysVol.h"
18#include "GeoModelKernel/GeoMaterial.h"
19
25
26#include "GaudiKernel/SystemOfUnits.h"
27
28using namespace InDetDD;
29
30SCT_Sensor::SCT_Sensor(const std::string & name,
31 InDetDD::SCT_DetectorManager* detectorManager,
32 SCT_GeometryManager* geometryManager,
33 SCT_MaterialManager* materials,
34 GeoModelIO::ReadGeoModel* sqliteReader,
35 std::shared_ptr<std::map<std::string, GeoFullPhysVol*>> mapFPV,
36 std::shared_ptr<std::map<std::string, GeoAlignableTransform*>> mapAX)
37 : SCT_UniqueComponentFactory(name, detectorManager, geometryManager, materials, sqliteReader, std::move(mapFPV), std::move(mapAX)),
39{
42
43}
44
45
46void
48{
49
50 const SCT_BarrelModuleParameters * parameters = m_geometryManager->barrelModuleParameters();
51 if(!m_sqliteReader) m_material = m_materials->getMaterial(parameters->sensorMaterial());
52 m_thickness = parameters->sensorThickness();
53 m_length = 0;
54 if (parameters->sensorNumWafers() == 2) {
55 m_length = parameters->sensorLength() + parameters->sensorDistCenterToCenter();
56 } else {
57 m_length = parameters->sensorLength();
58 }
59 m_width = parameters->sensorWidth();
60
61}
62
63const GeoLogVol *
65{
66
67 // Make the moduleside design for this sensor
68 makeDesign();
69 if(m_sqliteReader) return nullptr;
70
71 // Build the sensor. Just a simple box.
72 const GeoBox * sensorShape = new GeoBox(0.5*m_thickness, 0.5*m_width, 0.5*m_length);
73 GeoLogVol * sensorLog = new GeoLogVol(getName(), sensorShape, m_material);
74
75
76
77 return sensorLog;
78}
79
80
81void
83{
84 //SiDetectorDesign::Axis etaAxis = SiDetectorDesign::zAxis;
85 //SiDetectorDesign::Axis phiAxis = SiDetectorDesign::yAxis;
86 //SiDetectorDesign::Axis depthAxis = SiDetectorDesign::xAxis;
87 const SCT_BarrelModuleParameters * parameters = m_geometryManager->barrelModuleParameters();
88
89 double stripPitch = parameters->sensorStripPitch();
90 double stripLength = parameters->sensorStripLength();
91 int crystals = parameters->sensorNumWafers();
92 double distCenterToCenter = parameters->sensorDistCenterToCenter();
93
94 //int cells = parameters->sensorNumReadoutStrips();
95 //int diodes = parameters->sensorNumStrips();
96 //int shift = parameters->sensorStripShift();
97
98 // For consistency with older version we keep shift = 0.
99 int cells = parameters->sensorNumReadoutStrips();
100 int diodes = cells;
101 int shift = 0;
102
103 double totalDeadLength = distCenterToCenter - stripLength;
104
105 double xEtaStripPatternCenter = 0;
106 double xPhiStripPatternCenter = 0;
107
108 // Readout direction is in same direction as local phi direction
109 bool swapStripReadout = false;
110
111 // The readout side is at the +ve depth direction
112 int readoutSide = +1;
113
114 // m_design will be owned and deleted by SCT_DetectorManager
115 std::unique_ptr<SCT_BarrelModuleSideDesign> design = std::make_unique<SCT_BarrelModuleSideDesign>(m_thickness,
116 crystals,
117 diodes,
118 cells,
119 shift,
120 swapStripReadout,
122 stripPitch,
123 stripLength,
124 xEtaStripPatternCenter,
125 xPhiStripPatternCenter,
126 totalDeadLength,
127 readoutSide);
128
129 m_design = m_detectorManager->addDesign(std::move(design));
130
131 //
132 // Flags to signal if axis can be swapped.
133 // For rectangular detector these are all true.
134 // This is the default and no action is required.
135 // Can force axes not to be swapped by setting to false.
136 //
137 // bool phiSyGaudi::Units::mmetric = true;
138 // bool etaSyGaudi::Units::mmetric = true;
139 // bool depthSyGaudi::Units::mmetric = true;
140 // m_design->setSyGaudi::Units::mmetry(phiSyGaudi::Units::mmetric, etaSyGaudi::Units::mmetric, depthSyGaudi::Units::mmetric,
141 //
142}
143
144
145
146GeoVPhysVol *
148{
149 GeoFullPhysVol * sensor;
150 if(m_sqliteReader){
151
152 std::string key="Sensor_Side#"+std::to_string(id.getSide())+"_"+std::to_string(id.getBarrelEC())+"_"+std::to_string(id.getLayerDisk())+"_"+std::to_string(id.getEtaModule())+"_"+std::to_string(id.getPhiModule());
153
154 sensor=(*m_mapFPV)[key];
155
156 }
157 else sensor= new GeoFullPhysVol(m_logVolume);
158
159 // Make detector element and add to collection
160 // Only do so if we have a valid id helper.
161
162 //id.print(); // for debugging only
163
164 const SiCommonItems* commonItems = m_geometryManager->commonItems();
165
166 if (commonItems->getIdHelper()) {
167
168 SiDetectorElement * detElement;
169
170 // detElement will be owned by SCT_DetectorManager
171 // and will be deleted in destructor of SiDetectorElementCollection in SCT_DetectorManager
172 detElement = new SiDetectorElement(id.getWaferId(),
173 m_design,
174 sensor,
175 commonItems);
176
177 // Add the detector element.
178 m_detectorManager->addDetectorElement(detElement);
179
180 } else {
181 if (m_noElementWarning) {
182 std::cout << "WARNING!!!!: No SCT id helper and so no elements being produced." << std::endl;
183 m_noElementWarning = false;
184 }
185 }
186 return sensor;
187}
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated SCT in...
Helper class to concentrate common items, such as the pointer to the IdHelper, the lorentzAngle tool ...
const AtlasDetectorID * getIdHelper() const
Class to hold geometrical description of a silicon detector element.
const std::string & getName() const
InDetDD::SCT_DetectorManager * m_detectorManager
SCT_GeometryManager * m_geometryManager
SCT_MaterialManager * m_materials
double m_width
Definition SCT_Sensor.h:43
void makeDesign()
virtual GeoVPhysVol * build(SCT_Identifier id)
double m_thickness
Definition SCT_Sensor.h:42
void getParameters()
const GeoMaterial * m_material
Definition SCT_Sensor.h:41
const InDetDD::SiDetectorDesign * m_design
Definition SCT_Sensor.h:46
virtual const GeoLogVol * preBuild()
double m_length
Definition SCT_Sensor.h:44
std::atomic_bool m_noElementWarning
Definition SCT_Sensor.h:48
SCT_Sensor(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)
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
Message Stream Member.
STL namespace.