///////////////////////////////////////////////////////////////////////
//
// Author: name Arnd Soerensen <arnd.soerensen@tu-dresden.de> --contact person
//
// REVISION HISTORY:
//     24/10/2013 : A Soerensen - New file
//     11 Nov 2014 : Matthew Strait - Removed unused variables.
//
///////////////////////////////////////////////////////////////////////

#ifndef __RAT_Method_MuonWater_
#define __RAT_Method_MuonWater_

#include <string>

#include <RAT/DS/FitResult.hh>
#include <RAT/Method.hh>
#include <TRotation.h>
#include <vector>

namespace RAT
{

namespace Methods
{

class MuonWater : public Method
{
public:
  virtual std::string GetName() const { return MuonWater::Name(); }

  static std::string Name() { return std::string( "MuonWater" ); }

  void Initialise (const std::string& ) { }

  void BeginOfRun( DS::Run& );
  void EndOfRun( DS::Run& );
  TRotation GetRotationToSpecialFrame(const TVector3 tVec_, const TVector3 qVec_ );

  double GetCosThetaEstimate(const double cosAlpha, bool& trustResult);
  double GetZEstimate(const double cosAlpha, bool& trustResult);
  virtual DS::FitResult GetBestFit();

private:

  // Simple Center of Mass function
  //
  // Simple function to calculate the geometrical center of mass of a given list of vectors
  //
  // list holds the objects for which the CoM should be calculated
  //
  // Returns a TVector3 which points to the center of mass of input vector list
  TVector3 CenterOfMass_MuonWater(const std::vector<TVector3>& list);
  std::vector<double> fCosThetaConstants;
  std::vector<double> fZConstants;
  double fPathLengthCut;
  double fPSUPRadius;

};

} //::Method

} //::RAT

#endif