]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TPC/AliTPCmapper.cxx
e56c9446cfc152fba8789dbf365bae7eb551f2d2
[u/mrichter/AliRoot.git] / TPC / AliTPCmapper.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 //-------------------------------------------------------------------------
17 //           AliTPCmapper
18 //  Origin: Jens Wiechula    (j.wiechula@gsi.de)
19 //
20 //  class to map (row,pad,sector) to (RCU, Branch, FEC, Altro, Altro channel)
21 //  create Altro address 
22
23
24 #include <stdio.h>
25 #include <TMath.h>
26 #include <TSystem.h>
27
28 #include "AliTPCmapper.h"
29
30
31 ClassImp(AliTPCmapper)
32
33
34 //______________________________________________________________
35 AliTPCmapper::AliTPCmapper()
36 {
37     Init();
38     ReadMapping();
39 }
40
41 //______________________________________________________________
42 void AliTPCmapper::Init()
43 {
44
45     //Initialize arrays
46     for (Int_t i=0; i<kNrcu; i++){
47         for (Int_t j=0; j<kNbranch; j++){
48             for (Int_t k=0; k<kNfecMax; k++){
49                 for (Int_t l=0; l<kNaltro; l++){
50                     for (Int_t m=0; m<kNchannel; m++){
51                         fAddressToRow[i][j][k][l][m] = -1;
52                         fAddressToPad[i][j][k][l][m] = -1;
53                     }
54                 }
55             }
56         }
57     }
58
59     for (Int_t i=0; i<kNpadrow; i++){
60         for (Int_t j=0; j<kNpadMax; j++){
61             fRowPadToRCU[i][j] = -1;
62             fRowPadToBranch[i][j] = -1;
63             fRowPadToFEC[i][j] = -1;
64             fRowPadToAltro[i][j] = -1;
65             fRowPadToChannel[i][j] = -1;
66             fRowPadToPadsec[i][j] = -1;
67         }
68     }
69
70     for (Int_t i=0; i<kNpadSector; i++){
71         fPadsecToRow[i]=-1;
72         fPadsecToPad[i]=-1;
73     }
74
75 //    for (Int_t i=0; i<kNaddrSize; i++)
76 //        fAddressArray[i] = 0;
77
78     strcpy(fMapfileName,gSystem->ExpandPathName("$ALICE_ROOT/TPC/final_mapping.txt"));
79 }
80
81 //______________________________________________________________
82 Int_t AliTPCmapper::ReadMapping()
83 {
84     FILE *fin;
85     char line[255];
86
87     int pad = -1, row = -1;
88     int rcu = -1, bra = -1, fec = -1, alt = -1, chn = -1;
89     int padsec = 0;
90
91
92     fin = fopen(fMapfileName,"r");
93     if (!fin){
94         fprintf(stderr, "cannot open file '%s'!\n",fMapfileName);
95         return 1;
96     }
97
98     fgets(line,256,fin);
99     while (sscanf(line,"%d %d %d %d %d %d %d %d",
100                   &padsec, &row, &pad,
101                   &rcu, &bra, &fec, &alt, &chn
102                  )!=8){
103         fgets(line, 256, fin);
104         fprintf(stderr,"%s",line);
105     }
106
107     while (!feof(fin)){
108         sscanf(line,"%d %d %d %d %d %d %d %d",
109                &padsec, &row, &pad,
110                &rcu, &bra, &fec, &alt, &chn
111               );
112         fAddressToRow[rcu][bra][fec][alt][chn] = row;
113         fAddressToPad[rcu][bra][fec][alt][chn] = pad;
114
115         fRowPadToRCU[row][pad]     = rcu;
116         fRowPadToBranch[row][pad]  = bra;
117         fRowPadToFEC[row][pad]     = fec;
118         fRowPadToAltro[row][pad]   = alt;
119         fRowPadToChannel[row][pad] = chn;
120         fRowPadToPadsec[row][pad]  = padsec;
121
122         fPadsecToRow[padsec]        = row;
123         fPadsecToPad[padsec]        = pad;
124
125
126
127         fgets(line, 256, fin);
128     }
129
130     fclose(fin);
131
132     return 0;
133 }
134
135 //______________________________________________________________
136 void AliTPCmapper::PrintRBFACinfo(Int_t row, Int_t pad)
137 {
138     fprintf(stderr,"RCU: %d, Branch: %d, FEC: %2d, Altro: %d, Channel: %2d\n",
139             GetRCUs(row,pad), GetBranchS(row,pad),
140             GetFECs(row,pad), GetAltroS(row,pad),
141             GetChannelS(row,pad));
142
143 }
144
145 //______________________________________________________________
146 Int_t AliTPCmapper::GetPadsInRowS(Int_t row) const{
147   //
148   //GetPadsInRowS
149   //
150     if ( row == 0 )
151         return 68;
152
153     if ( row < 63 )
154         return 2*(Int_t)(row/3.+33.67);
155
156     row -= 63;
157     Double_t k1=10./6.*tan(TMath::Pi()/18.);
158
159     if ( row < 64 )
160         return 2*(Int_t)(k1 * row + 37.75);
161
162     Double_t k2=15./6.*tan(TMath::Pi()/18.);
163     return 2*(Int_t)(k2 * (row-64) + 56.66);
164 }
165
166 //______________________________________________________________
167 Double_t AliTPCmapper::GetPadXlocalS(Int_t row, Int_t pad) const {
168   //
169   //GetPadXlocalS
170   //
171     if ( row < 63 ) //IROC
172         return (852.25 + 7.5 * (Double_t)row)*1.e-1; //divide by 10 to get cm
173
174     row -= 63;
175
176     if ( row < 64 ) //OROC inner part
177         return (10.* row + 1351.)*1.e-1;  //divide by 10 to get cm
178
179
180     //OROC outer part
181     return (15.*(row - 64) + 1993.5)*1.e-1;  //divide by 10 to get cm
182 }
183
184 //______________________________________________________________
185 Double_t AliTPCmapper::GetPadXlocalS(Int_t padsector) const{
186   //
187   //GetPadXlocalS
188   //
189     Int_t row=GetRowFromPadSector(padsector);
190     Int_t pad=GetPadFromPadSector(padsector);
191     return GetPadXlocalS(row,pad);
192 }
193
194 //______________________________________________________________
195 Double_t AliTPCmapper::GetPadYlocalS(Int_t row, Int_t pad) const{
196   //
197   //:GetPadYlocalS
198   //
199     Int_t padsInRow = GetPadsInRowS(row);
200
201     if ( row < 63 ) //IROC
202         return (2.* padsInRow - 4.*pad - 2.)*1.e-1;  //divide by 10 to get cm
203
204     //OROC
205         return (3.* padsInRow -6.*pad - 3.)*1.e-1;  //divide by 10 to get cm
206 }
207
208 //______________________________________________________________
209 Double_t AliTPCmapper::GetPadYlocalS(Int_t padsector) const{
210   //
211   //:GetPadYlocalS
212   //
213     Int_t row = GetRowFromPadSector(padsector);
214     Int_t pad = GetPadFromPadSector(padsector);
215     return GetPadYlocalS(row,pad);
216 }
217
218 //______________________________________________________________
219 Double_t AliTPCmapper::GetPadXglobalS(Int_t row, Int_t pad,Int_t sector) const{
220   //
221   // GetPadXglobalS
222   //
223     Double_t angle = (Double_t)(( sector * 20. ) +10. ) * TMath::DegToRad();
224     return GetPadXlocalS(row,pad)*TMath::Cos(angle) -
225         GetPadYlocalS(row,pad)*TMath::Sin(angle);
226 }
227
228 //______________________________________________________________
229 Double_t AliTPCmapper::GetPadYglobalS(Int_t row, Int_t pad,Int_t sector) const{
230   //
231   // GetPadYglobalS
232   //
233     Double_t angle = (Double_t)(( sector * 20. ) + 10. ) * TMath::DegToRad();
234     return GetPadXlocalS(row,pad)*TMath::Sin(angle) +
235         GetPadYlocalS(row,pad)*TMath::Cos(angle);
236 }
237
238 //______________________________________________________________
239 Double_t AliTPCmapper::GetPadWidthS(Int_t row) const
240 {
241   //
242   // :GetPadWidthS
243   //
244     if (row < 63 ) return .4;
245     return .6;
246 }
247
248 //______________________________________________________________
249 Double_t AliTPCmapper::GetPadLengthS(Int_t row) const
250 {
251   //
252   // GetPadLengthS
253   //
254
255     if ( row < 63  ) return  .75;
256     if ( row < 127 ) return 1.;
257     return 1.5;
258 }
259
260 //______________________________________________________________
261 Int_t AliTPCmapper::GetAltroAddrwPatch(const Int_t row,const Int_t pad) const
262 {
263   //
264   // :GetAltroAddrwPatch
265   //
266     return GetChannelS(row,pad)+
267         (GetAltroS (row,pad) <<4)+
268         (GetFECs   (row,pad) <<7)+
269         (GetBranchS(row,pad) <<11)+
270         (GetRCUs   (row,pad) <<12);
271 }
272
273 //______________________________________________________________
274 Int_t AliTPCmapper::GetAltroAddrwPatch(const Int_t padsector) const
275 {
276   //
277   // GetAltroAddrwPatch
278   //
279     return GetAltroAddrwPatch(GetRowFromPadSector(padsector),GetPadFromPadSector(padsector));
280 }
281
282 //______________________________________________________________
283 Int_t AliTPCmapper::GetRow(Int_t altroaddr) const
284 {
285   //
286   // GetRow
287   //
288     Int_t rcu = (altroaddr>>12)&0x07;
289     Int_t bra = (altroaddr>>11)&0x01;
290     Int_t fec = (altroaddr>>7)&0x0F;
291     Int_t alt = (altroaddr>>4)&0x07;
292     Int_t chn = (altroaddr)&0x0F;
293     return GetRow(rcu,bra,fec,alt,chn);
294 }
295
296 //______________________________________________________________
297 Int_t AliTPCmapper::GetPad(Int_t altroaddr) const
298 {
299   //
300   // GetPad
301   //
302     Int_t rcu = (altroaddr>>12)&0x07;
303     Int_t bra = (altroaddr>>11)&0x01;
304     Int_t fec = (altroaddr>>7)&0x0F;
305     Int_t alt = (altroaddr>>4)&0x07;
306     Int_t chn = (altroaddr)&0x0F;
307     return GetPad(rcu,bra,fec,alt,chn);
308 }
309
310 //______________________________________________________________
311 void AliTPCmapper::PrintAddressArray(Int_t row, Int_t pad)
312 {
313   //
314   // PrintAddressArray
315   //
316     Bool_t a[kNaddrSize];
317
318     Int_t addr = GetAltroAddrwPatch(row,pad);
319     for (Int_t i=0; i<kNaddrSize; i++)
320         a[i] = addr&(Int_t)TMath::Power(2,i);
321
322     fprintf(stderr,"Par|Bro|BC/|Bra|   FEC HW   |  Altro  |Altro Chann.|  Instruction  \n");
323     fprintf(stderr,"ity|adc|AL |nch|  Address   |Chip Addr|   Address  |      Code     \n");
324     fprintf(stderr,"-------------------------------------------------------------------\n");
325     fprintf(stderr," %d | %d | %d | %d | %d  %d  %d  %d | %d  %d  %d | %d  %d  %d  %d | %d  %d  %d  %d  %d\n",
326             a[19],a[18],a[17],a[16],a[15],a[14],a[13],a[12],a[11],
327             a[10],a[9],a[8],a[7],a[6],a[5],a[4],a[3],a[2],a[1],a[0]);
328
329     fprintf(stderr,"-------------------------------------------------------------------\n");
330     fprintf(stderr,"19 |18 |17 |16 |15 14 13 12 |11 10  9 | 8  7  6  5 | 4  3  2  1  0\n\n");
331
332 }
333
334 //______________________________________________________________
335 AliTPCmapper::~AliTPCmapper()
336 {
337 //    delete fAddressArray;
338
339 }