ROOT logo
// some global var/constants
const Int_t kNRCU = 2; // per SM
AliCaloAltroMapping *fMapping[4]; // 1 for each side (A/C) and each RCU (0/1), i.e. 2*2 total
//
const Bool_t kDebug = kFALSE;
const char *branchStr[] = {"A", "B"};

// help methods
Int_t GetHWAddress(Int_t iside, Int_t icol, Int_t irow, Int_t igain);
void DecodeHWAddress(Int_t hwAddr, Int_t & branch, Int_t & FEC, Int_t & chip, Int_t & chan);
void GetMapping();

// main method
void 
TowerToFEE(Int_t iSM=0, Int_t icol=0, Int_t irow=0, Int_t igain=0)
{
  // Get mapping file info, and clear arrays
  GetMapping();

  Int_t isect = iSM / 2; //
  Int_t iside = iSM % 2; // A or C side

  Int_t hwAddress = 0;
  Int_t iRCU = 0;
  Int_t branch = 0;
  Int_t FEC = 0;
  Int_t chip = 0;
  Int_t chan = 0;

  hwAddress = GetHWAddress(iside, icol, irow, igain, iRCU);
  DecodeHWAddress(hwAddress, branch, FEC, chip, chan);  

  Int_t iDDL = iRCU + iSM * kNRCU;

  // report channel info
  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", 
	 iSM, icol, irow, igain, 
	 iSM, iRCU, iDDL, iDDL + 0x1200, 
	 branch, branchStr[branch], FEC, chip, chan);

  return;
}

void 
DecodeHWAddress(Int_t hwAddr, Int_t & branch, Int_t & FEC, Int_t & chip, Int_t & chan)
{
  chan = hwAddr & 0xf;
  chip = (hwAddr >> 4) & 0x7;
  FEC = (hwAddr >> 7) & 0xf;
  branch = (hwAddr >> 11) & 0x1;
  return;
}

Int_t 
GetHWAddress(Int_t iside, Int_t icol, Int_t irow, Int_t igain, Int_t & iRCU)
{
  iRCU = -111;

  //RCU0
  if (0<=irow&&irow<8) iRCU=0; // first cable row
  else if (8<=irow&&irow<16 && 0<=icol&&icol<24) iRCU=0; // first half; 
  //second cable row
  //RCU1
  else if(8<=irow&&irow<16 && 24<=icol&&icol<48) iRCU=1; // second half; 
  //second cable row
  else if(16<=irow&&irow<24) iRCU=1; // third cable row

  // swap for odd=C side, to allow us to cable both sides the same
  Int_t iRCUSide = iRCU; 
 if (iside == 1) {
    iRCU = 1 - iRCU;
    iRCUSide = iRCU + 2; // to make it map file index
  }
  Int_t hwAddress = fMapping[iRCUSide]->GetHWAddress(irow, icol, igain);

  return hwAddress;
}

void 
GetMapping()
{  
  TString sides[]={"A","C"};
  // Read mapping files from $ALICE_ROOT/CALO/mapping/*.data
  TString path = gSystem->Getenv("ALICE_ROOT");
  path += "/EMCAL/mapping/RCU";
  TString path2;
  for(Int_t j = 0; j < 2; j++){ // sides
    for(Int_t i = 0; i < 2; i++) { // RCU
      path2 = path;
      path2 += i;
      path2 += sides[j];
      path2 += ".data";
      if (kDebug) { printf("Mapping file: %s\n",path2.Data()); }
      fMapping[j*2 + i] = new AliCaloAltroMapping(path2.Data());
    }
  }
  return;
}

 TowerToFEE.C:1
 TowerToFEE.C:2
 TowerToFEE.C:3
 TowerToFEE.C:4
 TowerToFEE.C:5
 TowerToFEE.C:6
 TowerToFEE.C:7
 TowerToFEE.C:8
 TowerToFEE.C:9
 TowerToFEE.C:10
 TowerToFEE.C:11
 TowerToFEE.C:12
 TowerToFEE.C:13
 TowerToFEE.C:14
 TowerToFEE.C:15
 TowerToFEE.C:16
 TowerToFEE.C:17
 TowerToFEE.C:18
 TowerToFEE.C:19
 TowerToFEE.C:20
 TowerToFEE.C:21
 TowerToFEE.C:22
 TowerToFEE.C:23
 TowerToFEE.C:24
 TowerToFEE.C:25
 TowerToFEE.C:26
 TowerToFEE.C:27
 TowerToFEE.C:28
 TowerToFEE.C:29
 TowerToFEE.C:30
 TowerToFEE.C:31
 TowerToFEE.C:32
 TowerToFEE.C:33
 TowerToFEE.C:34
 TowerToFEE.C:35
 TowerToFEE.C:36
 TowerToFEE.C:37
 TowerToFEE.C:38
 TowerToFEE.C:39
 TowerToFEE.C:40
 TowerToFEE.C:41
 TowerToFEE.C:42
 TowerToFEE.C:43
 TowerToFEE.C:44
 TowerToFEE.C:45
 TowerToFEE.C:46
 TowerToFEE.C:47
 TowerToFEE.C:48
 TowerToFEE.C:49
 TowerToFEE.C:50
 TowerToFEE.C:51
 TowerToFEE.C:52
 TowerToFEE.C:53
 TowerToFEE.C:54
 TowerToFEE.C:55
 TowerToFEE.C:56
 TowerToFEE.C:57
 TowerToFEE.C:58
 TowerToFEE.C:59
 TowerToFEE.C:60
 TowerToFEE.C:61
 TowerToFEE.C:62
 TowerToFEE.C:63
 TowerToFEE.C:64
 TowerToFEE.C:65
 TowerToFEE.C:66
 TowerToFEE.C:67
 TowerToFEE.C:68
 TowerToFEE.C:69
 TowerToFEE.C:70
 TowerToFEE.C:71
 TowerToFEE.C:72
 TowerToFEE.C:73
 TowerToFEE.C:74
 TowerToFEE.C:75
 TowerToFEE.C:76
 TowerToFEE.C:77
 TowerToFEE.C:78
 TowerToFEE.C:79
 TowerToFEE.C:80
 TowerToFEE.C:81
 TowerToFEE.C:82
 TowerToFEE.C:83
 TowerToFEE.C:84
 TowerToFEE.C:85
 TowerToFEE.C:86
 TowerToFEE.C:87
 TowerToFEE.C:88
 TowerToFEE.C:89
 TowerToFEE.C:90
 TowerToFEE.C:91
 TowerToFEE.C:92
 TowerToFEE.C:93
 TowerToFEE.C:94
 TowerToFEE.C:95
 TowerToFEE.C:96
 TowerToFEE.C:97
 TowerToFEE.C:98
 TowerToFEE.C:99
 TowerToFEE.C:100