////////////////////////////////////////////////////////////////////////
/// \class RAT::PMTSelectors::PMTSelector
///
/// \brief  Base class for PMTSelectors
///
/// \author Phil G Jones <p.jones22@physics.ox.ac.uk>
/// \author Matt Mottram < m.mottram@qmul.ac.uk> -- contact person
///
/// REVISION HISTORY:
///     - 26/04/2011 : P G Jones - New file
///     - 24/01/2013 : P G Jones - Changed to derive from the FitterComponent
///                              class. Allows variable setting.
///     - 2014-03-29 : P G Jones - Updated lifetime, added BeginOfRun method
///     - 2014-02-02 : Matt Strait - Minor changes to comply with CIC rules.
///
/// \details All PMT Selectors derive from this.
///
////////////////////////////////////////////////////////////////////////

#ifndef __RAT_PMTSelector_PMTSelector_hh__
#define __RAT_PMTSelector_PMTSelector_hh__

#include <RAT/FitterComponent.hh>

#include <string>
#include <vector>

namespace RAT
{
  class FitterPMT;

namespace DS
{
  class EV;
  class FitVertex;
  class Run;
}

namespace PMTSelectors
{

class PMTSelector : public FitterComponent
{
public:
  /// Initialise the selector
  ///
  /// @param[in] param Option string, typically ratdb index
  virtual void Initialise( const std::string& param ) = 0;

  /// Main Selector function
  ///
  /// @param[in] data PMT data to select from
  /// @param[in] vertex of interest to select by
  /// @returns selected FitterPMTs
  virtual std::vector<FitterPMT> GetSelectedPMTs( const std::vector<FitterPMT>& data,
                                                  const DS::FitVertex& vertex ) = 0;
};

} //::PMTSelector

} //::RAT

#endif