40.5. Creating ring items

There are some cases where the librarires provided to create ring items are not well suited for the job. Specifically, sometimes you'd like to create ring items to be emitted on stdout.

A simple set of functions that can be called by either C or C++ programs allows you to format ring items that can be dealt with however you might wish.

The functions provided are prototyped in DataFormat.h. The functions are also part of libdataformat.so.

The reference section provides full documentation. All functions return a pointer to storage allocated with malloc(3) that contains the ring item. It is the caller's responsibility to invoke free(3) to release this storage.

The functions defined in DataFormat.h are implemented in C and the header is written to be usable from both C and C++ programs. The functions are divided into two sets of functions. The first set are intended to be used for compatiblity with pre nscldaq 11.0 applications. With the exception of formatNonIncrTSScalerItem, which was introduced in NSLCDAQ-10.1-100 to support S800 scaler items that provide event timestamps, the functions below provide a body header of length zero (no body header).

formatEventItem

Formats the data read from a physics trigger into a ring item.

formatTriggerCountItem

Formats a trigger count item.

formatScalerItem

Creates an incremental scaler ring item.

formatTextItem

Formats a text string item. Text string items are items whose payload contains, among other things, a set of null terminated strings.

formatStateChange

Creates a state change ring item. State change ring items indicate that the run state has changed.

formatNonIncrTSScalerItem

This is a convenience function that produces a scaler item that has an event timestamp and has the incremental flag cleared.

The functions that are new since NSCLDAQ-11.0 and, produce fully filled out body headers are listed below:

formatDataFormat

Creates a data format item for the format described in the version of libdataformat.so your application is linked to. Each ring producer should emit one of these as the first item it produces after attaching to the ring so that consumers know what data format to expect.

formatGlomParameters

Produces a glom parameters ring itme. This is normally only called by the glom stage of the event builder pipeline. If, however you have replaced that stage of the pipeline with something different, you might want to emit this or some user specific item to describe the conditions being used to glue event fragments together into events.

formatEVBFragment

Normally this is only emitted to event builder monitor rings by teering. Formats an event builder fragment when you have a good idea the fragment contains a ring item.

formatEVBFragmentUnknown

Same as formatEVBFragment but used when there's a pretty good idea the fragment payload is not a ring item.

formatTimestampedEventItem

Creates an evet ring item that has a timestamp (full body header).

formatTimestampedTriggerCountItem

Formas a physics event count item with a full body header. In addition, the ring items allows you to provide an offsetdivisor for the run offset which supports run times with sub-second resolution. The concept of the run time divisor which (as of NSCLDAQ-11.0) is present in all ring item types that have run time offsets is that if you take the run time offset, and divide it by the run time divisor (floating point arithmetic), you get the offset into the run in seconds.

formatTimestampedScalerItem

Formats a periodic scaler item that has a full body header. Again, this version allows you to set the run time offset divisor to something other than 1.

formatTimestampedTextItem

Formats a text array item that has a full body header. The full body headder no only allows the emitter to specify a timestamp at which the item was created, but also to specify which data source created the item. If the text item should not have a timestamp, you should either fill in the most recent timestamp emitted by that source or, if that's not convenient, the value NULL_TIMESTAMP which is defined in the header fragment.h.

formatTimestampedStateChange

Formats a state change item that has a full body header and, possible, value for the run time divisor other than 1.

bodyPointer

Given a pointer to a ring item that comes from NSCLDAQ-11.0 or later, returns a pointer to the body payload of the item. The body payload is the section of the ring item that is just after the Body Header or, if the body header is not emitted, after the zero longwords.