/* * TbUTPedestalCalculator.cpp * * Created on: Oct 10, 2014 * Author: ADendek */ #include "TbUTPedestalCalculator.h" #include <boost/serialization/serialization.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/foreach.hpp> #include <iostream> #include <fstream> using namespace TbUT; using namespace std; PedestalCalculator::PedestalCalculator(IChannelMaskProvider& p_maskProvider, Pedestal & p_pedestal): m_maskProvider(p_maskProvider), m_pedestal(p_pedestal), m_normalization(1024), m_event(0), m_calculateInitialValueEvents(100) { } void PedestalCalculator::savePedestalToFile(const std::string& p_filename) { ofstream l_file(p_filename); if(!l_file.good()) { std::string l_errorMsg="Saving Pedestal to file- Cannot open output file: "+p_filename; throw PedestalCalculatorError(l_errorMsg); } BOOST_FOREACH(auto l_pedestal, m_pedestal.getPedestalVector()) { l_file<<std::to_string(l_pedestal)<<" "; } l_file.close(); } StatusCode PedestalCalculator::processEvent(RawData<>* p_data) { RunPhase l_runPhase=getRunPhase(); switch(l_runPhase) { case CALCULATE_INITIAL_VALUE: return calculateInitialValue(p_data); case NORMALIZE_INITIAL_VALUE: return normalizeInitialValue(); case CALUCLATE_PEDESTAL: return calculaPedestal(p_data); default: string l_errorMsg="No such Phase!"; throw PedestalCalculatorError(l_errorMsg); } } PedestalCalculator::RunPhase PedestalCalculator::getRunPhase() const { if(m_event<m_calculateInitialValueEvents) return CALCULATE_INITIAL_VALUE; else if (m_event==m_calculateInitialValueEvents) return NORMALIZE_INITIAL_VALUE; else return CALUCLATE_PEDESTAL; } StatusCode PedestalCalculator::calculateInitialValue(RawData<>* p_data) { RawData<>::SignalVector l_inputData=p_data->getSignal(); int l_channelNumber=RawData<>::getnChannelNumber(); for(int channel=0;channel<l_channelNumber;channel++) m_pedestal[channel]+=l_inputData[channel]*m_normalization; m_event++; return StatusCode::SUCCESS; } StatusCode PedestalCalculator::normalizeInitialValue() { int l_channelNumber=RawData<>::getnChannelNumber(); for(int channel=0;channel<l_channelNumber;channel++){ m_pedestal[channel]/=m_calculateInitialValueEvents; std::cout<<"Initial value of the Pedestal: channel " << channel << " value: "<<m_pedestal[channel]<< std::endl; } m_event++; return StatusCode::SUCCESS; } StatusCode PedestalCalculator::calculaPedestal(RawData<>* p_data) { RawData<>::SignalVector l_inputData=p_data->getSignal(); int l_channelNumber=RawData<>::getnChannelNumber(); for(int channel=0;channel<l_channelNumber;channel++) m_pedestal[channel]+=calculateUpdate(channel, l_inputData); m_event++; return StatusCode::SUCCESS; } double PedestalCalculator::calculateUpdate(int p_channel, RawData<>::SignalVector& p_data ) { double l_update=0; double l_saturation=15; if(m_maskProvider.isMasked(p_channel)) l_update=0; else { l_update=p_data[p_channel]-(m_pedestal[p_channel]/m_normalization); if(l_update>l_saturation)l_update=l_saturation; else if (l_update <(-1)*l_saturation) l_update=(-1)*l_saturation; } return l_update; }