/search.css" rel="stylesheet" type="text/css"/> /search.js">
00001 /* 00002 * EventReadout.cc 00003 * RawFileReading 00004 * 00005 * Created by Simon Patton on 7/20/10. 00006 * Copyright 2010 DayaBay Collaboration. All rights reserved. 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 "EventReadoutFormat/RomHeader.h" 00019 #include "FadcReadoutFormat/FadcReadout.h" 00020 #include "FeeReadoutFormat/FeeReadout.h" 00021 #include "LtbReadoutFormat/LtbReadout.h" 00022 #include "FecReadoutFormat/FecReadout.h" 00023 #include "RtmReadoutFormat/RtmReadout.h" 00024 00025 using DybDaq::ByteBuffer; 00026 using DybDaq::CbltReadout; 00027 using DybDaq::CbltTraits; 00028 using DybDaq::DaqBuffer; 00029 using DybDaq::DaqTraits; 00030 using DybDaq::EventReadout; 00031 using DybDaq::EventHeader; 00032 using DybDaq::EventBuffer; 00033 using DybDaq::FadcReadout; 00034 using DybDaq::FeeReadout; 00035 using DybDaq::LtbReadout; 00036 using DybDaq::FecReadout; 00037 using DybDaq::RtmReadout; 00038 using DybDaq::RomFragment; 00039 using DybDaq::RomHeader; 00040 00041 EventReadout::EventReadout(const EventReadout& readout): 00042 DaqContainer(readout), 00043 m_header(0), 00044 m_fragments(0), 00045 m_cbltTraits((CbltTraits*)0) { 00046 // Currently assumes a ByteBuffer based EventReadout is being copied. 00047 } 00048 00049 EventReadout::EventReadout(const unsigned int site, 00050 const unsigned int detector, 00051 const unsigned int run, 00052 const unsigned int event, 00053 const unsigned int dataType, 00054 const bool rawCblt, 00055 const bool triggerMismatch, 00056 const bool invalidData, 00057 const bool rpcSortDisabled, 00058 const bool dataSortTimeout, 00059 const EventTraits& traits) : 00060 DaqContainer(), 00061 m_header(new EventHeader(site, 00062 detector, 00063 run, 00064 event, 00065 dataType, 00066 false, 00067 rawCblt, 00068 triggerMismatch, 00069 invalidData, 00070 rpcSortDisabled, 00071 dataSortTimeout, 00072 traits)), 00073 m_fragments(0), 00074 m_cbltTraits((CbltTraits*)0) { 00075 } 00076 00077 EventReadout::EventReadout(const unsigned int site, 00078 const unsigned int detector, 00079 const unsigned int run, 00080 const unsigned int event, 00081 const unsigned int dataType, 00082 const bool rawCblt, 00083 const bool triggerMismatch, 00084 const bool invalidData, 00085 const bool rpcSortDisabled, 00086 const bool dataSortTimeout, 00087 const CbltTraits& cbltTraits, 00088 const EventTraits& traits) : 00089 DaqContainer(), 00090 m_header(new EventHeader(site, 00091 detector, 00092 run, 00093 event, 00094 dataType, 00095 true, 00096 rawCblt, 00097 triggerMismatch, 00098 invalidData, 00099 rpcSortDisabled, 00100 dataSortTimeout, 00101 traits)), 00102 m_fragments(0), 00103 m_cbltTraits(&cbltTraits) { 00104 } 00105 00106 EventReadout::EventReadout(const ByteBuffer& byteBuffer) : 00107 DaqContainer(byteBuffer, 00108 0), 00109 m_header(0), 00110 m_fragments(0), 00111 m_cbltTraits((CbltTraits*)0) { 00112 byteBuffer.position(byteBuffer.position() + (header().totalSize() * kBytesInInt)); 00113 } 00114 00115 EventReadout::~EventReadout() { 00116 if (0 != m_fragments) { 00117 RomFragmentPtrList::iterator fragment; 00118 for (fragment = m_fragments->begin(); 00119 fragment != m_fragments->end(); 00120 ++fragment) { 00121 delete const_cast<RomFragment*>(*fragment); 00122 } 00123 delete m_fragments; 00124 } 00125 if (0 != m_header) { 00126 delete m_header; 00127 } 00128 } 00129 00130 const DaqTraits& EventReadout::daqTraits() const { 00131 return header().eventTraits(); 00132 } 00133 00134 const EventHeader& EventReadout::header() const { 00135 if (0 == m_header && hasByteBuffer()) { 00136 const ByteBuffer& buffer = byteBuffer(); 00137 00138 const unsigned int originalPosition = buffer.position(); 00139 buffer.position(begin()); 00140 m_header = new EventHeader(buffer); 00141 buffer.position(originalPosition); 00142 } 00143 return *m_header; 00144 } 00145 00146 const EventReadout::RomFragmentPtrList& EventReadout::romFragments() const { 00147 if (0 == m_fragments) { 00148 m_fragments = new RomFragmentPtrList(); 00149 if (hasByteBuffer()) { 00150 const ByteBuffer& buffer = byteBuffer(); 00151 00152 const unsigned int originalPosition = buffer.position(); 00153 buffer.position(begin() + (header().headerSize() * kBytesInInt)); 00154 const EventTraits& traits = header().eventTraits(); 00155 const bool cbltWrapping = header().cbltWrapping(); 00156 const unsigned int finished = begin() + (bufferSize() * kBytesInInt); 00157 while (buffer.position() != finished) { 00158 const RomFragment* romFragment = new RomFragment(buffer, 00159 traits, 00160 cbltWrapping); 00161 m_fragments->push_back(romFragment); 00162 } 00163 buffer.position(originalPosition); 00164 } 00165 } 00166 return *m_fragments; 00167 } 00168 00169 bool EventReadout::containsPmtFragments() const { 00170 const EventTraits& traits = header().eventTraits(); 00171 const unsigned int kLtbModuleType = traits.moduleType(EventTraits::kLtbModule); 00172 const unsigned int kFeeModuleType = traits.moduleType(EventTraits::kFeeModule); 00173 const unsigned int kFadcModuleType = traits.moduleType(EventTraits::kFadcModule); 00174 const RomFragmentPtrList& fragments = romFragments(); 00175 for (RomFragmentPtrList::const_iterator fragment = fragments.begin(); 00176 fragment != fragments.end(); 00177 ++fragment) { 00178 unsigned int romType = (*fragment)->header().moduleType(); 00179 if (kLtbModuleType == romType || kFeeModuleType == romType || kFadcModuleType == romType) { 00180 return true; 00181 } 00182 } 00183 return false; 00184 } 00185 00186 bool EventReadout::containsRpcFragments() const { 00187 const EventTraits& traits = header().eventTraits(); 00188 const unsigned int kRpcRomModuleType = traits.moduleType(EventTraits::kRpcRomModule); 00189 const unsigned int kRpcRtmModuleType = traits.moduleType(EventTraits::kRpcRtmModule); 00190 const RomFragmentPtrList& fragments = romFragments(); 00191 for (RomFragmentPtrList::const_iterator fragment = fragments.begin(); 00192 fragment != fragments.end(); 00193 ++fragment) { 00194 unsigned int romType = (*fragment)->header().moduleType(); 00195 if (kRpcRomModuleType == romType || kRpcRtmModuleType == romType) { 00196 return true; 00197 } 00198 } 00199 return false; 00200 } 00201 00202 unsigned int EventReadout::bufferSize() const { 00203 return header().totalSize(); 00204 } 00205 00206 unsigned int EventReadout::gatherComponents(OutputBufferList& outputBuffers) const { 00207 unsigned int result = header().gather(outputBuffers); 00208 const RomFragmentPtrList& fragments = romFragments(); 00209 RomFragmentPtrList::const_iterator fragment; 00210 for (fragment = fragments.begin(); 00211 fragment != fragments.end(); 00212 ++fragment) { 00213 result += (*fragment)->gather(outputBuffers); 00214 } 00215 return result; 00216 } 00217 00218 unsigned int EventReadout::inspectComponents(DaqBuffer::Bytes& inspectors) const { 00219 unsigned int result = header().inspect(inspectors); 00220 const RomFragmentPtrList& fragments = romFragments(); 00221 RomFragmentPtrList::const_iterator fragment; 00222 for (fragment = fragments.begin(); 00223 fragment != fragments.end(); 00224 ++fragment) { 00225 result += (*fragment)->inspect(inspectors); 00226 } 00227 return result; 00228 } 00229 00230 void EventReadout::expanded(const unsigned int size) { 00231 // If this is non-const, then header must already exist. 00232 m_header->setTotalSize(m_header->totalSize() + size); 00233 notifyExpandable(size); 00234 } 00235 00236 void EventReadout::addReadout(const FadcReadout* readout, 00237 const unsigned int slot) { 00238 addReadout(readout, 00239 slot, 00240 header().eventTraits().moduleType(EventTraits::kFadcModule)); 00241 } 00242 00243 void EventReadout::addReadout(const FeeReadout* readout, 00244 const unsigned int slot) { 00245 addReadout(readout, 00246 slot, 00247 header().eventTraits().moduleType(EventTraits::kFeeModule)); 00248 } 00249 00250 void EventReadout::addReadout(const LtbReadout* readout, 00251 const unsigned int slot) { 00252 00253 addReadout(readout, 00254 slot, 00255 header().eventTraits().moduleType(EventTraits::kLtbModule)); 00256 } 00257 00258 void EventReadout::addReadout(const FecReadout* readout, 00259 const unsigned int slot) { 00260 00261 addReadout(readout, 00262 slot, 00263 header().eventTraits().moduleType(EventTraits::kRpcRomModule)); 00264 } 00265 00266 void EventReadout::addReadout(const RtmReadout* readout, 00267 const unsigned int slot) { 00268 00269 addReadout(readout, 00270 slot, 00271 header().eventTraits().moduleType(EventTraits::kRpcRtmModule)); 00272 } 00273 00274 void EventReadout::addReadout(const RomData* readout, 00275 const unsigned int slot, 00276 const unsigned int moduleType) { 00277 RomFragment* result; 00278 if (header().cbltWrapping()) { 00279 CbltReadout* cbltReadout = new CbltReadout(slot, 00280 moduleType, 00281 readout, 00282 *m_cbltTraits); 00283 result = new RomFragment(header().site(), 00284 header().detector(), 00285 moduleType, 00286 slot, 00287 cbltReadout, 00288 header().eventTraits(), 00289 true, 00290 *this); 00291 } else { 00292 result = new RomFragment(header().site(), 00293 header().detector(), 00294 moduleType, 00295 slot, 00296 readout, 00297 header().eventTraits(), 00298 false, 00299 *this); 00300 } 00301 add(result); 00302 } 00303 00304 const RomFragment& EventReadout::add(const RomFragment* fragment) { 00305 if (0 == m_fragments) { 00306 m_fragments = new RomFragmentPtrList(); 00307 } 00308 m_fragments->push_back(fragment); 00309 expanded(fragment->bufferSize()); 00310 return *fragment; 00311 } 00312 00313