ybos.h

Go to the documentation of this file.
00001 /********************************************************************\
00002 
00003   Name:         ybos.h
00004   Created by:   Pierre Amaudruz, Stefan Ritt
00005 
00006   Contents:     Declarations for ybos data format
00007 
00008   $Id:$
00009 
00010 \********************************************************************/
00011 
00012 /**dox***************************************************************/
00013 /** @file ybos.h
00014 The YBOS include file
00015 */
00016 
00017 /** @defgroup ybosincludecode The ybos.h & ybos.c
00018  */
00019 /** @defgroup ybosdefineh YBOS Define 
00020  */
00021 /** @defgroup ybosmacroh YBOS Macros 
00022  */
00023 /** @defgroup yboserrorh YBOS error code 
00024  */
00025 
00026 /**dox***************************************************************/
00027 /** @addtogroup ybosincludecode
00028  *  
00029  *  @{  */
00030 
00031 /**dox***************************************************************/
00032 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00033 
00034 #ifdef OS_WINNT
00035 #include <io.h>
00036 #include <time.h>
00037 #endif
00038 #include <fcntl.h>
00039 #include <stdlib.h>
00040 #include <stdio.h>
00041 #include <string.h>
00042 #include <sys/stat.h>
00043 #include <sys/types.h>
00044 
00045 #ifndef EXPRT
00046 #define EXPRT
00047 #endif
00048 
00049 /**dox***************************************************************/
00050 #endif                          /* DOXYGEN_SHOULD_SKIP_THIS */
00051 
00052 /**dox***************************************************************/
00053 /** @addtogroup ybosdefineh
00054  *  
00055  *  @{  */
00056 
00057 /********************************************************************/
00058 /**
00059 General parameters
00060 */
00061 #ifdef YBOS_VERSION_3_3
00062 #define YBOS_PHYREC_SIZE        8190  /**< I*4 */
00063 #else
00064 #define YBOS_PHYREC_SIZE        8192  /**< I*4 */
00065 #endif
00066 #define YBOS_HEADER_LENGTH      4
00067 #define YBOS_BUFFER_SIZE        3*(YBOS_PHYREC_SIZE<<2) + MAX_EVENT_SIZE + 128  /**< in BYTES */
00068 
00069 #define YB_BANKLIST_MAX        32     /**< maximum number of banks to be found 
00070                                          by the ybk_list() or bk_list() */
00071 #define YB_STRING_BANKLIST_MAX          YB_BANKLIST_MAX * 4
00072                                        /**< to be used for xbk_list() */
00073 
00074 /**dox***************************************************************/
00075 /** @} */ /* end of ybosdefineh */
00076 
00077 /**dox***************************************************************/
00078 /** @addtogroup yboserrorh
00079  *  
00080  *  @{  */
00081 #define YB_SUCCESS               1     /**< Ok */
00082 #define YB_EVENT_NOT_SWAPPED     2     /**< Not swapped */
00083 #define YB_DONE                  2     /**< Operation complete */
00084 #define YB_WRONG_BANK_TYPE    -100     /**< Wrong bank type (see @ref YBOS_Bank_Types) */
00085 #define YB_BANK_NOT_FOUND     -101     /**< Bank not found */
00086 #define YB_SWAP_ERROR         -102     /**< Error swapping */
00087 #define YB_NOMORE_SLOT        -103     /**< No more space for fragment */
00088 #define YB_UNKNOWN_FORMAT     -104     /**< Unknown format (see @ref YBOS_format) */
00089 
00090 /**dox***************************************************************/
00091 /** @} */ /* end of yboserrorh */
00092 
00093 /**dox***************************************************************/
00094 /** @addtogroup ybosdefineh
00095  *  
00096  *  @{  */
00097 
00098 /**
00099 record header content */
00100 #define H_BLOCK_SIZE   0     /**< YBOS */
00101 #define H_BLOCK_NUM    1     /**< YBOS */
00102 #define H_HEAD_LEN     2     /**< YBOS */
00103 #define H_START        3     /**< YBOS */
00104 
00105 /**
00106 Display parameters */
00107 #define D_RECORD       1     /**< YBOS */
00108 #define D_HEADER       2     /**< YBOS */
00109 #define D_EVTLEN       3     /**< YBOS */
00110 
00111 /**
00112 File fragmentation */
00113 #define YB_COMPLETE       1     /**< YBOS */
00114 #define YB_INCOMPLETE     2     /**< YBOS */
00115 #define YB_NO_RECOVER    -1     /**< YBOS */
00116 #define YB_NO_RUN         0     /**< YBOS */
00117 #define YB_ADD_RUN        1     /**< YBOS */
00118 
00119 /**
00120 Display mode options */
00121 #define DSP_RAW    1  /**< Display raw data */
00122 #define DSP_BANK   2  /**<Display data in bank format */
00123 
00124 /**
00125 Display format */
00126 #define DSP_UNK    0  /**< Display format unknown */
00127 #define DSP_DEC    1  /**< Display data in decimal format*/
00128 #define DSP_HEX    2  /**< Display data in headecimal format */
00129 #define DSP_ASC    3  /**< Display data in ASCII format */
00130 
00131 /**dox***************************************************************/
00132 /** @} */ /* end of ybosdefineh */
00133 
00134 /**dox***************************************************************/
00135 /** @addtogroup ybosmacroh
00136  *  
00137  *  @{  */
00138 
00139 /*---- Macros for YBOS ------------------------*/
00140 /**
00141 word swap (I4=I21I22 -> I4=I22I21*/
00142 #define SWAP_D2WORD(_d2w) {\
00143   WORD _tmp2;                                    \
00144   _tmp2                 = *((WORD *)(_d2w));     \
00145   *((WORD *)(_d2w))     = *(((WORD *)(_d2w))+1); \
00146   *(((WORD *)(_d2w))+1) = _tmp2;                 \
00147 }
00148 
00149 /* the s for the following macros */
00150 #ifdef CHAOS_EVID_FMT
00151 extern chaos;
00152 #endif
00153 
00154 /********************************************************************/
00155 /**
00156 As soon as the Midas header is striped out from the event, the YBOS
00157 remaining  data has lost the event synchonization unless included by the
00158 user. It is therefore necessary to have a YBOS bank duplicating
00159 this information usually done in the FE by creating a
00160 "EVID" bank filled with the Midas info and other user information.
00161 
00162 Unfortunately the format of this EVID is flexible and I couldn't
00163 force user to use a default structure. For this reason, I'm
00164 introducing a preprocessor flag for selecting such format.
00165 
00166 Omitting the declaration of the pre-processor flag the EVID_TRINAT is taken by
00167 default see @ref AppendixD.
00168 
00169 Special macros are avaialbe to retrieve this information
00170 based on the EVID content and the type of EVID structure.
00171 
00172 The Macro parameter should point to the first data of the EVID bank.
00173 \code
00174   // check if EVID is present if so display its content 
00175   if ((status = ybk_find (pybos, "EVID", &bklen, &bktyp, (void *)&pybk)) == YB_SUCCESS)
00176   {
00177     pdata = (DWORD *)((YBOS_BANK_HEADER *)pybk + 1);
00178     pevent->event_id      = YBOS_EVID_EVENT_ID(pdata);
00179     pevent->trigger_mask  = YBOS_EVID_TRIGGER_MASK(pdata);
00180     pevent->serial_number = YBOS_EVID_SERIAL(pdata);
00181     pevent->time_stamp    = YBOS_EVID_TIME(pdata);
00182     pevent->data_size     = pybk->length;
00183   }
00184 \endcode
00185 
00186 The current type of EVID bank are:
00187 - [EVID_TRINAT] Specific for Trinat experiment.
00188 \code
00189   ybk_create((DWORD *)pevent, "EVID", I4_BKTYPE, (DWORD *)(&pbkdat));
00190   *((WORD *)pbkdat) = EVENT_ID(pevent);     ((WORD *)pbkdat)++;
00191   *((WORD *)pbkdat) = TRIGGER_MASK(pevent); ((WORD *)pbkdat)++;
00192   *(pbkdat)++ = SERIAL_NUMBER(pevent);
00193   *(pbkdat)++ = TIME_STAMP(pevent);
00194   *(pbkdat)++ = gbl_run_number;                // run number 
00195 \endcode
00196 - [EVID_TWIST] Specific to Twist Experiment (Triumf).
00197 \code
00198   ybk_create((DWORD *)pevent, "EVID", I4_BKTYPE, &pbkdat);
00199   *((WORD *)pbkdat) = EVENT_ID(pevent);     ((WORD *)pbkdat)++;
00200   *((WORD *)pbkdat) = TRIGGER_MASK(pevent); ((WORD *)pbkdat)++;
00201   *(pbkdat)++ = SERIAL_NUMBER(pevent);
00202   *(pbkdat)++ = TIME_STAMP(pevent);
00203   *(pbkdat)++ = gbl_run_number;                // run number 
00204   *(pbkdat)++ = *((DWORD *)frontend_name);     // frontend name 
00205   ybk_close((DWORD *)pevent, pbkdat);
00206 \endcode
00207 */
00208 #if (!defined (EVID_TRINAT) && !defined (EVID_CHAOS) && !defined (EVID_TWIST))
00209 #define EVID_TRINAT
00210 #endif
00211 
00212 #if defined(EVID_TRINAT)
00213 #define YBOS_EVID_EVENT_ID(e)      *((WORD *)(e)+1)
00214 #define YBOS_EVID_TRIGGER_MASK(e)  *((WORD *)(e)+0)
00215 #define YBOS_EVID_SERIAL(e)        *((DWORD *)(e)+1)
00216 #define YBOS_EVID_TIME(e)          *((DWORD *)(e)+2)
00217 #define YBOS_EVID_RUN_NUMBER(e)    *((DWORD *)(e)+3)
00218 #define YBOS_EVID_EVENT_NB(e)      *((DWORD *)(e)+1)
00219 #elif defined(EVID_CHAOS)
00220 #define YBOS_EVID_EVENT_ID(e)      *((WORD *)(e)+3)
00221 #define YBOS_EVID_TRIGGER_MASK(e)  *((WORD *)(e)+2)
00222 #define YBOS_EVID_SERIAL(e)        *((DWORD *)(e)+2)
00223 #define YBOS_EVID_TIME(e)          *((DWORD *)(e)+3)
00224 #define YBOS_EVID_RUN_NUMBER(e)    *((DWORD *)(e)+4)
00225 #define YBOS_EVID_EVENT_NB(e)      *((DWORD *)(e)+0)
00226 #elif defined(EVID_TWIST)
00227 #define YBOS_EVID_EVENT_ID(e)      *((WORD *)(e)+1)
00228 #define YBOS_EVID_TRIGGER_MASK(e)  *((WORD *)(e)+0)
00229 #define YBOS_EVID_SERIAL(e)        *((DWORD *)(e)+1)
00230 #define YBOS_EVID_TIME(e)          *((DWORD *)(e)+2)
00231 #define YBOS_EVID_RUN_NUMBER(e)    *((DWORD *)(e)+3)
00232 #define YBOS_EVID_EVENT_NB(e)      *((DWORD *)(e)+1)
00233 /* frontend name ignored */
00234 #endif
00235 
00236 /********************************************************************/
00237 /**
00238 pevt Evt# id/msk serial run# */
00239 #define YBOS_EVID_BANK(__a, __b, __c,   __d,   __e) {\
00240       DWORD * pbuf;\
00241       ybk_create(__a, "EVID", I4_BKTYPE, &pbuf);\
00242       *(pbuf)++ = (DWORD)__b;\
00243       *(pbuf)++ = (DWORD)__c;\
00244       *(pbuf)++ = (DWORD)__d;\
00245       *(pbuf)++ = (DWORD)ss_millitime();\
00246       *(pbuf)++ = (DWORD)__e;\
00247       ybk_close(__a, pbuf);\
00248         }
00249 
00250 /********************************************************************/
00251 /**
00252 pevt Evt# id/msk serial run# */
00253 #define MIDAS_EVID_BANK(__a, __b, __c,   __d,   __e) {\
00254       DWORD * pbuf;\
00255       bk_create(__a, "EVID", TID_DWORD, &pbuf);\
00256       *(pbuf)++ = (DWORD)__b;\
00257       *(pbuf)++ = (DWORD)__c;\
00258       *(pbuf)++ = (DWORD)__d;\
00259       *(pbuf)++ = (DWORD)ss_millitime();\
00260       *(pbuf)++ = (DWORD)__e;\
00261       bk_close(__a, pbuf);\
00262         }
00263 
00264 /**dox***************************************************************/
00265 /** @} */ /* end of ybosmacroh */
00266 
00267 /**dox***************************************************************/
00268 /** @addtogroup ybosdefineh
00269  *  
00270  *  @{  */
00271 
00272 /*---- data structures for YBOS file format ------------------------*/
00273 /**
00274 YBOS Bank types */
00275 #define I2_BKTYPE       1  /**< Signed Integer 2 bytes */
00276 #define A1_BKTYPE       2  /**< ASCII 1 byte */
00277 #define I4_BKTYPE       3  /**< Signed Interger 4bytes */
00278 #define F4_BKTYPE       4  /**< Float 4 bytes */
00279 #define D8_BKTYPE       5  /**< Double 8 bytes */
00280 #define I1_BKTYPE       8  /**< Signed Integer 1 byte */
00281 #define MAX_BKTYPE      I1_BKTYPE+1 /**< delimiter */
00282 
00283 /**dox***************************************************************/
00284 /** @} */ /* end of ybosdefineh */
00285 
00286 /**dox***************************************************************/
00287 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00288 
00289 /**
00290 YBOS logger channel ALL in 4BYTES! */
00291 typedef struct {
00292    DWORD *ptop;        /**< pointer to top of YBOS buffer */
00293    DWORD *pbuf;        /**< current data pointer for writing to buffer */
00294    DWORD *pwrt;        /**< current data pointer for writing to device */
00295    DWORD *pbot;        /**< bottom of the physical record */
00296    DWORD *pend;        /**< end of the buffer */
00297    DWORD reco;         /**< offset to first logical record 4BYTES */
00298    DWORD recn;         /**< current YBOS physical record number */
00299 } YBOS_INFO;
00300 
00301 /**
00302 YBOS Physical record header */
00303 typedef struct {
00304    DWORD rec_size;          /**< LPR Length of Physical Record (exclusive) */
00305    DWORD header_length;     /**< LPH Length of Physical Header (inclusive) */
00306    DWORD rec_num;           /**< NPR Physical Record Number (start 0) */
00307    DWORD offset;            /**< LRD Offset to 1st Logical Record 
00308                                    (=LPH for 1st Logical record) */
00309 } YBOS_PHYSREC_HEADER;
00310 
00311 /**
00312 Bank header */
00313 typedef struct {
00314    DWORD name;              /**< bank name 4ASCII */
00315    DWORD number;            /**< bank number (=1) */
00316    DWORD index;             /**< index within bank (=0) */
00317    DWORD length;            /**< bank length (I*4, exclusive ) */
00318    DWORD type;              /**< bank type refer to above */
00319 } YBOS_BANK_HEADER;
00320 
00321 /**
00322 YBOS FILE parameters */
00323 #define MAX_FILE_PATH    128
00324 #define MAX_FRAG_SIZE   2000    /* max event size for fragmented file (bytes) */
00325 #define MAX_YM_FILE        8    /* max concurrent file handling */
00326 #define NLINE              8    /* number of elements for display routine */
00327 
00328 /**
00329 YBOS control file header (private structure) */
00330 typedef struct {
00331    INT file_ID;
00332    INT size;
00333    INT fragment_size;
00334    INT total_fragment;
00335    INT current_fragment;
00336    INT current_read_byte;
00337    INT run_number;
00338    INT spare;
00339 } YM_CFILE;
00340 
00341 /**
00342 YBOS path file header (private structure) */
00343 typedef struct {
00344    char path[MAX_FILE_PATH];
00345 } YM_PFILE;
00346 
00347 /**
00348 YBOS file replay handler (for multiple file entries) */
00349 typedef struct {
00350    INT fHandle;
00351    INT file_ID;
00352    INT current_fragment;
00353    INT current_read_byte;
00354    char path[MAX_FILE_PATH];
00355 } R_YM_FILE;
00356 
00357 /*---- function declarations ---------------------------------------*/
00358 
00359 /* make functions callable from a C++ program */
00360 #ifdef __cplusplus
00361 extern "C" {
00362 #endif
00363 
00364    INT EXPRT yb_file_recompose(void *pevt, INT fmt, char *svpath, INT file_mode);
00365    INT EXPRT feodb_file_dump(EQUIPMENT * eqp, char *eqpname, char *pevent,
00366                              INT run_number, char *path);
00367 
00368    void EXPRT yb_any_bank_display(void *pmbh, void *pbk, INT fmt,
00369                                   INT dsp_mode, INT dsp_fmt);
00370    void EXPRT yb_any_event_display(void *pevt, INT data_fmt, INT dsp_mode, INT dsp_fmt);
00371    INT EXPRT yb_any_all_info_display(INT what);
00372    INT EXPRT yb_any_physrec_display(INT data_fmt);
00373 
00374    INT EXPRT yb_any_physrec_skip(INT data_fmt, INT bl);
00375    INT EXPRT yb_any_physrec_get(INT data_fmt, void **prec, DWORD * psize);
00376    INT EXPRT yb_any_file_rclose(INT data_fmt);
00377    INT EXPRT yb_any_file_ropen(char *infile, INT data_fmt);
00378    INT EXPRT yb_any_file_wopen(INT type, INT data_fmt, char *filename, INT * hDev);
00379    INT EXPRT yb_any_file_wclose(INT handle, INT type, INT data_fmt);
00380    INT EXPRT yb_any_log_write(INT handle, INT data_fmt, INT type,
00381                               void *prec, DWORD nbytes);
00382    INT EXPRT yb_any_event_swap(INT data_fmt, void *pevent);
00383    INT EXPRT yb_any_event_get(INT data_fmt, void **pevent, DWORD * psize);
00384 
00385 /* Bank manipulation */
00386    void EXPRT ybk_init(DWORD * pevent);
00387    void EXPRT ybk_create(DWORD * pevent, char *bkname, DWORD btype, void *pbkdat);
00388    INT EXPRT ybk_close(DWORD * pevent, void *pbkdat);
00389    INT EXPRT ybk_size(DWORD * pevent);
00390    INT EXPRT ybk_list(DWORD * pevent, char *bklist);
00391    INT EXPRT ybk_locate(DWORD * pevent, char *bkname, void *pdata);
00392    INT EXPRT ybk_find(DWORD * pevent, char *bkname, DWORD * bklength,
00393                       DWORD * bktype, void **pbkdata);
00394    void EXPRT ybk_create_chaos(DWORD * pevent, char *bname, DWORD btype, void *pbkdat);
00395    INT EXPRT ybk_iterate(DWORD * pevent, YBOS_BANK_HEADER ** pybkh, void **pdata);
00396    INT EXPRT ybk_close_chaos(DWORD * pevent, DWORD btype, void *pbkdat);
00397 
00398 #ifdef INCLUDE_LOGGING
00399    INT EXPRT ybos_log_open(LOG_CHN * log_chn, INT run_number);
00400    INT EXPRT ybos_write(LOG_CHN * log_chn, EVENT_HEADER * pevent, INT evt_size);
00401    INT EXPRT ybos_log_close(LOG_CHN * log_chn, INT run_number);
00402 #endif
00403 
00404    INT EXPRT ybos_event_get(DWORD ** plrl, DWORD * size);
00405    INT EXPRT ybos_get_tid_size(INT tid);
00406 
00407 #ifdef __cplusplus
00408 }
00409 #endif
00410 
00411 /*------------ END --------------------------------------------------------------*/
00412 /**dox***************************************************************/
00413 #endif                          /* DOXYGEN_SHOULD_SKIP_THIS */
00414 
00415 /**dox***************************************************************/
00416 /** @} */ /* end of ybosincludecode */

Midas DOC Version 1.9.5 ---- PSI Stefan Ritt ----
Contributions: Pierre-Andre Amaudruz - Suzannah Daviel - Doxygen - Peter Green - Qing Gu - Greg Hackman - Gertjan Hofman - Paul Knowles - Rudi Meier - Glenn Moloney - Dave Morris - John M O'Donnell - Konstantin Olchanski - Renee Poutissou - Andreas Suter - Jan M.Wouters - Piotr Adam Zolnierczuk