#ifndef __JRECONSTRUCTION__JMUONPARAMETERS__
#define __JRECONSTRUCTION__JMUONPARAMETERS__

#include <istream>
#include <ostream>

#include "JReconstruction/JMuonPrefitParameters_t.hh"
#include "JReconstruction/JMuonSimplexParameters_t.hh"
#include "JReconstruction/JMuonGandalfParameters_t.hh"
#include "JReconstruction/JMuonEnergyParameters_t.hh"
#include "JReconstruction/JMuonStartParameters_t.hh"

#include <TROOT.h>
#include <TObject.h>

/**
 * \author gmaggi
 */
namespace JRECONSTRUCTION {

  /**
   * Muon reconstruction parameters.
   */
  struct JMuonParameters :
    public TObject
  {
    /**
     * Default constructor.
     */
    JMuonParameters()
    {
      this->reset();
    }
    
    /**
     * Virtual destructor.
     */
    virtual ~JMuonParameters(){}
  
    /**
     * Reset fit parameters.
     */
    void reset()
    {
      prefit .reset();
      simplex.reset();
      gandalf.reset();
    }

    inline operator JMuonPrefitParameters_t()  const  { return prefit; }  //!< muon prefit  parameters
    inline operator JMuonSimplexParameters_t() const  { return simplex; } //!< muon simplex parameters
    inline operator JMuonGandalfParameters_t() const  { return gandalf; } //!< muon gandalf parameters
    inline operator JMuonEnergyParameters_t()  const  { return energy; }  //!< muon energy  parameters
    inline operator JMuonStartParameters_t()   const  { return start; }   //!< muon start   parameters

    /**
     * Equality
     *
     * \param  parameters       fit parameters
     * \return                  true if equals; else false
     */
    bool equals(const JMuonParameters& parameters) const
    {
      return (prefit .equals(parameters)  &&
              simplex.equals(parameters)  &&
	      gandalf.equals(parameters)  &&
	      energy .equals(parameters)  &&
	      start  .equals(parameters));
    }

    ClassDef(JMuonParameters,2);

    JMuonPrefitParameters_t  prefit;
    JMuonSimplexParameters_t simplex;
    JMuonGandalfParameters_t gandalf;    
    JMuonEnergyParameters_t  energy;    
    JMuonStartParameters_t   start;    
  };
}

/**
 * Read fit parameters from input.
 *
 * \param  in           input stream
 * \param  parameters   fit parameters
 * \return              input stream
 */
std::istream& operator>>(std::istream& in, JRECONSTRUCTION::JMuonParameters& parameters);

/**
 * Write fit parameters to output.
 *
 * \param  out          output stream
 * \param  parameters   fit parameters
 * \return              output stream
 */
std::ostream& operator<<(std::ostream& out,  const JRECONSTRUCTION::JMuonParameters& parameters);

#endif