#ifndef TRACKCONTEXT_H
#define TRACKCONTEXT_H
//_____________________________________________________________________________
///
/// \class TrackContext 
///
/// TrackContext - encapsulates CandTrack context for the fitter. 
///
/// \author Sergei avva@fnal.gov
///

#include "Plex/PlexPlaneId.h"
#include "RecoBase/CandTrackHandle.h"
#include "Validity/VldContext.h"

#include "StripABC.h"

class CandContext;
class VldContext;


class TrackContext {

public:
//     TrackContext();
    TrackContext(CandContext& trackCandContext);

    ~TrackContext();

    // "convinience" methods
    
    PlexPlaneId GetBegPlaneId() const { return fBegPlaneId; };
    Int_t       GetBegPlane() const { return fBegPlaneId.GetPlane(); };
    
    PlexPlaneId GetEndPlaneId() const { return fEndPlaneId; };
    Int_t       GetEndPlane() const { return fEndPlaneId.GetPlane(); };
    
    Int_t       GetNPlanes() const 
                    { return abs(GetBegPlane() - GetEndPlane()) + 1; };

    Int_t       GetNTrackPlaneU() const; 
    Int_t       GetNTrackPlaneV() const; 
    Int_t       GetNTrackPlane() const; 
                    
    VldContext  GetVldContext() const { return fVldc; };

    Float_t     GetU(Int_t i) const { return fCandTrackHandle->GetU(i); };    
    Float_t     GetV(Int_t i) const { return fCandTrackHandle->GetV(i); };    

    Float_t     GetPrange() const   { return fPrange; };

    Short_t     GetDir()    const   { return fDir; };
    
    const CandTrackHandle* GetTrackHandle() const { return fCandTrackHandle;};

    // get methods to obtain SR fitter results
    Int_t       GetPassSR() const;
    Double_t    GetQPSR() const;
    Double_t    GetEQPSR() const;     
    Double_t    GetChi2SR() const;
    Double_t    GetRChi2SR() const;
    Double_t    GetCpuSR() const;
    Double_t    GetUSR() const;
    Double_t    GetUErrorSR() const;
    Double_t    GetVSR() const;
    Double_t    GetVErrorSR() const;
    Double_t    GetDirCosUSR() const;
    Double_t    GetEDirCosUSR() const;
    Double_t    GetDirCosVSR() const;
    Double_t    GetEDirCosVSR() const;
    Double_t    GetDirCosZSR() const;
    Double_t    GetMomentumSR() const;
    Double_t    GetMomentumRangeSR() const;
    Int_t       GetIterationsSR() const;
    Int_t       GetNdofSR() const;
    Int_t       GetEMChargeSR() const;

    void        FillTrackStrips();
    ///
    /// return a copy of the strip list
    Reco::StripVec_t   GetStripVec() const { return fStrips; };

private:

    ///
    /// pointer to CandFitTrackHandle to fit
    ///
    const CandTrackHandle*    fCandTrackHandle;
    
    ///
    /// pointer to validity context of the track
    ///
    VldContext          fVldc;
    
    ///
    /// first plane of the track
    ///
    PlexPlaneId         fBegPlaneId;
    
    ///
    /// last plane of the track
    PlexPlaneId         fEndPlaneId;
    
    ///
    /// track direction either 1 - along z axis (begplane < endplane)
    /// or -1  - against z axis (begplane > endplane)
    ///
    Short_t             fDir;
    
    ///
    /// track momentum from range
    ///
    Float_t             fPrange;

    ///
    /// vector of strips (to make it easier to convert to use ntuples)
    ///
    Reco::StripVec_t    fStrips;
};

#endif
