#include "hdetpario.h"
#include "hpario.h"
#include "hrich700trb3lookup.h"
#include <fstream>
using namespace std;
ClassImp(HRich700Trb3LookupChan)
ClassImp(HRich700Trb3LookupTdc)
ClassImp(HRich700Trb3Lookup)
HRich700Trb3LookupTdc::HRich700Trb3LookupTdc()
{
   
   array = new TObjArray(HRICH700_MAXTDCCHANNELS);
   for (Int_t i = 0; i < HRICH700_MAXTDCCHANNELS; i++) array->AddAt(new HRich700Trb3LookupChan(), i);
}
HRich700Trb3LookupTdc::~HRich700Trb3LookupTdc()
{
   
   array->Delete();
   delete array;
}
void HRich700Trb3LookupTdc::clear()
{
   
   for (Int_t i = 0; i < getSize(); i++)(*this)[i].clear();
}
HRich700Trb3Lookup::HRich700Trb3Lookup(const Char_t* name,
                                     const Char_t* title,
                                     const Char_t* context,
                                     Int_t minTrbnetAddress,
                                     Int_t maxTrbnetAddress)
   : HParSet(name, title, context)
{
   
   arrayOffset = minTrbnetAddress;
   array = new TObjArray(maxTrbnetAddress - minTrbnetAddress + 1);
   arrayCursor=0;
}
HRich700Trb3Lookup::~HRich700Trb3Lookup()
{
   
   array->Delete();
   delete array;
}
Bool_t HRich700Trb3Lookup::init(HParIo* inp, Int_t* set)
{
   
   HDetParIo* input = inp->getDetParIo("HRichParIo");
   if (input) return (input->init(this, set));
   return kFALSE;
}
Int_t HRich700Trb3Lookup::write(HParIo* output)
{
   
   HDetParIo* out = output->getDetParIo("HRichParIo");
   if (out) return out->write(this);
   return -1;
}
void HRich700Trb3Lookup::clear()
{
   
   array->Delete();
   status = kFALSE;
   resetInputVersions();
}
void HRich700Trb3Lookup::resetTdcIterator()
{
	arrayCursor=0;
}
Int_t HRich700Trb3Lookup::getNextTdcAddress()
{
    Int_t address=0;
    HRich700Trb3LookupTdc* slot=0;
    if(arrayCursor>=getSize()) return 0; 
    for(Int_t n=arrayCursor;n<getSize();n++){
	slot= dynamic_cast<HRich700Trb3LookupTdc*> (array->At(n));
	if(slot){  
	    address     = n+arrayOffset;
	    arrayCursor = n+1; 
	    return address;
	}
	arrayCursor = n+1;
    }
    return address;
}
void HRich700Trb3Lookup::printParam()
{
   
   printf("Lookup table for the TRB3 unpacker of the RICH700 detector\n");
   printf("trbnet-address  channel  PMT  pixel\n");
   for (Int_t i = 0; i <= array->GetLast(); i++) {
      HRich700Trb3LookupTdc* b = (*this)[i];
      if (b) {
         for (Int_t j = 0; j < b->getSize(); j++) {
            HRich700Trb3LookupChan& chan = (*b)[j];
            Int_t pmt = chan.getPMT();
            if (pmt >= 0) {
               printf("0x%x %4i %5i %5i\n",
                      arrayOffset + i, j, pmt, chan.getPixel());
            }
         }
      }
   }
}
Bool_t HRich700Trb3Lookup::fill(Int_t id, Int_t chan, Int_t pmt, Int_t pix)
{
   
   Bool_t rc = kFALSE;
   HRich700Trb3LookupTdc* p = getTdc(id);
   if (!p) {
      p = new HRich700Trb3LookupTdc();
      array->AddAt(p, id - arrayOffset);
   }
   HRich700Trb3LookupChan* c = p->getChannel(chan);
   if (c) {
      c->fill(pmt, pix);
      rc = kTRUE;
   } else {
      Error("fill", "Invalid channel number %i", chan);
   }
   return rc;
}
Bool_t HRich700Trb3Lookup::readline(const Char_t *buf)
{
   
	
	Bool_t rc = kFALSE;
   Int_t id, chan, pmt, pix;
   Int_t n = sscanf(buf, " 0x%x %d %d %d", &id, &chan, &pmt, &pix);
   
   if (4 == n) {
      rc = fill(id, chan, pmt, pix);
   } else {
      if (n < 4) Error("readline", "Not enough values in line %s\n", buf);
      else     Error("readline", "Too many values in line %s\n", buf);
   }
   return rc;
}
void HRich700Trb3Lookup::putAsciiHeader(TString& header)
{
   
   header =
      "# Lookup table for the TRB3 unpacker of the RICH700 detector\n"
      "# Format:\n"
      "# trbnet-address  channel  pmt  pixel\n";
}
void HRich700Trb3Lookup::write(fstream& fout)
{
   
   for (Int_t i = 0; i <= array->GetLast(); i++) {
      HRich700Trb3LookupTdc* b = (*this)[i];
      if (b) {
         for (Int_t j = 0; j < b->getSize(); j++) {
            HRich700Trb3LookupChan& chan = (*b)[j];
            Int_t pmt = chan.getPMT();
            if (pmt >= 0) {
               fout << "0x" << hex << (arrayOffset + i) << dec << setw(5) << j
                    << setw(5) << pmt << setw(5) << chan.getPixel() << '\n';
            }
         }
      }
   }
}
 hrich700trb3lookup.cc:100  hrich700trb3lookup.cc:101  hrich700trb3lookup.cc:102  hrich700trb3lookup.cc:103  hrich700trb3lookup.cc:104  hrich700trb3lookup.cc:105  hrich700trb3lookup.cc:106  hrich700trb3lookup.cc:107  hrich700trb3lookup.cc:108  hrich700trb3lookup.cc:109  hrich700trb3lookup.cc:110  hrich700trb3lookup.cc:111  hrich700trb3lookup.cc:112  hrich700trb3lookup.cc:113  hrich700trb3lookup.cc:114  hrich700trb3lookup.cc:115  hrich700trb3lookup.cc:116  hrich700trb3lookup.cc:117  hrich700trb3lookup.cc:118  hrich700trb3lookup.cc:119  hrich700trb3lookup.cc:120  hrich700trb3lookup.cc:121  hrich700trb3lookup.cc:122  hrich700trb3lookup.cc:123  hrich700trb3lookup.cc:124  hrich700trb3lookup.cc:125  hrich700trb3lookup.cc:126  hrich700trb3lookup.cc:127  hrich700trb3lookup.cc:128  hrich700trb3lookup.cc:129  hrich700trb3lookup.cc:130  hrich700trb3lookup.cc:131  hrich700trb3lookup.cc:132  hrich700trb3lookup.cc:133  hrich700trb3lookup.cc:134  hrich700trb3lookup.cc:135  hrich700trb3lookup.cc:136  hrich700trb3lookup.cc:137  hrich700trb3lookup.cc:138  hrich700trb3lookup.cc:139  hrich700trb3lookup.cc:140  hrich700trb3lookup.cc:141  hrich700trb3lookup.cc:142  hrich700trb3lookup.cc:143  hrich700trb3lookup.cc:144  hrich700trb3lookup.cc:145  hrich700trb3lookup.cc:146  hrich700trb3lookup.cc:147  hrich700trb3lookup.cc:148  hrich700trb3lookup.cc:149  hrich700trb3lookup.cc:150  hrich700trb3lookup.cc:151  hrich700trb3lookup.cc:152  hrich700trb3lookup.cc:153  hrich700trb3lookup.cc:154  hrich700trb3lookup.cc:155  hrich700trb3lookup.cc:156  hrich700trb3lookup.cc:157  hrich700trb3lookup.cc:158  hrich700trb3lookup.cc:159  hrich700trb3lookup.cc:160  hrich700trb3lookup.cc:161  hrich700trb3lookup.cc:162  hrich700trb3lookup.cc:163  hrich700trb3lookup.cc:164  hrich700trb3lookup.cc:165  hrich700trb3lookup.cc:166  hrich700trb3lookup.cc:167  hrich700trb3lookup.cc:168  hrich700trb3lookup.cc:169  hrich700trb3lookup.cc:170  hrich700trb3lookup.cc:171  hrich700trb3lookup.cc:172  hrich700trb3lookup.cc:173  hrich700trb3lookup.cc:174  hrich700trb3lookup.cc:175  hrich700trb3lookup.cc:176  hrich700trb3lookup.cc:177  hrich700trb3lookup.cc:178  hrich700trb3lookup.cc:179  hrich700trb3lookup.cc:180  hrich700trb3lookup.cc:181  hrich700trb3lookup.cc:182  hrich700trb3lookup.cc:183  hrich700trb3lookup.cc:184  hrich700trb3lookup.cc:185  hrich700trb3lookup.cc:186  hrich700trb3lookup.cc:187  hrich700trb3lookup.cc:188  hrich700trb3lookup.cc:189  hrich700trb3lookup.cc:190  hrich700trb3lookup.cc:191  hrich700trb3lookup.cc:192  hrich700trb3lookup.cc:193  hrich700trb3lookup.cc:194  hrich700trb3lookup.cc:195  hrich700trb3lookup.cc:196  hrich700trb3lookup.cc:197  hrich700trb3lookup.cc:198  hrich700trb3lookup.cc:199  hrich700trb3lookup.cc:200  hrich700trb3lookup.cc:201  hrich700trb3lookup.cc:202  hrich700trb3lookup.cc:203  hrich700trb3lookup.cc:204  hrich700trb3lookup.cc:205