#ifndef __HALIGNMENTMETA_H__
#define __HALIGNMENTMETA_H__
#include "TObject.h"
#include "TMath.h"
#include "hgeomtransform.h"
class TFile;
class TNtuple;
class HAlignmentMeta:public TObject {
private:
struct TrackMdcMeta {
HGeomVector mdcPnt1Sec;
HGeomVector mdcPnt2Sec;
Double_t xMeta;
Double_t yMeta;
Double_t zMeta;
Double_t xMinDistInit;
Double_t yMinDistInit;
Double_t xMinDist;
Double_t yMinDist;
Double_t minDist2;
Double_t sigmaX;
Double_t sigmaY;
Double_t sigmaZ;
Double_t wt;
Int_t startTrInd;
Short_t metaMod;
Short_t binScWt;
Short_t column;
Short_t cell;
Short_t cellInd;
Bool_t useIt;
Bool_t oneLay(TrackMdcMeta &t) const {return TMath::Abs(t.zMeta-zMeta) < 2.; }
Double_t dXNorm(void) const {return xMinDist/sigmaX;}
Double_t dYNorm(void) const {return yMinDist/sigmaY;}
};
TrackMdcMeta tracks[1000000];
Int_t metaDetector;
Double_t yMinMetaLocal;
Double_t yMaxMetaLocal;
Int_t alignSec;
Int_t nTracks;
Double_t trackSelecCutX;
Double_t trackSelecCutY;
Bool_t filterFlag;
HGeomTransform transMetaModLabOld[8];
HGeomTransform transMetaModLabNew[8];
HGeomTransform transMetaModSecOld[8];
HGeomTransform transMetaModSecNew[8];
Int_t nMetaModules;
Bool_t fitTofModYPos;
Double_t tofModYSh[8];
Int_t cellStat[192];
Double_t cellXCorr[192];
Int_t nCells;
Int_t nCellsTot;
Double_t xShitfRpc;
Bool_t calcCellXOffset;
TNtuple *nt;
Float_t sec;
Float_t x1, y1, z1, x2, y2, z2;
Float_t metaModule;
Float_t metaColumn,metaCell;
Float_t xMetaLocal,yMetaLocal,zMetaLocal;
Float_t xRMS,yRMS,zRMS;
Double_t meanX;
Double_t sigmX;
Double_t meanY;
Double_t sigmY;
Double_t meanZ;
Double_t sigmZ;
Bool_t isFirstSIter;
void fillArray(void);
Bool_t selectTracksIter(Double_t nSigmasCut);
void selectTracks(Double_t nSigmasCut);
void calcMinDist(void);
void calcMinDist(Double_t *par);
void calcMinDist(HGeomTransform& trans);
void setWeights(void);
void setNtuple(TNtuple *nt);
void calcXOffset(Double_t nSigmasCut);
Bool_t calcXOffset(Double_t nSigmasCut,Short_t cellInd);
public:
HAlignmentMeta();
virtual ~HAlignmentMeta();
void doFiltering(Bool_t st) {filterFlag = st;}
void alignMeta(Int_t sec,TNtuple *nt);
void checkAlignment(void);
Int_t getAlignSec() {return alignSec;}
void setCuts(Double_t cutX,Double_t cutY);
Double_t getMinFunction(Double_t *par);
static void fcnMeta(Int_t &npar, Double_t *gin, Double_t &fn, Double_t *par, Int_t iflag);
HGeomTransform* getArrTansOld(void) {return transMetaModLabOld;}
HGeomTransform* getArrTansNew(void) {return transMetaModLabNew;}
void setNMetaModules(Int_t nm) {nMetaModules = nm;}
void setRpcDetector(Double_t cutX=2.4,Double_t cutY=2.2);
void setShowerDetector(Double_t cutX=2.0,Double_t cutY=2.0);
void setTofDetector(Double_t cutX=3.6,Double_t cutY=2.6);
void fitTofModYPositions(Bool_t fl) {fitTofModYPos = fl;}
Double_t getRpcXCorr(Int_t co,Int_t ce) {return cellXCorr[co*nCells+ce];}
Double_t getTofXCorr(Int_t mo,Int_t ce) {return cellXCorr[mo*nCells+ce];}
void calcRpcCellXOffset(void) {calcCellXOffset = kTRUE;}
ClassDef(HAlignmentMeta,0)
};
#endif /* !__HALIGNMENTMETA_H__ */