ROOT logo
/*
*/
const int debug = 0; // 0=quiet; 1=print some parameter info 

const int kMaxHV = 395; // default max voltage limit; could possibly be relaxed in future
const int kBreakDownMargin = 5; // at least 5 V away from breakDown voltage..

static const int fgkEmCalRows = 24; // number of rows per module for EMCAL
static const int fgkEmCalCols = 48; // number of columns per module for EMCAL

Float_t previousVoltage[fgkEmCalCols][fgkEmCalRows];
Float_t gainFactor[fgkEmCalCols][fgkEmCalRows];
Float_t biasVoltage[fgkEmCalCols][fgkEmCalRows];

//____________________________________________________________________
void WriteNewBias(const char * inputDBName, const char * inputMapName,
		  const char * previousVoltageFileName, const char * gainFactorFileName, 
		  const char * outputFileName) 
{ 

  ofstream outputFile(outputFileName);
  ReadFiles(previousVoltageFileName, gainFactorFileName);

  SetBiasVoltage(inputDBName, inputMapName);

  for (int icol=0; icol<fgkEmCalCols; icol++) {
    for (int irow=0; irow<fgkEmCalRows; irow++) {
      outputFile << icol << " " << irow << " " << biasVoltage[icol][irow] << endl;
    }
  }

  outputFile.close();
}

//____________________________________________________________________
void ReadFiles(const char * previousVoltageFileName, 
	       const char * gainFactorFileName)
{
  ifstream previousVoltageFile(previousVoltageFileName);
  ifstream gainFactorFile(gainFactorFileName);

  int icolp, irowp;
  int icolg, irowg;
  Float_t gFactor;
  Float_t pVoltage;

  for (int icol=0; icol<fgkEmCalCols; icol++) {
    for (int irow=0; irow<fgkEmCalRows; irow++) {
      previousVoltageFile >> icolp >> irowp >> pVoltage;
      gainFactorFile >> icolg >> irowg >> gFactor;

      previousVoltage[icolp][irowp] = pVoltage;
      gainFactor[icolg][irowg] = gFactor;
    }
  }

  previousVoltageFile.close();
  gainFactorFile.close();

  return;
}

//____________________________________________________________________
void SetBiasVoltage(const char * inputDBName, const char * inputMapName) 
{
  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();

  int nSM = 1;
  mapAPD->ReadMapAPDInfo(nSM, inputMapName);
  AliEMCALMapAPD::AliEMCALSuperModuleMapAPD * fMap = mapAPD->GetSuperModuleData();

  int nFound = 0;
  for (int icol=0; icol<fgkEmCalCols; icol++) {
    for (int irow=0; irow<fgkEmCalRows; 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 dound

	// estimate what the new/target HV should be
	biasVoltage[icol][irow] = CalculateTargetHV(previousVoltage[icol][irow], 
						    gainFactor[icol][irow], 
						    fCalib[i].fPar[0], 
						    fCalib[i].fPar[1], 
						    fCalib[i].fPar[2],
						    fCalib[i].fBreakDown);
	nFound++;
      }
      else { // no calib info, just use old settings
	biasVoltage[icol][irow] = previousVoltage[icol][irow];
      }

    }
  }

  cout << " found " << nFound << " matches " << endl;
  return;
}

//____________________________________________________________________
Float_t CalculateTargetHV(Float_t initialHV, Float_t gainChange,		       
			  Float_t par0, Float_t par1, Float_t par2, Int_t breakDown)
{
  if (debug) { printf("parameters p0:%g p1:%g p2:%g\n", par0, par1, par2); }

  // figure out what new HV should be, 
  // if we want to adjust the gain by some factor
  Float_t initialGain = par0 + par1 * exp(par2*initialHV);
  Float_t newGain = initialGain * gainChange; // = par0 + par1 * exp(par2*newHV);

  if (debug) { printf("initialGain:%g newGain:%g\n", initialGain, newGain); }

  Float_t newHV = -1;
  if ( par1>0 && par2>0 ) {
    newHV = log ( (newGain - par0)/par1 ) / par2;
  }
  
  // check results before returning..
  if (newHV < 0) {
   // conversion failed:  let's just keep the old custom value then
    newHV = initialHV;
  }
  if (newHV>kMaxHV) {
    // we reached a too high voltage: let's keep the max then
   newHV = kMaxHV;
  }

  // in case we increase the kMaxHV limit some time in the future we could
  // also enter get close to the Hamamatsu breakdown limit - let's avoid that
  if (newHV>breakDown) {
    newHV = breakDown - kBreakDownMargin;
  }

  return newHV;
}
 WriteNewBias.C:1
 WriteNewBias.C:2
 WriteNewBias.C:3
 WriteNewBias.C:4
 WriteNewBias.C:5
 WriteNewBias.C:6
 WriteNewBias.C:7
 WriteNewBias.C:8
 WriteNewBias.C:9
 WriteNewBias.C:10
 WriteNewBias.C:11
 WriteNewBias.C:12
 WriteNewBias.C:13
 WriteNewBias.C:14
 WriteNewBias.C:15
 WriteNewBias.C:16
 WriteNewBias.C:17
 WriteNewBias.C:18
 WriteNewBias.C:19
 WriteNewBias.C:20
 WriteNewBias.C:21
 WriteNewBias.C:22
 WriteNewBias.C:23
 WriteNewBias.C:24
 WriteNewBias.C:25
 WriteNewBias.C:26
 WriteNewBias.C:27
 WriteNewBias.C:28
 WriteNewBias.C:29
 WriteNewBias.C:30
 WriteNewBias.C:31
 WriteNewBias.C:32
 WriteNewBias.C:33
 WriteNewBias.C:34
 WriteNewBias.C:35
 WriteNewBias.C:36
 WriteNewBias.C:37
 WriteNewBias.C:38
 WriteNewBias.C:39
 WriteNewBias.C:40
 WriteNewBias.C:41
 WriteNewBias.C:42
 WriteNewBias.C:43
 WriteNewBias.C:44
 WriteNewBias.C:45
 WriteNewBias.C:46
 WriteNewBias.C:47
 WriteNewBias.C:48
 WriteNewBias.C:49
 WriteNewBias.C:50
 WriteNewBias.C:51
 WriteNewBias.C:52
 WriteNewBias.C:53
 WriteNewBias.C:54
 WriteNewBias.C:55
 WriteNewBias.C:56
 WriteNewBias.C:57
 WriteNewBias.C:58
 WriteNewBias.C:59
 WriteNewBias.C:60
 WriteNewBias.C:61
 WriteNewBias.C:62
 WriteNewBias.C:63
 WriteNewBias.C:64
 WriteNewBias.C:65
 WriteNewBias.C:66
 WriteNewBias.C:67
 WriteNewBias.C:68
 WriteNewBias.C:69
 WriteNewBias.C:70
 WriteNewBias.C:71
 WriteNewBias.C:72
 WriteNewBias.C:73
 WriteNewBias.C:74
 WriteNewBias.C:75
 WriteNewBias.C:76
 WriteNewBias.C:77
 WriteNewBias.C:78
 WriteNewBias.C:79
 WriteNewBias.C:80
 WriteNewBias.C:81
 WriteNewBias.C:82
 WriteNewBias.C:83
 WriteNewBias.C:84
 WriteNewBias.C:85
 WriteNewBias.C:86
 WriteNewBias.C:87
 WriteNewBias.C:88
 WriteNewBias.C:89
 WriteNewBias.C:90
 WriteNewBias.C:91
 WriteNewBias.C:92
 WriteNewBias.C:93
 WriteNewBias.C:94
 WriteNewBias.C:95
 WriteNewBias.C:96
 WriteNewBias.C:97
 WriteNewBias.C:98
 WriteNewBias.C:99
 WriteNewBias.C:100
 WriteNewBias.C:101
 WriteNewBias.C:102
 WriteNewBias.C:103
 WriteNewBias.C:104
 WriteNewBias.C:105
 WriteNewBias.C:106
 WriteNewBias.C:107
 WriteNewBias.C:108
 WriteNewBias.C:109
 WriteNewBias.C:110
 WriteNewBias.C:111
 WriteNewBias.C:112
 WriteNewBias.C:113
 WriteNewBias.C:114
 WriteNewBias.C:115
 WriteNewBias.C:116
 WriteNewBias.C:117
 WriteNewBias.C:118
 WriteNewBias.C:119
 WriteNewBias.C:120
 WriteNewBias.C:121
 WriteNewBias.C:122
 WriteNewBias.C:123
 WriteNewBias.C:124
 WriteNewBias.C:125
 WriteNewBias.C:126
 WriteNewBias.C:127
 WriteNewBias.C:128
 WriteNewBias.C:129
 WriteNewBias.C:130
 WriteNewBias.C:131
 WriteNewBias.C:132
 WriteNewBias.C:133
 WriteNewBias.C:134
 WriteNewBias.C:135
 WriteNewBias.C:136
 WriteNewBias.C:137
 WriteNewBias.C:138
 WriteNewBias.C:139
 WriteNewBias.C:140
 WriteNewBias.C:141
 WriteNewBias.C:142
 WriteNewBias.C:143
 WriteNewBias.C:144
 WriteNewBias.C:145
 WriteNewBias.C:146
 WriteNewBias.C:147
 WriteNewBias.C:148
 WriteNewBias.C:149
 WriteNewBias.C:150
 WriteNewBias.C:151
 WriteNewBias.C:152