Go to the documentation of this file.00001 #include "IOPool/Streamer/interface/EventMessage.h"
00002 #include "FWCore/Utilities/interface/Exception.h"
00003
00004
00005 EventMsgView::EventMsgView(void* buf):
00006 buf_((uint8*)buf),head_(buf),
00007 v2Detected_(false)
00008 {
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 if (protocolVersion() != 9) {
00019 throw cms::Exception("EventMsgView", "Invalid Message Version:")
00020 << "Only message version 9 is currently supported \n"
00021 << "(invalid value = " << protocolVersion() << ").\n"
00022 << "We support only reading and converting streamer files\n"
00023 << "using the same version of CMSSW used to created the\n"
00024 << "streamer file. This is because the streamer format is\n"
00025 << "only a temporary format, as such we do not support\n"
00026 << "backwards compatibility. If you really need a streamer\n"
00027 << "file for some reason, the work around is that you convert\n"
00028 << "the streamer file to a Root file using the CMSSW version\n"
00029 << "that created the streamer file, then convert the Root file\n"
00030 << "to a streamer file using a newer release that will produce\n"
00031 << "the version of streamer file that you desire.\n";
00032 }
00033
00034 uint8* l1_bit_size_ptr = buf_ + sizeof(EventHeader);
00035 l1_bits_count_ = convert32(l1_bit_size_ptr);
00036 uint32 l1_sz = l1_bits_count_;
00037
00038
00039
00040
00041
00042
00043
00044
00045 l1_bits_start_ = buf_ + sizeof(EventHeader) + sizeof(uint32);
00046
00047 if (v2Detected_ == false) {
00048 if (l1_sz != 0) l1_sz = 1 + ((l1_sz-1)/8);
00049 }
00050 uint8* hlt_bit_size_ptr = l1_bits_start_ + l1_sz;
00051 hlt_bits_count_ = convert32(hlt_bit_size_ptr);
00052 hlt_bits_start_ = hlt_bit_size_ptr + sizeof(uint32);
00053 uint32 hlt_sz = hlt_bits_count_;
00054 if (hlt_sz != 0) hlt_sz = 1+ ((hlt_sz-1)/4);
00055
00056 if(v2Detected_) hlt_sz=2;
00057 uint8* adler32_start = hlt_bits_start_ + hlt_sz;
00058 adler32_chksum_ = convert32(adler32_start);
00059 host_name_start_ = adler32_start + sizeof(uint32);
00060 host_name_len_ = *host_name_start_;
00061 host_name_start_ += sizeof(uint8);
00062 event_start_ = host_name_start_ + host_name_len_;
00063 event_len_ = convert32(event_start_);
00064 event_start_ += sizeof(char_uint32);
00065 }
00066
00067 uint32 EventMsgView::protocolVersion() const
00068 {
00069 EventHeader* h = (EventHeader*)buf_;
00070 return h->protocolVersion_;
00071 }
00072
00073 uint32 EventMsgView::run() const
00074 {
00075 EventHeader* h = (EventHeader*)buf_;
00076 return convert32(h->run_);
00077 }
00078
00079 uint32 EventMsgView::event() const
00080 {
00081 EventHeader* h = (EventHeader*)buf_;
00082 return convert32(h->event_);
00083 }
00084
00085 uint32 EventMsgView::lumi() const
00086 {
00087 EventHeader* h = (EventHeader*)buf_;
00088 return convert32(h->lumi_);
00089 }
00090
00091 uint32 EventMsgView::origDataSize() const
00092 {
00093 EventHeader* h = (EventHeader*)buf_;
00094 return convert32(h->origDataSize_);
00095 }
00096
00097 uint32 EventMsgView::outModId() const
00098 {
00099 EventHeader* h = (EventHeader*)buf_;
00100 return convert32(h->outModId_);
00101 }
00102
00103 uint32 EventMsgView::droppedEventsCount() const
00104 {
00105 EventHeader* h = (EventHeader*)buf_;
00106 return convert32(h->droppedEventsCount_);
00107 return 0;
00108 }
00109
00110 void EventMsgView::l1TriggerBits(std::vector<bool>& put_here) const
00111 {
00112 put_here.clear();
00113 put_here.resize(l1_bits_count_);
00114
00115 for(std::vector<bool>::size_type i = 0; i < l1_bits_count_; ++i)
00116 put_here[i] = (bool)(l1_bits_start_[i/8] & (1<<((i&0x07))));
00117 }
00118
00119 void EventMsgView::hltTriggerBits(uint8* put_here) const
00120 {
00121 uint32 hlt_sz = hlt_bits_count_;
00122 if (hlt_sz != 0) hlt_sz = 1 + ((hlt_sz-1)/4);
00123
00124 if(v2Detected_) hlt_sz=2;
00125
00126 std::copy(hlt_bits_start_,hlt_bits_start_ + hlt_sz,
00127 put_here);
00128 }
00129
00130 std::string EventMsgView::hostName() const
00131 {
00132
00133 std::string host_name(reinterpret_cast<char *>(host_name_start_),host_name_len_);
00134 size_t found = host_name.find('\0');
00135 if(found != std::string::npos) {
00136 return std::string(host_name, 0, found);
00137 } else {
00138 return host_name;
00139 }
00140 }
00141
00142