const Int_t AliITSv11GeometrySDD::fgkLay3Nladd = 14;
const Double_t AliITSv11GeometrySDD::fgkLay3CoolPipeSuppH = 7.5*fgkmm;
-const Double_t AliITSv11GeometrySDD::fgkLay4Rmin = 235.*fgkmm;
+const Double_t AliITSv11GeometrySDD::fgkLay4Rmin = 234.8*fgkmm;
const Double_t AliITSv11GeometrySDD::fgkLay4Rmax = 286.*fgkmm;
const Double_t AliITSv11GeometrySDD::fgkLay4Length = (671.+0.)*fgkmm; // ladder+supporting rings (length of the virtual tube)
const Double_t AliITSv11GeometrySDD::fgkLay4LadderLength = 671.*fgkmm;
Double_t distCenterSideDown = 0.5*fgkLadderWidth/TMath::Cos(beta);
//--- the top V of the Carbon Fiber Ladder (segment)
- TGeoArb8 *cfLaddTop1 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
+ TGeoArb8 *cfLaddTop1 = CreateLadderSide( "CFladdTopCornerVol1shape",
+ fgkSegmentLength/2., halfTheta,
-1, fgkLadderLa, fgkLadderHa, fgkLadderl);
TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
cfLaddTop1,carbonFiberLadderStruct);
- TGeoArb8 *cfLaddTop2 = CreateLadderSide( fgkSegmentLength/2., halfTheta,
+ TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerVol2shape",
+ fgkSegmentLength/2., halfTheta,
1, fgkLadderLa, fgkLadderHa, fgkLadderl);
TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerVol2",
cfLaddTop2, carbonFiberLadderStruct);
TGeoTranslation *trTop1 = new TGeoTranslation(0, fgkLadderHeight/2-dy, 0);
//--- the 2 side V
- TGeoArb8 *cfLaddSide1 = CreateLadderSide( fgkSegmentLength/2., beta, -1,
+ TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerVol1shape",
+ fgkSegmentLength/2., beta, -1,
fgkLadderLb, fgkLadderHb, fgkLadderl);
TGeoVolume *cfLaddSideVol1 = new TGeoVolume( "ITSsddCFladdSideCornerVol1",
cfLaddSide1,carbonFiberLadderStruct);
- TGeoArb8 *cfLaddSide2 = CreateLadderSide( fgkSegmentLength/2., beta, 1,
+ TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerVol2shape",
+ fgkSegmentLength/2., beta, 1,
fgkLadderLb, fgkLadderHb, fgkLadderl);
TGeoVolume *cfLaddSideVol2 = new TGeoVolume( "ITSsddCFladdSideCornerVol2",
cfLaddSide2,carbonFiberLadderStruct);
TGeoVolumeAssembly *lay3Ladder = CreateLadder(3);
TGeoVolumeAssembly *lay3Detectors = CreateDetectorsAssembly(3);
+ TGeoVolumeAssembly *lay3Ladd2Det = CreateDetectorsAssemblyLadd2();
//TGeoVolume *lay3Detectors = CreateDetectors(3);
TGeoTube *virtualLayer3Shape = new TGeoTube("ITSsddLayer3Shape",
fgkLay3Rmin,fgkLay3Rmax,fgkLay3Length*0.5);
if (iLadd%2 != 0) minRadiusDetBox = fgkLay3DetLongRadius;
minRadiusDetBox += detectorsThick/2;
TGeoCombiTrans *ctDet;
+ ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
+ 0, ladderPhi, kTRUE);
+
if (iLadd != 2)
- ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
- 0, ladderPhi, kTRUE);
+ virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
else
- ctDet = CreateCombiTrans(rotName, minRadiusDetBox,
- 0, ladderPhi, kFALSE);
+ virtualLayer3->AddNode(lay3Ladd2Det , iLadd, ctDet);
- virtualLayer3->AddNode(lay3Detectors, iLadd, ctDet);
///////////////////////////////////////////////////
}
//________________________________________________________________________
-TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(Double_t dz, Double_t angle,
- Double_t xSign, Double_t L, Double_t H, Double_t l) {
+TGeoArb8 *AliITSv11GeometrySDD::CreateLadderSide(const char *name,
+ Double_t dz, Double_t angle, Double_t xSign,
+ Double_t L, Double_t H, Double_t l) {
// Create one half of the V shape corner of CF ladder
TGeoArb8 *cfLaddSide = new TGeoArb8(dz);
- cfLaddSide->SetVertex( 0, 0, 0);
- cfLaddSide->SetVertex( 1, 0, -H);
- cfLaddSide->SetVertex( 2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
- -L*TMath::Cos(angle)-l*TMath::Sin(angle));
- cfLaddSide->SetVertex( 3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
- cfLaddSide->SetVertex( 4, 0, 0);
- cfLaddSide->SetVertex( 5, 0, -H);
- cfLaddSide->SetVertex( 6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
- -L*TMath::Cos(angle)-l*TMath::Sin(angle));
- cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
+ cfLaddSide->SetName(name);
+
+ // Points must be in clockwise order
+ cfLaddSide->SetVertex(0, 0, 0);
+ cfLaddSide->SetVertex(2, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
+ -L*TMath::Cos(angle)-l*TMath::Sin(angle));
+ cfLaddSide->SetVertex(4, 0, 0);
+ cfLaddSide->SetVertex(6, xSign*(L*TMath::Sin(angle)-l*TMath::Cos(angle)),
+ -L*TMath::Cos(angle)-l*TMath::Sin(angle));
+ if (xSign < 0) {
+ cfLaddSide->SetVertex(1, 0, -H);
+ cfLaddSide->SetVertex(3, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
+ cfLaddSide->SetVertex(5, 0, -H);
+ cfLaddSide->SetVertex(7, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
+ } else {
+ cfLaddSide->SetVertex(1, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
+ cfLaddSide->SetVertex(3, 0, -H);
+ cfLaddSide->SetVertex(5, xSign*L*TMath::Sin(angle), -L*TMath::Cos(angle));
+ cfLaddSide->SetVertex(7, 0, -H);
+ }
return cfLaddSide;
}
//**************************************************** CC outside chips:
// I don't think there is a second aluminium layer here ...
for (Int_t i = 0; i<4; i++) {
- char ch[20];
sprintf(ch, "ccLayerA%i", i);
AliITSv11GeomCableFlat ccLayer1(ch, 6.6*fgkmm, ccUpLayerTotThick);
Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
+ side1->SetName("ITSsddCPSside1");
side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
- side1->SetVertex( 1, fgkCoolPipeSuppMaxLength/2.-diffX,
- -fgkCoolPipeSuppWidthExt/2.);
+ side1->SetVertex( 1, 0, fgkCoolPipeSuppWidthExt/2.);
side1->SetVertex( 2, fgkCoolPipeSuppMaxLength/2.-diffX,
fgkCoolPipeSuppWidthExt/2.);
- side1->SetVertex( 3, 0, fgkCoolPipeSuppWidthExt/2.);
- side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
- side1->SetVertex( 5, fgkCoolPipeSuppMaxLength/2.,
+ side1->SetVertex( 3, fgkCoolPipeSuppMaxLength/2.-diffX,
-fgkCoolPipeSuppWidthExt/2.);
+ side1->SetVertex( 4, 0, -fgkCoolPipeSuppWidthExt/2.);
+ side1->SetVertex( 5, 0, fgkCoolPipeSuppWidthExt/2.);
side1->SetVertex( 6, fgkCoolPipeSuppMaxLength/2.,
fgkCoolPipeSuppWidthExt/2.);
- side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
- side1->SetName("ITSsddCPSside1");
+ side1->SetVertex( 7, fgkCoolPipeSuppMaxLength/2.,
+ -fgkCoolPipeSuppWidthExt/2.);
TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1",0,
- fgkCoolPipeSuppAxeDist
Double_t diffX = fgkCoolPipeSuppHeight*TanD(fgkCoolPipeSuppAngle);
TGeoArb8 *side1 = new TGeoArb8(fgkCoolPipeSuppHeight/2.);
+ side1->SetName("ITSsddCPSside1R");
side1->SetVertex( 0, 0, -fgkCoolPipeSuppWidthExt/2.);
side1->SetVertex( 1, -(fgkCoolPipeSuppMaxLength/2.-diffX),
-fgkCoolPipeSuppWidthExt/2.);
side1->SetVertex( 6, -fgkCoolPipeSuppMaxLength/2.,
fgkCoolPipeSuppWidthExt/2.);
side1->SetVertex( 7, 0, fgkCoolPipeSuppWidthExt/2.);
- side1->SetName("ITSsddCPSside1R");
TGeoTranslation *side1Tr = new TGeoTranslation("ITSsddCPStr1R",0,
- fgkCoolPipeSuppAxeDist
//--- The 3 V shape corners of the Carbon Fiber Ladder
//--- the top V
- TGeoArb8 *cfLaddTop1 = CreateLadderSide(topCornerLength/2., halfTheta, -1,
+ TGeoArb8 *cfLaddTop1 = CreateLadderSide("CFladdTopCornerV1shape",
+ topCornerLength/2., halfTheta, -1,
fgkLadderLa, fgkLadderHa, fgkLadderl);
- TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerVol1",
+ TGeoVolume *cfLaddTopVol1 = new TGeoVolume("ITSsddCFladdTopCornerV1",
cfLaddTop1,carbonFiberLadderStruct);
cfLaddTopVol1->SetLineColor(fColorCarbonFiber);
- TGeoArb8 *cfLaddTop2 = CreateLadderSide( topCornerLength/2., halfTheta, 1,
+ TGeoArb8 *cfLaddTop2 = CreateLadderSide( "CFladdTopCornerV2shape",
+ topCornerLength/2., halfTheta, 1,
fgkLadderLa, fgkLadderHa, fgkLadderl);
TGeoVolume *cfLaddTopVol2 = new TGeoVolume("ITSsddCFladdTopCornerV2",
cfLaddTop2,carbonFiberLadderStruct);
virtualEnd->AddNode(cfLaddTopVol2, 1, trTop1);
//--- the 2 side V
- TGeoArb8 *cfLaddSide1 = CreateLadderSide( length/2., beta, -1,
+ TGeoArb8 *cfLaddSide1 = CreateLadderSide( "CFladdSideCornerV1shape",
+ length/2., beta, -1,
fgkLadderLb, fgkLadderHb, fgkLadderl);
TGeoVolume *cfLaddSideVol1 = new TGeoVolume("ITSsddCFladdSideCornerV1",
cfLaddSide1,carbonFiberLadderStruct);
cfLaddSideVol1->SetLineColor(fColorCarbonFiber);
- TGeoArb8 *cfLaddSide2 = CreateLadderSide( length/2., beta, 1,
+ TGeoArb8 *cfLaddSide2 = CreateLadderSide( "CFladdSideCornerV2shape",
+ length/2., beta, 1,
fgkLadderLb, fgkLadderHb, fgkLadderl);
TGeoVolume *cfLaddSideVol2 = new TGeoVolume("ITSsddCFladdSideCornerV2",
cfLaddSide2,carbonFiberLadderStruct);
}
+//________________________________________________________________________
+TGeoVolumeAssembly *AliITSv11GeometrySDD::CreateDetectorsAssemblyLadd2() {
+//
+// return a box volume containing the detectors
+// Special case for Layer 3 Ladder 2 which is rotated (cannot simply
+// rotate the standard volume, because the module numbering would be wrong)
+// M.Sitta 25 Nov 2009
+//
+
+ Int_t nDetectors = fgkLay3Ndet;
+ Double_t *sensorZPos = fLay3sensorZPos;
+ TGeoVolume *sensorSDD = fSDDsensor3;
+
+ char name[30];
+ sprintf(name,"ITSsddDetBoxLadd2");
+
+ TGeoVolumeAssembly *virtualDet = new TGeoVolumeAssembly("ITSsddLadd");
+
+ for (Int_t i=0; i<nDetectors; i++) {
+ Double_t localZ = (-1.)*sensorZPos[nDetectors-1-i];
+ Double_t localY = fgkLadWaferSep/2+fgkWaferThickness/2;
+ if (i%2==0) localY = -localY;
+ sprintf(name, "ITSsddLayLadd2SensorPos%i", i);
+
+ if (i >= nDetectors/2) {
+ TGeoTranslation *sensorPos = new TGeoTranslation(0,localY,localZ);
+ sensorPos->SetName(name);
+ virtualDet->AddNode(sensorSDD, i, sensorPos);
+ }
+ else {
+ TGeoRotation *rotSensor = new TGeoRotation("",0, 180, 180);
+ TGeoCombiTrans *sensorPos = new TGeoCombiTrans(0,localY,
+ localZ, rotSensor);
+ sensorPos->SetName(name);
+ virtualDet->AddNode(sensorSDD, i, sensorPos);
+ };
+ }
+
+ if(GetDebug(1)) virtualDet->CheckOverlaps(0.01);
+ return virtualDet;
+}
+
+
//________________________________________________________________________
Int_t AliITSv11GeometrySDD::ExportSensorGeometry(AliITSgeom *geom, Int_t iLaySDD,
Int_t startMod) {
// cables that are grouped at the end of SSD cones
//==================================
- Double_t fgkSDDCableR6 = fgkSDDCableR5+9;
- Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8;
+// Double_t fgkSDDCableR6 = fgkSDDCableR5+9;
+// Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8.8;
+ Double_t fgkSDDCableR6 = fgkSDDCableR5+8;
+ Double_t fgkSDDCableZ6 = fgkSDDCableZ5+8;
TGeoVolumeAssembly *endConeSDDCable = new TGeoVolumeAssembly("endConeSDDCable");
// Add some hardcoded shifts to avoid overlaps with SSD pathc panels
- CreateAndInsetConeCablePart(endConeSDDCable, 40, 1*3,2*4, fgkSDDCableR5,
- fgkSDDCableZ5,fgkSDDCableR6+0.7,fgkSDDCableZ6);
+ CreateAndInsetConeCablePart(endConeSDDCable, 20, 1*3,2*4, fgkSDDCableR5,
+ fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
- CreateAndInsetConeCablePart(endConeSDDCable, 60, 1*3,1*4, fgkSDDCableR5,
- fgkSDDCableZ5,fgkSDDCableR6+0.6,fgkSDDCableZ6);
+ CreateAndInsetConeCablePart(endConeSDDCable, 50, 1*3,1*4, fgkSDDCableR5,
+ fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
CreateAndInsetConeCablePart(endConeSDDCable, 85, 2*3,1*4, fgkSDDCableR5,
fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
CreateAndInsetConeCablePart(endConeSDDCable, 95, 0*3,1*4, fgkSDDCableR5,
fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
- CreateAndInsetConeCablePart(endConeSDDCable, 110, 2*3,3*4, fgkSDDCableR5,
- fgkSDDCableZ5,fgkSDDCableR6+0.9,fgkSDDCableZ6);
+ CreateAndInsetConeCablePart(endConeSDDCable, 105, 2*3,3*4, fgkSDDCableR5,
+ fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
- CreateAndInsetConeCablePart(endConeSDDCable, 146, 0*3,3*4, fgkSDDCableR5,
- fgkSDDCableZ5,fgkSDDCableR6+0.7,fgkSDDCableZ6);
+ CreateAndInsetConeCablePart(endConeSDDCable, 129, 0*3,3*4, fgkSDDCableR5,
+ fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
- CreateAndInsetConeCablePart(endConeSDDCable, 176.1, 0*3,1*4, fgkSDDCableR5,
+ CreateAndInsetConeCablePart(endConeSDDCable, 176, 0*3,1*4, fgkSDDCableR5,
fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
CreateAndInsetConeCablePart(endConeSDDCable, 190, 2*3,0*4, fgkSDDCableR5,
fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
- CreateAndInsetConeCablePart(endConeSDDCable, 220, 1*3,2*4, fgkSDDCableR5,
- fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
+ CreateAndInsetConeCablePart(endConeSDDCable, 210, 1*3,2*4, fgkSDDCableR5,
+ fgkSDDCableZ5,fgkSDDCableR6-2.6,fgkSDDCableZ6-2.6);
- CreateAndInsetConeCablePart(endConeSDDCable, 240, 1*3,2*4, fgkSDDCableR5,
+ CreateAndInsetConeCablePart(endConeSDDCable, 230, 1*3,2*4, fgkSDDCableR5,
fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
- CreateAndInsetConeCablePart(endConeSDDCable, 290.1, 2*3,2*4, fgkSDDCableR5,
+ CreateAndInsetConeCablePart(endConeSDDCable, 277, 2*3,2*4, fgkSDDCableR5,
fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
- CreateAndInsetConeCablePart(endConeSDDCable, 315, 1*3,1*4, fgkSDDCableR5,
- fgkSDDCableZ5,fgkSDDCableR6+0.6,fgkSDDCableZ6);
+ CreateAndInsetConeCablePart(endConeSDDCable, 306, 1*3,1*4, fgkSDDCableR5,
+ fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);
CreateAndInsetConeCablePart(endConeSDDCable, 353, 1*3,3*4, fgkSDDCableR5,
fgkSDDCableZ5,fgkSDDCableR6,fgkSDDCableZ6);