- /*
- * TbUTNoise.cpp
- *
- * Created on: Jan 3, 2015
- * Author: ADendek
- */
- #include "TbUTNoise.h"
- #include <boost/foreach.hpp>
- #include <iostream>
- #include <fstream>
- #include <cmath>
- using namespace TbUT;
- using namespace std;
- Noise::Noise():
- m_hitLimit(160)
- {
- Reset();
- }
- void Noise::updateNoise(RawData<double>* p_inputData)
- {
- int l_channelNumber =RawData<>::getnChannelNumber();
- const int channelPerBeetle=32;
- for(int channel=0;channel<l_channelNumber;channel++)
- {
- if(0 == (channel%channelPerBeetle) ) m_hitLimit= calcualteHitThreshold(p_inputData, channel);
- int signal=p_inputData->getSignal(channel);
- if(abs(signal)<m_hitLimit){
- double signalSquare=signal*signal;
- m_noiseVector[channel]+=signalSquare;
- m_channelEnties[channel]++;
- m_meanVector[channel]+=signal;
- }
- }
- }
- void Noise::saveNoiseToFile(const std::string& p_filename)
- {
- ofstream l_file(p_filename);
- if(!l_file.good())
- {
- std::string l_errorMsg="Saving Noise to file- Cannot open output file: "+p_filename;
- throw NoiseCalculatorError(l_errorMsg);
- }
- NormalizeNoise();
- int l_channelsNumber=RawData<>::getnChannelNumber();
- for(int channel=0;channel<l_channelsNumber;channel++)
- {
- auto l_noise=m_noiseVector[channel];
- l_file<<std::to_string(l_noise)<<" ";
- }
- l_file.close();
- }
- void Noise::retreiveNoiseFromFile(const std::string& p_filename)
- {
- int l_channelsNumber=RawData<>::getnChannelNumber();
- ifstream l_file(p_filename);
- if(!l_file.good()){
- std::string l_errorMsg="Cannot open input noise file: "+p_filename;
- throw NoiseCalculatorError(l_errorMsg);
- }
- for(int channel=0;channel<l_channelsNumber;channel++)
- {
- double l_noiseFromFile=0;
- l_file >> l_noiseFromFile;
- m_noiseVector[channel]=l_noiseFromFile;
- cout<<"NoiseRetreiver===> channel: "<< channel <<"noise: "<<l_noiseFromFile<<endl;
- }
- }
- double Noise::calcualteHitThreshold(RawData<double>* p_inputData,int channelBegin) const
- {
- const int channelPerBeetle=32;
- double rms=0;
- double mean=0;
- const double initialHitLimit=160;
- int usedChannel=0;
- for (int channel=channelBegin;channel<channelBegin+channelPerBeetle;channel++)
- {
- auto channelSignal=p_inputData->getSignal(channel);
- if( (0. != channelSignal ) && (abs(channelSignal)<initialHitLimit) ){
- rms+=channelSignal*channelSignal;
- mean+=channelSignal;
- usedChannel++;
- }
- }
- if(usedChannel) rms/=static_cast<double>(usedChannel);
- if(usedChannel) mean/=static_cast<double>(usedChannel);
- rms-=mean*mean;
- double rmsMultiplicity=4;
- return rmsMultiplicity*sqrt(rms);
- }
- void Noise::NormalizeNoise()
- {
- int l_channelsNumber=RawData<>::getnChannelNumber();
- for(int channel=0;channel<l_channelsNumber;channel++)
- {
- auto normalizationFactor=m_channelEnties[channel];
- if(normalizationFactor)m_noiseVector[channel]/= static_cast<double>(normalizationFactor);
- if(normalizationFactor)m_meanVector[channel]/=static_cast<double>(normalizationFactor);
- m_noiseVector[channel]-=m_meanVector[channel]*m_meanVector[channel];
- m_noiseVector[channel]=sqrt(m_noiseVector[channel]);
- }
- }
- void Noise::Reset()
- {
- int l_initialValue=0;
- int l_sensorNumber=RawData<>::getnChannelNumber();
- m_channelEnties=ChannelEntries(l_sensorNumber,l_initialValue);
- m_noiseVector=NoiseVector(l_sensorNumber,l_initialValue);
- m_meanVector=NoiseVector(l_sensorNumber,l_initialValue);
- }