Forgotten commit
authormarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 6 May 2009 12:14:38 +0000 (12:14 +0000)
committermarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 6 May 2009 12:14:38 +0000 (12:14 +0000)
calib Time depends on the calibLaser
NumberOf Tracks

TPC/AliTPCcalibLaser.cxx
TPC/AliTPCcalibLaser.h
TPC/AliTPCcalibTimeGain.cxx
TPC/AliTPCcalibTimeGain.h

index bdfd4eb..8d8536f 100644 (file)
@@ -129,7 +129,8 @@ ClassImp(AliTPCcalibLaser)
 AliTPCcalibLaser::AliTPCcalibLaser():
   AliTPCcalibBase(),
   fESD(0),
-  fESDfriend(),
+  fESDfriend(0),
+  fNtracks(0),
   fTracksMirror(336),
   fTracksEsd(336),
   fTracksEsdParam(336),
@@ -191,9 +192,9 @@ AliTPCcalibLaser::AliTPCcalibLaser():
   fDeltaZres2(336),   //->2D histo fo residuals
   //fDeltaYres3(336),   //->2D histo of residuals
   //fDeltaZres3(336),   //->2D histo fo residuals
-  fFitAside(new TVectorD(3)),
-  fFitCside(new TVectorD(3)),      
-  fFitACside(new TVectorD(4)),      
+  fFitAside(new TVectorD(5)),
+  fFitCside(new TVectorD(5)),      
+  fFitACside(new TVectorD(6)),      
   fEdgeXcuts(3),    
   fEdgeYcuts(3),    
   fNClCuts(5),      
@@ -209,6 +210,7 @@ AliTPCcalibLaser::AliTPCcalibLaser(const Text_t *name, const Text_t *title, Bool
   AliTPCcalibBase(),
   fESD(0),
   fESDfriend(0),
+  fNtracks(0),
   fTracksMirror(336),
   fTracksEsd(336),
   fTracksEsdParam(336),
@@ -274,9 +276,9 @@ AliTPCcalibLaser::AliTPCcalibLaser(const Text_t *name, const Text_t *title, Bool
   fDeltaZres2(336),  
   //  fDeltaYres3(336),
   //fDeltaZres3(336),  
-  fFitAside(new TVectorD(3)),        // drift fit - A side
-  fFitCside(new TVectorD(3)),        // drift fit - C- side
-  fFitACside(new TVectorD(4)),        // drift fit - AC- side
+  fFitAside(new TVectorD(5)),        // drift fit - A side
+  fFitCside(new TVectorD(5)),        // drift fit - C- side
+  fFitACside(new TVectorD(6)),        // drift fit - AC- side
   fEdgeXcuts(3),       // cuts in local x direction; used in the refit of the laser tracks
   fEdgeYcuts(3),       // cuts in local y direction; used in the refit of the laser tracks
   fNClCuts(5),         // cuts on the number of clusters per tracklet; used in the refit of the laser tracks
@@ -294,6 +296,7 @@ AliTPCcalibLaser::AliTPCcalibLaser(const AliTPCcalibLaser& calibLaser):
   AliTPCcalibBase(calibLaser), 
   fESD(0),
   fESDfriend(0),
+  fNtracks(0),
   fTracksMirror(336),
   fTracksEsd(336),
   fTracksEsdParam(336),
@@ -358,9 +361,9 @@ AliTPCcalibLaser::AliTPCcalibLaser(const AliTPCcalibLaser& calibLaser):
   fDeltaZres2(((calibLaser.fDeltaZres))),  
   //  fDeltaYres3(((calibLaser.fDeltaYres))),
   //fDeltaZres3(((calibLaser.fDeltaZres))),  
-  fFitAside(new TVectorD(3)),        // drift fit - A side
-  fFitCside(new TVectorD(3)),        // drift fit - C- side
-  fFitACside(new TVectorD(4)),        // drift fit - C- side
+  fFitAside(new TVectorD(5)),        // drift fit - A side
+  fFitCside(new TVectorD(5)),        // drift fit - C- side
+  fFitACside(new TVectorD(6)),        // drift fit - C- side
   fEdgeXcuts(3),       // cuts in local x direction; used in the refit of the laser tracks
   fEdgeYcuts(3),       // cuts in local y direction; used in the refit of the laser tracks
   fNClCuts(5),         // cuts on the number of clusters per tracklet; used in the refit of the laser tracks
@@ -495,6 +498,7 @@ void AliTPCcalibLaser::Process(AliESDEvent * event) {
   Int_t counter=0;
   for (Int_t i=0;i<n;++i) {
     AliESDfriendTrack *friendTrack=fESDfriend->GetTrack(i);
+    if (!friendTrack) continue;
     AliESDtrack *track=fESD->GetTrack(i);
     TObject *calibObject=0;
     AliTPCseed *seed=0;
@@ -507,7 +511,8 @@ void AliTPCcalibLaser::Process(AliESDEvent * event) {
       if (id>0) counter++;
     }
     //
-  }  
+  } 
+  fNtracks=counter;
   if (counter<kMinTracks) return;
 
   FitDriftV();
@@ -1753,22 +1758,27 @@ void AliTPCcalibLaser::DumpMeanInfo(Float_t bfield, Int_t run){
     Float_t rmsphiP = hisphiP->GetRMS();
     Float_t meanZ = hisZ->GetMean();
     Float_t rmsZ = hisZ->GetRMS();
-    hisphi->Fit(&fg,"","",hisphi->GetMean()-4*hisphi->GetRMS(),hisphi->GetMean()+4*hisphi->GetRMS());
+    if (hisphi->GetRMS()>0)
+      hisphi->Fit(&fg,"","",hisphi->GetMean()-4*hisphi->GetRMS(),hisphi->GetMean()+4*hisphi->GetRMS());
     Double_t gphi1 = fg.GetParameter(1);
     Double_t gphi2 = fg.GetParameter(2);
-    hisphiP->Fit(&fg,"","",hisphiP->GetMean()-4*hisphiP->GetRMS(),hisphiP->GetMean()+4*hisphiP->GetRMS());
+    if (hisphiP->GetRMS()>0)
+      hisphiP->Fit(&fg,"","",hisphiP->GetMean()-4*hisphiP->GetRMS(),hisphiP->GetMean()+4*hisphiP->GetRMS());
     Double_t gphiP1 = fg.GetParameter(1);
     Double_t gphiP2 = fg.GetParameter(2);
     //
-    hisZ->Fit(&fg,"","",hisZ->GetMean()-4*hisZ->GetRMS()-0.1,hisZ->GetMean()+4*hisZ->GetRMS()+0.1);
+    if (hisZ->GetRMS()>0)
+      hisZ->Fit(&fg,"","",hisZ->GetMean()-4*hisZ->GetRMS()-0.1,hisZ->GetMean()+4*hisZ->GetRMS()+0.1);
     Double_t gz1 = fg.GetParameter(1);
     Double_t gz2 = fg.GetParameter(2);
     //
-    hisP3->Fit(&fg,"","",hisP3->GetMean()-4*hisP3->GetRMS(),hisP3->GetMean()+4*hisP3->GetRMS());
+    if (hisP3->GetRMS()>0)
+      hisP3->Fit(&fg,"","",hisP3->GetMean()-4*hisP3->GetRMS(),hisP3->GetMean()+4*hisP3->GetRMS());
     Double_t gp31 = fg.GetParameter(1);
     Double_t gp32 = fg.GetParameter(2);
     //
-    hisP4->Fit(&fg,"","",hisP4->GetMean()-4*hisP4->GetRMS(),hisP4->GetMean()+4*hisP4->GetRMS());
+    if (hisP4->GetRMS()>0)
+      hisP4->Fit(&fg,"","",hisP4->GetMean()-4*hisP4->GetRMS(),hisP4->GetMean()+4*hisP4->GetRMS());
     Double_t gp41 = fg.GetParameter(1);
     Double_t gp42 = fg.GetParameter(2);
     //
@@ -2099,7 +2109,7 @@ void AliTPCcalibLaser::DumpMeanInfo(Float_t bfield, Int_t run){
 
 
 
-void AliTPCcalibLaser::DumpScanInfo(TTree * chain){
+void AliTPCcalibLaser::DumpScanInfo(TTree * chain, const char * cutUser){
   //
   //
   //
@@ -2127,10 +2137,11 @@ void AliTPCcalibLaser::DumpScanInfo(TTree * chain){
   Double_t pphi[3];
   Double_t pphiP[3];
   Double_t pmZ[3];
+  Double_t pmP4[3];
   //
   for (Int_t id=0; id<336; id++){
     // id =205;
-    sprintf(cut,"isOK&&fId==%d",id);
+    sprintf(cut,"fId==%d&&%s",id,cutUser);
     Int_t entries = chain->Draw("bz",cut,"goff");
     if (entries<3) continue;
     AliTPCLaserTrack *ltrp = 0;
@@ -2148,17 +2159,17 @@ void AliTPCcalibLaser::DumpScanInfo(TTree * chain){
     //
     chain->Draw("gphi1",cut,"goff");
     memcpy(mphi, chain->GetV1(), entries*sizeof(Double_t));
-    chain->Draw("0.05*abs(mphi)+gphi2",cut,"goff");
+    chain->Draw("0.05*abs(mphi)+abs(gphi2)*0.5+0.05",cut,"goff");
     memcpy(smphi, chain->GetV1(), entries*sizeof(Double_t));
     //
     chain->Draw("gphiP1",cut,"goff");
     memcpy(mphiP, chain->GetV1(), entries*sizeof(Double_t));
-    chain->Draw("0.05*abs(mphiP)+gphiP2",cut,"goff");
+    chain->Draw("0.05*abs(mphiP)+abs(gphiP2)*0.5+0.001",cut,"goff");
     memcpy(smphiP, chain->GetV1(), entries*sizeof(Double_t));
     //
     chain->Draw("gz1",cut,"goff");
     memcpy(mZ, chain->GetV1(), entries*sizeof(Double_t));
-    chain->Draw("0.01*abs(meanZ)+gz2",cut,"goff");
+    chain->Draw("0.01*abs(meanZ)+abs(gz2)*0.5+0.1",cut,"goff");
     memcpy(smZ, chain->GetV1(), entries*sizeof(Double_t));
     //
     //
@@ -2167,6 +2178,16 @@ void AliTPCcalibLaser::DumpScanInfo(TTree * chain){
     // store data  
     // phi
     f->cd("dirphi");
+    Float_t phiB0 =0;
+    Float_t phiPB0=0;
+    Float_t zB0=0;
+    for (Int_t ientry=0; ientry<entries; ientry++){
+      if (TMath::Abs(bz[ientry])<0.05){
+       phiB0  = mphi[ientry];
+       phiPB0 = mphiP[ientry];
+       zB0    = mZ[ientry];
+      }
+    }
     TGraphErrors *grphi = new TGraphErrors(entries,bz,mphi,sbz,smphi);
     grphi->Draw("a*");
     grphi->Fit(&fp);
@@ -2216,7 +2237,9 @@ void AliTPCcalibLaser::DumpScanInfo(TTree * chain){
 
     gPad->SaveAs(Form("pic/z/z_%s.gif",grnamefull));
     grmZ->Write();
-    
+    //
+    // P4
+    //
 
     for (Int_t ientry=0; ientry<entries; ientry++){
       (*pcstream)<<"Mean"<<
@@ -2231,19 +2254,23 @@ void AliTPCcalibLaser::DumpScanInfo(TTree * chain){
        "lpx1="<<lpxyz[1]<<          // reference y
        "lpx2="<<lpxyz[2]<<          // refernece z            
        //values
+       "phiB0="<<phiB0<<          // position shift at 0 field
+       "phiPB0="<<phiPB0<<        // angular  shift at 0 field
+       "zB0="<<zB0<<              // z shift for 0 field
+       //
        "gphi1="<<mphi[ientry]<< // mean - from gaus fit
        "pphi0="<<pphi[0]<<   // offset
-       "pphi1="<<pphi[1]<<   // mean
+       "pphi1="<<pphi[1]<<   // slope
        "pphi2="<<pphi[2]<<   // norm chi2
        //
        "gphiP1="<<mphiP[ientry]<< // mean - from gaus fit
        "pphiP0="<<pphiP[0]<< // offset
-       "pphiP1="<<pphiP[1]<< // mean
+       "pphiP1="<<pphiP[1]<< // slope
        "pphiP2="<<pphiP[2]<< // norm chi2
        //
        "gz1="<<mZ[ientry]<<
        "pmZ0="<<pmZ[0]<<     // offset
-       "pmZ1="<<pmZ[1]<<     // mean
+       "pmZ1="<<pmZ[1]<<     // slope
        "pmZ2="<<pmZ[2]<<     // norm chi2
        "\n";
     }
index d41b86e..1023080 100644 (file)
@@ -24,6 +24,7 @@ class TGraphErrors;
 class TTree;
 class TH2F;
 class AliTPCLaserTrack;
+class TCut;
 
 class AliTPCcalibLaser:public AliTPCcalibBase {
 public:
@@ -33,10 +34,11 @@ public:
   AliTPCcalibLaser & operator=(const AliTPCcalibLaser& calibLaser);
   virtual ~AliTPCcalibLaser();
   virtual void     Process(AliESDEvent *event);
+  Int_t   GetNtracks(){return fNtracks;}
   virtual void Analyze();
   virtual Long64_t Merge(TCollection *li);
   virtual void DumpMeanInfo(Float_t bfield, Int_t run=-1);
-  static  void DumpScanInfo(TTree * tree);
+  static  void DumpScanInfo(TTree * tree, const char * cutUser="entries>300&&(gz2<0.15&&gphi2<0.1&&gp42<0.02&&abs(gp41)<0.03)");
   static  void DumpFitInfo(TTree * chainFit, Int_t id);
   static  TH1* GetLaserProjection(TH2F* his, Int_t laser){return his->ProjectionY("aaa",laser+1,laser+1);}
   //
@@ -58,6 +60,8 @@ public:
 
   AliESDEvent  * fESD;             //! ESD event  - not OWNER
   AliESDfriend * fESDfriend;       //! ESD event  - not OWNER
+  Int_t          fNtracks;         //! counter of associated laser tracks
+  //
   TObjArray      fTracksMirror;    //! tracks with mirror information
   TObjArray      fTracksEsd;       //! tracks with reconstructed information - 
   //                               not owner ESD
@@ -73,8 +77,8 @@ public:
   TObjArray      fDeltaZ;          //-> array of histograms of delta z for each track
   TObjArray      fDeltaP3;         //-> array of histograms of P3      for each track
   TObjArray      fDeltaP4;         //-> array of histograms of P4      for each track
-  TObjArray      fDeltaPhi;        //-> array of histograms of delta z for each track
-  TObjArray      fDeltaPhiP;       //-> array of histograms of delta z for each track
+  TObjArray      fDeltaPhi;        //-> array of histograms of delta Phi for each track
+  TObjArray      fDeltaPhiP;       //-> array of histograms of delta Phi direction for each track
   TObjArray      fSignals;         //->Array of dedx signals
   //
   // Refit residuals histogram
index 96c9669..2d663a5 100644 (file)
 
 /*
 
-//0.  Libraries to lod
+This class provides the calibration of the time dependence of the TPC gain due to pressure and temperature changes etc.
+
+
+//0.  Libraries to load
 gSystem->Load("libANALYSIS");
 gSystem->Load("libSTAT");
 gSystem->Load("libTPCcalib");
@@ -31,25 +34,22 @@ gSystem->Load("libTPCcalib");
 TFile fcalib("CalibObjects.root");
 TObjArray * array = (TObjArray*)fcalib.Get("TPCCalib");
 AliTPCcalibTimeGain * gain = ( AliTPCcalibTimeGain *)array->FindObject("calibTimeGain");
-TGraphErrors * gr = AliTPCcalibBase::FitSlices(gain->GetHistGainTime(),0,1,2000,10,0.2,0.8);
-gain->GetHistGainTime()->Projection(0,1)->Draw("colz")
-gr->SetMarkerStyle(25);
-gr->Draw("lp")
+TGraphErrors * gr = gain->GetGraphGainVsTime(0,500)
 
+TH2D * GainTime = gain->GetHistGainTime()->Projection(0,1)
+GainTime->GetXaxis()->SetTimeDisplay(kTRUE)
+GainTime->GetXaxis()->SetTimeFormat("#splitline{%d/%m}{%H:%M}")
+GainTime->Draw("colz")
 
 //
 // MakeSlineFit example
 //
-AliSplineFit fit;
-fit.SetGraph(gr)
-fit->SetMinPoints(gr->GetN()+1);
-fit->InitKnots(gr,2,0,0.001)
-fit.SplineFit(0)
-fit.MakeDiffHisto(gr)->Draw();
+AliSplineFit *fit = AliTPCcalibTimeGain::MakeSplineFit(gr)
+
 TGraph * grfit = fit.MakeGraph(gr->GetX()[0],gr->GetX()[gr->GetN()-1],50000,0);
 
 gr->SetMarkerStyle(25);
-gr->Draw("alp");
+gr->Draw("lp");
 grfit->SetLineColor(2);
 grfit->Draw("lu");
 
@@ -108,11 +108,13 @@ AliTPCcalibTimeGain::AliTPCcalibTimeGain()
    fHistDeDxTotal(0),
    fIntegrationTimeDeDx(0),
    fMIP(0),
+   fUseMax(0),
    fLowerTrunc(0),
    fUpperTrunc(0),
    fUseShapeNorm(0),
    fUsePosNorm(0),
    fUsePadNorm(0),
+   fUseCookAnalytical(0),
    fIsCosmic(0),
    fLowMemoryConsumption(0)
 {  
@@ -127,11 +129,13 @@ AliTPCcalibTimeGain::AliTPCcalibTimeGain(const Text_t *name, const Text_t *title
    fHistDeDxTotal(0),
    fIntegrationTimeDeDx(0),
    fMIP(0),
+   fUseMax(0),
    fLowerTrunc(0),
    fUpperTrunc(0),
    fUseShapeNorm(0),
    fUsePosNorm(0),
    fUsePadNorm(0),
+   fUseCookAnalytical(0),
    fIsCosmic(0),
    fLowMemoryConsumption(0)
  {
@@ -146,12 +150,12 @@ AliTPCcalibTimeGain::AliTPCcalibTimeGain(const Text_t *name, const Text_t *title
   Double_t deltaTime = EndTime - StartTime;
   
 
-  // main histogram for time dependence: dE/dx, time, type (1-muon cosmic,2-pion beam data), meanDriftlength, momenta (only filled if enough space is available)
+  // main histogram for time dependence: dE/dx, time, type (1-muon cosmic,2-pion beam data), meanDriftlength, momenta (only filled if enough space is available), run number
   Int_t timeBins = TMath::Nint(deltaTime/deltaIntegrationTimeGain);
-  Int_t binsGainTime[5]    = {100,  timeBins,    2,  25, 200};
-  Double_t xminGainTime[5] = {0.5, StartTime,  0.5,   0, 0.1};
-  Double_t xmaxGainTime[5] = {  4,   EndTime,  2.5, 250, 50};
-  fHistGainTime = new THnSparseF("HistGainTime","dEdx time dep.;dEdx;dEdx,time,type,driftlength,momenta",5,binsGainTime,xminGainTime,xmaxGainTime);
+  Int_t binsGainTime[6]    = {100,  timeBins,    2,  25, 200, 10000000};
+  Double_t xminGainTime[6] = {0.5, StartTime,  0.5,   0, 0.1,    -0.5};
+  Double_t xmaxGainTime[6] = {  4,   EndTime,  2.5, 250,  50, 9999999.5};
+  fHistGainTime = new THnSparseF("HistGainTime","dEdx time dep.;dEdx,time,type,driftlength,momenta,run number;dEdx",6,binsGainTime,xminGainTime,xmaxGainTime);
   BinLogX(fHistGainTime, 4);
   //
   fHistDeDxTotal = new TH2F("DeDx","dEdx; momentum p (GeV); TPC signal (a.u.)",250,0.01,100.,1000,0.,1000);
@@ -159,14 +163,16 @@ AliTPCcalibTimeGain::AliTPCcalibTimeGain(const Text_t *name, const Text_t *title
   
   // default values for dE/dx
   fMIP = 50.;
+  fUseMax = kTRUE;
   fLowerTrunc = 0.0;
   fUpperTrunc = 0.7;
   fUseShapeNorm = kTRUE;
   fUsePosNorm = kFALSE;
   fUsePadNorm = kFALSE;
+  fUseCookAnalytical = kFALSE;
   //
   fIsCosmic = kTRUE;
-  fLowMemoryConsumption = kTRUE;
+  fLowMemoryConsumption = kFALSE;
   //
   
  }
@@ -211,6 +217,7 @@ void AliTPCcalibTimeGain::ProcessCosmicEvent(AliESDEvent *event) {
   //
   UInt_t time = event->GetTimeStamp();
   Int_t ntracks = event->GetNumberOfTracks();
+  Int_t runNumber = event->GetRunNumber();
   //
   // track loop
   //
@@ -244,15 +251,15 @@ void AliTPCcalibTimeGain::ProcessCosmicEvent(AliESDEvent *event) {
     }    
 
     if (seed) { 
-      Double_t TPCsignalMax = (1/fMIP)*seed->CookdEdxNorm(fLowerTrunc,fUpperTrunc,1,0,159,fUseShapeNorm,fUsePosNorm,fUsePadNorm,0);
-      fHistDeDxTotal->Fill(meanP, TPCsignalMax);
+      Double_t TPCsignal = GetTPCdEdx(seed);
+      fHistDeDxTotal->Fill(meanP, TPCsignal);
       //
       if (fLowMemoryConsumption) {
        if (meanP < 20) continue;
        meanP = 30; // set all momenta to one in order to save memory
       }
       //dE/dx, time, type (1-muon cosmic,2-pion beam data), momenta
-      Double_t vec[5] = {TPCsignalMax,time,1,meanDrift,meanP}; 
+      Double_t vec[6] = {TPCsignal,time,1,meanDrift,meanP,runNumber};
       fHistGainTime->Fill(vec);
     }
     
@@ -272,6 +279,7 @@ void AliTPCcalibTimeGain::ProcessBeamEvent(AliESDEvent *event) {
   //
   UInt_t time = event->GetTimeStamp();
   Int_t ntracks = event->GetNumberOfTracks();
+  Int_t runNumber = event->GetRunNumber();
   //
   // track loop
   //
@@ -305,15 +313,15 @@ void AliTPCcalibTimeGain::ProcessBeamEvent(AliESDEvent *event) {
     }    
 
     if (seed) { 
-      Double_t TPCsignalMax = (1/fMIP)*seed->CookdEdxNorm(fLowerTrunc,fUpperTrunc,1,0,159,fUseShapeNorm,fUsePosNorm,fUsePadNorm,0);
-      fHistDeDxTotal->Fill(meanP, TPCsignalMax);
+      Double_t TPCsignal = GetTPCdEdx(seed);
+      fHistDeDxTotal->Fill(meanP, TPCsignal);
       //
       if (fLowMemoryConsumption) {
        if (meanP > 0.5 || meanP < 0.4) continue;
        meanP = 0.45; // set all momenta to one in order to save memory
       }
       //dE/dx, time, type (1-muon cosmic,2-pion beam data), momenta
-      Double_t vec[5] = {TPCsignalMax,time,1,meanDrift,meanP}; 
+      Double_t vec[6] = {TPCsignal,time,2,meanDrift,meanP,runNumber};
       fHistGainTime->Fill(vec);
     }
     
@@ -322,7 +330,21 @@ void AliTPCcalibTimeGain::ProcessBeamEvent(AliESDEvent *event) {
 }
 
 
-void AliTPCcalibTimeGain::Analyze() {
+Float_t AliTPCcalibTimeGain::GetTPCdEdx(AliTPCseed * seed) {
+
+  Double_t signal = 0;
+  //
+  if (!fUseCookAnalytical) {
+    signal = (1/fMIP)*seed->CookdEdxNorm(fLowerTrunc,fUpperTrunc,fUseMax,0,159,fUseShapeNorm,fUsePosNorm,fUsePadNorm,0);
+  } else {
+    signal = (1/fMIP)*seed->CookdEdxAnalytical(fLowerTrunc,fUpperTrunc,fUseMax);
+  }
+  //
+  return signal;
+}
+
+
+void AliTPCcalibTimeGain::AnalyzeRun(Int_t minEntries) {
   //
   //
   //
@@ -334,12 +356,29 @@ void AliTPCcalibTimeGain::Analyze() {
     fHistGainTime->GetAxis(4)->SetRangeUser(0.39,0.51); // only MIP pions
   }
   //
-  fGainVsTime = AliTPCcalibBase::FitSlices(fHistGainTime,0,1,2000,10);
+  fGainVsTime = AliTPCcalibBase::FitSlices(fHistGainTime,0,1,minEntries,10);
   //
   return;
 }
 
 
+TGraphErrors * AliTPCcalibTimeGain::GetGraphGainVsTime(Int_t runNumber, Int_t minEntries) {
+  //
+  //
+  //
+  if (runNumber == 0) {
+    if (!fGainVsTime) {
+      AnalyzeRun(minEntries);
+    }
+  } else {
+    // 1st check if the current run was cosmic or beam event
+    fHistGainTime->GetAxis(5)->SetRangeUser(runNumber,runNumber);
+    AnalyzeRun(minEntries);
+  }
+  if (fGainVsTime->GetN() == 0) return 0;
+  return fGainVsTime;
+}
+
 Long64_t AliTPCcalibTimeGain::Merge(TCollection *li) {
 
   TIterator* iter = li->MakeIterator();
@@ -362,6 +401,19 @@ Long64_t AliTPCcalibTimeGain::Merge(TCollection *li) {
 }
 
 
+AliSplineFit * AliTPCcalibTimeGain::MakeSplineFit(TGraphErrors * graph) {
+  //
+  //
+  //
+  AliSplineFit *fit = new AliSplineFit();
+  fit->SetGraph(graph);
+  fit->SetMinPoints(graph->GetN()+1);
+  fit->InitKnots(graph,2,0,0.001);
+  fit->SplineFit(0);
+  return fit;
+  
+}
+
 
 void AliTPCcalibTimeGain::BinLogX(THnSparse *h, Int_t axisDim) {
 
index c093df4..51fb045 100644 (file)
@@ -9,6 +9,7 @@
 #include "TF1.h"
 #include "TArrayD.h"
 #include "TObjArray.h"
+#include "AliSplineFit.h"
 
 class TH1F;
 class TH3F;
@@ -19,6 +20,7 @@ class TGraphErrors;
 class AliESDEvent;
 class AliESDtrack;
 class AliTPCcalibLaser;
+class AliTPCseed;
 
 #include "TTreeStream.h"
 
@@ -31,7 +33,7 @@ public:
   //
   virtual void           Process(AliESDEvent *event);
   virtual Long64_t       Merge(TCollection *li);
-  virtual void           Analyze();
+  virtual void           AnalyzeRun(Int_t minEntries);
   //
   void                   ProcessCosmicEvent(AliESDEvent *event);
   void                   ProcessBeamEvent(AliESDEvent *event);
@@ -43,9 +45,11 @@ public:
   THnSparse *            GetHistGainTime(){return (THnSparse*) fHistGainTime;};
   TH2F      *            GetHistDeDxTotal(){return (TH2F*) fHistDeDxTotal;};
   //
-  TGraphErrors *         GetGraphGainVsTime(){return fGainVsTime;};
+  TGraphErrors *         GetGraphGainVsTime(Int_t runNumber = 0, Int_t minEntries = 2000);
+  static AliSplineFit *  MakeSplineFit(TGraphErrors * graph);
   //
-  void SetMIP(Float_t MIP){fMIP = MIP;};  
+  void SetMIP(Float_t MIP){fMIP = MIP;};
+  void SetUseMax(Bool_t UseMax){fUseMax = UseMax;};
   void SetLowerTrunc(Float_t LowerTrunc){fLowerTrunc = LowerTrunc;};
   void SetUpperTrunc(Float_t UpperTrunc){fUpperTrunc = UpperTrunc;};
   void SetUseShapeNorm(Bool_t UseShapeNorm){fUseShapeNorm = UseShapeNorm;};
@@ -53,9 +57,12 @@ public:
   void SetUsePadNorm(Int_t UsePadNorm){fUsePadNorm = UsePadNorm;};
   void SetIsCosmic(Bool_t IsCosmic){fIsCosmic = IsCosmic;};
   void SetLowMemoryConsumption(Bool_t LowMemoryConsumption){fLowMemoryConsumption = LowMemoryConsumption;};
+  void SetUseCookAnalytical(Bool_t UseCookAnalytical){fUseCookAnalytical = UseCookAnalytical;};
 
 private:
   //
+  Float_t GetTPCdEdx(AliTPCseed * seed);   // wrapper for CookdEdxNorm or analytical
+  //
   THnSparse    * fHistGainTime;            // dEdx vs. time, type, Driftlength, momentum P
   TGraphErrors * fGainVsTime;              // multiplication factor vs. time
   TH2F         * fHistDeDxTotal;           // dEdx vs. momentum for quality assurance
@@ -64,11 +71,13 @@ private:
   //
   Float_t fMIP;                         // rough MIP position in order to have scaleable histograms
   //
+  Bool_t  fUseMax;                      // true: use max charge for dE/dx calculation, false: use total charge for dE/dx calculation
   Float_t fLowerTrunc;                  // lower truncation of dE/dx ; at most 5%
   Float_t fUpperTrunc;                  // upper truncation of dE/dx ; ca. 70%
   Bool_t  fUseShapeNorm;                // use empirical correction of dependencies
   Bool_t  fUsePosNorm;                  // charge correction (analytical?)
   Int_t   fUsePadNorm;                  // normalization of pad geometries
+  Bool_t  fUseCookAnalytical;           // true if CookdEdxAnalytical should be used
   //
   Bool_t  fIsCosmic;                    // kTRUE if the analyzed runs contain cosmic events
   Bool_t  fLowMemoryConsumption;        // set this option kTRUE if the momenta information should not be stored in order to save memory