ATLAS Offline Software
Loading...
Searching...
No Matches
DBM_Module Class Reference

Build the DBM Module consisting of diamond sensor, FEI4 and ceramic substrate. More...

#include <DBM_Module.h>

Inheritance diagram for DBM_Module:
Collaboration diagram for DBM_Module:

Public Member Functions

 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)
virtual GeoVPhysVol * Build () override

Protected Attributes

PixelGeometryManagerm_gmt_mgr
InDetMaterialManagerm_mat_mgr
InDetDD::PixelDetectorManagerm_DDmgr
GeoModelIO::ReadGeoModel * m_sqliteReader
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > m_mapFPV
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > m_mapAX
const double m_epsilon

Private Attributes

const InDetDD::SiDetectorDesignm_design

Detailed Description

Build the DBM Module consisting of diamond sensor, FEI4 and ceramic substrate.

Definition at line 26 of file DBM_Module.h.

Constructor & Destructor Documentation

◆ 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 at line 25 of file DBM_Module.cxx.

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;
51 PixelDiodeTree diode_tree = InDetDD::detail::makePixelDiodeTree(m_gmt_mgr,
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}
const InDetDD::SiDetectorDesign * m_design
Definition DBM_Module.h:38
PixelGeometryManager * m_gmt_mgr
InDetDD::PixelDetectorManager * m_DDmgr
GeoVPixelFactory(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)
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)

Member Function Documentation

◆ Build()

GeoVPhysVol * DBM_Module::Build ( )
overridevirtual

Implements GeoVPixelFactory.

Definition at line 81 of file DBM_Module.cxx.

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());
90 SiDetectorElement* element = new SiDetectorElement(idwafer, m_design, (*m_mapFPV)[key], m_gmt_mgr->commonItems());
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}
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > m_mapFPV
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > m_mapAX
GeoModelIO::ReadGeoModel * m_sqliteReader
InDetMaterialManager * m_mat_mgr
Identifier wafer_id(int barrel_ec, int layer_disk, int phi_module, int eta_module) const
For a single crystal.
Definition PixelID.h:360
@ layer
Definition HitInfo.h:79

Member Data Documentation

◆ m_DDmgr

InDetDD::PixelDetectorManager* GeoVPixelFactory::m_DDmgr
protectedinherited

Definition at line 45 of file GeoVPixelFactory.h.

◆ m_design

const InDetDD::SiDetectorDesign* DBM_Module::m_design
private

Definition at line 38 of file DBM_Module.h.

◆ m_epsilon

const double GeoVPixelFactory::m_epsilon
protectedinherited

Definition at line 49 of file GeoVPixelFactory.h.

◆ m_gmt_mgr

PixelGeometryManager* GeoVPixelFactory::m_gmt_mgr
protectedinherited

Definition at line 43 of file GeoVPixelFactory.h.

◆ m_mapAX

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

Definition at line 48 of file GeoVPixelFactory.h.

◆ m_mapFPV

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

Definition at line 47 of file GeoVPixelFactory.h.

◆ m_mat_mgr

InDetMaterialManager* GeoVPixelFactory::m_mat_mgr
protectedinherited

Definition at line 44 of file GeoVPixelFactory.h.

◆ m_sqliteReader

GeoModelIO::ReadGeoModel* GeoVPixelFactory::m_sqliteReader
protectedinherited

Definition at line 46 of file GeoVPixelFactory.h.


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