#include <fstream>
#include <TString.h>
#include <TFile.h>
#include <TTree.h>
#include "AliEMCALCalibAbs.h"
using namespace std;
ClassImp(AliEMCALCalibAbs)
AliEMCALCalibAbs::AliEMCALCalibAbs(const int nSM) :
fNSuperModule(nSM),
fSuperModuleData()
{
for (int i=0; i<fNSuperModule; i++) {
fSuperModuleData.Add(new AliEMCALSuperModuleCalibAbs(i));
}
fSuperModuleData.Compress();
fSuperModuleData.SetOwner(kTRUE);
}
void AliEMCALCalibAbs::ReadTextCalibAbsInfo(Int_t nSM, const TString &txtFileName,
Bool_t swapSides)
{
std::ifstream inputFile(txtFileName.Data());
if (!inputFile) {
printf("AliEMCALCalibAbs::ReadCalibAbsInfo - Cannot open the APD info file %s\n", txtFileName.Data());
return;
}
fNSuperModule = nSM;
Int_t iSM = 0;
Int_t iCol = 0;
Int_t iRow = 0;
Int_t iCalibMethod = 0;
Int_t iCalibPass = 0;
Float_t absoluteCalib = 0;
Float_t relativeCalib = 0;
Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
for (Int_t i = 0; i < fNSuperModule; i++) {
AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[i];
if (!inputFile) {
printf("AliEMCALCalibAbs::ReadCalibAbsInfo - Error while reading input file; likely EOF..\n");
return;
}
inputFile >> iSM;
t->SetSuperModuleNum(iSM);
inputFile >> iCalibMethod >> iCalibPass >> absoluteCalib;
t->SetCalibMethod(iCalibMethod);
t->SetCalibPass(iCalibPass);
t->SetAbsoluteCalib(absoluteCalib);
for (Int_t j=0; j<nAPDPerSM; j++) {
inputFile >> iCol >> iRow >> relativeCalib;
if (iCol<0 || iCol>(AliEMCALGeoParams::fgkEMCALCols-1) ||
iRow<0 || iRow>(AliEMCALGeoParams::fgkEMCALRows-1) ) {
printf("AliEMCALCalibAbs::ReadCalibAbsInfo - Error while reading input file; j %d iCol %d iRow %d\n", j, iCol, iRow);
return;
}
if (swapSides) {
iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
}
t->SetRelativeCalib(iCol, iRow, relativeCalib);
}
}
inputFile.close();
return;
}
void AliEMCALCalibAbs::WriteTextCalibAbsInfo(const TString &txtFileName,
Bool_t swapSides)
{
std::ofstream outputFile(txtFileName.Data());
if (!outputFile) {
printf("AliEMCALCalibAbs::WriteCalibAbsInfo - Cannot open the APD output file %s\n", txtFileName.Data());
return;
}
Int_t iCol = 0;
Int_t iRow = 0;
Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
Float_t relativeCalib = 0;
for (Int_t i = 0; i < fNSuperModule; i++) {
AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[i];
outputFile << t->GetSuperModuleNum() << endl;
outputFile << t->GetCalibMethod() << " "
<< t->GetCalibPass() << " "
<< t->GetAbsoluteCalib() << endl;
for (Int_t j=0; j<nAPDPerSM; j++) {
iCol = j / AliEMCALGeoParams::fgkEMCALRows;
iRow = j % AliEMCALGeoParams::fgkEMCALRows;
relativeCalib = t->GetRelativeCalib(iCol, iRow);
if (swapSides) {
iCol = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
iRow = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
}
outputFile << iCol << " " << iRow
<< " " << relativeCalib << endl;
}
}
outputFile.close();
return;
}
void AliEMCALCalibAbs::ReadRootCalibAbsInfo(const TString &rootFileName,
Bool_t swapSides)
{
TFile inputFile(rootFileName, "read");
TTree *tree = (TTree*) inputFile.Get("tree");
ReadTreeCalibAbsInfo(tree, swapSides);
inputFile.Close();
return;
}
void AliEMCALCalibAbs::ReadTreeCalibAbsInfo(TTree *tree,
Bool_t swapSides)
{
Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
fNSuperModule = tree->GetEntries();
Int_t iSM = 0;
Int_t iCalibMethod = 0;
Int_t iCalibPass = 0;
Float_t absoluteCalib = 0;
Float_t relativeCalib[AliEMCALGeoParams::fgkEMCALCols][AliEMCALGeoParams::fgkEMCALRows];
memset(relativeCalib, 0, sizeof(relativeCalib));
tree->SetBranchAddress("iSM", &iSM);
tree->SetBranchAddress("CalibMethod", &iCalibMethod);
tree->SetBranchAddress("CalibPass", &iCalibPass);
tree->SetBranchAddress("AbsoluteCalib", &absoluteCalib);
tree->SetBranchAddress("RelativeCalib", relativeCalib);
Int_t iCol = 0;
Int_t iRow = 0;
for (int ient=0; ient<tree->GetEntries(); ient++) {
tree->GetEntry(ient);
AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[iSM];
t->SetSuperModuleNum(iSM);
t->SetCalibMethod(iCalibMethod);
t->SetCalibPass(iCalibPass);
t->SetAbsoluteCalib(absoluteCalib);
for (Int_t j=0; j<nAPDPerSM; j++) {
iCol = j / AliEMCALGeoParams::fgkEMCALRows;
iRow = j % AliEMCALGeoParams::fgkEMCALRows;
int iColMod = iCol;
int iRowMod = iRow;
if (swapSides) {
iColMod = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
iRowMod = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
}
t->SetRelativeCalib(iColMod, iRowMod, relativeCalib[iCol][iRow]);
}
}
return;
}
void AliEMCALCalibAbs::WriteRootCalibAbsInfo(const TString &rootFileName,
Bool_t swapSides)
{
TFile destFile(rootFileName, "recreate");
if (destFile.IsZombie()) {
return;
}
destFile.cd();
TTree *tree = new TTree("tree","");
Int_t iSM = 0;
Int_t iCalibMethod = 0;
Int_t iCalibPass = 0;
Float_t absoluteCalib = 0;
Float_t relativeCalib[AliEMCALGeoParams::fgkEMCALCols][AliEMCALGeoParams::fgkEMCALRows];
memset(relativeCalib, 0, sizeof(relativeCalib));
Int_t nAPDPerSM = AliEMCALGeoParams::fgkEMCALCols * AliEMCALGeoParams::fgkEMCALRows;
Int_t iCol = 0;
Int_t iRow = 0;
tree->Branch("iSM", &iSM, "iSM/I");
tree->Branch("CalibMethod", &iCalibMethod, "CalibMethod/I");
tree->Branch("CalibPass", &iCalibPass, "CalibPass/I");
tree->Branch("AbsoluteCalib", &absoluteCalib, "AbsoluteCalib/F");
tree->Branch( "RelativeCalib", &relativeCalib, Form("RelativeCalib[%d][%d]/F", AliEMCALGeoParams::fgkEMCALCols, AliEMCALGeoParams::fgkEMCALRows) );
for (iSM = 0; iSM < fNSuperModule; iSM++) {
AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[iSM];
iSM = t->GetSuperModuleNum();
iCalibMethod = t->GetCalibMethod();
iCalibPass = t->GetCalibPass();
absoluteCalib = t->GetAbsoluteCalib();
for (Int_t j=0; j<nAPDPerSM; j++) {
iCol = j / AliEMCALGeoParams::fgkEMCALRows;
iRow = j % AliEMCALGeoParams::fgkEMCALRows;
int iColMod = iCol;
int iRowMod = iRow;
if (swapSides) {
iColMod = AliEMCALGeoParams::fgkEMCALCols-1 - iCol;
iRowMod = AliEMCALGeoParams::fgkEMCALRows-1 - iRow;
}
relativeCalib[iColMod][iRowMod] = t->GetRelativeCalib(iCol, iRow);
}
tree->Fill();
}
tree->Write();
destFile.Close();
return;
}
AliEMCALCalibAbs::~AliEMCALCalibAbs()
{
fSuperModuleData.Delete();
}
AliEMCALSuperModuleCalibAbs * AliEMCALCalibAbs::GetSuperModuleCalibAbsNum(Int_t supModIndex)const
{
for (int i=0; i<fNSuperModule; i++) {
AliEMCALSuperModuleCalibAbs * t = (AliEMCALSuperModuleCalibAbs*) fSuperModuleData[i];
if (t->GetSuperModuleNum() == supModIndex) {
return t;
}
}
return NULL;
}