ROOT logo
/*
*/
// from AliEMCALGeoParams.h
static const int fgkEMCALRows = 24; // number of rows per module for EMCAL
static const int fgkEMCALCols = 48; // number of columns per module for EMCAL

//____________________________________________________________________
void WriteOCDBCalibMapAPD(const char * inputDBName, const char * inputMapName,
			  const char * outputFileName, const int swapSides) 
{ 

  gSystem->Load("AliEMCALCalibAPD_cxx");
  AliEMCALCalibAPD *calibAPD = new AliEMCALCalibAPD();

  calibAPD->ReadCalibAPDInfo(10000, inputDBName);
  int fNCalibAPD = calibAPD->GetNCalibAPD();
  AliEMCALCalibAPD::AliEMCALCalibAPDData * fCalib = calibAPD->GetCalibAPDData();

  gSystem->Load("AliEMCALMapAPD_cxx");
  AliEMCALMapAPD *mapAPD = new AliEMCALMapAPD();

  // assume we do this for one SuperModule at a time; can merge the 
  // output files with 'cat' or so separately 
  int nSM = 1;
  mapAPD->ReadMapAPDInfo(nSM, inputMapName);
  AliEMCALMapAPD::AliEMCALSuperModuleMapAPD * fMap = mapAPD->GetSuperModuleData();

  // set up ouput file
  ofstream outputFile(outputFileName);

  // let's loop over the files..
  int nFound = 0;
  int nNotFound = 0;
  int iCol = 0; 
  int iRow = 0;
  for (int icol=0; icol<fgkEMCALCols; icol++) {
    for (int irow=0; irow<fgkEMCALRows; irow++) {
      iCol = icol;
      iRow = irow;
      if (swapSides) {
	// C side, oriented differently than A side: swap is requested
	iCol = fgkEMCALCols-1 - iCol;
	iRow = fgkEMCALRows-1 - iRow;
      }

      int apdMap = fMap[0].fAPDNum[icol][irow]; // 0 = nSM - 1
      int i = 0;
      int apdCalib = -1;
      while (i<fNCalibAPD && apdMap!=apdCalib) {
	apdCalib = fCalib[i].fAPDNum;
	i++;
      }

      if (apdCalib == apdMap) { // found!
	i--; // go back to what we found

	// should also calculate the HardWare Id.. note that the functionality
	// of the Tower2FEEMap and GetHardWareId calls have not been tested here..
	
	int ircu, ibranch, card, icsp;
	Tower2FEEMap(icol, irow, &ircu, &ibranch, &card, &icsp);
	int iHW = GetCSPAddress(ibranch, card, icsp);
	iHW |= (ircu << 12); // RCU not part of normal HW addresses, but we add an extra bit for it here, just in case it might be useful

	// print some info..
	outputFile << iCol << " " << iRow << " " << iHW 
		   << " " << fCalib[i].fAPDNum << " " << fCalib[i].fV30 
		   << " " << fCalib[i].fPar[0] << " " << fCalib[i].fPar[1] << " " << fCalib[i].fPar[2]
		   << " " << fCalib[i].fParErr[0] << " " << fCalib[i].fParErr[1] << " " << fCalib[i].fParErr[2]
		   << " " << fCalib[i].fBreakDown << " " << fCalib[i].fDarkCurrent << endl;
	
	nFound++;
      }
      else {
	cout << " APD " << apdMap << " could not be found! " << endl;
	// print some dummy info
	nNotFound++;
      }

    }
  }

  cout << " found " << nFound << " matches " << endl;
  cout << " did not find " << nNotFound << " APDs " << endl;

  // close down
  outputFile.close();
}

// from AliEMCALGeoParams.h:
Int_t GetCSPAddress(Int_t iBranch, Int_t iFEC, Int_t iCSP) const
{ return ( (iBranch<<11) | (iFEC<<7) | iCSP ); }; // 

// from DCSGenerateAPD.C; the method assumes that the columns and rows
// are labelled as we have them on the A side (normal case for calibrations
// before the installation)
const int NRCU = 2; // per SM
const int NBranch = 2; // per RCU
const int NFEC = 9; // per branch, labelled 1..9
const int NCSP = 32; // per FEC

void Tower2FEEMap(const int icol, const int irow,
                  int *ircu, int *ibranch, int *card, int *icsp)
{ /*
    If you are interested in where these magic numbers come from -
    See mapping info on
    http://dsilverm.web.cern.ch/dsilverm/mapping/emcal_mapping.html
    http://dsilverm.web.cern.ch/dsilverm/mapping/ppt/Coordinates_and_Mapping.pdf   */
  
  // each FEC covers a 4x8 tower area
  int C = irow/8; // Cable bundle
  int FEC = C*12 + icol/4; // FEC in 0..35 range
  
  *ircu = FEC / 18; // 18 FEC per RCU
  *ibranch = (FEC%18) / 9;
  *card = FEC % 9;
  
  // columns and rows within an FEC area
  int tCol = icol%4;
  int tRow = irow%8;
  
  // The mapping to CSP is a bit complicated so I also define two more help variables here..
  // which T-card?
  int TCard = tCol/2; // 0=Top (even StripModules), 1=Bottom (odd StripModules)
  int locCol = tCol%2;  // local column inside T-card
  
  *icsp = (7 - tRow) + locCol*16 + TCard*8;
}
 WriteOCDBCalibMapAPD.C:1
 WriteOCDBCalibMapAPD.C:2
 WriteOCDBCalibMapAPD.C:3
 WriteOCDBCalibMapAPD.C:4
 WriteOCDBCalibMapAPD.C:5
 WriteOCDBCalibMapAPD.C:6
 WriteOCDBCalibMapAPD.C:7
 WriteOCDBCalibMapAPD.C:8
 WriteOCDBCalibMapAPD.C:9
 WriteOCDBCalibMapAPD.C:10
 WriteOCDBCalibMapAPD.C:11
 WriteOCDBCalibMapAPD.C:12
 WriteOCDBCalibMapAPD.C:13
 WriteOCDBCalibMapAPD.C:14
 WriteOCDBCalibMapAPD.C:15
 WriteOCDBCalibMapAPD.C:16
 WriteOCDBCalibMapAPD.C:17
 WriteOCDBCalibMapAPD.C:18
 WriteOCDBCalibMapAPD.C:19
 WriteOCDBCalibMapAPD.C:20
 WriteOCDBCalibMapAPD.C:21
 WriteOCDBCalibMapAPD.C:22
 WriteOCDBCalibMapAPD.C:23
 WriteOCDBCalibMapAPD.C:24
 WriteOCDBCalibMapAPD.C:25
 WriteOCDBCalibMapAPD.C:26
 WriteOCDBCalibMapAPD.C:27
 WriteOCDBCalibMapAPD.C:28
 WriteOCDBCalibMapAPD.C:29
 WriteOCDBCalibMapAPD.C:30
 WriteOCDBCalibMapAPD.C:31
 WriteOCDBCalibMapAPD.C:32
 WriteOCDBCalibMapAPD.C:33
 WriteOCDBCalibMapAPD.C:34
 WriteOCDBCalibMapAPD.C:35
 WriteOCDBCalibMapAPD.C:36
 WriteOCDBCalibMapAPD.C:37
 WriteOCDBCalibMapAPD.C:38
 WriteOCDBCalibMapAPD.C:39
 WriteOCDBCalibMapAPD.C:40
 WriteOCDBCalibMapAPD.C:41
 WriteOCDBCalibMapAPD.C:42
 WriteOCDBCalibMapAPD.C:43
 WriteOCDBCalibMapAPD.C:44
 WriteOCDBCalibMapAPD.C:45
 WriteOCDBCalibMapAPD.C:46
 WriteOCDBCalibMapAPD.C:47
 WriteOCDBCalibMapAPD.C:48
 WriteOCDBCalibMapAPD.C:49
 WriteOCDBCalibMapAPD.C:50
 WriteOCDBCalibMapAPD.C:51
 WriteOCDBCalibMapAPD.C:52
 WriteOCDBCalibMapAPD.C:53
 WriteOCDBCalibMapAPD.C:54
 WriteOCDBCalibMapAPD.C:55
 WriteOCDBCalibMapAPD.C:56
 WriteOCDBCalibMapAPD.C:57
 WriteOCDBCalibMapAPD.C:58
 WriteOCDBCalibMapAPD.C:59
 WriteOCDBCalibMapAPD.C:60
 WriteOCDBCalibMapAPD.C:61
 WriteOCDBCalibMapAPD.C:62
 WriteOCDBCalibMapAPD.C:63
 WriteOCDBCalibMapAPD.C:64
 WriteOCDBCalibMapAPD.C:65
 WriteOCDBCalibMapAPD.C:66
 WriteOCDBCalibMapAPD.C:67
 WriteOCDBCalibMapAPD.C:68
 WriteOCDBCalibMapAPD.C:69
 WriteOCDBCalibMapAPD.C:70
 WriteOCDBCalibMapAPD.C:71
 WriteOCDBCalibMapAPD.C:72
 WriteOCDBCalibMapAPD.C:73
 WriteOCDBCalibMapAPD.C:74
 WriteOCDBCalibMapAPD.C:75
 WriteOCDBCalibMapAPD.C:76
 WriteOCDBCalibMapAPD.C:77
 WriteOCDBCalibMapAPD.C:78
 WriteOCDBCalibMapAPD.C:79
 WriteOCDBCalibMapAPD.C:80
 WriteOCDBCalibMapAPD.C:81
 WriteOCDBCalibMapAPD.C:82
 WriteOCDBCalibMapAPD.C:83
 WriteOCDBCalibMapAPD.C:84
 WriteOCDBCalibMapAPD.C:85
 WriteOCDBCalibMapAPD.C:86
 WriteOCDBCalibMapAPD.C:87
 WriteOCDBCalibMapAPD.C:88
 WriteOCDBCalibMapAPD.C:89
 WriteOCDBCalibMapAPD.C:90
 WriteOCDBCalibMapAPD.C:91
 WriteOCDBCalibMapAPD.C:92
 WriteOCDBCalibMapAPD.C:93
 WriteOCDBCalibMapAPD.C:94
 WriteOCDBCalibMapAPD.C:95
 WriteOCDBCalibMapAPD.C:96
 WriteOCDBCalibMapAPD.C:97
 WriteOCDBCalibMapAPD.C:98
 WriteOCDBCalibMapAPD.C:99
 WriteOCDBCalibMapAPD.C:100
 WriteOCDBCalibMapAPD.C:101
 WriteOCDBCalibMapAPD.C:102
 WriteOCDBCalibMapAPD.C:103
 WriteOCDBCalibMapAPD.C:104
 WriteOCDBCalibMapAPD.C:105
 WriteOCDBCalibMapAPD.C:106
 WriteOCDBCalibMapAPD.C:107
 WriteOCDBCalibMapAPD.C:108
 WriteOCDBCalibMapAPD.C:109
 WriteOCDBCalibMapAPD.C:110
 WriteOCDBCalibMapAPD.C:111
 WriteOCDBCalibMapAPD.C:112
 WriteOCDBCalibMapAPD.C:113
 WriteOCDBCalibMapAPD.C:114
 WriteOCDBCalibMapAPD.C:115
 WriteOCDBCalibMapAPD.C:116
 WriteOCDBCalibMapAPD.C:117
 WriteOCDBCalibMapAPD.C:118
 WriteOCDBCalibMapAPD.C:119
 WriteOCDBCalibMapAPD.C:120
 WriteOCDBCalibMapAPD.C:121
 WriteOCDBCalibMapAPD.C:122
 WriteOCDBCalibMapAPD.C:123
 WriteOCDBCalibMapAPD.C:124
 WriteOCDBCalibMapAPD.C:125
 WriteOCDBCalibMapAPD.C:126
 WriteOCDBCalibMapAPD.C:127
 WriteOCDBCalibMapAPD.C:128
 WriteOCDBCalibMapAPD.C:129