ROOT logo
//*-- AUTHOR  : P.Cabanelas 
//*-- Created : 16/06/2010

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

using namespace std;
#include "hrpctrb2unpacker.h"
#include "rpcdef.h"
#include "hrpctrb2lookup.h"
#include "htrbnetaddressmapping.h"
#include "htrb2correction.h"
#include "hrpcraw.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 "hdatasource.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>

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


ClassImp(HRpcTrb2Unpacker) 

HRpcTrb2Unpacker::HRpcTrb2Unpacker (UInt_t id):HTrb2Unpacker(id) {
    // constructor
    pRawCat = NULL;
    bNoTimeRefCorr=false;
    bStoreSpareChanData=false;

}

Bool_t HRpcTrb2Unpacker::init (void) {

    // creates the raw category and gets the pointer to the lookup table
    pRawCat = gHades->getCurrentEvent()->getCategory(catRpcRaw);
    if (!pRawCat) {
	pRawCat = gHades->getSetup()->getDetector("Rpc")->buildCategory(catRpcRaw);
	if (!pRawCat)
	    return kFALSE;
	gHades->getCurrentEvent()->addCategory(catRpcRaw,pRawCat,"Rpc");
    }
    loc.set(3,0,0,0);

    lookup = (HRpcTrb2Lookup *)(gHades->getRuntimeDb()->getContainer("RpcTrb2Lookup"));
    if (!lookup) {cerr << "init(): could not get container RpcTrb2Lookup" << endl;  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 HRpcTrb2Unpacker::finalize(void)
{
    return kTRUE;
}


Int_t HRpcTrb2Unpacker::execute(void) {

    HRpcRaw *pRaw = 0;	   // pointer to Raw category
    Int_t nEvt = 0;	       // Evt Seq. Nb.
    Char_t side = 'U';     // side declaration
    Float_t ns2bin = 10.;  // Connversion from ns to bin [100 ps TDC bin]. Used only by TotLast.
    Int_t FeAddress;

    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
	//      0  - error, decoding failed
	//      1  - data  decode
	//     10  - IF CTS -> skip
	// decode all subsubevents until subevent is finished - even if there is an error
	Int_t DecodeOutput = 1;

	while (1) {

	    DecodeOutput = decode();

	    if(DecodeOutput==kDsSkip){
                Error("decode","subsubevent decoding failed!!! Evt Nr : %i SubEvtId: %x .... skip full Event.",nEvt,subEvtId);
                return kDsSkip;
	    }
	    if (DecodeOutput==0) {
		Error("decode","subsubevent decoding failed!!! Evt Nr : %i SubEvtId: %x .... skip Event.",nEvt,subEvtId);
		break;
	    }
	    if (DecodeOutput==100 || DecodeOutput==10) {
		uStartPosition=0;
		if ( debugFlag > 0 ) Info("decode","DecodeOutput : %i",DecodeOutput);
	       break;
	    }

	    // Correct times by Reference Time: still working???
	    if(!bNoTimeRefCorr){
		switch(trbDataVer){
		case 0:   // Old data structure
		case 2:   // RefTime in the last channel of each TDC (RPC style)
		    correctRefTimeCh31();
		    break;
		case 3:   // FIXME: Obsolote. Include the case with average of the 4 reference times.
		    correctRefTimeCh31();
		    //correctRefTimeCh127();
		    break;
		default:  // Do nothing
		    break;
		}
	    }

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

	    // go to next TRB
	    uStartPosition = uStartPosition + uSubBlockSize + 1; //start TRB decoding at the correct startposition

	    //fill RAW category for the Rpc detector
	    for (Int_t i = 0; i < board->getSize(); i++) {
		if (trbLeadingMult[i]<1 && trbTrailingTotalMult[i]<1) continue;
		//Leading Time data and Trailing for this channel has to exist
		// fill rpc raw category
		HRpcTrb2LookupChan *chan = board->getChannel(i);

		if(chan->getSector()<0) {
		    Warning("execute", "No location for channel %i in board %x (%i)!\n",i,uTrbNetAdress,uTrbNetAdress);
		    continue;
		}

		side      = chan->getSide();
		loc[0]    = chan->getSector();
		loc[1]    = chan->getColumn();
		loc[2]    = chan->getCell();
		FeAddress = chan->getFeAddress();

		if(!bStoreSpareChanData && loc[2]>31) continue;

		pRaw = (HRpcRaw *)pRawCat->getObject(loc);
		if (!pRaw) {
		    pRaw = (HRpcRaw *)pRawCat->getSlot(loc);
		    pRaw = new (pRaw) HRpcRaw;
		}
		if (pRaw) {

		    if((pRaw->getRightTot()>0)&&(pRaw->getLeftTot()>0)) {
			if(debugFlag>1) Warning("execute", "Slot already exists!\n"); //I.e. the time right and left was filled already!
			continue;
		    }

		    pRaw->setAddress(loc[0],loc[1],loc[2]);

		    if(side=='r') {
			pRaw->setRightTime(trbLeadingTime[i][0]);
			pRaw->setRightTot(trbADC[i][0]);
			pRaw->setRightTime2(trbLeadingTime[i][1]);
			pRaw->setRightTot2(trbADC[i][1]);
		    } else {
			pRaw->setLeftTime(trbLeadingTime[i][0]);
			pRaw->setLeftTot(trbADC[i][0]);
			pRaw->setLeftTime2(trbLeadingTime[i][1]);
			pRaw->setLeftTot2(trbADC[i][1]);
		    }

		    // Algorithm for measurements of ToT of streamers with first leading and last trailing
		    Float_t totLast=trbADC[i][0];     // default: totLast = 1st ADC
		    Int_t lastTotFlag=0;              // flag for data info
		    Float_t max_time=500.;            // [ns] Maximum time for considering that the hit
		    Int_t  k_trail_fail =1;
		    Int_t lastTrailingIndex=-1;
		    Int_t k;

		    // corresponds to the 'next event'

		    if(trbLeadingMult[i]>1) {         // we have more than one leading (and therefore trailing)

			for(k=0;k<trbLeadingMult[i];k++) {
			    if(trbTrailingTime[i][k]<0) {
				k_trail_fail++;
				if (k>0) lastTrailingIndex = k-1;
			    }
			}
			if (k_trail_fail==k) {
			    if(debugFlag>1) Warning("execute","No valid trailings: TrbNetAdress %i, Evt %i, Chan %i",uTrbNetAdress,nEvt,i);
			    totLast=-100000;
			}

			if (lastTrailingIndex==-1) lastTrailingIndex = k; //All the trbTrailings are valid.

			totLast = trbTrailingTime[i][lastTrailingIndex] - trbLeadingTime[i][0];

			Int_t ind=0;
			while(totLast>(max_time*ns2bin)) {    // totLast should be typically smaller than 500ns;
			    // if it is bigger, then we have two different events in the TRB window
			    lastTotFlag=1;
			    ind++;
			    //if(ind>lastTrailingIndex) cerr<<"algorithm for last Tot does not work!"<<endl;
			    totLast = trbTrailingTime[i][lastTrailingIndex-ind] - trbLeadingTime[i][0];
			}
		    }

		    if(side=='r') {    // setting totLast to the HRpcRaw category
			pRaw->setRightTotLast(totLast);
		    } else {
			pRaw->setLeftTotLast(totLast);
		    }

		    Int_t trbDataType=0,extra=0;


		    if(side=='r') {
			pRaw->setRightLogBit(trbLeadingMult[i],trbTrailingTotalMult[i],lastTotFlag,
					     (Int_t)trbDataPairFlag,trbDataVer,trbDataType,extra);
		    } else {
			pRaw->setLeftLogBit(trbLeadingMult[i],trbTrailingTotalMult[i],lastTotFlag,
					    (Int_t)trbDataPairFlag,trbDataVer,trbDataType,extra);
		    }

		    // Setting FEE address
		    Int_t dboInput,dboNum,mboNum,trbNum;

		    trbNum    = FeAddress/1000000;
		    mboNum    = (FeAddress-trbNum*1000000)/10000;
		    dboNum    = (FeAddress-trbNum*1000000-mboNum*10000)/100;
		    dboInput  = FeAddress-trbNum*1000000-mboNum*10000-dboNum*100;

		    if (side=='r') pRaw->setRightFeeAddress(subEvtId,i,dboInput,dboNum,mboNum,trbNum);
		    if (side=='l') pRaw->setLeftFeeAddress(subEvtId,i,dboInput,dboNum,mboNum,trbNum);

		} else {
		    Error ("execute()", "Can't get slot");
		    cerr << "execute(): Can't get slot Column: "<<loc[1]<< " Cell: "
			<<loc[2]<< " Sec: " <<loc[0]<< " SubEvent: "
			<<subEvtId << " EvtNb: " <<nEvt << endl;
		    return -1;
		}

	    }  // for(Int_t i=0; i<128; i++)

	} //while loop

    }	//if(pSubEvt)

    return 1;

}
 hrpctrb2unpacker.cc:1
 hrpctrb2unpacker.cc:2
 hrpctrb2unpacker.cc:3
 hrpctrb2unpacker.cc:4
 hrpctrb2unpacker.cc:5
 hrpctrb2unpacker.cc:6
 hrpctrb2unpacker.cc:7
 hrpctrb2unpacker.cc:8
 hrpctrb2unpacker.cc:9
 hrpctrb2unpacker.cc:10
 hrpctrb2unpacker.cc:11
 hrpctrb2unpacker.cc:12
 hrpctrb2unpacker.cc:13
 hrpctrb2unpacker.cc:14
 hrpctrb2unpacker.cc:15
 hrpctrb2unpacker.cc:16
 hrpctrb2unpacker.cc:17
 hrpctrb2unpacker.cc:18
 hrpctrb2unpacker.cc:19
 hrpctrb2unpacker.cc:20
 hrpctrb2unpacker.cc:21
 hrpctrb2unpacker.cc:22
 hrpctrb2unpacker.cc:23
 hrpctrb2unpacker.cc:24
 hrpctrb2unpacker.cc:25
 hrpctrb2unpacker.cc:26
 hrpctrb2unpacker.cc:27
 hrpctrb2unpacker.cc:28
 hrpctrb2unpacker.cc:29
 hrpctrb2unpacker.cc:30
 hrpctrb2unpacker.cc:31
 hrpctrb2unpacker.cc:32
 hrpctrb2unpacker.cc:33
 hrpctrb2unpacker.cc:34
 hrpctrb2unpacker.cc:35
 hrpctrb2unpacker.cc:36
 hrpctrb2unpacker.cc:37
 hrpctrb2unpacker.cc:38
 hrpctrb2unpacker.cc:39
 hrpctrb2unpacker.cc:40
 hrpctrb2unpacker.cc:41
 hrpctrb2unpacker.cc:42
 hrpctrb2unpacker.cc:43
 hrpctrb2unpacker.cc:44
 hrpctrb2unpacker.cc:45
 hrpctrb2unpacker.cc:46
 hrpctrb2unpacker.cc:47
 hrpctrb2unpacker.cc:48
 hrpctrb2unpacker.cc:49
 hrpctrb2unpacker.cc:50
 hrpctrb2unpacker.cc:51
 hrpctrb2unpacker.cc:52
 hrpctrb2unpacker.cc:53
 hrpctrb2unpacker.cc:54
 hrpctrb2unpacker.cc:55
 hrpctrb2unpacker.cc:56
 hrpctrb2unpacker.cc:57
 hrpctrb2unpacker.cc:58
 hrpctrb2unpacker.cc:59
 hrpctrb2unpacker.cc:60
 hrpctrb2unpacker.cc:61
 hrpctrb2unpacker.cc:62
 hrpctrb2unpacker.cc:63
 hrpctrb2unpacker.cc:64
 hrpctrb2unpacker.cc:65
 hrpctrb2unpacker.cc:66
 hrpctrb2unpacker.cc:67
 hrpctrb2unpacker.cc:68
 hrpctrb2unpacker.cc:69
 hrpctrb2unpacker.cc:70
 hrpctrb2unpacker.cc:71
 hrpctrb2unpacker.cc:72
 hrpctrb2unpacker.cc:73
 hrpctrb2unpacker.cc:74
 hrpctrb2unpacker.cc:75
 hrpctrb2unpacker.cc:76
 hrpctrb2unpacker.cc:77
 hrpctrb2unpacker.cc:78
 hrpctrb2unpacker.cc:79
 hrpctrb2unpacker.cc:80
 hrpctrb2unpacker.cc:81
 hrpctrb2unpacker.cc:82
 hrpctrb2unpacker.cc:83
 hrpctrb2unpacker.cc:84
 hrpctrb2unpacker.cc:85
 hrpctrb2unpacker.cc:86
 hrpctrb2unpacker.cc:87
 hrpctrb2unpacker.cc:88
 hrpctrb2unpacker.cc:89
 hrpctrb2unpacker.cc:90
 hrpctrb2unpacker.cc:91
 hrpctrb2unpacker.cc:92
 hrpctrb2unpacker.cc:93
 hrpctrb2unpacker.cc:94
 hrpctrb2unpacker.cc:95
 hrpctrb2unpacker.cc:96
 hrpctrb2unpacker.cc:97
 hrpctrb2unpacker.cc:98
 hrpctrb2unpacker.cc:99
 hrpctrb2unpacker.cc:100
 hrpctrb2unpacker.cc:101
 hrpctrb2unpacker.cc:102
 hrpctrb2unpacker.cc:103
 hrpctrb2unpacker.cc:104
 hrpctrb2unpacker.cc:105
 hrpctrb2unpacker.cc:106
 hrpctrb2unpacker.cc:107
 hrpctrb2unpacker.cc:108
 hrpctrb2unpacker.cc:109
 hrpctrb2unpacker.cc:110
 hrpctrb2unpacker.cc:111
 hrpctrb2unpacker.cc:112
 hrpctrb2unpacker.cc:113
 hrpctrb2unpacker.cc:114
 hrpctrb2unpacker.cc:115
 hrpctrb2unpacker.cc:116
 hrpctrb2unpacker.cc:117
 hrpctrb2unpacker.cc:118
 hrpctrb2unpacker.cc:119
 hrpctrb2unpacker.cc:120
 hrpctrb2unpacker.cc:121
 hrpctrb2unpacker.cc:122
 hrpctrb2unpacker.cc:123
 hrpctrb2unpacker.cc:124
 hrpctrb2unpacker.cc:125
 hrpctrb2unpacker.cc:126
 hrpctrb2unpacker.cc:127
 hrpctrb2unpacker.cc:128
 hrpctrb2unpacker.cc:129
 hrpctrb2unpacker.cc:130
 hrpctrb2unpacker.cc:131
 hrpctrb2unpacker.cc:132
 hrpctrb2unpacker.cc:133
 hrpctrb2unpacker.cc:134
 hrpctrb2unpacker.cc:135
 hrpctrb2unpacker.cc:136
 hrpctrb2unpacker.cc:137
 hrpctrb2unpacker.cc:138
 hrpctrb2unpacker.cc:139
 hrpctrb2unpacker.cc:140
 hrpctrb2unpacker.cc:141
 hrpctrb2unpacker.cc:142
 hrpctrb2unpacker.cc:143
 hrpctrb2unpacker.cc:144
 hrpctrb2unpacker.cc:145
 hrpctrb2unpacker.cc:146
 hrpctrb2unpacker.cc:147
 hrpctrb2unpacker.cc:148
 hrpctrb2unpacker.cc:149
 hrpctrb2unpacker.cc:150
 hrpctrb2unpacker.cc:151
 hrpctrb2unpacker.cc:152
 hrpctrb2unpacker.cc:153
 hrpctrb2unpacker.cc:154
 hrpctrb2unpacker.cc:155
 hrpctrb2unpacker.cc:156
 hrpctrb2unpacker.cc:157
 hrpctrb2unpacker.cc:158
 hrpctrb2unpacker.cc:159
 hrpctrb2unpacker.cc:160
 hrpctrb2unpacker.cc:161
 hrpctrb2unpacker.cc:162
 hrpctrb2unpacker.cc:163
 hrpctrb2unpacker.cc:164
 hrpctrb2unpacker.cc:165
 hrpctrb2unpacker.cc:166
 hrpctrb2unpacker.cc:167
 hrpctrb2unpacker.cc:168
 hrpctrb2unpacker.cc:169
 hrpctrb2unpacker.cc:170
 hrpctrb2unpacker.cc:171
 hrpctrb2unpacker.cc:172
 hrpctrb2unpacker.cc:173
 hrpctrb2unpacker.cc:174
 hrpctrb2unpacker.cc:175
 hrpctrb2unpacker.cc:176
 hrpctrb2unpacker.cc:177
 hrpctrb2unpacker.cc:178
 hrpctrb2unpacker.cc:179
 hrpctrb2unpacker.cc:180
 hrpctrb2unpacker.cc:181
 hrpctrb2unpacker.cc:182
 hrpctrb2unpacker.cc:183
 hrpctrb2unpacker.cc:184
 hrpctrb2unpacker.cc:185
 hrpctrb2unpacker.cc:186
 hrpctrb2unpacker.cc:187
 hrpctrb2unpacker.cc:188
 hrpctrb2unpacker.cc:189
 hrpctrb2unpacker.cc:190
 hrpctrb2unpacker.cc:191
 hrpctrb2unpacker.cc:192
 hrpctrb2unpacker.cc:193
 hrpctrb2unpacker.cc:194
 hrpctrb2unpacker.cc:195
 hrpctrb2unpacker.cc:196
 hrpctrb2unpacker.cc:197
 hrpctrb2unpacker.cc:198
 hrpctrb2unpacker.cc:199
 hrpctrb2unpacker.cc:200
 hrpctrb2unpacker.cc:201
 hrpctrb2unpacker.cc:202
 hrpctrb2unpacker.cc:203
 hrpctrb2unpacker.cc:204
 hrpctrb2unpacker.cc:205
 hrpctrb2unpacker.cc:206
 hrpctrb2unpacker.cc:207
 hrpctrb2unpacker.cc:208
 hrpctrb2unpacker.cc:209
 hrpctrb2unpacker.cc:210
 hrpctrb2unpacker.cc:211
 hrpctrb2unpacker.cc:212
 hrpctrb2unpacker.cc:213
 hrpctrb2unpacker.cc:214
 hrpctrb2unpacker.cc:215
 hrpctrb2unpacker.cc:216
 hrpctrb2unpacker.cc:217
 hrpctrb2unpacker.cc:218
 hrpctrb2unpacker.cc:219
 hrpctrb2unpacker.cc:220
 hrpctrb2unpacker.cc:221
 hrpctrb2unpacker.cc:222
 hrpctrb2unpacker.cc:223
 hrpctrb2unpacker.cc:224
 hrpctrb2unpacker.cc:225
 hrpctrb2unpacker.cc:226
 hrpctrb2unpacker.cc:227
 hrpctrb2unpacker.cc:228
 hrpctrb2unpacker.cc:229
 hrpctrb2unpacker.cc:230
 hrpctrb2unpacker.cc:231
 hrpctrb2unpacker.cc:232
 hrpctrb2unpacker.cc:233
 hrpctrb2unpacker.cc:234
 hrpctrb2unpacker.cc:235
 hrpctrb2unpacker.cc:236
 hrpctrb2unpacker.cc:237
 hrpctrb2unpacker.cc:238
 hrpctrb2unpacker.cc:239
 hrpctrb2unpacker.cc:240
 hrpctrb2unpacker.cc:241
 hrpctrb2unpacker.cc:242
 hrpctrb2unpacker.cc:243
 hrpctrb2unpacker.cc:244
 hrpctrb2unpacker.cc:245
 hrpctrb2unpacker.cc:246
 hrpctrb2unpacker.cc:247
 hrpctrb2unpacker.cc:248
 hrpctrb2unpacker.cc:249
 hrpctrb2unpacker.cc:250
 hrpctrb2unpacker.cc:251
 hrpctrb2unpacker.cc:252
 hrpctrb2unpacker.cc:253
 hrpctrb2unpacker.cc:254
 hrpctrb2unpacker.cc:255
 hrpctrb2unpacker.cc:256
 hrpctrb2unpacker.cc:257
 hrpctrb2unpacker.cc:258
 hrpctrb2unpacker.cc:259
 hrpctrb2unpacker.cc:260
 hrpctrb2unpacker.cc:261
 hrpctrb2unpacker.cc:262
 hrpctrb2unpacker.cc:263
 hrpctrb2unpacker.cc:264
 hrpctrb2unpacker.cc:265
 hrpctrb2unpacker.cc:266
 hrpctrb2unpacker.cc:267
 hrpctrb2unpacker.cc:268
 hrpctrb2unpacker.cc:269
 hrpctrb2unpacker.cc:270
 hrpctrb2unpacker.cc:271
 hrpctrb2unpacker.cc:272
 hrpctrb2unpacker.cc:273
 hrpctrb2unpacker.cc:274
 hrpctrb2unpacker.cc:275
 hrpctrb2unpacker.cc:276
 hrpctrb2unpacker.cc:277
 hrpctrb2unpacker.cc:278
 hrpctrb2unpacker.cc:279
 hrpctrb2unpacker.cc:280
 hrpctrb2unpacker.cc:281
 hrpctrb2unpacker.cc:282
 hrpctrb2unpacker.cc:283
 hrpctrb2unpacker.cc:284
 hrpctrb2unpacker.cc:285