Bug fix in the constructor (thanks to A.Marin)
[u/mrichter/AliRoot.git] / EMCAL / macros / TowerToFEE.C
1 // some global var/constants
2 const Int_t kNRCU = 2; // per SM
3 AliCaloAltroMapping *fMapping[4]; // 1 for each side (A/C) and each RCU (0/1), i.e. 2*2 total
4 //
5 const Bool_t kDebug = kFALSE;
6 const char *branchStr[] = {"A", "B"};
7
8 // help methods
9 Int_t GetHWAddress(Int_t iside, Int_t icol, Int_t irow, Int_t igain);
10 void DecodeHWAddress(Int_t hwAddr, Int_t & branch, Int_t & FEC, Int_t & chip, Int_t & chan);
11 void GetMapping();
12
13 // main method
14 void 
15 TowerToFEE(Int_t iSM=0, Int_t icol=0, Int_t irow=0, Int_t igain=0)
16 {
17   // Get mapping file info, and clear arrays
18   GetMapping();
19
20   Int_t isect = iSM / 2; //
21   Int_t iside = iSM % 2; // A or C side
22
23   Int_t hwAddress = 0;
24   Int_t iRCU = 0;
25   Int_t branch = 0;
26   Int_t FEC = 0;
27   Int_t chip = 0;
28   Int_t chan = 0;
29
30   hwAddress = GetHWAddress(iside, icol, irow, igain, iRCU);
31   DecodeHWAddress(hwAddress, branch, FEC, chip, chan);  
32
33   Int_t iDDL = iRCU + iSM * kNRCU;
34
35   // report channel info
36   printf(" iSM %d icol %d irow %d caloflag (igain) %d \n corresponds to \n iSM %d iRCU %d (iDDL %d EqId %d) : branch %d (%s) FEC %d chip %d chan %d\n", 
37          iSM, icol, irow, igain, 
38          iSM, iRCU, iDDL, iDDL + 0x1200, 
39          branch, branchStr[branch], FEC, chip, chan);
40
41   return;
42 }
43
44 void 
45 DecodeHWAddress(Int_t hwAddr, Int_t & branch, Int_t & FEC, Int_t & chip, Int_t & chan)
46 {
47   chan = hwAddr & 0xf;
48   chip = (hwAddr >> 4) & 0x7;
49   FEC = (hwAddr >> 7) & 0xf;
50   branch = (hwAddr >> 11) & 0x1;
51   return;
52 }
53
54 Int_t 
55 GetHWAddress(Int_t iside, Int_t icol, Int_t irow, Int_t igain, Int_t & iRCU)
56 {
57   iRCU = -111;
58
59   //RCU0
60   if (0<=irow&&irow<8) iRCU=0; // first cable row
61   else if (8<=irow&&irow<16 && 0<=icol&&icol<24) iRCU=0; // first half; 
62   //second cable row
63   //RCU1
64   else if(8<=irow&&irow<16 && 24<=icol&&icol<48) iRCU=1; // second half; 
65   //second cable row
66   else if(16<=irow&&irow<24) iRCU=1; // third cable row
67
68   // swap for odd=C side, to allow us to cable both sides the same
69   Int_t iRCUSide = iRCU; 
70  if (iside == 1) {
71     iRCU = 1 - iRCU;
72     iRCUSide = iRCU + 2; // to make it map file index
73   }
74   Int_t hwAddress = fMapping[iRCUSide]->GetHWAddress(irow, icol, igain);
75
76   return hwAddress;
77 }
78
79 void 
80 GetMapping()
81 {  
82   TString sides[]={"A","C"};
83   // Read mapping files from $ALICE_ROOT/CALO/mapping/*.data
84   TString path = gSystem->Getenv("ALICE_ROOT");
85   path += "/EMCAL/mapping/RCU";
86   TString path2;
87   for(Int_t j = 0; j < 2; j++){ // sides
88     for(Int_t i = 0; i < 2; i++) { // RCU
89       path2 = path;
90       path2 += i;
91       path2 += sides[j];
92       path2 += ".data";
93       if (kDebug) { printf("Mapping file: %s\n",path2.Data()); }
94       fMapping[j*2 + i] = new AliCaloAltroMapping(path2.Data());
95     }
96   }
97   return;
98 }
99