#ifndef MARS_MMcTriggerLvl2
#define MARS_MMcTriggerLvl2

#ifndef MARS_MCamEvent
#include "MCamEvent.h"
#endif

#ifndef MARS_MParContainer
#include "MParContainer.h"
#endif

class MMcTrig;
class MMcEvt;
class MGeomCamMagic;
class MGeomCam;
class MGeomPix;

class MMcTriggerLvl2 : public MParContainer, public MCamEvent
{
 private:
  
  // Global trigger variables related to the geometry and trigger structures are here defined.  
  // FIXME!  this is a temporary solution: these variables should be defined in a GeomTrg class    

  static const Int_t fNumPixCell = 36; // Number of pixels in one cell

  static const Int_t gsNCells = 19;   
  static const Int_t gsNTrigPixels = 397;   
  static const Int_t gsNPixInCell = 36;  
  static const Int_t gsNLutInCell = 3;  
  static const Int_t gsNPixInLut = 12; 
  Int_t fPixels[gsNPixInCell][gsNCells];  
  static const Int_t gsPixelsInCell[gsNPixInCell][gsNCells];   
  static const Int_t gsPixelsInLut[gsNLutInCell][gsNPixInLut];
  // Array with flag for triggered pixels. 1st idx:pixels in trigger cell; 2nd idx:trigger cell number      

  Int_t fFiredPixel[gsNTrigPixels]; // Array with flag for triggered pixel. idx: pixel id    
  
  Int_t fMaxCell;  // Cell with maximum number of fired pixels

  Int_t fLutPseudoSize;   // number of compact pixels in one lut   
  Int_t fPseudoSize;   // Multiplicity of the cluster identified by the L2T    
  Int_t fSizeBiggerCell; // Number of fired pixel in bigger cell    
  Int_t fCompactNN;    //Number of NN pixels that define a compact pixel    
  Int_t fCompactPixel[gsNTrigPixels]; //Array with flag for compact pixels    
  Int_t fCluster_pix[gsNTrigPixels]; //Array with pixel in cluster   
  Double_t fEnergy;  // Energy of the shower    
  Int_t fTriggerPattern; // x-NN compact trigger pattern;    
  Int_t fCellPseudoSize; // number of compact pixels in one cell    
  //  Int_t fCellCompactPixels[fNumPixCell]; // Array with compact pixels in cell

  MMcTrig *fMcTrig;   
  MGeomCam *fGeomCam;      

     
  Int_t CalcBiggerFiredCell();   
  Int_t CalcBiggerLutPseudoSize();   
  void CalcPseudoSize();   
  Int_t CalcCellPseudoSize();   
  Int_t CalcBiggerCellPseudoSize();    
  Int_t GetCellCompactPixel(int cell, MGeomCam *fCam);

  void SetNewCamera(MGeomCam *geom) {fGeomCam = geom;}   

 public:     
 
  MMcTriggerLvl2(const char* name = NULL, const char* title = NULL);   
  ~MMcTriggerLvl2();      

  virtual void Calc();    
  virtual void Print(Option_t *opt="") const;    

  void SetLv1(MMcTrig *trig = NULL);    
  void SetPixelFired(Int_t pixel, Int_t fired=1);     
  void SetCompactNN(Int_t neighpix)     {fCompactNN=neighpix;}    

  Int_t GetPseudoSize() const     {return fPseudoSize;}   
  Int_t GetLutPseudoSize() const  {return fLutPseudoSize;}   
  Int_t GetSizeBiggerCell() const {return fSizeBiggerCell;}   
  Int_t GetCompactNN() const      {return fCompactNN;}   
  Int_t GetCellPseudoSize() const {return fCellPseudoSize;}
  Int_t GetMaxCell() const        {return (fMaxCell+1);} // Returns
                     // cell with maximum number of compact pixels
  Int_t GetCellNumberFired(int cell);   
  Int_t GetLutCompactPixel(int cell, int lut); 
  void CalcCompactPixels(MGeomCam *fCam);
  void CalcTriggerPattern(MGeomCam *fCam);

  const Int_t* GetPixelsInCell() const { return &(**gsPixelsInCell);}
  const Int_t* GetPixelsInLut() const { return &(**gsPixelsInLut);}

  Int_t GetTriggerPattern() const {return fTriggerPattern;}    

  void GetEnergy(MMcEvt *fMcEvt = NULL);     
  Double_t GetEnergy() const    {return fEnergy;}      

  Bool_t IsPixelInCell(Int_t pixel, Int_t cell);    
  Bool_t IsPixelInTrigger(Int_t pixel) const;    

  Bool_t GetPixelContent(Double_t &val, Int_t idx, const MGeomCam &cam, Int_t type=0) const;
  void DrawPixelContent(Int_t num) const;


  ClassDef(MMcTriggerLvl2,0) // Container for 2nd Level Trigger selection parameters 
    };  
    
#endif      
    
