Newer
Older
TB_Chris / TbUT / src / .svn / text-base / TbUTCommonModeSubtractorDataMonitorAlgorithm.cpp.svn-base
  1. /*
  2. * TbUTCommonModeSubtractorDataMonitorAlgorithm.cpp
  3. *
  4. * Created on: Nov 26, 2014
  5. * Author: ADendek
  6. */
  7.  
  8. #include "TbUTCommonModeSubtractorDataMonitorAlgorithm.h"
  9. #include "TbUTDataLocations.h"
  10. #include "TbUTRawData.h"
  11. #include "GaudiUtils/Aida2ROOT.h"
  12. #include <boost/format.hpp>
  13.  
  14. using namespace TbUT;
  15. using namespace boost;
  16.  
  17. DECLARE_NAMESPACE_ALGORITHM_FACTORY(TbUT,CommonModeSubtractorDataMonitorAlgorithm)
  18.  
  19. using namespace TbUT;
  20.  
  21. CommonModeSubtractorDataMonitorAlgorithm::CommonModeSubtractorDataMonitorAlgorithm( const std::string& name,ISvcLocator* pSvcLocator)
  22. : DataMonitorAlgorithm ( name , pSvcLocator ),
  23. m_noise()
  24. {
  25. DataMonitorAlgorithm::m_inputDataLoc=TbUT::DataLocations::CMSTES;
  26. }
  27.  
  28. StatusCode CommonModeSubtractorDataMonitorAlgorithm::execute()
  29. {
  30. DataMonitorAlgorithm::RunPhase l_runPhase=DataMonitorAlgorithm::getRunPhase();
  31. switch(l_runPhase)
  32. {
  33. case SKIP:
  34. return DataMonitorAlgorithm::skippEvent();
  35. case SAVE_SINGLE_EVENTS:
  36. return saveSimpleEvents();
  37. default:
  38. return fillOnly2DHistogram();
  39. }
  40. }
  41.  
  42. StatusCode CommonModeSubtractorDataMonitorAlgorithm::getData()
  43. {
  44. m_dataContainer=getIfExists<RawDataContainer<double> >(m_inputDataLoc);
  45. if(!m_dataContainer){
  46. error()<< "=> there is no input data in "<< m_inputDataLoc<<endmsg;
  47. return StatusCode::FAILURE;
  48. }
  49. return StatusCode::SUCCESS;
  50. }
  51.  
  52. StatusCode CommonModeSubtractorDataMonitorAlgorithm::saveSimpleEvents()
  53. {
  54. if(StatusCode::SUCCESS != getData()) return StatusCode::FAILURE;
  55. if(m_dataContainer->isEmpty()) return StatusCode::SUCCESS;
  56. for(const auto& rawDataIt : m_dataContainer->getData() )
  57. {
  58. m_data=RawData<double>(rawDataIt);
  59. storeEventIntoHistogram();
  60. fillHistogram2D();
  61. m_evtNumber++;
  62. }
  63. return StatusCode::SUCCESS;
  64. }
  65.  
  66. TH2D * CommonModeSubtractorDataMonitorAlgorithm::bookHistogram2D(const std::string & p_histogramName, const std::string & p_histogramTitle, int p_sensorNumber)
  67. {
  68. int l_ylow=-800;
  69. int l_yhigh=800;
  70. int l_ybin=1600;
  71. return Gaudi::Utils::Aida2ROOT::aida2root(book2D( p_histogramName, p_histogramTitle,
  72. -0.5+RawData<>::getMinChannel(),RawData<>::getMaxChannel()-0.5,p_sensorNumber,
  73. l_ylow,l_yhigh,l_ybin ));
  74. }
  75.  
  76. std::string CommonModeSubtractorDataMonitorAlgorithm::createHistogramTitle()
  77. {
  78. boost::format l_histogramTitle("Data after CM Subtraction - event%1%");
  79. l_histogramTitle% m_evtNumber;
  80. return str(l_histogramTitle);
  81. }
  82.  
  83. std::string CommonModeSubtractorDataMonitorAlgorithm::createHistogramName()
  84. {
  85. boost::format l_histogramName("Data_after_CMS_event_%d");
  86. l_histogramName % m_evtNumber;
  87. return str(l_histogramName);
  88. }
  89.  
  90. void CommonModeSubtractorDataMonitorAlgorithm::createHistogram2D()
  91. {
  92. std::string l_histogramName="CMSData_vs_channel";
  93. std::string l_histogramTtttle="Data after CMS vs channel";
  94. int l_sensorNum=RawData<>::getnChannelNumber();
  95. m_histogram2D=bookHistogram2D(l_histogramName,l_histogramTtttle,l_sensorNum );
  96. createNoiseHistograms();
  97. }
  98.  
  99. StatusCode CommonModeSubtractorDataMonitorAlgorithm::fillOnly2DHistogram()
  100. {
  101. if(StatusCode::SUCCESS != getData()) return StatusCode::FAILURE;
  102. if(m_dataContainer->isEmpty()) return StatusCode::SUCCESS;
  103. const int storeNoiseFrequency=10000;
  104. for(const auto& rawDataIt :m_dataContainer->getData() )
  105. {
  106. m_data=RawData<double>(rawDataIt);
  107. m_noise.updateNoise(&(m_data));
  108. if( 0 ==(DataMonitorAlgorithm::m_evtNumber%storeNoiseFrequency) ) fillNoiseHistograms();
  109. fillHistogram2D();
  110. DataMonitorAlgorithm::m_evtNumber++;
  111. }
  112. return StatusCode::SUCCESS;
  113. }
  114.  
  115. void CommonModeSubtractorDataMonitorAlgorithm::fillHistogram2D()
  116. {
  117. int channelNumber=RawData<>::getnChannelNumber();
  118. for(int chan = 0; chan <channelNumber; chan++ ){
  119. auto channelSignal=m_data.getSignal(chan);
  120. if(0!=channelSignal) // no need to push masked values
  121. m_histogram2D->Fill(chan+RawData<>::getMinChannel(),channelSignal);
  122. }
  123. }
  124.  
  125. void CommonModeSubtractorDataMonitorAlgorithm::fillHistogram(TH1D * p_histogram)
  126. {
  127. int channelNumber=RawData<>::getnChannelNumber();
  128. for(int chan =0 ; chan <channelNumber; chan++ ){
  129. p_histogram->SetBinContent(chan,m_data.getSignal(chan));
  130. }
  131. }
  132.  
  133. StatusCode CommonModeSubtractorDataMonitorAlgorithm::finalize()
  134. {
  135. DataMonitorAlgorithm::m_outpuProjectionHistogramName="ProjectionCommonMode";
  136. return DataMonitorAlgorithm::finalize();
  137. }
  138.  
  139.  
  140. void CommonModeSubtractorDataMonitorAlgorithm::createNoiseHistograms()
  141. {
  142. // This function is very ugly!
  143. // should be refactored!
  144. const int l_channelNumber=RawData<>::getnChannelNumber();
  145. const int l_ylow=0;
  146. const int l_yhigh=100;
  147. const int l_ybin=10;
  148. const int channelPerBeetle=32;
  149. int sensorNumber=0;
  150.  
  151. for(int channel=0;channel<l_channelNumber ; channel++){
  152. boost::format l_histogramName("Noise_channel_%d");
  153. l_histogramName % channel;
  154. m_noisePerChannelHistograms.insert(
  155. std::make_pair(
  156. channel,Gaudi::Utils::Aida2ROOT::aida2root(
  157. book1D( l_histogramName.str(), l_histogramName.str(),l_ybin, l_ylow, l_yhigh)
  158. )
  159. )
  160. );
  161. if( 0 == (channel%channelPerBeetle )){
  162. l_histogramName= boost::format("Noise_beetle_%d");
  163. l_histogramName % sensorNumber;
  164. m_noisePerSensorHistograms.insert(
  165. std::make_pair(
  166. sensorNumber,Gaudi::Utils::Aida2ROOT::aida2root(
  167. book1D( l_histogramName.str(), l_histogramName.str(),l_ybin, l_ylow, l_yhigh)
  168. )
  169. )
  170. );
  171. sensorNumber++;
  172. }
  173.  
  174. }
  175. }
  176.  
  177. void CommonModeSubtractorDataMonitorAlgorithm::fillNoiseHistograms()
  178. {
  179. m_noise.NormalizeNoise();
  180. for(auto noiseHistogramIt:m_noisePerChannelHistograms){
  181. noiseHistogramIt.second->Fill(m_noise.getNoise(noiseHistogramIt.first));
  182. }
  183.  
  184. const int l_channelNumber=RawData<>::getnChannelNumber();
  185. const int channelPerBeetle=32;
  186. double meanNoisePerBeetle=0;
  187. int sensorNumber=0;
  188.  
  189. for(int channel=0;channel<l_channelNumber ; channel++){
  190. meanNoisePerBeetle+=m_noise.getNoise(channel);
  191. if( 0 == (channel%channelPerBeetle )){
  192. meanNoisePerBeetle/=static_cast<double>(channelPerBeetle);
  193. m_noisePerSensorHistograms[sensorNumber]->Fill(meanNoisePerBeetle);
  194. sensorNumber++;
  195. meanNoisePerBeetle=0;// reset mean value
  196. }
  197. }
  198. m_noise.Reset();
  199. }
  200.  
  201.