/search.css" rel="stylesheet" type="text/css"/> /search.js">
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

DybIODaqSvc.cc
Go to the documentation of this file.
00001 /*
00002  *  DybIODaqSvc.cc
00003  *  DybIOSvc
00004  *
00005  *  Created by Simon Patton on 3/7/11.
00006  *  Copyright 2011 DayaBay Collaboration. All rights reserved.
00007  *
00008  */
00009 #include "DybIODaqSvc.h"
00010 
00011 #include "DaqReadoutFormat/ByteBuffer.h"
00012 #include "DaqFormatModules/DaqReadoutSvc.h"
00013 #include "DaqXml/DaqXmlStream.h"
00014 #include "Event/DaqBlock.h"
00015 #include "Event/DaqBlockHeader.h"
00016 #include "FileReadoutFormat/DaqFromStrStream.h"
00017 #include "FileReadoutFormat/FileBuffer.h"
00018 #include "FileReadoutFormat/FileTraits.h"
00019 #include "GaudiKernel/MsgStream.h"
00020 #include "GaudiKernel/IConversionSvc.h"
00021 #include <string>
00022 
00023 using DayaBay::DaqBlock;
00024 using DayaBay::DaqBlockHeader;
00025 using DybDaq::ByteBuffer;
00026 using DybDaq::DaqFromStrStream;
00027 using DybDaq::DaqXmlStream;
00028 using DybDaq::FileBuffer;
00029 using DybDaq::FileEndRecord;
00030 using DybDaq::FileTraits;
00031 using std::string;
00032 
00033 static const string kTwoSpaces("  ");
00034 
00035 DybIODaqSvc::DybIODaqSvc(const std::string& name,
00036                            ISvcLocator* svc) :
00037     Service(name,
00038             svc),
00039     m_rioSvc(0),
00040     m_input(0),
00041     m_convSvc(0),
00042     m_daqSvc(0),
00043     m_daqBlockCnv(0),
00044     m_nextInsertion(0),
00045     m_entry(0),
00046     m_pendingHeader(0) {
00047     declareProperty("DaqBlockLocation",
00048                     m_daqBlockLocation=DayaBay::DaqBlockHeaderLocation::Default,
00049                     "Location in file where DAQ block will be saved.");
00050 }
00051 
00052 StatusCode DybIODaqSvc::queryInterface(const InterfaceID& id,
00053                                         void** interface) {
00054     if (IDybIODaqSvc::interfaceID().versionMatch(id)) {
00055         // Good enough. Return this object
00056         *interface = dynamic_cast<IDybIODaqSvc*>(this);
00057         addRef();
00058         return StatusCode::SUCCESS;
00059     }
00060     // Try base class
00061     return Service::queryInterface(id,
00062                                    interface);
00063 }
00064 
00065 StatusCode DybIODaqSvc::finalize() {
00066     if (0 != m_pendingHeader) {
00067         delete m_pendingHeader;
00068     }
00069     if (0 != m_daqSvc) {
00070       m_daqSvc->release();
00071     }
00072     if (0 != m_convSvc) {
00073       m_convSvc->release();
00074     }
00075     if (0 != m_rioSvc) {
00076       m_rioSvc->release();
00077     }
00078     return Service::finalize();
00079 }
00080 
00081 StatusCode DybIODaqSvc::setEventEntry(const unsigned int entry) {
00082     findDaqReadoutSvc();
00083     if (0 != m_daqSvc) {
00084         m_daqSvc->setFileRecord((const FileEndRecord*)0);
00085     }
00086     while (m_nextInsertion == entry) {
00087         if (0 != m_pendingHeader) {
00088             parseDaqBlock(*(m_pendingHeader->daqBlock()));
00089             delete m_pendingHeader;
00090         }
00091         m_pendingHeader = readDaqBlockHeader();
00092         if (0 == m_pendingHeader) {
00093             return StatusCode::FAILURE;
00094         }
00095         m_nextInsertion += m_pendingHeader->deltaEvents();
00096     }
00097     return StatusCode::SUCCESS;
00098 }
00099 
00100 StatusCode DybIODaqSvc::parseDaqBlock(const DaqBlock& daqBlock) {
00101     string content((const char*)(&((*(daqBlock.bytes()))[0])),
00102                    daqBlock.size() * ByteBuffer::BYTES_IN_INT);
00103     DaqFromStrStream reader;
00104     reader.openWithString(content);
00105     const FileBuffer* record = reader.nextRecord();
00106     while (0 != record) {
00107         if(record->isMarked(FileTraits::kDataSeparatorRecord)) {
00108             return StatusCode::FAILURE;
00109         } else {
00110             if (0 != m_daqSvc) {
00111                 m_daqSvc->setFileRecord(record);
00112             }
00113             std::stringstream message;
00114             message << '\n';
00115             DaqXmlStream xmlStream(message,
00116                                    kTwoSpaces,
00117                                    true);
00118             xmlStream.dumpElement(*record);
00119             MsgStream log(msgSvc(),
00120                           "DaqFormatContext");
00121             log << MSG::INFO << message.str() << endreq;        
00122         }
00123         record = reader.nextRecord();
00124     }
00125     return StatusCode::SUCCESS;
00126 }
00127 
00128 StatusCode DybIODaqSvc::findDaqReadoutSvc() {
00129     if (0 != m_daqSvc) {
00130       return StatusCode::SUCCESS;
00131     }
00132     MsgStream log(msgSvc(),
00133                   "DybIODaqSvc");
00134     IService* isvc = 0; 
00135     StatusCode status = service("DaqReadoutSvc",
00136                                 "DaqReadoutSvc",
00137                                 isvc);
00138     if (status.isFailure() ) {
00139         log << MSG::ERROR
00140             << "Failed to get IDaqReadoutSvc as IService"
00141             << endreq;
00142         return status;
00143     }
00144     IDaqReadoutSvc* daqSvc = 0;
00145     status = isvc->queryInterface(IDaqReadoutSvc::interfaceID(),
00146                                   (void**)&daqSvc);
00147     if (status.isFailure()) {
00148         log << MSG::ERROR
00149             << "Service does not implement IDaqReadoutSvc interface"
00150             << endreq;
00151         return status;
00152     }
00153     m_daqSvc = dynamic_cast<DaqReadoutSvc*>(daqSvc);
00154     return StatusCode::SUCCESS;
00155 }
00156 
00157 StatusCode DybIODaqSvc::findInputStream() {
00158     if (0 != m_input) {
00159       return StatusCode::SUCCESS;
00160     }
00161     MsgStream log(msgSvc(),
00162                   "DybIODaqSvc");
00163     IService* isvc = 0; 
00164     StatusCode sc = service("RootIOCnvSvc",
00165                             isvc,
00166                             true);
00167     if(sc.isFailure()){
00168         log << MSG::ERROR
00169             << "Failed to get RootIOCnvSvc as IService"
00170             << endreq;
00171         return sc;
00172     }
00173     sc = isvc->queryInterface(IRootIOSvc::interfaceID(),
00174                               (void**)&m_rioSvc);
00175     if (sc.isFailure()) {
00176         log << MSG::ERROR
00177             << "Conversion service RootIOCnvSvc"
00178             << " does not implement IRootIOCnvSvc"
00179             << endreq;
00180         return sc;
00181     }
00182 
00183     IRootIOSvc::InputStreamMap& ism = m_rioSvc->inputStreams();
00184     const IRootIOSvc::InputStreamMap::iterator finished = ism.end();
00185     for (IRootIOSvc::InputStreamMap::iterator it = ism.begin();
00186          finished != it;
00187          ++it) {
00188         log << MSG::DEBUG
00189             << "checking input stream: "
00190             << it->first << endreq;
00191         if( it->first == m_daqBlockLocation ){
00192             m_input = it->second;
00193             return StatusCode::SUCCESS;
00194         }
00195     }
00196     return StatusCode::FAILURE;
00197 }
00198 
00199 StatusCode DybIODaqSvc::findConverter() {
00200     if (0 != m_daqBlockCnv) {
00201       return StatusCode::SUCCESS;
00202     }
00203     MsgStream log(msgSvc(),
00204                   "DybIODaqSvc");
00205     IService* isvc = 0; 
00206     StatusCode sc = service("RootIOCnvSvc",
00207                             isvc,
00208                             true);
00209     if(sc.isFailure()){
00210         log << MSG::ERROR
00211             << "Failed to get RootIOCnvSvc as IService"
00212             << endreq;
00213         return sc;
00214     }
00215     sc = isvc->queryInterface(IConversionSvc::interfaceID(),
00216                               (void**)&m_convSvc);
00217     if (sc.isFailure()) {
00218         log << MSG::ERROR
00219             << "Conversion service RootIOCnvSvc"
00220             << " does not implement IConversionSvc"
00221             << endreq;
00222         return sc;
00223     }
00224 
00225     DaqBlockHeader daqBlockHeader;
00226     IConverter* converter = m_convSvc->converter(daqBlockHeader.classID());
00227     if (0 == converter) {
00228         log << MSG::ERROR
00229             << "Failed to get DaqBlockHeader converter"
00230             << endreq;
00231         return StatusCode::FAILURE;
00232     }
00233     m_daqBlockCnv = dynamic_cast< RootIOTypedCnv<PerDaqBlockHeader, DaqBlockHeader>* >(converter);
00234     if (0 == m_daqBlockCnv) {
00235         log << MSG::ERROR
00236             << "Failed to cast DaqBlockHeader converter"
00237             << endreq;
00238         return StatusCode::FAILURE;
00239     }
00240     return StatusCode::SUCCESS;
00241 }
00242 
00243 DaqBlockHeader* DybIODaqSvc::readDaqBlockHeader() {
00244     MsgStream log(msgSvc(),
00245                   "DybIODaqSvc");
00246 
00247     StatusCode sc = findInputStream();
00248     if (sc.isFailure()) {
00249         return 0;
00250     }
00251     sc = findConverter();
00252     if (sc.isFailure()) {
00253         return 0;
00254     }
00255 
00256     m_input->setEntry(m_entry);
00257     log << MSG::DEBUG
00258         << "Return status of read: "
00259         << m_input->read()
00260         << "\t" 
00261         << m_input->obj()
00262         << endreq;
00263     PerDaqBlockHeader* perDaqBlockHeader = (PerDaqBlockHeader*)(m_input->obj());
00264     if(0 == perDaqBlockHeader){
00265         log << MSG::ERROR
00266             << "Failed to get persistent DaqBlockHeader"
00267             << endreq;
00268         return 0;
00269     }
00270 
00271     DaqBlockHeader* result = new DaqBlockHeader;
00272     sc = m_daqBlockCnv->PerToTran(*perDaqBlockHeader,
00273                                   *result);
00274     if (sc.isFailure()) {
00275         log << MSG::ERROR
00276             << "Failed to translate persistent DaqBlockHeader" 
00277             << endreq;
00278         return 0;
00279     } else {
00280         ++m_entry;
00281     }
00282     return result;
00283 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Fri May 16 2014 10:15:57 for DybIO by doxygen 1.7.4