#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:
  
  
  typedef struct celltrack { 
    Float_t gtime;           
    Int_t   gtrack;          
    Float_t trackEn;         
    
    void reset() {
      gtime      =  10000.;
      gtrack     = -1;
      trackEn    = 0;
    }
    Bool_t static cmpTime(celltrack* a, celltrack* b) {
      
      return (a->gtime < b->gtime);
    }
    Bool_t static cmpEnergy(celltrack* a, celltrack* b) {
      
      return (a->trackEn > b->trackEn);
    }
  } celltrack;
  typedef struct {  
    Float_t            energy;         
    Bool_t             isEmbeddedReal; 
    vector<celltrack*> ctracks;        
    vector<Int_t>      inputTracks;    
    void reset() { 
      energy         = 0.;
      isEmbeddedReal = kFALSE;
      for (UInt_t i=0;i<ctracks.size();i++) { delete ctracks[i]; }
      inputTracks.clear();
      ctracks.clear();
    }
    
    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; 
  void clearCellobjects();
  
  
  Int_t            embeddingmode;    
  HLocation        fLoc;             
  HCategory*       fGeantEmcCat;     
  HLinearCategory* fGeantKineCat;    
  HCategory*       fCalCat;          
  HCategory*       fStartHitCat;     
  HEmcDetector*    fEmcDet;          
  HEmcGeomPar*     fGeomPar;         
  HEmcDigiPar*     fDigiPar;         
  HEmcCellStatusPar* pStatuspar;     
  HEmcSimulPar*    fSimulPar;        
  HIterator*       iterGeantEmc;     
  HGeomTransform   labTrans[6];      
  
  Int_t            maxCell;          
  Float_t          sigmaT;           
  Float_t          phot2Energy[3];   
  Float_t          facEnergSmear[3]; 
  Double_t         zVertBorder;      
                                     
                                     
  Float_t          energyDepositCut; 
  Float_t          signalVelocity;   
  Float_t          halfOfCellLength; 
  
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;}     
  Int_t      cellObjectIndex(Int_t s,Int_t c) const  {return s * emcMaxComponents +c;}  
  Int_t      sectorFromIndex(Int_t ind) const        {return ind / emcMaxComponents;}   
  Int_t      cellFromIndex(Int_t ind) const          {return ind % emcMaxComponents;}   
  HGeantEmc* getInputHit(HGeantEmc* pGeantEmc,Int_t &inputTrack) const;
  ClassDef(HEmcDigitizer,0) 
};
#endif