]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCcalibLaser.cxx
adapted macro to QAManager
[u/mrichter/AliRoot.git] / TPC / AliTPCcalibLaser.cxx
index 032078c85d4c57aa20e5ce20a362a75eacedb2e0..fcc5a6af59c6b41cdc50175153cf789de9137e7e 100644 (file)
@@ -34,7 +34,7 @@
   //
   // To make laser scan the user interaction neccessary
   //
-  .x ~/UliStyle.C
+  .x ~/NimStyle.C
   gSystem->Load("libANALYSIS");
   gSystem->Load("libTPCcalib");
   TFile fcalib("CalibObjects.root");
 #include "AliTPCcalibDB.h"
 #include "AliTPCParam.h"
 #include "TTimeStamp.h"
+#include "AliDCSSensorArray.h"
+#include "AliDCSSensor.h"
 
 using namespace std;
 
@@ -127,7 +129,8 @@ ClassImp(AliTPCcalibLaser)
 AliTPCcalibLaser::AliTPCcalibLaser():
   AliTPCcalibBase(),
   fESD(0),
-  fESDfriend(),
+  fESDfriend(0),
+  fNtracks(0),
   fTracksMirror(336),
   fTracksEsd(336),
   fTracksEsdParam(336),
@@ -189,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),      
@@ -207,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),
@@ -272,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
@@ -292,6 +296,7 @@ AliTPCcalibLaser::AliTPCcalibLaser(const AliTPCcalibLaser& calibLaser):
   AliTPCcalibBase(calibLaser), 
   fESD(0),
   fESDfriend(0),
+  fNtracks(0),
   fTracksMirror(336),
   fTracksEsd(336),
   fTracksEsdParam(336),
@@ -356,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
@@ -433,6 +438,33 @@ AliTPCcalibLaser::~AliTPCcalibLaser() {
     delete fHisPz2vP2Out;  //-> Curv  P2outer - parabola
     delete fHisPz3vP2IO;   //-> Curv  P2outerinner - common parabola
   }
+  //
+  //
+  //
+  fDeltaZ.SetOwner();          //-> array of histograms of delta z for each track
+  fDeltaP3.SetOwner();         //-> array of histograms of P3      for each track
+  fDeltaP4.SetOwner();         //-> array of histograms of P4      for each track
+  fDeltaPhi.SetOwner();        //-> array of histograms of delta z for each track
+  fDeltaPhiP.SetOwner();       //-> array of histograms of delta z for each track
+  fSignals.SetOwner();         //->Array of dedx signals
+  
+  fDeltaZ.Delete();          //-> array of histograms of delta z for each track
+  fDeltaP3.Delete();         //-> array of histograms of P3      for each track
+  fDeltaP4.Delete();         //-> array of histograms of P4      for each track
+  fDeltaPhi.Delete();        //-> array of histograms of delta z for each track
+  fDeltaPhiP.Delete();       //-> array of histograms of delta z for each track
+  fSignals.Delete();         //->Array of dedx signals
+
+  fDeltaYres.SetOwner();
+  fDeltaYres.Delete();
+  fDeltaZres.SetOwner();
+  fDeltaZres.Delete();
+  fDeltaYres2.SetOwner();
+  fDeltaYres2.Delete();
+  fDeltaZres2.SetOwner();
+  fDeltaZres2.Delete();
+  
+
 }
 
 
@@ -461,32 +493,35 @@ void AliTPCcalibLaser::Process(AliESDEvent * event) {
     fClusterCounter[id]=0;
     fClusterSatur[id]=0;
   }
-  static Bool_t init=kFALSE;
-  if (!init){
-    init = kTRUE;  // way around for PROOF - to be investigated
-    MakeFitHistos();
-  }
   //
   Int_t n=fESD->GetNumberOfTracks();
   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;
     for (Int_t j=0;(calibObject=friendTrack->GetCalibObject(j));++j)
       if ((seed=dynamic_cast<AliTPCseed*>(calibObject)))
        break;
-    if (track&&seed) {
+    if (track&&seed &&TMath::Abs(track->Pt()) >1 ) {
+      //filter CE tracks
       Int_t id = FindMirror(track,seed);
       if (id>0) counter++;
     }
     //
-  }  
+  } 
+  fNtracks=counter;
   if (counter<kMinTracks) return;
 
   FitDriftV();
   if (!fFullCalib) return;
+  static Bool_t init=kFALSE;
+  if (!init){
+    init = kTRUE;  // way around for PROOF - to be investigated
+    MakeFitHistos();
+  }
   //
   for (Int_t id=0; id<336; id++){    
     //
@@ -657,7 +692,14 @@ void AliTPCcalibLaser::FitDriftV(){
       fdriftA.GetParameters(fitA);
       npointsA= fdriftA.GetNpoints();
       chi2A = fdriftA.GetChisquare()/fdriftA.GetNpoints();
-      if (chi2A<kChi2Cut ||(*fFitAside)[0]==0 ) (*fFitAside) = fitA;
+      if (chi2A<kChi2Cut ||(*fFitAside)[0]==0 ) {
+       if (fFitAside->GetNoElements()<5) fFitAside->ResizeTo(5);
+       (*fFitAside)[0] = fitA[0];
+       (*fFitAside)[1] = fitA[1];
+       (*fFitAside)[2] = fitA[2];
+       (*fFitAside)[3] = fdriftA.GetNpoints();
+       (*fFitAside)[4] = chi2A;        
+      }
     }
     if (fdriftC.GetNpoints()>10){
       fdriftC.Eval();
@@ -667,7 +709,14 @@ void AliTPCcalibLaser::FitDriftV(){
       fdriftC.GetParameters(fitC);
       npointsC= fdriftC.GetNpoints();
       chi2C = fdriftC.GetChisquare()/fdriftC.GetNpoints();
-      if (chi2C<kChi2Cut||(*fFitCside)[0]==0) (*fFitCside) = fitC;
+      if (chi2C<kChi2Cut||(*fFitCside)[0]==0) {        
+       if (fFitCside->GetNoElements()<5) fFitCside->ResizeTo(5);
+       (*fFitCside)[0] = fitC[0];
+       (*fFitCside)[1] = fitC[1];
+       (*fFitCside)[2] = fitC[2];
+       (*fFitCside)[3] = fdriftC.GetNpoints();
+       (*fFitCside)[4] = chi2C;        
+      }
     }
 
     if (fdriftAC.GetNpoints()>10&&fdriftC.GetNpoints()>10&&fdriftA.GetNpoints()>10){
@@ -718,6 +767,13 @@ void AliTPCcalibLaser::FitDriftV(){
       Double_t ptrelative1   = AliTPCcalibDB::GetPTRelative(tstamp,fRun,1);
       Double_t temp0         = AliTPCcalibDB::GetTemperature(tstamp,fRun,0);
       Double_t temp1         = AliTPCcalibDB::GetTemperature(tstamp,fRun,1);
+      TVectorD vecGoofie(20);
+      AliDCSSensorArray* goofieArray = AliTPCcalibDB::Instance()->GetGoofieSensors(fRun);
+      if (goofieArray) 
+       for (Int_t isensor=0; isensor<goofieArray->NumSensors();isensor++){
+         AliDCSSensor *gsensor = goofieArray->GetSensor(isensor);
+         if (gsensor) vecGoofie[isensor]=gsensor->GetValue(tstamp);
+       }
 
       if (cstream){
        (*cstream)<<"driftv"<<
@@ -733,6 +789,7 @@ void AliTPCcalibLaser::FitDriftV(){
          "pt1="<<ptrelative1<<
          "temp0="<<temp0<<
          "temp1="<<temp1<<
+         "vecGoofie.="<<&vecGoofie<<
          //
          //
          "iter="<<iter<<
@@ -866,6 +923,7 @@ Int_t  AliTPCcalibLaser::FindMirror(AliESDtrack *track, AliTPCseed *seed){
   //
   Float_t radius=TMath::Abs(ltrp->GetX());
   AliTracker::PropagateTrackTo(&param,radius,0.10566,0.01,kTRUE);
+  param.Rotate(ltrp->GetAlpha());
   //
   if (!fTracksMirror.At(id)) fTracksMirror.AddAt(ltrp,id);
   Bool_t accept=kTRUE;  
@@ -1002,11 +1060,13 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
   //=============================================//
   // Linear Fitters for the Different Approaches //
   //=============================================//
-  //linear fit model in y and z; inner - outer sector
+  //linear fit model in y and z; inner - outer sector, combined with offset
   static TLinearFitter fy1I(2,"hyp1");
   static TLinearFitter fy1O(2,"hyp1");
   static TLinearFitter fz1I(2,"hyp1");
   static TLinearFitter fz1O(2,"hyp1");
+  static TLinearFitter fy1IO(3,"hyp2");
+  static TLinearFitter fz1IO(3,"hyp2");
   //quadratic fit model in y and z; inner - sector
   static TLinearFitter fy2I(3,"hyp2");
   static TLinearFitter fy2O(3,"hyp2");
@@ -1051,6 +1111,7 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
       TVectorD vecy1resOuter(2),vecz1resOuter(2); //pol1 fit parameters outer
       TVectorD vecy2resOuter(3),vecz2resOuter(3); //pol2 fit parameters outer
       TVectorD vecy4res(5),vecz4res(5);
+      TVectorD vecy1resIO(3),vecz1resIO(3);
       // cluster and track positions for each row - used for residuals
       TVectorD vecgX(159);        // global X
       TVectorD vecgY(159);        // global Y
@@ -1061,6 +1122,8 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
       TVectorD vecZkalman(159);  // z from kalman fit
       TVectorD vecY1(159);       // y from pol1 fit per ROC
       TVectorD vecZ1(159);       // z from pol1 fit per ROC
+      TVectorD vecY1IO(159);     // y from pol1 fit per ROC
+      TVectorD vecZ1IO(159);     // z from pol1 fit per ROC
       TVectorD vecY2(159);       // y from pol2 fit per ROC
       TVectorD vecZ2(159);       // z from pol2 fit per ROC
       TVectorD vecY4(159);       // y from sector fit
@@ -1074,6 +1137,8 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
       Double_t chi2I1y=0;       // chi2 of pol1 fit in y (inner)
       Double_t chi2O1z=0;       // chi2 of pol1 fit in z (outer)
       Double_t chi2O1y=0;       // chi2 of pol1 fit in y (outer)
+      Double_t chi2IO1z=0;       // chi2 of pol1 fit in z (outer)
+      Double_t chi2IO1y=0;       // chi2 of pol1 fit in y (outer)
       Double_t chi2I2z=0;       // chi2 of pol2 fit in z (inner)
       Double_t chi2I2y=0;       // chi2 of pol2 fit in y (inner)
       Double_t chi2O2z=0;       // chi2 of pol2 fit in z (outer)
@@ -1185,11 +1250,11 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
          vecClY[irow] = c->GetY();
          vecClZ[irow] = c->GetZ();
          //
-         Float_t gxyz[3];
-         c->GetGlobalXYZ(gxyz);
-         vecgX[irow]   = gxyz[0];
-         vecgY[irow]   = gxyz[1];
-         vecgZ[irow]   = gxyz[2];
+//       Float_t gxyz[3];
+//       c->GetGlobalXYZ(gxyz);
+//       vecgX[irow]   = gxyz[0];
+//       vecgY[irow]   = gxyz[1];
+//       vecgZ[irow]   = gxyz[2];
           //
           Double_t x = vecX[irow]-133.4; //reference is between IROC and OROC
           Double_t y = vecClY[irow];
@@ -1197,9 +1262,11 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
           //
          Double_t x2[2]={x,x*x};   //linear and parabolic parameters
          Double_t x4[4]={0,0,0,0}; //hyp4 parameters
+          Double_t xIO[2]={0,x};    //common linear + offset IROC-OROC
          if ( roc == innerSector ) {
              x4[0]=1; //offset inner - outer sector
              x4[1]=x; //slope parameter inner sector
+              xIO[0]=1;
          } else {
              x4[2]=x; //slope parameter outer sector
          }
@@ -1235,6 +1302,8 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
          }
          fy4.AddPoint(x4,y);
          fz4.AddPoint(x4,z);
+          fy1IO.AddPoint(xIO,y);
+          fz1IO.AddPoint(xIO,z);
       }
       if (nclI>0)  {
        msigmaYIn/=nclI;
@@ -1290,6 +1359,16 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
              fz4.GetParameters(vecz4res);
              chi2IOz=fz4.GetChisquare()/(fz4.GetNpoints()-5);
          }
+          if (fy1IO.GetNpoints()>0) {
+            fy1IO.Eval();
+            fy1IO.GetParameters(vecy1resIO);
+            chi2IO1y=fy1IO.GetChisquare()/(fy1IO.GetNpoints()-3);
+          }
+          if (fz1IO.GetNpoints()>0) {
+            fz1IO.Eval();
+            fz1IO.GetParameters(vecz1resIO);
+            chi2IO1z=fz1IO.GetChisquare()/(fz1IO.GetNpoints()-3);
+          }
       }
       //clear points
       fy4.ClearPoints();  fz4.ClearPoints();
@@ -1297,6 +1376,7 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
       fz1I.ClearPoints(); fz1O.ClearPoints();
       fy2I.ClearPoints(); fy2O.ClearPoints();
       fz2I.ClearPoints(); fz2O.ClearPoints();
+      fy1IO.ClearPoints(); fz1IO.ClearPoints();
       //==============================//
       // calculate tracklet positions //
       //==============================//
@@ -1333,6 +1413,8 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
           //
           Double_t yoffInner=0;
           Double_t zoffInner=0;
+          Double_t yoffInner1=0;
+          Double_t zoffInner1=0;
           Double_t yslopeInner=0;
           Double_t yslopeOuter=0;
           Double_t zslopeInner=0;
@@ -1353,10 +1435,14 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
               vecY2[irow]=vecy2resInner[0]+vecy2resInner[1]*xref+vecy2resInner[2]*xref*xref;
               vecZ2[irow]=vecz2resInner[0]+vecz2resInner[1]*xref+vecz2resInner[2]*xref*xref;
               yoffInner=vecy4res[1];
-             zoffInner=vecz4res[1];
+              zoffInner=vecz4res[1];
+              yoffInner1=vecy1resIO[1];
+              zoffInner1=vecz1resIO[1];
               yslopeInner=vecy4res[2];
              zslopeInner=vecz4res[2];
          }
+          vecY1IO[irow]=vecy1resIO[0]+yoffInner1+vecy1resIO[2]*xref;
+          vecZ1IO[irow]=vecz1resIO[0]+zoffInner1+vecz1resIO[2]*xref;
          vecY4[irow]=vecy4res[0]+yoffInner+yslopeInner*xref+yslopeOuter*xref+vecy4res[4]*xref*xref;
          vecZ4[irow]=vecz4res[0]+zoffInner+zslopeInner*xref+zslopeOuter*xref+vecz4res[4]*xref*xref;
           //positions of kalman fits
@@ -1400,9 +1486,11 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
              "dEdx="       << dedx <<
              "LTr.="       << ltrp <<
              "Tr.="        << extparam <<
-             "yPol1In.="   << &vecy1resInner <<
-             "zPol1In.="   << &vecz1resInner <<
-             "yPol2In.="   << &vecy2resInner <<
+              "yPol1In.="   << &vecy1resInner <<
+              "zPol1In.="   << &vecz1resInner <<
+              "yPol1InOut.="<< &vecy1resIO <<
+              "zPol1InOut.="<< &vecz1resIO <<
+              "yPol2In.="   << &vecy2resInner <<
              "zPol2In.="   << &vecz2resInner <<
              "yPol1Out.="  << &vecy1resOuter <<
              "zPol1Out.="  << &vecz1resOuter <<
@@ -1410,9 +1498,11 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
              "zPol2Out.="  << &vecz2resOuter <<
              "yInOut.="    << &vecy4res <<
              "zInOut.="    << &vecz4res <<
-             "chi2y1In="   << chi2I1y <<
-             "chi2z1In="   << chi2I1z <<
-             "chi2y1Out="  << chi2O1y <<
+              "chi2y1In="   << chi2I1y <<
+              "chi2z1In="   << chi2I1z <<
+              "chi2y1InOut="<< chi2IO1y <<
+              "chi2z1InOut="<< chi2IO1z <<
+              "chi2y1Out="  << chi2O1y <<
              "chi2z1Out="  << chi2O1z <<
              "chi2y2In="   << chi2I2y <<
              "chi2z2In="   << chi2I2z <<
@@ -1464,9 +1554,11 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
              "TrZpol1.="   << &vecZ1 <<
              "TrYpol2.="   << &vecY2 <<
              "TrZpol2.="   << &vecZ2 <<
-             "TrYInOut.="  << &vecY4 <<
-             "TrZInOut.="  << &vecZ4 <<
-             "ClY.="       << &vecClY <<
+              "TrYpol1InOut.="<< &vecY1IO <<
+              "TrZpol1InOut.="<< &vecZ1IO <<
+              "TrYInOut.="  << &vecY4 <<
+              "TrZInOut.="  << &vecZ4 <<
+              "ClY.="       << &vecClY <<
              "ClZ.="       << &vecClZ <<
              "isReject.="  << &isReject<<
              "sec.="       << &vecSec <<
@@ -1487,7 +1579,9 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
              "chi2z1In="   << chi2I1z <<
              "chi2y1Out="  << chi2O1y <<
              "chi2z1Out="  << chi2O1z <<
-             "chi2y2In="   << chi2I2y <<
+              "chi2y1InOut="<< chi2IO1y <<
+              "chi2z1InOut="<< chi2IO1z <<
+              "chi2y2In="   << chi2I2y <<
              "chi2z2In="   << chi2I2z <<
              "chi2y2Out="  << chi2O2y <<
              "chi2z2Out="  << chi2O2z <<
@@ -1500,7 +1594,9 @@ void AliTPCcalibLaser::RefitLaserJW(Int_t id){
              "zPol2In.="   << &vecz2resInner <<
              "yPol1Out.="  << &vecy1resOuter <<
              "zPol1Out.="  << &vecz1resOuter <<
-             "yPol2Out.="  << &vecy2resOuter <<
+              "yPol1InOut.="<< &vecy1resIO <<
+              "zPol1InOut.="<< &vecz1resIO <<
+              "yPol2Out.="  << &vecy2resOuter <<
              "zPol2Out.="  << &vecz2resOuter <<
 
              "\n";
@@ -1662,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(),hisZ->GetMean()+4*hisZ->GetRMS());
+    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);
     //
@@ -2008,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){
   //
   //
   //
@@ -2036,10 +2137,11 @@ void AliTPCcalibLaser::DumpScanInfo(TTree * chain){
   Double_t pphi[3];
   Double_t pphiP[3];
   Double_t pmZ[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;
@@ -2057,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));
     //
     //
@@ -2076,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);
@@ -2125,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"<<
@@ -2140,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";
     }
@@ -2177,7 +2295,7 @@ Long64_t AliTPCcalibLaser::Merge(TCollection *li) {
   static Int_t counter0=0;
   while ((cal = (AliTPCcalibLaser*)iter->Next())) {
     if (!cal->InheritsFrom(AliTPCcalibLaser::Class())) {
-      Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName());
+      //      Error("Merge","Attempt to add object of class %s to a %s", cal->ClassName(), this->ClassName());
       return -1;
     }
     printf("Marging number %d\n", counter0);
@@ -2253,19 +2371,19 @@ Long64_t AliTPCcalibLaser::Merge(TCollection *li) {
       // merge ProfileY histograms -0
       h2m = (TH2F*)cal->fDeltaYres.At(id);
       h2  = (TH2F*)fDeltaYres.At(id);
-      if (h2m) h2->Add(h2m);
+      if (h2m&&h2) h2->Add(h2m);
       //
       h2m = (TH2F*)cal->fDeltaZres.At(id);
       h2  = (TH2F*)fDeltaZres.At(id);
-      if (h2m) h->Add(h2m);
+      if (h2m&&h2) h2->Add(h2m);
       // merge ProfileY histograms - 2
       h2m = (TH2F*)cal->fDeltaYres2.At(id);
       h2  = (TH2F*)fDeltaYres2.At(id);
-      if (h2m) h2->Add(h2m);
+      if (h2m&&h2) h2->Add(h2m);
       //
       h2m = (TH2F*)cal->fDeltaZres2.At(id);
       h2  = (TH2F*)fDeltaZres2.At(id);
-      if (h2m) h->Add(h2m);
+      if (h2m&&h2) h2->Add(h2m);
       // merge ProfileY histograms - 3
       //h2m = (TH2F*)cal->fDeltaYres3.At(id);
       //h2  = (TH2F*)fDeltaYres3.At(id);