diff --git a/Tr/TrackMonitors/src/BeamSpotMonitor.cpp b/Tr/TrackMonitors/src/BeamSpotMonitor.cpp index 94fcf97390653a8d76c1ed289dd998c23bacdfca..ecf6852bf0b7e5d03d528cfb8b3b36b9800b5150 100644 --- a/Tr/TrackMonitors/src/BeamSpotMonitor.cpp +++ b/Tr/TrackMonitors/src/BeamSpotMonitor.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -97,6 +98,8 @@ public: return Consumer::finalize(); } + StatusCode stop() override; + /// Internal representation of cached conditions struct IRConditionsCache { /// Cache variables @@ -130,6 +133,8 @@ private: bool check_publish() const; bool ymlWriter() const; + void write_json_file( std::string const& ) const; + /// Reset the accumulators bool check_reset_accumulators( const unsigned ) const; void reset_accumulators( const unsigned ) const; @@ -229,6 +234,8 @@ private: "/group/online/hlt/conditions.run3/lhcb-conditions-database" }; Gaudi::Property m_conditionsPathInDb{ this, "conditionsPathInDb", "Conditions/LHCb/Online/InteractionRegion.yml/.pool" }; + // bin file path + Gaudi::Property m_json_name{ this, "JsonFile", "", "path where json file is saved" }; /// Use IPublishSvc Online Gaudi::Property m_onlineMode{ this, "OnlineMode", false, "Running in Online" }; @@ -500,6 +507,15 @@ StatusCode BeamSpotMonitor::initialize() { } ); } +StatusCode BeamSpotMonitor::stop() { + if ( m_json_name.value() != "" ) { + info() << "stopping and writing json file to" << m_json_name.value() << endmsg; + write_json_file( m_json_name ); + } + + return StatusCode::SUCCESS; +} + /// Initialize histograms that depende on properties void BeamSpotMonitor::init_configurable_histos() const { using axis1D = Gaudi::Accumulators::Axis; @@ -756,6 +772,45 @@ void BeamSpotMonitor::cache_counters() const { m_cache.spread[5] = m_pvZPosCtr.unbiased_sample_variance(); } +void BeamSpotMonitor::write_json_file( std::string const& filename ) const { + + unsigned long n_entries = m_pvXPosCtr.nEntries(); + double sum_x = m_pvXPosCtr.sum(); + double sum_y = m_pvYPosCtr.sum(); + double sum_z = m_pvZPosCtr.sum(); + double sum2_x = m_pvXPosCtr.sum2(); + double sum2_y = m_pvYPosCtr.sum2(); + double sum2_z = m_pvZPosCtr.sum2(); + unsigned long n_entries_prod = m_pvXYProdCtr.nEntries(); + double sum_xy = m_pvXYProdCtr.sum(); + double sum_zx = m_pvZXProdCtr.sum(); + double sum_yz = m_pvYZProdCtr.sum(); + info() << "writing json file with: " << endmsg; + info() << "m_pvXPosCtr.nEntries: " << m_pvXPosCtr.nEntries() << " " << n_entries << endmsg; + info() << "m_pvXPosCtr.sum: " << m_pvXPosCtr.sum() << " " << sum_x << endmsg; + info() << "m_pvYPosCtr.sum: " << m_pvYPosCtr.sum() << " " << sum_y << endmsg; + info() << "m_pvZPosCtr.sum: " << m_pvZPosCtr.sum() << " " << sum_z << endmsg; + info() << "m_pvXPosCtr.sum2: " << m_pvXPosCtr.sum2() << " " << sum2_x << endmsg; + info() << "m_pvYPosCtr.sum2: " << m_pvYPosCtr.sum2() << " " << sum2_y << endmsg; + info() << "m_pvZPosCtr.sum2: " << m_pvZPosCtr.sum2() << " " << sum2_z << endmsg; + info() << "m_pvXYProdCtr.nEntries: " << m_pvXYProdCtr.nEntries() << " " << n_entries_prod << endmsg; + info() << " m_pvXYProdCtr.sum: " << m_pvXYProdCtr.sum() << " " << sum_xy << endmsg; + info() << " m_pvZXProdCtr.sum: " << m_pvZXProdCtr.sum() << " " << sum_zx << endmsg; + info() << " m_pvYZProdCtr.sum: " << m_pvYZProdCtr.sum() << " " << sum_yz << endmsg; + + auto convert = []( auto const& c ) { + nlohmann::json out; + to_json( out, c ); + return out; + }; + + std::ofstream o( filename ); + o << nlohmann::json{ { "pvXPosCtr", convert( m_pvXPosCtr ) }, { "pvYPosCtr", convert( m_pvYPosCtr ) }, + { "pvZPosCtr", convert( m_pvZPosCtr ) }, { "pvXYProdCtr", convert( m_pvXYProdCtr ) }, + { "pvZXProdCtr", convert( m_pvZXProdCtr ) }, { "pvYZProdCtr", convert( m_pvYZProdCtr ) } } + << std::endl; +} + //============================================================================= // Reset the accumulators //=============================================================================