2 //Author: Anders Strand Vestbo
3 //Author: Uli Frankenfeld
4 //Last Modified: 05.12.2000
6 #include "AliL3Logging.h"
7 #include "AliL3Transform.h"
10 //___________________________
13 // Transformation class for ALICE TPC.
15 ClassImp(AliL3Transform);
18 AliL3Transform::AliL3Transform(){
24 AliL3Transform::~AliL3Transform(){
27 void AliL3Transform::Init(){
35 fPadPitchWidthLow = 0.400000;
36 fPadPitchWidthUp = 0.600000;
37 fZWidth = 0.56599998474121093750;
38 fZSigma = 0.22880849748219134199;
43 fPi = 3.141592653589793;
45 for(Int_t i=0;i<36;i++){
46 fCos[i] = cos(fPi/9*i);
47 fSin[i] = sin(fPi/9*i);
50 for(Int_t i=0;i<36;i++){
51 fCos[i] = cos( (2*fPi/18) * (i+0.5) );
52 fSin[i] = sin( (2*fPi/18) * (i+0.5) );
55 fX[0] = 84.570007324218750;
56 fX[1] = 85.320007324218750;
57 fX[2] = 86.070007324218750;
58 fX[3] = 86.820007324218750;
59 fX[4] = 87.570007324218750;
60 fX[5] = 88.320007324218750;
61 fX[6] = 89.070007324218750;
62 fX[7] = 89.820007324218750;
63 fX[8] = 90.570007324218750;
64 fX[9] = 91.320007324218750;
65 fX[10] = 92.070007324218750;
66 fX[11] = 92.820007324218750;
67 fX[12] = 93.570007324218750;
68 fX[13] = 94.320007324218750;
69 fX[14] = 95.070007324218750;
70 fX[15] = 95.820007324218750;
71 fX[16] = 96.570007324218750;
72 fX[17] = 97.320007324218750;
73 fX[18] = 98.070007324218750;
74 fX[19] = 98.820007324218750;
75 fX[20] = 99.570007324218750;
76 fX[21] = 100.320007324218750;
77 fX[22] = 101.070007324218750;
78 fX[23] = 101.820007324218750;
79 fX[24] = 102.570007324218750;
80 fX[25] = 103.320007324218750;
81 fX[26] = 104.070007324218750;
82 fX[27] = 104.820007324218750;
83 fX[28] = 105.570007324218750;
84 fX[29] = 106.320007324218750;
85 fX[30] = 107.070007324218750;
86 fX[31] = 107.820007324218750;
87 fX[32] = 108.570007324218750;
88 fX[33] = 109.320007324218750;
89 fX[34] = 110.070007324218750;
90 fX[35] = 110.820007324218750;
91 fX[36] = 111.570007324218750;
92 fX[37] = 112.320007324218750;
93 fX[38] = 113.070007324218750;
94 fX[39] = 113.820007324218750;
95 fX[40] = 114.570007324218750;
96 fX[41] = 115.320007324218750;
97 fX[42] = 116.070007324218750;
98 fX[43] = 116.820007324218750;
99 fX[44] = 117.570007324218750;
100 fX[45] = 118.320007324218750;
101 fX[46] = 119.070007324218750;
102 fX[47] = 119.820007324218750;
103 fX[48] = 120.570007324218750;
104 fX[49] = 121.320007324218750;
105 fX[50] = 122.070007324218750;
106 fX[51] = 122.820007324218750;
107 fX[52] = 123.570007324218750;
108 fX[53] = 124.320007324218750;
109 fX[54] = 125.070007324218750;
110 fX[55] = 125.820007324218750;
111 fX[56] = 126.570007324218750;
112 fX[57] = 127.320007324218750;
113 fX[58] = 128.070007324218750;
114 fX[59] = 128.820007324218750;
115 fX[60] = 129.570007324218750;
116 fX[61] = 130.320007324218750;
117 fX[62] = 131.070007324218750;
118 fX[63] = 131.820007324218750;
119 fX[64] = 135.054992675781250;
120 fX[65] = 136.054992675781250;
121 fX[66] = 137.054992675781250;
122 fX[67] = 138.054992675781250;
123 fX[68] = 139.054992675781250;
124 fX[69] = 140.054992675781250;
125 fX[70] = 141.054992675781250;
126 fX[71] = 142.054992675781250;
127 fX[72] = 143.054992675781250;
128 fX[73] = 144.054992675781250;
129 fX[74] = 145.054992675781250;
130 fX[75] = 146.054992675781250;
131 fX[76] = 147.054992675781250;
132 fX[77] = 148.054992675781250;
133 fX[78] = 149.054992675781250;
134 fX[79] = 150.054992675781250;
135 fX[80] = 151.054992675781250;
136 fX[81] = 152.054992675781250;
137 fX[82] = 153.054992675781250;
138 fX[83] = 154.054992675781250;
139 fX[84] = 155.054992675781250;
140 fX[85] = 156.054992675781250;
141 fX[86] = 157.054992675781250;
142 fX[87] = 158.054992675781250;
143 fX[88] = 159.054992675781250;
144 fX[89] = 160.054992675781250;
145 fX[90] = 161.054992675781250;
146 fX[91] = 162.054992675781250;
147 fX[92] = 163.054992675781250;
148 fX[93] = 164.054992675781250;
149 fX[94] = 165.054992675781250;
150 fX[95] = 166.054992675781250;
151 fX[96] = 167.054992675781250;
152 fX[97] = 168.054992675781250;
153 fX[98] = 169.054992675781250;
154 fX[99] = 170.054992675781250;
155 fX[100] = 171.054992675781250;
156 fX[101] = 172.054992675781250;
157 fX[102] = 173.054992675781250;
158 fX[103] = 174.054992675781250;
159 fX[104] = 175.054992675781250;
160 fX[105] = 176.054992675781250;
161 fX[106] = 177.054992675781250;
162 fX[107] = 178.054992675781250;
163 fX[108] = 179.054992675781250;
164 fX[109] = 180.054992675781250;
165 fX[110] = 181.054992675781250;
166 fX[111] = 182.054992675781250;
167 fX[112] = 183.054992675781250;
168 fX[113] = 184.054992675781250;
169 fX[114] = 185.054992675781250;
170 fX[115] = 186.054992675781250;
171 fX[116] = 187.054992675781250;
172 fX[117] = 188.054992675781250;
173 fX[118] = 189.054992675781250;
174 fX[119] = 190.054992675781250;
175 fX[120] = 191.054992675781250;
176 fX[121] = 192.054992675781250;
177 fX[122] = 193.054992675781250;
178 fX[123] = 194.054992675781250;
179 fX[124] = 195.054992675781250;
180 fX[125] = 196.054992675781250;
181 fX[126] = 197.054992675781250;
182 fX[127] = 198.054992675781250;
183 fX[128] = 199.054992675781250;
184 fX[129] = 200.054992675781250;
185 fX[130] = 201.054992675781250;
186 fX[131] = 202.054992675781250;
187 fX[132] = 203.054992675781250;
188 fX[133] = 204.054992675781250;
189 fX[134] = 205.054992675781250;
190 fX[135] = 206.054992675781250;
191 fX[136] = 207.054992675781250;
192 fX[137] = 208.054992675781250;
193 fX[138] = 209.054992675781250;
194 fX[139] = 210.054992675781250;
195 fX[140] = 211.054992675781250;
196 fX[141] = 212.054992675781250;
197 fX[142] = 213.054992675781250;
198 fX[143] = 214.054992675781250;
199 fX[144] = 215.054992675781250;
200 fX[145] = 216.054992675781250;
201 fX[146] = 217.054992675781250;
202 fX[147] = 218.054992675781250;
203 fX[148] = 219.054992675781250;
204 fX[149] = 220.054992675781250;
205 fX[150] = 221.054992675781250;
206 fX[151] = 222.054992675781250;
207 fX[152] = 223.054992675781250;
208 fX[153] = 224.054992675781250;
209 fX[154] = 225.054992675781250;
210 fX[155] = 226.054992675781250;
211 fX[156] = 227.054992675781250;
212 fX[157] = 228.054992675781250;
213 fX[158] = 229.054992675781250;
214 fX[159] = 230.054992675781250;
215 fX[160] = 231.054992675781250;
216 fX[161] = 232.054992675781250;
217 fX[162] = 233.054992675781250;
218 fX[163] = 234.054992675781250;
219 fX[164] = 235.054992675781250;
220 fX[165] = 236.054992675781250;
221 fX[166] = 237.054992675781250;
222 fX[167] = 238.054992675781250;
223 fX[168] = 239.054992675781250;
224 fX[169] = 240.054992675781250;
225 fX[170] = 241.054992675781250;
226 fX[171] = 242.054992675781250;
227 fX[172] = 243.054992675781250;
228 fX[173] = 244.054992675781250;
229 fX[174] = 245.054992675781250;
230 fX[175] = 246.054992675781250;
409 Double_t AliL3Transform::GetEta(Float_t *xyz)
411 Double_t r3 = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]+xyz[2]*xyz[2]);
412 Double_t eta = 0.5 * log((r3+xyz[2])/(r3-xyz[2]));
416 Double_t AliL3Transform::GetPhi(Float_t *xyz)
419 Double_t phi = atan2(xyz[1],xyz[0]);
420 //if(phi<0) phi=phi+2*TMath::Pi();
425 Bool_t AliL3Transform::Slice2Sector(Int_t slice, Int_t slicerow, Int_t & sector, Int_t &row) const{
426 if(slicerow<0&&slicerow>=fNRow) return kFALSE;
427 if(slice<0||slice>=fNSlice) return kFALSE;
429 if(slicerow<fNRowLow){
434 sector = slice+fNSlice;
435 row = slicerow-fNRowLow;
440 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t sector) const{
441 if(sector<0||sector>=fNSector) return kFALSE;
442 if(sector<fNSectorLow) slice = sector;
443 else slice = sector - fNSectorLow;
447 Bool_t AliL3Transform::Sector2Slice(Int_t & slice, Int_t & slicerow,Int_t sector, Int_t row) const{
448 if(sector<0||sector>=fNSector||row<0) return kFALSE;
449 if(sector<fNSectorLow){
450 if(row>=fNRowLow) return kFALSE;
455 if(row>=fNRowUp) return kFALSE;
456 slice = sector - fNSectorLow;
457 slicerow = row + fNRowLow;
462 Double_t AliL3Transform::Row2X(Int_t slicerow){
463 if(slicerow<0||slicerow>=fNRow) return 0;
467 void AliL3Transform::Local2Global(Float_t *xyz,Int_t slice)
469 //Transformation to global coordinate system
477 xyz[2]=xyz[2];//global z=local z
480 void AliL3Transform::Local2GlobalAngle(Float_t *angle,Int_t slice){
481 angle[0] = fmod(angle[0]+(slice+0.5)*(2*fPi/18),2*fPi);
484 void AliL3Transform::Global2LocalAngle(Float_t *angle,Int_t slice){
485 angle[0] = angle[0]-(slice+0.5)*(2*fPi/18);
486 if(angle[0]<0) angle[0]+=2*fPi;
489 void AliL3Transform::Raw2Local(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
491 //Transformation from rawdata to local coordinate system
493 Int_t slice,slicerow;
494 Sector2Slice(slice, slicerow, sector, row);
496 xyz[0]=Row2X(slicerow);
497 Int_t npads= fNPads[slicerow];
498 if(sector<fNSectorLow)
499 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthLow;
501 xyz[1]=(pad-0.5*(npads-1))*fPadPitchWidthUp;
502 xyz[2]=fZWidth*time-3.*fZSigma;
504 Int_t nis=fNSectorLow;
505 Int_t nos=fNSectorUp;
507 if((sector<nis)/2 || ((sector-nis)<nos/2)) sign=1;
508 xyz[2]=sign*(250.-xyz[2]);
512 void AliL3Transform::Local2Global(Float_t *xyz,Int_t sector,Int_t row)
514 //Transformation to global coordinate system
515 Int_t slice,slicerow;
516 Sector2Slice(slice, slicerow, sector, row);
517 Float_t r=Row2X(slicerow);
518 Float_t cs = fCos[slice];
519 Float_t sn = fSin[slice];
521 xyz[0]=r*cs-xyz[1]*sn;
522 xyz[1]=r*sn+xyz[1]*cs;
523 xyz[2]=xyz[2];//global z=local z
526 Double_t AliL3Transform::GetMaxY(Int_t slicerow)
529 if(slicerow < fNRowLow)
530 return fPadPitchWidthLow*fNPads[slicerow]/2;
533 return fPadPitchWidthUp*fNPads[slicerow]/2;
536 void AliL3Transform::Global2Local(Float_t *xyz,Int_t sector)
539 Sector2Slice(slice, sector);
540 Float_t cs = fCos[slice];
541 Float_t sn = fSin[slice];
542 Float_t x1 = xyz[0]*cs + xyz[1]*sn;
543 Float_t y1 = -xyz[0]*sn + xyz[1]*cs;
548 void AliL3Transform::Raw2Global(Float_t *xyz,Int_t sector,Int_t row,Float_t pad,Float_t time)
550 //Transformation from raw to global coordinates
552 Raw2Local(xyz,sector,row,pad,time);
553 Local2Global(xyz,sector,row);
556 void AliL3Transform::Local2Raw(Float_t *xyz,Int_t sector,Int_t row)
558 //Transformation from local coordinates to raw
560 Int_t slice,slicerow;
561 Sector2Slice(slice, slicerow, sector, row);
563 if(sector<fNSectorLow)
564 xyz[1]=xyz[1]/fPadPitchWidthLow+0.5*(fNPads[slicerow]-1);
566 xyz[1]=xyz[1]/fPadPitchWidthUp+0.5*(fNPads[slicerow]-1);
568 Int_t nis=fNSectorLow;
569 Int_t nos=fNSectorUp;
571 if ((sector<nis/2) || ((sector-nis)<nos/2)) sign=1;
572 xyz[2]=250-sign*xyz[2];
573 xyz[2]=(xyz[2]+3.*fZSigma)/fZWidth;
576 void AliL3Transform::Global2Raw(Float_t *xyz,Int_t sector,Int_t row)
578 //Transformation from global coordinates to raw.
580 Global2Local(xyz,sector);
581 Local2Raw(xyz,sector,row);