132{
133
135
136 std::ofstream strawStatusFile;
138 strawStatusFile.open("StrawStatus.txt");
139 }
140
141
142
143 ATH_MSG_DEBUG(
" Getting primary numbers from the Detector Description Database " );
144 TRT_DetDescrDB_ParameterInterface * parameterInterface =
new TRT_DetDescrDB_ParameterInterface(
getAthenaComps());
145 m_data.reset(parameterInterface);
146
147
148
151
152
154
155
157 if (!
m_doArgon )
ATH_MSG_DEBUG(
"Tool setup will force to NOT to use ARGON. Ignore this warning if you are running RECONSTRUCTION or DIGI, but cross-check if you are running SIMULATION");
158 if (!
m_doKrypton)
ATH_MSG_DEBUG(
"Tool setup will force to NOT to use KRYPTON. Ignore this warning if you are running RECONSTRUCTION or DIGI, but cross-check if you are running SIMULATION");
159
160
161
162
163
164
165
166 const TRT_ID *idHelper = nullptr;
167
170 }
171
173
174
175
176
179
180
181
182 std::string versionTag =
m_data->versionTag;
183 std::string versionName = "DC2";
184 std::string
layout =
"Final";
186 int versionMajorNumber = 2;
187 int versionMinorNumber = 1;
188 int versionPatchNumber = 0;
189
191
192
195 versionMajorNumber = 3;
196 versionName = "Rome";
198 }
199
200 if (
m_data->isCosmicRun) {
203 }
204
205
206
207
208
209 if (!
m_data->oldConfiguration) {
210 versionName =
m_data->versionName;
213 versionMajorNumber = 4;
214 versionMinorNumber = 1;
215 versionPatchNumber = 1;
216 }
217
218 InDetDD::Version
version(versionTag,
219 versionName,
220 layout,
222 versionMajorNumber,
223 versionMinorNumber,
224 versionPatchNumber);
225
227
228
229
230 ATH_MSG_INFO(
"In TRT Detector Factory (For DC2 and later geometries)" );
232
233
234
235
236 std::string barrelLabel = "Barrel";
237 std::string endcapA_WheelAB_Label = "EndcapA_WheelAB";
238 std::string endcapC_WheelAB_Label = "EndcapC_WheelAB";
239 std::string endcapA_WheelC_Label = "EndcapA_WheelC";
240 std::string endcapC_WheelC_Label = "EndcapC_WheelC";
241
242
243 if (
m_data->partPresent(
"EndcapAB_Plus")) {
244 barrelLabel = "Barrel";
245 endcapA_WheelAB_Label = "EndcapAB_Plus";
246 endcapC_WheelAB_Label = "EndcapAB_Minus";
247 endcapA_WheelC_Label = "EndcapC_Plus";
248 endcapC_WheelC_Label = "EndcapC_Minus";
249 }
250
251
252 bool barrelPresent =
m_data->partPresent(barrelLabel);
253 bool endcapABPlusPresent =
m_data->partPresent(endcapA_WheelAB_Label);
254 bool endcapABMinusPresent =
m_data->partPresent(endcapC_WheelAB_Label);
255 bool endcapCPlusPresent =
m_data->partPresent(endcapA_WheelC_Label);
256 bool endcapCMinusPresent =
m_data->partPresent(endcapC_WheelC_Label);
257
258 GeoTrf::Transform3D trtTransform =
m_data->partTransform(
"TRT");
259
260
261
262 if (
m_data->oldConfiguration) {
263 if (
m_data->isCosmicRun) {
264 endcapABPlusPresent = false;
265 endcapABMinusPresent = false;
266 endcapCPlusPresent = false;
267 endcapCMinusPresent = false;
268 }
269 if (
m_data->initialLayout) {
270 endcapCPlusPresent = false;
271 endcapCMinusPresent = false;
272 }
273 }
274
275
276
277
278
279
280
281
282
283 const int AlignmentLevelSubWheel = 1;
284 const int AlignmentLevelModule = 2;
285 const int AlignmentLevelTop = 3;
286
288
293
294 if (barrelPresent) {
298 }
299 if (endcapABPlusPresent) {
301 }
302 if (endcapABMinusPresent) {
304 }
305 }
306
307 else {
309
313
314 if (barrelPresent) {
318 }
319
320 if (endcapABPlusPresent) {
322 }
323 if (endcapABMinusPresent) {
325 }
326 }
327
328
330 }
331
332
333
334
335
336
337
338
339 for (
unsigned int m=0;
m<
m_data->nBarrelRings;
m++) {
341 }
342
344
346
347 unsigned int nEndcapWheels = 0;
348 if (endcapABPlusPresent||endcapABMinusPresent) nEndcapWheels +=
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels;
349 if (endcapCPlusPresent||endcapCMinusPresent) nEndcapWheels +=
m_data->endcapNumberOfCWheels;
350
353
355 unsigned int nlayers;
356 if ( w < m_data->endcapNumberOfAWheels )
357 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelA;
358 else if ( w < (
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels ) )
359 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelB;
360 else
361 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelC;
363 }
364
365
366
368
369 GeoFullPhysVol *pBarrelVol = nullptr;
370 GeoFullPhysVol *pEndCapABPlus = nullptr;
371 GeoFullPhysVol *pEndCapCPlus = nullptr;
372 GeoFullPhysVol *pEndCapABMinus = nullptr;
373 GeoFullPhysVol *pEndCapCMinus = nullptr;
374
375
376
377
378
379
380
381 if (barrelPresent) {
382 GeoTube* sBarrelVol =
new GeoTube(
m_data->virtualBarrelInnerRadius,
383 m_data->virtualBarrelOuterRadius,
384 m_data->virtualBarrelVolumeLength );
385
386
387 GeoLogVol *lBarrelVol =
new GeoLogVol(
"TRTBarrel", sBarrelVol,
m_materialManager->getMaterial(
"trt::CO2"));
388 pBarrelVol = new GeoFullPhysVol(lBarrelVol);
389
390 ATH_MSG_DEBUG(
"Virtual TRT Barrel volume defined by RMin = "<<
m_data->virtualBarrelInnerRadius
391 <<
", Rmax = "<<
m_data->virtualBarrelOuterRadius<<
" Zmax = "<<
m_data->virtualBarrelVolumeLength );
392
393
394
395
396 GeoAlignableTransform * barrelTransform =
397 new GeoAlignableTransform(trtTransform *
m_data->partTransform(barrelLabel));
398
399 world->add(topLevelNameTag);
400 world->add(barrelTransform);
401 world->add(pBarrelVol);
403
405 m_detectorManager->addAlignableTransform(AlignmentLevelTop,
id, barrelTransform, pBarrelVol);
406
407 }
408
409
410
411
412 GeoLogVol * lEndCapVolumeAB = nullptr;
413 if (endcapABPlusPresent || endcapABMinusPresent) {
414 GeoTube * sEndCapVolumeAB_unshifted =
new GeoTube (
m_data->innerRadiusOfEndCapVolumeAB,
415 m_data->outerRadiusOfEndCapVolumeAB,
416 m_data->lengthOfEndCapVolumeAB/2.);
417 const GeoShape & sEndCapVolumeAB
418 = ( *sEndCapVolumeAB_unshifted << GeoTrf::TranslateZ3D(
m_data->positionOfEndCapVolumeAB));
419
420 lEndCapVolumeAB =
new GeoLogVol(
"TRTEndcapWheelAB", &sEndCapVolumeAB,
m_materialManager->getMaterial(
"trt::CO2"));
421 }
422
423 if (endcapABPlusPresent) {
424 pEndCapABPlus = new GeoFullPhysVol(lEndCapVolumeAB);
425
427 new GeoAlignableTransform(trtTransform *
m_data->partTransform(endcapA_WheelAB_Label));
428
429 world->add(topLevelNameTag);
430 world->add(transform);
431 world->add(new GeoIdentifierTag(0));
432 world->add(pEndCapABPlus);
435 m_detectorManager->addAlignableTransform(AlignmentLevelTop,
id, transform, pEndCapABPlus);
436 }
437
438 if (endcapABMinusPresent) {
439 pEndCapABMinus = new GeoFullPhysVol(lEndCapVolumeAB);
440
442 new GeoAlignableTransform(trtTransform *
m_data->partTransform(endcapC_WheelAB_Label) * GeoTrf::RotateY3D(180*GeoModelKernelUnits::deg));
443
444 world->add(topLevelNameTag);
445 world->add(transform);
446 world->add(new GeoIdentifierTag(1));
447 world->add(pEndCapABMinus);
450 m_detectorManager->addAlignableTransform(AlignmentLevelTop,
id, transform, pEndCapABMinus);
451 }
452
453
454
455
456 GeoLogVol * lEndCapVolumeC = nullptr;
457 if (endcapCPlusPresent || endcapCMinusPresent) {
458 GeoTube * sEndCapVolumeC_unshifted =
new GeoTube (
m_data->innerRadiusOfEndCapVolumeC,
459 m_data->outerRadiusOfEndCapVolumeC,
460 m_data->lengthOfEndCapVolumeC/2.);
461 const GeoShape & sEndCapVolumeC
462 = ( *sEndCapVolumeC_unshifted << GeoTrf::TranslateZ3D(
m_data->positionOfEndCapVolumeC));
463
464 lEndCapVolumeC =
new GeoLogVol(
"TRTEndcapWheelC", &sEndCapVolumeC,
m_materialManager->getMaterial(
"trt::CO2"));
465 }
466
467 if (endcapCPlusPresent) {
468 pEndCapCPlus = new GeoFullPhysVol(lEndCapVolumeC);
469
471 new GeoAlignableTransform(trtTransform *
m_data->partTransform(endcapA_WheelC_Label));
472
473 world->add(topLevelNameTag);
474 world->add(transform);
475 world->add(new GeoIdentifierTag(0));
476 world->add(pEndCapCPlus);
478 }
479
480 if (endcapCMinusPresent) {
481 pEndCapCMinus = new GeoFullPhysVol(lEndCapVolumeC);
482
484 new GeoAlignableTransform(trtTransform *
m_data->partTransform(endcapC_WheelC_Label) * GeoTrf::RotateY3D(180*GeoModelKernelUnits::deg));
485
486 world->add(topLevelNameTag);
487 world->add(transform);
488 world->add(new GeoIdentifierTag(0));
489 world->add(pEndCapCMinus);
491 }
492
493
494 GeoFullPhysVol *pCommonEndcapAB[2];
495 GeoFullPhysVol *pCommonEndcapC[2];
496
497 pCommonEndcapAB[0] = pEndCapABPlus;
498 pCommonEndcapAB[1] = pEndCapABMinus;
499 pCommonEndcapC[0] = pEndCapCPlus;
500 pCommonEndcapC[1] = pEndCapCMinus;
501
502
503
504
505
506
507
508 if (pBarrelVol) {
509 InDetDD::ExtraMaterial xMat(
m_data->distortedMatManager());
510 xMat.add(pBarrelVol, "TRTBarrel");
511 }
512 if (pEndCapABPlus) {
513 InDetDD::ExtraMaterial xMat(
m_data->distortedMatManager());
514 xMat.add(pEndCapABPlus, "TRTEndcap");
515 xMat.add(pEndCapABPlus, "TRTEndcapA");
516 }
517 if (pEndCapABMinus) {
518 InDetDD::ExtraMaterial xMat(
m_data->distortedMatManager());
519 xMat.add(pEndCapABMinus, "TRTEndcap");
520 xMat.add(pEndCapABMinus, "TRTEndcapC");
521 }
522
523
524 if (pEndCapCPlus) {
525 InDetDD::ExtraMaterial xMat(
m_data->distortedMatManager());
526 xMat.add(pEndCapCPlus, "TRTEndcap_WheelC");
527 xMat.add(pEndCapCPlus, "TRTEndcapA_WheelC");
528 }
529 if (pEndCapCMinus) {
530 InDetDD::ExtraMaterial xMat(
m_data->distortedMatManager());
531 xMat.add(pEndCapCMinus, "TRTEndcap_WheelC");
532 xMat.add(pEndCapCMinus, "TRTEndcapC_WheelC");
533 }
534
535
536
537
538
539
540
541
542
543
544 if (pBarrelVol) {
545
546
547
548
549
550
551 GeoTube *sBarrelInnerSupport =
new GeoTube(
m_data->innerRadiusOfBarrelVolume,
552 m_data->innerRadiusOfBarrelVolume +
m_data->thicknessOfBarrelInnerSupport,
553 m_data->lengthOfBarrelVolume/2);
554
555
556 GeoLogVol *lBarrelInnerSupport = new GeoLogVol("BarrelInnerSupport", sBarrelInnerSupport,
560
561
562 GeoPhysVol *pBarrelInnerSupport = new GeoPhysVol(lBarrelInnerSupport);
563 pBarrelVol->add(pBarrelInnerSupport);
564
565
566 GeoTube *sBarrelOuterSupport =
new GeoTube(
m_data->outerRadiusOfBarrelVolume -
m_data->thicknessOfBarrelOuterSupport,
567 m_data->outerRadiusOfBarrelVolume,
m_data->lengthOfBarrelVolume/2);
568
569 GeoLogVol *lBarrelOuterSupport = new GeoLogVol("BarrelOuterSupport", sBarrelOuterSupport,
573
574
575 GeoPhysVol *pBarrelOuterSupport = new GeoPhysVol(lBarrelOuterSupport);
576 pBarrelVol->add(pBarrelOuterSupport);
577
578
579
580 if (
m_data->includeBarServiceAndFlange) {
581
582
583
584
585
586
587
588
589 GeoTube *sEndFlangeRegion =
new GeoTube(
m_data->barFlangeRMin,
m_data->barFlangeRMax,
591 GeoLogVol *lEndFlangeRegion = new GeoLogVol("EndFlangeRegion", sEndFlangeRegion,
593
594 GeoPhysVol *pEndFlangeRegion = new GeoPhysVol(lEndFlangeRegion);
595
596 double zPosEndFlange = (
m_data->barFlangeZMin+
m_data->barFlangeZMax)/2;
597 GeoTransform *xfEndFlangeRegionPlus = new GeoTransform(GeoTrf::TranslateZ3D(zPosEndFlange));
598 GeoTransform *xfEndFlangeRegionMinus = new GeoTransform(GeoTrf::TranslateZ3D(-zPosEndFlange));
599
600 pBarrelVol->add(xfEndFlangeRegionPlus);
601 pBarrelVol->add(pEndFlangeRegion);
602 pBarrelVol->add(xfEndFlangeRegionMinus);
603 pBarrelVol->add(pEndFlangeRegion);
604
605
606
607
608
609
610
611
612 GeoTube *sServices =
new GeoTube(
m_data->barServicesRMin,
m_data->barServicesRMax,
614 GeoLogVol *lServices = new GeoLogVol("Services", sServices,
616
617 GeoPhysVol *pServices = new GeoPhysVol(lServices);
618
619 double zPosServices = (
m_data->barServicesZMin+
m_data->barServicesZMax)/2;
620 GeoTransform *xfServicesPlus = new GeoTransform(GeoTrf::TranslateZ3D(zPosServices));
621 GeoTransform *xfServicesMinus = new GeoTransform(GeoTrf::TranslateZ3D(-zPosServices));
622
623 pBarrelVol->add(xfServicesPlus);
624 pBarrelVol->add(pServices);
625 pBarrelVol->add(xfServicesMinus);
626 pBarrelVol->add(pServices);
627
628 }
629
630
631
632
633
634
635
636
637
638 std::vector<InDetDD::TRT_BarrelDescriptor *> bDescriptor;
639
640
641
642
643 GeoTube *sCoolingTube =
new GeoTube(0,
m_data->barrelOuterRadiusOfCoolingTube,
m_data->lengthOfBarrelVolume/2.0);
644 GeoLogVol *lCoolingTube =
new GeoLogVol(
"CoolingTube",sCoolingTube,
m_materialManager->getMaterial(
"trt::CoolingTube"));
645 GeoPhysVol *pCoolingTube = new GeoPhysVol(lCoolingTube);
646
647 GeoTube *sCoolingFluid =
new GeoTube(0,
m_data->barrelInnerRadiusOfCoolingTube,
m_data->lengthOfBarrelVolume/2.0);
648 GeoLogVol *lCoolingFluid =
new GeoLogVol(
"CoolingFluid",sCoolingFluid,
m_materialManager->getMaterial(
"trt::CoolingFluid"));
649 GeoPhysVol*pCoolingFluid = new GeoPhysVol(lCoolingFluid);
650
651 pCoolingTube->add(pCoolingFluid);
652
653 double lengthOfInnerDeadRegion=
m_data->lengthOfDeadRegion;
654 double lengthOfActiveGas = (
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 -
m_data->lengthOfDeadRegion - lengthOfInnerDeadRegion;
655 double activeGasZPositionNormalStraws = (lengthOfActiveGas +
m_data->barrelLengthOfTwister) / 2. + lengthOfInnerDeadRegion;
656
657 lengthOfInnerDeadRegion =
m_data->barrelLengthOfLargeDeadRegion;
658 lengthOfActiveGas = (
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 -
m_data->lengthOfDeadRegion - lengthOfInnerDeadRegion;
659 double activeGasZPositionStrawsWithLargeDeadRegion = (lengthOfActiveGas +
m_data->barrelLengthOfTwister) / 2. + lengthOfInnerDeadRegion;
660
661
662 for (
size_t iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
663
664
665
666 GeoLogVol *lRad = nullptr;
667 GeoLogVol *lShell = nullptr;
668
669
670 std::ostringstream shellstream;
671 shellstream << "Shell" << iABC;
672 GeoTrf::Vector2D shellCorner1(
m_data->shellCornerXPosition[iABC][0],
m_data->shellCornerYPosition[iABC][0]);
673 GeoTrf::Vector2D shellCorner2(
m_data->shellCornerXPosition[iABC][1],
m_data->shellCornerYPosition[iABC][1]);
674 GeoTrf::Vector2D shellCorner3(
m_data->shellCornerXPosition[iABC][2],
m_data->shellCornerYPosition[iABC][2]);
675 GeoTrf::Vector2D shellCorner4(
m_data->shellCornerXPosition[iABC][3],
m_data->shellCornerYPosition[iABC][3]);
676 GeoTrf::Transform3D shellPosition(GeoTrf::Transform3D::Identity());
677 if ( shellCorner1.y() <= 0 ) {
ATH_MSG_DEBUG(
"shellCorner1 is <= 0 (" << shellCorner1 <<
")"); }
678 if ( shellCorner2.y() <= 0 ) {
ATH_MSG_DEBUG(
"shellCorner2 is <= 0 (" << shellCorner2 <<
")"); }
679 if ( shellCorner3.y() <= 0 ) {
ATH_MSG_DEBUG(
"shellCorner3 is <= 0 (" << shellCorner3 <<
")" ); }
680 if ( shellCorner4.y() <= 0 ) {
ATH_MSG_DEBUG(
"shellCorner4 is <= 0 (" << shellCorner4 <<
")"); }
682 shellCorner1,shellCorner2,shellCorner3,shellCorner4,shellPosition);
683
684
685 std::ostringstream layerstr;
686 layerstr << iABC;
687
688 std::string shellMatName = "trt::ModuleShell"+layerstr.str();
689 std::string shellName = "ModuleShell"+layerstr.str();
690
693 lShell = new GeoLogVol(shellName, sShell, shellMat);
694
695
696
697
698
699 GeoTrf::Transform3D radAbsolutePosition(GeoTrf::Transform3D::Identity());
701 shellCorner1,shellCorner2,shellCorner3,shellCorner4,
702 radAbsolutePosition,
m_data->barrelThicknessOfModuleWalls);
703
704
705 std::string radMatName = "trt::FibreRadiator"+layerstr.str();
706 std::string radName = "FibreRadiator"+layerstr.str();
707
710
711 lRad = new GeoLogVol(radName, sRad, radMat);
712
713
714
715 GeoTransform *xCool1 = new GeoTransform(shellPosition.inverse()
716 *GeoTrf::Translate3D(
m_data->barrelXOfCoolingTube[iABC][0],
m_data->barrelYOfCoolingTube[iABC][0],0));
717 GeoTransform *xCool2 = new GeoTransform(shellPosition.inverse()
718 *GeoTrf::Translate3D(
m_data->barrelXOfCoolingTube[iABC][1],
m_data->barrelYOfCoolingTube[iABC][1],0));
719
720
721
722
723
724 size_t nStrawsWithLargeDeadRegion = 0;
725 if (iABC==0) {
726 for (
size_t iLayer = 0; iLayer<
m_data->barrelNumberOfLayersWithLargeDeadRegion; iLayer++) {
727 nStrawsWithLargeDeadRegion +=
m_data->barrelNumberOfStrawsInStrawLayer[iABC][iLayer];
728 }
729 }
730
731
732 GeoTrf::TranslateX3D Xx(1.0);
733 GeoTrf::TranslateY3D Xy(1.0);
734
735 GENFUNCTION fx = ArrayFunction(&
m_data->strawXPosition[iABC][0+nStrawsWithLargeDeadRegion],
736 &
m_data->strawXPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
737
738 GENFUNCTION fy = ArrayFunction(&
m_data->strawYPosition[iABC][0+nStrawsWithLargeDeadRegion],
739 &
m_data->strawYPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
740 TRANSFUNCTION tx1 = Pow(Xx,fx)*Pow(Xy,fy);
741
742
743 GENFUNCTION fxDead = ArrayFunction(&
m_data->strawXPosition[iABC][0], &
m_data->strawXPosition[iABC][0+nStrawsWithLargeDeadRegion]);
744 GENFUNCTION fyDead = ArrayFunction(&
m_data->strawYPosition[iABC][0], &
m_data->strawYPosition[iABC][0+nStrawsWithLargeDeadRegion]);
745 TRANSFUNCTION tx1Dead = Pow(Xx,fxDead)*Pow(Xy,fyDead);
746
747
748
749 GENFUNCTION fxAll = ArrayFunction(&
m_data->strawXPosition[iABC][0], &
m_data->strawXPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
750 GENFUNCTION fyAll = ArrayFunction(&
m_data->strawYPosition[iABC][0], &
m_data->strawYPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
751 TRANSFUNCTION tx1All = Pow(Xx,fxAll)*Pow(Xy,fyAll);
752
753
755
756
757
758
759 GeoTrf::Vector3D Align1Global(
m_data->barrelXOfFirstGlobalAlignmentStraw[iABC],
m_data->barrelYOfFirstGlobalAlignmentStraw[iABC], 0);
760 GeoTrf::Vector3D Align2Global(
m_data->barrelXOfSecondGlobalAlignmentStraw[iABC],
m_data->barrelYOfSecondGlobalAlignmentStraw[iABC],0);
761 GeoTrf::Vector3D Align1Local(
m_data->strawXPosition[iABC][0],
m_data->strawYPosition[iABC][0],0);
762 GeoTrf::Vector3D Align2Local(
m_data->strawXPosition[iABC][
m_data->barrelIndexOfSecondGlobalAlignmentStraw[iABC]],
763 m_data->strawYPosition[iABC][
m_data->barrelIndexOfSecondGlobalAlignmentStraw[iABC]],0);
764
765
766
767
768
769 GeoTrf::Vector2D local12((Align2Local - Align1Local).
x(),(Align2Local - Align1Local).
y());
770 GeoTrf::Vector2D global12((Align2Global - Align1Global).
x(),(Align2Global - Align1Global).
y());
771 double zrotang = global12.phi()-local12.phi();
772
773
774
775 GeoTrf::Transform3D absStrawXForm = GeoTrf::Translate3D(Align1Global.x(),Align1Global.y(),Align1Global.z())
776 *GeoTrf::RotateZ3D( zrotang )
777 *GeoTrf::Translate3D(-Align1Local.x(),-Align1Local.y(),-Align1Local.z());
778
779
781
782
783 TRANSFUNCTION tx2=shellPosition.inverse()*absStrawXForm*tx1;
784 TRANSFUNCTION tx2Dead=shellPosition.inverse()*absStrawXForm*tx1Dead;
785 TRANSFUNCTION tx2All=shellPosition.inverse()*absStrawXForm*tx1All;
786 if (iABC==0) {
787
789 } else {
791 }
792
793
794 double oldx=-999*GeoModelKernelUnits::cm, oldz=-999*GeoModelKernelUnits::cm;
796 size_t iLayer=0;
797 while (c< m_data->barrelNumberOfStrawsInModule[iABC] ) {
798
799 GeoTrf::Vector3D
p(0,0,0);
800 if (iABC==0)
802 else
804
807
808
809 if (sqrt((
x-oldx)*(
x-oldx)+ (
z-oldz)*(
z-oldz))> 5*GeoModelKernelUnits::cm) {
810 iLayer++;
811 bDescriptor.push_back(new InDetDD::TRT_BarrelDescriptor());
813 bDescriptor.back()->setStrawTransformField(
m_detectorManager->barrelTransformField(iABC),c);
814
815
816
817
818
819
820 if((iABC==0)&&(iLayer<=m_data->barrelNumberOfLayersWithLargeDeadRegion )) {
821
822 double lengthOfActiveGas=
823 (
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 -
m_data->lengthOfDeadRegion-
m_data->barrelLengthOfLargeDeadRegion;
824 double startZOfActiveGas=activeGasZPositionStrawsWithLargeDeadRegion-lengthOfActiveGas/2.0;
825 bDescriptor.back()->strawZPos(activeGasZPositionStrawsWithLargeDeadRegion);
826 bDescriptor.back()->strawZDead(startZOfActiveGas);
827 bDescriptor.back()->strawLength(lengthOfActiveGas);
828 } else {
829 double lengthOfActiveGas=(
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 - 2*
m_data->lengthOfDeadRegion;
830 double startZOfActiveGas=activeGasZPositionNormalStraws-lengthOfActiveGas/2.0;
831 bDescriptor.back()->strawZPos(activeGasZPositionNormalStraws);
832 bDescriptor.back()->strawZDead(startZOfActiveGas);
833 bDescriptor.back()->strawLength(lengthOfActiveGas);
834 }
835
836 }
837 bDescriptor.back()->addStraw(
z,
x);
840
841 }
842
843
844
845
846 pBarrelVol->add(new GeoSerialIdentifier(0));
847 for (
size_t iMod = 0; iMod<
m_data->nBarrelModulesUsed;iMod++) {
848 double delta = iMod*360*GeoModelKernelUnits::deg/
m_data->nBarrelModules;
849
850
851
852
853 GeoFullPhysVol * pShell = new GeoFullPhysVol(lShell);
854
855
856
857 GeoAlignableTransform * xfx1 = new GeoAlignableTransform(GeoTrf::RotateZ3D(delta)*shellPosition);
858 pBarrelVol->add(xfx1);
859 pBarrelVol->add(pShell);
860
861
862
863 Identifier idModule = idHelper->
module_id(-1, iMod, iABC);
864
865 m_detectorManager->addAlignableTransform(AlignmentLevelModule, idModule, xfx1, pShell, pBarrelVol);
866
867
868 pShell->add(new GeoIdentifierTag(iABC));
869 Identifier TRT_Identifier = idHelper->
straw_id(1, iMod, iABC, 1, 1);
873 strawStatusHT =
m_sumTool->getStatusHT(TRT_Identifier, Gaudi::Hive::currentContext());
874 strawStatusFile << TRT_Identifier.
get_compact() << std::format(
"{:5}",strawStatusHT) << std::endl;
875 }
876 else {
878 }
879 }
881
882
884 pRad->add(xCool1);
885 pRad->add(pCoolingTube);
886 pRad->add(xCool2);
887 pRad->add(pCoolingTube);
888 pRad->add(new GeoSerialIdentifier(0));
889
892
893 switch (agm)
894 {
896 ATH_MSG_DEBUG(
"Marking Argon straws from /TRT/Cond/StatusHT:\t"
900 break;
902 ATH_MSG_DEBUG(
"Marking Krypton straws from /TRT/Cond/StatusHT:\t"
906 break;
908 ATH_MSG_DEBUG(
"Marking Xenon straws from /TRT/Cond/StatusHT:\t"
911 pHoleForMixedStrawWithLargeDeadRegion =
makeStraw(
true);
912 break;
913 default:
915 throw std::runtime_error("Unexpected gas mixture");
916 return;
917 }
918
920 , &tx2
921 ,
m_data->barrelNumberOfStrawsInModule[iABC]-nStrawsWithLargeDeadRegion);
922
923 if (iABC==0) {
925 , &tx2Dead
926 , nStrawsWithLargeDeadRegion);
927 pRad->add(serialTransformerDead);
928 }
929 pRad->add(serialTransformer);
930
931 pShell->add(pRad);
932
933
934
935
936
937
938
939
940
941
942
943 unsigned int nStrawLayers =
m_detectorManager->getNumerology()->getNBarrelLayers(iABC);
944 for (unsigned int iStrawLayer=0;iStrawLayer<nStrawLayers; iStrawLayer++) {
945
946 unsigned int jStrawLayer=iStrawLayer;
947 if (iABC>0) jStrawLayer +=
m_detectorManager->getNumerology()->getNBarrelLayers(0);
948 if (iABC>1) jStrawLayer +=
m_detectorManager->getNumerology()->getNBarrelLayers(1);
949
950
951 InDetDD::TRT_BarrelDescriptor *bD=bDescriptor[jStrawLayer];
952
953 InDetDD::TRT_BarrelElement *element0 =
new InDetDD::TRT_BarrelElement(pShell, bD, 0 , iABC, iMod, iStrawLayer, idHelper,
m_detectorManager->conditions());
954 InDetDD::TRT_BarrelElement *element1 =
new InDetDD::TRT_BarrelElement(pShell, bD, 1 , iABC, iMod, iStrawLayer, idHelper,
m_detectorManager->conditions());
955
958 }
959
960 }
961
962 }
963
964
965 for (
unsigned int e=0;
e<2;
e++) {
966 for (
unsigned int iMod=0;iMod<
m_data->nBarrelModulesUsed; iMod++) {
967 InDetDD::TRT_BarrelElement *prev=nullptr;
968 for (
unsigned int iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
971 if (prev && current) {
974 }
976 }
977 }
978 }
979 }
980
981
982 for (
unsigned int e=0;
e<2;
e++) {
983 for (
unsigned int iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
985 InDetDD::TRT_BarrelElement *prev=nullptr;
986 for (
unsigned int iMod=0;iMod<
m_data->nBarrelModulesUsed; iMod++) {
988 if (prev && current) {
990 current->setPreviousInPhi(prev);
991 }
993 }
994 if (
m_data->nBarrelModulesUsed==
m_data->nBarrelModules) {
997 if (first && last) {
998 first->setPreviousInPhi(last);
1000 }
1001 }
1002 }
1003 }
1004 }
1005 }
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020 if (!(endcapABPlusPresent || endcapABMinusPresent || endcapCPlusPresent || endcapCMinusPresent)){
1021 return;
1022 }
1023 unsigned int firstIndexOfA = 0;
1024 unsigned int firstIndexOfB =
m_data->endcapNumberOfAWheels;
1025 unsigned int firstIndexOfC =
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels;
1026
1027 unsigned int indexUpperBound = firstIndexOfA +
m_detectorManager->getNumerology()->getNEndcapWheels();
1028
1029 if (
m_data->initialLayout) indexUpperBound = firstIndexOfC;
1030
1031 const unsigned int nSides = 2;
1032 const unsigned int nStrawLayMaxEc = 8;
1033
1034 unsigned int iiSide, iiWheel, iiPlane, iiPhi,
counter;
1036 double zdelta = 0.024;
1037 GeoTransform *xfRadiator, *xfPlane, *xfHeatExchanger, *xfFaradayFoilFront, *xfFaradayFoilBack;
1038 GeoTransform *xfInnerSupportGapperA,*xfOuterSupportGapperA, *xfInnerSupportGapperB, *xfOuterSupportGapperB;
1039 GeoFullPhysVol *childPlane = nullptr;
1040
1041
1042 double RotationsOfStrawPlanes[nStrawLayMaxEc];
1043 double shiftForEachRotation =
m_data->endCapShiftForEachRotation;
1044 RotationsOfStrawPlanes[0] = 0.;
1045
1046 bool oldGeometry = true;
1047
1048 if (shiftForEachRotation < 0) oldGeometry = false;
1049
1050 if (oldGeometry) {
1051
1053 {
1054 RotationsOfStrawPlanes[
counter] = RotationsOfStrawPlanes[
counter-1] + shiftForEachRotation;
1055 if (RotationsOfStrawPlanes[counter] >= 1.)
1056 RotationsOfStrawPlanes[
counter] -= 1.;
1057 }
1058 } else {
1059
1060 double RotationsOfStrawPlanesTmp[nStrawLayMaxEc] = {0,0,0,0,2,2,2,2};
1062 {
1063 RotationsOfStrawPlanes[
counter] = (
counter * shiftForEachRotation) + RotationsOfStrawPlanesTmp[counter];
1064 }
1065 }
1066
1067
1068 std::vector<InDetDD::TRT_EndcapDescriptor*> descriptorsAB[nSides][nStrawLayMaxEc];
1069 std::vector<InDetDD::TRT_EndcapDescriptor*> descriptorsC[nSides][nStrawLayMaxEc];
1070 InDetDD::TRT_EndcapDescriptor* pDescriptor = nullptr;
1071 InDetDD::TRT_EndcapElement* element = nullptr;
1072
1073 for(iiSide = 0; iiSide<nSides; iiSide++) {
1074 for(iiPlane = 0; iiPlane < nStrawLayMaxEc; iiPlane++) {
1075 descriptorsAB[iiSide][iiPlane].resize (
m_data->nEndcapPhi);
1076 descriptorsC[iiSide][iiPlane].resize (
m_data->nEndcapPhi);
1077 }
1078 }
1079
1080
1081
1082
1083 if (endcapABPlusPresent || endcapABMinusPresent) {
1084
1085
1086
1087 GeoTube* sInnerSupportA =
new GeoTube(
m_data->endCapInnerRadiusOfSupportA,
1088 m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA,
1089 m_data->endCapLengthOfWheelsA/2);
1090 GeoLogVol* lInnerSupportA =
new GeoLogVol(
"InnerSupportA", sInnerSupportA,
m_materialManager->getMaterial(
"trt::InnerSupportA"));
1091 GeoPhysVol* pInnerSupportA = new GeoPhysVol(lInnerSupportA);
1092
1093 GeoTube* sOuterSupportA =
new GeoTube(
m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA,
1094 m_data->endCapOuterRadiusOfSupportA,
m_data->endCapLengthOfWheelsA/2);
1095 GeoLogVol* lOuterSupportA =
new GeoLogVol(
"OuterSupportA", sOuterSupportA,
m_materialManager->getMaterial(
"trt::OuterSupportA"));
1096 GeoPhysVol* pOuterSupportA = new GeoPhysVol(lOuterSupportA);
1097
1098
1105 GeoIntrusivePtr<GeoFullPhysVol> pStrawPlaneA =
makeStrawPlane(firstIndexOfA);
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119 GeoTube* sMainRadiatorA =
new GeoTube(
m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA,
1120 m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA
1121 -
m_data->endCapRadialDistFromRadToOuterSupportA,
m_data->endCapMainRadiatorThicknessA/2);
1122 GeoLogVol* lMainRadiatorA =
new GeoLogVol(
"MainRadiatorA",sMainRadiatorA,
m_materialManager->getMaterial(
"trt::FoilRadiatorAC"));
1123 GeoPhysVol* pMainRadiatorA = new GeoPhysVol(lMainRadiatorA);
1124
1125 GeoTube* sThinRadiatorA =
new GeoTube(
m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA,
1126 m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA
1127 -
m_data->endCapRadialDistFromRadToOuterSupportA,
m_data->endCapThinRadiatorThicknessA/2);
1128 GeoLogVol* lThinRadiatorA =
new GeoLogVol(
"ThinRadiatorA",sThinRadiatorA,
m_materialManager->getMaterial(
"trt::FoilRadiatorAC"));
1129 GeoPhysVol* pThinRadiatorA = new GeoPhysVol(lThinRadiatorA);
1130
1131
1132 GeoTube* sWheelA =
new GeoTube(
m_data->endCapInnerRadiusOfSupportA,
m_data->endCapOuterRadiusOfSupportA,
m_data->endCapLengthOfWheelsA/2);
1133 GeoLogVol* lWheelA =
new GeoLogVol(
"WheelA", sWheelA,
m_materialManager->getMaterial(
"trt::CO2"));
1134
1135
1136 double deltaPhiForStrawsA = 360.*GeoModelKernelUnits::deg/
m_data->endcapNumberOfStrawsInStrawLayer_AWheels;
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171 for(iiSide=0; iiSide<nSides; iiSide++) {
1172
1173 if (pCommonEndcapAB[iiSide]) {
1174
1175 double WheelPlacerA =
m_data->endCapPositionOfFirstWheelA[iiSide];
1176
1177 for(iiWheel=firstIndexOfA; iiWheel < firstIndexOfB; iiWheel++)
1178 {
1179
1180 WheelPlacerA +=
m_data->endCapDistanceBetweenWheelCentersA[iiSide][iiWheel] ;
1181
1182 GeoFullPhysVol* pWheelA = new GeoFullPhysVol(lWheelA);
1183
1184 GeoAlignableTransform * xfAlignableModule = nullptr;
1185
1186
1187 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelA; iiPlane++)
1188 {
1189
1190
1191
1192
1193
1194
1195
1196 if (iiPlane % 4 == 0) {
1197
1198 int barrel_ec = (iiSide) ? -2 : +2;
1199 xfAlignableModule = new GeoAlignableTransform(GeoTrf::Transform3D::Identity());
1200 Identifier idSubModule = idHelper->
layer_id(barrel_ec, 0, iiWheel, iiPlane);
1201
1202
1203 m_detectorManager->addAlignableTransform(AlignmentLevelSubWheel, idSubModule, xfAlignableModule, pWheelA);
1204 }
1205
1206
1207 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsA;
1208
1209
1210 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
1211 phiPlane += deltaPhiForStrawsA;
1212 }
1213
1214 int bar_ec = (iiSide) ? -2 : +2;
1215 Identifier TRT_Identifier = idHelper->
straw_id(bar_ec, 1, iiWheel, 1, 1);
1219 strawStatusHT =
m_sumTool->getStatusHT(TRT_Identifier, Gaudi::Hive::currentContext());
1220 strawStatusFile << TRT_Identifier.
get_compact() << std::format(
"{:5}",strawStatusHT) << std::endl;
1221 }
1222 else {
1224 }
1225 }
1227
1228
1229
1230 switch (agm)
1231 {
1233 ATH_MSG_DEBUG(
"Marking Argon straws from /TRT/Cond/StatusHT:\t"
1235 childPlane = pStrawPlaneA_Ar->clone();
1236 break;
1238 ATH_MSG_DEBUG(
"Marking Krypton straws from /TRT/Cond/StatusHT:\t"
1240 childPlane = pStrawPlaneA_Kr->clone();
1241 break;
1243 ATH_MSG_DEBUG(
"Marking Xenon straws from /TRT/Cond/StatusHT:\t"
1245 childPlane = pStrawPlaneA->clone();
1246 break;
1247 default:
1249 throw std::runtime_error("Unexpected gas mixture");
1250 return;
1251 }
1252
1253
1254 xfPlane =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionA[iiPlane] -
m_data->endCapLengthOfWheelsA/2)*GeoTrf::RotateZ3D(phiPlane));
1255
1256 if (xfAlignableModule) pWheelA->add(xfAlignableModule);
1257 pWheelA->add(xfPlane);
1258 pWheelA->add(new GeoIdentifierTag(iiPlane));
1259 pWheelA->add(childPlane);
1260
1261
1262
1263 if(iiWheel==firstIndexOfA && iiPlane < nStrawLayMaxEc)
1264 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1265 {
1266
1267 pDescriptor = new InDetDD::TRT_EndcapDescriptor();
1269
1270 pDescriptor->
nStraws() =
m_data->endcapNumberOfStrawsInStrawLayer_AWheels/
m_data->nEndcapPhi;
1271 pDescriptor->
strawPitch() = deltaPhiForStrawsA;
1272
1273 double startPhi = phiPlane + iiPhi * pDescriptor->
strawPitch() * pDescriptor->
nStraws();
1274
1275
1276
1277
1278
1279 if (iiSide) {
1280 startPhi = GeoModelKernelUnits::pi - (startPhi + pDescriptor->
strawPitch() * (pDescriptor->
nStraws() - 1));
1281 }
1282
1283
1284 if (startPhi <= -GeoModelKernelUnits::pi) startPhi += 2*GeoModelKernelUnits::pi;
1285 if (startPhi > GeoModelKernelUnits::pi) startPhi -= 2*GeoModelKernelUnits::pi;
1286
1287 pDescriptor->
startPhi() = startPhi;
1288
1289 pDescriptor->
strawLength() =
m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA
1290 - 2*
m_data->lengthOfDeadRegion -
m_data->endCapRadialThicknessOfInnerSupportA -
m_data->endCapInnerRadiusOfSupportA;
1291 pDescriptor->
innerRadius() =
m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA
1292 +
m_data->lengthOfDeadRegion;
1294
1295 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi] = pDescriptor;
1296 }
1297
1298 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1299 {
1300
1301
1302
1303
1304 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
1305 element = new InDetDD::TRT_EndcapElement(childPlane,
1306 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
1307 iiSide==0,
1308 iiWheel,
1309 iiPlane,
1310 iiPhiOffline,
1311 idHelper,
1314 }
1315 }
1316
1318 {
1319 if (counter % 4 == 1)
1320 {
1321 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionA[counter-1] -
m_data->endCapLengthOfWheelsA/2
1322 -
m_data->outerRadiusOfStraw -
m_data->endCapThinRadiatorThicknessA/2));
1323 pWheelA->add(xfRadiator);
1324 pWheelA->add(pThinRadiatorA);
1325 }
1326
1327 if (counter % 4 == 0)
1328 {
1329 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionA[counter-1] -
m_data->endCapLengthOfWheelsA/2
1330 +
m_data->outerRadiusOfStraw +
m_data->endCapThinRadiatorThicknessA/2));
1331 pWheelA->add(xfRadiator);
1332 pWheelA->add(pThinRadiatorA);
1333 continue;
1334 }
1335
1336 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionA[counter-1] -
m_data->endCapLengthOfWheelsA/2
1337 +
m_data->outerRadiusOfStraw +
m_data->endCapMainRadiatorThicknessA/2));
1338 pWheelA->add(xfRadiator);
1339 pWheelA->add(pMainRadiatorA);
1340 }
1341
1342 pWheelA->add(pInnerSupportA);
1343 pWheelA->add(pOuterSupportA);
1344
1345
1346 GeoAlignableTransform * xfWheel = new GeoAlignableTransform( GeoTrf::TranslateZ3D(WheelPlacerA) );
1347
1348 pCommonEndcapAB[iiSide]->add(xfWheel);
1349 pCommonEndcapAB[iiSide]->add(new GeoIdentifierTag(iiWheel));
1350 pCommonEndcapAB[iiSide]->add(pWheelA);
1351
1352
1353 int barrel_ec = (iiSide) ? -2 : +2;
1354 Identifier idModule = idHelper->
module_id(barrel_ec, 0, iiWheel);
1355 m_detectorManager->addAlignableTransform(AlignmentLevelModule, idModule, xfWheel, pWheelA);
1356
1357 if (
m_data->includeECFoilHeatExchangerAndMembranes) {
1358
1359
1360
1361
1362 GeoTube* sFaradayFoilWheelAB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA,
1363 m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA,
1364 m_data->endCapFaradayFoilThickness/2);
1365 GeoLogVol* lFaradayFoilWheelAB =
new GeoLogVol(
"FaradayKaptonFoil",sFaradayFoilWheelAB,
m_materialManager->getMaterial(
"trt::FaradayFoilMaterial"));
1366 GeoIntrusivePtr<GeoPhysVol> pFaradayFoilWheelAB{new GeoPhysVol(lFaradayFoilWheelAB)};
1367
1368
1369 GeoTube* sHeatExchangerA =
new GeoTube(
m_data->endCapRMinOfHeatExchanger,
m_data->endCapRMaxOfHeatExchanger,
m_data->endCapHeatExchangerThicknessA/2);
1370 GeoLogVol* lHeatExchangerA =
new GeoLogVol(
"HeatExchangerA",sHeatExchangerA,
m_materialManager->getMaterial(
"trt::HeatExchangerAMat"));
1371 GeoIntrusivePtr<GeoPhysVol> pHeatExchangerA{new GeoPhysVol(lHeatExchangerA)};
1372
1373
1374 GeoTube* sInnerSupportGapperA =
new GeoTube(
m_data->endCapInnerRadiusOfSupportA,
1375 m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA,
1376 m_data->endCapHeatExchangerThicknessA/2 +
m_data->endCapFaradayFoilThickness/2 + zdelta);
1377 GeoLogVol* lInnerSupportGapperA =
new GeoLogVol(
"InnerSupportGapperA", sInnerSupportGapperA,
m_materialManager->getMaterial(
"trt::InnerSupportA"));
1378 GeoIntrusivePtr<GeoPhysVol> pInnerSupportGapperA{new GeoPhysVol(lInnerSupportGapperA)};
1379
1380 GeoTube* sOuterSupportGapperA =
new GeoTube(
m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA,
1381 m_data->endCapOuterRadiusOfSupportA,
1382 m_data->endCapHeatExchangerThicknessA/2 +
m_data->endCapFaradayFoilThickness/2 + zdelta);
1383 GeoLogVol* lOuterSupportGapperA =
new GeoLogVol(
"OuterSupportGapperA", sOuterSupportGapperA,
m_materialManager->getMaterial(
"trt::OuterSupportA"));
1384 GeoIntrusivePtr<GeoPhysVol> pOuterSupportGapperA{new GeoPhysVol(lOuterSupportGapperA)};
1385
1386 if(iiWheel<=firstIndexOfB-1)
1387 {
1388 xfFaradayFoilFront = new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerA
1389 -
m_data->endCapLengthOfWheelsA/2
1390 -
m_data->endCapFaradayFoilThickness/2.0));
1391 xfFaradayFoilBack = new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerA
1392 +
m_data->endCapLengthOfWheelsA/2
1393 +
m_data->endCapFaradayFoilThickness/2.0));
1394 pCommonEndcapAB[iiSide]->add(xfFaradayFoilFront);
1395 pCommonEndcapAB[iiSide]->add(pFaradayFoilWheelAB);
1396 pCommonEndcapAB[iiSide]->add(xfFaradayFoilBack);
1397 pCommonEndcapAB[iiSide]->add(pFaradayFoilWheelAB);
1398 }
1399
1400
1401
1402 if(iiWheel<firstIndexOfB-1)
1403 {
1404 xfHeatExchanger = new GeoTransform(GeoTrf::TranslateZ3D( WheelPlacerA
1405 +
m_data->endCapLengthOfWheelsA/2
1406 +
m_data->endCapFaradayFoilThickness
1407 +
m_data->endCapHeatExchangerThicknessA/2));
1408 pCommonEndcapAB[iiSide]->add(xfHeatExchanger);
1409 pCommonEndcapAB[iiSide]->add(pHeatExchangerA);
1410
1411 xfInnerSupportGapperA = new GeoTransform(GeoTrf::TranslateZ3D( WheelPlacerA
1412 +
m_data->endCapLengthOfWheelsA/2
1413 +
m_data->endCapFaradayFoilThickness
1414 +
m_data->endCapHeatExchangerThicknessA/2));
1415 xfOuterSupportGapperA = new GeoTransform(GeoTrf::TranslateZ3D( WheelPlacerA
1416 +
m_data->endCapLengthOfWheelsA/2
1417 +
m_data->endCapFaradayFoilThickness
1418 +
m_data->endCapHeatExchangerThicknessA/2));
1419 pCommonEndcapAB[iiSide]->add(xfInnerSupportGapperA);
1420 pCommonEndcapAB[iiSide]->add(pInnerSupportGapperA);
1421 pCommonEndcapAB[iiSide]->add(xfOuterSupportGapperA);
1422 pCommonEndcapAB[iiSide]->add(pOuterSupportGapperA);
1423 }
1424
1425 }
1426 }
1427 }
1428 }
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439 GeoTube* sInnerSupportB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB,
1440 m_data->endCapInnerRadiusOfSupportB +
m_data->endCapRadialThicknessOfInnerSupportB,
1441 m_data->endCapLengthOfWheelsB/2);
1442 GeoLogVol* lInnerSupportB =
new GeoLogVol(
"InnerSupportB", sInnerSupportB,
m_materialManager->getMaterial(
"trt::InnerSupportB"));
1443 GeoPhysVol* pInnerSupportB = new GeoPhysVol(lInnerSupportB);
1444
1445 GeoTube* sOuterSupportB =
new GeoTube(
m_data->endCapOuterRadiusOfSupportB -
m_data->endCapRadialThicknessOfOuterSupportB,
1446 m_data->endCapOuterRadiusOfSupportB,
m_data->endCapLengthOfWheelsB/2);
1447 GeoLogVol* lOuterSupportB =
new GeoLogVol(
"OuterSupportB", sOuterSupportB,
m_materialManager->getMaterial(
"trt::OuterSupportB"));
1448 GeoPhysVol* pOuterSupportB = new GeoPhysVol(lOuterSupportB);
1449
1450
1451 GeoFullPhysVol* pStrawPlaneB_Kr = nullptr;
1452 GeoFullPhysVol* pStrawPlaneB_Ar = nullptr;
1457 GeoIntrusivePtr<GeoFullPhysVol> pStrawPlaneB {
makeStrawPlane(firstIndexOfB)};
1458
1459
1460
1461 GeoTube* sMainRadiatorB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB +
m_data->endCapRadialThicknessOfInnerSupportB,
1462 m_data->endCapOuterRadiusOfSupportB -
m_data->endCapRadialThicknessOfOuterSupportB
1463 -
m_data->endCapRadialDistFromRadToOuterSupportB,
m_data->endCapMainRadiatorThicknessB/2);
1464 GeoLogVol* lMainRadiatorB =
new GeoLogVol(
"MainRadiatorB",sMainRadiatorB,
m_materialManager->getMaterial(
"trt::FoilRadiatorB"));
1465 GeoPhysVol* pMainRadiatorB = new GeoPhysVol(lMainRadiatorB);
1466
1467 GeoTube* sThinRadiatorB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB +
m_data->endCapRadialThicknessOfInnerSupportB,
1468 m_data->endCapOuterRadiusOfSupportB -
m_data->endCapRadialThicknessOfOuterSupportB
1469 -
m_data->endCapRadialDistFromRadToOuterSupportB,
1470 m_data->endCapThinRadiatorThicknessB/2);
1471 GeoLogVol* lThinRadiatorB =
new GeoLogVol(
"ThinRadiatorB",sThinRadiatorB,
m_materialManager->getMaterial(
"trt::FoilRadiatorB"));
1472 GeoPhysVol* pThinRadiatorB = new GeoPhysVol(lThinRadiatorB);
1473
1474 GeoTube* sMiddleRadiatorB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB +
m_data->endCapRadialThicknessOfInnerSupportB,
1475 m_data->endCapOuterRadiusOfSupportB -
m_data->endCapRadialThicknessOfOuterSupportB
1476 -
m_data->endCapRadialDistFromRadToOuterSupportB,
m_data->endCapMiddleRadiatorThicknessB/2);
1477 GeoLogVol* lMiddleRadiatorB =
new GeoLogVol(
"MiddleRadiatorB",sMiddleRadiatorB,
m_materialManager->getMaterial(
"trt::FoilRadiatorB"));
1478 GeoPhysVol* pMiddleRadiatorB = new GeoPhysVol(lMiddleRadiatorB);
1479
1480
1481
1482 GeoTube* sWheelB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB,
m_data->endCapOuterRadiusOfSupportB,
m_data->endCapLengthOfWheelsB/2);
1483 GeoLogVol* lWheelB =
new GeoLogVol(
"WheelB", sWheelB,
m_materialManager->getMaterial(
"trt::CO2"));
1484
1485
1486 double deltaPhiForStrawsB = 360.*GeoModelKernelUnits::deg/
m_data->endcapNumberOfStrawsInStrawLayer_BWheels;
1487
1488 for(iiSide=0; iiSide<nSides; iiSide++) {
1489
1490 double WheelPlacerB =
m_data->endCapPositionOfFirstWheelB[iiSide];
1491
1492
1493 if (pCommonEndcapAB[iiSide]) {
1494 for(iiWheel=firstIndexOfB; iiWheel < firstIndexOfC; iiWheel++)
1495 {
1496
1497 WheelPlacerB +=
m_data->endCapDistanceBetweenWheelCentersB[iiSide][iiWheel];
1498
1499 GeoFullPhysVol* pWheelB = new GeoFullPhysVol(lWheelB);
1500
1501 GeoAlignableTransform * xfAlignableModule = nullptr;
1502
1503
1504 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelB; iiPlane++)
1505 {
1506
1507
1508
1509
1510
1511 if (iiPlane % 4 == 0) {
1512
1513 int barrel_ec = (iiSide) ? -2 : +2;
1514 xfAlignableModule = new GeoAlignableTransform(GeoTrf::Transform3D::Identity());
1515 Identifier idSubModule = idHelper->
layer_id(barrel_ec, 0, iiWheel, iiPlane);
1516
1517
1518 m_detectorManager->addAlignableTransform(AlignmentLevelSubWheel, idSubModule, xfAlignableModule, pWheelB);
1519 }
1520
1521 int bar_ec = (iiSide) ? -2 : +2;
1522 Identifier TRT_Identifier = idHelper->
straw_id(bar_ec, 1, iiWheel, 1, 1);
1526 strawStatusHT =
m_sumTool->getStatusHT(TRT_Identifier, Gaudi::Hive::currentContext());
1527 strawStatusFile << TRT_Identifier.
get_compact() << std::format(
"{:5}",strawStatusHT) << std::endl;
1528 }
1529 else {
1531 }
1532 }
1534
1535
1536
1537 switch (agm)
1538 {
1540 ATH_MSG_DEBUG(
"Marking Argon straws from /TRT/Cond/StatusHT:\t"
1542 childPlane = pStrawPlaneB_Ar->clone();
1543 break;
1545 ATH_MSG_DEBUG(
"Marking Krypton straws from /TRT/Cond/StatusHT:\t"
1547 childPlane = pStrawPlaneB_Kr->clone();
1548 break;
1550 ATH_MSG_DEBUG(
"Marking Xenon straws from /TRT/Cond/StatusHT:\t"
1552 childPlane = pStrawPlaneB->clone();
1553 break;
1554 default:
1556 throw std::runtime_error("Unexpected gas mixture");
1557 return;
1558 }
1559
1560
1561 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsB;
1562
1563
1564 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
1565 phiPlane += deltaPhiForStrawsB;
1566 }
1567
1568 xfPlane =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionB[iiPlane]
1569 -
m_data->endCapLengthOfWheelsB/2)*GeoTrf::RotateZ3D(phiPlane));
1570
1571 if (xfAlignableModule) pWheelB->add(xfAlignableModule);
1572 pWheelB->add(xfPlane);
1573 pWheelB->add(new GeoIdentifierTag(iiPlane));
1574 pWheelB->add(childPlane);
1575
1576
1577 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1578 {
1579
1580
1581
1582
1583 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
1584 element = new InDetDD::TRT_EndcapElement(childPlane,
1585 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
1586 iiSide==0,
1587 iiWheel,
1588 iiPlane,
1589 iiPhiOffline,
1590 idHelper,
1593 }
1594 }
1595
1596
1598 {
1599
1600 if (counter % 4 != 0)
1601 {
1602 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionB[counter-1] -
m_data->endCapLengthOfWheelsB/2
1603 +
m_data->outerRadiusOfStraw +
m_data->endCapMainRadiatorThicknessB/2));
1604 pWheelB->add(xfRadiator);
1605 pWheelB->add(pMainRadiatorB);
1606 }
1607
1608
1609 if (counter == 1 || counter == 8)
1610 {
1612 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionB[counter-1] -
m_data->endCapLengthOfWheelsB/2 +
sign*(
m_data->outerRadiusOfStraw +
m_data->endCapThinRadiatorThicknessB/2)));
1613 pWheelB->add(xfRadiator);
1614 pWheelB->add(pThinRadiatorB);
1615 }
1616
1617
1618 if (counter == 4 || counter == 5)
1619 {
1621 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionB[counter-1] -
m_data->endCapLengthOfWheelsB/2 +
sign*(
m_data->outerRadiusOfStraw +
m_data->endCapMiddleRadiatorThicknessB/2)));
1622 pWheelB->add(xfRadiator);
1623 pWheelB->add(pMiddleRadiatorB);
1624 }
1625 }
1626
1627
1628 pWheelB->add(pInnerSupportB);
1629 pWheelB->add(pOuterSupportB);
1630
1631
1632 GeoAlignableTransform * xfWheel = new GeoAlignableTransform(GeoTrf::TranslateZ3D( WheelPlacerB ));
1633
1634
1635 pCommonEndcapAB[iiSide]->add(xfWheel);
1636 pCommonEndcapAB[iiSide]->add(new GeoIdentifierTag(iiWheel));
1637 pCommonEndcapAB[iiSide]->add(pWheelB);
1638
1639
1640 int barrel_ec = (iiSide) ? -2 : +2;
1641 Identifier idModule = idHelper->
module_id(barrel_ec, 0, iiWheel);
1642 m_detectorManager->addAlignableTransform(AlignmentLevelModule, idModule, xfWheel, pWheelB);
1643
1644
1645 if (
m_data->includeECFoilHeatExchangerAndMembranes) {
1646
1647
1648
1649
1650 GeoTube* sFaradayFoilWheelAB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB +
m_data->endCapRadialThicknessOfInnerSupportB,
1651 m_data->endCapOuterRadiusOfSupportB -
m_data->endCapRadialThicknessOfOuterSupportB,
1652 m_data->endCapFaradayFoilThickness/2);
1653 GeoLogVol* lFaradayFoilWheelAB =
new GeoLogVol(
"FaradayKaptonFoil",sFaradayFoilWheelAB,
m_materialManager->getMaterial(
"trt::FaradayFoilMaterial"));
1654 GeoIntrusivePtr<GeoPhysVol> pFaradayFoilWheelAB{new GeoPhysVol(lFaradayFoilWheelAB)};
1655
1656
1657 GeoTube* sHeatExchangerB =
new GeoTube(
m_data->endCapRMinOfHeatExchanger,
m_data->endCapRMaxOfHeatExchanger,
m_data->endCapHeatExchangerThicknessB/2);
1658
1659 GeoLogVol* lHeatExchangerB =
new GeoLogVol(
"HeatExchangerB", sHeatExchangerB,
m_materialManager->getMaterial(
"trt::HeatExchangerBMat"));
1660 GeoIntrusivePtr<GeoPhysVol> pHeatExchangerB{new GeoPhysVol(lHeatExchangerB)};
1661
1662
1663 GeoTube* sInnerSupportGapperB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB,
1664 m_data->endCapInnerRadiusOfSupportB +
m_data->endCapRadialThicknessOfInnerSupportB,
1665 m_data->endCapHeatExchangerThicknessB/2 +
m_data->endCapFaradayFoilThickness/2 + zdelta);
1666 GeoLogVol* lInnerSupportGapperB =
new GeoLogVol(
"InnerSupportGapperB", sInnerSupportGapperB,
m_materialManager->getMaterial(
"trt::InnerSupportB"));
1667 GeoIntrusivePtr<GeoPhysVol> pInnerSupportGapperB{new GeoPhysVol(lInnerSupportGapperB)};
1668
1669 GeoTube* sOuterSupportGapperB =
new GeoTube(
m_data->endCapOuterRadiusOfSupportB -
m_data->endCapRadialThicknessOfOuterSupportB,
1670 m_data->endCapOuterRadiusOfSupportB,
1671 m_data->endCapHeatExchangerThicknessB/2 +
m_data->endCapFaradayFoilThickness/2 + zdelta);
1672 GeoLogVol* lOuterSupportGapperB =
new GeoLogVol(
"OuterSupportGapperB", sOuterSupportGapperB,
m_materialManager->getMaterial(
"trt::OuterSupportB"));
1673 GeoIntrusivePtr<GeoPhysVol> pOuterSupportGapperB{new GeoPhysVol(lOuterSupportGapperB)};
1674
1675
1676 if(iiWheel-firstIndexOfB<firstIndexOfC-firstIndexOfB)
1677 {
1678 xfFaradayFoilFront = new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerB
1679 -
m_data->endCapLengthOfWheelsB/2
1680 -
m_data->endCapFaradayFoilThickness/2.0));
1681 xfFaradayFoilBack = new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerB
1682 +
m_data->endCapLengthOfWheelsB/2
1683 +
m_data->endCapFaradayFoilThickness/2.0));
1684
1685 pCommonEndcapAB[iiSide]->add(xfFaradayFoilFront);
1686 pCommonEndcapAB[iiSide]->add(pFaradayFoilWheelAB);
1687 pCommonEndcapAB[iiSide]->add(xfFaradayFoilBack);
1688 pCommonEndcapAB[iiSide]->add(pFaradayFoilWheelAB);
1689 }
1690
1691
1692
1693 if(iiWheel-firstIndexOfB<firstIndexOfC-firstIndexOfB-1)
1694 {
1695 xfHeatExchanger = new GeoTransform(GeoTrf::TranslateZ3D( WheelPlacerB
1696 +
m_data->endCapLengthOfWheelsB/2
1697 +
m_data->endCapFaradayFoilThickness
1698 +
m_data->endCapHeatExchangerThicknessB/2));
1699 pCommonEndcapAB[iiSide]->add(xfHeatExchanger);
1700 pCommonEndcapAB[iiSide]->add(pHeatExchangerB);
1701
1702 xfInnerSupportGapperB = new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerB
1703 +
m_data->endCapLengthOfWheelsB/2
1704 +
m_data->endCapFaradayFoilThickness
1705 +
m_data->endCapHeatExchangerThicknessB/2));
1706
1707 xfOuterSupportGapperB = new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerB
1708 +
m_data->endCapLengthOfWheelsB/2
1709 +
m_data->endCapFaradayFoilThickness
1710 +
m_data->endCapHeatExchangerThicknessB/2));
1711 pCommonEndcapAB[iiSide]->add(xfInnerSupportGapperB);
1712 pCommonEndcapAB[iiSide]->add(pInnerSupportGapperB);
1713 pCommonEndcapAB[iiSide]->add(xfOuterSupportGapperB);
1714 pCommonEndcapAB[iiSide]->add(pOuterSupportGapperB);
1715 }
1716 }
1717 }
1718 }
1719 }
1720
1721 }
1722
1723
1725 strawStatusFile.close();
1726 }
1727
1728 if (
m_data->includeECFoilHeatExchangerAndMembranes) {
1729
1730
1731 GeoTube* sMbrane =
new GeoTube(
m_data->endCapRMinOfMbrane,
m_data->endCapRMaxOfMbrane,
m_data->endCapThicknessOfMbrane/2.0);
1732 GeoLogVol* lMbrane =
new GeoLogVol(
"Membrane", sMbrane,
m_materialManager->getMaterial(
"trt::EndCapMbrane"));
1733 GeoPhysVol* pMbrane = new GeoPhysVol(lMbrane);
1734
1735 GeoTransform *xfMbraneWheelA1 =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapZMinOfMbraneWheelA1 +
m_data->endCapThicknessOfMbrane/2.0));
1736 GeoTransform *xfMbraneWheelA2 =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapZMinOfMbraneWheelA2 +
m_data->endCapThicknessOfMbrane/2.0));
1737 GeoTransform *xfMbraneWheelB1 =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapZMinOfMbraneWheelB1 +
m_data->endCapThicknessOfMbrane/2.0));
1738 GeoTransform *xfMbraneWheelB2 =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapZMinOfMbraneWheelB2 +
m_data->endCapThicknessOfMbrane/2.0));
1739
1740 for(iiSide=0; iiSide<nSides; iiSide++) {
1741 pCommonEndcapAB[iiSide]->add(xfMbraneWheelA1);
1742 pCommonEndcapAB[iiSide]->add(pMbrane);
1743 pCommonEndcapAB[iiSide]->add(xfMbraneWheelA2);
1744 pCommonEndcapAB[iiSide]->add(pMbrane);
1745 pCommonEndcapAB[iiSide]->add(xfMbraneWheelB1);
1746 pCommonEndcapAB[iiSide]->add(pMbrane);
1747 pCommonEndcapAB[iiSide]->add(xfMbraneWheelB2);
1748 pCommonEndcapAB[iiSide]->add(pMbrane);
1749 }
1750 }
1751
1752
1753
1754
1755
1756 if (endcapCPlusPresent || endcapCMinusPresent) {
1757
1758 GeoTube* sInnerSupportC =
new GeoTube(
m_data->endCapInnerRadiusOfSupportC,
m_data->endCapInnerRadiusOfSupportC
1759 +
m_data->endCapRadialThicknessOfInnerSupportC,
m_data->endCapLengthOfWheelsC/2);
1760 GeoLogVol* lInnerSupportC =
new GeoLogVol(
"InnerSupportC", sInnerSupportC,
m_materialManager->getMaterial(
"trt::InnerSupportC"));
1761 GeoPhysVol* pInnerSupportC = new GeoPhysVol(lInnerSupportC);
1762
1763 GeoTube* sOuterSupportC =
new GeoTube(
m_data->endCapOuterRadiusOfSupportC -
m_data->endCapRadialThicknessOfOuterSupportC,
1764 m_data->endCapOuterRadiusOfSupportC,
m_data->endCapLengthOfWheelsC/2);
1765 GeoLogVol* lOuterSupportC =
new GeoLogVol(
"OuterSupportC", sOuterSupportC,
m_materialManager->getMaterial(
"trt::OuterSupportC"));
1766 GeoPhysVol* pOuterSupportC = new GeoPhysVol(lOuterSupportC);
1767
1768
1769 GeoIntrusivePtr<GeoFullPhysVol> pStrawPlaneC =
makeStrawPlane(firstIndexOfC);
1770
1771
1772 GeoTube* sMainRadiatorC =
new GeoTube(
m_data->endCapInnerRadiusOfSupportC +
m_data->endCapRadialThicknessOfInnerSupportC,
1773 m_data->endCapOuterRadiusOfSupportC -
m_data->endCapRadialThicknessOfOuterSupportC
1774 -
m_data->endCapRadialDistFromRadToOuterSupportC,
m_data->endCapMainRadiatorThicknessC/2);
1775 GeoLogVol* lMainRadiatorC =
new GeoLogVol(
"MainRadiatorC",sMainRadiatorC,
m_materialManager->getMaterial(
"trt::FoilRadiatorAC"));
1776 GeoPhysVol* pMainRadiatorC = new GeoPhysVol(lMainRadiatorC);
1777
1778 GeoTube* sThinRadiatorC =
new GeoTube(
m_data->endCapInnerRadiusOfSupportC +
m_data->endCapRadialThicknessOfInnerSupportC,
1779 m_data->endCapOuterRadiusOfSupportC -
m_data->endCapRadialThicknessOfOuterSupportC
1780 -
m_data->endCapRadialDistFromRadToOuterSupportC,
m_data->endCapThinRadiatorThicknessC/2);
1781 GeoLogVol* lThinRadiatorC =
new GeoLogVol(
"ThinRadiatorC",sThinRadiatorC,
m_materialManager->getMaterial(
"trt::FoilRadiatorAC"));
1782 GeoPhysVol* pThinRadiatorC = new GeoPhysVol(lThinRadiatorC);
1783
1784
1785 GeoTube* sWheelC =
new GeoTube(
m_data->endCapInnerRadiusOfSupportC,
m_data->endCapOuterRadiusOfSupportC,
m_data->endCapLengthOfWheelsC/2);
1786 GeoLogVol* lWheelC =
new GeoLogVol(
"WheelC", sWheelC,
m_materialManager->getMaterial(
"trt::CO2"));
1787
1788
1789 double deltaPhiForStrawsC = 360.*GeoModelKernelUnits::deg/
m_data->endcapNumberOfStrawsInStrawLayer_CWheels;
1790
1791 for(iiSide=0; iiSide<nSides; iiSide++) {
1792
1793 if (pCommonEndcapC[iiSide]) {
1794 for(iiWheel=firstIndexOfC; iiWheel < indexUpperBound; iiWheel++)
1795 {
1796 GeoFullPhysVol* pWheelC = new GeoFullPhysVol(lWheelC);
1797
1798
1799 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelC; iiPlane++)
1800 {
1801
1802 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsC;
1803
1804
1805 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
1806 phiPlane += deltaPhiForStrawsC;
1807 }
1808
1809
1810 childPlane = pStrawPlaneC->clone();
1811
1812 xfPlane =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionC[iiPlane]
1813 -
m_data->endCapLengthOfWheelsC/2)*GeoTrf::RotateZ3D(phiPlane));
1814 pWheelC->add(xfPlane);
1815 pWheelC->add(new GeoIdentifierTag(iiPlane));
1816 pWheelC->add(childPlane);
1817
1818
1819
1820 if(iiWheel==firstIndexOfC && iiPlane < nStrawLayMaxEc)
1821 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1822 {
1823 pDescriptor = new InDetDD::TRT_EndcapDescriptor();
1825
1826 pDescriptor->
nStraws() =
m_data->endcapNumberOfStrawsInStrawLayer_CWheels/
m_data->nEndcapPhi;
1827 pDescriptor->
strawPitch() = deltaPhiForStrawsC;
1828
1829
1830 double startPhi = phiPlane + iiPhi * pDescriptor->
strawPitch() * pDescriptor->
nStraws();
1831
1832
1833
1834 if (iiSide) {
1835 startPhi = GeoModelKernelUnits::pi - (startPhi + pDescriptor->
strawPitch() * (pDescriptor->
nStraws() - 1));
1836 }
1837
1838
1839 if (startPhi <= -GeoModelKernelUnits::pi) startPhi += 2*GeoModelKernelUnits::pi;
1840 if (startPhi > GeoModelKernelUnits::pi) startPhi -= 2*GeoModelKernelUnits::pi;
1841
1842
1843 pDescriptor->
startPhi() = startPhi;
1844
1845 pDescriptor->
strawLength() =
m_data->endCapOuterRadiusOfSupportC -
m_data->endCapRadialThicknessOfOuterSupportC
1846 - 2*
m_data->lengthOfDeadRegion -
m_data->endCapRadialThicknessOfInnerSupportC -
m_data->endCapInnerRadiusOfSupportC;
1847 pDescriptor->
innerRadius() =
m_data->endCapInnerRadiusOfSupportC +
m_data->endCapRadialThicknessOfInnerSupportC +
m_data->lengthOfDeadRegion;
1849
1850
1851 descriptorsC[iiSide][iiPlane%nStrawLayMaxEc][iiPhi] = pDescriptor;
1852 }
1853
1854
1855 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1856 {
1857
1858
1859
1860
1861 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
1862 element = new InDetDD::TRT_EndcapElement(childPlane,
1863 descriptorsC[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
1864 iiSide==0,
1865 iiWheel,
1866 iiPlane,
1867 iiPhiOffline,
1868 idHelper,
1871 }
1872 }
1873
1874
1876 {
1877 if (counter % 4 == 1)
1878 {
1879 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionC[counter-1] -
m_data->endCapLengthOfWheelsC/2
1880 -
m_data->lengthOfDeadRegion -
m_data->endCapThinRadiatorThicknessC/2));
1881 pWheelC->add(xfRadiator);
1882 pWheelC->add(pThinRadiatorC);
1883 }
1884
1885 if (counter % 4 == 0)
1886 {
1887 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionC[counter-1] -
m_data->endCapLengthOfWheelsC/2
1888 +
m_data->outerRadiusOfStraw +
m_data->endCapThinRadiatorThicknessC/2));
1889 pWheelC->add(xfRadiator);
1890 pWheelC->add(pThinRadiatorC);
1891 continue;
1892 }
1893
1894 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionC[counter-1] -
m_data->endCapLengthOfWheelsC/2
1895 +
m_data->outerRadiusOfStraw +
m_data->endCapMainRadiatorThicknessC/2));
1896 pWheelC->add(xfRadiator);
1897 pWheelC->add(pMainRadiatorC);
1898 }
1899
1900
1901 pWheelC->add(pInnerSupportC);
1902 pWheelC->add(pOuterSupportC);
1903
1904
1905 GeoAlignableTransform * xfWheel
1906 =
new GeoAlignableTransform(GeoTrf::TranslateZ3D(
m_data->endCapPositionOfFirstWheelC
1907 + (iiWheel - firstIndexOfC)*
m_data->endCapDistanceBetweenWheelCentersC));
1908
1909 pCommonEndcapC[iiSide]->add(xfWheel);
1910 pCommonEndcapC[iiSide]->add(new GeoIdentifierTag(iiWheel));
1911 pCommonEndcapC[iiSide]->add(pWheelC);
1912
1913
1914 int barrel_ec = (iiSide) ? -2 : +2;
1915 Identifier idModule = idHelper->
module_id(barrel_ec, 0, iiWheel);
1916 m_detectorManager->addAlignableTransform(AlignmentLevelModule, idModule, xfWheel, pWheelC);
1917
1918
1919 }
1920 }
1921 }
1922
1923 }
1924
1925
1926
1927 for (iiSide=0; iiSide<2; iiSide++)
1928 for(iiPhi=0; iiPhi<
m_data->nEndcapPhi; iiPhi++)
1929 {
1930 InDetDD::TRT_EndcapElement *prev = nullptr;
1931 for (iiWheel=0; iiWheel<indexUpperBound; iiWheel++)
1932 for (iiPlane=0; iiPlane<
m_detectorManager->getNumerology()->getNEndcapLayers(iiWheel); iiPlane++)
1933 {
1935 if (prev && current)
1936 {
1938 current->setPreviousInZ(prev);
1939 }
1941 }
1942 }
1943}
GeoIntrusivePtr< T > GeoNodePtr
std::string print_to_string(Identifier id, const IdContext *context=0) const
or provide the printout in string form
value_type get_compact() const
Get the compact id.
InDetDD::AthenaComps * getAthenaComps()
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.
GeoFullPhysVol * makeStrawPlane(size_t w, ActiveGasMixture gasMixture=GM_XENON)
InDetDD::TRT_DetectorManager * m_detectorManager
const GeoShape * makeModule(double length, const GeoTrf::Vector2D &corner1, const GeoTrf::Vector2D &corner2, const GeoTrf::Vector2D &corner3, const GeoTrf::Vector2D &corner4, GeoTrf::Transform3D &absolutePosition, double shrinkDist=0) const
std::unique_ptr< InDetMaterialManager > m_materialManager
std::unique_ptr< TRTParameterInterface > m_data
GeoPhysVol * makeStraw(bool hasLargeDeadRegion=false, ActiveGasMixture gasMixture=GM_XENON)
ActiveGasMixture DecideGasMixture(int strawStatusHT)
IRDBRecordset_ptr scalingTable() const
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)