#include "TbUTDataMonitorAlgorithm.h" #include "GaudiUtils/Aida2ROOT.h" #include "GaudiKernel/AlgFactory.h" #include <boost/format.hpp> using namespace TbUT; using namespace boost; DECLARE_NAMESPACE_ALGORITHM_FACTORY(TbUT,DataMonitorAlgorithm) DataMonitorAlgorithm::DataMonitorAlgorithm( const std::string& name,ISvcLocator* pSvcLocator) : GaudiHistoAlg ( name , pSvcLocator ), m_inputDataLoc(), m_outpuProjectionHistogramName(), m_displayEventNumber(0), m_evtNumber(0), m_skipEvent(0), m_histogram2D() { declareProperty("displayEventNumber", m_displayEventNumber=10); declareProperty("skippEventNumber", m_skipEvent=0); } DataMonitorAlgorithm::~DataMonitorAlgorithm(){} StatusCode DataMonitorAlgorithm::initialize() { if(StatusCode::SUCCESS !=initializeBase()) return StatusCode::FAILURE; setHistoTopDir( const_cast<char*>("TbUT/") ); createHistogram2D(); return StatusCode::SUCCESS; } StatusCode DataMonitorAlgorithm::execute() { RunPhase l_runPhase=getRunPhase(); switch(l_runPhase) { case SKIP: return skippEvent(); case SAVE_SINGLE_EVENTS: return saveSimpleEvents(); default: return fillOnly2DHistogram(); } } StatusCode DataMonitorAlgorithm::finalize() { buildProjectionHistogram(); return GaudiHistoAlg::finalize(); } StatusCode DataMonitorAlgorithm::initializeBase() { return GaudiHistoAlg::initialize(); } void DataMonitorAlgorithm::createHistogram2D() { std::string l_histogramName="RawData_vs_channel"; std::string l_histogramTtttle="RawData_vs_channel"; int l_sensorNum=RawData<>::getnChannelNumber(); m_histogram2D=bookHistogram2D(l_histogramName,l_histogramTtttle,l_sensorNum ); } StatusCode DataMonitorAlgorithm::getData() { m_dataContainer=getIfExists<RawDataContainer<> >(m_inputDataLoc); if(!m_dataContainer){ error()<< " ==> there is no input data in "<< m_inputDataLoc<<endmsg; return StatusCode::FAILURE; } return StatusCode::SUCCESS; } StatusCode DataMonitorAlgorithm::skippEvent() { m_evtNumber++; return StatusCode::SUCCESS; } StatusCode DataMonitorAlgorithm::saveSimpleEvents() { if(StatusCode::SUCCESS != getData()) return StatusCode::FAILURE; if(m_dataContainer->isEmpty()) return StatusCode::SUCCESS; for(const auto& rawDataIt : m_dataContainer->getData() ) { m_data=RawData<>(rawDataIt); storeEventIntoHistogram(); fillHistogram2D(); m_evtNumber++; } return StatusCode::SUCCESS; } StatusCode DataMonitorAlgorithm::fillOnly2DHistogram() { if(StatusCode::SUCCESS != getData()) return StatusCode::FAILURE; if(m_dataContainer->isEmpty()) return StatusCode::SUCCESS; for(const auto& rawDataIt : m_dataContainer->getData() ) { m_data=RawData<>(rawDataIt); fillHistogram2D(); m_evtNumber++; } return StatusCode::SUCCESS; } void DataMonitorAlgorithm::storeEventIntoHistogram() { std::string l_histName= createHistogramName(); std::string l_histTitle= createHistogramTitle(); int l_sensorNum=RawData<>::getnChannelNumber(); TH1D* l_eventHist=bookHistogram(l_histName,l_histTitle, l_sensorNum ); fillHistogram(l_eventHist); } std::string DataMonitorAlgorithm::createHistogramName() { boost::format l_histogramName("event %d"); l_histogramName % m_evtNumber; return str(l_histogramName); } std::string DataMonitorAlgorithm::createHistogramTitle() { boost::format l_histogramTitle("Raw Data - event%1%"); l_histogramTitle% m_evtNumber; return str(l_histogramTitle); } TH1D * DataMonitorAlgorithm::bookHistogram(const std::string & p_histogramName, const std::string & p_histogramTitle, int p_sensorNumber) { return Gaudi::Utils::Aida2ROOT::aida2root(book1D( p_histogramName, p_histogramTitle, -0.5+RawData<>::getMinChannel(),RawData<>::getMaxChannel()-0.5,p_sensorNumber )); } void DataMonitorAlgorithm::fillHistogram(TH1D * p_histogram) { int channelNumber=RawData<>::getnChannelNumber(); for(int chan =0 ; chan <channelNumber; chan++ ){ p_histogram->SetBinContent(chan,m_data.getSignal(chan)); } } TH2D * DataMonitorAlgorithm::bookHistogram2D(const std::string & p_histogramName, const std::string & p_histogramTitle, int p_sensorNumber) { int l_ylow=-800; int l_yhigh=800; int l_ybin=1600; return Gaudi::Utils::Aida2ROOT::aida2root(book2D( p_histogramName, p_histogramTitle, -0.5+RawData<>::getMinChannel(),RawData<>::getMaxChannel()-0.5,p_sensorNumber, l_ylow,l_yhigh,l_ybin )); } void DataMonitorAlgorithm::fillHistogram2D() { int channelNumber=RawData<>::getnChannelNumber(); for(int chan = 0; chan <channelNumber; chan++ ){ auto channelSignal=m_data.getSignal(chan); if(0!=channelSignal) // no need to push masked values m_histogram2D->Fill(chan+RawData<>::getMinChannel(),channelSignal); } } DataMonitorAlgorithm::RunPhase DataMonitorAlgorithm::getRunPhase() { if(m_evtNumber< m_skipEvent) return SKIP; if( m_evtNumber<m_displayEventNumber+m_skipEvent) return SAVE_SINGLE_EVENTS; else return REST; } void DataMonitorAlgorithm::buildProjectionHistogram() { m_histogram2D->ProjectionY(m_outpuProjectionHistogramName.c_str()); }