ATLAS Offline Software
Loading...
Searching...
No Matches
GeoPixelBarrel.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "GeoPixelBarrel.h"
6#include "GeoPixelLayer.h"
7#include "GeoPixelServices.h"
8#include "GeoPixelOldFrame.h"
9#include "GeoPixelStaveRing.h"
11#include "GeoModelKernel/GeoBox.h"
12#include "GeoModelKernel/GeoPara.h"
13#include "GeoModelKernel/GeoTube.h"
14#include "GeoModelKernel/GeoLogVol.h"
15#include "GeoModelKernel/GeoNameTag.h"
16#include "GeoModelKernel/GeoIdentifierTag.h"
17#include "GeoModelKernel/GeoPhysVol.h"
18#include "GeoModelKernel/GeoFullPhysVol.h"
19#include "GeoModelKernel/GeoMaterial.h"
20#include "GeoModelKernel/GeoAlignableTransform.h"
22#include "Identifier/Identifier.h"
25
27
28#include <utility>
29
30using namespace std;
33 GeoModelIO::ReadGeoModel* sqliteReader,
34 std::shared_ptr<std::map<std::string, GeoFullPhysVol*>> mapFPV,
35 std::shared_ptr<std::map<std::string, GeoAlignableTransform*>> mapAX,
36 GeoPixelServices * pixServices )
37 : GeoVPixelFactory (ddmgr, mgr, sqliteReader, std::move(mapFPV), std::move(mapAX)),
38 m_pixServices(pixServices)
39{}
40
41GeoVPhysVol* GeoPixelBarrel::Build( ) {
42
43 GeoFullPhysVol* barrelPhys{nullptr};
44
45 if(m_sqliteReader) {
46 barrelPhys = (*m_mapFPV)["Barrel"];
47 }
48 else {
49 //
50 // create the Barrel Mother volume
51 //
52 double rmin = m_gmt_mgr->PixelBarrelRMin();
53 double rmax = m_gmt_mgr->PixelBarrelRMax();
54 double halflength = m_gmt_mgr->PixelBarrelHalfLength();
55 const GeoMaterial* air = m_mat_mgr->getMaterial("std::Air");
56 const GeoTube* barrelTube = new GeoTube(rmin,rmax,halflength);
57 const GeoLogVol* barrelLog = new GeoLogVol("Barrel",barrelTube,air);
58 barrelPhys = new GeoFullPhysVol(barrelLog);
59 }
60
61 // Set numerology
62 m_DDmgr->numerology().setNumLayers(m_gmt_mgr->PixelBarrelNLayer());
63
64 // In case of IBL stave detailed description -> add stave ring support and emdblocks
65 m_gmt_mgr->SetCurrentLD(0);
66 bool bAddIBLStaveRings = m_gmt_mgr->ibl()&&m_gmt_mgr->PixelStaveLayout()>3&&m_gmt_mgr->PixelStaveLayout()<7;
67
68 //
69 // Build the layers inside
70 //
72 for(int ii = 0; ii < m_gmt_mgr->PixelBarrelNLayer(); ii++){
73 //cout << "Layer" << ii << endl;
74 m_gmt_mgr->SetCurrentLD(ii);
75 if(m_gmt_mgr->isLDPresent()){
76 Identifier id = m_gmt_mgr->getIdHelper()->wafer_id(0,ii,0,0);
77
78 if(m_sqliteReader) {
79 // DD2 uses different names for Barrel Layers
80 std::string lnameDD2 = "Layer_PixelBarrel"+std::to_string(ii);
81
82 auto itAX = m_mapAX->find(lnameDD2);
83 if(itAX == m_mapAX->end())
84 throw std::runtime_error("GeoPixelBarrel cannot find AX for the key " + lnameDD2);
85 GeoAlignableTransform* xform = itAX->second;
86
87 auto itFPV = m_mapFPV->find(lnameDD2);
88 if(itFPV == m_mapFPV->end())
89 throw std::runtime_error("GeoPixelBarrel cannot find FPV for the key " + lnameDD2);
90 GeoFullPhysVol* layerFPV = itFPV->second;
91
92 layer.Build();
93
94 // Store the transform (at level 1)
95 m_DDmgr->addAlignableTransform(1, id, xform, layerFPV);
96
97 // Extra Material.
98 // From Marilena: I don't think there is much room but we provide the hooks anyway
99 // NB this has been taken from the GeoPixelLayer class .. needed to be moved here cause here
100 // we have the GeoFullPhysVol available from the SQLite DB
101 InDetDD::ExtraMaterial xMat(m_gmt_mgr->distortedMatManager());
102 xMat.add(layerFPV,"PixelLayer");
103 xMat.add(layerFPV,"PixelLayer"+std::to_string(m_gmt_mgr->GetLD()));
104 }
105 else {
106 // IBL layer shift ( 2mm shift issue )
107 double layerZshift = m_gmt_mgr->PixelLayerGlobalShift();
108 GeoAlignableTransform* xform = new GeoAlignableTransform(GeoTrf::Translate3D(0.,0.,layerZshift));
109 GeoVPhysVol* layerphys = layer.Build();
110 std::string lname = "Layer" + std::to_string(ii);
111 GeoNameTag *tag = new GeoNameTag(lname);
112 barrelPhys->add(tag);
113 barrelPhys->add(new GeoIdentifierTag(ii));
114 barrelPhys->add(xform);
115 barrelPhys->add(layerphys);
116
117 // Store the transform (at level 1)
118 m_DDmgr->addAlignableTransform(1, id, xform, layerphys);
119
120 // IBL stave ring service area ( ring + endblocks + flexes + pipe + ...)
121 if(m_pixServices&&bAddIBLStaveRings&&ii==0)
122 {
123 // ----------- end of stave services (side A)
124 GeoNameTag * tagSupportA = new GeoNameTag("StaveRingAndEndblocks_A");
125 GeoTransform *xformSupportA = layer.getSupportTrfA();
126 GeoPhysVol *supportPhys_A = layer.getSupportA();
127 barrelPhys->add(tagSupportA);
128 barrelPhys->add(xformSupportA);
129 barrelPhys->add(supportPhys_A);
130
131 // ----------- end of stave services (side C)
132 GeoNameTag * tagSupportC = new GeoNameTag("StaveRingAndEndblocks_C");
133 GeoTransform *xformSupportC = layer.getSupportTrfC();
134 GeoPhysVol *supportPhys_C = layer.getSupportC();
135 barrelPhys->add(tagSupportC);
136 barrelPhys->add(xformSupportC);
137 barrelPhys->add(supportPhys_C);
138
139 // ----------- middle of stave services
140 if(m_gmt_mgr->PixelStaveAxe()==0) {
141 GeoNameTag *tagM = new GeoNameTag("Brl0M_StaveRing");
142 GeoTransform *xformSupportMidRing = layer.getSupportTrfMidRing();
143 GeoVPhysVol *supportPhysMidRing = layer.getSupportMidRing();
144 barrelPhys->add(tagM);
145 barrelPhys->add(xformSupportMidRing);
146 barrelPhys->add(supportPhysMidRing);
147 }
148
149 // ----------- end of stave PP0 services (insde barrel)
150
151 if(m_gmt_mgr->IBLFlexAndWingDefined()){
153 iFlexSrv.Build();
154
155 GeoNameTag * tagFlexA = new GeoNameTag("PP0Flex_A");
156 GeoTransform *xformFlexA = iFlexSrv.getSupportTrfA();
157 GeoPhysVol *flexPhys_A = iFlexSrv.getSupportA();
158 barrelPhys->add(tagFlexA);
159 barrelPhys->add(xformFlexA);
160 barrelPhys->add(flexPhys_A);
161
162 GeoNameTag * tagFlexC = new GeoNameTag("PP0Flex_C");
163 GeoTransform *xformFlexC = iFlexSrv.getSupportTrfC();
164 GeoPhysVol *flexPhys_C = iFlexSrv.getSupportC();
165 barrelPhys->add(tagFlexC);
166 barrelPhys->add(xformFlexC);
167 barrelPhys->add(flexPhys_C);
168 }
169 }
170 }
171 }
172 else
173 {
174 if(m_gmt_mgr->msgLvl(MSG::DEBUG)) m_gmt_mgr->msg(MSG::DEBUG) << "Layer " << ii << " not built" << endmsg;
175 }
176 }
177
179 //
180 // Add the services inside the barrel volume
181 //
182 m_pixServices->getBuilder()->buildAndPlace("B", barrelPhys);
183 if (m_pixServices->getServMatBuilder()) {
184 m_pixServices->getServMatBuilder()->buildAndPlace("B", barrelPhys);
185 }
186
187 //
188 // Add the pixel frame inside the barrel volume
189 // In recent versions this taken care of in the general services.
190 if (m_gmt_mgr->oldFrame()) {
192 frame.BuildInBarrel(barrelPhys);
193 }
194 }
195
196 // Extra Material
197 InDetDD::ExtraMaterial xMat(m_gmt_mgr->distortedMatManager());
198 xMat.add(barrelPhys,"PixelBarrel");
199
200 return barrelPhys;
201}
202
#define endmsg
This is an Identifier helper class for the Pixel subdetector.
virtual GeoVPhysVol * Build() override
GeoPixelBarrel(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, GeoPixelServices *pixServices)
GeoPixelServices * m_pixServices
GeoTransform * getSupportTrfC()
virtual GeoVPhysVol * Build() override
GeoTransform * getSupportTrfA()
void BuildInBarrel(GeoFullPhysVol *parent)
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)
void add(GeoPhysVol *parent, const std::string &parentName, double zPos=0)
Dedicated detector manager extending the functionality of the SiDetectorManager with dedicated pixel ...
STL namespace.