#ifndef HRPCDIGITIZER_H
#define HRPCDIGITIZER_H
#include "hreconstructor.h"
#include "hlocation.h"
#include <vector>
#include <algorithm>
#include "hgeantrpc.h"
using namespace std;
class HIterator;
class HCategory;
class HRpcGeomCellPar;
class HRpcDigiPar;
class HRpcDigitizer : public HReconstructor {
private:
typedef struct gaptrack {
Float_t gtime;
Float_t time ;
Float_t charge;
Int_t track;
Int_t trackDgtr;
Int_t ref;
Int_t refDgtr;
Bool_t isAtBox;
void reset(){
charge = 0.;
gtime = 10000.;
time = 10000.;
track = -1;
trackDgtr = -1;
ref = -1;
refDgtr = -1;
isAtBox = kFALSE;
}
Bool_t static cmpTime(gaptrack* a, gaptrack* b) {
return a->gtime < b->gtime;
}
} gaptrack;
typedef struct {
Short_t sec;
Short_t col;
Short_t cell;
vector<gaptrack*> right;
vector<gaptrack*> left;
void reset(){
sec = -1;
col = -1;
cell = -1;
for(UInt_t i=0;i<right.size();i++){ delete right[i]; }
for(UInt_t i=0;i<left .size();i++){ delete left [i]; }
right.clear();
left .clear();
}
void sortTime(Bool_t isRight) {
if(isRight) std::sort(right.begin(),right.end(),gaptrack::cmpTime);
else std::sort(left .begin(),left .end(),gaptrack::cmpTime);
}
Float_t getSumCharge(Bool_t isRight){
Float_t chrg = 0.;
if(isRight) {for(UInt_t i=0;i<right.size();i++){ chrg += right[i]->charge; } return chrg;}
else {for(UInt_t i=0;i<left .size();i++){ chrg += left [i]->charge; } return chrg;}
}
Float_t getMeanTof(Bool_t isRight){
Float_t time = 0.;
if(isRight) {
for(UInt_t i=0;i<right.size();i++){ time += right[i]->time; }
return time/((Float_t)right.size());
} else {
for(UInt_t i=0;i<left .size();i++){ time += left [i]->time; }
return time/((Float_t)left .size());
}
}
Float_t getSmallestTof(Bool_t isRight){
Float_t time = 10000.;
if(isRight) {
for(UInt_t i=0;i<right.size();i++){ if(right[i]->time < time) time = right[i]->time; } return time;
} else {
for(UInt_t i=0;i<left .size();i++){ if(left [i]->time < time) time = left [i]->time; } return time;
}
}
} rpcdat;
typedef struct celltrack {
Float_t gaptime[4];
Float_t gappos[4];
Float_t gapltln[4];
Float_t gapbeta[4];
Float_t time;
Float_t pos;
Float_t beta;
Float_t ltln;
Int_t geantrpcIndex;
Int_t track;
void reset(){
for(UInt_t i=0;i<4;i++){
gaptime[i] = 0.;
gappos[i] = 0.;
gapltln[i] = 0.;
gapbeta[i] = 0.;
}
track = -1;
time = 0.;
pos = 0.;
ltln = 0.;
beta = 0.;
geantrpcIndex = -1;
}
void calcMeans(){
UInt_t ii=0;
for(UInt_t i=0;i<4;i++){
if(gaptime[i]>0.) {
time += gaptime[i];
pos += gappos[i];
ltln += gapltln[i];
beta += gapbeta[i];
ii++;
}
}
if(ii>0) {
Float_t aii=(Float_t)ii;
time /= aii;
pos /= aii;
ltln /= aii;
beta /= aii;
}
}
Float_t getFirstGapBeta(){
UInt_t i;
for(i=0;i<4;i++){ if(gapbeta[i]>0.) break; }
return gapbeta[i];
}
} celltrack;
typedef struct {
Short_t sec;
Short_t col;
Short_t cell;
vector<celltrack*> celltr;
void reset(){
sec = -1;
col = -1;
cell = -1;
for(UInt_t i=0;i<celltr.size();i++){ delete celltr[i]; }
celltr.clear();
}
} celldat;
typedef struct {
Float_t x;
Float_t y;
Float_t time;
Int_t sector;
Int_t module;
Int_t cell;
Bool_t effi;
void reset( ){
x = -999;
y = -999;
time = -999;
sector = -1;
module = -1;
cell = -1;
effi = kFALSE;
}
void set(Int_t se,Int_t co,Int_t ce,Float_t ax, Float_t ay, Float_t at, Bool_t eff){
sector = se;
module = co;
cell = ce;
x = ax;
y = ay;
time = at;
effi = eff;
}
} efhits;
HLocation fLoc;
HCategory* fGeantRpcCat;
HCategory* fCalCat;
HCategory* fKineCat;
HRpcGeomCellPar* fGeomCellPar;
HRpcDigiPar* fDigiPar;
HIterator* iterGeantRpc;
HIterator* iterRpcCal;
Int_t maxCol ;
Int_t maxCell ;
vector <celldat* > cellobjects;
vector <rpcdat* > rpcobjects;
vector <efhits> effi_vec;
void initVars();
Bool_t initParContainer();
void clearObjects();
Int_t findMother(Int_t Ref_initial);
void calc_eff_hit(Int_t mode);
void digitize_one_hit(gaptrack* left, gaptrack* right, Int_t mode);
Float_t Eff0,Eff1,Eff2,Eff3,Eff4,Eff5,ineff_hit_n,ineff_hit;
Float_t sigma0_T,sigma1_T,sigma2_T,sigma3_T,sigma_el,vprop,t_offset;
Float_t Qmean0,Qmean1,Qmean2,Qwid0,Qwid1,Qwid2;
Float_t geaX,geaTof,geaMom,geaLocLen,geaLocLenNorm;
Float_t D, gap,beta,eff_hit;
static Float_t fCropDistance;
public:
HRpcDigitizer(void);
HRpcDigitizer(const Text_t* name,const Text_t* title);
~HRpcDigitizer(void);
Bool_t init (void);
Bool_t finalize(void) {return kTRUE;}
Int_t execute (void);
Float_t getDistanceToXedge(HGeantRpc * gea);
static void setCropDistance(Float_t val) {fCropDistance = val;}
ClassDef(HRpcDigitizer,0)
};
#endif