]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/UPGRADE/testITSUv1/CreateITSUv1.C
.so cleanup: removed from gSystem->Load()
[u/mrichter/AliRoot.git] / ITS / UPGRADE / testITSUv1 / CreateITSUv1.C
1 #if !defined(__CINT__) || defined(__MAKECINT__)
2 #include <TSystem.h>
3 #include <TMath.h>
4 #endif
5
6 //---------------------------------------
7 double radii2Turbo(double rMin,double rMid,double rMax, double sensW)
8 {
9   // compute turbo angle from radii and sensor width
10   return TMath::ASin((rMax*rMax-rMin*rMin)/(2*rMid*sensW))*TMath::RadToDeg();
11 }
12
13 double radii2Phi(double rMin,double rMid,double rMax, double sensW)
14 {
15   // compute phi coverage
16   return 2*TMath::ACos((rMax+rMin)*
17                        (rMid*rMid+rMin*rMax-sensW*sensW/4.)/
18                        (4.*rMid*rMax*rMin));
19 }
20
21 void CreateITSUv1()
22 {
23   //
24   gSystem->Load("libITSUpgradeBase");
25   gSystem->Load("libITSUpgradeSim");
26   //
27   // build ITS upgrade detector
28   // sensitive area 13x15mm (X,Z) with 20x20 micron pitch, 2mm dead zone on readout side and 50 micron guardring
29   const double kSensThick = 18e-4;
30   const double kPitchX = 20e-4;
31   const double kPitchZ = 20e-4;
32   const int    kNRow   = 650; 
33   const int    kNCol   = 1500;
34   const double kSiThickIB = 50e-4;
35   const double kSiThickOB = 50e-4;
36   //  const double kSensThick = 120e-4;   // -> sensor Si thickness
37   //
38   const double kReadOutEdge = 0.2;   // width of the readout edge (passive bottom)
39   const double kGuardRing   = 50e-4; // width of passive area on left/right/top of the sensor
40   //
41   const int kNLr = 7;
42   const int kNLrInner = 3;
43   const int kBuildLevel = 0;
44   enum {kRmn,kRmd,kRmx,kNModPerStave,kPhi0,kNStave,kNPar};
45   // Radii are from last TDR (ALICE-TDR-017.pdf Tab. 1.1, rMid is mean value)
46   const double tdr5dat[kNLr][kNPar] = { 
47     {2.24, 2.34, 2.67,  9., 16.37, 12}, // for each inner layer: rMin,rMid,rMax,NChip/Stave, phi0, nStaves
48     {3.01, 3.15, 3.46,  9., 12.03, 16},
49     {3.78, 3.93, 4.21,  9., 10.02, 20},
50     {-1,  19.6 ,   -1,  4.,  0.  , 24},  // for others: -, rMid, -, NMod/HStave, phi0, nStaves // 24 was 49
51     {-1,  24.55, -1,    4.,  0.  , 30},  // 30 was 61
52     {-1,  34.39, -1,    7.,  0.  , 42},  // 42 was 88
53     {-1,  39.34, -1,    7.,  0.  , 48}   // 48 was 100
54   };
55   const int nChipsPerModule = 7; // For OB: how many chips in a row
56
57   // create segmentations:
58   AliITSUSegmentationPix* seg0 = new AliITSUSegmentationPix(0,        // segID (0:9)
59                                                             1,  // chips per module
60                                                             kNCol,    // ncols (total for module)
61                                                             kNRow,    // nrows
62                                                             kPitchX,  // default row pitch in cm
63                                                             kPitchZ,  // default col pitch in cm
64                                                             kSensThick,  // sensor thickness in cm
65                                                             -1,     // no special left col between chips
66                                                             -1,     // no special right col between chips
67                                                             kGuardRing, // left
68                                                             kGuardRing, // right
69                                                             kGuardRing, // top
70                                                             kReadOutEdge  // bottom
71                                                             );    // see AliITSUSegmentationPix.h for extra options
72   seg0->Store(AliITSUGeomTGeo::GetITSsegmentationFileName());
73   //
74   seg0->Print();
75   //
76   double dzLr,rLr,phi0,turbo;
77   int nStaveLr,nModPerStaveLr,idLr;
78   //
79   AliITSUv1 *ITS  = new AliITSUv1("ITS Upgrade",kNLr);
80   ITS->SetStaveModelIB(AliITSUv1::kIBModel4);
81   ITS->SetStaveModelOB(AliITSUv1::kOBModel2);
82   //
83   const int kNWrapVol = 3;
84   const double wrpRMin[kNWrapVol]  = { 2.1, 15.0, 32.0};
85   const double wrpRMax[kNWrapVol]  = { 7.0, 27.0+2.5, 43.0+1.5};
86   const double wrpZSpan[kNWrapVol] = {28.0, 86.0, 150.0};
87   //
88   ITS->SetNWrapVolumes(kNWrapVol); // define wrapper volumes for layers
89   for (int iw=0;iw<kNWrapVol;iw++) ITS->DefineWrapVolume(iw,wrpRMin[iw],wrpRMax[iw],wrpZSpan[iw]);
90   //
91   for (int idLr=0;idLr<kNLr;idLr++) {
92     rLr   = tdr5dat[idLr][kRmd];
93     phi0  = tdr5dat[idLr][kPhi0]; 
94     //
95     nStaveLr = TMath::Nint(tdr5dat[idLr][kNStave]);
96     nModPerStaveLr =  TMath::Nint(tdr5dat[idLr][kNModPerStave]);
97     int nChipsPerStaveLr = nModPerStaveLr;
98     //
99     if (idLr>=kNLrInner) {
100       nChipsPerStaveLr *= nChipsPerModule;
101       ITS->DefineLayer(idLr, phi0, rLr, nChipsPerStaveLr*seg0->Dz(), nStaveLr, nModPerStaveLr, 
102                        kSiThickOB, seg0->Dy(), seg0->GetChipTypeID(),kBuildLevel);
103       //      printf("Add Lr%d: R=%6.2f DZ:%6.2f Staves:%3d NMod/Stave:%3d\n",
104       //             idLr,rLr,nChipsPerStaveLr*seg0->Dz(),nStaveLr,nModPerStaveLr);
105     } else {
106       turbo = -radii2Turbo(tdr5dat[idLr][kRmn],rLr,tdr5dat[idLr][kRmx],seg0->Dx());     
107       ITS->DefineLayerTurbo(idLr, phi0, rLr, nChipsPerStaveLr*seg0->Dz(), nStaveLr, nChipsPerStaveLr, 
108                             seg0->Dx(), turbo, kSiThickIB, seg0->Dy(), seg0->GetChipTypeID(),kBuildLevel);
109       //      printf("Add Lr%d: R=%6.2f DZ:%6.2f Turbo:%+6.2f Staves:%3d NMod/Stave:%3d\n",
110       //             idLr,rLr,nChipsPerStaveLr*seg0->Dz(),turbo,nStaveLr,nModPerStaveLr);
111     }
112     //
113   }
114   //  
115 }