00001 #include "GaudiKernel/MsgStream.h"
00002 #include "GaudiKernel/Bootstrap.h"
00003
00004 #include "RawDataProviderSvc/IRawDataProviderSvc.h"
00005 #include "RawDataCnv/Util/EmcConverter.h"
00006
00007 EmcConverter* EmcConverter::s_instance = 0;
00008
00009 EmcConverter* EmcConverter::instance(int runMode)
00010 {
00011 if ( s_instance == 0 ) {
00012 s_instance = new EmcConverter(runMode);
00013 }
00014
00015 return s_instance;
00016 }
00017
00018 void EmcConverter::destroy()
00019 {
00020 if ( s_instance != 0 ) {
00021 delete s_instance;
00022 s_instance = 0;
00023 }
00024 }
00025
00026 StatusCode EmcConverter::convert(const BufferHolder& src, EmcDigiCol* des)
00027 {
00028 uint32_t REId, TEId, TETDC, TEADC, measure;
00029 uint32_t nbuf = src.nBuf();
00030
00031 for (uint32_t i = 0; i < nbuf; ++i) {
00032 uint32_t* buf = src(i);
00033 uint32_t* bufend = buf + src.bufSize(i);
00034 for (; buf < bufend; ++buf) {
00035
00036 m_builder.unPack(*buf, REId, TETDC, TEADC, measure);
00037
00038 TEId = m_builder.getTEID(REId);
00039 if ( TEId == 0xFFFFFFFF ) continue;
00040
00041 if ( m_EmcProvider ) {
00042
00043 if(!m_EmcProvider->isGoodEmcDigi(EmcRawDataProvider::DropLow|EmcRawDataProvider::CutTime
00044 |EmcRawDataProvider::DropHot,TEId,measure,TEADC,TETDC)) continue;
00045 Identifier id(TEId);
00046 m_EmcProvider->doCalib(id, measure, TEADC);
00047 }
00048
00049
00050 EmcDigi* emcDigi = new EmcDigi(Identifier(TEId), TETDC, TEADC);
00051 emcDigi->setMeasure(measure);
00052 des->push_back(emcDigi);
00053 }
00054 }
00055
00056 return StatusCode::SUCCESS;
00057 }
00058
00059 StatusCode EmcConverter::convert(EmcDigiCol* src, WriteRawEvent*& des)
00060 {
00061 return m_builder.pack(src, des);
00062 }
00063
00064 EmcConverter::EmcConverter(int runMode)
00065 : m_runMode(runMode),
00066 m_EmcProvider(0)
00067 {
00068 if ( m_runMode == 1 ) {
00069
00070 IService* svc ;
00071 StatusCode sc = Gaudi::svcLocator()->getService("RawDataProviderSvc", svc);
00072
00073
00074
00075 IRawDataProviderSvc* rawSvc = dynamic_cast<IRawDataProviderSvc*> (svc);
00076 if ( rawSvc != 0 ) {
00077 m_EmcProvider = rawSvc->getEmcProvider();
00078 }
00079 else {
00080 std::cerr << "Failed to get the RawDataProviderSvc" << std::endl;
00081 }
00082 }
00083 }
00084
00085 EmcConverter::~EmcConverter()
00086 {
00087 }