#ifndef ALI_MILLEPEDE_H
#define ALI_MILLEPEDE_H
#include <TObject.h>
#include <TArrayI.h>
#include <TArrayD.h>
class AliMillepede : public TObject {
public:
AliMillepede();
virtual ~AliMillepede( );
virtual Int_t InitMille(int nglo, int nloc, int nstd,
double lResCut, double lResCutInit);
virtual Int_t GlobalFit(double par[], double error[], double pull[]);
virtual Int_t SetGlobalParameters(double *param);
virtual Int_t SetGlobalParameter(int iPar, double vPar);
virtual Int_t SetParSigma(int iPar, double sigma);
virtual Int_t SetNonLinear(int index);
virtual Int_t SetGlobalConstraint(double dercs[], double rhs);
virtual Int_t SetLocalEquation(double dergb[], double derlc[], double rmeas, double sigma);
virtual Int_t LocalFit(int n, double localParams[], Bool_t bSingleFit);
virtual Int_t GetNLocalEquations() const {return fNLocalEquations;};
virtual void SetNLocalEquations(int value) {fNLocalEquations = value;};
virtual Int_t PrintGlobalParameters() const;
virtual Int_t SetIterations (double cutfac);
virtual Double_t GetParError(int iPar) const;
private:
static const int fgkMaxGlobalPar = 1000;
static const int fgkMaxLocalPar = 20;
static const int fgkMaxGloCsts = 20;
static const int fgkMaxGloPC = 1020;
int SpmInv(double v[][fgkMaxGloPC], double b[], int n);
int SpmInv(double v[][fgkMaxLocalPar], double b[], int n);
int SpAVAt(double v[][fgkMaxLocalPar], double a[][fgkMaxLocalPar], double w[][fgkMaxGlobalPar], int n, int m);
int SpAX(double a[][fgkMaxLocalPar], double x[], double y[], int n, int m);
double Chi2DoFLim(int n, int nd);
double fMatCGlo[fgkMaxGloPC][fgkMaxGloPC];
double fMatCLoc[fgkMaxLocalPar][fgkMaxLocalPar];
double fMatCGloLoc[fgkMaxGlobalPar][fgkMaxLocalPar];
double fMatCGloCorr[fgkMaxGlobalPar][fgkMaxGlobalPar];
double fMatDerConstr[fgkMaxGloCsts][fgkMaxGlobalPar];
double fDiagCGlo[fgkMaxGloPC];
double fVecBGlo[fgkMaxGloPC];
double fVecBGloCorr[fgkMaxGlobalPar];
double fVecBLoc[fgkMaxLocalPar];
double fInitPar[fgkMaxGlobalPar];
double fDeltaPar[fgkMaxGlobalPar];
double fSigmaPar[fgkMaxGlobalPar];
double fLagMult[fgkMaxGloCsts];
Bool_t fIsNonLinear[fgkMaxGlobalPar];
int fGlo2CGLRow[fgkMaxGlobalPar];
int fCGLRow2Glo[fgkMaxGlobalPar];
TArrayI fIndexLocEq;
TArrayD fDerivLocEq;
TArrayI fIndexAllEqs;
TArrayD fDerivAllEqs;
TArrayI fLocEqPlace;
Int_t fNIndexLocEq;
Int_t fNDerivLocEq;
Int_t fNIndexAllEqs;
Int_t fNDerivAllEqs;
Int_t fNLocEqPlace;
int fNLocalEquations;
double fResCutInit;
double fResCut;
double fChi2CutFactor;
double fChi2CutRef;
int fIter;
int fMaxIter;
int fNStdDev;
int fNGlobalConstraints;
int fNLocalFits;
int fNLocalFitsRejected;
int fNGlobalPar;
int fNLocalPar;
ClassDef(AliMillepede, 1)
};
#endif