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

#include <GeoPixelEnvelope.h>

Inheritance diagram for GeoPixelEnvelope:
Collaboration diagram for GeoPixelEnvelope:

Public Member Functions

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

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

Detailed Description

Definition at line 10 of file GeoPixelEnvelope.h.

Member Function Documentation

◆ Build()

GeoVPhysVol * GeoPixelEnvelope::Build ( )
overridevirtual

Implements GeoVPixelFactory.

Definition at line 35 of file GeoPixelEnvelope.cxx.

35 {
36
37 //
38 // Control which parts get built. This is mainly of use for
39 // Cosmic runs where the whole detector is not present
40 //
41
42 bool barrelPresent = m_gmt_mgr->partPresent("Barrel");
43 bool endcapAPresent = m_gmt_mgr->partPresent("EndcapA");
44 bool endcapCPresent = m_gmt_mgr->partPresent("EndcapC");
45
46
47 if(m_sqliteReader) {
48
49 GeoFullPhysVol* pPixelEnvelopeVol=(*m_mapFPV)["Pixel_Envelope"];
50
51 // Add Barrel
52 if (barrelPresent) {
53 m_DDmgr->numerology().addBarrel(0);
54 m_gmt_mgr->SetBarrel();
55 GeoPixelBarrel brl(m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX, nullptr);
56 brl.Build();
57 }
58
59 // Add EndCaps
60 if (endcapAPresent || endcapCPresent) {
61 m_gmt_mgr->SetEndcap();
62
63 GeoPixelEndCap pec(m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX, nullptr);
64
65 // EndCap A
66 if (endcapAPresent) {
67 m_DDmgr->numerology().addEndcap(2);
68 m_gmt_mgr->SetPos();
69 pec.Build();
70 }
71
72 // EndCap C
73 if (endcapCPresent) {
74 m_DDmgr->numerology().addEndcap(-2);
75 m_gmt_mgr->SetEndcap();
76 m_gmt_mgr->SetNeg();
77 pec.Build();
78 }
79 }
80 // Extra Material
81 InDetDD::ExtraMaterial xMat(m_gmt_mgr->distortedMatManager());
82 xMat.add(pPixelEnvelopeVol,"Pixel");
83
84 // DBM
85 if(m_gmt_mgr->dbm()) {
86 m_gmt_mgr->SetPartsDBM();
87 m_gmt_mgr->SetPos();
88 DBM_Det theDBM (m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX);
89 theDBM.Build() ;
90
91 m_gmt_mgr->SetNeg();
92 theDBM.Build() ;
93 }
94 else {
95 m_DDmgr->numerology().setNumDisksDBM(0);
96 m_DDmgr->numerology().setNumBarrelDBM(0);
97 }
98
99 // reset BarrelEndcap value to zero
100 m_gmt_mgr->SetBarrel();
101
102 return pPixelEnvelopeVol;
103 }
104
105
106 // NB. We apply the part transforms only to the active parts.
107 // In general though they should always be zero. It would make more sense to apply
108 // a transform to the overl pixel if one wants to move the detector.
109
110 //
111 // create the External volume where I'll put all the pixel detector
112 // This can either be a simple tube or a more general PCON.
113 //
114 const GeoShape * envelopeShape;
115 InDetDD::Zone * pixZone = nullptr;
116 if (m_gmt_mgr->PixelSimpleEnvelope()) {
117 double rmin = m_gmt_mgr->PixelRMin();
118 double rmax = m_gmt_mgr->PixelRMax();
119 double halflength = m_gmt_mgr->PixelHalfLength();
120 envelopeShape = new GeoTube(rmin,rmax,halflength);
121 pixZone = new InDetDD::TubeZone("Pixel",-halflength,halflength,rmin,rmax);
122 } else {
123 GeoPcon* envelopeShapeTmp = new GeoPcon(0.,2*Gaudi::Units::pi);
124 // table contains +ve z values only and envelope is assumed to be symmetric around z.
125 int numPlanes = m_gmt_mgr->PixelEnvelopeNumPlanes();
126 for (int i = 0; i < numPlanes * 2; i++) {
127 int tableIndex = (i < numPlanes) ? numPlanes - 1 - i : i - numPlanes;
128 int sign = (i < numPlanes) ? -1 : 1;
129 double z = m_gmt_mgr->PixelEnvelopeZ(tableIndex) * sign;
130 double rmin = m_gmt_mgr->PixelEnvelopeRMin(tableIndex);
131 double rmax = m_gmt_mgr->PixelEnvelopeRMax(tableIndex);
132 envelopeShapeTmp->addPlane(z, rmin, rmax);
133 }
134 envelopeShape = envelopeShapeTmp;
135 pixZone = new InDetDD::PconZone("Pixel",envelopeShapeTmp);
136 }
137 const GeoMaterial* air = m_mat_mgr->getMaterial("std::Air");
138 const GeoLogVol* envelopeLog = new GeoLogVol("Pixel",envelopeShape,air);
139 GeoFullPhysVol* envelopePhys = new GeoFullPhysVol(envelopeLog);
140
141 GeoPixelServices * pixServices = nullptr;
142 if(m_gmt_mgr->DoServices() ) {
143 // Takes ownership of pixZone
144 pixServices = new GeoPixelServices(m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX, pixZone);
145 } else {
146 delete pixZone;
147 }
148
149 if (barrelPresent) {
150
151 m_DDmgr->numerology().addBarrel(0);
152 //
153 // Add the Barrel:
154 //
155 GeoTrf::Transform3D barrelTransform = m_gmt_mgr->partTransform("Barrel");
156
157 m_gmt_mgr->SetBarrel();
158 GeoPixelBarrel brl(m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX, pixServices);
159 GeoNameTag* tag = new GeoNameTag("Barrel");
160 GeoVPhysVol* barrelPhys = brl.Build() ;
161 envelopePhys->add(tag);
162 envelopePhys->add(new GeoIdentifierTag(0));
163 envelopePhys->add(new GeoTransform(barrelTransform));
164 envelopePhys->add(barrelPhys );
165 }
166 //
167 // Add the EndCaps
168 if (endcapAPresent || endcapCPresent) {
169 m_gmt_mgr->SetEndcap();
170
171 GeoPixelEndCap pec(m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX, pixServices);
172 double zpos = (m_gmt_mgr->PixelEndcapZMax()+m_gmt_mgr->PixelEndcapZMin())/2.;
173
174 // EndCap A
175 if (endcapAPresent) {
176
177 m_DDmgr->numerology().addEndcap(2);
178
179 GeoTrf::Transform3D endcapATransform = m_gmt_mgr->partTransform("EndcapA");
180
181 m_gmt_mgr->SetPos();
182 GeoTransform* xform = new GeoTransform(endcapATransform * GeoTrf::TranslateZ3D(zpos));
183 GeoNameTag* tag = new GeoNameTag("EndCapA");
184 envelopePhys->add(tag);
185 envelopePhys->add(new GeoIdentifierTag(2));
186 envelopePhys->add(xform);
187 envelopePhys->add(pec.Build() );
188 }
189
190 // EndCap C
191 if (endcapCPresent) {
192
193 m_DDmgr->numerology().addEndcap(-2);
194
195 GeoTrf::Transform3D endcapCTransform = m_gmt_mgr->partTransform("EndcapC");
196
197 m_gmt_mgr->SetEndcap();
198 m_gmt_mgr->SetNeg();
199 GeoTransform* xform = new GeoTransform(endcapCTransform * GeoTrf::TranslateZ3D(-zpos) * GeoTrf::RotateY3D(180*Gaudi::Units::deg));
200 GeoNameTag* tag = new GeoNameTag("EndCapC");
201 envelopePhys->add(tag);
202 envelopePhys->add(new GeoIdentifierTag(-2));
203 envelopePhys->add(xform);
204 envelopePhys->add(pec.Build() );
205
206 }
207
208 if(m_gmt_mgr->DoServices() ) {
209 // Pixel Frame. In recent versions this taken care of in the general services.
210 if (m_gmt_mgr->oldFrame()) {
211 GeoPixelOldFrame frame (m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX);
212 frame.BuildOutBarrel(envelopePhys);
213 }
214 }
215 }
216
217
218 if(pixServices) {
219 //
220 // Add the Barrel and endcap services outside the barrel and endcap volume
221 //
222 pixServices->getBuilder()->buildAndPlace("Pixel", envelopePhys);
223 if (pixServices->getServMatBuilder()) {
224 pixServices->getServMatBuilder()->buildAndPlace("Pixel", envelopePhys);
225 }
226
227 //
228 // Add IBL services
229 //
230 m_gmt_mgr->SetCurrentLD(0);
231 if(m_gmt_mgr->ibl()&&m_gmt_mgr->IBLFlexAndWingDefined()&&m_gmt_mgr->PixelStaveLayout()>3&&m_gmt_mgr->PixelStaveLayout()<7)
232 {
233 // Build IBL services from endblock to PP0
234 for(int iSection=1; iSection<4; iSection++)
235 {
236
237 // ----------- end of stave PP0 services (insde barrel)
238
239 GeoPixelIFlexServices iFlexSrv(m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX, iSection);
240 iFlexSrv.Build();
241
242 GeoNameTag * tagFlexA = new GeoNameTag("PP0Flex_A");
243 GeoTransform *xformFlexA = iFlexSrv.getSupportTrfA();
244 GeoPhysVol *flexPhys_A = iFlexSrv.getSupportA();
245 envelopePhys->add(tagFlexA);
246 envelopePhys->add(xformFlexA);
247 envelopePhys->add(flexPhys_A);
248
249 GeoNameTag * tagFlexC = new GeoNameTag("PP0Flex_C");
250 GeoTransform *xformFlexC = iFlexSrv.getSupportTrfC();
251 GeoPhysVol *flexPhys_C = iFlexSrv.getSupportC();
252 envelopePhys->add(tagFlexC);
253 envelopePhys->add(xformFlexC);
254 envelopePhys->add(flexPhys_C);
255 }
256
257 // Build IBL fwd services (wavy shapes)
258 int iSection=2;
259 GeoPixelIBLFwdServices fwdSrv(m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX, iSection);
260 if(fwdSrv.isComplexShapeDefined()){
261
262 fwdSrv.Build();
263
264 GeoNameTag * tagFwdSvcA = new GeoNameTag("FwdSvc_A");
265 GeoTransform *xformFwdSvcA = fwdSrv.getSupportTrfA();
266 GeoPhysVol *svcPhys_A = fwdSrv.getSupportA();
267 envelopePhys->add(tagFwdSvcA);
268 envelopePhys->add(xformFwdSvcA);
269 envelopePhys->add(svcPhys_A);
270
271 GeoNameTag * tagFwdSvcC = new GeoNameTag("FwdSvc_C");
272 GeoTransform *xformFwdSvcC = fwdSrv.getSupportTrfC();
273 GeoPhysVol *svcPhys_C = fwdSrv.getSupportC();
274 envelopePhys->add(tagFwdSvcC);
275 envelopePhys->add(xformFwdSvcC);
276 envelopePhys->add(svcPhys_C);
277 }
278 }
279 }
280
281 // Build detailed frame
282 if(m_gmt_mgr->detailedFrame() && m_gmt_mgr->DoServices()) {
283 int numSections = m_gmt_mgr->PixelFrameSections();
284 GeoPixelFrame frame (m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX );
285 for (int iSection = 0; iSection < numSections; iSection++) {
286 //GeoVPhysVol * framePhys = frame.Build(iSection);
287 //envelopePhys->add(framePhys);
288 frame.BuildAndPlace(envelopePhys,iSection);
289 }
290 }
291
292 // Extra Material
293 InDetDD::ExtraMaterial xMat(m_gmt_mgr->distortedMatManager());
294 xMat.add(envelopePhys,"Pixel");
295
296 // DBM
297 // Z-positon is Hardcoded,
298 // so if change then change in DBM_module too
299
300 if (m_gmt_mgr->dbm()) {
301 GeoTrf::Translate3D dbmTransform1( 0, 0, 887.002*Gaudi::Units::mm + ( m_gmt_mgr->DBMTelescopeZ() )/2.); //Add 0.002mm to 887mm for safety
302
303 //m_DDmgr->numerology().addEndcap(4);
304 m_gmt_mgr->SetPartsDBM();
305 m_gmt_mgr->SetPos();
306 DBM_Det theDBM (m_DDmgr, m_gmt_mgr, m_sqliteReader, m_mapFPV, m_mapAX);
307 GeoNameTag* tag1 = new GeoNameTag("DBMA");
308 GeoVPhysVol* dbmPhys1 = theDBM.Build() ;
309 envelopePhys->add(tag1);
310 envelopePhys->add(new GeoIdentifierTag(4));
311 envelopePhys->add(new GeoTransform(dbmTransform1));
312 envelopePhys->add(dbmPhys1 );
313
314 //m_DDmgr->numerology().addEndcap(-4);
315 m_gmt_mgr->SetNeg();
316 GeoNameTag* tag2 = new GeoNameTag("DBMC");
317 GeoTransform* dbmTransform2 = new GeoTransform(GeoTrf::TranslateZ3D(-887.002*Gaudi::Units::mm - ( m_gmt_mgr->DBMTelescopeZ() )/2.) * GeoTrf::RotateY3D(180*Gaudi::Units::deg));
318 envelopePhys->add(tag2);
319 envelopePhys->add(new GeoIdentifierTag(-4));
320 envelopePhys->add(dbmTransform2);
321 envelopePhys->add(theDBM.Build());
322 } else {
323 m_DDmgr->numerology().setNumDisksDBM(0);
324 m_DDmgr->numerology().setNumBarrelDBM(0);
325 }
326
327 // reset BarrelEndcap value to zero
328 m_gmt_mgr->SetBarrel();
329
330
331 // BCM
332 if (m_gmt_mgr->athenaComps()->bcm()) {
333 // Already retrieved in PixelDetectorTool
334 StatusCode sc = m_gmt_mgr->athenaComps()->bcm()->build(envelopePhys);
335 if (sc.isFailure()) {
336 std::cout << "PixelGeoModel failed to build BCM." << std::endl;
337 }
338 }
339
340 // BLM
341 if (m_gmt_mgr->athenaComps()->blm()) {
342 // Already retrieved in PixelDetectorTool
343 StatusCode sc = m_gmt_mgr->athenaComps()->blm()->build(envelopePhys);
344 if (sc.isFailure()) {
345 std::cout << "PixelGeoModel failed to build BLM." << std::endl;
346 }
347 }
348
349 if(pixServices) delete pixServices;
350
351 return envelopePhys;
352
353
354}
static Double_t sc
int sign(int a)
#define z
InDetDD::VolumeBuilder * getServMatBuilder()
InDetDD::VolumeBuilder * getBuilder()
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
void buildAndPlace(const std::string &region, GeoPhysVol *parent, double zcenter=0)
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ GeoVPixelFactory()

GeoVPixelFactory::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 )

Definition at line 33 of file GeoVPixelFactory.cxx.

16 : m_gmt_mgr (mgr)
17 , m_mat_mgr (m_gmt_mgr->getMaterialManager())
18 , m_DDmgr (ddmgr)
19 , m_sqliteReader(sqliteReader)
20 , m_mapFPV(std::move(mapFPV))
21 , m_mapAX(std::move(mapAX))
22 , m_epsilon(0.0001)
23{
24}
const double m_epsilon

Member Data Documentation

◆ m_DDmgr

InDetDD::PixelDetectorManager* GeoVPixelFactory::m_DDmgr
protectedinherited

Definition at line 45 of file GeoVPixelFactory.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: