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