#ifndef COSY_SlaStars
#define COSY_SlaStars

#ifndef COSY_Slalib
#include "Slalib.h"
#endif

#ifndef MARS_MPointing
#include "MPointing.h"
#endif

class SlaStars : public Slalib
{
private:
    AltAz    fAltAz;     // [rad]
    RaDec    fRaDec;     // [rad]

    Double_t fHourAngle; // [h]

protected:
    double   fAmprms[21];
    double   fAoprms[14];

    double   fTt;        // [mjd] timescale TT

public:
    SlaStars(MObservatory::LocationName_t key);
    virtual ~SlaStars() { }

    //    const AltAz GetAltAz() const { return fAltAz*360/D2PI; }
    const ZdAz   GetZdAz()  const     { return ZdAz(TMath::Pi()/2-fAltAz.Alt(), fAltAz.Az())/TMath::DegToRad(); }
    const ZdAz   GetZdAzRad() const   { return ZdAz(TMath::Pi()/2-fAltAz.Alt(), fAltAz.Az()); }
    const RaDec  GetRaDec() const     { return fRaDec/TMath::DegToRad(); }
    const RaDec  GetRaDecRad() const  { return fRaDec; }
    const double GetHourAngle() const { return fHourAngle; }

    const double GetTT() const        { return fTt; }

    virtual void SetMjd(double mjd);

    void   Set(const AltAz &altaz);
    void   Set(const ZdAz  &zdaz);
    void   Set(const RaDec &radec);

    ZdAz   GetApproxVel(const RaDec &radec) const; // [rad/rad];

    RaDec  CalcRaDec(const AltAz &altaz) const;
    RaDec  CalcRaDec(const ZdAz  &altaz) const;

    RaDec  CalcRaDecFast(const AltAz &altaz) const;
    RaDec  CalcRaDecFast(const ZdAz  &altaz) const;

    AltAz  CalcAltAz(const RaDec &radec, double *ha=0) const;
    ZdAz   CalcZdAz (const RaDec &radec, double *ha=0) const;

    AltAz  CalcAltAz(const RaDec &radec, double mjd, double *ha=0)
    { SetMjd(mjd); return CalcAltAz(radec, ha); }
    ZdAz   CalcZdAz (const RaDec &radec, double mjd, double *ha=0)
    { SetMjd(mjd); return CalcZdAz(radec, ha); }

    AltAz  CalcAltAzFast(const RaDec &radec) const;
    ZdAz   CalcZdAzFast (const RaDec &radec) const;

    ClassDef(SlaStars, 0)
};

#endif
