#ifndef ZFLUKWEIGHT_H
#define ZFLUKWEIGHT_H

#include "SkzpWeight.h"
#include "MCReweight/Zfluk.h"
class FitData;

class ZflukWeight : virtual public SkzpWeight {

public:
      
  ZflukWeight();
  ~ZflukWeight();

  virtual double GetWeight(FitData& data);

  inline virtual double GetPT() const;

  virtual bool SetProperty(const std::string);

  inline virtual void AddParameter(double *val) {
    fPars.push_back(val);
  }

  virtual void GetParameters(std::vector<FitPar> &par) {
    std::copy(fParameters.begin(),fParameters.end(),
	      std::back_inserter(par));
  }

  inline virtual int GetNParameters() {return fParameters.size();}

  virtual void SetParameters(const std::vector<double> &par) {
    fZfluk->SetParameters(par);
  }

  inline virtual const std::string& GetName() const {return fName;}

  inline virtual void SetName(std::string name) {fName=name;}

  virtual bool Init();
  
  virtual void Write();

private:
  
  Zfluk *fZfluk;
  std::string fName;
  std::string fDataFile;
  std::string fConfig;
  std::vector<FitPar> fParameters;
  std::vector<double*> fPars;


  bool fUseNa49;
  std::string fNa49DataFile;
  vector<double> fNa49PiRatio;
  vector<double> fNa49Pz;

  // penalty terms for shift in mean pt
  double fPiPlusPtPenalty;
  double fKPlusPtPenalty;

  // penalty term info
  int            fXfSlices;
  double         fPiBinWidth;
  double         fKBinWidth;
  vector<double> fPtSlices;
  double         fFlukaError;
  double         fNa49Error;

};

#endif // ZFLUKWEIGHT_H
