#ifndef __HPARTICLETREE_H__
#define __HPARTICLETREE_H__
#include "TObject.h"
#include "TObjArray.h"
#include "hreconstructor.h"
#include "htree.h"
#include "hrecevent.h"
#include "hparticletracksorter.h"
#include "hparticledef.h"
#include <TFile.h>
#include <map>
#include <vector>
using namespace std;
class HParticleCand;
class HSrcKeeper;
class HGeantMedia;
class HMdcLayer;
class HParticleTree : public HReconstructor
{
private:
HRecEvent* fCurrentEvent;
TFile* fOutputFile;
HTree* fTree;
Int_t fCycleNumber;
TString fOutputFileName;
TString fOutputTitle;
TString fOutputOption;
Int_t fOutputCompression;
TString fOutputFileSuffix;
TString fOutputDir;
Bool_t fOutFound;
Bool_t kSkipEmptyEvents;
Bool_t kSkipTracks;
Bool_t kDoSorter;
Particle::ESwitch sortType;
HParticleTrackSorter sorter;
HSrcKeeper* keeper;
HGeantMedia* media;
HMdcLayer* mdclayer;
vector <Int_t> fCatNums;
map <TString,Int_t> fmCatNameToNum;
map <Int_t,TString> fmCatNumToName;
map <Int_t,HCategory*> fmCatNumToPointer;
map <TString,HCategory*> fmCatNameToPointer;
map <Int_t,Int_t> fmCatNumToFullCopy;
vector <Int_t> fmCatNumSupport;
vector <Int_t> fmCatNumFullCopySupport;
Bool_t (*pUserSelectEvent) (TObjArray* );
Bool_t (*pUserSelectLeptons)(HParticleCand* );
Bool_t (*pUserSelectHadrons)(HParticleCand* );
Bool_t (*pUserKeepTrack) (HParticleCand* );
TObjArray* fParamSelectEvent;
Bool_t makeTree (void);
void recreateOutput (void);
void closeOutput (void);
void setEvent (void);
void extractMdcSeg(HParticleCand* cand, Bool_t isSim,Int_t segInd1,Int_t&segInd2);
void extractMdcCal1(Bool_t isSim,Int_t segInd);
void extractMdcCal1FromClus(Bool_t isSim,Int_t segInd);
Int_t ctMdcSeg [6][2];
Int_t ctMdcClus[6][2];
Int_t ctMdcHit [6][4];
Int_t ctRpcClus[6] ;
Bool_t doFullCopy(Cat_t cat);
public:
HParticleTree(const Text_t *name = "",const Text_t *title ="");
virtual ~HParticleTree();
Bool_t init();
Int_t execute();
Bool_t finalize();
void setSkipEmptyEvents (Bool_t skip) { kSkipEmptyEvents = skip; }
void setSkipTracks (Bool_t skip) { kSkipTracks = skip; }
void setOutputFile (TString fname = "filter_tree.root",
TString ftitle = "Filter",
TString fopt = "RECREATE",
Int_t fcomp = 2
);
void setOutputFileSuffix(TString suff = "filter_tree") { fOutputFileSuffix = suff;}
void setOutputDir (TString dir = "") { fOutputDir = dir ;}
void setEventStructure (Int_t n,Cat_t PersistentCat[],Bool_t fullCopy=kFALSE);
void setSortType(Particle::ESwitch type) { sortType = type; }
void setDoSorter (Bool_t sort) { kDoSorter=sort;}
sorter_setup& getSorterSetup() {return sorter.getSetup();}
void setIgnoreRICH (Bool_t ignore = kTRUE) { sorter.getSetup().kIgnoreRICH = ignore;}
void setIgnoreInnerMDC (Bool_t ignore = kTRUE) { sorter.getSetup().kIgnoreInnerMDC = ignore;}
void setIgnoreOuterMDC (Bool_t ignore = kTRUE) { sorter.getSetup().kIgnoreOuterMDC = ignore;}
void setIgnoreMETA (Bool_t ignore = kTRUE) { sorter.getSetup().kIgnoreMETA = ignore;}
void setIgnorePreviousIndex(Bool_t ignore = kTRUE) { sorter.getSetup().kIgnorePreviousIndex = ignore;}
void setRICHMatching(Particle::ERichMatch match, Float_t window = 4.) {
sorter.getSetup().kSwitchRICHMatching = match;
sorter.getSetup().fRICHMDCWindow = window;
}
void setUserSelectionEvent (Bool_t (*function)(TObjArray*),TObjArray* ar) { pUserSelectEvent = function; fParamSelectEvent = ar;}
void setUserSelectionLeptons(Bool_t (*function)(HParticleCand* )){ pUserSelectLeptons = function;}
void setUserSelectionHadrons(Bool_t (*function)(HParticleCand* )){ pUserSelectHadrons = function;}
void setUserkeepTrack(Bool_t (*function)(HParticleCand* )){ pUserKeepTrack = function;}
ClassDef(HParticleTree,0)
};
#endif // __HPARTICLETREE_H__