//_____________________________________________________________________________
///
/// \class TrackEstimatorFixed 
///
/// Set initial value of track momentum to a fixed value of 10 GeV, 
/// values of u, v, du/dz, dv/dz from simple estimates.
///
/// \author Sergei avva@fnal.gov
///

#include "TVectorD.h"

#include "Algorithm/AlgConfig.h"
#include "MessageService/MsgService.h"

#include "CandFitTrackSA/ConstFT.h"
#include "CandFitTrackSA/DataFT.h"
#include "CandFitTrackSA/FitContext.h"
#include "CandFitTrackSA/TracerSA.h"
#include "CandFitTrackSA/TrackEstimatorFixed.h"
#include "CandFitTrackSA/TrackContext.h"

CVSID("$Id: TrackEstimatorFixed.cxx,v 1.5 2008/05/06 16:05:39 ishi Exp $");

using namespace ConstFT;

///
/// ctor
///
TrackEstimatorFixed::TrackEstimatorFixed() :
    fQoverPInitial(-0.1), fVertexOffset(3)
{
    TracerSA trace("TrackEstimatorFixed::TrackEstimatorFixed()");
}

///
/// dtor
///
TrackEstimatorFixed::~TrackEstimatorFixed()
{
    TracerSA trace("TrackEstimatorFixed::~TrackEstimatorFixed()");
}

///
/// set initial track parameters (changes its argument FitContext)
///
TVectorD TrackEstimatorFixed::EstimateTrackParams(FitContext& fitContext) const
{
    TracerSA trace("TrackEstimatorFixed::EstimateTrackParams"
                                                "(FitContext& fitContext)");
    
    TVectorD fitEstimate(NTrackParams);
    //const DataFT* data = fitContext.GetData();
    
    fitEstimate(kU) = fitContext.fData.GetUlin(0);
    fitEstimate(kV) = fitContext.fData.GetVlin(0);

    if(fitContext.fData.GetNPlanes() > fVertexOffset+1){ 
      fitEstimate(kdUdZ) = ( fitContext.fData.GetDudzlin(fVertexOffset) +
                             fitContext.fData.GetDudzlin(fVertexOffset+1))/2. ;
      fitEstimate(kdVdZ) = ( fitContext.fData.GetDvdzlin(fVertexOffset) + 
                             fitContext.fData.GetDvdzlin(fVertexOffset+1))/2. ;
    } else {
      fitEstimate(kdUdZ) = 0.;
      fitEstimate(kdVdZ) = 0.;
    }
    
    // just a fixed momentum
    fitEstimate(kQoverP) = fQoverPInitial;
    return fitEstimate;
}        
        
///
/// read configuration parameters from AlgConfig
///
void TrackEstimatorFixed::Config(const AlgConfig& ac)
{
    TracerSA trace("TrackEstimatorFixed::Config(const AlgConfig&)");
    
    if ( ac.KeyExists("EstimatorFixedQPInitial") ) {
        fQoverPInitial = ac.GetDouble("EstimatorFixedQPInitial");
    }    
    if ( ac.KeyExists("EstimatorFixedVertexOffset") ) {
        fVertexOffset = ac.GetInt("EstimatorFixedVertexOffset");
    }    
}

