Super Event: Difference between revisions

From MidasWiki
Jump to navigation Jump to search
No edit summary
(The midas documentation has moved to https://midas.triumf.ca/docs/)
Tag: Replaced
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
==== Links ====
The midas documentation has moved. See [https://midas.triumf.ca/docs/develop/features/acquiring_data/frontends/programming/#mfe-super-events-and-sub-events mfe super-events and sub-events] in Frontends: programming for the new documentation about super-events.
<div style="column-count:3;-moz-column-count:3;-webkit-column-count:3">
* [[Frontend user code]]
* [[Event Structure]]
* [[Equipment List Parameters]]
</div>
==Introduction==
The Super-Event is an option implemented in the  [[Frontend user code|Frontend code]] in order to reduce the amount of data to be transferred to the back-end computer(s) by removing the bank header for each event constructed. It is not applicable to  [[Event Structure#FIXED Format Event|FIXED Format]] events.
 
In other words, when an equipment readout in  [[Event Structure#MIDAS Format Event|MIDAS Format]] is complete, the event is composed of the bank header followed by the data section.
 
The overhead in bytes of the bank structure is 16 bytes for ''bk_init()'', 20 bytes for bk_init32(). If the data section size is close to the number above, the data transfer as well as the data storage has an non-negligible overhead. To address this problem, the equipment can be set up to generate a so called Super-Event which is an event composed of the initial standard bank header for the first event of the super-event, and up to the [[Equipment List Parameters#Number of subevents|number of sub-events]] maximum successive data sections before the closing of the bank.
 
==Example frontend code ==
To demonstrate the use of the super-event, consider the following example of the Equipment Declaration in the frontend code:
 
  // Define equipment to be able to generate the Super-Event
                                      //
  { "GE",                // equipment name
      2, 0x0002,            // event ID, trigger mask
      "SYSTEM",            // event buffer
  #ifdef USE_INT
      EQ_INTERRUPT,        // equipment type
  #else
      EQ_POLLED,            // equipment type
  #endif
      LAM_SOURCE(GE_C, LAM_STATION(GE_N)), // interrupt source
      "MIDAS",              // format
      TRUE,                // enabled
      RO_RUNNING,          // read only when running
      200,                  // poll for 200ms
      0,                    // stop run after this event limit
      <span style="color:red">1000,                // number of sub events > 0 ... enables Super-event</span>
      0,                    // don't log history
      "", "", "",
      read_ge_event,        // readout routine
      ,
      ...
 
==Example Readout code ==
 
Set up the readout function for Super-Event  collection, e.g.
  //-- Event readout
  // Global and fixed -- Expect NWORDS 16bits data readout per sub-event
  #define NWORDS 3
  //
  INT read_ge_event(char *pevent, INT offset)
  {
    static WORD *pdata;
                                      //
    // Super-event structure
    if (offset == 0)
    {
      // FIRST event of the Super-event
      bk_init(pevent);
      bk_create(pevent, "GERM", TID_WORD, &pdata);
                                      //
    else if (offset == -1)
    {
      // close the Super-event if offset is -1
      bk_close(pevent, pdata);
                                      //
      // End of Super-Event
      return bk_size(pevent);
                                      //
                                      //
    // read GE sub-event (ADC)
    cam16i(GE_C, GE_N, 0, GE_READ, pdata++);
    cam16i(GE_C, GE_N, 1, GE_READ, pdata++);
    cam16i(GE_C, GE_N, 2, GE_READ, pdata++);
                                      //
    // clear hardware
    re_arm_ge();
                                      //
    if (offset == 0)
    {
      // Compute the proper event length on the FIRST event in the Super-Event
      // NWORDS correspond to the !! NWORDS WORD above !!
      // sizeof(BANK_HEADER) + sizeof(BANK) will make the 16 bytes header
      // sizeof(WORD) is defined by the TID_WORD in bk_create()
                                      //
      return NWORDS * sizeof(WORD) + sizeof(BANK_HEADER) + sizeof(BANK);
                                      //
    else
      // Return the data section size only
      // sizeof(WORD) is defined by the TID_WORD in bk_create()
                                      //
      return NWORDS * sizeof(WORD);
===Discussion===
As shown in the example above:
 
* For the first event, the correct  size of the event, including the header, must be calculated and returned
* Subsequent events return the size of the data only, excluding the header.
 
 
The input  parameter "offset" is used to indicate whether the event is the first, last or intermediate. After the last event, the bank is closed.
 
The encoding of the data section is left to the user. If the number of words per sub-event is fixed (i.e. NWORDS in the above example), the sub-event extraction  by an analyzer is simple. In the case of variable sub-event length, it is necessary to tag the first or the last word of each sub-event.The contents of the sub-event is the choice of the user.
 
; Note:
*  Since no particular tagging is applied to the Super-Event by the Midas transfer mechanism, the user must provide code in the backend analyzer to interpret the contents    of the Super-Event bank(s).
 
*  If the  Super-Event  is composed by an equipment on a remote processor  running a different  '''Endian''' mode than the backend processor, it would be necessary to ensure the data type consistency throughout the Super-Event in order to guarantee the proper byte-swapping of the data content. [[Byte Swap Macros]] are available for this purpose.
 
* It may be convenient to change the '''time-stamp''' of the super-event using the  [[MIDAS Event Header Macros|TIME_STAMP]] Macro.
 
*  The ODB key <span style="color: purple; font-style:italic;">/Equipment/<equipment name>/statistics/event rate</span> event rate  will  indicate the rate of sub-events.

Latest revision as of 22:01, 30 October 2026

The midas documentation has moved. See mfe super-events and sub-events in Frontends: programming for the new documentation about super-events.