ATLAS Offline Software
DBM_Module.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 
6 #include <utility>
7 
8 #include "DBM_Module.h"
9 
10 #include "GeoModelKernel/GeoTransform.h"
11 #include "GeoModelKernel/GeoAlignableTransform.h"
12 #include "GeoModelKernel/GeoNameTag.h"
13 #include "GeoModelKernel/GeoBox.h"
14 #include "GaudiKernel/SystemOfUnits.h"
15 
16 #include "Identifier/Identifier.h"
19 
22 #include "PixelGeoUtils.h"
23 using namespace InDetDD;
24 
27  GeoModelIO::ReadGeoModel* sqliteReader,
28  std::shared_ptr<std::map<std::string, GeoFullPhysVol*>> mapFPV,
29  std::shared_ptr<std::map<std::string, GeoAlignableTransform*>> mapAX)
30  : GeoVPixelFactory (ddmgr, mgr, sqliteReader, std::move(mapFPV), std::move(mapAX))
31 {
32 
33  double thickness = 0.5;
34 
35  int circuitsPerPhi = 1;
36  int circuitsPerEta = 1;
37  int cellRowPerCirc = 80;
38  int cellColPerCirc = 336;
39  int rowsPerCircuit = 80;
40  int columnsPerCircuit = 336;
41  int readoutSide = 1;
42 
43  double pitchEtaLongEnd = 0.05;
44  double pitchEtaLong = 0.05;
45  double pitchPhi = 0.25;
46  double pitchEta = 0.05;
47 
48  constexpr auto readoutTechnology = InDetDD::PixelReadoutTechnology::FEI4;
52  readoutTechnology,
53  std::array<int,kNDirections>{circuitsPerPhi,circuitsPerEta}, // [0]=phi/row, [1]=eta/column
54  std::array<int,kNDirections>{rowsPerCircuit,columnsPerCircuit}, // [0]=phi/row, [1]=eta/column
55  std::array<std::array<double,kNDirections>,kNPixelLocations>{ // regular/central,longEnd/outer,long/inner
56  std::array<double,kNDirections>{pitchPhi,pitchEta},
57  std::array<double,kNDirections>{0.,pitchEtaLongEnd},
58  std::array<double,kNDirections>{0.,pitchEtaLong}},
60 
61  std::unique_ptr<PixelModuleDesign> p_dbmdesign = std::make_unique<PixelModuleDesign>(thickness,
62  circuitsPerPhi,
63  circuitsPerEta,
64  cellColPerCirc,
65  cellRowPerCirc,
66  columnsPerCircuit,
67  rowsPerCircuit,
68  std::move(diode_tree),
70  readoutSide,
71  false, /* 3D */
72  InDetDD::Undefined, /* detector type */
73  readoutTechnology);
74 
75 
76  m_design = m_DDmgr->addDesign(std::move(p_dbmdesign));
77 
78 
79 }
80 
81 GeoVPhysVol* DBM_Module::Build()
82 {
83  const PixelID * idHelper = m_gmt_mgr->getIdHelper();
84  int dbmdet = 4*m_gmt_mgr->GetSide();
85  Identifier idwafer;
86  idwafer = idHelper->wafer_id(dbmdet,m_gmt_mgr->GetLD(),m_gmt_mgr->Phi(),m_gmt_mgr->Eta());
87 
88  if(m_sqliteReader) {
89  std::string key ="DBMDiamond_" + std::to_string(dbmdet) +"_"+ std::to_string(m_gmt_mgr->GetLD()) +"_"+ std::to_string(m_gmt_mgr->Phi()) +"_"+ std::to_string(m_gmt_mgr->Eta());
91  // add the element to the manager
92  m_DDmgr->addDetectorElement(element);
93  m_DDmgr->addAlignableTransform(0, idwafer, (*m_mapAX)[key], (*m_mapFPV)[key]);
94  return nullptr;
95  }
96  else {
97  GeoIdentifierTag* diamondTag = new GeoIdentifierTag(400);
98 
99 
100  double safety = 0.003*Gaudi::Units::mm;
101 
102  //diamond dimension
103  double diamond_X = m_gmt_mgr->DBMDiamondX();
104  double diamond_Y = m_gmt_mgr->DBMDiamondY();
105  double diamond_Z = m_gmt_mgr->DBMDiamondZ();
106  double air_gap = m_gmt_mgr->DBMAirGap();
107 
108  //chip, FEI4 dimension
109  double chip_X = m_gmt_mgr->DBMFEI4X();
110  double chip_Y = m_gmt_mgr->DBMFEI4Y();
111  double chip_thick = m_gmt_mgr->DBMFEI4Z();
112 
113  //ceramic dimension
114  double substrate_X = m_gmt_mgr->DBMCeramicX();
115  double substrate_Y = m_gmt_mgr->DBMCeramicY();
116  double substrate_Z = m_gmt_mgr->DBMCeramicZ();
117 
118  //distances from bottom of the ceramic
119  //Hardcoded!
120  double bot2Chip = 0.0*Gaudi::Units::mm;
121  double bot2Diamond = 1.685*Gaudi::Units::mm;
122 
123 
124  //---------------------------------------------
125  // Get parameters for alignable Transform
126 
127  // Position of the corner closest to IP and beamline
128  // Hardcoded, so if change then change in GeoPixelEnvelope and DBM_Det too
129  double ZToIP = 887.002*Gaudi::Units::mm;
130  double RToBeam = 46.678*Gaudi::Units::mm;
131 
132  // layer spacing
133  double Zspacing = m_gmt_mgr->DBMSpacingZ();
134  double Rspacing = m_gmt_mgr->DBMSpacingRadial();
135  // gap between V-slide and first main plate
136  double layer1Space = m_gmt_mgr->DBMSpace();
137 
138  // parameters for rotating the 3-layer unit
139  double angle = m_gmt_mgr->DBMAngle(); // telescope tilting angle in degree
140  double bracketZ = m_gmt_mgr->DBMBracketZ(); // total thickness of the bracket unit,
141  double trapBackY = m_gmt_mgr->DBMTrapezBackY();
142  double trapBackShortZ = m_gmt_mgr->DBMTrapezBackShortZ();
143  double coolingSidePlateY = m_gmt_mgr->DBMCoolingSidePlateY();
144  double brcktLockZ = m_gmt_mgr->DBMBrcktLockZ();
145 
146  //double lyRadius = sqrt(layerUnitY*layerUnitY/4 + layerUnitZ*layerUnitZ/4);
147  //double lyAngle = atan(layerUnitY/layerUnitZ);
148  // position of the 3-layer unit's corner closest to the IP and beamline, which is the rotation point
149  double layerUnitPos_Y = (trapBackY/cos(angle) - coolingSidePlateY)*cos(angle);
150  double layerUnitPos_Z = coolingSidePlateY*sin(angle) + trapBackShortZ + bracketZ - brcktLockZ;
151  //---------------------------------------------
152 
153 
154 
155  const GeoMaterial* air = m_mat_mgr->getMaterial("std::Air");
156  //first try the Diamond
157  const GeoMaterial* diamond = m_mat_mgr->getMaterial("pix::Diamond");
158  if(diamond == nullptr)
159  {
160  diamond = m_mat_mgr->getMaterial("std::Carbon");
161  }
162 
163  const GeoMaterial* chip_mat = m_mat_mgr->getMaterial("pix::ChipBase");
164 
165  double max_thick = diamond_Z + air_gap + chip_thick + substrate_Z;
166 
167  //create a outer box to contain all volumes
168  const GeoBox* dbmModuleBox = new GeoBox(substrate_X/2.0 + safety, substrate_Y/2.0 + safety, max_thick/2.0 + safety);
169  const GeoLogVol* dbmModuleLog = new GeoLogVol("dbmModuleLog", dbmModuleBox, air);
170  GeoPhysVol* dbmModulePhys = new GeoPhysVol(dbmModuleLog);
171 
172  GeoTrf::Transform3D rm = GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)*GeoTrf::RotateY3D(270.*Gaudi::Units::deg);
173 
174  //diamond
175  const GeoBox* dbmDiamondBox = new GeoBox(diamond_Z/2.0, diamond_X/2.0, diamond_Y/2.0 );
176  const GeoLogVol* dbmDiamondLog = new GeoLogVol("dbmDiamondLog", dbmDiamondBox, diamond);
177  GeoFullPhysVol* dbmDiamondPhys = new GeoFullPhysVol(dbmDiamondLog);
178 
179  SiDetectorElement* element= new SiDetectorElement(idwafer, m_design, dbmDiamondPhys, m_gmt_mgr->commonItems());
180  // add the element to the manager
181  m_DDmgr->addDetectorElement(element);
182 
183  GeoTrf::Translation3D dbmDiamondPos(0, bot2Diamond+diamond_Y/2.0-substrate_Y/2.0, diamond_Z/2.0-max_thick/2.0);
184  GeoTransform* xform = new GeoTransform(GeoTrf::Transform3D(dbmDiamondPos*rm));
185 
186  dbmModulePhys->add(diamondTag);
187  dbmModulePhys->add(xform);
188  dbmModulePhys->add(dbmDiamondPhys);
189 
190  //FEI4 chip
191  const GeoBox* dbmFEI4Box = new GeoBox(chip_thick/2.0, chip_X/2.0, chip_Y/2.0 );
192  const GeoLogVol* dbmFEI4Log = new GeoLogVol("dbmWallLogF4", dbmFEI4Box, chip_mat); //should this be "dbmdiamondLog"?
193  GeoPhysVol* dbmFEI4Phys = new GeoPhysVol(dbmFEI4Log);
194 
195  GeoTrf::Translation3D dbmFEI4Pos(0, bot2Chip+chip_Y/2.0-substrate_Y/2.0, max_thick/2.0-substrate_Z-chip_thick/2.0);
196  xform = new GeoTransform(GeoTrf::Transform3D(dbmFEI4Pos*rm));
197 
198  dbmModulePhys->add(xform);
199  dbmModulePhys->add(dbmFEI4Phys);
200 
201  //ceramic support
202  const GeoBox* dbmSubstBox = new GeoBox(substrate_X/2.0, substrate_Y/2.0, substrate_Z/2.0);
203  const GeoMaterial* aluminiumNitride = m_mat_mgr->getMaterialForVolume("pix::DBMCeramic", dbmSubstBox->volume());
204  const GeoLogVol* dbmSubstLog = new GeoLogVol("dbmWallLogCe", dbmSubstBox, aluminiumNitride);
205  GeoPhysVol* dbmSubstPhys = new GeoPhysVol(dbmSubstLog);
206 
207  GeoTrf::Translate3D dbmSubstPos(0, 0, max_thick/2.0-substrate_Z/2.0);
208  xform = new GeoTransform(dbmSubstPos);
209 
210  dbmModulePhys->add(xform);
211  dbmModulePhys->add(dbmSubstPhys);
212 
213  //-----------------------------------------------------
214  //Add to alignable transform
215  // DBM has only level 0 alignable transform.
216  // So, a transform w.r.t global position is created.
217  // This mean the alignable pos below should be
218  // the global position of the sensor
219 
220  int layer = m_gmt_mgr->GetLD();
221  double sensorPosInModuleCage_Z = layer1Space + layer*Zspacing - (substrate_Z + chip_thick + air_gap + diamond_Z/2.);
222  double sensorPosInModuleCage_Y = Rspacing + bot2Diamond + diamond_Y/2.;
223  double globPosZ = ZToIP + layerUnitPos_Z + (sensorPosInModuleCage_Z * cos(angle) - sensorPosInModuleCage_Y * sin(angle));
224  double globPosY = RToBeam + layerUnitPos_Y + (sensorPosInModuleCage_Z * sin(angle) + sensorPosInModuleCage_Y * cos(angle));
225 
226  GeoTrf::RotateX3D rmX10(-10.*Gaudi::Units::deg);
227  GeoTrf::Translation3D alignTransformPos(0, globPosY, globPosZ);
228  GeoAlignableTransform *xformAlign = new GeoAlignableTransform(GeoTrf::Transform3D(alignTransformPos*rmX10));
229  m_DDmgr->addAlignableTransform(0, idwafer, xformAlign, dbmDiamondPhys);
230  //-----------------------------------------------------
231 
232  return dbmModulePhys;
233  }
234 }
PixelID.h
This is an Identifier helper class for the Pixel subdetector. This class is a factory for creating co...
InDetDD::PixelDiodeTree
Tree structure to find the position, index or pitch of a pixel on a semi-regular grid The grid is con...
Definition: PixelDiodeTree.h:33
PixelGeometryManager::DBMBrcktLockZ
virtual double DBMBrcktLockZ()=0
PixelGeometryManager::DBMBracketZ
virtual double DBMBracketZ()=0
python.SystemOfUnits.mm
float mm
Definition: SystemOfUnits.py:98
PixelGeometryManager::DBMDiamondZ
virtual double DBMDiamondZ()=0
PixelGeometryManager::DBMSpacingRadial
virtual double DBMSpacingRadial()=0
PixelGeometryManager
Definition: PixelGeometryManager.h:28
PixelGeometryManager::DBMDiamondX
virtual double DBMDiamondX()=0
InDetDD::detail::kNPixelLocations
@ kNPixelLocations
Definition: PixelGeoUtils.h:21
DBM_Module::DBM_Module
DBM_Module(InDetDD::PixelDetectorManager *ddmgr, PixelGeometryManager *mgr, GeoModelIO::ReadGeoModel *sqliteReader, std::shared_ptr< std::map< std::string, GeoFullPhysVol * >> mapFPV, std::shared_ptr< std::map< std::string, GeoAlignableTransform * >> mapAX)
Definition: DBM_Module.cxx:25
PixelGeometryManager::DBMCeramicY
virtual double DBMCeramicY()=0
PixelGeometryManager::DBMTrapezBackShortZ
virtual double DBMTrapezBackShortZ()=0
deg
#define deg
Definition: SbPolyhedron.cxx:17
InDetDD::SiDetectorManager::addDesign
const SiDetectorDesign * addDesign(std::unique_ptr< const SiDetectorDesign > &&)
Access to module design; returns an observer pointer.
Definition: SiDetectorManager.cxx:134
PixelGeometryManager::DBMSpace
virtual double DBMSpace()=0
PixelGeometryManager::GetSide
virtual int GetSide()=0
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
MuonR4::to_string
std::string to_string(const SectorProjector proj)
Definition: MsTrackSeeder.cxx:66
GeoVPixelFactory::m_mapAX
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > m_mapAX
Definition: GeoVPixelFactory.h:48
GeoVPixelFactory::m_sqliteReader
GeoModelIO::ReadGeoModel * m_sqliteReader
Definition: GeoVPixelFactory.h:46
DBM_Module.h
PixelID::wafer_id
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module) const
For a single crystal.
Definition: PixelID.h:360
GeoVPixelFactory::m_DDmgr
InDetDD::PixelDetectorManager * m_DDmgr
Definition: GeoVPixelFactory.h:45
PixelGeometryManager::DBMAirGap
virtual double DBMAirGap()=0
GeoVPixelFactory::m_gmt_mgr
PixelGeometryManager * m_gmt_mgr
Definition: GeoVPixelFactory.h:43
GeoVPixelFactory::m_mapFPV
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > m_mapFPV
Definition: GeoVPixelFactory.h:47
BchCleanup.mgr
mgr
Definition: BchCleanup.py:294
InDetDD::detail::makePixelDiodeTree
PixelDiodeTree makePixelDiodeTree(T_MsgParent *gmt_mgr, InDetDD::PixelReadoutTechnology readoutTechnology, const std::array< int, kNDirections > &circuits, const std::array< int, kNDirections > &dimPerCircuit, const std::array< std::array< double, kNDirections >, kNPixelLocations > &pitch, FENumbering fe_numbering)
Definition: PixelGeoUtils.h:54
PixelDetectorManager.h
PixelGeoUtils.h
angle
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
Definition: TRTDetectorFactory_Full.cxx:71
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
PixelGeometryManager::Eta
virtual int Eta()=0
InDetMaterialManager::getMaterialForVolume
const GeoMaterial * getMaterialForVolume(const std::string &materialName, double volume, const std::string &newName="")
Create and get material with a density calculated to give weight in predefined weight table.
Definition: InDetMaterialManager.cxx:467
PixelGeometryManager::DBMAngle
virtual double DBMAngle()=0
PixelGeometryManager::DBMCoolingSidePlateY
virtual double DBMCoolingSidePlateY()=0
PixelGeometryManager::DBMSpacingZ
virtual double DBMSpacingZ()=0
InDetDD::detail::FENumbering::kRegular
@ kRegular
PixelGeometryManager::DBMTrapezBackY
virtual double DBMTrapezBackY()=0
InDetDD::PixelDetectorManager::addAlignableTransform
virtual void addAlignableTransform(int level, const Identifier &id, GeoAlignableTransform *xf, const GeoVFullPhysVol *child)
Add alignable transforms.
Definition: PixelDetectorManager.cxx:274
PixelGeometryManager::DBMCeramicZ
virtual double DBMCeramicZ()=0
PixelGeometryManager::DBMCeramicX
virtual double DBMCeramicX()=0
InDetDD::PixelDetectorManager
Definition: PixelDetectorManager.h:47
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
InDetDD::PixelReadoutTechnology::FEI4
@ FEI4
GeoVPixelFactory::m_mat_mgr
InDetMaterialManager * m_mat_mgr
Definition: GeoVPixelFactory.h:44
SiDetectorElement.h
InDetDD
Message Stream Member.
Definition: FakeTrackBuilder.h:8
PixelModuleDesign.h
DBM_Module::m_design
const InDetDD::SiDetectorDesign * m_design
Definition: DBM_Module.h:38
PixelGeometryManager::DBMDiamondY
virtual double DBMDiamondY()=0
Amg::Translation3D
Eigen::Translation< double, 3 > Translation3D
Definition: GeoPrimitives.h:44
GeoVPixelFactory
This is the base class for all the pieces of the Pixel detector.
Definition: GeoVPixelFactory.h:31
PixelGeometryManager::DBMFEI4X
virtual double DBMFEI4X()=0
PixelGeometryManager::getIdHelper
virtual const PixelID * getIdHelper()=0
InDetDD::Undefined
@ Undefined
Definition: DetectorDesign.h:46
PixelGeometryManager::commonItems
virtual InDetDD::SiCommonItems * commonItems()=0
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
InDetDD::detail::kNDirections
@ kNDirections
Definition: PixelGeoUtils.h:22
InDetMaterialManager::getMaterial
const GeoMaterial * getMaterial(const std::string &materialName)
Get material. First looks for locally defined material and if not found looks in GeoModel material ma...
Definition: InDetMaterialManager.cxx:100
PixelID
Definition: PixelID.h:67
PixelGeometryManager::DBMFEI4Z
virtual double DBMFEI4Z()=0
DBM_Module::Build
virtual GeoVPhysVol * Build() override
Definition: DBM_Module.cxx:81
InDetDD::electrons
@ electrons
Definition: InDetDD_Defs.h:17
InDetDD::PixelDetectorManager::addDetectorElement
virtual void addDetectorElement(SiDetectorElement *element) override
Add elememts.
Definition: PixelDetectorManager.cxx:128
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
PixelGeometryManager::DBMFEI4Y
virtual double DBMFEI4Y()=0
PixelGeometryManager::GetLD
virtual int GetLD()=0
PixelGeometryManager::Phi
virtual int Phi()=0
Identifier
Definition: IdentifierFieldParser.cxx:14