24 #include "GeoModelKernel/GeoTube.h"
25 #include "GeoModelKernel/GeoTrd.h"
26 #include "GeoModelKernel/GeoLogVol.h"
27 #include "GeoModelKernel/GeoNameTag.h"
28 #include "GeoModelKernel/GeoPhysVol.h"
29 #include "GeoModelKernel/GeoFullPhysVol.h"
30 #include "GeoModelKernel/GeoTransform.h"
31 #include "GeoModelKernel/GeoAlignableTransform.h"
32 #include "GeoModelKernel/GeoSerialDenominator.h"
33 #include "GeoModelKernel/GeoSerialTransformer.h"
34 #include "GeoModelKernel/GeoShapeShift.h"
35 #include "GeoModelKernel/GeoShapeUnion.h"
36 #include "GeoModelKernel/GeoIdentifierTag.h"
37 #include "GeoModelKernel/GeoSerialIdentifier.h"
38 #include "GeoModelKernel/GeoMaterial.h"
39 #include "GeoModelKernel/GeoDefinitions.h"
40 #include "GeoModelKernel/Units.h"
42 #include "GeoGenericFunctions/AbsFunction.h"
43 #include "GeoGenericFunctions/Variable.h"
44 #include "GeoGenericFunctions/Sin.h"
45 #include "GeoGenericFunctions/Cos.h"
55 using namespace GeoXF;
62 double xx = vector.x();
63 double yy = vector.y();
64 vector.x() =
c*
xx - s1*
yy;
65 vector.y() = s1*
xx +
c*
yy;
70 double ptot2 =
a.mag2()*
b.mag2();
71 return ptot2 <= 0.0 ? 0.0 : std::acos(
a.dot(
b)/std::sqrt(ptot2));
76 return std::sqrt(vector.x()*vector.x() + vector.y()*vector.y());
82 bool useOldActiveGasMixture,
83 bool DC2CompatibleBarrelCoordinates,
87 bool useDynamicAlignmentFolders)
88 :
InDetDD::DetectorFactoryBase(athenaComps),
89 m_useOldActiveGasMixture(useOldActiveGasMixture),
90 m_DC2CompatibleBarrelCoordinates(DC2CompatibleBarrelCoordinates),
91 m_alignable(alignable),
93 m_strawsvcavailable(0),
95 m_doKrypton(doKrypton),
96 m_useDynamicAlignFolders(useDynamicAlignmentFolders)
133 ATH_MSG_DEBUG(
" Getting primary numbers from the Detector Description Database " );
135 m_data.reset(parameterInterface);
151 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");
152 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");
160 const TRT_ID *idHelper =
nullptr;
176 std::string versionTag =
m_data->versionTag;
177 std::string versionName =
"DC2";
178 std::string layout =
"Final";
180 int versionMajorNumber = 2;
181 int versionMinorNumber = 1;
182 int versionPatchNumber = 0;
184 if (
m_data->initialLayout) layout =
"Initial";
189 versionMajorNumber = 3;
190 versionName =
"Rome";
194 if (
m_data->isCosmicRun) {
203 if (!
m_data->oldConfiguration) {
204 versionName =
m_data->versionName;
207 versionMajorNumber = 4;
208 versionMinorNumber = 1;
209 versionPatchNumber = 1;
224 ATH_MSG_INFO(
"In TRT Detector Factory (For DC2 and later geometries)" );
230 std::string barrelLabel =
"Barrel";
231 std::string endcapA_WheelAB_Label =
"EndcapA_WheelAB";
232 std::string endcapC_WheelAB_Label =
"EndcapC_WheelAB";
233 std::string endcapA_WheelC_Label =
"EndcapA_WheelC";
234 std::string endcapC_WheelC_Label =
"EndcapC_WheelC";
237 if (
m_data->partPresent(
"EndcapAB_Plus")) {
238 barrelLabel =
"Barrel";
239 endcapA_WheelAB_Label =
"EndcapAB_Plus";
240 endcapC_WheelAB_Label =
"EndcapAB_Minus";
241 endcapA_WheelC_Label =
"EndcapC_Plus";
242 endcapC_WheelC_Label =
"EndcapC_Minus";
246 bool barrelPresent =
m_data->partPresent(barrelLabel);
247 bool endcapABPlusPresent =
m_data->partPresent(endcapA_WheelAB_Label);
248 bool endcapABMinusPresent =
m_data->partPresent(endcapC_WheelAB_Label);
249 bool endcapCPlusPresent =
m_data->partPresent(endcapA_WheelC_Label);
250 bool endcapCMinusPresent =
m_data->partPresent(endcapC_WheelC_Label);
256 if (
m_data->oldConfiguration) {
257 if (
m_data->isCosmicRun) {
258 endcapABPlusPresent =
false;
259 endcapABMinusPresent =
false;
260 endcapCPlusPresent =
false;
261 endcapCMinusPresent =
false;
263 if (
m_data->initialLayout) {
264 endcapCPlusPresent =
false;
265 endcapCMinusPresent =
false;
277 const int AlignmentLevelSubWheel = 1;
278 const int AlignmentLevelModule = 2;
279 const int AlignmentLevelTop = 3;
293 if (endcapABPlusPresent) {
296 if (endcapABMinusPresent) {
314 if (endcapABPlusPresent) {
317 if (endcapABMinusPresent) {
333 for (
unsigned int m=0;
m<
m_data->nBarrelRings;
m++) {
341 unsigned int nEndcapWheels = 0;
342 if (endcapABPlusPresent||endcapABMinusPresent) nEndcapWheels +=
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels;
343 if (endcapCPlusPresent||endcapCMinusPresent) nEndcapWheels +=
m_data->endcapNumberOfCWheels;
349 unsigned int nlayers;
350 if ( w < m_data->endcapNumberOfAWheels )
351 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelA;
352 else if (
w < (
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels ) )
353 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelB;
355 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelC;
363 GeoFullPhysVol *pBarrelVol =
nullptr;
364 GeoFullPhysVol *pEndCapABPlus =
nullptr;
365 GeoFullPhysVol *pEndCapCPlus =
nullptr;
366 GeoFullPhysVol *pEndCapABMinus =
nullptr;
367 GeoFullPhysVol *pEndCapCMinus =
nullptr;
376 GeoTube* sBarrelVol =
new GeoTube(
m_data->virtualBarrelInnerRadius,
377 m_data->virtualBarrelOuterRadius,
378 m_data->virtualBarrelVolumeLength );
381 GeoLogVol *lBarrelVol =
new GeoLogVol(
"TRTBarrel", sBarrelVol,
m_materialManager->getMaterial(
"trt::CO2"));
382 pBarrelVol =
new GeoFullPhysVol(lBarrelVol);
384 ATH_MSG_DEBUG(
"Virtual TRT Barrel volume defined by RMin = "<<
m_data->virtualBarrelInnerRadius
385 <<
", Rmax = "<<
m_data->virtualBarrelOuterRadius<<
" Zmax = "<<
m_data->virtualBarrelVolumeLength );
390 GeoAlignableTransform * barrelTransform =
391 new GeoAlignableTransform(trtTransform *
m_data->partTransform(barrelLabel));
393 world->add(topLevelNameTag);
394 world->add(barrelTransform);
395 world->add(pBarrelVol);
406 GeoLogVol * lEndCapVolumeAB =
nullptr;
407 if (endcapABPlusPresent || endcapABMinusPresent) {
408 GeoTube * sEndCapVolumeAB_unshifted =
new GeoTube (
m_data->innerRadiusOfEndCapVolumeAB,
409 m_data->outerRadiusOfEndCapVolumeAB,
410 m_data->lengthOfEndCapVolumeAB/2.);
411 const GeoShape & sEndCapVolumeAB
412 = ( *sEndCapVolumeAB_unshifted << GeoTrf::TranslateZ3D(
m_data->positionOfEndCapVolumeAB));
414 lEndCapVolumeAB =
new GeoLogVol(
"TRTEndcapWheelAB", &sEndCapVolumeAB,
m_materialManager->getMaterial(
"trt::CO2"));
417 if (endcapABPlusPresent) {
418 pEndCapABPlus =
new GeoFullPhysVol(lEndCapVolumeAB);
421 new GeoAlignableTransform(trtTransform *
m_data->partTransform(endcapA_WheelAB_Label));
423 world->add(topLevelNameTag);
425 world->add(
new GeoIdentifierTag(0));
426 world->add(pEndCapABPlus);
432 if (endcapABMinusPresent) {
433 pEndCapABMinus =
new GeoFullPhysVol(lEndCapVolumeAB);
438 world->add(topLevelNameTag);
440 world->add(
new GeoIdentifierTag(1));
441 world->add(pEndCapABMinus);
450 GeoLogVol * lEndCapVolumeC =
nullptr;
451 if (endcapCPlusPresent || endcapCMinusPresent) {
452 GeoTube * sEndCapVolumeC_unshifted =
new GeoTube (
m_data->innerRadiusOfEndCapVolumeC,
453 m_data->outerRadiusOfEndCapVolumeC,
454 m_data->lengthOfEndCapVolumeC/2.);
455 const GeoShape & sEndCapVolumeC
456 = ( *sEndCapVolumeC_unshifted << GeoTrf::TranslateZ3D(
m_data->positionOfEndCapVolumeC));
458 lEndCapVolumeC =
new GeoLogVol(
"TRTEndcapWheelC", &sEndCapVolumeC,
m_materialManager->getMaterial(
"trt::CO2"));
461 if (endcapCPlusPresent) {
462 pEndCapCPlus =
new GeoFullPhysVol(lEndCapVolumeC);
465 new GeoAlignableTransform(trtTransform *
m_data->partTransform(endcapA_WheelC_Label));
467 world->add(topLevelNameTag);
469 world->add(
new GeoIdentifierTag(0));
470 world->add(pEndCapCPlus);
474 if (endcapCMinusPresent) {
475 pEndCapCMinus =
new GeoFullPhysVol(lEndCapVolumeC);
480 world->add(topLevelNameTag);
482 world->add(
new GeoIdentifierTag(0));
483 world->add(pEndCapCMinus);
488 GeoFullPhysVol *pCommonEndcapAB[2];
489 GeoFullPhysVol *pCommonEndcapC[2];
491 pCommonEndcapAB[0] = pEndCapABPlus;
492 pCommonEndcapAB[1] = pEndCapABMinus;
493 pCommonEndcapC[0] = pEndCapCPlus;
494 pCommonEndcapC[1] = pEndCapCMinus;
504 xMat.
add(pBarrelVol,
"TRTBarrel");
508 xMat.
add(pEndCapABPlus,
"TRTEndcap");
509 xMat.
add(pEndCapABPlus,
"TRTEndcapA");
511 if (pEndCapABMinus) {
513 xMat.
add(pEndCapABMinus,
"TRTEndcap");
514 xMat.
add(pEndCapABMinus,
"TRTEndcapC");
520 xMat.
add(pEndCapCPlus,
"TRTEndcap_WheelC");
521 xMat.
add(pEndCapCPlus,
"TRTEndcapA_WheelC");
525 xMat.
add(pEndCapCMinus,
"TRTEndcap_WheelC");
526 xMat.
add(pEndCapCMinus,
"TRTEndcapC_WheelC");
545 GeoTube *sBarrelInnerSupport =
new GeoTube(
m_data->innerRadiusOfBarrelVolume,
546 m_data->innerRadiusOfBarrelVolume +
m_data->thicknessOfBarrelInnerSupport,
547 m_data->lengthOfBarrelVolume/2);
550 GeoLogVol *lBarrelInnerSupport =
new GeoLogVol(
"BarrelInnerSupport", sBarrelInnerSupport,
556 GeoPhysVol *pBarrelInnerSupport =
new GeoPhysVol(lBarrelInnerSupport);
557 pBarrelVol->add(pBarrelInnerSupport);
560 GeoTube *sBarrelOuterSupport =
new GeoTube(
m_data->outerRadiusOfBarrelVolume -
m_data->thicknessOfBarrelOuterSupport,
561 m_data->outerRadiusOfBarrelVolume,
m_data->lengthOfBarrelVolume/2);
563 GeoLogVol *lBarrelOuterSupport =
new GeoLogVol(
"BarrelOuterSupport", sBarrelOuterSupport,
569 GeoPhysVol *pBarrelOuterSupport =
new GeoPhysVol(lBarrelOuterSupport);
570 pBarrelVol->add(pBarrelOuterSupport);
574 if (
m_data->includeBarServiceAndFlange) {
583 GeoTube *sEndFlangeRegion =
new GeoTube(
m_data->barFlangeRMin,
m_data->barFlangeRMax,
585 GeoLogVol *lEndFlangeRegion =
new GeoLogVol(
"EndFlangeRegion", sEndFlangeRegion,
588 GeoPhysVol *pEndFlangeRegion =
new GeoPhysVol(lEndFlangeRegion);
590 double zPosEndFlange = (
m_data->barFlangeZMin+
m_data->barFlangeZMax)/2;
591 GeoTransform *xfEndFlangeRegionPlus =
new GeoTransform(GeoTrf::TranslateZ3D(zPosEndFlange));
592 GeoTransform *xfEndFlangeRegionMinus =
new GeoTransform(GeoTrf::TranslateZ3D(-zPosEndFlange));
594 pBarrelVol->add(xfEndFlangeRegionPlus);
595 pBarrelVol->add(pEndFlangeRegion);
596 pBarrelVol->add(xfEndFlangeRegionMinus);
597 pBarrelVol->add(pEndFlangeRegion);
606 GeoTube *sServices =
new GeoTube(
m_data->barServicesRMin,
m_data->barServicesRMax,
608 GeoLogVol *lServices =
new GeoLogVol(
"Services", sServices,
611 GeoPhysVol *pServices =
new GeoPhysVol(lServices);
613 double zPosServices = (
m_data->barServicesZMin+
m_data->barServicesZMax)/2;
614 GeoTransform *xfServicesPlus =
new GeoTransform(GeoTrf::TranslateZ3D(zPosServices));
615 GeoTransform *xfServicesMinus =
new GeoTransform(GeoTrf::TranslateZ3D(-zPosServices));
617 pBarrelVol->add(xfServicesPlus);
618 pBarrelVol->add(pServices);
619 pBarrelVol->add(xfServicesMinus);
620 pBarrelVol->add(pServices);
632 std::vector<InDetDD::TRT_BarrelDescriptor *> bDescriptor;
637 GeoTube *sCoolingTube =
new GeoTube(0,
m_data->barrelOuterRadiusOfCoolingTube,
m_data->lengthOfBarrelVolume/2.0);
638 GeoLogVol *lCoolingTube =
new GeoLogVol(
"CoolingTube",sCoolingTube,
m_materialManager->getMaterial(
"trt::CoolingTube"));
639 GeoPhysVol *pCoolingTube =
new GeoPhysVol(lCoolingTube);
641 GeoTube *sCoolingFluid =
new GeoTube(0,
m_data->barrelInnerRadiusOfCoolingTube,
m_data->lengthOfBarrelVolume/2.0);
642 GeoLogVol *lCoolingFluid =
new GeoLogVol(
"CoolingFluid",sCoolingFluid,
m_materialManager->getMaterial(
"trt::CoolingFluid"));
643 GeoPhysVol*pCoolingFluid =
new GeoPhysVol(lCoolingFluid);
645 pCoolingTube->add(pCoolingFluid);
647 double lengthOfInnerDeadRegion=
m_data->lengthOfDeadRegion;
648 double lengthOfActiveGas = (
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 -
m_data->lengthOfDeadRegion - lengthOfInnerDeadRegion;
649 double activeGasZPositionNormalStraws = (lengthOfActiveGas +
m_data->barrelLengthOfTwister) / 2. + lengthOfInnerDeadRegion;
651 lengthOfInnerDeadRegion =
m_data->barrelLengthOfLargeDeadRegion;
652 lengthOfActiveGas = (
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 -
m_data->lengthOfDeadRegion - lengthOfInnerDeadRegion;
653 double activeGasZPositionStrawsWithLargeDeadRegion = (lengthOfActiveGas +
m_data->barrelLengthOfTwister) / 2. + lengthOfInnerDeadRegion;
656 for (
size_t iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
660 GeoLogVol *lRad =
nullptr;
661 GeoLogVol *lShell =
nullptr;
664 std::ostringstream shellstream;
665 shellstream <<
"Shell" << iABC;
671 if ( shellCorner1.y() <= 0 ) {
ATH_MSG_DEBUG(
"shellCorner1 is <= 0 (" << shellCorner1 <<
")"); }
672 if ( shellCorner2.y() <= 0 ) {
ATH_MSG_DEBUG(
"shellCorner2 is <= 0 (" << shellCorner2 <<
")"); }
673 if ( shellCorner3.y() <= 0 ) {
ATH_MSG_DEBUG(
"shellCorner3 is <= 0 (" << shellCorner3 <<
")" ); }
674 if ( shellCorner4.y() <= 0 ) {
ATH_MSG_DEBUG(
"shellCorner4 is <= 0 (" << shellCorner4 <<
")"); }
676 shellCorner1,shellCorner2,shellCorner3,shellCorner4,shellPosition);
679 std::ostringstream layerstr;
682 std::string shellMatName =
"trt::ModuleShell"+layerstr.str();
683 std::string shellName =
"ModuleShell"+layerstr.str();
687 lShell =
new GeoLogVol(shellName, sShell, shellMat);
695 shellCorner1,shellCorner2,shellCorner3,shellCorner4,
696 radAbsolutePosition,
m_data->barrelThicknessOfModuleWalls);
699 std::string radMatName =
"trt::FibreRadiator"+layerstr.str();
700 std::string radName =
"FibreRadiator"+layerstr.str();
705 lRad =
new GeoLogVol(radName, sRad, radMat);
709 GeoTransform *xCool1 =
new GeoTransform(shellPosition.inverse()
710 *GeoTrf::Translate3D(
m_data->barrelXOfCoolingTube[iABC][0],
m_data->barrelYOfCoolingTube[iABC][0],0));
711 GeoTransform *xCool2 =
new GeoTransform(shellPosition.inverse()
712 *GeoTrf::Translate3D(
m_data->barrelXOfCoolingTube[iABC][1],
m_data->barrelYOfCoolingTube[iABC][1],0));
718 size_t nStrawsWithLargeDeadRegion = 0;
720 for (
size_t iLayer = 0; iLayer<
m_data->barrelNumberOfLayersWithLargeDeadRegion; iLayer++) {
721 nStrawsWithLargeDeadRegion +=
m_data->barrelNumberOfStrawsInStrawLayer[iABC][iLayer];
726 GeoTrf::TranslateX3D Xx(1.0);
727 GeoTrf::TranslateY3D Xy(1.0);
729 GENFUNCTION fx =
ArrayFunction(&
m_data->strawXPosition[iABC][0+nStrawsWithLargeDeadRegion],
730 &
m_data->strawXPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
732 GENFUNCTION fy =
ArrayFunction(&
m_data->strawYPosition[iABC][0+nStrawsWithLargeDeadRegion],
733 &
m_data->strawYPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
734 TRANSFUNCTION tx1 = Pow(Xx,fx)*Pow(Xy,fy);
737 GENFUNCTION fxDead =
ArrayFunction(&
m_data->strawXPosition[iABC][0], &
m_data->strawXPosition[iABC][0+nStrawsWithLargeDeadRegion]);
738 GENFUNCTION fyDead =
ArrayFunction(&
m_data->strawYPosition[iABC][0], &
m_data->strawYPosition[iABC][0+nStrawsWithLargeDeadRegion]);
739 TRANSFUNCTION tx1Dead = Pow(Xx,fxDead)*Pow(Xy,fyDead);
745 TRANSFUNCTION tx1All = Pow(Xx,fxAll)*Pow(Xy,fyAll);
757 m_data->strawYPosition[iABC][
m_data->barrelIndexOfSecondGlobalAlignmentStraw[iABC]],0);
763 GeoTrf::Vector2D local12((Align2Local - Align1Local).
x(),(Align2Local - Align1Local).
y());
764 GeoTrf::Vector2D global12((Align2Global - Align1Global).
x(),(Align2Global - Align1Global).
y());
765 double zrotang = global12.phi()-local12.phi();
769 GeoTrf::Transform3D absStrawXForm = GeoTrf::Translate3D(Align1Global.x(),Align1Global.y(),Align1Global.z())
770 *GeoTrf::RotateZ3D( zrotang )
771 *GeoTrf::Translate3D(-Align1Local.x(),-Align1Local.y(),-Align1Local.z());
777 TRANSFUNCTION tx2=shellPosition.inverse()*absStrawXForm*tx1;
778 TRANSFUNCTION tx2Dead=shellPosition.inverse()*absStrawXForm*tx1Dead;
779 TRANSFUNCTION tx2All=shellPosition.inverse()*absStrawXForm*tx1All;
791 while (c< m_data->barrelNumberOfStrawsInModule[iABC] ) {
814 if((iABC==0)&&(iLayer<=m_data->barrelNumberOfLayersWithLargeDeadRegion )) {
816 double lengthOfActiveGas=
817 (
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 -
m_data->lengthOfDeadRegion-
m_data->barrelLengthOfLargeDeadRegion;
818 double startZOfActiveGas=activeGasZPositionStrawsWithLargeDeadRegion-lengthOfActiveGas/2.0;
819 bDescriptor.back()->strawZPos(activeGasZPositionStrawsWithLargeDeadRegion);
820 bDescriptor.back()->strawZDead(startZOfActiveGas);
821 bDescriptor.back()->strawLength(lengthOfActiveGas);
823 double lengthOfActiveGas=(
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 - 2*
m_data->lengthOfDeadRegion;
824 double startZOfActiveGas=activeGasZPositionNormalStraws-lengthOfActiveGas/2.0;
825 bDescriptor.back()->strawZPos(activeGasZPositionNormalStraws);
826 bDescriptor.back()->strawZDead(startZOfActiveGas);
827 bDescriptor.back()->strawLength(lengthOfActiveGas);
831 bDescriptor.back()->addStraw(
z,
x);
840 pBarrelVol->add(
new GeoSerialIdentifier(0));
841 for (
size_t iMod = 0; iMod<
m_data->nBarrelModulesUsed;iMod++) {
847 GeoFullPhysVol * pShell =
new GeoFullPhysVol(lShell);
851 GeoAlignableTransform * xfx1 =
new GeoAlignableTransform(GeoTrf::RotateZ3D(delta)*shellPosition);
852 pBarrelVol->add(xfx1);
853 pBarrelVol->add(pShell);
862 pShell->add(
new GeoIdentifierTag(iABC));
871 pRad->add(pCoolingTube);
873 pRad->add(pCoolingTube);
874 pRad->add(
new GeoSerialIdentifier(0));
882 ATH_MSG_DEBUG(
"Marking Argon straws from /TRT/Cond/StatusHT:\t"
888 ATH_MSG_DEBUG(
"Marking Krypton straws from /TRT/Cond/StatusHT:\t"
894 ATH_MSG_DEBUG(
"Marking Xenon straws from /TRT/Cond/StatusHT:\t"
897 pHoleForMixedStrawWithLargeDeadRegion =
makeStraw(
true);
901 throw std::runtime_error(
"Unexpected gas mixture");
907 ,
m_data->barrelNumberOfStrawsInModule[iABC]-nStrawsWithLargeDeadRegion);
912 , nStrawsWithLargeDeadRegion);
913 pRad->add(serialTransformerDead);
915 pRad->add(serialTransformer);
930 for (
unsigned int iStrawLayer=0;iStrawLayer<nStrawLayers; iStrawLayer++) {
932 unsigned int jStrawLayer=iStrawLayer;
951 for (
unsigned int e=0;
e<2;
e++) {
952 for (
unsigned int iMod=0;iMod<
m_data->nBarrelModulesUsed; iMod++) {
954 for (
unsigned int iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
968 for (
unsigned int e=0;
e<2;
e++) {
969 for (
unsigned int iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
972 for (
unsigned int iMod=0;iMod<
m_data->nBarrelModulesUsed; iMod++) {
976 current->setPreviousInPhi(prev);
980 if (
m_data->nBarrelModulesUsed==
m_data->nBarrelModules) {
984 first->setPreviousInPhi(last);
1006 if (!(endcapABPlusPresent || endcapABMinusPresent || endcapCPlusPresent || endcapCMinusPresent)){
1009 unsigned int firstIndexOfA = 0;
1010 unsigned int firstIndexOfB =
m_data->endcapNumberOfAWheels;
1011 unsigned int firstIndexOfC =
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels;
1015 if (
m_data->initialLayout) indexUpperBound = firstIndexOfC;
1017 const unsigned int nSides = 2;
1018 const unsigned int nStrawLayMaxEc = 8;
1020 unsigned int iiSide, iiWheel, iiPlane, iiPhi,
counter;
1022 double zdelta = 0.024;
1023 GeoTransform *xfRadiator, *xfPlane, *xfHeatExchanger, *xfFaradayFoilFront, *xfFaradayFoilBack;
1024 GeoTransform *xfInnerSupportGapperA,*xfOuterSupportGapperA, *xfInnerSupportGapperB, *xfOuterSupportGapperB;
1025 GeoFullPhysVol *childPlane =
nullptr;
1028 double RotationsOfStrawPlanes[nStrawLayMaxEc];
1029 double shiftForEachRotation =
m_data->endCapShiftForEachRotation;
1030 RotationsOfStrawPlanes[0] = 0.;
1032 bool oldGeometry =
true;
1034 if (shiftForEachRotation < 0) oldGeometry =
false;
1040 RotationsOfStrawPlanes[
counter] = RotationsOfStrawPlanes[
counter-1] + shiftForEachRotation;
1041 if (RotationsOfStrawPlanes[
counter] >= 1.)
1042 RotationsOfStrawPlanes[
counter] -= 1.;
1046 double RotationsOfStrawPlanesTmp[nStrawLayMaxEc] = {0,0,0,0,2,2,2,2};
1049 RotationsOfStrawPlanes[
counter] = (
counter * shiftForEachRotation) + RotationsOfStrawPlanesTmp[
counter];
1054 std::vector<InDetDD::TRT_EndcapDescriptor*> descriptorsAB[nSides][nStrawLayMaxEc];
1055 std::vector<InDetDD::TRT_EndcapDescriptor*> descriptorsC[nSides][nStrawLayMaxEc];
1059 for(iiSide = 0; iiSide<nSides; iiSide++) {
1060 for(iiPlane = 0; iiPlane < nStrawLayMaxEc; iiPlane++) {
1061 descriptorsAB[iiSide][iiPlane].resize (
m_data->nEndcapPhi);
1062 descriptorsC[iiSide][iiPlane].resize (
m_data->nEndcapPhi);
1069 if (endcapABPlusPresent || endcapABMinusPresent) {
1073 GeoTube* sInnerSupportA =
new GeoTube(
m_data->endCapInnerRadiusOfSupportA,
1074 m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA,
1075 m_data->endCapLengthOfWheelsA/2);
1076 GeoLogVol* lInnerSupportA =
new GeoLogVol(
"InnerSupportA", sInnerSupportA,
m_materialManager->getMaterial(
"trt::InnerSupportA"));
1077 GeoPhysVol* pInnerSupportA =
new GeoPhysVol(lInnerSupportA);
1079 GeoTube* sOuterSupportA =
new GeoTube(
m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA,
1080 m_data->endCapOuterRadiusOfSupportA,
m_data->endCapLengthOfWheelsA/2);
1081 GeoLogVol* lOuterSupportA =
new GeoLogVol(
"OuterSupportA", sOuterSupportA,
m_materialManager->getMaterial(
"trt::OuterSupportA"));
1082 GeoPhysVol* pOuterSupportA =
new GeoPhysVol(lOuterSupportA);
1091 GeoIntrusivePtr<GeoFullPhysVol> pStrawPlaneA =
makeStrawPlane(firstIndexOfA);
1105 GeoTube* sMainRadiatorA =
new GeoTube(
m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA,
1106 m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA
1107 -
m_data->endCapRadialDistFromRadToOuterSupportA,
m_data->endCapMainRadiatorThicknessA/2);
1108 GeoLogVol* lMainRadiatorA =
new GeoLogVol(
"MainRadiatorA",sMainRadiatorA,
m_materialManager->getMaterial(
"trt::FoilRadiatorAC"));
1109 GeoPhysVol* pMainRadiatorA =
new GeoPhysVol(lMainRadiatorA);
1111 GeoTube* sThinRadiatorA =
new GeoTube(
m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA,
1112 m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA
1113 -
m_data->endCapRadialDistFromRadToOuterSupportA,
m_data->endCapThinRadiatorThicknessA/2);
1114 GeoLogVol* lThinRadiatorA =
new GeoLogVol(
"ThinRadiatorA",sThinRadiatorA,
m_materialManager->getMaterial(
"trt::FoilRadiatorAC"));
1115 GeoPhysVol* pThinRadiatorA =
new GeoPhysVol(lThinRadiatorA);
1118 GeoTube* sWheelA =
new GeoTube(
m_data->endCapInnerRadiusOfSupportA,
m_data->endCapOuterRadiusOfSupportA,
m_data->endCapLengthOfWheelsA/2);
1119 GeoLogVol* lWheelA =
new GeoLogVol(
"WheelA", sWheelA,
m_materialManager->getMaterial(
"trt::CO2"));
1157 for(iiSide=0; iiSide<nSides; iiSide++) {
1159 if (pCommonEndcapAB[iiSide]) {
1161 double WheelPlacerA =
m_data->endCapPositionOfFirstWheelA[iiSide];
1163 for(iiWheel=firstIndexOfA; iiWheel < firstIndexOfB; iiWheel++)
1166 WheelPlacerA +=
m_data->endCapDistanceBetweenWheelCentersA[iiSide][iiWheel] ;
1168 GeoFullPhysVol* pWheelA =
new GeoFullPhysVol(lWheelA);
1170 GeoAlignableTransform * xfAlignableModule =
nullptr;
1173 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelA; iiPlane++)
1182 if (iiPlane % 4 == 0) {
1184 int barrel_ec = (iiSide) ? -2 : +2;
1185 xfAlignableModule =
new GeoAlignableTransform(GeoTrf::Transform3D::Identity());
1193 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsA;
1196 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
1197 phiPlane += deltaPhiForStrawsA;
1200 int bar_ec = (iiSide) ? -2 : +2;
1211 ATH_MSG_DEBUG(
"Marking Argon straws from /TRT/Cond/StatusHT:\t"
1213 childPlane = pStrawPlaneA_Ar->clone();
1216 ATH_MSG_DEBUG(
"Marking Krypton straws from /TRT/Cond/StatusHT:\t"
1218 childPlane = pStrawPlaneA_Kr->clone();
1221 ATH_MSG_DEBUG(
"Marking Xenon straws from /TRT/Cond/StatusHT:\t"
1223 childPlane = pStrawPlaneA->clone();
1227 throw std::runtime_error(
"Unexpected gas mixture");
1232 xfPlane =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionA[iiPlane] -
m_data->endCapLengthOfWheelsA/2)*GeoTrf::RotateZ3D(phiPlane));
1234 if (xfAlignableModule) pWheelA->add(xfAlignableModule);
1235 pWheelA->add(xfPlane);
1236 pWheelA->add(
new GeoIdentifierTag(iiPlane));
1237 pWheelA->add(childPlane);
1241 if(iiWheel==firstIndexOfA && iiPlane < nStrawLayMaxEc)
1242 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1248 pDescriptor->
nStraws() =
m_data->endcapNumberOfStrawsInStrawLayer_AWheels/
m_data->nEndcapPhi;
1249 pDescriptor->
strawPitch() = deltaPhiForStrawsA;
1251 double startPhi = phiPlane + iiPhi * pDescriptor->
strawPitch() * pDescriptor->
nStraws();
1265 pDescriptor->
startPhi() = startPhi;
1267 pDescriptor->
strawLength() =
m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA
1268 - 2*
m_data->lengthOfDeadRegion -
m_data->endCapRadialThicknessOfInnerSupportA -
m_data->endCapInnerRadiusOfSupportA;
1269 pDescriptor->
innerRadius() =
m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA
1270 +
m_data->lengthOfDeadRegion;
1273 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi] = pDescriptor;
1276 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1282 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
1284 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
1299 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionA[
counter-1] -
m_data->endCapLengthOfWheelsA/2
1300 -
m_data->outerRadiusOfStraw -
m_data->endCapThinRadiatorThicknessA/2));
1301 pWheelA->add(xfRadiator);
1302 pWheelA->add(pThinRadiatorA);
1307 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionA[
counter-1] -
m_data->endCapLengthOfWheelsA/2
1308 +
m_data->outerRadiusOfStraw +
m_data->endCapThinRadiatorThicknessA/2));
1309 pWheelA->add(xfRadiator);
1310 pWheelA->add(pThinRadiatorA);
1314 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionA[
counter-1] -
m_data->endCapLengthOfWheelsA/2
1315 +
m_data->outerRadiusOfStraw +
m_data->endCapMainRadiatorThicknessA/2));
1316 pWheelA->add(xfRadiator);
1317 pWheelA->add(pMainRadiatorA);
1320 pWheelA->add(pInnerSupportA);
1321 pWheelA->add(pOuterSupportA);
1324 GeoAlignableTransform * xfWheel =
new GeoAlignableTransform( GeoTrf::TranslateZ3D(WheelPlacerA) );
1326 pCommonEndcapAB[iiSide]->add(xfWheel);
1327 pCommonEndcapAB[iiSide]->add(
new GeoIdentifierTag(iiWheel));
1328 pCommonEndcapAB[iiSide]->add(pWheelA);
1331 int barrel_ec = (iiSide) ? -2 : +2;
1335 if (
m_data->includeECFoilHeatExchangerAndMembranes) {
1340 GeoTube* sFaradayFoilWheelAB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA,
1341 m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA,
1342 m_data->endCapFaradayFoilThickness/2);
1343 GeoLogVol* lFaradayFoilWheelAB =
new GeoLogVol(
"FaradayKaptonFoil",sFaradayFoilWheelAB,
m_materialManager->getMaterial(
"trt::FaradayFoilMaterial"));
1344 GeoIntrusivePtr<GeoPhysVol> pFaradayFoilWheelAB{
new GeoPhysVol(lFaradayFoilWheelAB)};
1347 GeoTube* sHeatExchangerA =
new GeoTube(
m_data->endCapRMinOfHeatExchanger,
m_data->endCapRMaxOfHeatExchanger,
m_data->endCapHeatExchangerThicknessA/2);
1348 GeoLogVol* lHeatExchangerA =
new GeoLogVol(
"HeatExchangerA",sHeatExchangerA,
m_materialManager->getMaterial(
"trt::HeatExchangerAMat"));
1349 GeoIntrusivePtr<GeoPhysVol> pHeatExchangerA{
new GeoPhysVol(lHeatExchangerA)};
1352 GeoTube* sInnerSupportGapperA =
new GeoTube(
m_data->endCapInnerRadiusOfSupportA,
1353 m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA,
1354 m_data->endCapHeatExchangerThicknessA/2 +
m_data->endCapFaradayFoilThickness/2 + zdelta);
1355 GeoLogVol* lInnerSupportGapperA =
new GeoLogVol(
"InnerSupportGapperA", sInnerSupportGapperA,
m_materialManager->getMaterial(
"trt::InnerSupportA"));
1356 GeoIntrusivePtr<GeoPhysVol> pInnerSupportGapperA{
new GeoPhysVol(lInnerSupportGapperA)};
1358 GeoTube* sOuterSupportGapperA =
new GeoTube(
m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA,
1359 m_data->endCapOuterRadiusOfSupportA,
1360 m_data->endCapHeatExchangerThicknessA/2 +
m_data->endCapFaradayFoilThickness/2 + zdelta);
1361 GeoLogVol* lOuterSupportGapperA =
new GeoLogVol(
"OuterSupportGapperA", sOuterSupportGapperA,
m_materialManager->getMaterial(
"trt::OuterSupportA"));
1362 GeoIntrusivePtr<GeoPhysVol> pOuterSupportGapperA{
new GeoPhysVol(lOuterSupportGapperA)};
1364 if(iiWheel<=firstIndexOfB-1)
1366 xfFaradayFoilFront =
new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerA
1367 -
m_data->endCapLengthOfWheelsA/2
1368 -
m_data->endCapFaradayFoilThickness/2.0));
1369 xfFaradayFoilBack =
new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerA
1370 +
m_data->endCapLengthOfWheelsA/2
1371 +
m_data->endCapFaradayFoilThickness/2.0));
1372 pCommonEndcapAB[iiSide]->add(xfFaradayFoilFront);
1373 pCommonEndcapAB[iiSide]->add(pFaradayFoilWheelAB);
1374 pCommonEndcapAB[iiSide]->add(xfFaradayFoilBack);
1375 pCommonEndcapAB[iiSide]->add(pFaradayFoilWheelAB);
1380 if(iiWheel<firstIndexOfB-1)
1382 xfHeatExchanger =
new GeoTransform(GeoTrf::TranslateZ3D( WheelPlacerA
1383 +
m_data->endCapLengthOfWheelsA/2
1384 +
m_data->endCapFaradayFoilThickness
1385 +
m_data->endCapHeatExchangerThicknessA/2));
1386 pCommonEndcapAB[iiSide]->add(xfHeatExchanger);
1387 pCommonEndcapAB[iiSide]->add(pHeatExchangerA);
1389 xfInnerSupportGapperA =
new GeoTransform(GeoTrf::TranslateZ3D( WheelPlacerA
1390 +
m_data->endCapLengthOfWheelsA/2
1391 +
m_data->endCapFaradayFoilThickness
1392 +
m_data->endCapHeatExchangerThicknessA/2));
1393 xfOuterSupportGapperA =
new GeoTransform(GeoTrf::TranslateZ3D( WheelPlacerA
1394 +
m_data->endCapLengthOfWheelsA/2
1395 +
m_data->endCapFaradayFoilThickness
1396 +
m_data->endCapHeatExchangerThicknessA/2));
1397 pCommonEndcapAB[iiSide]->add(xfInnerSupportGapperA);
1398 pCommonEndcapAB[iiSide]->add(pInnerSupportGapperA);
1399 pCommonEndcapAB[iiSide]->add(xfOuterSupportGapperA);
1400 pCommonEndcapAB[iiSide]->add(pOuterSupportGapperA);
1417 GeoTube* sInnerSupportB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB,
1418 m_data->endCapInnerRadiusOfSupportB +
m_data->endCapRadialThicknessOfInnerSupportB,
1419 m_data->endCapLengthOfWheelsB/2);
1420 GeoLogVol* lInnerSupportB =
new GeoLogVol(
"InnerSupportB", sInnerSupportB,
m_materialManager->getMaterial(
"trt::InnerSupportB"));
1421 GeoPhysVol* pInnerSupportB =
new GeoPhysVol(lInnerSupportB);
1423 GeoTube* sOuterSupportB =
new GeoTube(
m_data->endCapOuterRadiusOfSupportB -
m_data->endCapRadialThicknessOfOuterSupportB,
1424 m_data->endCapOuterRadiusOfSupportB,
m_data->endCapLengthOfWheelsB/2);
1425 GeoLogVol* lOuterSupportB =
new GeoLogVol(
"OuterSupportB", sOuterSupportB,
m_materialManager->getMaterial(
"trt::OuterSupportB"));
1426 GeoPhysVol* pOuterSupportB =
new GeoPhysVol(lOuterSupportB);
1429 GeoFullPhysVol* pStrawPlaneB_Kr =
nullptr;
1430 GeoFullPhysVol* pStrawPlaneB_Ar =
nullptr;
1435 GeoIntrusivePtr<GeoFullPhysVol> pStrawPlaneB {
makeStrawPlane(firstIndexOfB)};
1439 GeoTube* sMainRadiatorB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB +
m_data->endCapRadialThicknessOfInnerSupportB,
1440 m_data->endCapOuterRadiusOfSupportB -
m_data->endCapRadialThicknessOfOuterSupportB
1441 -
m_data->endCapRadialDistFromRadToOuterSupportB,
m_data->endCapMainRadiatorThicknessB/2);
1442 GeoLogVol* lMainRadiatorB =
new GeoLogVol(
"MainRadiatorB",sMainRadiatorB,
m_materialManager->getMaterial(
"trt::FoilRadiatorB"));
1443 GeoPhysVol* pMainRadiatorB =
new GeoPhysVol(lMainRadiatorB);
1445 GeoTube* sThinRadiatorB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB +
m_data->endCapRadialThicknessOfInnerSupportB,
1446 m_data->endCapOuterRadiusOfSupportB -
m_data->endCapRadialThicknessOfOuterSupportB
1447 -
m_data->endCapRadialDistFromRadToOuterSupportB,
1448 m_data->endCapThinRadiatorThicknessB/2);
1449 GeoLogVol* lThinRadiatorB =
new GeoLogVol(
"ThinRadiatorB",sThinRadiatorB,
m_materialManager->getMaterial(
"trt::FoilRadiatorB"));
1450 GeoPhysVol* pThinRadiatorB =
new GeoPhysVol(lThinRadiatorB);
1452 GeoTube* sMiddleRadiatorB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB +
m_data->endCapRadialThicknessOfInnerSupportB,
1453 m_data->endCapOuterRadiusOfSupportB -
m_data->endCapRadialThicknessOfOuterSupportB
1454 -
m_data->endCapRadialDistFromRadToOuterSupportB,
m_data->endCapMiddleRadiatorThicknessB/2);
1455 GeoLogVol* lMiddleRadiatorB =
new GeoLogVol(
"MiddleRadiatorB",sMiddleRadiatorB,
m_materialManager->getMaterial(
"trt::FoilRadiatorB"));
1456 GeoPhysVol* pMiddleRadiatorB =
new GeoPhysVol(lMiddleRadiatorB);
1460 GeoTube* sWheelB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB,
m_data->endCapOuterRadiusOfSupportB,
m_data->endCapLengthOfWheelsB/2);
1461 GeoLogVol* lWheelB =
new GeoLogVol(
"WheelB", sWheelB,
m_materialManager->getMaterial(
"trt::CO2"));
1466 for(iiSide=0; iiSide<nSides; iiSide++) {
1468 double WheelPlacerB =
m_data->endCapPositionOfFirstWheelB[iiSide];
1471 if (pCommonEndcapAB[iiSide]) {
1472 for(iiWheel=firstIndexOfB; iiWheel < firstIndexOfC; iiWheel++)
1475 WheelPlacerB +=
m_data->endCapDistanceBetweenWheelCentersB[iiSide][iiWheel];
1477 GeoFullPhysVol* pWheelB =
new GeoFullPhysVol(lWheelB);
1479 GeoAlignableTransform * xfAlignableModule =
nullptr;
1482 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelB; iiPlane++)
1489 if (iiPlane % 4 == 0) {
1491 int barrel_ec = (iiSide) ? -2 : +2;
1492 xfAlignableModule =
new GeoAlignableTransform(GeoTrf::Transform3D::Identity());
1499 int bar_ec = (iiSide) ? -2 : +2;
1510 ATH_MSG_DEBUG(
"Marking Argon straws from /TRT/Cond/StatusHT:\t"
1512 childPlane = pStrawPlaneB_Ar->clone();
1515 ATH_MSG_DEBUG(
"Marking Krypton straws from /TRT/Cond/StatusHT:\t"
1517 childPlane = pStrawPlaneB_Kr->clone();
1520 ATH_MSG_DEBUG(
"Marking Xenon straws from /TRT/Cond/StatusHT:\t"
1522 childPlane = pStrawPlaneB->clone();
1526 throw std::runtime_error(
"Unexpected gas mixture");
1531 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsB;
1534 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
1535 phiPlane += deltaPhiForStrawsB;
1538 xfPlane =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionB[iiPlane]
1539 -
m_data->endCapLengthOfWheelsB/2)*GeoTrf::RotateZ3D(phiPlane));
1541 if (xfAlignableModule) pWheelB->add(xfAlignableModule);
1542 pWheelB->add(xfPlane);
1543 pWheelB->add(
new GeoIdentifierTag(iiPlane));
1544 pWheelB->add(childPlane);
1547 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1553 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
1555 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
1572 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionB[
counter-1] -
m_data->endCapLengthOfWheelsB/2
1573 +
m_data->outerRadiusOfStraw +
m_data->endCapMainRadiatorThicknessB/2));
1574 pWheelB->add(xfRadiator);
1575 pWheelB->add(pMainRadiatorB);
1582 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionB[
counter-1] -
m_data->endCapLengthOfWheelsB/2 +
sign*(
m_data->outerRadiusOfStraw +
m_data->endCapThinRadiatorThicknessB/2)));
1583 pWheelB->add(xfRadiator);
1584 pWheelB->add(pThinRadiatorB);
1591 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionB[
counter-1] -
m_data->endCapLengthOfWheelsB/2 +
sign*(
m_data->outerRadiusOfStraw +
m_data->endCapMiddleRadiatorThicknessB/2)));
1592 pWheelB->add(xfRadiator);
1593 pWheelB->add(pMiddleRadiatorB);
1598 pWheelB->add(pInnerSupportB);
1599 pWheelB->add(pOuterSupportB);
1602 GeoAlignableTransform * xfWheel =
new GeoAlignableTransform(GeoTrf::TranslateZ3D( WheelPlacerB ));
1605 pCommonEndcapAB[iiSide]->add(xfWheel);
1606 pCommonEndcapAB[iiSide]->add(
new GeoIdentifierTag(iiWheel));
1607 pCommonEndcapAB[iiSide]->add(pWheelB);
1610 int barrel_ec = (iiSide) ? -2 : +2;
1615 if (
m_data->includeECFoilHeatExchangerAndMembranes) {
1620 GeoTube* sFaradayFoilWheelAB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB +
m_data->endCapRadialThicknessOfInnerSupportB,
1621 m_data->endCapOuterRadiusOfSupportB -
m_data->endCapRadialThicknessOfOuterSupportB,
1622 m_data->endCapFaradayFoilThickness/2);
1623 GeoLogVol* lFaradayFoilWheelAB =
new GeoLogVol(
"FaradayKaptonFoil",sFaradayFoilWheelAB,
m_materialManager->getMaterial(
"trt::FaradayFoilMaterial"));
1624 GeoIntrusivePtr<GeoPhysVol> pFaradayFoilWheelAB{
new GeoPhysVol(lFaradayFoilWheelAB)};
1627 GeoTube* sHeatExchangerB =
new GeoTube(
m_data->endCapRMinOfHeatExchanger,
m_data->endCapRMaxOfHeatExchanger,
m_data->endCapHeatExchangerThicknessB/2);
1629 GeoLogVol* lHeatExchangerB =
new GeoLogVol(
"HeatExchangerB", sHeatExchangerB,
m_materialManager->getMaterial(
"trt::HeatExchangerBMat"));
1630 GeoIntrusivePtr<GeoPhysVol> pHeatExchangerB{
new GeoPhysVol(lHeatExchangerB)};
1633 GeoTube* sInnerSupportGapperB =
new GeoTube(
m_data->endCapInnerRadiusOfSupportB,
1634 m_data->endCapInnerRadiusOfSupportB +
m_data->endCapRadialThicknessOfInnerSupportB,
1635 m_data->endCapHeatExchangerThicknessB/2 +
m_data->endCapFaradayFoilThickness/2 + zdelta);
1636 GeoLogVol* lInnerSupportGapperB =
new GeoLogVol(
"InnerSupportGapperB", sInnerSupportGapperB,
m_materialManager->getMaterial(
"trt::InnerSupportB"));
1637 GeoIntrusivePtr<GeoPhysVol> pInnerSupportGapperB{
new GeoPhysVol(lInnerSupportGapperB)};
1639 GeoTube* sOuterSupportGapperB =
new GeoTube(
m_data->endCapOuterRadiusOfSupportB -
m_data->endCapRadialThicknessOfOuterSupportB,
1640 m_data->endCapOuterRadiusOfSupportB,
1641 m_data->endCapHeatExchangerThicknessB/2 +
m_data->endCapFaradayFoilThickness/2 + zdelta);
1642 GeoLogVol* lOuterSupportGapperB =
new GeoLogVol(
"OuterSupportGapperB", sOuterSupportGapperB,
m_materialManager->getMaterial(
"trt::OuterSupportB"));
1643 GeoIntrusivePtr<GeoPhysVol> pOuterSupportGapperB{
new GeoPhysVol(lOuterSupportGapperB)};
1646 if(iiWheel-firstIndexOfB<firstIndexOfC-firstIndexOfB)
1648 xfFaradayFoilFront =
new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerB
1649 -
m_data->endCapLengthOfWheelsB/2
1650 -
m_data->endCapFaradayFoilThickness/2.0));
1651 xfFaradayFoilBack =
new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerB
1652 +
m_data->endCapLengthOfWheelsB/2
1653 +
m_data->endCapFaradayFoilThickness/2.0));
1655 pCommonEndcapAB[iiSide]->add(xfFaradayFoilFront);
1656 pCommonEndcapAB[iiSide]->add(pFaradayFoilWheelAB);
1657 pCommonEndcapAB[iiSide]->add(xfFaradayFoilBack);
1658 pCommonEndcapAB[iiSide]->add(pFaradayFoilWheelAB);
1663 if(iiWheel-firstIndexOfB<firstIndexOfC-firstIndexOfB-1)
1665 xfHeatExchanger =
new GeoTransform(GeoTrf::TranslateZ3D( WheelPlacerB
1666 +
m_data->endCapLengthOfWheelsB/2
1667 +
m_data->endCapFaradayFoilThickness
1668 +
m_data->endCapHeatExchangerThicknessB/2));
1669 pCommonEndcapAB[iiSide]->add(xfHeatExchanger);
1670 pCommonEndcapAB[iiSide]->add(pHeatExchangerB);
1672 xfInnerSupportGapperB =
new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerB
1673 +
m_data->endCapLengthOfWheelsB/2
1674 +
m_data->endCapFaradayFoilThickness
1675 +
m_data->endCapHeatExchangerThicknessB/2));
1677 xfOuterSupportGapperB =
new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerB
1678 +
m_data->endCapLengthOfWheelsB/2
1679 +
m_data->endCapFaradayFoilThickness
1680 +
m_data->endCapHeatExchangerThicknessB/2));
1681 pCommonEndcapAB[iiSide]->add(xfInnerSupportGapperB);
1682 pCommonEndcapAB[iiSide]->add(pInnerSupportGapperB);
1683 pCommonEndcapAB[iiSide]->add(xfOuterSupportGapperB);
1684 pCommonEndcapAB[iiSide]->add(pOuterSupportGapperB);
1700 if (
m_data->includeECFoilHeatExchangerAndMembranes) {
1703 GeoTube* sMbrane =
new GeoTube(
m_data->endCapRMinOfMbrane,
m_data->endCapRMaxOfMbrane,
m_data->endCapThicknessOfMbrane/2.0);
1704 GeoLogVol* lMbrane =
new GeoLogVol(
"Membrane", sMbrane,
m_materialManager->getMaterial(
"trt::EndCapMbrane"));
1705 GeoPhysVol* pMbrane =
new GeoPhysVol(lMbrane);
1707 GeoTransform *xfMbraneWheelA1 =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapZMinOfMbraneWheelA1 +
m_data->endCapThicknessOfMbrane/2.0));
1708 GeoTransform *xfMbraneWheelA2 =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapZMinOfMbraneWheelA2 +
m_data->endCapThicknessOfMbrane/2.0));
1709 GeoTransform *xfMbraneWheelB1 =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapZMinOfMbraneWheelB1 +
m_data->endCapThicknessOfMbrane/2.0));
1710 GeoTransform *xfMbraneWheelB2 =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapZMinOfMbraneWheelB2 +
m_data->endCapThicknessOfMbrane/2.0));
1712 for(iiSide=0; iiSide<nSides; iiSide++) {
1713 pCommonEndcapAB[iiSide]->add(xfMbraneWheelA1);
1714 pCommonEndcapAB[iiSide]->add(pMbrane);
1715 pCommonEndcapAB[iiSide]->add(xfMbraneWheelA2);
1716 pCommonEndcapAB[iiSide]->add(pMbrane);
1717 pCommonEndcapAB[iiSide]->add(xfMbraneWheelB1);
1718 pCommonEndcapAB[iiSide]->add(pMbrane);
1719 pCommonEndcapAB[iiSide]->add(xfMbraneWheelB2);
1720 pCommonEndcapAB[iiSide]->add(pMbrane);
1728 if (endcapCPlusPresent || endcapCMinusPresent) {
1730 GeoTube* sInnerSupportC =
new GeoTube(
m_data->endCapInnerRadiusOfSupportC,
m_data->endCapInnerRadiusOfSupportC
1731 +
m_data->endCapRadialThicknessOfInnerSupportC,
m_data->endCapLengthOfWheelsC/2);
1732 GeoLogVol* lInnerSupportC =
new GeoLogVol(
"InnerSupportC", sInnerSupportC,
m_materialManager->getMaterial(
"trt::InnerSupportC"));
1733 GeoPhysVol* pInnerSupportC =
new GeoPhysVol(lInnerSupportC);
1735 GeoTube* sOuterSupportC =
new GeoTube(
m_data->endCapOuterRadiusOfSupportC -
m_data->endCapRadialThicknessOfOuterSupportC,
1736 m_data->endCapOuterRadiusOfSupportC,
m_data->endCapLengthOfWheelsC/2);
1737 GeoLogVol* lOuterSupportC =
new GeoLogVol(
"OuterSupportC", sOuterSupportC,
m_materialManager->getMaterial(
"trt::OuterSupportC"));
1738 GeoPhysVol* pOuterSupportC =
new GeoPhysVol(lOuterSupportC);
1741 GeoIntrusivePtr<GeoFullPhysVol> pStrawPlaneC =
makeStrawPlane(firstIndexOfC);
1744 GeoTube* sMainRadiatorC =
new GeoTube(
m_data->endCapInnerRadiusOfSupportC +
m_data->endCapRadialThicknessOfInnerSupportC,
1745 m_data->endCapOuterRadiusOfSupportC -
m_data->endCapRadialThicknessOfOuterSupportC
1746 -
m_data->endCapRadialDistFromRadToOuterSupportC,
m_data->endCapMainRadiatorThicknessC/2);
1747 GeoLogVol* lMainRadiatorC =
new GeoLogVol(
"MainRadiatorC",sMainRadiatorC,
m_materialManager->getMaterial(
"trt::FoilRadiatorAC"));
1748 GeoPhysVol* pMainRadiatorC =
new GeoPhysVol(lMainRadiatorC);
1750 GeoTube* sThinRadiatorC =
new GeoTube(
m_data->endCapInnerRadiusOfSupportC +
m_data->endCapRadialThicknessOfInnerSupportC,
1751 m_data->endCapOuterRadiusOfSupportC -
m_data->endCapRadialThicknessOfOuterSupportC
1752 -
m_data->endCapRadialDistFromRadToOuterSupportC,
m_data->endCapThinRadiatorThicknessC/2);
1753 GeoLogVol* lThinRadiatorC =
new GeoLogVol(
"ThinRadiatorC",sThinRadiatorC,
m_materialManager->getMaterial(
"trt::FoilRadiatorAC"));
1754 GeoPhysVol* pThinRadiatorC =
new GeoPhysVol(lThinRadiatorC);
1757 GeoTube* sWheelC =
new GeoTube(
m_data->endCapInnerRadiusOfSupportC,
m_data->endCapOuterRadiusOfSupportC,
m_data->endCapLengthOfWheelsC/2);
1758 GeoLogVol* lWheelC =
new GeoLogVol(
"WheelC", sWheelC,
m_materialManager->getMaterial(
"trt::CO2"));
1763 for(iiSide=0; iiSide<nSides; iiSide++) {
1765 if (pCommonEndcapC[iiSide]) {
1766 for(iiWheel=firstIndexOfC; iiWheel < indexUpperBound; iiWheel++)
1768 GeoFullPhysVol* pWheelC =
new GeoFullPhysVol(lWheelC);
1771 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelC; iiPlane++)
1774 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsC;
1777 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
1778 phiPlane += deltaPhiForStrawsC;
1782 childPlane = pStrawPlaneC->clone();
1784 xfPlane =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionC[iiPlane]
1785 -
m_data->endCapLengthOfWheelsC/2)*GeoTrf::RotateZ3D(phiPlane));
1786 pWheelC->add(xfPlane);
1787 pWheelC->add(
new GeoIdentifierTag(iiPlane));
1788 pWheelC->add(childPlane);
1792 if(iiWheel==firstIndexOfC && iiPlane < nStrawLayMaxEc)
1793 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1798 pDescriptor->
nStraws() =
m_data->endcapNumberOfStrawsInStrawLayer_CWheels/
m_data->nEndcapPhi;
1799 pDescriptor->
strawPitch() = deltaPhiForStrawsC;
1802 double startPhi = phiPlane + iiPhi * pDescriptor->
strawPitch() * pDescriptor->
nStraws();
1815 pDescriptor->
startPhi() = startPhi;
1817 pDescriptor->
strawLength() =
m_data->endCapOuterRadiusOfSupportC -
m_data->endCapRadialThicknessOfOuterSupportC
1818 - 2*
m_data->lengthOfDeadRegion -
m_data->endCapRadialThicknessOfInnerSupportC -
m_data->endCapInnerRadiusOfSupportC;
1819 pDescriptor->
innerRadius() =
m_data->endCapInnerRadiusOfSupportC +
m_data->endCapRadialThicknessOfInnerSupportC +
m_data->lengthOfDeadRegion;
1823 descriptorsC[iiSide][iiPlane%nStrawLayMaxEc][iiPhi] = pDescriptor;
1827 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1833 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
1835 descriptorsC[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
1851 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionC[
counter-1] -
m_data->endCapLengthOfWheelsC/2
1852 -
m_data->lengthOfDeadRegion -
m_data->endCapThinRadiatorThicknessC/2));
1853 pWheelC->add(xfRadiator);
1854 pWheelC->add(pThinRadiatorC);
1859 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionC[
counter-1] -
m_data->endCapLengthOfWheelsC/2
1860 +
m_data->outerRadiusOfStraw +
m_data->endCapThinRadiatorThicknessC/2));
1861 pWheelC->add(xfRadiator);
1862 pWheelC->add(pThinRadiatorC);
1866 xfRadiator =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionC[
counter-1] -
m_data->endCapLengthOfWheelsC/2
1867 +
m_data->outerRadiusOfStraw +
m_data->endCapMainRadiatorThicknessC/2));
1868 pWheelC->add(xfRadiator);
1869 pWheelC->add(pMainRadiatorC);
1873 pWheelC->add(pInnerSupportC);
1874 pWheelC->add(pOuterSupportC);
1877 GeoAlignableTransform * xfWheel
1878 =
new GeoAlignableTransform(GeoTrf::TranslateZ3D(
m_data->endCapPositionOfFirstWheelC
1879 + (iiWheel - firstIndexOfC)*
m_data->endCapDistanceBetweenWheelCentersC));
1881 pCommonEndcapC[iiSide]->add(xfWheel);
1882 pCommonEndcapC[iiSide]->add(
new GeoIdentifierTag(iiWheel));
1883 pCommonEndcapC[iiSide]->add(pWheelC);
1886 int barrel_ec = (iiSide) ? -2 : +2;
1899 for (iiSide=0; iiSide<2; iiSide++)
1900 for(iiPhi=0; iiPhi<
m_data->nEndcapPhi; iiPhi++)
1903 for (iiWheel=0; iiWheel<indexUpperBound; iiWheel++)
1910 current->setPreviousInZ(prev);
1959 double openingAngleOfFirstCorner=
angle(delta12,delta14);
1967 double commonSide = (
magn(delta14) +
magn(delta23) + (
sign==1?
magn(delta24):
magn(delta13)) ) / 3.;
1968 double base1 =
magn(delta12);
1969 double base2 =
magn(delta34);
1971 if (shrinkDist!=0) {
1973 double cosAlpha= sqrt(commonSide*commonSide-0.25*base1*base1)/commonSide;
1974 commonSide -= (1+1/cosAlpha)*shrinkDist;
1975 base1 -= 2*shrinkDist;
1976 base2 -= 2*shrinkDist;
1979 double height1 = sqrt (commonSide*commonSide-0.25*base1*base1);
1980 double height2 = sqrt (commonSide*commonSide-0.25*base2*base2);
1981 double rot =
atan(base2/height2/2)-
atan(base1/height1/2);
1983 GeoTrd *trd1 =
new GeoTrd(base1/2+epsilon, epsilon,
length/2,
length/2, height1/2);
1984 GeoTrd *trd2 =
new GeoTrd(epsilon, base2/2+epsilon,
length/2,
length/2, height2/2);
1986 double gamma =
atan((base2/2+epsilon)*2/height2);
1987 double r = sqrt((base2/2+epsilon)*(base2/2+epsilon) + height2*height2/4);
1989 const GeoShape & sShell = (*trd1).add((*trd2)<<xForm);
1996 GeoTrf::Vector2D actualCorner1, actualCorner2, actualCorner3, actualCorner4;
1997 actualCorner1 = corner1;
2013 rotate(modRot,actualCorner1);
2014 rotate(modRot,actualCorner2);
2015 rotate(modRot,actualCorner3);
2016 rotate(modRot,actualCorner4);
2021 GeoTrf::Vector2D displacement = 0.25*( (corner1+corner2+corner3+corner4) - (actualCorner1+actualCorner2+actualCorner3+actualCorner4) );
2027 center += displacement;
2028 actualCorner1 += displacement;
2029 actualCorner2 += displacement;
2030 actualCorner3 += displacement;
2031 actualCorner4 += displacement;
2054 double lengthOfInnerDeadRegion= hasLargeDeadRegion ?
m_data->barrelLengthOfLargeDeadRegion :
m_data->lengthOfDeadRegion ;
2055 double lengthOfActiveGas = (
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 -
m_data->lengthOfDeadRegion - lengthOfInnerDeadRegion;
2056 double posA = (lengthOfActiveGas +
m_data->barrelLengthOfTwister) / 2. + lengthOfInnerDeadRegion;
2057 double posInnerDeadRegion = (
m_data->barrelLengthOfTwister + lengthOfInnerDeadRegion ) / 2;
2060 GeoTube *sHole =
new GeoTube(0,
m_data->barrelOuterRadiusOfStrawHole,
m_data->barrelLengthOfStraw/2.0);
2061 GeoLogVol *lHole =
new GeoLogVol(
"Hole", sHole,
m_materialManager->getMaterial(
"trt::CO2"));
2062 GeoPhysVol *pHole =
new GeoPhysVol(lHole);
2065 GeoTube *sStraw =
new GeoTube(0,
m_data->outerRadiusOfStraw,
m_data->barrelLengthOfStraw/2.0);
2066 GeoLogVol *lStrawMixed =
new GeoLogVol(
"StrawM", sStraw,
m_materialManager->getMaterial(
"trt::Straw"));
2067 GeoPhysVol *pStrawMixed =
new GeoPhysVol(lStrawMixed);
2070 GeoShape *sDeadRegion =
new GeoTube(
m_data->outerRadiusOfWire ,
m_data->innerRadiusOfStraw ,
m_data->lengthOfDeadRegion/2 );
2071 GeoLogVol *lDeadRegion =
nullptr;
2073 lDeadRegion =
new GeoLogVol(
"DeadRegion_Ar", sDeadRegion,
m_materialManager->getMaterial(
"trt::ArCO2O2"));
2075 lDeadRegion =
new GeoLogVol(
"DeadRegion_Kr", sDeadRegion,
m_materialManager->getMaterial(
"trt::KrCO2O2"));
2078 GeoPhysVol *pDeadRegion =
new GeoPhysVol(lDeadRegion);
2081 GeoShape * sInnerDeadRegion =
new GeoTube(
m_data->outerRadiusOfWire ,
m_data->innerRadiusOfStraw, lengthOfInnerDeadRegion/2 );
2082 GeoLogVol * lInnerDeadRegion =
nullptr;
2084 lInnerDeadRegion =
new GeoLogVol(
"InnerDeadRegion_Ar", sInnerDeadRegion,
m_materialManager->getMaterial(
"trt::ArCO2O2"));
2086 lInnerDeadRegion =
new GeoLogVol(
"InnerDeadRegion_Kr", sInnerDeadRegion,
m_materialManager->getMaterial(
"trt::KrCO2O2"));
2089 GeoPhysVol* pInnerDeadRegion =
new GeoPhysVol(lInnerDeadRegion);
2092 GeoShape *sTwister =
new GeoTube(
m_data->outerRadiusOfWire ,
m_data->innerRadiusOfStraw,
m_data->barrelLengthOfTwister/2);
2093 GeoLogVol *lTwister =
new GeoLogVol(
"Twister", sTwister,
m_materialManager->getMaterial(
"trt::Twister"));
2094 GeoPhysVol *pTwister =
new GeoPhysVol(lTwister);
2097 GeoShape *sWire =
new GeoTube( 0,
m_data->outerRadiusOfWire,
m_data->barrelLengthOfStraw/2.0);
2098 GeoLogVol *lWire =
new GeoLogVol(
"Wire", sWire,
m_materialManager->getMaterial(
"trt::Wire"));
2099 GeoPhysVol *pWire =
new GeoPhysVol(lWire);
2105 GeoTube *sGasMA =
new GeoTube(
m_data->outerRadiusOfWire ,
m_data->innerRadiusOfStraw,lengthOfActiveGas/2.0);
2106 GeoLogVol * lGasMA =
nullptr;
2108 lGasMA =
new GeoLogVol(
"GasMA_Ar", sGasMA,
m_materialManager->getMaterial(
"trt::ArCO2O2"));
2110 lGasMA =
new GeoLogVol(
"GasMA_Kr", sGasMA,
m_materialManager->getMaterial(
"trt::KrCO2O2"));
2113 GeoNameTag *nGasMAPos =
new GeoNameTag(
"GasMAPos");
2114 GeoTransform *xGasMAPos =
new GeoTransform(GeoTrf::RotateY3D(
M_PI)*GeoTrf::TranslateZ3D(-posA));
2115 GeoNameTag *nGasMANeg =
new GeoNameTag(
"GasMANeg");
2116 GeoTransform *xGasMANeg =
new GeoTransform(GeoTrf::TranslateZ3D(-posA));
2117 GeoPhysVol *pGasMA =
new GeoPhysVol(lGasMA);
2120 GeoSerialIdentifier *
id =
new GeoSerialIdentifier(0);
2121 pStrawMixed->add(
id);
2122 pStrawMixed->add(nGasMANeg);
2123 pStrawMixed->add(xGasMANeg);
2124 pStrawMixed->add(pGasMA);
2125 pStrawMixed->add(nGasMAPos);
2126 pStrawMixed->add(xGasMAPos);
2127 pStrawMixed->add(pGasMA);
2130 GeoSerialDenominator *nDeadMA =
new GeoSerialDenominator(
"DeadRegionL");
2131 GeoTransform *xDeadPosMA =
new GeoTransform(GeoTrf::TranslateZ3D(+(
m_data->barrelLengthOfStraw-
m_data->lengthOfDeadRegion)/2.0));
2132 GeoTransform *xDeadNegMA =
new GeoTransform(GeoTrf::TranslateZ3D(-(
m_data->barrelLengthOfStraw-
m_data->lengthOfDeadRegion)/2.0));
2135 pStrawMixed->add(nDeadMA);
2136 pStrawMixed->add(xDeadPosMA);
2137 pStrawMixed->add(pDeadRegion);
2138 pStrawMixed->add(xDeadNegMA);
2139 pStrawMixed->add(pDeadRegion);
2142 GeoSerialDenominator *nInnerDeadMA =
new GeoSerialDenominator(
"InnerDeadRegionL");
2143 GeoTransform *xInnerDeadPosMA =
new GeoTransform(GeoTrf::TranslateZ3D(+posInnerDeadRegion));
2144 GeoTransform *xInnerDeadNegMA =
new GeoTransform(GeoTrf::TranslateZ3D(-posInnerDeadRegion));
2146 pStrawMixed->add(nInnerDeadMA);
2147 pStrawMixed->add(xInnerDeadPosMA);
2148 pStrawMixed->add(pInnerDeadRegion);
2149 pStrawMixed->add(xInnerDeadNegMA);
2150 pStrawMixed->add(pInnerDeadRegion);
2153 GeoNameTag *nTwister =
new GeoNameTag(
"TwisterM");
2154 pStrawMixed->add(nTwister);
2155 pStrawMixed->add(pTwister);
2158 GeoNameTag *nWire =
new GeoNameTag(
"WireM");
2159 pStrawMixed->add(nWire);
2160 pStrawMixed->add(pWire);
2162 pHole->add(pStrawMixed);
2185 const size_t firstIndexOfC = 14;
2187 unsigned iplane = 0;
2195 if (
w>=firstIndexOfC) {
2199 nstraws=
m_data->endcapNumberOfStrawsInStrawLayer_CWheels;
2205 nstraws=
m_data->endcapNumberOfStrawsInStrawLayer_AWheels;
2209 double MultiplierForStrawLength = 0.999;
2211 double ldead =
m_data->lengthOfDeadRegion;
2212 double r0 =
m_data->outerRadiusOfWire;
2213 double r1 =
m_data->innerRadiusOfStraw;
2214 double r2 =
m_data->outerRadiusOfStraw;
2217 if (
w >= firstIndexOfC) {
2219 R0 =
m_data->endcapOuterRadiusOfInnerSupport_wheelC;
2220 R1 =
m_data->endcapInnerRadiusOfOuterSupport_wheelC;
2223 R0 =
m_data->endcapOuterRadiusOfInnerSupport_wheelAB;
2224 R1 =
m_data->endcapInnerRadiusOfOuterSupport_wheelAB;
2227 double Length = (R1-R0)*MultiplierForStrawLength;
2228 double pos = 0.5*(R0+R1);
2231 GeoFullPhysVol *pStrawPlane=
nullptr;
2232 GeoTube *sStrawPlane =
new GeoTube(R0,R1,r2);
2233 GeoLogVol *lStrawPlane =
new GeoLogVol(
"StrawPlane", sStrawPlane,
m_materialManager->getMaterial(
"trt::CO2"));
2234 pStrawPlane =
new GeoFullPhysVol(lStrawPlane);
2237 GeoTube *sStraw =
new GeoTube( 0, r2, Length/2.0);
2238 GeoLogVol *lStraw =
new GeoLogVol(
"Straw",sStraw,
m_materialManager->getMaterial(
"trt::Straw"));
2239 GeoPhysVol *pStraw =
new GeoPhysVol(lStraw);
2242 double dphi = 2*
M_PI/ nstraws;
2243 GeoTrf::RotateZ3D Rz(1.0);
2244 GeoTrf::TranslateX3D Tx(1.0);
2245 GeoTrf::TranslateY3D Ty(1.0);
2250 GeoSerialTransformer *serialTransformer=
new GeoSerialTransformer(pStraw, &
tx, nstraws);
2251 pStrawPlane->add(
new GeoSerialIdentifier(0));
2252 pStrawPlane->add(serialTransformer);
2255 if (
w<firstIndexOfC) {
2265 GeoTube *sGas =
new GeoTube (
r0,r1,(Length-2*ldead)/2);
2266 GeoLogVol *lGas =
nullptr;
2268 lGas =
new GeoLogVol(
"Gas_Ar", sGas,
m_materialManager->getMaterial(
"trt::ArCO2O2"));
2270 lGas =
new GeoLogVol(
"Gas_Kr", sGas,
m_materialManager->getMaterial(
"trt::KrCO2O2"));
2273 GeoPhysVol *pGas =
new GeoPhysVol(lGas);
2277 GeoTube *sDeadRegion =
new GeoTube(
r0,r1,ldead/2);
2278 GeoLogVol *lDeadRegion =
nullptr;
2280 lDeadRegion =
new GeoLogVol(
"DeadRegion_Ar",sDeadRegion,
m_materialManager->getMaterial(
"trt::ArCO2O2"));
2282 lDeadRegion =
new GeoLogVol(
"DeadRegion_Kr",sDeadRegion,
m_materialManager->getMaterial(
"trt::KrCO2O2"));
2285 GeoPhysVol *pDeadRegion =
new GeoPhysVol(lDeadRegion);
2287 GeoTransform *xDeadPos =
new GeoTransform(GeoTrf::TranslateZ3D(+(Length/2-ldead/2)));
2288 GeoTransform *xDeadNeg =
new GeoTransform(GeoTrf::TranslateZ3D(-(Length/2-ldead/2)));
2289 pStraw->add(xDeadPos);
2290 pStraw->add(pDeadRegion);
2291 pStraw->add(xDeadNeg);
2292 pStraw->add(pDeadRegion);
2296 GeoTube *sWire =
new GeoTube( 0,
r0, Length/2);
2297 GeoLogVol *lWire =
new GeoLogVol(
"Wire", sWire,
m_materialManager->getMaterial(
"trt::Wire"));
2298 GeoPhysVol *pWire =
new GeoPhysVol(lWire);
2301 if (
w>=firstIndexOfC) {
2329 throw std::runtime_error(
"Unexpected StatusHT value");