ATLAS Offline Software
TileAtlasFactory.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 "TileAtlasFactory.h"
7 #include "TileGeoCutBuilder.h"
11 
12 #include "CaloIdentifier/TileID.h"
13 
14 #include "GeoModelKernel/GeoPcon.h"
15 #include "GeoModelKernel/GeoTube.h"
16 #include "GeoModelKernel/GeoTubs.h"
17 #include "GeoModelKernel/GeoTrd.h"
18 #include "GeoModelKernel/GeoShapeUnion.h"
19 #include "GeoModelKernel/GeoShapeShift.h"
20 #include "GeoModelKernel/GeoShapeSubtraction.h"
21 #include "GeoModelKernel/GeoMaterial.h"
22 #include "GeoModelKernel/GeoLogVol.h"
23 #include "GeoModelKernel/GeoPhysVol.h"
24 #include "GeoModelKernel/GeoNameTag.h"
25 #include "GeoModelKernel/GeoTransform.h"
26 #include "GeoModelKernel/GeoSerialIdentifier.h"
27 #include "GeoModelKernel/GeoIdentifierTag.h"
28 #include "GeoModelKernel/GeoDefinitions.h"
29 
31 #include "GeoGenericFunctions/AbsFunction.h"
32 #include "GeoGenericFunctions/Variable.h"
33 #include "GeoModelKernel/GeoXF.h"
34 #include "GeoModelKernel/GeoSerialTransformer.h"
35 
37 #include "StoreGate/StoreGateSvc.h"
38 
39 #include "GaudiKernel/MsgStream.h"
40 #include "GaudiKernel/SystemOfUnits.h"
42 
43 #include <stdexcept>
44 #include <iostream>
45 #include <iomanip>
46 #include <algorithm>
47 #include <cmath>
48 #include <string>
49 
50 #define MLOG(x) if (m_log->level()<=MSG::x) *m_log << MSG::x
51 
52 using namespace GeoGenfun;
53 using namespace GeoXF;
54 
55 
56 // Constructor:
59  const TileSwitches & switches,
60  MsgStream *log,
61  bool fullGeo)
62  : m_detectorStore(pDetStore)
63  , m_detectorManager(manager)
64  , m_log(log)
65  , m_switches(switches)
66  , m_verbose(log->level()<=MSG::VERBOSE)
67  , m_fullGeo(fullGeo)
68 {
69  m_switches.testBeam = false;
70 }
71 
72 // Constructor:
75  const TileSwitches & switches,
76  const std::vector<std::string> & volumeNames,
77  std::vector<GeoPhysVol *> & volumePtrs,
78  const std::vector<double> & volumePositions,
79  MsgStream *log,
80  bool fullGeo)
81  : m_detectorStore(pDetStore)
82  , m_detectorManager(manager)
83  , m_log(log)
84  , m_switches(switches)
85  , m_volumeNames(volumeNames)
86  , m_volumePtrs(volumePtrs)
87  , m_volumePositions(volumePositions)
88  , m_verbose(log->level()<=MSG::VERBOSE)
89  , m_fullGeo(fullGeo)
90 {
91  m_switches.testBeam = false;
92 }
93 
94 
95 // Destructor:
97 
98 
99 // Creation of geometry:
100 void TileAtlasFactory::create(GeoPhysVol *world)
101 {
102  // Global geometri definition for debugging
103  bool Filling = true;
104  bool EBC = true /* Negative */, BAR = true /* Barrel */, EBA = true /* Positive */;
105  int NcpFrom = 1, NcpPlus = 63; // Default is all [1-63]
106 
107  //int NcpFrom = 34, NcpPlus = 29; // ext.barrel, special
108 
109  double deltaPhi = 360./64; // we know apriory that 64 modules makes full cylinder
110  double AnglMin = (NcpFrom-1)*deltaPhi*Gaudi::Units::deg, AnglMax = (NcpPlus+1)*deltaPhi*Gaudi::Units::deg;
111 
112  // phi range of modules with special C10
113  // double AnglMin1 = 38. * deltaPhi*Gaudi::Units::deg;
114  // double AnglMax1 = 42. * deltaPhi*Gaudi::Units::deg;
115  // double AnglMin2 = 54. * deltaPhi*Gaudi::Units::deg;
116  // double AnglMax2 = 58. * deltaPhi*Gaudi::Units::deg;
117 
118  (*m_log) << MSG::INFO <<" Entering TileAtlasFactory::create()" << endmsg;
119 
120  // -------- -------- MATERIAL MANAGER -------- ----------
121  StoredMaterialManager* theMaterialManager = nullptr;
122  if (StatusCode::SUCCESS != m_detectorStore->retrieve(theMaterialManager, "MATERIALS")) {
123  (*m_log) << MSG::ERROR << "Could not find Material Manager MATERIALS" << endmsg;
124  return;
125  }
126  const GeoMaterial* matAir = theMaterialManager->getMaterial("std::Air");
127  const GeoMaterial* matIron = theMaterialManager->getMaterial("std::Iron");
128  //const GeoMaterial* matAlu = theMaterialManager->getMaterial("std::Aluminium");
129 
130  // -------- -------- SECTION BUILDER -------- ----------
132  TileGeoSectionBuilder* sectionBuilder = new TileGeoSectionBuilder(theMaterialManager,dbManager,m_switches,m_log);
133 
134  double DzSaddleSupport = 0, RadiusSaddle = 0;
135  if (dbManager->BoolSaddle()) {
136  (*m_log) << MSG::INFO << " Tile Geometry with Saddle supports, starting from TileCal-CSC-02 xxx"<< endmsg;
137 
138  dbManager->SetCurrentSaddle(0);
139 
140  DzSaddleSupport = dbManager->DzSaddleSupport()*Gaudi::Units::cm;
141  RadiusSaddle = dbManager->RadiusSaddle()*Gaudi::Units::cm;
142  if (m_log->level()<=MSG::DEBUG)
143  (*m_log) << MSG::DEBUG << " DzSaddleSupport()= "<<DzSaddleSupport<<" RadiusSaddle= "<<RadiusSaddle
144  << endmsg;
145  }
146 
147  if (m_log->level()<=MSG::DEBUG) {
148  (*m_log) <<MSG::DEBUG << "TileAtlasFactory. addPlates = " <<m_switches.addPlatesToCell<<endmsg;
149  (*m_log) <<MSG::DEBUG << "TileAtlasFactory. crackOption = " <<m_switches.crackOption<<endmsg;
150  }
151  int barrel_flag = m_switches.crackOption/10; // >0 - no barrel, >1 - no ext.bar, >2-no ITC, >3-no Gap, >4-no Crack
152  int crack_flag = m_switches.crackOption%10;
153  if (barrel_flag == 5) crack_flag = 9; // nothing will be created if barrel_flag is 5
154  if (crack_flag == 4 || crack_flag == 5) barrel_flag = 4; // only one crack is created, nothing else
155  bool eb_flag = (barrel_flag<4 || (barrel_flag==4 && crack_flag==0) ); // true if ext.barrel envelope is needed
156  if (m_log->level()<=MSG::DEBUG) {
157  (*m_log) << MSG::DEBUG << "barrel_flag " << barrel_flag << endmsg;
158  (*m_log) << MSG::DEBUG << "crack_flag " << crack_flag << endmsg;
159  }
160 
161  // -------- -------- CUT BUILDER -------- ----------
162  //TileGeoCutBuilder* CutBuilder = new TileGeoCutBuilder(theMaterialManager,dbManager,m_log);
163 
164  // --------------- TILE ------- TILE --------- TILE ---------- TILE ------------
165  // Envelope creation. Building three tree tops for standard setup and only one for commissioning
166  GeoIntrusivePtr<GeoLogVol> lvTileEnvelopeBarrel{nullptr}, lvTileEnvelopePosEndcap{nullptr}, lvTileEnvelopeNegEndcap{nullptr}, lvTileEnvelopePosCrack{nullptr}, lvTileEnvelopeNegCrack{nullptr};
167  PVLink pvTileEnvelopeBarrel{nullptr}, pvTileEnvelopePosEndcap{nullptr}, pvTileEnvelopeNegEndcap {nullptr}, pvTileEnvelopePosCrack{nullptr}, pvTileEnvelopeNegCrack{nullptr};
168 
169  if (crack_flag==2) {
170  if ( m_volumeNames.size()<1 ) {
171  (*m_log) <<MSG::WARNING << "Top-level volume names for crack scintillators are missing"<<endmsg;
172  (*m_log) <<MSG::WARNING << "Crack scintillators will not be built"<<endmsg;
173  crack_flag = 9;
174  } else {
175  GeoVolumeVec_t vols = geoGetVolumes (&*world);
176  for (auto v : vols) {
177  if (v.first->getLogVol()->getName() == m_volumeNames[0] ) {
178  pvTileEnvelopePosCrack = const_pointer_cast(PVConstLink{v.first});
179  }
180  else if (m_volumeNames.size()>1 && v.first->getLogVol()->getName() == m_volumeNames[1] ) {
181  pvTileEnvelopeNegCrack = const_pointer_cast(PVConstLink{v.first});
182  }
183  }
184  }
185  } else if (crack_flag==3) {
186  if ( m_volumePtrs.size()<1 ) {
187  (*m_log) <<MSG::WARNING << "Top-level volume pointers for crack scintillators are missing"<<endmsg;
188  (*m_log) <<MSG::WARNING << "Crack scintillators will not be built"<<endmsg;
189  crack_flag = 9;
190  } else {
191  pvTileEnvelopePosCrack = m_volumePtrs[0];
192  if (m_volumePtrs.size()>1) pvTileEnvelopeNegCrack = m_volumePtrs[1];
193  }
194  } else if (crack_flag==4) {
195  pvTileEnvelopePosCrack = world;
196  } else if (crack_flag==5) {
197  pvTileEnvelopeNegCrack = world;
198  }
199 
200  if (pvTileEnvelopePosCrack || pvTileEnvelopeNegCrack) {
201  (*m_log) <<MSG::DEBUG << "Top-level volume names for crack scintillators are "
202  << " positive: " << ( (pvTileEnvelopePosCrack) ? pvTileEnvelopePosCrack->getLogVol()->getName() : "none" )
203  << " negative: " << ( (pvTileEnvelopeNegCrack) ? pvTileEnvelopeNegCrack->getLogVol()->getName() : "none" )
204  << endmsg;
205  } else if (crack_flag==2) {
206  (*m_log) <<MSG::WARNING << "Top-level volume names for crack scintillators "
207  << ((m_volumeNames.size()>0) ? m_volumeNames[0] : "") << " "
208  << ((m_volumeNames.size()>1) ? m_volumeNames[1] : "") << " "
209  << " were not found" << endmsg;
210  (*m_log) <<MSG::WARNING << "Crack scintillators will not be built"<<endmsg;
211  (*m_log) <<MSG::WARNING << "Available top-level volumes are:";
212  GeoVolumeVec_t vols = geoGetVolumes (&*world);
213  for (auto v : vols) (*m_log) << " " << v.first->getLogVol()->getName();
214  (*m_log) <<endmsg;
215  crack_flag = 9;
216  }
217 
218  // radius for minimization overlap volumes
219  double rless =0.15; // 150 [mkm]
220 
221  double dzITC1 =0, rMinITC1 =0, rMaxITC1 =0;
222  double dzITC2 =0, rMinITC2 =0, rMaxITC2 =0;
223 
224  double thicknessWedgeMother =0, heightWedgeMother =0, dy1WedgeMother =0, dy2WedgeMother =0;
225  double Glue =0, dzGlue =0; //Thickness of glue layer in the absorber
226  int NbPeriod =0;
227  double zEndSection =0;
228 
229  // Positioning coordinates
230  double X =0, Z =0;
231  double zITCStandard =0;
232 
233  double ZLength[] = {0.0,0.0,0.0,0.0,0.0,0.0};
234  double EnvDZPos[] = {0.0,0.0,0.0,0.0,0.0,0.0};
235  double PhiMax[] = {-360.0,-360.0,-360.0,-360.0,-360.0,-360.0};
236  double PhiMin[] = {+360.0,+360.0,+360.0,+360.0,+360.0,+360.0};
237  double RInMin[] = {99999.9,99999.9,99999.9,99999.9,99999.9,99999.9};
238  double ROutMax[] = {0.0,0.0,0.0,0.0,0.0,0.0};
239  double FingerRmax = 0;
240  //unsigned int ienv_size = 6;
241 
242  // set default finger length
243  double BFingerLength =0;
244  double BFingerLengthNeg =0;
245  double BFingerLengthPos =0;
246 
247  // Barrel finger
248  dbManager->SetCurrentTifg(1);
249  BFingerLength = BFingerLengthNeg = BFingerLengthPos = dbManager->TIFGdz()*Gaudi::Units::cm;
250 
251  double EBFingerLength =0;
252  double EBFingerLengthNeg =0;
253  double EBFingerLengthPos =0;
254 
255  // EBarrel finger
256  dbManager->SetCurrentTifg(2);
257  EBFingerLength = EBFingerLengthNeg = EBFingerLengthPos = dbManager->TIFGdz()*Gaudi::Units::cm;
258 
259  int n_env = dbManager->GetNumberOfEnv();
260 
261  //std::cerr <<std::cout.setf(std::ios::right)<<std::setiosflags(std::ios::fixed)<<std::setw(9)<<std::setprecision(2);
262 
263  if (m_log->level()<=MSG::DEBUG)
264  (*m_log) << MSG::DEBUG << "n_env " << n_env << endmsg;
265 
266  for (int i = 0; i < n_env ; ++i) {
267  dbManager->SetCurrentEnvByIndex(i);
268  int Type = dbManager->GetEnvType();
269 
270  /*
271  if (Type == 1) BAR = true;
272  if (Type == 2) EBC = true;
273  if (Type == 3) EBA = true;
274  */
275 
276  ZLength [Type] = dbManager->GetEnvZLength()*Gaudi::Units::cm;
277  EnvDZPos [Type] = dbManager->GetEnvDZ()*Gaudi::Units::cm;
278  PhiMin [Type] = std::min(PhiMin[Type], dbManager->GetEnvDPhi());
279  PhiMax [Type] = std::max(PhiMax[Type], dbManager->GetEnvNModules()*deltaPhi + dbManager->GetEnvDPhi());
280  RInMin [Type] = std::min(RInMin[Type], dbManager->GetEnvRin()*Gaudi::Units::cm);
281  ROutMax [Type] = std::max(ROutMax[Type],dbManager->GetEnvRout()*Gaudi::Units::cm);
282  FingerRmax = std::max(FingerRmax,dbManager->GetEnvRout()*Gaudi::Units::cm);
283 
284  //std::cout << "# Type " <<Type<< " ZLength " <<ZLength [Type]<< " EnvDZPos "<<EnvDZPos [Type]<< "\n";
285  }
286 
287  //
288  // recalculate length of positive barrel finger length if Ext.Barrel is present
289  //
290 
291  double PosDelta =0;
292  PosDelta = EnvDZPos[3] - EnvDZPos[1];
293  if (m_log->level()<=MSG::DEBUG)
294  (*m_log) << MSG::DEBUG <<" BFingerLengthPos "<<BFingerLengthPos<<" PosDelta "<<PosDelta;
295  if (std::abs(PosDelta) < std::abs(EBFingerLength - BFingerLength) ) {
296  BFingerLengthPos += PosDelta;
297  if (m_log->level()<=MSG::DEBUG)
298  (*m_log) <<" => New BFingerLengthPos "<<BFingerLengthPos<<endmsg;
299  } else {
301  BFingerLengthPos = BFingerLength;
302  PosDelta =0;
303  if (m_log->level()<=MSG::DEBUG)
304  (*m_log) <<" => New PosDelta "<<PosDelta<<endmsg;
305  }
306 
307  //
308  // recalculate length of negative barrel finger length if Ext.Barrel is present
309  //
310 
311  double NegDelta =0;
312  NegDelta = (-EnvDZPos[2] + EnvDZPos[1]); // negative shift - bigger finger
313  if (m_log->level()<=MSG::DEBUG)
314  (*m_log) << MSG::DEBUG <<" BFingerLengthNeg "<<BFingerLengthNeg<<" NegDelta "<<NegDelta;
315  if (std::abs(NegDelta) < std::abs(EBFingerLength - BFingerLength) ) {
316  BFingerLengthNeg += NegDelta;
317  if (m_log->level()<=MSG::DEBUG)
318  (*m_log) <<" => New BFingerLengthNeg "<<BFingerLengthNeg<<endmsg;
319  } else {
321  BFingerLengthNeg = BFingerLength;
322  NegDelta =0;
323  if (m_log->level()<=MSG::DEBUG)
324  (*m_log) <<" => New NegDelta "<<NegDelta<<endmsg;
325  }
326 
327  // extra flag sayubg that special C10 goes outside envelope for normal C10
328  bool spC10 = false;
330  double rMinC10 = dbManager->TILBrminimal();
331  if ( dbManager->SetCurrentSection(10+TileDddbManager::TILE_PLUG2, false) ) {
332  double rMinC10sp = dbManager->TILBrminimal();
333  spC10 = (rMinC10sp < rMinC10);
334  if (spC10) {
335  (*m_log) << MSG::DEBUG <<" Special C10, changing Rmin from "<<rMinC10<<" to "<< rMinC10sp << endmsg;
336  rMinC10 = rMinC10sp;
337  }
338  }
339 
341  double rMinE2pos = dbManager->TILBrminimal();
342  double rMinE2neg = rMinE2pos;
343 
344  // extra flag sayubg that E4' present on negative eta side
345  bool spE4 = false;
347  double rMinE4pos = dbManager->TILBrminimal();
348  double rMinE4neg = rMinE4pos;
349  double rMaxE3pos = dbManager->TILBrmaximal();
350  double rMaxE3neg = rMaxE3pos;
351  if ( dbManager->SetCurrentSection(10+TileDddbManager::TILE_PLUG4, false) ) {
352  double rMinE4sp = dbManager->TILBrminimal();
353  spE4 = (rMinE4sp < rMinE4neg);
354  if (spE4) {
355  (*m_log) << MSG::DEBUG <<" E4' present, changing Rmin for negative crack from "<<rMinE4neg<<" to "<< rMinE4sp << endmsg;
356  rMinE4neg = rMinE4sp;
357  }
358  }
359 
361  double BFingerRmin=0, EFingerRmin=0;
363  BFingerRmin = dbManager->TILBrmax()*Gaudi::Units::cm;
365  EFingerRmin = dbManager->TILBrmax()*Gaudi::Units::cm;
366 
367  // ??? Is this needed?
368  dbManager->SetCurrentEnvByType(2);
369 
370 
371  //
372  // Central Barrel
373  //
374 
375  // Z planes
376  double endCentralBarrel = ZLength[1]/2 - BFingerLength; // nominal position of end plate
377  double endEnvelopeNeg = endCentralBarrel + BFingerLengthNeg;
378  double endEnvelopePos = endCentralBarrel + BFingerLengthPos;
379 
380  // R minimal
381  double rminBarrel = RInMin[1];
382 
383  // R maximal
384  double rmaxTotal = ROutMax[1];
385 
386  if (barrel_flag<1) { // >0 - no central barrel
387 
388  GeoPcon* tileEnvPconeBarrel = new GeoPcon(PhiMin[1]*Gaudi::Units::deg, PhiMax[1]*Gaudi::Units::deg);
389 
390  tileEnvPconeBarrel->addPlane(-endEnvelopeNeg, BFingerRmin, rmaxTotal);
391  tileEnvPconeBarrel->addPlane(-endCentralBarrel-DzSaddleSupport, BFingerRmin, rmaxTotal);
392  if (dbManager->BoolSaddle()) {
393  tileEnvPconeBarrel->addPlane(-endCentralBarrel-DzSaddleSupport, BFingerRmin-RadiusSaddle,rmaxTotal);
394  tileEnvPconeBarrel->addPlane(-endCentralBarrel, BFingerRmin-RadiusSaddle,rmaxTotal);
395  }
396  tileEnvPconeBarrel->addPlane(-endCentralBarrel, rminBarrel, rmaxTotal);
397  tileEnvPconeBarrel->addPlane( endCentralBarrel, rminBarrel, rmaxTotal);
398  if (dbManager->BoolSaddle()) {
399  tileEnvPconeBarrel->addPlane( endCentralBarrel, BFingerRmin-RadiusSaddle,rmaxTotal);
400  tileEnvPconeBarrel->addPlane( endCentralBarrel+DzSaddleSupport, BFingerRmin-RadiusSaddle,rmaxTotal);
401  }
402  tileEnvPconeBarrel->addPlane( endCentralBarrel+DzSaddleSupport, BFingerRmin, rmaxTotal);
403  tileEnvPconeBarrel->addPlane( endEnvelopePos, BFingerRmin, rmaxTotal);
404 
405  lvTileEnvelopeBarrel = new GeoLogVol("TileCentralBarrel",tileEnvPconeBarrel,matAir);
406  pvTileEnvelopeBarrel = new GeoPhysVol(lvTileEnvelopeBarrel);
407 
408  }
409 
410  //
411  // Pos Ext. Barrel
412  //
413 
414  // Z planes
415  double PosEndBarrelFinger = ZLength[1]/2; // nominal end of barrel finger
416  double PosEndITC = PosEndBarrelFinger + ZLength[5];
417  double PosEndExBarrelFinger = PosEndITC + ZLength[3];
418  double PosEndExBarrel = PosEndExBarrelFinger - EBFingerLengthPos;
419 
420  if (m_log->level()<=MSG::DEBUG) {
421  (*m_log) << MSG::DEBUG
422  << " EBPos EnvDZPos[3] " << EnvDZPos[3] << " ZLength[5] " <<ZLength[5]<<"+"<<ZLength[3]
423  << " = " << ZLength[3]+ZLength[5] << " EBFingerLengthPos = " <<EBFingerLengthPos
424  <<endmsg;
425 
426  (*m_log) << MSG::DEBUG << " PosEndBarrelFinger = " << PosEndBarrelFinger
427  << " PosEndITC = " << PosEndITC
428  << " PosEndExBarrel = " << PosEndExBarrel
429  << " PosEndExtBarrelFinger = " << PosEndExBarrelFinger
430  << endmsg;
431  }
432 
434  double PosEndITC1 = (dbManager->TILBzoffset() + dbManager->TILEzshift() + dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
435  double corr = PosEndITC - PosEndITC1;
436  if (std::abs(corr)>0.01) {
437  (*m_log) << MSG::WARNING
438  << "Discrepancy between TileGlobals and TILB tables in GeoModel DB "
439  << PosEndITC << " != " << PosEndITC1 << "; take this into account"
440  <<endmsg;
441  }
442 
443  //double beginITC1 = corr + (dbManager->TILBzoffset() + dbManager->TILEzshift()-dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
445  double PosBeginITC2 = corr + (dbManager->TILBzoffset() + dbManager->TILEzshift()-dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
447  double PosBeginGap = corr + (dbManager->TILBzoffset() + dbManager->TILEzshift()-dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
448  double PosEndGap = corr + (dbManager->TILBzoffset() + dbManager->TILEzshift()+dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
450  double PosBeginCrack = corr + (dbManager->TILBzoffset() + dbManager->TILEzshift()-dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
451  double PosEndCrack = corr + (dbManager->TILBzoffset() + dbManager->TILEzshift()+dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
452 
453  if (!spC10) { // recovering old (wrong) positioning of gap scintillators
454  double GapWidth = PosEndGap - PosBeginGap;
455  PosBeginGap = PosBeginCrack + 0.9 * Gaudi::Units::cm;
456  PosEndGap = PosBeginGap + GapWidth;
457  }
458 
459  if (m_log->level()<=MSG::DEBUG)
460  (*m_log) << MSG::DEBUG << " PosBeginITC2 = " << PosBeginITC2
461  << " PosBeginGap = " << PosBeginGap
462  << " PosEndGap = " << PosEndGap
463  << " PosBeginCrack = " << PosBeginCrack
464  << " PosEndCrack = " << PosEndCrack
465  << endmsg;
466 
467  // R minimals
469  double PosRminITC1 = dbManager->TILBrminimal()*Gaudi::Units::cm;
471  double PosRminITC = rMinC10 /* dbManager->TILBrminimal() */ *Gaudi::Units::cm;
473  double PosRminGap = rMinE2pos*Gaudi::Units::cm;
475  double PosRminCrack = rMinE4pos*Gaudi::Units::cm;
476  double PosRmaxCrack = rMaxE3pos*Gaudi::Units::cm;
477 
478  double PosRminExt = RInMin[3];
479 
480  // R maximal
481  double PosRmaxTotal = ROutMax[3];
482 
483  if (m_log->level()<=MSG::DEBUG)
484  (*m_log) << MSG::DEBUG
485  << " PosRminITC1 = " << PosRminITC1
486  << " PosRminITC2 = " << PosRminITC
487  << " PosRminGap = " << PosRminGap
488  << " PosRmaxCrack = " << PosRmaxCrack
489  << " PosRminCrack = " << PosRminCrack
490  << " PosRminExt = " << PosRminExt
491  << " PosRmaxTotal = " << PosRmaxTotal
492  << endmsg;
493 
494  if (eb_flag) {
495 
496  GeoPcon* tileEnvPconePosEndcap = new GeoPcon(PhiMin[3]*Gaudi::Units::deg, PhiMax[3]*Gaudi::Units::deg);
497 
498  // Positive Endcap
499  tileEnvPconePosEndcap->addPlane(PosEndBarrelFinger, PosRminITC1, PosRmaxTotal);
500  tileEnvPconePosEndcap->addPlane(PosBeginITC2, PosRminITC1, PosRmaxTotal);
501  tileEnvPconePosEndcap->addPlane(PosBeginITC2, PosRminITC, PosRmaxTotal);
502  if (crack_flag>0) {
503  // endcap volume without crack scintillators
504  tileEnvPconePosEndcap->addPlane(PosBeginGap, PosRminITC, PosRmaxTotal);
505  tileEnvPconePosEndcap->addPlane(PosBeginGap, PosRminGap, PosRmaxTotal);
506  tileEnvPconePosEndcap->addPlane(PosEndGap, PosRminGap, PosRmaxTotal);
507  tileEnvPconePosEndcap->addPlane(PosEndGap, PosRminExt, PosRmaxTotal);
508  } else {
509  // endcap volume with crack scintillators
510  tileEnvPconePosEndcap->addPlane(PosBeginCrack, PosRminITC, PosRmaxTotal);
511  tileEnvPconePosEndcap->addPlane(PosBeginCrack, PosRminCrack, PosRmaxTotal);
512  tileEnvPconePosEndcap->addPlane(PosEndCrack, PosRminCrack, PosRmaxTotal);
513  tileEnvPconePosEndcap->addPlane(PosEndCrack, PosRminExt, PosRmaxTotal);
514  }
515  tileEnvPconePosEndcap->addPlane(PosEndExBarrel, PosRminExt, PosRmaxTotal);
516  if (dbManager->BoolSaddle()) {
517  tileEnvPconePosEndcap->addPlane(PosEndExBarrel, EFingerRmin-RadiusSaddle, PosRmaxTotal);
518  tileEnvPconePosEndcap->addPlane(PosEndExBarrel+DzSaddleSupport, EFingerRmin-RadiusSaddle, PosRmaxTotal);
519  }
520  tileEnvPconePosEndcap->addPlane(PosEndExBarrel+DzSaddleSupport, EFingerRmin, PosRmaxTotal);
521  tileEnvPconePosEndcap->addPlane(PosEndExBarrelFinger, EFingerRmin, PosRmaxTotal);
522 
523  lvTileEnvelopePosEndcap = new GeoLogVol("TileEndcapPos",tileEnvPconePosEndcap,matAir);
524  pvTileEnvelopePosEndcap = new GeoPhysVol(lvTileEnvelopePosEndcap);
525 
526  }
527 
528  if (crack_flag==1) {
529  // Positive Crack as separate volume
530  GeoPcon* tileEnvPconePosCrack = new GeoPcon(PhiMin[3]*Gaudi::Units::deg, PhiMax[3]*Gaudi::Units::deg);
531 
532  tileEnvPconePosCrack->addPlane(PosBeginCrack, PosRminCrack, PosRmaxCrack);
533  tileEnvPconePosCrack->addPlane(PosEndCrack, PosRminCrack, PosRmaxCrack);
534 
535  lvTileEnvelopePosCrack = new GeoLogVol("TileCrackPos",tileEnvPconePosCrack,matAir);
536  pvTileEnvelopePosCrack = new GeoPhysVol(lvTileEnvelopePosCrack);
537  }
538 
539  //
540  // Neg Ex Barrel
541  //
542 
543  // Z planes
544  double NegEndBarrelFinger = ZLength[1]/2; // nominal end of barrel finger
545  double NegEndITC = NegEndBarrelFinger + ZLength[4];
546  double NegEndExtBarrelFinger = NegEndITC + ZLength[2];
547  double NegEndExBarrel = NegEndExtBarrelFinger - EBFingerLengthNeg;
548 
549  if (m_log->level()<=MSG::DEBUG) {
550  (*m_log) << MSG::DEBUG
551  << " EBNeg EnvDZPos[2] " << EnvDZPos[2] << " ZLength[4] " <<ZLength[4]<<"+"<<ZLength[2]
552  << " = " << ZLength[2]+ZLength[4] << " EBFingerLengthNeg = " <<EBFingerLengthNeg
553  <<endmsg;
554 
555  (*m_log) << MSG::DEBUG << " NegEndBarrelFinger = " << NegEndBarrelFinger
556  << " NegEndITC = " << NegEndITC
557  << " NegEndExBarrel = " << NegEndExBarrel
558  << " NegEndExtBarrelFinger = " << NegEndExtBarrelFinger
559  << endmsg;
560  }
561 
563  double NegEndITC1 = (dbManager->TILBzoffset() + dbManager->TILEzshift() + dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
564  corr = NegEndITC - NegEndITC1;
565 
566  if (std::abs(corr)>0.01) {
567  (*m_log) << MSG::WARNING
568  << "Discrepancy between TileGlobals and TILB tables in GeoModel DB "
569  << NegEndITC << " != " << NegEndITC1 << "; take this into account"
570  << endmsg;
571  }
572  //double NegBeginITC1 = corr + (dbManager->TILBzoffset() + dbManager->TILEzshift()-dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
574  double NegBeginITC2 = corr + (dbManager->TILBzoffset() + dbManager->TILEzshift()-dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
576  double NegBeginGap = corr + (dbManager->TILBzoffset() + dbManager->TILEzshift()-dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
577  double NegEndGap = corr + (dbManager->TILBzoffset() + dbManager->TILEzshift()+dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
579  double NegBeginCrack = corr + (dbManager->TILBzoffset() + dbManager->TILEzshift()-dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
580  double NegEndCrack = corr + (dbManager->TILBzoffset() + dbManager->TILEzshift()+dbManager->TILBdzmodul()/2)*Gaudi::Units::cm;
581 
582  if (!spC10) { // recovering old (wrong) positioning of gap scintillators
583  double GapWidth = NegEndGap - NegBeginGap;
584  NegBeginGap = NegBeginCrack + 0.9 * Gaudi::Units::cm;
585  NegEndGap = NegBeginGap + GapWidth;
586  }
587 
588  if (m_log->level()<=MSG::DEBUG)
589  (*m_log) << MSG::DEBUG << " NegBeginITC2 = " << NegBeginITC2
590  << " NegBeginGap = " << NegBeginGap
591  << " NegEndGap = " << NegEndGap
592  << " NegBeginCrack = " << NegBeginCrack
593  << " NegEndCrack = " << NegEndCrack
594  << endmsg;
595 
596  // R minimals
598  double NegRminITC1 = dbManager->TILBrminimal()*Gaudi::Units::cm;
600  double NegRminITC = rMinC10 /* dbManager->TILBrminimal() */ *Gaudi::Units::cm;
602  double NegRminGap = rMinE2neg*Gaudi::Units::cm;
604  double NegRminCrack = rMinE4neg*Gaudi::Units::cm;
605  double NegRmaxCrack = rMaxE3neg*Gaudi::Units::cm;
607 
608  double NegRminExt = RInMin[2];
609 
610  // R maximal
611  double NegRmaxTotal = ROutMax[2];
612 
613  if (m_log->level()<=MSG::DEBUG)
614  (*m_log) << MSG::DEBUG
615  << " NegRminITC1 = " << NegRminITC1
616  << " NegRminITC2 = " << NegRminITC
617  << " NegRminGap = " << NegRminGap
618  << " NegRmaxCrack = " << NegRmaxCrack
619  << " NegRminCrack = " << NegRminCrack
620  << " NegRminExt = " << NegRminExt
621  << " NegRmaxTotal = " << NegRmaxTotal
622  << endmsg;
623 
624  if (eb_flag) {
625 
626  GeoPcon* tileEnvPconeNegEndcap = new GeoPcon(PhiMin[2]*Gaudi::Units::deg, PhiMax[2]*Gaudi::Units::deg);
627 
628  // Negative Endcap
629  tileEnvPconeNegEndcap->addPlane(-NegEndExtBarrelFinger, EFingerRmin, NegRmaxTotal);
630  tileEnvPconeNegEndcap->addPlane(-NegEndExBarrel-DzSaddleSupport, EFingerRmin, NegRmaxTotal);
631  if (dbManager->BoolSaddle()) {
632  tileEnvPconeNegEndcap->addPlane(-NegEndExBarrel-DzSaddleSupport, EFingerRmin-RadiusSaddle, NegRmaxTotal);
633  tileEnvPconeNegEndcap->addPlane(-NegEndExBarrel, EFingerRmin-RadiusSaddle, NegRmaxTotal);
634  }
635  tileEnvPconeNegEndcap->addPlane(-NegEndExBarrel, NegRminExt, NegRmaxTotal);
636  if (crack_flag>0) {
637  // endcap volume without crack scintillators
638  tileEnvPconeNegEndcap->addPlane(-NegEndGap, NegRminExt, NegRmaxTotal);
639  tileEnvPconeNegEndcap->addPlane(-NegEndGap, NegRminGap, NegRmaxTotal);
640  tileEnvPconeNegEndcap->addPlane(-NegBeginGap, NegRminGap, NegRmaxTotal);
641  tileEnvPconeNegEndcap->addPlane(-NegBeginGap, NegRminITC, NegRmaxTotal);
642  } else {
643  // endcap volume with crack scintillators
644  tileEnvPconeNegEndcap->addPlane(-NegEndCrack, NegRminExt, NegRmaxTotal);
645  tileEnvPconeNegEndcap->addPlane(-NegEndCrack, NegRminCrack, NegRmaxTotal);
646  tileEnvPconeNegEndcap->addPlane(-NegBeginCrack, NegRminCrack, NegRmaxTotal);
647  tileEnvPconeNegEndcap->addPlane(-NegBeginCrack, NegRminITC, NegRmaxTotal);
648  }
649  tileEnvPconeNegEndcap->addPlane(-NegBeginITC2, NegRminITC, NegRmaxTotal);
650  tileEnvPconeNegEndcap->addPlane(-NegBeginITC2, NegRminITC1, NegRmaxTotal);
651  tileEnvPconeNegEndcap->addPlane(-NegEndBarrelFinger, NegRminITC1, NegRmaxTotal);
652 
653  lvTileEnvelopeNegEndcap = new GeoLogVol("TileEndcapNeg",tileEnvPconeNegEndcap,matAir);
654  pvTileEnvelopeNegEndcap = new GeoPhysVol(lvTileEnvelopeNegEndcap);
655 
656  }
657 
658  if (crack_flag==1) {
659  // Negative Crack as separate volume
660  GeoPcon* tileEnvPconeNegCrack = new GeoPcon(PhiMin[3]*Gaudi::Units::deg, PhiMax[3]*Gaudi::Units::deg);
661 
662  tileEnvPconeNegCrack->addPlane(-NegEndCrack, NegRminCrack, NegRmaxCrack);
663  tileEnvPconeNegCrack->addPlane(-NegBeginCrack, NegRminCrack, NegRmaxCrack);
664 
665  lvTileEnvelopeNegCrack = new GeoLogVol("TileCrackNeg",tileEnvPconeNegCrack,matAir);
666  pvTileEnvelopeNegCrack = new GeoPhysVol(lvTileEnvelopeNegCrack);
667  }
668 
669  // --------------- Configure Section Builder for the Reco geometry --------------------
670  if (!m_fullGeo || barrel_flag!=0) {
671  // Central barrel part
672  dbManager->SetCurrentSectionByNumber(1);
673 
674  dzGlue = (dbManager->TILBdzmodul() - dbManager->TILBdzend1() - dbManager->TILBdzend2()
675  - (dbManager->TILBnperiod()*2.*(dbManager->TILBdzmast() + dbManager->TILBdzspac())
676  - dbManager->TILBdzmast()))/(2.*(2.*dbManager->TILBnperiod() - 1));
677 
678  // TODO: apparently, the value set with the call below is not used: it seems m_barrelPeriodThickness is recomputed inside the GeoSectionBuilder's code; so, the call below is probably useless...
679  sectionBuilder->setBarrelPeriodThickness(2.*(dbManager->TILBdzmast() + dbManager->TILBdzspac() + 2.*dzGlue)*Gaudi::Units::cm);
680  sectionBuilder->setBarrelGlue(dzGlue*Gaudi::Units::cm); // TODO: it's probably the same, here...
681 
682  // Ext barrel part
683  dbManager->SetCurrentSectionByNumber(2);
684 
685  dzGlue = (dbManager->TILBdzmodul() - dbManager->TILBdzend1() - dbManager->TILBdzend2()
686  - dbManager->TILBnperiod()*2.*(dbManager->TILBdzmast() + dbManager->TILBdzspac()))/(4.*dbManager->TILBnperiod());
687 
688  // TODO: apparently, the value set with the call below is not used: it seems m_extendedPeriodThickness is recomputed inside the GeoSectionBuilder's code; so, the call below is probably useless...
689  sectionBuilder->setExtendedPeriodThickness(2.*(dbManager->TILBdzmast() + dbManager->TILBdzspac() + 2.*dzGlue)*Gaudi::Units::cm);
690  }
691 
692  PVLink pvBarrelMother{nullptr}, pvFingerMotherNeg{nullptr}, pvFingerMotherPos{nullptr}, pvSaddleMotherNeg{nullptr}, pvSaddleMotherPos{nullptr};
693  PVLink pvEBarrelMotherNeg{nullptr}, pvEBarrelMotherPos{nullptr};
694  PVLink pvEFingerMotherNeg{nullptr}, pvEFingerMotherPos{nullptr}, pvESaddleMotherNeg{nullptr}, pvESaddleMotherPos{nullptr};
695  PVLink pvITCMotherNeg{nullptr}, pvITCMotherPos{nullptr};
696  PVLink pvGapMotherNeg{nullptr}, pvGapMotherPos{nullptr};
697  PVLink pvCrackMotherNeg{nullptr}, pvCrackMotherPos{nullptr};
698 
699  GeoLogVol *lvEBarrelModuleMotherPos{nullptr}, *lvEBarrelModuleMotherNeg{nullptr};
700  PVLink pvEBarrelModuleMotherPos{nullptr}, pvEBarrelModuleMotherNeg{nullptr};
701 
702  /*
703  GeoPhysVol *pvTmp_EBarrelModuleMotherPos =0,*pvTmL_EBarrelModuleMotherPos =0,*pvTmR_EBarrelModuleMotherPos =0;
704  GeoPhysVol *pvTmp_EBarrelModuleMotherNeg =0,*pvTmL_EBarrelModuleMotherNeg =0,*pvTmR_EBarrelModuleMotherNeg =0;
705  */
706 
707  //GeoCutVolAction *action1 =0, *action2 =0, *action3 =0;
708  // -----------------------------------------------------------------------------------------------------------------
709  //
710  // All volumes which absolute forme EnvCounter loop
711  //
712  // -----------------------------------------------------------------------------------------------------------------
713  double dX1 =0, dX2 =0, dY1 =0, dY2 =0, dZ1 =0, dZ2 =0;
714  double dxIron =0, dyIron =0, dxIr =0, dyIr =0;
715  std::string volname ="";
716 
717  // Cuting positioning
718  double PosXcut =0, PosYcut =0, PosY =0;
719  double modl_length =0;
720 
721  const GeoShapeUnion *CutA= 0;
722  GeoShape *CutB= 0;
723 
724  GeoLogVol *lvIrUp =0, *lvIrDw =0, *lvIron3 =0, *lvIron2 =0, *lvIron1 =0, *lvIrBox =0;
725  GeoPhysVol *pvIrUp =0, *pvIrDw =0, *pvIron3 =0, *pvIron2 =0, *pvIron1 =0, *pvIrBox =0;
726 
727  if (m_fullGeo) {
728 
729  // ext. barrel Cuts description
730  if (dbManager->BoolCuts()) {
731  if (m_log->level()<=MSG::DEBUG)
732  (*m_log) << MSG::DEBUG << " Tile Geometry with Ext.Barrel CutOuts and Iron plates, starting form TileCal-CSC-01"
733  << endmsg;
734 
735  volname = "CutB"; dbManager->SetCurrentCuts(volname);
736  PosXcut = dbManager->CutsXpos();
737  PosYcut = dbManager->CutsYpos();
738  modl_length = 4*dbManager->CutsDX1();
739 
740  // Inert materials, CutB1
741  dX1 = dbManager->CutsDX1();
742  dX2 = dbManager->CutsDX2();
743  dY1 = dbManager->CutsDY1();
744  dY2 = dbManager->CutsDY2();
745  dZ1 = dbManager->CutsDZ1();
746 
747  checking("CutB1", false, 1, dX1,dX2,dY1,dY2,dZ1);
748  GeoTrd* CutB1 = new GeoTrd(dX1,dX2,dY1,dY2,dZ1);
749  //const GeoShape& CutB = *CutB1;
750  CutB = CutB1;
751 
752  // Inert materials which are in cuts, special modules
753  // Materials are in cuting region, up Iron plate
754  volname = "IrUp"; dbManager->SetCurrentCuts(volname);
755  dX1 = dbManager->CutsDX1();
756  dX2 = dbManager->CutsDX2();
757  dY1 = dbManager->CutsDY1();
758  dY2 = dbManager->CutsDY2();
759  dZ1 = dbManager->CutsDZ1();
760 
761  checking("IrUp", false, 1,dX1,dX2,dY1,dY2,dZ1);
762  GeoTrd* IrUp = new GeoTrd(dX1,dX2,dY1,dY2,dZ1);
763  lvIrUp = new GeoLogVol("IrUp",IrUp,matIron);
764  pvIrUp = new GeoPhysVol(lvIrUp);
765 
766  // Materials are in cuting region, down Iron plate
767  volname = "IrDw"; dbManager->SetCurrentCuts(volname);
768  dX1 = dbManager->CutsDX1();
769  dX2 = dbManager->CutsDX2();
770  dY1 = dbManager->CutsDY1();
771  dY2 = dbManager->CutsDY2();
772  dZ1 = dbManager->CutsDZ1();
773 
774  checking("IrDw", false, 1, dX1,dX2,dY1,dY2,dZ1);
775  GeoTrd* IrDw = new GeoTrd(dX1,dX2,dY1,dY2,dZ1);
776  lvIrDw = new GeoLogVol("IrDw",IrDw,matIron);
777  pvIrDw = new GeoPhysVol(lvIrDw);
778 
779  // Materials are in cuting region, 1up Iron plate
780  volname = "Cut1up"; dbManager->SetCurrentCuts(volname); //>>
781  PosY = dbManager->CutsYpos();
782 
783  dX1 = dbManager->CutsDX1();
784  dX2 = dbManager->CutsDX2();
785  dY1 = dbManager->CutsDY1();
786  dY2 = dbManager->CutsDY2();
787  dZ1 = dbManager->CutsDZ1();
788 
789  checking("Cut1up", false, 1, dX1,dX2,dY1,dY2,dZ1);
790  GeoTrd* Cut1up = new GeoTrd(dX1,dX2,dY1,dY2,dZ1);
791 
792  volname = "Cut2down"; dbManager->SetCurrentCuts(volname); //>>
793  dX1 = dbManager->CutsDX1();
794  dX2 = dbManager->CutsDX2();
795  dY1 = dbManager->CutsDY1();
796  dY2 = dbManager->CutsDY2();
797  dZ2 = dbManager->CutsDZ1();
798 
799  checking("Cut2down", false, 1, dX1,dX2,dY1,dY2,dZ2);
800  GeoTrd* Cut1down = new GeoTrd(dX1,dX2,dY1,dY2,dZ2);
801 
802  GeoTrf::Translate3D yPosA(0.,0.,-dZ1-dZ2);
803 
804  const GeoShapeUnion& CutA1 = Cut1up->add(*Cut1down<<yPosA);
805  CutA = &CutA1;
806 
807  /*
808  |----------> X
809  |---------------------------------------| (Xdown, -Ydown)
810  | (3) |
811  |---------------------------------------| (2) (Xdown, -Ymiddle)
812  / CutA \
813  |-------------------------------------------| (1) (Xup, -Yup)
814 
815  GeoSimplePolygonBrep *BREP = new GeoSimplePolygonBrep(length/2);
816  BREP->addVertex( Xup, -Yup );
817  BREP->addVertex( Xdown, -Ymiddle);
818  BREP->addVertex( Xdown, -Ydown );
819  BREP->addVertex(-Xdown, -Ydown );
820  BREP->addVertex(-Xdown, -Ymiddle);
821  BREP->addVertex(-Xup, -Yup );
822  const GeoShape& ShapeCut2 = *BREP;
823  */
824 
825  // Inert materials which are in cuts, special modules
826  // Materials are in cuting region, down Iron plate (3)
827  volname = "Iron3"; dbManager->SetCurrentCuts(volname); //>>
828  dX1 = dbManager->CutsDX1();
829  dX2 = dbManager->CutsDX2();
830  dY1 = dbManager->CutsDY1();
831  dY2 = dbManager->CutsDY2();
832  dZ1 = dbManager->CutsDZ1();
833 
834  checking("Iron3", false, 1, dX1,dX2,dY1,dY2,dZ1);
835  GeoTrd* Iron3 = new GeoTrd(dX1,dX2,dY1,dY2,dZ1);
836  lvIron3 = new GeoLogVol("Iron3",Iron3,matIron);
837  pvIron3 = new GeoPhysVol(lvIron3);
838 
839  // Materials are in cuting region, down Iron plate (2)
840  volname = "Iron2"; dbManager->SetCurrentCuts(volname); //>>
841  dX1 = dbManager->CutsDX1();
842  dX2 = dbManager->CutsDX2();
843  dY1 = dbManager->CutsDY1();
844  dY2 = dbManager->CutsDY2();
845  dZ1 = dbManager->CutsDZ1();
846 
847  checking("Iron2", false, 1, dX1,dX2,dY1,dY2,dZ1);
848  GeoTrd* Iron2 = new GeoTrd(dX1,dX2,dY1,dY2,dZ1);
849  lvIron2 = new GeoLogVol("Iron2",Iron2,matIron);
850  pvIron2 = new GeoPhysVol(lvIron2);
851 
852  // Materials are in cuting region, down Iron plate (1)
853  volname = "Iron1"; dbManager->SetCurrentCuts(volname); //>>
854  dX1 = dbManager->CutsDX1();
855  dX2 = dbManager->CutsDX2();
856  dY1 = dbManager->CutsDY1();
857  dY2 = dbManager->CutsDY2();
858  dZ1 = dbManager->CutsDZ1();
859 
860  checking("Iron1", false, 1, dX1,dX2,dY1,dY2,dZ1);
861  GeoTrd* Iron1 = new GeoTrd(dX1,dX2,dY1,dY2,dZ1);
862  lvIron1 = new GeoLogVol("Iron1",Iron1,matIron);
863  pvIron1 = new GeoPhysVol(lvIron1);
864 
865  // Materials are in cuting region, Heavy Iron Box
866  volname = "IrBox"; dbManager->SetCurrentCuts(volname); //>>
867  dX1 = dbManager->CutsDX1();
868  dX2 = dbManager->CutsDX2();
869  dY1 = dbManager->CutsDY1();
870  dY2 = dbManager->CutsDY2();
871  dZ1 = dbManager->CutsDZ1();
872 
873  checking("IrBox", false, 1, dX1,dX2,dY1,dY2,dZ1);
874  GeoTrd* IrBox = new GeoTrd(dX1,dX2,dY1,dY2,dZ1);
875  lvIrBox = new GeoLogVol("IrBox",IrBox,matIron);
876  pvIrBox = new GeoPhysVol(lvIrBox);
877 
878  /*
879  |<-->|----- |Xdown - Xup|
880  (Xdown,-Ymiddle) /| ^
881  / | |
882  (Xup, / | | CutB
883  |----------> X | | |
884  (Xup,-Yup) | | |
885  \ | |
886  \ | |- |Ydown - Ymiddle|
887  (Xdown,-Ydown) \| ---
888  (Ydown+|Ydown-Ymiddle|/2)-Yup
889  Y position = Ydown+|Ydown-Ymiddle|/2
890 
891  GeoSimplePolygonBrep *BREP = new GeoSimplePolygonBrep(length/4);
892  BREP->addVertex( Xup, -Yup );
893  BREP->addVertex( Xdown, -Ydown );
894  BREP->addVertex( Xdown, -Ymiddle);
895  BREP->addVertex(-Xdown, -Ymiddle);
896  BREP->addVertex(-Xdown, -Ydown );
897  BREP->addVertex(-Xup, -Yup );
898  const GeoShape& ShapeCut1 = *BREP;
899  */
900  } // end if, BoolCuts
901  }
902 
903  int NumberOfEnv = dbManager->GetNumberOfEnv();
904  MLOG(DEBUG) << "NumberOfEnv: " << NumberOfEnv << endmsg;
905 
906  for (int EnvCounter = 0; EnvCounter < NumberOfEnv ; ++EnvCounter) { // Loop over Envelopes
907 
908  dbManager->SetCurrentEnvByIndex(EnvCounter);
909  int EnvType = dbManager->GetEnvType();
910  dbManager->SetCurrentEnvByType(EnvType);
911  int NumberOfMod = dbManager->GetEnvNModules();
912 
913  // Break for debugging
914  //if (EnvType != 3) continue;
915 
916  if (m_log->level()<=MSG::DEBUG)
917  (*m_log) << MSG::DEBUG << " EnvCounter " << EnvCounter << " EnvType " << EnvType
918  << " EnvNModules " << NumberOfMod << endmsg;
919 
920  if (EnvType == 1 && barrel_flag < 1) {
921  // nominal position of end plate
922  zEndSection = ZLength[1]/2 - BFingerLength;
923 
924  GeoTubs* GeneralMother = new GeoTubs(dbManager->GetEnvRin()*Gaudi::Units::cm,
925  dbManager->GetEnvRout()*Gaudi::Units::cm,
926  zEndSection,
927  AnglMin, AnglMax);
928 
929  GeoTubs* barrelMother = GeneralMother;
930  GeoLogVol* lvBarrelMother = new GeoLogVol("Barrel",barrelMother,matAir);
931  pvBarrelMother = new GeoPhysVol(lvBarrelMother);
932 
933  if (m_log->level()<=MSG::DEBUG)
934  (*m_log) << MSG::DEBUG << "Barrel envelope parameters: "
935  << " Length=" << zEndSection
936  << " Rmin=" << dbManager->GetEnvRin()*Gaudi::Units::cm
937  << " Rmax=" << dbManager->GetEnvRout()*Gaudi::Units::cm
938  << endmsg;
939 
940  // Envelopes for two barrel fingers, positive finger
941  GeoTubs* fingerMotherPos = new GeoTubs(BFingerRmin,
942  dbManager->GetEnvRout()*Gaudi::Units::cm,
943  BFingerLengthPos/2,
944  AnglMin, AnglMax);
945 
946  GeoLogVol* lvFingerMotherPos = new GeoLogVol("FingerPos",fingerMotherPos,matAir);
947  pvFingerMotherPos = new GeoPhysVol(lvFingerMotherPos);
948 
949  if (dbManager->BoolSaddle()) { // Envelopes for barrel saddle supports, positive
950  GeoTubs* SaddleMotherPos = new GeoTubs(BFingerRmin-RadiusSaddle,
951  BFingerRmin,
952  DzSaddleSupport/2,
953  AnglMin, AnglMax);
954 
955  GeoLogVol* lvSaddleMotherPos = new GeoLogVol("SaddlePos",SaddleMotherPos,matAir);
956  pvSaddleMotherPos = new GeoPhysVol(lvSaddleMotherPos);
957  }
958 
959  // Negative finger
960  GeoTubs* fingerMotherNeg = new GeoTubs(BFingerRmin,
961  dbManager->GetEnvRout()*Gaudi::Units::cm,
962  BFingerLengthNeg/2,
963  AnglMin, AnglMax);
964 
965  GeoLogVol* lvFingerMotherNeg = new GeoLogVol("FingerNeg",fingerMotherNeg,matAir);
966  pvFingerMotherNeg = new GeoPhysVol(lvFingerMotherNeg);
967 
968  if (m_log->level()<=MSG::DEBUG)
969  (*m_log) << MSG::DEBUG << "Barrel finger envelope parameters: "
970  << " length Pos/Neg=" << BFingerLengthPos << "/" << BFingerLengthNeg
971  << " Rmin=" << BFingerRmin << " Rmax=" << dbManager->GetEnvRout()*Gaudi::Units::cm
972  << endmsg;
973 
974  // Envelopes for two barrel saddle supports, positive
975  if (dbManager->BoolSaddle()) {
976  GeoTubs* SaddleMotherNeg = new GeoTubs(BFingerRmin-RadiusSaddle,
977  BFingerRmin,
978  DzSaddleSupport/2,
979  AnglMin, AnglMax);
980 
981  GeoLogVol* lvSaddleMotherNeg = new GeoLogVol("SaddleNeg",SaddleMotherNeg,matAir);
982  pvSaddleMotherNeg = new GeoPhysVol(lvSaddleMotherNeg);
983  }
984  }
985 
986  if (EnvType == 3 && eb_flag) {
987 
988  if (m_log->level()<=MSG::DEBUG)
989  (*m_log) << MSG::DEBUG <<" EBarrelPos DZ "<<(dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLengthPos)/2<< endmsg;
990 
991  checking("EBarrel (+)", false, 0,
992  dbManager->GetEnvRin()*Gaudi::Units::cm,dbManager->GetEnvRout()*Gaudi::Units::cm,
993  AnglMin,AnglMax,(dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLengthPos)/2);
994 
995  GeoTubs* GeneralMother = new GeoTubs(dbManager->GetEnvRin()*Gaudi::Units::cm,
996  dbManager->GetEnvRout()*Gaudi::Units::cm,
997  (dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLengthPos)/2,
998  AnglMin, AnglMax);
999 
1000  GeoTubs* ebarrelMotherPos = GeneralMother;
1001  GeoLogVol* lvEBarrelMotherPos = new GeoLogVol("EBarrel",ebarrelMotherPos,matAir);
1002  pvEBarrelMotherPos = new GeoPhysVol(lvEBarrelMotherPos);
1003 
1004  if (m_log->level()<=MSG::DEBUG)
1005  (*m_log) << MSG::DEBUG << "Positive ext.barrel envelope parameters: "
1006  << " length=" << (dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLength)
1007  << " Rmin=" << dbManager->GetEnvRin()*Gaudi::Units::cm
1008  << " Rmax=" << dbManager->GetEnvRout()*Gaudi::Units::cm
1009  << endmsg;
1010 
1011  if (barrel_flag < 2) {
1012  // Envelope for finger separately
1013  checking("EBarrel (+)", false, 0,
1014  EFingerRmin,dbManager->GetEnvRout()*Gaudi::Units::cm,
1015  AnglMin,AnglMax, EBFingerLength/2);
1016 
1017  GeoTubs* fingerMother = new GeoTubs(EFingerRmin,
1018  dbManager->GetEnvRout()*Gaudi::Units::cm,
1019  EBFingerLength/2,
1020  AnglMin, AnglMax);
1021 
1022  GeoLogVol* lvEFingerMother = new GeoLogVol("EFinger",fingerMother,matAir);
1023  pvEFingerMotherPos = new GeoPhysVol(lvEFingerMother);
1024 
1025  if (m_log->level()<=MSG::DEBUG)
1026  (*m_log) << MSG::DEBUG << "Positive ext.barrel finger envelope parameters: "
1027  << " length=" << EBFingerLength
1028  << " Rmin=" << EFingerRmin
1029  << " Rmax=" << (dbManager->GetEnvRout())*Gaudi::Units::cm
1030  << endmsg;
1031 
1032  if (dbManager->BoolSaddle()) { //Envelopes for two barrel saddle supports, positive
1033  checking("ESaddle (+)", false, 0,
1034  EFingerRmin-RadiusSaddle,EFingerRmin,AnglMin,AnglMax, DzSaddleSupport/2);
1035 
1036  GeoTubs* ESaddleMother = new GeoTubs(EFingerRmin-RadiusSaddle,
1037  EFingerRmin,
1038  DzSaddleSupport/2,
1039  AnglMin, AnglMax);
1040 
1041  GeoLogVol* lvESaddleMother = new GeoLogVol("ESaddlePos",ESaddleMother,matAir);
1042  pvESaddleMotherPos = new GeoPhysVol(lvESaddleMother);
1043  }
1044  }
1045  }
1046 
1047  // Negative Ext.Barrel
1048  if (EnvType == 2 && eb_flag) {
1049  if (m_log->level()<=MSG::DEBUG)
1050  (*m_log) << MSG::DEBUG <<" EBarrelNeg DZ "<<(dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLengthNeg)/2<< endmsg;
1051 
1052  GeoTubs* GeneralMother = new GeoTubs(dbManager->GetEnvRin()*Gaudi::Units::cm,
1053  dbManager->GetEnvRout()*Gaudi::Units::cm,
1054  (dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLengthNeg)/2,
1055  AnglMin, AnglMax);
1056 
1057  GeoTubs* ebarrelMotherNeg = GeneralMother;
1058  GeoLogVol* lvEBarrelMotherNeg = new GeoLogVol("EBarrel",ebarrelMotherNeg,matAir);
1059  pvEBarrelMotherNeg = new GeoPhysVol(lvEBarrelMotherNeg);
1060 
1061  if (m_log->level()<=MSG::DEBUG)
1062  (*m_log) << MSG::DEBUG << "Nevative ext.barrel envelope parameters: "
1063  << " length=" << (dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLength)
1064  << " Rmin=" << dbManager->GetEnvRin()*Gaudi::Units::cm
1065  << " Rmax=" << dbManager->GetEnvRout()*Gaudi::Units::cm
1066  << endmsg;
1067 
1068  if (barrel_flag < 2) {
1069  // Envelope for finger separately
1070  GeoTubs* fingerMother = new GeoTubs(EFingerRmin,
1071  dbManager->GetEnvRout()*Gaudi::Units::cm,
1072  EBFingerLengthNeg/2,
1073  AnglMin, AnglMax);
1074 
1075  GeoLogVol* lvEFingerMother = new GeoLogVol("EFinger",fingerMother,matAir);
1076  pvEFingerMotherNeg = new GeoPhysVol(lvEFingerMother);
1077 
1078  if (m_log->level()<=MSG::DEBUG)
1079  (*m_log) << MSG::DEBUG <<"Negative ext.barrel finger envelope parameters: "
1080  << " length=" << EBFingerLengthNeg
1081  << " Rmin=" << EFingerRmin
1082  << " Rmax=" << dbManager->GetEnvRout()*Gaudi::Units::cm
1083  << endmsg;
1084 
1085  if (dbManager->BoolSaddle()) { //Envelopes for Ext. barrel saddle supports, positive
1086  checking("ESaddle (-)", false, 0,
1087  EFingerRmin-RadiusSaddle,EFingerRmin,AnglMin,AnglMax, DzSaddleSupport/2);
1088 
1089  GeoTubs* ESaddleMother = new GeoTubs(EFingerRmin-RadiusSaddle,
1090  EFingerRmin,
1091  DzSaddleSupport/2,
1092  AnglMin, AnglMax);
1093 
1094  GeoLogVol* lvESaddleMother = new GeoLogVol("ESaddlePos",ESaddleMother,matAir);
1095  pvESaddleMotherNeg = new GeoPhysVol(lvESaddleMother);
1096  }
1097  }
1098  }
1099 
1100  // ITC Positive
1101  if (EnvType == 5) {
1102 
1103  if (barrel_flag < 3) { // allow ITC
1104 
1106 
1107  rMinITC2 = rMinC10; // dbManager->TILBrminimal();
1108  rMaxITC2 = dbManager->TILBrmaximal();
1109  dzITC2 = dbManager->TILBdzmodul();
1110 
1112 
1113  rMinITC1 = dbManager->TILBrminimal();
1114  rMaxITC1 = dbManager->TILErmam();
1115  dzITC1 = dbManager->TILBdzmodul();
1116 
1117  (*m_log) << MSG::INFO << " Positive ITC envelope parameters: PLUG1 "
1118  <<" Rmin= "<<rMinITC1*Gaudi::Units::cm<<" Rmax= "<<rMaxITC1*Gaudi::Units::cm<<" dzITC1= "<<dzITC1/2*Gaudi::Units::cm<< endmsg;
1119  (*m_log) << MSG::INFO << " PLUG2 "
1120  <<" Rmin= "<<rMinITC2*Gaudi::Units::cm<<" Rmax= "<<rMaxITC2*Gaudi::Units::cm<<" dzITC2= "<<dzITC2/2*Gaudi::Units::cm<< endmsg;
1121 
1122  checking("ITC itcWheel1 (+)", false, 0,
1123  rMinITC1*Gaudi::Units::cm,rMaxITC1*Gaudi::Units::cm, AnglMin,AnglMax, dzITC1/2*Gaudi::Units::cm);
1124 
1125  GeoTubs* itcWheel1 = new GeoTubs(rMinITC1*Gaudi::Units::cm,
1126  rMaxITC1*Gaudi::Units::cm,
1127  dzITC1/2*Gaudi::Units::cm,
1128  AnglMin, AnglMax);
1129 
1130  checking("ITC itcWheel2 (+)", false, 0,
1131  rMinITC2*Gaudi::Units::cm,rMaxITC2*Gaudi::Units::cm, AnglMin,AnglMax, dzITC2/2*Gaudi::Units::cm);
1132 
1133  GeoTubs* itcWheel2 = new GeoTubs(rMinITC2*Gaudi::Units::cm,
1134  rMaxITC2*Gaudi::Units::cm,
1135  dzITC2/2*Gaudi::Units::cm,
1136  AnglMin, AnglMax);
1137 
1138  Z = ( dzITC1 - dzITC2)/2*Gaudi::Units::cm;
1139  GeoTrf::Translate3D itcWheel2OffsetPos(0.,0., Z);
1140 
1141  zITCStandard = Z;
1142 
1143  const GeoShapeUnion& itcMotherPos = itcWheel1->add(*itcWheel2<<itcWheel2OffsetPos);
1144 
1145  GeoLogVol* lvITCMotherPos = new GeoLogVol("ITC",&itcMotherPos,matAir);
1146  pvITCMotherPos = new GeoPhysVol(lvITCMotherPos);
1147 
1148  }
1149 
1150  // Gap Positive
1151  if (barrel_flag < 4) { // allow Gap
1152 
1154 
1155  checking("Gap (+)", false, 0,
1156  dbManager->TILBrminimal()*Gaudi::Units::cm,
1158  AnglMin,AnglMax, dbManager->TILBdzmodul()/2*Gaudi::Units::cm);
1159 
1160  GeoTubs* GapMotherPos = new GeoTubs(dbManager->TILBrminimal()*Gaudi::Units::cm,
1162  dbManager->TILBdzmodul()/2*Gaudi::Units::cm,
1163  AnglMin, AnglMax);
1164 
1165  GeoLogVol* lvGapMotherPos = new GeoLogVol("Gap",GapMotherPos,matAir);
1166  pvGapMotherPos = new GeoPhysVol(lvGapMotherPos);
1167 
1168  }
1169 
1170  // Crack Positive
1171  if (crack_flag<=0 || pvTileEnvelopePosCrack) { // allow Crack
1172 
1174 
1175  checking("Crack (+)", spE4, 0,
1176  rMinE4pos*Gaudi::Units::cm,
1178  AnglMin,AnglMax, dbManager->TILBdzmodul()/2*Gaudi::Units::cm);
1179 
1180  GeoTubs* crackMotherPos = new GeoTubs(rMinE4pos*Gaudi::Units::cm,
1182  dbManager->TILBdzmodul()/2*Gaudi::Units::cm,
1183  AnglMin, AnglMax);
1184 
1185  GeoLogVol* lvCrackMotherPos = new GeoLogVol("Crack",crackMotherPos,matAir);
1186  pvCrackMotherPos = new GeoPhysVol(lvCrackMotherPos);
1187  }
1188  }
1189 
1190  // ITC Negative
1191  if (EnvType == 4) {
1192 
1193  if (barrel_flag < 3) { // allow ITC
1194 
1196 
1197  rMinITC2 = rMinC10; // dbManager->TILBrminimal();
1198  rMaxITC2 = dbManager->TILBrmaximal();
1199  dzITC2 = dbManager->TILBdzmodul();
1200 
1202 
1203  rMinITC1 = dbManager->TILBrminimal();
1204  rMaxITC1 = dbManager->TILErmam();
1205  dzITC1 = dbManager->TILBdzmodul();
1206 
1207  (*m_log) << MSG::INFO << " Negative ITC envelope parameters: PLUG1 "
1208  <<" Rmin= "<<rMinITC1*Gaudi::Units::cm<<" Rmax= "<<rMaxITC1*Gaudi::Units::cm<<" dzITC1= "<<dzITC1/2*Gaudi::Units::cm<<endmsg;
1209  (*m_log) << MSG::INFO << " PLUG2 "
1210  <<" Rmin= "<<rMinITC2*Gaudi::Units::cm<<" Rmax= "<<rMaxITC2*Gaudi::Units::cm<<" dzITC2= "<<dzITC2/2*Gaudi::Units::cm<<endmsg;
1211 
1212  checking("ITC itcWheel1 (-)", false, 0,
1213  rMinITC1*Gaudi::Units::cm,rMaxITC1*Gaudi::Units::cm, AnglMin,AnglMax, dzITC1/2*Gaudi::Units::cm);
1214 
1215  GeoTubs* itcWheel1 = new GeoTubs(rMinITC1*Gaudi::Units::cm,
1216  rMaxITC1*Gaudi::Units::cm,
1217  dzITC1/2*Gaudi::Units::cm,
1218  AnglMin, AnglMax);
1219 
1220  checking("ITC itcWheel2 (-)", false, 0,
1221  rMinITC2*Gaudi::Units::cm,rMaxITC2*Gaudi::Units::cm, AnglMin,AnglMax, dzITC2/2*Gaudi::Units::cm);
1222 
1223  GeoTubs* itcWheel2 = new GeoTubs(rMinITC2*Gaudi::Units::cm,
1224  rMaxITC2*Gaudi::Units::cm,
1225  dzITC2/2*Gaudi::Units::cm,
1226  AnglMin, AnglMax);
1227 
1228  Z = (-dzITC1 + dzITC2)/2*Gaudi::Units::cm;
1229  GeoTrf::Translate3D itcWheel2OffsetNeg(0.,0., Z);
1230 
1231  zITCStandard = Z;
1232 
1233  const GeoShapeUnion& itcMotherNeg = itcWheel1->add(*itcWheel2<<itcWheel2OffsetNeg);
1234 
1235  GeoLogVol* lvITCMotherNeg = new GeoLogVol("ITC",&itcMotherNeg,matAir);
1236  pvITCMotherNeg = new GeoPhysVol(lvITCMotherNeg);
1237 
1238  }
1239 
1240  // Gap Negative
1241  if (barrel_flag < 4) { // allow Gap
1242 
1244 
1245  checking("Gap (-)", false, 1,
1246  dbManager->TILBrminimal()*Gaudi::Units::cm,
1248  AnglMin,AnglMax, dbManager->TILBdzmodul()/2*Gaudi::Units::cm);
1249 
1250  GeoTubs* GapMotherNeg = new GeoTubs(dbManager->TILBrminimal()*Gaudi::Units::cm,
1252  dbManager->TILBdzmodul()/2*Gaudi::Units::cm,
1253  AnglMin, AnglMax);
1254 
1255  GeoLogVol* lvGapMotherNeg = new GeoLogVol("Gap",GapMotherNeg,matAir);
1256  pvGapMotherNeg = new GeoPhysVol(lvGapMotherNeg);
1257 
1258  }
1259 
1260  // Crack Negative
1261  if (crack_flag<=0 || pvTileEnvelopeNegCrack) { // allow Crack
1262 
1264 
1265  checking("Crack (-)", spE4, 0,
1266  rMinE4neg*Gaudi::Units::cm,
1268  AnglMin,AnglMax, dbManager->TILBdzmodul()/2*Gaudi::Units::cm);
1269 
1270  GeoTubs* crackMotherNeg = new GeoTubs(rMinE4neg*Gaudi::Units::cm,
1272  dbManager->TILBdzmodul()/2*Gaudi::Units::cm,
1273  AnglMin, AnglMax);
1274 
1275  GeoLogVol* lvCrackMotherNeg = new GeoLogVol("Crack",crackMotherNeg,matAir);
1276  pvCrackMotherNeg = new GeoPhysVol(lvCrackMotherNeg);
1277  }
1278  }
1279 
1280  if (m_fullGeo && (
1281  ((EnvType&6) == 0 && barrel_flag < 1) ||
1282  ((EnvType&6) == 2 && barrel_flag < 2) ||
1283  ((EnvType&6) == 4 && barrel_flag < 5) )) {
1284 
1285  // ModuleNumber[NumberOfMod] array for independent of positrion numeration
1286  int ModuleIndex[64];
1287  for (int i=0; i < NumberOfMod; i++) {
1288  ModuleIndex[i] = i+1;
1289  }
1290 
1291  // the main loop around all phi modules position
1292  int ModuleNcp =0;
1293 
1294  GeoIntrusivePtr<GeoTransform> yrotMod{new GeoTransform(GeoTrf::RotateY3D(90*Gaudi::Units::deg))};
1295  GeoIntrusivePtr<GeoTransform> XYrtMod{new GeoTransform(GeoTrf::RotateX3D(180*Gaudi::Units::deg) * GeoTrf::RotateY3D(90*Gaudi::Units::deg))};
1296 
1297  for (int ModCounter = 0; ModCounter < NumberOfMod; ModCounter++) {
1298 
1299  ModuleNcp = ModuleIndex[ModCounter];
1300 
1301  // General rotation and transformations
1302  double phi = (double(ModuleNcp-1) + 0.5)*deltaPhi;
1303  double ph1 = (double(ModuleNcp-1))*deltaPhi;
1304 
1305  GeoIntrusivePtr<GeoTransform> zrotMod{new GeoTransform(GeoTrf::RotateZ3D(phi*Gaudi::Units::deg))};
1306  GeoIntrusivePtr<GeoTransform> zrotSaddle{new GeoTransform(GeoTrf::RotateZ3D(ph1*Gaudi::Units::deg))};
1307 
1308  dbManager->SetCurrentModuleByIndex(ModuleNcp-1);
1309  int ModType = dbManager->GetModType();
1310  int ModFingpattern = dbManager->TILBfingpattern();
1311 
1312  // Debuging code for cuted modules
1313  if (!(ModuleNcp>=NcpFrom && ModuleNcp<=NcpFrom+NcpPlus)) continue;
1314 
1315  // special Modules with Cuts
1316  //if (ModuleNcp<35 || ModuleNcp>62) continue; if (ModuleNcp>37 && ModuleNcp<60) continue;
1317 
1318  // Saddle Supports
1319  //if (ModuleNcp<39 || ModuleNcp>58) continue; if (ModuleNcp>42 && ModuleNcp<55) continue;
1320 
1321  if (m_log->level()<=MSG::DEBUG)
1322  (*m_log) << MSG::DEBUG <<" ModuleNcp= "<< ModuleNcp <<" ModType "<< ModType <<" Phi "<< phi << endmsg;
1323 
1324  //
1325  // ------------------- BARREL BLOCKS ------------------------
1326  //
1327 
1328  if ( EnvType == 1 && barrel_flag < 1) { // normal barrel module or module zero
1329 
1330  dbManager->SetCurrentSectionByNumber(ModType);
1331 
1332  thicknessWedgeMother = dbManager->TILBdzmodul() * Gaudi::Units::cm;
1333  heightWedgeMother = (dbManager->TILBrmaximal() - dbManager->TILBrminimal()) * Gaudi::Units::cm;
1334  dy1WedgeMother = dbManager->TILBrminimal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1335  dy2WedgeMother = dbManager->TILBrmaximal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1336 
1337  dzGlue = (dbManager->TILBdzmodul() - dbManager->TILBdzend1() - dbManager->TILBdzend2()
1338  - (dbManager->TILBnperiod()*2.*(dbManager->TILBdzmast() + dbManager->TILBdzspac())
1339  - dbManager->TILBdzmast()))/(2.*(2.*dbManager->TILBnperiod() - 1));
1340 
1341  GeoTrd* barrelModuleMother = new GeoTrd(thicknessWedgeMother/2,
1342  thicknessWedgeMother/2,
1343  dy1WedgeMother,
1344  dy2WedgeMother,
1345  heightWedgeMother/2);
1346 
1347  GeoLogVol* lvBarrelModuleMother = new GeoLogVol("BarrelModule",barrelModuleMother,matAir);
1348  PVLink pvBarrelModuleMother = new GeoPhysVol(lvBarrelModuleMother);
1349 
1350  // Fill the section
1351  if (Filling) {
1352  sectionBuilder->fillSection(pvBarrelModuleMother, 1,
1353  dbManager->TILBrmaximal(),
1354  dbManager->TILBrminimal(),
1355  dzGlue,
1356  deltaPhi);
1357  }
1358 
1359  GeoTransform* xtraMod = new GeoTransform(GeoTrf::TranslateX3D(
1360  (dbManager->TILBrmaximal() + dbManager->TILBrminimal())/2 * Gaudi::Units::cm));
1361 
1362  pvBarrelMother->add(zrotMod);
1363  pvBarrelMother->add(xtraMod);
1364  pvBarrelMother->add(XYrtMod);
1365 
1366  pvBarrelMother->add(new GeoIdentifierTag(ModuleNcp));
1367  pvBarrelMother->add(pvBarrelModuleMother);
1368 
1369  // --------------------------BARREL FINGERS MAKING----------------------------
1370 
1371  dbManager->SetCurrentTifg(1); // Barrel finger
1372  zEndSection = dbManager->TILBzoffset() + dbManager->TILBdzmodul()/2;
1373 
1374  heightWedgeMother = (dbManager->TILErmax() - dbManager->TILBrmax())*Gaudi::Units::cm;
1375  dy1WedgeMother = dbManager->TILBrmax() * tan(deltaPhi/2*Gaudi::Units::deg)*Gaudi::Units::cm;
1376  dy2WedgeMother = dbManager->TILErmax() * tan(deltaPhi/2*Gaudi::Units::deg)*Gaudi::Units::cm;
1377 
1378  // Finger Positive, positioning (only Left ModFingpattern == 10)
1379  if ( ModFingpattern != 10 ) {
1380  GeoTrd* fingerModuleMotherPos = new GeoTrd(BFingerLengthPos/2,
1381  BFingerLengthPos/2,
1382  dy1WedgeMother,
1383  dy2WedgeMother,
1384  heightWedgeMother/2);
1385 
1386  GeoLogVol* lvFingerModuleMotherPos = new GeoLogVol("FingerModule",fingerModuleMotherPos,matAir);
1387  PVLink pvFingerModuleMotherPos = new GeoPhysVol(lvFingerModuleMotherPos);
1388 
1389  if (Filling)
1390  sectionBuilder->fillFinger(pvFingerModuleMotherPos, 1,
1391  dbManager->TILErmax(),
1392  dbManager->TILBrmax(),
1393  deltaPhi,
1395  ModuleNcp,
1396  BFingerLengthPos*(1./Gaudi::Units::cm));
1397 
1398  GeoTransform* xtraModFingerPos = new GeoTransform(GeoTrf::TranslateX3D((dbManager->TILErmax() + dbManager->TILBrmax())/2*Gaudi::Units::cm));
1399 
1400  //(*m_log) << MSG::DEBUG << "R Index " << ModuleNcp << " Fingpattern "<< ModFingpattern << endmsg;
1401 
1402  pvFingerMotherPos->add(zrotMod);
1403  pvFingerMotherPos->add(xtraModFingerPos);
1404  pvFingerMotherPos->add(XYrtMod);
1405 
1406  pvFingerMotherPos->add(new GeoIdentifierTag(ModuleNcp));
1407  pvFingerMotherPos->add(pvFingerModuleMotherPos);
1408  }
1409 
1410  // Finger Negative, positioning (only Left ModFingpattern == 01)
1411  if ( ModFingpattern != 1 ) {
1412 
1413  GeoTrd* fingerModuleMotherNeg = new GeoTrd(BFingerLengthNeg/2,
1414  BFingerLengthNeg/2,
1415  dy1WedgeMother,
1416  dy2WedgeMother,
1417  heightWedgeMother/2);
1418 
1419  GeoLogVol* lvFingerModuleMotherNeg = new GeoLogVol("FingerModule",fingerModuleMotherNeg,matAir);
1420  PVLink pvFingerModuleMotherNeg = new GeoPhysVol(lvFingerModuleMotherNeg);
1421 
1422  if (Filling)
1423  sectionBuilder->fillFinger(pvFingerModuleMotherNeg, 1,
1424  dbManager->TILErmax(),
1425  dbManager->TILBrmax(),
1426  deltaPhi,
1428  ModuleNcp*100,
1429  BFingerLengthNeg*(1./Gaudi::Units::cm));
1430 
1431  GeoTransform* xtraModFingerNeg = new GeoTransform(GeoTrf::TranslateX3D((dbManager->TILErmax() + dbManager->TILBrmax())/2*Gaudi::Units::cm));
1432 
1433  // (*m_log) << MSG::DEBUG << "L Index " << ModuleNcp << " Fingpattern "<< ModFingpattern << endmsg;
1434 
1435  pvFingerMotherNeg->add(zrotMod);
1436  pvFingerMotherNeg->add(xtraModFingerNeg);
1437  pvFingerMotherNeg->add(yrotMod);
1438 
1439  pvFingerMotherNeg->add(new GeoIdentifierTag(ModuleNcp));
1440  pvFingerMotherNeg->add(pvFingerModuleMotherNeg);
1441  }
1442 
1443  // --------------------------BARREL SADDLE MAKING----------------------------
1444  if (dbManager->BoolSaddle()) {
1445  if ( (ModuleNcp >=40 && ModuleNcp <=41) || (ModuleNcp >=56 && ModuleNcp <=57) ) {
1446  GeoTubs* SaddleModule = new GeoTubs(BFingerRmin-RadiusSaddle,
1447  BFingerRmin,
1448  DzSaddleSupport/2,
1450 
1451  GeoLogVol* lvSaddleModule = new GeoLogVol("SaddleModule",SaddleModule,matIron);
1452  PVLink pvSaddleModule = new GeoPhysVol(lvSaddleModule);
1453 
1454  pvSaddleMotherPos->add(zrotSaddle);
1455  pvSaddleMotherPos->add(new GeoIdentifierTag(ModuleNcp));
1456  pvSaddleMotherPos->add(pvSaddleModule);
1457 
1458  pvSaddleMotherNeg->add(zrotSaddle);
1459  pvSaddleMotherNeg->add(new GeoIdentifierTag(ModuleNcp));
1460  pvSaddleMotherNeg->add(pvSaddleModule);
1461  }
1462  }
1463  }
1464 
1465  //------------------- Extended Barrel Module Positive ----------------------------------------------------------
1466 
1467  if (EnvType == 3 && barrel_flag < 2) {
1468 
1469  dbManager->SetCurrentSectionByNumber(ModType);
1470 
1471  // Mother module
1472  thicknessWedgeMother = dbManager->TILBdzmodul() * Gaudi::Units::cm;
1473  heightWedgeMother = (dbManager->TILBrmaximal() - dbManager->TILBrminimal()) * Gaudi::Units::cm;
1474  dy1WedgeMother = dbManager->TILBrminimal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1475  dy2WedgeMother = dbManager->TILBrmaximal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1476 
1477  dzGlue = (dbManager->TILBdzmodul() - dbManager->TILBdzend1() - dbManager->TILBdzend2()
1478  - dbManager->TILBnperiod()*2.*(dbManager->TILBdzmast() + dbManager->TILBdzspac()))
1479  / (4.* dbManager->TILBnperiod());
1480 
1481  double Radius = (dbManager->TILBrmaximal() + dbManager->TILBrminimal())/2 * Gaudi::Units::cm;
1482 
1483  checking("EBarrelModule (+)", false, 1,
1484  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
1485 
1486  GeoTrd* ebarrelModuleMotherPos = new GeoTrd(thicknessWedgeMother/2,
1487  thicknessWedgeMother/2,
1488  dy1WedgeMother,
1489  dy2WedgeMother,
1490  heightWedgeMother/2);
1491 
1492  if (!dbManager->BoolCuts()) {
1493  if (m_log->level()<=MSG::DEBUG)
1494  (*m_log) << MSG::DEBUG << " BoolCuts NO "<< dbManager->BoolCuts() << endmsg;
1495 
1496  lvEBarrelModuleMotherPos = new GeoLogVol("EBarrelModule",ebarrelModuleMotherPos,matAir);
1497  pvEBarrelModuleMotherPos = new GeoPhysVol(lvEBarrelModuleMotherPos);
1498 
1499  } else {
1500 
1501  //gdb
1502  if (m_log->level()<=MSG::DEBUG)
1503  (*m_log) << MSG::DEBUG << " BoolCuts YES "<< dbManager->BoolCuts() << endmsg;
1504 
1505  double PoZ2 =0, PoZ1 =0, thicknessEndPlate =dbManager->TILBdzend1()*Gaudi::Units::cm;
1506 
1507  PoZ1 = thicknessEndPlate + modl_length/4 - (dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLengthPos)/2;
1508  PoZ2 = PoZ1 + modl_length/4;
1509 
1510  if ((ModuleNcp>=35 && ModuleNcp<=37) || (ModuleNcp>=60 && ModuleNcp<=62)) {
1511  GeoTrf::Transform3D TransCut2 = GeoTrf::TranslateZ3D(-Radius) * GeoTrf::RotateX3D((90-phi)*Gaudi::Units::deg) * GeoTrf::RotateY3D(180*Gaudi::Units::deg)
1512  * GeoTrf::Translate3D(-PoZ2,0.,-PosY);
1513 
1514  if (ModuleNcp>=60 && ModuleNcp<=62) {
1515  GeoTrf::Transform3D TransCutL = GeoTrf::TranslateZ3D(-Radius)
1516  * GeoTrf::RotateY3D(180*Gaudi::Units::deg) * GeoTrf::RotateX3D(phi*Gaudi::Units::deg)
1517  * GeoTrf::Translate3D(PoZ1,PosYcut,-PosXcut);
1518 
1519  // Cuting of module (Left)
1520  const GeoShape& TmL_EBarrelModuleMotherPos = ebarrelModuleMotherPos->subtract((*CutA)<<TransCut2).
1521  subtract((*CutB)<<TransCutL);
1522 
1523  lvEBarrelModuleMotherPos = new GeoLogVol("EBarrelModule",&TmL_EBarrelModuleMotherPos,matAir);
1524 
1525  } else if (ModuleNcp>=35 && ModuleNcp<=37) {
1526  GeoTrf::Transform3D TransCutR = GeoTrf::TranslateZ3D(-Radius)
1527  * GeoTrf::RotateY3D(180*Gaudi::Units::deg) * GeoTrf::RotateX3D(phi*Gaudi::Units::deg)
1528  * GeoTrf::Translate3D(PoZ1,PosYcut,PosXcut) * GeoTrf::RotateY3D(180*Gaudi::Units::deg);
1529 
1530  // Cuting of module (Right)
1531  const GeoShape& TmR_EBarrelModuleMotherPos = ebarrelModuleMotherPos->subtract((*CutA)<<TransCut2).
1532  subtract((*CutB)<<TransCutR);
1533 
1534  lvEBarrelModuleMotherPos = new GeoLogVol("EBarrelModule",&TmR_EBarrelModuleMotherPos,matAir);
1535  }
1536 
1537  pvEBarrelModuleMotherPos = new GeoPhysVol(lvEBarrelModuleMotherPos);
1538 
1539  } else {
1540  lvEBarrelModuleMotherPos = new GeoLogVol("EBarrelModule",ebarrelModuleMotherPos,matAir);
1541  pvEBarrelModuleMotherPos = new GeoPhysVol(lvEBarrelModuleMotherPos);
1542  } // end special modules
1543  } // end if, BoolCuts()
1544 
1545  // Fill the section
1546  if (Filling) {
1547  sectionBuilder->fillSection(pvEBarrelModuleMotherPos, 2,
1548  dbManager->TILBrmaximal(),
1549  dbManager->TILBrminimal(),
1550  dzGlue,
1551  deltaPhi,
1552  ModuleNcp);
1553  }
1554 
1555  GeoTransform* xtraModPos = new GeoTransform(GeoTrf::TranslateX3D(Radius));
1556 
1557  pvEBarrelMotherPos->add(zrotMod);
1558  pvEBarrelMotherPos->add(xtraModPos);
1559  pvEBarrelMotherPos->add(XYrtMod);
1560 
1561  pvEBarrelMotherPos->add(new GeoIdentifierTag(ModuleNcp));
1562  pvEBarrelMotherPos->add(pvEBarrelModuleMotherPos);
1563 
1564  /*
1565  if (!dbManager->BoolCuts()) {
1566  pvEBarrelMotherPos->add(pvEBarrelModuleMotherPos);
1567  (*m_log) << MSG::DEBUG << " BoolCuts NO "<< dbManager->BoolCuts() << endmsg;
1568 
1569  } else {
1570 
1571  (*m_log) << MSG::DEBUG << " BoolCuts YES "<< dbManager->BoolCuts() << endmsg;
1572 
1573  double PoZ2 =0, PoZ1 =0;
1574  double thicknessEndPlate = dbManager->TILBdzend1()*Gaudi::Units::cm;
1575 
1576  PoZ1 = thicknessEndPlate + modl_length/4 - (dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLengthPos)/2;
1577  PoZ2 = modl_length/4 + PoZ1;
1578 
1579  if ((ModuleNcp>=35 && ModuleNcp<=37) || (ModuleNcp>=60 && ModuleNcp<=62)) {
1580  GeoTrf::Transform3D TransCut2 = GeoTrf::TranslateZ3D(-Radius) * GeoTrf::RotateX3D((90-phi)*Gaudi::Units::deg) * GeoTrf::RotateY3D(180*Gaudi::Units::deg)
1581  * GeoTrf::Translate3D(-PoZ2,0.,-PosY);
1582 
1583  // Cuting of pvEBarrelModuleMotherPos (-)
1584  GeoCutVolAction action1(*CutA, TransCut2);
1585  pvEBarrelModuleMotherPos->apply(&action1);
1586  pvTmp_EBarrelModuleMotherPos = action1.getPV();
1587 
1588  if (ModuleNcp>=60 && ModuleNcp<=62) {
1589  GeoTrf::Transform3D TransCutL = GeoTrf::TranslateZ3D(-Radius)
1590  * GeoTrf::RotateY3D(180*Gaudi::Units::deg) * GeoTrf::RotateX3D(phi*Gaudi::Units::deg)
1591  * GeoTrf::Translate3D(PoZ1,PosYcut,-PosXcut);
1592 
1593  // Cuting of pvEBarrelModuleMotherPos (Left)
1594  GeoCutVolAction action2(*CutB, TransCutL);
1595  pvTmp_EBarrelModuleMotherPos->apply(&action2);
1596  pvTmL_EBarrelModuleMotherPos = action2.getPV();
1597 
1598  pvEBarrelMotherPos->add(pvTmL_EBarrelModuleMotherPos);
1599 
1600  } else if (ModuleNcp>=35 && ModuleNcp<=37) {
1601  GeoTrf::Transform3D TransCutR = GeoTrf::TranslateZ3D(-Radius)
1602  * GeoTrf::RotateY3D(180*Gaudi::Units::deg) * GeoTrf::RotateX3D(phi*Gaudi::Units::deg)
1603  * GeoTrf::Translate3D(PoZ1,PosYcut,PosXcut) * GeoTrf::RotateY3D(180*Gaudi::Units::deg);
1604 
1605  // Cuting of pvEBarrelModuleMotherPos (Right)
1606  GeoCutVolAction action3(*CutB, TransCutR);
1607  pvTmp_EBarrelModuleMotherPos->apply(&action3);
1608  pvTmR_EBarrelModuleMotherPos = action3.getPV();
1609 
1610  pvEBarrelMotherPos->add(pvTmR_EBarrelModuleMotherPos);
1611  }
1612  } else {
1613  pvEBarrelMotherPos->add(pvEBarrelModuleMotherPos);
1614  } // end special modules
1615  pvEBarrelMotherPos->add(pvEBarrelModuleMotherPos);
1616  } // end if, BoolCuts()
1617  */
1618 
1619  //--------------------------EBARREL FINGERS MAKING------------------------------
1620 
1621  dbManager->SetCurrentTifg(2); //barrel efinger (small)
1622 
1623  // Trd - one finger mother
1624  thicknessWedgeMother = dbManager->TIFGdz() * Gaudi::Units::cm;
1625  heightWedgeMother = (dbManager->TILErmax() - dbManager->TILBrmax()) * Gaudi::Units::cm;
1626  dy1WedgeMother = dbManager->TILBrmax() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1627  dy2WedgeMother = dbManager->TILErmax() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1628 
1629  checking("EFingerModule (+)", false, 1,
1630  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
1631 
1632  GeoTrd* efingerModuleMother = new GeoTrd(thicknessWedgeMother/2,
1633  thicknessWedgeMother/2,
1634  dy1WedgeMother,
1635  dy2WedgeMother,
1636  heightWedgeMother/2);
1637 
1638  GeoLogVol* lvEFingerModuleMother = new GeoLogVol("EFingerModule",efingerModuleMother,matAir);
1639  PVLink pvEFingerModuleMother = new GeoPhysVol(lvEFingerModuleMother);
1640 
1641  // Fill the section
1642  if (Filling) {
1643  sectionBuilder->fillFinger(pvEFingerModuleMother, 2,
1644  dbManager->TILErmax(),
1645  dbManager->TILBrmax(),
1646  deltaPhi,
1648  ModuleNcp);
1649  }
1650  GeoTransform* xtraModFingerPos = new GeoTransform(GeoTrf::TranslateX3D(
1651  (dbManager->TILErmax() + dbManager->TILBrmax())/2*Gaudi::Units::cm));
1652  pvEFingerMotherPos->add(zrotMod);
1653  pvEFingerMotherPos->add(xtraModFingerPos);
1654  pvEFingerMotherPos->add(XYrtMod);
1655 
1656  pvEFingerMotherPos->add(new GeoIdentifierTag(ModuleNcp));
1657  pvEFingerMotherPos->add(pvEFingerModuleMother);
1658 
1659  // --------------------------BARREL SADDLE MAKING----------------------------
1660  if (dbManager->BoolSaddle()) {
1661  if ( (ModuleNcp >=39 && ModuleNcp <=42) || (ModuleNcp >=55 && ModuleNcp <=58) ) {
1662  GeoTubs* SaddleModule = new GeoTubs(BFingerRmin-RadiusSaddle,
1663  BFingerRmin,
1664  DzSaddleSupport/2,
1666 
1667  GeoLogVol* lvSaddleModule = new GeoLogVol("SaddleModule",SaddleModule,matIron);
1668  PVLink pvSaddleModule = new GeoPhysVol(lvSaddleModule);
1669 
1670  pvESaddleMotherPos->add(zrotSaddle);
1671  pvESaddleMotherPos->add(new GeoIdentifierTag(ModuleNcp));
1672  pvESaddleMotherPos->add(pvSaddleModule);
1673  }
1674  }
1675 
1676  } // end if (EnvType == 3)
1677 
1678  //------------------- Extended Barrel Module Negative ----------------------------------------------------------
1679 
1680  if (EnvType == 2 && barrel_flag < 2) {
1681 
1682  dbManager->SetCurrentSectionByNumber(ModType);
1683 
1684  // Mother module
1685  thicknessWedgeMother = dbManager->TILBdzmodul() * Gaudi::Units::cm;
1686  heightWedgeMother = (dbManager->TILBrmaximal() - dbManager->TILBrminimal()) * Gaudi::Units::cm;
1687  dy1WedgeMother = dbManager->TILBrminimal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1688  dy2WedgeMother = dbManager->TILBrmaximal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1689 
1690  dzGlue = (dbManager->TILBdzmodul() - dbManager->TILBdzend1() - dbManager->TILBdzend2()
1691  - dbManager->TILBnperiod()*2.*(dbManager->TILBdzmast()
1692  + dbManager->TILBdzspac()))/(4.*dbManager->TILBnperiod());
1693 
1694  double Radius = (dbManager->TILBrmaximal() + dbManager->TILBrminimal())/2 * Gaudi::Units::cm;
1695 
1696  checking("EBarrelModule (-)", false, 1,
1697  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
1698 
1699  GeoTrd* ebarrelModuleMotherNeg = new GeoTrd(thicknessWedgeMother/2,
1700  thicknessWedgeMother/2,
1701  dy1WedgeMother,
1702  dy2WedgeMother,
1703  heightWedgeMother/2);
1704 
1705  if (!dbManager->BoolCuts()) {
1706  if (m_log->level()<=MSG::DEBUG)
1707  (*m_log) << MSG::DEBUG << " BoolCuts NO "<< dbManager->BoolCuts() << endmsg;
1708 
1709  lvEBarrelModuleMotherNeg = new GeoLogVol("EBarrelModule",ebarrelModuleMotherNeg,matAir);
1710  pvEBarrelModuleMotherNeg = new GeoPhysVol(lvEBarrelModuleMotherNeg);
1711 
1712  } else {
1713 
1714  //gdb
1715  if (m_log->level()<=MSG::DEBUG)
1716  (*m_log) << MSG::DEBUG << " BoolCuts YES "<< dbManager->BoolCuts() << endmsg;
1717 
1718  double PoZ2 =0, PoZ1 =0, thicknessEndPlate = dbManager->TILBdzend1()*Gaudi::Units::cm;
1719 
1720  PoZ1 = thicknessEndPlate + modl_length/4 - (dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLengthNeg)/2;
1721  PoZ2 = PoZ1 + modl_length/4;
1722 
1723  if ((ModuleNcp>=35 && ModuleNcp<=37) || (ModuleNcp>=60 && ModuleNcp<=62)) {
1724  GeoTrf::Transform3D TransCut2 = GeoTrf::TranslateZ3D(-Radius)
1725  * GeoTrf::RotateX3D((phi-90)*Gaudi::Units::deg) * GeoTrf::RotateY3D(180*Gaudi::Units::deg)
1726  * GeoTrf::Translate3D(-PoZ2,0,-PosY);
1727 
1728  if (ModuleNcp>=60 && ModuleNcp<=62) {
1729  GeoTrf::Transform3D TransCutL = GeoTrf::TranslateZ3D(-Radius)
1730  * GeoTrf::RotateY3D(180*Gaudi::Units::deg) * GeoTrf::RotateX3D(-phi*Gaudi::Units::deg)
1731  * GeoTrf::Translate3D(PoZ1,-PosYcut,-PosXcut);
1732 
1733  // Cuting of module (Left)
1734  const GeoShape& TmL_EBarrelModuleMotherNeg = ebarrelModuleMotherNeg->subtract((*CutA)<<TransCut2).
1735  subtract((*CutB)<<TransCutL);
1736 
1737  lvEBarrelModuleMotherNeg = new GeoLogVol("EBarrelModule",&TmL_EBarrelModuleMotherNeg,matAir);
1738 
1739  } else if (ModuleNcp>=35 && ModuleNcp<=37) {
1740  GeoTrf::Transform3D TransCutR = GeoTrf::TranslateZ3D(-Radius)
1741  * GeoTrf::RotateY3D(180*Gaudi::Units::deg) * GeoTrf::RotateX3D(-phi*Gaudi::Units::deg)
1742  * GeoTrf::Translate3D(PoZ1,-PosYcut,PosXcut) * GeoTrf::RotateY3D(180*Gaudi::Units::deg);
1743 
1744  // Cuting of module (Right)
1745  const GeoShape& TmR_EBarrelModuleMotherNeg = ebarrelModuleMotherNeg->subtract((*CutA)<<TransCut2).
1746  subtract((*CutB)<<TransCutR);
1747 
1748  lvEBarrelModuleMotherNeg = new GeoLogVol("EBarrelModule",&TmR_EBarrelModuleMotherNeg,matAir);
1749  }
1750 
1751  pvEBarrelModuleMotherNeg = new GeoPhysVol(lvEBarrelModuleMotherNeg);
1752 
1753  } else {
1754  lvEBarrelModuleMotherNeg = new GeoLogVol("EBarrelModule",ebarrelModuleMotherNeg,matAir);
1755  pvEBarrelModuleMotherNeg = new GeoPhysVol(lvEBarrelModuleMotherNeg);
1756  } // end special modules
1757  } // end if, BoolCuts()
1758 
1759  // Fill the section
1760  if (Filling) {
1761  sectionBuilder->fillSection(pvEBarrelModuleMotherNeg, 2,
1762  dbManager->TILBrmaximal(),
1763  dbManager->TILBrminimal(),
1764  dzGlue,
1765  deltaPhi,
1766  ModuleNcp,
1767  0.,true);
1768  }
1769 
1770  GeoTransform* xtraModNeg = new GeoTransform(GeoTrf::TranslateX3D(Radius));
1771 
1772  pvEBarrelMotherNeg->add(zrotMod);
1773  pvEBarrelMotherNeg->add(xtraModNeg);
1774  pvEBarrelMotherNeg->add(yrotMod);
1775 
1776  pvEBarrelMotherNeg->add(new GeoIdentifierTag(ModuleNcp));
1777  pvEBarrelMotherNeg->add(pvEBarrelModuleMotherNeg);
1778 
1779  /*
1780  if (!dbManager->BoolCuts()) {
1781  pvEBarrelMotherNeg->add(pvEBarrelModuleMotherNeg);
1782  (*m_log) << MSG::DEBUG << " BoolCuts NO "<< dbManager->BoolCuts() << endmsg;
1783 
1784  } else {
1785  (*m_log) << MSG::DEBUG << " BoolCuts YES "<< dbManager->BoolCuts() << endmsg;
1786 
1787  double PoZ2 =0, PoZ1 =0;
1788  double thicknessEndPlate = dbManager->TILBdzend1()*Gaudi::Units::cm;
1789 
1790  PoZ1 = thicknessEndPlate + modl_length/4 - (dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLengthPos)/2;
1791  PoZ2 = modl_length/4 + PoZ1;
1792 
1793  if ((ModuleNcp>=35 && ModuleNcp<=37) || (ModuleNcp>=60 && ModuleNcp<=62)) {
1794  GeoTrf::Transform3D TransCut2 = GeoTrf::TranslateZ3D(-Radius)
1795  * GeoTrf::RotateX3D((phi-90)*Gaudi::Units::deg) * GeoTrf::RotateY3D(180*Gaudi::Units::deg)
1796  * GeoTrf::Translate3D(-PoZ2,0.,-PosY);
1797 
1798  // Cuting of pvEBarrelModuleMotherNeg (-)
1799  GeoCutVolAction action1(*CutA, TransCut2);
1800  pvEBarrelModuleMotherNeg->apply(&action1);
1801  pvTmp_EBarrelModuleMotherNeg = action1.getPV();
1802 
1803  if (ModuleNcp>=60 && ModuleNcp<=62) {
1804  GeoTrf::Transform3D TransCutL = GeoTrf::TranslateZ3D(-Radius)
1805  * GeoTrf::RotateY3D(180*Gaudi::Units::deg) * GeoTrf::RotateX3D(-phi*Gaudi::Units::deg)
1806  * GeoTrf::Translate3D(PoZ1,-PosYcut,-PosXcut);
1807 
1808  // Cuting of pvEBarrelModuleMotherNeg (Left)
1809  GeoCutVolAction action2(*CutB, TransCutL);
1810  pvTmp_EBarrelModuleMotherNeg->apply(&action2);
1811  pvTmL_EBarrelModuleMotherNeg = action2.getPV();
1812 
1813  pvEBarrelMotherNeg->add(pvTmL_EBarrelModuleMotherNeg);
1814 
1815  } else if (ModuleNcp>=35 && ModuleNcp<=37) {
1816  GeoTrf::Transform3D TransCutR = GeoTrf::TranslateZ3D(-Radius)
1817  * GeoTrf::RotateY3D(180*Gaudi::Units::deg) * GeoTrf::RotateX3D(-phi*Gaudi::Units::deg)
1818  * GeoTrf::Translate3D(PoZ1,-PosYcut,PosXcut) * GeoTrf::RotateY3D(180*Gaudi::Units::deg);
1819 
1820  // Cuting of pvEBarrelModuleMotherNeg (Right)
1821  GeoCutVolAction action3(*CutB, TransCutR);
1822  pvTmp_EBarrelModuleMotherNeg->apply(&action3);
1823  pvTmR_EBarrelModuleMotherNeg = action3.getPV();
1824 
1825  pvEBarrelMotherNeg->add(pvTmR_EBarrelModuleMotherNeg);
1826  }
1827  } else {
1828  pvEBarrelMotherNeg->add(pvEBarrelModuleMotherNeg);
1829  } // end special modules
1830  pvEBarrelMotherNeg->add(pvEBarrelModuleMotherNeg);
1831  } // end if, BoolCuts()
1832  */
1833 
1834  //--------------------------EBARREL FINGERS MAKING------------------------------
1835 
1836  dbManager->SetCurrentTifg(2); //barrel efinger (small)
1837 
1838  //zEndSection = extOffset + dbManager->TILBdzmodul()/2 + dbManager->TILEzshift();
1839 
1840  // Trd - one finger mother
1841  thicknessWedgeMother = dbManager->TIFGdz() * Gaudi::Units::cm;
1842  heightWedgeMother = (dbManager->TILErmax() - dbManager->TILBrmax()) * Gaudi::Units::cm;
1843  dy1WedgeMother = dbManager->TILBrmax() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1844  dy2WedgeMother = dbManager->TILErmax() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1845 
1846  checking("EFingerModule (-)", false, 1,
1847  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
1848 
1849  GeoTrd* efingerModuleMother = new GeoTrd(thicknessWedgeMother/2,
1850  thicknessWedgeMother/2,
1851  dy1WedgeMother,
1852  dy2WedgeMother,
1853  heightWedgeMother/2);
1854 
1855  GeoLogVol* lvEFingerModuleMother = new GeoLogVol("EFingerModule",efingerModuleMother,matAir);
1856  PVLink pvEFingerModuleMother = new GeoPhysVol(lvEFingerModuleMother);
1857 
1858  // Fill the section
1859  if (Filling) {
1860  sectionBuilder->fillFinger(pvEFingerModuleMother, 2,
1861  dbManager->TILErmax(),
1862  dbManager->TILBrmax(),
1863  deltaPhi,
1865  ModuleNcp*100);
1866  }
1867  GeoTransform* xtraModFingerNeg = new GeoTransform(GeoTrf::TranslateX3D(
1868  (dbManager->TILErmax() + dbManager->TILBrmax())/2*Gaudi::Units::cm));
1869  pvEFingerMotherNeg->add(zrotMod);
1870  pvEFingerMotherNeg->add(xtraModFingerNeg);
1871  pvEFingerMotherNeg->add(yrotMod);
1872 
1873  pvEFingerMotherNeg->add(new GeoIdentifierTag(ModuleNcp));
1874  pvEFingerMotherNeg->add(pvEFingerModuleMother);
1875 
1876  // --------------------------BARREL SADDLE MAKING----------------------------
1877  if (dbManager->BoolSaddle()) {
1878  if ( (ModuleNcp >=39 && ModuleNcp <=42) || (ModuleNcp >=55 && ModuleNcp <=58) ) {
1879  GeoTubs* SaddleModule = new GeoTubs(BFingerRmin-RadiusSaddle,
1880  BFingerRmin,
1881  DzSaddleSupport/2,
1883 
1884  GeoLogVol* lvSaddleModule = new GeoLogVol("SaddleModule",SaddleModule,matIron);
1885  PVLink pvSaddleModule = new GeoPhysVol(lvSaddleModule);
1886 
1887  pvESaddleMotherNeg->add(zrotSaddle);
1888  pvESaddleMotherNeg->add(new GeoIdentifierTag(ModuleNcp));
1889  pvESaddleMotherNeg->add(pvSaddleModule);
1890  }
1891  }
1892 
1893  } // end if (EnvType == 2)
1894 
1895  //------------------- D4/C10/Gap/Crack
1896 
1897  if (((EnvType == 4) || (EnvType == 5)) && barrel_flag < 5) {
1898 
1899  int Id4 = ModType%100;
1900  int Ic10 = (ModType/100)%100;
1901  int Igap = (ModType/10000)%100;
1902  int Icrack = (ModType/1000000)%100;
1903 
1904  bool Ifd4 = ( Id4 != 0);
1905  bool Ifc10 = ( Ic10 != 0);
1906  bool Ifgap = ( Igap != 0);
1907  bool Ifcrack = ( Icrack != 0);
1908 
1909  bool Ifspecialgirder = (Id4 == 7);
1910 
1911  if (m_log->level()<=MSG::DEBUG)
1912  (*m_log) << MSG::DEBUG <<" ITC : EnvType "<<EnvType<<" Size = "<<dbManager->GetModTypeSize()
1913  <<" Ncp= "<<ModuleNcp<<" D4 "<<Id4<<" specialflag = "<<Ifspecialgirder<<" C10 "<<Ic10<<" Gap "<<Igap<<" Crack "<<Icrack
1914  << endmsg;
1915 
1916  if (Ifc10) {
1917  dbManager->SetCurrentSectionByNumber(Ic10); // TILE_PLUG2
1918  rMinITC2 = dbManager->TILBrminimal();
1919  rMaxITC2 = dbManager->TILBrmaximal();
1920  dzITC2 = dbManager->TILBdzmodul();
1921  } else {
1922  if (m_log->level()<=MSG::DEBUG)
1923  (*m_log) << MSG::DEBUG <<" C10 unavailable "<<endmsg;
1924  }
1925 
1926  if (Ifd4) {
1927  dbManager->SetCurrentSectionByNumber(Id4); // TILE_PLUG1
1928  rMinITC1 = dbManager->TILBrminimal();
1929  rMaxITC1 = dbManager->TILBrmaximal();
1930  dzITC1 = dbManager->TILBdzmodul();
1931  if (Ifspecialgirder) {
1932  if (m_log->level()<=MSG::DEBUG)
1933  (*m_log) << MSG::DEBUG <<" dzITC1 changed from "<<dzITC1<<" to "<<dbManager->TILBdzgir()<<endmsg;
1934  dzITC1 = dbManager->TILBdzgir();
1935  }
1936  } else {
1937  (*m_log) << MSG::INFO <<" D4 unavailable "<<endmsg;
1938  dzITC1 = 9.485; //sb [Gaudi::Units::cm]
1939  }
1940 
1941  bool specialC10 = (Ifd4 && Ifc10 && rMaxITC2 < rMinITC1);
1942  if (specialC10) {
1943  rMaxITC2 = rMinITC1; // for special C10 make outer radius equal to inner radius of D4
1944  }
1945 
1946  //------------------- ITC BLOCKS Negative --------------------------------
1947  if (EnvType == 4) {
1948 
1949  // Common mother for ITC1/2 modules
1950  if ((Ifd4 || Ifc10) && pvITCMotherNeg) {
1951 
1952  // The first sub shape
1953  thicknessWedgeMother = dzITC1 * Gaudi::Units::cm;
1954  heightWedgeMother = (rMaxITC1 - rMinITC1) * Gaudi::Units::cm;
1955  dy1WedgeMother = rMinITC1 * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1956  dy2WedgeMother = rMaxITC1 * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1957 
1958  checking("ITCModule tcModuleSub1Neg (-) ", false, 1,
1959  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
1960 
1961  GeoTrd* itcModuleSub1Neg = new GeoTrd(thicknessWedgeMother/2,
1962  thicknessWedgeMother/2,
1963  dy1WedgeMother,
1964  dy2WedgeMother,
1965  heightWedgeMother/2);
1966  // The second sub shape
1967  thicknessWedgeMother = dzITC2 * Gaudi::Units::cm;
1968  heightWedgeMother = (rMaxITC2 - rMinITC2) * Gaudi::Units::cm;
1969  dy1WedgeMother = rMinITC2 * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1970  dy2WedgeMother = rMaxITC2 * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
1971 
1972  checking("ITCModule itcModuleSub2Neg (-)", false, 1,
1973  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
1974 
1975  GeoTrd* itcModuleSub2Neg = new GeoTrd(thicknessWedgeMother/2,
1976  thicknessWedgeMother/2,
1977  dy1WedgeMother,
1978  dy2WedgeMother,
1979  heightWedgeMother/2 );
1980 
1981  X = (dzITC1 - dzITC2)/2*Gaudi::Units::cm;
1982  Z = ((rMinITC2+rMaxITC2)-(rMaxITC1 + rMinITC1))/2*Gaudi::Units::cm;
1983  if (m_log->level()<=MSG::DEBUG)
1984  (*m_log) << MSG::DEBUG <<" ITCModule Negative, position X= "<<X<<" Z= "<<Z<< endmsg;
1985 
1986  GeoTrf::Translate3D itcModule_SubShiftNeg(X, 0., Z);
1987  const GeoShapeUnion& itcModuleMotherNeg = itcModuleSub1Neg->add(*itcModuleSub2Neg<<itcModule_SubShiftNeg);
1988 
1989  GeoTrf::Translate3D itcModuleSubShiftNeg(X, 0., Z);
1990 
1991  GeoLogVol* lvITCModuleMotherNeg = new GeoLogVol("ITCModule",&itcModuleMotherNeg,matAir);
1992  PVLink pvITCModuleMotherNeg = new GeoPhysVol(lvITCModuleMotherNeg);
1993 
1994  //Mother volume for ITC1
1995  //In plug1 it's necessary to produce GeoShapeUnion for mother volume that is composed by two parts:
1996  // 1. Mother for absorber and girder
1997  // 2. Mother for frontplate (since it's short)
1998 
1999  // The D4, PLUG1
2000  dbManager->SetCurrentSectionByNumber(Id4);
2001 
2002  thicknessWedgeMother = dzITC1 * Gaudi::Units::cm;
2003  heightWedgeMother = (rMaxITC1 - dbManager->TILBrmin()) * Gaudi::Units::cm;
2004  dy1WedgeMother = dbManager->TILBrmin() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2005  dy2WedgeMother = rMaxITC1 * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2006  // ps changes dzITC1 -> dzmodul
2007  Glue = dbManager->TILBdzmodul() - dbManager->TILBdzend1() - dbManager->TILBdzend2();
2008  NbPeriod = dbManager->TILBnperiod();
2009 
2010  if (m_log->level()<=MSG::DEBUG)
2011  (*m_log) << MSG::DEBUG <<" Plug1Module : Glue= "<<Glue<<" dzITC1= "<<dzITC1
2012  <<" TILBdzend1= "<<dbManager->TILBdzend1()
2013  <<" TILBdzend2= "<<dbManager->TILBdzend2()
2014  <<endmsg;
2015 
2016  if (NbPeriod > 6) {
2017  dzGlue = (Glue - 2*NbPeriod * (dbManager->TILBdzmast() + dbManager->TILBdzspac())) / (4.*NbPeriod);
2018  } else {
2019  dzGlue = (Glue - (2*(NbPeriod-1) * (dbManager->TILBdzmast() + dbManager->TILBdzspac()) + dbManager->TILBdzspac())) / (4.*(NbPeriod-1));
2020  }
2021 
2022  if (m_log->level()<=MSG::DEBUG)
2023  (*m_log) << MSG::DEBUG <<" Plug1Module : Glue= "<<Glue<<" dzGlue= "<<dzGlue<<" NbPeriod= "<<NbPeriod
2024  <<" TILBdzmast= "<<dbManager->TILBdzmast()<<" TILBdzspac= "<<dbManager->TILBdzspac()
2025  <<endmsg;
2026 
2027  if (dzGlue <= 0.) {
2028  (*m_log) << MSG::WARNING <<" Plug1Module warning: "<<" dzGlue= "<<dzGlue
2029  <<endmsg;
2030  }
2031 
2032  checking("Plug1Module plug1SubMotherNeg (-)", false, 2,
2033  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
2034 
2035  GeoTrd* plug1SubMotherNeg = new GeoTrd(thicknessWedgeMother/2,
2036  thicknessWedgeMother/2,
2037  dy1WedgeMother,
2038  dy2WedgeMother,
2039  heightWedgeMother/2);
2040  //Second submother for frontplate
2041  double dzITC2Bis = (specialC10) ? 0.0 : dzITC2; // for special C10 D4 and C10 do not overlap
2042  thicknessWedgeMother = (dbManager->TILBdzmodul() - dzITC2Bis) * Gaudi::Units::cm;
2043  if (m_log->level()<=MSG::DEBUG)
2044  if (specialC10)
2045  (*m_log) << MSG::DEBUG <<" Separate C10 and D4 in module " << ModuleNcp << endmsg;
2046 
2047  GeoLogVol *lvPlug1ModuleMotherNeg=0;
2048  if (thicknessWedgeMother > rless) {
2049  heightWedgeMother = (dbManager->TILBrmin() - dbManager->TILBrminimal()) * Gaudi::Units::cm;
2050  dy1WedgeMother = dbManager->TILBrminimal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2051  dy2WedgeMother = dbManager->TILBrmin() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2052 
2053  checking("Plug1Module plug2SubMotherNeg (-)", false, 2,
2054  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
2055 
2056  GeoTrd* plug2SubMotherNeg = new GeoTrd(thicknessWedgeMother/2,
2057  thicknessWedgeMother/2,
2058  dy1WedgeMother,
2059  dy2WedgeMother,
2060  heightWedgeMother/2);
2061 
2062  GeoTrf::Translate3D plug1SubOffsetNeg(-dzITC2Bis*Gaudi::Units::cm/2, 0.,
2063  (dbManager->TILBrminimal()-dbManager->TILBrmaximal())*Gaudi::Units::cm/2);
2064 
2065  const GeoShapeUnion& plug1ModuleMotherNeg =
2066  plug1SubMotherNeg->add(*plug2SubMotherNeg<<plug1SubOffsetNeg);
2067 
2068  lvPlug1ModuleMotherNeg = new GeoLogVol("Plug1Module",&plug1ModuleMotherNeg,matAir);
2069  } else {
2070  lvPlug1ModuleMotherNeg = new GeoLogVol("Plug1Module",plug1SubMotherNeg,matAir);
2071  }
2072 
2073  PVLink pvPlug1ModuleMotherNeg = new GeoPhysVol(lvPlug1ModuleMotherNeg);
2074 
2075  // Fill the section
2076  if (Filling) {
2077  sectionBuilder->fillSection(pvPlug1ModuleMotherNeg, 3,
2078  dbManager->TILBrmaximal(),
2079  (thicknessWedgeMother > rless) ? dbManager->TILBrminimal() : dbManager->TILBrmin(),
2080  dzGlue,
2081  deltaPhi,
2082  ModuleNcp,
2083  dzITC2Bis);
2084  }
2085 
2086  Z = (dbManager->TILBrmin()-dbManager->TILBrminimal())*Gaudi::Units::cm/2;
2087  GeoTransform* tfPlug1ModuleMotherNeg = new GeoTransform(GeoTrf::Translate3D(0.,0.,Z));
2088 
2089  pvITCModuleMotherNeg->add(tfPlug1ModuleMotherNeg);
2090  pvITCModuleMotherNeg->add(pvPlug1ModuleMotherNeg);
2091 
2092  //Mother volume for ITC2
2093  if (Ifc10) {
2094 
2095  // TILE_PLUG2
2096  dbManager->SetCurrentSectionByNumber(Ic10);
2097 
2098  thicknessWedgeMother = dbManager->TILBdzmodul() * Gaudi::Units::cm;
2099  heightWedgeMother = (dbManager->TILBrmaximal() - dbManager->TILBrminimal()) * Gaudi::Units::cm;
2100  dy1WedgeMother = dbManager->TILBrminimal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2101  dy2WedgeMother = dbManager->TILBrmaximal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2102 
2103  if (dbManager->TILBnperiod() > 1) {
2104  dzGlue = (dbManager->TILBdzmodul() - dbManager->TILBdzend1() - dbManager->TILBdzend2()
2105  - ((dbManager->TILBnperiod()-1)*2*(dbManager->TILBdzmast() + dbManager->TILBdzspac())
2106  + dbManager->TILBdzspac()))/(4.*(dbManager->TILBnperiod() - 1));
2107  } else {
2108  dzGlue = 0; // add for special missing C10 modules
2109  }
2110 
2111  checking("Plug2Module (-)", false, 2,
2112  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
2113 
2114  GeoTrd* plug2ModuleMotherNeg = new GeoTrd(thicknessWedgeMother/2,
2115  thicknessWedgeMother/2,
2116  dy1WedgeMother,
2117  dy2WedgeMother,
2118  heightWedgeMother/2);
2119 
2120  GeoLogVol* lvPlug2ModuleMotherNeg = new GeoLogVol("Plug2Module",plug2ModuleMotherNeg,matAir);
2121  PVLink pvPlug2ModuleMotherNeg = new GeoPhysVol(lvPlug2ModuleMotherNeg);
2122 
2123  // Fill the section
2124  if (Filling) {
2125  sectionBuilder->fillSection(pvPlug2ModuleMotherNeg, Ic10,
2126  dbManager->TILBrmaximal(),
2127  dbManager->TILBrminimal(),
2128  dzGlue,
2129  deltaPhi);
2130  }
2131 
2132  // TILE_PLUG1, D4
2133  if (Ifd4) {
2134  dbManager->SetCurrentSectionByNumber(Id4);
2135 
2136  GeoTransform* tfPlug2ModuleMotherNeg = new GeoTransform(itcModuleSubShiftNeg);
2137 
2138  pvITCModuleMotherNeg->add(tfPlug2ModuleMotherNeg);
2139  pvITCModuleMotherNeg->add(pvPlug2ModuleMotherNeg);
2140  }
2141  }//if C10
2142 
2143  double zShift = 0;
2144  NbPeriod = dbManager->TILBnperiod();
2145  // Z = (dbManager->TILBdzmodul()-dzITC2)/2*Gaudi::Units::cm;
2146  // ps Zshift calculated from length of volumes rather than modules (account for special modules)
2147  //
2148  Z = (dzITC1 - dzITC2)/2*Gaudi::Units::cm;
2149 
2150  if (NbPeriod == 6 && !Ifspecialgirder && std::abs(Z) < std::abs(zITCStandard)) zShift = zITCStandard*(1./Gaudi::Units::cm);
2151 
2152  if (m_log->level()<=MSG::DEBUG)
2153  (*m_log) << MSG::DEBUG <<" ITCModule Negative, position X= "<<X<<" Z= "<<Z
2154  <<" zStandard= "<<zITCStandard<< " zShift= " <<zShift
2155  <<endmsg;
2156 
2157  GeoTransform* xtraITCNeg = new GeoTransform(GeoTrf::TranslateX3D(
2158  (dbManager->TILBrmaximal() + dbManager->TILBrminimal())/2*Gaudi::Units::cm));
2159  GeoTransform* ztraITCNeg = new GeoTransform(GeoTrf::TranslateZ3D(zShift*Gaudi::Units::cm));
2160 
2161  pvITCMotherNeg->add(zrotMod);
2162  pvITCMotherNeg->add(xtraITCNeg);
2163  pvITCMotherNeg->add(ztraITCNeg);
2164  pvITCMotherNeg->add(yrotMod);
2165 
2166  pvITCMotherNeg->add(new GeoIdentifierTag(ModuleNcp));
2167  pvITCMotherNeg->add(pvITCModuleMotherNeg);
2168 
2169  }//if (Ifd4 || Ifc10)
2170 
2171  //-------------------------- G A P Negative ---------------------------------
2172  if (Ifgap && pvGapMotherNeg) {
2173 
2174  // TILE_PLUG3
2175  dbManager->SetCurrentSectionByNumber(Igap);
2176 
2177  // Trd - module mother
2178  thicknessWedgeMother = dbManager->TILBdzmodul() * Gaudi::Units::cm;
2179  heightWedgeMother = (dbManager->TILBrmaximal() - dbManager->TILBrminimal()) * Gaudi::Units::cm;
2180  dy1WedgeMother = dbManager->TILBrminimal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2181  dy2WedgeMother = dbManager->TILBrmaximal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2182 
2183  dzGlue = 0.;
2184 
2185  checking("GapModule (-)", false, 2,
2186  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
2187 
2188  GeoTrd* gapModuleMotherNeg = new GeoTrd(thicknessWedgeMother/2,
2189  thicknessWedgeMother/2,
2190  dy1WedgeMother,
2191  dy2WedgeMother,
2192  heightWedgeMother/2);
2193 
2194  GeoLogVol* lvGapModuleMotherNeg = new GeoLogVol("GapModule",gapModuleMotherNeg,matAir);
2195  PVLink pvGapModuleMotherNeg = new GeoPhysVol(lvGapModuleMotherNeg);
2196 
2197  // Fill the section
2198  if (Filling) {
2199  sectionBuilder->fillSection(pvGapModuleMotherNeg, 5, // probably better to have Igap instead of 5
2200  dbManager->TILBrmaximal(),
2201  dbManager->TILBrminimal(),
2202  dzGlue,
2203  deltaPhi);
2204  }
2205 
2206  // Module position inside mother
2207  GeoTransform* xtraGapNeg = new GeoTransform(GeoTrf::TranslateX3D(
2208  (dbManager->TILBrmaximal() + dbManager->TILBrminimal())/2*Gaudi::Units::cm));
2209  pvGapMotherNeg->add(zrotMod);
2210  pvGapMotherNeg->add(xtraGapNeg);
2211  pvGapMotherNeg->add(yrotMod);
2212 
2213  pvGapMotherNeg->add(new GeoIdentifierTag(ModuleNcp));
2214  pvGapMotherNeg->add(pvGapModuleMotherNeg);
2215  }
2216 
2217  //-------------------------- Crack Negative ---------------------------------
2218  if (Ifcrack && pvCrackMotherNeg) {
2219 
2220  // TILE_PLUG4
2221  dbManager->SetCurrentSectionByNumber(Icrack);
2222 
2223  // mother
2224  thicknessWedgeMother = dbManager->TILBdzmodul() * Gaudi::Units::cm;
2225  heightWedgeMother = (dbManager->TILBrmaximal() - dbManager->TILBrminimal()) * Gaudi::Units::cm;
2226  dy1WedgeMother = dbManager->TILBrminimal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2227  dy2WedgeMother = dbManager->TILBrmaximal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2228 
2229  dzGlue = 0.;
2230 
2231  checking("CrackModule (-)", spE4, 2,
2232  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
2233 
2234  GeoTrd* crackModuleMotherNeg = new GeoTrd(thicknessWedgeMother/2,
2235  thicknessWedgeMother/2,
2236  dy1WedgeMother,
2237  dy2WedgeMother,
2238  heightWedgeMother/2);
2239 
2240  GeoLogVol* lvCrackModuleMotherNeg = new GeoLogVol("CrackModule",crackModuleMotherNeg,matAir);
2241  PVLink pvCrackModuleMotherNeg = new GeoPhysVol(lvCrackModuleMotherNeg);
2242 
2243  // Fill the section
2244  if (Filling) {
2245  sectionBuilder->fillSection(pvCrackModuleMotherNeg, 6,
2246  dbManager->TILBrmaximal(),
2247  dbManager->TILBrminimal(),
2248  dzGlue,
2249  deltaPhi);
2250  }
2251  // Module position inside mother
2252  GeoTransform* xtraCrackNeg = new GeoTransform(GeoTrf::TranslateX3D(
2253  (dbManager->TILBrmaximal() + dbManager->TILBrminimal())/2*Gaudi::Units::cm));
2254  pvCrackMotherNeg->add(zrotMod);
2255  pvCrackMotherNeg->add(xtraCrackNeg);
2256  pvCrackMotherNeg->add(yrotMod);
2257 
2258  pvCrackMotherNeg->add(new GeoIdentifierTag(ModuleNcp));
2259  pvCrackMotherNeg->add(pvCrackModuleMotherNeg);
2260 
2261  }
2262  }
2263 
2264  //-------------------------------------- ITC BLOCKS Positive --------------------------------------
2265  if (EnvType == 5) {
2266 
2267  // Common mother for ITC1/2 modules
2268  if ((Ifd4 || Ifc10) && pvITCMotherPos) {
2269 
2270  // The first sub shape
2271  thicknessWedgeMother = dzITC1 * Gaudi::Units::cm;
2272  heightWedgeMother = (rMaxITC1 - rMinITC1) * Gaudi::Units::cm;
2273  dy1WedgeMother = rMinITC1 * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2274  dy2WedgeMother = rMaxITC1 * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2275 
2276  checking("ITCModule itcModuleSub2Pos (+)", false, 1,
2277  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
2278 
2279  GeoTrd* itcModuleSub1Pos = new GeoTrd(thicknessWedgeMother/2,
2280  thicknessWedgeMother/2,
2281  dy1WedgeMother ,
2282  dy2WedgeMother ,
2283  heightWedgeMother/2 );
2284  // The second sub shape
2285  thicknessWedgeMother = dzITC2 * Gaudi::Units::cm;
2286  heightWedgeMother = (rMaxITC2 - rMinITC2) * Gaudi::Units::cm;
2287  dy1WedgeMother = rMinITC2 * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2288  dy2WedgeMother = rMaxITC2 * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2289 
2290  checking("ITCModule itcModuleSub2Pos (+)", false, 1,
2291  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
2292 
2293  GeoTrd* itcModuleSub2Pos = new GeoTrd(thicknessWedgeMother/2,
2294  thicknessWedgeMother/2,
2295  dy1WedgeMother ,
2296  dy2WedgeMother ,
2297  heightWedgeMother/2 );
2298 
2299  X = (dzITC1 - dzITC2)/2*Gaudi::Units::cm;
2300  Z = ((rMinITC2+rMaxITC2)-(rMaxITC1 + rMinITC1))/2*Gaudi::Units::cm;
2301  if (m_log->level()<=MSG::DEBUG)
2302  (*m_log) << MSG::DEBUG <<" ITCModule Positive, position X= "<<X<<" Z= "<<Z<< endmsg;
2303 
2304  GeoTrf::Translate3D itcModule_SubShiftPos(X, 0., Z);
2305  const GeoShapeUnion& itcModuleMotherPos = itcModuleSub1Pos->add(*itcModuleSub2Pos<<itcModule_SubShiftPos);
2306 
2307  GeoTrf::Translate3D itcModuleSubShiftPos(X, 0., Z);
2308 
2309  GeoLogVol* lvITCModuleMotherPos = new GeoLogVol("ITCModule",&itcModuleMotherPos,matAir);
2310  PVLink pvITCModuleMotherPos = new GeoPhysVol(lvITCModuleMotherPos);
2311 
2312  // Mother volume for ITC1
2313  // In plug1 it's necessary to produce GeoShapeUnion for mother volume that is composed by two parts:
2314  // 1. Mother for absorber and girder
2315  // 2. Mother for frontplate (since it's short)
2316 
2317  // The D4, PLUG1
2318  dbManager->SetCurrentSectionByNumber(Id4);
2319 
2320  thicknessWedgeMother = dzITC1 * Gaudi::Units::cm;
2321  dy1WedgeMother = dbManager->TILBrmin() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2322  dy2WedgeMother = rMaxITC1 * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2323  heightWedgeMother = (rMaxITC1 - dbManager->TILBrmin()) * Gaudi::Units::cm;
2324 
2325  // ps changes dzITC1 -> dzmodul
2326  Glue = dbManager->TILBdzmodul() - dbManager->TILBdzend1() - dbManager->TILBdzend2();
2327  NbPeriod = dbManager->TILBnperiod();
2328 
2329  if (m_log->level()<=MSG::DEBUG)
2330  (*m_log) << MSG::DEBUG <<" Plug1Module : Glue= "<<Glue<<" dzITC1= "<<dzITC1
2331  <<" TILBdzend1= "<<dbManager->TILBdzend1()
2332  <<" TILBdzend2= "<<dbManager->TILBdzend2()
2333  <<endmsg;
2334 
2335  if (NbPeriod > 6) {
2336  dzGlue = (Glue - 2*NbPeriod * (dbManager->TILBdzmast() + dbManager->TILBdzspac())) / (4.*NbPeriod);
2337  } else {
2338  dzGlue = (Glue - (2*(NbPeriod-1) * (dbManager->TILBdzmast() + dbManager->TILBdzspac())
2339  + dbManager->TILBdzspac())) / (4.*(NbPeriod-1));
2340  }
2341 
2342  if (m_log->level()<=MSG::DEBUG)
2343  (*m_log) << MSG::DEBUG <<" Plug1Module : Glue= "<<Glue<<" dzGlue= "<<dzGlue<<" NbPeriod= "<<NbPeriod
2344  <<" TILBdzmast= "<<dbManager->TILBdzmast()<<" TILBdzspac= "<<dbManager->TILBdzspac()
2345  <<endmsg;
2346 
2347  if (dzGlue <= 0.) {
2348  (*m_log) << MSG::WARNING <<" Plug1Module warning: "<<" dzGlue= "<<dzGlue
2349  <<endmsg;
2350  }
2351 
2352  checking("Plug1Module plug1SubMotherPos (+)", false, 2,
2353  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
2354 
2355  GeoTrd* plug1SubMotherPos = new GeoTrd(thicknessWedgeMother/2,
2356  thicknessWedgeMother/2,
2357  dy1WedgeMother ,
2358  dy2WedgeMother ,
2359  heightWedgeMother/2 );
2360 
2361  //Second submother C10, PLUG2
2362  double dzITC2Bis = (specialC10) ? 0.0 : dzITC2; // for special C10 D4 and C10 do not overlap
2363  thicknessWedgeMother = (dbManager->TILBdzmodul() - dzITC2Bis) * Gaudi::Units::cm;
2364  if (m_log->level()<=MSG::DEBUG)
2365  if (specialC10)
2366  (*m_log) << MSG::DEBUG <<" Separate C10 and D4 in module " << ModuleNcp << endmsg;
2367 
2368  GeoLogVol *lvPlug1ModuleMotherPos=0;
2369  if (thicknessWedgeMother > rless) {
2370  heightWedgeMother = (dbManager->TILBrmin() - dbManager->TILBrminimal()) * Gaudi::Units::cm;
2371  dy1WedgeMother = dbManager->TILBrminimal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2372  dy2WedgeMother = dbManager->TILBrmin() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2373 
2374  checking("Plug1Module plug2SubMotherPos (+)", false, 2,
2375  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
2376 
2377  GeoTrd* plug2SubMotherPos = new GeoTrd(thicknessWedgeMother/2,
2378  thicknessWedgeMother/2,
2379  dy1WedgeMother ,
2380  dy2WedgeMother ,
2381  heightWedgeMother/2 );
2382 
2383  GeoTrf::Translate3D plug1SubOffsetPos(-dzITC2Bis/2*Gaudi::Units::cm, 0.,
2384  (dbManager->TILBrminimal()-dbManager->TILBrmaximal())/2*Gaudi::Units::cm);
2385 
2386  const GeoShapeUnion& plug1ModuleMotherPos = plug1SubMotherPos->add(*plug2SubMotherPos<<plug1SubOffsetPos);
2387 
2388  lvPlug1ModuleMotherPos = new GeoLogVol("Plug1Module",&plug1ModuleMotherPos,matAir);
2389  } else {
2390  lvPlug1ModuleMotherPos = new GeoLogVol("Plug1Module",plug1SubMotherPos,matAir);
2391  }
2392 
2393  PVLink pvPlug1ModuleMotherPos = new GeoPhysVol(lvPlug1ModuleMotherPos);
2394 
2395  // Fill the section
2396  if (Filling) {
2397  sectionBuilder->fillSection(pvPlug1ModuleMotherPos, 3,
2398  dbManager->TILBrmaximal(),
2399  (thicknessWedgeMother > rless) ? dbManager->TILBrminimal() : dbManager->TILBrmin(),
2400  dzGlue,
2401  deltaPhi,
2402  ModuleNcp,
2403  dzITC2Bis);
2404  }
2405 
2406  Z = (dbManager->TILBrmin()-dbManager->TILBrminimal())*Gaudi::Units::cm/2;
2407  GeoTransform* tfPlug1ModuleMotherPos = new GeoTransform(GeoTrf::Translate3D(0.,0.,Z));
2408 
2409  pvITCModuleMotherPos->add(tfPlug1ModuleMotherPos);
2410  pvITCModuleMotherPos->add(pvPlug1ModuleMotherPos);
2411 
2412  //Mother volume for ITC2 Positive
2413  if (Ifc10) {
2414 
2415  // TILE_PLUG2, C10
2416  dbManager->SetCurrentSectionByNumber(Ic10);
2417 
2418  thicknessWedgeMother = dzITC2 * Gaudi::Units::cm;
2419  heightWedgeMother = (rMaxITC2 - rMinITC2) * Gaudi::Units::cm;
2420  dy1WedgeMother = rMinITC2 * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2421  dy2WedgeMother = rMaxITC2 * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2422 
2423  if (dbManager->TILBnperiod() > 1) {
2424  dzGlue = (dzITC2 - dbManager->TILBdzend1() - dbManager->TILBdzend2()
2425  - ((dbManager->TILBnperiod()-1)*2*(dbManager->TILBdzmast()
2426  + dbManager->TILBdzspac()) + dbManager->TILBdzspac()))/(4*(dbManager->TILBnperiod()-1));
2427  } else {
2428  dzGlue = 0; // add for special missing C10 modules
2429  }
2430 
2431  checking("Plug2Module (+)", false, 2,
2432  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
2433 
2434  GeoTrd* plug2ModuleMotherPos = new GeoTrd(thicknessWedgeMother/2,
2435  thicknessWedgeMother/2,
2436  dy1WedgeMother,
2437  dy2WedgeMother,
2438  heightWedgeMother/2);
2439 
2440  GeoLogVol* lvPlug2ModuleMotherPos = new GeoLogVol("Plug2Module",plug2ModuleMotherPos,matAir);
2441  PVLink pvPlug2ModuleMotherPos = new GeoPhysVol(lvPlug2ModuleMotherPos);
2442 
2443  // Fill the section
2444  if (Filling) {
2445  sectionBuilder->fillSection(pvPlug2ModuleMotherPos, Ic10,
2446  dbManager->TILBrmaximal(),
2447  dbManager->TILBrminimal(),
2448  dzGlue,
2449  deltaPhi);
2450  }
2451 
2452  // TILE_PLUG1, D4
2453  if ((Ifd4)) {
2454  dbManager->SetCurrentSectionByNumber(Id4);
2455 
2456  GeoTransform* tfPlug2ModuleMotherPos = new GeoTransform(itcModuleSubShiftPos);
2457 
2458  pvITCModuleMotherPos->add(tfPlug2ModuleMotherPos);
2459  pvITCModuleMotherPos->add(pvPlug2ModuleMotherPos);
2460  }
2461  }//if C10
2462 
2463  double zShift = 0;
2464  NbPeriod = dbManager->TILBnperiod();
2465  //ps Z = (dbManager->TILBdzmodul()-dzITC2)/2*Gaudi::Units::cm;
2466  Z = (dzITC1 - dzITC2)/2*Gaudi::Units::cm;
2467 
2468  if (NbPeriod == 6 && !Ifspecialgirder && std::abs(Z) < std::abs(zITCStandard)) zShift = zITCStandard*(1./Gaudi::Units::cm);
2469 
2470  if (m_log->level()<=MSG::DEBUG)
2471  (*m_log) << MSG::DEBUG <<" ITCModule Positive, position X= "<<X<<" Z= "<<Z
2472  <<" zStandard= "<<zITCStandard<< " zShift= " <<zShift
2473  <<endmsg;
2474 
2475  GeoTransform* xtraITCPos = new GeoTransform(GeoTrf::TranslateX3D(
2476  (dbManager->TILBrmaximal() + dbManager->TILBrminimal())/2*Gaudi::Units::cm));
2477  GeoTransform* ztraITCPos = new GeoTransform(GeoTrf::TranslateZ3D(zShift*Gaudi::Units::cm));
2478 
2479  pvITCMotherPos->add(zrotMod);
2480  pvITCMotherPos->add(xtraITCPos);
2481  pvITCMotherPos->add(ztraITCPos);
2482  pvITCMotherPos->add(XYrtMod);
2483 
2484  pvITCMotherPos->add(new GeoIdentifierTag(ModuleNcp));
2485  pvITCMotherPos->add(pvITCModuleMotherPos);
2486 
2487  }//if (Ifd4 || Ifc10)
2488 
2489 
2490  //-------------------------- G A P Positive ---------------------------------
2491  if (Ifgap && pvGapMotherPos) {
2492 
2493  // TILE_PLUG3
2494  dbManager->SetCurrentSectionByNumber(Igap);
2495 
2496  // Mother
2497  thicknessWedgeMother = dbManager->TILBdzmodul() * Gaudi::Units::cm;
2498  heightWedgeMother = (dbManager->TILBrmaximal() - dbManager->TILBrminimal()) * Gaudi::Units::cm;
2499  dy1WedgeMother = dbManager->TILBrminimal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2500  dy2WedgeMother = dbManager->TILBrmaximal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2501 
2502  dzGlue = 0;
2503 
2504  checking("Plug2Module (+)", false, 2,
2505  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
2506 
2507  GeoTrd* gapModuleMotherPos = new GeoTrd(thicknessWedgeMother/2,
2508  thicknessWedgeMother/2,
2509  dy1WedgeMother,
2510  dy2WedgeMother,
2511  heightWedgeMother/2);
2512 
2513  GeoLogVol* lvGapModuleMotherPos = new GeoLogVol("GapModule",gapModuleMotherPos,matAir);
2514  PVLink pvGapModuleMotherPos = new GeoPhysVol(lvGapModuleMotherPos);
2515 
2516  // Fill the section
2517  if (Filling) {
2518  sectionBuilder->fillSection(pvGapModuleMotherPos, 5,
2519  dbManager->TILBrmaximal(),
2520  dbManager->TILBrminimal(),
2521  dzGlue,
2522  deltaPhi);
2523  }
2524 
2525  // Module position inside mother
2526  GeoTransform* xtraGapPos = new GeoTransform(GeoTrf::TranslateX3D(
2527  (dbManager->TILBrmaximal() + dbManager->TILBrminimal())/2*Gaudi::Units::cm));
2528  pvGapMotherPos->add(zrotMod);
2529  pvGapMotherPos->add(xtraGapPos);
2530  pvGapMotherPos->add(XYrtMod);
2531 
2532  pvGapMotherPos->add(new GeoIdentifierTag(ModuleNcp));
2533  pvGapMotherPos->add(pvGapModuleMotherPos);
2534  }
2535 
2536  //-------------------------- Crack Positive ---------------------------------
2537  if (Ifcrack && pvCrackMotherPos) {
2538 
2539  // TILE_PLUG4
2540  dbManager->SetCurrentSectionByNumber(Icrack);
2541 
2542  // Trd - module mother
2543  thicknessWedgeMother = dbManager->TILBdzmodul() * Gaudi::Units::cm;
2544  heightWedgeMother = (dbManager->TILBrmaximal() - dbManager->TILBrminimal()) * Gaudi::Units::cm;
2545  dy1WedgeMother = dbManager->TILBrminimal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2546  dy2WedgeMother = dbManager->TILBrmaximal() * tan(deltaPhi/2*Gaudi::Units::deg) * Gaudi::Units::cm;
2547 
2548  dzGlue = 0.;
2549 
2550  checking("CrackModule (+)", spE4, 2,
2551  thicknessWedgeMother/2,thicknessWedgeMother/2,dy1WedgeMother,dy2WedgeMother,heightWedgeMother/2);
2552 
2553  GeoTrd* crackModuleMotherPos = new GeoTrd(thicknessWedgeMother/2,
2554  thicknessWedgeMother/2,
2555  dy1WedgeMother,
2556  dy2WedgeMother,
2557  heightWedgeMother/2);
2558 
2559  GeoLogVol* lvCrackModuleMotherPos = new GeoLogVol("CrackModule",crackModuleMotherPos,matAir);
2560  PVLink pvCrackModuleMotherPos = new GeoPhysVol(lvCrackModuleMotherPos);
2561 
2562  // Fill the section
2563  if (Filling) {
2564  sectionBuilder->fillSection(pvCrackModuleMotherPos, 6,
2565  dbManager->TILBrmaximal(),
2566  dbManager->TILBrminimal(),
2567  dzGlue,
2568  deltaPhi);
2569  }
2570 
2571  // Module position inside mother
2572  GeoTransform* xtraCrackPos = new GeoTransform(GeoTrf::TranslateX3D(
2573  (dbManager->TILBrmaximal() + dbManager->TILBrminimal())/2*Gaudi::Units::cm));
2574  pvCrackMotherPos->add(zrotMod);
2575  pvCrackMotherPos->add(xtraCrackPos);
2576  pvCrackMotherPos->add(XYrtMod);
2577 
2578  pvCrackMotherPos->add(new GeoIdentifierTag(ModuleNcp));
2579  pvCrackMotherPos->add(pvCrackModuleMotherPos);
2580 
2581  }
2582  }
2583 
2584  } // if (EnvType == 4 || EnvType == 5)
2585 
2586  }// ModCounter, end
2587 
2588 
2589  }
2590 
2591  //
2592  // Global Envelop positioning, BARREL Positive
2593  //
2594 
2595  //
2596  // ---------------------------------------- BARREL Positive -----------------------------------------------------
2597  //
2598 
2599  double ztrans =0;
2600  dbManager->SetCurrentEnvByType(EnvType);
2601 
2602  if (EnvType == 1 && barrel_flag < 1) {
2603 
2604  GeoTransform* tfBarrelMother;
2605 
2606  // consider 3 options - with/without ext.barrels and take into account DZ correction
2607  ztrans = 0;
2608 
2609  tfBarrelMother = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::RotateZ3D((dbManager->GetEnvDPhi())*Gaudi::Units::deg));
2610 
2611  (*m_log) << MSG::INFO <<" Positioning barrel with translation "<<ztrans*Gaudi::Units::cm<< endmsg;
2612 
2613  GeoNameTag* ntBarrelModuleMother = new GeoNameTag("Barrel");
2614 
2615  pvTileEnvelopeBarrel->add(tfBarrelMother);
2616  pvTileEnvelopeBarrel->add(ntBarrelModuleMother);
2617  pvTileEnvelopeBarrel->add(pvBarrelMother);
2618 
2619  GeoTransform* tfFingerMotherPos;
2620 
2621  ztrans = (dbManager->GetEnvZLength()*Gaudi::Units::cm/2 - BFingerLengthPos/2 + PosDelta)*(1./Gaudi::Units::cm);
2622 
2623  tfFingerMotherPos = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)*GeoTrf::RotateZ3D((dbManager->GetEnvDPhi())*Gaudi::Units::deg));
2624 
2625  (*m_log) << MSG::INFO <<" Positioning positive barrel finger with translation "<<ztrans*Gaudi::Units::cm<< endmsg;
2626 
2627  GeoNameTag* ntFingerMotherPos = new GeoNameTag("TileFingerPos");
2628 
2629  pvTileEnvelopeBarrel->add(tfFingerMotherPos);
2630  pvTileEnvelopeBarrel->add(ntFingerMotherPos);
2631  pvTileEnvelopeBarrel->add(pvFingerMotherPos);
2632 
2633  if (dbManager->BoolSaddle()) {
2634  GeoTransform* tfSaddleMotherPos;
2635 
2636  ztrans = (dbManager->GetEnvZLength()*Gaudi::Units::cm/2 - BFingerLengthPos + DzSaddleSupport/2 + PosDelta)*(1./Gaudi::Units::cm);
2637 
2638  tfSaddleMotherPos = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)*GeoTrf::RotateZ3D((dbManager->GetEnvDPhi())*Gaudi::Units::deg));
2639 
2640  GeoNameTag* ntSaddleMotherPos = new GeoNameTag("TileSaddlePos");
2641 
2642  pvTileEnvelopeBarrel->add(tfSaddleMotherPos);
2643  pvTileEnvelopeBarrel->add(ntSaddleMotherPos);
2644  pvTileEnvelopeBarrel->add(pvSaddleMotherPos);
2645  }
2646 
2647  //*> negative barrel
2648 
2649  GeoTransform* tfFingerMotherNeg;
2650 
2651  ztrans = (-dbManager->GetEnvZLength()*Gaudi::Units::cm/2 + BFingerLengthNeg/2 - NegDelta)*(1./Gaudi::Units::cm);
2652 
2653  tfFingerMotherNeg = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)*GeoTrf::RotateZ3D((dbManager->GetEnvDPhi())*Gaudi::Units::deg));
2654 
2655  (*m_log) << MSG::INFO <<" Positioning negative barrel finger with translation "<<ztrans*Gaudi::Units::cm<< endmsg;
2656 
2657  GeoNameTag* ntFingerMotherNeg = new GeoNameTag("TileFingerNeg");
2658  pvTileEnvelopeBarrel->add(tfFingerMotherNeg);
2659  pvTileEnvelopeBarrel->add(ntFingerMotherNeg);
2660  pvTileEnvelopeBarrel->add(pvFingerMotherNeg);
2661 
2662  if (dbManager->BoolSaddle()) {
2663  GeoTransform* tfSaddleMotherNeg;
2664 
2665  ztrans = (-dbManager->GetEnvZLength()*Gaudi::Units::cm/2 + BFingerLengthNeg - DzSaddleSupport/2 - NegDelta)*(1./Gaudi::Units::cm);
2666 
2667  tfSaddleMotherNeg = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)*GeoTrf::RotateZ3D((dbManager->GetEnvDPhi())*Gaudi::Units::deg));
2668 
2669  GeoNameTag* ntSaddleMotherNeg = new GeoNameTag("TileSaddleNeg");
2670 
2671  pvTileEnvelopeBarrel->add(tfSaddleMotherNeg);
2672  pvTileEnvelopeBarrel->add(ntSaddleMotherNeg);
2673  pvTileEnvelopeBarrel->add(pvSaddleMotherNeg);
2674  }
2675  }
2676 
2677  //
2678  //----------------------------------------- EBarrel Positive -----------------------------------------------------
2679 
2680  if (EnvType == 3 && eb_flag) { // positive ext.barrel is always at positive boundary, after finger
2681 
2683  double thicknessEndPlate = dbManager->TILBdzend1()*Gaudi::Units::cm;
2684 
2685  double PoZ1 = thicknessEndPlate + modl_length/4 - (dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLengthPos)/2;
2686  double PoZ2 = modl_length/4 + PoZ1;
2687 
2688  //--------------------------------------------------------------------------------------------------------------
2689  // CutA in Tile (Positive) (close center)
2690  if (m_fullGeo) {
2691  if (dbManager->BoolCuts() && barrel_flag < 2) {
2692 
2693  // Iron1, down
2694  volname = "Iron1"; dbManager->SetCurrentCuts(volname); //>>
2695  dxIron = dbManager->CutsXpos();
2696  dyIron = dbManager->CutsYpos();
2697  if (m_log->level()<=MSG::DEBUG)
2698  (*m_log) << MSG::DEBUG << " Iron1: " << dxIron << " " << dyIron << endmsg;
2699 
2700  GeoTransform* tfIron1 = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(dxIron,PosY-dyIron,PoZ2)
2701  * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2702  pvEBarrelMotherPos->add(tfIron1);
2703  pvEBarrelMotherPos->add(new GeoIdentifierTag(1));
2704  pvEBarrelMotherPos->add(pvIron1);
2705 
2706  tfIron1 = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(-dxIron,PosY-dyIron,PoZ2)
2707  * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Right
2708  pvEBarrelMotherPos->add(tfIron1);
2709  pvEBarrelMotherPos->add(pvIron1);
2710 
2711  // Iron2, middle
2712  volname = "Iron2"; dbManager->SetCurrentCuts(volname); //>>
2713  dxIron = dbManager->CutsXpos();
2714  dyIron = dbManager->CutsYpos();
2715  if (m_log->level()<=MSG::DEBUG)
2716  (*m_log) << MSG::DEBUG << " Iron2: " << dxIron << " " << dyIron << endmsg;
2717 
2718  GeoTransform* tfIron2 = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(dxIron,PosY+dyIron,PoZ2)
2719  * GeoTrf::RotateZ3D(-84.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2720  pvEBarrelMotherPos->add(tfIron2);
2721  pvEBarrelMotherPos->add(new GeoIdentifierTag(2));
2722  pvEBarrelMotherPos->add(pvIron2);
2723 
2724  tfIron2 = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(-dxIron,PosY+dyIron,PoZ2)
2725  * GeoTrf::RotateZ3D(84.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2726  pvEBarrelMotherPos->add(tfIron2);
2727  pvEBarrelMotherPos->add(pvIron2);
2728 
2729  // Iron3, middle
2730  volname = "Iron3"; dbManager->SetCurrentCuts(volname); //>>
2731  dxIron = dbManager->CutsXpos();
2732  dyIron = dbManager->CutsYpos();
2733  if (m_log->level()<=MSG::DEBUG)
2734  (*m_log) << MSG::DEBUG << " Iron3: " << dxIron << " " << dyIron << endmsg;
2735 
2736  GeoTransform* tfIron3 = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(dxIron,PosY+dyIron,PoZ2)
2737  * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2738  pvEBarrelMotherPos->add(tfIron3);
2739  pvEBarrelMotherPos->add(new GeoIdentifierTag(3));
2740  pvEBarrelMotherPos->add(pvIron3);
2741 
2742  tfIron3 = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(-dxIron,PosY+dyIron,PoZ2)
2743  * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Right
2744  pvEBarrelMotherPos->add(tfIron3);
2745  pvEBarrelMotherPos->add(pvIron3);
2746 
2747  // Heavy Iron Box
2748  volname = "IrBox"; dbManager->SetCurrentCuts(volname); //>>
2749  dxIron = dbManager->CutsXpos();
2750  dyIron = dbManager->CutsYpos();
2751 
2752  GeoTransform* tfIrBoxL = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(dxIron,PosY-dyIron,PoZ2)
2753  * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2754  pvEBarrelMotherPos->add(tfIrBoxL);
2755  pvEBarrelMotherPos->add(new GeoIdentifierTag(4));
2756  pvEBarrelMotherPos->add(pvIrBox);
2757 
2758  GeoTransform* tfIrBoxR = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(-dxIron,PosY-dyIron,PoZ2)
2759  * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Right
2760  pvEBarrelMotherPos->add(tfIrBoxR);
2761  pvEBarrelMotherPos->add(pvIrBox);
2762 
2763  // CutB in Tile (Positive) (outer center)
2764  volname = "IrUp"; dbManager->SetCurrentCuts(volname); //>>
2765  dxIr = dbManager->CutsXpos();
2766  dyIr = dbManager->CutsYpos();
2767  if (m_log->level()<=MSG::DEBUG)
2768  (*m_log) << MSG::DEBUG << " IrUp: " <<dxIr<< " " <<dyIr<< endmsg;
2769 
2770  GeoTransform* tfIrUp = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)
2771  * GeoTrf::Translate3D(PosXcut+dxIr,-PosYcut+dyIr,-PoZ1)
2772  * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2773  pvEBarrelMotherPos->add(tfIrUp);
2774  pvEBarrelMotherPos->add(new GeoIdentifierTag(5));
2775  pvEBarrelMotherPos->add(pvIrUp);
2776 
2777  tfIrUp = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)
2778  * GeoTrf::Translate3D(-PosXcut-dxIr,-PosYcut+dyIr,-PoZ1)
2779  * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Right
2780  pvEBarrelMotherPos->add(tfIrUp);
2781  pvEBarrelMotherPos->add(pvIrUp);
2782 
2783  // CutB in Tile (Positive) (outer center)
2784  volname = "IrDw"; dbManager->SetCurrentCuts(volname); //>>
2785  dxIr = dbManager->CutsXpos();
2786  dyIr = dbManager->CutsYpos();
2787  if (m_log->level()<=MSG::DEBUG)
2788  (*m_log) << MSG::DEBUG << " IrDw: " <<dxIr<< " " <<dyIr<< endmsg;
2789 
2790  GeoTransform* tfIrDw = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)
2791  * GeoTrf::Translate3D(PosXcut+dxIr,-PosYcut+dyIr,-PoZ1)
2792  * GeoTrf::RotateZ3D(70.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2793  pvEBarrelMotherPos->add(tfIrDw);
2794  pvEBarrelMotherPos->add(new GeoIdentifierTag(6));
2795  pvEBarrelMotherPos->add(pvIrDw);
2796 
2797  tfIrDw = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)
2798  * GeoTrf::Translate3D(-PosXcut+dxIr,-PosYcut+dyIr,-PoZ1)
2799  * GeoTrf::RotateZ3D(-70.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2800 
2801  pvEBarrelMotherPos->add(tfIrDw);
2802  pvEBarrelMotherPos->add(pvIrDw);
2803  } // end if BoolCuts
2804  }
2805  //--------------------------------------------------------------------------------------------------------------
2806  // Ext.Barrel
2807  ztrans = (PosEndCrack + (dbManager->GetEnvZLength()*Gaudi::Units::cm - EBFingerLengthPos)/2 + 19.5)*(1./Gaudi::Units::cm);
2808 
2809  GeoTransform* tfEBarrelMotherPos = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) *
2810  GeoTrf::RotateZ3D(dbManager->GetEnvDPhi()*Gaudi::Units::deg));
2811 
2812  (*m_log) << MSG::INFO <<" Positioning positive ext.barrel with translation "<< ztrans*Gaudi::Units::cm << endmsg;
2813 
2814  //
2815  GeoNameTag* ntEBarrelMotherPos = new GeoNameTag("EBarrelPos");
2816  pvTileEnvelopePosEndcap->add(tfEBarrelMotherPos);
2817  pvTileEnvelopePosEndcap->add(ntEBarrelMotherPos);
2818  pvTileEnvelopePosEndcap->add(new GeoIdentifierTag(3));
2819  pvTileEnvelopePosEndcap->add(pvEBarrelMotherPos);
2820  //
2821 
2822  if (barrel_flag < 2) {
2823 
2824  //--------------------------------------------------------------------------------------------------------------
2825  // Finger
2826  ztrans = (PosEndExBarrel + EBFingerLengthPos/2)*(1./Gaudi::Units::cm);
2827 
2828  GeoTransform* tfEFingerMotherPos = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) *
2829  GeoTrf::RotateZ3D(dbManager->GetEnvDPhi() * Gaudi::Units::deg));
2830 
2831  (*m_log) << MSG::INFO <<" Positioning positive ext.barrel finger with translation ztrans= "<<ztrans*Gaudi::Units::cm<<endmsg;
2832 
2833  GeoNameTag* ntEFingerMotherPos = new GeoNameTag("TileEFingerPos");
2834 
2835  pvTileEnvelopePosEndcap->add(tfEFingerMotherPos);
2836  pvTileEnvelopePosEndcap->add(ntEFingerMotherPos);
2837  pvTileEnvelopePosEndcap->add(pvEFingerMotherPos);
2838 
2839  //--------------------------------------------------------------------------------------------------------------
2840  // Ext. Saddle Support
2841  if (dbManager->BoolSaddle()) {
2842  ztrans = (PosEndExBarrel + DzSaddleSupport/2)*(1./Gaudi::Units::cm);
2843 
2844  GeoTransform* tfESaddleMotherPos = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) *
2845  GeoTrf::RotateZ3D(dbManager->GetEnvDPhi() * Gaudi::Units::deg));
2846 
2847  (*m_log) << MSG::INFO <<" Positioning positive ext.barrel saddle with translation ztrans= "<<ztrans*Gaudi::Units::cm
2848  << endmsg;
2849 
2850  GeoNameTag* ntESaddleMotherPos = new GeoNameTag("TileESaddlePos");
2851 
2852  pvTileEnvelopePosEndcap->add(tfESaddleMotherPos);
2853  pvTileEnvelopePosEndcap->add(ntESaddleMotherPos);
2854  pvTileEnvelopePosEndcap->add(pvESaddleMotherPos);
2855  }
2856 
2857  }
2858  }
2859 
2860  //----------------------------------------- EBarrel Negative -----------------------------------------------------
2861  //
2862  if (EnvType == 2 && eb_flag) { // negative ext.barrel is always at negative boundary, after finger
2863 
2865  double thicknessEndPlate = dbManager->TILBdzend1()*Gaudi::Units::cm;
2866 
2867  double PoZ1 = thicknessEndPlate + modl_length/4 - (dbManager->GetEnvZLength()*Gaudi::Units::cm- EBFingerLengthNeg)/2;
2868  double PoZ2 = modl_length/4 + PoZ1;
2869 
2870  //*>------------------------------------------------------------------------------------------------------
2871  // LArPart in Tile (Negative) (close center)
2872  if (m_fullGeo) {
2873  if (dbManager->BoolCuts() && barrel_flag < 2) {
2874  // Iron1, down
2875  volname = "Iron1"; dbManager->SetCurrentCuts(volname); //>>
2876  dxIron = dbManager->CutsXpos();
2877  dyIron = dbManager->CutsYpos();
2878 
2879  GeoTransform* tfIron1 = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(dxIron,PosY-dyIron,-PoZ2)
2880  * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2881  pvEBarrelMotherNeg->add(tfIron1);
2882  pvEBarrelMotherNeg->add(new GeoIdentifierTag(1));
2883  pvEBarrelMotherNeg->add(pvIron1);
2884 
2885  tfIron1 = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(-dxIron,PosY-dyIron,-PoZ2)
2886  * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Right
2887  pvEBarrelMotherNeg->add(tfIron1);
2888  pvEBarrelMotherNeg->add(new GeoIdentifierTag(2));
2889  pvEBarrelMotherNeg->add(pvIron1);
2890 
2891  // Iron2, middle
2892  volname = "Iron2"; dbManager->SetCurrentCuts(volname); //>>
2893  dxIron = dbManager->CutsXpos();
2894  dyIron = dbManager->CutsYpos();
2895 
2896  GeoTransform* tfIron2 = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(dxIron,PosY+dyIron,-PoZ2)
2897  * GeoTrf::RotateZ3D(-84.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2898  pvEBarrelMotherNeg->add(tfIron2);
2899  pvEBarrelMotherNeg->add(new GeoIdentifierTag(2));
2900  pvEBarrelMotherNeg->add(pvIron2);
2901 
2902  tfIron2 = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(-dxIron,PosY+dyIron,-PoZ2)
2903  * GeoTrf::RotateZ3D(84.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2904  pvEBarrelMotherNeg->add(tfIron2);
2905  pvEBarrelMotherNeg->add(pvIron2);
2906 
2907  // Iron3, middle
2908  volname = "Iron3"; dbManager->SetCurrentCuts(volname); //>>
2909  dxIron = dbManager->CutsXpos();
2910  dyIron = dbManager->CutsYpos();
2911 
2912  GeoTransform* tfIron3 = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(dxIron,PosY+dyIron,-PoZ2)
2913  * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2914  pvEBarrelMotherNeg->add(tfIron3);
2915  pvEBarrelMotherNeg->add(new GeoIdentifierTag(3));
2916  pvEBarrelMotherNeg->add(pvIron3);
2917 
2918  tfIron3 = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(-dxIron,PosY+dyIron,-PoZ2)
2919  * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Right
2920  pvEBarrelMotherNeg->add(tfIron3);
2921  pvEBarrelMotherNeg->add(pvIron3);
2922 
2923  // Heavy Iron Box
2924  volname = "IrBox"; dbManager->SetCurrentCuts(volname); //>>
2925  dxIron = dbManager->CutsXpos();
2926  dyIron = dbManager->CutsYpos();
2927  GeoTransform* tfIrBoxL = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) * GeoTrf::Translate3D(dxIron,PosY-dyIron,-PoZ2)
2928  * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2929  pvEBarrelMotherNeg->add(tfIrBoxL);
2930  pvEBarrelMotherNeg->add(new GeoIdentifierTag(4));
2931  pvEBarrelMotherNeg->add(pvIrBox);
2932 
2933  GeoTransform* tfIrBoxR = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) *GeoTrf::Translate3D(-dxIron,PosY-dyIron,-PoZ2)
2934  * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Right
2935  pvEBarrelMotherNeg->add(tfIrBoxR);
2936  pvEBarrelMotherNeg->add(pvIrBox);
2937 
2938  // LArPart in Tile (Positive) (outer center)
2939  volname = "IrUp"; dbManager->SetCurrentCuts(volname); //>>
2940  dxIr = dbManager->CutsXpos();
2941  dyIr = dbManager->CutsYpos();
2942 
2943  GeoTransform* tfIrUp = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)
2944  * GeoTrf::Translate3D(PosXcut+dxIr,-PosYcut+dyIr,PoZ1)
2945  * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2946  pvEBarrelMotherNeg->add(tfIrUp);
2947  pvEBarrelMotherNeg->add(new GeoIdentifierTag(5));
2948  pvEBarrelMotherNeg->add(pvIrUp);
2949 
2950  tfIrUp = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)
2951  * GeoTrf::Translate3D(-PosXcut-dxIr,-PosYcut+dyIr,PoZ1)
2952  * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Right
2953  pvEBarrelMotherNeg->add(tfIrUp);
2954  pvEBarrelMotherNeg->add(pvIrUp);
2955 
2956  // CutB in Tile (Positive) (outer center)
2957  volname = "IrDw"; dbManager->SetCurrentCuts(volname); //>>
2958  dxIr = dbManager->CutsXpos();
2959  dyIr = dbManager->CutsYpos();
2960 
2961  GeoTransform* tfIrDw = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)
2962  * GeoTrf::Translate3D(PosXcut+dxIr,-PosYcut+dyIr,PoZ1)
2963  * GeoTrf::RotateZ3D(70.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2964  pvEBarrelMotherNeg->add(tfIrDw);
2965  pvEBarrelMotherNeg->add(new GeoIdentifierTag(6));
2966  pvEBarrelMotherNeg->add(pvIrDw);
2967 
2968  tfIrDw = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)
2969  * GeoTrf::Translate3D(-PosXcut+dxIr,-PosYcut+dyIr,PoZ1)
2970  * GeoTrf::RotateZ3D(-70.*Gaudi::Units::deg) * GeoTrf::RotateX3D(90.*Gaudi::Units::deg) * GeoTrf::RotateZ3D(90.*Gaudi::Units::deg)); // Left
2971 
2972  pvEBarrelMotherNeg->add(tfIrDw);
2973  pvEBarrelMotherNeg->add(pvIrDw);
2974  } // end if BoolCuts
2975  }
2976  //
2977  //*>------------------------------------------------------------------------------------------------------
2978  // Ext.Barrel
2979  ztrans = (-NegEndCrack - (dbManager->GetEnvZLength()*Gaudi::Units::cm - EBFingerLengthNeg)/2 - 19.5)*(1./Gaudi::Units::cm);
2980 
2981  GeoTransform* tfEBarrelMotherNeg = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) *
2982  GeoTrf::RotateZ3D(dbManager->GetEnvDPhi()*Gaudi::Units::deg));
2983 
2984  (*m_log) << MSG::INFO <<" Positioning negative ext.barrel with translation ztrans "<<ztrans*Gaudi::Units::cm<<endmsg;
2985 
2986  GeoNameTag* ntEBarrelMotherNeg = new GeoNameTag("EBarrelNeg");
2987 
2988  pvTileEnvelopeNegEndcap->add(tfEBarrelMotherNeg);
2989  pvTileEnvelopeNegEndcap->add(ntEBarrelMotherNeg);
2990  pvTileEnvelopeNegEndcap->add(new GeoIdentifierTag(2));
2991  pvTileEnvelopeNegEndcap->add(pvEBarrelMotherNeg);
2992 
2993  if (barrel_flag < 2) {
2994 
2995  //*>------------------------------------------------------------------------------------------------------
2996  // Finger
2997  ztrans = (-NegEndExBarrel - EBFingerLengthPos/2)*(1./Gaudi::Units::cm);
2998 
2999  GeoTransform* tfEFingerMotherNeg = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) *
3000  GeoTrf::RotateZ3D(dbManager->GetEnvDPhi() * Gaudi::Units::deg));
3001 
3002  (*m_log) << MSG::INFO <<" Positioning negative ext.barrel finger with translation ztrans= "<<ztrans*Gaudi::Units::cm<< endmsg;
3003 
3004  GeoNameTag* ntEFingerMotherNeg = new GeoNameTag("TileEFingerNeg");
3005 
3006  pvTileEnvelopeNegEndcap->add(tfEFingerMotherNeg);
3007  pvTileEnvelopeNegEndcap->add(ntEFingerMotherNeg);
3008  pvTileEnvelopeNegEndcap->add(pvEFingerMotherNeg);
3009 
3010  //*>------------------------------------------------------------------------------------------------------
3011  // Ext. Saddle Support
3012  if (dbManager->BoolSaddle()) {
3013  ztrans = (-NegEndExBarrel - DzSaddleSupport/2)*(1./Gaudi::Units::cm);
3014 
3015  GeoTransform* tfESaddleMotherNeg = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) *
3016  GeoTrf::RotateZ3D(dbManager->GetEnvDPhi() * Gaudi::Units::deg));
3017 
3018  (*m_log) << MSG::INFO <<" Positioning negative ext.barrel saddle with translation ztrans= "<<ztrans*Gaudi::Units::cm
3019  << endmsg;
3020 
3021  GeoNameTag* ntESaddleMotherNeg = new GeoNameTag("TileESaddleNeg");
3022 
3023  pvTileEnvelopeNegEndcap->add(tfESaddleMotherNeg);
3024  pvTileEnvelopeNegEndcap->add(ntESaddleMotherNeg);
3025  pvTileEnvelopeNegEndcap->add(pvESaddleMotherNeg);
3026  }
3027 
3028  }
3029  }
3030 
3031  //
3032  // ---------------------------------------- ITC Positive -----------------------------------------------------
3033  //
3034 
3035  if (EnvType == 5) { // positive ITC attached to positive ext.barrel
3036 
3037  if (barrel_flag < 3) {
3038 
3040 
3041  ztrans = PosEndBarrelFinger*(1./Gaudi::Units::cm) + dbManager->TILBdzmodul()/2;
3042 
3043  //std::cout <<" ztrans "<<ztrans<<" PosEndBarrelFinger/Gaudi::Units::cm "<<PosEndBarrelFinger/Gaudi::Units::cm
3044  // <<" dbManager->TILBdzmodul()/2*Gaudi::Units::cm"<<dbManager->TILBdzmodul()/2<<"\n";
3045 
3046  (*m_log) << MSG::INFO <<" Positioning positive ITC with translation "<<ztrans*Gaudi::Units::cm<< endmsg;
3047 
3048  GeoTransform* tfITCMotherPos = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm) *
3049  GeoTrf::RotateZ3D(dbManager->GetEnvDPhi() * Gaudi::Units::deg));
3050 
3051  GeoNameTag* ntITCMotherPos = new GeoNameTag("ITCPos");
3052 
3053  pvTileEnvelopePosEndcap->add(tfITCMotherPos);
3054  pvTileEnvelopePosEndcap->add(ntITCMotherPos);
3055  pvTileEnvelopePosEndcap->add(pvITCMotherPos);
3056 
3057  }
3058 
3059  if (barrel_flag < 4) {
3060 
3062  ztrans = PosBeginGap*(1./Gaudi::Units::cm) + dbManager->TILBdzmodul()/2;
3063 
3064  (*m_log) << MSG::INFO <<" Positioning positive Gap with translation "<<ztrans*Gaudi::Units::cm<<endmsg;
3065 
3066  GeoTransform* tfGapMotherPos = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)*
3067  GeoTrf::RotateZ3D(dbManager->GetEnvDPhi()*Gaudi::Units::deg));
3068 
3069  GeoNameTag* ntGapMotherPos = new GeoNameTag("GapPos");
3070 
3071  pvTileEnvelopePosEndcap->add(tfGapMotherPos);
3072  pvTileEnvelopePosEndcap->add(ntGapMotherPos);
3073  pvTileEnvelopePosEndcap->add(pvGapMotherPos);
3074 
3075  }
3076 
3077  // Crack
3078  if (crack_flag<=0 || pvTileEnvelopePosCrack) {
3079 
3081  ztrans = PosBeginCrack*(1./Gaudi::Units::cm) + dbManager->TILBdzmodul()/2;
3082 
3083  if (crack_flag<=0) {
3084  (*m_log) << MSG::INFO <<" Positioning positive Crack with translation "<<ztrans*Gaudi::Units::cm<<endmsg;
3085  } else if (crack_flag==1) {
3086  (*m_log) << MSG::INFO <<" Positioning positive Crack in separate mother volume with translation "<<ztrans*Gaudi::Units::cm<<endmsg;
3087  } else {
3088  ztrans = (m_volumePositions.size()>0) ? m_volumePositions[0] : 0.0;
3089  (*m_log) << MSG::INFO <<" Positioning positive Crack in " << pvTileEnvelopePosCrack->getLogVol()->getName() << " mother volume with translation "<<ztrans*Gaudi::Units::cm<<endmsg;
3090  }
3091 
3092  GeoTransform* tfCrackMotherPos = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)*
3093  GeoTrf::RotateZ3D(dbManager->GetEnvDPhi()*Gaudi::Units::deg));
3094 
3095  GeoNameTag* ntCrackMotherPos = new GeoNameTag("CrackPos");
3096 
3097  if (crack_flag<=0) {
3098  pvTileEnvelopePosEndcap->add(tfCrackMotherPos);
3099  pvTileEnvelopePosEndcap->add(ntCrackMotherPos);
3100  pvTileEnvelopePosEndcap->add(pvCrackMotherPos);
3101  } else {
3102  pvTileEnvelopePosCrack->add(tfCrackMotherPos);
3103  pvTileEnvelopePosCrack->add(ntCrackMotherPos);
3104  pvTileEnvelopePosCrack->add(pvCrackMotherPos);
3105  }
3106  } else {
3107  (*m_log) << MSG::INFO <<" Do not create positive Crack"<<endmsg;
3108  }
3109 
3110  }
3111 
3112  //
3113  // ---------------------------------------- ITC Negative -----------------------------------------------------
3114  //
3115 
3116  // negative ITC attached to negative ext.barrel
3117  if (EnvType == 4) {
3118 
3119  if (barrel_flag < 3) {
3120 
3122  ztrans = -NegEndBarrelFinger*(1./Gaudi::Units::cm) - dbManager->TILBdzmodul()/2;
3123 
3124  (*m_log) << MSG::INFO <<" Positioning negative ITC with translation "<<ztrans*Gaudi::Units::cm<<endmsg;
3125 
3126  GeoTransform* tfITCMotherNeg = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)*
3127  GeoTrf::RotateZ3D(dbManager->GetEnvDPhi()*Gaudi::Units::deg));
3128 
3129  GeoNameTag* ntITCMotherNeg = new GeoNameTag("ITCNeg");
3130 
3131  pvTileEnvelopeNegEndcap->add(tfITCMotherNeg);
3132  pvTileEnvelopeNegEndcap->add(ntITCMotherNeg);
3133  pvTileEnvelopeNegEndcap->add(pvITCMotherNeg);
3134 
3135  }
3136 
3137  if (barrel_flag < 4) {
3138 
3140  ztrans = -NegBeginGap*(1./Gaudi::Units::cm) - dbManager->TILBdzmodul()/2;
3141 
3142  (*m_log) << MSG::INFO <<" Positioning negative Gap with translation "<<ztrans*Gaudi::Units::cm<<endmsg;
3143 
3144  GeoTransform* tfGapMotherNeg = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)*
3145  GeoTrf::RotateZ3D(dbManager->GetEnvDPhi()*Gaudi::Units::deg));
3146 
3147  GeoNameTag* ntGapMotherNeg = new GeoNameTag("GapNeg");
3148 
3149  pvTileEnvelopeNegEndcap->add(tfGapMotherNeg);
3150  pvTileEnvelopeNegEndcap->add(ntGapMotherNeg);
3151  pvTileEnvelopeNegEndcap->add(pvGapMotherNeg);
3152 
3153  }
3154 
3155  // Crack
3156  if (crack_flag<=0 || pvTileEnvelopeNegCrack) {
3157 
3159  ztrans = -NegBeginCrack*(1./Gaudi::Units::cm) - dbManager->TILBdzmodul()/2;
3160 
3161  if (crack_flag<=0) {
3162  (*m_log) << MSG::INFO <<" Positioning negative Crack with translation "<<ztrans*Gaudi::Units::cm<<endmsg;
3163  } else if (crack_flag==1) {
3164  (*m_log) << MSG::INFO <<" Positioning negative Crack in separate mother volume with translation "<<ztrans*Gaudi::Units::cm<<endmsg;
3165  } else {
3166  ztrans = (m_volumePositions.size()>1) ? m_volumePositions[1] : (m_volumePositions.size()>0) ? m_volumePositions[0] : 0.0;
3167  (*m_log) << MSG::INFO <<" Positioning positive Crack in " << pvTileEnvelopeNegCrack->getLogVol()->getName() << " mother volume with translation "<<ztrans*Gaudi::Units::cm<<endmsg;
3168  }
3169 
3170  GeoTransform* tfCrackMotherNeg = new GeoTransform(GeoTrf::TranslateZ3D(ztrans*Gaudi::Units::cm)*
3171  GeoTrf::RotateZ3D(dbManager->GetEnvDPhi()*Gaudi::Units::deg));
3172 
3173  GeoNameTag* ntCrackMotherNeg = new GeoNameTag("CrackNeg");
3174 
3175  if (crack_flag<=0) {
3176  pvTileEnvelopeNegEndcap->add(tfCrackMotherNeg);
3177  pvTileEnvelopeNegEndcap->add(ntCrackMotherNeg);
3178  pvTileEnvelopeNegEndcap->add(pvCrackMotherNeg);
3179  } else {
3180  pvTileEnvelopeNegCrack->add(tfCrackMotherNeg);
3181  pvTileEnvelopeNegCrack->add(ntCrackMotherNeg);
3182  pvTileEnvelopeNegCrack->add(pvCrackMotherNeg);
3183  }
3184  } else {
3185  (*m_log) << MSG::INFO <<" Do not create negative Crack"<<endmsg;
3186  }
3187 
3188  }
3189  } // EnvCounter, end
3190 
3191  //
3192  // creating Descriptiors and CaloDetDescrElements
3193  //
3194 
3195  if (barrel_flag<4 || (barrel_flag==4 && crack_flag<2) ) { // create descriptors only if top-level volumes were created
3196 
3197  (*m_log) << MSG::DEBUG << "Creating descriptors for " << dbManager->GetNumberOfEnv() << " envelopes..." << endmsg;
3198 
3199  int nModulesInSection[6] = {0,0,0,0,0,0};
3200  double zShiftInSection[6] = {0.0,0.0,0.0,0.0,0.0,0.0,};
3201 
3202 
3203  for (int EnvCounter = 0; EnvCounter < dbManager->GetNumberOfEnv(); ++EnvCounter) { //Loop over Envelopes
3204 
3205  dbManager->SetCurrentEnvByIndex(EnvCounter);
3206  int EnvType = dbManager->GetEnvType();
3207  int NumberOfMod = dbManager->GetEnvNModules();
3208  double Zshift = dbManager->GetEnvZShift()*Gaudi::Units::cm;
3209 
3210  if (m_log->level()<=MSG::DEBUG)
3211  (*m_log) << MSG::DEBUG
3212  << " EnvCounter is " << EnvCounter
3213  << " EnvType is " << EnvType
3214  << " Zshift is " << Zshift*(1./Gaudi::Units::cm) << " cm"
3215  << endmsg;
3216 
3217  // Central barrel
3218  if (EnvType == 1 || EnvType == 0) {
3219  nModulesInSection[0] = nModulesInSection[1] = NumberOfMod;
3220  zShiftInSection[0] = zShiftInSection[1] = Zshift;
3221  } else if (EnvType < 6) {
3222  nModulesInSection[EnvType] = NumberOfMod;
3223  zShiftInSection[EnvType] = Zshift;
3224  }
3225  }
3226 
3227  const TileID* tileID = m_detectorManager->get_id();
3228 
3231  int side[6] = {0,1,0,1,0,1};
3232 
3233 
3234  (*m_log) << MSG::DEBUG << "Loop over Tile detector regions, and call computeCellDim() when needed..." << endmsg;
3235  for (int ii=0; ii<6; ++ii) {
3236 
3237  (*m_log) << MSG::DEBUG << "ii: " << ii << ", region: " << dete[ii] << endmsg;
3238 
3239  if (ii%2 == 0) {
3240  (*m_log) << MSG::DEBUG << "ii: " << ii << ", region: " << dete[ii] << " --> calling computeCellDim()..." << endmsg;
3241  sectionBuilder->computeCellDim(m_detectorManager, dete[ii],
3243  zShiftInSection[ii+1], // zShiftPos
3244  zShiftInSection[ii]); // zShiftNeg
3245  }
3246 
3247  (*m_log) << MSG::DEBUG << "calling fillDescriptor()..." << endmsg;
3248  TileDetDescriptor* descriptor = new TileDetDescriptor();
3249  sectionBuilder->fillDescriptor(descriptor, dete[ii], side[ii],
3250  m_switches.testBeam, // set to false - ATLAS geometry
3251  m_switches.addPlatesToCell, // add front/end plates to cell volume
3252  nModulesInSection[ii], // 0-64 modules
3253  zShiftInSection[ii]); // Z-shift
3254 
3255  (*m_log) << MSG::DEBUG << "Get an Identifier for the region and add it to the detectorManager..." << endmsg;
3256  Identifier idRegion = tileID->region_id(ii);
3257  descriptor->set(idRegion);
3258  m_detectorManager->add(descriptor);
3259  m_detectorManager->add(new TileDetDescrRegion(idRegion, descriptor));
3260  }
3261  }
3262 
3263  // --------- ----------- --------- -------- ------ --------- ------- ----------
3264  GeoNameTag *nTag = new GeoNameTag("Tile");
3265 
3266  if (BAR && barrel_flag<1) {
3267  world->add(nTag);
3268 
3269  // Top transform for the Central barrel
3270  dbManager->SetCurrentEnvByType(1);
3271  GeoTrf::Transform3D mz = GeoTrf::RotateZ3D(dbManager->GetEnvDPhi());
3272  GeoTrf::Transform3D my = GeoTrf::RotateY3D(dbManager->GetEnvDTheta());
3273  GeoTrf::Transform3D mx = GeoTrf::RotateZ3D(dbManager->GetEnvDPsi());
3274  GeoTrf::Transform3D vpos = GeoTrf::Translate3D(dbManager->GetEnvDX()*Gaudi::Units::cm,dbManager->GetEnvDY()*Gaudi::Units::cm,dbManager->GetEnvDZ()*Gaudi::Units::cm);
3275  GeoTransform* barrelTT = new GeoTransform(GeoTrf::Transform3D(vpos*(mx*(my*(mz)))));
3276 
3277  (*m_log) << MSG::INFO << " Global positioning of barrel with rotation ("
3278  << dbManager->GetEnvDPhi() << "," << dbManager->GetEnvDTheta() << "," << dbManager->GetEnvDPsi() << ")"
3279  << ") and translation (" << dbManager->GetEnvDX() << "," << dbManager->GetEnvDY() << "," << dbManager->GetEnvDZ()
3280  << ") Gaudi::Units::cm" << endmsg;
3281 
3282  world->add(barrelTT);
3283  world->add(pvTileEnvelopeBarrel);
3284  m_detectorManager->addTreeTop(pvTileEnvelopeBarrel);
3285  }
3286 
3287  if (EBA && eb_flag) {
3288  world->add(nTag);
3289 
3290  // Top transform for the Positive endcap
3291  dbManager->SetCurrentEnvByType(3);
3292  GeoTrf::Transform3D mz = GeoTrf::RotateZ3D(dbManager->GetEnvDPhi());
3293  GeoTrf::Transform3D my = GeoTrf::RotateY3D(dbManager->GetEnvDTheta());
3294  GeoTrf::Transform3D mx = GeoTrf::RotateZ3D(dbManager->GetEnvDPsi());
3295  GeoTrf::Transform3D vpos = GeoTrf::Translate3D(dbManager->GetEnvDX()*Gaudi::Units::cm,dbManager->GetEnvDY()*Gaudi::Units::cm,dbManager->GetEnvDZ()*Gaudi::Units::cm);
3296  GeoTransform* posEcTT = new GeoTransform(GeoTrf::Transform3D(vpos*(mx*(my*(mz)))));
3297 
3298  (*m_log) << MSG::INFO << " Global positioning of positive ext.barrel with rotation ("
3299  << dbManager->GetEnvDPhi() << "," << dbManager->GetEnvDTheta() << "," << dbManager->GetEnvDPsi() << ")"
3300  << ") and translation (" << dbManager->GetEnvDX() << "," << dbManager->GetEnvDY() << "," << dbManager->GetEnvDZ()
3301  << ") Gaudi::Units::cm" << endmsg;
3302 
3303  world->add(posEcTT);
3304  world->add(pvTileEnvelopePosEndcap);
3305  m_detectorManager->addTreeTop(pvTileEnvelopePosEndcap);
3306  }
3307 
3308  if (EBC && eb_flag) {
3309  world->add(nTag);
3310 
3311  // Top transform for the Negative endcap
3312  dbManager->SetCurrentEnvByType(2);
3313  GeoTrf::Transform3D mz = GeoTrf::RotateZ3D(dbManager->GetEnvDPhi());
3314  GeoTrf::Transform3D my = GeoTrf::RotateY3D(dbManager->GetEnvDTheta());
3315  GeoTrf::Transform3D mx = GeoTrf::RotateZ3D(dbManager->GetEnvDPsi());
3316  GeoTrf::Transform3D vpos = GeoTrf::Translate3D(dbManager->GetEnvDX()*Gaudi::Units::cm,dbManager->GetEnvDY()*Gaudi::Units::cm,dbManager->GetEnvDZ()*Gaudi::Units::cm);
3317  GeoTransform* negEcTT = new GeoTransform(GeoTrf::Transform3D(vpos*(mx*(my*(mz)))));
3318 
3319  (*m_log) << MSG::INFO << " Global positioning of negative ext.barrel with rotation ("
3320  << dbManager->GetEnvDPhi() << "," << dbManager->GetEnvDTheta() << "," << dbManager->GetEnvDPsi() << ")"
3321  << ") and translation (" << dbManager->GetEnvDX() << "," << dbManager->GetEnvDY() << "," << dbManager->GetEnvDZ()
3322  << ") Gaudi::Units::cm" << endmsg;
3323 
3324  world->add(negEcTT);
3325  world->add(pvTileEnvelopeNegEndcap);
3326  m_detectorManager->addTreeTop(pvTileEnvelopeNegEndcap);
3327 
3328  }
3329 
3330  if (crack_flag==1) {
3331 
3332  // repeating the same for crack in EBA
3333  if (EBA && pvTileEnvelopePosCrack) {
3334  //GeoNameTag *nTag = new GeoNameTag("TileCrackEBA");
3335  world->add(nTag);
3336 
3337  // Top transform for the Positive crack
3338  dbManager->SetCurrentEnvByType(5);
3339  GeoTrf::Transform3D mz = GeoTrf::RotateZ3D(dbManager->GetEnvDPhi());
3340  GeoTrf::Transform3D my = GeoTrf::RotateY3D(dbManager->GetEnvDTheta());
3341  GeoTrf::Transform3D mx = GeoTrf::RotateZ3D(dbManager->GetEnvDPsi());
3342  GeoTrf::Transform3D vpos = GeoTrf::Translate3D(dbManager->GetEnvDX()*Gaudi::Units::cm,dbManager->GetEnvDY()*Gaudi::Units::cm,dbManager->GetEnvDZ()*Gaudi::Units::cm);
3343  GeoTransform* posCrackTT = new GeoTransform(GeoTrf::Transform3D(vpos*(mx*(my*(mz)))));
3344 
3345  (*m_log) << MSG::INFO << " Global positioning of positive Crack with rotation ("
3346  << dbManager->GetEnvDPhi() << "," << dbManager->GetEnvDTheta() << "," << dbManager->GetEnvDPsi() << ")"
3347  << ") and translation (" << dbManager->GetEnvDX() << "," << dbManager->GetEnvDY() << "," << dbManager->GetEnvDZ()
3348  << ") Gaudi::Units::cm" << endmsg;
3349 
3350  world->add(posCrackTT);
3351  world->add(pvTileEnvelopePosCrack);
3352  m_detectorManager->addTreeTop(pvTileEnvelopePosCrack);
3353 
3354  }
3355 
3356  // repeating the same for crack in EBC
3357  if (EBC && pvTileEnvelopeNegCrack) {
3358  //GeoNameTag *nTag = new GeoNameTag("TileCrackEBC");
3359  world->add(nTag);
3360 
3361  // Top transform for the Negative endcap
3362  dbManager->SetCurrentEnvByType(4);
3363  GeoTrf::Transform3D mz = GeoTrf::RotateZ3D(dbManager->GetEnvDPhi());
3364  GeoTrf::Transform3D my = GeoTrf::RotateY3D(dbManager->GetEnvDTheta());
3365  GeoTrf::Transform3D mx = GeoTrf::RotateZ3D(dbManager->GetEnvDPsi());
3366  GeoTrf::Transform3D vpos = GeoTrf::Translate3D(dbManager->GetEnvDX()*Gaudi::Units::cm,dbManager->GetEnvDY()*Gaudi::Units::cm,dbManager->GetEnvDZ()*Gaudi::Units::cm);
3367  GeoTransform* negCrackTT = new GeoTransform(GeoTrf::Transform3D(vpos*(mx*(my*(mz)))));
3368 
3369  (*m_log) << MSG::INFO << " Global positioning of negative Crack with rotation ("
3370  << dbManager->GetEnvDPhi() << "," << dbManager->GetEnvDTheta() << "," << dbManager->GetEnvDPsi() << ")"
3371  << ") and translation (" << dbManager->GetEnvDX() << "," << dbManager->GetEnvDY() << "," << dbManager->GetEnvDZ()
3372  << ") Gaudi::Units::cm" << endmsg;
3373 
3374  world->add(negCrackTT);
3375  world->add(pvTileEnvelopeNegCrack);
3376  m_detectorManager->addTreeTop(pvTileEnvelopeNegCrack);
3377  }
3378 
3379  }
3380 
3381  delete sectionBuilder;
3382  //delete CutBuilder;
3383 
3384 }
3385 
3386 
3387 // Checking geometry dimensions for all directions
3388 
3389 void TileAtlasFactory::checking(const std::string& Name, bool print, int level,
3390  double X1, double X2, double Y1, double Y2, double Z)
3391 {
3392  double rless = .150; //150 [mkm]
3393  std::string Step[8] = {" "," "," "," "," "," "," "," "};
3394 
3395  if (print) {
3396  if (m_log->level()<=MSG::DEBUG)
3397  (*m_log) << MSG::DEBUG <<Step[level]<<Name<<"-"<<level
3398  <<" dX1,dX2= "<<X1<<","<<X2<<" dY1,dY2= "<<Y1<<","<<Y2<<",dZ= "<<Z
3399  <<endmsg;
3400  }
3401  if (X1 < rless && X2 < rless) {
3402  (*m_log) << MSG::WARNING <<" volume "<<Name<<" is empty, X1 or X2<0 "<<endmsg;
3403  }
3404  if (Y1 < rless && Y2 < rless) {
3405  (*m_log) << MSG::WARNING <<" volume "<<Name<<" is empty, Y1 or Y2<0 "<<endmsg;
3406  }
3407  if (Z < rless) {
3408  (*m_log) << MSG::WARNING <<" volume "<<Name<<" is empty, Z<0 "<<endmsg;
3409  }
3410 }
geoGetVolumes
GeoVolumeVec_t geoGetVolumes(const GeoGraphNode *node, int depthLimit=1, int sizeHint=20)
Return the child volumes and associated transforms.
Definition: GeoVisitVolumes.cxx:211
TBXMLWriter_jobOptions.PhiMin
PhiMin
Definition: TBXMLWriter_jobOptions.py:32
TileDddbManager::TILE_PLUG3
@ TILE_PLUG3
Definition: TileDddbManager.h:46
TileDddbManager::GetEnvRin
double GetEnvRin() const
Definition: TileDddbManager.cxx:240
TileDddbManager::SetCurrentEnvByIndex
int SetCurrentEnvByIndex(unsigned int envelope)
Definition: TileDddbManager.cxx:175
TileDddbManager::SetCurrentCuts
int SetCurrentCuts(const std::string &input)
Fields of CUTS structure (see also Oracle comments):
Definition: TileDddbManager.cxx:1014
TileDddbManager::SetCurrentEnvByType
int SetCurrentEnvByType(unsigned int envelope)
Definition: TileDddbManager.cxx:140
TileDddbManager::TIFGdz
double TIFGdz() const
Definition: TileDddbManager.cxx:1300
TileDddbManager::TILE_BARREL
@ TILE_BARREL
Definition: TileDddbManager.h:42
TileGeoSectionBuilder.h
Definition of TileGeoSectionBuilder class.
TileDddbManager::SetCurrentSection
int SetCurrentSection(unsigned int section, bool print=true)
Definition: TileDddbManager.cxx:582
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
fitman.my
my
Definition: fitman.py:523
TileDddbManager::TILE_PLUG1
@ TILE_PLUG1
Definition: TileDddbManager.h:44
GeoVolumeVec_t
std::vector< std::pair< const GeoVPhysVol *, GeoTrf::Transform3D > > GeoVolumeVec_t
Return the child volumes and associated transforms.
Definition: GeoVisitVolumes.h:219
TileDddbManager::GetEnvDZ
double GetEnvDZ() const
Definition: TileDddbManager.cxx:297
TileDddbManager::SetCurrentTifg
int SetCurrentTifg(int section)
Definition: TileDddbManager.cxx:1258
TileDddbManager::RadiusSaddle
double RadiusSaddle() const
Definition: TileDddbManager.cxx:1160
TileDddbManager::TILBrmax
double TILBrmax() const
Definition: TileDddbManager.cxx:645
TileDddbManager::TILE_PLUG4
@ TILE_PLUG4
Definition: TileDddbManager.h:47
Monitored::Z
@ Z
Definition: HistogramFillerUtils.h:24
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
TileDetDescrManager::addTreeTop
void addTreeTop(PVConstLink)
Definition: TileDetDescrManager.cxx:88
xAOD::deltaPhi
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setInterceptInner setEtaMap setEtaBin setIsTgcFailure setDeltaPt deltaPhi
Definition: L2StandAloneMuon_v1.cxx:161
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
TileDddbManager::GetEnvDPsi
double GetEnvDPsi() const
Definition: TileDddbManager.cxx:337
TileAtlasFactory::create
virtual void create(GeoPhysVol *world)
Creation of Tile geometry.
Definition: TileAtlasFactory.cxx:100
TileDddbManager::BoolSaddle
bool BoolSaddle()
Definition: TileDddbManager.cxx:1141
TileDddbManager::GetEnvDY
double GetEnvDY() const
Definition: TileDddbManager.cxx:326
TileAtlasFactory::TileAtlasFactory
TileAtlasFactory(StoreGateSvc *pDetStore, TileDetDescrManager *manager, const TileSwitches &switches, MsgStream *log, bool fullGeo)
Constructor.
Definition: TileAtlasFactory.cxx:57
TileDddbManager::GetEnvDPhi
double GetEnvDPhi() const
Definition: TileDddbManager.cxx:280
deg
#define deg
Definition: SbPolyhedron.cxx:17
TBXMLWriter_jobOptions.PhiMax
PhiMax
Definition: TBXMLWriter_jobOptions.py:33
TileDddbManager::GetModType
int GetModType() const
Definition: TileDddbManager.cxx:437
TileAtlasFactory.h
Definition of TileAtlasFactory class.
TileGeoSectionBuilder::fillFinger
void fillFinger(PVLink &mother, int sec_number, double tile_rmax, double tilb_rmax, double delta_phi_not_used, bool testbeam, int ModuleNcp=0, double corrected_dz=0.)
Finger parameters are the following:
Definition: TileGeoSectionBuilder.cxx:1434
TileSwitches::testBeam
bool testBeam
setting up testbeam geometry or ATLAS geometry
Definition: TileSwitches.h:31
TileDddbManager::GetNumberOfEnv
int GetNumberOfEnv() const
Definition: TileDddbManager.cxx:124
fitman.mx
mx
Definition: fitman.py:520
TileDddbManager::TILBdzmodul
double TILBdzmodul() const
Definition: TileDddbManager.cxx:766
TileDddbManager::TILEzshift
double TILEzshift() const
Definition: TileDddbManager.cxx:113
TILE_REGION_EXTENDED
#define TILE_REGION_EXTENDED
Definition: TileGeoSectionBuilder.h:22
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
TileGeoSectionBuilder::setBarrelGlue
void setBarrelGlue(double val)
Definition: TileGeoSectionBuilder.cxx:3465
TileDddbManager::SetCurrentSectionByNumber
int SetCurrentSectionByNumber(unsigned int section)
Definition: TileDddbManager.cxx:577
TileAtlasFactory::m_detectorStore
StoreGateSvc * m_detectorStore
Detector pointer to Store Gate service.
Definition: TileAtlasFactory.h:63
TileDddbManager::TILE_PLUG2
@ TILE_PLUG2
Definition: TileDddbManager.h:45
TileDddbManager::TILBrmin
double TILBrmin() const
Definition: TileDddbManager.cxx:634
TileDddbManager::TILBzoffset
double TILBzoffset() const
Definition: TileDddbManager.cxx:733
TileDddbManager::TILErmam
double TILErmam() const
Definition: TileDddbManager.cxx:93
TileID.h
TileDetDescrManager.h
python.iconfTool.models.loaders.level
level
Definition: loaders.py:20
Monitored::X
@ X
Definition: HistogramFillerUtils.h:24
TRT::Hit::side
@ side
Definition: HitInfo.h:83
TileAtlasFactory::m_log
MsgStream * m_log
Get message SVC.
Definition: TileAtlasFactory.h:69
TileAtlasFactory::m_fullGeo
bool m_fullGeo
Geometry configuration: FULL, RECO.
Definition: TileAtlasFactory.h:83
cm
const double cm
Definition: Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/tools/FCAL_ChannelMap.cxx:25
TileGeoSectionBuilder::fillDescriptor
void fillDescriptor(TileDetDescriptor *&descriptor, unsigned int detector, int side, bool testbeam, bool addPlates, unsigned int nphi, float zshift)
Readout Descriptor parameters are the following:
Definition: TileGeoSectionBuilder.cxx:2453
GeoVisitVolumes.h
Visitor to process all volumes under a GeoModel node.
Tile_Base_ID::region_id
Identifier region_id(int index) const
build single region, module, tower, cell, pmt, adc identifiers
Definition: Tile_Base_ID.cxx:405
Type
RootType Type
Definition: TrigTSerializer.h:30
TileDetDescriptor::set
void set(const Identifier &id)
Definition: TileDetDescriptor.h:244
TileDddbManager::CutsXpos
double CutsXpos() const
Definition: TileDddbManager.cxx:1104
TileGeoSectionBuilder::fillSection
void fillSection(PVLink &mother, int sec_number, double tile_rmax, double rminb, double dzglue, double delta_phi, int ModuleNcp=0, double zlen_itc2=0., bool neg=false)
Section parameters are the following:
Definition: TileGeoSectionBuilder.cxx:73
TileAtlasFactory::~TileAtlasFactory
~TileAtlasFactory()
Destructor.
Definition: TileAtlasFactory.cxx:96
lumiFormat.i
int i
Definition: lumiFormat.py:85
TileDetDescrManager
Definition: TileDetDescrManager.h:33
TileID
Helper class for TileCal offline identifiers.
Definition: TileID.h:68
TileDddbManager::GetEnvDX
double GetEnvDX() const
Definition: TileDddbManager.cxx:315
MSG
Definition: MsgLevel.h:28
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
TileDetDescrRegion
Definition: TileDetDescrRegion.h:40
TileDddbManager::DzSaddleSupport
double DzSaddleSupport() const
Definition: TileDddbManager.cxx:1150
TileDddbManager::TILBdzgir
double TILBdzgir() const
Definition: TileDddbManager.cxx:891
TileDddbManager::GetEnvZShift
double GetEnvZShift() const
Definition: TileDddbManager.cxx:359
TileDetDescriptor
Definition: TileDetDescriptor.h:46
TileDddbManager::GetEnvZLength
double GetEnvZLength() const
Definition: TileDddbManager.cxx:262
fitman.mz
mz
Definition: fitman.py:526
TileDddbManager::TILBdzend1
double TILBdzend1() const
Definition: TileDddbManager.cxx:799
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
TileDddbManager::TILBrmaximal
double TILBrmaximal() const
Definition: TileDddbManager.cxx:667
TileSwitches
Definition: TileSwitches.h:15
TileAtlasFactory::m_switches
TileSwitches m_switches
all switches
Definition: TileAtlasFactory.h:72
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
xAODType
Definition: ObjectType.h:13
TileAtlasFactory::checking
void checking(const std::string &VolumeName, bool print, int level, double X1, double X2, double Y1, double Y2, double Z)
Function for checking empty volumes:
Definition: TileAtlasFactory.cxx:3389
TileDddbManager::GetModTypeSize
unsigned int GetModTypeSize() const
Definition: TileDddbManager.cxx:541
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:25
TileAtlasFactory::m_volumeNames
std::vector< std::string > m_volumeNames
all additional variables which passed to constructor
Definition: TileAtlasFactory.h:75
TILE_REGION_CENTRAL
#define TILE_REGION_CENTRAL
Definition: TileGeoSectionBuilder.h:21
TileSwitches::addPlatesToCell
bool addPlatesToCell
calculate cell volumes with or without front-plates and end-plates
Definition: TileSwitches.h:34
TileDddbManager::BoolCuts
bool BoolCuts()
Definition: TileDddbManager.cxx:1037
TILE_REGION_GAP
#define TILE_REGION_GAP
Definition: TileGeoSectionBuilder.h:23
StoredMaterialManager.h
TileDddbManager::CutsDY2
double CutsDY2() const
Definition: TileDddbManager.cxx:1084
TileDddbManager::TILBdzspac
double TILBdzspac() const
Definition: TileDddbManager.cxx:788
TileDddbManager::TILE_EBARREL
@ TILE_EBARREL
Definition: TileDddbManager.h:43
TileGeoSectionBuilder::setBarrelPeriodThickness
void setBarrelPeriodThickness(double val)
Definition: TileGeoSectionBuilder.cxx:3459
TileGeoCutBuilder.h
Definition of TileGeoSectionBuioder class.
TileDddbManager::CutsDX1
double CutsDX1() const
Definition: TileDddbManager.cxx:1054
TileDetDescrManager::add
void add(TileDetDescrRegion *region)
Definition: TileDetDescrManager.cxx:894
TileDddbManager.h
python.PyAthena.v
v
Definition: PyAthena.py:154
TileDddbManager::TILBrminimal
double TILBrminimal() const
Definition: TileDddbManager.cxx:656
TileDddbManager::CutsYpos
double CutsYpos() const
Definition: TileDddbManager.cxx:1114
hydjet.StoreGateSvc
StoreGateSvc
Definition: hydjet.minbias.pbpb5520.r12345.job.py:40
TileSwitches::crackOption
int crackOption
0: crack scintillators in ext.barrel top-level envelopes 1: crack scintillators in separate TileCal t...
Definition: TileSwitches.h:70
Name
JetDumper::Name Name
Definition: JetDumper.cxx:19
TileAtlasFactory::m_detectorManager
TileDetDescrManager * m_detectorManager
Detector pointer to TileDetDescrManager.
Definition: TileAtlasFactory.h:66
GeoGenfun
Definition: ArrayFunction.cxx:7
python.Constants.INFO
int INFO
Definition: Control/AthenaCommon/python/Constants.py:15
TileDddbManager::CutsDZ1
double CutsDZ1() const
Definition: TileDddbManager.cxx:1094
DEBUG
#define DEBUG
Definition: page_access.h:11
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
StoredMaterialManager::getMaterial
virtual const GeoMaterial * getMaterial(const std::string &name)=0
TileDetDescriptor.h
TileDddbManager::TILErmax
double TILErmax() const
Definition: TileDddbManager.cxx:108
TileDddbManager::TILBdzend2
double TILBdzend2() const
Definition: TileDddbManager.cxx:810
StoredMaterialManager
This class holds one or more material managers and makes them storeable, under StoreGate.
Definition: StoredMaterialManager.h:28
TileGeoSectionBuilder::setExtendedPeriodThickness
void setExtendedPeriodThickness(double val)
Definition: TileGeoSectionBuilder.cxx:3471
TileDetDescrManager::getDbManager
TileDddbManager * getDbManager() const
Definition: TileDetDescrManager.cxx:94
TileDddbManager::TILBdzmast
double TILBdzmast() const
Definition: TileDddbManager.cxx:777
python.Logging.manager
manager
Definition: PhysicsAnalysis/D3PDTools/AnaAlgorithm/python/Logging.py:92
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:13
TileGeoSectionBuilder::computeCellDim
void computeCellDim(TileDetDescrManager *&manager, int detector, bool addPlates, float zShiftPos, float zShiftNeg)
Cell dimension parameters are the following:
Definition: TileGeoSectionBuilder.cxx:2708
TileDddbManager::CutsDY1
double CutsDY1() const
Definition: TileDddbManager.cxx:1074
TileDddbManager::GetEnvRout
double GetEnvRout() const
Definition: TileDddbManager.cxx:251
TileDddbManager::TILBnperiod
int TILBnperiod() const
Definition: TileDddbManager.cxx:612
TileAtlasFactory::m_volumePtrs
std::vector< GeoPhysVol * > m_volumePtrs
Definition: TileAtlasFactory.h:76
TileDddbManager::GetEnvType
int GetEnvType() const
Definition: TileDddbManager.cxx:129
checker_macros.h
Define macros for attributes used to control the static checker.
TileDddbManager::SetCurrentModuleByIndex
int SetCurrentModuleByIndex(unsigned int Id)
Definition: TileDddbManager.cxx:372
TileDddbManager
This class provides access to constants in the Geometry DB.
Definition: TileDddbManager.h:38
TileDddbManager::SetCurrentSaddle
int SetCurrentSaddle(unsigned int index)
Fields of SADDLE structure (see also Oracle comments):
Definition: TileDddbManager.cxx:1126
multiIoVMCRecoTag.nTag
nTag
Definition: multiIoVMCRecoTag.py:69
TileDddbManager::CutsDX2
double CutsDX2() const
Definition: TileDddbManager.cxx:1064
TileDddbManager::TILBfingpattern
int TILBfingpattern() const
Definition: TileDddbManager.cxx:843
StoreGateSvc.h
TileDddbManager::GetEnvDTheta
double GetEnvDTheta() const
Definition: TileDddbManager.cxx:348
TileDddbManager::GetEnvNModules
int GetEnvNModules() const
Definition: TileDddbManager.cxx:228
MLOG
#define MLOG(x)
Definition: TileAtlasFactory.cxx:50
TileDetDescrManager::get_id
const TileID * get_id() const
Definition: TileDetDescrManager.h:172
TileGeoSectionBuilder
Definition: TileGeoSectionBuilder.h:36
TileAtlasFactory::m_volumePositions
std::vector< double > m_volumePositions
Definition: TileAtlasFactory.h:77
Identifier
Definition: IdentifierFieldParser.cxx:14