CDocumentedPacket

Name

CDocumentedPacket -- Encapsulate event data in a packet that is documented.

Synopsis


#include <CDocumentedPacket>
         
 class CDocumentedPacket {

  CDocumentedPacket(unsigned short nTag, const std::string& rName, const std::string& Description, const std::string& rVersion);

  const int operator==(const CDocumentedPacket& rhs);
  const int operator==(const std::string& rhs);
  const int operator!=(const CDocumentedPacket& rhs);
  const int operator!=(const std::string& rhs);
  const unsigned short getTag();
  const std::string getName();
  const std::string getDescription();
  const std::string getVersion();
  const std::string getInstantiationDate();
  const unsigned short* getHeaderPtr();
  const bool getPacketInProgress();
  std::string Format();
  unsigned short* Begin(unsigned short* rPointer);
  unsigned short* End(unsigned short* rBuffer);
}

Description

NSCL data taking programs should try to emit self describing event data. This is facilitated by providing code to support the generation of packets. A packet is a chunk of event data with a three word header. The first longword (32 bits), is the number of words in the packet, including the header. The last word of the header is an identifying code. The remainder of the packet are the data read out for that identifying code.

http://groups.nscl.msu.edu/userinfo/daq/nscltags.html defines the set of identifiers (tags) that are defined. The tag assigner for permanent devices is bazin at nscl dot msu dot edu. Contact him if you need a new tag assigned.

The CDocumentedPacket class goes a step further than encapsulating your data. It registers itself with the framework in a way that allows the framework to emit data that describes the set of tags, and versions to expect in the event data.

Public member functions

CDocumentedPacket(unsigned short nTag, const std::string& rName, const std::string& Description, const std::string& rVersion);

Constructs a documented packet. nTag is the packet id and is the tag assigned to the packet, or one of the user defined tags.

rName is a short name for the tag. In the tag table at http://groups.nscl.msu.edu/userinfo/daq/nscltags.html, this is the value of the Acronym column. Description is a more verbose description and might be the Description column of that table. rVersion is a string that allows you to indicate changes in the internal structure of this packet over time. This can allow analysis software to dynamically adapt to data format changes by knowing which data format is actually in the packet.

const int operator==(const CDocumentedPacket& rhs); const int operator==(const std::string& rhs); const int operator!=(const CDocumentedPacket& rhs); const int operator!=(const std::string& rhs); const unsigned short getTag();

Returns the tag that has been assigned to this documented packet.

const std::string getName();

Returns the short name assigned to the packet

const std::string getDescription();

Returns the long description assigned to the packet.

const std::string getVersion();

Returns the packet version string

const std::string getInstantiationDate();

When a packet object is created a timestamp indicating when the object was create is also created. This returns that timestamp. The idea of this is to be able to account for any format changes that might have occured during an experiment that were accidently not reflected by updating the version of the packet.

const unsigned short* getHeaderPtr();

Returns a pointer to the header of the packet. This is only meaningful if the packet is in the process of being emitted. See getPacketInProgress below.

const bool getPacketInProgress();

Returns true if the packet is in the process of being built.

std::string Format();

Returns an information string about the packet that can be inserted in to a packet documentation event.

unsigned short* Begin(unsigned short* rPointer);

Starts the creation of a packet. rPointer points to the location in memory in which the packet will be built. The function returns a pointer to the packet body. The caller should not refrence the packet header directly.

unsigned short* End(unsigned short* rBuffer);

Indicates that the packet body has been filled in. rBuffer points to the first word after the packet. It is used to compute and fill in the packet length header field.

EXCEPTIONS

Under several circumstances, this class can throw a CInvalidPacketStateException

Specifically attempting to begin a packet that's already begun or ending a packet that's already ended, will cause this to be thrown.

EXAMPLES

Example 1. Using the CDocumentedPacket class


class MySegment : public CEventSegment
{
private:
    CDocumentedPacket m_Packet;
public:
    MySegment() :
        CDocumentedPacket(0x1234, "Test", "A test packet", "T1.0")
    {
        
    }
    size_t read(void* pBuffer, size_t maxlen);
    ...
}
size_t
MySegment::read(void* pBuffer, size_t maxlen)
{
    uint16_t* p = reinterpret_cast<uint16_t*>(pBuffer);
    
    uint16_t pBody = m_Packet.Begin(p);
    
    // Fill in packet body incrementing pBody
    ...
    
    m_Packet.End(pBody);
}
                

SEE ALSO

CEventPacket(3sbsReadout)