00001 #include "IOPool/Streamer/interface/InitMessage.h"
00002 #include "FWCore/Utilities/interface/Exception.h"
00003 #include <iostream>
00004 #include <iterator>
00005
00006 InitMsgView::InitMsgView(void* buf):
00007 buf_((uint8*)buf),head_(buf)
00008 {
00009 if (protocolVersion() == 2) {
00010 std::cout << "Protocol Version 2 encountered" << std::endl;
00011 release_start_ = buf_ + sizeof(InitHeader) - (sizeof(uint32)*2);
00012
00013
00014 } else {
00015 release_start_ = buf_ + sizeof(InitHeader);
00016 }
00017 release_len_ = *release_start_;
00018 release_start_ += sizeof(uint8);
00019 uint8* pos = release_start_ + release_len_;
00020
00021
00022 if (protocolVersion() > 3) {
00023
00024 processName_len_ = *pos;
00025 processName_start_ = (uint8*)(pos + sizeof(uint8));
00026 pos = processName_start_ + processName_len_;
00027
00028
00029 if (protocolVersion() > 4) {
00030 outputModuleLabel_len_ = *pos;
00031 outputModuleLabel_start_ = (uint8*)(pos + sizeof(uint8));
00032 pos = outputModuleLabel_start_ + outputModuleLabel_len_;
00033
00034
00035 if (protocolVersion() > 5) {
00036 outputModuleId_ = convert32(pos);
00037 pos += sizeof(char_uint32);
00038 }
00039 }
00040 }
00041
00042
00043 hlt_trig_start_ = pos;
00044 hlt_trig_count_ = convert32(hlt_trig_start_);
00045 hlt_trig_start_ += sizeof(char_uint32);
00046 hlt_trig_len_ = convert32(hlt_trig_start_);
00047 hlt_trig_start_ += sizeof(char_uint32);
00048 pos = hlt_trig_start_ + hlt_trig_len_;
00049
00050 if (protocolVersion() > 4) {
00051 hlt_select_start_ = pos;
00052 hlt_select_count_ = convert32(hlt_select_start_);
00053 hlt_select_start_ += sizeof(char_uint32);
00054 hlt_select_len_ = convert32(hlt_select_start_);
00055 hlt_select_start_ += sizeof(char_uint32);
00056 pos = hlt_select_start_ + hlt_select_len_;
00057 }
00058
00059 l1_trig_start_ = pos;
00060 l1_trig_count_ = convert32(l1_trig_start_);
00061 l1_trig_start_ += sizeof(char_uint32);
00062 l1_trig_len_ = convert32(l1_trig_start_);
00063 l1_trig_start_ += sizeof(char_uint32);
00064 pos = l1_trig_start_ + l1_trig_len_;
00065
00066 desc_start_ = pos;
00067 desc_len_ = convert32(desc_start_);
00068 desc_start_ += sizeof(char_uint32);
00069 }
00070
00071 uint32 InitMsgView::run() const
00072 {
00073 InitHeader* h = reinterpret_cast<InitHeader*>(buf_);
00074 return convert32(h->run_);
00075 }
00076
00077 uint32 InitMsgView::protocolVersion() const
00078 {
00079 InitHeader* h = reinterpret_cast<InitHeader*>(buf_);
00080 return h->version_.protocol_;
00081 }
00082
00083 void InitMsgView::pset(uint8* put_here) const
00084 {
00085 InitHeader* h = reinterpret_cast<InitHeader*>(buf_);
00086 memcpy(put_here,h->version_.pset_id_,sizeof(h->version_.pset_id_));
00087 }
00088
00089 std::string InitMsgView::releaseTag() const
00090 {
00091 return std::string(reinterpret_cast<char *>(release_start_),release_len_);
00092 }
00093
00094 std::string InitMsgView::processName() const
00095 {
00096 if (protocolVersion() < 4)
00097 throw cms::Exception("Invalid Message Version", "InitMsgView")
00098 << "Process Name is only supported in Protocol Version 4 and above" << ".\n";
00099
00100 return std::string(reinterpret_cast<char *>(processName_start_),processName_len_);
00101 }
00102
00103 std::string InitMsgView::outputModuleLabel() const
00104 {
00105 if (protocolVersion() < 5)
00106 throw cms::Exception("Invalid Message Version", "InitMsgView")
00107 << "Output Module Label is only supported in Protocol Version 5 and above" << ".\n";
00108
00109 return std::string(reinterpret_cast<char *>(outputModuleLabel_start_),outputModuleLabel_len_);
00110 }
00111
00112
00113 void InitMsgView::hltTriggerNames(Strings& save_here) const
00114 {
00115 MsgTools::getNames(hlt_trig_start_,hlt_trig_len_,save_here);
00116 }
00117
00118 void InitMsgView::hltTriggerSelections(Strings& save_here) const
00119 {
00120 if (protocolVersion() < 5)
00121 throw cms::Exception("Invalid Message Version", "InitMsgView")
00122 << "HLT trigger selections are only supported in Protocol Version 5 and above" << ".\n";
00123
00124 MsgTools::getNames(hlt_select_start_,hlt_select_len_,save_here);
00125 }
00126
00127 void InitMsgView::l1TriggerNames(Strings& save_here) const
00128 {
00129 MsgTools::getNames(l1_trig_start_,l1_trig_len_,save_here);
00130 }
00131
00132 uint32 InitMsgView::eventHeaderSize() const
00133 {
00134 if (protocolVersion() == 2) {
00137 uint32 hlt_sz = get_hlt_bit_cnt();
00138 if (hlt_sz != 0 ) hlt_sz = 1+ ((hlt_sz-1)/4);
00139
00140 uint32 l1_sz = get_l1_bit_cnt();
00141 if (l1_sz != 0) l1_sz = 1 + ((l1_sz-1)/8);
00142
00143 return 1 + (4*8) + hlt_sz+l1_sz;
00144 }
00145
00146 InitHeader* h = reinterpret_cast<InitHeader*>(buf_);
00147 return convert32(h->event_header_size_);
00148 }
00149
00150
00151
00152
00153
00154
00155
00156
00157