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(Fragment i, Fragment j)
00009 {
00010 return i.sequenceID() < j.sequenceID();
00011 }
00012
00013 artdaq::Fragment::Fragment() :
00014 vals_(RawFragmentHeader::num_words(), 0)
00015 {
00016 updateFragmentHeaderWC_();
00017 fragmentHeader()->metadata_word_count = 0;
00018 }
00019
00020 artdaq::Fragment::Fragment(std::size_t n) :
00021 vals_(n + RawFragmentHeader::num_words())
00022 {
00023
00024 for (iterator ii=vals_.begin();
00025 ii!=(vals_.begin()+RawFragmentHeader::num_words()); ++ii) *ii=0;
00026 updateFragmentHeaderWC_();
00027 fragmentHeader()->type = Fragment::InvalidFragmentType;
00028 fragmentHeader()->sequence_id = Fragment::InvalidSequenceID;
00029 fragmentHeader()->fragment_id = Fragment::InvalidFragmentID;
00030 fragmentHeader()->timestamp = Fragment::InvalidTimestamp;
00031 fragmentHeader()->metadata_word_count = 0;
00032 }
00033
00034 artdaq::Fragment::Fragment(sequence_id_t sequenceID,
00035 fragment_id_t fragID,
00036 type_t type,
00037 timestamp_t timestamp) :
00038 vals_(RawFragmentHeader::num_words(), 0)
00039 {
00040 updateFragmentHeaderWC_();
00041 if (type == Fragment::DataFragmentType) {
00042
00043
00044 fragmentHeader()->setSystemType(type);
00045 } else {
00046 fragmentHeader()->setUserType(type);
00047 }
00048 fragmentHeader()->sequence_id = sequenceID;
00049 fragmentHeader()->fragment_id = fragID;
00050 fragmentHeader()->timestamp = timestamp;
00051 fragmentHeader()->metadata_word_count = 0;
00052 }
00053
00054 #if HIDE_FROM_ROOT
00055 void
00056 artdaq::Fragment::print(std::ostream & os) const
00057 {
00058 os << " Fragment " << fragmentID()
00059 << ", WordCount " << size()
00060 << ", Event " << sequenceID()
00061 << '\n';
00062 }
00063
00064 std::unique_ptr<artdaq::Fragment>
00065 artdaq::Fragment::eodFrag(size_t nFragsToExpect)
00066 {
00067 std::unique_ptr<artdaq::Fragment> result(new Fragment(static_cast<size_t>(ceil(sizeof(nFragsToExpect) /
00068 static_cast<double>(sizeof(value_type))))));
00069 result->setSystemType(Fragment::EndOfDataFragmentType);
00070 *result->dataBegin() = nFragsToExpect;
00071 return result;
00072 }
00073
00074 artdaq::Fragment
00075 artdaq::Fragment::
00076 dataFrag(sequence_id_t sequenceID,
00077 fragment_id_t fragID,
00078 RawDataType const * dataPtr,
00079 size_t dataSize,
00080 timestamp_t timestamp)
00081 {
00082 Fragment result(sequenceID, fragID, Fragment::DataFragmentType, timestamp);
00083 result.resize(dataSize);
00084 memcpy(result.dataAddress(), dataPtr, (dataSize * sizeof(RawDataType)));
00085 return result;
00086 }
00087 #endif