#ifndef _OmegaPiEventList_H
#define _OmegaPiEventList_H

#include <iostream>
#include <vector>

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 

#include <cassert>
// #include <TSystem.h>
#include "qft++/topincludes/relativistic-quantum-mechanics.hh"
#include "Examples/MATpbarpToOmegaPi/OmegaPiData.hh"

using OmegaPiData::OmPiEvtData;

class EventList;

class OmegaPiEventList {

  friend class boost::serialization::access; 

  template <typename Archive> 
  void serialize(Archive & ar, const unsigned int) {
    using boost::serialization::make_nvp;

   // unsigned _jmax;
   // unsigned _pbarmom;
   // std::vector<OmPiEvtData> _dataList;
   // std::vector<OmPiEvtData> _mcList;

    ar & BOOST_SERIALIZATION_NVP(_jmax);
    ar & BOOST_SERIALIZATION_NVP(_pbarmom);
    ar & make_nvp("dataList",_dataList);
    ar & make_nvp("mcList",_mcList);

    /* Add your own class-variables here in the following way:
      ar & BOOST_SERIALIZATION_NVP(myVar);
      or
      ar & make_nvp("myVar", myVar); // The latter form can be necessary when dealing with templates
    */
  }

public:

  // create/copy/destroy:

  ///Constructor 
  OmegaPiEventList(EventList& evtListData, EventList& evtListMc, unsigned jmax, unsigned pbarmom);



  /** Destructor */
  virtual ~OmegaPiEventList();

  // Getters:
  const std::vector<OmPiEvtData*>& getDataVecs() const {return _dataList;}
  const std::vector<OmPiEvtData*>& getMcVecs() const {return _mcList;}
  const unsigned jMax() const {return _jmax;}
  const unsigned pbarMom() const {return _pbarmom;}

//   int kindOfData() const {return _kindOfData;}

protected:


private:

  OmegaPiEventList();

  unsigned _jmax;
  unsigned _pbarmom;
  std::vector<OmPiEvtData*> _dataList;
  std::vector<OmPiEvtData*> _mcList;

  void read4Vecs(EventList& evtList, std::vector<OmPiEvtData*>& omPiEvtList);
  void myWigner_D(const Spin &__jmax,double __alpha,double __beta,double __gamma,
	      map<serSpin,map<serSpin,map<serSpin,complex<double> > > > &__D);
  
//   void get4Vecs (std::ifstream& inStream, Vector4<double>& the4Vec);

//   Tensor<complex<double> > calcSpin2Amp(Vector4<double>& pi_cm, Vector4<double>& eta_cm, Vector4<double>& pi_recoil_cm);
//   Tensor<complex<double> > calcSpin1Amp(Vector4<double>& pi_cm, Vector4<double>& eta_cm, Vector4<double>& pi_recoil_cm);

};

#endif /* _EtacToapi0EventList_H */