27 GeoModelIO::ReadGeoModel* sqliteReader,
28 std::shared_ptr<std::map<std::string, GeoFullPhysVol*>> mapFPV,
29 std::shared_ptr<std::map<std::string, GeoAlignableTransform*>> mapAX)
33 double thickness = 0.5;
35 int circuitsPerPhi = 1;
36 int circuitsPerEta = 1;
37 int cellRowPerCirc = 80;
38 int cellColPerCirc = 336;
39 int rowsPerCircuit = 80;
40 int columnsPerCircuit = 336;
43 double pitchEtaLongEnd = 0.05;
44 double pitchEtaLong = 0.05;
45 double pitchPhi = 0.25;
46 double pitchEta = 0.05;
53 std::array<int,kNDirections>{circuitsPerPhi,circuitsPerEta},
54 std::array<int,kNDirections>{rowsPerCircuit,columnsPerCircuit},
55 std::array<std::array<double,kNDirections>,kNPixelLocations>{
56 std::array<double,kNDirections>{pitchPhi,pitchEta},
57 std::array<double,kNDirections>{0.,pitchEtaLongEnd},
58 std::array<double,kNDirections>{0.,pitchEtaLong}},
61 std::unique_ptr<PixelModuleDesign> p_dbmdesign = std::make_unique<PixelModuleDesign>(thickness,
68 std::move(diode_tree),
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());
92 m_DDmgr->addDetectorElement(element);
97 GeoIdentifierTag* diamondTag =
new GeoIdentifierTag(400);
100 double safety = 0.003*Gaudi::Units::mm;
103 double diamond_X =
m_gmt_mgr->DBMDiamondX();
104 double diamond_Y =
m_gmt_mgr->DBMDiamondY();
105 double diamond_Z =
m_gmt_mgr->DBMDiamondZ();
111 double chip_thick =
m_gmt_mgr->DBMFEI4Z();
114 double substrate_X =
m_gmt_mgr->DBMCeramicX();
115 double substrate_Y =
m_gmt_mgr->DBMCeramicY();
116 double substrate_Z =
m_gmt_mgr->DBMCeramicZ();
120 double bot2Chip = 0.0*Gaudi::Units::mm;
121 double bot2Diamond = 1.685*Gaudi::Units::mm;
129 double ZToIP = 887.002*Gaudi::Units::mm;
130 double RToBeam = 46.678*Gaudi::Units::mm;
133 double Zspacing =
m_gmt_mgr->DBMSpacingZ();
134 double Rspacing =
m_gmt_mgr->DBMSpacingRadial();
136 double layer1Space =
m_gmt_mgr->DBMSpace();
140 double bracketZ =
m_gmt_mgr->DBMBracketZ();
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();
149 double layerUnitPos_Y = (trapBackY/cos(
angle) - coolingSidePlateY)*cos(
angle);
150 double layerUnitPos_Z = coolingSidePlateY*sin(
angle) + trapBackShortZ + bracketZ - brcktLockZ;
155 const GeoMaterial* air =
m_mat_mgr->getMaterial(
"std::Air");
157 const GeoMaterial* diamond =
m_mat_mgr->getMaterial(
"pix::Diamond");
158 if(diamond ==
nullptr)
160 diamond =
m_mat_mgr->getMaterial(
"std::Carbon");
163 const GeoMaterial* chip_mat =
m_mat_mgr->getMaterial(
"pix::ChipBase");
165 double max_thick = diamond_Z + air_gap + chip_thick + substrate_Z;
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);
172 GeoTrf::Transform3D rm = GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)*GeoTrf::RotateY3D(270.*Gaudi::Units::deg);
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);
181 m_DDmgr->addDetectorElement(element);
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));
186 dbmModulePhys->add(diamondTag);
187 dbmModulePhys->add(xform);
188 dbmModulePhys->add(dbmDiamondPhys);
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);
193 GeoPhysVol* dbmFEI4Phys =
new GeoPhysVol(dbmFEI4Log);
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));
198 dbmModulePhys->add(xform);
199 dbmModulePhys->add(dbmFEI4Phys);
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);
207 GeoTrf::Translate3D dbmSubstPos(0, 0, max_thick/2.0-substrate_Z/2.0);
208 xform =
new GeoTransform(dbmSubstPos);
210 dbmModulePhys->add(xform);
211 dbmModulePhys->add(dbmSubstPhys);
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));
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);
232 return dbmModulePhys;
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)