ROOT logo
//_HADES_CLASS_DESCRIPTION
/////////////////////////////////////////////////////////////
//
//  HRpcTrb3Unpacker
//
//  Class for unpacking TRB3 data and filling
//    the Rpc Raw category
//
//  Basic subevent decoding and eventual TDC corrections are
//  performed by decode function in the base class
//  see: /base/datasource/htrb3unpacker.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 "hrpcdetector.h"
#include "hrpcraw.h"
#include "hrpctrb3lookup.h"
#include "hrpctrb3unpacker.h"
#include "rpcdef.h"
#include "htrbnetunpacker.h"

#include <iostream>

using namespace std;

ClassImp(HRpcTrb3Unpacker)

// JAM: this little switch will enable that we also take single leading edges into account
//#define RPC_USE_LEADING_WITHOUT_TRAILING_EDGES 1

// JAM: this little switch will enable that we also take single trailing edges into account
//#define RPC_USE_TRAILING_WITHOUT_LEADING_EDGES 1

// switch on filtering of tdc messages with first time window as defined below
//#define RPC_USE_TIME_WINDOW 1

// first time window to filter out some unusable hits. units are nanoseconds relative to trigger (channel 0)
#define RPC_TIME_MIN -300.0
#define RPC_TIME_MAX  1500.0
// TODO: optionally put this into some parameter container.
Bool_t HRpcTrb3Unpacker::fHasPrintedTDC = kFALSE;

HRpcTrb3Unpacker::HRpcTrb3Unpacker(vector<UInt_t>& ids) : HTrb3TdcUnpacker(ids),
    fLookup(0), fTimeRef(kTRUE), bStoreSpareChanData(kFALSE), fTimeShift(0.) {
	// constructor
	pRawCat = NULL;
}

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

    HRpcDetector* det = (HRpcDetector*) gHades->getSetup()->getDetector("Rpc");
    if (!det) {
        Error("init", "No RPC Detector found.");
        return kFALSE;
    }
    pRawCat = det->buildCategory(catRpcRaw);
    if (!pRawCat) return kFALSE;
    else gHades->getCurrentEvent()->addCategory(catRpcRaw,pRawCat,"Rpc");

    fLoc.set(3, 0, 0, 0);

    fLookup = (HRpcTrb3Lookup*) (gHades->getRuntimeDb()->getContainer("RpcTrb3Lookup"));
    if (!fLookup) {
        Error("init", "No Pointer to parameter container RpcTrb3Lookup.");
        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 HRpcTrb3Unpacker::reinit(void)
{
    // Called in the beginning of each run, used here to initialize TDC unpacker
    // if TDCs processors are not yet created, use parameter to instantiate them
    // if auto register TDC feature is used in setup of unpackers (by setting
    // setMinAddress()+setMaxAddress() manually)

    if (numTDC() == 0 )  // configure the tdcs only the first time we come here (do not if autoregister is used):
    {
	if (fMinAddress == 0 && fMaxAddress == 0)
	{
	    // here evaluate which subevents are configured in lookup table:
	    Int_t numTDC = fLookup->getSize();
	    Int_t offset = fLookup->getArrayOffset() ;
	    for (Int_t slot = 0; slot < numTDC; ++slot) {

		Int_t trbnetaddress = offset+slot;

		HRpcTrb3LookupBoard* tdc = fLookup->getBoard(trbnetaddress);
		if(tdc){
		    Int_t nChan = tdc->getSize();
		    if (trbnetaddress) {
			Int_t tindex = addTDC(trbnetaddress,nChan);
			Info("reinit", "Added TDC 0x%04x with %d channels from HRpcTrb3Lookup to map index %d",
			     trbnetaddress, nChan,tindex);
		    }
		}
	    }

	    // set the expected range for the automatic adding of TDC structures:

	    setMinAddress(fLookup->getArrayOffset());
	    setMaxAddress(fLookup->getArrayOffset() + fLookup->getSize());
	    fUseTDCFromLookup = kTRUE; // do not use auto register if set in
	    fHasPrintedTDC = kTRUE;

	} else {
            Info("reinit", "TDCs will be added in auto register mode between min address 0x%04x and max address 0x%04x!",fMinAddress,fMaxAddress);
	}
    }
    // we do not call reinit of superclass, since we do not use tdc calibration parameters in hydra anymore!
    return kTRUE;
}

Int_t HRpcTrb3Unpacker::execute(void) {



    if (gHades->isCalibration()) {
        //calibration event
        return 1;
    }

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

    // if there is no data, do not try to analyze it
    // pSubEvt - make sure that there is something for decoding
    if (!pSubEvt)
        return 1;

    Int_t nEvt = gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();

    // decodes the subevent and fill arrays, see: htrb3unpacker.h
    if (!decode()) {
        Error("decode",
                "subsubevent decoding failed!!! Evt Nr : %i SubEvtId: %x", nEvt,
                getSubEvtId());
        return -1;
    }

    // correct for reference time here!
    // we don't check for proper time reference correction
    // to avoid event skipping
    // this must be done better in future but now is a good workaround

    if (fTimeRef) {
	correctRefTimeCh(REFCHAN);
    }

    const Double_t timeUnit=1e9;


    for (UInt_t ntdc = 0; ntdc < numActiveTDC(); ntdc++) {
        HTrb3TdcUnpacker::TDC* tdc = getActiveTDC(ntdc);

        // check the lookup table
        HRpcTrb3LookupBoard *board = fLookup->getBoard(tdc->getTrbAddr());
        if (!board) {
            if (debugFlag > 0)
                Warning("execute",
                        "Evt Nr : %i  SubEvId: %x (%i) unpacked but TDC Board 0x%x not in lookup table",
                        nEvt, getSubEvtId(), getSubEvtId(), tdc->getTrbAddr());
            continue;
        }

	// fill the raw category for RPC detector
        for (UInt_t i = 0; i < tdc->numChannels(); i++) {
            if(REFCHAN == i) continue;

	    HTrb3TdcUnpacker::ChannelRec& theRecord = tdc->getCh(i);

// ignore channels without rising hits already here
#ifndef RPC_USE_TRAILING_WITHOUT_LEADING_EDGES
            if (theRecord.rising_mult < 1)
                continue;
#endif
            HRpcTrb3LookupChan *chan = board->getChannel(i);
            if (chan == 0) {
                Warning("execute", "Missing channel %u in lookup table", i);
                continue;
            }
            chan->getAddress(fLoc[0], fLoc[1], fLoc[2]);

	    // if channel not connected in lookup-table, ignore it
	    if (fLoc[0] < 0)  { // empty slot default is -1
		continue;
	    }
            /*
	    // exclude all not defined and broken channels
            if (!chan->isDefinedChannel() || chan->isBrokenChannel())
		continue;
            */
            if(!bStoreSpareChanData && fLoc[2]>31) continue;

            if (chan->getSide() == 'n' ) continue; // not connected

#ifdef RPC_USE_TIME_WINDOW
            // later we may get this from parameter container or other setup file. For the moment  fix it
            Double_t tmin = RPC_TIME_MIN;
            Double_t tmax = RPC_TIME_MAX;
#endif
            UInt_t lix = 0;
            for (lix = 0; lix < theRecord.rising_mult; ++lix) {
                Double_t tm0 = theRecord.rising_tm[lix] * timeUnit;
                if (debugFlag > 0)
                    Warning("execute", "JJJJ current hit leading: tm0:%e, apply time shift:%e", tm0, fTimeShift);
                tm0 +=fTimeShift;

#ifdef RPC_USE_TIME_WINDOW
                if ((tm0 < tmin) || (tm0 > tmax)) {
                    if (debugFlag > 0)
                        Warning("execute",
                                "JJJJ Rejecting leading hit outside tmin:%e or tmax:%e",
                                tmin, tmax);
                    continue; // leading edge outside the time window
                }

#endif
                // now look for corresponding trailing edge:
                if (lix < theRecord.falling_mult) {
                    Double_t tm1 = theRecord.falling_tm[lix] * timeUnit;
                    if (debugFlag > 0)
                        Warning("execute", "JJJJ current hit falling: tm1:%e, apply time shift:%e",
                                tm1, fTimeShift);
                    tm1 +=fTimeShift;


#ifdef RPC_USE_TIME_WINDOW
                    if ((tm1 < tmin) || (tm1 > tmax)) {
                        if (debugFlag > 0)
                            Warning("execute",
                                    "JJJJ Rejecting trailing hit outside tmin:%e or tmax:%e",
                                    tmin, tmax);

#ifdef RPC_USE_LEADING_WITHOUT_TRAILING_EDGES
                        tm1=0.0; // still we take incomplete leading edge
#else
                        continue; // skip both leading and trailing
#endif
                    } // if ((tm1 < tmin) || (tm1 > tmax))


#endif
                    //
                    // TODO: optional filter out hits that do not fulfill the time threshold parameter
                    //Double_t tot=tm1-tm0;
                    // however, this can be also done in subsequent calibrator object

/////// ACCEPTED HITS ARE HERE //////////////////////////////////
                    // regular case with leading/trailing edges of ChannelRec in order
                    if (addRawHit(tm0, tm1, chan) != 0)
                        continue; // we will skip this if this channel is not mapped to detector cell

////////// END ACCEPTED HITS/////////////////////////////////////
                } // if lix<theRecord.falling_mul
                else {
#ifdef RPC_USE_LEADING_WITHOUT_TRAILING_EDGES
                    // here we treat hist with only leading edges, no corresponding trailing edge
                    // such hit will deliver tot width of -1
                    if(addRawHit(tm0, 0.0, chan)!=0)
                    continue;
#endif
                }
            } // for lix

////////////// optional now check for single trailing edges?
#ifdef RPC_USE_TRAILING_WITHOUT_LEADING_EDGES

            for (UInt_t tix=lix; tix< theRecord.falling_mult; ++tix)
            {
                Double_t tm1=theRecord.falling_tm[tix] * timeUnit;

#ifdef RPC_USE_TIME_WINDOW
                    if ((tm1 < tmin) || (tm1 > tmax)) {

                        if (debugFlag > 0)
                            Warning("execute",
                                    "JJJJ Rejecting trailing hit outside tmin:%e or tmax:%e",
                                    tmin, tmax);
			continue;
#endif

                if(addRawHit(0.0, tm1, chan)!=0)
		    continue;
            }
             ////////////////////
#endif
/////////////// end single trailing edges


        } // loop over TDC channels
    } // loop over TDC
    return 1;
}

Int_t HRpcTrb3Unpacker::addRawHit(Double_t t_leading, Double_t t_trailing,HRpcTrb3LookupChan *chan)
{

    // from here we got access to TDC channel and should map it to RPC channel
    HRpcRaw* raw = (HRpcRaw*) pRawCat->getObject(fLoc);

    if (!raw) {
	raw = (HRpcRaw *) pRawCat->getSlot(fLoc);
	raw = new (raw) HRpcRaw;
	if(raw){
	    raw->setAddress(fLoc[0], fLoc[1], fLoc[2]);
	} else {
	    if (debugFlag > 0)
		Warning("addRawHit()", "Can't get slot sec=%i, column=%i, cell=%i",
			fLoc[0], fLoc[1],fLoc[2]);
	    return -1;
	}
    }

    Char_t side     = chan->getSide();
    //Int_t feAddress = chan->getFeAddress();

    if(side=='r') {
	raw->setRightTime(t_leading);
	raw->setRightTot(t_trailing - t_leading);
	//raw->setRightTime2(t_trailing);
	//raw->setRightTot2(t_trailing - t_leading);
	//raw->setRightTotLast(t_trailing - t_leading);
	//raw->setRightLogBit(xxx);
	//raw->setRightFeeAddress(feAddress);
    } else if (side=='l') {
	raw->setLeftTime(t_leading);
	raw->setLeftTot(t_trailing - t_leading);
	//raw->setLeftTime2(t_trailing);
	//raw->setLeftTot2(t_trailing - t_leading);
	//raw->setLeftTotLast(t_trailing - t_leading);
	//raw->setLeftLogBit(xxx);
	//raw->setLeftFeeAddress(feAddress);
    }



    if (debugFlag > 1)
        Warning("addRawHit",
		"ADDING hit for sec:%d column:%d cell:%d tm0:%e tm1:%e",
		fLoc[0], fLoc[1], fLoc[2], t_leading, t_trailing);
    return 0;
}
 hrpctrb3unpacker.cc:1
 hrpctrb3unpacker.cc:2
 hrpctrb3unpacker.cc:3
 hrpctrb3unpacker.cc:4
 hrpctrb3unpacker.cc:5
 hrpctrb3unpacker.cc:6
 hrpctrb3unpacker.cc:7
 hrpctrb3unpacker.cc:8
 hrpctrb3unpacker.cc:9
 hrpctrb3unpacker.cc:10
 hrpctrb3unpacker.cc:11
 hrpctrb3unpacker.cc:12
 hrpctrb3unpacker.cc:13
 hrpctrb3unpacker.cc:14
 hrpctrb3unpacker.cc:15
 hrpctrb3unpacker.cc:16
 hrpctrb3unpacker.cc:17
 hrpctrb3unpacker.cc:18
 hrpctrb3unpacker.cc:19
 hrpctrb3unpacker.cc:20
 hrpctrb3unpacker.cc:21
 hrpctrb3unpacker.cc:22
 hrpctrb3unpacker.cc:23
 hrpctrb3unpacker.cc:24
 hrpctrb3unpacker.cc:25
 hrpctrb3unpacker.cc:26
 hrpctrb3unpacker.cc:27
 hrpctrb3unpacker.cc:28
 hrpctrb3unpacker.cc:29
 hrpctrb3unpacker.cc:30
 hrpctrb3unpacker.cc:31
 hrpctrb3unpacker.cc:32
 hrpctrb3unpacker.cc:33
 hrpctrb3unpacker.cc:34
 hrpctrb3unpacker.cc:35
 hrpctrb3unpacker.cc:36
 hrpctrb3unpacker.cc:37
 hrpctrb3unpacker.cc:38
 hrpctrb3unpacker.cc:39
 hrpctrb3unpacker.cc:40
 hrpctrb3unpacker.cc:41
 hrpctrb3unpacker.cc:42
 hrpctrb3unpacker.cc:43
 hrpctrb3unpacker.cc:44
 hrpctrb3unpacker.cc:45
 hrpctrb3unpacker.cc:46
 hrpctrb3unpacker.cc:47
 hrpctrb3unpacker.cc:48
 hrpctrb3unpacker.cc:49
 hrpctrb3unpacker.cc:50
 hrpctrb3unpacker.cc:51
 hrpctrb3unpacker.cc:52
 hrpctrb3unpacker.cc:53
 hrpctrb3unpacker.cc:54
 hrpctrb3unpacker.cc:55
 hrpctrb3unpacker.cc:56
 hrpctrb3unpacker.cc:57
 hrpctrb3unpacker.cc:58
 hrpctrb3unpacker.cc:59
 hrpctrb3unpacker.cc:60
 hrpctrb3unpacker.cc:61
 hrpctrb3unpacker.cc:62
 hrpctrb3unpacker.cc:63
 hrpctrb3unpacker.cc:64
 hrpctrb3unpacker.cc:65
 hrpctrb3unpacker.cc:66
 hrpctrb3unpacker.cc:67
 hrpctrb3unpacker.cc:68
 hrpctrb3unpacker.cc:69
 hrpctrb3unpacker.cc:70
 hrpctrb3unpacker.cc:71
 hrpctrb3unpacker.cc:72
 hrpctrb3unpacker.cc:73
 hrpctrb3unpacker.cc:74
 hrpctrb3unpacker.cc:75
 hrpctrb3unpacker.cc:76
 hrpctrb3unpacker.cc:77
 hrpctrb3unpacker.cc:78
 hrpctrb3unpacker.cc:79
 hrpctrb3unpacker.cc:80
 hrpctrb3unpacker.cc:81
 hrpctrb3unpacker.cc:82
 hrpctrb3unpacker.cc:83
 hrpctrb3unpacker.cc:84
 hrpctrb3unpacker.cc:85
 hrpctrb3unpacker.cc:86
 hrpctrb3unpacker.cc:87
 hrpctrb3unpacker.cc:88
 hrpctrb3unpacker.cc:89
 hrpctrb3unpacker.cc:90
 hrpctrb3unpacker.cc:91
 hrpctrb3unpacker.cc:92
 hrpctrb3unpacker.cc:93
 hrpctrb3unpacker.cc:94
 hrpctrb3unpacker.cc:95
 hrpctrb3unpacker.cc:96
 hrpctrb3unpacker.cc:97
 hrpctrb3unpacker.cc:98
 hrpctrb3unpacker.cc:99
 hrpctrb3unpacker.cc:100
 hrpctrb3unpacker.cc:101
 hrpctrb3unpacker.cc:102
 hrpctrb3unpacker.cc:103
 hrpctrb3unpacker.cc:104
 hrpctrb3unpacker.cc:105
 hrpctrb3unpacker.cc:106
 hrpctrb3unpacker.cc:107
 hrpctrb3unpacker.cc:108
 hrpctrb3unpacker.cc:109
 hrpctrb3unpacker.cc:110
 hrpctrb3unpacker.cc:111
 hrpctrb3unpacker.cc:112
 hrpctrb3unpacker.cc:113
 hrpctrb3unpacker.cc:114
 hrpctrb3unpacker.cc:115
 hrpctrb3unpacker.cc:116
 hrpctrb3unpacker.cc:117
 hrpctrb3unpacker.cc:118
 hrpctrb3unpacker.cc:119
 hrpctrb3unpacker.cc:120
 hrpctrb3unpacker.cc:121
 hrpctrb3unpacker.cc:122
 hrpctrb3unpacker.cc:123
 hrpctrb3unpacker.cc:124
 hrpctrb3unpacker.cc:125
 hrpctrb3unpacker.cc:126
 hrpctrb3unpacker.cc:127
 hrpctrb3unpacker.cc:128
 hrpctrb3unpacker.cc:129
 hrpctrb3unpacker.cc:130
 hrpctrb3unpacker.cc:131
 hrpctrb3unpacker.cc:132
 hrpctrb3unpacker.cc:133
 hrpctrb3unpacker.cc:134
 hrpctrb3unpacker.cc:135
 hrpctrb3unpacker.cc:136
 hrpctrb3unpacker.cc:137
 hrpctrb3unpacker.cc:138
 hrpctrb3unpacker.cc:139
 hrpctrb3unpacker.cc:140
 hrpctrb3unpacker.cc:141
 hrpctrb3unpacker.cc:142
 hrpctrb3unpacker.cc:143
 hrpctrb3unpacker.cc:144
 hrpctrb3unpacker.cc:145
 hrpctrb3unpacker.cc:146
 hrpctrb3unpacker.cc:147
 hrpctrb3unpacker.cc:148
 hrpctrb3unpacker.cc:149
 hrpctrb3unpacker.cc:150
 hrpctrb3unpacker.cc:151
 hrpctrb3unpacker.cc:152
 hrpctrb3unpacker.cc:153
 hrpctrb3unpacker.cc:154
 hrpctrb3unpacker.cc:155
 hrpctrb3unpacker.cc:156
 hrpctrb3unpacker.cc:157
 hrpctrb3unpacker.cc:158
 hrpctrb3unpacker.cc:159
 hrpctrb3unpacker.cc:160
 hrpctrb3unpacker.cc:161
 hrpctrb3unpacker.cc:162
 hrpctrb3unpacker.cc:163
 hrpctrb3unpacker.cc:164
 hrpctrb3unpacker.cc:165
 hrpctrb3unpacker.cc:166
 hrpctrb3unpacker.cc:167
 hrpctrb3unpacker.cc:168
 hrpctrb3unpacker.cc:169
 hrpctrb3unpacker.cc:170
 hrpctrb3unpacker.cc:171
 hrpctrb3unpacker.cc:172
 hrpctrb3unpacker.cc:173
 hrpctrb3unpacker.cc:174
 hrpctrb3unpacker.cc:175
 hrpctrb3unpacker.cc:176
 hrpctrb3unpacker.cc:177
 hrpctrb3unpacker.cc:178
 hrpctrb3unpacker.cc:179
 hrpctrb3unpacker.cc:180
 hrpctrb3unpacker.cc:181
 hrpctrb3unpacker.cc:182
 hrpctrb3unpacker.cc:183
 hrpctrb3unpacker.cc:184
 hrpctrb3unpacker.cc:185
 hrpctrb3unpacker.cc:186
 hrpctrb3unpacker.cc:187
 hrpctrb3unpacker.cc:188
 hrpctrb3unpacker.cc:189
 hrpctrb3unpacker.cc:190
 hrpctrb3unpacker.cc:191
 hrpctrb3unpacker.cc:192
 hrpctrb3unpacker.cc:193
 hrpctrb3unpacker.cc:194
 hrpctrb3unpacker.cc:195
 hrpctrb3unpacker.cc:196
 hrpctrb3unpacker.cc:197
 hrpctrb3unpacker.cc:198
 hrpctrb3unpacker.cc:199
 hrpctrb3unpacker.cc:200
 hrpctrb3unpacker.cc:201
 hrpctrb3unpacker.cc:202
 hrpctrb3unpacker.cc:203
 hrpctrb3unpacker.cc:204
 hrpctrb3unpacker.cc:205
 hrpctrb3unpacker.cc:206
 hrpctrb3unpacker.cc:207
 hrpctrb3unpacker.cc:208
 hrpctrb3unpacker.cc:209
 hrpctrb3unpacker.cc:210
 hrpctrb3unpacker.cc:211
 hrpctrb3unpacker.cc:212
 hrpctrb3unpacker.cc:213
 hrpctrb3unpacker.cc:214
 hrpctrb3unpacker.cc:215
 hrpctrb3unpacker.cc:216
 hrpctrb3unpacker.cc:217
 hrpctrb3unpacker.cc:218
 hrpctrb3unpacker.cc:219
 hrpctrb3unpacker.cc:220
 hrpctrb3unpacker.cc:221
 hrpctrb3unpacker.cc:222
 hrpctrb3unpacker.cc:223
 hrpctrb3unpacker.cc:224
 hrpctrb3unpacker.cc:225
 hrpctrb3unpacker.cc:226
 hrpctrb3unpacker.cc:227
 hrpctrb3unpacker.cc:228
 hrpctrb3unpacker.cc:229
 hrpctrb3unpacker.cc:230
 hrpctrb3unpacker.cc:231
 hrpctrb3unpacker.cc:232
 hrpctrb3unpacker.cc:233
 hrpctrb3unpacker.cc:234
 hrpctrb3unpacker.cc:235
 hrpctrb3unpacker.cc:236
 hrpctrb3unpacker.cc:237
 hrpctrb3unpacker.cc:238
 hrpctrb3unpacker.cc:239
 hrpctrb3unpacker.cc:240
 hrpctrb3unpacker.cc:241
 hrpctrb3unpacker.cc:242
 hrpctrb3unpacker.cc:243
 hrpctrb3unpacker.cc:244
 hrpctrb3unpacker.cc:245
 hrpctrb3unpacker.cc:246
 hrpctrb3unpacker.cc:247
 hrpctrb3unpacker.cc:248
 hrpctrb3unpacker.cc:249
 hrpctrb3unpacker.cc:250
 hrpctrb3unpacker.cc:251
 hrpctrb3unpacker.cc:252
 hrpctrb3unpacker.cc:253
 hrpctrb3unpacker.cc:254
 hrpctrb3unpacker.cc:255
 hrpctrb3unpacker.cc:256
 hrpctrb3unpacker.cc:257
 hrpctrb3unpacker.cc:258
 hrpctrb3unpacker.cc:259
 hrpctrb3unpacker.cc:260
 hrpctrb3unpacker.cc:261
 hrpctrb3unpacker.cc:262
 hrpctrb3unpacker.cc:263
 hrpctrb3unpacker.cc:264
 hrpctrb3unpacker.cc:265
 hrpctrb3unpacker.cc:266
 hrpctrb3unpacker.cc:267
 hrpctrb3unpacker.cc:268
 hrpctrb3unpacker.cc:269
 hrpctrb3unpacker.cc:270
 hrpctrb3unpacker.cc:271
 hrpctrb3unpacker.cc:272
 hrpctrb3unpacker.cc:273
 hrpctrb3unpacker.cc:274
 hrpctrb3unpacker.cc:275
 hrpctrb3unpacker.cc:276
 hrpctrb3unpacker.cc:277
 hrpctrb3unpacker.cc:278
 hrpctrb3unpacker.cc:279
 hrpctrb3unpacker.cc:280
 hrpctrb3unpacker.cc:281
 hrpctrb3unpacker.cc:282
 hrpctrb3unpacker.cc:283
 hrpctrb3unpacker.cc:284
 hrpctrb3unpacker.cc:285
 hrpctrb3unpacker.cc:286
 hrpctrb3unpacker.cc:287
 hrpctrb3unpacker.cc:288
 hrpctrb3unpacker.cc:289
 hrpctrb3unpacker.cc:290
 hrpctrb3unpacker.cc:291
 hrpctrb3unpacker.cc:292
 hrpctrb3unpacker.cc:293
 hrpctrb3unpacker.cc:294
 hrpctrb3unpacker.cc:295
 hrpctrb3unpacker.cc:296
 hrpctrb3unpacker.cc:297
 hrpctrb3unpacker.cc:298
 hrpctrb3unpacker.cc:299
 hrpctrb3unpacker.cc:300
 hrpctrb3unpacker.cc:301
 hrpctrb3unpacker.cc:302
 hrpctrb3unpacker.cc:303
 hrpctrb3unpacker.cc:304
 hrpctrb3unpacker.cc:305
 hrpctrb3unpacker.cc:306
 hrpctrb3unpacker.cc:307
 hrpctrb3unpacker.cc:308
 hrpctrb3unpacker.cc:309
 hrpctrb3unpacker.cc:310
 hrpctrb3unpacker.cc:311
 hrpctrb3unpacker.cc:312
 hrpctrb3unpacker.cc:313
 hrpctrb3unpacker.cc:314
 hrpctrb3unpacker.cc:315
 hrpctrb3unpacker.cc:316
 hrpctrb3unpacker.cc:317
 hrpctrb3unpacker.cc:318
 hrpctrb3unpacker.cc:319
 hrpctrb3unpacker.cc:320
 hrpctrb3unpacker.cc:321
 hrpctrb3unpacker.cc:322
 hrpctrb3unpacker.cc:323
 hrpctrb3unpacker.cc:324
 hrpctrb3unpacker.cc:325
 hrpctrb3unpacker.cc:326
 hrpctrb3unpacker.cc:327
 hrpctrb3unpacker.cc:328
 hrpctrb3unpacker.cc:329
 hrpctrb3unpacker.cc:330
 hrpctrb3unpacker.cc:331
 hrpctrb3unpacker.cc:332
 hrpctrb3unpacker.cc:333
 hrpctrb3unpacker.cc:334
 hrpctrb3unpacker.cc:335
 hrpctrb3unpacker.cc:336
 hrpctrb3unpacker.cc:337
 hrpctrb3unpacker.cc:338
 hrpctrb3unpacker.cc:339
 hrpctrb3unpacker.cc:340
 hrpctrb3unpacker.cc:341
 hrpctrb3unpacker.cc:342
 hrpctrb3unpacker.cc:343
 hrpctrb3unpacker.cc:344
 hrpctrb3unpacker.cc:345
 hrpctrb3unpacker.cc:346
 hrpctrb3unpacker.cc:347
 hrpctrb3unpacker.cc:348
 hrpctrb3unpacker.cc:349
 hrpctrb3unpacker.cc:350
 hrpctrb3unpacker.cc:351
 hrpctrb3unpacker.cc:352
 hrpctrb3unpacker.cc:353
 hrpctrb3unpacker.cc:354
 hrpctrb3unpacker.cc:355
 hrpctrb3unpacker.cc:356
 hrpctrb3unpacker.cc:357
 hrpctrb3unpacker.cc:358
 hrpctrb3unpacker.cc:359
 hrpctrb3unpacker.cc:360
 hrpctrb3unpacker.cc:361
 hrpctrb3unpacker.cc:362
 hrpctrb3unpacker.cc:363
 hrpctrb3unpacker.cc:364
 hrpctrb3unpacker.cc:365
 hrpctrb3unpacker.cc:366
 hrpctrb3unpacker.cc:367
 hrpctrb3unpacker.cc:368
 hrpctrb3unpacker.cc:369
 hrpctrb3unpacker.cc:370
 hrpctrb3unpacker.cc:371
 hrpctrb3unpacker.cc:372
 hrpctrb3unpacker.cc:373
 hrpctrb3unpacker.cc:374
 hrpctrb3unpacker.cc:375
 hrpctrb3unpacker.cc:376
 hrpctrb3unpacker.cc:377