artdaq_core  v1_07_01
 All Classes Namespaces Functions
Fragment.cc
1 #include "artdaq-core/Data/Fragment.hh"
2 
3 #include <cmath>
4 #include <iostream>
5 
7 
8 bool artdaq::fragmentSequenceIDCompare(Fragment i, Fragment j)
9 {
10  return i.sequenceID() < j.sequenceID();
11 }
12 
13 artdaq::Fragment::Fragment() :
14  vals_(RawFragmentHeader::num_words(), 0)
15 {
16  updateFragmentHeaderWC_();
17  fragmentHeader()->metadata_word_count = 0;
18 }
19 
20 artdaq::Fragment::Fragment(std::size_t n) :
21  vals_(n + RawFragmentHeader::num_words())
22 {
23  // vals ctor w/o init val is used; make sure header is ALL initialized.
24  for (iterator ii=vals_.begin();
25  ii!=(vals_.begin()+RawFragmentHeader::num_words()); ++ii) *ii=0;
26  updateFragmentHeaderWC_();
27  fragmentHeader()->type = Fragment::InvalidFragmentType;
28  fragmentHeader()->sequence_id = Fragment::InvalidSequenceID;
29  fragmentHeader()->fragment_id = Fragment::InvalidFragmentID;
30  fragmentHeader()->timestamp = Fragment::InvalidTimestamp;
31  fragmentHeader()->metadata_word_count = 0;
32 }
33 
34 artdaq::Fragment::Fragment(sequence_id_t sequenceID,
35  fragment_id_t fragID,
36  type_t type,
37  timestamp_t timestamp) :
38  vals_(RawFragmentHeader::num_words(), 0)
39 {
40  updateFragmentHeaderWC_();
41  if (type == Fragment::DataFragmentType) {
42  // this value is special because it is the default specified
43  // in the constructor declaration
44  fragmentHeader()->setSystemType(type);
45  } else {
46  fragmentHeader()->setUserType(type);
47  }
48  fragmentHeader()->sequence_id = sequenceID;
49  fragmentHeader()->fragment_id = fragID;
50  fragmentHeader()->timestamp = timestamp;
51  fragmentHeader()->metadata_word_count = 0;
52 }
53 
54 #if HIDE_FROM_ROOT
55 void
56 artdaq::Fragment::print(std::ostream & os) const
57 {
58  os << " Fragment " << fragmentID()
59  << ", WordCount " << size()
60  << ", Event " << sequenceID()
61  << '\n';
62 }
63 
64 std::unique_ptr<artdaq::Fragment>
65 artdaq::Fragment::eodFrag(size_t nFragsToExpect)
66 {
67  std::unique_ptr<artdaq::Fragment> result(new Fragment(static_cast<size_t>(ceil(sizeof(nFragsToExpect) /
68  static_cast<double>(sizeof(value_type))))));
69  result->setSystemType(Fragment::EndOfDataFragmentType);
70  *result->dataBegin() = nFragsToExpect;
71  return result;
72 }
73 
75 artdaq::Fragment::
76 dataFrag(sequence_id_t sequenceID,
77  fragment_id_t fragID,
78  RawDataType const * dataPtr,
79  size_t dataSize,
80  timestamp_t timestamp)
81 {
82  Fragment result(sequenceID, fragID, Fragment::DataFragmentType, timestamp);
83  result.resize(dataSize);
84  memcpy(result.dataAddress(), dataPtr, (dataSize * sizeof(RawDataType)));
85  return result;
86 }
87 #endif