100 trtCO2->add(carbon,1);
101 trtCO2->add(oxygen,2);
106 trtO2->add(oxygen,1);
110 trtArgon->add(argon,1);
114 trtXenon->add(xenon,1);
118 argonGas->add(trtArgon,0.7);
119 argonGas->add(trtCO2,0.27);
120 argonGas->add(trtO2,0.03);
124 xenonGas->add(trtXenon,0.7);
125 xenonGas->add(trtCO2,0.27);
126 xenonGas->add(trtO2,0.03);
132 std::map<std::string, GeoFullPhysVol*> mapFPV =
m_sqliteReader->getPublishedNodes<std::string, GeoFullPhysVol*>(
"TRT");
133 std::map<std::string, GeoAlignableTransform*> mapAX =
m_sqliteReader->getPublishedNodes<std::string, GeoAlignableTransform*>(
"TRT");
136 GeoFullPhysVol *pBarrelVol = mapFPV[
"TRTBarrel"];
137 GeoFullPhysVol *pEndCapABPlus = mapFPV[
"TRTEndCapABPlus"];
138 GeoFullPhysVol *pEndCapCPlus = mapFPV[
"TRTEndCapCPlus"];
139 GeoFullPhysVol *pEndCapABMinus = mapFPV[
"TRTEndCapABMinus"];
140 GeoFullPhysVol *pEndCapCMinus = mapFPV[
"TRTEndCapCPlus"];;
149 ATH_MSG_DEBUG(
" Getting primary numbers from the Detector Description Database " );
151 m_data.reset(parameterInterface);
157 std::vector<GeoTrf::Transform3D> shellPosVec;
159 for (
size_t r=0;
r<trtShellPosVecRecordSet->size();
r++) {
160 const IRDBRecord * trtShellPosVecRecord = (*trtShellPosVecRecordSet)[
r];
162 double xy=trtShellPosVecRecord->
getDouble(
"xy");
163 double xz=trtShellPosVecRecord->
getDouble(
"xz");
165 double yx=trtShellPosVecRecord->
getDouble(
"yx");
167 double yz=trtShellPosVecRecord->
getDouble(
"yz");
169 double zx=trtShellPosVecRecord->
getDouble(
"zx");
170 double zy=trtShellPosVecRecord->
getDouble(
"zy");
171 double zz=trtShellPosVecRecord->
getDouble(
"zz");
175 double dz=trtShellPosVecRecord->
getDouble(
"dz");
177 M(0,0)=
xx; M(0,1)=xy; M(0,2)=xz; M(0,3)=
dx;
178 M(1,0)=yx; M(1,1)=
yy; M(1,2)=yz; M(1,3)=
dy;
179 M(2,0)=zx; M(2,1)=zy; M(2,2)=zz; M(2,3)=dz;
180 M(3,0)= 0; M(3,1)= 0; M(3,2)= 0; M(3,3)=1;
183 shellPosVec.push_back(
T);
187 const TRT_ID *idHelper =
nullptr;
203 std::string versionTag =
m_data->versionTag;
204 std::string versionName =
"DC2";
205 std::string
layout =
"Final";
207 int versionMajorNumber = 2;
208 int versionMinorNumber = 1;
209 int versionPatchNumber = 0;
216 versionMajorNumber = 3;
217 versionName =
"Rome";
221 if (
m_data->isCosmicRun) {
230 if (!
m_data->oldConfiguration) {
231 versionName =
m_data->versionName;
234 versionMajorNumber = 4;
235 versionMinorNumber = 1;
236 versionPatchNumber = 1;
260 const int AlignmentLevelSubWheel = 1;
261 const int AlignmentLevelModule = 2;
262 const int AlignmentLevelTop = 3;
279 if (pEndCapABMinus) {
300 if (pEndCapABMinus) {
316 for (
unsigned int m=0;
m<
m_data->nBarrelRings;
m++) {
324 unsigned int nEndcapWheels = 0;
325 if (pEndCapABPlus||pEndCapABMinus) nEndcapWheels +=
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels;
326 if (pEndCapCPlus||pEndCapCMinus) nEndcapWheels +=
m_data->endcapNumberOfCWheels;
332 unsigned int nlayers;
333 if ( w < m_data->endcapNumberOfAWheels )
334 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelA;
335 else if (
w < (
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels ) )
336 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelB;
338 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelC;
349 ATH_MSG_DEBUG(
"Virtual TRT Barrel volume defined by RMin = "<<
m_data->virtualBarrelInnerRadius
350 <<
", Rmax = "<<
m_data->virtualBarrelOuterRadius<<
" Zmax = "<<
m_data->virtualBarrelVolumeLength );
355 GeoAlignableTransform * barrelTransform = mapAX[
"TRTBarrel"];
366 GeoAlignableTransform *
transform = mapAX[
"TRTEndCapABPlus"];
373 if (pEndCapABMinus) {
375 GeoAlignableTransform *
transform = mapAX[
"TRTEndCapABMinus"];
389 GeoFullPhysVol *pCommonEndcapAB[]={pEndCapABPlus,pEndCapABMinus};
390 GeoFullPhysVol *pCommonEndcapC[]={pEndCapCPlus,pEndCapCMinus};
407 std::vector<InDetDD::TRT_BarrelDescriptor *> bDescriptor;
417 for (
size_t iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
425 size_t nStrawsWithLargeDeadRegion = 0;
427 for (
size_t iLayer = 0; iLayer<
m_data->barrelNumberOfLayersWithLargeDeadRegion; iLayer++) {
428 nStrawsWithLargeDeadRegion +=
m_data->barrelNumberOfStrawsInStrawLayer[iABC][iLayer];
433 GeoTrf::TranslateX3D Xx(1.0);
434 GeoTrf::TranslateY3D Xy(1.0);
436 GENFUNCTION fx =
ArrayFunction(&
m_data->strawXPosition[iABC][0+nStrawsWithLargeDeadRegion],
437 &
m_data->strawXPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
439 GENFUNCTION fy =
ArrayFunction(&
m_data->strawYPosition[iABC][0+nStrawsWithLargeDeadRegion],
440 &
m_data->strawYPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
441 TRANSFUNCTION tx1 = Pow(Xx,fx)*Pow(Xy,fy);
447 TRANSFUNCTION tx1All = Pow(Xx,fxAll)*Pow(Xy,fyAll);
459 m_data->strawYPosition[iABC][
m_data->barrelIndexOfSecondGlobalAlignmentStraw[iABC]],0);
465 GeoTrf::Vector2D local12((Align2Local - Align1Local).
x(),(Align2Local - Align1Local).
y());
466 GeoTrf::Vector2D global12((Align2Global - Align1Global).
x(),(Align2Global - Align1Global).
y());
467 double zrotang = global12.phi()-local12.phi();
471 GeoTrf::Transform3D absStrawXForm = GeoTrf::Translate3D(Align1Global.x(),Align1Global.y(),Align1Global.z())
472 *GeoTrf::RotateZ3D( zrotang )
473 *GeoTrf::Translate3D(-Align1Local.x(),-Align1Local.y(),-Align1Local.z());
479 TRANSFUNCTION tx2=shellPosition.inverse()*absStrawXForm*tx1;
480 TRANSFUNCTION tx2All=shellPosition.inverse()*absStrawXForm*tx1All;
493 while (c< m_data->barrelNumberOfStrawsInModule[iABC] ) {
516 if((iABC==0)&&(iLayer<=m_data->barrelNumberOfLayersWithLargeDeadRegion )) {
518 double lengthOfActiveGas=
519 (
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 -
m_data->lengthOfDeadRegion-
m_data->barrelLengthOfLargeDeadRegion;
520 double startZOfActiveGas=activeGasZPositionStrawsWithLargeDeadRegion-lengthOfActiveGas/2.0;
521 bDescriptor.back()->strawZPos(activeGasZPositionStrawsWithLargeDeadRegion);
522 bDescriptor.back()->strawZDead(startZOfActiveGas);
523 bDescriptor.back()->strawLength(lengthOfActiveGas);
525 double lengthOfActiveGas=(
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 - 2*
m_data->lengthOfDeadRegion;
526 double startZOfActiveGas=activeGasZPositionNormalStraws-lengthOfActiveGas/2.0;
527 bDescriptor.back()->strawZPos(activeGasZPositionNormalStraws);
528 bDescriptor.back()->strawZDead(startZOfActiveGas);
529 bDescriptor.back()->strawLength(lengthOfActiveGas);
533 bDescriptor.back()->addStraw(
z,
x);
540 std::set<const GeoVPhysVol *> barrelFibreRadiators;
541 std::set<const GeoVPhysVol *> strawPlanes;
544 for (
size_t iMod = 0; iMod<
m_data->nBarrelModulesUsed;iMod++) {
550 GeoVolumeCursor
cursor(pShell);
552 if (
cursor.getVolume()->getLogVol()->getName().find(
"FibreRadiator") != std::string::npos) {
553 barrelFibreRadiators.insert(
cursor.getVolume().get());
578 for (
unsigned int iStrawLayer=0;iStrawLayer<nStrawLayers; iStrawLayer++) {
580 unsigned int jStrawLayer=iStrawLayer;
599 for (
unsigned int e=0;
e<2;
e++) {
600 for (
unsigned int iMod=0;iMod<
m_data->nBarrelModulesUsed; iMod++) {
602 for (
unsigned int iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
616 for (
unsigned int e=0;
e<2;
e++) {
617 for (
unsigned int iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
620 for (
unsigned int iMod=0;iMod<
m_data->nBarrelModulesUsed; iMod++) {
624 current->setPreviousInPhi(prev);
628 if (
m_data->nBarrelModulesUsed==
m_data->nBarrelModules) {
632 first->setPreviousInPhi(last);
654 if (!(pEndCapABPlus || pEndCapABMinus || pEndCapCPlus || pEndCapCMinus)){
657 unsigned int firstIndexOfA = 0;
658 unsigned int firstIndexOfB =
m_data->endcapNumberOfAWheels;
659 unsigned int firstIndexOfC =
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels;
663 if (
m_data->initialLayout) indexUpperBound = firstIndexOfC;
665 const unsigned int nSides = 2;
666 const unsigned int nStrawLayMaxEc = 8;
668 unsigned int iiSide, iiWheel, iiPlane, iiPhi,
counter;
669 GeoFullPhysVol *childPlane =
nullptr;
672 double RotationsOfStrawPlanes[nStrawLayMaxEc];
673 double shiftForEachRotation =
m_data->endCapShiftForEachRotation;
674 RotationsOfStrawPlanes[0] = 0.;
676 bool oldGeometry =
true;
678 if (shiftForEachRotation < 0) oldGeometry =
false;
684 RotationsOfStrawPlanes[
counter] = RotationsOfStrawPlanes[
counter-1] + shiftForEachRotation;
685 if (RotationsOfStrawPlanes[
counter] >= 1.)
686 RotationsOfStrawPlanes[
counter] -= 1.;
690 double RotationsOfStrawPlanesTmp[nStrawLayMaxEc] = {0,0,0,0,2,2,2,2};
693 RotationsOfStrawPlanes[
counter] = (
counter * shiftForEachRotation) + RotationsOfStrawPlanesTmp[
counter];
698 std::vector<InDetDD::TRT_EndcapDescriptor*> descriptorsAB[nSides][nStrawLayMaxEc];
699 std::vector<InDetDD::TRT_EndcapDescriptor*> descriptorsC[nSides][nStrawLayMaxEc];
703 for(iiSide = 0; iiSide<nSides; iiSide++) {
704 for(iiPlane = 0; iiPlane < nStrawLayMaxEc; iiPlane++) {
705 descriptorsAB[iiSide][iiPlane].resize (
m_data->nEndcapPhi);
706 descriptorsC[iiSide][iiPlane].resize (
m_data->nEndcapPhi);
713 if (pEndCapABPlus || pEndCapABMinus) {
757 for(iiSide=0; iiSide<nSides; iiSide++) {
759 if (pCommonEndcapAB[iiSide]) {
761 for(iiWheel=firstIndexOfA; iiWheel < firstIndexOfB; iiWheel++)
765 GeoFullPhysVol* pWheelA = mapFPV[
"TRTWheelA-"
769 GeoAlignableTransform * xfAlignableModule =
nullptr;
772 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelA; iiPlane++)
778 if (iiPlane % 4 == 0) {
780 int barrel_ec = (iiSide) ? -2 : +2;
781 xfAlignableModule = mapAX[
"TRTWheelA-StrawPlane-"
793 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsA;
796 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
797 phiPlane += deltaPhiForStrawsA;
801 int bar_ec = (iiSide) ? -2 : +2;
802 TRT_Identifier = idHelper->
straw_id(bar_ec, 1, iiWheel, 1, 1);
807 childPlane = mapFPV[
"TRTWheelA-StrawPlane-"
816 if(iiWheel==firstIndexOfA && iiPlane < nStrawLayMaxEc)
817 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
823 pDescriptor->
nStraws() =
m_data->endcapNumberOfStrawsInStrawLayer_AWheels/
m_data->nEndcapPhi;
824 pDescriptor->
strawPitch() = deltaPhiForStrawsA;
826 double startPhi = phiPlane + iiPhi * pDescriptor->
strawPitch() * pDescriptor->
nStraws();
842 pDescriptor->
strawLength() =
m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA
843 - 2*
m_data->lengthOfDeadRegion -
m_data->endCapRadialThicknessOfInnerSupportA -
m_data->endCapInnerRadiusOfSupportA;
844 pDescriptor->
innerRadius() =
m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA
845 +
m_data->lengthOfDeadRegion;
848 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi] = pDescriptor;
851 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
857 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
859 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
872 GeoAlignableTransform * xfWheel = mapAX[
"TRTWheelA-"
877 int barrel_ec = (iiSide) ? -2 : +2;
892 for(iiSide=0; iiSide<nSides; iiSide++) {
895 if (pCommonEndcapAB[iiSide]) {
896 for(iiWheel=firstIndexOfB; iiWheel < firstIndexOfC; iiWheel++)
899 GeoFullPhysVol* pWheelB = mapFPV[
"TRTWheelB-"
903 GeoAlignableTransform * xfAlignableModule =
nullptr;
906 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelB; iiPlane++)
913 if (iiPlane % 4 == 0) {
915 int barrel_ec = (iiSide) ? -2 : +2;
916 xfAlignableModule = mapAX[
"TRTWheelB-StrawPlane-"
930 int bar_ec = (iiSide) ? -2 : +2;
931 TRT_Identifier = idHelper->
straw_id(bar_ec, 1, iiWheel, 1, 1);
935 childPlane = mapFPV[
"TRTWheelB-StrawPlane-"
944 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
950 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
952 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
964 GeoAlignableTransform * xfWheel = mapAX[
"TRTWheelB-"
968 int barrel_ec = (iiSide) ? -2 : +2;
979 if (pEndCapCPlus || pEndCapCMinus) {
986 for(iiSide=0; iiSide<nSides; iiSide++) {
988 if (pCommonEndcapC[iiSide]) {
989 for(iiWheel=firstIndexOfC; iiWheel < indexUpperBound; iiWheel++)
991 GeoFullPhysVol* pWheelC = mapFPV[
"TRTWheelC-"
998 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelC; iiPlane++)
1001 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsC;
1004 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
1005 phiPlane += deltaPhiForStrawsC;
1010 childPlane = mapFPV[
"TRTWheelC-StrawPlane-"
1018 if(iiWheel==firstIndexOfC && iiPlane < nStrawLayMaxEc)
1019 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1024 pDescriptor->
nStraws() =
m_data->endcapNumberOfStrawsInStrawLayer_CWheels/
m_data->nEndcapPhi;
1025 pDescriptor->
strawPitch() = deltaPhiForStrawsC;
1028 double startPhi = phiPlane + iiPhi * pDescriptor->
strawPitch() * pDescriptor->
nStraws();
1041 pDescriptor->
startPhi() = startPhi;
1043 pDescriptor->
strawLength() =
m_data->endCapOuterRadiusOfSupportC -
m_data->endCapRadialThicknessOfOuterSupportC
1044 - 2*
m_data->lengthOfDeadRegion -
m_data->endCapRadialThicknessOfInnerSupportC -
m_data->endCapInnerRadiusOfSupportC;
1045 pDescriptor->
innerRadius() =
m_data->endCapInnerRadiusOfSupportC +
m_data->endCapRadialThicknessOfInnerSupportC +
m_data->lengthOfDeadRegion;
1049 descriptorsC[iiSide][iiPlane%nStrawLayMaxEc][iiPhi] = pDescriptor;
1053 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1059 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
1061 descriptorsC[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
1074 GeoAlignableTransform * xfWheel = mapAX[
"TRTWheelC-"
1079 int barrel_ec = (iiSide) ? -2 : +2;
1092 for (iiSide=0; iiSide<2; iiSide++)
1093 for(iiPhi=0; iiPhi<
m_data->nEndcapPhi; iiPhi++)
1096 for (iiWheel=0; iiWheel<indexUpperBound; iiWheel++)
1103 current->setPreviousInZ(prev);