#ifndef HMDCCLUSFITSIM_H
#define HMDCCLUSFITSIM_H
#include "hmdcclusfit.h"
#include <math.h>
class HMdcClusFitSim : public HMdcClusFit {
protected:
  Short_t nTracks;      
  Short_t nTracksClus;  
  Int_t   geantTrack;   
  Short_t nTrWires;     
  Short_t nTrWiresClus; 
  Bool_t  primary;      
  Float_t x1geant;      
  Float_t y1geant;      
  Float_t z1geant;      
  Float_t x2geant;      
  Float_t y2geant;      
  Float_t z2geant;      
  Bool_t  direction;    
                        
  Int_t   particleID;   
  Float_t momentum;     
public:
  HMdcClusFitSim();
  ~HMdcClusFitSim(){}
  void    setNumTracks(Short_t n)       {nTracks      = n;}
  void    setNumTracksClus(Short_t n)   {nTracksClus  = n;}
  void    setGeantTrackNum(Int_t i)     {geantTrack   = i;}
  void    setNumWiresTrack(Short_t n)   {nTrWires     = n;}
  void    setNumWiresTrClus(Short_t n)  {nTrWiresClus = n;}
  void    setX1Geant(Float_t v)         {x1geant      = v;}
  void    setY1Geant(Float_t v)         {y1geant      = v;}
  void    setZ1Geant(Float_t v)         {z1geant      = v;}
  void    setX2Geant(Float_t v)         {x2geant      = v;}
  void    setY2Geant(Float_t v)         {y2geant      = v;}
  void    setZ2Geant(Float_t v)         {z2geant      = v;}
  void    setPrimaryFlag(Bool_t fl)     {primary      = fl;}
  void    setFakeTrack(Bool_t dir=kTRUE);
  void    setXYZ1Geant(Float_t x,Float_t y,Float_t z) {x1geant=x; y1geant=y; z1geant=z;}
  void    setXYZ2Geant(Float_t x,Float_t y,Float_t z) {x2geant=x; y2geant=y; z2geant=z;}
  void    setParticleID(Int_t id)       {particleID   = id;}
  void    setMomentum(Float_t mom)      {momentum     = mom;}
  void    setFakeFlag(void)             {if(nTrWiresClus > 0) nTrWiresClus = -nTrWiresClus;}
  Short_t getNumTracks(void) const      {return nTracks;}
  Short_t getNumTracksClus(void) const  {return nTracksClus;}
  Int_t   getGeantTrackNum(void) const  {return geantTrack;}
  Short_t getNumWiresTrack(void) const  {return nTrWires;}
  Short_t getNumWiresTrClus(void) const {return nTrWiresClus >= 0 ? nTrWiresClus : -nTrWiresClus;}
  Float_t getX1Geant(void) const        {return x1geant;}
  Float_t getY1Geant(void) const        {return y1geant;}
  Float_t getZ1Geant(void) const        {return z1geant;}
  Float_t getX2Geant(void) const        {return x2geant;}
  Float_t getY2Geant(void) const        {return y2geant;}
  Float_t getZ2Geant(void) const        {return z2geant;}
  Bool_t  isPrimary(void) const         {return primary;}
  Bool_t  isTrackDirGood(void) const    {return direction;}
  Float_t getGeantPhi(void) const       {return atan2(y2geant-y1geant,x2geant-x1geant);}
  Float_t getGeantTheta(void) const     {return atan2(sqrt((x2geant-x1geant)*(x2geant-x1geant) +
                                         (y2geant-y1geant)*(y2geant-y1geant)),z2geant-z1geant);}
  void    getGeantRZmin(Float_t &zm, Float_t &r0, Float_t xBm=0., Float_t yBm=0.) 
      const {calcRZtoLineXY(zm,r0,x1geant,y1geant,z1geant, x2geant,y2geant,z2geant,xBm,yBm);}
  Int_t   getParticleID(void) const     {return particleID;}
  Float_t getMomentum(void) const       {return momentum;}
  
  Float_t dX1(void) const               {return x1-x1geant;}
  Float_t dY1(void) const               {return y1-y1geant;}
  Float_t dZ1(void) const               {return z1-z1geant;}
  Float_t dX2(void) const               {return x2-x2geant;}
  Float_t dY2(void) const               {return y2-y2geant;}
  Float_t dZ2(void) const               {return z2-z2geant;}
  Bool_t  isFakeGeant(void) const       {return nTrWiresClus < 4;}
  Float_t getPurity(void) const         {return numOfWires ? 
                                         Float_t(nTrWires)/Float_t(numOfWires) : 0.;}
  Float_t getEfficiency(void) const     {return nTrWiresClus ? 
                                         Float_t(nTrWires)/getNumWiresTrClus() : 0.;}
  void    printSimVsRec(void) const;
  
  virtual void print(void) const;
  virtual Bool_t isGeant() const        {return kTRUE;}
  ClassDef(HMdcClusFitSim,1) 
};
#endif