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