ROOT logo
#ifndef HEMCDIGITIZER_H
#define HEMCDIGITIZER_H

using namespace std;
#include "hreconstructor.h"
#include "hgeomtransform.h"
#include "hlocation.h"
#include "emcdef.h"
#include <vector>

class HIterator;
class HCategory;
class HLinearCategory;
class HEmcCal;
class HEmcDetector;
class HEmcGeomPar;
class HEmcDigiPar;
class HEmcCellStatusPar;
class HEmcSimulPar;
class HGeantEmc;

class HEmcDigitizer : public HReconstructor {
protected:

  //---------------------------------------------------------------
  // define some auxiliary structures
  typedef struct celltrack { // stores all needed infos per cell
    Float_t gtime;           // GEANT time (used for sorting)
    Int_t   gtrack;          // GEANT track number
    Float_t trackEn;         // number of photo electrons

    // Reset initial values
    void reset() {
      gtime      =  10000.;
      gtrack     = -1;
      trackEn    = 0;
    }

    Bool_t static cmpTime(celltrack* a, celltrack* b) {
      // sort by GEANT time in increasing order
      return (a->gtime < b->gtime);
    }
    Bool_t static cmpEnergy(celltrack* a, celltrack* b) {
      // sort by GEANT time in increasing order
      return (a->trackEn > b->trackEn);
    }
  } celltrack;

  typedef struct {  // collects all tracks per cell
    Float_t            energy;         // number of photo electrons
    Bool_t             isEmbeddedReal; // kTRUE - real data cell
    vector<celltrack*> ctracks;        // all tracks in the cell
    vector<Int_t>      inputTracks;    // tracks in the cell ("inputTracks" is not always equal to "ctracks")

    void reset() { // Resets initial values, deletes vector
      energy         = 0.;
      isEmbeddedReal = kFALSE;
      for (UInt_t i=0;i<ctracks.size();i++) { delete ctracks[i]; }
      inputTracks.clear();
      ctracks.clear();
    }

    // Sorts by increasing GEANT time
    void sortTime(void) {
      std::sort(ctracks.begin(),ctracks.end(),celltrack::cmpTime);
    }

    void sortEnergy(void) {
      std::sort(ctracks.begin(),ctracks.end(),celltrack::cmpEnergy);
    }

  } celldata;
  
  vector<celldata* > cellobjects; // temporary working array for digitized data
  void clearCellobjects();

  //---------------------------------------------------------------
  
  Int_t            embeddingmode;    //  switch for keeping geant hits / realistic embedding

  HLocation        fLoc;             // Location for new object
  HCategory*       fGeantEmcCat;     // GeantEmc data category
  HLinearCategory* fGeantKineCat;    // GeantKine data category
  HCategory*       fCalCat;          // Cal data category
  HCategory*       fStartHitCat;     // StartHit data category
  HEmcDetector*    fEmcDet;          // EmcDetector
  HEmcGeomPar*     fGeomPar;         // Geometry parameters
  HEmcDigiPar*     fDigiPar;         // Digitization parameters
  HEmcCellStatusPar* pStatuspar;     //! pointer to calibration parameters
  HEmcSimulPar*    fSimulPar;        // Simulation parameter: lookup table for PMT types
  HIterator*       iterGeantEmc;     // Iterator over catEmcGeantRaw category
  HGeomTransform   labTrans[6];      // Transfomation lab. <-> emc_module
  
  Int_t            maxCell;          // maximal number of cells (including spares)
  Float_t          sigmaT;           // time resolution
  Float_t          phot2Energy[3];   // mean energy deposit per photo electron for different types of PMT (1000./1306.) [MeV]
  Float_t          facEnergSmear[3]; // factor for energy smearing for different types of PMT
  Double_t         zVertBorder;      // tracks without HGeantEmc hit but with vertex in region zVertBorder (coor.sys. of emc module) 
                                     //  will be analysed as track with HGeantEmc hit
                                     //  Input plane of EMC module corresponds to zVertBorder=0.
  Float_t          energyDepositCut; // Cut for the minimal energy deposit in the cell. It is used for time1 determination.
  Float_t          signalVelocity;   // Velocity of the signal propagation along cell (default: speed of light in the vacuum)
  Float_t          halfOfCellLength; // It is needed because HGeanEmc hits now are shifted by half of cell relative coor.system of EMC !
  
public:
  HEmcDigitizer(void);
  HEmcDigitizer(const Text_t* name,const Text_t* title);
  ~HEmcDigitizer(void);
  Bool_t     init(void);
  Bool_t     reinit(void);
  Bool_t     finalize(void) {return kTRUE;}
  Int_t      execute(void);
  void       setzVertBorder(Double_t vc)       {zVertBorder      = vc;}
  void       setEnergyDepositCut(Double_t cut) {energyDepositCut = cut;}
  void       setSignalVelocity(Double_t v)     {signalVelocity   = v;}

  void       setEmbeddingMode(Int_t mode)      {embeddingmode    = mode;}
  Int_t      getEmbeddingMode(void) const      {return embeddingmode;}
  
  
protected:
  void       initVariables(void);
  Bool_t     setParameterContainers(void);
  Int_t      cellObjectsSize(void) const             {return 6 * emcMaxComponents;}     // size of "cellobjects" vector
  Int_t      cellObjectIndex(Int_t s,Int_t c) const  {return s * emcMaxComponents +c;}  // sector&cell  ==>  index in "cellobjects" vector 
  Int_t      sectorFromIndex(Int_t ind) const        {return ind / emcMaxComponents;}   // index in "cellobjects" vector  ==>  sector
  Int_t      cellFromIndex(Int_t ind) const          {return ind % emcMaxComponents;}   // index in "cellobjects" vector  ==>  cell
  HGeantEmc* getInputHit(HGeantEmc* pGeantEmc,Int_t &inputTrack) const;

  ClassDef(HEmcDigitizer,0) //Digitizer of EMC data.
};

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