ROOT logo
/*

//
// 1. dump information to the tree
//
gSystem->Load("libANALYSIS");
gSystem->Load("libTPCcalib");
gSystem->Load("libSTAT.so");

.L $ALICE_ROOT/TPC/CalibMacros/CalibPID.C+
.x ../ConfigOCDB.C
paramCl = AliTPCcalibDB::Instance()->GetClusterParam();
Init("calibPID06");
LookupHisto() // change SetRange in LookupHisto if needed !, check with pid->GetHistQtot()->Projection(0,1)->Draw("colz")

// exit aliroot

//
// 2. update the OCDB
//

gSystem->Load("libANALYSIS");
gSystem->Load("libTPCcalib");
gSystem->Load("libSTAT.so");

.L $ALICE_ROOT/TPC/CalibMacros/CalibPID.C+
.x ../ConfigOCDB.C
paramCl = AliTPCcalibDB::Instance()->GetClusterParam();

TFile fff("lookupdEdx.root")
TTree * treeDump =0;
TObjArray fitArr;
treeDump = (TTree*)fff.Get("dumpdEdx");

TCut cutAll = "meangTot>0.0&&sumMax>150&&sumTot>150&&rmsgMax/rmsMax<1.5&&abs(p3)<1&&isOK";
treeDump->Draw("meanTotP:ipad","meangTot>0&&isOK"+cutAll,"*")

FitFit(kTRUE)
StoreParam("local:///lustre/alice/akalweit/OCDBforMC") // specify corresponding location before !!


*/  
#include "TMath.h"
#include "TString.h"
#include "TFile.h"
#include "TTree.h"
#include "TObjArray.h"
#include "TF1.h"
#include "TH1.h"
#include "TH2.h"
#include "TH3F.h"
#include "THnSparse.h"
#include "TProfile.h"
#include "TCut.h"
#include "TMatrixD.h"
#include "TVectorD.h"
//
#include "AliCDBManager.h"
#include "AliCDBMetaData.h"
#include "AliCDBId.h"
#include "AliCDBRunRange.h"
#include "AliCDBStorage.h"
#include "AliTPCClusterParam.h"
//
#include "AliTPCcalibPID.h"
#include "AliTPCcalibDB.h"
#include "TStatToolkit.h"

AliTPCClusterParam * paramCl=0;
AliTPCcalibPID * pid =0;
TObjArray fitArr;
TTree * treeDump =0;
TTree * treeQtot;
TTree * treeQmax;
TTree * treeRatioQmax;
TTree * treeRatioQtot;
Int_t kmicolors[10]={1,2,3,4,6,7,8,9,10,11};
Int_t kmimarkers[10]={21,22,23,24,25,26,27,28,29,30};

//                     0      1   2    3        4   5    6    7
//                    dE/dx,  z, phi, theta,    p,  bg, ncls  type
//Int_t binsQA[7]    = {150, 10,  10,    10,   50, 50,  8};

void Init(char* name="calibPID06"){
  //
  //
  TFile fcalib("CalibObjectsTrain2.root");
  //TObjArray * array = (TObjArray*)fcalib.Get("TPCCalib"); // old interface
  pid = ( AliTPCcalibPID *) fcalib.Get(name);
  TString axisName[9];
  axisName[0]  ="dE/dx"; axisName[1]  ="z (cm)";
  axisName[2]  ="sin(#phi)"; axisName[3]  ="tan(#theta)";
  axisName[4]  ="p (GeV)"; axisName[5]  ="#beta#gamma";
  axisName[6]  ="N_{cl}";

  pid->GetHistQtot()->SetTitle("Q_{tot};(z,sin(#phi),tan(#theta),p,betaGamma,ncls); TPC signal Q_{tot} (a.u.)");
  pid->GetHistQmax()->SetTitle("Q_{max};(z,sin(#phi),tan(#theta),p,betaGamma,ncls); TPC signal Q_{max} (a.u.)");

  for (Int_t ivar2=0;ivar2<7;ivar2++){      
    pid->GetHistQmax()->GetAxis(ivar2)->SetName(axisName[ivar2].Data());
    pid->GetHistQtot()->GetAxis(ivar2)->SetName(axisName[ivar2].Data());
    pid->GetHistRatioMaxTot()->GetAxis(ivar2)->SetName(axisName[ivar2].Data());
    pid->GetHistRatioQmax()->GetAxis(ivar2)->SetName(axisName[ivar2].Data());
    pid->GetHistRatioQtot()->GetAxis(ivar2)->SetName(axisName[ivar2].Data());
    //
    pid->GetHistQmax()->GetAxis(ivar2)->SetTitle(axisName[ivar2].Data());
    pid->GetHistQtot()->GetAxis(ivar2)->SetTitle(axisName[ivar2].Data());

    pid->GetHistRatioMaxTot()->GetAxis(ivar2)->SetTitle(axisName[ivar2].Data());
    pid->GetHistRatioQmax()->GetAxis(ivar2)->SetTitle(axisName[ivar2].Data());
    pid->GetHistRatioQtot()->GetAxis(ivar2)->SetTitle(axisName[ivar2].Data());
  }
}


void StoreParam(char* localStorage = "local:///lustre/alice/akalweit/OCDB"){
  Int_t runNumber = 0;
  AliCDBMetaData *metaData= new AliCDBMetaData();
  metaData->SetObjectClassName("AliTPCClusterParam");
  metaData->SetResponsible("Alexander Kalweit");
  metaData->SetBeamPeriod(1);
  metaData->SetAliRootVersion("05-24-00"); 
  metaData->SetComment("October runs calibration");
  AliCDBId id1("TPC/Calib/ClusterParam", runNumber, AliCDBRunRange::Infinity());
  AliCDBStorage *gStorage = AliCDBManager::Instance()->GetStorage(localStorage);
  gStorage->Put(paramCl, id1, metaData);

}




void SetRange(Int_t index, Float_t min, Float_t max){  
  pid->GetHistQmax()->GetAxis(index)->SetRangeUser(min,max);
  pid->GetHistQtot()->GetAxis(index)->SetRangeUser(min,max);

  pid->GetHistRatioMaxTot()->GetAxis(index)->SetRangeUser(min,max);
  pid->GetHistRatioQtot()->GetAxis(index)->SetRangeUser(min,max);
  pid->GetHistRatioQmax()->GetAxis(index)->SetRangeUser(min,max);
  pid->GetHistRatioTruncQtot()->GetAxis(index)->SetRangeUser(min,max);
  pid->GetHistRatioTruncQmax()->GetAxis(index)->SetRangeUser(min,max);
}


void SetType(Int_t type){
  pid->GetHistQmax()->GetAxis(7)->SetRange(type,type);
  pid->GetHistQtot()->GetAxis(7)->SetRange(type,type);
  //
  //
  pid->GetHistRatioMaxTot()->GetAxis(7)->SetRange(type,type);
  pid->GetHistRatioQtot()->GetAxis(7)->SetRange(type,type);
  pid->GetHistRatioQmax()->GetAxis(7)->SetRange(type,type);
  pid->GetHistRatioTruncQtot()->GetAxis(7)->SetRange(type,type);
  pid->GetHistRatioTruncQmax()->GetAxis(7)->SetRange(type,type);

}




void ReadTrees(){
  TFile f0("dumpQtot.root");
  treeQtot = (TTree*)f0.Get("Dump");
  TFile f1("dumpQmax.root");
  treeQmax = (TTree*)f1.Get("Dump");
  TFile f2("dumpRatioQtot.root");
  treeRatioQtot = (TTree*)f2.Get("Dump");
  TFile f3("dumpRatioQmax.root");
  treeRatioQmax = (TTree*)f3.Get("Dump");
}



void Fit(Bool_t updateParam=kFALSE){
  //
  // align pads
  //
  TStatToolkit toolkit;
  Double_t chi2;
  TVectorD paramTot[5], paramMax[5];
  TString *strQT[4], *strQM[4];
  TVectorD paramTotRatio[5], paramMaxRatio[5];
  TString *strQTRatio[5], *strQMRatio[5];

  TMatrixD covar;
  Int_t npoints;
  treeQmax->SetAlias("cdr","(1-1/(1+dr))");
  treeQmax->SetAlias("cty","(1-1/sqrt(1+ty^2))");
  treeQmax->SetAlias("ctz","(1-1/sqrt(1+p3^2))");
  treeQtot->SetAlias("cdr","(1-1/(1+dr))");
  treeQtot->SetAlias("cty","(1-1/sqrt(1+ty^2))");
  treeQtot->SetAlias("ctz","(1-1/sqrt(1+p3^2))");
  //
  treeRatioQmax->SetAlias("cdr","(1-1/(1+dr))");
  treeRatioQmax->SetAlias("cty","(1-1/sqrt(1+ty^2))");
  treeRatioQmax->SetAlias("ctz","(1-1/sqrt(1+p3^2))");
  treeRatioQtot->SetAlias("cdr","(1-1/(1+dr))");
  treeRatioQtot->SetAlias("cty","(1-1/sqrt(1+ty^2))");
  treeRatioQtot->SetAlias("ctz","(1-1/sqrt(1+p3^2))");


  TString strFit="";
  //
  strFit+="dr++";
  strFit+="abs(p3)++";
  //
  strFit+="(1-(sy*sz)/0.5)++";
  strFit+="(1-(sy/0.5))++";
  strFit+="(1-sz)++";

  //
  TCut cutAll="(p>1&&dr>0.1&&val<3)"; 
  TCut cutPads[4];
  TCut cutPadsW[4];
  for (Int_t ipad=0;ipad<4;ipad++){
    printf("fitting pad\t%d\n",ipad);
    cutPads[ipad]=Form("abs(type-%f)<0.2&&(p>1&&dr>0.1&&val<3)",Double_t(ipad+1.5));
    cutPadsW[ipad]=Form("(abs(type-%f)<0.2&&(p>1&&dr>0.1&&val<3))*bincont",Double_t(ipad+1.5));
    //
    strQT[ipad] = toolkit.FitPlane(treeQtot,"val:1/sqrt(bincont)",strFit.Data(),cutAll+cutPads[ipad],chi2,npoints,paramTot[ipad],covar);
    strQM[ipad] = toolkit.FitPlane(treeQmax,"val:1/sqrt(bincont)",strFit.Data(),cutAll+cutPads[ipad],chi2,npoints,paramMax[ipad],covar);

    strQTRatio[ipad] = toolkit.FitPlane(treeRatioQtot,"val:1/sqrt(bincont)",strFit.Data(),cutAll+cutPads[ipad],chi2,npoints,paramTotRatio[ipad],covar);
    strQMRatio[ipad] = toolkit.FitPlane(treeRatioQmax,"val:1/sqrt(bincont)",strFit.Data(),cutAll+cutPads[ipad],chi2,npoints,paramMaxRatio[ipad],covar);

    treeRatioQmax->SetAlias(Form("fitQM%d",ipad),strQM[ipad]->Data()); 
    treeRatioQmax->SetAlias(Form("fitQT%d",ipad),strQT[ipad]->Data()); 
    treeRatioQtot->SetAlias(Form("fitQM%d",ipad),strQM[ipad]->Data()); 
    treeRatioQtot->SetAlias(Form("fitQT%d",ipad),strQT[ipad]->Data()); 
    treeQmax->SetAlias(Form("fitQM%d",ipad),strQM[ipad]->Data()); 
    treeQmax->SetAlias(Form("fitQT%d",ipad),strQT[ipad]->Data()); 
    treeQtot->SetAlias(Form("fitQM%d",ipad),strQM[ipad]->Data()); 
    treeQtot->SetAlias(Form("fitQT%d",ipad),strQT[ipad]->Data()); 
    
    treeQmax->SetAlias(Form("fitQMR%d",ipad),strQMRatio[ipad]->Data()); 
    treeQmax->SetAlias(Form("fitQTR%d",ipad),strQTRatio[ipad]->Data()); 
    treeQtot->SetAlias(Form("fitQMR%d",ipad),strQMRatio[ipad]->Data()); 
    treeQtot->SetAlias(Form("fitQTR%d",ipad),strQTRatio[ipad]->Data()); 
    treeRatioQmax->SetAlias(Form("fitQMR%d",ipad),strQMRatio[ipad]->Data()); 
    treeRatioQmax->SetAlias(Form("fitQTR%d",ipad),strQTRatio[ipad]->Data()); 
    treeRatioQtot->SetAlias(Form("fitQMR%d",ipad),strQMRatio[ipad]->Data()); 
    treeRatioQtot->SetAlias(Form("fitQTR%d",ipad),strQTRatio[ipad]->Data()); 
  }
  //
  //
  //
  for (Int_t ipad=0;ipad<4;ipad++){
    for (Int_t icorr=1;icorr<4;icorr++) {
      paramMax[ipad][icorr]/=paramMax[ipad][0];
      paramTot[ipad][icorr]/=paramTot[ipad][0];
      paramMaxRatio[ipad][icorr]/=paramMaxRatio[ipad][0];
      paramTotRatio[ipad][icorr]/=paramTotRatio[ipad][0];
    }
  }

  for (Int_t ipad=0;ipad<3;ipad++){
    for (Int_t icorr=1;icorr<4;icorr++) {
      paramMax[ipad][icorr]+=(paramMax[3][icorr]+paramMax[ipad][icorr])*0.5;
      paramTot[ipad][icorr]+=(paramTot[3][icorr]+paramTot[ipad][icorr])*0.5;
      if (updateParam){
	(*paramCl->fQNormCorr)(ipad+6,icorr) = paramTot[ipad][icorr+1];
	(*paramCl->fQNormCorr)(ipad+9,icorr) = paramMax[ipad][icorr+1];
      }

    }
  }


//  for (Int_t ipad=0;ipad<3;ipad++){
//    TVectorD *vecMax =  (TVectorD*)(paramCl->fQNormGauss->At(3*1+ipad));
//    TVectorD *vecTot =  (TVectorD*)(paramCl->fQNormGauss->At(3*0+ipad));
//    for (Int_t icorr=1;icorr<4;icorr++){
//      (*vecMax)[icorr]+=paramMax[ipad][icorr]/(*vecMax)[0];
//      (*vecTot)[icorr]+=paramTot[ipad][icorr]/(*vecTot)[0];
//    }
//  }


}

void fitQdep(){ 
  SetRange(6,100,160);
  SetRange(4,0.5,2);
  SetRange(0,0.5,1.5);
  TF1 f1("f1","([0]+[1]/x^2)",0.5,2);
  SetType(2);
  (pid->GetHistRatioQtot()->Projection(0,4))->ProfileX()->Fit(&f1);
  SetType(3);
  (pid->GetHistRatioQtot()->Projection(0,4))->ProfileX()->Fit(&f1);
  SetType(4);
  (pid->GetHistRatioQtot()->Projection(0,4))->ProfileX()->Fit(&f1);
  //
  SetType(2);
  (pid->GetHistRatioQmax()->Projection(0,4))->ProfileX()->Fit(&f1);
  SetType(3);
  (pid->GetHistRatioQmax()->Projection(0,4))->ProfileX()->Fit(&f1);
  SetType(4);
  (pid->GetHistRatioQmax()->Projection(0,4))->ProfileX()->Fit(&f1);

  
}

void LookupHisto(Int_t minTracks=200, Float_t minp=20, Float_t maxp=10000){
  TF1 f1("myg","gaus",0,10);
  Int_t dim[4]={0,1,2,3};
  pid->GetHistQtot()->GetAxis(6)->SetRangeUser(100,160);
  pid->GetHistQtot()->GetAxis(0)->SetRangeUser(0.1,6.); // important adaption to be done here ...
  pid->GetHistQmax()->GetAxis(6)->SetRangeUser(100,160);
  pid->GetHistQmax()->GetAxis(0)->SetRangeUser(0.1,6);  // important adaption to be done here ...

  pid->GetHistQmax()->GetAxis(4)->SetRangeUser(minp,maxp);
  pid->GetHistQtot()->GetAxis(4)->SetRangeUser(minp,maxp);
  
  
  THnSparse *hisTot[4];
  TH3F      *hisTotMean[4];
  Float_t    meanTotPad[4];
  Float_t    rmsTotPad[4];
  //
  THnSparse *hisMax[4];
  TH3F      *hisMaxMean[4];
  Float_t    meanMaxPad[4];
  Float_t    rmsMaxPad[4];

  TObjArray *array = new TObjArray(8);
    
  for (Int_t ipad=0;ipad<4;ipad++){
    pid->GetHistQtot()->GetAxis(7)->SetRange(2+ipad,2+ipad);
    pid->GetHistQmax()->GetAxis(7)->SetRange(2+ipad,2+ipad);
    hisTot[ipad] = pid->GetHistQtot()->Projection(4,dim);
    hisMax[ipad] = pid->GetHistQmax()->Projection(4,dim);
    Float_t drmin = hisTot[ipad]->GetAxis(1)->GetXmin();
    Float_t drmax = hisTot[ipad]->GetAxis(1)->GetXmax();
    Float_t p2min = hisTot[ipad]->GetAxis(2)->GetXmin();
    Float_t p2max = hisTot[ipad]->GetAxis(2)->GetXmax();
    Float_t p3min = hisTot[ipad]->GetAxis(3)->GetXmin();
    Float_t p3max = hisTot[ipad]->GetAxis(3)->GetXmax();
    meanTotPad[ipad] =hisTot[ipad]->Projection(0)->GetMean(); 
    meanMaxPad[ipad] =hisMax[ipad]->Projection(0)->GetMean(); 
    rmsTotPad[ipad] =hisTot[ipad]->Projection(0)->GetRMS(); 
    rmsMaxPad[ipad] =hisMax[ipad]->Projection(0)->GetRMS(); 
    
    hisTotMean[ipad]=new TH3F(Form("htot%d",ipad),Form("htot%d",ipad),
			      hisTot[ipad]->GetAxis(1)->GetNbins(), drmin,drmax,
			      hisTot[ipad]->GetAxis(2)->GetNbins(), p2min,p2max,
			      hisTot[ipad]->GetAxis(3)->GetNbins(), p3min,p3max);
    hisMaxMean[ipad]=new TH3F(Form("hmax%d",ipad),Form("hmax%d",ipad),
			      hisMax[ipad]->GetAxis(1)->GetNbins(), drmin,drmax,
			      hisMax[ipad]->GetAxis(2)->GetNbins(), p2min,p2max,
			      hisMax[ipad]->GetAxis(3)->GetNbins(), p3min,p3max);
    array->AddAt(hisTotMean[ipad],ipad);
    array->AddAt(hisMaxMean[ipad],ipad+4);
  }
  
  for (Int_t ibindr=1;ibindr<hisTot[0]->GetAxis(1)->GetNbins()+1; ibindr++)
    for (Int_t ibinty=1;ibinty<hisTot[0]->GetAxis(2)->GetNbins()+1; ibinty++)
      for (Int_t ibintz=1;ibintz<hisTot[0]->GetAxis(3)->GetNbins()+1; ibintz++)
	for (Int_t ipad=0;ipad<4; ipad++){
	  hisTotMean[ipad]->SetBinContent(ibindr,ibinty,ibintz,meanTotPad[ipad]);
	  hisMaxMean[ipad]->SetBinContent(ibindr,ibinty,ibintz,meanMaxPad[ipad]);
	}
  
  
  TTreeSRedirector * cstream = new TTreeSRedirector("lookupdEdx.root");
  
  for (Int_t ibindr=1;ibindr<hisTot[0]->GetAxis(1)->GetNbins()+1; ibindr+=1)
    for (Int_t ibinty=1;ibinty<hisTot[0]->GetAxis(2)->GetNbins()+1; ibinty+=1)
      for (Int_t ibintz=1;ibintz<hisTot[0]->GetAxis(3)->GetNbins()+1; ibintz+=1)
	for (Int_t ipad=0;ipad<4; ipad++){
	  //
	  Float_t dr =  hisTot[ipad]->GetAxis(1)->GetBinCenter(ibindr);
	  Float_t p2 =  hisTot[ipad]->GetAxis(2)->GetBinCenter(ibinty);
	  Float_t p3 =  hisTot[ipad]->GetAxis(3)->GetBinCenter(ibintz);
	  Int_t sumTot=0, sumMax=0;
	  TH1D * hisproTot =0; 
	  TH1D * hisproMax =0;
	  Float_t delta=0.1;
	  while(1){
	    hisTot[ipad]->GetAxis(1)->SetRangeUser(dr-delta,dr+delta);
	    hisTot[ipad]->GetAxis(2)->SetRangeUser(p2-delta,p2+delta);
	    hisTot[ipad]->GetAxis(3)->SetRangeUser(p3-delta,p3+delta);
	    //
	    hisMax[ipad]->GetAxis(1)->SetRangeUser(dr-delta,dr+delta);
	    hisMax[ipad]->GetAxis(2)->SetRangeUser(p2-delta,p2+delta);
	    hisMax[ipad]->GetAxis(3)->SetRangeUser(p3-delta,p3+delta);
	    // 4 sigma cut
	    hisTot[ipad]->GetAxis(0)->SetRangeUser(meanTotPad[ipad]-4.*rmsTotPad[ipad],meanTotPad[ipad]+4.*rmsTotPad[ipad]);
	    hisMax[ipad]->GetAxis(0)->SetRangeUser(meanMaxPad[ipad]-4.*rmsMaxPad[ipad],meanMaxPad[ipad]+4.*rmsMaxPad[ipad]);
	    hisproTot = hisTot[ipad]->Projection(0);
	    hisproMax = hisMax[ipad]->Projection(0);
	    sumTot  = hisproTot->GetSum();
	    sumMax  = hisproMax->GetSum();
	    if (sumTot>minTracks) break;
	    if (delta>0.35) break;
	    delete hisproTot;
	    delete hisproMax;
	    delta+=0.1;
	  }
	  //
	  Float_t meanTot = hisproTot->GetMean();
	  Float_t rmsTot  = hisproTot->GetRMS();
	  Float_t meanMax = hisproMax->GetMean();
	  Float_t rmsMax  = hisproMax->GetRMS();
	  //

	  Float_t meangTot = -1;
	  Float_t rmsgTot  = -1;
	  Float_t meangMax = -1;
	  Float_t rmsgMax  = -1;
	  if(sumTot>minTracks/2 && rmsTot>0.02&&rmsMax>0.02){
	    f1.SetParameters(hisproTot->GetMaximum(),meanTot,rmsTot);
	    hisproTot->Fit(&f1,"QNR","",0.1,10);
	    meangTot = f1.GetParameter(1);
	    rmsgTot  = f1.GetParameter(2);
	    f1.SetParameters(hisproMax->GetMaximum(),meanMax,rmsMax);
	    hisproMax->Fit(&f1,"QNR","",0.1,10);
	    meangMax = f1.GetParameter(1);
	    rmsgMax  = f1.GetParameter(2);
	  }

	  TH1 *htemp = 0;
	  htemp = hisTot[ipad]->Projection(1);
	  Float_t drc =  htemp->GetMean();
	  delete htemp;
	  htemp = hisTot[ipad]->Projection(2);
	  Float_t p2c =  htemp->GetMean();
	  delete htemp;
	  htemp = hisTot[ipad]->Projection(3);
	  Float_t p3c =  htemp->GetMean();
	  delete htemp;
	  //
	  Bool_t isOK=kTRUE;
	  if (meanTot==0)   {meanTot=meanTotPad[ipad]; isOK=kFALSE;}
	  if (meanMax==0)   {meanMax=meanMaxPad[ipad]; isOK=kFALSE;}
	  //
	  if (TMath::Abs(rmsTot/meanTot-0.12)>0.04) {meanTot=meanTotPad[ipad]; isOK=kFALSE;}
	  if (TMath::Abs(rmsMax/meanMax-0.12)>0.04) {meanMax=meanMaxPad[ipad]; isOK=kFALSE;}
	  //
	  hisTotMean[ipad]->SetBinContent(ibindr,ibinty,ibintz,meanTot);
	  hisMaxMean[ipad]->SetBinContent(ibindr,ibinty,ibintz,meanMax);
	  //
	  printf("%d\t%f\t%f\t%f\t%f\t%f\t%f\n", ipad, dr,p2,p3, meanTot, rmsTot, meangTot);
	  printf("%d\t%f\t%f\t%f\t%f\t%f\t%f\n", ipad, dr,p2,p3, meanMax, rmsMax, meangMax);
	  delete hisproTot;
	  delete hisproMax;
	  (*cstream)<<"dumpdEdx"<<
	    "ipad="<<ipad<<
	    "isOK="<<isOK<<
	    "sumTot="<<sumTot<<
	    "sumMax="<<sumMax<<
	    "meanTotP="<<meanTotPad[ipad]<<
	    "meanMaxP="<<meanMaxPad[ipad]<<
	    "meanTot="<<meanTot<<
	    "rmsTot="<<rmsTot<<
	    "meanMax="<<meanMax<<
	    "rmsMax="<<rmsMax<<
	    //
	    "meangTot="<<meangTot<<
	    "rmsgTot="<<rmsgTot<<
	    "meangMax="<<meangMax<<
	    "rmsgMax="<<rmsgMax<<
	    //
	    "dr="<<dr<<
	    "p2="<<p2<<
	    "p3="<<p3<<
	    "drc="<<drc<<
	    "p2c="<<p2c<<
	    "p3c="<<p3c<<
	    "\n";
	}
  TFile *fstream = cstream->GetFile();
  fstream->cd();
  array->Write("histos",TObject::kSingleKey);
  delete cstream;  
}

void FitFit(Bool_t updateParam=kFALSE){
  
  TStatToolkit toolkit;
  Double_t chi2Tot[5],chi2Max[5];
  TVectorD paramTot[5], paramMax[5];
  TString *strQT[4], *strQM[4];
  TVectorD paramTotRatio[5], paramMaxRatio[5];
  TString *strQTRatio[5], *strQMRatio[5];
  TMatrixD covar;
  Int_t npoints;
  TCut cutPads[5];
  treeDump->SetAlias("drm","(0.5-abs(drc))");
  treeDump->SetAlias("dri","(1-abs(drc))");
  treeDump->SetAlias("ty","tan(asin(p2c))**2");
  treeDump->SetAlias("tz","(abs(p3c)**2*sqrt(1+ty))");
  //
  TString strFit="";
  strFit+="drm++";
  strFit+="ty++";
  strFit+="tz++";
  //
  //strFit+="sqrt(dri*ty)++";
  //strFit+="sqrt(dri*tz)++";
  //strFit+="sqrt(ty*tz)++";
  
  TCut cutAll = "meangTot>0.0&&sumMax>150&&sumTot>150&&rmsgMax/rmsMax<1.5&&abs(p3)<1&&isOK"; // MY MODIFICATION ! isOK added
  for (Int_t ipad=0;ipad<3;ipad++){ // MY MODIFICATION ! <3 instead of 4
    cutPads[ipad]=Form("ipad==%d",ipad);
    //
    strQT[ipad] = toolkit.FitPlane(treeDump,"meangTot/meanTotP",strFit.Data(),cutAll+cutPads[ipad],chi2Tot[ipad],npoints,paramTot[ipad],covar);
    chi2Tot[ipad]=TMath::Sqrt(chi2Tot[ipad]/npoints);
    printf("Tot%d\t%f\t%s\t\n",ipad,chi2Tot[ipad],strQT[ipad]->Data());
    //
    strQM[ipad] = toolkit.FitPlane(treeDump,"meangMax/meanMaxP",strFit.Data(),cutAll+cutPads[ipad],chi2Max[ipad],npoints,paramMax[ipad],covar);
    chi2Max[ipad]=TMath::Sqrt(chi2Max[ipad]/npoints);
    printf("Max%d\t%f\t%s\t\n",ipad,chi2Max[ipad],strQM[ipad]->Data()); 
    //
    strQTRatio[ipad] = toolkit.FitPlane(treeDump,"meangTot/meangMax",strFit.Data(),cutAll+cutPads[ipad],chi2Max[ipad],npoints,paramTotRatio[ipad],covar);
    chi2Max[ipad]=TMath::Sqrt(chi2Max[ipad]/npoints);
    printf("Ratio%d\t%f\t%s\t\n\n",ipad,chi2Max[ipad],strQTRatio[ipad]->Data()); 
    //
    treeDump->SetAlias(Form("fitQT%d",ipad),strQT[ipad]->Data());
    treeDump->SetAlias(Form("fitQM%d",ipad),strQM[ipad]->Data());
    treeDump->SetAlias(Form("fitQTM%d",ipad),strQM[ipad]->Data());
  }


  TMatrixD mat(6,6);
  for (Int_t ipad=0; ipad<3; ipad++){
    for (Int_t icorr=0; icorr<3; icorr++){
      if (updateParam){
	(*paramCl->fQNormCorr)(ipad+6,icorr) += paramTot[ipad][icorr+1];
	(*paramCl->fQNormCorr)(ipad+9,icorr) += paramMax[ipad][icorr+1];
      }
      mat(ipad+0,icorr) = paramTot[ipad][icorr+1];
      mat(ipad+3,icorr) = paramMax[ipad][icorr+1];
    }
  }

  Float_t normShortTot;
  Float_t normMedTot;
  Float_t normLongTot;
  Float_t normTotMean;
  //
  Float_t normShortMax;
  Float_t normMedMax;
  Float_t normLongMax;
  Float_t normMaxMean;
  TH1D * dummyHist = new TH1D("dummyHist","absolute gain alignment of pads",100,0,10);
  //
  treeDump->Draw("meanTotP>>dummyHist","meangTot>0&&isOK&&ipad==0"+cutAll,"");
  normShortTot = dummyHist->GetMean();
  treeDump->Draw("meanTotP>>dummyHist","meangTot>0&&isOK&&ipad==1"+cutAll,"");
  normMedTot = dummyHist->GetMean();
  treeDump->Draw("meanTotP>>dummyHist","meangTot>0&&isOK&&ipad==2"+cutAll,"");
  normLongTot = dummyHist->GetMean();
  normTotMean = (normShortTot+normMedTot+normLongTot)/3.;
  //
  treeDump->Draw("meanMaxP>>dummyHist","meangTot>0&&isOK&&ipad==0"+cutAll,"");
  normShortMax = dummyHist->GetMean();
  treeDump->Draw("meanMaxP>>dummyHist","meangTot>0&&isOK&&ipad==1"+cutAll,"");
  normMedMax = dummyHist->GetMean();
  treeDump->Draw("meanMaxP>>dummyHist","meangTot>0&&isOK&&ipad==2"+cutAll,"");
  normLongMax = dummyHist->GetMean();
  normMaxMean = (normShortMax+normMedMax+normLongMax)/3.;
  
  cout << "Tot: " << normShortTot << " " << normMedTot << " " << normLongTot << endl;
  cout << "Max: " << normShortMax << " " << normMedMax << " " << normLongMax << endl;

  // hand alignment of pads to be improved:
  (*paramCl->fQNormCorr)(0,5) *= (normShortTot/normTotMean);
  (*paramCl->fQNormCorr)(1,5) *= (normMedTot/normTotMean);
  (*paramCl->fQNormCorr)(2,5) *= (normLongTot/normTotMean);
  //
  (*paramCl->fQNormCorr)(3,5) *= (normShortMax/normMaxMean);
  (*paramCl->fQNormCorr)(4,5) *= (normMedMax/normMaxMean);
  (*paramCl->fQNormCorr)(5,5) *= (normLongMax/normMaxMean);


}



 CalibPID.C:1
 CalibPID.C:2
 CalibPID.C:3
 CalibPID.C:4
 CalibPID.C:5
 CalibPID.C:6
 CalibPID.C:7
 CalibPID.C:8
 CalibPID.C:9
 CalibPID.C:10
 CalibPID.C:11
 CalibPID.C:12
 CalibPID.C:13
 CalibPID.C:14
 CalibPID.C:15
 CalibPID.C:16
 CalibPID.C:17
 CalibPID.C:18
 CalibPID.C:19
 CalibPID.C:20
 CalibPID.C:21
 CalibPID.C:22
 CalibPID.C:23
 CalibPID.C:24
 CalibPID.C:25
 CalibPID.C:26
 CalibPID.C:27
 CalibPID.C:28
 CalibPID.C:29
 CalibPID.C:30
 CalibPID.C:31
 CalibPID.C:32
 CalibPID.C:33
 CalibPID.C:34
 CalibPID.C:35
 CalibPID.C:36
 CalibPID.C:37
 CalibPID.C:38
 CalibPID.C:39
 CalibPID.C:40
 CalibPID.C:41
 CalibPID.C:42
 CalibPID.C:43
 CalibPID.C:44
 CalibPID.C:45
 CalibPID.C:46
 CalibPID.C:47
 CalibPID.C:48
 CalibPID.C:49
 CalibPID.C:50
 CalibPID.C:51
 CalibPID.C:52
 CalibPID.C:53
 CalibPID.C:54
 CalibPID.C:55
 CalibPID.C:56
 CalibPID.C:57
 CalibPID.C:58
 CalibPID.C:59
 CalibPID.C:60
 CalibPID.C:61
 CalibPID.C:62
 CalibPID.C:63
 CalibPID.C:64
 CalibPID.C:65
 CalibPID.C:66
 CalibPID.C:67
 CalibPID.C:68
 CalibPID.C:69
 CalibPID.C:70
 CalibPID.C:71
 CalibPID.C:72
 CalibPID.C:73
 CalibPID.C:74
 CalibPID.C:75
 CalibPID.C:76
 CalibPID.C:77
 CalibPID.C:78
 CalibPID.C:79
 CalibPID.C:80
 CalibPID.C:81
 CalibPID.C:82
 CalibPID.C:83
 CalibPID.C:84
 CalibPID.C:85
 CalibPID.C:86
 CalibPID.C:87
 CalibPID.C:88
 CalibPID.C:89
 CalibPID.C:90
 CalibPID.C:91
 CalibPID.C:92
 CalibPID.C:93
 CalibPID.C:94
 CalibPID.C:95
 CalibPID.C:96
 CalibPID.C:97
 CalibPID.C:98
 CalibPID.C:99
 CalibPID.C:100
 CalibPID.C:101
 CalibPID.C:102
 CalibPID.C:103
 CalibPID.C:104
 CalibPID.C:105
 CalibPID.C:106
 CalibPID.C:107
 CalibPID.C:108
 CalibPID.C:109
 CalibPID.C:110
 CalibPID.C:111
 CalibPID.C:112
 CalibPID.C:113
 CalibPID.C:114
 CalibPID.C:115
 CalibPID.C:116
 CalibPID.C:117
 CalibPID.C:118
 CalibPID.C:119
 CalibPID.C:120
 CalibPID.C:121
 CalibPID.C:122
 CalibPID.C:123
 CalibPID.C:124
 CalibPID.C:125
 CalibPID.C:126
 CalibPID.C:127
 CalibPID.C:128
 CalibPID.C:129
 CalibPID.C:130
 CalibPID.C:131
 CalibPID.C:132
 CalibPID.C:133
 CalibPID.C:134
 CalibPID.C:135
 CalibPID.C:136
 CalibPID.C:137
 CalibPID.C:138
 CalibPID.C:139
 CalibPID.C:140
 CalibPID.C:141
 CalibPID.C:142
 CalibPID.C:143
 CalibPID.C:144
 CalibPID.C:145
 CalibPID.C:146
 CalibPID.C:147
 CalibPID.C:148
 CalibPID.C:149
 CalibPID.C:150
 CalibPID.C:151
 CalibPID.C:152
 CalibPID.C:153
 CalibPID.C:154
 CalibPID.C:155
 CalibPID.C:156
 CalibPID.C:157
 CalibPID.C:158
 CalibPID.C:159
 CalibPID.C:160
 CalibPID.C:161
 CalibPID.C:162
 CalibPID.C:163
 CalibPID.C:164
 CalibPID.C:165
 CalibPID.C:166
 CalibPID.C:167
 CalibPID.C:168
 CalibPID.C:169
 CalibPID.C:170
 CalibPID.C:171
 CalibPID.C:172
 CalibPID.C:173
 CalibPID.C:174
 CalibPID.C:175
 CalibPID.C:176
 CalibPID.C:177
 CalibPID.C:178
 CalibPID.C:179
 CalibPID.C:180
 CalibPID.C:181
 CalibPID.C:182
 CalibPID.C:183
 CalibPID.C:184
 CalibPID.C:185
 CalibPID.C:186
 CalibPID.C:187
 CalibPID.C:188
 CalibPID.C:189
 CalibPID.C:190
 CalibPID.C:191
 CalibPID.C:192
 CalibPID.C:193
 CalibPID.C:194
 CalibPID.C:195
 CalibPID.C:196
 CalibPID.C:197
 CalibPID.C:198
 CalibPID.C:199
 CalibPID.C:200
 CalibPID.C:201
 CalibPID.C:202
 CalibPID.C:203
 CalibPID.C:204
 CalibPID.C:205
 CalibPID.C:206
 CalibPID.C:207
 CalibPID.C:208
 CalibPID.C:209
 CalibPID.C:210
 CalibPID.C:211
 CalibPID.C:212
 CalibPID.C:213
 CalibPID.C:214
 CalibPID.C:215
 CalibPID.C:216
 CalibPID.C:217
 CalibPID.C:218
 CalibPID.C:219
 CalibPID.C:220
 CalibPID.C:221
 CalibPID.C:222
 CalibPID.C:223
 CalibPID.C:224
 CalibPID.C:225
 CalibPID.C:226
 CalibPID.C:227
 CalibPID.C:228
 CalibPID.C:229
 CalibPID.C:230
 CalibPID.C:231
 CalibPID.C:232
 CalibPID.C:233
 CalibPID.C:234
 CalibPID.C:235
 CalibPID.C:236
 CalibPID.C:237
 CalibPID.C:238
 CalibPID.C:239
 CalibPID.C:240
 CalibPID.C:241
 CalibPID.C:242
 CalibPID.C:243
 CalibPID.C:244
 CalibPID.C:245
 CalibPID.C:246
 CalibPID.C:247
 CalibPID.C:248
 CalibPID.C:249
 CalibPID.C:250
 CalibPID.C:251
 CalibPID.C:252
 CalibPID.C:253
 CalibPID.C:254
 CalibPID.C:255
 CalibPID.C:256
 CalibPID.C:257
 CalibPID.C:258
 CalibPID.C:259
 CalibPID.C:260
 CalibPID.C:261
 CalibPID.C:262
 CalibPID.C:263
 CalibPID.C:264
 CalibPID.C:265
 CalibPID.C:266
 CalibPID.C:267
 CalibPID.C:268
 CalibPID.C:269
 CalibPID.C:270
 CalibPID.C:271
 CalibPID.C:272
 CalibPID.C:273
 CalibPID.C:274
 CalibPID.C:275
 CalibPID.C:276
 CalibPID.C:277
 CalibPID.C:278
 CalibPID.C:279
 CalibPID.C:280
 CalibPID.C:281
 CalibPID.C:282
 CalibPID.C:283
 CalibPID.C:284
 CalibPID.C:285
 CalibPID.C:286
 CalibPID.C:287
 CalibPID.C:288
 CalibPID.C:289
 CalibPID.C:290
 CalibPID.C:291
 CalibPID.C:292
 CalibPID.C:293
 CalibPID.C:294
 CalibPID.C:295
 CalibPID.C:296
 CalibPID.C:297
 CalibPID.C:298
 CalibPID.C:299
 CalibPID.C:300
 CalibPID.C:301
 CalibPID.C:302
 CalibPID.C:303
 CalibPID.C:304
 CalibPID.C:305
 CalibPID.C:306
 CalibPID.C:307
 CalibPID.C:308
 CalibPID.C:309
 CalibPID.C:310
 CalibPID.C:311
 CalibPID.C:312
 CalibPID.C:313
 CalibPID.C:314
 CalibPID.C:315
 CalibPID.C:316
 CalibPID.C:317
 CalibPID.C:318
 CalibPID.C:319
 CalibPID.C:320
 CalibPID.C:321
 CalibPID.C:322
 CalibPID.C:323
 CalibPID.C:324
 CalibPID.C:325
 CalibPID.C:326
 CalibPID.C:327
 CalibPID.C:328
 CalibPID.C:329
 CalibPID.C:330
 CalibPID.C:331
 CalibPID.C:332
 CalibPID.C:333
 CalibPID.C:334
 CalibPID.C:335
 CalibPID.C:336
 CalibPID.C:337
 CalibPID.C:338
 CalibPID.C:339
 CalibPID.C:340
 CalibPID.C:341
 CalibPID.C:342
 CalibPID.C:343
 CalibPID.C:344
 CalibPID.C:345
 CalibPID.C:346
 CalibPID.C:347
 CalibPID.C:348
 CalibPID.C:349
 CalibPID.C:350
 CalibPID.C:351
 CalibPID.C:352
 CalibPID.C:353
 CalibPID.C:354
 CalibPID.C:355
 CalibPID.C:356
 CalibPID.C:357
 CalibPID.C:358
 CalibPID.C:359
 CalibPID.C:360
 CalibPID.C:361
 CalibPID.C:362
 CalibPID.C:363
 CalibPID.C:364
 CalibPID.C:365
 CalibPID.C:366
 CalibPID.C:367
 CalibPID.C:368
 CalibPID.C:369
 CalibPID.C:370
 CalibPID.C:371
 CalibPID.C:372
 CalibPID.C:373
 CalibPID.C:374
 CalibPID.C:375
 CalibPID.C:376
 CalibPID.C:377
 CalibPID.C:378
 CalibPID.C:379
 CalibPID.C:380
 CalibPID.C:381
 CalibPID.C:382
 CalibPID.C:383
 CalibPID.C:384
 CalibPID.C:385
 CalibPID.C:386
 CalibPID.C:387
 CalibPID.C:388
 CalibPID.C:389
 CalibPID.C:390
 CalibPID.C:391
 CalibPID.C:392
 CalibPID.C:393
 CalibPID.C:394
 CalibPID.C:395
 CalibPID.C:396
 CalibPID.C:397
 CalibPID.C:398
 CalibPID.C:399
 CalibPID.C:400
 CalibPID.C:401
 CalibPID.C:402
 CalibPID.C:403
 CalibPID.C:404
 CalibPID.C:405
 CalibPID.C:406
 CalibPID.C:407
 CalibPID.C:408
 CalibPID.C:409
 CalibPID.C:410
 CalibPID.C:411
 CalibPID.C:412
 CalibPID.C:413
 CalibPID.C:414
 CalibPID.C:415
 CalibPID.C:416
 CalibPID.C:417
 CalibPID.C:418
 CalibPID.C:419
 CalibPID.C:420
 CalibPID.C:421
 CalibPID.C:422
 CalibPID.C:423
 CalibPID.C:424
 CalibPID.C:425
 CalibPID.C:426
 CalibPID.C:427
 CalibPID.C:428
 CalibPID.C:429
 CalibPID.C:430
 CalibPID.C:431
 CalibPID.C:432
 CalibPID.C:433
 CalibPID.C:434
 CalibPID.C:435
 CalibPID.C:436
 CalibPID.C:437
 CalibPID.C:438
 CalibPID.C:439
 CalibPID.C:440
 CalibPID.C:441
 CalibPID.C:442
 CalibPID.C:443
 CalibPID.C:444
 CalibPID.C:445
 CalibPID.C:446
 CalibPID.C:447
 CalibPID.C:448
 CalibPID.C:449
 CalibPID.C:450
 CalibPID.C:451
 CalibPID.C:452
 CalibPID.C:453
 CalibPID.C:454
 CalibPID.C:455
 CalibPID.C:456
 CalibPID.C:457
 CalibPID.C:458
 CalibPID.C:459
 CalibPID.C:460
 CalibPID.C:461
 CalibPID.C:462
 CalibPID.C:463
 CalibPID.C:464
 CalibPID.C:465
 CalibPID.C:466
 CalibPID.C:467
 CalibPID.C:468
 CalibPID.C:469
 CalibPID.C:470
 CalibPID.C:471
 CalibPID.C:472
 CalibPID.C:473
 CalibPID.C:474
 CalibPID.C:475
 CalibPID.C:476
 CalibPID.C:477
 CalibPID.C:478
 CalibPID.C:479
 CalibPID.C:480
 CalibPID.C:481
 CalibPID.C:482
 CalibPID.C:483
 CalibPID.C:484
 CalibPID.C:485
 CalibPID.C:486
 CalibPID.C:487
 CalibPID.C:488
 CalibPID.C:489
 CalibPID.C:490
 CalibPID.C:491
 CalibPID.C:492
 CalibPID.C:493
 CalibPID.C:494
 CalibPID.C:495
 CalibPID.C:496
 CalibPID.C:497
 CalibPID.C:498
 CalibPID.C:499
 CalibPID.C:500
 CalibPID.C:501
 CalibPID.C:502
 CalibPID.C:503
 CalibPID.C:504
 CalibPID.C:505
 CalibPID.C:506
 CalibPID.C:507
 CalibPID.C:508
 CalibPID.C:509
 CalibPID.C:510
 CalibPID.C:511
 CalibPID.C:512
 CalibPID.C:513
 CalibPID.C:514
 CalibPID.C:515
 CalibPID.C:516
 CalibPID.C:517
 CalibPID.C:518
 CalibPID.C:519
 CalibPID.C:520
 CalibPID.C:521
 CalibPID.C:522
 CalibPID.C:523
 CalibPID.C:524
 CalibPID.C:525
 CalibPID.C:526
 CalibPID.C:527
 CalibPID.C:528
 CalibPID.C:529
 CalibPID.C:530
 CalibPID.C:531
 CalibPID.C:532
 CalibPID.C:533
 CalibPID.C:534
 CalibPID.C:535
 CalibPID.C:536
 CalibPID.C:537
 CalibPID.C:538
 CalibPID.C:539
 CalibPID.C:540
 CalibPID.C:541
 CalibPID.C:542
 CalibPID.C:543
 CalibPID.C:544
 CalibPID.C:545
 CalibPID.C:546
 CalibPID.C:547
 CalibPID.C:548
 CalibPID.C:549
 CalibPID.C:550
 CalibPID.C:551
 CalibPID.C:552
 CalibPID.C:553
 CalibPID.C:554
 CalibPID.C:555
 CalibPID.C:556
 CalibPID.C:557
 CalibPID.C:558
 CalibPID.C:559
 CalibPID.C:560
 CalibPID.C:561
 CalibPID.C:562
 CalibPID.C:563
 CalibPID.C:564
 CalibPID.C:565
 CalibPID.C:566
 CalibPID.C:567
 CalibPID.C:568
 CalibPID.C:569
 CalibPID.C:570
 CalibPID.C:571
 CalibPID.C:572
 CalibPID.C:573
 CalibPID.C:574
 CalibPID.C:575
 CalibPID.C:576
 CalibPID.C:577
 CalibPID.C:578
 CalibPID.C:579
 CalibPID.C:580