ROOT logo
/////////////////////////////////////////////////////////////////////
//  HRpcDigitizer digitizes HGeantRpc data, puts output values into
//  HRpcCalSim data category.
/////////////////////////////////////////////////////////////////////

#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:

    //---------------------------------------------------------------
    // define some auxiliary strutures
    typedef struct gaptrack {  // stores all needed infos per gap
        Float_t  gtime;        // GEANT time (used for sorting)
        Float_t  time ;        // smeared time
        Float_t  charge;       // charge
        Int_t    track;        // GEANT track number at the box
        Int_t    trackDgtr;    // GEANT track number at the gap
        Int_t    ref;          // index in category for hit at box
        Int_t    refDgtr;      // index in category for hit at gap
        Bool_t   isAtBox;      // kTRUE if track is at box

        // Reset initial values
        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) {
            // sort by GEANT time in increasing order
            return a->gtime < b->gtime;
        }
    } gaptrack;


    typedef struct  {           // collection of all gaptracks per cell
      //Short_t linIndex;       // linear index in working array
                                // (= sector * maxCol * maxCell + column * maxCell + cell )
        Short_t sec;            // sector
        Short_t col;            // column
        Short_t cell;           // cell

        vector<gaptrack*> right;// gaptracks stored according to right side of the cell
        vector<gaptrack*> left; // gaptracks stored according to left  side of the cell

        void reset(){           // Reset initial values. deletes right/left vector
            //linIndex= -1;
            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();
        }

        // Sort by increasing GEANT time (isRight=kTRUE -> right side)
        void sortTime(Bool_t isRight) {
            if(isRight) std::sort(right.begin(),right.end(),gaptrack::cmpTime);
            else        std::sort(left .begin(),left .end(),gaptrack::cmpTime);
        }

        // Get the sum of charge in all gaps (isRight=kTRUE -> right side)
        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;}
        }

        // Get the mean of TOF in all gaps (isRight=kTRUE -> right side)
        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());
            }
        }

        // Get the smallest digitizied TOF of all gaps (isRight=kTRUE -> right side)
        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 {  // stores all needed infos per gap
        Float_t  gaptime[4];    // GEANT time
        Float_t  gappos[4];     // GEANT x position
        Float_t  gapltln[4];    // GEANT local track length normalised to the gap
        Float_t  gapbeta[4];    // GEANT beta
        Float_t  time;          // GEANT average time
        Float_t  pos;           // GEANT average x position
        Float_t  beta;          // GEANT average beta
        Float_t  ltln;          // GEANT average local track length normalised to the gap
        Int_t    geantrpcIndex; // index in category
        Int_t    track;         // GEANT track number at the box

        // Reset initial values.
        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;
        }

        // Calculate the mean of all crossed gaps
        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;
            }
        }

        // Get the beta at the first crossed gap
        Float_t getFirstGapBeta(){
            UInt_t i;
            for(i=0;i<4;i++){ if(gapbeta[i]>0.) break; }
            return gapbeta[i];
        }
    } celltrack;


    typedef struct  {             // collection of all celltracks per cell
      //Short_t linIndex;         // linear index in working array
                                  // (= sector * maxCol * maxCell + column * maxCell + cell )
        Short_t sec;              // sector
        Short_t col;              // column
        Short_t cell;             // cell

        vector<celltrack*> celltr;// gaptracks stored according to left  side of the cell

        void reset(){             // Reset initial values. deletes right/left vector
            //linIndex= -1;
            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;                //! Location for new object
    HCategory*       fGeantRpcCat;        //! Pointer to Rpc Geant data category
    HCategory*       fCalCat;             //! Pointer to Cal  data category
    HCategory*       fKineCat;            //! Pointer to Kine data category
    HRpcGeomCellPar* fGeomCellPar;        //! Geometrical parameters
    HRpcDigiPar*     fDigiPar;            //! Digitization parameters
    HIterator*       iterGeantRpc;        //! Iterator over catRpcGeantRaw category
    HIterator*       iterRpcCal;          //! Iterator over HRpcCalSim category

    Int_t maxCol  ;                       //!
    Int_t maxCell ;                       //!
    vector <celldat* > cellobjects;       //! temporary working array for regrouping gaps
                                          //! into cells
    vector <rpcdat* > rpcobjects;         //! temporary working array for digitized data
    vector <efhits>   effi_vec;           //! vector of hits for efficiency calculation
    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) // Digitizer of RPC data.
};

#endif
 hrpcdigitizer.h:1
 hrpcdigitizer.h:2
 hrpcdigitizer.h:3
 hrpcdigitizer.h:4
 hrpcdigitizer.h:5
 hrpcdigitizer.h:6
 hrpcdigitizer.h:7
 hrpcdigitizer.h:8
 hrpcdigitizer.h:9
 hrpcdigitizer.h:10
 hrpcdigitizer.h:11
 hrpcdigitizer.h:12
 hrpcdigitizer.h:13
 hrpcdigitizer.h:14
 hrpcdigitizer.h:15
 hrpcdigitizer.h:16
 hrpcdigitizer.h:17
 hrpcdigitizer.h:18
 hrpcdigitizer.h:19
 hrpcdigitizer.h:20
 hrpcdigitizer.h:21
 hrpcdigitizer.h:22
 hrpcdigitizer.h:23
 hrpcdigitizer.h:24
 hrpcdigitizer.h:25
 hrpcdigitizer.h:26
 hrpcdigitizer.h:27
 hrpcdigitizer.h:28
 hrpcdigitizer.h:29
 hrpcdigitizer.h:30
 hrpcdigitizer.h:31
 hrpcdigitizer.h:32
 hrpcdigitizer.h:33
 hrpcdigitizer.h:34
 hrpcdigitizer.h:35
 hrpcdigitizer.h:36
 hrpcdigitizer.h:37
 hrpcdigitizer.h:38
 hrpcdigitizer.h:39
 hrpcdigitizer.h:40
 hrpcdigitizer.h:41
 hrpcdigitizer.h:42
 hrpcdigitizer.h:43
 hrpcdigitizer.h:44
 hrpcdigitizer.h:45
 hrpcdigitizer.h:46
 hrpcdigitizer.h:47
 hrpcdigitizer.h:48
 hrpcdigitizer.h:49
 hrpcdigitizer.h:50
 hrpcdigitizer.h:51
 hrpcdigitizer.h:52
 hrpcdigitizer.h:53
 hrpcdigitizer.h:54
 hrpcdigitizer.h:55
 hrpcdigitizer.h:56
 hrpcdigitizer.h:57
 hrpcdigitizer.h:58
 hrpcdigitizer.h:59
 hrpcdigitizer.h:60
 hrpcdigitizer.h:61
 hrpcdigitizer.h:62
 hrpcdigitizer.h:63
 hrpcdigitizer.h:64
 hrpcdigitizer.h:65
 hrpcdigitizer.h:66
 hrpcdigitizer.h:67
 hrpcdigitizer.h:68
 hrpcdigitizer.h:69
 hrpcdigitizer.h:70
 hrpcdigitizer.h:71
 hrpcdigitizer.h:72
 hrpcdigitizer.h:73
 hrpcdigitizer.h:74
 hrpcdigitizer.h:75
 hrpcdigitizer.h:76
 hrpcdigitizer.h:77
 hrpcdigitizer.h:78
 hrpcdigitizer.h:79
 hrpcdigitizer.h:80
 hrpcdigitizer.h:81
 hrpcdigitizer.h:82
 hrpcdigitizer.h:83
 hrpcdigitizer.h:84
 hrpcdigitizer.h:85
 hrpcdigitizer.h:86
 hrpcdigitizer.h:87
 hrpcdigitizer.h:88
 hrpcdigitizer.h:89
 hrpcdigitizer.h:90
 hrpcdigitizer.h:91
 hrpcdigitizer.h:92
 hrpcdigitizer.h:93
 hrpcdigitizer.h:94
 hrpcdigitizer.h:95
 hrpcdigitizer.h:96
 hrpcdigitizer.h:97
 hrpcdigitizer.h:98
 hrpcdigitizer.h:99
 hrpcdigitizer.h:100
 hrpcdigitizer.h:101
 hrpcdigitizer.h:102
 hrpcdigitizer.h:103
 hrpcdigitizer.h:104
 hrpcdigitizer.h:105
 hrpcdigitizer.h:106
 hrpcdigitizer.h:107
 hrpcdigitizer.h:108
 hrpcdigitizer.h:109
 hrpcdigitizer.h:110
 hrpcdigitizer.h:111
 hrpcdigitizer.h:112
 hrpcdigitizer.h:113
 hrpcdigitizer.h:114
 hrpcdigitizer.h:115
 hrpcdigitizer.h:116
 hrpcdigitizer.h:117
 hrpcdigitizer.h:118
 hrpcdigitizer.h:119
 hrpcdigitizer.h:120
 hrpcdigitizer.h:121
 hrpcdigitizer.h:122
 hrpcdigitizer.h:123
 hrpcdigitizer.h:124
 hrpcdigitizer.h:125
 hrpcdigitizer.h:126
 hrpcdigitizer.h:127
 hrpcdigitizer.h:128
 hrpcdigitizer.h:129
 hrpcdigitizer.h:130
 hrpcdigitizer.h:131
 hrpcdigitizer.h:132
 hrpcdigitizer.h:133
 hrpcdigitizer.h:134
 hrpcdigitizer.h:135
 hrpcdigitizer.h:136
 hrpcdigitizer.h:137
 hrpcdigitizer.h:138
 hrpcdigitizer.h:139
 hrpcdigitizer.h:140
 hrpcdigitizer.h:141
 hrpcdigitizer.h:142
 hrpcdigitizer.h:143
 hrpcdigitizer.h:144
 hrpcdigitizer.h:145
 hrpcdigitizer.h:146
 hrpcdigitizer.h:147
 hrpcdigitizer.h:148
 hrpcdigitizer.h:149
 hrpcdigitizer.h:150
 hrpcdigitizer.h:151
 hrpcdigitizer.h:152
 hrpcdigitizer.h:153
 hrpcdigitizer.h:154
 hrpcdigitizer.h:155
 hrpcdigitizer.h:156
 hrpcdigitizer.h:157
 hrpcdigitizer.h:158
 hrpcdigitizer.h:159
 hrpcdigitizer.h:160
 hrpcdigitizer.h:161
 hrpcdigitizer.h:162
 hrpcdigitizer.h:163
 hrpcdigitizer.h:164
 hrpcdigitizer.h:165
 hrpcdigitizer.h:166
 hrpcdigitizer.h:167
 hrpcdigitizer.h:168
 hrpcdigitizer.h:169
 hrpcdigitizer.h:170
 hrpcdigitizer.h:171
 hrpcdigitizer.h:172
 hrpcdigitizer.h:173
 hrpcdigitizer.h:174
 hrpcdigitizer.h:175
 hrpcdigitizer.h:176
 hrpcdigitizer.h:177
 hrpcdigitizer.h:178
 hrpcdigitizer.h:179
 hrpcdigitizer.h:180
 hrpcdigitizer.h:181
 hrpcdigitizer.h:182
 hrpcdigitizer.h:183
 hrpcdigitizer.h:184
 hrpcdigitizer.h:185
 hrpcdigitizer.h:186
 hrpcdigitizer.h:187
 hrpcdigitizer.h:188
 hrpcdigitizer.h:189
 hrpcdigitizer.h:190
 hrpcdigitizer.h:191
 hrpcdigitizer.h:192
 hrpcdigitizer.h:193
 hrpcdigitizer.h:194
 hrpcdigitizer.h:195
 hrpcdigitizer.h:196
 hrpcdigitizer.h:197
 hrpcdigitizer.h:198
 hrpcdigitizer.h:199
 hrpcdigitizer.h:200
 hrpcdigitizer.h:201
 hrpcdigitizer.h:202
 hrpcdigitizer.h:203
 hrpcdigitizer.h:204
 hrpcdigitizer.h:205
 hrpcdigitizer.h:206
 hrpcdigitizer.h:207
 hrpcdigitizer.h:208
 hrpcdigitizer.h:209
 hrpcdigitizer.h:210
 hrpcdigitizer.h:211
 hrpcdigitizer.h:212
 hrpcdigitizer.h:213
 hrpcdigitizer.h:214
 hrpcdigitizer.h:215
 hrpcdigitizer.h:216
 hrpcdigitizer.h:217
 hrpcdigitizer.h:218
 hrpcdigitizer.h:219
 hrpcdigitizer.h:220
 hrpcdigitizer.h:221
 hrpcdigitizer.h:222
 hrpcdigitizer.h:223
 hrpcdigitizer.h:224
 hrpcdigitizer.h:225
 hrpcdigitizer.h:226
 hrpcdigitizer.h:227
 hrpcdigitizer.h:228
 hrpcdigitizer.h:229
 hrpcdigitizer.h:230
 hrpcdigitizer.h:231
 hrpcdigitizer.h:232
 hrpcdigitizer.h:233
 hrpcdigitizer.h:234
 hrpcdigitizer.h:235
 hrpcdigitizer.h:236
 hrpcdigitizer.h:237
 hrpcdigitizer.h:238
 hrpcdigitizer.h:239
 hrpcdigitizer.h:240
 hrpcdigitizer.h:241
 hrpcdigitizer.h:242
 hrpcdigitizer.h:243
 hrpcdigitizer.h:244
 hrpcdigitizer.h:245
 hrpcdigitizer.h:246
 hrpcdigitizer.h:247
 hrpcdigitizer.h:248
 hrpcdigitizer.h:249
 hrpcdigitizer.h:250
 hrpcdigitizer.h:251
 hrpcdigitizer.h:252
 hrpcdigitizer.h:253
 hrpcdigitizer.h:254
 hrpcdigitizer.h:255
 hrpcdigitizer.h:256
 hrpcdigitizer.h:257
 hrpcdigitizer.h:258
 hrpcdigitizer.h:259
 hrpcdigitizer.h:260
 hrpcdigitizer.h:261
 hrpcdigitizer.h:262
 hrpcdigitizer.h:263
 hrpcdigitizer.h:264
 hrpcdigitizer.h:265
 hrpcdigitizer.h:266
 hrpcdigitizer.h:267