using namespace std;
#include "hades.h"
#include "hdetpario.h"
#include "hpario.h"
#include "hspectrometer.h"
#include "hpiontrackercalpar.h"
#include "hpiontrackerdetector.h"
#include <iomanip>
#include <iostream>
#include <fstream>
ClassImp(HPionTrackerCalPar)
ClassImp(HPionTrackerCalParMod)
ClassImp(HPionTrackerCalParCell)
void HPionTrackerCalParCell::clear() {
  tdcSlope  = 1.F;
  tdcOffset = 0.F;
  adcSlope  = 1.F;
  adcOffset = 0.F;
}
void HPionTrackerCalParCell::fill(Float_t ts, Float_t to, Float_t as, Float_t ao) {
  tdcSlope = ts;
  tdcOffset = to;
  adcSlope = as;
  adcOffset = ao;
}
void HPionTrackerCalParCell::fill(Float_t* data) {
  tdcSlope = data[0];
  tdcOffset = data[1];
  adcSlope = data[2];
  adcOffset = data[3];
}
void HPionTrackerCalParCell::fill(HPionTrackerCalParCell& r) {
  tdcSlope  = r.getTdcSlope();
  tdcOffset = r.getTdcOffset();
  adcSlope  = r.getAdcSlope();
  adcOffset = r.getAdcOffset();
}
HPionTrackerCalParMod::HPionTrackerCalParMod(Int_t n) {
  
  array = new TObjArray(n);
  for (Int_t i = 0 ; i < n ; i++) {
    array->AddAt(new HPionTrackerCalParCell(), i);
  }
}
HPionTrackerCalParMod::~HPionTrackerCalParMod() {
  
  array->Delete();
  delete array;
}
HPionTrackerCalPar::HPionTrackerCalPar(const Char_t* name, const Char_t* title,
                             const Char_t* context)
                   : HParSet(name, title, context) {
  
  strcpy(detName, "PionTracker");
  HPionTrackerDetector* det = (HPionTrackerDetector*)(gHades->getSetup()->getDetector("PionTracker"));
  Int_t nMod = det->getMaxModInSetup();
  Int_t nComp = det->getMaxComponents();
  array = new TObjArray(nMod);
  for (Int_t i = 0; i < nMod; i++) {
    if (det->getModule(-1, i) > 0) {
      array->AddAt(new HPionTrackerCalParMod(nComp), i);
    } else {
      array->AddAt(new HPionTrackerCalParMod(0), i);
    }
  }
}
HPionTrackerCalPar::~HPionTrackerCalPar() {
  
  array->Delete();
  delete array;
}
Bool_t HPionTrackerCalPar::init(HParIo* inp, Int_t* set) {
  
  HDetParIo* input = inp->getDetParIo("HPionTrackerParIo");
  if (input) return (input->init(this, set));
  return kFALSE;
}
Int_t HPionTrackerCalPar::write(HParIo* output) {
  
  HDetParIo* out = output->getDetParIo("HPionTrackerParIo");
  if (out) return out->write(this);
  return -1;
}
void HPionTrackerCalPar::clear() {
  
  for (Int_t i = 0; i < getSize(); i++) {
    HPionTrackerCalParMod& mod = (*this)[i];
    for (Int_t j = 0; j < mod.getSize(); j++) mod[j].clear();
  }
  status = kFALSE;
  resetInputVersions();
}
void HPionTrackerCalPar::printParams() {
  
  printf("Calibration parameters for the PionTracker\n");
  printf("module  strip  TdcSlope  TdcOffset  AdcSlope  AdcOffset\n");
  Float_t data[4];
  for (Int_t i = 0; i < getSize(); i++) {
    HPionTrackerCalParMod& mod = (*this)[i];
    for (Int_t j = 0; j < mod.getSize(); j++) {
      HPionTrackerCalParCell& cell = mod[j];
      cell.getData(data);
      printf("%4i %4i %10.5f %10.3f %10.5f %10.3f\n",
             i, j, data[0], data[1], data[2], data[3]);
    }
  }
}
void HPionTrackerCalPar::readline(const Char_t *buf, Int_t *set) {
  
  Int_t mod, strip;
  Float_t data[4] = {0.F, 0.F, 0.F, 0.F};
  sscanf(buf, "%i%i%f%f%f%f", &mod, &strip, &data[0], &data[1], &data[2], &data[3]);
  if (!set[mod]) return;
  (*this)[mod][strip].fill(data);
  set[mod] = 999;
}
void HPionTrackerCalPar::putAsciiHeader(TString& header) {
  
  header = "# Calibration parameters for the PionTracker\n"
           "# Format:\n"
           "# module   strip   TdcSlope  TdcOffset AdcSlope  AdcOffset\n";
}
void HPionTrackerCalPar::write(fstream& fout) {
  Text_t buf[155];
  Float_t data[4];
  for (Int_t i = 0; i < getSize(); i++) {
    HPionTrackerCalParMod& mod = (*this)[i];
    for (Int_t j = 0; j < mod.getSize(); j++) {
      HPionTrackerCalParCell& cell = mod[j];
      cell.getData(data);
      sprintf(buf, "%4i %4i %10.5f %10.1f %10.5f %10.1f\n",
              i, j, data[0], data[1], data[2], data[3]);
      fout<<buf;
    }
  }
  
}
 hpiontrackercalpar.cc:100  hpiontrackercalpar.cc:101  hpiontrackercalpar.cc:102  hpiontrackercalpar.cc:103  hpiontrackercalpar.cc:104  hpiontrackercalpar.cc:105  hpiontrackercalpar.cc:106  hpiontrackercalpar.cc:107  hpiontrackercalpar.cc:108  hpiontrackercalpar.cc:109  hpiontrackercalpar.cc:110  hpiontrackercalpar.cc:111  hpiontrackercalpar.cc:112  hpiontrackercalpar.cc:113  hpiontrackercalpar.cc:114  hpiontrackercalpar.cc:115  hpiontrackercalpar.cc:116  hpiontrackercalpar.cc:117  hpiontrackercalpar.cc:118  hpiontrackercalpar.cc:119  hpiontrackercalpar.cc:120  hpiontrackercalpar.cc:121  hpiontrackercalpar.cc:122  hpiontrackercalpar.cc:123  hpiontrackercalpar.cc:124  hpiontrackercalpar.cc:125  hpiontrackercalpar.cc:126  hpiontrackercalpar.cc:127  hpiontrackercalpar.cc:128  hpiontrackercalpar.cc:129  hpiontrackercalpar.cc:130  hpiontrackercalpar.cc:131  hpiontrackercalpar.cc:132  hpiontrackercalpar.cc:133  hpiontrackercalpar.cc:134  hpiontrackercalpar.cc:135  hpiontrackercalpar.cc:136  hpiontrackercalpar.cc:137  hpiontrackercalpar.cc:138  hpiontrackercalpar.cc:139  hpiontrackercalpar.cc:140  hpiontrackercalpar.cc:141  hpiontrackercalpar.cc:142  hpiontrackercalpar.cc:143  hpiontrackercalpar.cc:144  hpiontrackercalpar.cc:145  hpiontrackercalpar.cc:146  hpiontrackercalpar.cc:147  hpiontrackercalpar.cc:148  hpiontrackercalpar.cc:149  hpiontrackercalpar.cc:150  hpiontrackercalpar.cc:151  hpiontrackercalpar.cc:152  hpiontrackercalpar.cc:153  hpiontrackercalpar.cc:154  hpiontrackercalpar.cc:155  hpiontrackercalpar.cc:156  hpiontrackercalpar.cc:157  hpiontrackercalpar.cc:158  hpiontrackercalpar.cc:159  hpiontrackercalpar.cc:160  hpiontrackercalpar.cc:161  hpiontrackercalpar.cc:162  hpiontrackercalpar.cc:163  hpiontrackercalpar.cc:164