1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
16 //-------------------------------------------------------------------------
18 // Origin: Jens Wiechula (j.wiechula@gsi.de)
20 // class to map (row,pad,sector) to (RCU, Branch, FEC, Altro, Altro channel)
21 // create Altro address
28 #include "AliTPCmapper.h"
31 ClassImp(AliTPCmapper)
34 //______________________________________________________________
35 AliTPCmapper::AliTPCmapper()
41 //______________________________________________________________
42 void AliTPCmapper::Init()
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;
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;
70 for (Int_t i=0; i<kNpadSector; i++){
75 // for (Int_t i=0; i<kNaddrSize; i++)
76 // fAddressArray[i] = 0;
78 strcpy(fMapfileName,gSystem->ExpandPathName("$ALICE_ROOT/TPC/final_mapping.txt"));
81 //______________________________________________________________
82 Int_t AliTPCmapper::ReadMapping()
87 int pad = -1, row = -1;
88 int rcu = -1, bra = -1, fec = -1, alt = -1, chn = -1;
92 fin = fopen(fMapfileName,"r");
94 fprintf(stderr, "cannot open file '%s'!\n",fMapfileName);
99 while (sscanf(line,"%d %d %d %d %d %d %d %d",
101 &rcu, &bra, &fec, &alt, &chn
103 fgets(line, 256, fin);
104 fprintf(stderr,"%s",line);
108 sscanf(line,"%d %d %d %d %d %d %d %d",
110 &rcu, &bra, &fec, &alt, &chn
112 fAddressToRow[rcu][bra][fec][alt][chn] = row;
113 fAddressToPad[rcu][bra][fec][alt][chn] = pad;
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;
122 fPadsecToRow[padsec] = row;
123 fPadsecToPad[padsec] = pad;
127 fgets(line, 256, fin);
135 //______________________________________________________________
136 void AliTPCmapper::PrintRBFACinfo(Int_t row, Int_t pad)
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));
145 //______________________________________________________________
146 Int_t AliTPCmapper::GetPadsInRowS(Int_t row) const{
154 return 2*(Int_t)(row/3.+33.67);
157 Double_t k1=10./6.*tan(TMath::Pi()/18.);
160 return 2*(Int_t)(k1 * row + 37.75);
162 Double_t k2=15./6.*tan(TMath::Pi()/18.);
163 return 2*(Int_t)(k2 * (row-64) + 56.66);
166 //______________________________________________________________
167 Double_t AliTPCmapper::GetPadXlocalS(Int_t row, Int_t pad) const {
171 if ( row < 63 ) //IROC
172 return (852.25 + 7.5 * (Double_t)row)*1.e-1; //divide by 10 to get cm
176 if ( row < 64 ) //OROC inner part
177 return (10.* row + 1351.)*1.e-1; //divide by 10 to get cm
181 return (15.*(row - 64) + 1993.5)*1.e-1; //divide by 10 to get cm
184 //______________________________________________________________
185 Double_t AliTPCmapper::GetPadXlocalS(Int_t padsector) const{
189 Int_t row=GetRowFromPadSector(padsector);
190 Int_t pad=GetPadFromPadSector(padsector);
191 return GetPadXlocalS(row,pad);
194 //______________________________________________________________
195 Double_t AliTPCmapper::GetPadYlocalS(Int_t row, Int_t pad) const{
199 Int_t padsInRow = GetPadsInRowS(row);
201 if ( row < 63 ) //IROC
202 return (2.* padsInRow - 4.*pad - 2.)*1.e-1; //divide by 10 to get cm
205 return (3.* padsInRow -6.*pad - 3.)*1.e-1; //divide by 10 to get cm
208 //______________________________________________________________
209 Double_t AliTPCmapper::GetPadYlocalS(Int_t padsector) const{
213 Int_t row = GetRowFromPadSector(padsector);
214 Int_t pad = GetPadFromPadSector(padsector);
215 return GetPadYlocalS(row,pad);
218 //______________________________________________________________
219 Double_t AliTPCmapper::GetPadXglobalS(Int_t row, Int_t pad,Int_t sector) const{
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);
228 //______________________________________________________________
229 Double_t AliTPCmapper::GetPadYglobalS(Int_t row, Int_t pad,Int_t sector) const{
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);
238 //______________________________________________________________
239 Double_t AliTPCmapper::GetPadWidthS(Int_t row) const
244 if (row < 63 ) return .4;
248 //______________________________________________________________
249 Double_t AliTPCmapper::GetPadLengthS(Int_t row) const
255 if ( row < 63 ) return .75;
256 if ( row < 127 ) return 1.;
260 //______________________________________________________________
261 Int_t AliTPCmapper::GetAltroAddrwPatch(Int_t row, Int_t pad) const
264 // :GetAltroAddrwPatch
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);
273 //______________________________________________________________
274 Int_t AliTPCmapper::GetAltroAddrwPatch(Int_t padsector) const
277 // GetAltroAddrwPatch
279 return GetAltroAddrwPatch(GetRowFromPadSector(padsector),GetPadFromPadSector(padsector));
282 //______________________________________________________________
283 Int_t AliTPCmapper::GetRow(Int_t altroaddr) const
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);
296 //______________________________________________________________
297 Int_t AliTPCmapper::GetPad(Int_t altroaddr) const
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);
310 //______________________________________________________________
311 void AliTPCmapper::PrintAddressArray(Int_t row, Int_t pad)
316 Bool_t a[kNaddrSize];
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);
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]);
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");
334 //______________________________________________________________
335 AliTPCmapper::~AliTPCmapper()
337 // delete fAddressArray;