ROOT logo
//*-- AUTHOR : Jerzy Pietraszko, Ilse Koenig
//*-- Created : 04/12/2009

//_HADES_CLASS_DESCRIPTION
/////////////////////////////////////////////////////////////
//
//  HStartTrb2Unpacker
//
//  Class for unpacking TRB data and filling
//    the Start2 Raw category
//
//  Basic subevent decoding and eventual TDC corrections are
//  performed by decode function in the base class
//  see: /base/datasource/htrb2unpacker.h
//
/////////////////////////////////////////////////////////////

#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)
{
   // constructor
   pRawCat = NULL;
   timeRef = kTRUE;
}

Bool_t HStart2Trb2Unpacker::init(void)
{
   // creates the raw category and gets the pointer to the TRB2 lookup table

   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;
   }

   // control histograms ??

   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)
{
   // fills the control histograms
   if (!quietMode && debugFlag > 0) {
      Info("finalize", "No control histograms implemented");
   }
   return kTRUE;
}

Int_t HStart2Trb2Unpacker::execute(void)
{

   HStart2Raw *pRaw = 0;  // pointer to Raw category
   Int_t nEvt = 0;        // Evt Seq. Nb.
   if (gHades->isCalibration()) {
      //calibration event
      return 1;
   }

   if (gHades->getCurrentEvent()->getHeader()->getId() == 0xe) {
      //scaler event
      return 1;
   }


   // decode subevent data
   if (pSubEvt) {        // pSubEvt - make sure that there is something for decoding
      nEvt = gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();

      // decodes the subevent and fill arrays, see: htrb2unpacker.h
      // decode() return values:
      //    100  - end of subevent, stop decoding by purpose
      //     10  - CTS information -> go to next subsubevt
      //      0  - error, decoding failed
      //      1  - data  decode
      // decode all subsubevents until subevent is finished - even if there is an error
      Int_t DecodeOutput = 1;
      while (1) {
         DecodeOutput = decode();
         // go to next TRB
         uStartPosition = uStartPosition + uSubBlockSize + 1; //start TRB decoding at the correct startposition
         if (DecodeOutput == 0) { //stop decoding of current TRB and go to next
            Error("decode", "subsubevent decoding failed!!! Evt Nr : %i SubEvtId: %x", nEvt, subEvtId);
            break;
         }
         if (DecodeOutput == 10) { // CTS information -> do not fill structure
            if (debugFlag > 0) Info("decode", "CTS info -> DecodeOutput : %i", DecodeOutput);
            continue;
         }
         if (DecodeOutput == 100) { //End of subevebt is reached
            uStartPosition = 0;
            if (debugFlag > 0) Info("decode", "DecodeOutput : %i", DecodeOutput);
            break;
         }
         // if(!decode()) return(-1); <--- for old data structure

         // correct for reference time here!
         // high resolution mode (8th channel)
         // low resolution mode (32th channel)
         if (timeRef) {
            // if (highResModeOn) correctRefTimeCh(8);
            if (highResModeOn) correctRefTimeStartDet23();
            else correctRefTimeCh(32);
         }

         // check the lookup table
         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);
	    //return 1;
            continue;
         }

         // fill the raw category for Start detector
         for (Int_t i = 0; i < board->getSize(); i++) {
            if (trbLeadingMult[i] < 1) continue;         //Leading Time data for this channel exist
            // MAYBE: && trbTrailingMult[i] < 1
            // I would like to take also trailing data... f.i. debugging, if signal is inverted
            // But this I wont get from the trbunpacker? (just a guess)
            HStart2Trb2LookupChan *chan = board->getChannel(i);
            // if-cond for "chan belongs to start detector" ????
            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;
               }
               // fill ...
               Int_t m;
               m = trbLeadingMult[i];
               if (m > 10) {
                  m = 10; // no more than 10 Times stored
               }

               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;
                  }
               }
            } // if loc[0]>0
         } // loop over channels
      } // while loop
   }  //if(pSubEvt)
   return 1;
}

 hstart2trb2unpacker.cc:1
 hstart2trb2unpacker.cc:2
 hstart2trb2unpacker.cc:3
 hstart2trb2unpacker.cc:4
 hstart2trb2unpacker.cc:5
 hstart2trb2unpacker.cc:6
 hstart2trb2unpacker.cc:7
 hstart2trb2unpacker.cc:8
 hstart2trb2unpacker.cc:9
 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