00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "DaqEventConverter.h"
00010
00011 #include "DaqFormatContext.h"
00012 #include "DaqFormatConversionSvc.h"
00013
00014 #include "Conventions/Detectors.h"
00015 #include "Event/DaqPmtCrate.h"
00016 #include "Event/ReadoutHeader.h"
00017 #include "Event/Readout.h"
00018 #include "Event/ReadoutPmtCrate.h"
00019 #include "Event/ReadoutRpcCrate.h"
00020 #include "EventReadoutFormat/EventHeader.h"
00021 #include "EventReadoutFormat/EventReadout.h"
00022 #include "EventReadoutFormat/EventTraits.h"
00023 #include "EventReadoutFormat/RomFragment.h"
00024 #include "EventReadoutFormat/RomHeader.h"
00025 #include "GaudiKernel/MsgStream.h"
00026 #include "LtbReadoutFormat/LtbFrame.h"
00027 #include "LtbReadoutFormat/LtbReadout.h"
00028 #include "LtbReadoutFormat/LtbTime.h"
00029
00030 using DayaBay::DaqPmtCrate;
00031 using DayaBay::Detector;
00032 using DayaBay::ReadoutHeader;
00033 using DayaBay::Readout;
00034 using DayaBay::ReadoutPmtCrate;
00035 using DayaBay::ReadoutRpcCrate;
00036 using DybDaq::DaqFormatContext;
00037 using DybDaq::DaqFormatConversionSvc;
00038 using DybDaq::DaqEventConverter;
00039 using DybDaq::EventHeader;
00040 using DybDaq::EventReadout;
00041 using DybDaq::EventTraits;
00042 using DybDaq::LtbFrame;
00043 using DybDaq::LtbReadout;
00044 using DybDaq::LtbTime;
00045 using DybDaq::RomData;
00046 using DybDaq::RomFragment;
00047 using DybDaq::RomHeader;
00048
00049 DaqEventConverter::Address::Address(const DaqFormatContext& context) :
00050 GenericAddress(storageType(),
00051 classID()),
00052 m_context(context) {
00053 }
00054
00055 DaqEventConverter::Address::~Address() {
00056 }
00057
00058 const DaqFormatContext& DaqEventConverter::Address::context() const {
00059 return m_context;
00060 }
00061
00062 DaqEventConverter::DaqEventConverter(unsigned char storageType,
00063 const CLID& clid,
00064 ISvcLocator* svc) :
00065 Converter(storageType,
00066 clid,
00067 svc) {
00068 }
00069
00070 DaqEventConverter::DaqEventConverter(ISvcLocator* svc) :
00071 Converter(storageType(),
00072 classID(),
00073 svc) {
00074 }
00075
00076 DaqEventConverter::~DaqEventConverter() {
00077 }
00078
00079 const long DaqEventConverter::storageType() {
00080 return DaqFormatConversionSvc::DAQ_FORMAT_DATA;
00081 }
00082
00083 const CLID& DaqEventConverter::classID() {
00084 return DayaBay::CLID_ReadoutHeader;
00085 }
00086
00087 StatusCode DaqEventConverter::createObj(IOpaqueAddress* addr,
00088 DataObject*& pObject) {
00089 Address* address = dynamic_cast<Address*>(addr);
00090 if (0 == address) {
00091 return StatusCode::FAILURE;
00092 }
00093 const EventReadout* eventReadout = address->context().event();
00094 if (0 == eventReadout) {
00095 return StatusCode::FAILURE;
00096 }
00097 pObject = createReadoutHeader(*eventReadout);
00098 if (0 == pObject) {
00099 return StatusCode::FAILURE;
00100 }
00101 return StatusCode::SUCCESS;
00102
00103 }
00104
00105 ReadoutHeader* DaqEventConverter::createReadoutHeader(const EventReadout& event) {
00106
00107 const EventHeader& header = event.header();
00108 const EventTraits& traits = header.eventTraits();
00109 const unsigned int kFeeModuleType = traits.moduleType(EventTraits::kFeeModule);
00110 const unsigned int kRpcRomModuleType = traits.moduleType(EventTraits::kRpcRomModule);
00111
00112 const EventReadout::RomFragmentPtrList& fragments = event.romFragments();
00113 EventReadout::RomFragmentPtrList::const_iterator fragment = fragments.begin();
00114 const unsigned int* crateType = 0;
00115 while(0 == crateType && fragment != fragments.end()) {
00116 if (kFeeModuleType == ((*fragment)->header().moduleType())) {
00117 crateType = &kFeeModuleType;
00118 }
00119 else if ( kRpcRomModuleType == ((*fragment)->header().moduleType())) {
00120 crateType = &kRpcRomModuleType;
00121 }
00122 ++fragment;
00123 }
00124 if (0 == crateType) {
00125 return 0;
00126 }
00127
00128 if ((*crateType) == kFeeModuleType) {
00129 const DaqPmtCrate* pmtCrate = new DaqPmtCrate(&event);
00130 const Detector& detector = pmtCrate->detector();
00131 const TimeStamp& triggerTime = pmtCrate->triggerTime();
00132 Context context(detector.site(),
00133 SimFlag::kData,
00134 triggerTime,
00135 detector.detectorId());
00136 ReadoutHeader* result = new ReadoutHeader();
00137 result->setContext(context);
00138 result->setEarliest(triggerTime);
00139 result->setLatest(triggerTime);
00140
00141
00142 result->setDaqCrate(const_cast<DaqPmtCrate*>(pmtCrate));
00143
00144 return result;
00145 }
00146 else if ((*crateType) == kRpcRomModuleType) {
00147
00148 ReadoutHeader* result = new ReadoutHeader();
00149 Readout* readout = new Readout();
00150 readout->setEventReadout(const_cast<EventReadout*>(&event));
00151 result->setReadout(readout);
00152 return result;
00153 }
00154
00155 MsgStream log(msgSvc(),
00156 "DaqEventConverter");
00157 log << MSG::ERROR << "Could not determine crate type so, cannot make readout." << endreq;
00158 return 0;
00159 }
00160
00161 long DaqEventConverter::repSvcType() const {
00162 return i_repSvcType();
00163 }
00164