ROOT logo
//*-- AUTHOR Sergey Linev
//*-- Modified : 17/04/2014 by I. Koenig
//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////////////////////
//  HTrb3Unpacker
//  Base class for TRB data unpacking.
//
//  Any detector connected to TRB3 boards should use this class to decode the subevent. 
//  Decode() method fills the arrays with information about: 
//  channel number (0-127), 
//  measured time, 
//  measured width.
//
//  The goal is to provide data which can be directly used by subsystems 
//  in order to directly fill raw categories.
//
//  The most important information is stored in:	   
//  trbLeadingTime[ TrbChanNb ][ hitNb ],
//  trbADC[ TrbChanNb ][ hitNb ]. 
//  trbLeadingMult[ TrbChanNb ]
//
//  Max. number of hits per channel is currently set to 10. 
//
/////////////////////////////////////////////////////////////////////////////////

using namespace std;
#include "htrb3unpacker.h"
#include "hdatasource.h"
#include "hdebug.h"
#include "hades.h"
#include "hevent.h"
#include "hldsubevt.h"
#include "heventheader.h"
#include "htrb3tdciterator.h"
#include "htrb3calpar.h"
#include "hruntimedb.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>

ClassImp(HTrb3Unpacker)

HTrb3Unpacker::HTrb3Unpacker(vector<UInt_t>& ids) :
  HldUnpack(),
  uHUBId(0x9000),
  uCTSId(0x8000),
  debugFlag(0),
  quietMode(kFALSE),
  reportCritical(kFALSE)
{
    // Constructor, sets the subevent id
    fsubEvtIds.clear();
    for(UInt_t i=0;i<ids.size();i++){
	fsubEvtIds.push_back(ids[i]);
    }
    fCurrentsubEvtId = 0;
}

HTrb3Unpacker::~HTrb3Unpacker()
{
    fsubEvtIds.clear();
}


void HTrb3Unpacker::clearAll(void)
{
}

Bool_t HTrb3Unpacker::decode(void)
{
  // unpacks trb3 data into tdc hits
  clearAll();

  //------------------------------------------------------------------------
  // set all sub event pointers of this unpacker and loop
  HldEvt* evt = getHldEvt( );
  if(evt){
      evt->getSubEventForIds(fsubEvtIds,fsubEvts);
  } else {

      cout<<"HTrb3Unpacker::decode() HldEvt pointer is NULL!"<<endl;
      return kTRUE;
  }
  //------------------------------------------------------------------------

  for(UInt_t i=0;i<fsubEvts.size();i++)
  {
      pSubEvt = &(fsubEvts[i]);


      if (pSubEvt==0) continue;

      // ensure that data swapped once
      // pSubEvt->swapData();
      setCurrentSubEvtId(pSubEvt->getId());

      UInt_t* raw_data = pSubEvt->getData();
      UInt_t* raw_end  = pSubEvt->getEnd();
      UInt_t nEvt = gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();

      if(debugFlag > 0) {
	  cout<<"-0-EvNb "<<nEvt<<", "<<hex<<"data word: "<<*raw_data<<dec<<"  --NetSubevent(TRB) Header"<<endl;
      }

      // all sub-sub events will be scanned from at once
      // data = data + uStartPosition;

      if(debugFlag > 0){
	  cout<<"-0a-EvNb "<<nEvt<<", data word: "<<hex<<*raw_data<<dec<<"  --"<<endl;
      }

      UInt_t ix = 0;
      UInt_t trbSubEvSize = raw_end - raw_data;

      // from here code very similar to TrbProcessor

      while (ix < trbSubEvSize) {

	  UInt_t data = raw_data[ix++];

	  UInt_t datalen = (data >> 16) & 0xFFFF;
	  UInt_t trbaddr = data & 0xFFFF;

	  if ((trbaddr & 0xFF00) == (uHUBId & 0xFF00)) {
	      if(debugFlag > 0)
		  printf("   HUB header: 0x%08x, size=%u (ignore)\n", (UInt_t) data, datalen);

	      // TODO: formally we should analyze HUB subsubevent as real subsubevent but
	      // we just skip header and continue to analyze data

	      // ix+=datalen;  // WORKAROUND !!!

	      continue;
	  }

	  //! ==================== CTS header ================
	  if ((trbaddr & 0xFF00) == (uCTSId & 0xFF00)) {
	      if(debugFlag > 0)
		  printf("   CTS header: 0x%x, size=%d\n", (UInt_t) data, datalen);
	      //hTrbTriggerCount->Fill(5);          //! TRB - CTS
	      //hTrbTriggerCount->Fill(0);          //! TRB TOTAL

	      // ignore CTS header
	      ix+=datalen;
	      continue;
	  }

	  //! ==================  Dummy header  ==========================
	  if (trbaddr == 0x5555) {
	      if(debugFlag > 0)
		  printf("   Dummy header: 0x%x, size=%d\n", (UInt_t) data, datalen);
	      //hTrbTriggerCount->Fill(4);          //! TRB - DUMMY
	      //hTrbTriggerCount->Fill(0);          //! TRB TOTAL
	      while (datalen-- > 0) {
		  //! In theory here must be only one word - termination package with the status
		  data = raw_data[ix++];
		  if(debugFlag > 0)
		      printf("      word: 0x%08x\n", (UInt_t) data);
		  //UInt_t fSubeventStatus = data;
		  //if (fSubeventStatus != 0x00000001) { bad events}
	      }

	      continue;
	  }

	  if (decodeData(trbaddr, datalen, raw_data + ix))
	  {
	      ix+=datalen;
	      continue; // go to next block
	  }

	  if(debugFlag > 0)
	      printf("Unknown header %x length %u in TDC subevent\n", trbaddr, datalen);

	  ix+=datalen;
      }

      // decoding and filling
  }
  return kTRUE;
}
 htrb3unpacker.cc:1
 htrb3unpacker.cc:2
 htrb3unpacker.cc:3
 htrb3unpacker.cc:4
 htrb3unpacker.cc:5
 htrb3unpacker.cc:6
 htrb3unpacker.cc:7
 htrb3unpacker.cc:8
 htrb3unpacker.cc:9
 htrb3unpacker.cc:10
 htrb3unpacker.cc:11
 htrb3unpacker.cc:12
 htrb3unpacker.cc:13
 htrb3unpacker.cc:14
 htrb3unpacker.cc:15
 htrb3unpacker.cc:16
 htrb3unpacker.cc:17
 htrb3unpacker.cc:18
 htrb3unpacker.cc:19
 htrb3unpacker.cc:20
 htrb3unpacker.cc:21
 htrb3unpacker.cc:22
 htrb3unpacker.cc:23
 htrb3unpacker.cc:24
 htrb3unpacker.cc:25
 htrb3unpacker.cc:26
 htrb3unpacker.cc:27
 htrb3unpacker.cc:28
 htrb3unpacker.cc:29
 htrb3unpacker.cc:30
 htrb3unpacker.cc:31
 htrb3unpacker.cc:32
 htrb3unpacker.cc:33
 htrb3unpacker.cc:34
 htrb3unpacker.cc:35
 htrb3unpacker.cc:36
 htrb3unpacker.cc:37
 htrb3unpacker.cc:38
 htrb3unpacker.cc:39
 htrb3unpacker.cc:40
 htrb3unpacker.cc:41
 htrb3unpacker.cc:42
 htrb3unpacker.cc:43
 htrb3unpacker.cc:44
 htrb3unpacker.cc:45
 htrb3unpacker.cc:46
 htrb3unpacker.cc:47
 htrb3unpacker.cc:48
 htrb3unpacker.cc:49
 htrb3unpacker.cc:50
 htrb3unpacker.cc:51
 htrb3unpacker.cc:52
 htrb3unpacker.cc:53
 htrb3unpacker.cc:54
 htrb3unpacker.cc:55
 htrb3unpacker.cc:56
 htrb3unpacker.cc:57
 htrb3unpacker.cc:58
 htrb3unpacker.cc:59
 htrb3unpacker.cc:60
 htrb3unpacker.cc:61
 htrb3unpacker.cc:62
 htrb3unpacker.cc:63
 htrb3unpacker.cc:64
 htrb3unpacker.cc:65
 htrb3unpacker.cc:66
 htrb3unpacker.cc:67
 htrb3unpacker.cc:68
 htrb3unpacker.cc:69
 htrb3unpacker.cc:70
 htrb3unpacker.cc:71
 htrb3unpacker.cc:72
 htrb3unpacker.cc:73
 htrb3unpacker.cc:74
 htrb3unpacker.cc:75
 htrb3unpacker.cc:76
 htrb3unpacker.cc:77
 htrb3unpacker.cc:78
 htrb3unpacker.cc:79
 htrb3unpacker.cc:80
 htrb3unpacker.cc:81
 htrb3unpacker.cc:82
 htrb3unpacker.cc:83
 htrb3unpacker.cc:84
 htrb3unpacker.cc:85
 htrb3unpacker.cc:86
 htrb3unpacker.cc:87
 htrb3unpacker.cc:88
 htrb3unpacker.cc:89
 htrb3unpacker.cc:90
 htrb3unpacker.cc:91
 htrb3unpacker.cc:92
 htrb3unpacker.cc:93
 htrb3unpacker.cc:94
 htrb3unpacker.cc:95
 htrb3unpacker.cc:96
 htrb3unpacker.cc:97
 htrb3unpacker.cc:98
 htrb3unpacker.cc:99
 htrb3unpacker.cc:100
 htrb3unpacker.cc:101
 htrb3unpacker.cc:102
 htrb3unpacker.cc:103
 htrb3unpacker.cc:104
 htrb3unpacker.cc:105
 htrb3unpacker.cc:106
 htrb3unpacker.cc:107
 htrb3unpacker.cc:108
 htrb3unpacker.cc:109
 htrb3unpacker.cc:110
 htrb3unpacker.cc:111
 htrb3unpacker.cc:112
 htrb3unpacker.cc:113
 htrb3unpacker.cc:114
 htrb3unpacker.cc:115
 htrb3unpacker.cc:116
 htrb3unpacker.cc:117
 htrb3unpacker.cc:118
 htrb3unpacker.cc:119
 htrb3unpacker.cc:120
 htrb3unpacker.cc:121
 htrb3unpacker.cc:122
 htrb3unpacker.cc:123
 htrb3unpacker.cc:124
 htrb3unpacker.cc:125
 htrb3unpacker.cc:126
 htrb3unpacker.cc:127
 htrb3unpacker.cc:128
 htrb3unpacker.cc:129
 htrb3unpacker.cc:130
 htrb3unpacker.cc:131
 htrb3unpacker.cc:132
 htrb3unpacker.cc:133
 htrb3unpacker.cc:134
 htrb3unpacker.cc:135
 htrb3unpacker.cc:136
 htrb3unpacker.cc:137
 htrb3unpacker.cc:138
 htrb3unpacker.cc:139
 htrb3unpacker.cc:140
 htrb3unpacker.cc:141
 htrb3unpacker.cc:142
 htrb3unpacker.cc:143
 htrb3unpacker.cc:144
 htrb3unpacker.cc:145
 htrb3unpacker.cc:146
 htrb3unpacker.cc:147
 htrb3unpacker.cc:148
 htrb3unpacker.cc:149
 htrb3unpacker.cc:150
 htrb3unpacker.cc:151
 htrb3unpacker.cc:152
 htrb3unpacker.cc:153
 htrb3unpacker.cc:154
 htrb3unpacker.cc:155
 htrb3unpacker.cc:156
 htrb3unpacker.cc:157
 htrb3unpacker.cc:158
 htrb3unpacker.cc:159
 htrb3unpacker.cc:160
 htrb3unpacker.cc:161
 htrb3unpacker.cc:162
 htrb3unpacker.cc:163
 htrb3unpacker.cc:164
 htrb3unpacker.cc:165
 htrb3unpacker.cc:166
 htrb3unpacker.cc:167
 htrb3unpacker.cc:168
 htrb3unpacker.cc:169
 htrb3unpacker.cc:170
 htrb3unpacker.cc:171
 htrb3unpacker.cc:172
 htrb3unpacker.cc:173
 htrb3unpacker.cc:174
 htrb3unpacker.cc:175
 htrb3unpacker.cc:176
 htrb3unpacker.cc:177
 htrb3unpacker.cc:178
 htrb3unpacker.cc:179
 htrb3unpacker.cc:180
 htrb3unpacker.cc:181