////////////////////////////////////////////////////////////////////////
//
// $Id: FitResult.cxx,v 1.5 2007/02/04 06:10:47 rhatcher Exp $
//
// FitResult
//
// Package: CandFitTrackSA
//
// FitResult - performs matrix calculations for CandFitTrackSA track fitter
//
// Contact: avva@fnal.gov
//
////////////////////////////////////////////////////////////////////////

#include "MessageService/MsgService.h"
#include "MessageService/MsgFormat.h"

#include "TMatrixD.h"

#include "CandFitTrackSA/DataFT.h"
#include "CandFitTrackSA/ConstFT.h"
#include "CandFitTrackSA/TracerSA.h"

#include "CandFitTrackSA/FitResult.h"

#include <cmath>

CVSID("$Id: FitResult.cxx,v 1.5 2007/02/04 06:10:47 rhatcher Exp $");

using namespace ConstFT;


///
///
///
FitResult::FitResult() : 
        fFitErrM(NTrackParams, NTrackParams),
        ftrackout(NTrackParams), fChi2(0), fdchi2(0), 
        fNPlanes(0), fNHits(0)
{
        TracerSA trace("FitResult::FitResult()");    
}


///
///
///
FitResult::FitResult(const TMatrixD& fitErrMatrix, const TVectorD& fitParams,
                  Double_t chi2, Double_t dchi2, Int_t nplanes, Int_t nhits) :
    fFitErrM(fitErrMatrix), ftrackout(fitParams), 
    fChi2(chi2), fdchi2(dchi2), 
    fNPlanes(nplanes), fNHits(nhits)
{
    TracerSA trace(
    "FitResult::FitResult(const TMatrixD&,const TVectorD&,double,double,int)"
    );    
}


///
///
///
Int_t FitResult::GetQ() const
{
    TracerSA trace("FitResult::GetQ()");    
    return (Int_t) TMath::Sign(1., ftrackout[kQoverP]);
}


///
///
///
Double_t FitResult::GetP() const
{
    TracerSA trace("FitResult::GetP()");    
    if ( TMath::Abs(ftrackout[kQoverP]) > TinyNumber ) {
        return TMath::Abs(1./ftrackout[kQoverP]);
    } else {
        return -1.;
    }
}


///
///
///
Double_t FitResult::GetEP() const
{
    TracerSA trace("FitResult::GetEP()");    
    if ( fFitErrM[kQoverP][kQoverP] > TinyNumber && 
                    TMath::Abs(ftrackout[kQoverP]) > TinyNumber ) {
        return pow(ftrackout[kQoverP],-2)*sqrt(fFitErrM[kQoverP][kQoverP]);
    } else {
        return -1.;
    }
}


///
///
///
Double_t FitResult::GetFitParameterError(int i) const
{    
    return pow( TMath::Max(TinyNumber,fFitErrM(i,i)), 0.5  );
}
