#ifndef HPARTICLEVERTEXFIND_H
#define HPARTICLEVERTEXFIND_H
#include "hreconstructor.h"
#include "hgeomvector.h"
#include "hgeomvertexfit.h"
#include "hspecgeompar.h"
#include "TIterator.h"
#include "TNtuple.h"
#include "TFile.h"
#include "TClonesArray.h"
#include <vector>
using namespace std;
class HCategory;
class HMdcGeomPar;
class HIterator;
class HParticleCand;
class HParticleVertexFind : public HReconstructor {
public:
HParticleVertexFind(const Text_t name[] = "",const Text_t title[] = "",Bool_t tukey = kTRUE);
virtual ~HParticleVertexFind(void);
Bool_t init(void);
Bool_t finalize(void);
Int_t execute(void);
void setCut(Double_t minz=-100,Double_t maxz=50,Double_t maxr=50) { fminZ = minz; fmaxZ = maxz; fmaxR = maxr;}
void useTukeyWeights (Bool_t flag) { fUsingTukey = flag; }
void setTukeyConstant (Double_t d) { fTukeyConst = d; }
void setMaxIterations (Int_t max) { fMaxIterations = max; }
void setEpsilon (Double_t ep) { fEpsilon = ep; }
void setMomChi2Cut(Float_t cut) { fmomChi2Cut = cut; }
void setSeg0Chi2Cut(Float_t cut) { fseg0Chi2Cut = cut;}
void setMinReqTracks(Int_t min) { fminReqTrack = min;}
void setMinWindow(Double_t wind) { fminWindow = wind;}
void setProgessiveTukey(Bool_t prog){ fProgressiveTukey = prog;}
void setCallExecuteManual (Bool_t call) { fcallExecuteManual = call;}
Double_t getTukeyConstant (void) { return fTukeyConst; }
Int_t getMaxIterations (void) { return fMaxIterations; }
Double_t getEpsilon (void) { return fEpsilon; }
Float_t getMomChi2Cut() { return fmomChi2Cut; }
Float_t getSeg0Chi2Cut() { return fseg0Chi2Cut;}
Int_t getMinReqTracks() { return fminReqTrack;}
Double_t getMinWindow() { return fminWindow;}
Bool_t getProgessiveTukey(void) { return fProgressiveTukey;}
Int_t doFit();
static void setSkipFakes(Bool_t skip) { doSkipFakes = skip;}
protected:
void initVars(void);
Bool_t pointsToTarget(const HGeomVector &r,HGeomVector &alpha,Int_t sector,Int_t module,Double_t zmin,Double_t zmax);
Bool_t readInput (HGeomVector &estimate);
void transform (HParticleCand *data, HGeomVector &r, HGeomVector &alpha);
Bool_t hasConverged (HGeomVector &v,HGeomVector &oldV);
HGeomVertexFit fFitter;
TClonesArray fPos;
TClonesArray fAlpha;
vector<HParticleCand*> fCands;
vector<Double_t> fweights;
HCategory *fInput;
HMdcGeomPar *fGeometry;
HSpecGeomPar *fSpecGeometry;
Double_t fTukeyConst;
Int_t fMaxIterations;
Bool_t fUsingTukey;
Double_t fEpsilon;
Double_t fminZ;
Double_t fmaxZ;
Double_t fmaxR;
Float_t fmomChi2Cut;
Float_t fseg0Chi2Cut;
Int_t fminReqTrack;
Double_t fminWindow;
Bool_t fProgressiveTukey;
Bool_t fcallExecuteManual;
static Bool_t doSkipFakes;
public:
ClassDef(HParticleVertexFind,1)
};
#endif