25 #include "GeoModelKernel/GeoTube.h"
26 #include "GeoModelKernel/GeoTrd.h"
27 #include "GeoModelKernel/GeoLogVol.h"
28 #include "GeoModelKernel/GeoNameTag.h"
29 #include "GeoModelKernel/GeoPhysVol.h"
30 #include "GeoModelKernel/GeoFullPhysVol.h"
31 #include "GeoModelKernel/GeoTransform.h"
32 #include "GeoModelKernel/GeoAlignableTransform.h"
33 #include "GeoModelKernel/GeoSerialDenominator.h"
34 #include "GeoModelKernel/GeoSerialTransformer.h"
35 #include "GeoModelKernel/GeoShapeShift.h"
36 #include "GeoModelKernel/GeoShapeUnion.h"
37 #include "GeoModelKernel/GeoIdentifierTag.h"
38 #include "GeoModelKernel/GeoSerialIdentifier.h"
39 #include "GeoModelKernel/GeoMaterial.h"
40 #include "GeoModelKernel/GeoDefinitions.h"
41 #include "GeoModelKernel/Units.h"
43 #include "GeoGenericFunctions/AbsFunction.h"
44 #include "GeoGenericFunctions/Variable.h"
45 #include "GeoGenericFunctions/Sin.h"
46 #include "GeoGenericFunctions/Cos.h"
58 using namespace GeoXF;
65 double xx = vector.x();
66 double yy = vector.y();
67 vector.x() =
c*
xx - s1*
yy;
68 vector.y() = s1*
xx +
c*
yy;
73 double ptot2 =
a.mag2()*
b.mag2();
74 return ptot2 <= 0.0 ? 0.0 : std::acos(
a.dot(
b)/std::sqrt(ptot2));
79 return std::sqrt(vector.x()*vector.x() + vector.y()*vector.y());
85 std::unique_ptr<const TRTStrawStatusAccessor> statusAccessor,
86 bool useOldActiveGasMixture,
87 bool DC2CompatibleBarrelCoordinates,
91 bool useDynamicAlignmentFolders)
92 :
InDetDD::DetectorFactoryBase(athenaComps),
93 m_statusAccessor(std::move(statusAccessor)),
95 m_useOldActiveGasMixture(useOldActiveGasMixture),
96 m_DC2CompatibleBarrelCoordinates(DC2CompatibleBarrelCoordinates),
97 m_alignable(alignable),
98 m_strawsvcavailable(0),
100 m_doKrypton(doKrypton),
101 m_useDynamicAlignFolders(useDynamicAlignmentFolders)
136 std::ofstream strawStatusFile;
138 strawStatusFile.open(
"StrawStatus.txt");
143 ATH_MSG_DEBUG(
" Getting primary numbers from the Detector Description Database " );
145 m_data.reset(parameterInterface);
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");
166 const TRT_ID *idHelper =
nullptr;
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;
195 versionMajorNumber = 3;
196 versionName =
"Rome";
200 if (
m_data->isCosmicRun) {
209 if (!
m_data->oldConfiguration) {
210 versionName =
m_data->versionName;
213 versionMajorNumber = 4;
214 versionMinorNumber = 1;
215 versionPatchNumber = 1;
230 ATH_MSG_INFO(
"In TRT Detector Factory (For DC2 and later geometries)" );
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";
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";
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);
262 if (
m_data->oldConfiguration) {
263 if (
m_data->isCosmicRun) {
264 endcapABPlusPresent =
false;
265 endcapABMinusPresent =
false;
266 endcapCPlusPresent =
false;
267 endcapCMinusPresent =
false;
269 if (
m_data->initialLayout) {
270 endcapCPlusPresent =
false;
271 endcapCMinusPresent =
false;
283 const int AlignmentLevelSubWheel = 1;
284 const int AlignmentLevelModule = 2;
285 const int AlignmentLevelTop = 3;
299 if (endcapABPlusPresent) {
302 if (endcapABMinusPresent) {
320 if (endcapABPlusPresent) {
323 if (endcapABMinusPresent) {
339 for (
unsigned int m=0;
m<
m_data->nBarrelRings;
m++) {
347 unsigned int nEndcapWheels = 0;
348 if (endcapABPlusPresent||endcapABMinusPresent) nEndcapWheels +=
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels;
349 if (endcapCPlusPresent||endcapCMinusPresent) nEndcapWheels +=
m_data->endcapNumberOfCWheels;
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;
361 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelC;
369 GeoFullPhysVol *pBarrelVol =
nullptr;
370 GeoFullPhysVol *pEndCapABPlus =
nullptr;
371 GeoFullPhysVol *pEndCapCPlus =
nullptr;
372 GeoFullPhysVol *pEndCapABMinus =
nullptr;
373 GeoFullPhysVol *pEndCapCMinus =
nullptr;
382 GeoTube* sBarrelVol =
new GeoTube(
m_data->virtualBarrelInnerRadius,
383 m_data->virtualBarrelOuterRadius,
384 m_data->virtualBarrelVolumeLength );
387 GeoLogVol *lBarrelVol =
new GeoLogVol(
"TRTBarrel", sBarrelVol,
m_materialManager->getMaterial(
"trt::CO2"));
388 pBarrelVol =
new GeoFullPhysVol(lBarrelVol);
390 ATH_MSG_DEBUG(
"Virtual TRT Barrel volume defined by RMin = "<<
m_data->virtualBarrelInnerRadius
391 <<
", Rmax = "<<
m_data->virtualBarrelOuterRadius<<
" Zmax = "<<
m_data->virtualBarrelVolumeLength );
396 GeoAlignableTransform * barrelTransform =
397 new GeoAlignableTransform(trtTransform *
m_data->partTransform(barrelLabel));
399 world->add(topLevelNameTag);
400 world->add(barrelTransform);
401 world->add(pBarrelVol);
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));
420 lEndCapVolumeAB =
new GeoLogVol(
"TRTEndcapWheelAB", &sEndCapVolumeAB,
m_materialManager->getMaterial(
"trt::CO2"));
423 if (endcapABPlusPresent) {
424 pEndCapABPlus =
new GeoFullPhysVol(lEndCapVolumeAB);
427 new GeoAlignableTransform(trtTransform *
m_data->partTransform(endcapA_WheelAB_Label));
429 world->add(topLevelNameTag);
431 world->add(
new GeoIdentifierTag(0));
432 world->add(pEndCapABPlus);
438 if (endcapABMinusPresent) {
439 pEndCapABMinus =
new GeoFullPhysVol(lEndCapVolumeAB);
444 world->add(topLevelNameTag);
446 world->add(
new GeoIdentifierTag(1));
447 world->add(pEndCapABMinus);
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));
464 lEndCapVolumeC =
new GeoLogVol(
"TRTEndcapWheelC", &sEndCapVolumeC,
m_materialManager->getMaterial(
"trt::CO2"));
467 if (endcapCPlusPresent) {
468 pEndCapCPlus =
new GeoFullPhysVol(lEndCapVolumeC);
471 new GeoAlignableTransform(trtTransform *
m_data->partTransform(endcapA_WheelC_Label));
473 world->add(topLevelNameTag);
475 world->add(
new GeoIdentifierTag(0));
476 world->add(pEndCapCPlus);
480 if (endcapCMinusPresent) {
481 pEndCapCMinus =
new GeoFullPhysVol(lEndCapVolumeC);
486 world->add(topLevelNameTag);
488 world->add(
new GeoIdentifierTag(0));
489 world->add(pEndCapCMinus);
494 GeoFullPhysVol *pCommonEndcapAB[2];
495 GeoFullPhysVol *pCommonEndcapC[2];
497 pCommonEndcapAB[0] = pEndCapABPlus;
498 pCommonEndcapAB[1] = pEndCapABMinus;
499 pCommonEndcapC[0] = pEndCapCPlus;
500 pCommonEndcapC[1] = pEndCapCMinus;
510 xMat.
add(pBarrelVol,
"TRTBarrel");
514 xMat.
add(pEndCapABPlus,
"TRTEndcap");
515 xMat.
add(pEndCapABPlus,
"TRTEndcapA");
517 if (pEndCapABMinus) {
519 xMat.
add(pEndCapABMinus,
"TRTEndcap");
520 xMat.
add(pEndCapABMinus,
"TRTEndcapC");
526 xMat.
add(pEndCapCPlus,
"TRTEndcap_WheelC");
527 xMat.
add(pEndCapCPlus,
"TRTEndcapA_WheelC");
531 xMat.
add(pEndCapCMinus,
"TRTEndcap_WheelC");
532 xMat.
add(pEndCapCMinus,
"TRTEndcapC_WheelC");
551 GeoTube *sBarrelInnerSupport =
new GeoTube(
m_data->innerRadiusOfBarrelVolume,
552 m_data->innerRadiusOfBarrelVolume +
m_data->thicknessOfBarrelInnerSupport,
553 m_data->lengthOfBarrelVolume/2);
556 GeoLogVol *lBarrelInnerSupport =
new GeoLogVol(
"BarrelInnerSupport", sBarrelInnerSupport,
562 GeoPhysVol *pBarrelInnerSupport =
new GeoPhysVol(lBarrelInnerSupport);
563 pBarrelVol->add(pBarrelInnerSupport);
566 GeoTube *sBarrelOuterSupport =
new GeoTube(
m_data->outerRadiusOfBarrelVolume -
m_data->thicknessOfBarrelOuterSupport,
567 m_data->outerRadiusOfBarrelVolume,
m_data->lengthOfBarrelVolume/2);
569 GeoLogVol *lBarrelOuterSupport =
new GeoLogVol(
"BarrelOuterSupport", sBarrelOuterSupport,
575 GeoPhysVol *pBarrelOuterSupport =
new GeoPhysVol(lBarrelOuterSupport);
576 pBarrelVol->add(pBarrelOuterSupport);
580 if (
m_data->includeBarServiceAndFlange) {
589 GeoTube *sEndFlangeRegion =
new GeoTube(
m_data->barFlangeRMin,
m_data->barFlangeRMax,
591 GeoLogVol *lEndFlangeRegion =
new GeoLogVol(
"EndFlangeRegion", sEndFlangeRegion,
594 GeoPhysVol *pEndFlangeRegion =
new GeoPhysVol(lEndFlangeRegion);
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));
600 pBarrelVol->add(xfEndFlangeRegionPlus);
601 pBarrelVol->add(pEndFlangeRegion);
602 pBarrelVol->add(xfEndFlangeRegionMinus);
603 pBarrelVol->add(pEndFlangeRegion);
612 GeoTube *sServices =
new GeoTube(
m_data->barServicesRMin,
m_data->barServicesRMax,
614 GeoLogVol *lServices =
new GeoLogVol(
"Services", sServices,
617 GeoPhysVol *pServices =
new GeoPhysVol(lServices);
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));
623 pBarrelVol->add(xfServicesPlus);
624 pBarrelVol->add(pServices);
625 pBarrelVol->add(xfServicesMinus);
626 pBarrelVol->add(pServices);
638 std::vector<InDetDD::TRT_BarrelDescriptor *> bDescriptor;
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);
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);
651 pCoolingTube->add(pCoolingFluid);
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;
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;
662 for (
size_t iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
666 GeoLogVol *lRad =
nullptr;
667 GeoLogVol *lShell =
nullptr;
670 std::ostringstream shellstream;
671 shellstream <<
"Shell" << iABC;
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);
685 std::ostringstream layerstr;
688 std::string shellMatName =
"trt::ModuleShell"+layerstr.str();
689 std::string shellName =
"ModuleShell"+layerstr.str();
693 lShell =
new GeoLogVol(shellName, sShell, shellMat);
701 shellCorner1,shellCorner2,shellCorner3,shellCorner4,
702 radAbsolutePosition,
m_data->barrelThicknessOfModuleWalls);
705 std::string radMatName =
"trt::FibreRadiator"+layerstr.str();
706 std::string radName =
"FibreRadiator"+layerstr.str();
711 lRad =
new GeoLogVol(radName, sRad, radMat);
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));
724 size_t nStrawsWithLargeDeadRegion = 0;
726 for (
size_t iLayer = 0; iLayer<
m_data->barrelNumberOfLayersWithLargeDeadRegion; iLayer++) {
727 nStrawsWithLargeDeadRegion +=
m_data->barrelNumberOfStrawsInStrawLayer[iABC][iLayer];
732 GeoTrf::TranslateX3D Xx(1.0);
733 GeoTrf::TranslateY3D Xy(1.0);
735 GENFUNCTION fx =
ArrayFunction(&
m_data->strawXPosition[iABC][0+nStrawsWithLargeDeadRegion],
736 &
m_data->strawXPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
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);
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);
751 TRANSFUNCTION tx1All = Pow(Xx,fxAll)*Pow(Xy,fyAll);
763 m_data->strawYPosition[iABC][
m_data->barrelIndexOfSecondGlobalAlignmentStraw[iABC]],0);
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();
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());
783 TRANSFUNCTION tx2=shellPosition.inverse()*absStrawXForm*tx1;
784 TRANSFUNCTION tx2Dead=shellPosition.inverse()*absStrawXForm*tx1Dead;
785 TRANSFUNCTION tx2All=shellPosition.inverse()*absStrawXForm*tx1All;
797 while (c< m_data->barrelNumberOfStrawsInModule[iABC] ) {
820 if((iABC==0)&&(iLayer<=m_data->barrelNumberOfLayersWithLargeDeadRegion )) {
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);
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);
837 bDescriptor.back()->addStraw(
z,
x);
846 pBarrelVol->add(
new GeoSerialIdentifier(0));
847 for (
size_t iMod = 0; iMod<
m_data->nBarrelModulesUsed;iMod++) {
853 GeoFullPhysVol * pShell =
new GeoFullPhysVol(lShell);
857 GeoAlignableTransform * xfx1 =
new GeoAlignableTransform(GeoTrf::RotateZ3D(delta)*shellPosition);
858 pBarrelVol->add(xfx1);
859 pBarrelVol->add(pShell);
868 pShell->add(
new GeoIdentifierTag(iABC));
874 strawStatusFile << TRT_Identifier.get_compact() <<
std::format(
"{:5}",strawStatusHT) << std::endl;
885 pRad->add(pCoolingTube);
887 pRad->add(pCoolingTube);
888 pRad->add(
new GeoSerialIdentifier(0));
896 ATH_MSG_DEBUG(
"Marking Argon straws from /TRT/Cond/StatusHT:\t"
902 ATH_MSG_DEBUG(
"Marking Krypton straws from /TRT/Cond/StatusHT:\t"
908 ATH_MSG_DEBUG(
"Marking Xenon straws from /TRT/Cond/StatusHT:\t"
911 pHoleForMixedStrawWithLargeDeadRegion =
makeStraw(
true);
915 throw std::runtime_error(
"Unexpected gas mixture");
921 ,
m_data->barrelNumberOfStrawsInModule[iABC]-nStrawsWithLargeDeadRegion);
926 , nStrawsWithLargeDeadRegion);
927 pRad->add(serialTransformerDead);
929 pRad->add(serialTransformer);
944 for (
unsigned int iStrawLayer=0;iStrawLayer<nStrawLayers; iStrawLayer++) {
946 unsigned int jStrawLayer=iStrawLayer;
965 for (
unsigned int e=0;
e<2;
e++) {
966 for (
unsigned int iMod=0;iMod<
m_data->nBarrelModulesUsed; iMod++) {
968 for (
unsigned int iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
982 for (
unsigned int e=0;
e<2;
e++) {
983 for (
unsigned int iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
986 for (
unsigned int iMod=0;iMod<
m_data->nBarrelModulesUsed; iMod++) {
990 current->setPreviousInPhi(prev);
994 if (
m_data->nBarrelModulesUsed==
m_data->nBarrelModules) {
998 first->setPreviousInPhi(last);
1020 if (!(endcapABPlusPresent || endcapABMinusPresent || endcapCPlusPresent || endcapCMinusPresent)){
1023 unsigned int firstIndexOfA = 0;
1024 unsigned int firstIndexOfB =
m_data->endcapNumberOfAWheels;
1025 unsigned int firstIndexOfC =
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels;
1029 if (
m_data->initialLayout) indexUpperBound = firstIndexOfC;
1031 const unsigned int nSides = 2;
1032 const unsigned int nStrawLayMaxEc = 8;
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;
1042 double RotationsOfStrawPlanes[nStrawLayMaxEc];
1043 double shiftForEachRotation =
m_data->endCapShiftForEachRotation;
1044 RotationsOfStrawPlanes[0] = 0.;
1046 bool oldGeometry =
true;
1048 if (shiftForEachRotation < 0) oldGeometry =
false;
1054 RotationsOfStrawPlanes[
counter] = RotationsOfStrawPlanes[
counter-1] + shiftForEachRotation;
1055 if (RotationsOfStrawPlanes[
counter] >= 1.)
1056 RotationsOfStrawPlanes[
counter] -= 1.;
1060 double RotationsOfStrawPlanesTmp[nStrawLayMaxEc] = {0,0,0,0,2,2,2,2};
1063 RotationsOfStrawPlanes[
counter] = (
counter * shiftForEachRotation) + RotationsOfStrawPlanesTmp[
counter];
1068 std::vector<InDetDD::TRT_EndcapDescriptor*> descriptorsAB[nSides][nStrawLayMaxEc];
1069 std::vector<InDetDD::TRT_EndcapDescriptor*> descriptorsC[nSides][nStrawLayMaxEc];
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);
1083 if (endcapABPlusPresent || endcapABMinusPresent) {
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);
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);
1105 GeoIntrusivePtr<GeoFullPhysVol> pStrawPlaneA =
makeStrawPlane(firstIndexOfA);
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);
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);
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"));
1171 for(iiSide=0; iiSide<nSides; iiSide++) {
1173 if (pCommonEndcapAB[iiSide]) {
1175 double WheelPlacerA =
m_data->endCapPositionOfFirstWheelA[iiSide];
1177 for(iiWheel=firstIndexOfA; iiWheel < firstIndexOfB; iiWheel++)
1180 WheelPlacerA +=
m_data->endCapDistanceBetweenWheelCentersA[iiSide][iiWheel] ;
1182 GeoFullPhysVol* pWheelA =
new GeoFullPhysVol(lWheelA);
1184 GeoAlignableTransform * xfAlignableModule =
nullptr;
1187 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelA; iiPlane++)
1196 if (iiPlane % 4 == 0) {
1198 int barrel_ec = (iiSide) ? -2 : +2;
1199 xfAlignableModule =
new GeoAlignableTransform(GeoTrf::Transform3D::Identity());
1207 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsA;
1210 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
1211 phiPlane += deltaPhiForStrawsA;
1214 int bar_ec = (iiSide) ? -2 : +2;
1220 strawStatusFile << TRT_Identifier.get_compact() <<
std::format(
"{:5}",strawStatusHT) << std::endl;
1233 ATH_MSG_DEBUG(
"Marking Argon straws from /TRT/Cond/StatusHT:\t"
1235 childPlane = pStrawPlaneA_Ar->clone();
1238 ATH_MSG_DEBUG(
"Marking Krypton straws from /TRT/Cond/StatusHT:\t"
1240 childPlane = pStrawPlaneA_Kr->clone();
1243 ATH_MSG_DEBUG(
"Marking Xenon straws from /TRT/Cond/StatusHT:\t"
1245 childPlane = pStrawPlaneA->clone();
1249 throw std::runtime_error(
"Unexpected gas mixture");
1254 xfPlane =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionA[iiPlane] -
m_data->endCapLengthOfWheelsA/2)*GeoTrf::RotateZ3D(phiPlane));
1256 if (xfAlignableModule) pWheelA->add(xfAlignableModule);
1257 pWheelA->add(xfPlane);
1258 pWheelA->add(
new GeoIdentifierTag(iiPlane));
1259 pWheelA->add(childPlane);
1263 if(iiWheel==firstIndexOfA && iiPlane < nStrawLayMaxEc)
1264 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1270 pDescriptor->
nStraws() =
m_data->endcapNumberOfStrawsInStrawLayer_AWheels/
m_data->nEndcapPhi;
1271 pDescriptor->
strawPitch() = deltaPhiForStrawsA;
1273 double startPhi = phiPlane + iiPhi * pDescriptor->
strawPitch() * pDescriptor->
nStraws();
1287 pDescriptor->
startPhi() = startPhi;
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;
1295 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi] = pDescriptor;
1298 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1304 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
1306 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
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);
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);
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);
1342 pWheelA->add(pInnerSupportA);
1343 pWheelA->add(pOuterSupportA);
1346 GeoAlignableTransform * xfWheel =
new GeoAlignableTransform( GeoTrf::TranslateZ3D(WheelPlacerA) );
1348 pCommonEndcapAB[iiSide]->add(xfWheel);
1349 pCommonEndcapAB[iiSide]->add(
new GeoIdentifierTag(iiWheel));
1350 pCommonEndcapAB[iiSide]->add(pWheelA);
1353 int barrel_ec = (iiSide) ? -2 : +2;
1357 if (
m_data->includeECFoilHeatExchangerAndMembranes) {
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)};
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)};
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)};
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)};
1386 if(iiWheel<=firstIndexOfB-1)
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);
1402 if(iiWheel<firstIndexOfB-1)
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);
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);
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);
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);
1451 GeoFullPhysVol* pStrawPlaneB_Kr =
nullptr;
1452 GeoFullPhysVol* pStrawPlaneB_Ar =
nullptr;
1457 GeoIntrusivePtr<GeoFullPhysVol> pStrawPlaneB {
makeStrawPlane(firstIndexOfB)};
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);
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);
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);
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"));
1488 for(iiSide=0; iiSide<nSides; iiSide++) {
1490 double WheelPlacerB =
m_data->endCapPositionOfFirstWheelB[iiSide];
1493 if (pCommonEndcapAB[iiSide]) {
1494 for(iiWheel=firstIndexOfB; iiWheel < firstIndexOfC; iiWheel++)
1497 WheelPlacerB +=
m_data->endCapDistanceBetweenWheelCentersB[iiSide][iiWheel];
1499 GeoFullPhysVol* pWheelB =
new GeoFullPhysVol(lWheelB);
1501 GeoAlignableTransform * xfAlignableModule =
nullptr;
1504 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelB; iiPlane++)
1511 if (iiPlane % 4 == 0) {
1513 int barrel_ec = (iiSide) ? -2 : +2;
1514 xfAlignableModule =
new GeoAlignableTransform(GeoTrf::Transform3D::Identity());
1521 int bar_ec = (iiSide) ? -2 : +2;
1527 strawStatusFile << TRT_Identifier.get_compact() <<
std::format(
"{:5}",strawStatusHT) << std::endl;
1540 ATH_MSG_DEBUG(
"Marking Argon straws from /TRT/Cond/StatusHT:\t"
1542 childPlane = pStrawPlaneB_Ar->clone();
1545 ATH_MSG_DEBUG(
"Marking Krypton straws from /TRT/Cond/StatusHT:\t"
1547 childPlane = pStrawPlaneB_Kr->clone();
1550 ATH_MSG_DEBUG(
"Marking Xenon straws from /TRT/Cond/StatusHT:\t"
1552 childPlane = pStrawPlaneB->clone();
1556 throw std::runtime_error(
"Unexpected gas mixture");
1561 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsB;
1564 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
1565 phiPlane += deltaPhiForStrawsB;
1568 xfPlane =
new GeoTransform(GeoTrf::TranslateZ3D(
m_data->endCapLayerZPositionB[iiPlane]
1569 -
m_data->endCapLengthOfWheelsB/2)*GeoTrf::RotateZ3D(phiPlane));
1571 if (xfAlignableModule) pWheelB->add(xfAlignableModule);
1572 pWheelB->add(xfPlane);
1573 pWheelB->add(
new GeoIdentifierTag(iiPlane));
1574 pWheelB->add(childPlane);
1577 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1583 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
1585 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
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);
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);
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);
1628 pWheelB->add(pInnerSupportB);
1629 pWheelB->add(pOuterSupportB);
1632 GeoAlignableTransform * xfWheel =
new GeoAlignableTransform(GeoTrf::TranslateZ3D( WheelPlacerB ));
1635 pCommonEndcapAB[iiSide]->add(xfWheel);
1636 pCommonEndcapAB[iiSide]->add(
new GeoIdentifierTag(iiWheel));
1637 pCommonEndcapAB[iiSide]->add(pWheelB);
1640 int barrel_ec = (iiSide) ? -2 : +2;
1645 if (
m_data->includeECFoilHeatExchangerAndMembranes) {
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)};
1657 GeoTube* sHeatExchangerB =
new GeoTube(
m_data->endCapRMinOfHeatExchanger,
m_data->endCapRMaxOfHeatExchanger,
m_data->endCapHeatExchangerThicknessB/2);
1659 GeoLogVol* lHeatExchangerB =
new GeoLogVol(
"HeatExchangerB", sHeatExchangerB,
m_materialManager->getMaterial(
"trt::HeatExchangerBMat"));
1660 GeoIntrusivePtr<GeoPhysVol> pHeatExchangerB{
new GeoPhysVol(lHeatExchangerB)};
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)};
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)};
1676 if(iiWheel-firstIndexOfB<firstIndexOfC-firstIndexOfB)
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));
1685 pCommonEndcapAB[iiSide]->add(xfFaradayFoilFront);
1686 pCommonEndcapAB[iiSide]->add(pFaradayFoilWheelAB);
1687 pCommonEndcapAB[iiSide]->add(xfFaradayFoilBack);
1688 pCommonEndcapAB[iiSide]->add(pFaradayFoilWheelAB);
1693 if(iiWheel-firstIndexOfB<firstIndexOfC-firstIndexOfB-1)
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);
1702 xfInnerSupportGapperB =
new GeoTransform(GeoTrf::TranslateZ3D(WheelPlacerB
1703 +
m_data->endCapLengthOfWheelsB/2
1704 +
m_data->endCapFaradayFoilThickness
1705 +
m_data->endCapHeatExchangerThicknessB/2));
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);
1725 strawStatusFile.close();
1728 if (
m_data->includeECFoilHeatExchangerAndMembranes) {
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);
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));
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);
1756 if (endcapCPlusPresent || endcapCMinusPresent) {
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);
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);
1769 GeoIntrusivePtr<GeoFullPhysVol> pStrawPlaneC =
makeStrawPlane(firstIndexOfC);
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);
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);
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"));
1791 for(iiSide=0; iiSide<nSides; iiSide++) {
1793 if (pCommonEndcapC[iiSide]) {
1794 for(iiWheel=firstIndexOfC; iiWheel < indexUpperBound; iiWheel++)
1796 GeoFullPhysVol* pWheelC =
new GeoFullPhysVol(lWheelC);
1799 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelC; iiPlane++)
1802 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsC;
1805 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
1806 phiPlane += deltaPhiForStrawsC;
1810 childPlane = pStrawPlaneC->clone();
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);
1820 if(iiWheel==firstIndexOfC && iiPlane < nStrawLayMaxEc)
1821 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1826 pDescriptor->
nStraws() =
m_data->endcapNumberOfStrawsInStrawLayer_CWheels/
m_data->nEndcapPhi;
1827 pDescriptor->
strawPitch() = deltaPhiForStrawsC;
1830 double startPhi = phiPlane + iiPhi * pDescriptor->
strawPitch() * pDescriptor->
nStraws();
1843 pDescriptor->
startPhi() = startPhi;
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;
1851 descriptorsC[iiSide][iiPlane%nStrawLayMaxEc][iiPhi] = pDescriptor;
1855 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1861 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
1863 descriptorsC[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
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);
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);
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);
1901 pWheelC->add(pInnerSupportC);
1902 pWheelC->add(pOuterSupportC);
1905 GeoAlignableTransform * xfWheel
1906 =
new GeoAlignableTransform(GeoTrf::TranslateZ3D(
m_data->endCapPositionOfFirstWheelC
1907 + (iiWheel - firstIndexOfC)*
m_data->endCapDistanceBetweenWheelCentersC));
1909 pCommonEndcapC[iiSide]->add(xfWheel);
1910 pCommonEndcapC[iiSide]->add(
new GeoIdentifierTag(iiWheel));
1911 pCommonEndcapC[iiSide]->add(pWheelC);
1914 int barrel_ec = (iiSide) ? -2 : +2;
1927 for (iiSide=0; iiSide<2; iiSide++)
1928 for(iiPhi=0; iiPhi<
m_data->nEndcapPhi; iiPhi++)
1931 for (iiWheel=0; iiWheel<indexUpperBound; iiWheel++)
1938 current->setPreviousInZ(prev);
1987 double openingAngleOfFirstCorner=
angle(delta12,delta14);
1995 double commonSide = (
magn(delta14) +
magn(delta23) + (
sign==1?
magn(delta24):
magn(delta13)) ) / 3.;
1996 double base1 =
magn(delta12);
1997 double base2 =
magn(delta34);
1999 if (shrinkDist!=0) {
2001 double cosAlpha= sqrt(commonSide*commonSide-0.25*base1*base1)/commonSide;
2002 commonSide -= (1+1/cosAlpha)*shrinkDist;
2003 base1 -= 2*shrinkDist;
2004 base2 -= 2*shrinkDist;
2007 double height1 = sqrt (commonSide*commonSide-0.25*base1*base1);
2008 double height2 = sqrt (commonSide*commonSide-0.25*base2*base2);
2009 double rot =
atan(base2/height2/2)-
atan(base1/height1/2);
2011 GeoTrd *trd1 =
new GeoTrd(base1/2+epsilon, epsilon,
length/2,
length/2, height1/2);
2012 GeoTrd *trd2 =
new GeoTrd(epsilon, base2/2+epsilon,
length/2,
length/2, height2/2);
2014 double gamma =
atan((base2/2+epsilon)*2/height2);
2015 double r = sqrt((base2/2+epsilon)*(base2/2+epsilon) + height2*height2/4);
2017 const GeoShape & sShell = (*trd1).add((*trd2)<<xForm);
2024 GeoTrf::Vector2D actualCorner1, actualCorner2, actualCorner3, actualCorner4;
2025 actualCorner1 = corner1;
2041 rotate(modRot,actualCorner1);
2042 rotate(modRot,actualCorner2);
2043 rotate(modRot,actualCorner3);
2044 rotate(modRot,actualCorner4);
2049 GeoTrf::Vector2D displacement = 0.25*( (corner1+corner2+corner3+corner4) - (actualCorner1+actualCorner2+actualCorner3+actualCorner4) );
2055 center += displacement;
2056 actualCorner1 += displacement;
2057 actualCorner2 += displacement;
2058 actualCorner3 += displacement;
2059 actualCorner4 += displacement;
2082 double lengthOfInnerDeadRegion= hasLargeDeadRegion ?
m_data->barrelLengthOfLargeDeadRegion :
m_data->lengthOfDeadRegion ;
2083 double lengthOfActiveGas = (
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 -
m_data->lengthOfDeadRegion - lengthOfInnerDeadRegion;
2084 double posA = (lengthOfActiveGas +
m_data->barrelLengthOfTwister) / 2. + lengthOfInnerDeadRegion;
2085 double posInnerDeadRegion = (
m_data->barrelLengthOfTwister + lengthOfInnerDeadRegion ) / 2;
2088 GeoTube *sHole =
new GeoTube(0,
m_data->barrelOuterRadiusOfStrawHole,
m_data->barrelLengthOfStraw/2.0);
2089 GeoLogVol *lHole =
new GeoLogVol(
"Hole", sHole,
m_materialManager->getMaterial(
"trt::CO2"));
2090 GeoPhysVol *pHole =
new GeoPhysVol(lHole);
2093 GeoTube *sStraw =
new GeoTube(0,
m_data->outerRadiusOfStraw,
m_data->barrelLengthOfStraw/2.0);
2094 GeoLogVol *lStrawMixed =
new GeoLogVol(
"StrawM", sStraw,
m_materialManager->getMaterial(
"trt::Straw"));
2095 GeoPhysVol *pStrawMixed =
new GeoPhysVol(lStrawMixed);
2098 GeoShape *sDeadRegion =
new GeoTube(
m_data->outerRadiusOfWire ,
m_data->innerRadiusOfStraw ,
m_data->lengthOfDeadRegion/2 );
2099 GeoLogVol *lDeadRegion =
nullptr;
2101 lDeadRegion =
new GeoLogVol(
"DeadRegion_Ar", sDeadRegion,
m_materialManager->getMaterial(
"trt::ArCO2O2"));
2103 lDeadRegion =
new GeoLogVol(
"DeadRegion_Kr", sDeadRegion,
m_materialManager->getMaterial(
"trt::KrCO2O2"));
2106 GeoPhysVol *pDeadRegion =
new GeoPhysVol(lDeadRegion);
2109 GeoShape * sInnerDeadRegion =
new GeoTube(
m_data->outerRadiusOfWire ,
m_data->innerRadiusOfStraw, lengthOfInnerDeadRegion/2 );
2110 GeoLogVol * lInnerDeadRegion =
nullptr;
2112 lInnerDeadRegion =
new GeoLogVol(
"InnerDeadRegion_Ar", sInnerDeadRegion,
m_materialManager->getMaterial(
"trt::ArCO2O2"));
2114 lInnerDeadRegion =
new GeoLogVol(
"InnerDeadRegion_Kr", sInnerDeadRegion,
m_materialManager->getMaterial(
"trt::KrCO2O2"));
2117 GeoPhysVol* pInnerDeadRegion =
new GeoPhysVol(lInnerDeadRegion);
2120 GeoShape *sTwister =
new GeoTube(
m_data->outerRadiusOfWire ,
m_data->innerRadiusOfStraw,
m_data->barrelLengthOfTwister/2);
2121 GeoLogVol *lTwister =
new GeoLogVol(
"Twister", sTwister,
m_materialManager->getMaterial(
"trt::Twister"));
2122 GeoPhysVol *pTwister =
new GeoPhysVol(lTwister);
2125 GeoShape *sWire =
new GeoTube( 0,
m_data->outerRadiusOfWire,
m_data->barrelLengthOfStraw/2.0);
2126 GeoLogVol *lWire =
new GeoLogVol(
"Wire", sWire,
m_materialManager->getMaterial(
"trt::Wire"));
2127 GeoPhysVol *pWire =
new GeoPhysVol(lWire);
2133 GeoTube *sGasMA =
new GeoTube(
m_data->outerRadiusOfWire ,
m_data->innerRadiusOfStraw,lengthOfActiveGas/2.0);
2134 GeoLogVol * lGasMA =
nullptr;
2136 lGasMA =
new GeoLogVol(
"GasMA_Ar", sGasMA,
m_materialManager->getMaterial(
"trt::ArCO2O2"));
2138 lGasMA =
new GeoLogVol(
"GasMA_Kr", sGasMA,
m_materialManager->getMaterial(
"trt::KrCO2O2"));
2141 GeoNameTag *nGasMAPos =
new GeoNameTag(
"GasMAPos");
2142 GeoTransform *xGasMAPos =
new GeoTransform(GeoTrf::RotateY3D(
M_PI)*GeoTrf::TranslateZ3D(-posA));
2143 GeoNameTag *nGasMANeg =
new GeoNameTag(
"GasMANeg");
2144 GeoTransform *xGasMANeg =
new GeoTransform(GeoTrf::TranslateZ3D(-posA));
2145 GeoPhysVol *pGasMA =
new GeoPhysVol(lGasMA);
2148 GeoSerialIdentifier *
id =
new GeoSerialIdentifier(0);
2149 pStrawMixed->add(
id);
2150 pStrawMixed->add(nGasMANeg);
2151 pStrawMixed->add(xGasMANeg);
2152 pStrawMixed->add(pGasMA);
2153 pStrawMixed->add(nGasMAPos);
2154 pStrawMixed->add(xGasMAPos);
2155 pStrawMixed->add(pGasMA);
2158 GeoSerialDenominator *nDeadMA =
new GeoSerialDenominator(
"DeadRegionL");
2159 GeoTransform *xDeadPosMA =
new GeoTransform(GeoTrf::TranslateZ3D(+(
m_data->barrelLengthOfStraw-
m_data->lengthOfDeadRegion)/2.0));
2160 GeoTransform *xDeadNegMA =
new GeoTransform(GeoTrf::TranslateZ3D(-(
m_data->barrelLengthOfStraw-
m_data->lengthOfDeadRegion)/2.0));
2163 pStrawMixed->add(nDeadMA);
2164 pStrawMixed->add(xDeadPosMA);
2165 pStrawMixed->add(pDeadRegion);
2166 pStrawMixed->add(xDeadNegMA);
2167 pStrawMixed->add(pDeadRegion);
2170 GeoSerialDenominator *nInnerDeadMA =
new GeoSerialDenominator(
"InnerDeadRegionL");
2171 GeoTransform *xInnerDeadPosMA =
new GeoTransform(GeoTrf::TranslateZ3D(+posInnerDeadRegion));
2172 GeoTransform *xInnerDeadNegMA =
new GeoTransform(GeoTrf::TranslateZ3D(-posInnerDeadRegion));
2174 pStrawMixed->add(nInnerDeadMA);
2175 pStrawMixed->add(xInnerDeadPosMA);
2176 pStrawMixed->add(pInnerDeadRegion);
2177 pStrawMixed->add(xInnerDeadNegMA);
2178 pStrawMixed->add(pInnerDeadRegion);
2181 GeoNameTag *nTwister =
new GeoNameTag(
"TwisterM");
2182 pStrawMixed->add(nTwister);
2183 pStrawMixed->add(pTwister);
2186 GeoNameTag *nWire =
new GeoNameTag(
"WireM");
2187 pStrawMixed->add(nWire);
2188 pStrawMixed->add(pWire);
2190 pHole->add(pStrawMixed);
2213 const size_t firstIndexOfC = 14;
2215 unsigned iplane = 0;
2223 if (
w>=firstIndexOfC) {
2227 nstraws=
m_data->endcapNumberOfStrawsInStrawLayer_CWheels;
2233 nstraws=
m_data->endcapNumberOfStrawsInStrawLayer_AWheels;
2237 double MultiplierForStrawLength = 0.999;
2239 double ldead =
m_data->lengthOfDeadRegion;
2240 double r0 =
m_data->outerRadiusOfWire;
2241 double r1 =
m_data->innerRadiusOfStraw;
2242 double r2 =
m_data->outerRadiusOfStraw;
2245 if (
w >= firstIndexOfC) {
2247 R0 =
m_data->endcapOuterRadiusOfInnerSupport_wheelC;
2248 R1 =
m_data->endcapInnerRadiusOfOuterSupport_wheelC;
2251 R0 =
m_data->endcapOuterRadiusOfInnerSupport_wheelAB;
2252 R1 =
m_data->endcapInnerRadiusOfOuterSupport_wheelAB;
2255 double Length = (R1-R0)*MultiplierForStrawLength;
2256 double pos = 0.5*(R0+R1);
2259 GeoFullPhysVol *pStrawPlane=
nullptr;
2260 GeoTube *sStrawPlane =
new GeoTube(R0,R1,r2);
2261 GeoLogVol *lStrawPlane =
new GeoLogVol(
"StrawPlane", sStrawPlane,
m_materialManager->getMaterial(
"trt::CO2"));
2262 pStrawPlane =
new GeoFullPhysVol(lStrawPlane);
2265 GeoTube *sStraw =
new GeoTube( 0, r2, Length/2.0);
2266 GeoLogVol *lStraw =
new GeoLogVol(
"Straw",sStraw,
m_materialManager->getMaterial(
"trt::Straw"));
2267 GeoPhysVol *pStraw =
new GeoPhysVol(lStraw);
2270 double dphi = 2*
M_PI/ nstraws;
2271 GeoTrf::RotateZ3D Rz(1.0);
2272 GeoTrf::TranslateX3D Tx(1.0);
2273 GeoTrf::TranslateY3D Ty(1.0);
2278 GeoSerialTransformer *serialTransformer=
new GeoSerialTransformer(pStraw, &
tx, nstraws);
2279 pStrawPlane->add(
new GeoSerialIdentifier(0));
2280 pStrawPlane->add(serialTransformer);
2283 if (
w<firstIndexOfC) {
2293 GeoTube *sGas =
new GeoTube (
r0,r1,(Length-2*ldead)/2);
2294 GeoLogVol *lGas =
nullptr;
2296 lGas =
new GeoLogVol(
"Gas_Ar", sGas,
m_materialManager->getMaterial(
"trt::ArCO2O2"));
2298 lGas =
new GeoLogVol(
"Gas_Kr", sGas,
m_materialManager->getMaterial(
"trt::KrCO2O2"));
2301 GeoPhysVol *pGas =
new GeoPhysVol(lGas);
2305 GeoTube *sDeadRegion =
new GeoTube(
r0,r1,ldead/2);
2306 GeoLogVol *lDeadRegion =
nullptr;
2308 lDeadRegion =
new GeoLogVol(
"DeadRegion_Ar",sDeadRegion,
m_materialManager->getMaterial(
"trt::ArCO2O2"));
2310 lDeadRegion =
new GeoLogVol(
"DeadRegion_Kr",sDeadRegion,
m_materialManager->getMaterial(
"trt::KrCO2O2"));
2313 GeoPhysVol *pDeadRegion =
new GeoPhysVol(lDeadRegion);
2315 GeoTransform *xDeadPos =
new GeoTransform(GeoTrf::TranslateZ3D(+(Length/2-ldead/2)));
2316 GeoTransform *xDeadNeg =
new GeoTransform(GeoTrf::TranslateZ3D(-(Length/2-ldead/2)));
2317 pStraw->add(xDeadPos);
2318 pStraw->add(pDeadRegion);
2319 pStraw->add(xDeadNeg);
2320 pStraw->add(pDeadRegion);
2324 GeoTube *sWire =
new GeoTube( 0,
r0, Length/2);
2325 GeoLogVol *lWire =
new GeoLogVol(
"Wire", sWire,
m_materialManager->getMaterial(
"trt::Wire"));
2326 GeoPhysVol *pWire =
new GeoPhysVol(lWire);
2329 if (
w>=firstIndexOfC) {
2357 throw std::runtime_error(
"Unexpected StatusHT value");