CMS 3D CMS Logo

Public Member Functions | Private Attributes

DQMEventMsgBuilder Class Reference

#include <DQMEventMsgBuilder.h>

List of all members.

Public Member Functions

uint32 bufferSize () const
 DQMEventMsgBuilder (void *buf, uint32 bufSize, uint32 run, uint32 event, edm::Timestamp timeStamp, uint32 lumiSection, uint32 updateNumber, uint32 adler32_chksum, const char *host_name, std::string const &releaseTag, std::string const &topFolderName, DQMEvent::TObjectTable monitorElementsBySubFolder)
uint8eventAddress () const
uint32 headerSize () const
void setCompressionFlag (uint32)
void setEventLength (uint32 len)
void setFUGuid (uint32)
void setFUProcessId (uint32)
void setMergeCount (uint32)
uint32 size () const
uint8startAddress () const

Private Attributes

uint8buf_
uint32 bufSize_
uint8eventAddr_

Detailed Description

This class is used to build and view the DQM Event data that is exchanged between the filter units and the storage manager.

09-Feb-2007 - Initial Implementation DQM Event Message Format:

Definition at line 48 of file DQMEventMsgBuilder.h.


Constructor & Destructor Documentation

DQMEventMsgBuilder::DQMEventMsgBuilder ( void *  buf,
uint32  bufSize,
uint32  run,
uint32  event,
edm::Timestamp  timeStamp,
uint32  lumiSection,
uint32  updateNumber,
uint32  adler_chksum,
const char *  host_name,
std::string const &  releaseTag,
std::string const &  topFolderName,
DQMEvent::TObjectTable  monitorElementsBySubFolder 
)

This class is used to build and view the DQM Event data that is exchanged between the filter units and the storage manager.

09-Feb-2007 - Initial Implementation Constructor.

Definition at line 18 of file DQMEventMsgBuilder.cc.

References buf_, bufSize_, lhef::cc::convert(), eventAddr_, DQMEventHeader::eventNumber_, Exception, DQMEventHeader::headerSize_, DQMEventHeader::lumiSection_, DQMEventHeader::protocolVersion_, DQMEventHeader::runNumber_, setCompressionFlag(), setEventLength(), setFUGuid(), setFUProcessId(), setMergeCount(), DQMEventHeader::timeStamp_, DQMEventHeader::updateNumber_, and edm::Timestamp::value().

                                                                            :
  buf_((uint8*)buf),bufSize_(bufSize)
{
  DQMEventHeader* evtHdr;
  uint8* bufPtr;
  uint32 len;
  uint32 protocolVersion = 3;

  // fill in event header information
  bufPtr = buf_ + sizeof(DQMEventHeader);
  if (((uint32) (bufPtr - buf_)) > bufSize_)
    {
      throw cms::Exception("MessageBuilding", "DQMEventMsgBuilder")
        << "Input buffer size is too small for required header "
        << "information.  Size = " << bufSize_
        << ", necessary size is >= "
        << ((uint32) (bufPtr - buf_)) << ".\n";
    }

  evtHdr = (DQMEventHeader*) buf_;
  convert(protocolVersion, evtHdr->protocolVersion_);
  convert(run, evtHdr->runNumber_);
  convert(event, evtHdr->eventNumber_);

  convert(timeStamp.value(), evtHdr->timeStamp_);

  convert(lumiSection, evtHdr->lumiSection_);
  convert(updateNumber, evtHdr->updateNumber_);

  // copy the release tag into the message
  len = releaseTag.length();
  if (((uint32) (bufPtr + len + sizeof(uint32) - buf_)) > bufSize_)
    {
      throw cms::Exception("MessageBuilding", "DQMEventMsgBuilder")
        << "Input buffer size is too small for required header "
        << "information.  Size = " << bufSize_
        << ", necessary size is >= "
        << ((uint32) (bufPtr + len + sizeof(uint32) - buf_)) << ".\n";
    }
  convert(len, bufPtr);
  bufPtr += sizeof(uint32);
  releaseTag.copy((char*) bufPtr, len);
  bufPtr += len;

  // copy the top folder name into the message
  len = topFolderName.length();
  if (((uint32) (bufPtr + len + sizeof(uint32) - buf_)) > bufSize_)
    {
      throw cms::Exception("MessageBuilding", "DQMEventMsgBuilder")
        << "Input buffer size is too small for required header "
        << "information.  Size = " << bufSize_
        << ", necessary size is >= "
        << ((uint32) (bufPtr + len + sizeof(uint32) - buf_)) << ".\n";
    }
  convert(len, bufPtr);
  bufPtr += sizeof(uint32);
  topFolderName.copy((char*) bufPtr, len);
  bufPtr += len;

  // copy the subfolder count into the message
  convert(static_cast<uint32>(monitorElementsBySubFolder.size()), bufPtr);
  bufPtr += sizeof(uint32);

  // copy the ME count and name for each subfolder into the message
  DQMEvent::TObjectTable::const_iterator sfIter;
  for (sfIter = monitorElementsBySubFolder.begin();
       sfIter != monitorElementsBySubFolder.end(); sfIter++)
    {
      std::string subFolderName = sfIter->first;
      std::vector<TObject *> toList = sfIter->second;

      convert(static_cast<uint32>(toList.size()), bufPtr);
      bufPtr += sizeof(uint32);

      len = subFolderName.length();
      convert(len, bufPtr);
      bufPtr += sizeof(uint32);
      subFolderName.copy((char*) bufPtr, len);
      bufPtr += len;
    }
  // adler32 check sum of data blob
  convert(adler_chksum, bufPtr);
  bufPtr +=  sizeof(uint32);

  // put host name (Length and then Name) right after check sum
  uint32 host_name_len = strlen(host_name);
  assert(host_name_len < 0x00ff);
  //Put host_name_len
  *bufPtr++ = host_name_len;
  //Put host_name 
  memcpy(bufPtr,host_name,host_name_len);
  bufPtr += host_name_len;

  // set the header size and the event address, taking into account the
  // size of the event length field
  if (((uint32) (bufPtr + sizeof(uint32) - buf_)) > bufSize_)
    {
      throw cms::Exception("MessageBuilding", "DQMEventMsgBuilder")
        << "Input buffer size is too small for required header "
        << "information.  Size = " << bufSize_
        << ", necessary size is >= "
        << ((uint32) (bufPtr + sizeof(uint32) - buf_)) << ".\n";
    }
  convert(((uint32) (bufPtr - buf_)), evtHdr->headerSize_);
  bufPtr += sizeof(uint32);
  eventAddr_ = bufPtr;

  // set the event length to 0 initially.  (The setEventLength method
  // sets the message code and message size for us.  It shouldn't be called
  // until *after* the event address is set.)
  setEventLength(0);

  // initialize the compression flag to zero
  setCompressionFlag(0);

  // initialize the filter unit process ID to zero
  setFUProcessId(0);

  // initialize the filter unit GUID to zero
  setFUGuid(0);

  // initialize the merge count to zero
  setMergeCount(0);
}

Member Function Documentation

uint32 DQMEventMsgBuilder::bufferSize ( ) const [inline]

Definition at line 60 of file DQMEventMsgBuilder.h.

References bufSize_.

{ return bufSize_; }
uint8* DQMEventMsgBuilder::eventAddress ( ) const [inline]

Definition at line 67 of file DQMEventMsgBuilder.h.

References eventAddr_.

Referenced by StreamDQMOutputFile::write().

{ return eventAddr_; }
uint32 DQMEventMsgBuilder::headerSize ( ) const [inline]
void DQMEventMsgBuilder::setCompressionFlag ( uint32  value)

Sets the value of the compression flag in the header.

Definition at line 174 of file DQMEventMsgBuilder.cc.

References buf_, DQMEventHeader::compressionFlag_, and lhef::cc::convert().

Referenced by DQMEventMsgBuilder().

void DQMEventMsgBuilder::setEventLength ( uint32  len)

Sets the length of the event (payload). This method verifies that the buffer in which we are building the message is large enough and updates the size of the message taking into account the new event length.

Definition at line 157 of file DQMEventMsgBuilder.cc.

References buf_, bufSize_, lhef::cc::convert(), Header::DQM_EVENT, eventAddr_, Exception, DQMEventHeader::header_, and headerSize().

Referenced by DQMEventMsgBuilder().

{
  if (((uint32) (eventAddr_ + len - buf_)) > bufSize_)
    {
      throw cms::Exception("MessageBuilding", "DQMEventMsgBuilder")
        << "Event data overflows buffer. Buffer size = " << bufSize_
        << ", header size = " << this->headerSize()
        << ", event size = " << len << ".\n";
    }
  convert(len, eventAddr_ - sizeof(char_uint32));
  DQMEventHeader* evtHdr = (DQMEventHeader*) buf_;
  new (&evtHdr->header_) Header(Header::DQM_EVENT, (eventAddr_ - buf_ + len));
}
void DQMEventMsgBuilder::setFUGuid ( uint32  value)

Sets the value of the filter unit GUID in the header.

Definition at line 192 of file DQMEventMsgBuilder.cc.

References buf_, lhef::cc::convert(), and DQMEventHeader::fuGuid_.

Referenced by DQMEventMsgBuilder().

{
  DQMEventHeader* evtHdr = (DQMEventHeader*) buf_;
  convert(value, evtHdr->fuGuid_);
}
void DQMEventMsgBuilder::setFUProcessId ( uint32  value)

Sets the value of the filter unit process ID in the header.

Definition at line 183 of file DQMEventMsgBuilder.cc.

References buf_, lhef::cc::convert(), and DQMEventHeader::fuProcessId_.

Referenced by DQMEventMsgBuilder().

void DQMEventMsgBuilder::setMergeCount ( uint32  value)

Sets the value of the merge count in the header.

Definition at line 201 of file DQMEventMsgBuilder.cc.

References buf_, lhef::cc::convert(), and DQMEventHeader::mergeCount_.

Referenced by DQMEventMsgBuilder().

uint32 DQMEventMsgBuilder::size ( void  ) const

Returns the size of the message.

Definition at line 210 of file DQMEventMsgBuilder.cc.

References buf_, HeaderView::size(), and v.

Referenced by StreamDQMOutputFile::write(), and FUShmDQMOutputService::writeShmDQMData().

{
  HeaderView v(buf_);
  return v.size();
}
uint8* DQMEventMsgBuilder::startAddress ( ) const [inline]

Definition at line 61 of file DQMEventMsgBuilder.h.

References buf_.

Referenced by StreamDQMOutputFile::writeDQMEventHeader(), and FUShmDQMOutputService::writeShmDQMData().

{ return buf_; }

Member Data Documentation

Definition at line 73 of file DQMEventMsgBuilder.h.

Referenced by bufferSize(), DQMEventMsgBuilder(), and setEventLength().

Definition at line 74 of file DQMEventMsgBuilder.h.

Referenced by DQMEventMsgBuilder(), eventAddress(), headerSize(), and setEventLength().