diff --git a/lib/graph_data_validation/config.yml b/lib/graph_data_validation/config.yml index f1b62c277..6a70305a7 100644 --- a/lib/graph_data_validation/config.yml +++ b/lib/graph_data_validation/config.yml @@ -1,4 +1,10 @@ dataset_collections: + emissions_1990_validation: + - nl2023 + - nl2019 + - DE_germany + - UKNI01_northern_ireland + countries: - AT_austria - BEGM11002_antwerpen diff --git a/lib/graph_data_validation/lib/datasets.rb b/lib/graph_data_validation/lib/datasets.rb index 0d89e71d2..c48701a92 100644 --- a/lib/graph_data_validation/lib/datasets.rb +++ b/lib/graph_data_validation/lib/datasets.rb @@ -10,6 +10,7 @@ def initialize(*area_codes, env: :dev) if env == :dev Settings.etsource_lazy_load_dataset = true Atlas.data_dir = Etsource::Base.clean_path(File.expand_path("../etsource")) + Etsource::Loader.instance.clear!(:gqueries) end # Silently reject unexisting areas diff --git a/lib/graph_data_validation/lib/emissions_csv_reconciler.rb b/lib/graph_data_validation/lib/emissions_csv_reconciler.rb new file mode 100644 index 000000000..669e32486 --- /dev/null +++ b/lib/graph_data_validation/lib/emissions_csv_reconciler.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module GraphDataValidation + class EmissionsCsvReconciler + def initialize(dataset) + @emissions = Atlas::Dataset.find(dataset.scenario.area_code).emissions + end + + # Returns the 1990 inventory total in Mt for the given GHG types, + # excluding bunkers rows and negating LULUCF removals (stored as positive + # values in the CSV but representing a carbon sink). + def total_mt(ghgs:) + @emissions.table.sum do |row| + next 0.0 unless row[:year] == 1990 && ghgs.include?(row[:ghg]) + next 0.0 if row[:etm_sector].to_s.casecmp?('bunkers') + + value = row[:value].to_f + removal = row[:etm_sector].to_s.casecmp?('lulucf') && + row[:etm_subsector].to_s.casecmp?('removals') + removal ? -value : value + end / 1000.0 + end + end +end diff --git a/lib/graph_data_validation/spec/dataset_spec.rb b/lib/graph_data_validation/spec/dataset_spec.rb index 8ef904222..b0befe307 100644 --- a/lib/graph_data_validation/spec/dataset_spec.rb +++ b/lib/graph_data_validation/spec/dataset_spec.rb @@ -9,3 +9,4 @@ end end end + diff --git a/lib/graph_data_validation/spec/emissions_1990_spec.rb b/lib/graph_data_validation/spec/emissions_1990_spec.rb new file mode 100644 index 000000000..2c5a0d693 --- /dev/null +++ b/lib/graph_data_validation/spec/emissions_1990_spec.rb @@ -0,0 +1,12 @@ +require_relative 'spec_helper' +require_relative '../lib/datasets' +require_relative '../lib/emissions_csv_reconciler' +require_relative 'validation/emissions' + +describe 'Validating 1990 emissions inventory' do + GraphDataValidation::Datasets.from_collection(:emissions_1990_validation).each do |dataset| + context "with area_code #{dataset.scenario.area_code}" do + it_behaves_like 'emissions_1990_reconciliation', dataset + end + end +end diff --git a/lib/graph_data_validation/spec/validation/emissions.rb b/lib/graph_data_validation/spec/validation/emissions.rb index 8101c625f..c9fe978b2 100644 --- a/lib/graph_data_validation/spec/validation/emissions.rb +++ b/lib/graph_data_validation/spec/validation/emissions.rb @@ -20,3 +20,39 @@ end end +RSpec.shared_examples('emissions_1990_reconciliation') do |dataset| + reconciler = GraphDataValidation::EmissionsCsvReconciler.new(dataset) + + context 'with 1990 CO2 emissions' do + queried_mt = + dataset.query('present:Q(direct_emissions_co2_1990)') - + dataset.query('present:Q(direct_emissions_bunkers_co2_1990)') + expected_mt = reconciler.total_mt(ghgs: %w[co2]) + + it 'matches emissions.csv (excluding bunkers)' do + expect(queried_mt).to be_within((0.001 * expected_mt) + 1e-6).of(expected_mt) + end + end + + context 'with 1990 other greenhouse gas emissions' do + queried_mt = + dataset.query('present:Q(direct_emissions_other_ghg_1990)') - + dataset.query('present:Q(direct_emissions_bunkers_other_ghg_1990)') + expected_mt = reconciler.total_mt(ghgs: %w[other_ghg]) + + it 'matches emissions.csv (excluding bunkers)' do + expect(queried_mt).to be_within((0.001 * expected_mt) + 1e-6).of(expected_mt) + end + end + + context 'with 1990 total greenhouse gas emissions' do + queried_mt = + dataset.query('present:Q(direct_emissions_total_ghg_1990)') - + dataset.query('present:Q(direct_emissions_bunkers_total_ghg_1990)') + expected_mt = reconciler.total_mt(ghgs: %w[co2 other_ghg]) + + it 'matches emissions.csv (excluding bunkers)' do + expect(queried_mt).to be_within((0.001 * expected_mt) + 1e-6).of(expected_mt) + end + end +end