////////////////////////////////////////////////////////////////////////
/// \class RAT::FitterPMT
///
/// \brief  Hit information container for fitter components
///
/// \author Phil G Jones <p.g.jones@qmul.ac.uk>\n
/// \author Matt Mottram < m.mottram@qmul.ac.uk> -- contact person
///
/// REVISION HISTORY:\n
///     23/08/2013 : P G Jones - New file \n
///     14/02/2014 : G Prior - methods added and
///                  methods name changed for the SOCPMT fitter
///     13 May 2015: W Heintzelman - Add  Crate-Card-Channel-Cell number
///     25 April 2017: T. Kaptanoglu - Add Crosstalk flag
///
/// \details Contains the hit information and is used by the fitter
///         components exclusively. This differs from the DS::PMT*
///         objects in that it includes a error estimate for each piece
///         of hit information.
///
////////////////////////////////////////////////////////////////////////

#ifndef __RAT_FitterPMT__
#define __RAT_FitterPMT__

#include <RAT/DS/PMT.hh>

namespace RAT
{
namespace DS
{
  class SOCPMT;
}

class FitterPMT
{
public:
  FitterPMT() { };
  FitterPMT( const DS::PMTCal& pmtCal );
  FitterPMT( const DS::SOCPMT& socPMT );
  virtual ~FitterPMT() { };

  /// Return the ID (PMTCal) or the LCN (SOCPMT)
  int GetID() const { return fID; }
  // Return the CCCC ( Crate Card Channel Cell number )
  int GetCCCC() const { return fCCCC; }
  /// Return the hit time (PMTCal) or the centroid (SOCPMT)
  double GetTime() const { return fTime; }
  /// Return the error associated with the hit time (PMTCal) or the centroid (SOCPMT)
  double GetTimeError() const { return fTimeError; }
  /// Return the hit charge, QHL
  double GetQHL() const { return fQHL; }
  /// Return the error associated with the hit charge
  double GetQHLError() const { return fQHLError; }
  /// Return the hit charge, QHS
  double GetQHS() const { return fQHS; }
  /// Return the error associated with the hit charge
  double GetQHSError() const { return fQHSError; }
  /// Return the hit charge, QLX
  double GetQLX() const { return fQLX; }
  /// Return the error associated with the hit charge
  double GetQLXError() const { return fQLXError; }
  /// Return the status of the calibrations
  DS::BitMask GetStatus() const { return fStatus; }
  /// Return the crosstalk flag
  bool GetCrossTalkFlag() const { return fCrossTalkFlag; }
private:
  int fID; ///< The PMT channel number/id or lcn
  int fCCCC;    // CCCC ( Crate Card Channel Cell number )
  double fTime; ///< The hit time or centroid
  double fTimeError; ///< Error associated with the hit time or centroid
  double fQHL; ///< The hit QHL charge
  double fQHLError; ///< Error associated with the QHL charge
  double fQHS; ///< The hit QHS charge
  double fQHSError; ///< Error associated with the QHS charge
  double fQLX; ///< The hit QLX charge
  double fQLXError; ///< Error associated with the QLX charge
  DS::BitMask fStatus; ///< Status flags for the various calibrations
  bool fCrossTalkFlag; ///< Crosstalk flag for each pmt hit
};

} //::RAT

#endif