#ifndef HRPCCALPAR_H
#define HRPCCALPAR_H
#include "TObject.h"
#include "TObjArray.h"
#include "hlocation.h"
#include "hparset.h"
class HRpcCalParCell: public TObject {
 private:
  Float_t rightTimeOffset;   
  Float_t leftTimeOffset;    
  Float_t rightTotOffset;    
  Float_t leftTotOffset;     
  Float_t tdc2time;          
  Float_t tot2charge;        
  Float_t t0;                
 public:
  HRpcCalParCell(void) {clear();}
  ~HRpcCalParCell(void) {}
  
  Float_t getRightTimeOffset() { return rightTimeOffset; }
  Float_t getLeftTimeOffset()  { return leftTimeOffset; }
  Float_t getRightTOTOffset()  { return rightTotOffset; }
  Float_t getLeftTOTOffset()   { return leftTotOffset; }
  Float_t getTDC2Time()        { return tdc2time; }
  Float_t getTOT2Charge()      { return tot2charge; }
  Float_t getT0()              { return t0;}
  void getAddress(Float_t& rtimoff, Float_t& ltimoff, Float_t& rtotoff, Float_t& ltotoff, Float_t& t2t,
		  Float_t& t2c,Float_t& tzero) {
    rtimoff = rightTimeOffset;
    ltimoff = leftTimeOffset;
    rtotoff = rightTotOffset;
    ltotoff = leftTotOffset;
    t2t     = tdc2time;
    t2c     = tot2charge;
    tzero   = t0;
  }
  void fill(const Float_t rtimoff, const Float_t ltimoff, const Float_t rtotoff, const Float_t ltotoff,
	    const Float_t t2t, const Float_t t2c, const Float_t tzero) {
    rightTimeOffset  =  rtimoff;
    leftTimeOffset   =  ltimoff;
    rightTotOffset   =  rtotoff;
    leftTotOffset    =  ltotoff;
    tdc2time         =  t2t;
    tot2charge       =  t2c;
    t0               =  tzero;
  }
  
  void fill(HRpcCalParCell& cell) {
    rightTimeOffset  =  cell.getRightTimeOffset();
    leftTimeOffset   =  cell.getLeftTimeOffset();
    rightTotOffset   =  cell.getRightTOTOffset();
    leftTotOffset    =  cell.getLeftTOTOffset();
    tdc2time         =  cell.getTDC2Time();
    tot2charge       =  cell.getTOT2Charge();
    t0               =  cell.getT0();
  }
  
  void setRightTimeOffset(Float_t rtimoff ) { rightTimeOffset = rtimoff; }
  void setLeftTimeOffset(Float_t ltimoff)   { leftTimeOffset = ltimoff;  }
  void setRightTOTOffset(Float_t rtotoff)   { rightTotOffset = rtotoff;  }
  void setLeftTOTOffset(Float_t ltotoff)    { leftTotOffset = ltotoff;   }
  void setTDC2Time(Float_t t2t)             { tdc2time = t2t;            } 
  void setTOT2Charge(Float_t t2c)           { tot2charge = t2c;          }
  void setT0(Float_t tzero)                 { t0 = tzero;                }
  void clear();
  ClassDef(HRpcCalParCell,1)  
};
class HRpcCalParCol: public TObject {
 private:
  TObjArray* array;    
  Int_t MaxCells;      
 public:
  HRpcCalParCol();
  ~HRpcCalParCol();
  HRpcCalParCell& operator[](Int_t i) {
    return *static_cast<HRpcCalParCell*>((*array)[i]);
  }
  HRpcCalParCell* getCell(Int_t cell) {
    if (cell>=0 && cell<MaxCells) return &((*this)[cell]);
    else return 0;
  }
  Int_t getSize() { return array->GetEntries(); }
  void fill(Int_t,Float_t,Float_t,Float_t,Float_t,Float_t,Float_t,Float_t);
  ClassDef(HRpcCalParCol,1)   
};
class HRpcCalParSec: public TObject {
 private:
  TObjArray* array;     
  Int_t MaxColumns;     
 public:
  HRpcCalParSec();
  ~HRpcCalParSec();
  HRpcCalParCol& operator[](Int_t i) {
    return *static_cast<HRpcCalParCol*>((*array)[i]);
  }
  HRpcCalParCol* getCol(Int_t col) {
    if (col>=0 && col<MaxColumns) return &((*this)[col]);
    else return 0;
  }
  Int_t getSize() { return array->GetEntries(); }
  void fill(Int_t,Int_t,Float_t,Float_t,Float_t,Float_t,Float_t,Float_t,Float_t);
  ClassDef(HRpcCalParSec,1) 
};
class HRpcCalPar : public HParSet {
 private:
  TObjArray* array;       
  Int_t MaxSectors;       
  void printPause(void);
 public:
  HRpcCalPar(const Char_t* name="RpcCalPar",
	     const Char_t* title="Calibration parameters for the Rpc Detector",
	     const Char_t* context="RpcCalProduction");
  ~HRpcCalPar(void);
  HRpcCalParSec& operator[](Int_t i) {
    return *static_cast<HRpcCalParSec*>((*array)[i]);
  }
  HRpcCalParCol* getCol(Int_t sec, Int_t col) {
    if (sec>=0 && sec<MaxSectors) return (*this)[sec].getCol(col);
    else return 0;
  }
  Int_t getSize() { return array->GetEntries(); }
  Bool_t init(HParIo*,Int_t*);
  Int_t write(HParIo*);
  void clear();
  void printParam();
  void fill(Int_t,Int_t,Int_t,Float_t,Float_t,Float_t,Float_t,Float_t,Float_t,Float_t);
  void readline(const Char_t*, Int_t*);
  void putAsciiHeader(TString&);
  Bool_t writeline(Char_t*, Int_t, Int_t, Int_t);
  ClassDef(HRpcCalPar,1)  
};
#endif /* !HRPCCALPAR_H */