Newer
Older
TB_Chris / TbUT / src / .svn / text-base / TbUTPedestalCalculator.cpp.svn-base
  1. /*
  2. * TbUTPedestalCalculator.cpp
  3. *
  4. * Created on: Oct 10, 2014
  5. * Author: ADendek
  6. */
  7.  
  8. #include "TbUTPedestalCalculator.h"
  9. #include <boost/serialization/serialization.hpp>
  10. #include <boost/archive/text_oarchive.hpp>
  11. #include <boost/archive/text_iarchive.hpp>
  12. #include <boost/foreach.hpp>
  13. #include <iostream>
  14. #include <fstream>
  15.  
  16.  
  17. using namespace TbUT;
  18. using namespace std;
  19.  
  20. PedestalCalculator::PedestalCalculator(IChannelMaskProvider& p_maskProvider, Pedestal & p_pedestal):
  21. m_maskProvider(p_maskProvider),
  22. m_pedestal(p_pedestal),
  23. m_normalization(1024),
  24. m_event(0),
  25. m_calculateInitialValueEvents(100)
  26. {
  27. }
  28.  
  29. void PedestalCalculator::savePedestalToFile(const std::string& p_filename)
  30. {
  31. ofstream l_file(p_filename);
  32. if(!l_file.good())
  33. {
  34. std::string l_errorMsg="Saving Pedestal to file- Cannot open output file: "+p_filename;
  35. throw PedestalCalculatorError(l_errorMsg);
  36. }
  37. BOOST_FOREACH(auto l_pedestal, m_pedestal.getPedestalVector())
  38. {
  39. l_file<<std::to_string(l_pedestal)<<" ";
  40. }
  41. l_file.close();
  42. }
  43.  
  44. StatusCode PedestalCalculator::processEvent(RawData<>* p_data)
  45. {
  46. RunPhase l_runPhase=getRunPhase();
  47. switch(l_runPhase)
  48. {
  49. case CALCULATE_INITIAL_VALUE:
  50. return calculateInitialValue(p_data);
  51. case NORMALIZE_INITIAL_VALUE:
  52. return normalizeInitialValue();
  53. case CALUCLATE_PEDESTAL:
  54. return calculaPedestal(p_data);
  55. default:
  56. string l_errorMsg="No such Phase!";
  57. throw PedestalCalculatorError(l_errorMsg);
  58. }
  59. }
  60.  
  61. PedestalCalculator::RunPhase PedestalCalculator::getRunPhase() const
  62. {
  63. if(m_event<m_calculateInitialValueEvents)
  64. return CALCULATE_INITIAL_VALUE;
  65. else if (m_event==m_calculateInitialValueEvents)
  66. return NORMALIZE_INITIAL_VALUE;
  67. else
  68. return CALUCLATE_PEDESTAL;
  69. }
  70.  
  71. StatusCode PedestalCalculator::calculateInitialValue(RawData<>* p_data)
  72. {
  73. RawData<>::SignalVector l_inputData=p_data->getSignal();
  74. int l_channelNumber=RawData<>::getnChannelNumber();
  75. for(int channel=0;channel<l_channelNumber;channel++)
  76. m_pedestal[channel]+=l_inputData[channel]*m_normalization;
  77. m_event++;
  78. return StatusCode::SUCCESS;
  79. }
  80.  
  81. StatusCode PedestalCalculator::normalizeInitialValue()
  82. {
  83. int l_channelNumber=RawData<>::getnChannelNumber();
  84. for(int channel=0;channel<l_channelNumber;channel++){
  85. m_pedestal[channel]/=m_calculateInitialValueEvents;
  86. std::cout<<"Initial value of the Pedestal: channel " << channel << " value: "<<m_pedestal[channel]<< std::endl;
  87. }
  88. m_event++;
  89. return StatusCode::SUCCESS;
  90. }
  91.  
  92. StatusCode PedestalCalculator::calculaPedestal(RawData<>* p_data)
  93. {
  94. RawData<>::SignalVector l_inputData=p_data->getSignal();
  95. int l_channelNumber=RawData<>::getnChannelNumber();
  96. for(int channel=0;channel<l_channelNumber;channel++)
  97. m_pedestal[channel]+=calculateUpdate(channel, l_inputData);
  98. m_event++;
  99.  
  100. return StatusCode::SUCCESS;
  101. }
  102.  
  103. double PedestalCalculator::calculateUpdate(int p_channel, RawData<>::SignalVector& p_data )
  104. {
  105. double l_update=0;
  106. double l_saturation=15;
  107. if(m_maskProvider.isMasked(p_channel))
  108. l_update=0;
  109. else
  110. {
  111. l_update=p_data[p_channel]-(m_pedestal[p_channel]/m_normalization);
  112. if(l_update>l_saturation)l_update=l_saturation;
  113. else if (l_update <(-1)*l_saturation) l_update=(-1)*l_saturation;
  114. }
  115. return l_update;
  116. }
  117.  
  118.