ROOT logo
//*-- Author : Vladimir Pechenov 24.11.2011

#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;        // In the coor.sys. of meta-module
      Double_t    yMeta;        // In the coor.sys. of meta-module
      Double_t    zMeta;        // In the coor.sys. of meta-module
      Double_t    xMinDistInit;
      Double_t    yMinDistInit;
      Double_t    xMinDist;
      Double_t    yMinDist;
      Double_t    minDist2;         // chi2 or minDist^2
      Double_t    sigmaX;
      Double_t    sigmaY;
      Double_t    sigmaZ;
      Double_t    wt;
      Int_t       startTrInd;
      Short_t     metaMod;
      Short_t     binScWt;
      Short_t     column;           // RPC,Shower-column, TOF- =0
      Short_t     cell;             // RPC,TOF - cell, Shower - row
      Short_t     cellInd;          // For RPC = column*32+cell; for TOF = module*8+cell
      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;    // 0-TOF, 1-Shower, 2-RPC
    Double_t        yMinMetaLocal;
    Double_t        yMaxMetaLocal;
    Int_t           alignSec;
    Int_t           nTracks;
    Double_t        trackSelecCutX;
    Double_t        trackSelecCutY;
    Bool_t          filterFlag;

    HGeomTransform  transMetaModLabOld[8];  // 8 - for tof
    HGeomTransform  transMetaModLabNew[8];  // 8 - for tof
    HGeomTransform  transMetaModSecOld[8];  // 8 - for tof
    HGeomTransform  transMetaModSecNew[8];  // 8 - for tof
    Int_t           nMetaModules;
    Bool_t          fitTofModYPos;
    Double_t        tofModYSh[8];
    Int_t           cellStat[192];  // 192 = 32*6
    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__ */
    
 halignmentmeta.h:1
 halignmentmeta.h:2
 halignmentmeta.h:3
 halignmentmeta.h:4
 halignmentmeta.h:5
 halignmentmeta.h:6
 halignmentmeta.h:7
 halignmentmeta.h:8
 halignmentmeta.h:9
 halignmentmeta.h:10
 halignmentmeta.h:11
 halignmentmeta.h:12
 halignmentmeta.h:13
 halignmentmeta.h:14
 halignmentmeta.h:15
 halignmentmeta.h:16
 halignmentmeta.h:17
 halignmentmeta.h:18
 halignmentmeta.h:19
 halignmentmeta.h:20
 halignmentmeta.h:21
 halignmentmeta.h:22
 halignmentmeta.h:23
 halignmentmeta.h:24
 halignmentmeta.h:25
 halignmentmeta.h:26
 halignmentmeta.h:27
 halignmentmeta.h:28
 halignmentmeta.h:29
 halignmentmeta.h:30
 halignmentmeta.h:31
 halignmentmeta.h:32
 halignmentmeta.h:33
 halignmentmeta.h:34
 halignmentmeta.h:35
 halignmentmeta.h:36
 halignmentmeta.h:37
 halignmentmeta.h:38
 halignmentmeta.h:39
 halignmentmeta.h:40
 halignmentmeta.h:41
 halignmentmeta.h:42
 halignmentmeta.h:43
 halignmentmeta.h:44
 halignmentmeta.h:45
 halignmentmeta.h:46
 halignmentmeta.h:47
 halignmentmeta.h:48
 halignmentmeta.h:49
 halignmentmeta.h:50
 halignmentmeta.h:51
 halignmentmeta.h:52
 halignmentmeta.h:53
 halignmentmeta.h:54
 halignmentmeta.h:55
 halignmentmeta.h:56
 halignmentmeta.h:57
 halignmentmeta.h:58
 halignmentmeta.h:59
 halignmentmeta.h:60
 halignmentmeta.h:61
 halignmentmeta.h:62
 halignmentmeta.h:63
 halignmentmeta.h:64
 halignmentmeta.h:65
 halignmentmeta.h:66
 halignmentmeta.h:67
 halignmentmeta.h:68
 halignmentmeta.h:69
 halignmentmeta.h:70
 halignmentmeta.h:71
 halignmentmeta.h:72
 halignmentmeta.h:73
 halignmentmeta.h:74
 halignmentmeta.h:75
 halignmentmeta.h:76
 halignmentmeta.h:77
 halignmentmeta.h:78
 halignmentmeta.h:79
 halignmentmeta.h:80
 halignmentmeta.h:81
 halignmentmeta.h:82
 halignmentmeta.h:83
 halignmentmeta.h:84
 halignmentmeta.h:85
 halignmentmeta.h:86
 halignmentmeta.h:87
 halignmentmeta.h:88
 halignmentmeta.h:89
 halignmentmeta.h:90
 halignmentmeta.h:91
 halignmentmeta.h:92
 halignmentmeta.h:93
 halignmentmeta.h:94
 halignmentmeta.h:95
 halignmentmeta.h:96
 halignmentmeta.h:97
 halignmentmeta.h:98
 halignmentmeta.h:99
 halignmentmeta.h:100
 halignmentmeta.h:101
 halignmentmeta.h:102
 halignmentmeta.h:103
 halignmentmeta.h:104
 halignmentmeta.h:105
 halignmentmeta.h:106
 halignmentmeta.h:107
 halignmentmeta.h:108
 halignmentmeta.h:109
 halignmentmeta.h:110
 halignmentmeta.h:111
 halignmentmeta.h:112
 halignmentmeta.h:113
 halignmentmeta.h:114
 halignmentmeta.h:115
 halignmentmeta.h:116
 halignmentmeta.h:117
 halignmentmeta.h:118
 halignmentmeta.h:119
 halignmentmeta.h:120
 halignmentmeta.h:121