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