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);
193 const TRT_ID *idHelper =
nullptr;
195 if (
detStore()->retrieve(idHelper,
"TRT_ID").isFailure()) {
209 std::string versionTag =
m_data->versionTag;
210 std::string versionName =
"DC2";
211 std::string layout =
"Final";
213 int versionMajorNumber = 2;
214 int versionMinorNumber = 1;
215 int versionPatchNumber = 0;
217 if (
m_data->initialLayout) layout =
"Initial";
222 versionMajorNumber = 3;
223 versionName =
"Rome";
227 if (
m_data->isCosmicRun) {
236 if (!
m_data->oldConfiguration) {
237 versionName =
m_data->versionName;
240 versionMajorNumber = 4;
241 versionMinorNumber = 1;
242 versionPatchNumber = 1;
266 const int AlignmentLevelSubWheel = 1;
267 const int AlignmentLevelModule = 2;
268 const int AlignmentLevelTop = 3;
285 if (pEndCapABMinus) {
306 if (pEndCapABMinus) {
322 for (
unsigned int m=0;
m<
m_data->nBarrelRings;
m++) {
330 unsigned int nEndcapWheels = 0;
331 if (pEndCapABPlus||pEndCapABMinus) nEndcapWheels +=
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels;
332 if (pEndCapCPlus||pEndCapCMinus) nEndcapWheels +=
m_data->endcapNumberOfCWheels;
338 unsigned int nlayers;
339 if ( w < m_data->endcapNumberOfAWheels )
340 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelA;
341 else if (
w < (
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels ) )
342 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelB;
344 nlayers =
m_data->endCapNumberOfStrawLayersPerWheelC;
355 ATH_MSG_DEBUG(
"Virtual TRT Barrel volume defined by RMin = "<<
m_data->virtualBarrelInnerRadius
356 <<
", Rmax = "<<
m_data->virtualBarrelOuterRadius<<
" Zmax = "<<
m_data->virtualBarrelVolumeLength );
361 GeoAlignableTransform * barrelTransform = mapAX[
"TRTBarrel"];
372 GeoAlignableTransform *
transform = mapAX[
"TRTEndCapABPlus"];
379 if (pEndCapABMinus) {
381 GeoAlignableTransform *
transform = mapAX[
"TRTEndCapABMinus"];
395 GeoFullPhysVol *pCommonEndcapAB[]={pEndCapABPlus,pEndCapABMinus};
396 GeoFullPhysVol *pCommonEndcapC[]={pEndCapCPlus,pEndCapCMinus};
413 std::vector<InDetDD::TRT_BarrelDescriptor *> bDescriptor;
423 for (
size_t iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
431 size_t nStrawsWithLargeDeadRegion = 0;
433 for (
size_t iLayer = 0; iLayer<
m_data->barrelNumberOfLayersWithLargeDeadRegion; iLayer++) {
434 nStrawsWithLargeDeadRegion +=
m_data->barrelNumberOfStrawsInStrawLayer[iABC][iLayer];
439 GeoTrf::TranslateX3D Xx(1.0);
440 GeoTrf::TranslateY3D Xy(1.0);
442 GENFUNCTION fx =
ArrayFunction(&
m_data->strawXPosition[iABC][0+nStrawsWithLargeDeadRegion],
443 &
m_data->strawXPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
445 GENFUNCTION fy =
ArrayFunction(&
m_data->strawYPosition[iABC][0+nStrawsWithLargeDeadRegion],
446 &
m_data->strawYPosition[iABC][0]+
m_data->barrelNumberOfStrawsInModule[iABC]);
447 TRANSFUNCTION tx1 = Pow(Xx,fx)*Pow(Xy,fy);
453 TRANSFUNCTION tx1All = Pow(Xx,fxAll)*Pow(Xy,fyAll);
465 m_data->strawYPosition[iABC][
m_data->barrelIndexOfSecondGlobalAlignmentStraw[iABC]],0);
471 GeoTrf::Vector2D local12((Align2Local - Align1Local).
x(),(Align2Local - Align1Local).
y());
472 GeoTrf::Vector2D global12((Align2Global - Align1Global).
x(),(Align2Global - Align1Global).
y());
473 double zrotang = global12.phi()-local12.phi();
477 GeoTrf::Transform3D absStrawXForm = GeoTrf::Translate3D(Align1Global.x(),Align1Global.y(),Align1Global.z())
478 *GeoTrf::RotateZ3D( zrotang )
479 *GeoTrf::Translate3D(-Align1Local.x(),-Align1Local.y(),-Align1Local.z());
485 TRANSFUNCTION tx2=shellPosition.inverse()*absStrawXForm*tx1;
486 TRANSFUNCTION tx2All=shellPosition.inverse()*absStrawXForm*tx1All;
499 while (c< m_data->barrelNumberOfStrawsInModule[iABC] ) {
522 if((iABC==0)&&(iLayer<=m_data->barrelNumberOfLayersWithLargeDeadRegion )) {
524 double lengthOfActiveGas=
525 (
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 -
m_data->lengthOfDeadRegion-
m_data->barrelLengthOfLargeDeadRegion;
526 double startZOfActiveGas=activeGasZPositionStrawsWithLargeDeadRegion-lengthOfActiveGas/2.0;
527 bDescriptor.back()->strawZPos(activeGasZPositionStrawsWithLargeDeadRegion);
528 bDescriptor.back()->strawZDead(startZOfActiveGas);
529 bDescriptor.back()->strawLength(lengthOfActiveGas);
531 double lengthOfActiveGas=(
m_data->barrelLengthOfStraw-
m_data->barrelLengthOfTwister)/2.0 - 2*
m_data->lengthOfDeadRegion;
532 double startZOfActiveGas=activeGasZPositionNormalStraws-lengthOfActiveGas/2.0;
533 bDescriptor.back()->strawZPos(activeGasZPositionNormalStraws);
534 bDescriptor.back()->strawZDead(startZOfActiveGas);
535 bDescriptor.back()->strawLength(lengthOfActiveGas);
539 bDescriptor.back()->addStraw(
z,
x);
546 std::set<const GeoVPhysVol *> barrelFibreRadiators;
547 std::set<const GeoVPhysVol *> strawPlanes;
550 for (
size_t iMod = 0; iMod<
m_data->nBarrelModulesUsed;iMod++) {
556 GeoVolumeCursor
cursor(pShell);
558 if (
cursor.getVolume()->getLogVol()->getName().find(
"FibreRadiator") != std::string::npos) {
559 barrelFibreRadiators.insert(
cursor.getVolume().get());
584 for (
unsigned int iStrawLayer=0;iStrawLayer<nStrawLayers; iStrawLayer++) {
586 unsigned int jStrawLayer=iStrawLayer;
605 for (
unsigned int e=0;
e<2;
e++) {
606 for (
unsigned int iMod=0;iMod<
m_data->nBarrelModulesUsed; iMod++) {
608 for (
unsigned int iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
622 for (
unsigned int e=0;
e<2;
e++) {
623 for (
unsigned int iABC=0;iABC<
m_data->nBarrelRings;iABC++) {
626 for (
unsigned int iMod=0;iMod<
m_data->nBarrelModulesUsed; iMod++) {
630 current->setPreviousInPhi(prev);
634 if (
m_data->nBarrelModulesUsed==
m_data->nBarrelModules) {
638 first->setPreviousInPhi(last);
660 if (!(pEndCapABPlus || pEndCapABMinus || pEndCapCPlus || pEndCapCMinus)){
663 unsigned int firstIndexOfA = 0;
664 unsigned int firstIndexOfB =
m_data->endcapNumberOfAWheels;
665 unsigned int firstIndexOfC =
m_data->endcapNumberOfAWheels +
m_data->endcapNumberOfBWheels;
669 if (
m_data->initialLayout) indexUpperBound = firstIndexOfC;
671 const unsigned int nSides = 2;
672 const unsigned int nStrawLayMaxEc = 8;
674 unsigned int iiSide, iiWheel, iiPlane, iiPhi,
counter;
675 GeoFullPhysVol *childPlane =
nullptr;
678 double RotationsOfStrawPlanes[nStrawLayMaxEc];
679 double shiftForEachRotation =
m_data->endCapShiftForEachRotation;
680 RotationsOfStrawPlanes[0] = 0.;
682 bool oldGeometry =
true;
684 if (shiftForEachRotation < 0) oldGeometry =
false;
690 RotationsOfStrawPlanes[
counter] = RotationsOfStrawPlanes[
counter-1] + shiftForEachRotation;
691 if (RotationsOfStrawPlanes[
counter] >= 1.)
692 RotationsOfStrawPlanes[
counter] -= 1.;
696 double RotationsOfStrawPlanesTmp[nStrawLayMaxEc] = {0,0,0,0,2,2,2,2};
699 RotationsOfStrawPlanes[
counter] = (
counter * shiftForEachRotation) + RotationsOfStrawPlanesTmp[
counter];
704 std::vector<InDetDD::TRT_EndcapDescriptor*> descriptorsAB[nSides][nStrawLayMaxEc];
705 std::vector<InDetDD::TRT_EndcapDescriptor*> descriptorsC[nSides][nStrawLayMaxEc];
709 for(iiSide = 0; iiSide<nSides; iiSide++) {
710 for(iiPlane = 0; iiPlane < nStrawLayMaxEc; iiPlane++) {
711 descriptorsAB[iiSide][iiPlane].resize (
m_data->nEndcapPhi);
712 descriptorsC[iiSide][iiPlane].resize (
m_data->nEndcapPhi);
719 if (pEndCapABPlus || pEndCapABMinus) {
763 for(iiSide=0; iiSide<nSides; iiSide++) {
765 if (pCommonEndcapAB[iiSide]) {
767 for(iiWheel=firstIndexOfA; iiWheel < firstIndexOfB; iiWheel++)
771 GeoFullPhysVol* pWheelA = mapFPV[
"TRTWheelA-"
775 GeoAlignableTransform * xfAlignableModule =
nullptr;
778 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelA; iiPlane++)
784 if (iiPlane % 4 == 0) {
786 int barrel_ec = (iiSide) ? -2 : +2;
787 xfAlignableModule = mapAX[
"TRTWheelA-StrawPlane-"
799 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsA;
802 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
803 phiPlane += deltaPhiForStrawsA;
807 int bar_ec = (iiSide) ? -2 : +2;
808 TRT_Identifier = idHelper->
straw_id(bar_ec, 1, iiWheel, 1, 1);
813 childPlane = mapFPV[
"TRTWheelA-StrawPlane-"
822 if(iiWheel==firstIndexOfA && iiPlane < nStrawLayMaxEc)
823 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
829 pDescriptor->
nStraws() =
m_data->endcapNumberOfStrawsInStrawLayer_AWheels/
m_data->nEndcapPhi;
830 pDescriptor->
strawPitch() = deltaPhiForStrawsA;
832 double startPhi = phiPlane + iiPhi * pDescriptor->
strawPitch() * pDescriptor->
nStraws();
848 pDescriptor->
strawLength() =
m_data->endCapOuterRadiusOfSupportA -
m_data->endCapRadialThicknessOfOuterSupportA
849 - 2*
m_data->lengthOfDeadRegion -
m_data->endCapRadialThicknessOfInnerSupportA -
m_data->endCapInnerRadiusOfSupportA;
850 pDescriptor->
innerRadius() =
m_data->endCapInnerRadiusOfSupportA +
m_data->endCapRadialThicknessOfInnerSupportA
851 +
m_data->lengthOfDeadRegion;
854 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi] = pDescriptor;
857 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
863 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
865 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
878 GeoAlignableTransform * xfWheel = mapAX[
"TRTWheelA-"
883 int barrel_ec = (iiSide) ? -2 : +2;
898 for(iiSide=0; iiSide<nSides; iiSide++) {
901 if (pCommonEndcapAB[iiSide]) {
902 for(iiWheel=firstIndexOfB; iiWheel < firstIndexOfC; iiWheel++)
905 GeoFullPhysVol* pWheelB = mapFPV[
"TRTWheelB-"
909 GeoAlignableTransform * xfAlignableModule =
nullptr;
912 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelB; iiPlane++)
919 if (iiPlane % 4 == 0) {
921 int barrel_ec = (iiSide) ? -2 : +2;
922 xfAlignableModule = mapAX[
"TRTWheelB-StrawPlane-"
936 int bar_ec = (iiSide) ? -2 : +2;
937 TRT_Identifier = idHelper->
straw_id(bar_ec, 1, iiWheel, 1, 1);
941 childPlane = mapFPV[
"TRTWheelB-StrawPlane-"
950 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
956 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
958 descriptorsAB[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
970 GeoAlignableTransform * xfWheel = mapAX[
"TRTWheelB-"
974 int barrel_ec = (iiSide) ? -2 : +2;
985 if (pEndCapCPlus || pEndCapCMinus) {
992 for(iiSide=0; iiSide<nSides; iiSide++) {
994 if (pCommonEndcapC[iiSide]) {
995 for(iiWheel=firstIndexOfC; iiWheel < indexUpperBound; iiWheel++)
997 GeoFullPhysVol* pWheelC = mapFPV[
"TRTWheelC-"
1004 for (iiPlane = 0; iiPlane <
m_data->endCapNumberOfStrawLayersPerWheelC; iiPlane++)
1007 double phiPlane =
m_data->endCapPhiOfFirstStraw + RotationsOfStrawPlanes[iiPlane%nStrawLayMaxEc]*deltaPhiForStrawsC;
1010 if(iiSide && oldGeometry && (iiPlane%8 == 0)) {
1011 phiPlane += deltaPhiForStrawsC;
1016 childPlane = mapFPV[
"TRTWheelC-StrawPlane-"
1024 if(iiWheel==firstIndexOfC && iiPlane < nStrawLayMaxEc)
1025 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1030 pDescriptor->
nStraws() =
m_data->endcapNumberOfStrawsInStrawLayer_CWheels/
m_data->nEndcapPhi;
1031 pDescriptor->
strawPitch() = deltaPhiForStrawsC;
1034 double startPhi = phiPlane + iiPhi * pDescriptor->
strawPitch() * pDescriptor->
nStraws();
1047 pDescriptor->
startPhi() = startPhi;
1049 pDescriptor->
strawLength() =
m_data->endCapOuterRadiusOfSupportC -
m_data->endCapRadialThicknessOfOuterSupportC
1050 - 2*
m_data->lengthOfDeadRegion -
m_data->endCapRadialThicknessOfInnerSupportC -
m_data->endCapInnerRadiusOfSupportC;
1051 pDescriptor->
innerRadius() =
m_data->endCapInnerRadiusOfSupportC +
m_data->endCapRadialThicknessOfInnerSupportC +
m_data->lengthOfDeadRegion;
1055 descriptorsC[iiSide][iiPlane%nStrawLayMaxEc][iiPhi] = pDescriptor;
1059 for(iiPhi = 0; iiPhi <
m_data->nEndcapPhi; iiPhi++)
1065 int iiPhiOffline = (iiSide==0) ? iiPhi : (3*
m_data->nEndcapPhi/2 - iiPhi - 1)%
m_data->nEndcapPhi;
1067 descriptorsC[iiSide][iiPlane%nStrawLayMaxEc][iiPhi],
1080 GeoAlignableTransform * xfWheel = mapAX[
"TRTWheelC-"
1085 int barrel_ec = (iiSide) ? -2 : +2;
1098 for (iiSide=0; iiSide<2; iiSide++)
1099 for(iiPhi=0; iiPhi<
m_data->nEndcapPhi; iiPhi++)
1102 for (iiWheel=0; iiWheel<indexUpperBound; iiWheel++)
1109 current->setPreviousInZ(prev);