ROOT logo
//*-- Author : Walter Karig
//*-- Modified : 08/07/2010 by M. Weber
//*-- Modified : 03/05/2005 by Ilse Koenig
//*-- Modified : 16/09/2003 by T.Wojcik
//*-- Modified : 24/11/2002 by Dusan Zovinec
//*-- Modified : 18/12/2001 by Ilse Koenig
//*-- Modified : 29/11/2000 by Ilse Koenig
//*-- Modified : 13/11/2000 by M. Golubeva
//*-- Modified : 05/06/98 by Manuel Sanchez

#include "hades.h"
#include "hdatasource.h"
#include "hdebug.h"
#include "hevent.h"
#include "heventheader.h"
#include "hlatchunpacker.h"
#include "hldsubevt.h"
#include "hstartdef.h"

#include <iomanip>
#include <iostream>
#include <stdlib.h>

#define TEST 0

using namespace std;

ClassImp(HLatchUnpacker)

//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////////
//
// HLatchUnpacker
//
// Unpacker used to read the LATCH data from .hld files
// Sets EventHeader::fTBit.
//
////////////////////////////////////////////////////////////////////

HLatchUnpacker::HLatchUnpacker(Int_t id)
{
   // Constructor
   // Input: subevent id
   subEvtId = id;
}

Int_t HLatchUnpacker::execute()
{


   // Unpacks the latch data and sets EventHeader::fTBit
#if DEBUG_LEVEL>4
   gDebuger->enterFunc("HLatchUnpacker::execute\n");
#endif

   UInt_t* data       = 0;
   UInt_t* end        = 0;

   UInt_t uTrbNetAdress;        // TrbNetAdress
   UInt_t uSubBlockSize;        // BlockSize of SubSubEvent
   UInt_t uSubBlockSizeTest;    // BlockSize of SubSubEvent
   UInt_t uSubBlockSizeScalers; // BlockSize of Scaler words
   UInt_t trbExtensionSize;     // number of TRB extension words


   if (pSubEvt) {

      trbExtensionSize = 0;

      data = pSubEvt->getData();
      end  = pSubEvt->getEnd();

#if DEBUG_LEVEL>4
      printf("Next SubEvt. data between: %p and %p\n", data, end);
      pSubEvt->dumpIt();
#endif




      // loop over data words in Subevent -> standard HUB word (SubSubEvent)
      while (data != end) {


#if DEBUG_LEVEL>2
         printf("standard HUB word: %08x\n", *data);
#endif

         uSubBlockSize = (*data >> 16) & 0xFF;     // No. of the data words from one TRB board
         uSubBlockSizeScalers = uSubBlockSize - 4;
         uTrbNetAdress = *data       & 0xFFFF;     // TRB net Adddress

         // if no CTS TRB -> skip data
         if (uTrbNetAdress > 0x00FF) {
            data += uSubBlockSize;
         } else {


            // first header of data (TRB header -> not used, sub block size)
            // control the SubSubEvent size
            ++data;

#if DEBUG_LEVEL>2
            printf("first data header: %08x (%p)\n", *data, data);
#endif

            uSubBlockSizeTest = *data & 0xFF;

            if (uSubBlockSize != uSubBlockSizeTest) {
               Error("execute", "check of SubBlockSize failed : %04x != %04x", uSubBlockSize, *(data + 1) & 0xFF);
               return -1;
            }

            // second header of data (31-16 data version, 15-0 number of extension words)
            ++data;

#if DEBUG_LEVEL>2
            printf("second data header: %08x (%p)\n", *data, data);
#endif

            trbExtensionSize = *data       & 0xFFFF;

            // loop over TRB extensions
            if (trbExtensionSize != 0) {
               for (UInt_t ii = 0; ii < trbExtensionSize; ii++) {
                  ++data;
                  if (trbExtensionSize < 128) {
                  } else {
                     Error("execute", "too many TRB extension words (maximum = 128)");
                     return -1;
                  }
               }
            }


            // Latches
            ++data;

#if DEBUG_LEVEL>2
            printf("Latch data word: %08x (%p)\n", *data, data);
#endif

            fillLatch(data);


            // empty word
            ++data;


            // scaler information ( for MDC calibration trigger ) -> skip data words
            // scaler information is read out in htboxunpacker
            // no HEADER information about scaler event (its written every second)
            data += uSubBlockSizeScalers ;

         }//end CTS TRB

         ++data;
      }
   }


#if DEBUG_LEVEL>4
   gDebuger->leaveFunc("HLatchUnpacker::execute\n");
#endif

   return 1;
}


UInt_t* HLatchUnpacker::fillLatch(UInt_t* data)
{

   //Function for filling latch structure. (one 16 bit data word)
   //returns pointer to the next data word  in subevt.

   UInt_t latchData = *data & 0xFFFFFFFF;

   gHades->getCurrentEvent()->getHeader()->setTBit(latchData);

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