$treeview $search $mathjax $extrastylesheet
artdaq_core
v3_06_01
$projectbrief
|
$projectbrief
|
$searchbox |
00001 #include "artdaq-core/Data/Fragment.hh" 00002 00003 #include <cmath> 00004 #include <iostream> 00005 00006 using artdaq::detail::RawFragmentHeader; 00007 00008 bool artdaq::fragmentSequenceIDCompare(const Fragment& i, const Fragment& j) 00009 { 00010 return i.sequenceID() < j.sequenceID(); 00011 } 00012 00013 artdaq::Fragment::Fragment() 00014 : vals_(RawFragmentHeader::num_words(), -1) 00015 { 00016 fragmentHeaderPtr()->version = RawFragmentHeader::CurrentVersion; 00017 updateFragmentHeaderWC_(); 00018 fragmentHeaderPtr()->type = InvalidFragmentType; 00019 fragmentHeaderPtr()->metadata_word_count = 0; 00020 fragmentHeaderPtr()->touch(); 00021 } 00022 00023 artdaq::Fragment::Fragment(std::size_t n) 00024 : vals_(n + RawFragmentHeader::num_words()) 00025 { 00026 // vals ctor w/o init val is used; make sure header is ALL initialized. 00027 for (iterator ii = vals_.begin(); 00028 ii != (vals_.begin() + RawFragmentHeader::num_words()); ++ii) 00029 { 00030 *ii = -1; 00031 } 00032 fragmentHeaderPtr()->version = RawFragmentHeader::CurrentVersion; 00033 updateFragmentHeaderWC_(); 00034 fragmentHeaderPtr()->type = Fragment::InvalidFragmentType; 00035 fragmentHeaderPtr()->sequence_id = Fragment::InvalidSequenceID; 00036 fragmentHeaderPtr()->fragment_id = Fragment::InvalidFragmentID; 00037 fragmentHeaderPtr()->timestamp = Fragment::InvalidTimestamp; 00038 fragmentHeaderPtr()->metadata_word_count = 0; 00039 fragmentHeaderPtr()->touch(); 00040 } 00041 00042 artdaq::Fragment::Fragment(sequence_id_t sequenceID, 00043 fragment_id_t fragID, 00044 type_t type, 00045 timestamp_t timestamp) 00046 : vals_(RawFragmentHeader::num_words(), -1) 00047 { 00048 fragmentHeaderPtr()->version = RawFragmentHeader::CurrentVersion; 00049 updateFragmentHeaderWC_(); 00050 if (type == Fragment::DataFragmentType) 00051 { 00052 // this value is special because it is the default specified 00053 // in the constructor declaration 00054 fragmentHeaderPtr()->setSystemType(type); 00055 } 00056 else 00057 { 00058 fragmentHeaderPtr()->setUserType(type); 00059 } 00060 fragmentHeaderPtr()->sequence_id = sequenceID; 00061 fragmentHeaderPtr()->fragment_id = fragID; 00062 fragmentHeaderPtr()->timestamp = timestamp; 00063 fragmentHeaderPtr()->metadata_word_count = 0; 00064 fragmentHeaderPtr()->touch(); 00065 } 00066 00067 #if HIDE_FROM_ROOT 00068 void artdaq::Fragment::print(std::ostream& os) const 00069 { 00070 os << " Fragment " << fragmentID() 00071 << ", WordCount " << size() 00072 << ", Event " << sequenceID() 00073 << '\n'; 00074 } 00075 00076 artdaq::FragmentPtr 00077 artdaq::Fragment::eodFrag(size_t nFragsToExpect) 00078 { 00079 artdaq::FragmentPtr result(new Fragment(static_cast<size_t>(ceil(sizeof(nFragsToExpect) / 00080 static_cast<double>(sizeof(value_type)))))); 00081 result->setSystemType(Fragment::EndOfDataFragmentType); 00082 *result->dataBegin() = nFragsToExpect; 00083 return result; 00084 } 00085 00086 artdaq::FragmentPtr 00087 artdaq::Fragment:: 00088 dataFrag(sequence_id_t sequenceID, 00089 fragment_id_t fragID, 00090 RawDataType const* dataPtr, 00091 size_t dataSize, 00092 timestamp_t timestamp) 00093 { 00094 FragmentPtr result(new Fragment(sequenceID, fragID, Fragment::DataFragmentType, timestamp)); 00095 result->resize(dataSize); 00096 memcpy(result->dataAddress(), dataPtr, (dataSize * sizeof(RawDataType))); 00097 return result; 00098 } 00099 #endif