00001 // $Id: DQMEventMsgData.cc,v 1.12 2011/03/28 13:49:04 mommsen Exp $ 00003 00004 #include "EventFilter/StorageManager/src/ChainData.h" 00005 00006 #include "IOPool/Streamer/interface/DQMEventMessage.h" 00007 00008 namespace stor 00009 { 00010 00011 namespace detail 00012 { 00013 00014 DQMEventMsgData::DQMEventMsgData(toolbox::mem::Reference* pRef) : 00015 ChainData(I2O_SM_DQM, Header::DQM_EVENT), 00016 headerFieldsCached_(false) 00017 { 00018 addFirstFragment(pRef); 00019 parseI2OHeader(); 00020 } 00021 00022 inline size_t DQMEventMsgData::do_i2oFrameSize() const 00023 { 00024 return sizeof(I2O_SM_DQM_MESSAGE_FRAME); 00025 } 00026 00027 std::string DQMEventMsgData::do_topFolderName() const 00028 { 00029 if( !headerOkay() ) 00030 { 00031 std::stringstream msg; 00032 msg << "A top folder name can not be determined from a "; 00033 msg << "faulty or incomplete DQM event message."; 00034 XCEPT_RAISE( stor::exception::IncompleteDQMEventMessage, msg.str() ); 00035 } 00036 00037 if( !headerFieldsCached_ ) {cacheHeaderFields();} 00038 return topFolderName_; 00039 } 00040 00041 uint32_t DQMEventMsgData::do_adler32Checksum() const 00042 { 00043 if( !headerOkay() ) 00044 { 00045 std::stringstream msg; 00046 msg << "An adler32 checksum can not be determined from a "; 00047 msg << "faulty or incomplete DQM event message."; 00048 XCEPT_RAISE( stor::exception::IncompleteDQMEventMessage, msg.str() ); 00049 } 00050 00051 if( !headerFieldsCached_ ) {cacheHeaderFields();} 00052 return adler32_; 00053 } 00054 00055 DQMKey DQMEventMsgData::do_dqmKey() const 00056 { 00057 if( !headerOkay() ) 00058 { 00059 std::stringstream msg; 00060 msg << "The DQM key can not be determined from a "; 00061 msg << "faulty or incomplete DQM event message."; 00062 XCEPT_RAISE( stor::exception::IncompleteDQMEventMessage, msg.str() ); 00063 } 00064 00065 if( !headerFieldsCached_ ) {cacheHeaderFields();} 00066 return dqmKey_; 00067 } 00068 00069 uint32_t DQMEventMsgData::do_runNumber() const 00070 { 00071 00072 if( !headerOkay() ) 00073 { 00074 std::stringstream msg; 00075 msg << "The run number can not be determined from a "; 00076 msg << "faulty or incomplete DQM event message."; 00077 XCEPT_RAISE( stor::exception::IncompleteDQMEventMessage, msg.str() ); 00078 } 00079 00080 if( !headerFieldsCached_ ) {cacheHeaderFields();} 00081 return dqmKey_.runNumber; 00082 } 00083 00084 uint32_t DQMEventMsgData::do_lumiSection() const 00085 { 00086 00087 if( !headerOkay() ) 00088 { 00089 std::stringstream msg; 00090 msg << "The lumi section can not be determined from a "; 00091 msg << "faulty or incomplete DQM event message."; 00092 XCEPT_RAISE( stor::exception::IncompleteDQMEventMessage, msg.str() ); 00093 } 00094 00095 if( !headerFieldsCached_ ) {cacheHeaderFields();} 00096 return dqmKey_.lumiSection; 00097 } 00098 00099 void DQMEventMsgData::do_assertRunNumber(uint32_t runNumber) 00100 { 00101 if ( headerOkay() && do_runNumber() != runNumber ) 00102 { 00103 std::ostringstream errorMsg; 00104 errorMsg << "Run number " << do_runNumber() 00105 << " of DQM event for LS " << do_lumiSection() << 00106 " received from " << hltURL() << 00107 " (FU process id " << fuProcessId() << ")" << 00108 " does not match the run number " << runNumber << 00109 " used to configure the StorageManager."; 00110 XCEPT_RAISE(stor::exception::RunNumberMismatch, errorMsg.str()); 00111 } 00112 } 00113 00114 unsigned long DQMEventMsgData::do_headerSize() const 00115 { 00116 if ( !headerOkay() ) 00117 { 00118 return 0; 00119 } 00120 00121 if (! headerFieldsCached_) {cacheHeaderFields();} 00122 return headerSize_; 00123 } 00124 00125 unsigned char* DQMEventMsgData::do_headerLocation() const 00126 { 00127 if ( !headerOkay() ) 00128 { 00129 return 0; 00130 } 00131 00132 if (! headerFieldsCached_) {cacheHeaderFields();} 00133 return headerLocation_; 00134 } 00135 00136 inline unsigned char* 00137 DQMEventMsgData::do_fragmentLocation(unsigned char* dataLoc) const 00138 { 00139 if ( parsable() ) 00140 { 00141 I2O_SM_DQM_MESSAGE_FRAME *smMsg = 00142 (I2O_SM_DQM_MESSAGE_FRAME*) dataLoc; 00143 return (unsigned char*) smMsg->dataPtr(); 00144 } 00145 else 00146 { 00147 return dataLoc; 00148 } 00149 } 00150 00151 inline void DQMEventMsgData::parseI2OHeader() 00152 { 00153 if ( parsable() ) 00154 { 00155 I2O_SM_DQM_MESSAGE_FRAME *smMsg = 00156 (I2O_SM_DQM_MESSAGE_FRAME*) ref_->getDataLocation(); 00157 fragKey_.code_ = messageCode_; 00158 fragKey_.run_ = smMsg->runID; 00159 fragKey_.event_ = smMsg->eventAtUpdateID; 00160 fragKey_.secondaryId_ = smMsg->folderID; 00161 fragKey_.originatorPid_ = smMsg->fuProcID; 00162 fragKey_.originatorGuid_ = smMsg->fuGUID; 00163 rbBufferId_ = smMsg->rbBufferID; 00164 hltLocalId_ = smMsg->hltLocalId; 00165 hltInstance_ = smMsg->hltInstance; 00166 hltTid_ = smMsg->hltTid; 00167 fuProcessId_ = smMsg->fuProcID; 00168 fuGuid_ = smMsg->fuGUID; 00169 } 00170 } 00171 00172 // Adapted from InitMsgData::cacheHeaderFields 00173 void DQMEventMsgData::cacheHeaderFields() const 00174 { 00175 00176 unsigned char* firstFragLoc = dataLocation(0); 00177 00178 boost::shared_ptr<DQMEventMsgView> msgView; 00179 if (fragmentCount_ == 1) 00180 { 00181 msgView.reset(new DQMEventMsgView(firstFragLoc)); 00182 } 00183 else 00184 { 00185 copyFragmentsIntoBuffer(headerCopy_); 00186 msgView.reset(new DQMEventMsgView(&headerCopy_[0])); 00187 } 00188 00189 headerSize_ = msgView->headerSize() 00190 + sizeof(uint32_t); // in contrast to other message types, 00191 // DQM messages do not contain the data 00192 // length entry (uint32_t) in headerSize() 00193 headerLocation_ = msgView->startAddress(); 00194 topFolderName_ = msgView->topFolderName(); 00195 adler32_ = msgView->adler32_chksum(); 00196 00197 dqmKey_.runNumber = msgView->runNumber(); 00198 dqmKey_.lumiSection = msgView->lumiSection(); 00199 dqmKey_.topLevelFolderName = msgView->topFolderName(); 00200 00201 headerFieldsCached_ = true; 00202 00203 #ifdef STOR_DEBUG_WRONG_ADLER 00204 double r = rand()/static_cast<double>(RAND_MAX); 00205 if (r < 0.01) 00206 { 00207 std::cout << "Simulating corrupt Adler calculation" << std::endl; 00208 headerSize_ += 3; 00209 } 00210 else if (r < 0.02) 00211 { 00212 std::cout << "Simulating corrupt Adler entry" << std::endl; 00213 adler32_ += r*10000; 00214 } 00215 #endif // STOR_DEBUG_WRONG_ADLER 00216 } 00217 00218 } // namespace detail 00219 00220 } // namespace stor 00221 00222