/***************************************************************************
 *
 * $Id: StHbtCorrFctn.hh,v 1.11 2013/01/18 16:13:04 yyang Exp $
 *
 * Author: Mike Lisa, Ohio State, lisa@mps.ohio-state.edu
 ***************************************************************************
 *
 * Description: part of STAR HBT Framework: StHbtMaker package
 *    base class for a STAR correlation function.  Users should inherit 
 *    from this and must implement constructor, destructor, Report(),
 *    AddMixedPair(), AddRealPair(), Finish()
 *
 ***************************************************************************
 *
 * $Log: StHbtCorrFctn.hh,v $
 * Revision 1.11  2013/01/18 16:13:04  yyang
 * Add PairCut for CFs that share same cuts, but pair cuts
 *
 * Revision 1.10  2001/06/21 19:06:48  laue
 * Some minor structural changes (forward declarations, etc)
 *
 * Revision 1.9  2000/06/29 23:01:10  finch
 * added an extra base class for Parity Computations
 *
 * Revision 1.8  2000/06/15 18:51:32  willson
 * Cuts and Correlation function information moved from StBaseAnalysis
 * to the derived analysis classes.  Global functions installed in
 * Cut and CorrFctn base classes to access analysis pointer.
 *
 * Revision 1.7  2000/05/11 21:16:40  willson
 * myAnalysis pointer changed to type StHbtBaseAnalysis - moved
 * some methods into StHbtBaseAnalysis class
 *
 * Revision 1.6  2000/03/23 22:43:27  laue
 * Clone() function implemented in cuts.
 *
 * Revision 1.5  2000/03/16 01:54:36  laue
 * Copy constructor added to all the cut base classes and to the
 * corrfctn base class
 *
 * Revision 1.4  2000/02/13 17:13:09  laue
 * EventBegin() and EventEnd() functions implemented
 *
 * Revision 1.3  1999/12/03 22:24:33  lisa
 * (1) make Cuts and CorrFctns point back to parent Analysis (as well as other way). (2) Accommodate new PidTraits mechanism
 *
 * Revision 1.2  1999/07/06 22:33:18  lisa
 * Adjusted all to work in pro and new - dev itself is broken
 *
 * Revision 1.1.1.1  1999/06/29 16:02:56  lisa
 * Installation of StHbtMaker
 *
 **************************************************************************/

#ifndef StHbtCorrFctn_hh
#define StHbtCorrFctn_hh

#include "StHbtMaker/Base/StHbtBaseAnalysis.h"
#include "StHbtMaker/Base/StHbtPairCut.h"
#include "StHbtMaker/Infrastructure/StParityTypes.hh"  // can not forward declare typedefs
#include "StHbtMaker/Infrastructure/StHbtEvent.hh"
#include "StHbtMaker/Infrastructure/StHbtPair.hh"
#include "StHbtMaker/Infrastructure/StHbtTriplet.hh"
#include "StHbtMaker/Infrastructure/StHbtHisto.hh"

class StHbtCorrFctn{

public:
  StHbtCorrFctn() { mPairCut = 0; mPairCutFlag = false; }
  StHbtCorrFctn(const StHbtCorrFctn& );
  virtual ~StHbtCorrFctn(){/* no-op */}

  virtual StHbtString Report() = 0;

  virtual void ParityCompute(ParityBuff*, ParityBuff*, int);

  virtual void AddRealPair(const StHbtPair*);
  virtual void AddMixedPair(const StHbtPair*);

  virtual void AddRealTriplet(const StHbtTriplet*);
  virtual void AddMixedTriplet(const StHbtTriplet*);

  virtual void EventBegin(const StHbtEvent*) { /* no-op */ }
  virtual void EventEnd(const StHbtEvent*) { /* no-op */ }
  virtual void Finish() = 0;

  virtual StHbtCorrFctn* Clone() { return 0;}

  virtual StHbtPairCut* GetPairCut() { return mPairCut; }

  // the following allows "back-pointing" from the CorrFctn to the "parent" Analysis
  friend class StHbtBaseAnalysis;
  StHbtBaseAnalysis* HbtAnalysis(){return myAnalysis;};
  void SetAnalysis(StHbtBaseAnalysis*);
  bool GetPairCutFlag();

protected:
  StHbtBaseAnalysis* myAnalysis;
  StHbtPairCut* mPairCut;
  bool mPairCutFlag; // Characteristics of the CF itself. So we have
                     //   only Get methods in the base class
                     // By default this flag equals false.
                     // This flag indicates that CF tests pair cuts by self.

private:

};

inline void StHbtCorrFctn::ParityCompute(ParityBuff*, ParityBuff*, int) { cout << "Not implemented" << endl; }
inline void StHbtCorrFctn::AddRealPair(const StHbtPair*) { cout << "Not implemented" << endl; }
inline void StHbtCorrFctn::AddMixedPair(const StHbtPair*) { cout << "Not implemented" << endl; }
inline void StHbtCorrFctn::AddRealTriplet(const StHbtTriplet*) { cout << "Not implemented" << endl; }
inline void StHbtCorrFctn::AddMixedTriplet(const StHbtTriplet*) { cout << "Not implemented" << endl; }

inline StHbtCorrFctn::StHbtCorrFctn(const StHbtCorrFctn& c) { myAnalysis =0; mPairCut = c.mPairCut; }
inline void StHbtCorrFctn::SetAnalysis(StHbtBaseAnalysis* analysis) { myAnalysis = analysis; }

inline bool StHbtCorrFctn::GetPairCutFlag() { return mPairCutFlag; }

#endif
