/************************************************************************** * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ // This class Defines the Geometry for the ITS services and support cones // outside of the ceneteral volume (except for the Ceneteral support // cylinders. Other classes define the rest of the ITS. Specificaly the ITS // The SSD support cone,SSD Support centeral cylinder, SDD support cone, // The SDD cupport centeral cylinder, the SPD Thermal Sheald, The supports // and cable trays on both the RB26 (muon dump) and RB24 sides, and all of // the cabling from the ladders/stave ends out past the TPC. /* $Id$ */ // General Root includes #include #include #include #include #include // Root Geometry includes #include #include #include #include #include // contaings TGeoTubeSeg #include #include #include #include #include //#include //#include //#include #include "AliITSv11GeometrySPD.h" ClassImp(AliITSv11GeometrySPD) #define SQ(A) (A)*(A) //______________________________________________________________________ void AliITSv11GeometrySPD::CarbonFiberSector(TGeoVolume *moth){ // Define the detail SPD Carbon fiber support Sector geometry. // Based on the drawings ALICE-Pixel "Construzione Profilo Modulo" // March 25 2004 and ALICE-SUPPORTO "construzione Profilo Modulo" // Define Outside radii as negitive, Outside in the sence that the // center of the arc is outside of the object. // February 16 2004. // Inputs: // none. // Outputs: // none. // Return: // none. TGeoManager *mgr = gGeoManager; TGeoMedium *medSPDcf = 0; // SPD support cone Carbon Fiber materal number. //TGeoMedium *medSPDfs = 0; // SPD support cone inserto stesalite 4411w. //TGeoMedium *medSPDfo = 0; // SPD support cone foam, Rohacell 50A. TGeoMedium *medSPDss = 0; // SPD support cone screw material,Stainless TGeoMedium *medSPDair = 0; // SPD support cone Air //TGeoMedium *medSPDal = 0; // SPD support cone SDD mounting bracket Al TGeoMedium *medSPDcoolfl = 0; // SPD cooling fluid, Freeon medSPDcf = mgr->GetMedium("ITSspdCarbonFiber"); //medSPDfs = mgr->GetMedium("ITSspdStaselite4411w"); //medSPDfo = mgr->GetMedium("ITSspdRohacell50A"); medSPDss = mgr->GetMedium("ITSspdStainlessSteal"); medSPDair= mgr->GetMedium("ITSspdAir"); medSPDcoolfl= mgr->GetMedium("ITSspdCoolingFluid"); // const Double_t ksecDz = 0.5*500.0*fgkmm; const Double_t ksecLen = 30.0*fgkmm; const Double_t ksecCthick = 0.20*fgkmm; const Double_t ksecDipLength = 3.2*fgkmm; const Double_t ksecDipRadii = 0.4*fgkmm; //const Double_t ksecCoolingTubeExtraDepth = 0.86*fgkmm; // const Double_t ksecX0 = -10.725*fgkmm; const Double_t ksecY0 = -14.853*fgkmm; const Double_t ksecR0 = -0.8*fgkmm; // Outside const Double_t ksecX1 = -13.187*fgkmm; const Double_t ksecY1 = -19.964*fgkmm; const Double_t ksecR1 = +0.6*fgkmm; // Inside const Double_t ksecDip0 = 5.9*fgkmm; // const Double_t ksecX2 = -3.883*fgkmm; const Double_t ksecY2 = -17.805*fgkmm; const Double_t ksecR2 = +0.80*fgkmm; // Inside Guess. const Double_t ksecX3 = -3.123*fgkmm; const Double_t ksecY3 = -14.618*fgkmm; const Double_t ksecR3 = -0.6*fgkmm; // Outside const Double_t ksecDip1 = 8.035*fgkmm; // const Double_t ksecX4 = +11.280*fgkmm; const Double_t ksecY4 = -14.473*fgkmm; const Double_t ksecR4 = +0.8*fgkmm; // Inside const Double_t ksecX5 = +19.544*fgkmm; const Double_t ksecY5 = +10.961*fgkmm; const Double_t ksecR5 = +0.8*fgkmm; // Inside const Double_t ksecDip2 = 4.553*fgkmm; // const Double_t ksecX6 = +10.830*fgkmm; const Double_t ksecY6 = +16.858*fgkmm; const Double_t ksecR6 = +0.6*fgkmm; // Inside const Double_t ksecX7 = +11.581*fgkmm; const Double_t ksecY7 = +13.317*fgkmm; const Double_t ksecR7 = -0.6*fgkmm; // Outside const Double_t ksecDip3 = 6.978*fgkmm; // const Double_t ksecX8 = -0.733*fgkmm; const Double_t ksecY8 = +17.486*fgkmm; const Double_t ksecR8 = +0.6*fgkmm; // Inside const Double_t ksecX9 = +0.562*fgkmm; const Double_t ksecY9 = +14.486*fgkmm; const Double_t ksecR9 = -0.6*fgkmm; // Outside const Double_t ksecDip4 = 6.978*fgkmm; // const Double_t ksecX10 = -12.252*fgkmm; const Double_t ksecY10 = +16.298*fgkmm; const Double_t ksecR10 = +0.6*fgkmm; // Inside const Double_t ksecX11 = -10.445*fgkmm; const Double_t ksecY11 = +13.162*fgkmm; const Double_t ksecR11 = -0.6*fgkmm; // Outside const Double_t ksecDip5 = 6.978*fgkmm; // const Double_t ksecX12 = -22.276*fgkmm; const Double_t ksecY12 = +12.948*fgkmm; const Double_t ksecR12 = +0.85*fgkmm; // Inside //const Double_t ksecX13 = *fgkmm; //const Double_t ksecY13 = *fgkmm; const Double_t ksecR13 = -0.8*fgkmm; // Outside const Double_t ksecAngleSide13 = 36.0*fgkDegree; // const Int_t ksecNRadii = 14; const Int_t ksecNPointsPerRadii = 4; const Int_t ksecNCoolingTubeDips = 6; // Since the Rounded parts are aproximated by a regular polygon and // a cooling tube of the propper diameter must fit, a scaling factor // increases the size of the polygon for the tube to fit. //const Double_t ksecRCoolScale = 1./TMath::Cos(TMath::Pi()/ // (Double_t)ksecNPointsPerRadii); const Double_t ksecZEndLen = 30.00*fgkmm; //const Double_t ksecZFlangLen= 45.00*fgkmm; const Double_t ksecTl = 0.860*fgkmm; const Double_t ksecCthick2 = 0.600*fgkmm; const Double_t ksecCthick3 = 1.800*fgkmm; const Double_t ksecSidelen = 22.00*fgkmm; const Double_t ksecSideD5 = 3.679*fgkmm; const Double_t ksecSideD12 = 7.066*fgkmm; const Double_t ksecRCoolOut = 2.400*fgkmm; const Double_t ksecRCoolIn = 2.000*fgkmm; const Double_t ksecDl1 = 5.900*fgkmm; const Double_t ksecDl2 = 8.035*fgkmm; const Double_t ksecDl3 = 4.553*fgkmm; const Double_t ksecDl4 = 6.978*fgkmm; const Double_t ksecDl5 = 6.978*fgkmm; const Double_t ksecDl6 = 6.978*fgkmm; const Double_t ksecCoolTubeThick = 10.0*fgkmicron; // const Int_t ksecNPoints = (ksecNPointsPerRadii+1)*(ksecNRadii+ ksecNCoolingTubeDips) + 8; Double_t secX[ksecNRadii] = {ksecX0,ksecX1,ksecX2,ksecX3,ksecX4,ksecX5, ksecX6,ksecX7,ksecX8,ksecX9,ksecX10,ksecX11, ksecX12,-1000.0}; Double_t secY[ksecNRadii] = {ksecY0,ksecY1,ksecY2,ksecY3,ksecY4,ksecY5, ksecY6,ksecY7,ksecY8,ksecY9,ksecY10,ksecY11, ksecY12,-1000.0}; Double_t secR[ksecNRadii] = {ksecR0,ksecR1,ksecR2,ksecR3,ksecR4,ksecR5, ksecR6,ksecR7,ksecR8,ksecR9,ksecR10,ksecR11, ksecR12,ksecR13}; Double_t secDip[ksecNRadii]={0.0,ksecDip0,0.0,ksecDip1,0.0,ksecDip2,0.0, ksecDip3,0.0,ksecDip4,0.0,ksecDip5,0.0,0.0}; Double_t secX2[ksecNRadii+ksecNCoolingTubeDips] = { ksecX0,ksecX1,-1000.,ksecX2,ksecX3,-1000.,ksecX4,ksecX5, -1000.,ksecX6,ksecX7,-1000.,ksecX8,ksecX9,-1000., ksecX10,ksecX11,-1000.,ksecX12,-1000.0}; Double_t secY2[ksecNRadii+ksecNCoolingTubeDips] = { ksecY0,ksecY1,-1000.,ksecY2,ksecY3,-1000.,ksecY4,ksecY5, -1000.,ksecY6,ksecY7,-1000.,ksecY8,ksecY9,-1000., ksecY10,ksecY11,-1000.,ksecY12,-1000.0}; Double_t secR2[ksecNRadii+ksecNCoolingTubeDips] = { ksecR0,ksecR1,ksecRCoolOut,ksecR2,ksecR3,ksecRCoolOut,ksecR4,ksecR5, ksecRCoolOut,ksecR6,ksecR7,ksecRCoolOut,ksecR8,ksecR9,ksecRCoolOut, ksecR10,ksecR11,ksecRCoolOut,ksecR12,ksecR13}; Double_t secDip2[ksecNRadii]={0.0,ksecDl1,0.0,ksecDl2,0.0,ksecDl3,0.0, ksecDl4,0.0,ksecDl5,0.0,ksecDl6,0.0,0.0}; const Int_t ksecDipIndex[ksecNCoolingTubeDips] = {2,5,8,11,14,17}; Double_t secAngleStart[ksecNRadii]; Double_t secAngleEnd[ksecNRadii]; Double_t secAngleStart2[ksecNRadii+ksecNCoolingTubeDips]; Double_t secAngleEnd2[ksecNRadii+ksecNCoolingTubeDips]; Double_t secAngleStart3[ksecNRadii+ksecNCoolingTubeDips]; Double_t secAngleEnd3[ksecNRadii+ksecNCoolingTubeDips]; Double_t xp[ksecNPoints],yp[ksecNPoints]; TGeoXtru *sA0,*sA1,*sB0,*sB1; TGeoEltu *sTA0,*sTA1; TGeoTube *sTB0,*sTB1; TGeoRotation *rot; TGeoTranslation *trans; TGeoCombiTrans *rotrans; Double_t t,t0,t1,a,b,x0,y0,x1,y1; Int_t i,j,k; if(moth==0){ Error("CarbonFiberSector","moth=%p",moth); return; } // end if moth==0 SetDebug(3); secAngleStart[0] = 0.5*ksecAngleSide13; for(i=0;i0.0&&secR[i+1]>0.0)if(secAngleStart[i]>secAngleEnd[i]) secAngleEnd[i] += 360.0; secAngleStart[i+1] = t1; } // end for i secAngleEnd[ksecNRadii-2] = secAngleStart[ksecNRadii-2] + (secAngleEnd[10]-secAngleStart[10]); if(secAngleEnd[ksecNRadii-2]<0.0) secAngleEnd[ksecNRadii-2] += 360.0; secAngleStart[ksecNRadii-1] = secAngleEnd[ksecNRadii-2] - 180.0; secAngleEnd[ksecNRadii-1] = secAngleStart[0]; // i = 0; j = ksecNRadii-2; t0 = TanD(secAngleStart[i]-90.); t1 = TanD(secAngleEnd[j]-90.); t = secY[i] - secY[j]; // Note, secR[i=0] <0; secR[j=12]>0; and secR[j+1=13] <0 t += (-secR[i]+secR[j+1])*SinD(secAngleStart[i]); t -= (secR[j]-secR[j+1])*SinD(secAngleEnd[j]); t += t1*secX[j] - t0*secX[i]; t += t1*(secR[j]-secR[j+1])*CosD(secAngleEnd[j]); t -= t0*(-secR[i]+secR[j+1])*CosD(secAngleStart[i]); secX[ksecNRadii-1] = t/(t1-t0); secY[ksecNRadii-1] = TanD(90.+0.5*ksecAngleSide13)* (secX[ksecNRadii-1]-secX[0]) + secY[0]; // if(AliDebugLevel()>=2){ cout <<" X \t Y \t R \t S \t E"<DefinePolygon(j+1,xp,yp); sA0->DefineSection(0,-ksecDz); sA0->DefineSection(1,ksecDz); // if(GetDebug(3)) cout <<"Double_t sA1[][{"; if(GetDebug(4)) cout <<"3]{"; else if(GetDebug(3)) cout <<"2]{"; j = -1; t0 = (Double_t)ksecNPointsPerRadii; for(i=0;iDefinePolygon(j+1,xp,yp); sA1->DefineSection(0,-ksecDz); sA1->DefineSection(1,ksecDz); // sTA0 = new TGeoEltu("ITS SPD Cooling Tube TA0", ksecDipRadii,0.5*ksecDipLength,ksecDz); sTA1 = new TGeoEltu("ITS SPD Cooling Tube coolant TA1", sTA0->GetA()-ksecCoolTubeThick, sTA0->GetB()-ksecCoolTubeThick,ksecDz); // j = 0; for(i=0;iDefinePolygon(j+1,xp,yp); sB0->DefineSection(0,ksecDz); sB0->DefineSection(1,ksecDz+ksecZEndLen); // if(GetDebug(3)) cout <<"Double_t sB1[][{"; if(GetDebug(4)) cout <<"3]{"; else if(GetDebug(3)) cout <<"2]{"; j = -1; t0 = (Double_t)ksecNPointsPerRadii; for(i=0;iDefinePolygon(j+1,xp,yp); sB1->DefineSection(0,ksecDz); sB1->DefineSection(1,ksecDz+ksecLen); sTB0 = new TGeoTube("ITS SPD Cooling Tube End TB0",0.0, ksecRCoolIn,0.5*ksecLen); sTB1 = new TGeoTube("ITS SPD Cooling Tube End coolant TB0",0.0, sTB0->GetRmax()-ksecCoolTubeThick,0.5*ksecLen); // if(GetDebug()){ sA0->InspectShape(); sA1->InspectShape(); sB0->InspectShape(); sB1->InspectShape(); } // end if GetDebug // TGeoVolume *vM,*vA0,*vA1,*vTA0,*vTA1,*vB0,*vB1,*vTB0,*vTB1; vM = moth; vA0 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorA0",sA0,medSPDcf); vA0->SetVisibility(kTRUE); vA0->SetLineColor(4); // Blue vA0->SetLineWidth(1); vA0->SetFillColor(vA0->GetLineColor()); vA0->SetFillStyle(4010); // 10% transparent 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 vTA0 = new TGeoVolume("ITSSPDCoolingTubeTA0",sTA0,medSPDss); vTA0->SetVisibility(kTRUE); vTA0->SetLineColor(1); // Black vTA0->SetLineWidth(1); vTA0->SetFillColor(vTA0->GetLineColor()); vTA0->SetFillStyle(4000); // 0% transparent vTA1 = new TGeoVolume("ITSSPDCoolingTubeFluidTA1",sTA1,medSPDcoolfl); vTA1->SetVisibility(kTRUE); vTA1->SetLineColor(6); // Purple vTA1->SetLineWidth(1); vTA1->SetFillColor(vTA1->GetLineColor()); vTA1->SetFillStyle(4000); // 0% transparent vB0 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorEndB0",sB0,medSPDcf); vB0->SetVisibility(kTRUE); vB0->SetLineColor(4); // Blue vB0->SetLineWidth(1); vB0->SetFillColor(vB0->GetLineColor()); vB0->SetFillStyle(4010); // 10% transparent vB1 = new TGeoVolume("ITSSPDCarbonFiberSupportSectorEndAirB1",sB1,medSPDair); vB1->SetVisibility(kTRUE); vB1->SetLineColor(7); // light Blue vB1->SetLineWidth(1); vB1->SetFillColor(vB1->GetLineColor()); vB1->SetFillStyle(4090); // 90% transparent vTB0 = new TGeoVolume("ITSSPDCoolingTubeEndTB0",sTB0,medSPDss); vTB0->SetVisibility(kTRUE); vTB0->SetLineColor(1); // Black vTB0->SetLineWidth(1); vTB0->SetFillColor(vTB0->GetLineColor()); vTB0->SetFillStyle(4000); // 0% transparent vTB1 = new TGeoVolume("ITSSPDCoolingTubeEndFluidTB1",sTB1,medSPDcoolfl); vTB1->SetVisibility(kTRUE); vTB1->SetLineColor(6); // Purple vTB1->SetLineWidth(1); vTB1->SetFillColor(vTB1->GetLineColor()); vTB1->SetFillStyle(4000); // 0% transparent // vA0->AddNode(vA1,1,0); // Put air inside carbon fiber. vB0->AddNode(vB1,1,0); // Put air inside carbon fiber. vTA0->AddNode(vTA1,1,0); // Put air inside carbon fiber. vTB0->AddNode(vTB1,1,0); // Put air inside carbon fiber. for(i=0;iAddNode(vTB0,i+1,trans); rot = new TGeoRotation("",0.0,0.0, TMath::RadToDeg()*TMath::ATan2(y0,x0)); rotrans = new TGeoCombiTrans(*trans,*rot); vM->AddNode(vTA0,i+1,rotrans); delete rot; } // end for i vM->AddNode(vA0,1,0); vM->AddNode(vB0,1,0); vM->AddNode(vB0,2,new TGeoScale(1.0,1.0,-1.0)); // Reflection. if(GetDebug()){ vA0->PrintNodes(); vA1->PrintNodes(); vB0->PrintNodes(); vB1->PrintNodes(); } // end if GetDebug // } //______________________________________________________________________ void AliITSv11GeometrySPD::HalfStave(TGeoVolume *moth){ // Define the detail SPD Half Stave geometry. // Inputs: // none. // Outputs: // none. // Return: // none. if(moth==0){ Error("HalfStave","moth=%p",moth); return; } // end if moth==0 } //---------------------------------------------------------------------- void AliITSv11GeometrySPD::CreateFigure0(const Char_t *filepath, const Char_t *type){ // Creates Figure 0 for the documentation of this class. In this // specific case, it creates the X,Y cross section of the SPD suport // section, center and ends. The output is written to a standard // file name to the path specificed. // Inputs: // const Char_t *filepath Path where the figure is to be drawn // const Char_t *type The type of file, default is gif. // Output: // none. // Return: // none. TGeoXtru *sA0,*sA1,*sB0,*sB1; //TPolyMarker *pmA,*pmB; TPolyLine plA0,plA1,plB0,plB1; TCanvas *canvas; TLatex txt; Double_t x,y; sA0 = (TGeoXtru*) gGeomManager->GetVolume( "ITSSPDCarbonFiberSupportSectorA0_1")->GetShape(); sA1 = (TGeoXtru*) gGeomManager->GetVolume( "ITSSPDCarbonFiberSupportSectorAirA1_1")->GetShape(); sB0 = (TGeoXtru*) gGeomManager->GetVolume( "ITSSPDCarbonFiberSupportSectorEndB0_1")->GetShape(); sB1 = (TGeoXtru*) gGeomManager->GetVolume( "ITSSPDCarbonFiberSupportSectorEndAirB1_1")->GetShape(); //pmA = new TPolyMarker(); //pmA.SetMarkerStyle(2); // + //pmA.SetMarkerColor(7); // light blue //pmB = new TPolyMarker(); //pmB.SetMarkerStyle(5); // X //pmB.SetMarkerColor(6); // purple plA0.SetPolyline(sA0->GetNvert()); plA0.SetLineColor(1); // black plA0.SetLineStyle(1); plA1.SetPolyline(sA1->GetNvert()); plA1.SetLineColor(2); // red plA1.SetLineStyle(1); plB0.SetPolyLine(sB0.GetNvert()); plB0.SetLineColor(3); // Green plB0.SetLineStyle(2); plB1.SetPolyLine(sB1->GetNvert()); plB1.SetLineColor(4); // Blue plB1.SetLineStyle(2); //for(i=0;iGetNvert();i++) plA0.SetPoint(i,sA0->GetX(i),sA0->GetY(i)); for(i=0;iGetNvert();i++) plA1.SetPoint(i,sA1->GetX(i),sA1->GetY(i)); for(i=0;iGetNvert();i++) plB0.SetPoint(i,sB0->GetX(i),sB0->GetY(i)); for(i=0;iGetNvert();i++) plB1.SetPoint(i,sB1->GetX(i),sB1->GetY(i)); canvas = new TCanvas("AliITSv11GeometrySPDFig0","",1000,1000); canvas.Range(-3.,-3.,3.,3.); txt.SetTextsize(0.05); txt.SetTextAlign(33); txt.SetTextColor(1); txt.Draw(2.9,2.9,"Section A-A outer Carbon Fiber surface"); txt.SetTextColor(2); txt.Draw(2.9,2.5,"Section A-A Inner Carbon Fiber surface"); txt.SetTextColor(3); txt.Draw(2.9,2.1,"Section E-E outer Carbon Fiber surface"); txt.SetTextColor(4); txt.Draw(2.9,1.7,"Section E-E Inner Carbon Fiber surface"); plA0.Draw(); plA1.Draw(); plB0.Draw(); plB1.Draw(); //pmA.Draw(); //pmB.Draw(); // Char_t chr[3]; for(i=0;i