00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "DaqReadoutFormat/ByteBuffer.h"
00011 #include "DybKernel/IDybStorageSvc.h"
00012 #include "Event/DaqBlock.h"
00013 #include "Event/DaqBlockHeader.h"
00014 #include "EventReadoutFormat/EventReadout.h"
00015 #include "FileReadoutFormat/DaqToStrStream.h"
00016 #include "GaudiKernel/RegistryEntry.h"
00017 #include "DaqRootWriter.h"
00018 #include <cstring>
00019
00020 using DayaBay::DaqCrate;
00021 using DayaBay::DaqBlock;
00022 using DayaBay::DaqBlockHeader;
00023 using DybDaq::ByteBuffer;
00024 using DybDaq::DaqFormatWriter;
00025 using DybDaq::DaqToOStream;
00026 using DybDaq::EventReadout;
00027 using DybDaq::FileTraits;
00028 using DybDaq::DaqToStrStream;
00029 using std::string;
00030
00031 DaqRootWriter::DaqRootWriter(const std::string& name,
00032 ISvcLocator* svc) :
00033 DaqFormatWriter(name,
00034 svc),
00035 m_storageSvc(0) {
00036 declareProperty("DaqBlockLocation",
00037 m_daqBlockLocation=DayaBay::DaqBlockHeaderLocation::Default,
00038 "Location in file where DAQ block will be saved.");
00039 }
00040
00041 DaqRootWriter::~DaqRootWriter() {
00042 }
00043
00044 StatusCode DaqRootWriter::initialize()
00045 {
00046 StatusCode sc = DaqFormatWriter::initialize();
00047 if(sc.isFailure()) {
00048 return sc;
00049 }
00050
00051
00052 sc = service("DybStorageSvc",
00053 m_storageSvc,
00054 true);
00055 if(sc.isFailure()) {
00056 m_storageSvc = 0;
00057 warning() << "No Storage Service was found, so this module will be disabled" << endreq;
00058 }
00059 return StatusCode::SUCCESS;
00060 }
00061
00062 StatusCode DaqRootWriter::finalize()
00063 {
00064 if(0 != m_storageSvc) {
00065 m_storageSvc->release();
00066 }
00067 return DaqFormatWriter::finalize();
00068 }
00069
00070 DaqToOStream* DaqRootWriter::createDaqToOStream(const FileTraits& traits) {
00071 m_strStream = new DaqToStrStream(traits);
00072 return m_strStream;
00073 }
00074
00075 StatusCode DaqRootWriter::writeData(const DaqCrate* daqCrate) {
00076 if (0 == m_strStream) {
00077 return StatusCode::FAILURE;
00078 }
00079 const EventReadout& eventReadout = daqCrate->eventReadout();
00080 m_strStream->eventSaved(eventReadout.bufferSize());
00081 return StatusCode::SUCCESS;
00082 }
00083
00084 void DaqRootWriter::wroteFileHead() {
00085 writeDaqBlock(createDaqBlock(),
00086 m_strStream->getFileBlockCount());
00087 }
00088
00089 void DaqRootWriter::wroteData() {
00090
00091 }
00092
00093 void DaqRootWriter::wroteFileFoot() {
00094 writeDaqBlock(createDaqBlock(),
00095 m_strStream->getFileBlockCount());
00096 }
00097
00098 DaqBlock* DaqRootWriter::createDaqBlock() {
00099 string content = m_strStream->str();
00100 m_strStream->splitStream();
00101 unsigned int length = content.length();
00102 DaqBlock::RawData* rawData = new DaqBlock::RawData(length / ByteBuffer::BYTES_IN_INT);
00103 std::memcpy(&((*rawData)[0]),
00104 content.data(),
00105 length);
00106 DaqBlock* result = new DaqBlock();
00107 result->setBytes(rawData);
00108 return result;
00109 }
00110
00111 StatusCode DaqRootWriter::writeDaqBlock(DaqBlock* daqBlock,
00112 unsigned int deltaEvents) {
00113 if (0 == m_storageSvc) {
00114 return StatusCode::SUCCESS;;
00115 }
00116
00117 DaqBlockHeader* daqHeader = new DaqBlockHeader();
00118 daqHeader->setDeltaEvents(deltaEvents);
00119 daqHeader->setDaqBlock(daqBlock);
00120
00121 DataSvcHelpers::RegistryEntry regEntry = DataSvcHelpers::RegistryEntry(m_daqBlockLocation);
00122 regEntry.setObject(daqHeader);
00123 debug() << "Storing DAQ Block" << endreq;
00124 StatusCode sc = m_storageSvc->store(daqHeader,
00125 m_daqBlockLocation);
00126 if(sc.isFailure()){
00127 error() << "Failed to store Run Header to output file" << endreq;
00128 return sc;
00129 }
00130 debug() << "Stored DAQ Block" << endreq;
00131
00132 return StatusCode::SUCCESS;
00133 }