#ifndef RECO_STRIPABC_H
#define RECO_STRIPABC_H

///------------------------------------------------------------------------------------------------
///
///  Abstract reconstruction base class StripABC
///
///  Authors: Sergei Avvakumov and Rustem Ospanov
///
///  $Id: StripABC.h,v 1.2 2007/02/07 01:53:15 avva Exp $
///------------------------------------------------------------------------------------------------

//C++
#include <vector>
#include <iostream>

//ROOT
#include "Rtypes.h"

//MINOS
#include "Conventions/CalDigitType.h"
#include "Conventions/StripEnd.h"
#include "Conventions/PlaneView.h"
#include "Plex/PlexStripEndId.h"

//Local
#include "Handle.h"
#include "RefCount.h"


namespace Reco
{
  class StripABC : public RefCount
  {

  public:

      StripABC();

      virtual ~StripABC();

      virtual Float_t GetCharge() const = 0;

      virtual Float_t  GetZPos() const = 0;
      virtual Float_t  GetTPos() const = 0;

      virtual PlexStripEndId  GetStripEndId()  const = 0;

      virtual UShort_t GetPlane() const = 0;
      virtual UShort_t GetStrip() const = 0;

      virtual UShort_t GetDemuxVetoFlag() const = 0;
      virtual PlaneView::PlaneView_t GetPlaneView() const = 0;

      virtual void Print(std::ostream& o) const;

  private:

  };

  //---------------------------------------------------------------------------------
  // typedef definitions
  //---------------------------------------------------------------------------------
  typedef Handle<StripABC> Strip_t;
  typedef std::vector<Handle<StripABC> > StripVec_t;
  typedef std::vector<Handle<StripABC> >::const_iterator StripIter_t;

  //---------------------------------------------------------------------------------
  // a functor for stl sort algorithm
  //---------------------------------------------------------------------------------
  struct ByPlane : public std::binary_function<Strip_t, Strip_t, bool>
  {
      bool operator()(const Strip_t& lhs, const Strip_t& rhs)
    {
        return ( lhs -> GetPlane() < rhs -> GetPlane() );
    }

  };

} //end of Reco namespace


//---------------------------------------------------------------------------------
// Strips can be printed with "cout << strip;"
//---------------------------------------------------------------------------------
std::ostream& operator<<(std::ostream& o, const Reco::StripABC& self);

#endif
