#include "hades.h"
#include "hcategory.h"
#include "hdebug.h"
#include "hevent.h"
#include "heventheader.h"
#include "hldsource.h"
#include "hldsubevt.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hstart2detector.h"
#include "hstart2raw.h"
#include "hstart2trb2lookup.h"
#include "hstart2trb2unpacker.h"
#include "hstartdef.h"
#include "htrb2correction.h"
#include "htrbnetaddressmapping.h"
#include "htrbnetunpacker.h"
#include <iostream>
using namespace std;
ClassImp(HStart2Trb2Unpacker)
HStart2Trb2Unpacker::HStart2Trb2Unpacker(UInt_t id): HTrb2Unpacker(id)
{
   
   pRawCat = NULL;
   timeRef = kTRUE;
}
Bool_t HStart2Trb2Unpacker::init(void)
{
   
   HStart2Detector* det = (HStart2Detector*)gHades->getSetup()->getDetector("Start");
   if (!det) {
      Error("init", "No Start Detector found.");
      return kFALSE;
   }
   pRawCat = det->buildCategory(catStart2Raw);
   loc.set(2, 0, 0);
   lookup = (HStart2Trb2Lookup*)(gHades->getRuntimeDb()->getContainer("Start2Trb2Lookup"));
   if (!lookup) {
      Error("init", "No Pointer to parameter container Start2Trb2Lookup.");
      return kFALSE;
   }
   
   if (correctINL) {
      trbaddressmap = (HTrbnetAddressMapping*)(gHades->getRuntimeDb()->getContainer("TrbnetAddressMapping"));
      if (!trbaddressmap) {
         Error("init", "No Pointer to parameter container TrbnetAddressMapping.");
         return kFALSE;
      }
   }
   if (NULL == trbNetUnpacker) {
      if (gHades->getDataSource()) {
         HDataSource* source = gHades->getDataSource();
         if (source->InheritsFrom("HldSource")) {
            trbNetUnpacker = ((HldSource *)gHades->getDataSource())->getTrbNetUnpacker();
         } else {
            Warning("init", "DataSource not inherited from HldSource! trbNetUnpacker == 0 ");
         }
      } else {
         Warning("init", "Could not retrieve DataSource! trbNetUnpacker == 0 ");
      }
   }
   if (!trbNetUnpacker->init()) {
      Error("init()", "Failed to initialize HTrbNetUnpacker!");
      return kFALSE;
   }
   return kTRUE;
}
Bool_t HStart2Trb2Unpacker::finalize(void)
{
   
   if (!quietMode && debugFlag > 0) {
      Info("finalize", "No control histograms implemented");
   }
   return kTRUE;
}
Int_t HStart2Trb2Unpacker::execute(void)
{
   HStart2Raw *pRaw = 0;  
   Int_t nEvt = 0;        
   if (gHades->isCalibration()) {
      
      return 1;
   }
   if (gHades->getCurrentEvent()->getHeader()->getId() == 0xe) {
      
      return 1;
   }
   
   if (pSubEvt) {        
      nEvt = gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();
      
      
      
      
      
      
      
      Int_t DecodeOutput = 1;
      while (1) {
         DecodeOutput = decode();
         
         uStartPosition = uStartPosition + uSubBlockSize + 1; 
         if (DecodeOutput == 0) { 
            Error("decode", "subsubevent decoding failed!!! Evt Nr : %i SubEvtId: %x", nEvt, subEvtId);
            break;
         }
         if (DecodeOutput == 10) { 
            if (debugFlag > 0) Info("decode", "CTS info -> DecodeOutput : %i", DecodeOutput);
            continue;
         }
         if (DecodeOutput == 100) { 
            uStartPosition = 0;
            if (debugFlag > 0) Info("decode", "DecodeOutput : %i", DecodeOutput);
            break;
         }
         
         
         
         
         if (timeRef) {
            
            if (highResModeOn) correctRefTimeStartDet23();
            else correctRefTimeCh(32);
         }
         
         HStart2Trb2LookupBoard *board = lookup->getBoard(uTrbNetAdress);
         if (!board) {
            Warning("execute", "Evt Nr : %i  TrbNetAdress: %x (%i) unpacked but TRB Board not in lookup table", nEvt, uTrbNetAdress, uTrbNetAdress);
	    
            continue;
         }
         
         for (Int_t i = 0; i < board->getSize(); i++) {
            if (trbLeadingMult[i] < 1) continue;         
            
            
            
            HStart2Trb2LookupChan *chan = board->getChannel(i);
            
            chan->getAddress(loc[0], loc[1]);
            if (loc[0] >= 0) {
               pRaw = (HStart2Raw*)pRawCat->getObject(loc);
               if (!pRaw) {
                  pRaw = (HStart2Raw *)pRawCat->getSlot(loc);
                  if (pRaw) {
                     pRaw = new(pRaw) HStart2Raw;
                     pRaw->setAddress(loc[0], loc[1]);
                  } else {
                     Error("execute()", "Can't get slot mod=%i, chan=%i", loc[0], loc[1]);
                     return -1;
                  }
               } else {
                  Error("execute()", "Slot already exists for mod=%i, chan=%i", loc[0], loc[1]);
                  return -1;
               }
               
               Int_t m;
               m = trbLeadingMult[i];
               if (m > 10) {
                  m = 10; 
               }
               for (Int_t chmult = 0; chmult < m; chmult++) {
                  if (debugFlag > 0) {
                     cout << "--filling data" << " time: " << trbLeadingTime[i][chmult] << endl;
                  }
                  pRaw->setTimeAndWidth(trbLeadingTime[i][chmult], trbADC[i][chmult]);
		  if (debugFlag > 0 && chmult < pRaw->getMaxMultiplicity()) {
		      cout << "--get data from raw" << " time: " << pRaw->getTime(chmult + 1) << endl;
                  }
               }
            } 
         } 
      } 
   }  
   return 1;
}
 hstart2trb2unpacker.cc:10  hstart2trb2unpacker.cc:11  hstart2trb2unpacker.cc:12  hstart2trb2unpacker.cc:13  hstart2trb2unpacker.cc:14  hstart2trb2unpacker.cc:15  hstart2trb2unpacker.cc:16  hstart2trb2unpacker.cc:17  hstart2trb2unpacker.cc:18  hstart2trb2unpacker.cc:19  hstart2trb2unpacker.cc:20  hstart2trb2unpacker.cc:21  hstart2trb2unpacker.cc:22  hstart2trb2unpacker.cc:23  hstart2trb2unpacker.cc:24  hstart2trb2unpacker.cc:25  hstart2trb2unpacker.cc:26  hstart2trb2unpacker.cc:27  hstart2trb2unpacker.cc:28  hstart2trb2unpacker.cc:29  hstart2trb2unpacker.cc:30  hstart2trb2unpacker.cc:31  hstart2trb2unpacker.cc:32  hstart2trb2unpacker.cc:33  hstart2trb2unpacker.cc:34  hstart2trb2unpacker.cc:35  hstart2trb2unpacker.cc:36  hstart2trb2unpacker.cc:37  hstart2trb2unpacker.cc:38  hstart2trb2unpacker.cc:39  hstart2trb2unpacker.cc:40  hstart2trb2unpacker.cc:41  hstart2trb2unpacker.cc:42  hstart2trb2unpacker.cc:43  hstart2trb2unpacker.cc:44  hstart2trb2unpacker.cc:45  hstart2trb2unpacker.cc:46  hstart2trb2unpacker.cc:47  hstart2trb2unpacker.cc:48  hstart2trb2unpacker.cc:49  hstart2trb2unpacker.cc:50  hstart2trb2unpacker.cc:51  hstart2trb2unpacker.cc:52  hstart2trb2unpacker.cc:53  hstart2trb2unpacker.cc:54  hstart2trb2unpacker.cc:55  hstart2trb2unpacker.cc:56  hstart2trb2unpacker.cc:57  hstart2trb2unpacker.cc:58  hstart2trb2unpacker.cc:59  hstart2trb2unpacker.cc:60  hstart2trb2unpacker.cc:61  hstart2trb2unpacker.cc:62  hstart2trb2unpacker.cc:63  hstart2trb2unpacker.cc:64  hstart2trb2unpacker.cc:65  hstart2trb2unpacker.cc:66  hstart2trb2unpacker.cc:67  hstart2trb2unpacker.cc:68  hstart2trb2unpacker.cc:69  hstart2trb2unpacker.cc:70  hstart2trb2unpacker.cc:71  hstart2trb2unpacker.cc:72  hstart2trb2unpacker.cc:73  hstart2trb2unpacker.cc:74  hstart2trb2unpacker.cc:75  hstart2trb2unpacker.cc:76  hstart2trb2unpacker.cc:77  hstart2trb2unpacker.cc:78  hstart2trb2unpacker.cc:79  hstart2trb2unpacker.cc:80  hstart2trb2unpacker.cc:81  hstart2trb2unpacker.cc:82  hstart2trb2unpacker.cc:83  hstart2trb2unpacker.cc:84  hstart2trb2unpacker.cc:85  hstart2trb2unpacker.cc:86  hstart2trb2unpacker.cc:87  hstart2trb2unpacker.cc:88  hstart2trb2unpacker.cc:89  hstart2trb2unpacker.cc:90  hstart2trb2unpacker.cc:91  hstart2trb2unpacker.cc:92  hstart2trb2unpacker.cc:93  hstart2trb2unpacker.cc:94  hstart2trb2unpacker.cc:95  hstart2trb2unpacker.cc:96  hstart2trb2unpacker.cc:97  hstart2trb2unpacker.cc:98  hstart2trb2unpacker.cc:99  hstart2trb2unpacker.cc:100  hstart2trb2unpacker.cc:101  hstart2trb2unpacker.cc:102  hstart2trb2unpacker.cc:103  hstart2trb2unpacker.cc:104  hstart2trb2unpacker.cc:105  hstart2trb2unpacker.cc:106  hstart2trb2unpacker.cc:107  hstart2trb2unpacker.cc:108  hstart2trb2unpacker.cc:109  hstart2trb2unpacker.cc:110  hstart2trb2unpacker.cc:111  hstart2trb2unpacker.cc:112  hstart2trb2unpacker.cc:113  hstart2trb2unpacker.cc:114  hstart2trb2unpacker.cc:115  hstart2trb2unpacker.cc:116  hstart2trb2unpacker.cc:117  hstart2trb2unpacker.cc:118  hstart2trb2unpacker.cc:119  hstart2trb2unpacker.cc:120  hstart2trb2unpacker.cc:121  hstart2trb2unpacker.cc:122  hstart2trb2unpacker.cc:123  hstart2trb2unpacker.cc:124  hstart2trb2unpacker.cc:125  hstart2trb2unpacker.cc:126  hstart2trb2unpacker.cc:127  hstart2trb2unpacker.cc:128  hstart2trb2unpacker.cc:129  hstart2trb2unpacker.cc:130  hstart2trb2unpacker.cc:131  hstart2trb2unpacker.cc:132  hstart2trb2unpacker.cc:133  hstart2trb2unpacker.cc:134  hstart2trb2unpacker.cc:135  hstart2trb2unpacker.cc:136  hstart2trb2unpacker.cc:137  hstart2trb2unpacker.cc:138  hstart2trb2unpacker.cc:139  hstart2trb2unpacker.cc:140  hstart2trb2unpacker.cc:141  hstart2trb2unpacker.cc:142  hstart2trb2unpacker.cc:143  hstart2trb2unpacker.cc:144  hstart2trb2unpacker.cc:145  hstart2trb2unpacker.cc:146  hstart2trb2unpacker.cc:147  hstart2trb2unpacker.cc:148  hstart2trb2unpacker.cc:149  hstart2trb2unpacker.cc:150  hstart2trb2unpacker.cc:151  hstart2trb2unpacker.cc:152  hstart2trb2unpacker.cc:153  hstart2trb2unpacker.cc:154  hstart2trb2unpacker.cc:155  hstart2trb2unpacker.cc:156  hstart2trb2unpacker.cc:157  hstart2trb2unpacker.cc:158  hstart2trb2unpacker.cc:159  hstart2trb2unpacker.cc:160  hstart2trb2unpacker.cc:161  hstart2trb2unpacker.cc:162  hstart2trb2unpacker.cc:163  hstart2trb2unpacker.cc:164  hstart2trb2unpacker.cc:165  hstart2trb2unpacker.cc:166  hstart2trb2unpacker.cc:167  hstart2trb2unpacker.cc:168  hstart2trb2unpacker.cc:169  hstart2trb2unpacker.cc:170  hstart2trb2unpacker.cc:171  hstart2trb2unpacker.cc:172  hstart2trb2unpacker.cc:173  hstart2trb2unpacker.cc:174  hstart2trb2unpacker.cc:175  hstart2trb2unpacker.cc:176  hstart2trb2unpacker.cc:177  hstart2trb2unpacker.cc:178  hstart2trb2unpacker.cc:179  hstart2trb2unpacker.cc:180  hstart2trb2unpacker.cc:181  hstart2trb2unpacker.cc:182  hstart2trb2unpacker.cc:183  hstart2trb2unpacker.cc:184  hstart2trb2unpacker.cc:185  hstart2trb2unpacker.cc:186  hstart2trb2unpacker.cc:187  hstart2trb2unpacker.cc:188  hstart2trb2unpacker.cc:189  hstart2trb2unpacker.cc:190  hstart2trb2unpacker.cc:191  hstart2trb2unpacker.cc:192  hstart2trb2unpacker.cc:193  hstart2trb2unpacker.cc:194  hstart2trb2unpacker.cc:195  hstart2trb2unpacker.cc:196  hstart2trb2unpacker.cc:197  hstart2trb2unpacker.cc:198  hstart2trb2unpacker.cc:199  hstart2trb2unpacker.cc:200  hstart2trb2unpacker.cc:201  hstart2trb2unpacker.cc:202  hstart2trb2unpacker.cc:203  hstart2trb2unpacker.cc:204  hstart2trb2unpacker.cc:205  hstart2trb2unpacker.cc:206  hstart2trb2unpacker.cc:207  hstart2trb2unpacker.cc:208  hstart2trb2unpacker.cc:209  hstart2trb2unpacker.cc:210  hstart2trb2unpacker.cc:211  hstart2trb2unpacker.cc:212  hstart2trb2unpacker.cc:213  hstart2trb2unpacker.cc:214  hstart2trb2unpacker.cc:215  hstart2trb2unpacker.cc:216  hstart2trb2unpacker.cc:217