00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "EventReadoutFormat/EventReadout.h"
00011
00012 #include "DaqReadoutFormat/ByteBuffer.h"
00013 #include "CbltReadoutFormat/CbltReadout.h"
00014 #include "CbltReadoutFormat/CbltTraits.h"
00015 #include "EventReadoutFormat/EventHeader.h"
00016 #include "EventReadoutFormat/EventTraits.h"
00017 #include "EventReadoutFormat/RomFragment.h"
00018 #include "FadcReadoutFormat/FadcReadout.h"
00019 #include "FeeReadoutFormat/FeeReadout.h"
00020 #include "LtbReadoutFormat/LtbReadout.h"
00021 #include "FecReadoutFormat/FecReadout.h"
00022 #include "RtmReadoutFormat/RtmReadout.h"
00023
00024 using DybDaq::ByteBuffer;
00025 using DybDaq::CbltReadout;
00026 using DybDaq::CbltTraits;
00027 using DybDaq::DaqBuffer;
00028 using DybDaq::DaqTraits;
00029 using DybDaq::EventReadout;
00030 using DybDaq::EventHeader;
00031 using DybDaq::EventBuffer;
00032 using DybDaq::FadcReadout;
00033 using DybDaq::FeeReadout;
00034 using DybDaq::LtbReadout;
00035 using DybDaq::FecReadout;
00036 using DybDaq::RtmReadout;
00037 using DybDaq::RomFragment;
00038
00039 EventReadout::EventReadout(const EventReadout& readout):
00040 DaqContainer(readout),
00041 m_header(0),
00042 m_fragments(0),
00043 m_cbltTraits((CbltTraits*)0) {
00044
00045 }
00046
00047 EventReadout::EventReadout(const unsigned int site,
00048 const unsigned int detector,
00049 const unsigned int run,
00050 const unsigned int event,
00051 const unsigned int dataType,
00052 const bool rawCblt,
00053 const bool triggerMismatch,
00054 const bool invalidData,
00055 const EventTraits& traits) :
00056 DaqContainer(),
00057 m_header(new EventHeader(site,
00058 detector,
00059 run,
00060 event,
00061 dataType,
00062 false,
00063 rawCblt,
00064 triggerMismatch,
00065 invalidData,
00066 traits)),
00067 m_fragments(0),
00068 m_cbltTraits((CbltTraits*)0) {
00069 }
00070
00071 EventReadout::EventReadout(const unsigned int site,
00072 const unsigned int detector,
00073 const unsigned int run,
00074 const unsigned int event,
00075 const unsigned int dataType,
00076 const bool rawCblt,
00077 const bool triggerMismatch,
00078 const bool invalidData,
00079 const CbltTraits& cbltTraits,
00080 const EventTraits& traits) :
00081 DaqContainer(),
00082 m_header(new EventHeader(site,
00083 detector,
00084 run,
00085 event,
00086 dataType,
00087 true,
00088 rawCblt,
00089 triggerMismatch,
00090 invalidData,
00091 traits)),
00092 m_fragments(0),
00093 m_cbltTraits(&cbltTraits) {
00094 }
00095
00096 EventReadout::EventReadout(const ByteBuffer& byteBuffer) :
00097 DaqContainer(byteBuffer,
00098 0),
00099 m_header(0),
00100 m_fragments(0),
00101 m_cbltTraits((CbltTraits*)0) {
00102 byteBuffer.position(byteBuffer.position() + (header().totalSize() * kBytesInInt));
00103 }
00104
00105 EventReadout::~EventReadout() {
00106 if (0 != m_fragments) {
00107 RomFragmentPtrList::iterator fragment;
00108 for (fragment = m_fragments->begin();
00109 fragment != m_fragments->end();
00110 ++fragment) {
00111 delete const_cast<RomFragment*>(*fragment);
00112 }
00113 delete m_fragments;
00114 }
00115 if (0 != m_header) {
00116 delete m_header;
00117 }
00118 }
00119
00120 const DaqTraits& EventReadout::daqTraits() const {
00121 return header().eventTraits();
00122 }
00123
00124 const EventHeader& EventReadout::header() const {
00125 if (0 == m_header && hasByteBuffer()) {
00126 const ByteBuffer& buffer = byteBuffer();
00127
00128 const unsigned int originalPosition = buffer.position();
00129 buffer.position(begin());
00130 m_header = new EventHeader(buffer);
00131 buffer.position(originalPosition);
00132 }
00133 return *m_header;
00134 }
00135
00136 const EventReadout::RomFragmentPtrList& EventReadout::romFragments() const {
00137 if (0 == m_fragments) {
00138 m_fragments = new RomFragmentPtrList();
00139 if (hasByteBuffer()) {
00140 const ByteBuffer& buffer = byteBuffer();
00141
00142 const unsigned int originalPosition = buffer.position();
00143 buffer.position(begin() + (header().headerSize() * kBytesInInt));
00144 const EventTraits& traits = header().eventTraits();
00145 const bool cbltWrapping = header().cbltWrapping();
00146 const unsigned int finished = begin() + (bufferSize() * kBytesInInt);
00147 while (buffer.position() != finished) {
00148 const RomFragment* romFragment = new RomFragment(buffer,
00149 traits,
00150 cbltWrapping);
00151 m_fragments->push_back(romFragment);
00152 }
00153 buffer.position(originalPosition);
00154 }
00155 }
00156 return *m_fragments;
00157 }
00158
00159 unsigned int EventReadout::bufferSize() const {
00160 return header().totalSize();
00161 }
00162
00163 unsigned int EventReadout::gatherComponents(OutputBufferList& outputBuffers) const {
00164 unsigned int result = header().gather(outputBuffers);
00165 const RomFragmentPtrList& fragments = romFragments();
00166 RomFragmentPtrList::const_iterator fragment;
00167 for (fragment = fragments.begin();
00168 fragment != fragments.end();
00169 ++fragment) {
00170 result += (*fragment)->gather(outputBuffers);
00171 }
00172 return result;
00173 }
00174
00175 unsigned int EventReadout::inspectComponents(DaqBuffer::Bytes& inspectors) const {
00176 unsigned int result = header().inspect(inspectors);
00177 const RomFragmentPtrList& fragments = romFragments();
00178 RomFragmentPtrList::const_iterator fragment;
00179 for (fragment = fragments.begin();
00180 fragment != fragments.end();
00181 ++fragment) {
00182 result += (*fragment)->inspect(inspectors);
00183 }
00184 return result;
00185 }
00186
00187 void EventReadout::expanded(const unsigned int size) {
00188
00189 m_header->setTotalSize(m_header->totalSize() + size);
00190 notifyExpandable(size);
00191 }
00192
00193 void EventReadout::addReadout(const FadcReadout* readout,
00194 const unsigned int slot) {
00195 addReadout(readout,
00196 slot,
00197 header().eventTraits().moduleType(EventTraits::kFadcModule));
00198 }
00199
00200 void EventReadout::addReadout(const FeeReadout* readout,
00201 const unsigned int slot) {
00202 addReadout(readout,
00203 slot,
00204 header().eventTraits().moduleType(EventTraits::kFeeModule));
00205 }
00206
00207 void EventReadout::addReadout(const LtbReadout* readout,
00208 const unsigned int slot) {
00209
00210 addReadout(readout,
00211 slot,
00212 header().eventTraits().moduleType(EventTraits::kLtbModule));
00213 }
00214
00215 void EventReadout::addReadout(const FecReadout* readout,
00216 const unsigned int slot) {
00217
00218 addReadout(readout,
00219 slot,
00220 header().eventTraits().moduleType(EventTraits::kRpcRomModule));
00221 }
00222
00223 void EventReadout::addReadout(const RtmReadout* readout,
00224 const unsigned int slot) {
00225
00226 addReadout(readout,
00227 slot,
00228 header().eventTraits().moduleType(EventTraits::kRpcRtmModule));
00229 }
00230
00231 void EventReadout::addReadout(const RomData* readout,
00232 const unsigned int slot,
00233 const unsigned int moduleType) {
00234 RomFragment* result;
00235 if (header().cbltWrapping()) {
00236 CbltReadout* cbltReadout = new CbltReadout(slot,
00237 moduleType,
00238 readout,
00239 *m_cbltTraits);
00240 result = new RomFragment(header().site(),
00241 header().detector(),
00242 moduleType,
00243 slot,
00244 cbltReadout,
00245 header().eventTraits(),
00246 true,
00247 *this);
00248 } else {
00249 result = new RomFragment(header().site(),
00250 header().detector(),
00251 moduleType,
00252 slot,
00253 readout,
00254 header().eventTraits(),
00255 false,
00256 *this);
00257 }
00258 add(result);
00259 }
00260
00261 const RomFragment& EventReadout::add(const RomFragment* fragment) {
00262 if (0 == m_fragments) {
00263 m_fragments = new RomFragmentPtrList();
00264 }
00265 m_fragments->push_back(fragment);
00266 expanded(fragment->bufferSize());
00267 return *fragment;
00268 }
00269
00270