]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCPreprocessorOffline.cxx
Minor updates (and bugfixes) to allow an efficient fitting of the physical
[u/mrichter/AliRoot.git] / TPC / AliTPCPreprocessorOffline.cxx
index d17625b23b65bbe7df0e550e69acafa7d7238783..7b1809fd6fd9ccd27c1ee432a56bf0f793de8304 100644 (file)
    gSystem->Load("libTPCcalib");
 
    AliTPCPreprocessorOffline proces;
-  process.CalibTimeGain("CalibObjects.root",run0,run1,ocdbPath);
+   TString ocdbPath="local:////"
+   ocdbPath+=gSystem->GetFromPipe("pwd");
+
+   proces.CalibTimeGain("CalibObjects.root",run0,run1,ocdbPath);
+   proces.CalibTimeVdrift("CalibObjects.root",run0,run1,ocdbPath);
   // take the raw calibration data from the file CalibObjects.root 
   // and make a OCDB entry with run  validity run0-run1
   // results are stored at the ocdbPath - local or alien ...
@@ -45,6 +49,7 @@
 #include "TLegend.h"
 #include "TPad.h"
 #include "TH2D.h"
+#include "TH3D.h"
 #include "AliTPCROC.h"
 #include "AliTPCCalROC.h"
 #include "AliESDfriend.h"
@@ -78,6 +83,7 @@ AliTPCPreprocessorOffline::AliTPCPreprocessorOffline():
   fTimeDrift(0),
   fGraphMIP(0),                // graph time dependence of MIP
   fGraphCosmic(0),             // graph time dependence at Plateu
+  fGraphAttachmentMIP(0),
   fFitMIP(0),                  // fit of dependence - MIP
   fFitCosmic(0),               // fit of dependence - Plateu
   fGainArray(new TObjArray),               // array to be stored in the OCDB
@@ -517,7 +523,7 @@ TGraphErrors * AliTPCPreprocessorOffline::MakeGraphFilter0(THnSparse *hisN, Int_
   TVectorD vecMean1(entries);
   TVectorD vecRMS1(entries);
   entries=0;
-  {for (Int_t ibin=firstBinA; ibin<lastBinA; ibin++){
+  {for (Int_t ibin=firstBinA; ibin<=lastBinA; ibin++){
       Double_t cont = hisT->GetBinContent(ibin);
       if (cont<minEntries) continue;
       hisN->GetAxis(itime)->SetRange(ibin-1,ibin+1);
@@ -701,6 +707,7 @@ void AliTPCPreprocessorOffline::CalibTimeGain(const Char_t* fileName, Int_t star
   //
   ReadGainGlobal(fileName);
   AnalyzeGain(startRunNumber,endRunNumber, 1000,1.43);
+  AnalyzeAttachment(startRunNumber,endRunNumber);
   MakeQAPlot(1.43);  
   if (pocdbStorage.Length()==0) pocdbStorage+="local://"+gSystem->GetFromPipe("pwd")+"/OCDB";
   UpdateOCDBGain( startRunNumber, endRunNumber, pocdbStorage.Data());
@@ -762,22 +769,24 @@ Bool_t AliTPCPreprocessorOffline::AnalyzeGain(Int_t startRunNumber, Int_t endRun
   
 
   // 2.) try to create Cosmic spline
-  fGainCosmic->GetHistGainTime()->GetAxis(2)->SetRangeUser(0.51,1.49); // only cosmics
-  fGainCosmic->GetHistGainTime()->GetAxis(4)->SetRangeUser(20,100);    // only Fermi-Plateau muons
-  //
-  fGraphCosmic = AliTPCcalibBase::FitSlices(fGainCosmic->GetHistGainTime(),0,1,minEntriesGaussFit,10);
-  if (fGraphCosmic->GetN()==0) fGraphCosmic = 0x0;
-  //
-  if (fGraphCosmic) {
-    for(Int_t i=0; i < fGraphCosmic->GetN(); i++) {
-      fGraphCosmic->GetY()[i] /= FPtoMIPratio;
-      fGraphCosmic->GetEY()[i] /= FPtoMIPratio;
+  if (fGainCosmic){
+    fGainCosmic->GetHistGainTime()->GetAxis(2)->SetRangeUser(0.51,1.49); // only cosmics
+    fGainCosmic->GetHistGainTime()->GetAxis(4)->SetRangeUser(20,100);    // only Fermi-Plateau muons
+    //
+    fGraphCosmic = AliTPCcalibBase::FitSlices(fGainCosmic->GetHistGainTime(),0,1,minEntriesGaussFit,10);
+    if (fGraphCosmic->GetN()==0) fGraphCosmic = 0x0;
+    //
+    if (fGraphCosmic) {
+      for(Int_t i=0; i < fGraphCosmic->GetN(); i++) {
+       fGraphCosmic->GetY()[i] /= FPtoMIPratio;
+       fGraphCosmic->GetEY()[i] /= FPtoMIPratio;
+      }
     }
+    //
+    if (fGraphCosmic) fFitCosmic = AliTPCcalibTimeGain::MakeSplineFit(fGraphCosmic);
+    if (fGraphCosmic) fGraphCosmic->SetName("TGRAPHERRORS_MEAN_GAIN_COSMIC_ALL"); // set proper names according to naming convention
+    fGainArray->AddAt(fFitCosmic,1);
   }
-  //
-  if (fGraphCosmic) fFitCosmic = AliTPCcalibTimeGain::MakeSplineFit(fGraphCosmic);
-  if (fGraphCosmic) fGraphCosmic->SetName("TGRAPHERRORS_MEAN_GAIN_COSMIC_ALL"); // set proper names according to naming convention
-  fGainArray->AddAt(fFitCosmic,1);
   // with naming convention and backward compatibility
   fGainArray->AddAt(fGraphMIP,2);
   fGainArray->AddAt(fGraphCosmic,3);
@@ -787,6 +796,75 @@ Bool_t AliTPCPreprocessorOffline::AnalyzeGain(Int_t startRunNumber, Int_t endRun
 }
 
 
+Bool_t AliTPCPreprocessorOffline::AnalyzeAttachment(Int_t startRunNumber, Int_t endRunNumber, Int_t minEntriesFit) {
+  //
+  // determine slope as a function of mean driftlength
+  //
+  fGainMIP->GetHistGainTime()->GetAxis(5)->SetRangeUser(startRunNumber, endRunNumber);
+  //
+  fGainMIP->GetHistGainTime()->GetAxis(2)->SetRangeUser(1.51,2.49); // only beam data
+  fGainMIP->GetHistGainTime()->GetAxis(4)->SetRangeUser(0.39,0.51); // only MIP pions
+  //
+  TH3D * hist = fGainMIP->GetHistGainTime()->Projection(1, 0, 3);
+  //
+  Double_t *xvec = new Double_t[hist->GetNbinsX()];
+  Double_t *yvec = new Double_t[hist->GetNbinsX()];
+  Double_t *xerr = new Double_t[hist->GetNbinsX()];
+  Double_t *yerr = new Double_t[hist->GetNbinsX()];
+  Int_t counter  = 0;
+  //
+  for(Int_t i=1; i < hist->GetNbinsX(); i++) {
+    Int_t nsum=0;
+    Int_t imin   =  i;
+    Int_t imax   =  i;    
+    for (Int_t idelta=0; idelta<10; idelta++){
+      //
+      imin   =  TMath::Max(i-idelta,1);
+      imax   =  TMath::Min(i+idelta,hist->GetNbinsX());
+      nsum = TMath::Nint(hist->Integral(imin,imax,1,hist->GetNbinsY()-1,1,hist->GetNbinsZ()-1));
+      //if (nsum==0) break;
+      if (nsum>minEntriesFit) break;
+    }
+    if (nsum<minEntriesFit) continue;
+    //
+    fGainMIP->GetHistGainTime()->GetAxis(1)->SetRangeUser(hist->GetXaxis()->GetBinCenter(imin),hist->GetXaxis()->GetBinCenter(imax)); // define time range
+    TGraphErrors * driftDep = AliTPCcalibBase::FitSlices(fGainMIP->GetHistGainTime(),0,3,100,10,0.1,0.7);
+    if (driftDep->GetN() < 4) {
+      delete driftDep;
+         continue;
+    }
+    //
+    TObjArray arr;
+    //
+    TF1 pol1("polynom1","pol1",10,240);
+    //driftDep->Fit(&pol1,"QNRROB=0.8");
+    driftDep->Fit(&pol1,"QNR");
+    xvec[counter] = 0.5*(hist->GetXaxis()->GetBinCenter(imin)+hist->GetXaxis()->GetBinCenter(imax));
+    yvec[counter] = pol1.GetParameter(1)/pol1.GetParameter(0);
+    xerr[counter] = 0;
+    yerr[counter] = pol1.GetParError(1)/pol1.GetParameter(0);
+    counter++;
+    //
+    delete driftDep;
+  }
+  //
+  fGraphAttachmentMIP = new TGraphErrors(counter, xvec, yvec, xerr, yerr);
+  if (fGraphAttachmentMIP) fGraphAttachmentMIP->SetName("TGRAPHERRORS_MEAN_ATTACHMENT_BEAM_ALL");// set proper names according to naming convention
+  fGainArray->AddLast(fGraphAttachmentMIP);
+  //
+  delete [] xvec;
+  delete [] yvec;
+  delete [] xerr;
+  delete [] yerr;
+  delete hist;
+  //
+  if (counter < 1) return kFALSE;
+  return kTRUE;
+}
+
+
+
+
 
 void AliTPCPreprocessorOffline::UpdateOCDBGain(Int_t startRunNumber, Int_t endRunNumber, const Char_t *storagePath){
   //