00001
00002
00003
00004
00005
00006
00007
00008
00009 static const char* rcsid = "$Id: PackedRawDataCnvSvc.cxx,v 1.24 2012/12/16 07:23:10 zoujh Exp $";
00010
00011
00012 #include "GaudiKernel/MsgStream.h"
00013 #include "GaudiKernel/ConversionSvc.h"
00014 #include "GaudiKernel/ISvcLocator.h"
00015 #include "GaudiKernel/SmartDataPtr.h"
00016
00017 #include "EventModel/EventModel.h"
00018 #include "EventModel/EventHeader.h"
00019 #include "RawDataCnvBase/IRawDataCnvSvc.h"
00020
00021 #include "RawDataCnv/ClassID_temp.h"
00022 #include "RawDataCnv/IRawDataOutputSvc.h"
00023 #include "RawDataCnv/RawDataCnv.h"
00024 #include "RawDataCnv/RawDataEvtHeaderCnv.h"
00025 #include "RawDataCnv/RawDataMcCnv.h"
00026 #include "RawDataCnv/RawDataMcParticleCnv.h"
00027 #include "RawDataCnv/RawDataMdcMcHitCnv.h"
00028 #include "RawDataCnv/RawDataTofMcHitCnv.h"
00029 #include "RawDataCnv/RawDataEmcMcHitCnv.h"
00030 #include "RawDataCnv/RawDataMucMcHitCnv.h"
00031 #include "RawDataCnv/RawDataDigiCnv.h"
00032 #include "RawDataCnv/RawDataMdcDigiCnv.h"
00033 #include "RawDataCnv/RawDataTofDigiCnv.h"
00034 #include "RawDataCnv/RawDataLumiDigiCnv.h"
00035 #include "RawDataCnv/RawDataEmcDigiCnv.h"
00036 #include "RawDataCnv/RawDataMucDigiCnv.h"
00037 #include "RawDataCnv/RawDataTrigCnv.h"
00038 #include "RawDataCnv/RawDataTrigGTDCnv.h"
00039 #include "RawDataCnv/RawDataHltCnv.h"
00040 #include "RawDataCnv/RawDataHltRawCnv.h"
00041 #include "RawDataCnv/RawDataZddEventCnv.h"
00042 #include "RawDataCnv/PackedRawDataCnvSvc.h"
00043
00044 using namespace std;
00045
00046 static const InterfaceID IID_IRawDataBaseCnv("IRawDataBaseCnv", 1 , 0);
00047
00049 PackedRawDataCnvSvc::PackedRawDataCnvSvc(const std::string& name, ISvcLocator* svc)
00050 : RawDataCnvSvc(name, svc, PACKEDRAWEVENT_StorageType)
00051 {
00052 declareProperty("RawDataOutputSvc", m_ioSvcName);
00053 declareProperty("Status", m_status=0xFFFFFFFF);
00054 }
00055
00057 PackedRawDataCnvSvc::~PackedRawDataCnvSvc()
00058 {}
00059
00061 StatusCode PackedRawDataCnvSvc::initialize() {
00062 MsgStream log(messageService(), name());
00063 log << MSG::INFO << name() << " PackedRawDataCnvSvc::initialize RawDataOutputSvc:" << m_ioSvcName<< endreq;
00064
00065 StatusCode sc = RawDataCnvSvc::initialize();
00066 if( sc.isFailure() ) {
00067 log << MSG::ERROR << "Unable to initialize service " << endreq;
00068 return sc;
00069 }
00070
00071 IService* svc ;
00072 sc = service(m_ioSvcName, svc);
00073 if (sc != StatusCode::SUCCESS ) {
00074 log << MSG::WARNING << "Cant get RawDataOutputSvc " << endreq;
00075
00076 }
00077
00078 m_ioSvc = dynamic_cast<IRawDataOutputSvc*> (svc);
00079 if (m_ioSvc == 0 ) {
00080 log << MSG::WARNING << "Cant cast to RawDataOutputSvc " << endreq;
00081
00082 }
00083
00084 return StatusCode::SUCCESS;
00085 }
00086
00088 StatusCode PackedRawDataCnvSvc::addConverters() {
00089 MsgStream log(messageService(), name());
00090
00091 declareObject(IRawDataCnvSvc::Leaf(EventModel::EventH, RawDataCnv::classID(), "PASS", 0));
00092
00093 declareObject(IRawDataCnvSvc::Leaf(EventModel::EventHeader, RawDataEvtHeaderCnv::classID(), "PASS", 0));
00094
00095 declareObject(IRawDataCnvSvc::Leaf(EventModel::MC::Event, RawDataMcCnv::classID(), "PASS", 0));
00096 declareObject(IRawDataCnvSvc::Leaf(EventModel::MC::McParticleCol, RawDataMcParticleCnv::classID(), "PASS", 0));
00097 declareObject(IRawDataCnvSvc::Leaf(EventModel::MC::MdcMcHitCol, RawDataMdcMcHitCnv::classID(), "PASS", 0));
00098 declareObject(IRawDataCnvSvc::Leaf(EventModel::MC::TofMcHitCol, RawDataTofMcHitCnv::classID(), "PASS", 0));
00099 declareObject(IRawDataCnvSvc::Leaf(EventModel::MC::EmcMcHitCol, RawDataEmcMcHitCnv::classID(), "PASS", 0));
00100 declareObject(IRawDataCnvSvc::Leaf(EventModel::MC::MucMcHitCol, RawDataMucMcHitCnv::classID(), "PASS", 0));
00101 declareObject(IRawDataCnvSvc::Leaf(EventModel::Digi::Event, RawDataDigiCnv::classID(), "PASS", 0));
00102 declareObject(IRawDataCnvSvc::Leaf(EventModel::Digi::MdcDigiCol, RawDataMdcDigiCnv::classID(), "PASS", 0));
00103 declareObject(IRawDataCnvSvc::Leaf(EventModel::Digi::TofDigiCol, RawDataTofDigiCnv::classID(), "PASS", 0));
00104 declareObject(IRawDataCnvSvc::Leaf(EventModel::Digi::LumiDigiCol,RawDataLumiDigiCnv::classID(), "PASS", 0));
00105 declareObject(IRawDataCnvSvc::Leaf(EventModel::Digi::EmcDigiCol, RawDataEmcDigiCnv::classID(), "PASS", 0));
00106 declareObject(IRawDataCnvSvc::Leaf(EventModel::Digi::MucDigiCol, RawDataMucDigiCnv::classID(), "PASS", 0));
00107 declareObject(IRawDataCnvSvc::Leaf(EventModel::Trig::Event, RawDataTrigCnv::classID(), "PASS", 0));
00108 declareObject(IRawDataCnvSvc::Leaf(EventModel::Trig::TrigGTDCol, RawDataTrigGTDCnv::classID(), "PASS", 0));
00109 declareObject(IRawDataCnvSvc::Leaf(EventModel::Hlt::Event, RawDataHltCnv::classID(), "PASS", 0));
00110 declareObject(IRawDataCnvSvc::Leaf(EventModel::Hlt::HltRawCol, RawDataHltRawCnv::classID(), "PASS", 0));
00111 declareObject(IRawDataCnvSvc::Leaf(EventModel::Zdd::ZddEvent, RawDataZddEventCnv::classID(), "PASS", 0));
00112
00113 return StatusCode::SUCCESS;
00114 }
00115
00117 StatusCode PackedRawDataCnvSvc::updateServiceState(IOpaqueAddress* pAddress) {
00118 MsgStream log(messageService(), name());
00119 StatusCode sc = RawDataCnvSvc::updateServiceState(pAddress);
00120
00121 return sc;
00122 }
00123
00124 StatusCode PackedRawDataCnvSvc::queryInterface(const InterfaceID& riid, void** ppvInterface) {
00125 if ( IID_IRawDataBaseCnv == riid ) {
00126 *ppvInterface = (IRawDataCnvSvc*)this;
00127 } else {
00128
00129 return ConversionSvc::queryInterface(riid, ppvInterface);
00130 }
00131 addRef();
00132 return StatusCode::SUCCESS;
00133 }
00134
00135 StatusCode PackedRawDataCnvSvc::connectOutput(const std::string& )
00136 {
00137
00138 MsgStream log(messageService(), name() );
00139
00140 log << MSG::DEBUG << " In connectOutput "<< endreq;
00141
00142
00143 SmartDataPtr<Event::EventHeader> evt(dataProvider(), EventModel::EventHeader);
00144 if (!evt) {
00145 log << MSG::ERROR << "Did not retrieve event" << endreq;
00146 return StatusCode::FAILURE;
00147 }
00148 unsigned int eventNo = evt->eventNumber();
00149 unsigned int runNo = evt->runNumber();
00150
00151 m_rawEvent = new WriteRawEvent(0x790000,
00152 eventNo,
00153 runNo,
00154 eventNo,
00155 0,
00156 0,
00157 ef_info
00158 );
00159
00160 if(m_status!=0xFFFFFFFF) m_rawEvent->status(1, &m_status);
00161 else m_rawEvent->status(0, NULL);
00162
00163 return StatusCode::SUCCESS;
00164 }
00165
00166 StatusCode PackedRawDataCnvSvc::commitOutput(const std::string& , bool )
00167 {
00168 MsgStream log(messageService(), name() );
00169
00170 log << MSG::DEBUG << "In flushOutput" << endreq;
00171
00172 if (!m_ioSvc) {
00173 log << MSG::ERROR << "RawDataCnvSvc not configure for output" << endreq;
00174 return StatusCode::FAILURE;
00175 }
00176
00177
00178
00179
00180
00181
00182
00183 log << MSG::DEBUG << "commitOutput: Size of Event (words) ="
00184 << m_rawEvent->size_word() << endreq;
00185
00186 if (!m_ioSvc->putEvent(m_rawEvent) ) {
00187 log << MSG::ERROR << "commitOutput failed to send output" << endreq;
00188 return StatusCode::FAILURE;
00189 }
00190
00191
00192 const eformat::write::SubDetectorFragment* sd = m_rawEvent->first_child();
00193 while ( sd != 0) {
00194 const eformat::write::ROSFragment* ros = sd->first_child();
00195 while (ros != 0) {
00196 const eformat::write::ROBFragment* rob = ros->first_child();
00197 while (rob != 0) {
00198 const eformat::write::ROBFragment* rob_tmp = rob;
00199 rob = rob->next();
00200 delete rob_tmp;
00201 }
00202 const eformat::write::ROSFragment* ros_tmp = ros;
00203 ros = ros->next();
00204 delete ros_tmp;
00205 }
00206 const eformat::write::SubDetectorFragment* sd_tmp = sd;
00207 sd = sd->next();
00208 delete sd_tmp;
00209 }
00210 delete m_rawEvent;
00211
00212 return StatusCode::SUCCESS;
00213 }
00214