#ifndef _EVENT_H_
#define _EVENT_H_
#ifdef COMMENT
/*--------------------------------------------------------------------------*
* *
* HERA-B Online Event Format Structures *
* *
* *
* Hera-B events are are formatted online as described in the memo: *
* "Protocols & Data Formats in Hera-B" available on the DAQ-Notes *
* WWW page. The format consisted of one or more nested data blocks *
* as illustrated below. Each block contains a header, a data field *
* and a trailer. The data field of many blocks (e.g. Event and SLB *
* blocks) is composed of additional block of similar format. For *
* example, the data portion of an SLB block consists of one or more *
* FED blocks. This is illustrated in the following example, where *
* EVTH/EVTT are the event header/trailer, SLBH/SLBT are the SLB *
* block header/trailer and FEDH is the SLB sub-block. *
* *
* +---+---+---+-...-+---+-...-+---+---+-...-+---+---+ *
* | E | S | F | d | F | d | S | S | | S | E | *
* | V | L | E | a | E | a | L | L | | L | V | *
* | T | B | D | t | D | t | B | B | | B | T | *
* | H | H | H | a | H | a | T | H | | T | T | *
* +---+---+---+-...-+---+-...-+---+---+-...-+---+---+ *
* *
* Block alignment: *
* SLB and Event level blocks are aligned on a long word boundaries. *
* If an SLB block has a length that is not a multiple of 4, the *
* header length field will reflect this fact, but the following block *
* will not start until the next 4-byte boundary. The FED sub-blocks *
* within the SLB block also have long-word alignment. The length *
* field of the FED sub-block does not include any additional padding *
* to expand the field length. Padding bytes are undefined, but it is *
* recommended that they be filled with zeroes. *
* *
*--------------------------------------------------------------------------*/
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*********************************
*
* Record IDs -
*
* Note: The definition of most record IDs are specific to the
* individual components i.e. the record type is uniquely
* identified by the combination of the component ID and
* the record ID. The record IDs are therefore left to the
* disgression of the detector groups. The IDs listed here
* are those used by the central DAQ, and several suggested
*
*********************************/
#define RID_MASK_ERROR 0x8000 /* Error in Record */
#define RID_NORMAL_EVENT 0x3000 /* Normal/error event envelope */
#define RID_ERROR_EVENT 0xb000 /* - with error */
#define RID_NORMAL_SLB0 0x2000 /* Normal standard SLB */
#define RID_ERROR_SLB0 0xa000 /* - with error */
#define RID_SPARSE_SLB0 0x2001 /* - with sparse data */
#define RID_NORMAL_SLBDBG 0x2800 /* Addidtional SLB record for debugging */
#define RID_ERROR_SLBDBG 0xa800 /* - with error */
#define RID_SPARSE_SLBDBG 0x2801 /* - with sparse data */
#define RID_NORMAL_FEDRAW 0x1000 /* Normal/Error raw FED data */
#define RID_ERROR_FEDRAW 0x9000 /* (component dependent) */
#define RID_NORMAL_DEFAULT_SPARSE 0x100A /* Normal/Error sparsified data */
#define RID_NORMAL_SPARSE 0x1001 /* Normal/Error sparsified data */
#define RID_ERROR_SPARSE 0x9001 /* (component dependent) */
#define RID_NORMAL_FEDDBG 0x1800 /* Normal/Error raw FED data */
#define RID_ERROR_FEDDBG 0x9800 /* (component dependent) */
#define RID_SPARSE_FEDDBG 0x1801 /* Normal/Error sparsified data */
#define RID_NORMAL_COOKED 0x1002 /* Normal/Error cooked FED data */
#define RID_ERROR_COOKED 0x9002 /* (component dependent) */
/****************
* Error Masks -
* Note: The mask will be non-zero on error
* if the data given is in import format
* This is basically a bit test for the first bit
*********************/
#define RID_ERROR_MASK(i) (((i)&0x8000)?(i):0)
#define RID_MASK_FEDRAW(i) RID_ERROR_MASK(i)
#define RID_MASK_EVENT(i) RID_ERROR_MASK(i)
#define RID_MASK_SLB0(i) RID_ERROR_MASK(i)
#define RID_MASK_SPARSE(i) RID_ERROR_MASK(i)
#define RID_MASK_COOKED(i) RID_ERROR_MASK(i)
/*********************************
*
* Event record format format
*
*********************************/
struct EVENT_HDR {
int length; /* event length including header and trailer */
unsigned short recid; /* event block ID (0x3000 - 0x3fff) */
short format; /* format identifier */
int sltevt; /* second level trigger number */
int compmask; /* component mask (defined in component.h) */
int evtmask; /* event mask (trigger code, or etc.) */
};
typedef struct EVENT_HDR envelope; /* for backwards compatibility */
typedef struct EVENT_HDR EVENT_HDR;
struct EVENT_TAIL {
int sltevt;}; /* second level trigger number */
typedef struct EVENT_TAIL EVENT_TAIL;
#define RUNTYPE(ptr) (((struct EVENT_HDR *) ptr)->evtmask >> 16)
#define RUNTYPEI(ptr) (import_i(((struct EVENT_HDR *) ptr)->evtmask) >> 16)
/*********************************
*
* SLB data block format
*
*********************************/
struct SLB_HDR {
int length; /* SLB block length including header and trailer */
unsigned short recid; /* SLB record ID (0x2000 - 0x2fff) */
short fltevt; /* FLT event number */
short compid; /* component id (defined in component.h) */
short slbid; /* identified of the SLB generating this block */
int nodeid;}; /* destination node */
typedef struct SLB_HDR slbrec; /* for backwards compatibility */
typedef struct SLB_HDR SLB_HDR;
struct SLB_SUBHDR {
short length; /* FED block length including header and trailer */
short fedid; /* ID of FED producing this block */
unsigned short recid; /* FED record ID (0x1000 - 0x1fff) */
short bxid;}; /* Bx number */
typedef struct SLB_SUBHDR SLB_SUBHDR;
struct SLB_TAIL {
unsigned short recid; /* Record ID */
short fltevt;}; /* FLT event number */
typedef struct SLB_TAIL SLB_TAIL;
/*********************************
*
* FED data block format
*
* Note that the header and trailer described here are used only
* on the readout links. This bloxk must be padded to a 48-bit
* boundary to allow it to be transferred over the sharc link. The
* length field doesn't include the padding bytes.
*
*********************************/
struct FED_HDR {
short length; /* FED block length including header and trailer */
unsigned short recid; /* FED record ID (0x1000 - 0x1fff) */
short fltevt; /* FLT event number */
short bxid; /* Bx number */
short compid; /* component id (defined in component.h) */
short fedid;}; /* ID of FED producing this block */
typedef struct FED_HDR FED_HDR;
struct FED_TAIL {
short fltevt;}; /* FLT event number */
typedef struct FED_TAIL FED_TAIL;
/*********************************
*
* Event data provided by the event builder.
* CompID: 0x0000, RecID: 0x2000
*
*********************************/
struct EVT_DATA {
int run_number; /* Run number */
int event_time; /* Time event was built */
int event_status; /* event status/error code */
int flt_status; /* FLT trigger number */
int slp_node; /* SLP processing node */
int slt_status; /* SLT trigger number/status */
int exp_number; /* Experiment Number */
int farm_node; /* Farm node */
int BX_long; /* bits 0 to 31 of the BX tag (at time trigger issued) */
short BX_upper; /* bits 32 to 47 of the BX tag (at time trigger issued) */
short FCS_tcode; /* FCS trigger code for event */
short physBX; /* physical BX == hera bucket ID of event */
short FLT_BX; /* pipeline cell triggered on by FLT for this event */
short fltevt; /* flt event number as delivered by FCS */
short fill;
int dbKey; /* key to tables used to process event */
int dbVersion; /* version of key table used for this event */
};
typedef struct EVT_DATA EVT_DATA;
struct EVT_DATA_RECORD {
SLB_HDR hdr;
EVT_DATA data;
SLB_TAIL tail;};
typedef struct EVT_DATA_RECORD EVT_DATA_RECORD;
#ifdef __cplusplus
}
#endif
#endif