]>
Commit | Line | Data |
---|---|---|
b705c75b | 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.so"); | |
25 | gSystem->Load("libITSUpgradeSim.so"); | |
9e308fde | 26 | // |
b705c75b | 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; | |
9e308fde | 33 | const int kNCol = 1500; |
b705c75b | 34 | const double kLrThick03 = 120e-4; // -> effective thickness for ~0.3%X layers |
35 | const double kLrThick08 = 600e-4; // -> effective thickness for ~0.8%X layers | |
36 | // | |
37 | const double kReadOutEdge = 0.2; // width of the readout edge (passive bottom) | |
38 | const double kGuardRing = 50e-4; // width of passive area on left/right/top of the sensor | |
39 | // | |
40 | const int kNLr = 7; | |
41 | const int kNLrInner = 3; | |
42 | const int kBuildLevel = 3; | |
43 | enum {kRmn,kRmd,kRmx,kNModPerStave,kPhi0,kNStave,kNPar}; | |
44 | // Radii are from last TDR (ALICE-TDR-017.pdf Tab. 1.1, rMid is mean value) | |
45 | const double tdr5dat[kNLr][kNPar] = { | |
9e308fde | 46 | {2.24, 2.34, 2.67, 9., 16.37, 12}, // for each inner layer: rMin,rMid,rMax,NChip/Stave, phi0, nStaves |
b705c75b | 47 | {3.01, 3.15, 3.46, 9., 12.03, 16}, |
48 | {3.78, 3.93, 4.21, 9., 10.02, 20}, | |
9e308fde | 49 | {-1, 19.6 , -1, 4., 0. , 24}, // for others: -, rMid, -, NMod/HStave, phi0, nStaves // 24 was 49 |
b705c75b | 50 | {-1, 24.55, -1, 4., 0. , 30}, // 30 was 61 |
51 | {-1, 34.39, -1, 7., 0. , 42}, // 42 was 88 | |
52 | {-1, 39.34, -1, 7., 0. , 48} // 48 was 100 | |
53 | }; | |
9e308fde | 54 | const int nChipsPerModule = 7; // For OB: how many chips in a row |
b705c75b | 55 | |
56 | // create segmentations: | |
57 | AliITSUSegmentationPix* seg0 = new AliITSUSegmentationPix(0, // segID (0:9) | |
9e308fde | 58 | 1, // chips per module |
59 | kNCol, // ncols (total for module) | |
b705c75b | 60 | kNRow, // nrows |
61 | kPitchX, // default row pitch in cm | |
62 | kPitchZ, // default col pitch in cm | |
63 | kSensThick, // sensor thickness in cm | |
64 | -1, // no special left col between chips | |
65 | -1, // no special right col between chips | |
66 | kGuardRing, // left | |
67 | kGuardRing, // right | |
68 | kGuardRing, // top | |
69 | kReadOutEdge // bottom | |
70 | ); // see AliITSUSegmentationPix.h for extra options | |
71 | seg0->Store(AliITSUGeomTGeo::GetITSsegmentationFileName()); | |
72 | // | |
b705c75b | 73 | seg0->Print(); |
b705c75b | 74 | // |
9e308fde | 75 | double dzLr,rLr,phi0,turbo; |
b705c75b | 76 | int nStaveLr,nModPerStaveLr,idLr; |
9e308fde | 77 | // |
78 | AliITSUv1 *ITS = new AliITSUv1("ITS Upgrade",kNLr); | |
b705c75b | 79 | ITS->SetStaveModelIB(AliITSUv1::kIBModel22); |
80 | ITS->SetStaveModelOB(AliITSUv1::kOBModel1); | |
81 | // | |
82 | const int kNWrapVol = 3; | |
83 | const double wrpRMin[kNWrapVol] = { 2.1, 15.0, 32.0}; | |
51907e19 | 84 | const double wrpRMax[kNWrapVol] = { 7.0, 27.0+2.5, 43.0+1.5}; |
9e308fde | 85 | const double wrpZSpan[kNWrapVol] = {28.0, 86.0, 150.0}; |
86 | // | |
b705c75b | 87 | ITS->SetNWrapVolumes(kNWrapVol); // define wrapper volumes for layers |
88 | for (int iw=0;iw<kNWrapVol;iw++) ITS->DefineWrapVolume(iw,wrpRMin[iw],wrpRMax[iw],wrpZSpan[iw]); | |
89 | // | |
90 | for (int idLr=0;idLr<kNLr;idLr++) { | |
91 | rLr = tdr5dat[idLr][kRmd]; | |
92 | phi0 = tdr5dat[idLr][kPhi0]; | |
9e308fde | 93 | // |
b705c75b | 94 | nStaveLr = TMath::Nint(tdr5dat[idLr][kNStave]); |
b705c75b | 95 | nModPerStaveLr = TMath::Nint(tdr5dat[idLr][kNModPerStave]); |
96 | int nChipsPerStaveLr = nModPerStaveLr; | |
9e308fde | 97 | // |
b705c75b | 98 | if (idLr>=kNLrInner) { |
99 | nChipsPerStaveLr *= nChipsPerModule; | |
9e308fde | 100 | ITS->DefineLayer(idLr, phi0, rLr, nChipsPerStaveLr*seg0->Dz(), nStaveLr, nModPerStaveLr, |
101 | kLrThick03, seg0->Dy(), seg0->GetChipTypeID(),kBuildLevel); | |
102 | // printf("Add Lr%d: R=%6.2f DZ:%6.2f Staves:%3d NMod/Stave:%3d\n", | |
103 | // idLr,rLr,nChipsPerStaveLr*seg0->Dz(),nStaveLr,nModPerStaveLr); | |
b705c75b | 104 | } else { |
9e308fde | 105 | turbo = -radii2Turbo(tdr5dat[idLr][kRmn],rLr,tdr5dat[idLr][kRmx],seg0->Dx()); |
106 | ITS->DefineLayerTurbo(idLr, phi0, rLr, nChipsPerStaveLr*seg0->Dz(), nStaveLr, nChipsPerStaveLr, | |
107 | seg0->Dx(), turbo, kLrThick08, seg0->Dy(), seg0->GetChipTypeID()); | |
108 | // printf("Add Lr%d: R=%6.2f DZ:%6.2f Turbo:%+6.2f Staves:%3d NMod/Stave:%3d\n", | |
109 | // idLr,rLr,nChipsPerStaveLr*seg0->Dz(),turbo,nStaveLr,nModPerStaveLr); | |
b705c75b | 110 | } |
111 | // | |
112 | } | |
113 | // | |
114 | } |