#ifndef gregsTrackPairCut_hh
#define gregsTrackPairCut_hh

class StHbtPair;
#include "StHbtMaker/Base/StHbtPairCut.h"

//_________________
class gregsTrackPairCut : public StHbtPairCut{
 public:
  gregsTrackPairCut();
  gregsTrackPairCut(const gregsTrackPairCut&);
  ~gregsTrackPairCut();

  virtual bool Pass(const StHbtPair*);
  void SetQuality(const float& lo, const float& hi );
  void SetKt(const float& lo, const float& hi);
  void SetPt(const float& lo, const float& hi);
  void SetOpeningAngle(const float& lo, const float& hi);
  void SetEntranceSeparation(const float& lo, const float& hi);
  void SetRapidity(const float& lo, const float& hi);
  void SetEta(const float& lo, const float& hi);
  void SetQinv(const float& lo, const float& hi);
  void SetMinv(const float& lo, const float& hi);
  void SetAngleToPrimaryVertex(const float& lo, const float& hi);
  void SetFracOfMergedRow(const float& lo, const float& hi);
  void SetClosestRowAtDCA(const float& lo, const float& hi);
  void SetWeightedAvSep(const float& lo, const float& hi);
  void SetAverageSeparation(const float& lo, const float& hi);
  void SetRValue(const float& lo);
  gregsTrackPairCut* Clone();
  virtual StHbtString Report();

 private:

  StHbtThreeVector mPrimaryVertex;
  float mFracOfMergedRow[2];
  
  double mClosestRowAtDCA[2];
  double mWeightedAvSep[2];
  float mQuality[2];
  float mKt[2];
  float mPt[2];
  float mRapidity[2];
  float mEta[2];
  float mQinv[2];
  float mMinv[2];
  float mOpeningAngle[2];
  float mAngleToPrimaryVertex[2];
  float mEntranceSeparation[2];
  float mAverageSeparation[2];
  float mRValueLo;
  long mNPairsPassed;
  long mNPairsFailed;

 protected:

#ifdef __ROOT__
  ClassDef(gregsTrackPairCut, 1)
#endif
};

inline void gregsTrackPairCut::SetQuality(const float& lo, const float& hi) 
{ mQuality[0]=lo; mQuality[1]=hi; }
inline void gregsTrackPairCut::SetKt(const float& lo, const float& hi) 
{ mKt[0]=lo; mKt[1]=hi; }
inline void gregsTrackPairCut::SetPt(const float& lo, const float& hi) 
{ mPt[0]=lo; mPt[1]=hi; }
inline void gregsTrackPairCut::SetOpeningAngle(const float& lo, const float& hi) 
{ mOpeningAngle[0]=lo; mOpeningAngle[1]=hi; }
inline void gregsTrackPairCut::SetRapidity(const float& lo, const float& hi) 
{ mRapidity[0]=lo; mRapidity[1]=hi; }
inline void gregsTrackPairCut::SetEta(const float& lo, const float& hi) 
{ mEta[0]=lo; mEta[1]=hi; }
inline void gregsTrackPairCut::SetQinv(const float& lo, const float& hi) 
{ mQinv[0]=lo; mQinv[1]=hi; }
inline void gregsTrackPairCut::SetMinv(const float& lo, const float& hi) 
{ mMinv[0]=lo; mMinv[1]=hi; }
inline void gregsTrackPairCut::SetEntranceSeparation(const float& lo, const float& hi) 
{ mEntranceSeparation[0]=lo; mEntranceSeparation[1]=hi; }
inline void gregsTrackPairCut::SetAngleToPrimaryVertex(const float& lo, const float& hi) 
{ mAngleToPrimaryVertex[0]=lo; mAngleToPrimaryVertex[1]=hi; }
inline void gregsTrackPairCut::SetFracOfMergedRow(const float& lo, const float& hi)
{mFracOfMergedRow[0]=lo; mFracOfMergedRow[1]=hi;}
inline void gregsTrackPairCut::SetClosestRowAtDCA(const float& lo, const float& hi)
{mClosestRowAtDCA[0]=lo; mClosestRowAtDCA[1]=hi;}
inline void gregsTrackPairCut::SetWeightedAvSep(const float& lo, const float& hi)
{mWeightedAvSep[0]=lo; mWeightedAvSep[1]=hi;}
inline void gregsTrackPairCut::SetRValue(const float& lo)
{mRValueLo = lo;}
inline gregsTrackPairCut* gregsTrackPairCut::Clone() { gregsTrackPairCut* c = new gregsTrackPairCut(*this); return c;}
inline void gregsTrackPairCut::SetAverageSeparation(const float& lo, const float& hi) {
  mAverageSeparation[0]=lo; mAverageSeparation[1]=hi; }

#endif
