#ifndef ROOT_THcAerogel
#define ROOT_THcAerogel

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// THcAerogel                                                              //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include "TClonesArray.h"
#include "THaNonTrackingDetector.h"
#include "THcHitList.h"
#include "THcAerogelHit.h"

#include "hcana/Logger.h"

class THcHodoscope;

class THcAerogel : public THaNonTrackingDetector, public THcHitList {

 public:
  THcAerogel(const char* name, const char* description = "", THaApparatus* a = NULL);
  virtual ~THcAerogel();

  virtual void 	  Clear(Option_t* opt="");
  virtual void    Print(const Option_t* opt) const;
  virtual void    AccumulatePedestals(TClonesArray* rawhits);
  virtual void    CalculatePedestals();
  virtual Int_t   Decode(const THaEvData&);
  virtual Int_t   ReadDatabase(const TDatime& date);
  virtual Int_t   DefineVariables(EMode mode = kDefine);
  virtual Int_t   CoarseProcess(TClonesArray& tracks);
  virtual Int_t   FineProcess(TClonesArray& tracks);
  virtual Int_t   ApplyCorrections(void);
  virtual EStatus Init(const TDatime& run_time);
  Int_t           End(THaRunBase* run=0);

  Int_t GetIndex(Int_t nRegion, Int_t nValue);

  THcAerogel();  // for ROOT I/O

 protected:

  // Event information
  Int_t fNhits;
  Bool_t* fPresentP;

  Int_t fADC_RefTimeCut;

  // 12 GeV variables
  // Vector/TClonesArray length parameters
  static const Int_t MaxNumAdcPulse   = 4;
  // Tracking variables
  Int_t     fNRegions;
  Int_t     fRegionsValueMax;
  Int_t     fDebugAdc;
  Double_t  fRedChi2Min;
  Double_t  fRedChi2Max;
  Double_t  fBetaMin;
  Double_t  fBetaMax;
  Double_t  fENormMin;
  Double_t  fENormMax;
  Double_t  fDpMin;
  Double_t  fDpMax;
  Double_t  fDiffBoxZPos;
  Double_t  fXAtAero;
  Double_t  fYAtAero;
  Double_t  fNpeThresh;

  ////  Double_t  fAdcTimeWindowMin;
  ////  Double_t  fAdcTimeWindowMax;
  Double_t  *fAdcPosTimeWindowMin;
  Double_t  *fAdcPosTimeWindowMax;
  Double_t  *fAdcNegTimeWindowMin;
  Double_t  *fAdcNegTimeWindowMax;

  Double_t  fAdcTdcOffset;
  Double_t  *fRegionValue;
  // Counting variables
  Int_t     fTotNumAdcHits;
  Int_t     fTotNumGoodAdcHits;
  Int_t     fTotNumPosAdcHits;
  Int_t     fTotNumGoodPosAdcHits;
  Int_t     fTotNumNegAdcHits;
  Int_t     fTotNumGoodNegAdcHits;
  Int_t     fTotNumTracksMatched;
  Int_t     fTotNumTracksFired;
  // NPE variables
  Double_t  fPosNpeSum;
  Double_t  fNegNpeSum;
  Double_t  fNpeSum;
  Double_t  *fPosGain;
  Double_t  *fNegGain;
  // FADC data objects
  TClonesArray* frPosAdcPedRaw;
  TClonesArray* frPosAdcPulseIntRaw;
  TClonesArray* frPosAdcPulseAmpRaw;
  TClonesArray* frPosAdcPulseTimeRaw;
  TClonesArray* frPosAdcPed;
  TClonesArray* frPosAdcPulseInt;
  TClonesArray* frPosAdcPulseAmp;
  TClonesArray* frPosAdcPulseTime;
  TClonesArray* frNegAdcPedRaw;
  TClonesArray* frNegAdcPulseIntRaw;
  TClonesArray* frNegAdcPulseAmpRaw;
  TClonesArray* frNegAdcPulseTimeRaw;
  TClonesArray* frNegAdcPed;
  TClonesArray* frNegAdcPulseInt;
  TClonesArray* frNegAdcPulseAmp;
  TClonesArray* frNegAdcPulseTime;
  TClonesArray* fPosAdcErrorFlag;
  TClonesArray* fNegAdcErrorFlag;
  // Individual PMT data objects
  vector<Int_t>    fNumPosAdcHits;
  vector<Int_t>    fNumNegAdcHits;
  vector<Int_t>    fNumGoodPosAdcHits;
  vector<Int_t>    fNumGoodNegAdcHits;
  vector<Int_t>    fNumTracksMatched;
  vector<Int_t>    fNumTracksFired;
  vector<Double_t> fPosNpe;
  vector<Double_t> fNegNpe;
  vector<Double_t> fGoodPosAdcPed;
  vector<Double_t> fGoodPosAdcMult;
  vector<Double_t> fGoodPosAdcPulseInt;
  vector<Double_t> fGoodPosAdcPulseIntRaw;
  vector<Double_t> fGoodPosAdcPulseAmp;
  vector<Double_t> fGoodPosAdcPulseTime;
  vector<Double_t> fGoodPosAdcTdcDiffTime;
  vector<Double_t> fGoodNegAdcPed;
  vector<Double_t> fGoodNegAdcMult;
  vector<Double_t> fGoodNegAdcPulseInt;
  vector<Double_t> fGoodNegAdcPulseIntRaw;
  vector<Double_t> fGoodNegAdcPulseAmp;
  vector<Double_t> fGoodNegAdcPulseTime;
  vector<Double_t> fGoodNegAdcTdcDiffTime;

  // 6 GeV era variables
  Int_t     fAnalyzePedestals;
  Int_t     fSixGevData;
  Int_t     fNGoodHits;
  Int_t     fNADCPosHits;
  Int_t     fNADCNegHits;
  Int_t     fNTDCPosHits;
  Int_t     fNTDCNegHits;
  Int_t     fTdcOffset; /* Global TDC offset */
  Int_t     fNPedestalEvents;
  Int_t     fMinPeds;
  Double_t  fPosNpeSumSixGev;
  Double_t  fNegNpeSumSixGev;
  Double_t  fNpeSumSixGev;
  Int_t    *fPosPedSum;		/* Accumulators for pedestals */
  Int_t    *fPosPedSum2;
  Int_t    *fPosPedLimit;
  Int_t    *fPosPedCount;
  Int_t    *fNegPedSum;
  Int_t    *fNegPedSum2;
  Int_t    *fNegPedLimit;
  Int_t    *fNegPedCount;
  Float_t  *fA_Pos;          // [fNelem] Array of ADC amplitudes
  Float_t  *fA_Neg;          // [fNelem] Array of ADC amplitudes
  Float_t  *fA_Pos_p;	     // [fNelem] Array of ped-subtracted ADC amplitudes
  Float_t  *fA_Neg_p;	     // [fNelem] Array of ped-subtracted ADC amplitudes
  Float_t  *fT_Pos;          // [fNelem] Array of TDCs
  Float_t  *fT_Neg;          // [fNelem] Array of TDCs
  Double_t *fPosPed;
  Double_t *fPosSig;
  Double_t *fPosThresh;
  Double_t *fNegPed;
  Double_t *fNegSig;
  Double_t *fNegThresh;
  Double_t *fPosPedMean; 	/* Can be supplied in parameters and then */
  Double_t *fNegPedMean;	/* be overwritten from ped analysis */

  TClonesArray *fPosTDCHits;
  TClonesArray *fNegTDCHits;
  TClonesArray *fPosADCHits;
  TClonesArray *fNegADCHits;

  vector<Double_t> fPosNpeSixGev;
  vector<Double_t> fNegNpeSixGev;

  void Setup(const char* name, const char* description);
  void  DeleteArrays();
  void  DeletePedestalArrays();
  virtual void  InitializePedestals( );
  THcHodoscope* fglHod;		// Hodoscope to get start time

  ClassDef(THcAerogel,0)   // Generic aerogel class
}
;

#endif