change for rectangular geometry
[u/mrichter/AliRoot.git] / PMD / AliPMDUtility.cxx
1 //-----------------------------------------------------//
2 //                                                     //
3 //                                                     //
4 //  Date   : August 05 2003                            //
5 //                                                     //
6 //  Utility code for ALICE-PMD                         //
7 //                                                     //
8 //-----------------------------------------------------//
9
10 #include "AliPMDUtility.h"
11 #include "TMath.h"
12 #include <stdio.h>
13
14 ClassImp(AliPMDUtility)
15
16 AliPMDUtility::AliPMDUtility()
17 {
18   fPx    = 0.;
19   fPy    = 0.;
20   fPz    = 0.;
21   fTheta = 0.;
22   fEta   = 0.;
23   fPhi   = 0.;
24 }
25
26 AliPMDUtility::AliPMDUtility(Float_t Px, Float_t Py, Float_t Pz)
27 {
28   fPx = Px;
29   fPy = Py;
30   fPz = Pz;
31   fTheta = 0.;
32   fEta   = 0.;
33   fPhi   = 0.;
34 }
35
36 AliPMDUtility::~AliPMDUtility()
37 {
38
39 }
40 void AliPMDUtility::HexGeomCellPos(Int_t ism, Int_t xpad, Int_t ypad, Float_t &xpos, Float_t &ypos)
41 {
42
43   Int_t j = xpad;
44   Int_t k = ypad;
45
46   // Supermodeule number starting from 0
47
48   /*
49     This converts PMD cluster or CELL coordinates
50     to Global coordinates.
51     Written by Prof. S.C. Phatak
52   */
53
54   Int_t i;
55   Float_t celldia = 0.5;
56   const Float_t pi = 3.14159;
57   const double sqrth=0.8660254;  // sqrth = sqrt(3.)/2.
58   /*
59     ism --> supermodule no ( 0 - 26 )
60     idet --> detector ( pmd or cpv : not required now )
61     j --> xpad ( goes from 1 to 72 )
62     k --> ypad ( goes from 1 to 72 )
63     xp --> global x coordinate
64     yp --> global y coordinate
65     
66     (xp0,yp0) corner positions of all supermodules in global
67     coordinate system. That is the origin
68     of the local ( supermodule ) coordinate system.
69 */ 
70   
71   Float_t xp0[27] = 
72   {
73     -17.9084, 18.2166, 54.3416, -35.9709, 0.154144, 
74     36.2791, -54.0334, -17.9084, 18.2166, 36.7791, 
75     18.7166, 0.654194, 72.9041, 54.8416, 36.7792, 
76     109.029, 90.9666, 72.9042, -18.8708, -36.9334, 
77     -54.996, -36.9332, -54.9958, -73.0584, -54.9956, 
78     -73.0582, -91.1208
79   };
80
81   Float_t yp0[27] = 
82   {
83     -32.1395, -32.1395, -32.1395, -63.4247, -63.4247, 
84     -63.4247, -94.7098, -94.7098, -94.7098, 0.545689, 
85     31.8309, 63.1161, 0.545632, 31.8308, 63.116, 
86     0.545573, 31.8308, 63.116, 31.5737, 0.288616, 
87     -30.9965, 62.859, 31.5738, 0.288733, 94.1442, 
88     62.8591, 31.574
89   };
90
91   /* 
92      angles of rotation for three sets of supermodules
93      The angle is same for first nine, next nine and last nine 
94      supermodules 
95   */
96   
97   Float_t th[3] = {0., -2.*pi/3., 2.*pi/3.};
98   Float_t xr, yr, xinit, yinit, cs, sn;
99   
100   /* 
101      xinit and yinit are coordinates of the cell in local coordinate system
102   */
103   
104   xinit = (j)*celldia+(k)/2.*celldia;
105   yinit = sqrth*(k)/2.;
106   i=ism/9;
107   cs=cos(th[i]);
108   sn=sin(th[i]);
109   //
110   // rotate first
111   //
112   xr=cs*xinit+sn*yinit;
113   yr=-sn*xinit+cs*yinit;
114   //
115   // then translate
116   //
117   xpos=xr+xp0[ism];
118   ypos=yr+yp0[ism];
119
120 }
121
122 void AliPMDUtility::RectGeomCellPos(Int_t ism, Int_t ium, Int_t xpad, Int_t ypad, Float_t &xpos, Float_t &ypos)
123 {
124   // This routine finds the cell eta,phi for the new PMD rectangular 
125   // geometry in ALICE
126   // Authors : Bedanga Mohanty and Dipak Mishra - 29.4.2003
127   // modified by B. K. Nnadi for change of coordinate sys
128   //
129   // SMA  ---> Supermodule Type A           ( SM - 0)
130   // SMAR ---> Supermodule Type A ROTATED   ( SM - 1)
131   // SMB  ---> Supermodule Type B           ( SM - 2)
132   // SMBR ---> Supermodule Type B ROTATED   ( SM - 3)
133   //
134   // ism   : number of supermodules in one plane = 4
135   // ium   : number of unitmodules  in one SM    = 6
136   // gb_um : (global) unit module numbering in a supermodule
137   //
138
139   Int_t gb_um = ism*6 + ium;
140   Int_t irow  = xpad;
141   Int_t icol  = ypad;
142
143   // Corner positions (x,y) of the 24 unit moudles in ALICE PMD
144   
145   double xcorner[24] =
146   {
147     85.15,  60.85,  36.55,  85.15,  60.85,  36.55, //SMA 
148     -85.15, -60.85, -36.55, -85.15, -60.85, -36.55, //SMAR
149     84.90,  36.60,  84.90,  36.60,  84.90,  36.60, //SMB
150     -84.90, -36.60, -84.90, -36.60, -84.90, -36.60  //SMBR
151   };
152   
153   double ycorner[24] =
154   { 
155     32.45708755,  32.45708755,  32.45708755,        //SMA
156     -9.30645245,  -9.30645245,  -9.30645245,        //SMA
157     -32.45708755, -32.45708755, -32.45708755,        //SMAR
158     9.30645245,   9.30645245,   9.30645245,        //SMAR
159     -31.63540818, -31.63540818, -52.61435544,        //SMB
160     -52.61435544, -73.59330270, -73.59330270,        //SMB
161     31.63540818,  31.63540818,  52.61435544,        //SMBR
162     52.61435544,  73.59330270,  73.59330270         //SMBR
163   };
164   
165   const Float_t root_3      = 1.73205;  // sqrt(3.);
166   const Float_t cell_radius = 0.25;
167   
168   //
169   //Every even row of cells is shifted and placed
170   //in geant so this condition
171   //
172   Float_t shift;
173   if(irow%2 == 0)
174     {
175       shift = 0.25;
176     }
177   else
178     {
179       shift = 0.0;
180     }
181   if(ism == 0 || ism == 2)
182     {
183       ypos = ycorner[gb_um] + 
184         irow*cell_radius*root_3;
185
186       xpos = xcorner[gb_um] - 
187         icol*2.0*cell_radius - shift;
188     }
189   else if(ism == 1 || ism == 3)
190     {
191       ypos = ycorner[gb_um] -
192         irow*cell_radius*root_3;
193
194       xpos = xcorner[gb_um] +
195         icol*2.0*cell_radius + shift;
196     }
197 }
198
199 void AliPMDUtility::SetPxPyPz(Float_t Px, Float_t Py, Float_t Pz)
200 {
201   fPx = Px;
202   fPy = Py;
203   fPz = Pz;
204 }
205
206 void AliPMDUtility::SetXYZ(Float_t xPos, Float_t yPos, Float_t zPos)
207 {
208   fPx = xPos;
209   fPy = yPos;
210   fPz = zPos;
211 }
212 void AliPMDUtility::CalculateEta()
213 {
214   Float_t rpxpy, theta, eta;
215
216   rpxpy  = TMath::Sqrt(fPx*fPx + fPy*fPy);
217   theta  = TMath::ATan2(rpxpy,fPz);
218   eta    = -TMath::Log(TMath::Tan(0.5*theta));
219   fTheta = theta;
220   fEta   = eta;
221 }
222 void AliPMDUtility::CalculatePhi()
223 {
224   Float_t pybypx, phi = 0., phi1;
225
226   if(fPx==0)
227     {
228       if(fPy>0) phi = 90.;
229       if(fPy<0) phi = 270.;
230     }
231   if(fPx != 0)
232     {
233       pybypx = fPy/fPx;
234       if(pybypx < 0) pybypx = - pybypx;
235       phi1 = TMath::ATan(pybypx)*180./3.14159;
236
237       if(fPx > 0 && fPy > 0) phi = phi1;        // 1st Quadrant
238       if(fPx < 0 && fPy > 0) phi = 180 - phi1;  // 2nd Quadrant
239       if(fPx < 0 && fPy < 0) phi = 180 + phi1;  // 3rd Quadrant
240       if(fPx > 0 && fPy < 0) phi = 360 - phi1;  // 4th Quadrant
241
242     }
243   phi = phi*3.14159/180.;
244
245   fPhi = phi;
246
247 }
248 void AliPMDUtility::CalculateEtaPhi()
249 {
250   Float_t rpxpy, theta, eta;
251   Float_t pybypx, phi = 0., phi1;
252
253   rpxpy = TMath::Sqrt(fPx*fPx + fPy*fPy);
254   theta = TMath::ATan2(rpxpy,fPz);
255   eta   = -TMath::Log(TMath::Tan(0.5*theta));
256   
257   if(fPx==0)
258     {
259       if(fPy>0) phi = 90.;
260       if(fPy<0) phi = 270.;
261     }
262   if(fPx != 0)
263     {
264       pybypx = fPy/fPx;
265       if(pybypx < 0) pybypx = - pybypx;
266       phi1 = TMath::ATan(pybypx)*180./3.14159;
267       if(fPx > 0 && fPy > 0) phi = phi1;        // 1st Quadrant
268       if(fPx < 0 && fPy > 0) phi = 180 - phi1;  // 2nd Quadrant
269       if(fPx < 0 && fPy < 0) phi = 180 + phi1;  // 3rd Quadrant
270       if(fPx > 0 && fPy < 0) phi = 360 - phi1;  // 4th Quadrant
271
272     }
273   phi = phi*3.14159/180.;
274
275   fTheta = theta;
276   fEta   = eta;
277   fPhi   = phi;
278 }
279 Float_t AliPMDUtility::GetTheta() const
280 {
281   return fTheta;
282 }
283 Float_t AliPMDUtility::GetEta() const
284 {
285   return fEta;
286 }
287 Float_t AliPMDUtility::GetPhi() const
288 {
289   return fPhi;
290 }
291