#ifndef HMDCUNPACKER__H
#define HMDCUNPACKER__H
#include "hldunpack.h"
#include "haddef.h"
#include "TString.h"
#define MAX_OEP_DECODE_VERSIONS 2
class HMdcUnpackerPar;
class HMdcRawStruct;
class HMdcLookupGeom;
class HCategory;
class HMdcDataword;
class HParSet;
class HMdcRaw;
class HMdcOepAddrCorrPar;
class HDetector;
class HTrbNetUnpacker;
class HMdcUnpacker: public HldUnpack
{
protected:
HMdcDataword *dataword;
HMdcRawStruct *rawc;
HMdcLookupGeom *lookupGeom;
HCategory *pMdcDataWordCat;
HCategory *pMdcOepStatusCat;
HMdcOepAddrCorrPar *addrCorrPar;
HDetector *pDetector;
HTrbNetUnpacker *trbNetUnpacker;
HMdcUnpackerPar *pUnpackerPar;
Bool_t continueDecodingAfterInconsistency;
Bool_t debugMode;
Int_t decodeVersion;
Bool_t doAddrCorrection;
Bool_t doMapOutUnusedChannels;
Bool_t consistencyCheck;
Bool_t fillDataWord;
Bool_t fillOepStatus;
Bool_t mdcDataWordCatPersistency;
Bool_t mdcOepStatusCatPersistency;
Bool_t doBitFlipCorr;
TString bitFlipVersion;
Int_t module;
Bool_t noComment;
Int_t sector;
Int_t subEvtId;
Int_t tdcMode;
Int_t badEventsCounter;
Bool_t checkConsistency(Int_t sector, Int_t module, Int_t mbo, Int_t tdc, Int_t channel);
HCategory *initCategory(Cat_t cat, const char *catname=" ", const char *detector="Mdc");
Int_t fillData(void);
Int_t fillMdcDataWord(Int_t sector,Int_t module,Int_t mbo,Int_t tdc);
Int_t fillStatus(void);
Bool_t getContinueDecodingAfterInconsistency(void){return continueDecodingAfterInconsistency;};
Bool_t getDebug(void){return debugMode;};
Bool_t getDoAddrCorrection(void){return doAddrCorrection;};
HMdcRaw* getFreeOrExistingSlot(Int_t sector,Int_t module,Int_t mbo,Int_t tdc);
void setDoAddrCorrection(Bool_t val){doAddrCorrection = val;};
void setContinueDecodingAfterInconsistency(Bool_t cont=kTRUE);
void setDefaults(void);
void correctBitFlip(HMdcRaw*,Int_t year,Int_t month,Int_t day);
public:
HMdcUnpacker(Int_t id, Bool_t dbg=kFALSE, Bool_t consisCheck=kFALSE);
HMdcUnpacker(HMdcUnpacker &unp);
~HMdcUnpacker(void);
Int_t execute(void);
Bool_t init(void);
Bool_t reinit(void);
Bool_t finalize(void);
Bool_t getDebugMode (void) const {return debugMode;};
UInt_t getDecodeVersion (void) {return decodeVersion;};
Int_t getSubEvtId (void) {return subEvtId;};
Int_t getTdcMode (void) {return tdcMode;};
void setFillDataWord(Bool_t b){fillDataWord=b;};
void setFillOepStatus(Bool_t b){fillOepStatus=b;};
void setPersistencyDataword(Bool_t b=kTRUE){mdcDataWordCatPersistency=b;};
void setPersistencyOepStatusData(Bool_t b=kTRUE){mdcOepStatusCatPersistency=b;};
void setQuietMode(Bool_t quiet=kTRUE,Bool_t warn=kTRUE);
void setDoBitFlipCorr(Bool_t corr=kTRUE,TString version="auto") { doBitFlipCorr=corr; bitFlipVersion = version; }
ClassDef(HMdcUnpacker,0)
};
#endif