ROOT logo
// Macro to generate and update OCDB entries for a given run:
// this is a TObjArray which has at 0 the MIP-Spline and at 1 the Fermi-Plateau-Spline ...
// Responsible: marian.ivanov@cern.ch
// Responsible: A.Kalweit@gsi.de

/* How to use it locally:
//
// Load libraries
gSystem->Load("libANALYSIS");
gSystem->Load("libSTAT");
gSystem->Load("libTPCcalib");
gSystem->AddIncludePath("-I$ALICE_ROOT/TPC");
.L $ALICE_ROOT/TPC/CalibMacros/CalibTimeGain.C+

//Make calibration
CalibTimeGain("CalibObjectsTrain1.root",0,120000);
TBrowser b;
b.Add(gainArray);

*/
#if !defined(__CINT__) || defined(__MAKECINT__)
#include "TObjArray.h"
#include "TGraphErrors.h"
#include "THnSparse.h"
#include "TCanvas.h"
#include "TFile.h"

#include "AliTPCcalibTimeGain.h"
#include "AliSplineFit.h"
#include "AliCDBMetaData.h"
#include "AliCDBId.h"
#include "AliCDBManager.h"
#include "AliCDBStorage.h"
#endif




TGraphErrors * graphMIP    = 0;       // graph time dependence of MIP
TGraphErrors * graphCosmic = 0;       // graph time dependence at Plateu
AliSplineFit * fitMIP = 0;            // fit of dependence - MIP
AliSplineFit * fitCosmic = 0;         // fit of dependence - Plateu
TObjArray    * gainArray = new TObjArray(4); // array to be stored in the OCDB
AliTPCcalibTimeGain * gainMIP =0;     // calibration component for MIP
AliTPCcalibTimeGain * gainCosmic =0;  // calibration component for cosmic


void UpdateOCDBGain(Int_t  startRunNumber, Int_t endRunNumber, const char* storagePath);
void ReadGainGlobal(Char_t* fileName="CalibObjectsTrain1.root");
void MakeQAPlot(Float_t  FPtoMIPratio);
Bool_t AnalyzeGain(Int_t startRunNumber, Int_t endRunNumber, Int_t minEntriesGaussFit = 500, Float_t FPtoMIPratio = 1.43); 



void CalibTimeGain(Char_t* fileName="CalibObjectsTrain1.root", Int_t startRunNumber=0, Int_t endRunNumber=AliCDBRunRange::Infinity(),  TString  ocdbStorage=""){
  //
  // Update OCDB gain
  //
  ReadGainGlobal(fileName);
  AnalyzeGain(startRunNumber,endRunNumber, 1000,1.43);
  MakeQAPlot(1.43);  
  if (ocdbStorage.Length()==0) ocdbStorage+="local://"+gSystem->GetFromPipe("pwd")+"/OCDB";
  UpdateOCDBGain( startRunNumber, endRunNumber, ocdbStorage.Data());
}




void ReadGainGlobal(Char_t* fileName){
  //
  // read calibration entries from file
  // 
  TFile fcalib(fileName);
  TObjArray * array = (TObjArray*)fcalib.Get("TPCCalib");
  if (array){
    gainMIP    = ( AliTPCcalibTimeGain *)array->FindObject("calibTimeGain");
    gainCosmic = ( AliTPCcalibTimeGain *)array->FindObject("calibTimeGainCosmic");
  }else{
    gainMIP    = ( AliTPCcalibTimeGain *)fcalib.Get("calibTimeGain");
    gainCosmic = ( AliTPCcalibTimeGain *)fcalib.Get("calibTimeGainCosmic");
  }
  TH1 * hisT=0;
  Int_t firstBinA =0, lastBinA=0;

  if (gainCosmic){ 
    hisT= gainCosmic->GetHistGainTime()->Projection(1);
    firstBinA = hisT->FindFirstBinAbove(2);
    lastBinA  = hisT->FindLastBinAbove(2);    
    gainCosmic->GetHistGainTime()->GetAxis(1)->SetRange(firstBinA,lastBinA);
    delete hisT;
  }

  if (gainMIP){ 
    hisT= gainCosmic->GetHistGainTime()->Projection(1);
    firstBinA = hisT->FindFirstBinAbove(2);
    lastBinA  = hisT->FindLastBinAbove(2);    
    gainMIP->GetHistGainTime()->GetAxis(1)->SetRange(firstBinA,lastBinA);
    delete hisT;
  }

}



Bool_t AnalyzeGain(Int_t startRunNumber, Int_t endRunNumber, Int_t minEntriesGaussFit,  Float_t FPtoMIPratio){
  //
  //
  //
  gainMIP->GetHistGainTime()->GetAxis(5)->SetRangeUser(startRunNumber, endRunNumber);
  // 1.) try to create MIP spline
  gainMIP->GetHistGainTime()->GetAxis(2)->SetRangeUser(1.51,2.49); // only beam data
  gainMIP->GetHistGainTime()->GetAxis(4)->SetRangeUser(0.39,0.51); // only MIP pions
  //
  graphMIP = AliTPCcalibBase::FitSlices(gainMIP->GetHistGainTime(),0,1,minEntriesGaussFit,10,0.1,0.7);
  if (graphMIP->GetN()==0) graphMIP = 0x0;
  if (graphMIP) fitMIP = AliTPCcalibTimeGain::MakeSplineFit(graphMIP);
  if (graphMIP) graphMIP->SetName("TGRAPHERRORS_MEAN_GAIN_BEAM_ALL");// set proper names according to naming convention
  gainArray->AddAt(fitMIP,0);
  

  // 2.) try to create Cosmic spline
  gainCosmic->GetHistGainTime()->GetAxis(2)->SetRangeUser(0.51,1.49); // only cosmics
  gainCosmic->GetHistGainTime()->GetAxis(4)->SetRangeUser(20,100);    // only Fermi-Plateau muons
  //
  graphCosmic = AliTPCcalibBase::FitSlices(gainCosmic->GetHistGainTime(),0,1,minEntriesGaussFit,10);
  if (graphCosmic->GetN()==0) graphCosmic = 0x0;
  //
  if (graphCosmic) {
    for(Int_t i=0; i < graphCosmic->GetN(); i++) {
      graphCosmic->GetY()[i] /= FPtoMIPratio;
      graphCosmic->GetEY()[i] /= FPtoMIPratio;
    }
  }
  //
  if (graphCosmic) fitCosmic = AliTPCcalibTimeGain::MakeSplineFit(graphCosmic);
  if (graphCosmic) graphCosmic->SetName("TGRAPHERRORS_MEAN_GAIN_COSMIC_ALL"); // set proper names according to naming convention
  gainArray->AddAt(fitCosmic,1);
  // with naming convention and backward compatibility
  gainArray->AddAt(graphMIP,2);
  gainArray->AddAt(graphCosmic,3);
  cout << "graphCosmic: " << graphCosmic << " graphMIP " << graphMIP << endl;
  return kTRUE;

}



void UpdateOCDBGain(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
  //
  // Update OCDB entry
  //
  AliCDBMetaData *metaData= new AliCDBMetaData();
  metaData->SetObjectClassName("TObjArray");
  metaData->SetResponsible("Alexander Kalweit");
  metaData->SetBeamPeriod(1);
  metaData->SetAliRootVersion("05-24-00"); //root version
  metaData->SetComment("Calibration of the time dependence of the gain due to pressure and temperature changes.");
  AliCDBId id1("TPC/Calib/TimeGain", startRunNumber, endRunNumber);
  AliCDBStorage * gStorage = AliCDBManager::Instance()->GetStorage(storagePath);
  gStorage->Put(gainArray, id1, metaData);    
}

void MakeQAPlot(Float_t  FPtoMIPratio) {
  //
  // Make QA plot to visualize results
  //
  //
  //
  if (graphCosmic) {
    TCanvas * canvasCosmic = new TCanvas("gain Cosmic", "time dependent gain QA histogram cosmic");
    canvasCosmic->cd();
    TH2D * gainHistoCosmic = gainCosmic->GetHistGainTime()->Projection(0,1);
    gainHistoCosmic->SetDirectory(0);
    gainHistoCosmic->SetName("GainHistoCosmic");
    gainHistoCosmic->GetXaxis()->SetTimeDisplay(kTRUE);
    gainHistoCosmic->GetXaxis()->SetTimeFormat("#splitline{%d/%m}{%H:%M}");
    gainHistoCosmic->Draw("colz");
    graphCosmic->SetMarkerStyle(25);
    graphCosmic->Draw("lp");
    graphCosmic->SetMarkerStyle(25);
    TGraph * grfitCosmic = fitCosmic->MakeGraph(graphCosmic->GetX()[0],graphCosmic->GetX()[graphCosmic->GetN()-1],50000,0);
    if (grfitCosmic) {
      for(Int_t i=0; i < grfitCosmic->GetN(); i++) {
 	grfitCosmic->GetY()[i] *= FPtoMIPratio;	
      }
      for(Int_t i=0; i < graphCosmic->GetN(); i++) {
 	graphCosmic->GetY()[i] *= FPtoMIPratio;	
      }
    }
    graphCosmic->Draw("lp");
    grfitCosmic->SetLineColor(2);
    grfitCosmic->Draw("lu");
    gainArray->AddLast(gainHistoCosmic);
    gainArray->AddLast(canvasCosmic->Clone());
    delete canvasCosmic;    
  }
  if (fitMIP) {
    TCanvas * canvasMIP = new TCanvas("gain MIP", "time dependent gain QA histogram MIP");
    canvasMIP->cd();
    TH2D * gainHistoMIP    = gainMIP->GetHistGainTime()->Projection(0,1);
    gainHistoMIP->SetName("GainHistoCosmic");
    gainHistoMIP->SetDirectory(0);
    gainHistoMIP->GetXaxis()->SetTimeDisplay(kTRUE);
    gainHistoMIP->GetXaxis()->SetTimeFormat("#splitline{%d/%m}{%H:%M}");
    gainHistoMIP->Draw("colz");
    graphMIP->SetMarkerStyle(25);
    graphMIP->Draw("lp");
    TGraph * grfitMIP = fitMIP->MakeGraph(graphMIP->GetX()[0],graphMIP->GetX()[graphMIP->GetN()-1],50000,0);
    grfitMIP->SetLineColor(2);
    grfitMIP->Draw("lu");    
    gainArray->AddLast(gainHistoMIP);
    gainArray->AddLast(canvasMIP->Clone());
    delete canvasMIP;    
  }  
}


 CalibTimeGain.C:1
 CalibTimeGain.C:2
 CalibTimeGain.C:3
 CalibTimeGain.C:4
 CalibTimeGain.C:5
 CalibTimeGain.C:6
 CalibTimeGain.C:7
 CalibTimeGain.C:8
 CalibTimeGain.C:9
 CalibTimeGain.C:10
 CalibTimeGain.C:11
 CalibTimeGain.C:12
 CalibTimeGain.C:13
 CalibTimeGain.C:14
 CalibTimeGain.C:15
 CalibTimeGain.C:16
 CalibTimeGain.C:17
 CalibTimeGain.C:18
 CalibTimeGain.C:19
 CalibTimeGain.C:20
 CalibTimeGain.C:21
 CalibTimeGain.C:22
 CalibTimeGain.C:23
 CalibTimeGain.C:24
 CalibTimeGain.C:25
 CalibTimeGain.C:26
 CalibTimeGain.C:27
 CalibTimeGain.C:28
 CalibTimeGain.C:29
 CalibTimeGain.C:30
 CalibTimeGain.C:31
 CalibTimeGain.C:32
 CalibTimeGain.C:33
 CalibTimeGain.C:34
 CalibTimeGain.C:35
 CalibTimeGain.C:36
 CalibTimeGain.C:37
 CalibTimeGain.C:38
 CalibTimeGain.C:39
 CalibTimeGain.C:40
 CalibTimeGain.C:41
 CalibTimeGain.C:42
 CalibTimeGain.C:43
 CalibTimeGain.C:44
 CalibTimeGain.C:45
 CalibTimeGain.C:46
 CalibTimeGain.C:47
 CalibTimeGain.C:48
 CalibTimeGain.C:49
 CalibTimeGain.C:50
 CalibTimeGain.C:51
 CalibTimeGain.C:52
 CalibTimeGain.C:53
 CalibTimeGain.C:54
 CalibTimeGain.C:55
 CalibTimeGain.C:56
 CalibTimeGain.C:57
 CalibTimeGain.C:58
 CalibTimeGain.C:59
 CalibTimeGain.C:60
 CalibTimeGain.C:61
 CalibTimeGain.C:62
 CalibTimeGain.C:63
 CalibTimeGain.C:64
 CalibTimeGain.C:65
 CalibTimeGain.C:66
 CalibTimeGain.C:67
 CalibTimeGain.C:68
 CalibTimeGain.C:69
 CalibTimeGain.C:70
 CalibTimeGain.C:71
 CalibTimeGain.C:72
 CalibTimeGain.C:73
 CalibTimeGain.C:74
 CalibTimeGain.C:75
 CalibTimeGain.C:76
 CalibTimeGain.C:77
 CalibTimeGain.C:78
 CalibTimeGain.C:79
 CalibTimeGain.C:80
 CalibTimeGain.C:81
 CalibTimeGain.C:82
 CalibTimeGain.C:83
 CalibTimeGain.C:84
 CalibTimeGain.C:85
 CalibTimeGain.C:86
 CalibTimeGain.C:87
 CalibTimeGain.C:88
 CalibTimeGain.C:89
 CalibTimeGain.C:90
 CalibTimeGain.C:91
 CalibTimeGain.C:92
 CalibTimeGain.C:93
 CalibTimeGain.C:94
 CalibTimeGain.C:95
 CalibTimeGain.C:96
 CalibTimeGain.C:97
 CalibTimeGain.C:98
 CalibTimeGain.C:99
 CalibTimeGain.C:100
 CalibTimeGain.C:101
 CalibTimeGain.C:102
 CalibTimeGain.C:103
 CalibTimeGain.C:104
 CalibTimeGain.C:105
 CalibTimeGain.C:106
 CalibTimeGain.C:107
 CalibTimeGain.C:108
 CalibTimeGain.C:109
 CalibTimeGain.C:110
 CalibTimeGain.C:111
 CalibTimeGain.C:112
 CalibTimeGain.C:113
 CalibTimeGain.C:114
 CalibTimeGain.C:115
 CalibTimeGain.C:116
 CalibTimeGain.C:117
 CalibTimeGain.C:118
 CalibTimeGain.C:119
 CalibTimeGain.C:120
 CalibTimeGain.C:121
 CalibTimeGain.C:122
 CalibTimeGain.C:123
 CalibTimeGain.C:124
 CalibTimeGain.C:125
 CalibTimeGain.C:126
 CalibTimeGain.C:127
 CalibTimeGain.C:128
 CalibTimeGain.C:129
 CalibTimeGain.C:130
 CalibTimeGain.C:131
 CalibTimeGain.C:132
 CalibTimeGain.C:133
 CalibTimeGain.C:134
 CalibTimeGain.C:135
 CalibTimeGain.C:136
 CalibTimeGain.C:137
 CalibTimeGain.C:138
 CalibTimeGain.C:139
 CalibTimeGain.C:140
 CalibTimeGain.C:141
 CalibTimeGain.C:142
 CalibTimeGain.C:143
 CalibTimeGain.C:144
 CalibTimeGain.C:145
 CalibTimeGain.C:146
 CalibTimeGain.C:147
 CalibTimeGain.C:148
 CalibTimeGain.C:149
 CalibTimeGain.C:150
 CalibTimeGain.C:151
 CalibTimeGain.C:152
 CalibTimeGain.C:153
 CalibTimeGain.C:154
 CalibTimeGain.C:155
 CalibTimeGain.C:156
 CalibTimeGain.C:157
 CalibTimeGain.C:158
 CalibTimeGain.C:159
 CalibTimeGain.C:160
 CalibTimeGain.C:161
 CalibTimeGain.C:162
 CalibTimeGain.C:163
 CalibTimeGain.C:164
 CalibTimeGain.C:165
 CalibTimeGain.C:166
 CalibTimeGain.C:167
 CalibTimeGain.C:168
 CalibTimeGain.C:169
 CalibTimeGain.C:170
 CalibTimeGain.C:171
 CalibTimeGain.C:172
 CalibTimeGain.C:173
 CalibTimeGain.C:174
 CalibTimeGain.C:175
 CalibTimeGain.C:176
 CalibTimeGain.C:177
 CalibTimeGain.C:178
 CalibTimeGain.C:179
 CalibTimeGain.C:180
 CalibTimeGain.C:181
 CalibTimeGain.C:182
 CalibTimeGain.C:183
 CalibTimeGain.C:184
 CalibTimeGain.C:185
 CalibTimeGain.C:186
 CalibTimeGain.C:187
 CalibTimeGain.C:188
 CalibTimeGain.C:189
 CalibTimeGain.C:190
 CalibTimeGain.C:191
 CalibTimeGain.C:192
 CalibTimeGain.C:193
 CalibTimeGain.C:194
 CalibTimeGain.C:195
 CalibTimeGain.C:196
 CalibTimeGain.C:197
 CalibTimeGain.C:198
 CalibTimeGain.C:199
 CalibTimeGain.C:200
 CalibTimeGain.C:201
 CalibTimeGain.C:202
 CalibTimeGain.C:203
 CalibTimeGain.C:204
 CalibTimeGain.C:205
 CalibTimeGain.C:206
 CalibTimeGain.C:207
 CalibTimeGain.C:208
 CalibTimeGain.C:209
 CalibTimeGain.C:210
 CalibTimeGain.C:211
 CalibTimeGain.C:212
 CalibTimeGain.C:213
 CalibTimeGain.C:214
 CalibTimeGain.C:215
 CalibTimeGain.C:216
 CalibTimeGain.C:217
 CalibTimeGain.C:218