Go to the documentation of this file.00001 #include "IOPool/Streamer/interface/EventMsgBuilder.h"
00002 #include "IOPool/Streamer/interface/EventMessage.h"
00003 #include "IOPool/Streamer/interface/MsgHeader.h"
00004 #include <cassert>
00005 #include <cstring>
00006
00007 #define MAX_HOSTNAME_LEN 25
00008
00009 EventMsgBuilder::EventMsgBuilder(void* buf, uint32 size,
00010 uint32 run, uint32 event, uint32 lumi,
00011 uint32 outModId, uint32 droppedEventsCount,
00012 std::vector<bool>& l1_bits,
00013 uint8* hlt_bits, uint32 hlt_bit_count,
00014 uint32 adler_chksum, const char* host_name):
00015 buf_((uint8*)buf),size_(size)
00016 {
00017 EventHeader* h = (EventHeader*)buf_;
00018 h->protocolVersion_ = 9;
00019 convert(run,h->run_);
00020 convert(event,h->event_);
00021 convert(lumi,h->lumi_);
00022 convert(outModId,h->outModId_);
00023 convert(droppedEventsCount,h->droppedEventsCount_);
00024 uint8* pos = buf_ + sizeof(EventHeader);
00025
00026
00027 uint32 l1_count = l1_bits.size();
00028 convert(l1_count, pos);
00029 pos = pos + sizeof(uint32);
00030
00031
00032 uint32 l1_sz = l1_bits.size();
00033 if (l1_sz != 0) l1_sz = 1 + ((l1_sz-1)/8);
00034
00035 uint8* pos_end = pos + l1_sz;
00036 memset(pos,0x00, pos_end-pos);
00037 for(std::vector<bool>::size_type i = 0; i < l1_bits.size(); ++i) {
00038 uint8 v = l1_bits[i] ? 1 : 0;
00039 pos[i/8] |= (v << (i&0x07));
00040 }
00041 pos = pos_end;
00042
00043
00044 convert(hlt_bit_count, pos);
00045 pos = pos + sizeof(uint32);
00046
00047 uint32 hlt_sz = hlt_bit_count;
00048 if (hlt_sz != 0) hlt_sz = 1+ ((hlt_sz-1)/4);
00049
00050
00051 pos = std::copy(hlt_bits, hlt_bits+hlt_sz, pos);
00052
00053
00054 convert(adler_chksum, pos);
00055 pos = pos + sizeof(uint32);
00056
00057
00058
00059
00060
00061
00062 uint32 host_name_len = MAX_HOSTNAME_LEN;
00063 assert(host_name_len < 0x00ff);
00064
00065 *pos++ = host_name_len;
00066
00067
00068 uint32 real_len = strlen(host_name);
00069 if(real_len < host_name_len) {
00070 char hostname_2use[MAX_HOSTNAME_LEN];
00071 memset(hostname_2use,'\0',host_name_len);
00072 memcpy(hostname_2use,host_name,real_len);
00073 memcpy(pos,hostname_2use,host_name_len);
00074 } else {
00075 memcpy(pos,host_name,host_name_len);
00076 }
00077 pos += host_name_len;
00078
00079 event_addr_ = pos + sizeof(char_uint32);
00080 setEventLength(0);
00081 }
00082
00083 void EventMsgBuilder::setOrigDataSize(uint32 value)
00084 {
00085 EventHeader* h = (EventHeader*)buf_;
00086 convert(value,h->origDataSize_);
00087 }
00088
00089 void EventMsgBuilder::setEventLength(uint32 len)
00090 {
00091 convert(len,event_addr_-sizeof(char_uint32));
00092 EventHeader* h = (EventHeader*)buf_;
00093 new (&h->header_) Header(Header::EVENT,event_addr_-buf_+len);
00094 }
00095
00096 uint32 EventMsgBuilder::size() const
00097 {
00098 HeaderView v(buf_);
00099 return v.size();
00100 }