ATLAS Offline Software
Loading...
Searching...
No Matches
DBM_Det.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "DBM_Det.h"
6#include "DBM_Telescope.h"
7#include "DBM_Services.h"
8#include "GeoModelKernel/GeoTransform.h"
9#include "GeoModelKernel/GeoNameTag.h"
10#include "GeoModelKernel/GeoIdentifierTag.h"
11#include "GeoModelKernel/GeoBox.h"
12#include "GeoModelKernel/GeoTrd.h"
13#include "GeoModelKernel/GeoTube.h"
14#include "GaudiKernel/SystemOfUnits.h"
16
17#include <iostream>
18#include <utility>
19
22 , GeoModelIO::ReadGeoModel* sqliteReader
23 , std::shared_ptr<std::map<std::string, GeoFullPhysVol*>> mapFPV
24 , std::shared_ptr<std::map<std::string, GeoAlignableTransform*>> mapAX)
25 : GeoVPixelFactory(ddmgr,mgr,sqliteReader, std::move(mapFPV), std::move(mapAX))
26{
27 double Trans_Y = 0.;
28
29 // Radius to beamline
30 // Hardcoded, so if change then change in DBM_module too
31 double trans_rad = 46.678*Gaudi::Units::mm + (m_gmt_mgr->DBMTelescopeY()) / 2.; // 10-Gaudi::Units::degree version
32
33 // TRANS_X TRANS_Y TRANS_Z ROT_X ROT_Y ROT_Z
34 m_module[0].push_back(trans_rad); m_module[0].push_back(0); m_module[0].push_back(Trans_Y); m_module[0].push_back(0); m_module[0].push_back(0); m_module[0].push_back(270);
35 m_module[1].push_back(0); m_module[1].push_back(trans_rad); m_module[1].push_back(Trans_Y); m_module[1].push_back(0); m_module[1].push_back(0); m_module[1].push_back(0);
36 m_module[2].push_back(-trans_rad); m_module[2].push_back(0); m_module[2].push_back(Trans_Y); m_module[2].push_back(0); m_module[2].push_back(0); m_module[2].push_back(90);
37 m_module[3].push_back(0); m_module[3].push_back(-trans_rad); m_module[3].push_back(Trans_Y); m_module[3].push_back(0); m_module[3].push_back(0); m_module[3].push_back(180);
38
39}
40
41GeoVPhysVol* DBM_Det::Build()
42{
43 GeoFullPhysVol* Phys{nullptr};
44 if(!m_sqliteReader) {
45 double safety = 0.001;
46
47 //create a cylinder 8mm smaller than the BPSS outer radius to place the 4 DBM telescopes
48 double rmin = 45.*Gaudi::Units::mm;//41.0*Gaudi::Units::mm;
49 double rmax = 150.*Gaudi::Units::mm; //244.*Gaudi::Units::mm;
50 double halflength = m_gmt_mgr->DBMTelescopeZ()/2.;//200.*Gaudi::Units::mm
51 GeoTube * Shape = new GeoTube(rmin,rmax,halflength);
52 const GeoMaterial* air = m_mat_mgr->getMaterial("std::Air");
53 const GeoLogVol* Log = new GeoLogVol("OutsideDBM",Shape,air);
54 Phys = new GeoFullPhysVol(Log);
55
56 // add PP0 board
58 GeoVPhysVol* pp0BoardPhys = pp0Board.Build();
59 GeoTrf::Translate3D pp0Pos(0., 0., -halflength + m_gmt_mgr->DBMPP0Thick()/2. + safety);
60 GeoTransform* pp0xform = new GeoTransform(pp0Pos);
61 GeoNameTag* pp0tag = new GeoNameTag("DBM_PP0");
62 Phys->add(pp0tag);
63 Phys->add(pp0xform);
64 Phys->add(pp0BoardPhys);
65 }
66
67 //we are now adding four DBM telescopes
69 for(int i=0; i<4; i++)
70 {
71 m_gmt_mgr->SetEta(0);
72 m_gmt_mgr->SetPhi(i);
73 // Fixing swaping of module 0 and 2 on side C (-4)
74 // sinceDBM side C is 180deg rotation around global Y
75 if ((m_gmt_mgr->GetSide() < 0) && (i == 0)) m_gmt_mgr->SetPhi(2);
76 else if ((m_gmt_mgr->GetSide() < 0) && (i == 2)) m_gmt_mgr->SetPhi(0);
77
78 //setting transformation
79 if(m_sqliteReader) {
80 dbm.Build();
81 }
82 else {
83 GeoTrf::Transform3D rm = GeoTrf::RotateZ3D(m_module[i].at(5)*Gaudi::Units::deg)
84 * GeoTrf::RotateY3D(m_module[i].at(4)*Gaudi::Units::deg)
85 * GeoTrf::RotateX3D(m_module[i].at(3)*Gaudi::Units::deg);
86 GeoTrf::Translation3D pos(m_module[i].at(0), m_module[i].at(1), m_module[i].at(2));
87 GeoTransform* xform = new GeoTransform(GeoTrf::Transform3D(pos*rm));
88
89 GeoNameTag* tag = new GeoNameTag("DBM Module");
90 GeoVPhysVol* dbmModPhys = dbm.Build();
91 Phys->add(tag);
92 Phys->add(new GeoIdentifierTag(i));
93 Phys->add(xform);
94 Phys->add(dbmModPhys);
95 }
96 }
97
98
99 // Set numerology for the full DBM system
100
101 if(m_DDmgr->numerology().numEndcapsDBM()==0){
102
103 int numDisk=3;
104 int numPhiModules=4;
105 m_DDmgr->numerology().setNumDisksDBM(numDisk);
106 m_DDmgr->numerology().setNumBarrelDBM(0);
107 m_DDmgr->numerology().addEndcapDBM(4);
108 m_DDmgr->numerology().addEndcapDBM(-4);
109 for(int disk=0; disk<numDisk; disk++){
110 m_DDmgr->numerology().setNumPhiModulesForDiskRingDBM(disk, 0, numPhiModules);
111 }
112 }
113
114 if(m_sqliteReader) {
115 std::string key="DBM_Det_"+std::to_string(m_gmt_mgr->GetLD())+"_"+std::to_string(m_gmt_mgr->Phi())+"_"+std::to_string(m_gmt_mgr->Eta());
116 return (*m_mapFPV)[key];
117 }
118 else {
119 return Phys;
120 }
121}
std::vector< double > m_module[4]
Definition DBM_Det.h:25
virtual GeoVPhysVol * Build() override
Definition DBM_Det.cxx:41
DBM_Det(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_Det.cxx:20
virtual GeoVPhysVol * Build() override
Diamond Beam Monitor telescope builder.
virtual GeoVPhysVol * Build() override
std::shared_ptr< std::map< std::string, GeoFullPhysVol * > > m_mapFPV
std::shared_ptr< std::map< std::string, GeoAlignableTransform * > > m_mapAX
GeoModelIO::ReadGeoModel * m_sqliteReader
PixelGeometryManager * m_gmt_mgr
InDetDD::PixelDetectorManager * m_DDmgr
InDetMaterialManager * m_mat_mgr
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)
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated pixel ...
STL namespace.