/* * TbUTCommonModeSubtractorAlgorithm.cpp * * Created on: Nov 24, 2014 * Author: ADendek */ #include "TbUTCommonModeSubtractorAlgorithm.h" using namespace TbUT; DECLARE_NAMESPACE_ALGORITHM_FACTORY(TbUT,CommonModeSubtractorAlgorithm) CommonModeSubtractorAlgorithm::CommonModeSubtractorAlgorithm(const std::string& name, ISvcLocator* pSvcLocator): GaudiAlgorithm(name, pSvcLocator), m_dataContainer(), m_data(), m_outputContainer(), m_inputDataLocation(), m_outputDataLocation(), m_channelMaskInputLocation(), m_CMSOption(), m_noiseCalculatorType(), m_noiseOutputLocation(), m_event(0), m_skipEvent(0), m_channelMaskFileValidator(m_channelMaskInputLocation), m_channelMaskProvider(m_channelMaskFileValidator), m_SubtractorFactory(m_channelMaskProvider), m_noiseCalculatorFactory(), m_noiseCalculatorPtr() { declareProperty("InputDataLocation", m_inputDataLocation=TbUT::DataLocations::PedestalTES); declareProperty("OutputDataLocation", m_outputDataLocation=TbUT::DataLocations::CMSTES); declareProperty("CMSType",m_CMSOption=TbUT::CMSType::Iteratively); declareProperty("skippEventNumber",m_skipEvent=0); declareProperty("ChannelMaskInputLocation", m_channelMaskInputLocation=TbUT::DataLocations::MaskLocation); declareProperty("NoiseCalculatorType", m_noiseCalculatorType=TbUT::NoiseCalculatorType::calculator); declareProperty("NoiseOutputFile", m_noiseOutputLocation=TbUT::DataLocations::NoiseTreshold); } StatusCode CommonModeSubtractorAlgorithm::initialize() { if(StatusCode::SUCCESS !=initializeBase()) return StatusCode::FAILURE; if(StatusCode::SUCCESS !=buildSubtractorEngine()) return StatusCode::FAILURE; if(StatusCode::SUCCESS !=buildNoiseCalculator()) return StatusCode::FAILURE; if(StatusCode::SUCCESS !=retriveMasksFromFile()) return StatusCode::FAILURE; info()<<"Initialized successfully my friend!"<<endmsg; return StatusCode::SUCCESS; } StatusCode CommonModeSubtractorAlgorithm::execute() { if(m_event<m_skipEvent) { return skippTreaningEvent(); } if(StatusCode::SUCCESS != getData()) return StatusCode::FAILURE; m_outputContainer =new RawDataContainer<double>(); if(m_dataContainer->isEmpty()){ put(m_outputContainer,m_outputDataLocation); return StatusCode::SUCCESS; } for(const auto& rawDataIt: m_dataContainer->getData()){ m_data=new RawData<>(rawDataIt); processEvent(); delete m_data; } put(m_outputContainer,m_outputDataLocation); return StatusCode::SUCCESS; } StatusCode CommonModeSubtractorAlgorithm::finalize() { if(StatusCode::SUCCESS !=saveNoiseToFile()) return StatusCode::FAILURE; return GaudiAlgorithm::finalize(); } StatusCode CommonModeSubtractorAlgorithm::initializeBase() { return GaudiAlgorithm::initialize(); } StatusCode CommonModeSubtractorAlgorithm::buildSubtractorEngine() try{ m_CMSEnginePtr.reset(m_SubtractorFactory.createCMSubtractor(m_CMSOption)); return StatusCode::SUCCESS; }catch(CommonModeSubtractorFactory::NoSuchState &exception) { error()<<"Invalid CommonMode Engine Type : "<<exception.what()<<endmsg; return StatusCode::FAILURE; } StatusCode CommonModeSubtractorAlgorithm::buildNoiseCalculator() try{ m_noiseCalculatorPtr=m_noiseCalculatorFactory.createNoiseCalculator(m_noiseCalculatorType); return StatusCode::SUCCESS; }catch(NoiseCalculatorFactory::NoSuchState &exception) { error()<<"Invalid NoiseCalculator Type : "<<exception.what()<<endmsg; return StatusCode::FAILURE; } StatusCode CommonModeSubtractorAlgorithm::retriveMasksFromFile() try{ m_channelMaskProvider.getMaskFromFile(m_channelMaskInputLocation); return StatusCode::SUCCESS; }catch(ChannelMaskProvider::InputFileError &exception) { error()<<"Channel Mask File Input Error: "<<m_channelMaskInputLocation<<endmsg; return StatusCode::FAILURE; } StatusCode CommonModeSubtractorAlgorithm::getData() { m_dataContainer=getIfExists<RawDataContainer<>>(m_inputDataLocation); if(!m_dataContainer){ error()<< " ==> There is no input data: "<< m_inputDataLocation <<endmsg; return StatusCode::FAILURE; } return StatusCode::SUCCESS; } void CommonModeSubtractorAlgorithm::processEvent() { RawData<double> *l_afterCMS= new RawData<double>(); m_CMSEnginePtr->processEvent(m_data,&l_afterCMS); m_noiseCalculatorPtr->updateNoise(l_afterCMS); m_outputContainer->addData(*l_afterCMS); m_event++; } StatusCode CommonModeSubtractorAlgorithm::skippTreaningEvent() { m_event++; return StatusCode::SUCCESS; } StatusCode CommonModeSubtractorAlgorithm::saveNoiseToFile() try{ m_noiseCalculatorPtr->saveNoiseToFile(m_noiseOutputLocation); return StatusCode::SUCCESS; }catch (Noise::NoiseCalculatorError & ex) { error()<< ex.what()<<endmsg; return StatusCode::FAILURE; }