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 f_in = 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, f_in);
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, f_in);
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){
151 return 2*(Int_t)(row/3.+33.67);
154 Double_t k1=10./6.*tan(TMath::Pi()/18.);
157 return 2*(Int_t)(k1 * row + 37.75);
159 Double_t k2=15./6.*tan(TMath::Pi()/18.);
160 return 2*(Int_t)(k2 * (row-64) + 56.66);
163 //______________________________________________________________
164 Double_t AliTPCmapper::GetPadXlocalS(Int_t row, Int_t pad){
165 if ( row < 63 ) //IROC
166 return (852.25 + 7.5 * (Double_t)row)*1.e-1; //divide by 10 to get cm
170 if ( row < 64 ) //OROC inner part
171 return (10.* row + 1351.)*1.e-1; //divide by 10 to get cm
175 return (15.*(row - 64) + 1993.5)*1.e-1; //divide by 10 to get cm
178 //______________________________________________________________
179 Double_t AliTPCmapper::GetPadXlocalS(Int_t padsector){
180 Int_t row=GetRowFromPadSector(padsector);
181 Int_t pad=GetPadFromPadSector(padsector);
182 return GetPadXlocalS(row,pad);
185 //______________________________________________________________
186 Double_t AliTPCmapper::GetPadYlocalS(Int_t row, Int_t pad){
187 Int_t padsInRow = GetPadsInRowS(row);
189 if ( row < 63 ) //IROC
190 return (2.* padsInRow - 4.*pad - 2.)*1.e-1; //divide by 10 to get cm
193 return (3.* padsInRow -6.*pad - 3.)*1.e-1; //divide by 10 to get cm
196 //______________________________________________________________
197 Double_t AliTPCmapper::GetPadYlocalS(Int_t padsector){
198 Int_t row = GetRowFromPadSector(padsector);
199 Int_t pad = GetPadFromPadSector(padsector);
200 return GetPadYlocalS(row,pad);
203 //______________________________________________________________
204 Double_t AliTPCmapper::GetPadXglobalS(Int_t row, Int_t pad,Int_t sector){
205 Double_t angle = (Double_t)(( sector * 20. ) +10. ) * TMath::DegToRad();
206 return GetPadXlocalS(row,pad)*TMath::Cos(angle) -
207 GetPadYlocalS(row,pad)*TMath::Sin(angle);
210 //______________________________________________________________
211 Double_t AliTPCmapper::GetPadYglobalS(Int_t row, Int_t pad,Int_t sector){
212 Double_t angle = (Double_t)(( sector * 20. ) + 10. ) * TMath::DegToRad();
213 return GetPadXlocalS(row,pad)*TMath::Sin(angle) +
214 GetPadYlocalS(row,pad)*TMath::Cos(angle);
217 //______________________________________________________________
218 Double_t AliTPCmapper::GetPadWidthS(Int_t row)
220 if (row < 63 ) return .4;
224 //______________________________________________________________
225 Double_t AliTPCmapper::GetPadLengthS(Int_t row)
227 if ( row < 63 ) return .75;
228 if ( row < 127 ) return 1.;
232 //______________________________________________________________
233 Int_t AliTPCmapper::GetAltroAddrwPatch(const Int_t row,const Int_t pad)
235 return GetChannelS(row,pad)+
236 (GetAltroS (row,pad) <<4)+
237 (GetFECs (row,pad) <<7)+
238 (GetBranchS(row,pad) <<11)+
239 (GetRCUs (row,pad) <<12);
242 //______________________________________________________________
243 Int_t AliTPCmapper::GetAltroAddrwPatch(const Int_t padsector)
245 return GetAltroAddrwPatch(GetRowFromPadSector(padsector),GetPadFromPadSector(padsector));
248 //______________________________________________________________
249 Int_t AliTPCmapper::GetRow(Int_t altroaddr)
251 Int_t rcu = (altroaddr>>12)&0x07;
252 Int_t bra = (altroaddr>>11)&0x01;
253 Int_t fec = (altroaddr>>7)&0x0F;
254 Int_t alt = (altroaddr>>4)&0x07;
255 Int_t chn = (altroaddr)&0x0F;
256 return GetRow(rcu,bra,fec,alt,chn);
259 //______________________________________________________________
260 Int_t AliTPCmapper::GetPad(Int_t altroaddr)
262 Int_t rcu = (altroaddr>>12)&0x07;
263 Int_t bra = (altroaddr>>11)&0x01;
264 Int_t fec = (altroaddr>>7)&0x0F;
265 Int_t alt = (altroaddr>>4)&0x07;
266 Int_t chn = (altroaddr)&0x0F;
267 return GetPad(rcu,bra,fec,alt,chn);
270 //______________________________________________________________
271 void AliTPCmapper::PrintAddressArray(Int_t row, Int_t pad)
273 Bool_t a[kNaddrSize];
275 Int_t addr = GetAltroAddrwPatch(row,pad);
276 for (Int_t i=0; i<kNaddrSize; i++)
277 a[i] = addr&(Int_t)TMath::Power(2,i);
279 fprintf(stderr,"Par|Bro|BC/|Bra| FEC HW | Altro |Altro Chann.| Instruction \n");
280 fprintf(stderr,"ity|adc|AL |nch| Address |Chip Addr| Address | Code \n");
281 fprintf(stderr,"-------------------------------------------------------------------\n");
282 fprintf(stderr," %d | %d | %d | %d | %d %d %d %d | %d %d %d | %d %d %d %d | %d %d %d %d %d\n",
283 a[19],a[18],a[17],a[16],a[15],a[14],a[13],a[12],a[11],
284 a[10],a[9],a[8],a[7],a[6],a[5],a[4],a[3],a[2],a[1],a[0]);
286 fprintf(stderr,"-------------------------------------------------------------------\n");
287 fprintf(stderr,"19 |18 |17 |16 |15 14 13 12 |11 10 9 | 8 7 6 5 | 4 3 2 1 0\n\n");
291 //______________________________________________________________
292 AliTPCmapper::~AliTPCmapper()
294 // delete fAddressArray;