#ifndef HPARTICLET0RECO_H
#define HPARTICLET0RECO_H
#include "hreconstructor.h"
#include "hparticlepathlengthcorr.h"
#include "henergylosscorrpar.h"
#include "heventheader.h"
#include "TH1D.h"
#include "TF1.h"
#include "TString.h"
#include <vector>
#include <map>
#include <list>
using namespace std;
class HParticleCand;
class HCategory;
#define STMOD 2
#define STSTRIP 16
#define STBIN 500
class HParticleT0Reco : public HReconstructor {
typedef struct {
Int_t id;
Bool_t is;
Float_t deltaTime;
Float_t sigmaTime;
Float_t normTime;
Float_t deltadEdx;
Float_t sigmadEdx;
Float_t normdEdx;
Float_t norm;
void clear()
{
is = kFALSE;
deltaTime = 999.;
sigmaTime = 0.1;
normTime = 9999.;
deltadEdx = 999.;
sigmadEdx = 0.1;
normdEdx = 9999.;
norm = 9999.;
}
} pidvalues;
typedef struct {
Float_t meanq ;
Float_t meanqall;
Float_t scor;
TH1D* h ;
TH1D* he;
} startvalues;
typedef struct {
HParticleCand* c;
Int_t index;
Float_t times;
Float_t error;
} tofvalues;
typedef struct {
list <Float_t> t0 [2];
list <Float_t> t0err[2];
vector <vector < list<Float_t> > > t0forrpcstrip;
vector <vector < list<Float_t> > > t0forrpcstriperr;
vector <vector < list<Float_t> > > meanqstrip;
} buffers;
class momCut {
public:
Float_t min;
Float_t max;
Int_t id;
momCut(Int_t Id=2, Float_t Min=0,Float_t Max=3000){
id=Id;
min=Min;
max=Max;
}
Bool_t eval(Float_t mom){
return (mom>min && mom<max) ? kTRUE: kFALSE;
}
};
private:
HCategory* candCat;
HCategory* catStart;
HCategory* catStartcal;
HEventHeader* fEvHeader;
vector<tofvalues>* eventMETA[2];
vector<tofvalues> eventTOF;
vector<tofvalues> eventRPC;
startvalues start[STMOD][STSTRIP];
buffers buff;
vector <Int_t> vparticle;
map<Int_t,Int_t> mIdToIndex;
map<Int_t,momCut> mMomCut1Sys[2];
map<Int_t,momCut> mMomCut2Sys[2];
Float_t t0rpc;
Float_t t0tof;
Float_t t0startcont;
Float_t t0startconterr;
Double_t c;
TString run;
Bool_t fUseFlagged;
Bool_t fisSimulation;
Bool_t fisEmbedding;
HEnergyLossCorrPar* eLoss;
void initWalkHists();
Bool_t isEmbedded(HParticleCand* pCand);
void fill();
void fillMETA(Float_t t0, Float_t err,Int_t sys);
Float_t getT0 (Int_t sys);
Float_t getT0Err(Int_t sys);
Float_t getBeta(HParticleCand* pCand);
void fillBuffer();
void fillCorrections();
void correctBeta();
Float_t getOnlineStripCorrection(Int_t mod, Int_t strip);
Float_t getOnlineMeanQ (Int_t mod, Int_t strip);
void calculateStartT0Cont();
void setPIDs();
public:
HParticleT0Reco(const Text_t* name="ParticleT0Reco",const Text_t* title="ParticleT0Reco", const Text_t* beamtime="apr12");
~HParticleT0Reco();
Int_t execute(void);
Bool_t init(void);
Bool_t finalize(){ return kTRUE;}
void setUseFlaggedCandidates(Bool_t use=kTRUE) { fUseFlagged = use;}
ClassDef(HParticleT0Reco,0)
};
#endif