ROOT logo
/**************************************************************************
 * Copyright(c) 2006-07, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

//-------------------------------------------------------------------------
//                Implementation of the AliSplineFit class
//   The class performs a spline fit on an incoming TGraph. The graph is
//   divided into several parts (identified by knots between each part).
//   Spline fits are performed on each part. According to user parameters,
//   the function, first and second derivative are requested to be continuous
//   at each knot.
//        Origin: Marian Ivanov, CERN, Marian.Ivanov@cern.ch
//   Adjustments by Haavard Helstrup,  Haavard.Helstrup@cern.ch
//-------------------------------------------------------------------------


#include "AliSplineFit.h"
#include "AliLog.h"

ClassImp(AliSplineFit)

TLinearFitter* AliSplineFit::fitterStatic()
{
  static TLinearFitter* fit = new TLinearFitter(4,"pol3","");
  return fit;
}

AliSplineFit::AliSplineFit() :
  fBDump(kFALSE),
  fGraph (0),
  fNmin (0),
  fMinPoints(0),
  fSigma (0),
  fMaxDelta (0),
  fN0 (0),
  fParams (0),
  fCovars (0),
  fIndex (0),
  fN    (0),
  fChi2  (0.0),
  fX   (0),
  fY0  (0),
  fY1  (0),
  fChi2I (0)
  //
  // Default constructor
  //
{ }



AliSplineFit::AliSplineFit(const AliSplineFit& source) :
  TObject(source),
  fBDump (source.fBDump),
  fGraph (source.fGraph),
  fNmin  (source.fNmin),
  fMinPoints (source.fMinPoints),
  fSigma (source.fSigma),
  fMaxDelta (source.fMaxDelta),
  fN0    (source.fN0),
  fParams (0),
  fCovars (0),
  fIndex (0),
  fN     (source.fN),
  fChi2  (0.0),
  fX   (0),
  fY0  (0),
  fY1  (0),
  fChi2I  (source.fChi2I)
{
//
//  Copy constructor
//
  fIndex = new Int_t[fN0];
  fParams = new TClonesArray("TVectorD",fN0);
  fCovars = new TClonesArray("TMatrixD",fN0);
  fParams = (TClonesArray*)source.fParams->Clone();
  fCovars = (TClonesArray*)source.fCovars->Clone();
  for (Int_t i=0; i<fN0; i++) fIndex[i] = source.fIndex[i];

  fX     = new Double_t[fN];
  fY0    = new Double_t[fN];
  fY1    = new Double_t[fN];
  fChi2I = new Double_t[fN];
  for (Int_t i=0; i<fN; i++){
    fX[i]  = source.fX[i];
    fY0[i] = source.fY0[i];
    fY1[i] = source.fY1[i];
    fChi2I[i] = source.fChi2I[i];
  }
}

AliSplineFit& AliSplineFit::operator=(const AliSplineFit& source){
//
//  assignment operator
//
  if (&source == this) return *this;

//
// reassign memory as previous fit could have a different size
//

  if ( fN0 != source.fN0) {

    delete fParams;
    delete fCovars;
    delete []fIndex;

    fN0 = source.fN0;
    fIndex = new Int_t[fN0];
    fParams = new TClonesArray("TVectorD",fN0);
    fCovars = new TClonesArray("TMatrixD",fN0);
  }
  if ( fN != source.fN) {

    delete []fX;
    delete []fY0;
    delete []fY1;
    delete []fChi2I;
    fN = source.fN;
    fX     = new Double_t[fN];
    fY0    = new Double_t[fN];
    fY1    = new Double_t[fN];
    fChi2I = new Double_t[fN];
  }

// use copy constructor (without reassigning memory) to copy values

  return *this;
}


AliSplineFit::~AliSplineFit(){
  //
  // destructor. Don't delete fGraph, as this normally comes as input parameter
  //
  delete []fX;
  delete []fY0;
  delete []fY1;
  delete []fChi2I;
  delete fParams;
  delete fCovars;
  delete []fIndex;
}

Double_t   AliSplineFit::Eval(Double_t x, Int_t deriv) const{
  //
  // evaluate value at x
  //   deriv = 0: function value
  //         = 1: first derivative
  //         = 2: 2nd derivative
  //         = 3: 3rd derivative
  //
  //  a2 = -(3*a0 -3*b0 + 2*a1*dx +b1*dx)/(dx*dx)
  //  a3 = -(-2*a0+2*b0 - a1*dx - b1*dx)/(dx*dx*dx)

  Int_t index = TMath::BinarySearch(fN,fX,x);
  if (index<0) index =0;
  if (index>fN-2) index =fN-2;
  //
  Double_t dx   = x-fX[index];
  Double_t dxc  = fX[index+1]-fX[index];
  if (dxc<=0)    return fY0[index];
  Double_t y0   = fY0[index];
  Double_t y1   = fY1[index];
  Double_t y01  = fY0[index+1];
  Double_t y11  = fY1[index+1];
  Double_t y2   = -(3.*y0-3.*y01+2*y1*dxc+y11*dxc)/(dxc*dxc);
  Double_t y3   = -(-2.* y0 + 2*y01 -  y1*dxc - y11*dxc) /(dxc*dxc*dxc);
  Double_t val = y0+y1*dx+y2*dx*dx+y3*dx*dx*dx;
  if (deriv==1) val = y1+2.*y2*dx+3.*y3*dx*dx;
  if (deriv==2) val = 2.*y2+6.*y3*dx;
  if (deriv==3) val = 6*y3;
  return val;
}


TGraph * AliSplineFit::GenerGraph(Int_t npoints, Double_t fraction, Double_t s1, Double_t s2, Double_t s3, Int_t der){
  //
  // generate random graph 
  // xrange 0,1
  // yrange 0,1
  // s1, s2, s3 -  sigma of derivative
  // fraction   -  

  Double_t *value = new Double_t[npoints];
  Double_t *time  = new Double_t[npoints];
  Double_t d0=0, d1=0,d2=0,d3=0;
  value[0] = d0;
  time[0]  = 0;
  for(Int_t i=1; i<npoints; i++){
    Double_t dtime = 1./npoints;
    Double_t dd1 = dtime;
    Double_t dd2 = dd1*dd1;
    Double_t dd3 = dd2*dd1;
    d0 += d1*dd1 + d2*dd2/2. + d3*dd3/6.;
    d1 += d2*dd1 +d3*dd2/2;
    d2 += d3*dd1;
    value[i] = d0;
    time[i]  = time[i-1]+dtime;
    d1 =(1.-fraction)*d1+fraction*(gRandom->Exp(s1))*(gRandom->Rndm()-0.5);
    d2 =(1.-fraction)*d2+fraction*(gRandom->Exp(s2))*(gRandom->Rndm()-0.5);
    d3 =(1.-fraction)*d3+fraction*(gRandom->Exp(s3))*(gRandom->Rndm()-0.5);
    if (gRandom->Rndm()<fraction) d3 =(1.-fraction)*d3+fraction*(gRandom->BreitWigner(0,s3));
  }
  Double_t dmean = (value[npoints-1]-value[0])/(time[npoints-1]-time[0]);
  Double_t min = value[0];
  Double_t max = value[0];
  for (Int_t i=0; i<npoints; i++){
    value[i]  = value[i]-dmean*(time[i]-time[0]); 
    if (value[i]<min) min=value[i];
    if (value[i]>max) max=value[i];
  }

  for (Int_t i=0; i<npoints; i++){
    value[i]  = (value[i]-min)/(max-min); 
  }
  if (der==1) for (Int_t i=1; i<npoints; i++){
    value[i-1]  =  (value[i]-value[i-1])/(time[i]-time[i-1]);
  }

  TGraph * graph = new TGraph(npoints,time,value);

  delete [] value;
  delete [] time; 
  return graph;  
}


TGraph * AliSplineFit::GenerNoise(TGraph * graph0, Double_t sigma0){
  //
  // add noise to graph
  //

  Int_t npoints=graph0->GetN();
  Double_t *value = new Double_t[npoints];
  Double_t *time  = new Double_t[npoints];
  for(Int_t i=0; i<npoints; i++){
    time[i]  = graph0->GetX()[i];
    value[i] = graph0->GetY()[i]+gRandom->Gaus(0,sigma0);
  }
  TGraph * graph = new TGraph(npoints,time,value);

  delete [] value;
  delete [] time;
  return graph;  
}


TGraph * AliSplineFit::MakeGraph(Double_t xmin, Double_t xmax, Int_t npoints, Int_t deriv) const {
  //
  // if npoints<=0 draw derivative
  //

  TGraph *graph =0;
  if (npoints<=0) {
    if (deriv<=0) 
      return new TGraph(fN,fX,fY0);
    else if (deriv==1) 
      return new TGraph(fN,fX,fY1);
    else if(deriv>2)
      return new TGraph(fN-1,fX,fChi2I);
    else {
      AliWarning("npoints == 0 et deriv == 2: unhandled condition");
      return 0;
    }
  }
  Double_t * x = new Double_t[npoints+1];
  Double_t * y = new Double_t[npoints+1];
  for (Int_t ip=0; ip<=npoints; ip++){
    x[ip] = xmin+ (xmax-xmin)*(Double_t(ip)/Double_t(npoints));
    y[ip] = Eval(x[ip],deriv);
  }

  graph = new TGraph(npoints,x,y);
  delete [] x;
  delete [] y;
  return graph;
}

TGraph * AliSplineFit::MakeDiff(TGraph * graph0) const {
  //
  // Make graph of difference to reference graph
  //
  
  Int_t npoints=graph0->GetN();
  TGraph *graph =0;
  Double_t * x = new Double_t[npoints];
  Double_t * y = new Double_t[npoints];
  for (Int_t ip=0; ip<npoints; ip++){
    x[ip] = graph0->GetX()[ip];
    y[ip] = Eval(x[ip],0)-graph0->GetY()[ip];
  }
  graph = new TGraph(npoints,x,y);
  delete [] x;
  delete [] y;
  return graph;
}


TH1F * AliSplineFit::MakeDiffHisto(TGraph * graph0) const {
  //
  // Make histogram of difference to reference graph
  //

  Int_t npoints=graph0->GetN();
  Float_t min=1e38,max=-1e38;
  for (Int_t ip=0; ip<npoints; ip++){
    Double_t x = graph0->GetX()[ip];
    Double_t y = Eval(x,0)-graph0->GetY()[ip];
    if (ip==0) {
      min = y;
      max = y;
    }else{
      if (y<min) min=y;
      if (y>max) max=y;
    }
  }

  TH1F *his = new TH1F("hdiff","hdiff", 100, min, max);
  for (Int_t ip=0; ip<npoints; ip++){
    Double_t x = graph0->GetX()[ip];
    Double_t y = Eval(x,0)-graph0->GetY()[ip];
    his->Fill(y);
  }

  return his;
}



void AliSplineFit::InitKnots(TGraph * graph, Int_t min, Int_t iter, Double_t maxDelta){
  //
  // initialize knots + estimate sigma of noise + make initial parameters
  //
  //

  const Double_t kEpsilon = 1.e-7;
  fGraph  = graph;
  fNmin   = min;
  fMaxDelta = maxDelta;
  Int_t npoints = fGraph->GetN();

  // Make simple spline if too few points in graph

  if (npoints < fMinPoints ) {
    CopyGraph();
    return;
  }

  fN0           = (npoints/fNmin)+1;
  Float_t delta = Double_t(npoints)/Double_t(fN0-1);

  fParams = new TClonesArray("TVectorD",fN0);
  fCovars = new TClonesArray("TMatrixD",fN0);
  fIndex  = new Int_t[fN0];
  TLinearFitter fitterLocal(4,"pol3");  // local fitter
  Double_t sigma2 =0;


  Double_t yMin=graph->GetY()[0];
  Double_t yMax=graph->GetY()[0];

  for (Int_t iKnot=0; iKnot<fN0; iKnot++){
    Int_t index0 = TMath::Nint(Double_t(iKnot)*Double_t(delta));
    Int_t index1 = TMath::Min(TMath::Nint(Double_t(iKnot+1)*Double_t(delta)),npoints-1);
    Int_t indexM = (iKnot>0) ? fIndex[iKnot-1]:index0;
    fIndex[iKnot]=TMath::Min(index0, npoints-1);
    Float_t startX =graph->GetX()[fIndex[iKnot]];

    for (Int_t ipoint=indexM; ipoint<index1; ipoint++){
      Double_t dxl   =graph->GetX()[ipoint]-startX;
      Double_t  y    = graph->GetY()[ipoint];
      if (y<yMin) yMin=y;
      if (y>yMax) yMax=y;
      fitterLocal.AddPoint(&dxl,y,1);
    }

    fitterLocal.Eval();
    sigma2 += fitterLocal.GetChisquare()/Double_t((index1-indexM)-4.);
    TMatrixD   * covar = new ((*fCovars)[iKnot]) TMatrixD(4,4);
    TVectorD   * param = new ((*fParams)[iKnot]) TVectorD(4);
    fitterLocal.GetParameters(*param);
    fitterLocal.GetCovarianceMatrix(*covar);
    fitterLocal.ClearPoints();
  }
  fSigma  =TMath::Sqrt(sigma2/Double_t(fN0));   // mean sigma
  Double_t tDiff = ((yMax-yMin)+TMath::Abs(yMax)+TMath::Abs(yMin))*kEpsilon;
  fSigma += tDiff+fMaxDelta/TMath::Sqrt(npoints);
  fMaxDelta +=tDiff;
  for (Int_t iKnot=0; iKnot<fN0; iKnot++){
    TMatrixD & cov = *((TMatrixD*)fCovars->At(iKnot));
    cov*=fSigma*fSigma;
  }
  OptimizeKnots(iter);

  fN = 0;
  for (Int_t iKnot=0; iKnot<fN0; iKnot++) if (fIndex[iKnot]>=0) fN++;
  fX  = new Double_t[fN];
  fY0 = new Double_t[fN];
  fY1 = new Double_t[fN];
  fChi2I = new Double_t[fN];
  Int_t iKnot=0;
  for (Int_t i=0; i<fN0; i++){
    if (fIndex[i]<0) continue;
    if (iKnot>=fN) {
      printf("AliSplineFit::InitKnots: Knot number > Max knot number\n");
      break;
    }
    TVectorD   * param = (TVectorD*) fParams->At(i);
    fX[iKnot]  = fGraph->GetX()[fIndex[i]];
    fY0[iKnot] = (*param)(0);
    fY1[iKnot] = (*param)(1);
    fChi2I[iKnot] = 0;
    iKnot++;
  }
}


Int_t AliSplineFit::OptimizeKnots(Int_t nIter){
  //
  //
  //
  const Double_t kMaxChi2= 5;
  Int_t nKnots=0;
  TTreeSRedirector cstream("SplineIter.root");
  for (Int_t iIter=0; iIter<nIter; iIter++){
    if (fBDump) cstream<<"Fit"<<
      "iIter="<<iIter<<
      "fit.="<<this<<
      "\n";
    nKnots=2;
    for (Int_t iKnot=1; iKnot<fN0-1; iKnot++){
      if (fIndex[iKnot]<0) continue;   //disabled knot
      Double_t chi2 = CheckKnot(iKnot); 
      Double_t startX = fGraph->GetX()[fIndex[iKnot]]; 
      if (fBDump) {
        TMatrixD   * covar = (TMatrixD*)fCovars->At(iKnot);
        TVectorD   * param = (TVectorD*)fParams->At(iKnot);
        cstream<<"Chi2"<<
	 "iIter="<<iIter<<
	 "iKnot="<<iKnot<<
	 "chi2="<<chi2<<
	 "x="<<startX<<
	 "param="<<param<<
	 "covar="<<covar<<
	 "\n";
      }
      if (chi2>kMaxChi2) { nKnots++;continue;}
      fIndex[iKnot]*=-1;
      Int_t iPrevious=iKnot-1;
      Int_t iNext    =iKnot+1;
      while (fIndex[iPrevious]<0) iPrevious--;
      while (fIndex[iNext]<0) iNext++;
      RefitKnot(iPrevious);
      RefitKnot(iNext);
      iKnot++;
      while (iKnot<fN0-1&& fIndex[iKnot]<0) iKnot++;
    }
  }
  return nKnots;
}


Bool_t   AliSplineFit::RefitKnot(Int_t iKnot){
  //
  //
  //

  Int_t iPrevious=(iKnot>0)  ?iKnot-1: 0;
  Int_t iNext    =(iKnot<fN0)?iKnot+1: fN0-1;
  while (iPrevious>0&&fIndex[iPrevious]<0) iPrevious--;
  while (iNext<fN0&&fIndex[iNext]<0) iNext++;
  if (iPrevious<0) iPrevious=0;
  if (iNext>=fN0) iNext=fN0-1;
  
  Double_t startX = fGraph->GetX()[fIndex[iKnot]]; 
  AliSplineFit::fitterStatic()->ClearPoints();
  Int_t indPrev = fIndex[iPrevious];
  Int_t indNext = fIndex[iNext];
  Double_t *graphX = fGraph->GetX();
  Double_t *graphY = fGraph->GetY();

  // make arrays for points to fit (to save time)

  Int_t nPoints = indNext-indPrev;
  Double_t *xPoint = new Double_t[3*nPoints];
  Double_t *yPoint = &xPoint[nPoints];
  Double_t *ePoint = &xPoint[2*nPoints];
  Int_t indVec=0;
  for (Int_t iPoint=indPrev; iPoint<indNext; iPoint++, indVec++){
    Double_t dxl   = graphX[iPoint]-startX;
    Double_t  y    = graphY[iPoint];
    xPoint[indVec] = dxl;
    yPoint[indVec] = y;
    ePoint[indVec] =  fSigma;
//    ePoint[indVec] =  fSigma+TMath::Abs(y)*kEpsilon;
//    AliSplineFit::fitterStatic.AddPoint(&dxl,y,fSigma+TMath::Abs(y)*kEpsilon);
  }
  AliSplineFit::fitterStatic()->AssignData(nPoints,1,xPoint,yPoint,ePoint);
  AliSplineFit::fitterStatic()->Eval();

//  delete temporary arrays

  delete [] xPoint; 
  
  TMatrixD   * covar = (TMatrixD*)fCovars->At(iKnot);
  TVectorD   * param = (TVectorD*)fParams->At(iKnot);
  AliSplineFit::fitterStatic()->GetParameters(*param);
  AliSplineFit::fitterStatic()->GetCovarianceMatrix(*covar);
  return 0;
}


Float_t AliSplineFit::CheckKnot(Int_t iKnot){
  //
  //
  //

  Int_t iPrevious=iKnot-1;
  Int_t iNext    =iKnot+1;
  while (fIndex[iPrevious]<0) iPrevious--;
  while (fIndex[iNext]<0) iNext++;
  TVectorD &pPrevious = *((TVectorD*)fParams->At(iPrevious));
  TVectorD &pNext     = *((TVectorD*)fParams->At(iNext));
  TVectorD &pKnot     = *((TVectorD*)fParams->At(iKnot));
  TMatrixD &cPrevious = *((TMatrixD*)fCovars->At(iPrevious));
  TMatrixD &cNext     = *((TMatrixD*)fCovars->At(iNext));
  TMatrixD &cKnot     = *((TMatrixD*)fCovars->At(iKnot));
  Double_t xPrevious = fGraph->GetX()[fIndex[iPrevious]];
  Double_t xNext     = fGraph->GetX()[fIndex[iNext]];
  Double_t xKnot     = fGraph->GetX()[fIndex[iKnot]];

  // extra variables introduced to save processing time

  Double_t dxc  = xNext-xPrevious;
  Double_t invDxc = 1./dxc;
  Double_t invDxc2 = invDxc*invDxc;
  TMatrixD  tPrevious(4,4);
  TMatrixD  tNext(4,4);

  tPrevious(0,0) = 1;    tPrevious(1,1) = 1;
  tPrevious(2,0) = -3.*invDxc2;
  tPrevious(2,1) = -2.*invDxc;
  tPrevious(3,0) =  2.*invDxc2*invDxc;
  tPrevious(3,1) =  1.*invDxc2;
  tNext(2,0)     =  3.*invDxc2;      tNext(2,1)     = -1*invDxc;
  tNext(3,0)     = -2.*invDxc2*invDxc;  tNext(3,1)     =  1.*invDxc2;
  TMatrixD  tpKnot(4,4);
  TMatrixD  tpNext(4,4);
  Double_t dx = xKnot-xPrevious;
  tpKnot(0,0) = 1;      tpKnot(1,1) = 1;        tpKnot(2,2) = 1;        tpKnot(3,3) = 1;
  tpKnot(0,1) = dx;     tpKnot(0,2) = dx*dx;    tpKnot(0,3) = dx*dx*dx;
  tpKnot(1,2) = 2.*dx;  tpKnot(1,3) = 3.*dx*dx;
  tpKnot(2,3) = 3.*dx;
  Double_t dxn = xNext-xPrevious;
  tpNext(0,0) = 1;       tpNext(1,1) = 1;        tpNext(2,2) = 1;        tpNext(3,3) = 1;
  tpNext(0,1) = dxn;     tpNext(0,2) = dxn*dxn;    tpNext(0,3) = dxn*dxn*dxn;
  tpNext(1,2) = 2.*dxn;  tpNext(1,3) = 3.*dxn*dxn;
  tpNext(2,3) = 3.*dxn;

  //
  // matrix and vector at previous
  //

  TVectorD  sPrevious = tPrevious*pPrevious+tNext*pNext;
  TVectorD  sKnot     = tpKnot*sPrevious;
  TVectorD  sNext     = tpNext*sPrevious;
  
  TMatrixD csPrevious00(tPrevious, TMatrixD::kMult,cPrevious);
  csPrevious00 *= tPrevious.T();
  TMatrixD csPrevious01(tNext,TMatrixD::kMult,cNext);
  csPrevious01*=tNext.T();
  TMatrixD  csPrevious(csPrevious00,TMatrixD::kPlus,csPrevious01);
  TMatrixD  csKnot(tpKnot,TMatrixD::kMult,csPrevious);
  csKnot*=tpKnot.T();
  TMatrixD  csNext(tpNext,TMatrixD::kMult,csPrevious);
  csNext*=tpNext.T();

  TVectorD dPrevious = pPrevious-sPrevious;
  TVectorD dKnot     = pKnot-sKnot;
  TVectorD dNext     = pNext-sNext;
  //
  //
  TMatrixD prec(4,4);
  prec(0,0) = (fMaxDelta*fMaxDelta);
  prec(1,1) = prec(0,0)*invDxc2;
  prec(2,2) = prec(1,1)*invDxc2;
  prec(3,3) = prec(2,2)*invDxc2;

//   prec(0,0) = (fMaxDelta*fMaxDelta);
//   prec(1,1) = (fMaxDelta*fMaxDelta)/(dxc*dxc);
//   prec(2,2) = (fMaxDelta*fMaxDelta)/(dxc*dxc*dxc*dxc);
//   prec(3,3) = (fMaxDelta*fMaxDelta)/(dxc*dxc*dxc*dxc*dxc*dxc);

  csPrevious+=cPrevious;
  csPrevious+=prec;
  csPrevious.Invert(); 
  Double_t  chi2P     = dPrevious*(csPrevious*dPrevious);

  csKnot+=cKnot;
  csKnot+=prec;
  csKnot.Invert();
  Double_t  chi2K     = dKnot*(csKnot*dKnot);
  
  csNext+=cNext;
  csNext+=prec;
  csNext.Invert();
  Double_t  chi2N     = dNext*(csNext*dNext);    

  return (chi2P+chi2K+chi2N)/8.;


}

void AliSplineFit::SplineFit(Int_t nder){
  //
  // Cubic spline fit of graph
  //
  // nder
  // nder<0  - no continuity requirement
  //     =0  - continous  0 derivative
  //     =1  - continous  1 derivative
  //     >1  - continous  2 derivative
  //
  if (!fGraph) return;
  TGraph * graph = fGraph;
  if (nder>1) nder=2;
  Int_t nknots  = fN;
  if (nknots < 2 ) return;
  Int_t npoints = graph->GetN(); 
  if (npoints < fMinPoints ) return;
  //
  //
  // spline fit
  // each knot 4 parameters  
  //
  TMatrixD       *pmatrix = 0;
  TVectorD       *pvalues = 0;  
  if (nder>1){
    pmatrix = new TMatrixD(4*(nknots-1)+3*(nknots-2), 4*(nknots-1)+3*(nknots-2));
    pvalues = new TVectorD(4*(nknots-1)+3*(nknots-2));
  }
  if (nder==1){
    pmatrix = new TMatrixD(4*(nknots-1)+2*(nknots-2), 4*(nknots-1)+2*(nknots-2));
    pvalues = new TVectorD(4*(nknots-1)+2*(nknots-2));
  }
  if (nder==0){
    pmatrix = new TMatrixD(4*(nknots-1)+1*(nknots-2), 4*(nknots-1)+1*(nknots-2));
    pvalues = new TVectorD(4*(nknots-1)+1*(nknots-2));
  }
  if (nder<0){
    pmatrix = new TMatrixD(4*(nknots-1)+0*(nknots-2), 4*(nknots-1)+0*(nknots-2));
    pvalues = new TVectorD(4*(nknots-1)+0*(nknots-2));
  }
  
  
  TMatrixD &matrix = *pmatrix;
  TVectorD &values = *pvalues;
  Int_t    current = 0;
//
//  defined extra variables (current4 etc.) to save processing time.
//  fill normal matrices, then copy to sparse matrix.
//  
  Double_t *graphX = graph->GetX();
  Double_t *graphY = graph->GetY();
  for (Int_t ip=0;ip<npoints;ip++){
    if (current<nknots-2&&graphX[ip]>fX[current+1]) current++;
    Double_t xmiddle = (fX[current+1]+fX[current])*0.5;
    Double_t x1 = graphX[ip]- xmiddle;
    Double_t x2 = x1*x1;
    Double_t x3 = x2*x1;
    Double_t x4 = x2*x2;
    Double_t x5 = x3*x2;
    Double_t x6 = x3*x3;
    Double_t y  = graphY[ip];
    Int_t current4 = 4*current;

    matrix(current4  , current4  )+=1;
    matrix(current4  , current4+1)+=x1;
    matrix(current4  , current4+2)+=x2;
    matrix(current4  , current4+3)+=x3;
    //
    matrix(current4+1, current4  )+=x1;
    matrix(current4+1, current4+1)+=x2;
    matrix(current4+1, current4+2)+=x3;
    matrix(current4+1, current4+3)+=x4;
    //
    matrix(current4+2, current4  )+=x2;
    matrix(current4+2, current4+1)+=x3;
    matrix(current4+2, current4+2)+=x4;
    matrix(current4+2, current4+3)+=x5;
    //
    matrix(current4+3, current4  )+=x3;
    matrix(current4+3, current4+1)+=x4;
    matrix(current4+3, current4+2)+=x5;
    matrix(current4+3, current4+3)+=x6;
    //
    values(current4  ) += y;
    values(current4+1) += y*x1;
    values(current4+2) += y*x2;
    values(current4+3) += y*x3;
  }
  //
  // constraint 0
  //
  Int_t offset =4*(nknots-1)-1;
  if (nder>=0) for (Int_t iknot = 1; iknot<nknots-1; iknot++){

    Double_t dxm  =  (fX[iknot]-fX[iknot-1])*0.5;
    Double_t dxp  = -(fX[iknot+1]-fX[iknot])*0.5;
    Double_t dxm2 = dxm*dxm;
    Double_t dxp2 = dxp*dxp;
    Double_t dxm3 = dxm2*dxm;
    Double_t dxp3 = dxp2*dxp;
    Int_t iknot4  = 4*iknot;
    Int_t iknot41 = 4*(iknot-1);
    Int_t offsKnot = offset+iknot;
    //
    // condition on knot
    //
    // a0[i] = a0m[i-1]  + a1m[i-1]*dxm + a2m[i-1]*dxm^2 + a3m[i-1]*dxm^3
    // a0[i] = a0m[i-0]  + a1m[i-0]*dxp + a2m[i-0]*dxp^2 + a3m[i-0]*dxp^3
    // (a0m[i-1]  + a1m[i-1]*dxm + a2m[i-1]*dxm^2 + a3m[i-1]*dxm^3) -
    // (a0m[i-0]  + a1m[i-0]*dxp + a2m[i-0]*dxp^2 + a3m[i-0]*dxp^3)  = 0
    
    matrix(offsKnot, iknot41  )=1;
    matrix(offsKnot, iknot4   )=-1;

    matrix(offsKnot, iknot41+1)=dxm;
    matrix(offsKnot, iknot4 +1)=-dxp;

    matrix(offsKnot, iknot41+2)=dxm2;
    matrix(offsKnot, iknot4 +2)=-dxp2;

    matrix(offsKnot, iknot41+3)=dxm3;
    matrix(offsKnot, iknot4 +3)=-dxp3;

    matrix(iknot41  , offsKnot)=1;
    matrix(iknot41+1, offsKnot)=dxm;
    matrix(iknot41+2, offsKnot)=dxm2;
    matrix(iknot41+3, offsKnot)=dxm3;
    matrix(iknot4  , offsKnot)=-1;
    matrix(iknot4+1, offsKnot)=-dxp;
    matrix(iknot4+2, offsKnot)=-dxp2;
    matrix(iknot4+3, offsKnot)=-dxp3;
  }
  //
  // constraint 1
  //
  offset =4*(nknots-1)-1+(nknots-2);
  if (nder>=1)for (Int_t iknot = 1; iknot<nknots-1; iknot++){

    Double_t dxm  =  (fX[iknot]-fX[iknot-1])*0.5;
    Double_t dxp  = -(fX[iknot+1]-fX[iknot])*0.5;
    Double_t dxm2 = dxm*dxm;
    Double_t dxp2 = dxp*dxp;
    Int_t iknot4  = 4*iknot;
    Int_t iknot41 = 4*(iknot-1);
    Int_t offsKnot = offset+iknot;
    //
    // condition on knot derivation
    //
    // a0d[i] =  a1m[i-1] + 2*a2m[i-1]*dxm + 3*a3m[i-1]*dxm^2
    // a0d[i] =  a1m[i-0] + 2*a2m[i-0]*dxp + 3*a3m[i-0]*dxp^2
    
    //
    matrix(offsKnot, iknot41+1)= 1;
    matrix(offsKnot, iknot4 +1)=-1;

    matrix(offsKnot, iknot41+2)= 2.*dxm;
    matrix(offsKnot, iknot4 +2)=-2.*dxp;

    matrix(offsKnot, iknot41+3)= 3.*dxm2;
    matrix(offsKnot, iknot4 +3)=-3.*dxp2;

    matrix(iknot41+1, offsKnot)=1;
    matrix(iknot41+2, offsKnot)=2.*dxm;
    matrix(iknot41+3, offsKnot)=3.*dxm2;

    matrix(iknot4+1, offsKnot)=-1.;
    matrix(iknot4+2, offsKnot)=-2.*dxp;
    matrix(iknot4+3, offsKnot)=-3.*dxp2;
  }
  //
  // constraint 2
  //
  offset =4*(nknots-1)-1+2*(nknots-2);
  if (nder>=2) for (Int_t iknot = 1; iknot<nknots-1; iknot++){

    Double_t dxm  =  (fX[iknot]-fX[iknot-1])*0.5;
    Double_t dxp  = -(fX[iknot+1]-fX[iknot])*0.5;
    Int_t iknot4  = 4*iknot;
    Int_t iknot41 = 4*(iknot-1);
    Int_t offsKnot = offset+iknot;
    //
    // condition on knot second derivative
    //
    // a0dd[i] =  2*a2m[i-1] + 6*a3m[i-1]*dxm
    // a0dd[i] =  2*a2m[i-0] + 6*a3m[i-0]*dxp    
    //
    //
    matrix(offsKnot, iknot41+2)= 2.;
    matrix(offsKnot, iknot4 +2)=-2.;

    matrix(offsKnot, iknot41+3)= 6.*dxm;
    matrix(offsKnot, iknot4 +3)=-6.*dxp;

    matrix(iknot41+2, offsKnot)=2.;
    matrix(iknot41+3, offsKnot)=6.*dxm;

    matrix(iknot4+2, offsKnot)=-2.;
    matrix(iknot4+3, offsKnot)=-6.*dxp;
  }
 
// sparse matrix to do fit
  
  TMatrixDSparse smatrix(matrix);
  TDecompSparse svd(smatrix,0);
  Bool_t ok;
  const TVectorD results = svd.Solve(values,ok);

  for (Int_t iknot = 0; iknot<nknots-1; iknot++){

    Double_t dxm  =  -(fX[iknot+1]-fX[iknot])*0.5;

    fY0[iknot] = results(4*iknot)+ results(4*iknot+1)*dxm+results(4*iknot+2)*dxm*dxm+
      results(4*iknot+3)*dxm*dxm*dxm;

    fY1[iknot] = results(4*iknot+1)+2.*results(4*iknot+2)*dxm+
      3*results(4*iknot+3)*dxm*dxm;
  }
  Int_t   iknot2= nknots-1;
  Int_t   iknot = nknots-2;
  Double_t dxm   =  (fX[iknot2]-fX[iknot2-1])*0.5;

  fY0[iknot2] = results(4*iknot)+ results(4*iknot+1)*dxm+results(4*iknot+2)*dxm*dxm+
    results(4*iknot+3)*dxm*dxm*dxm;

  fY1[iknot2] = results(4*iknot+1)+2.*results(4*iknot+2)*dxm+
      3*results(4*iknot+3)*dxm*dxm;

  delete  pmatrix;
  delete  pvalues;

}





void AliSplineFit::MakeKnots0(TGraph * graph, Double_t maxdelta, Int_t minpoints){
  //
  // make knots  - restriction max distance and minimum points
  //

  Int_t npoints  = graph->GetN();
  Double_t *xknots = new Double_t[npoints]; 
  for (Int_t ip=0;ip<npoints;ip++) xknots[ip]=0;
  //
  Int_t nknots =0;
  Int_t ipoints =0;
  //
  // generate knots
  //
  for (Int_t ip=0;ip<npoints;ip++){
    if (graph->GetX()[ip]-xknots[nknots-1]>maxdelta && ipoints>minpoints){
      xknots[nknots] = graph->GetX()[ip];
      ipoints=1;
      nknots++;
    }
    ipoints++;
  }
  if (npoints-ipoints>minpoints){
    xknots[nknots] = graph->GetX()[npoints-1];
    nknots++;
  }else{
    xknots[nknots-1] = graph->GetX()[npoints-1];
  }

  fN = nknots;
  fX = new Double_t[nknots];
  fY0 = new Double_t[nknots];
  fY1 = new Double_t[nknots];
  fChi2I= new Double_t[nknots];
  for (Int_t i=0; i<nknots; i++) fX[i]= xknots[i];  
  delete [] xknots;
}




void AliSplineFit::MakeSmooth(TGraph * graph, Float_t ratio, Option_t * type){
  //
  // Interface to GraphSmooth
  //

  TGraphSmooth smooth;
  Int_t    npoints2 = TMath::Nint(graph->GetN()*ratio);  
  TGraph * graphT0 = smooth.SmoothKern(graph,type,ratio);
  if (!graphT0) return;
  TGraph  graphT1(npoints2);
  for (Int_t ipoint=0; ipoint<npoints2; ipoint++){
    Int_t pointS = TMath::Nint(ipoint/ratio);
    if (ipoint==npoints2-1) pointS=graph->GetN()-1;
    graphT1.SetPoint(ipoint, graphT0->GetX()[pointS] , graphT0->GetY()[pointS]);
  }  
  TSpline3 spline2("spline", &graphT1);
  Update(&spline2, npoints2);
}


void AliSplineFit::Update(TSpline3 *spline, Int_t nknots){
  //
  //
  //

  fN = nknots;
  fX = new Double_t[nknots];
  fY0 = new Double_t[nknots];
  fY1 = new Double_t[nknots];
  Double_t d0, d1;
  fChi2I= 0;
  for (Int_t i=0; i<nknots; i++) {
    spline->GetCoeff(i,fX[i],fY0[i], fY1[i],d0,d1);
  }
}




void AliSplineFit::Test(Int_t npoints, Int_t ntracks, Float_t snoise){  
  //
  // test function
  //

  AliSplineFit fit;
  AliSplineFit fitS;
  TGraph * graph0=0;
  TGraph * graph1=0;
  
  TTreeSRedirector *pcstream = new TTreeSRedirector("TestSmooth.root");
  for (Int_t i=0; i<ntracks; i++){
    graph0 = AliSplineFit::GenerGraph(npoints,0.05,0,0,1,0);  
    graph1 = AliSplineFit::GenerNoise(graph0,snoise);  
    fit.InitKnots(graph1, 10,10, 0.00);
    TGraph *d0 = fit.MakeDiff(graph0);
    TGraph *g0 = fit.MakeGraph(0,1,1000,0);
    fit.SplineFit(2);
    TH1F * h2 = fit.MakeDiffHisto(graph0);
    TGraph *d2 = fit.MakeDiff(graph0);
    TGraph *g2 = fit.MakeGraph(0,1,1000,0);
    fit.SplineFit(1);
    TH1F * h1 = fit.MakeDiffHisto(graph0);
    TGraph *d1 = fit.MakeDiff(graph0);
    TGraph *g1 = fit.MakeGraph(0,1,1000,0);

    Float_t ratio = Float_t(fit.fN)/Float_t(npoints);
    fitS.MakeSmooth(graph1,ratio,"box");
    TGraph *dS = fitS.MakeDiff(graph0);
    TGraph *gS = fit.MakeGraph(0,1,1000,0);

    TH1F * hS = fitS.MakeDiffHisto(graph0);
    Double_t mean2  = h2->GetMean();
    Double_t sigma2 = h2->GetRMS();
    Double_t mean1  = h1->GetMean();
    Double_t sigma1 = h1->GetRMS();
    Double_t meanS  = hS->GetMean();
    Double_t sigmaS = hS->GetRMS();
    char fname[100];
    if (fit.fN<20){
      snprintf(fname,100,"pol%d",fit.fN);
    }else{
      snprintf(fname,100,"pol%d",19);
    }
    TF1 fpol("fpol",fname);
    graph1->Fit(&fpol);
    TGraph dpol(*graph1);
    TGraph gpol(*graph1);
    for (Int_t ipoint=0; ipoint<graph1->GetN(); ipoint++){
      dpol.GetY()[ipoint]= graph0->GetY()[ipoint]-
	fpol.Eval(graph0->GetX()[ipoint]);
      gpol.GetY()[ipoint]= fpol.Eval(graph0->GetX()[ipoint]);
    }
    (*pcstream)<<"Test"<<
      "Event="<<i<<
      "Graph0.="<<graph0<<
      "Graph1.="<<graph1<<
      "G0.="<<g0<<
      "G1.="<<g1<<
      "G2.="<<g2<<
      "GS.="<<gS<<
      "GP.="<<&gpol<<
      "D0.="<<d0<<
      "D1.="<<d1<<
      "D2.="<<d2<<
      "DS.="<<dS<<
      "DP.="<<&dpol<<
      "Npoints="<<fit.fN<<
      "Mean1="<<mean1<<
      "Mean2="<<mean2<<
      "MeanS="<<meanS<<
      "Sigma1="<<sigma1<<
      "Sigma2="<<sigma2<<
      "SigmaS="<<sigmaS<<
      "\n";
    
    delete graph0;
    delete graph1;
    delete g1;
    delete g2;
    delete gS;
    delete h1;
    delete h2;
    delete hS;
  }
  delete pcstream;
}

void AliSplineFit::Cleanup(){
 //
 // deletes extra information to reduce amount of information stored on the data
 // base
    
 //    delete fGraph;  fGraph=0;   // Don't delete fGraph -- input parameter 
     delete fParams; fParams=0;
     delete fCovars; fCovars=0;
     delete [] fIndex; fIndex=0;
     delete [] fChi2I; fChi2I=0;
}


void AliSplineFit::CopyGraph() {
  //
  // enter graph points directly to fit parameters 
  // (to bee used when too few points are available)
  //
  fN = fGraph->GetN();   
  fX = new Double_t[fN];
  fY0 = new Double_t[fN];
  fY1 = new Double_t[fN];
  for (Int_t i=0; i<fN; i++ ) {
    fX[i]  = fGraph->GetX()[i];
    fY0[i] = fGraph->GetY()[i];     
    fY1[i] = 0;
  }
}
 AliSplineFit.cxx:1
 AliSplineFit.cxx:2
 AliSplineFit.cxx:3
 AliSplineFit.cxx:4
 AliSplineFit.cxx:5
 AliSplineFit.cxx:6
 AliSplineFit.cxx:7
 AliSplineFit.cxx:8
 AliSplineFit.cxx:9
 AliSplineFit.cxx:10
 AliSplineFit.cxx:11
 AliSplineFit.cxx:12
 AliSplineFit.cxx:13
 AliSplineFit.cxx:14
 AliSplineFit.cxx:15
 AliSplineFit.cxx:16
 AliSplineFit.cxx:17
 AliSplineFit.cxx:18
 AliSplineFit.cxx:19
 AliSplineFit.cxx:20
 AliSplineFit.cxx:21
 AliSplineFit.cxx:22
 AliSplineFit.cxx:23
 AliSplineFit.cxx:24
 AliSplineFit.cxx:25
 AliSplineFit.cxx:26
 AliSplineFit.cxx:27
 AliSplineFit.cxx:28
 AliSplineFit.cxx:29
 AliSplineFit.cxx:30
 AliSplineFit.cxx:31
 AliSplineFit.cxx:32
 AliSplineFit.cxx:33
 AliSplineFit.cxx:34
 AliSplineFit.cxx:35
 AliSplineFit.cxx:36
 AliSplineFit.cxx:37
 AliSplineFit.cxx:38
 AliSplineFit.cxx:39
 AliSplineFit.cxx:40
 AliSplineFit.cxx:41
 AliSplineFit.cxx:42
 AliSplineFit.cxx:43
 AliSplineFit.cxx:44
 AliSplineFit.cxx:45
 AliSplineFit.cxx:46
 AliSplineFit.cxx:47
 AliSplineFit.cxx:48
 AliSplineFit.cxx:49
 AliSplineFit.cxx:50
 AliSplineFit.cxx:51
 AliSplineFit.cxx:52
 AliSplineFit.cxx:53
 AliSplineFit.cxx:54
 AliSplineFit.cxx:55
 AliSplineFit.cxx:56
 AliSplineFit.cxx:57
 AliSplineFit.cxx:58
 AliSplineFit.cxx:59
 AliSplineFit.cxx:60
 AliSplineFit.cxx:61
 AliSplineFit.cxx:62
 AliSplineFit.cxx:63
 AliSplineFit.cxx:64
 AliSplineFit.cxx:65
 AliSplineFit.cxx:66
 AliSplineFit.cxx:67
 AliSplineFit.cxx:68
 AliSplineFit.cxx:69
 AliSplineFit.cxx:70
 AliSplineFit.cxx:71
 AliSplineFit.cxx:72
 AliSplineFit.cxx:73
 AliSplineFit.cxx:74
 AliSplineFit.cxx:75
 AliSplineFit.cxx:76
 AliSplineFit.cxx:77
 AliSplineFit.cxx:78
 AliSplineFit.cxx:79
 AliSplineFit.cxx:80
 AliSplineFit.cxx:81
 AliSplineFit.cxx:82
 AliSplineFit.cxx:83
 AliSplineFit.cxx:84
 AliSplineFit.cxx:85
 AliSplineFit.cxx:86
 AliSplineFit.cxx:87
 AliSplineFit.cxx:88
 AliSplineFit.cxx:89
 AliSplineFit.cxx:90
 AliSplineFit.cxx:91
 AliSplineFit.cxx:92
 AliSplineFit.cxx:93
 AliSplineFit.cxx:94
 AliSplineFit.cxx:95
 AliSplineFit.cxx:96
 AliSplineFit.cxx:97
 AliSplineFit.cxx:98
 AliSplineFit.cxx:99
 AliSplineFit.cxx:100
 AliSplineFit.cxx:101
 AliSplineFit.cxx:102
 AliSplineFit.cxx:103
 AliSplineFit.cxx:104
 AliSplineFit.cxx:105
 AliSplineFit.cxx:106
 AliSplineFit.cxx:107
 AliSplineFit.cxx:108
 AliSplineFit.cxx:109
 AliSplineFit.cxx:110
 AliSplineFit.cxx:111
 AliSplineFit.cxx:112
 AliSplineFit.cxx:113
 AliSplineFit.cxx:114
 AliSplineFit.cxx:115
 AliSplineFit.cxx:116
 AliSplineFit.cxx:117
 AliSplineFit.cxx:118
 AliSplineFit.cxx:119
 AliSplineFit.cxx:120
 AliSplineFit.cxx:121
 AliSplineFit.cxx:122
 AliSplineFit.cxx:123
 AliSplineFit.cxx:124
 AliSplineFit.cxx:125
 AliSplineFit.cxx:126
 AliSplineFit.cxx:127
 AliSplineFit.cxx:128
 AliSplineFit.cxx:129
 AliSplineFit.cxx:130
 AliSplineFit.cxx:131
 AliSplineFit.cxx:132
 AliSplineFit.cxx:133
 AliSplineFit.cxx:134
 AliSplineFit.cxx:135
 AliSplineFit.cxx:136
 AliSplineFit.cxx:137
 AliSplineFit.cxx:138
 AliSplineFit.cxx:139
 AliSplineFit.cxx:140
 AliSplineFit.cxx:141
 AliSplineFit.cxx:142
 AliSplineFit.cxx:143
 AliSplineFit.cxx:144
 AliSplineFit.cxx:145
 AliSplineFit.cxx:146
 AliSplineFit.cxx:147
 AliSplineFit.cxx:148
 AliSplineFit.cxx:149
 AliSplineFit.cxx:150
 AliSplineFit.cxx:151
 AliSplineFit.cxx:152
 AliSplineFit.cxx:153
 AliSplineFit.cxx:154
 AliSplineFit.cxx:155
 AliSplineFit.cxx:156
 AliSplineFit.cxx:157
 AliSplineFit.cxx:158
 AliSplineFit.cxx:159
 AliSplineFit.cxx:160
 AliSplineFit.cxx:161
 AliSplineFit.cxx:162
 AliSplineFit.cxx:163
 AliSplineFit.cxx:164
 AliSplineFit.cxx:165
 AliSplineFit.cxx:166
 AliSplineFit.cxx:167
 AliSplineFit.cxx:168
 AliSplineFit.cxx:169
 AliSplineFit.cxx:170
 AliSplineFit.cxx:171
 AliSplineFit.cxx:172
 AliSplineFit.cxx:173
 AliSplineFit.cxx:174
 AliSplineFit.cxx:175
 AliSplineFit.cxx:176
 AliSplineFit.cxx:177
 AliSplineFit.cxx:178
 AliSplineFit.cxx:179
 AliSplineFit.cxx:180
 AliSplineFit.cxx:181
 AliSplineFit.cxx:182
 AliSplineFit.cxx:183
 AliSplineFit.cxx:184
 AliSplineFit.cxx:185
 AliSplineFit.cxx:186
 AliSplineFit.cxx:187
 AliSplineFit.cxx:188
 AliSplineFit.cxx:189
 AliSplineFit.cxx:190
 AliSplineFit.cxx:191
 AliSplineFit.cxx:192
 AliSplineFit.cxx:193
 AliSplineFit.cxx:194
 AliSplineFit.cxx:195
 AliSplineFit.cxx:196
 AliSplineFit.cxx:197
 AliSplineFit.cxx:198
 AliSplineFit.cxx:199
 AliSplineFit.cxx:200
 AliSplineFit.cxx:201
 AliSplineFit.cxx:202
 AliSplineFit.cxx:203
 AliSplineFit.cxx:204
 AliSplineFit.cxx:205
 AliSplineFit.cxx:206
 AliSplineFit.cxx:207
 AliSplineFit.cxx:208
 AliSplineFit.cxx:209
 AliSplineFit.cxx:210
 AliSplineFit.cxx:211
 AliSplineFit.cxx:212
 AliSplineFit.cxx:213
 AliSplineFit.cxx:214
 AliSplineFit.cxx:215
 AliSplineFit.cxx:216
 AliSplineFit.cxx:217
 AliSplineFit.cxx:218
 AliSplineFit.cxx:219
 AliSplineFit.cxx:220
 AliSplineFit.cxx:221
 AliSplineFit.cxx:222
 AliSplineFit.cxx:223
 AliSplineFit.cxx:224
 AliSplineFit.cxx:225
 AliSplineFit.cxx:226
 AliSplineFit.cxx:227
 AliSplineFit.cxx:228
 AliSplineFit.cxx:229
 AliSplineFit.cxx:230
 AliSplineFit.cxx:231
 AliSplineFit.cxx:232
 AliSplineFit.cxx:233
 AliSplineFit.cxx:234
 AliSplineFit.cxx:235
 AliSplineFit.cxx:236
 AliSplineFit.cxx:237
 AliSplineFit.cxx:238
 AliSplineFit.cxx:239
 AliSplineFit.cxx:240
 AliSplineFit.cxx:241
 AliSplineFit.cxx:242
 AliSplineFit.cxx:243
 AliSplineFit.cxx:244
 AliSplineFit.cxx:245
 AliSplineFit.cxx:246
 AliSplineFit.cxx:247
 AliSplineFit.cxx:248
 AliSplineFit.cxx:249
 AliSplineFit.cxx:250
 AliSplineFit.cxx:251
 AliSplineFit.cxx:252
 AliSplineFit.cxx:253
 AliSplineFit.cxx:254
 AliSplineFit.cxx:255
 AliSplineFit.cxx:256
 AliSplineFit.cxx:257
 AliSplineFit.cxx:258
 AliSplineFit.cxx:259
 AliSplineFit.cxx:260
 AliSplineFit.cxx:261
 AliSplineFit.cxx:262
 AliSplineFit.cxx:263
 AliSplineFit.cxx:264
 AliSplineFit.cxx:265
 AliSplineFit.cxx:266
 AliSplineFit.cxx:267
 AliSplineFit.cxx:268
 AliSplineFit.cxx:269
 AliSplineFit.cxx:270
 AliSplineFit.cxx:271
 AliSplineFit.cxx:272
 AliSplineFit.cxx:273
 AliSplineFit.cxx:274
 AliSplineFit.cxx:275
 AliSplineFit.cxx:276
 AliSplineFit.cxx:277
 AliSplineFit.cxx:278
 AliSplineFit.cxx:279
 AliSplineFit.cxx:280
 AliSplineFit.cxx:281
 AliSplineFit.cxx:282
 AliSplineFit.cxx:283
 AliSplineFit.cxx:284
 AliSplineFit.cxx:285
 AliSplineFit.cxx:286
 AliSplineFit.cxx:287
 AliSplineFit.cxx:288
 AliSplineFit.cxx:289
 AliSplineFit.cxx:290
 AliSplineFit.cxx:291
 AliSplineFit.cxx:292
 AliSplineFit.cxx:293
 AliSplineFit.cxx:294
 AliSplineFit.cxx:295
 AliSplineFit.cxx:296
 AliSplineFit.cxx:297
 AliSplineFit.cxx:298
 AliSplineFit.cxx:299
 AliSplineFit.cxx:300
 AliSplineFit.cxx:301
 AliSplineFit.cxx:302
 AliSplineFit.cxx:303
 AliSplineFit.cxx:304
 AliSplineFit.cxx:305
 AliSplineFit.cxx:306
 AliSplineFit.cxx:307
 AliSplineFit.cxx:308
 AliSplineFit.cxx:309
 AliSplineFit.cxx:310
 AliSplineFit.cxx:311
 AliSplineFit.cxx:312
 AliSplineFit.cxx:313
 AliSplineFit.cxx:314
 AliSplineFit.cxx:315
 AliSplineFit.cxx:316
 AliSplineFit.cxx:317
 AliSplineFit.cxx:318
 AliSplineFit.cxx:319
 AliSplineFit.cxx:320
 AliSplineFit.cxx:321
 AliSplineFit.cxx:322
 AliSplineFit.cxx:323
 AliSplineFit.cxx:324
 AliSplineFit.cxx:325
 AliSplineFit.cxx:326
 AliSplineFit.cxx:327
 AliSplineFit.cxx:328
 AliSplineFit.cxx:329
 AliSplineFit.cxx:330
 AliSplineFit.cxx:331
 AliSplineFit.cxx:332
 AliSplineFit.cxx:333
 AliSplineFit.cxx:334
 AliSplineFit.cxx:335
 AliSplineFit.cxx:336
 AliSplineFit.cxx:337
 AliSplineFit.cxx:338
 AliSplineFit.cxx:339
 AliSplineFit.cxx:340
 AliSplineFit.cxx:341
 AliSplineFit.cxx:342
 AliSplineFit.cxx:343
 AliSplineFit.cxx:344
 AliSplineFit.cxx:345
 AliSplineFit.cxx:346
 AliSplineFit.cxx:347
 AliSplineFit.cxx:348
 AliSplineFit.cxx:349
 AliSplineFit.cxx:350
 AliSplineFit.cxx:351
 AliSplineFit.cxx:352
 AliSplineFit.cxx:353
 AliSplineFit.cxx:354
 AliSplineFit.cxx:355
 AliSplineFit.cxx:356
 AliSplineFit.cxx:357
 AliSplineFit.cxx:358
 AliSplineFit.cxx:359
 AliSplineFit.cxx:360
 AliSplineFit.cxx:361
 AliSplineFit.cxx:362
 AliSplineFit.cxx:363
 AliSplineFit.cxx:364
 AliSplineFit.cxx:365
 AliSplineFit.cxx:366
 AliSplineFit.cxx:367
 AliSplineFit.cxx:368
 AliSplineFit.cxx:369
 AliSplineFit.cxx:370
 AliSplineFit.cxx:371
 AliSplineFit.cxx:372
 AliSplineFit.cxx:373
 AliSplineFit.cxx:374
 AliSplineFit.cxx:375
 AliSplineFit.cxx:376
 AliSplineFit.cxx:377
 AliSplineFit.cxx:378
 AliSplineFit.cxx:379
 AliSplineFit.cxx:380
 AliSplineFit.cxx:381
 AliSplineFit.cxx:382
 AliSplineFit.cxx:383
 AliSplineFit.cxx:384
 AliSplineFit.cxx:385
 AliSplineFit.cxx:386
 AliSplineFit.cxx:387
 AliSplineFit.cxx:388
 AliSplineFit.cxx:389
 AliSplineFit.cxx:390
 AliSplineFit.cxx:391
 AliSplineFit.cxx:392
 AliSplineFit.cxx:393
 AliSplineFit.cxx:394
 AliSplineFit.cxx:395
 AliSplineFit.cxx:396
 AliSplineFit.cxx:397
 AliSplineFit.cxx:398
 AliSplineFit.cxx:399
 AliSplineFit.cxx:400
 AliSplineFit.cxx:401
 AliSplineFit.cxx:402
 AliSplineFit.cxx:403
 AliSplineFit.cxx:404
 AliSplineFit.cxx:405
 AliSplineFit.cxx:406
 AliSplineFit.cxx:407
 AliSplineFit.cxx:408
 AliSplineFit.cxx:409
 AliSplineFit.cxx:410
 AliSplineFit.cxx:411
 AliSplineFit.cxx:412
 AliSplineFit.cxx:413
 AliSplineFit.cxx:414
 AliSplineFit.cxx:415
 AliSplineFit.cxx:416
 AliSplineFit.cxx:417
 AliSplineFit.cxx:418
 AliSplineFit.cxx:419
 AliSplineFit.cxx:420
 AliSplineFit.cxx:421
 AliSplineFit.cxx:422
 AliSplineFit.cxx:423
 AliSplineFit.cxx:424
 AliSplineFit.cxx:425
 AliSplineFit.cxx:426
 AliSplineFit.cxx:427
 AliSplineFit.cxx:428
 AliSplineFit.cxx:429
 AliSplineFit.cxx:430
 AliSplineFit.cxx:431
 AliSplineFit.cxx:432
 AliSplineFit.cxx:433
 AliSplineFit.cxx:434
 AliSplineFit.cxx:435
 AliSplineFit.cxx:436
 AliSplineFit.cxx:437
 AliSplineFit.cxx:438
 AliSplineFit.cxx:439
 AliSplineFit.cxx:440
 AliSplineFit.cxx:441
 AliSplineFit.cxx:442
 AliSplineFit.cxx:443
 AliSplineFit.cxx:444
 AliSplineFit.cxx:445
 AliSplineFit.cxx:446
 AliSplineFit.cxx:447
 AliSplineFit.cxx:448
 AliSplineFit.cxx:449
 AliSplineFit.cxx:450
 AliSplineFit.cxx:451
 AliSplineFit.cxx:452
 AliSplineFit.cxx:453
 AliSplineFit.cxx:454
 AliSplineFit.cxx:455
 AliSplineFit.cxx:456
 AliSplineFit.cxx:457
 AliSplineFit.cxx:458
 AliSplineFit.cxx:459
 AliSplineFit.cxx:460
 AliSplineFit.cxx:461
 AliSplineFit.cxx:462
 AliSplineFit.cxx:463
 AliSplineFit.cxx:464
 AliSplineFit.cxx:465
 AliSplineFit.cxx:466
 AliSplineFit.cxx:467
 AliSplineFit.cxx:468
 AliSplineFit.cxx:469
 AliSplineFit.cxx:470
 AliSplineFit.cxx:471
 AliSplineFit.cxx:472
 AliSplineFit.cxx:473
 AliSplineFit.cxx:474
 AliSplineFit.cxx:475
 AliSplineFit.cxx:476
 AliSplineFit.cxx:477
 AliSplineFit.cxx:478
 AliSplineFit.cxx:479
 AliSplineFit.cxx:480
 AliSplineFit.cxx:481
 AliSplineFit.cxx:482
 AliSplineFit.cxx:483
 AliSplineFit.cxx:484
 AliSplineFit.cxx:485
 AliSplineFit.cxx:486
 AliSplineFit.cxx:487
 AliSplineFit.cxx:488
 AliSplineFit.cxx:489
 AliSplineFit.cxx:490
 AliSplineFit.cxx:491
 AliSplineFit.cxx:492
 AliSplineFit.cxx:493
 AliSplineFit.cxx:494
 AliSplineFit.cxx:495
 AliSplineFit.cxx:496
 AliSplineFit.cxx:497
 AliSplineFit.cxx:498
 AliSplineFit.cxx:499
 AliSplineFit.cxx:500
 AliSplineFit.cxx:501
 AliSplineFit.cxx:502
 AliSplineFit.cxx:503
 AliSplineFit.cxx:504
 AliSplineFit.cxx:505
 AliSplineFit.cxx:506
 AliSplineFit.cxx:507
 AliSplineFit.cxx:508
 AliSplineFit.cxx:509
 AliSplineFit.cxx:510
 AliSplineFit.cxx:511
 AliSplineFit.cxx:512
 AliSplineFit.cxx:513
 AliSplineFit.cxx:514
 AliSplineFit.cxx:515
 AliSplineFit.cxx:516
 AliSplineFit.cxx:517
 AliSplineFit.cxx:518
 AliSplineFit.cxx:519
 AliSplineFit.cxx:520
 AliSplineFit.cxx:521
 AliSplineFit.cxx:522
 AliSplineFit.cxx:523
 AliSplineFit.cxx:524
 AliSplineFit.cxx:525
 AliSplineFit.cxx:526
 AliSplineFit.cxx:527
 AliSplineFit.cxx:528
 AliSplineFit.cxx:529
 AliSplineFit.cxx:530
 AliSplineFit.cxx:531
 AliSplineFit.cxx:532
 AliSplineFit.cxx:533
 AliSplineFit.cxx:534
 AliSplineFit.cxx:535
 AliSplineFit.cxx:536
 AliSplineFit.cxx:537
 AliSplineFit.cxx:538
 AliSplineFit.cxx:539
 AliSplineFit.cxx:540
 AliSplineFit.cxx:541
 AliSplineFit.cxx:542
 AliSplineFit.cxx:543
 AliSplineFit.cxx:544
 AliSplineFit.cxx:545
 AliSplineFit.cxx:546
 AliSplineFit.cxx:547
 AliSplineFit.cxx:548
 AliSplineFit.cxx:549
 AliSplineFit.cxx:550
 AliSplineFit.cxx:551
 AliSplineFit.cxx:552
 AliSplineFit.cxx:553
 AliSplineFit.cxx:554
 AliSplineFit.cxx:555
 AliSplineFit.cxx:556
 AliSplineFit.cxx:557
 AliSplineFit.cxx:558
 AliSplineFit.cxx:559
 AliSplineFit.cxx:560
 AliSplineFit.cxx:561
 AliSplineFit.cxx:562
 AliSplineFit.cxx:563
 AliSplineFit.cxx:564
 AliSplineFit.cxx:565
 AliSplineFit.cxx:566
 AliSplineFit.cxx:567
 AliSplineFit.cxx:568
 AliSplineFit.cxx:569
 AliSplineFit.cxx:570
 AliSplineFit.cxx:571
 AliSplineFit.cxx:572
 AliSplineFit.cxx:573
 AliSplineFit.cxx:574
 AliSplineFit.cxx:575
 AliSplineFit.cxx:576
 AliSplineFit.cxx:577
 AliSplineFit.cxx:578
 AliSplineFit.cxx:579
 AliSplineFit.cxx:580
 AliSplineFit.cxx:581
 AliSplineFit.cxx:582
 AliSplineFit.cxx:583
 AliSplineFit.cxx:584
 AliSplineFit.cxx:585
 AliSplineFit.cxx:586
 AliSplineFit.cxx:587
 AliSplineFit.cxx:588
 AliSplineFit.cxx:589
 AliSplineFit.cxx:590
 AliSplineFit.cxx:591
 AliSplineFit.cxx:592
 AliSplineFit.cxx:593
 AliSplineFit.cxx:594
 AliSplineFit.cxx:595
 AliSplineFit.cxx:596
 AliSplineFit.cxx:597
 AliSplineFit.cxx:598
 AliSplineFit.cxx:599
 AliSplineFit.cxx:600
 AliSplineFit.cxx:601
 AliSplineFit.cxx:602
 AliSplineFit.cxx:603
 AliSplineFit.cxx:604
 AliSplineFit.cxx:605
 AliSplineFit.cxx:606
 AliSplineFit.cxx:607
 AliSplineFit.cxx:608
 AliSplineFit.cxx:609
 AliSplineFit.cxx:610
 AliSplineFit.cxx:611
 AliSplineFit.cxx:612
 AliSplineFit.cxx:613
 AliSplineFit.cxx:614
 AliSplineFit.cxx:615
 AliSplineFit.cxx:616
 AliSplineFit.cxx:617
 AliSplineFit.cxx:618
 AliSplineFit.cxx:619
 AliSplineFit.cxx:620
 AliSplineFit.cxx:621
 AliSplineFit.cxx:622
 AliSplineFit.cxx:623
 AliSplineFit.cxx:624
 AliSplineFit.cxx:625
 AliSplineFit.cxx:626
 AliSplineFit.cxx:627
 AliSplineFit.cxx:628
 AliSplineFit.cxx:629
 AliSplineFit.cxx:630
 AliSplineFit.cxx:631
 AliSplineFit.cxx:632
 AliSplineFit.cxx:633
 AliSplineFit.cxx:634
 AliSplineFit.cxx:635
 AliSplineFit.cxx:636
 AliSplineFit.cxx:637
 AliSplineFit.cxx:638
 AliSplineFit.cxx:639
 AliSplineFit.cxx:640
 AliSplineFit.cxx:641
 AliSplineFit.cxx:642
 AliSplineFit.cxx:643
 AliSplineFit.cxx:644
 AliSplineFit.cxx:645
 AliSplineFit.cxx:646
 AliSplineFit.cxx:647
 AliSplineFit.cxx:648
 AliSplineFit.cxx:649
 AliSplineFit.cxx:650
 AliSplineFit.cxx:651
 AliSplineFit.cxx:652
 AliSplineFit.cxx:653
 AliSplineFit.cxx:654
 AliSplineFit.cxx:655
 AliSplineFit.cxx:656
 AliSplineFit.cxx:657
 AliSplineFit.cxx:658
 AliSplineFit.cxx:659
 AliSplineFit.cxx:660
 AliSplineFit.cxx:661
 AliSplineFit.cxx:662
 AliSplineFit.cxx:663
 AliSplineFit.cxx:664
 AliSplineFit.cxx:665
 AliSplineFit.cxx:666
 AliSplineFit.cxx:667
 AliSplineFit.cxx:668
 AliSplineFit.cxx:669
 AliSplineFit.cxx:670
 AliSplineFit.cxx:671
 AliSplineFit.cxx:672
 AliSplineFit.cxx:673
 AliSplineFit.cxx:674
 AliSplineFit.cxx:675
 AliSplineFit.cxx:676
 AliSplineFit.cxx:677
 AliSplineFit.cxx:678
 AliSplineFit.cxx:679
 AliSplineFit.cxx:680
 AliSplineFit.cxx:681
 AliSplineFit.cxx:682
 AliSplineFit.cxx:683
 AliSplineFit.cxx:684
 AliSplineFit.cxx:685
 AliSplineFit.cxx:686
 AliSplineFit.cxx:687
 AliSplineFit.cxx:688
 AliSplineFit.cxx:689
 AliSplineFit.cxx:690
 AliSplineFit.cxx:691
 AliSplineFit.cxx:692
 AliSplineFit.cxx:693
 AliSplineFit.cxx:694
 AliSplineFit.cxx:695
 AliSplineFit.cxx:696
 AliSplineFit.cxx:697
 AliSplineFit.cxx:698
 AliSplineFit.cxx:699
 AliSplineFit.cxx:700
 AliSplineFit.cxx:701
 AliSplineFit.cxx:702
 AliSplineFit.cxx:703
 AliSplineFit.cxx:704
 AliSplineFit.cxx:705
 AliSplineFit.cxx:706
 AliSplineFit.cxx:707
 AliSplineFit.cxx:708
 AliSplineFit.cxx:709
 AliSplineFit.cxx:710
 AliSplineFit.cxx:711
 AliSplineFit.cxx:712
 AliSplineFit.cxx:713
 AliSplineFit.cxx:714
 AliSplineFit.cxx:715
 AliSplineFit.cxx:716
 AliSplineFit.cxx:717
 AliSplineFit.cxx:718
 AliSplineFit.cxx:719
 AliSplineFit.cxx:720
 AliSplineFit.cxx:721
 AliSplineFit.cxx:722
 AliSplineFit.cxx:723
 AliSplineFit.cxx:724
 AliSplineFit.cxx:725
 AliSplineFit.cxx:726
 AliSplineFit.cxx:727
 AliSplineFit.cxx:728
 AliSplineFit.cxx:729
 AliSplineFit.cxx:730
 AliSplineFit.cxx:731
 AliSplineFit.cxx:732
 AliSplineFit.cxx:733
 AliSplineFit.cxx:734
 AliSplineFit.cxx:735
 AliSplineFit.cxx:736
 AliSplineFit.cxx:737
 AliSplineFit.cxx:738
 AliSplineFit.cxx:739
 AliSplineFit.cxx:740
 AliSplineFit.cxx:741
 AliSplineFit.cxx:742
 AliSplineFit.cxx:743
 AliSplineFit.cxx:744
 AliSplineFit.cxx:745
 AliSplineFit.cxx:746
 AliSplineFit.cxx:747
 AliSplineFit.cxx:748
 AliSplineFit.cxx:749
 AliSplineFit.cxx:750
 AliSplineFit.cxx:751
 AliSplineFit.cxx:752
 AliSplineFit.cxx:753
 AliSplineFit.cxx:754
 AliSplineFit.cxx:755
 AliSplineFit.cxx:756
 AliSplineFit.cxx:757
 AliSplineFit.cxx:758
 AliSplineFit.cxx:759
 AliSplineFit.cxx:760
 AliSplineFit.cxx:761
 AliSplineFit.cxx:762
 AliSplineFit.cxx:763
 AliSplineFit.cxx:764
 AliSplineFit.cxx:765
 AliSplineFit.cxx:766
 AliSplineFit.cxx:767
 AliSplineFit.cxx:768
 AliSplineFit.cxx:769
 AliSplineFit.cxx:770
 AliSplineFit.cxx:771
 AliSplineFit.cxx:772
 AliSplineFit.cxx:773
 AliSplineFit.cxx:774
 AliSplineFit.cxx:775
 AliSplineFit.cxx:776
 AliSplineFit.cxx:777
 AliSplineFit.cxx:778
 AliSplineFit.cxx:779
 AliSplineFit.cxx:780
 AliSplineFit.cxx:781
 AliSplineFit.cxx:782
 AliSplineFit.cxx:783
 AliSplineFit.cxx:784
 AliSplineFit.cxx:785
 AliSplineFit.cxx:786
 AliSplineFit.cxx:787
 AliSplineFit.cxx:788
 AliSplineFit.cxx:789
 AliSplineFit.cxx:790
 AliSplineFit.cxx:791
 AliSplineFit.cxx:792
 AliSplineFit.cxx:793
 AliSplineFit.cxx:794
 AliSplineFit.cxx:795
 AliSplineFit.cxx:796
 AliSplineFit.cxx:797
 AliSplineFit.cxx:798
 AliSplineFit.cxx:799
 AliSplineFit.cxx:800
 AliSplineFit.cxx:801
 AliSplineFit.cxx:802
 AliSplineFit.cxx:803
 AliSplineFit.cxx:804
 AliSplineFit.cxx:805
 AliSplineFit.cxx:806
 AliSplineFit.cxx:807
 AliSplineFit.cxx:808
 AliSplineFit.cxx:809
 AliSplineFit.cxx:810
 AliSplineFit.cxx:811
 AliSplineFit.cxx:812
 AliSplineFit.cxx:813
 AliSplineFit.cxx:814
 AliSplineFit.cxx:815
 AliSplineFit.cxx:816
 AliSplineFit.cxx:817
 AliSplineFit.cxx:818
 AliSplineFit.cxx:819
 AliSplineFit.cxx:820
 AliSplineFit.cxx:821
 AliSplineFit.cxx:822
 AliSplineFit.cxx:823
 AliSplineFit.cxx:824
 AliSplineFit.cxx:825
 AliSplineFit.cxx:826
 AliSplineFit.cxx:827
 AliSplineFit.cxx:828
 AliSplineFit.cxx:829
 AliSplineFit.cxx:830
 AliSplineFit.cxx:831
 AliSplineFit.cxx:832
 AliSplineFit.cxx:833
 AliSplineFit.cxx:834
 AliSplineFit.cxx:835
 AliSplineFit.cxx:836
 AliSplineFit.cxx:837
 AliSplineFit.cxx:838
 AliSplineFit.cxx:839
 AliSplineFit.cxx:840
 AliSplineFit.cxx:841
 AliSplineFit.cxx:842
 AliSplineFit.cxx:843
 AliSplineFit.cxx:844
 AliSplineFit.cxx:845
 AliSplineFit.cxx:846
 AliSplineFit.cxx:847
 AliSplineFit.cxx:848
 AliSplineFit.cxx:849
 AliSplineFit.cxx:850
 AliSplineFit.cxx:851
 AliSplineFit.cxx:852
 AliSplineFit.cxx:853
 AliSplineFit.cxx:854
 AliSplineFit.cxx:855
 AliSplineFit.cxx:856
 AliSplineFit.cxx:857
 AliSplineFit.cxx:858
 AliSplineFit.cxx:859
 AliSplineFit.cxx:860
 AliSplineFit.cxx:861
 AliSplineFit.cxx:862
 AliSplineFit.cxx:863
 AliSplineFit.cxx:864
 AliSplineFit.cxx:865
 AliSplineFit.cxx:866
 AliSplineFit.cxx:867
 AliSplineFit.cxx:868
 AliSplineFit.cxx:869
 AliSplineFit.cxx:870
 AliSplineFit.cxx:871
 AliSplineFit.cxx:872
 AliSplineFit.cxx:873
 AliSplineFit.cxx:874
 AliSplineFit.cxx:875
 AliSplineFit.cxx:876
 AliSplineFit.cxx:877
 AliSplineFit.cxx:878
 AliSplineFit.cxx:879
 AliSplineFit.cxx:880
 AliSplineFit.cxx:881
 AliSplineFit.cxx:882
 AliSplineFit.cxx:883
 AliSplineFit.cxx:884
 AliSplineFit.cxx:885
 AliSplineFit.cxx:886
 AliSplineFit.cxx:887
 AliSplineFit.cxx:888
 AliSplineFit.cxx:889
 AliSplineFit.cxx:890
 AliSplineFit.cxx:891
 AliSplineFit.cxx:892
 AliSplineFit.cxx:893
 AliSplineFit.cxx:894
 AliSplineFit.cxx:895
 AliSplineFit.cxx:896
 AliSplineFit.cxx:897
 AliSplineFit.cxx:898
 AliSplineFit.cxx:899
 AliSplineFit.cxx:900
 AliSplineFit.cxx:901
 AliSplineFit.cxx:902
 AliSplineFit.cxx:903
 AliSplineFit.cxx:904
 AliSplineFit.cxx:905
 AliSplineFit.cxx:906
 AliSplineFit.cxx:907
 AliSplineFit.cxx:908
 AliSplineFit.cxx:909
 AliSplineFit.cxx:910
 AliSplineFit.cxx:911
 AliSplineFit.cxx:912
 AliSplineFit.cxx:913
 AliSplineFit.cxx:914
 AliSplineFit.cxx:915
 AliSplineFit.cxx:916
 AliSplineFit.cxx:917
 AliSplineFit.cxx:918
 AliSplineFit.cxx:919
 AliSplineFit.cxx:920
 AliSplineFit.cxx:921
 AliSplineFit.cxx:922
 AliSplineFit.cxx:923
 AliSplineFit.cxx:924
 AliSplineFit.cxx:925
 AliSplineFit.cxx:926
 AliSplineFit.cxx:927
 AliSplineFit.cxx:928
 AliSplineFit.cxx:929
 AliSplineFit.cxx:930
 AliSplineFit.cxx:931
 AliSplineFit.cxx:932
 AliSplineFit.cxx:933
 AliSplineFit.cxx:934
 AliSplineFit.cxx:935
 AliSplineFit.cxx:936
 AliSplineFit.cxx:937
 AliSplineFit.cxx:938
 AliSplineFit.cxx:939
 AliSplineFit.cxx:940
 AliSplineFit.cxx:941
 AliSplineFit.cxx:942
 AliSplineFit.cxx:943
 AliSplineFit.cxx:944
 AliSplineFit.cxx:945
 AliSplineFit.cxx:946
 AliSplineFit.cxx:947
 AliSplineFit.cxx:948
 AliSplineFit.cxx:949
 AliSplineFit.cxx:950
 AliSplineFit.cxx:951
 AliSplineFit.cxx:952
 AliSplineFit.cxx:953
 AliSplineFit.cxx:954
 AliSplineFit.cxx:955
 AliSplineFit.cxx:956
 AliSplineFit.cxx:957
 AliSplineFit.cxx:958
 AliSplineFit.cxx:959
 AliSplineFit.cxx:960
 AliSplineFit.cxx:961
 AliSplineFit.cxx:962
 AliSplineFit.cxx:963
 AliSplineFit.cxx:964
 AliSplineFit.cxx:965
 AliSplineFit.cxx:966
 AliSplineFit.cxx:967
 AliSplineFit.cxx:968
 AliSplineFit.cxx:969
 AliSplineFit.cxx:970
 AliSplineFit.cxx:971
 AliSplineFit.cxx:972
 AliSplineFit.cxx:973
 AliSplineFit.cxx:974
 AliSplineFit.cxx:975
 AliSplineFit.cxx:976
 AliSplineFit.cxx:977
 AliSplineFit.cxx:978
 AliSplineFit.cxx:979
 AliSplineFit.cxx:980
 AliSplineFit.cxx:981
 AliSplineFit.cxx:982
 AliSplineFit.cxx:983
 AliSplineFit.cxx:984
 AliSplineFit.cxx:985
 AliSplineFit.cxx:986
 AliSplineFit.cxx:987
 AliSplineFit.cxx:988
 AliSplineFit.cxx:989
 AliSplineFit.cxx:990
 AliSplineFit.cxx:991
 AliSplineFit.cxx:992
 AliSplineFit.cxx:993
 AliSplineFit.cxx:994
 AliSplineFit.cxx:995
 AliSplineFit.cxx:996
 AliSplineFit.cxx:997
 AliSplineFit.cxx:998
 AliSplineFit.cxx:999
 AliSplineFit.cxx:1000
 AliSplineFit.cxx:1001
 AliSplineFit.cxx:1002
 AliSplineFit.cxx:1003
 AliSplineFit.cxx:1004
 AliSplineFit.cxx:1005
 AliSplineFit.cxx:1006
 AliSplineFit.cxx:1007
 AliSplineFit.cxx:1008
 AliSplineFit.cxx:1009
 AliSplineFit.cxx:1010
 AliSplineFit.cxx:1011
 AliSplineFit.cxx:1012
 AliSplineFit.cxx:1013
 AliSplineFit.cxx:1014
 AliSplineFit.cxx:1015
 AliSplineFit.cxx:1016
 AliSplineFit.cxx:1017
 AliSplineFit.cxx:1018
 AliSplineFit.cxx:1019
 AliSplineFit.cxx:1020
 AliSplineFit.cxx:1021
 AliSplineFit.cxx:1022
 AliSplineFit.cxx:1023
 AliSplineFit.cxx:1024
 AliSplineFit.cxx:1025
 AliSplineFit.cxx:1026
 AliSplineFit.cxx:1027
 AliSplineFit.cxx:1028
 AliSplineFit.cxx:1029
 AliSplineFit.cxx:1030
 AliSplineFit.cxx:1031
 AliSplineFit.cxx:1032
 AliSplineFit.cxx:1033
 AliSplineFit.cxx:1034
 AliSplineFit.cxx:1035
 AliSplineFit.cxx:1036
 AliSplineFit.cxx:1037
 AliSplineFit.cxx:1038
 AliSplineFit.cxx:1039
 AliSplineFit.cxx:1040
 AliSplineFit.cxx:1041
 AliSplineFit.cxx:1042
 AliSplineFit.cxx:1043
 AliSplineFit.cxx:1044
 AliSplineFit.cxx:1045
 AliSplineFit.cxx:1046
 AliSplineFit.cxx:1047
 AliSplineFit.cxx:1048
 AliSplineFit.cxx:1049
 AliSplineFit.cxx:1050
 AliSplineFit.cxx:1051
 AliSplineFit.cxx:1052
 AliSplineFit.cxx:1053
 AliSplineFit.cxx:1054
 AliSplineFit.cxx:1055
 AliSplineFit.cxx:1056
 AliSplineFit.cxx:1057
 AliSplineFit.cxx:1058