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