using namespace std;
#include "hemcparrootfileio.h"
#include "hades.h"
#include "hspectrometer.h"
#include "hemcdetector.h"
#include "hemctrb3lookup.h"
#include "hemccalpar.h"
#include "hemcgeompar.h"
#include <iostream> 
#include <iomanip>
ClassImp(HEmcParRootFileIo)
HEmcParRootFileIo::HEmcParRootFileIo(HParRootFile* f) : HDetParRootFileIo(f) {
  
  fName="HEmcParIo";
  HDetector* det=gHades->getSetup()->getDetector("Emc");
  Int_t n = det->getMaxSectors();
  initModules=new TArrayI(n);
}
HEmcParRootFileIo::~HEmcParRootFileIo(void) {
  
  if (initModules) {
    delete initModules;
    initModules=0;
  }
}
Bool_t HEmcParRootFileIo::init(HParSet* pPar,Int_t* set) {
  
  
  
  
  if (!isActiv) readModules("Emc");
  const Text_t* name=pPar->GetName();
  if (pFile) {
    if (0 == strncmp(name, "EmcTrb3Lookup", strlen("EmcTrb3Lookup"))) {
      return HDetParRootFileIo::read((HEmcTrb3Lookup*)pPar);
    }
    if (0 == strncmp(name, "EmcCalPar", strlen("EmcCalPar"))) {
      return read((HEmcCalPar*)pPar,set);
    }
    if (0 == strncmp(name,"EmcGeomPar", strlen("EmcGeomPar"))) {
      return HDetParRootFileIo::read((HEmcGeomPar*)pPar,set);
    }
  }
  Error("init(HParSet*,Int_t*)","Initialization of %s not possible from ASCII file",name);
  return kFALSE;
}
Bool_t HEmcParRootFileIo::read(HEmcCalPar* pPar, Int_t* set) {
  
  Text_t* name = (Char_t*)pPar->GetName();
  Int_t version = findInputVersion(name);
  if (version <= 0) {
    pPar->setInputVersion(-1, inputNumber);
    return kFALSE;    
  }
  if (pPar->getInputVersion(inputNumber) == version
      && pPar->getInputVersion(inputNumber) != -1) return kTRUE;
  
  pPar->clear();
  HEmcCalPar* rPar = (HEmcCalPar*)findContainer(name, version);
  Bool_t allFound = kTRUE;
  initModules->Reset();
  for (Int_t m = 0; m < pPar->getSize(); m++) {
    if (set[m]) {
      HEmcCalParSec& r = (*rPar)[m];
      HEmcCalParSec& p = (*pPar)[m];
      Int_t pSecSize = p.getSize();
      if (pSecSize && r.getSize() == pSecSize) {
        for (Int_t c = 0; c < pSecSize; c++) p[c].fill(r[c]);
        initModules->AddAt(m + 1, m);
      } else allFound = kFALSE;
    }
  }
  if (allFound) {
    pPar->setInputVersion(version, inputNumber);
    pPar->setChanged();
    cout << name << " initialized from ROOT file" << endl;
  }
  delete rPar;
  return allFound;
}