| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

DaqRootWriter.cc

Go to the documentation of this file.
00001 /*
00002  *  DaqRootWriter.cc
00003  *  DaqFormatModules
00004  *
00005  *  Created by Simon Patton on 8/8/10.
00006  *  Copyright 2010 DayaBay Collaboration. All rights reserved.
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     // Initialize the necessary services
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   // Never called
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 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:47:44 2011 for DybIO by doxygen 1.4.7