ROOT logo

#ifndef HRICH700DIGIPAR_H_
#define HRICH700DIGIPAR_H_

#include "hparcond.h"
#include "hrich700data.h"

#include "TObject.h"
#include "TArrayD.h"
#include "TH2F.h"

#include <vector>
#include <utility>
#include <map>

using namespace std;


class HParamList;


#define NPARPMT 9

class HRich700DigiPar : public HParCond {

private:
    map<Int_t,HRich700PmtData> fPmtDataMapPmtId;             // pmtid       -> (x,y,z,indx,indy,pmtid)
    map<pair<Int_t,Int_t>, HRich700PmtData> fPmtDataMapXY;   // (xind,yind) -> (x,y,z,indx,indy,pmtid)

    Int_t fNofPixelsInRow;
    Double_t fPmtSize; // in mm
    Double_t fPmtSensSize; // in mm, sensitive area of PMT
    Double_t fCollectionEfficiency; // collection efficiency. Final QE = QE * fCollectionEfficiency
    Double_t fCrossTalkProbability; // cross talk probability for direct neighbour pixel
    Int_t fNofNoiseHits; // number of noise hits per event
    Double_t fPmtGap; // in mm, gap betweem PMTs
    TArrayD fArrayPmt; // linearized pmt info fArrayPmt[pmyindex*(x,y,z,indx,indy,pmtid)]
    vector<TArrayD> fArrayThetaMean ; //  xy->theta hist
    TArrayD fArrayZVertices ;

    // alternative approach for x,y -> Theta and reverse transformation from Joerg Foertsch
    TArrayD fArrayThetaTransParamsPoly; // polynomial parameters
    TArrayD fArrayThetaTransParamsGeo;  // geo parameters
    vector<TH2F*>   fhxyThetaMean;    //! hist for mapping xy -> Theta [deg]

    // parameters for alignment procedure
    TArrayD fArrayPhiAlign;    //  array for alignment ThetaPhi -> Phi
    TArrayD fArrayThetaAlign;  //  array for alignment ThetaPhi -> Theta
    TH2D*   fhPhiAlign;        //! hist for alignment ThetaPhi -> Phi
    TH2D*   fhThetaAlign;      //! hist for alignment ThetaPhi -> Theta
    TArrayD fArrayInvPhiAlign;    //  array for inverse alignment ThetaPhi -> Phi
    TArrayD fArrayInvThetaAlign;  //  array for inverse alignment ThetaPhi -> Theta
    TH2D*   fhInvPhiAlign;        //! hist for inverse alignment ThetaPhi -> Phi
    TH2D*   fhInvThetaAlign;      //! hist for inverse alignment ThetaPhi -> Theta

    Float_t fMaxX;            //!  remember dimensions to calculate indX+indY from x+y
    Float_t fMaxY;            //!  remember dimensions to calculate indX+indY from x+y

    void fillMaps();
public:

    HRich700DigiPar(const Char_t* name   ="Rich700DigiPar",
		       const Char_t* title  ="Digitizer parameters for RICH",
		       const Char_t* context="Rich700DigiParProduction");
    virtual ~HRich700DigiPar();


    void                              getLocation(Int_t pmtId, Float_t x, Float_t y, Int_t *loc,Bool_t silent=kTRUE);
    void                              pmtIdPixelToColRowSec(Int_t pmtId,Int_t pixel,Int_t& sec,Int_t& col,Int_t& row, Bool_t silent=kTRUE);
    pair<Double_t, Double_t>          getXY(Int_t* loc,Bool_t silent=kTRUE);
    pair<Double_t, Double_t>          getPmtCenter(Int_t pmtId);
    vector<pair<Double_t, Double_t> > getPmtCenters();

    Double_t getPmtSize(){ return fPmtSize; }
    Double_t getPmtSensSize(){ return fPmtSensSize; }
    Double_t getCollectionEfficiency(){ return fCollectionEfficiency; }
    Double_t getCrossTalkProbability(){ return fCrossTalkProbability; }
    Int_t getNofNoiseHits(){ return fNofNoiseHits; }
    Double_t getPmtGap (){ return fPmtGap; }
    Int_t getNPmts() { return fArrayPmt.GetSize()/NPARPMT; }
    Int_t getNPixelInRow() { return fNofPixelsInRow; }

    vector<pair<Int_t, Int_t> > getDirectNeighbourPixels  (Int_t col, Int_t row);
    vector<pair<Int_t, Int_t> > getDiagonalNeighbourPixels(Int_t col, Int_t row);
    vector<pair<Int_t, Int_t> > getNoisePixels            (UInt_t nofNoisePixels);
    map<Int_t,HRich700PmtData>  getPmtDataMapPmtId() {return fPmtDataMapPmtId;}
    Int_t            getPMTId  (Float_t x, Float_t y);
    Int_t            getPMTId  (Int_t col, Int_t row);
    HRich700PmtData* getPMTData(Int_t pmtid);

    Int_t  getInterpolatedSectorThetaPhi(Float_t x, Float_t y, Float_t& theta,Float_t& phi);
    Int_t  getInterpolatedSectorThetaPhi(Float_t x, Float_t y, Float_t zv, Float_t& theta,Float_t& phi);
    Int_t  getInterpolatedSectorThetaPhiAnalytical(Float_t x, Float_t y, Float_t zv, Float_t& theta,Float_t& phi);
    void   getRingCenterXY(Float_t theta, Float_t phi, Float_t zv, Float_t& x,Float_t& y);
    Bool_t getInterpolatedThetaPhiPMT(Float_t x, Float_t y, Float_t& theta,Float_t& phi);
    Int_t  getSector(Float_t x, Float_t y);
    Int_t  getSectorPixels(Int_t col,Int_t row);
    Int_t  getSectorPMTInd(Int_t xind,Int_t yInd);
    Int_t  getSectorPMTId (Int_t pmtid);
    Int_t  getSectorPhiThetaDegPixels(Int_t col,Int_t row, Float_t& phiDeg,Float_t& thetaDeg);
    Int_t  getSectorPhiThetaDegPMTInd(Int_t xind,Int_t yInd, Float_t& phiDeg,Float_t& thetaDeg);
    Int_t  getSectorPhiThetaDegPMTId (Int_t pmtid, Float_t& phiDeg,Float_t& thetaDeg);

    // get aligned theta phi from the theta phi of the according ring!
    void getAlignedThetaPhi(const Float_t theta, const Float_t phi, Float_t & thetaCor, Float_t & phiCor);
    // get aligned theta phi from the theta phi of the particle cand! Needed for backtracking
    void getAlignedThetaPhiInv(const Float_t theta, const Float_t phi, Float_t & thetaCor, Float_t & phiCor);

    Bool_t  init(HParIo* inp,Int_t* set);
    void    putParams(HParamList*);
    Bool_t  getParams(HParamList*);
    void    clear();
    void    printParam(void);
    string  getStringForParTxtFile();

    ClassDef(HRich700DigiPar, 1)
};

#endif
 hrich700digipar.h:1
 hrich700digipar.h:2
 hrich700digipar.h:3
 hrich700digipar.h:4
 hrich700digipar.h:5
 hrich700digipar.h:6
 hrich700digipar.h:7
 hrich700digipar.h:8
 hrich700digipar.h:9
 hrich700digipar.h:10
 hrich700digipar.h:11
 hrich700digipar.h:12
 hrich700digipar.h:13
 hrich700digipar.h:14
 hrich700digipar.h:15
 hrich700digipar.h:16
 hrich700digipar.h:17
 hrich700digipar.h:18
 hrich700digipar.h:19
 hrich700digipar.h:20
 hrich700digipar.h:21
 hrich700digipar.h:22
 hrich700digipar.h:23
 hrich700digipar.h:24
 hrich700digipar.h:25
 hrich700digipar.h:26
 hrich700digipar.h:27
 hrich700digipar.h:28
 hrich700digipar.h:29
 hrich700digipar.h:30
 hrich700digipar.h:31
 hrich700digipar.h:32
 hrich700digipar.h:33
 hrich700digipar.h:34
 hrich700digipar.h:35
 hrich700digipar.h:36
 hrich700digipar.h:37
 hrich700digipar.h:38
 hrich700digipar.h:39
 hrich700digipar.h:40
 hrich700digipar.h:41
 hrich700digipar.h:42
 hrich700digipar.h:43
 hrich700digipar.h:44
 hrich700digipar.h:45
 hrich700digipar.h:46
 hrich700digipar.h:47
 hrich700digipar.h:48
 hrich700digipar.h:49
 hrich700digipar.h:50
 hrich700digipar.h:51
 hrich700digipar.h:52
 hrich700digipar.h:53
 hrich700digipar.h:54
 hrich700digipar.h:55
 hrich700digipar.h:56
 hrich700digipar.h:57
 hrich700digipar.h:58
 hrich700digipar.h:59
 hrich700digipar.h:60
 hrich700digipar.h:61
 hrich700digipar.h:62
 hrich700digipar.h:63
 hrich700digipar.h:64
 hrich700digipar.h:65
 hrich700digipar.h:66
 hrich700digipar.h:67
 hrich700digipar.h:68
 hrich700digipar.h:69
 hrich700digipar.h:70
 hrich700digipar.h:71
 hrich700digipar.h:72
 hrich700digipar.h:73
 hrich700digipar.h:74
 hrich700digipar.h:75
 hrich700digipar.h:76
 hrich700digipar.h:77
 hrich700digipar.h:78
 hrich700digipar.h:79
 hrich700digipar.h:80
 hrich700digipar.h:81
 hrich700digipar.h:82
 hrich700digipar.h:83
 hrich700digipar.h:84
 hrich700digipar.h:85
 hrich700digipar.h:86
 hrich700digipar.h:87
 hrich700digipar.h:88
 hrich700digipar.h:89
 hrich700digipar.h:90
 hrich700digipar.h:91
 hrich700digipar.h:92
 hrich700digipar.h:93
 hrich700digipar.h:94
 hrich700digipar.h:95
 hrich700digipar.h:96
 hrich700digipar.h:97
 hrich700digipar.h:98
 hrich700digipar.h:99
 hrich700digipar.h:100
 hrich700digipar.h:101
 hrich700digipar.h:102
 hrich700digipar.h:103
 hrich700digipar.h:104
 hrich700digipar.h:105
 hrich700digipar.h:106
 hrich700digipar.h:107
 hrich700digipar.h:108
 hrich700digipar.h:109
 hrich700digipar.h:110
 hrich700digipar.h:111
 hrich700digipar.h:112
 hrich700digipar.h:113
 hrich700digipar.h:114
 hrich700digipar.h:115
 hrich700digipar.h:116
 hrich700digipar.h:117
 hrich700digipar.h:118
 hrich700digipar.h:119