Newer
Older
TB_Chris / TbUT / src / .svn / text-base / TbUTNoise.cpp.svn-base
  1. /*
  2. * TbUTNoise.cpp
  3. *
  4. * Created on: Jan 3, 2015
  5. * Author: ADendek
  6. */
  7.  
  8. #include "TbUTNoise.h"
  9. #include <boost/foreach.hpp>
  10. #include <iostream>
  11. #include <fstream>
  12. #include <cmath>
  13.  
  14. using namespace TbUT;
  15. using namespace std;
  16.  
  17. Noise::Noise():
  18. m_hitLimit(160)
  19. {
  20. Reset();
  21. }
  22.  
  23. void Noise::updateNoise(RawData<double>* p_inputData)
  24. {
  25. int l_channelNumber =RawData<>::getnChannelNumber();
  26. const int channelPerBeetle=32;
  27. for(int channel=0;channel<l_channelNumber;channel++)
  28. {
  29. if(0 == (channel%channelPerBeetle) ) m_hitLimit= calcualteHitThreshold(p_inputData, channel);
  30. int signal=p_inputData->getSignal(channel);
  31. if(abs(signal)<m_hitLimit){
  32. double signalSquare=signal*signal;
  33. m_noiseVector[channel]+=signalSquare;
  34. m_channelEnties[channel]++;
  35. m_meanVector[channel]+=signal;
  36. }
  37. }
  38. }
  39.  
  40. void Noise::saveNoiseToFile(const std::string& p_filename)
  41. {
  42. ofstream l_file(p_filename);
  43. if(!l_file.good())
  44. {
  45. std::string l_errorMsg="Saving Noise to file- Cannot open output file: "+p_filename;
  46. throw NoiseCalculatorError(l_errorMsg);
  47. }
  48. NormalizeNoise();
  49. int l_channelsNumber=RawData<>::getnChannelNumber();
  50. for(int channel=0;channel<l_channelsNumber;channel++)
  51. {
  52. auto l_noise=m_noiseVector[channel];
  53. l_file<<std::to_string(l_noise)<<" ";
  54. }
  55. l_file.close();
  56. }
  57.  
  58. void Noise::retreiveNoiseFromFile(const std::string& p_filename)
  59. {
  60. int l_channelsNumber=RawData<>::getnChannelNumber();
  61. ifstream l_file(p_filename);
  62. if(!l_file.good()){
  63. std::string l_errorMsg="Cannot open input noise file: "+p_filename;
  64. throw NoiseCalculatorError(l_errorMsg);
  65. }
  66.  
  67. for(int channel=0;channel<l_channelsNumber;channel++)
  68. {
  69. double l_noiseFromFile=0;
  70. l_file >> l_noiseFromFile;
  71. m_noiseVector[channel]=l_noiseFromFile;
  72. cout<<"NoiseRetreiver===> channel: "<< channel <<"noise: "<<l_noiseFromFile<<endl;
  73. }
  74.  
  75. }
  76.  
  77. double Noise::calcualteHitThreshold(RawData<double>* p_inputData,int channelBegin) const
  78. {
  79. const int channelPerBeetle=32;
  80. double rms=0;
  81. double mean=0;
  82. const double initialHitLimit=160;
  83. int usedChannel=0;
  84.  
  85. for (int channel=channelBegin;channel<channelBegin+channelPerBeetle;channel++)
  86. {
  87. auto channelSignal=p_inputData->getSignal(channel);
  88. if( (0. != channelSignal ) && (abs(channelSignal)<initialHitLimit) ){
  89. rms+=channelSignal*channelSignal;
  90. mean+=channelSignal;
  91. usedChannel++;
  92. }
  93.  
  94. }
  95. if(usedChannel) rms/=static_cast<double>(usedChannel);
  96. if(usedChannel) mean/=static_cast<double>(usedChannel);
  97. rms-=mean*mean;
  98. double rmsMultiplicity=4;
  99. return rmsMultiplicity*sqrt(rms);
  100. }
  101.  
  102.  
  103. void Noise::NormalizeNoise()
  104. {
  105. int l_channelsNumber=RawData<>::getnChannelNumber();
  106. for(int channel=0;channel<l_channelsNumber;channel++)
  107. {
  108. auto normalizationFactor=m_channelEnties[channel];
  109. if(normalizationFactor)m_noiseVector[channel]/= static_cast<double>(normalizationFactor);
  110. if(normalizationFactor)m_meanVector[channel]/=static_cast<double>(normalizationFactor);
  111. m_noiseVector[channel]-=m_meanVector[channel]*m_meanVector[channel];
  112. m_noiseVector[channel]=sqrt(m_noiseVector[channel]);
  113. }
  114. }
  115.  
  116. void Noise::Reset()
  117. {
  118. int l_initialValue=0;
  119. int l_sensorNumber=RawData<>::getnChannelNumber();
  120. m_channelEnties=ChannelEntries(l_sensorNumber,l_initialValue);
  121. m_noiseVector=NoiseVector(l_sensorNumber,l_initialValue);
  122. m_meanVector=NoiseVector(l_sensorNumber,l_initialValue);
  123.  
  124. }
  125.  
  126.