#include <TGeoVolume.h>
#include <TGeoXtru.h>
#include <TGeoPcon.h>
+#include <TGeoPgon.h>
#include <TGeoArb8.h>
// AliRoot includes
//TGeoMedium *medSPDal = 0;//SPD support cone SDD mounting bracket Al
TGeoMedium *medSPDcf = GetMedium("SPD C (M55J)$", mgr);
TGeoMedium *medSPDss = GetMedium("INOX$", mgr);
- TGeoMedium *medSPDair = GetMedium("AIR$", mgr);
TGeoMedium *medSPDcoolfl = GetMedium("Freon$", mgr); //ITSspdCoolingFluid
//
const Double_t ksecDz = 0.5 * 500.0 * fgkmm;
Double_t xpp2[ksecNPoints], ypp2[ksecNPoints];
Double_t *xp[ksecNRadii], *xp2[ksecNRadii];
Double_t *yp[ksecNRadii], *yp2[ksecNRadii];
- TGeoXtru *sA0, *sA1, *sB0, *sB1,*sB2;
+ TGeoXtru *sA0, *sA1, *sB0, *sB1;
+ TGeoCompositeShape *sA2, *sB2;
TGeoBBox *sB3;
TGeoEltu *sTA0, *sTA1;
TGeoTube *sTB0, *sTB1; //,*sM0;
} // end if GetDebug(3)
} // end for i
sA0 = new TGeoXtru(2);
- sA0->SetName("ITS SPD Carbon fiber support Sector A0");
+ sA0->SetName("SectorA0");
sA0->DefinePolygon(m, xpp, ypp);
sA0->DefineSection(0, -ksecDz);
sA0->DefineSection(1, ksecDz);
} // end for k
} // end for i
sA1 = new TGeoXtru(2);
- sA1->SetName("ITS SPD Carbon fiber support Sector Air A1");
+ sA1->SetName("SectorA1");
sA1->DefinePolygon(m, xpp2, ypp2);
- sA1->DefineSection(0, -ksecDz);
- sA1->DefineSection(1, ksecDz);
+ sA1->DefineSection(0, -ksecDz-ksecCthick2);
+ sA1->DefineSection(1, ksecDz+ksecCthick2);
+
+ sA2 = new TGeoCompositeShape("ITS SPD Carbon fiber support Sector A0",
+ "SectorA0-SectorA1");
//
// Error in TGeoEltu. Semi-axis X must be < Semi-axis Y (?).
sTA0 = new TGeoEltu("ITS SPD Cooling Tube TA0", 0.5 * ksecCoolTubeFlatY,
SPDsectorShape(ksecNRadii,secX2,secY2,secR2,secAngleStart2,secAngleEnd2,
ksecNPointsPerRadii, m, xp, yp);
sB0 = new TGeoXtru(2);
- sB0->SetName("ITS SPD Carbon fiber support Sector End B0");
+ sB0->SetName("EndB0");
sB0->DefinePolygon(m, xpp, ypp);
sB0->DefineSection(0, ksecDz);
sB0->DefineSection(1, ksecDz + ksecZEndLen);
InsidePoint(xpp[m-2],ypp[m-2],xpp[m-1],ypp[m-1],xpp[0],ypp[0],
ksecCthick2,xpp2[i2],ypp2[i2]);
sB1 = new TGeoXtru(2);
- sB1->SetName("ITS SPD Carbon fiber support Sector Air End B1");
+ sB1->SetName("EndB1");
sB1->DefinePolygon(i2+1, xpp2, ypp2);
- sB1->DefineSection(0,sB0->GetZ(0));
- sB1->DefineSection(1,sB0->GetZ(1)-ksecCthick2);
- const Double_t kspdEndHoleRadius1=5.698*fgkmm;
- const Double_t kspdEndHoleRadius2=2.336*fgkmm;
- const Double_t kspdEndHoleDisplacement=6.29*fgkmm;
- k = (m-1)/4;
- for(i=0;i<=k;i++){
- t= ((Double_t)i)/((Double_t)(k));
- if(!CFHolePoints(t,kspdEndHoleRadius1,kspdEndHoleRadius2,
- kspdEndHoleDisplacement,xpp2[i],ypp2[i])){
- Warning("CarbonFiberSector","CFHolePoints failed "
- "i=%d m=%d k=%d t=%e",i,m,k,t);
- } // end if
- // simitry in each quadrant.
- xpp2[2*k-i] = -xpp2[i];
- ypp2[2*k-i] = ypp2[i];
- xpp2[2*k+i] = -xpp2[i];
- ypp2[2*k+i] = -ypp2[i];
- xpp2[4*k-i] = xpp2[i];
- ypp2[4*k-i] = -ypp2[i];
- }// end for i
- //xpp2[m-1] = xpp2[0]; // begining point in
- //ypp2[m-1] = ypp2[0]; // comment with end point
- sB2 = new TGeoXtru(2);
- sB2->SetName("ITS SPD Hole in Carbon fiber support End plate");
- sB2->DefinePolygon(4*k, xpp2, ypp2);
- sB2->DefineSection(0,sB1->GetZ(1));
- sB2->DefineSection(1,sB0->GetZ(1));
+ sB1->DefineSection(0,sB0->GetZ(0)-ksecCthick2);
+ sB1->DefineSection(1,sB0->GetZ(1)+ksecCthick2);
+
+ sB2 = new TGeoCompositeShape("ITS SPD Carbon fiber support Sector End B0",
+ "EndB0-EndB1");
// SPD sector mount blocks
const Double_t kMountBlock[3] = {0.5*(1.8-0.2)*fgkmm,0.5*22.0*fgkmm,
0.5*45.0*fgkmm};
sB3 = new TGeoBBox((Double_t*)kMountBlock);
+ // SPD sector mount block screws and nuts (M.S. - 27 oct 2012)
+ const Double_t kMountBlockM3ScrewR = 0.5*3.0*fgkmm; // Metric screw
+ const Double_t kMountBlockHead1R = 0.5*8.0*fgkmm;
+ const Double_t kMountBlockHead1H = 1.0*fgkmm;
+ const Double_t kMountBlockHead2R = 0.5*6.0*fgkmm;
+ const Double_t kMountBlockHead2H = 2.7*fgkmm;
+ const Double_t kMountBlockM3NutR = 1.8*kMountBlockM3ScrewR; // Metric nut
+ const Double_t kMountBlockM3NutH = kMountBlockM3NutR; // Metric nut
+ TGeoTube *sM3 = new TGeoTube(0, kMountBlockM3ScrewR, sB3->GetDX());
+ TGeoTube *sD1 = new TGeoTube(0, kMountBlockHead1R,kMountBlockHead1H/2);
+ TGeoTube *sD2 = new TGeoTube(0, kMountBlockHead2R,kMountBlockHead2H/2);
+ TGeoPgon *sN3 = new TGeoPgon(0, 360, 6, 2);
+ sN3->DefineSection(0,-kMountBlockM3NutH/2, 0, kMountBlockM3NutR);
+ sN3->DefineSection(1, kMountBlockM3NutH/2, 0, kMountBlockM3NutR);
// SPD sector cooling tubes
sTB0 = new TGeoTube("ITS SPD Cooling Tube End TB0", 0.0,
- 0.5*ksecCoolTubeROuter,0.5*(sB1->GetZ(1)-sB1->GetZ(0)));
+ 0.5*ksecCoolTubeROuter,0.5*(sB0->GetZ(1)-sB0->GetZ(0)));
sTB1 = new TGeoTube("ITS SPD Cooling Tube End coolant TB0", 0.0,
sTB0->GetRmax() - ksecCoolTubeThick,sTB0->GetDz());
//
if(GetDebug(3)) {
if(medSPDcf) medSPDcf->Dump(); else AliInfo("medSPDcf = 0");
if(medSPDss) medSPDss->Dump(); else AliInfo("medSPDss = 0");
- if(medSPDair) medSPDair->Dump(); else AliInfo("medSPDAir = 0");
if(medSPDcoolfl) medSPDcoolfl->Dump();else AliInfo("medSPDcoolfl = 0");
sA0->InspectShape();
sA1->InspectShape();
StavesInSector(vM0);
// create other volumes with some graphical settings
TGeoVolume *vA0 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorA0",
- sA0, medSPDcf);
+ sA2, medSPDcf);
vA0->SetVisibility(kTRUE);
vA0->SetLineColor(4); // Blue
vA0->SetLineWidth(1);
vA0->SetFillColor(vA0->GetLineColor());
vA0->SetFillStyle(4010); // 10% transparent
- TGeoVolume *vA1 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorAirA1",
- sA1, medSPDair);
- vA1->SetVisibility(kTRUE);
- vA1->SetLineColor(7); // light Blue
- vA1->SetLineWidth(1);
- vA1->SetFillColor(vA1->GetLineColor());
- vA1->SetFillStyle(4090); // 90% transparent
TGeoVolume *vTA0 = new TGeoVolume("ITSSPDCoolingTubeTA0", sTA0, medSPDss);
vTA0->SetVisibility(kTRUE);
vTA0->SetLineColor(15); // gray
vTA1->SetFillColor(vTA1->GetLineColor());
vTA1->SetFillStyle(4000); // 0% transparent
TGeoVolume *vB0 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorEndB0",
- sB0, medSPDcf);
+ sB2, medSPDcf);
vB0->SetVisibility(kTRUE);
vB0->SetLineColor(1); // Black
vB0->SetLineWidth(1);
vB0->SetFillColor(vB0->GetLineColor());
vB0->SetFillStyle(4000); // 0% transparent
- TGeoVolume *vB1 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorEndAirB1",
- sB1, medSPDair);
- vB1->SetVisibility(kTRUE);
- vB1->SetLineColor(0); // white
- vB1->SetLineWidth(1);
- vB1->SetFillColor(vB1->GetLineColor());
- vB1->SetFillStyle(4100); // 100% transparent
- TGeoVolume *vB2 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorEndAirB2",
- sB2, medSPDair);
- vB2->SetVisibility(kTRUE);
- vB2->SetLineColor(0); // white
- vB2->SetLineWidth(1);
- vB2->SetFillColor(vB2->GetLineColor());
- vB2->SetFillStyle(4100); // 100% transparent
TGeoVolume *vB3 = new TGeoVolume(
"ITSSPDCarbonFiberSupportSectorMountBlockB3",sB3, medSPDcf);
vB3->SetVisibility(kTRUE);
- vB3->SetLineColor(1); // Black
+ vB3->SetLineColor(26); // Brown shade
vB3->SetLineWidth(1);
vB3->SetFillColor(vB3->GetLineColor());
vB3->SetFillStyle(4000); // 0% transparent
+ TGeoVolume *vM3 = new TGeoVolume(
+ "ITSSPDCarbonFiberSupportSectorMountBlockScrewM3",sM3, medSPDss);
+ vM3->SetVisibility(kTRUE);
+ vM3->SetLineColor(kGray); // Gray
+ vM3->SetLineWidth(1);
+ vM3->SetFillColor(vM3->GetLineColor());
+ vM3->SetFillStyle(4000); // 0% transparent
+ TGeoVolume *vD1 = new TGeoVolume(
+ "ITSSPDCarbonFiberSupportSectorMountBlockScrewHead1",sD1, medSPDss);
+ vD1->SetVisibility(kTRUE);
+ vD1->SetLineColor(kGray); // Gray
+ vD1->SetLineWidth(1);
+ vD1->SetFillColor(vD1->GetLineColor());
+ vD1->SetFillStyle(4000); // 0% transparent
+ TGeoVolume *vD2 = new TGeoVolume(
+ "ITSSPDCarbonFiberSupportSectorMountBlockScrewHead2",sD2, medSPDss);
+ vD2->SetVisibility(kTRUE);
+ vD2->SetLineColor(kGray); // Gray
+ vD2->SetLineWidth(1);
+ vD2->SetFillColor(vD2->GetLineColor());
+ vD2->SetFillStyle(4000); // 0% transparent
+ TGeoVolume *vN3 = new TGeoVolume(
+ "ITSSPDCarbonFiberSupportSectorMountBlockScrewNut",sN3, medSPDss);
+ vN3->SetVisibility(kTRUE);
+ vN3->SetLineColor(kGray); // Gray
+ vN3->SetLineWidth(1);
+ vN3->SetFillColor(vN3->GetLineColor());
+ vN3->SetFillStyle(4000); // 0% transparent
TGeoVolume *vTB0 = new TGeoVolume("ITSSPDCoolingTubeEndTB0",sTB0,medSPDss);
vTB0->SetVisibility(kTRUE);
vTB0->SetLineColor(15); // gray
// add volumes to mother container passed as argument of this method
moth->AddNode(vM0,1,0); // Add virtual volume to mother
- vA0->AddNode(vA1,1,0); // Put air inside carbon fiber.
- vB0->AddNode(vB1,1,0); // Put air inside carbon fiber ends.
- vB0->AddNode(vB2,1,0); // Put air wholes inside carbon fiber ends
vTA0->AddNode(vTA1,1,0); // Put cooling liquid indide tube middel.
vTB0->AddNode(vTB1,1,0); // Put cooling liquid inside tube end.
Double_t tubeEndLocal[3]={0.0,0.0,sTA0->GetDz()};
x0 = secX3[ksecDipIndex[i]];
y0 = secY3[ksecDipIndex[i]];
t = 90.0 - secAngleTurbo[i];
- trans = new TGeoTranslation("",x0,y0,0.5*(sB1->GetZ(0)+sB1->GetZ(1)));
- vB1->AddNode(vTB0, i+1, trans);
+ z0 = 0.5*(sB1->GetZ(0)+sB1->GetZ(1));
+ trans = new TGeoTranslation("",x0,y0,z0);
+ vM0->AddNode(vTB0, i+1, trans);
// Find location of tube ends for later use.
trans->LocalToMaster(tubeEndLocal,fTubeEndSector[0][0][i]);
+ trans = new TGeoTranslation("",x0,y0,-z0);
+ vM0->AddNode(vTB0, i+1+ksecNCoolingTubeDips, trans);
rot = new TGeoRotation("", 0.0, 0.0, t);
rotrans = new TGeoCombiTrans("", x0, y0, 0.0, rot);
vM0->AddNode(vTA0, i+1, rotrans);
// Find location of tube ends for later use.
for(i=0;i<ksecNCoolingTubeDips;i++) rot->LocalToMaster(
fTubeEndSector[0][0][i],fTubeEndSector[0][1][i]);
+ // Put screws inside the mounting block
+ const Double_t kMountingBlockScrew1ZPos = 0.7 *fgkcm;
+ const Double_t kMountingBlockScrew2ZPos = 2.01*fgkcm;
+ const Double_t kMountingBlockScrew34Pos = 0.51*fgkcm;
+ vB3->AddNode(vM3, 1, new TGeoCombiTrans(0, 0,
+ (sB3->GetDZ()-kMountingBlockScrew1ZPos),
+ new TGeoRotation("",90,90,90)));
+ vB3->AddNode(vM3, 2, new TGeoCombiTrans(0, 0,
+ (sB3->GetDZ()-kMountingBlockScrew2ZPos),
+ new TGeoRotation("",90,90,90)));
+ vB3->AddNode(vM3, 3, new TGeoCombiTrans(0,-kMountingBlockScrew34Pos,
+ -(sB3->GetDZ()-kMountingBlockScrew34Pos),
+ new TGeoRotation("",90,90,90)));
+ vB3->AddNode(vM3, 4, new TGeoCombiTrans(0, kMountingBlockScrew34Pos,
+ -(sB3->GetDZ()-kMountingBlockScrew34Pos),
+ new TGeoRotation("",90,90,90)));
// left side
t = -TMath::RadToDeg()*TMath::ATan2(
sB0->GetX(0)-sB0->GetX(sB0->GetNvert()-1),
z0 = sB0->GetZ(0)+sB3->GetDZ();
rotrans = new TGeoCombiTrans("",x0,y0,z0,rot);
vM0->AddNode(vB3,1,rotrans); // Put Mounting bracket on sector
+ // the screw heads and nuts
+ Double_t h = sM3->GetDz() + sD1->GetDz();
+ Double_t zt = sB3->GetDZ()-kMountingBlockScrew1ZPos;
+ vM0->AddNode(vD1, 1, new TGeoCombiTrans(x0+h*CosD(180+t), y0+h*SinD(180+t),
+ z0+zt,
+ new TGeoRotation("",90+t,90,90)));
+ h = sM3->GetDz() + sD2->GetDz() + ksecCthick2 + 0.06;
+ zt = sB3->GetDZ()-kMountingBlockScrew2ZPos;
+ vM0->AddNode(vD2, 1, new TGeoCombiTrans(x0+h*CosD(180+t), y0+h*SinD(180+t),
+ z0+zt,
+ new TGeoRotation("",90+t,90,90)));
+ Double_t loc[3],mas[3];
+ loc[0]=0;
+ loc[1]=-kMountingBlockScrew34Pos;
+ loc[2]=-(sB3->GetDZ()-kMountingBlockScrew34Pos);
+ rotrans->LocalToMaster(loc,mas);
+ vM0->AddNode(vD2, 2, new TGeoCombiTrans(mas[0]+h*CosD(180+t),
+ mas[1]+h*SinD(180+t),
+ mas[2],
+ new TGeoRotation("",90+t,90,90)));
+ loc[1]=kMountingBlockScrew34Pos;
+ rotrans->LocalToMaster(loc,mas);
+ vM0->AddNode(vD2, 3, new TGeoCombiTrans(mas[0]+h*CosD(180+t),
+ mas[1]+h*SinD(180+t),
+ mas[2],
+ new TGeoRotation("",90+t,90,90)));
+
+ rot = new TGeoRotation("",t,180.0,0.0);// z & x axis rotation
rotrans = new TGeoCombiTrans("",x0,y0,-z0,rot);
vM0->AddNode(vB3,2,rotrans); // Put Mounting bracket on sector
+ h = sM3->GetDz() + sN3->GetZ(1);
+ zt = sB3->GetDZ()-kMountingBlockScrew1ZPos;
+ vM0->AddNode(vN3, 1, new TGeoCombiTrans(x0+h*CosD(180+t), y0+h*SinD(180+t),
+ -z0-zt,
+ new TGeoRotation("",90+t,90,90)));
+ h += ksecCthick2 + 0.06;
+ zt = sB3->GetDZ()-kMountingBlockScrew2ZPos;
+ vM0->AddNode(vN3, 2, new TGeoCombiTrans(x0+h*CosD(180+t), y0+h*SinD(180+t),
+ -z0-zt,
+ new TGeoRotation("",90+t,90,90)));
+ loc[1]=-kMountingBlockScrew34Pos;
+ rotrans->LocalToMaster(loc,mas);
+ vM0->AddNode(vN3, 3, new TGeoCombiTrans(mas[0]+h*CosD(180+t),
+ mas[1]+h*SinD(180+t),
+ mas[2],
+ new TGeoRotation("",90+t,90,90)));
+ loc[1]=kMountingBlockScrew34Pos;
+ rotrans->LocalToMaster(loc,mas);
+ vM0->AddNode(vN3, 4, new TGeoCombiTrans(mas[0]+h*CosD(180+t),
+ mas[1]+h*SinD(180+t),
+ mas[2],
+ new TGeoRotation("",90+t,90,90)));
+
t *= -1.0;
rot = new TGeoRotation("",t,0.0,0.0); // z axis rotation
-
x0 = -0.5*(sB0->GetX(0)+sB0->GetX(sB0->GetNvert()-1))-3.5*
sB3->GetDX()*TMath::Cos(t*TMath::DegToRad());
y0 = 0.5*(sB0->GetY(0)+sB0->GetY(sB0->GetNvert()-1))-3.5*
sB3->GetDX()*TMath::Sin(t*TMath::DegToRad());
- rotrans = new TGeoCombiTrans("",1.01*x0,y0,z0,rot);
+ rotrans = new TGeoCombiTrans("",1.02*x0,y0,z0,rot);
vM0->AddNode(vB3,3,rotrans); // Put Mounting bracket on sector
- rotrans = new TGeoCombiTrans("",1.01*x0,y0,-z0,rot);
+ h = sM3->GetDz() + sN3->GetZ(1) + 0.03;
+ zt = sB3->GetDZ()-kMountingBlockScrew1ZPos;
+ vM0->AddNode(vN3, 5, new TGeoCombiTrans(x0-h*CosD(180-t), y0+h*SinD(180-t),
+ z0+zt,
+ new TGeoRotation("",90+t,90,90)));
+ h += ksecCthick2 + 0.05;
+ zt = sB3->GetDZ()-kMountingBlockScrew2ZPos;
+ vM0->AddNode(vN3, 6, new TGeoCombiTrans(x0-h*CosD(180-t), y0+h*SinD(180-t),
+ z0+zt,
+ new TGeoRotation("",90+t,90,90)));
+ loc[1]=-kMountingBlockScrew34Pos;
+ rotrans->LocalToMaster(loc,mas);
+ vM0->AddNode(vN3, 7, new TGeoCombiTrans(mas[0]-h*CosD(180-t),
+ mas[1]+h*SinD(180-t),
+ mas[2],
+ new TGeoRotation("",90+t,90,90)));
+ loc[1]=kMountingBlockScrew34Pos;
+ rotrans->LocalToMaster(loc,mas);
+ vM0->AddNode(vN3, 8, new TGeoCombiTrans(mas[0]-h*CosD(180-t),
+ mas[1]+h*SinD(180-t),
+ mas[2],
+ new TGeoRotation("",90+t,90,90)));
+
+ rot = new TGeoRotation("",t,180.0,0.0); // z & x axis rotation
+ rotrans = new TGeoCombiTrans("",1.02*x0,y0,-z0,rot);
vM0->AddNode(vB3,4,rotrans); // Put Mounting bracket on sector
+ h = sM3->GetDz() + sD1->GetDz();
+ zt = sB3->GetDZ()-kMountingBlockScrew1ZPos;
+ vM0->AddNode(vD1, 2, new TGeoCombiTrans(x0-h*CosD(180-t), y0+h*SinD(180-t),
+ -z0-zt,
+ new TGeoRotation("",90+t,90,90)));
+ h = sM3->GetDz() + sD2->GetDz() + ksecCthick2 + 0.08;
+ zt = sB3->GetDZ()-kMountingBlockScrew2ZPos;
+ vM0->AddNode(vD2, 4, new TGeoCombiTrans(x0-h*CosD(180-t), y0+h*SinD(180-t),
+ -z0-zt,
+ new TGeoRotation("",90+t,90,90)));
+ loc[1]=-kMountingBlockScrew34Pos;
+ rotrans->LocalToMaster(loc,mas);
+ vM0->AddNode(vD2, 5, new TGeoCombiTrans(mas[0]-h*CosD(180-t),
+ mas[1]+h*SinD(180-t),
+ mas[2],
+ new TGeoRotation("",90+t,90,90)));
+ loc[1]=kMountingBlockScrew34Pos;
+ rotrans->LocalToMaster(loc,mas);
+ vM0->AddNode(vD2, 6, new TGeoCombiTrans(mas[0]-h*CosD(180-t),
+ mas[1]+h*SinD(180-t),
+ mas[2],
+ new TGeoRotation("",90+t,90,90)));
+
if(GetDebug(3)){
vM0->PrintNodes();
vA0->PrintNodes();
- vA1->PrintNodes();
vB0->PrintNodes();
- vB1->PrintNodes();
- vB2->PrintNodes();
vB3->PrintNodes();
vTA0->PrintNodes();
vTA1->PrintNodes();
// New method to implement SPD services
//
// Created: 25 Jul 2012 Mario Sitta
+ // Updated: 15 Nov 2012 Mario Sitta
//
// Data provided by C.Gargiulo from CAD
const Double_t kSetPinHeadRmin = fgkmm * 1.5;
const Double_t kSetPinHeadThick = fgkmm * 1.5;
const Double_t kSetPinOutClipH = fgkmm * 1.0;
- // Cooling pipes
- const Double_t kCoolPipeSideARin = fgkmm * 1.5;
- const Double_t kCoolPipeSideARout = fgkmm * 1.8;
- const Double_t kCoolPipeSideCRin = fgkmm * 0.5;
- const Double_t kCoolPipeSideCRout = fgkmm * 0.85;
- const Double_t kCoolPipeHeight[3] = {11.0, 14.0, 18.0}; // TO BE CHECKED!
- const Double_t kCoolPipeRadius[3] = {12.0, 14.0, 15.0}; // TO BE CHECKED!
- const Double_t kCoolPipeZSPD = fgkcm * 8.45; // TO BE CHECKED!
-
- Int_t kPurple = 6; // Purple (Root does not define it)
// Local variables
Double_t xprof[12], yprof[12];
// We have the shapes: now create the real volumes
TGeoMedium *medInox = GetMedium("INOX$");
TGeoMedium *medCu = GetMedium("COPPER$");
- TGeoMedium *medFreon = GetMedium("Freon$");
- TGeoMedium *medGasFr = GetMedium("GASEOUS FREON$");
TGeoMedium *medSPDcf = GetMedium("SPD shield$");
TGeoVolume *manifblk = new TGeoVolume("ITSSPDBlkManif",
coolmanifC->AddNode(setpinhead, 1, new TGeoCombiTrans( 0, ypos,-zpos,
new TGeoRotation("",0,-90,0)));
- ypos = tmp;
+ ypos = tmp - 8.e-5; // Avoid microscopic overlap
+ tmp = ypos;
coolmanifA->AddNode(sectclip, 1, new TGeoTranslation( 0, ypos,-zpos));
coolmanifC->AddNode(sectclip, 1, new TGeoCombiTrans ( 0, ypos,-zpos,
new TGeoRotation("",-90,180,90)));
coolmanifC->AddNode(screwoutmanif, 6, new TGeoCombiTrans( 0, ypos,-zpos,
new TGeoRotation("",0,-90,0)));
- // We create here the cooling pipes because it's easier to place them now
- AliITSv11GeomCableRound *coolpipeA[6];
- AliITSv11GeomCableRound *coolpipeC[6];
-
- for (Int_t i = 0; i<6; i++) {
- Char_t pipename[11];
- snprintf(pipename,11,"coolPipeA%d",i+1);
- coolpipeA[i] = new AliITSv11GeomCableRound(pipename,kCoolPipeSideARout);
- snprintf(pipename,11,"coolPipeC%d",i+1);
- coolpipeC[i] = new AliITSv11GeomCableRound(pipename,kCoolPipeSideCRout);
-
- coolpipeA[i]->SetNLayers(2);
- coolpipeA[i]->SetLayer(0, kCoolPipeSideARin, medGasFr, kPurple);
- coolpipeA[i]->SetLayer(1,(kCoolPipeSideARout-kCoolPipeSideARin),
- medCu, kYellow);
-
- coolpipeC[i]->SetNLayers(2);
- coolpipeC[i]->SetLayer(0, kCoolPipeSideCRin, medFreon, kPurple);
- coolpipeC[i]->SetLayer(1,(kCoolPipeSideCRout-kCoolPipeSideCRin),
- medCu, kYellow);
- }
-
xpos = manifblksh->GetDX() - kCoolManifCollXPos;
ypos = manifblksh->GetDY() + manifcollcyl1sh->GetDz();
zpos =-manifblksh->GetDZ() + kCoolManifCollZ0;
new TGeoCombiTrans(-xpos, -y, zpos,
new TGeoRotation("",0,90,0)));
- y += manifcollcyl2sh->GetDz();
- Double_t coordL[3] = { xpos,-y,zpos};
- Double_t coordR[3] = {-xpos,-y,zpos};
- Double_t vect[3] = {0, 1, 0};
- coolpipeA[2*i]->AddCheckPoint(coolmanifA, 0, coordL, vect);
- coolpipeC[2*i]->AddCheckPoint(coolmanifC, 0, coordL, vect);
- coolpipeA[2*i+1]->AddCheckPoint(coolmanifA, 0, coordR, vect);
- coolpipeC[2*i+1]->AddCheckPoint(coolmanifC, 0, coordR, vect);
- coordL[1] -= kCoolPipeHeight[i]*fgkmm;
- coordR[1] = coordL[1];
- coolpipeA[2*i]->AddCheckPoint(coolmanifA, 1, coordL, vect);
- coolpipeC[2*i]->AddCheckPoint(coolmanifC, 1, coordL, vect);
- coolpipeA[2*i+1]->AddCheckPoint(coolmanifA, 1, coordR, vect);
- coolpipeC[2*i+1]->AddCheckPoint(coolmanifC, 1, coordR, vect);
- coordL[1] -= kCoolPipeRadius[i]*fgkmm;
- coordL[2] -= kCoolPipeRadius[i]*fgkmm;
- coordR[1] = coordL[1];
- coordR[2] = coordL[2];
- vect[1] = 0;
- vect[2] = -1;
- coolpipeA[2*i]->AddCheckPoint(coolmanifA, 2, coordL, vect);
- coolpipeC[2*i]->AddCheckPoint(coolmanifC, 2, coordL, vect);
- coolpipeA[2*i+1]->AddCheckPoint(coolmanifA, 2, coordR, vect);
- coolpipeC[2*i+1]->AddCheckPoint(coolmanifC, 2, coordR, vect);
- coordL[2] = -kCoolPipeZSPD;
- coordR[2] = -kCoolPipeZSPD;
- coolpipeA[2*i]->AddCheckPoint(coolmanifA, 3, coordL, vect);
- coolpipeC[2*i]->AddCheckPoint(coolmanifC, 3, coordL, vect);
- coolpipeA[2*i+1]->AddCheckPoint(coolmanifA, 3, coordR, vect);
- coolpipeC[2*i+1]->AddCheckPoint(coolmanifC, 3, coordR, vect);
-
zpos += kCoolManifCollDZ;
}
- for (Int_t i=0; i<6; i++) {
- coolpipeA[i]->SetInitialNode((TGeoVolume *)coolmanifA);
- coolpipeC[i]->SetInitialNode((TGeoVolume *)coolmanifC);
-
- coolpipeA[i]->CreateAndInsertTubeSegment(1);
- coolpipeC[i]->CreateAndInsertTubeSegment(1);
- coolpipeA[i]->CreateAndInsertTorusSegment(2,180);
- coolpipeC[i]->CreateAndInsertTorusSegment(2,180);
- coolpipeA[i]->CreateAndInsertTubeSegment(3);
- coolpipeC[i]->CreateAndInsertTubeSegment(3);
- }
+ // Now add the cooling tubes to the assembly
+ CreateCoolingTubes(coolmanifA, kFALSE);
+ CreateCoolingTubes(coolmanifC, kTRUE);
// Finally put everything in the mother volume
- radius = kCoolManifRPos;
+ radius = kCoolManifRPos + 1.e-5; // Avoid microscopic overlap
zpos = kCoolManifZPos + manifblksh->GetDZ();
for (Int_t i=0; i<10; i++) {
theta = 36.*i;
}
+//______________________________________________________________________
+void AliITSv11GeometrySPD::CreateCoolingTubes(TGeoVolume *moth, Bool_t sideC) const
+{
+ //
+ // Private method to implement SPD cooling tubes
+ // going from the manifolds to the staves
+ // Since their form is quite complicate (especially on Side C
+ // where capillaries are located) a separate method is used
+ // If sideC is true, the cooling tubes on Side C are created
+ // along with the cooling loops (aka "capillaries"), otherwise
+ // the (simpler) tubes on Side A get created.
+ //
+ // In all variables: L = Left (X > 0) R = Right (X < 0)
+ //
+ // Created: 10 Nov 2012 Mario Sitta
+ //
+ // Data provided by C.Gargiulo from CAD
+
+ // Cooling manifolds - THESE VALUES *MUST* MATCH WITH CALLING METHOD!
+ const Double_t kCoolManifWidth = fgkmm * 22.0;
+ const Double_t kCoolManifLength = fgkmm * 50.0;
+ const Double_t kCoolManifThick = fgkmm * 7.0;
+ const Double_t kCoolManifCollH1 = fgkmm * 2.5;
+ const Double_t kCoolManifCollH2 = fgkmm * 5.0;
+ // Cooling pipes
+ const Double_t kCoolPipeSideARin = fgkmm * 1.5;
+ const Double_t kCoolPipeSideARout = fgkmm * 1.8;
+ const Double_t kCoolPipeSideCRin = fgkmm * 0.5;
+ const Double_t kCoolPipeSideCRout = fgkmm * 0.85;
+ const Double_t kCoolPipeHeight = fgkmm * 1.923;
+ const Double_t kCoolPipeCRadiusL[3] = {11.0, 14.0, 31.34};// TO BE CHECKED!
+ const Double_t kCoolPipeCRadiusR[3] = {12.0, 14.0, 35.54};// TO BE CHECKED!
+ const Double_t kCoolPipeARadiusL12[2] = {14.0, 30.0};
+ const Double_t kCoolPipeARadiusR12[2] = {14.0, 30.0};
+ const Double_t kCoolPipeARadiusL34[2] = {22.0, 30.0};
+ const Double_t kCoolPipeARadiusR34[2] = {22.0, 30.0};
+ const Double_t kCoolPipeARadiusL[3]= {14.0, 14.0, 31.34}; // TO BE CHECKED!
+ const Double_t kCoolPipeARadiusR[3]= {14.0, 14.0, 35.54}; // TO BE CHECKED!
+ const Double_t kCoolPipeZSPD = fgkcm * 8.47;
+ // Cooling pipes position - THESE VALUES *MUST* MATCH WITH CALLING METHOD!
+ const Double_t kCoolManifCollXPos = fgkmm * 5.0;
+ const Double_t kCoolManifCollDZ = fgkmm * 13.0;
+ const Double_t kCoolManifCollZ0 = fgkmm * 9.0;
+
+ Int_t kPurple = 6; // Purple (Root does not define it)
+
+ // Local variables
+ Double_t xpos, ypos, zpos;
+ Char_t pipename[11];
+
+ //
+ TGeoMedium *medPhynox = GetMedium("PHYNOX$");
+ TGeoMedium *medFreon = GetMedium("Freon$");
+ TGeoMedium *medGasFr = GetMedium("GASEOUS FREON$");
+
+ // The cooling tubes are created as CableRound volumes
+ // because it's easier to compose them piece by piece
+ AliITSv11GeomCableRound *coolpipe[6];
+
+ if (sideC)
+ for (Int_t i = 0; i<6; i++) {
+ snprintf(pipename,11,"coolPipeC%d",i+1);
+ coolpipe[i] = new AliITSv11GeomCableRound(pipename,kCoolPipeSideCRout);
+ coolpipe[i]->SetNLayers(2);
+ coolpipe[i]->SetLayer(0, kCoolPipeSideCRin, medFreon, kPurple);
+ coolpipe[i]->SetLayer(1,(kCoolPipeSideCRout-kCoolPipeSideCRin),
+ medPhynox, kYellow);
+ }
+ else
+ for (Int_t i = 0; i<6; i++) {
+ snprintf(pipename,11,"coolPipeA%d",i+1);
+ coolpipe[i] = new AliITSv11GeomCableRound(pipename,kCoolPipeSideARout);
+ coolpipe[i]->SetNLayers(2);
+ coolpipe[i]->SetLayer(0, kCoolPipeSideARin, medGasFr, kPurple);
+ coolpipe[i]->SetLayer(1,(kCoolPipeSideARout-kCoolPipeSideARin),
+ medPhynox, kYellow);
+ }
+
+ // Now place them in the mother assembly
+ xpos = kCoolManifWidth/2 - kCoolManifCollXPos;
+ ypos = kCoolManifThick/2 + kCoolManifCollH1 + kCoolManifCollH2;
+ zpos =-kCoolManifLength/2 + kCoolManifCollZ0;
+
+ if (sideC) { // On Side C tubes are simpler and can be created in a loop
+
+ for (Int_t i=0; i<3; i++) {
+
+ Double_t coordL[3] = { xpos,-ypos,zpos};
+ Double_t coordR[3] = {-xpos,-ypos,zpos};
+ Double_t vect[3] = {0, 1, 0};
+ coolpipe[2*i]->AddCheckPoint(moth, 0, coordL, vect);
+ coolpipe[2*i+1]->AddCheckPoint(moth, 0, coordR, vect);
+ coordL[1] -= kCoolPipeHeight;
+ coordR[1] = coordL[1];
+ coolpipe[2*i]->AddCheckPoint(moth, 1, coordL, vect);
+ coolpipe[2*i+1]->AddCheckPoint(moth, 1, coordR, vect);
+ coordL[1] -= kCoolPipeCRadiusL[i]*fgkmm;
+ coordL[2] -= kCoolPipeCRadiusL[i]*fgkmm;
+ coordR[1] -= kCoolPipeCRadiusR[i]*fgkmm;
+ coordR[2] -= kCoolPipeCRadiusR[i]*fgkmm;
+ vect[1] = 0;
+ vect[2] = -1;
+ coolpipe[2*i]->AddCheckPoint(moth, 2, coordL, vect);
+ coolpipe[2*i+1]->AddCheckPoint(moth, 2, coordR, vect);
+ coordL[2] = -kCoolPipeZSPD;
+ coordR[2] = -kCoolPipeZSPD;
+ coolpipe[2*i]->AddCheckPoint(moth, 3, coordL, vect);
+ coolpipe[2*i+1]->AddCheckPoint(moth, 3, coordR, vect);
+
+ zpos += kCoolManifCollDZ;
+ }
+
+ for (Int_t i=0; i<6; i++) {
+ coolpipe[i]->SetInitialNode(moth);
+
+ coolpipe[i]->CreateAndInsertTubeSegment(1);
+ coolpipe[i]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[i]->CreateAndInsertTubeSegment(3);
+ }
+
+ } else { // On Side A tubes are all different so are created one by one
+
+ Double_t coordL[3] = { xpos,-ypos,zpos};
+ Double_t coordR[3] = {-xpos,-ypos,zpos};
+ Double_t vect[3] = {0, 1, 0};
+ coolpipe[0]->AddCheckPoint(moth, 0, coordL, vect);
+ coolpipe[1]->AddCheckPoint(moth, 0, coordR, vect);
+ coordL[1] -= kCoolPipeHeight;
+ coordR[1] = coordL[1];
+ coolpipe[0]->AddCheckPoint(moth, 1, coordL, vect);
+ coolpipe[1]->AddCheckPoint(moth, 1, coordR, vect);
+ coordL[1] -= SinD(45) *kCoolPipeARadiusL12[0]*fgkmm;
+ coordL[2] -= (1+CosD(45))*kCoolPipeARadiusL12[0]*fgkmm;
+ coordR[1] -= SinD(45) *kCoolPipeARadiusR12[0]*fgkmm;
+ coordR[2] -= (1+CosD(45))*kCoolPipeARadiusR12[0]*fgkmm;
+ vect[1] = TMath::Sqrt(2);
+ vect[2] = -vect[1];
+ coolpipe[0]->AddCheckPoint(moth, 2, coordL, vect);
+ coolpipe[1]->AddCheckPoint(moth, 2, coordR, vect);
+ coordL[1] += (1-CosD(45))*kCoolPipeARadiusL12[1]*fgkmm;
+ coordL[2] -= SinD(45) *kCoolPipeARadiusL12[1]*fgkmm;
+ coordR[1] += (1-CosD(45))*kCoolPipeARadiusR12[1]*fgkmm;
+ coordR[2] -= SinD(45) *kCoolPipeARadiusR12[1]*fgkmm;
+ vect[1] = 0;
+ vect[2] = -1;
+ coolpipe[0]->AddCheckPoint(moth, 3, coordL, vect);
+ coolpipe[1]->AddCheckPoint(moth, 3, coordR, vect);
+ coordL[2] = -kCoolPipeZSPD;
+ coordR[2] = -kCoolPipeZSPD;
+ coolpipe[0]->AddCheckPoint(moth, 4, coordL, vect);
+ coolpipe[1]->AddCheckPoint(moth, 4, coordR, vect);
+
+ coolpipe[0]->SetInitialNode(moth);
+ coolpipe[0]->CreateAndInsertTubeSegment(1);
+ coolpipe[0]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[0]->CreateAndInsertTorusSegment(3,180);
+ coolpipe[0]->CreateAndInsertTubeSegment(4);
+
+ coolpipe[1]->SetInitialNode(moth);
+ coolpipe[1]->CreateAndInsertTubeSegment(1);
+ coolpipe[1]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[1]->CreateAndInsertTorusSegment(3,180);
+ coolpipe[1]->CreateAndInsertTubeSegment(4);
+
+ zpos += kCoolManifCollDZ;
+
+ coordL[0] = xpos; coordL[1] = -ypos; coordL[2] = zpos;
+ coordR[0] =-xpos; coordR[1] = -ypos; coordR[2] = zpos;
+ vect[0] = 0; vect[1] = 1; vect[2] = 0;
+
+ coolpipe[2]->AddCheckPoint(moth, 0, coordL, vect);
+ coolpipe[3]->AddCheckPoint(moth, 0, coordR, vect);
+ coordL[1] -= kCoolPipeHeight;
+ coordR[1] = coordL[1];
+ coolpipe[2]->AddCheckPoint(moth, 1, coordL, vect);
+ coolpipe[3]->AddCheckPoint(moth, 1, coordR, vect);
+ coordL[1] -= SinD(45) *kCoolPipeARadiusL34[0]*fgkmm;
+ coordL[2] -= (1+CosD(45))*kCoolPipeARadiusL34[0]*fgkmm;
+ coordR[1] -= SinD(45) *kCoolPipeARadiusR34[0]*fgkmm;
+ coordR[2] -= (1+CosD(45))*kCoolPipeARadiusR34[0]*fgkmm;
+ vect[1] = TMath::Sqrt(2);
+ vect[2] = -vect[1];
+ coolpipe[2]->AddCheckPoint(moth, 2, coordL, vect);
+ coolpipe[3]->AddCheckPoint(moth, 2, coordR, vect);
+ coordL[1] += (1-CosD(45))*kCoolPipeARadiusL34[1]*fgkmm;
+ coordL[2] -= SinD(45) *kCoolPipeARadiusL34[1]*fgkmm;
+ coordR[1] += (1-CosD(45))*kCoolPipeARadiusR34[1]*fgkmm;
+ coordR[2] -= SinD(45) *kCoolPipeARadiusR34[1]*fgkmm;
+ vect[1] = 0;
+ vect[2] = -1;
+ coolpipe[2]->AddCheckPoint(moth, 3, coordL, vect);
+ coolpipe[3]->AddCheckPoint(moth, 3, coordR, vect);
+ coordL[2] = -kCoolPipeZSPD;
+ coordR[2] = -kCoolPipeZSPD;
+ coolpipe[2]->AddCheckPoint(moth, 4, coordL, vect);
+ coolpipe[3]->AddCheckPoint(moth, 4, coordR, vect);
+
+ coolpipe[2]->SetInitialNode(moth);
+ coolpipe[2]->CreateAndInsertTubeSegment(1);
+ coolpipe[2]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[2]->CreateAndInsertTorusSegment(3,180);
+ coolpipe[2]->CreateAndInsertTubeSegment(4);
+
+ coolpipe[3]->SetInitialNode(moth);
+ coolpipe[3]->CreateAndInsertTubeSegment(1);
+ coolpipe[3]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[3]->CreateAndInsertTorusSegment(3,180);
+ coolpipe[3]->CreateAndInsertTubeSegment(4);
+
+ zpos += kCoolManifCollDZ;
+
+ coordL[0] = xpos; coordL[1] = -ypos; coordL[2] = zpos;
+ coordR[0] =-xpos; coordR[1] = -ypos; coordR[2] = zpos;
+ vect[0] = 0; vect[1] = 1; vect[2] = 0;
+
+ coolpipe[4]->AddCheckPoint(moth, 0, coordL, vect);
+ coolpipe[5]->AddCheckPoint(moth, 0, coordR, vect);
+ coordL[1] -= kCoolPipeHeight;
+ coordR[1] = coordL[1];
+ coolpipe[4]->AddCheckPoint(moth, 1, coordL, vect);
+ coolpipe[5]->AddCheckPoint(moth, 1, coordR, vect);
+ coordL[1] -= kCoolPipeARadiusL[2]*fgkmm;
+ coordL[2] -= kCoolPipeARadiusL[2]*fgkmm;
+ coordR[1] -= kCoolPipeARadiusR[2]*fgkmm;
+ coordR[2] -= kCoolPipeARadiusR[2]*fgkmm;
+ vect[1] = 0;
+ vect[2] = -1;
+ coolpipe[4]->AddCheckPoint(moth, 2, coordL, vect);
+ coolpipe[5]->AddCheckPoint(moth, 2, coordR, vect);
+ coordL[2] = -kCoolPipeZSPD;
+ coordR[2] = -kCoolPipeZSPD;
+ coolpipe[4]->AddCheckPoint(moth, 3, coordL, vect);
+ coolpipe[5]->AddCheckPoint(moth, 3, coordR, vect);
+
+ coolpipe[4]->SetInitialNode(moth);
+ coolpipe[4]->CreateAndInsertTubeSegment(1);
+ coolpipe[4]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[4]->CreateAndInsertTubeSegment(3);
+
+ coolpipe[5]->SetInitialNode(moth);
+ coolpipe[5]->CreateAndInsertTubeSegment(1);
+ coolpipe[5]->CreateAndInsertTorusSegment(2,180);
+ coolpipe[5]->CreateAndInsertTubeSegment(3);
+
+ } // if (sideC)
+
+ if(GetDebug(3))
+ for (Int_t i=0; i<6; i++)
+ coolpipe[i]->PrintCheckPoints();
+
+}
+
+
//______________________________________________________________________
TGeoVolume* AliITSv11GeometrySPD::CreateExtender(
const Double_t *extenderParams, const TGeoMedium *extenderMedium,