////////////////////////////////////////////////////////////////////////
// $Id: AlgFitTrackMS.h,v 1.5 2005/10/26 03:38:40 rhatcher Exp $
//
// AlgFitTrackMS is a concrete FitTrackMS Algorithm class.
//
// Tom Bringley
// ttb2@duke.edu
// 6/13/2001
////////////////////////////////////////////////////////////////////////

#ifndef ALGFITTRACKMS_H
#define ALGFITTRACKMS_H

#include "Algorithm/AlgBase.h"
#include "RecoBase/AlgReco.h"
#include "RecoBase/AlgTrack.h"
#include "CandFitTrackMS/CandFitTrackMSHandle.h"
#include "Conventions/Detector.h"
#include "TMatrixD.h"
#include "TVectorD.h"

class CandTrackHandle;

class AlgFitTrackMS : public AlgBase, public AlgTrack, public AlgReco
{

public:
   AlgFitTrackMS();
   virtual ~AlgFitTrackMS();
   virtual void InitFitHandle(CandContext &cx);
   virtual void RunAlg(AlgConfig &ac, CandHandle &ch, CandContext &cx);
   virtual void Trace(const char *c) const;

private:

  Double_t ChiSquared(TMatrixD &ErrorMatrix);

  void     DetermineQ();

  Int_t    DoFitAlg(Double_t pInit, Double_t& pFit, Double_t& LFit);

  void     FitTrack(Double_t p0, Double_t &LogCovMDeterminant,
             Double_t &chiSquared);
  
  Double_t GetSigmaMS(Double_t peloss);

  void     InitArrays();

  void     InvertCovMatrix(TMatrixD &CovMatrix, TMatrixD &ErrorMatrix, 
                           Double_t &LogDet);
  
  void     MakeCovarianceMatrix(TMatrixD &CovMatrix, Double_t p0);

  void     MakeStraightTrack();
  
  void     MakePPlanes(Double_t p0);

  void     MakeSolnMatrices(TMatrixD& VariableCoefMatrix,
             TMatrixD &ConstantCoefMatrix, TMatrixD &ErrorMatrix);

  void     SetupAlg(AlgConfig &ac);

  void     WriteFit(Double_t ChiSquared, Double_t p0);

  CandFitTrackMSHandle* fCfh;

  Detector::Detector_t fDetector;

  Double_t fQ;
  Double_t fFlag;
  
  Double_t fLTolerance;
  Double_t fPTolerance;
  Double_t fPosErr;
  Double_t fXZero;
  Double_t fDedx;
  Double_t fSuperModGapSize;
  Double_t fSteelPlnWidth;
  Double_t fScintPlnWidth;
  Double_t fTotalPlnWidth;
  
  Int_t fNofit;
  Int_t fNoBField;
  Int_t fNoMS;
  Int_t fBothFit;
  Int_t fFullAna;

  Int_t fMaxHits;
  Int_t fMinHits;
  Double_t fMaxP;
  Double_t fMinP;
  Int_t fMaxIter;
  Int_t fInShower;

  Int_t fBFisFlipped;
  Int_t fSuperModSkippedPlane;
  
  Int_t fNHits;
  Int_t fNPlanes;

  TMatrixD fSolnMatrix;
  
  TVectorD fXHits;
  TVectorD fYHits;
  TVectorD fStraightXHits;
  TVectorD fStraightYHits;
  TVectorD fZHits;
  TVectorD fZPlanes;
  TVectorD fPPlanes;

ClassDef(AlgFitTrackMS,0)                           //AlgFitTrackMS version 0

};

#endif
