89{
90
91
92
93
94 GeoElement *carbon = new GeoElement("Carbon","C",6,12.0112*GeoModelKernelUnits::gram/GeoModelKernelUnits::mole);
95 GeoElement *oxygen = new GeoElement("Oxygen","O",8,15.9994*GeoModelKernelUnits::gram/GeoModelKernelUnits::mole);
96 GeoElement *argon = new GeoElement("Argon","Ar",18,39.948*GeoModelKernelUnits::gram/GeoModelKernelUnits::mole);
97 GeoElement *xenon = new GeoElement("Xenon","Xe",54,131.3*GeoModelKernelUnits::gram/GeoModelKernelUnits::mole);
98
99 GeoMaterial *trtCO2 = new GeoMaterial("trt::CO2", 0.001842*GeoModelKernelUnits::gram / GeoModelKernelUnits::cm3);
100 trtCO2->add(carbon,1);
101 trtCO2->add(oxygen,2);
102 trtCO2->lock();
103
104
105 GeoMaterial *trtO2 = new GeoMaterial("trt::O2", 0.001334*GeoModelKernelUnits::gram / GeoModelKernelUnits::cm3);
106 trtO2->add(oxygen,1);
107 trtO2->lock();
108
109 GeoMaterial *trtArgon = new GeoMaterial("trt::Argon", 0.001662*GeoModelKernelUnits::gram / GeoModelKernelUnits::cm3);
110 trtArgon->add(argon,1);
111 trtArgon->lock();
112
113 GeoMaterial *trtXenon = new GeoMaterial("trt::Xenon", 0.005485*GeoModelKernelUnits::gram / GeoModelKernelUnits::cm3);
114 trtXenon->add(xenon,1);
115 trtXenon->lock();
116
117 GeoMaterial *argonGas = new GeoMaterial("trt::ArCO2O2",0.00165878*GeoModelKernelUnits::gram / GeoModelKernelUnits::cm3);
118 argonGas->add(trtArgon,0.7);
119 argonGas->add(trtCO2,0.27);
120 argonGas->add(trtO2,0.03);
121 argonGas->lock();
122
123 GeoMaterial *xenonGas = new GeoMaterial("trt::XeCO2O2",0.00437686*GeoModelKernelUnits::gram / GeoModelKernelUnits::cm3);
124 xenonGas->add(trtXenon,0.7);
125 xenonGas->add(trtCO2,0.27);
126 xenonGas->add(trtO2,0.03);
127 xenonGas->lock();
128
131
132 std::map<std::string, GeoFullPhysVol*> mapFPV =
m_sqliteReader->getPublishedNodes<std::string, GeoFullPhysVol*>(
"TRT");
133 std::map<std::string, GeoAlignableTransform*> mapAX =
m_sqliteReader->getPublishedNodes<std::string, GeoAlignableTransform*>(
"TRT");
134
135
136 GeoFullPhysVol *pBarrelVol = mapFPV["TRTBarrel"];
137 GeoFullPhysVol *pEndCapABPlus = mapFPV["TRTEndCapABPlus"];
138 GeoFullPhysVol *pEndCapCPlus = mapFPV["TRTEndCapCPlus"];
139 GeoFullPhysVol *pEndCapABMinus = mapFPV["TRTEndCapABMinus"];
140 GeoFullPhysVol *pEndCapCMinus = mapFPV["TRTEndCapCPlus"];;
141
142
143
144
146
147
148
149 ATH_MSG_DEBUG(
" Getting primary numbers from the Detector Description Database " );
150 TRT_DetDescrDB_ParameterInterface * parameterInterface =
new TRT_DetDescrDB_ParameterInterface(
getAthenaComps());
151 m_data.reset(parameterInterface);
152
153
155
156
157 std::vector<GeoTrf::Transform3D> shellPosVec;
159 for (
size_t r=0;
r<trtShellPosVecRecordSet->
size();
r++) {
160 const IRDBRecord * trtShellPosVecRecord = (*trtShellPosVecRecordSet)[
r];
162 double xy=trtShellPosVecRecord->
getDouble(
"xy");
163 double xz=trtShellPosVecRecord->
getDouble(
"xz");
164
165 double yx=trtShellPosVecRecord->
getDouble(
"yx");
167 double yz=trtShellPosVecRecord->
getDouble(
"yz");
168
169 double zx=trtShellPosVecRecord->
getDouble(
"zx");
170 double zy=trtShellPosVecRecord->
getDouble(
"zy");
171 double zz=trtShellPosVecRecord->
getDouble(
"zz");
172
175 double dz=trtShellPosVecRecord->
getDouble(
"dz");
176 Eigen::Matrix4d M;
177 M(0,0)=
xx; M(0,1)=xy; M(0,2)=xz; M(0,3)=
dx;
178 M(1,0)=yx; M(1,1)=
yy; M(1,2)=yz; M(1,3)=
dy;
179 M(2,0)=zx; M(2,1)=zy; M(2,2)=zz; M(2,3)=dz;
180 M(3,0)= 0; M(3,1)= 0; M(3,2)= 0; M(3,3)=1;
181 GeoTrf::Transform3D
T;
183 shellPosVec.push_back(T);
184 }
185
186
187 const TRT_ID *idHelper = nullptr;
188
191 }
192
194
195
196
197
200
201
202
203 std::string versionTag =
m_data->versionTag;
204 std::string versionName = "DC2";
205 std::string
layout =
"Final";
207 int versionMajorNumber = 2;
208 int versionMinorNumber = 1;
209 int versionPatchNumber = 0;
210
212
213
216 versionMajorNumber = 3;
217 versionName = "Rome";
219 }
220
221 if (
m_data->isCosmicRun) {
224 }
225
226
227
228
229
230 if (!
m_data->oldConfiguration) {
231 versionName =
m_data->versionName;
234 versionMajorNumber = 4;
235 versionMinorNumber = 1;
236 versionPatchNumber = 1;
237 }
238
239 InDetDD::Version
version(versionTag,
240 versionName,
241 layout,
243 versionMajorNumber,
244 versionMinorNumber,
245 versionPatchNumber);
246
248
249
250
253
254
255
256
257
258
259
260 const int AlignmentLevelSubWheel = 1;
261 const int AlignmentLevelModule = 2;
262 const int AlignmentLevelTop = 3;
263
265
270
271 if (pBarrelVol) {
275 }
276 if (pEndCapABPlus) {
278 }
279 if (pEndCapABMinus) {
281 }
282 }
283
284 else {
286
290
291 if (pBarrelVol) {
295 }
296
297 if (pEndCapABPlus) {
299 }
300 if (pEndCapABMinus) {
302 }
303 }
304
305
307 }
308
309
310
311
312
313
314
315
316 for (
unsigned int m=0;
m<
m_data->nBarrelRings;
m++) {
318 }
319
321
323
324 unsigned int nEndcapWheels = 0;
325 if (pEndCapABPlus||pEndCapABMinus) nEndcapWheels +=
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels;
326 if (pEndCapCPlus||pEndCapCMinus) nEndcapWheels +=
m_data->endcapNumberOfCWheels;
327
330
332 unsigned int nlayers;
333 if ( w < m_data->endcapNumberOfAWheels )
334 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelA;
335 else if ( w < (
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels ) )
336 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelB;
337 else
338 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelC;
340 }
341
342
343
344
345
346
347 if (pBarrelVol) {
348
349 ATH_MSG_DEBUG(
"Virtual TRT Barrel volume defined by RMin = "<<
m_data->virtualBarrelInnerRadius
350 <<
", Rmax = "<<
m_data->virtualBarrelOuterRadius<<
" Zmax = "<<
m_data->virtualBarrelVolumeLength );
351
352
353
354
355 GeoAlignableTransform * barrelTransform = mapAX["TRTBarrel"];
356
358
360 m_detectorManager->addAlignableTransform(AlignmentLevelTop,
id, barrelTransform, pBarrelVol);
361
362 }
363
364 if (pEndCapABPlus) {
365
366 GeoAlignableTransform *
transform = mapAX[
"TRTEndCapABPlus"];
367
370 m_detectorManager->addAlignableTransform(AlignmentLevelTop,
id, transform, pEndCapABPlus);
371 }
372
373 if (pEndCapABMinus) {
374
375 GeoAlignableTransform *
transform = mapAX[
"TRTEndCapABMinus"];
376
379 m_detectorManager->addAlignableTransform(AlignmentLevelTop,
id, transform, pEndCapABMinus);
380 }
381
382 if (pEndCapCPlus) {
384 }
385 if (pEndCapCMinus) {
387 }
388
389 GeoFullPhysVol *pCommonEndcapAB[]={pEndCapABPlus,pEndCapABMinus};
390 GeoFullPhysVol *pCommonEndcapC[]={pEndCapCPlus,pEndCapCMinus};
391
392
393
394
395
396
397
398 if (pBarrelVol) {
399
400
401
402
403
404
405
406
407 std::vector<InDetDD::TRT_BarrelDescriptor *> bDescriptor;
408
409
410
411
413
415
416
417 for (
size_t iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
418
419 GeoTrf::Transform3D shellPosition=shellPosVec[iABC];
420
421
422
423
424
425 size_t nStrawsWithLargeDeadRegion = 0;
426 if (iABC==0) {
427 for (
size_t iLayer = 0; iLayer<
m_data->barrelNumberOfLayersWithLargeDeadRegion; iLayer++) {
428 nStrawsWithLargeDeadRegion +=
m_data->barrelNumberOfStrawsInStrawLayer[iABC][iLayer];
429 }
430 }
431
432
433 GeoTrf::TranslateX3D Xx(1.0);
434 GeoTrf::TranslateY3D Xy(1.0);
435
436 GENFUNCTION fx = ArrayFunction(&
m_data->strawXPosition[iABC][0+nStrawsWithLargeDeadRegion],
437 &
m_data->strawXPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
438
439 GENFUNCTION fy = ArrayFunction(&
m_data->strawYPosition[iABC][0+nStrawsWithLargeDeadRegion],
440 &
m_data->strawYPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
441 TRANSFUNCTION tx1 = Pow(Xx,fx)*Pow(Xy,fy);
442
443
444
445 GENFUNCTION fxAll = ArrayFunction(&
m_data->strawXPosition[iABC][0], &
m_data->strawXPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
446 GENFUNCTION fyAll = ArrayFunction(&
m_data->strawYPosition[iABC][0], &
m_data->strawYPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
447 TRANSFUNCTION tx1All = Pow(Xx,fxAll)*Pow(Xy,fyAll);
448
449
451
452
453
454
455 GeoTrf::Vector3D Align1Global(
m_data->barrelXOfFirstGlobalAlignmentStraw[iABC],
m_data->barrelYOfFirstGlobalAlignmentStraw[iABC], 0);
456 GeoTrf::Vector3D Align2Global(
m_data->barrelXOfSecondGlobalAlignmentStraw[iABC],
m_data->barrelYOfSecondGlobalAlignmentStraw[iABC],0);
457 GeoTrf::Vector3D Align1Local(
m_data->strawXPosition[iABC][0],
m_data->strawYPosition[iABC][0],0);
458 GeoTrf::Vector3D Align2Local(
m_data->strawXPosition[iABC][
m_data->barrelIndexOfSecondGlobalAlignmentStraw[iABC]],
459 m_data->strawYPosition[iABC][
m_data->barrelIndexOfSecondGlobalAlignmentStraw[iABC]],0);
460
461
462
463
464
465 GeoTrf::Vector2D local12((Align2Local - Align1Local).
x(),(Align2Local - Align1Local).
y());
466 GeoTrf::Vector2D global12((Align2Global - Align1Global).
x(),(Align2Global - Align1Global).
y());
467 double zrotang = global12.phi()-local12.phi();
468
469
470
471 GeoTrf::Transform3D absStrawXForm = GeoTrf::Translate3D(Align1Global.x(),Align1Global.y(),Align1Global.z())
472 *GeoTrf::RotateZ3D( zrotang )
473 *GeoTrf::Translate3D(-Align1Local.x(),-Align1Local.y(),-Align1Local.z());
474
475
477
478
479 TRANSFUNCTION tx2=shellPosition.inverse()*absStrawXForm*tx1;
480 TRANSFUNCTION tx2All=shellPosition.inverse()*absStrawXForm*tx1All;
481 if (iABC==0) {
482
484 } else {
486 }
487
488
489
490 double oldx=-999*GeoModelKernelUnits::cm, oldz=-999*GeoModelKernelUnits::cm;
492 size_t iLayer=0;
493 while (c< m_data->barrelNumberOfStrawsInModule[iABC] ) {
494
495 GeoTrf::Vector3D
p(0,0,0);
496 if (iABC==0)
498 else
500
503
504
505 if (sqrt((
x-oldx)*(
x-oldx)+ (
z-oldz)*(
z-oldz))> 5*GeoModelKernelUnits::cm) {
506 iLayer++;
507 bDescriptor.push_back(new InDetDD::TRT_BarrelDescriptor());
509 bDescriptor.back()->setStrawTransformField(
m_detectorManager->barrelTransformField(iABC),c);
510
511
512
513
514
515
516 if((iABC==0)&&(iLayer<=m_data->barrelNumberOfLayersWithLargeDeadRegion )) {
517
518 double lengthOfActiveGas=
519 (
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 -
m_data->lengthOfDeadRegion-
m_data->barrelLengthOfLargeDeadRegion;
520 double startZOfActiveGas=activeGasZPositionStrawsWithLargeDeadRegion-lengthOfActiveGas/2.0;
521 bDescriptor.back()->strawZPos(activeGasZPositionStrawsWithLargeDeadRegion);
522 bDescriptor.back()->strawZDead(startZOfActiveGas);
523 bDescriptor.back()->strawLength(lengthOfActiveGas);
524 } else {
525 double lengthOfActiveGas=(
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 - 2*
m_data->lengthOfDeadRegion;
526 double startZOfActiveGas=activeGasZPositionNormalStraws-lengthOfActiveGas/2.0;
527 bDescriptor.back()->strawZPos(activeGasZPositionNormalStraws);
528 bDescriptor.back()->strawZDead(startZOfActiveGas);
529 bDescriptor.back()->strawLength(lengthOfActiveGas);
530 }
531
532 }
533 bDescriptor.back()->addStraw(
z,
x);
536
537 }
538
539
540 std::set<const GeoVPhysVol *> barrelFibreRadiators;
541 std::set<const GeoVPhysVol *> strawPlanes;
542
543
544 for (
size_t iMod = 0; iMod<
m_data->nBarrelModulesUsed;iMod++) {
545 GeoFullPhysVol * pShell = mapFPV["TRTShell-"+std::to_string(iABC)+"-"+std::to_string(iMod)];
546 GeoAlignableTransform * xfx1 = mapAX["TRTShell-"+std::to_string(iABC)+"-"+std::to_string(iMod)];
547
548
549
550 GeoVolumeCursor
cursor(pShell);
552 if (
cursor.getVolume()->getLogVol()->getName().find(
"FibreRadiator") != std::string::npos) {
553 barrelFibreRadiators.insert(
cursor.getVolume().get());
554 }
556 }
557
558
559
560
561
562 Identifier idModule = idHelper->
module_id(-1, iMod, iABC);
563
564 m_detectorManager->addAlignableTransform(AlignmentLevelModule, idModule, xfx1, pShell, pBarrelVol);
565
566 Identifier TRT_Identifier = idHelper->
straw_id(1, iMod, iABC, 1, 1);
570
571
572
573
574
575
576
577 unsigned int nStrawLayers =
m_detectorManager->getNumerology()->getNBarrelLayers(iABC);
578 for (unsigned int iStrawLayer=0;iStrawLayer<nStrawLayers; iStrawLayer++) {
579
580 unsigned int jStrawLayer=iStrawLayer;
581 if (iABC>0) jStrawLayer +=
m_detectorManager->getNumerology()->getNBarrelLayers(0);
582 if (iABC>1) jStrawLayer +=
m_detectorManager->getNumerology()->getNBarrelLayers(1);
583
584
585 InDetDD::TRT_BarrelDescriptor *bD=bDescriptor[jStrawLayer];
586
587 InDetDD::TRT_BarrelElement *element0 =
new InDetDD::TRT_BarrelElement(pShell, bD, 0 , iABC, iMod, iStrawLayer, idHelper,
m_detectorManager->conditions());
588 InDetDD::TRT_BarrelElement *element1 =
new InDetDD::TRT_BarrelElement(pShell, bD, 1 , iABC, iMod, iStrawLayer, idHelper,
m_detectorManager->conditions());
589
592 }
593
594 }
595
596 }
597
598
599 for (
unsigned int e=0;
e<2;
e++) {
600 for (
unsigned int iMod=0;iMod<
m_data->nBarrelModulesUsed; iMod++) {
601 InDetDD::TRT_BarrelElement *prev=nullptr;
602 for (
unsigned int iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
605 if (prev && current) {
608 }
610 }
611 }
612 }
613 }
614
615
616 for (
unsigned int e=0;
e<2;
e++) {
617 for (
unsigned int iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
619 InDetDD::TRT_BarrelElement *prev=nullptr;
620 for (
unsigned int iMod=0;iMod<
m_data->nBarrelModulesUsed; iMod++) {
622 if (prev && current) {
624 current->setPreviousInPhi(prev);
625 }
627 }
628 if (
m_data->nBarrelModulesUsed==
m_data->nBarrelModules) {
631 if (first && last) {
632 first->setPreviousInPhi(last);
634 }
635 }
636 }
637 }
638 }
639 }
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654 if (!(pEndCapABPlus || pEndCapABMinus || pEndCapCPlus || pEndCapCMinus)){
655 return;
656 }
657 unsigned int firstIndexOfA = 0;
658 unsigned int firstIndexOfB =
m_data->endcapNumberOfAWheels;
659 unsigned int firstIndexOfC =
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels;
660
661 unsigned int indexUpperBound = firstIndexOfA +
m_detectorManager->getNumerology()->getNEndcapWheels();
662
663 if (
m_data->initialLayout) indexUpperBound = firstIndexOfC;
664
665 const unsigned int nSides = 2;
666 const unsigned int nStrawLayMaxEc = 8;
667
668 unsigned int iiSide, iiWheel, iiPlane, iiPhi,
counter;
669 GeoFullPhysVol *childPlane = nullptr;
670
671
672 double RotationsOfStrawPlanes[nStrawLayMaxEc];
673 double shiftForEachRotation =
m_data->endCapShiftForEachRotation;
674 RotationsOfStrawPlanes[0] = 0.;
675
676 bool oldGeometry = true;
677
678 if (shiftForEachRotation < 0) oldGeometry = false;
679
680 if (oldGeometry) {
681
683 {
684 RotationsOfStrawPlanes[
counter] = RotationsOfStrawPlanes[
counter-1] + shiftForEachRotation;
685 if (RotationsOfStrawPlanes[counter] >= 1.)
686 RotationsOfStrawPlanes[
counter] -= 1.;
687 }
688 } else {
689
690 double RotationsOfStrawPlanesTmp[nStrawLayMaxEc] = {0,0,0,0,2,2,2,2};
692 {
693 RotationsOfStrawPlanes[
counter] = (
counter * shiftForEachRotation) + RotationsOfStrawPlanesTmp[counter];
694 }
695 }
696
697
698 std::vector<InDetDD::TRT_EndcapDescriptor*> descriptorsAB[nSides][nStrawLayMaxEc];
699 std::vector<InDetDD::TRT_EndcapDescriptor*> descriptorsC[nSides][nStrawLayMaxEc];
700 InDetDD::TRT_EndcapDescriptor* pDescriptor = nullptr;
701 InDetDD::TRT_EndcapElement* element = nullptr;
702
703 for(iiSide = 0; iiSide<nSides; iiSide++) {
704 for(iiPlane = 0; iiPlane < nStrawLayMaxEc; iiPlane++) {
705 descriptorsAB[iiSide][iiPlane].resize (
m_data->nEndcapPhi);
706 descriptorsC[iiSide][iiPlane].resize (
m_data->nEndcapPhi);
707 }
708 }
709
710
711
712
713 if (pEndCapABPlus || pEndCapABMinus) {
714
715
716
717
719
720
721
722 double deltaPhiForStrawsA = 360.*GeoModelKernelUnits::deg/
m_data->endcapNumberOfStrawsInStrawLayer_AWheels;
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757 for(iiSide=0; iiSide<nSides; iiSide++) {
758
759 if (pCommonEndcapAB[iiSide]) {
760
761 for(iiWheel=firstIndexOfA; iiWheel < firstIndexOfB; iiWheel++)
762 {
763
764
765 GeoFullPhysVol* pWheelA = mapFPV["TRTWheelA-"
766 +std::to_string(iiSide)+"-"
767 +std::to_string(iiWheel)];
768
769 GeoAlignableTransform * xfAlignableModule = nullptr;
770
771
772 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelA; iiPlane++)
773 {
774
775
776
777
778 if (iiPlane % 4 == 0) {
779
780 int barrel_ec = (iiSide) ? -2 : +2;
781 xfAlignableModule = mapAX["TRTWheelA-StrawPlane-"
782 +std::to_string(iiSide)+"-"
783 +std::to_string(iiWheel)+"-"
784 +std::to_string(iiPlane)];
785
786 Identifier idSubModule = idHelper->
layer_id(barrel_ec, 0, iiWheel, iiPlane);
787
788
789 m_detectorManager->addAlignableTransform(AlignmentLevelSubWheel, idSubModule, xfAlignableModule, pWheelA);
790 }
791
792
793 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsA;
794
795
796 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
797 phiPlane += deltaPhiForStrawsA;
798 }
799
800 Identifier TRT_Identifier;
801 int bar_ec = (iiSide) ? -2 : +2;
802 TRT_Identifier = idHelper->
straw_id(bar_ec, 1, iiWheel, 1, 1);
805
806
807 childPlane = mapFPV["TRTWheelA-StrawPlane-"
808 +std::to_string(iiSide)+"-"
809 +std::to_string(iiWheel)+"-"
810 +std::to_string(iiPlane)];
811
813
814
815
816 if(iiWheel==firstIndexOfA && iiPlane < nStrawLayMaxEc)
817 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
818 {
819
820 pDescriptor = new InDetDD::TRT_EndcapDescriptor();
822
823 pDescriptor->
nStraws() =
m_data->endcapNumberOfStrawsInStrawLayer_AWheels/
m_data->nEndcapPhi;
824 pDescriptor->
strawPitch() = deltaPhiForStrawsA;
825
826 double startPhi = phiPlane + iiPhi * pDescriptor->
strawPitch() * pDescriptor->
nStraws();
827
828
829
830
831
832 if (iiSide) {
833 startPhi = GeoModelKernelUnits::pi - (startPhi + pDescriptor->
strawPitch() * (pDescriptor->
nStraws() - 1));
834 }
835
836
837 if (startPhi <= -GeoModelKernelUnits::pi) startPhi += 2*GeoModelKernelUnits::pi;
838 if (startPhi > GeoModelKernelUnits::pi) startPhi -= 2*GeoModelKernelUnits::pi;
839
841
842 pDescriptor->
strawLength() =
m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA
843 - 2*
m_data->lengthOfDeadRegion -
m_data->endCapRadialThicknessOfInnerSupportA -
m_data->endCapInnerRadiusOfSupportA;
844 pDescriptor->
innerRadius() =
m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA
845 +
m_data->lengthOfDeadRegion;
847
848 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi] = pDescriptor;
849 }
850
851 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
852 {
853
854
855
856
857 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
858 element = new InDetDD::TRT_EndcapElement(childPlane,
859 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
860 iiSide==0,
861 iiWheel,
862 iiPlane,
863 iiPhiOffline,
864 idHelper,
867 }
868 }
869
870
871
872 GeoAlignableTransform * xfWheel = mapAX["TRTWheelA-"
873 +std::to_string(iiSide)+"-"
874 +std::to_string(iiWheel)];
875
876
877 int barrel_ec = (iiSide) ? -2 : +2;
878 Identifier idModule = idHelper->
module_id(barrel_ec, 0, iiWheel);
879 m_detectorManager->addAlignableTransform(AlignmentLevelModule, idModule, xfWheel, pWheelA);
880
881 }
882 }
883 }
884
885
886
887
888
889
891
892 for(iiSide=0; iiSide<nSides; iiSide++) {
893
894
895 if (pCommonEndcapAB[iiSide]) {
896 for(iiWheel=firstIndexOfB; iiWheel < firstIndexOfC; iiWheel++)
897 {
898
899 GeoFullPhysVol* pWheelB = mapFPV["TRTWheelB-"
900 +std::to_string(iiSide)+"-"
901 +std::to_string(iiWheel)];
902
903 GeoAlignableTransform * xfAlignableModule = nullptr;
904
905
906 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelB; iiPlane++)
907 {
908
909
910
911
912
913 if (iiPlane % 4 == 0) {
914
915 int barrel_ec = (iiSide) ? -2 : +2;
916 xfAlignableModule = mapAX["TRTWheelB-StrawPlane-"
917 +std::to_string(iiSide)+"-"
918 +std::to_string(iiWheel)+"-"
919 +std::to_string(iiPlane)];
920
921
922
923 Identifier idSubModule = idHelper->
layer_id(barrel_ec, 0, iiWheel, iiPlane);
924
925
926 m_detectorManager->addAlignableTransform(AlignmentLevelSubWheel, idSubModule, xfAlignableModule, pWheelB);
927 }
928
929 Identifier TRT_Identifier;
930 int bar_ec = (iiSide) ? -2 : +2;
931 TRT_Identifier = idHelper->
straw_id(bar_ec, 1, iiWheel, 1, 1);
934
935 childPlane = mapFPV["TRTWheelB-StrawPlane-"
936 +std::to_string(iiSide)+"-"
937 +std::to_string(iiWheel)+"-"
938 +std::to_string(iiPlane)];
940
941
942
943
944 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
945 {
946
947
948
949
950 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
951 element = new InDetDD::TRT_EndcapElement(childPlane,
952 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
953 iiSide==0,
954 iiWheel,
955 iiPlane,
956 iiPhiOffline,
957 idHelper,
960 }
961 }
962
963
964 GeoAlignableTransform * xfWheel = mapAX["TRTWheelB-"
965 +std::to_string(iiSide)+"-"
966 +std::to_string(iiWheel)];
967
968 int barrel_ec = (iiSide) ? -2 : +2;
969 Identifier idModule = idHelper->
module_id(barrel_ec, 0, iiWheel);
970 m_detectorManager->addAlignableTransform(AlignmentLevelModule, idModule, xfWheel, pWheelB);
971 }
972 }
973 }
974
975 }
976
977
978
979 if (pEndCapCPlus || pEndCapCMinus) {
980
982
983
984 double deltaPhiForStrawsC = 360.*GeoModelKernelUnits::deg/
m_data->endcapNumberOfStrawsInStrawLayer_CWheels;
985
986 for(iiSide=0; iiSide<nSides; iiSide++) {
987
988 if (pCommonEndcapC[iiSide]) {
989 for(iiWheel=firstIndexOfC; iiWheel < indexUpperBound; iiWheel++)
990 {
991 GeoFullPhysVol* pWheelC = mapFPV["TRTWheelC-"
992 +std::to_string(iiSide)+"-"
993 +std::to_string(iiWheel)];
994
995
996
997
998 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelC; iiPlane++)
999 {
1000
1001 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsC;
1002
1003
1004 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
1005 phiPlane += deltaPhiForStrawsC;
1006 }
1007
1008
1009
1010 childPlane = mapFPV["TRTWheelC-StrawPlane-"
1011 +std::to_string(iiSide)+"-"
1012 +std::to_string(iiWheel)+"-"
1013 +std::to_string(iiPlane)];
1014
1015
1016
1017
1018 if(iiWheel==firstIndexOfC && iiPlane < nStrawLayMaxEc)
1019 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1020 {
1021 pDescriptor = new InDetDD::TRT_EndcapDescriptor();
1023
1024 pDescriptor->
nStraws() =
m_data->endcapNumberOfStrawsInStrawLayer_CWheels/
m_data->nEndcapPhi;
1025 pDescriptor->
strawPitch() = deltaPhiForStrawsC;
1026
1027
1028 double startPhi = phiPlane + iiPhi * pDescriptor->
strawPitch() * pDescriptor->
nStraws();
1029
1030
1031
1032 if (iiSide) {
1033 startPhi = GeoModelKernelUnits::pi - (startPhi + pDescriptor->
strawPitch() * (pDescriptor->
nStraws() - 1));
1034 }
1035
1036
1037 if (startPhi <= -GeoModelKernelUnits::pi) startPhi += 2*GeoModelKernelUnits::pi;
1038 if (startPhi > GeoModelKernelUnits::pi) startPhi -= 2*GeoModelKernelUnits::pi;
1039
1040
1041 pDescriptor->
startPhi() = startPhi;
1042
1043 pDescriptor->
strawLength() =
m_data->endCapOuterRadiusOfSupportC -
m_data->endCapRadialThicknessOfOuterSupportC
1044 - 2*
m_data->lengthOfDeadRegion -
m_data->endCapRadialThicknessOfInnerSupportC -
m_data->endCapInnerRadiusOfSupportC;
1045 pDescriptor->
innerRadius() =
m_data->endCapInnerRadiusOfSupportC +
m_data->endCapRadialThicknessOfInnerSupportC +
m_data->lengthOfDeadRegion;
1047
1048
1049 descriptorsC[iiSide][iiPlane%nStrawLayMaxEc][iiPhi] = pDescriptor;
1050 }
1051
1052
1053 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1054 {
1055
1056
1057
1058
1059 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
1060 element = new InDetDD::TRT_EndcapElement(childPlane,
1061 descriptorsC[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
1062 iiSide==0,
1063 iiWheel,
1064 iiPlane,
1065 iiPhiOffline,
1066 idHelper,
1069 }
1070 }
1071
1072
1073
1074 GeoAlignableTransform * xfWheel = mapAX["TRTWheelC-"
1075 +std::to_string(iiSide)+"-"
1076 +std::to_string(iiWheel)];
1077
1078
1079 int barrel_ec = (iiSide) ? -2 : +2;
1080 Identifier idModule = idHelper->
module_id(barrel_ec, 0, iiWheel);
1081 m_detectorManager->addAlignableTransform(AlignmentLevelModule, idModule, xfWheel, pWheelC);
1082
1083
1084 }
1085 }
1086 }
1087
1088 }
1089
1090
1091
1092 for (iiSide=0; iiSide<2; iiSide++)
1093 for(iiPhi=0; iiPhi<
m_data->nEndcapPhi; iiPhi++)
1094 {
1095 InDetDD::TRT_EndcapElement *prev = nullptr;
1096 for (iiWheel=0; iiWheel<indexUpperBound; iiWheel++)
1097 for (iiPlane=0; iiPlane<
m_detectorManager->getNumerology()->getNEndcapLayers(iiWheel); iiPlane++)
1098 {
1100 if (prev && current)
1101 {
1103 current->setPreviousInZ(prev);
1104 }
1106 }
1107 }
1108}
std::shared_ptr< IRDBRecordset > IRDBRecordset_ptr
virtual IRDBRecordset_ptr getRecordsetPtr(const std::string &node, const std::string &tag, const std::string &tag2node="", const std::string &connName="ATLASDD")=0
Provides access to the Recordset object containing HVS-tagged data.
virtual double getDouble(const std::string &fieldName) const =0
Get double field value.
virtual unsigned int size() const =0
InDetDD::AthenaComps * getAthenaComps()
IRDBAccessSvc * rdbAccessSvc()
StoreGateSvc * detStore()
void setNextInPhi(const TRT_BarrelElement *element)
Sets the next-in-phi detector.
void setNextInR(const TRT_BarrelElement *element)
Sets the next-in-r detector.
double & strawPitch()
The straw pitch (angular!
void setStrawTransformField(const GeoXF::Function *xf, size_t offsetInto)
Sets the transform field for straws and offset.
double & startPhi()
The starting phi (angular!
unsigned int & nStraws()
The number of straws in a module:
double & innerRadius()
The inner radius:
void setNextInZ(const TRT_EndcapElement *element)
Set Next in Z.
void refreshGasEndcap(int strawStatusHT, GeoVPhysVol *strawPlane)
GeoIntrusivePtr< const GeoMaterial > m_argonGas
InDetDD::TRT_DetectorManager * m_detectorManager
GeoIntrusivePtr< const GeoMaterial > m_xenonGas
void setEndcapTransformField(size_t w)
double activeGasZPosition(bool hasLargeDeadRegion=false) const
void refreshGasBarrel(int strawStatusHT, GeoVPhysVol *shell)
Identifier layer_id(int barrel_ec, int phi_module, int layer_or_wheel, int straw_layer) const
For an individual straw layer.
Identifier straw_id(int barrel_ec, int phi_module, int layer_or_wheel, int straw_layer, int straw) const
Three ways of getting id for a single straw:
Identifier module_id(int barrel_ec, int phi_module, int layer_or_wheel) const
For an individual module phi sector.
Identifier barrel_ec_id(int barrel_ec) const
For +/-barrel or +/-endcap id.
std::string description
glabal timer - how long have I taken so far?
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
retrieve(aClass, aKey=None)