00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "GaudiKernel/MsgStream.h"
00013 #include "GaudiKernel/SmartDataPtr.h"
00014
00015 #include "GaudiKernel/ThreadGaudi.h"
00016
00017
00018 #include "EventModel/EventModel.h"
00019 #include "MucRawEvent/MucDigi.h"
00020 #include "RawDataCnv/EventManagement/RAWEVENT.h"
00021 #include "RawDataCnv/EventManagement/RawEvent.h"
00022 #include "RawDataCnv/RawDataInputSvc.h"
00023 #include "RawDataCnv/RawDataMucDigiCnv.h"
00024
00025
00026
00027 extern const CLID& CLID_MucDigiCol;
00028
00029
00030 RawDataMucDigiCnv::RawDataMucDigiCnv(ISvcLocator* svc) :
00031 RawDataBaseCnv(PACKEDRAWEVENT_StorageType, classID(), svc)
00032 {
00033 }
00034
00035 RawDataMucDigiCnv::~RawDataMucDigiCnv()
00036 {
00037 MucConverter::destroy();
00038 }
00039
00040
00041
00042 const CLID& RawDataMucDigiCnv::classID()
00043 {
00044 return CLID_MucDigiCol;
00045 }
00046
00047 StatusCode RawDataMucDigiCnv::initialize()
00048 {
00049 std::string PackedRawDataCnvSvc_Name("PackedRawDataCnvSvc");
00050 std::string RawDataInputSvc_Name("RawDataInputSvc");
00051 std::string RawDataMucDigiCnv_Name("RawDataMucDigiCnv");
00052
00053
00054
00055
00056 SmartIF<IService> pCnvSvc(conversionSvc());
00057 if (isGaudiThreaded(pCnvSvc->name())){
00058 PackedRawDataCnvSvc_Name += getGaudiThreadIDfromName(pCnvSvc->name());
00059 RawDataInputSvc_Name += getGaudiThreadIDfromName(pCnvSvc->name());
00060 RawDataMucDigiCnv_Name += getGaudiThreadIDfromName(pCnvSvc->name());
00061 }
00062
00063
00064 MsgStream log(messageService(), RawDataMucDigiCnv_Name.c_str());
00065
00066 StatusCode sc = RawDataBaseCnv::initialize();
00067 if ( sc.isFailure() ) {
00068 return sc;
00069 }
00070
00071
00072 IService* isvc = 0;
00073 StatusCode status = serviceLocator()->service(PackedRawDataCnvSvc_Name.c_str(), isvc, true);
00074 m_RawDataAccess = dynamic_cast<PackedRawDataCnvSvc*> (isvc);
00075 if(m_RawDataAccess == 0 ) {
00076 log<<MSG::ERROR<< " MucRawDataCnv: Cant cast to RawDataCnvSvc " <<endreq;
00077 return StatusCode::FAILURE ;
00078 }
00079
00080 IService* svc ;
00081 sc = serviceLocator()->getService(RawDataInputSvc_Name.c_str(), svc);
00082
00083
00084
00085
00086 m_inputSvc = dynamic_cast<RawDataInputSvc*> (svc);
00087 if ( m_inputSvc == 0 ) {
00088 log<< MSG::WARNING << " Cant cast to RawDataInputSvc " <<endreq;
00089 return StatusCode::FAILURE ;
00090 }
00091
00092 m_cnv = MucConverter::instance();
00093
00094 return StatusCode::SUCCESS;
00095 }
00096
00097
00098 StatusCode RawDataMucDigiCnv::updateObj(IOpaqueAddress* pAddr, DataObject* pObj) {
00099
00100
00101
00102
00103
00104 return Converter::updateObj(pAddr, pObj);
00105 }
00106
00107
00108 StatusCode RawDataMucDigiCnv::createObj(IOpaqueAddress* pAddr, DataObject*& pObj)
00109 {
00110
00111
00112
00113 MucDigiCol *digiCol = new MucDigiCol;
00114 pObj = digiCol;
00115
00116 RAWEVENT* evt = m_inputSvc->currentEvent();
00117 if (evt == NULL) {
00118 cout << "RawDataMucDigiCnv::createObj has event!" << endl;
00119 return StatusCode::FAILURE;
00120 }
00121
00122 const BufferHolder& mucBuf = evt->getMucBuf();
00123
00124 return m_cnv->convert(mucBuf, digiCol);
00125 }
00126
00127 StatusCode RawDataMucDigiCnv::createRep(DataObject* pObj, IOpaqueAddress*& pAddr)
00128 {
00129
00130
00131
00132 WriteRawEvent*& re = m_RawDataAccess->getRawEvent();
00133 if (re == 0) {
00134
00135 return StatusCode::FAILURE;
00136 }
00137
00138 SmartDataPtr<MucDigiCol> digiCol(dataProvider(), EventModel::Digi::MucDigiCol);
00139 if (digiCol == 0) {
00140
00141 return StatusCode::FAILURE;
00142 }
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158 return m_cnv->convert(digiCol, re);
00159 }