#ifndef ALISPLINEFIT_H
#define ALISPLINEFIT_H
#include "TGraph.h"
#include "TGraphSmooth.h"
#include "TRandom.h"
#include "TSpline.h"
#include "TLinearFitter.h"
#include "TDecompSVD.h"
#include "TDecompSparse.h"
#include "TMatrixDSparse.h"
#include "TF1.h"
#include "TH1F.h"
#include "TObject.h"
#include "TClonesArray.h"
#include "TMath.h"
#include "TTreeStream.h"
class AliSplineFit : public TObject {
public:
AliSplineFit();
AliSplineFit(const AliSplineFit&);
~AliSplineFit();
AliSplineFit& operator=(const AliSplineFit&);
Double_t Eval(Double_t x, Int_t deriv=0) const;
void InitKnots(TGraph * graph, Int_t min, Int_t iter, Double_t maxDelta);
void MakeKnots0(TGraph * graph, Double_t maxdelta, Int_t minpoints);
void SplineFit(Int_t nder);
void CopyGraph();
void MakeSmooth(TGraph * graph, Float_t ratio, Option_t * type);
void Update(TSpline3 *spline, Int_t nknots);
void Cleanup();
Int_t GetKnots() const {return fN;}
Double_t* GetX() const {return fX;}
Double_t* GetY0() const {return fY0;}
Double_t* GetY1() const {return fY1;}
TGraph * MakeGraph(Double_t xmin, Double_t xmax, Int_t npoints, Int_t deriv=0) const ;
TGraph * MakeDiff(TGraph * graph) const ;
TH1F * MakeDiffHisto(TGraph * graph) const;
static void Test(Int_t npoints=2000, Int_t ntracks=100, Float_t snoise=0.05);
static TGraph * GenerGraph(Int_t npoints, Double_t fraction, Double_t s1, Double_t s2, Double_t s3, Int_t der=0);
static TGraph * GenerNoise(TGraph * graph0, Double_t s0);
void SetGraph (TGraph* graph) { fGraph=graph; }
void SetMinPoints (Int_t minPoints) { fMinPoints=minPoints;}
Int_t GetMinPoints() const { return fMinPoints; }
protected:
Int_t OptimizeKnots(Int_t nIter);
Float_t CheckKnot(Int_t iKnot);
Bool_t RefitKnot(Int_t iKnot);
Bool_t fBDump;
TGraph *fGraph;
Int_t fNmin;
Int_t fMinPoints;
Double_t fSigma;
Double_t fMaxDelta;
Int_t fN0;
TClonesArray *fParams;
TClonesArray *fCovars;
Int_t *fIndex;
static TLinearFitter* fitterStatic();
Int_t fN;
Double_t fChi2;
Double_t *fX;
Double_t *fY0;
Double_t *fY1;
Double_t *fChi2I;
ClassDef(AliSplineFit, 2);
};
#endif