- /*
- * TbUTCommonModeSubtractorDataMonitorAlgorithm.cpp
- *
- * Created on: Nov 26, 2014
- * Author: ADendek
- */
-
- #include "TbUTCommonModeSubtractorDataMonitorAlgorithm.h"
- #include "TbUTDataLocations.h"
- #include "TbUTRawData.h"
- #include "GaudiUtils/Aida2ROOT.h"
- #include <boost/format.hpp>
-
- using namespace TbUT;
- using namespace boost;
-
- DECLARE_NAMESPACE_ALGORITHM_FACTORY(TbUT,CommonModeSubtractorDataMonitorAlgorithm)
-
- using namespace TbUT;
-
- CommonModeSubtractorDataMonitorAlgorithm::CommonModeSubtractorDataMonitorAlgorithm( const std::string& name,ISvcLocator* pSvcLocator)
- : DataMonitorAlgorithm ( name , pSvcLocator ),
- m_noise()
- {
- DataMonitorAlgorithm::m_inputDataLoc=TbUT::DataLocations::CMSTES;
- }
-
- StatusCode CommonModeSubtractorDataMonitorAlgorithm::execute()
- {
- DataMonitorAlgorithm::RunPhase l_runPhase=DataMonitorAlgorithm::getRunPhase();
- switch(l_runPhase)
- {
- case SKIP:
- return DataMonitorAlgorithm::skippEvent();
- case SAVE_SINGLE_EVENTS:
- return saveSimpleEvents();
- default:
- return fillOnly2DHistogram();
- }
- }
-
- StatusCode CommonModeSubtractorDataMonitorAlgorithm::getData()
- {
- m_dataContainer=getIfExists<RawDataContainer<double> >(m_inputDataLoc);
- if(!m_dataContainer){
- error()<< "=> there is no input data in "<< m_inputDataLoc<<endmsg;
- return StatusCode::FAILURE;
- }
- return StatusCode::SUCCESS;
- }
-
- StatusCode CommonModeSubtractorDataMonitorAlgorithm::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<double>(rawDataIt);
- storeEventIntoHistogram();
- fillHistogram2D();
- m_evtNumber++;
- }
- return StatusCode::SUCCESS;
- }
-
- TH2D * CommonModeSubtractorDataMonitorAlgorithm::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 ));
- }
-
- std::string CommonModeSubtractorDataMonitorAlgorithm::createHistogramTitle()
- {
- boost::format l_histogramTitle("Data after CM Subtraction - event%1%");
- l_histogramTitle% m_evtNumber;
- return str(l_histogramTitle);
- }
-
- std::string CommonModeSubtractorDataMonitorAlgorithm::createHistogramName()
- {
- boost::format l_histogramName("Data_after_CMS_event_%d");
- l_histogramName % m_evtNumber;
- return str(l_histogramName);
- }
-
- void CommonModeSubtractorDataMonitorAlgorithm::createHistogram2D()
- {
- std::string l_histogramName="CMSData_vs_channel";
- std::string l_histogramTtttle="Data after CMS vs channel";
- int l_sensorNum=RawData<>::getnChannelNumber();
- m_histogram2D=bookHistogram2D(l_histogramName,l_histogramTtttle,l_sensorNum );
- createNoiseHistograms();
- }
-
- StatusCode CommonModeSubtractorDataMonitorAlgorithm::fillOnly2DHistogram()
- {
- if(StatusCode::SUCCESS != getData()) return StatusCode::FAILURE;
- if(m_dataContainer->isEmpty()) return StatusCode::SUCCESS;
- const int storeNoiseFrequency=10000;
- for(const auto& rawDataIt :m_dataContainer->getData() )
- {
- m_data=RawData<double>(rawDataIt);
- m_noise.updateNoise(&(m_data));
- if( 0 ==(DataMonitorAlgorithm::m_evtNumber%storeNoiseFrequency) ) fillNoiseHistograms();
- fillHistogram2D();
- DataMonitorAlgorithm::m_evtNumber++;
- }
- return StatusCode::SUCCESS;
- }
-
- void CommonModeSubtractorDataMonitorAlgorithm::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);
- }
- }
-
- void CommonModeSubtractorDataMonitorAlgorithm::fillHistogram(TH1D * p_histogram)
- {
- int channelNumber=RawData<>::getnChannelNumber();
- for(int chan =0 ; chan <channelNumber; chan++ ){
- p_histogram->SetBinContent(chan,m_data.getSignal(chan));
- }
- }
-
- StatusCode CommonModeSubtractorDataMonitorAlgorithm::finalize()
- {
- DataMonitorAlgorithm::m_outpuProjectionHistogramName="ProjectionCommonMode";
- return DataMonitorAlgorithm::finalize();
- }
-
-
- void CommonModeSubtractorDataMonitorAlgorithm::createNoiseHistograms()
- {
- // This function is very ugly!
- // should be refactored!
- const int l_channelNumber=RawData<>::getnChannelNumber();
- const int l_ylow=0;
- const int l_yhigh=100;
- const int l_ybin=10;
- const int channelPerBeetle=32;
- int sensorNumber=0;
-
- for(int channel=0;channel<l_channelNumber ; channel++){
- boost::format l_histogramName("Noise_channel_%d");
- l_histogramName % channel;
- m_noisePerChannelHistograms.insert(
- std::make_pair(
- channel,Gaudi::Utils::Aida2ROOT::aida2root(
- book1D( l_histogramName.str(), l_histogramName.str(),l_ybin, l_ylow, l_yhigh)
- )
- )
- );
- if( 0 == (channel%channelPerBeetle )){
- l_histogramName= boost::format("Noise_beetle_%d");
- l_histogramName % sensorNumber;
- m_noisePerSensorHistograms.insert(
- std::make_pair(
- sensorNumber,Gaudi::Utils::Aida2ROOT::aida2root(
- book1D( l_histogramName.str(), l_histogramName.str(),l_ybin, l_ylow, l_yhigh)
- )
- )
- );
- sensorNumber++;
- }
-
- }
- }
-
- void CommonModeSubtractorDataMonitorAlgorithm::fillNoiseHistograms()
- {
- m_noise.NormalizeNoise();
- for(auto noiseHistogramIt:m_noisePerChannelHistograms){
- noiseHistogramIt.second->Fill(m_noise.getNoise(noiseHistogramIt.first));
- }
-
- const int l_channelNumber=RawData<>::getnChannelNumber();
- const int channelPerBeetle=32;
- double meanNoisePerBeetle=0;
- int sensorNumber=0;
-
- for(int channel=0;channel<l_channelNumber ; channel++){
- meanNoisePerBeetle+=m_noise.getNoise(channel);
- if( 0 == (channel%channelPerBeetle )){
- meanNoisePerBeetle/=static_cast<double>(channelPerBeetle);
- m_noisePerSensorHistograms[sensorNumber]->Fill(meanNoisePerBeetle);
- sensorNumber++;
- meanNoisePerBeetle=0;// reset mean value
- }
- }
- m_noise.Reset();
- }
-
-