Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions lib/graph_data_validation/config.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
dataset_collections:
emissions_1990_validation:
- nl2023
- nl2019
- DE_germany
- UKNI01_northern_ireland

countries:
- AT_austria
- BEGM11002_antwerpen
Expand Down
1 change: 1 addition & 0 deletions lib/graph_data_validation/lib/datasets.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
24 changes: 24 additions & 0 deletions lib/graph_data_validation/lib/emissions_csv_reconciler.rb
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions lib/graph_data_validation/spec/dataset_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
end
end
end

12 changes: 12 additions & 0 deletions lib/graph_data_validation/spec/emissions_1990_spec.rb
Original file line number Diff line number Diff line change
@@ -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
36 changes: 36 additions & 0 deletions lib/graph_data_validation/spec/validation/emissions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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