00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "DaqReadoutFormat/ByteBuffer.h"
00011 #include "Event/DaqBlockHeader.h"
00012 #include "PerBaseEvent/HeaderObjectCnv.h"
00013 #include "PerDaqBlock/PerDaqBlock.h"
00014 #include "PerDaqBlock/PerDaqBlockHeader.h"
00015 #include <cstring>
00016
00017 #include "DaqBlockHeaderCnv.h"
00018
00019 using DayaBay::DaqBlock;
00020 using DayaBay::DaqBlockHeader;
00021 using DayaBay::HeaderObject;
00022 using DybDaq::ByteBuffer;
00023
00024 DaqBlockHeaderCnv::DaqBlockHeaderCnv(ISvcLocator* svc) :
00025 RootIOTypedCnv<PerDaqBlockHeader,DaqBlockHeader>("PerDaqBlockHeader",
00026 classID(),
00027 svc) {
00028 }
00029
00030
00031 DaqBlockHeaderCnv::~DaqBlockHeaderCnv() {
00032 }
00033
00034 StatusCode DaqBlockHeaderCnv::PerToTran(const PerDaqBlockHeader& perobj,
00035 DaqBlockHeader& tranobj) {
00036 MsgStream log(msgSvc(), "ReadoutHeaderCnv::PerToTran");
00037 StatusCode sc = HeaderObjectCnv::toTran(perobj,tranobj);
00038 if (sc.isFailure()) {
00039 return sc;
00040 }
00041
00042 tranobj.setDeltaEvents(perobj.deltaEvents);
00043 if(0 == perobj.daqBlock) {
00044 tranobj.setDaqBlock(0);
00045 return StatusCode::SUCCESS;
00046 }
00047
00048 DaqBlock* daqBlock = const_cast<DaqBlock*>(tranobj.daqBlock());
00049 if (0 == daqBlock) {
00050 daqBlock = new DaqBlock();
00051 tranobj.setDaqBlock(daqBlock);
00052 }
00053 DaqBlock::RawData* rawBytes = daqBlock->bytes();
00054 std::vector<unsigned int>& daqBytes = perobj.daqBlock->rawData;
00055 if (0 == rawBytes) {
00056 rawBytes = new DaqBlock::RawData(daqBytes.size());
00057 daqBlock->setBytes(rawBytes);
00058 } else {
00059 rawBytes->resize(daqBytes.size());
00060 }
00061 memcpy(&((*(daqBlock->bytes()))[0]),
00062 &(daqBytes[0]),
00063 daqBytes.size() * ByteBuffer::BYTES_IN_INT);
00064 return StatusCode::SUCCESS;
00065 }
00066
00067 StatusCode DaqBlockHeaderCnv::TranToPer(const DaqBlockHeader& tranobj,
00068 PerDaqBlockHeader& perobj) {
00069 MsgStream log(msgSvc(), "DaqBlockHeaderCnv::TranToPer");
00070 StatusCode sc = HeaderObjectCnv::toPer(tranobj,
00071 perobj);
00072 if (sc.isFailure()) {
00073 return sc;
00074 }
00075
00076 perobj.deltaEvents = tranobj.deltaEvents();
00077 const DaqBlock* daqBlock = tranobj.daqBlock();
00078 if ( 0 == daqBlock) {
00079 delete perobj.daqBlock;
00080 perobj.daqBlock = 0;
00081 return StatusCode::SUCCESS;
00082 }
00083 perobj.daqBlock = new PerDaqBlock(daqBlock->size());
00084 std::vector<unsigned int>& daqBytes = perobj.daqBlock->rawData;
00085 memcpy(&(daqBytes[0]),
00086 &((*(daqBlock->bytes()))[0]),
00087 daqBlock->size() * ByteBuffer::BYTES_IN_INT);
00088 return StatusCode::SUCCESS;
00089 }
00090
00091 StatusCode DaqBlockHeaderCnv::fillRepRefs(IOpaqueAddress*, DataObject* dobj) {
00092 MsgStream log(msgSvc(), "DaqBlockHeaderCnv::fillRepRefs");
00093 DaqBlockHeader* rh = dynamic_cast<DaqBlockHeader*>(dobj);
00094
00095 log << MSG::DEBUG
00096 << "Saving links to " << rh->inputHeaders().size()
00097 << " input headers" << endreq;
00098
00099 StatusCode sc = HeaderObjectCnv::fillPer(m_rioSvc,*rh,*m_perOutObj);
00100 if (sc.isFailure()) {
00101 log << MSG::ERROR << "Failed to fill HeaderObject part" << endreq;
00102 return sc;
00103 }
00104
00105
00106 return sc;
00107 }
00108
00109 StatusCode DaqBlockHeaderCnv::fillObjRefs(IOpaqueAddress*, DataObject* dobj) {
00110 MsgStream log(msgSvc(), "DaqBlockHeaderCnv::fillObjRefs");
00111 HeaderObject* hobj = dynamic_cast<HeaderObject*>(dobj);
00112 StatusCode sc = HeaderObjectCnv::fillTran(m_rioSvc,*m_perInObj,*hobj);
00113 if (sc.isFailure()) {
00114 log << MSG::ERROR << "Failed to fill HeaderObject part" << endreq;
00115 return sc;
00116 }
00117
00118 log << MSG::DEBUG
00119 << "Restored links to " << hobj->inputHeaders().size()
00120 << " input headers" << endreq;
00121
00122
00123 return sc;
00124 }