ROOT logo
//*-- AUTHOR : M.Golubeva
//*-- Created : 08/07/2010
//*-- based on htoftrb2unpacker (P.Tlusty)

//_HADES_CLASS_DESCRIPTION
/////////////////////////////////////////////////////////////
//
//  HWallTrb2Unpacker
//
//  Class for unpacking TRB data and filling
//    the Wall Raw category
//  Base subevent decoding is performed by decode function
//  see: htrbbaseunpacker.h (/base/datasource/ )
//
/////////////////////////////////////////////////////////////

using namespace std;
#include "hwalltrb2unpacker.h"
#include "walldef.h"
#include "hwalltrb2lookup.h"
#include "htrbnetaddressmapping.h"
#include "htrb2correction.h"
#include "hwallraw.h"
#include "hwallrawsim.h"
#include "hdebug.h"
#include "hades.h"
#include "hevent.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hruntimedb.h"
#include "hcategory.h"
#include "hldsubevt.h"
#include "heventheader.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>

#include "TCanvas.h"
#include "TStyle.h"

ClassImp (HWallTrb2Unpacker)

HWallTrb2Unpacker::HWallTrb2Unpacker (UInt_t id):HTrb2Unpacker (id)
{
  // constructor
  pRawCat = NULL;
  timeRef = kTRUE;
  timeRefRemove = kFALSE;
  timeShift = 7200.;
}

Bool_t HWallTrb2Unpacker::init (void)
{

  //  cout<<"====wall init ...0"<<endl;
  // creates the raw category and gets the pointer to the TRB lookup table
  pRawCat = gHades->getCurrentEvent ()->getCategory (catWallRaw);
  if (!pRawCat) {
    pRawCat = gHades->getSetup ()->getDetector ("Wall")->buildCategory (catWallRaw);
    if (!pRawCat)
      return kFALSE;
    gHades->getCurrentEvent ()->addCategory (catWallRaw, pRawCat, "Wall");
  }
  loc.set(1,0);

  lookup = (HWallTrb2Lookup *) (gHades->getRuntimeDb ()->getContainer ("WallTrb2Lookup"));
  if (!lookup) return kFALSE;

  
  if (correctINL) {
    trbaddressmap=(HTrbnetAddressMapping*)(gHades->getRuntimeDb()->getContainer("TrbnetAddressMapping"));
    if (!trbaddressmap) {
      Error("init","No Pointer to parameter container TrbnetAddressMapping.");
      return kFALSE;
    }
  }
  

  return kTRUE;
}

Bool_t HWallTrb2Unpacker::finalize(void)
{

  if(!quietMode &&  debugFlag > 0 ){
    Info("finalize","No control histograms implemented");
  }
  return kTRUE;
}

Int_t HWallTrb2Unpacker::execute (void)
{
  HWallRaw *pRaw = 0;    // pointer to Raw category
  Int_t nEvt = 0;        // Evt Seq. Nb.
  Int_t m=0;
  
  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 are these Data in FW TDC?   Now inplemented/ Should be checked //BK
    //      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 start position
      if (DecodeOutput==10) continue; //stop decoding CTS Event go to next //BK
      if (DecodeOutput==0) { //stop decoding of current TRB and go to next
	Error("decode","subsubevent decoding failed!!! Evt Nr : %i SubEvtId: %x",nEvt,subEvtId);
	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
      
      //		cout << "***** WALL: trbDataExtension *****"<<endl;
      //		cout << trbDataVer <<": "<< trbExtensionSize <<endl;
      
      
      //for (Int_t i = 0; i < 128; i++) {
      //  if(trbLeadingTime[i][0]>0) printf("%d %.0f %d\n",i,trbLeadingTime[i][0],trbLeadingMult[i]);
      //}
      
      //Ref Time Subtraction
      if(timeRef)  correctRefTimeCh(32);
      
      
      // get the part of the lookup table which belongs to the subevent ID
      // in order to check which TRBchannel belongs to the Wall detector
      
      HWallTrb2LookupBoard *board = lookup->getBoard (uTrbNetAdress);
      if (!board) {
         Warning ("execute", "TrbNetAdress: %x (%i) unpacked but TRB Board not in lookup table",uTrbNetAdress,uTrbNetAdress);
         return 1;
      }

      if(board->getSize() < 0) continue;   //BK
      //fill RAW category for Wall detector
      for (Int_t i=0; i<board->getSize(); i++) {
	//cout <<"MULT " <<trbLeadingMult[i] <<endl;
	if (trbLeadingMult[i] < 1 ) continue;        //Leading Time data for this channel exist        

	if ( debugFlag > 0 ) cout <<"timeRefRemove "<<timeRefRemove<<" timeShift "<<timeShift<<endl;

        if(timeRefRemove) {  //remove reference times
	  //cout <<"MARINA " <<trbLeadingTime[i][0] <<endl;
          if(TMath::Abs(trbLeadingTime[i][0])<0.1) continue;
	}
        trbLeadingTime[i][0]=trbLeadingTime[i][0]+timeShift;  

	if ( debugFlag > 0 ) printf("chan %d time %.0f adc %.0f\n",i,trbLeadingTime[i][0],trbADC[i][0]);

	// fill wall raw category
	if(i == -1) continue; 
	HWallTrb2LookupChan *chan = board->getChannel (i);
	
	loc[0] = (Int_t)chan->getCell();
	if ( debugFlag > 0 ) printf("chan %d cell %d\n",i,loc[0]);
	
	if(loc[0]>=0) {
	  //cout <<"CELL " <<loc[0] <<" " <<board->getSize() <<endl;
	  pRaw=(HWallRaw *)pRawCat->getObject(loc);
	  if (!pRaw){
	    pRaw=(HWallRaw *)pRawCat->getSlot(loc);
	    if (pRaw) {
	      
	      if(gHades->getEmbeddingMode()==0) {
		pRaw=new (pRaw) HWallRaw;
	      }else{
		pRaw=new (pRaw) HWallRawSim;
	      }
	      
	      pRaw->setCell(loc[0]);
	      
	      m=trbLeadingMult[i];
	      //cout <<"MARINA " <<m <<" " <<loc[0] <<endl; 
	      //if(loc[0]>225 && loc[0]<245) cout <<"MARINA " <<m <<" " <<trbTrailingMult[i] <<" " <<trbTrailingTime[i][0] <<" " <<trbLeadingTime[i][0] <<" " <<trbADC[i][0] <<endl;
	      
	      if(m>4) m=4; //no more than 4 Times stored
	      for(Int_t chmult=0; chmult<m; chmult++){
		//if(trbLeadingTime[i][chmult]>=lower &&  trbLeadingTime[i][chmult]<=upper){
		pRaw->fill( trbLeadingTime[i][chmult], trbADC[i][chmult]);
		//if(loc[0]>225 && loc[0]<245) cout <<"MARINA " <<chmult <<" " <<trbTrailingTime[i][chmult] <<" " <<trbLeadingTime[i][chmult] <<" " <<trbADC[i][chmult] <<endl;
		
		//}
	      }//for(Int_t chmult=0; chmult< trbLeadingMult[i]; chmult++)
	    }//if (pRaw)
	    else {
	      Error("execute()",
		    "Can't get slot\n");
	      return -1;
	    }
	  }//if (!pRaw)
	  else {
            #if DEBUG_LEVEL>4
	    Info("execute()",
		 "Slot already exists!\n");
            #endif
            }
	  
	 }//if(loc[0]>=0)  //sector>=0 

      }// for(Int_t i=0; i<128; i++)
    } // while loop
   }//if(pSubEvt)

   return 1;
}

 hwalltrb2unpacker.cc:1
 hwalltrb2unpacker.cc:2
 hwalltrb2unpacker.cc:3
 hwalltrb2unpacker.cc:4
 hwalltrb2unpacker.cc:5
 hwalltrb2unpacker.cc:6
 hwalltrb2unpacker.cc:7
 hwalltrb2unpacker.cc:8
 hwalltrb2unpacker.cc:9
 hwalltrb2unpacker.cc:10
 hwalltrb2unpacker.cc:11
 hwalltrb2unpacker.cc:12
 hwalltrb2unpacker.cc:13
 hwalltrb2unpacker.cc:14
 hwalltrb2unpacker.cc:15
 hwalltrb2unpacker.cc:16
 hwalltrb2unpacker.cc:17
 hwalltrb2unpacker.cc:18
 hwalltrb2unpacker.cc:19
 hwalltrb2unpacker.cc:20
 hwalltrb2unpacker.cc:21
 hwalltrb2unpacker.cc:22
 hwalltrb2unpacker.cc:23
 hwalltrb2unpacker.cc:24
 hwalltrb2unpacker.cc:25
 hwalltrb2unpacker.cc:26
 hwalltrb2unpacker.cc:27
 hwalltrb2unpacker.cc:28
 hwalltrb2unpacker.cc:29
 hwalltrb2unpacker.cc:30
 hwalltrb2unpacker.cc:31
 hwalltrb2unpacker.cc:32
 hwalltrb2unpacker.cc:33
 hwalltrb2unpacker.cc:34
 hwalltrb2unpacker.cc:35
 hwalltrb2unpacker.cc:36
 hwalltrb2unpacker.cc:37
 hwalltrb2unpacker.cc:38
 hwalltrb2unpacker.cc:39
 hwalltrb2unpacker.cc:40
 hwalltrb2unpacker.cc:41
 hwalltrb2unpacker.cc:42
 hwalltrb2unpacker.cc:43
 hwalltrb2unpacker.cc:44
 hwalltrb2unpacker.cc:45
 hwalltrb2unpacker.cc:46
 hwalltrb2unpacker.cc:47
 hwalltrb2unpacker.cc:48
 hwalltrb2unpacker.cc:49
 hwalltrb2unpacker.cc:50
 hwalltrb2unpacker.cc:51
 hwalltrb2unpacker.cc:52
 hwalltrb2unpacker.cc:53
 hwalltrb2unpacker.cc:54
 hwalltrb2unpacker.cc:55
 hwalltrb2unpacker.cc:56
 hwalltrb2unpacker.cc:57
 hwalltrb2unpacker.cc:58
 hwalltrb2unpacker.cc:59
 hwalltrb2unpacker.cc:60
 hwalltrb2unpacker.cc:61
 hwalltrb2unpacker.cc:62
 hwalltrb2unpacker.cc:63
 hwalltrb2unpacker.cc:64
 hwalltrb2unpacker.cc:65
 hwalltrb2unpacker.cc:66
 hwalltrb2unpacker.cc:67
 hwalltrb2unpacker.cc:68
 hwalltrb2unpacker.cc:69
 hwalltrb2unpacker.cc:70
 hwalltrb2unpacker.cc:71
 hwalltrb2unpacker.cc:72
 hwalltrb2unpacker.cc:73
 hwalltrb2unpacker.cc:74
 hwalltrb2unpacker.cc:75
 hwalltrb2unpacker.cc:76
 hwalltrb2unpacker.cc:77
 hwalltrb2unpacker.cc:78
 hwalltrb2unpacker.cc:79
 hwalltrb2unpacker.cc:80
 hwalltrb2unpacker.cc:81
 hwalltrb2unpacker.cc:82
 hwalltrb2unpacker.cc:83
 hwalltrb2unpacker.cc:84
 hwalltrb2unpacker.cc:85
 hwalltrb2unpacker.cc:86
 hwalltrb2unpacker.cc:87
 hwalltrb2unpacker.cc:88
 hwalltrb2unpacker.cc:89
 hwalltrb2unpacker.cc:90
 hwalltrb2unpacker.cc:91
 hwalltrb2unpacker.cc:92
 hwalltrb2unpacker.cc:93
 hwalltrb2unpacker.cc:94
 hwalltrb2unpacker.cc:95
 hwalltrb2unpacker.cc:96
 hwalltrb2unpacker.cc:97
 hwalltrb2unpacker.cc:98
 hwalltrb2unpacker.cc:99
 hwalltrb2unpacker.cc:100
 hwalltrb2unpacker.cc:101
 hwalltrb2unpacker.cc:102
 hwalltrb2unpacker.cc:103
 hwalltrb2unpacker.cc:104
 hwalltrb2unpacker.cc:105
 hwalltrb2unpacker.cc:106
 hwalltrb2unpacker.cc:107
 hwalltrb2unpacker.cc:108
 hwalltrb2unpacker.cc:109
 hwalltrb2unpacker.cc:110
 hwalltrb2unpacker.cc:111
 hwalltrb2unpacker.cc:112
 hwalltrb2unpacker.cc:113
 hwalltrb2unpacker.cc:114
 hwalltrb2unpacker.cc:115
 hwalltrb2unpacker.cc:116
 hwalltrb2unpacker.cc:117
 hwalltrb2unpacker.cc:118
 hwalltrb2unpacker.cc:119
 hwalltrb2unpacker.cc:120
 hwalltrb2unpacker.cc:121
 hwalltrb2unpacker.cc:122
 hwalltrb2unpacker.cc:123
 hwalltrb2unpacker.cc:124
 hwalltrb2unpacker.cc:125
 hwalltrb2unpacker.cc:126
 hwalltrb2unpacker.cc:127
 hwalltrb2unpacker.cc:128
 hwalltrb2unpacker.cc:129
 hwalltrb2unpacker.cc:130
 hwalltrb2unpacker.cc:131
 hwalltrb2unpacker.cc:132
 hwalltrb2unpacker.cc:133
 hwalltrb2unpacker.cc:134
 hwalltrb2unpacker.cc:135
 hwalltrb2unpacker.cc:136
 hwalltrb2unpacker.cc:137
 hwalltrb2unpacker.cc:138
 hwalltrb2unpacker.cc:139
 hwalltrb2unpacker.cc:140
 hwalltrb2unpacker.cc:141
 hwalltrb2unpacker.cc:142
 hwalltrb2unpacker.cc:143
 hwalltrb2unpacker.cc:144
 hwalltrb2unpacker.cc:145
 hwalltrb2unpacker.cc:146
 hwalltrb2unpacker.cc:147
 hwalltrb2unpacker.cc:148
 hwalltrb2unpacker.cc:149
 hwalltrb2unpacker.cc:150
 hwalltrb2unpacker.cc:151
 hwalltrb2unpacker.cc:152
 hwalltrb2unpacker.cc:153
 hwalltrb2unpacker.cc:154
 hwalltrb2unpacker.cc:155
 hwalltrb2unpacker.cc:156
 hwalltrb2unpacker.cc:157
 hwalltrb2unpacker.cc:158
 hwalltrb2unpacker.cc:159
 hwalltrb2unpacker.cc:160
 hwalltrb2unpacker.cc:161
 hwalltrb2unpacker.cc:162
 hwalltrb2unpacker.cc:163
 hwalltrb2unpacker.cc:164
 hwalltrb2unpacker.cc:165
 hwalltrb2unpacker.cc:166
 hwalltrb2unpacker.cc:167
 hwalltrb2unpacker.cc:168
 hwalltrb2unpacker.cc:169
 hwalltrb2unpacker.cc:170
 hwalltrb2unpacker.cc:171
 hwalltrb2unpacker.cc:172
 hwalltrb2unpacker.cc:173
 hwalltrb2unpacker.cc:174
 hwalltrb2unpacker.cc:175
 hwalltrb2unpacker.cc:176
 hwalltrb2unpacker.cc:177
 hwalltrb2unpacker.cc:178
 hwalltrb2unpacker.cc:179
 hwalltrb2unpacker.cc:180
 hwalltrb2unpacker.cc:181
 hwalltrb2unpacker.cc:182
 hwalltrb2unpacker.cc:183
 hwalltrb2unpacker.cc:184
 hwalltrb2unpacker.cc:185
 hwalltrb2unpacker.cc:186
 hwalltrb2unpacker.cc:187
 hwalltrb2unpacker.cc:188
 hwalltrb2unpacker.cc:189
 hwalltrb2unpacker.cc:190
 hwalltrb2unpacker.cc:191
 hwalltrb2unpacker.cc:192
 hwalltrb2unpacker.cc:193
 hwalltrb2unpacker.cc:194
 hwalltrb2unpacker.cc:195
 hwalltrb2unpacker.cc:196
 hwalltrb2unpacker.cc:197
 hwalltrb2unpacker.cc:198
 hwalltrb2unpacker.cc:199
 hwalltrb2unpacker.cc:200
 hwalltrb2unpacker.cc:201
 hwalltrb2unpacker.cc:202
 hwalltrb2unpacker.cc:203
 hwalltrb2unpacker.cc:204
 hwalltrb2unpacker.cc:205
 hwalltrb2unpacker.cc:206
 hwalltrb2unpacker.cc:207
 hwalltrb2unpacker.cc:208
 hwalltrb2unpacker.cc:209
 hwalltrb2unpacker.cc:210
 hwalltrb2unpacker.cc:211
 hwalltrb2unpacker.cc:212
 hwalltrb2unpacker.cc:213
 hwalltrb2unpacker.cc:214
 hwalltrb2unpacker.cc:215
 hwalltrb2unpacker.cc:216
 hwalltrb2unpacker.cc:217
 hwalltrb2unpacker.cc:218
 hwalltrb2unpacker.cc:219
 hwalltrb2unpacker.cc:220
 hwalltrb2unpacker.cc:221
 hwalltrb2unpacker.cc:222
 hwalltrb2unpacker.cc:223
 hwalltrb2unpacker.cc:224
 hwalltrb2unpacker.cc:225
 hwalltrb2unpacker.cc:226
 hwalltrb2unpacker.cc:227
 hwalltrb2unpacker.cc:228
 hwalltrb2unpacker.cc:229