ROOT logo
//_HADES_CLASS_DESCRIPTION
/////////////////////////////////////////////////////////////
//
//  HEmcTrb3Unpacker
//
//  Class for unpacking TRB3 data and filling
//    the Emc 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 "hemcdetector.h"
#include "hemcraw.h"
#include "hemctrb3lookup.h"
#include "hemctrb3unpacker.h"
#include "emcdef.h"
#include "htrbnetunpacker.h"

#include <iostream>

using namespace std;

ClassImp(HEmcTrb3Unpacker)

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

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

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

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

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

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

    HEmcDetector* det = (HEmcDetector*) gHades->getSetup()->getDetector("Emc");
    if (!det) {
        Error("init", "No EMC Detector found.");
        return kFALSE;
    }
    pRawCat = det->buildCategory(catEmcRaw);
    if (!pRawCat)  return kFALSE;
    else gHades->getCurrentEvent()->addCategory(catEmcRaw,pRawCat,"Emc");

    fLoc.set(2, 0, 0);

    fLookup = (HEmcTrb3Lookup*) (gHades->getRuntimeDb()->getContainer("EmcTrb3Lookup"));
    if (!fLookup) {
        Error("init", "No Pointer to parameter container EmcTrb3Lookup.");
        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 HEmcTrb3Unpacker::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;

		HEmcTrb3LookupBoard* 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 HEmcTrb3Lookup 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 HEmcTrb3Unpacker::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
        HEmcTrb3LookupBoard *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 EMC 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 EMC_USE_TRAILING_WITHOUT_LEADING_EDGES
            if (theRecord.rising_mult < 1)
                continue;
#endif
            HEmcTrb3LookupChan *chan = board->getChannel(i);
            if (chan == 0) {
                Warning("execute", "Missing channel %u in lookup table", i);
                continue;
            }
            chan->getAddress(fLoc[0], fLoc[1]);

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


	    Bool_t fastchannel = chan->isFastChannel();
            if(fastchannel && chan->isSlowChannel())
            {
                Warning("execute", "NEVER COME HERE - channel %u has both fast and slow property! skip it..", i);
                    continue;
            }

#ifdef EMC_USE_TIME_WINDOW
            // later we may get this from parameter container or other setup file. For the moment  fix it
            Double_t tmin = EMC_TIME_MIN;
            Double_t tmax = EMC_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 EMC_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 EMC_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 EMC_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, fastchannel) != 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 EMC_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, fastchannel)!=0)
                    continue;
#endif
                }
            } // for lix

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

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

#ifdef EMC_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, fastchannel)!=0)
		    continue;
            }
             ////////////////////
#endif
/////////////// end single trailing edges


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

Int_t HEmcTrb3Unpacker::addRawHit(Double_t t_leading, Double_t t_trailing,
        Bool_t isfastchannel) {

    // from here we got access to TDC channel and should map it to EMC channel
    HEmcRaw* raw = (HEmcRaw*) pRawCat->getObject(fLoc);
    if (!raw) {
        raw = (HEmcRaw *) pRawCat->getSlot(fLoc);
        if (raw) {
	    raw = new (raw) HEmcRaw;
	    Char_t row,col;
	    HEmcDetector::getRowCol(fLoc[1],row,col);
	    raw->setAddress(fLoc[0], fLoc[1],row,col);
        } else {
            if (debugFlag > 0)
                Warning("addRawHit()", "Can't get slot mod=%i, chan=%i",
                        fLoc[0], fLoc[1]);
            return -1;
        }
    }

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