// File: $RCSfile: hmdcunpacker.h,v $
//
// Author (previous Co-Author) Peter Zumbruch
// old Author: Walter Karig
//
// Version: $Revision: 1.45 $
// Modified by $Author: zumbruch $ on $Date: 2006-06-08 13:56:57 $
////////////////////////////////////////////////////////////
#ifndef HMDCUNPACKER_H
#define HMDCUNPACKER_H
#include "hldunpack.h"
#include "TArrayI.h"
#include "hmdcevreadout.h"
#include "TTree.h"
#include "TNtuple.h"
#include "TString.h"
#include "hmdcdef.h"
#include "hmdcdataword.h"
#include "hmdcraweventheader.h"
#include "hmdcrawstruct.h"
#include "TUnixSystem.h"
#include "hmdcraw.h"
#include "hcategory.h"
class HMdcUnpacker: public HldUnpack {
protected:
static HMdcDataWord* dataword; //!
static Bool_t noComment; //! switch off all prints
HCategory *pMdcRawEventHeaderCat;
HCategory *pMdcDataWordCat;
HMdcEvReadout *pReadout; //!Lookup table
HMdcRawStruct *rawc;
Int_t subEvtId;//!
Int_t tdcMode; // tdcMode defines the mode the tdc has taken data:
// The TDC can be operated in 2 different modes:
// mode 0 (default) : trigger on leading and trailing edge
// mode 1 : trigger on 2 leading edges:
UInt_t subHeaderDecodeVersion; //! version number of subHeader decoding
UInt_t decodeVersion; //! version number of data word decoding
UInt_t maxDecodeVersion; //! maximum number of decode versions
Bool_t debug; //! flag for debug mode w/ extended output
Bool_t consistencyCheck; //! flag for consistency check on the data words
Bool_t disableSamNrConsistencyCheck; //! flag to disable check on SAM Nr to sector check
Bool_t mdcRawEventHeaderCatPersistency; //! flag for persistency of HMdcRawEventHeader category
Bool_t mdcDataWordCatPersistency; //! flag for persistency of HMdcDataWord category
Bool_t fillDataWord; //! flag to enable filling of the dataword
Bool_t continueDecodingAfterInconsistency; //! flag to enable stubborn behaviour of unpacker
Int_t determineDecodeVersionCtr; //! internal counter
Bool_t standalone; //! If MDCs are not run via the common daq system, but in a standalone mode, ...
//! the event trig type is not provided.
//! In case of calibration triggers which are indicated in addition
//! by the roc header information, the trigger type is set
//! to calibration event.
Bool_t versionSetManual; //! switch for version setting of unpacker
Int_t setup[6][4]; //! setup of Mdc (sec,mod)
Bool_t unpackerDebug; //! switch to display debug infos of the unpacker software
UInt_t rocEvtHeaderSize; //! size of the roc header;
// exclude black list feature
Bool_t excludeBlackList; //! switch to exclude explicitly data words
Int_t* excludedBlackListCounters; //! counters of excluded data words
// preliminary parameter, to be replaced by a lookup table
UInt_t* excludeBlackListMask; //! list of hex masks on dataword for matching test with adress, preliminary parameter, to be replaced by a lookup table
UInt_t* excludeBlackListAdress; //! list of adresses for comparison, preliminary parameter, to be replaced by a lookup table
Int_t excludeBlackListSize; //! number of adresses/mask of black list
TString excludeBlackListContext; //! context string for different exclude list, default:"UNDEFINED";
// recover black listed
Bool_t recoverBlackList; //! switch to recover explicitly data words
Int_t* recoveredBlackListCounters; //! counters of recovered data words
// preliminary parameter, to be replaced by a lookup table
UInt_t* recoverBlackListMask; //! list of hex masks on dataword for matching test with adress, preliminary parameter, to be replaced by a lookup table
UInt_t* recoverBlackListAdress; //! list of adresses for comparison, preliminary parameter, to be replaced by a lookup table
Int_t recoverBlackListSize; //! number of adresses/mask of black list
TString recoverBlackListContext; //! context string for different recover list, default:"UNDEFINED";
UInt_t* recoveryStorage; //! pointer to array to store data values for recovery
UInt_t recoveryStorageCounter; //! size of recovery array
UInt_t createBlackListRecoveryTools; //! 0 if not active else in hex date of time
/* consts and enums */
enum { versionSwitchId = 1033466400 } ; //! date --date='2002-10-01 12:00:00' +%s
enum { COMPRESSED = 2, UNCOMPRESSED = 1 };
enum { UNCOMPRESSED_ROC_HEADERSIZE = 3, COMPRESSED_ROC_HEADERSIZE=0} ;
static const TString excludeBlackListContextDefaultString;
static const TString recoverBlackListContextDefaultString;
public:
// Range for MDC subevents is 200 - 299
HMdcUnpacker(Int_t id, Bool_t dbg=kFALSE, Bool_t consisCheck=kFALSE);
HMdcUnpacker(Int_t id, Int_t version, Bool_t dbg=kFALSE, Bool_t consisCheck=kFALSE);
HMdcUnpacker(HMdcUnpacker& mdc);
~HMdcUnpacker();
Bool_t init();
Bool_t reinit();
Int_t execute();
Bool_t finalize();
Bool_t checkMdcSetup(Int_t sector, Int_t module);
Bool_t checkMboRawStructBounds(Int_t sector, Int_t module, Int_t mbo, Int_t tdc);
Bool_t decodeSubHeader(UInt_t *data, UInt_t &subEvtSize);
Bool_t decodingMode(void);
void determineDecodeVersion(void);
Bool_t getConsistencyCheck(void){return consistencyCheck;};
Bool_t getContinueDecodingAfterInconsistency(void){return continueDecodingAfterInconsistency;};
Bool_t getDebug(void){return debug;};
UInt_t getDecodeVersion(void);
UInt_t getMaxDecodeVersion(void){return maxDecodeVersion;};
Bool_t getExcludeBlackList(void) {return excludeBlackList;};
Bool_t getRecoverBlackList(void) {return recoverBlackList;};
Bool_t getFillDataWord(void){return fillDataWord;};
void getMdcSetup(void);
Bool_t getPersistencyRawEventHeader(void){return mdcRawEventHeaderCatPersistency;};
Bool_t getPersistencyDataWord(void){return mdcDataWordCatPersistency;};
Bool_t getStandalone(void) {return standalone;};
Int_t getSubEvtId(void) const { return subEvtId; }
Int_t getSubEvtIdToSamNr(Int_t subEvtId,Bool_t expectUndefined=kFALSE);
UInt_t getSubHeaderDecodeVersion(void){return subHeaderDecodeVersion;};
UInt_t getRocEvtHeaderSize(void){return rocEvtHeaderSize;};
Int_t getTime(void) const { return dataword->getTime();};
Int_t getTdc(const Int_t chip, const Int_t chan) const {return 8*chip + chan;};
Int_t getTdcMode(void);
Bool_t getUnpackerDebug(void){return unpackerDebug;};
HCategory* initCategory(Cat_t cat, TString catname=" ", TString detector="Mdc");
void print(TString t="");
void setConsistencyCheck(Bool_t cons=kTRUE){consistencyCheck=cons;};
void setContinueDecodingAfterInconsistency(Bool_t cont=kTRUE);
void setDebug(Bool_t deb=kTRUE){debug=deb;};
void setDecodeVersion(UInt_t version, Bool_t manual=kTRUE);
void setDefaults(void);
void setDisableSamNrConsistencyCheck(Bool_t cons=kTRUE){disableSamNrConsistencyCheck=cons;};
void setErrorOutputFileName(Char_t* f){Warning("setErrorOutputFileName()","obsolete function, no effect");};
void SetErrorOutputFileName(Char_t* c){setErrorOutputFileName(c);};
void setExcludeBlackList(Bool_t b=kTRUE);
void setExcludeBlackListContext(TString s);
void setExcludeBlackList(TString s);
void enableExcludeBlackList(TString context);
void disableExcludeBlackList(void);
void setRecoverBlackList(Bool_t b=kTRUE);
void setRecoverBlackListContext(TString s);
void setRecoverBlackList(TString s);
void enableRecoverBlackList(TString context);
void disableRecoverBlackList(void);
void setFillDataWord(Bool_t b=kTRUE)
{
Warning("setFillDataWord()","Functionality switch disabled until bug is found - default: kFALSE");
//fillDataWord=b;
};
void setPersistencyRawEventHeader(Bool_t b=kTRUE){mdcRawEventHeaderCatPersistency=b;};
void setRocEvtHeaderSize(UInt_t ui=3);
void setPersistencyDataWord(Bool_t b=kTRUE){mdcDataWordCatPersistency=b;};
void setStandalone(Bool_t b=kTRUE){standalone = b;};
void setSubHeaderDecodeVersion(UInt_t ui, Bool_t manual=kTRUE)
{subHeaderDecodeVersion=ui; versionSetManual=manual;};
void setTdcMode(int);
void setUnpackerDebug(Bool_t b=kTRUE){unpackerDebug=b;};
Bool_t testMdcSetup(Int_t sec, Int_t mod);
void setQuietMode(Bool_t quiet=kTRUE);
static Bool_t getQuietMode(void);
int compareEventDateTimeTo(UInt_t cyear, UInt_t cmonth=1,
UInt_t cday=1, UInt_t chour=0,
UInt_t cmin=0, UInt_t csec=0);
static TString myexec(char *);
protected:
Bool_t excludeBlackListData(UInt_t* data);
void errorAndExitCompareEventDateTimeTo(void);
void errorAndExitDetermineDecodeVersion(void);
void errorAndExitGetMdcSetup(void);
void errorAndExitFillUnknownReturnValueOfFillData(void);
void errorAndExitInitExcludeBlackListNoValidContext(void);
void errorAndExitInitRecoverBlackListNoValidContext(void);
void errorAndExitRecoverBlackListSep2005UnknownReturnValueOfFillData(void);
void errorAndExitSetDecodeVersion(UInt_t version);
void errorAndExitSetExcludeBlackListObsoleteCall(void);
void errorAndExitSetRecoverBlackListObsoleteCall(void);
void errorCheckMdcSetup(Int_t sector, Int_t module);
void errorCheckMboRawStructBoundsOutOfBounds(Int_t value, Int_t maxValue,
Int_t sector=-100, Int_t module=-100, Int_t mbo=-100);
void errorDecodeSubHeaderCannotDecode(void);
void errorDecodingModeInvalidCompressMode(UInt_t compressMode,UInt_t decoding);
void errorExecuteNoValidPointerTo(TString pointerName);
void errorExecuteErrorInFill(void);
void errorGetSubEvtIdToSamNrSamNrNotInLookupTable(UInt_t localSubEvtId, Int_t samNr);
void errorGetSubEvtIdToSamNrSubEvtIdOutOfMdcRange(UInt_t localSubEvtId, TString range);
void errorInitCannotGetParameterContainer(TString container);
void errorInitCategoryCannotAddCategory(TString catname, TString detector);
void errorInitCategoryCannotGetCategory(TString catname);
void errorFillCannotGetSlot(Int_t sector, Int_t module, Int_t mbo, Int_t tdc);
void errorFillDecodeSubHeaderFailed(void);
void errorFillDataPointerExceedingRange(UInt_t* deb,
UInt_t* end, UInt_t* enddata);
void errorFillErrorFillingDataWord(void);
void errorFillNoValidAddressInLookUpTable();
void errorFillSkippingRestOfSubEvent(void);
void errorFillMdcDataWordCannotGetSlot(void);
void errorFillMdcDataWordTooManyEntriesToSameLocation(Int_t maxentry);
void errorFillMdcRawEventHeaderCannotGetSlot(void);
void errorFillUnknownCodeForBlacklistRecovery(void);
Int_t executeBlackListRecovery(void);
Int_t fill(void);
Int_t fillData(void);
Int_t fillMdcDataWord(Int_t sector,Int_t module,Int_t mbo,Int_t tdc);
Int_t fillMdcRawEventHeader(Int_t errorFlag, Int_t rocModule, Int_t rocNumber,
Int_t rocSector, Int_t subEventSize,
Int_t trigType);
HMdcRaw* getFreeOrExistingSlot(Int_t §or,Int_t &module,Int_t &mbo,Int_t &tdc);
void infoDetermineDecodeVersion(void);
Int_t initExcludeBlackList(void);
Int_t initRecoverBlackList(void);
Bool_t matchHardwareAdressToSecModMboTdc(Int_t §or, Int_t &module, Int_t &mbo, Int_t &tdc);
void prepareBlackListRecovery(UInt_t eventSize);
void printExcludedBlackListCounter(void);
void printRecoveredBlackListCounter(void);
Int_t recoverBlackListSep2005(void);
Int_t recoverBlackListApr2006(void);
void reinitBlackListRecovery(void);
void setExcludeBlackListInternal(Bool_t b){excludeBlackList=b;};
void setRecoverBlackListInternal(Bool_t b){recoverBlackList=b;};
Bool_t storeForRecoveryFromBlackList(UInt_t *data);
void warningExcludeDataWords(UInt_t data, UInt_t mask, UInt_t adress);
void warningExecuteSamNrNegative(Int_t samNr);
void warningExecuteNoValidSectorEntryInLookupTableForSamNr(Int_t samNr);
void warningExecuteNoValidModuleEntryInLookupTableForSamNr(Int_t samNr);
void warningInitExcludeBlackListNoValidContext(TString context);
void warningInitRecoverBlackListNoValidContext(TString context);
void warningRecoverBlackListSep2005IgnoringDatum(Int_t ctr, UInt_t datum);
void warningRecoverBlackListSep2005SkippingDataWord(UInt_t datum);
void warningSetQuietMode(void);
ClassDef(HMdcUnpacker, 3) // unpack MDC data
};
#endif /* ! HMDCUNPACKER_H */