35 {
36
37
38
39
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
48
49 GeoFullPhysVol* pPixelEnvelopeVol=(*m_mapFPV)["Pixel_Envelope"];
50
51
52 if (barrelPresent) {
53 m_DDmgr->numerology().addBarrel(0);
56 brl.Build();
57 }
58
59
60 if (endcapAPresent || endcapCPresent) {
62
64
65
66 if (endcapAPresent) {
67 m_DDmgr->numerology().addEndcap(2);
69 pec.Build();
70 }
71
72
73 if (endcapCPresent) {
74 m_DDmgr->numerology().addEndcap(-2);
77 pec.Build();
78 }
79 }
80
81 InDetDD::ExtraMaterial xMat(
m_gmt_mgr->distortedMatManager());
82 xMat.add(pPixelEnvelopeVol,"Pixel");
83
84
89 theDBM.Build() ;
90
92 theDBM.Build() ;
93 }
94 else {
95 m_DDmgr->numerology().setNumDisksDBM(0);
96 m_DDmgr->numerology().setNumBarrelDBM(0);
97 }
98
99
101
102 return pPixelEnvelopeVol;
103 }
104
105
106
107
108
109
110
111
112
113
114 const GeoShape * envelopeShape;
115 InDetDD::Zone * pixZone = nullptr;
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
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;
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;
143
145 } else {
146 delete pixZone;
147 }
148
149 if (barrelPresent) {
150
151 m_DDmgr->numerology().addBarrel(0);
152
153
154
155 GeoTrf::Transform3D barrelTransform =
m_gmt_mgr->partTransform(
"Barrel");
156
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
168 if (endcapAPresent || endcapCPresent) {
170
173
174
175 if (endcapAPresent) {
176
177 m_DDmgr->numerology().addEndcap(2);
178
179 GeoTrf::Transform3D endcapATransform =
m_gmt_mgr->partTransform(
"EndcapA");
180
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
191 if (endcapCPresent) {
192
193 m_DDmgr->numerology().addEndcap(-2);
194
195 GeoTrf::Transform3D endcapCTransform =
m_gmt_mgr->partTransform(
"EndcapC");
196
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
209
212 frame.BuildOutBarrel(envelopePhys);
213 }
214 }
215 }
216
217
218 if(pixServices) {
219
220
221
225 }
226
227
228
229
232 {
233
234 for(int iSection=1; iSection<4; iSection++)
235 {
236
237
238
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
258 int iSection=2;
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
283 int numSections =
m_gmt_mgr->PixelFrameSections();
285 for (int iSection = 0; iSection < numSections; iSection++) {
286
287
288 frame.BuildAndPlace(envelopePhys,iSection);
289 }
290 }
291
292
293 InDetDD::ExtraMaterial xMat(
m_gmt_mgr->distortedMatManager());
294 xMat.add(envelopePhys,"Pixel");
295
296
297
298
299
301 GeoTrf::Translate3D dbmTransform1( 0, 0, 887.002*Gaudi::Units::mm + (
m_gmt_mgr->DBMTelescopeZ() )/2.);
302
303
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
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
329
330
331
333
335 if (
sc.isFailure()) {
336 std::cout << "PixelGeoModel failed to build BCM." << std::endl;
337 }
338 }
339
340
342
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}
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 ®ion, GeoPhysVol *parent, double zcenter=0)
::StatusCode StatusCode
StatusCode definition for legacy code.