#ifndef HTRB3CALPAR_H
#define HTRB3CALPAR_H
#include "TObjArray.h"
#include "TObject.h"
#include "TArrayF.h"
#include "hparset.h"
#include "htrbnetdef.h"
#include <fstream>
using namespace Trbnet;
using namespace std;
class HTrb3CalparTdc: public TObject {
protected:
  Int_t   subEvtId;        
  Int_t   nChannels;       
  Int_t   nBinsPerChannel; 
  Int_t   nEdgesMask;      
  TArrayF binsPar;         
public:
  HTrb3CalparTdc(void);
  ~HTrb3CalparTdc(void) {}
  Int_t getSubEvtId(void)        { return subEvtId; }
  Int_t getEdgesMask(void)       { return nEdgesMask; }
  Int_t getNChannels(void)       { return nChannels; }
  Int_t getNBinsPerChannel(void) { return nBinsPerChannel; }
  Float_t* getBinsPar(void)      { return binsPar.GetArray(); }
  Int_t getArraySize(void)       { return binsPar.GetSize(); }
  Float_t* getRisingArr(Int_t chan) {
    return nEdgesMask & 1 ? getBinsPar() + chan*nBinsPerChannel : 0;
  }
  Float_t* getFallingArr(Int_t chan) {
     switch (nEdgesMask & 3) {
        case 2: return getBinsPar() + chan*nBinsPerChannel;
        case 3: return getBinsPar() + (chan+nChannels)*nBinsPerChannel;
        default: return 0;
     }
  }
  Float_t getRisingPar(Int_t chan,Int_t bin) const {
    return nEdgesMask & 1 ? binsPar[chan*nBinsPerChannel+bin] : 0.F;
  }
  Float_t getFallingPar(Int_t chan,Int_t bin) const {
     switch (nEdgesMask & 3) { 
        case 2: return binsPar[chan*nBinsPerChannel+bin];
        case 3: return binsPar[(chan+nChannels)*nBinsPerChannel+bin];
        default: return 0.F;
     }
    return 0.F;
  }
  void clear(void);
  Int_t makeArray(Int_t,Int_t,Int_t,Int_t);
  Bool_t fillArray(Float_t*,Int_t);
  Bool_t loadFromBinaryFile(const char* filename, Int_t subevtid, Int_t numBins=600, Int_t nEdgesMask=1);
  void setSimpleFineCalibration(UInt_t, UInt_t);
  void print(void);
  void write(fstream&);
  ClassDef(HTrb3CalparTdc, 1) 
};
class HTrb3Calpar : public HParSet {
protected:
   TObjArray* array;       
   Int_t      arrayOffset; 
public:
   HTrb3Calpar(const Char_t* name = "",
               const Char_t* title = "",
               const Char_t* context = "",
               Int_t minTrbnetAddress = -1,
               Int_t maxTrbnetAddress = -1);
   virtual ~HTrb3Calpar();
   HTrb3CalparTdc* getTdc(Int_t trbnetAddress) {
      return (trbnetAddress<arrayOffset) ? 0 : (HTrb3CalparTdc*)(array->At(trbnetAddress - arrayOffset));
   }
   HTrb3CalparTdc* operator[](Int_t i) {
      return static_cast<HTrb3CalparTdc*>((*array)[i]);
   }
   Int_t getSize() {
      return array->GetLast() + 1;
   }
   Int_t getArrayOffset() {
      return arrayOffset;
   }
   virtual Bool_t init(HParIo* input, Int_t* set) {return kFALSE;}
   virtual Int_t write(HParIo* output)            {return -1;}
   void clear();
   HTrb3CalparTdc* addTdc(Int_t);
   void printParam();
   virtual void putAsciiHeader(TString&);
   void write(fstream&);
   Bool_t loadFromBinaryFiles(const char* basefname, Int_t subevtid, Int_t numBins=600, Int_t nEdgesMask=1);
   ClassDef(HTrb3Calpar, 1) 
};
#endif  /*!HTRB3CALPAR_H*/