Newer
Older
TB_Chris / TbUT / src / .svn / text-base / TbUTDataMonitorAlgorithm.cpp.svn-base
  1. #include "TbUTDataMonitorAlgorithm.h"
  2. #include "GaudiUtils/Aida2ROOT.h"
  3. #include "GaudiKernel/AlgFactory.h"
  4. #include <boost/format.hpp>
  5.  
  6. using namespace TbUT;
  7. using namespace boost;
  8. DECLARE_NAMESPACE_ALGORITHM_FACTORY(TbUT,DataMonitorAlgorithm)
  9.  
  10.  
  11. DataMonitorAlgorithm::DataMonitorAlgorithm( const std::string& name,ISvcLocator* pSvcLocator)
  12. : GaudiHistoAlg ( name , pSvcLocator ),
  13. m_inputDataLoc(),
  14. m_outpuProjectionHistogramName(),
  15. m_displayEventNumber(0),
  16. m_evtNumber(0),
  17. m_skipEvent(0),
  18. m_histogram2D()
  19. {
  20. declareProperty("displayEventNumber", m_displayEventNumber=10);
  21. declareProperty("skippEventNumber", m_skipEvent=0);
  22.  
  23. }
  24.  
  25. DataMonitorAlgorithm::~DataMonitorAlgorithm(){}
  26.  
  27. StatusCode DataMonitorAlgorithm::initialize() {
  28. if(StatusCode::SUCCESS !=initializeBase()) return StatusCode::FAILURE;
  29. setHistoTopDir( const_cast<char*>("TbUT/") );
  30. createHistogram2D();
  31. return StatusCode::SUCCESS;
  32. }
  33.  
  34. StatusCode DataMonitorAlgorithm::execute()
  35. {
  36. RunPhase l_runPhase=getRunPhase();
  37. switch(l_runPhase)
  38. {
  39. case SKIP:
  40. return skippEvent();
  41. case SAVE_SINGLE_EVENTS:
  42. return saveSimpleEvents();
  43. default:
  44. return fillOnly2DHistogram();
  45. }
  46. }
  47.  
  48. StatusCode DataMonitorAlgorithm::finalize()
  49. {
  50. buildProjectionHistogram();
  51. return GaudiHistoAlg::finalize();
  52. }
  53.  
  54. StatusCode DataMonitorAlgorithm::initializeBase()
  55. {
  56. return GaudiHistoAlg::initialize();
  57. }
  58.  
  59.  
  60. void DataMonitorAlgorithm::createHistogram2D()
  61. {
  62. std::string l_histogramName="RawData_vs_channel";
  63. std::string l_histogramTtttle="RawData_vs_channel";
  64. int l_sensorNum=RawData<>::getnChannelNumber();
  65. m_histogram2D=bookHistogram2D(l_histogramName,l_histogramTtttle,l_sensorNum );
  66. }
  67.  
  68. StatusCode DataMonitorAlgorithm::getData()
  69. {
  70. m_dataContainer=getIfExists<RawDataContainer<> >(m_inputDataLoc);
  71. if(!m_dataContainer){
  72. error()<< " ==> there is no input data in "<< m_inputDataLoc<<endmsg;
  73. return StatusCode::FAILURE;
  74. }
  75. return StatusCode::SUCCESS;
  76. }
  77.  
  78. StatusCode DataMonitorAlgorithm::skippEvent()
  79. {
  80. m_evtNumber++;
  81. return StatusCode::SUCCESS;
  82. }
  83.  
  84. StatusCode DataMonitorAlgorithm::saveSimpleEvents()
  85. {
  86. if(StatusCode::SUCCESS != getData()) return StatusCode::FAILURE;
  87. if(m_dataContainer->isEmpty()) return StatusCode::SUCCESS;
  88. for(const auto& rawDataIt : m_dataContainer->getData() )
  89. {
  90. m_data=RawData<>(rawDataIt);
  91. storeEventIntoHistogram();
  92. fillHistogram2D();
  93. m_evtNumber++;
  94. }
  95. return StatusCode::SUCCESS;
  96. }
  97.  
  98. StatusCode DataMonitorAlgorithm::fillOnly2DHistogram()
  99. {
  100. if(StatusCode::SUCCESS != getData()) return StatusCode::FAILURE;
  101. if(m_dataContainer->isEmpty()) return StatusCode::SUCCESS;
  102. for(const auto& rawDataIt : m_dataContainer->getData() )
  103. {
  104. m_data=RawData<>(rawDataIt);
  105. fillHistogram2D();
  106. m_evtNumber++;
  107. }
  108. return StatusCode::SUCCESS;
  109. }
  110.  
  111. void DataMonitorAlgorithm::storeEventIntoHistogram()
  112. {
  113. std::string l_histName= createHistogramName();
  114. std::string l_histTitle= createHistogramTitle();
  115. int l_sensorNum=RawData<>::getnChannelNumber();
  116. TH1D* l_eventHist=bookHistogram(l_histName,l_histTitle, l_sensorNum );
  117. fillHistogram(l_eventHist);
  118. }
  119.  
  120. std::string DataMonitorAlgorithm::createHistogramName()
  121. {
  122. boost::format l_histogramName("event %d");
  123. l_histogramName % m_evtNumber;
  124. return str(l_histogramName);
  125. }
  126.  
  127. std::string DataMonitorAlgorithm::createHistogramTitle()
  128. {
  129. boost::format l_histogramTitle("Raw Data - event%1%");
  130. l_histogramTitle% m_evtNumber;
  131. return str(l_histogramTitle);
  132. }
  133.  
  134. TH1D * DataMonitorAlgorithm::bookHistogram(const std::string & p_histogramName, const std::string & p_histogramTitle, int p_sensorNumber)
  135. {
  136. return Gaudi::Utils::Aida2ROOT::aida2root(book1D( p_histogramName, p_histogramTitle,
  137. -0.5+RawData<>::getMinChannel(),RawData<>::getMaxChannel()-0.5,p_sensorNumber ));
  138. }
  139.  
  140. void DataMonitorAlgorithm::fillHistogram(TH1D * p_histogram)
  141. {
  142. int channelNumber=RawData<>::getnChannelNumber();
  143. for(int chan =0 ; chan <channelNumber; chan++ ){
  144. p_histogram->SetBinContent(chan,m_data.getSignal(chan));
  145. }
  146. }
  147.  
  148. TH2D * DataMonitorAlgorithm::bookHistogram2D(const std::string & p_histogramName, const std::string & p_histogramTitle, int p_sensorNumber)
  149. {
  150. int l_ylow=-800;
  151. int l_yhigh=800;
  152. int l_ybin=1600;
  153. return Gaudi::Utils::Aida2ROOT::aida2root(book2D( p_histogramName, p_histogramTitle,
  154. -0.5+RawData<>::getMinChannel(),RawData<>::getMaxChannel()-0.5,p_sensorNumber,
  155. l_ylow,l_yhigh,l_ybin ));
  156. }
  157.  
  158. void DataMonitorAlgorithm::fillHistogram2D()
  159. {
  160. int channelNumber=RawData<>::getnChannelNumber();
  161. for(int chan = 0; chan <channelNumber; chan++ ){
  162. auto channelSignal=m_data.getSignal(chan);
  163. if(0!=channelSignal) // no need to push masked values
  164. m_histogram2D->Fill(chan+RawData<>::getMinChannel(),channelSignal);
  165. }
  166. }
  167.  
  168. DataMonitorAlgorithm::RunPhase DataMonitorAlgorithm::getRunPhase()
  169. {
  170. if(m_evtNumber< m_skipEvent) return SKIP;
  171. if( m_evtNumber<m_displayEventNumber+m_skipEvent) return SAVE_SINGLE_EVENTS;
  172. else return REST;
  173. }
  174.  
  175. void DataMonitorAlgorithm::buildProjectionHistogram()
  176. {
  177. m_histogram2D->ProjectionY(m_outpuProjectionHistogramName.c_str());
  178. }