From 7aad0cb65be3f6aee487d15dbffce84a18e98d38 Mon Sep 17 00:00:00 2001 From: Tracey Mangin Date: Sun, 12 Oct 2025 10:21:52 -0700 Subject: [PATCH 01/11] update _targets.R file to accomodate users that do and do not have access to the confidential data. these changes inlude 1) setting a variable T/F to indicate if you have the data; 2) reading in blank multiplier files if F; 3) reading in intermediate files is F (those that cannot be created w/o conf data); 4) not saving certain intermeidate files if F --- R/figures/health_labor_revised_figs.R | 24 +-- _targets.R | 276 +++++++++++++++++--------- 2 files changed, 198 insertions(+), 102 deletions(-) diff --git a/R/figures/health_labor_revised_figs.R b/R/figures/health_labor_revised_figs.R index 16412af..90963f4 100644 --- a/R/figures/health_labor_revised_figs.R +++ b/R/figures/health_labor_revised_figs.R @@ -1300,8 +1300,8 @@ plot_npv_health_labor <- function( x = "GHG emissions reduction (%, 2045 vs 2019)" ) + scale_y_continuous( - limits = c(0, 50), - breaks = seq(0, 50, by = 10) + limits = c(0, 40), + breaks = seq(0, 40, by = 10) ) + xlim(0, 80) + scale_color_manual( @@ -1380,8 +1380,8 @@ plot_npv_health_labor <- function( x = "GHG emissions reduction (%, 2045 vs 2019)" ) + scale_y_continuous( - limits = c(-50, 0), - breaks = seq(-50, 0, by = 10) + limits = c(-40, 0), + breaks = seq(-40, 0, by = 10) ) + xlim(0, 80) + scale_color_manual( @@ -1451,8 +1451,8 @@ plot_npv_health_labor <- function( x = "GHG emissions reduction (%, 2045 vs 2019)" ) + scale_y_continuous( - limits = c(-50, 0), - breaks = seq(-50, 0, by = 10) + limits = c(-40, 0), + breaks = seq(-40, 0, by = 10) ) + xlim(0, 80) + scale_color_manual( @@ -1523,8 +1523,8 @@ plot_npv_health_labor <- function( x = "GHG emissions reduction (%, 2045 vs 2019)" ) + scale_y_continuous( - limits = c(-50, 0), - breaks = seq(-50, 0, by = 10) + limits = c(-40, 0), + breaks = seq(-40, 0, by = 10) ) + xlim(0, 80) + scale_color_manual( @@ -1580,7 +1580,7 @@ plot_npv_health_labor <- function( y = NULL, x = "GHG emissions reduction (%, 2045 vs 2019)" ) + - ylim(-50, 0) + + ylim(-40, 0) + xlim(0, 80) + scale_color_manual( values = refin_colors, @@ -1655,7 +1655,7 @@ plot_npv_health_labor <- function( y = NULL, x = "GHG emissions reduction (%, 2045 vs 2019)" ) + - ylim(-50, 0) + + ylim(-40, 0) + xlim(0, 80) + scale_color_manual( values = refin_colors, @@ -4727,8 +4727,8 @@ plot_npv_health_labor_non_age_vsl <- function( x = "GHG emissions reduction (%, 2045 vs 2019)" ) + scale_y_continuous( - limits = c(-50, 0), - breaks = seq(-50, 0, by = 10) + limits = c(-40, 0), + breaks = seq(-40, 0, by = 10) ) + xlim(0, 80) + scale_color_manual( diff --git a/_targets.R b/_targets.R index beeba7a..3268880 100644 --- a/_targets.R +++ b/_targets.R @@ -1,5 +1,6 @@ # Load packages required to define the pipeline: library(targets) +library(tarchetypes) library(data.table) library(tidyr) library(tidyverse) @@ -50,6 +51,12 @@ source("setup_data_paths.R") # Replace the target list below with your own: list( + + ## indicate if you have access to confidential data (data/confidential-data folder) + ## TRUE indicates access, FALSE indicates that user does not have access + tar_target(name = confidential_data_access, + command = FALSE), + # data path (automatically configured) tar_target( name = main_path, @@ -69,7 +76,7 @@ list( tar_target(name = ref_threshold, command = 0.6), # list save paths (UPDATE VERSION AS NEEDED) - tar_target(name = version, command = "rev-submission"), + tar_target(name = version, command = "test-no-conf-data"), tar_target( name = iteration, command = paste0("cuf=", ref_threshold, "_beta-scenario=", beta_scenario) @@ -221,7 +228,7 @@ list( name = file_raw_its, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/raw/Study 1 - Preliminary Fuel Volumes BAU & LC1.xlsx" + "data-files/stocks-flows/raw/Study 1 - Preliminary Fuel Volumes BAU & LC1.xlsx" ), format = "file" ), @@ -229,7 +236,7 @@ list( name = file_raw_avgas, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/raw/Distillates 10-10.xlsx" + "data-files/stocks-flows/raw/Distillates 10-10.xlsx" ), format = "file" ), @@ -237,7 +244,7 @@ list( name = file_raw_cec_jet, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/raw/5-20 Jet Fuel Demand.xlsx" + "data-files/stocks-flows/raw/5-20 Jet Fuel Demand.xlsx" ), format = "file" ), @@ -245,7 +252,7 @@ list( name = file_raw_mil_jet, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/raw/California Transportion Fuel Consumption - Summary 2020-06-01 GDS_rename.xlsx" + "data-files/stocks-flows/raw/California Transportion Fuel Consumption - Summary 2020-06-01 GDS_rename.xlsx" ), format = "file" ), @@ -253,7 +260,7 @@ list( name = file_raw_fpm, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/raw/Finished_Products_Movements.xlsx" + "data-files/stocks-flows/raw/Finished_Products_Movements.xlsx" ), format = "file" ), @@ -261,7 +268,7 @@ list( name = file_refcap, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/processed/refinery_loc_cap_manual.csv" + "data-files/stocks-flows/processed/refinery_loc_cap_manual.csv" ), format = "file" ), # this is a manually created file @@ -269,7 +276,7 @@ list( name = file_rediesel, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/processed/CARB_RE_fuels_CA_imports_figure10_053120.xlsx" + "data-files/stocks-flows/processed/CARB_RE_fuels_CA_imports_figure10_053120.xlsx" ), format = "file" ), @@ -277,7 +284,7 @@ list( name = file_renref, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/processed/renewable_refinery_capacity.xlsx" + "data-files/stocks-flows/processed/renewable_refinery_capacity.xlsx" ), format = "file" ), # this is a manually created file @@ -285,7 +292,7 @@ list( name = file_altair, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/raw/altair_refinery_capacity.xlsx" + "data-files/stocks-flows/raw/altair_refinery_capacity.xlsx" ), format = "file" ), # this is a manually created file @@ -294,7 +301,7 @@ list( name = file_raw_ces, command = file.path( main_path, - "data-staged-for-deletion/health/raw/ces3results.xlsx" + "data-files/health/raw/ces3results.xlsx" ), format = "file" ), @@ -302,7 +309,7 @@ list( name = file_raw_dac, command = file.path( main_path, - "data-staged-for-deletion/health/raw/SB535DACresultsdatadictionary_F_2022/SB535DACresultsdatadictionary_F_2022.xlsx" + "data-files/health/raw/SB535DACresultsdatadictionary_F_2022/SB535DACresultsdatadictionary_F_2022.xlsx" ), format = "file" ), @@ -310,7 +317,7 @@ list( name = file_raw_income_house, command = file.path( main_path, - "data-staged-for-deletion/Census/ca-median-house-income.csv" + "data-files/Census/ca-median-house-income.csv" ), format = "file" ), # remove from workflow @@ -318,7 +325,7 @@ list( name = file_raw_income_county, command = file.path( main_path, - "data-staged-for-deletion/Census/ca-median-house-income-county.csv" + "data-files/Census/ca-median-house-income-county.csv" ), format = "file" ), # remove from workflow @@ -326,14 +333,14 @@ list( name = file_inmap_re, command = file.path( main_path, - "data-staged-for-deletion/health/source_receptor_matrix/inmap_processed_srm/refining" + "data-files/health/source_receptor_matrix/inmap_processed_srm/refining" ) ), # these were created upstream tar_target( name = file_dt_ef, command = file.path( main_path, - "data-staged-for-deletion/health/processed/ref_emission_factor.csv" + "data-files/health/processed/ref_emission_factor.csv" ), format = "file" ), #cluster-level emission factors @@ -341,7 +348,7 @@ list( name = file_dt_ef_ref, command = file.path( main_path, - "data-staged-for-deletion/health/processed/refinery_emission_factor.csv" + "data-files/health/processed/refinery_emission_factor.csv" ), format = "file" ), #refinery-level emission factors @@ -349,7 +356,7 @@ list( name = file_dt_age_vsl, command = file.path( main_path, - "data-staged-for-deletion/health/processed/age_based_VSL_2019.csv" + "data-files/health/processed/age_based_VSL_2019.csv" ), format = "file" ), @@ -357,7 +364,7 @@ list( name = file_dt_ct_inc_pop, command = file.path( main_path, - "data-staged-for-deletion/health/processed/ct_inc_45_2020.csv" + "data-files/health/processed/ct_inc_45_2020.csv" ), format = "file" ), @@ -365,7 +372,7 @@ list( name = file_dt_growth_cap_rate, command = file.path( main_path, - "data-staged-for-deletion/benmap/processed/growth_per_cap.csv" + "data-files/benmap/processed/growth_per_cap.csv" ), format = "file" ), @@ -373,7 +380,7 @@ list( name = file_dt_health_income, command = file.path( main_path, - "outputs-staged-for-deletion/refining-2023/health/refining_health_income_2023.csv" + "output-files/refining-2023/health/refining_health_income_2023.csv" ), format = "file" ), @@ -381,7 +388,7 @@ list( name = file_raw_ct_2019, command = file.path( main_path, - "data-staged-for-deletion/GIS/raw/ct-cartographic-boundaries/cb_2019_06_tract_500k/cb_2019_06_tract_500k.shp" + "data-files/GIS/raw/ct-cartographic-boundaries/cb_2019_06_tract_500k/cb_2019_06_tract_500k.shp" ), format = "file" ), @@ -389,7 +396,7 @@ list( name = file_raw_ct_2020, command = file.path( main_path, - "data-staged-for-deletion/GIS/raw/ct-cartographic-boundaries/nhgis0030_shapefile_tl2020_us_tract_2020/US_tract_2020.shp" + "data-files/GIS/raw/ct-cartographic-boundaries/nhgis0030_shapefile_tl2020_us_tract_2020/US_tract_2020.shp" ), format = "file" ), @@ -397,7 +404,7 @@ list( name = file_raw_census_2020, command = file.path( main_path, - "data-staged-for-deletion/Census/nhgis_2020/nhgis0024_csv/nhgis0024_ds249_20205_tract.csv" + "data-files/Census/nhgis_2020/nhgis0024_csv/nhgis0024_ds249_20205_tract.csv" ), format = "file" ), @@ -405,7 +412,7 @@ list( name = file_raw_census_2021, command = file.path( main_path, - "data-staged-for-deletion/Census/nhgis_2020/nhgis0024_csv/nhgis0024_ds254_20215_tract.csv" + "data-files/Census/nhgis_2020/nhgis0024_csv/nhgis0024_ds254_20215_tract.csv" ), format = "file" ), @@ -413,7 +420,7 @@ list( name = file_raw_ct_race, command = file.path( main_path, - "data-staged-for-deletion/Census/nhgis0039_csv/nhgis0039_ds258_2020_tract.csv" + "data-files/Census/nhgis0039_csv/nhgis0039_ds258_2020_tract.csv" ), format = "file" ), @@ -421,7 +428,7 @@ list( name = file_raw_census_poverty, command = file.path( main_path, - "data-staged-for-deletion/Census/nhgis_2020/nhgis0029_csv/nhgis0029_csv/nhgis0029_ds254_20215_tract.csv" + "data-files/Census/nhgis_2020/nhgis0029_csv/nhgis0029_csv/nhgis0029_ds254_20215_tract.csv" ), format = "file" ), @@ -429,33 +436,52 @@ list( name = file_df_ca_regions, command = file.path( main_path, - "data-staged-for-deletion/labor/raw/ca_regions.csv" + "data-files/labor/raw/ca_regions.csv" ), format = "file" ), - # tar_target(name = file_df_labor, command = file.path(main_path, "data-staged-for-deletion/labor/processed/implan-results/academic-paper-multipliers/processed/ica_multipliers_v2.xlsx"), format = "file"), - # tar_target(name = file_df_labor_dest, command = file.path(main_path, "data-staged-for-deletion/labor/processed/implan-results/academic-paper-multipliers/processed/20240524-1million_la-Detail Economic Indicators.csv"), format = "file"), tar_target( name = file_direct_multipliers, - command = file.path( - main_path, - "data-staged-for-deletion/labor/ncomms-revisions/direct_multipliers_tract.csv" + command = { + if (!isTRUE(confidential_data_access)) { + file.path(main_path, + "intermediate-outputs/direct_multipliers_tract_blank.csv") + } else { + file.path( + main_path, + "confidential-data/direct_multipliers_tract.csv") + } + }, + format = "file" ), - format = "file" - ), tar_target( name = file_indirect_state_multipliers, - command = file.path( - main_path, - "data-staged-for-deletion/labor/ncomms-revisions/indirect_induced_multipliers_state.csv" - ), - format = "file" - ), + command = { + if (!isTRUE(confidential_data_access)) { + file.path( + main_path, + "intermediate-outputs/indirect_induced_multipliers_state_blank.csv") + } else { + file.path( + main_path, + "confidential-data/indirect_induced_multipliers_state.csv") + } + }, + format = "file" + ), + # tar_target( + # name = file_indirect_state_multipliers, + # command = file.path( + # main_path, + # "confidential-data/indirect_induced_multipliers_state.csv" + # ), + # format = "file" + # ), tar_target( name = file_df_labor_dest, command = file.path( main_path, - "data-staged-for-deletion/labor/processed/implan-results/academic-paper-multipliers/processed/20240623-census_regions-Detail Economic Indicators.csv" + "data-files/labor/processed/implan-results/academic-paper-multipliers/processed/20240623-census_regions-Detail Economic Indicators.csv" ), format = "file" ), @@ -463,7 +489,7 @@ list( name = file_df_labor_fte, command = file.path( main_path, - "data-staged-for-deletion/labor/processed/implan-results/academic-paper-multipliers/processed/Emp_FTE and W&S_EC_546 Industry Scheme.xlsx" + "data-files/labor/processed/implan-results/academic-paper-multipliers/processed/Emp_FTE and W&S_EC_546 Industry Scheme.xlsx" ), format = "file" ), @@ -471,7 +497,7 @@ list( name = file_oil_px, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/processed/oil_price_projections_revised.xlsx" + "data-files/stocks-flows/processed/oil_price_projections_revised.xlsx" ), format = "file" ), @@ -479,7 +505,7 @@ list( name = file_ca_counties_sp, command = file.path( main_path, - "data-staged-for-deletion/GIS/raw/CA_counties_noislands/CA_Counties_TIGER2016_noislands.shp" + "data-files/GIS/raw/CA_counties_noislands/CA_Counties_TIGER2016_noislands.shp" ), format = "file" ), @@ -487,7 +513,7 @@ list( name = file_refin_locs_orig, command = file.path( main_path, - "data-staged-for-deletion/GIS/raw/Petroleum_Refineries_US_EIA/Petroleum_Refineries_US_2019_v2.shp" + "data-files/GIS/raw/Petroleum_Refineries_US_EIA/Petroleum_Refineries_US_2019_v2.shp" ), format = "file" ), @@ -495,7 +521,7 @@ list( name = file_refin_locs, command = file.path( main_path, - "/data-staged-for-deletion/stocks-flows/processed/refinery_lat_long_revised.csv" + "/data-files/stocks-flows/processed/refinery_lat_long_revised.csv" ), format = "file" ), @@ -503,7 +529,7 @@ list( name = file_refin_locs_ct, command = file.path( main_path, - "data-staged-for-deletion/labor/ncomms-revisions/refinery_cluster_tract.csv" + "data-files/labor/ncomms-revisions/refinery_cluster_tract.csv" ), format = "file" ), @@ -511,7 +537,7 @@ list( name = file_labor_2019, command = file.path( main_path, - "/data-staged-for-deletion/labor/implan/20241010-census_regions_2019-Detail Economic Indicators.csv" + "/data-files/labor/implan/20241010-census_regions_2019-Detail Economic Indicators.csv" ), format = "file" ), @@ -692,12 +718,34 @@ list( ), tar_target( name = dt_direct_multipliers, - command = read_labor_direct_mult_inputs(file_direct_multipliers) + command = { + if (!isTRUE(confidential_data_access)) { + fread(file_direct_multipliers) + } else { + + read_labor_direct_mult_inputs(file_direct_multipliers) + } + } ), tar_target( name = dt_indirect_state_multipliers, - command = read_labor_indirect_mult_inputs(file_indirect_state_multipliers) + command = { + if (!isTRUE(confidential_data_access)) { + fread(file_indirect_state_multipliers) + } else { + + read_labor_indirect_mult_inputs(file_indirect_state_multipliers) + } + } ), + # tar_target( + # name = dt_direct_multipliers, + # command = read_labor_direct_mult_inputs(file_direct_multipliers) + # ), + # tar_target( + # name = dt_indirect_state_multipliers, + # command = read_labor_indirect_mult_inputs(file_indirect_state_multipliers) + # ), tar_target( name = proc_oil_px_df, command = read_oil_px( @@ -722,7 +770,7 @@ list( name = file_ghg_emissions, command = file.path( main_path, - "outputs-staged-for-deletion/stocks-flows/refinery_ghg_emissions.csv" + "output-files/stocks-flows/refinery_ghg_emissions.csv" ), format = "file" ), @@ -730,7 +778,7 @@ list( file_hydrogen_facilities, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/raw/hydrogen_facilities_list.xlsx" + "data-files/stocks-flows/raw/hydrogen_facilities_list.xlsx" ), format = "file" ), @@ -845,7 +893,7 @@ list( command = read_and_bind_csv_files( file.path( main_path, - 'data-staged-for-deletion/stocks-flows/processed/ghg_mrr' + 'data-files/stocks-flows/processed/ghg_mrr' ), ".csv" ) @@ -862,7 +910,7 @@ list( name = file_fpm, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/processed/finished_product_movements_weekly_cec.csv" + "data-files/stocks-flows/processed/finished_product_movements_weekly_cec.csv" ), format = "file" ), @@ -870,7 +918,7 @@ list( name = file_fw, command = file.path( main_path, - "data-staged-for-deletion/stocks-flows/processed/fuel_watch_data.csv" + "data-files/stocks-flows/processed/fuel_watch_data.csv" ), format = "file" ), @@ -878,7 +926,7 @@ list( name = file_processed_ces3, command = file.path( main_path, - "data-staged-for-deletion/health/processed/ces3_data.csv" + "data-files/health/processed/ces3_data.csv" ), format = "file" ), @@ -1526,45 +1574,85 @@ list( save_path ) ), + tar_target( name = annual_direct_labor, - command = calc_labor_outputs( - main_path, - save_path, - indiv_prod_output, - dt_refcap, - product_px, - cpi2019, - cpi2020, - discount_rate, - alpha_comp, - alpha_emp, - refin_locs_ct, - dt_direct_multipliers - ) - ), + command = { + + if (!isTRUE(confidential_data_access)) { + + fread('data/intermediate-outputs/annual_labor_outputs.csv', + colClasses = list(character = "census_tract")) + } else { + + calc_labor_outputs( + main_path, + save_path, + indiv_prod_output, + dt_refcap, + product_px, + cpi2019, + cpi2020, + discount_rate, + alpha_comp, + alpha_emp, + refin_locs_ct, + dt_direct_multipliers) + } + } + ), + tar_target( name = state_annual_direct_impacts, command = calc_state_direct_impacts(annual_direct_labor) ), + tar_target( name = annual_all_impacts_labor, - command = calc_labor_all_impacts_outputs( - main_path, - save_path, - state_annual_direct_impacts, - indiv_prod_output, - dt_refcap, - product_px, - cpi2019, - cpi2020, - discount_rate, - alpha_comp, - alpha_emp, - dt_indirect_state_multipliers, - indirect_induced_mult - ) - ), + command = { + + if (!isTRUE(confidential_data_access)) { + + fread('data/intermediate-outputs/state_annual_labor_outputs.csv') + } else { + + calc_labor_all_impacts_outputs( + main_path, + save_path, + state_annual_direct_impacts, + indiv_prod_output, + dt_refcap, + product_px, + cpi2019, + cpi2020, + discount_rate, + alpha_comp, + alpha_emp, + dt_indirect_state_multipliers, + indirect_induced_mult + ) + } + } + ), + # tar_target( + # name = annual_all_impacts_labor, + # command = calc_labor_all_impacts_outputs( + # main_path, + # save_path, + # state_annual_direct_impacts, + # indiv_prod_output, + # dt_refcap, + # product_px, + # cpi2019, + # cpi2020, + # discount_rate, + # alpha_comp, + # alpha_emp, + # dt_indirect_state_multipliers, + # indirect_induced_mult + # ) + # ), + tar_target( ref_labor_demog_yr, command = calculate_labor_x_demg_annual( @@ -2472,13 +2560,18 @@ list( ), tar_target( name = save_state_labor_annual, - command = simple_fwrite_repo( + command = { + + if (!isTRUE(confidential_data_access)) targets::tar_cancel() + + simple_fwrite_repo( annual_all_impacts_labor, NULL, "state_annual_labor_outputs.csv", save_path = save_path, file_type = "labor" - ), + ) + }, format = "file" ), tar_target( @@ -3040,6 +3133,8 @@ list( tar_target( save_annual_direct_labor, command = { + if (!isTRUE(confidential_data_access)) targets::tar_cancel() + { simple_fwrite_repo( data = annual_direct_labor, folder_path = NULL, @@ -3047,6 +3142,7 @@ list( save_path = save_path, file_type = "labor" ) + } }, format = "file" ), From 978de010019d650761e590e84c4dc3622109ba24 Mon Sep 17 00:00:00 2001 From: Tracey Mangin Date: Sun, 12 Oct 2025 11:09:11 -0700 Subject: [PATCH 02/11] remove file no longer needed --- R/figures/fig1.R | 6 ------ _targets.R | 10 ---------- 2 files changed, 16 deletions(-) diff --git a/R/figures/fig1.R b/R/figures/fig1.R index 52529b0..e3a79c7 100644 --- a/R/figures/fig1.R +++ b/R/figures/fig1.R @@ -45,7 +45,6 @@ create_figure_1 <- function( raw_ct_2019, health_weighted, refining_mortality, - labor_2019, ca_regions, raw_pop_income_2021, cpi2020, @@ -1554,11 +1553,6 @@ create_figure_1 <- function( ## merge counties to census tracts ## ----------------------------------------------------------------- - # ## join with spatial data 2019 - # census_tract_labor_2019_sp <- raw_ct_2019 |> - # rename(census_tract = GEOID) |> - # left_join(census_tract_labor_2020) - # Create the expanded data census_tracts_l_expanded <- expand_grid( census_tracts, diff --git a/_targets.R b/_targets.R index 3268880..35f8fe1 100644 --- a/_targets.R +++ b/_targets.R @@ -533,14 +533,6 @@ list( ), format = "file" ), - tar_target( - name = file_labor_2019, - command = file.path( - main_path, - "/data-files/labor/implan/20241010-census_regions_2019-Detail Economic Indicators.csv" - ), - format = "file" - ), # read in raw data files tar_target( @@ -782,7 +774,6 @@ list( ), format = "file" ), - tar_target(name = labor_2019, command = fread(file_labor_2019)), # GHG factor calculation targets tar_target( @@ -2027,7 +2018,6 @@ list( raw_ct_2019, health_weighted, refining_mortality, - labor_2019, ca_regions, raw_pop_income_2021, cpi2020, From edf405163c747e801851f102323da05e7e9fd41a Mon Sep 17 00:00:00 2001 From: Chris Malloy Date: Mon, 20 Oct 2025 11:57:26 -0500 Subject: [PATCH 03/11] added text numbers script --- .../labor_revisions_text_numbers.R | 511 ++++++++++++++++++ 1 file changed, 511 insertions(+) create mode 100644 before-targets/exploratory/labor_revisions_text_numbers.R diff --git a/before-targets/exploratory/labor_revisions_text_numbers.R b/before-targets/exploratory/labor_revisions_text_numbers.R new file mode 100644 index 0000000..a0cbfcf --- /dev/null +++ b/before-targets/exploratory/labor_revisions_text_numbers.R @@ -0,0 +1,511 @@ +###### NCOMMS REVISIONS--in-text numbers + +rm(list = ls()) + +list.of.packages <- c("dplyr", "data.table", "lubridate", "tidyr", "readxl", "fixest", "modelsummary", "flextable") +new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[, "Package"])] +if (length(new.packages)) install.packages(new.packages) + +library(lubridate) +library(tidyr) +library(dplyr) +library(data.table) +library(readxl) +library(stringr) +library(readr) +library(fixest) +library(modelsummary) +library(flextable) +library(svglite) +library(sf) +library(ggplot2) +library(tigris) +library(cowplot) +library(janitor) + +PATH.CM <- '~/Dropbox/ca-refining/outputs/rev-submission/cuf=0.6_beta-scenario=main/' +setwd(PATH.CM) + +### define function for "not in" +"%!in%" <- function(x, y) !("%in%"(x, y)) + +# Check that string doesn't match any non-letter +letters_only <- function(x) !grepl("[^A-Za-z*-]", x) + + +# Direct impacts: Figure 1 +df <- fread('./results/figures/figure-1/fig1_labor_inputs.csv') +str(df) + +filter(df, + demand_scenario=="BAU" & refining_scenario=="historic production" & oil_price_scenario=="reference case" & product_scenario=="2020 prices" & is.na(year)==FALSE) %>% + group_by() %>% + summarize(value = sum(value)/9130) + + +# Overall impact (direct + indirect + induced): Figure 3 +df <- fread('./intermediate/labor/state_annual_labor_outputs.csv') %>% + filter(product_scenario=="2020 prices" & indirect_induced_scenario=="bartik-corrected" & oil_price_scenario=="reference case") + +df %>% + filter((year==2020 | year==2045)) %>% + dplyr::select(demand_scenario,refining_scenario,product_scenario,indirect_induced_scenario,oil_price_scenario,year,empl_all_impacts_h,state_comp_PV_h) +# reference case emp reduced by 7,100, comp by 687 million + +# Total impacts relative to reference +bau <- filter(df, + demand_scenario=="BAU" & refining_scenario=="historic production") %>% + dplyr::select(year,emp_all_impacts_l,comp_all_impacts_PV_l,comp_all_impacts_PV_h,state_comp_PV_l,state_emp_l,state_comp_PV_h) %>% + rename(bau_emp_all_impacts_l = emp_all_impacts_l, + bau_comp_all_impacts_PV_l = comp_all_impacts_PV_l, + bau_state_comp_PV_l = state_comp_PV_l, + bau_state_comp_PV_h = state_comp_PV_h, + bau_state_emp_l = state_emp_l, + bau_comp_all_impacts_PV_h = comp_all_impacts_PV_h) + +left_join(df,bau,by=c("year")) %>% + mutate(emp_rel_l = emp_all_impacts_l - bau_emp_all_impacts_l, + comp_pv_rel_l = comp_all_impacts_PV_l - bau_comp_all_impacts_PV_l, + comp_pv_rel_h = comp_all_impacts_PV_h - bau_comp_all_impacts_PV_h, + dir_emp_rel_l = state_emp_l - bau_state_emp_l, + dir_comp_pv_rel_h = state_comp_PV_h-bau_state_comp_PV_h, + dir_comp_pv_rel_l = state_comp_PV_l-bau_state_comp_PV_l) %>% + dplyr::select(demand_scenario,refining_scenario,year,emp_all_impacts_l,bau_emp_all_impacts_l,emp_rel_l,empl_all_impacts_h,comp_all_impacts_PV_l,comp_all_impacts_PV_h,bau_comp_all_impacts_PV_l,comp_pv_rel_l,dir_emp_rel_l,dir_comp_pv_rel_l,dir_comp_pv_rel_h,comp_pv_rel_h) %>% + group_by(demand_scenario,refining_scenario) %>% + summarize(emp_rel_l = sum(emp_rel_l), + comp_pv_rel_l = sum(comp_pv_rel_l), + dir_emp_rel_l = sum(dir_emp_rel_l), + dir_comp_pv_rel_l = sum(dir_comp_pv_rel_l), + dir_comp_pv_rel_h = sum(dir_comp_pv_rel_h), + comp_pv_rel_h = sum(comp_pv_rel_h)) + +# Total cumulative NPV compensation losses in reference scenario +df %>% + filter(demand_scenario=="BAU" & refining_scenario=="historic production") %>% + mutate(f1.comp_all_impacts_PV_h = lag(comp_all_impacts_PV_h,n=1), + f1.comp_all_impacts_PV_h = ifelse(year==2020,0,f1.comp_all_impacts_PV_h), + level_comp_all_impacts_PV_l = f1.comp_all_impacts_PV_h+comp_all_impacts_PV_l, + f1.state_comp_PV_h = lag(state_comp_PV_h,n=1), + f1.state_comp_PV_h = ifelse(year==2020,0,f1.state_comp_PV_h), + level_state_comp_PV_l = f1.state_comp_PV_h+state_comp_PV_l) %>% + group_by() %>% + summarize(comp_all_impacts_PV_h = sum(comp_all_impacts_PV_h), + level_comp_all_impacts_PV_l = sum(level_comp_all_impacts_PV_l), + comp_all_impacts_PV_l = sum(comp_all_impacts_PV_l), + state_comp_PV_h = sum(state_comp_PV_h), + level_state_comp_PV_l = sum(level_state_comp_PV_l), + state_comp_PV_l = sum(state_comp_PV_l)) %>% + ungroup() + +rm(bau,df) + +# County-level numbers (direct impacts only) +df <- fread('./tables/labor/labor_county_outputs.csv') %>% + filter(product_scenario=="2020 prices" & oil_price_scenario=="reference case" & demo_cat=="DAC") + +str(df) + +bau <- filter(df, + demand_scenario=="BAU" & refining_scenario=="historic production") %>% + dplyr::select(demo_cat,demo_group,county,metric_name,estimate,value) %>% + rename(bau_value = value) + +df2 <- left_join(df,bau,by=c("demo_cat","demo_group","county","metric_name","estimate")) %>% + mutate(gap_value = value-bau_value) %>% + group_by(demand_scenario,refining_scenario,county,metric_name,estimate) %>% + summarize(gap_value = sum(gap_value)) + +ttl_impact <- group_by(df2, + demand_scenario,refining_scenario,metric_name,estimate) %>% + filter(gap_value < 0) %>% + summarize(ttl_value = sum(gap_value)) %>% + ungroup() + +df2 %>% + filter(gap_value<0) %>% + left_join(ttl_impact,by=c("demand_scenario","refining_scenario","metric_name","estimate")) %>% + mutate(share = gap_value/ttl_value) %>% + filter(metric_name=="compensation_pv" & estimate=="low" & demand_scenario=="LC1" & refining_scenario=="low exports") %>% + arrange(-share) %>% + print(n=57) + +# top 2 counties +0.479+0.125 +# next 8 counties +0.096+0.0841+0.0574+0.0359+0.0244+0.0194+0.0075+0.0067 +# remaining compensation losses +1-(0.479+0.125+0.096+0.0841+0.0574+0.0359+0.0244+0.0194+0.0075+0.0067) + + +# county-level results: share of direct compensation impact over total county compensation +## import IMPLAN zip code tables, sum compensation to county level + +load.implan.zip <- function(x){ + df <- fread(paste0("~/Dropbox/ou/ncomms-revisions/implan-zip/",x)) + names(df) <- make.names(names(df)) + separated.string <- str_split(x,"_") + + df <- dplyr::select(df, + Description,Employee.Compensation) %>% + filter(Description != "" & Description != "* Employment and payroll of federal govt, military" & Description != "* Employment and payroll of federal govt, non-military" & Description=="Petroleum refineries") %>% + mutate(zip = str_extract(separated.string[[1]][4],pat <- "(\\d)+"), + county = separated.string[[1]][3], + Employee.Compensation = as.numeric(str_remove_all(Employee.Compensation,"[$,]"))) %>% + group_by(county) %>% + summarize(ec_ttl = sum(Employee.Compensation,na.rm=TRUE)) %>% + ungroup() +} + +file.names <- list.files(path="~/Dropbox/ou/ncomms-revisions/implan-zip",pattern="*.csv") + +output <- lapply(file.names,load.implan.zip) %>% + bind_rows() %>% + group_by(county) %>% + summarize(ec_ttl = sum(ec_ttl,na.rm=TRUE)) %>% + ungroup() %>% + mutate(county = str_remove_all(county," County")) +summary(output$ec_ttl) + +output %>% + group_by() %>% + summarize(ec_ttl = sum(ec_ttl)) + +filter(df2, gap_value<0) %>% + filter(metric_name=="compensation_pv" & estimate=="low" & demand_scenario=="LC1" & refining_scenario=="low exports") %>% + left_join(output,by=c("county")) %>% + mutate(share = abs(gap_value)/ec_ttl) %>% + arrange(-share) %>% + print(n=57) + +rm(df,df2,ttl_impact,bau,output,file.names) + +# Demographic numbers + +## Figure 4 +df <- fread('./tables/labor/labor_high_low_annual_outputs.csv') +str(df) + +df <- filter(df, + product_scenario=="2020 prices" & oil_price_scenario=="reference case" & metric_name != "") + + + +### difference with bau +bau <- filter(df, + demand_scenario == "BAU" & refining_scenario=="historical production") %>% + rename(bau_value = value) %>% + dplyr::select(demo_cat,demo_group,metric_name,estimate,bau_value,year) + +df_pmil <- filter(df, + scenario != "BAU demand - historical production") %>% + left_join(bau, by=c("demo_cat","demo_group","metric_name","estimate","year")) %>% + mutate(gap_value = value-bau_value) %>% + group_by(demand_scenario,refining_scenario,demo_cat,demo_group,metric_name,estimate) %>% + summarize(min_value = min(gap_value), + max_value = max(gap_value), + gap_value = sum(gap_value)) %>% + ungroup() %>% + filter(metric_name == "employment_pmil" & estimate=="high" & demo_cat=="Race") +print(df_pmil,n=60) + + +# test difference in overall outputs +df2 <- fread('~/Downloads/labor_high_low_annual_outputs(1).csv') %>% + filter(product_scenario=="2020 prices" & oil_price_scenario=="reference case" & metric_name != "") + +test <- left_join(df,df2,by=c("demo_cat","demo_group","scenario","demand_scenario","refining_scenario","product_scenario","oil_price_scenario","year","metric_name","estimate")) %>% + mutate(gap = value-value_temp) %>% + filter(estimate=="low" & metric_name=="employment_pmil") +summary(test$gap) + +bau2 <- filter(df2, + demand_scenario == "BAU" & refining_scenario=="historical production") %>% + rename(bau_value = value) %>% + dplyr::select(demo_cat,demo_group,metric_name,estimate,bau_value,year) + +df_pmil2 <- filter(df2, + scenario != "BAU demand - historical production") %>% + left_join(bau2, by=c("demo_cat","demo_group","metric_name","estimate","year")) %>% + mutate(gap_value = value-bau_value) %>% + group_by(demand_scenario,refining_scenario,demo_cat,demo_group,metric_name,estimate) %>% + summarize(min_value = min(gap_value), + max_value = max(gap_value), + gap_value = sum(gap_value)) %>% + ungroup() %>% + filter(metric_name == "employment_pmil" & estimate=="high" & demo_cat=="Race") +print(df_pmil2,n=60) + + +temp <- left_join(df_pmil,df_pmil2,by=c("demand_scenario","refining_scenario","demo_cat","demo_group","metric_name","estimate")) %>% + mutate(gap = gap_value.x-gap_value.y, + share.x = gap/gap_value.x, + share.y = gap/gap_value.y) +summary(temp$gap) +summary(temp$share.x) +summary(temp$share.y) + +rm(df_pmil) + +## figure 5: NPV per capita for each scenario +df_npvpc <- filter(df, + scenario != "BAU demand - historical production") %>% + left_join(bau, by=c("demo_cat","demo_group","metric_name","estimate","year")) %>% + mutate(gap_value = value-bau_value) %>% + group_by(demand_scenario,refining_scenario,demo_cat,demo_group,metric_name,estimate) %>% + summarize(gap_value = sum(gap_value)) %>% + ungroup() %>% + filter(metric_name == "compensation_pv_pc" & estimate=="low" & demo_cat=="DAC") +print(df_npvpc,n=60) + +## check difference with 2019 commuting patterns +df_npvpc2 <- filter(df2, + scenario != "BAU demand - historical production") %>% + left_join(bau, by=c("demo_cat","demo_group","metric_name","estimate","year")) %>% + mutate(gap_value = value-bau_value) %>% + group_by(demand_scenario,refining_scenario,demo_cat,demo_group,metric_name,estimate) %>% + summarize(gap_value = sum(gap_value)) %>% + ungroup() %>% + filter(metric_name == "compensation_pv_pc" & estimate=="low" & demo_cat=="DAC") +print(df_npvpc,n=60) + +temp <- left_join(df_npvpc,df_npvpc2,by=c("demand_scenario","refining_scenario","demo_cat","demo_group","metric_name","estimate")) %>% + mutate(gap = gap_value.x-gap_value.y, + share.x = gap/gap_value.x, + share.y = gap/gap_value.y) +summary(temp$gap) +summary(temp$share.x) +summary(temp$share.y) + + +# calculate impact share by demo_cat + +group_impact <- filter(df, + scenario != "BAU demand - historical production") %>% + left_join(bau, by=c("demo_cat","demo_group","metric_name","estimate","year")) %>% + mutate(gap_value = value-bau_value) %>% + group_by(demand_scenario,refining_scenario,demo_cat,demo_group,metric_name,estimate) %>% + summarize(gap_value = sum(gap_value)) %>% + ungroup() %>% + filter(metric_name == "compensation_pv" & estimate=="low") + +ttl_impact <- filter(group_impact, + demo_cat=="DAC") %>% + group_by(demand_scenario,refining_scenario,metric_name,estimate) %>% + summarize(ttl_gap_value = sum(gap_value)) %>% + ungroup() + +group_impact <- left_join(group_impact,ttl_impact,by=c("demand_scenario","refining_scenario","metric_name","estimate")) %>% + mutate(share = gap_value/ttl_gap_value) +print(group_impact,n=60) + +rm(group_impact,ttl_impact,df_npvpc,df_pmil) + +# check the increase in job years relative to reference for non-DAC, above-poverty line, white hispanic and asian + +df_emp <- filter(df, + scenario != "BAU demand - historical production") %>% + left_join(bau, by=c("demo_cat","demo_group","metric_name","estimate","year")) %>% + mutate(gap_value = value-bau_value) %>% + filter(year <= 2026 & metric_name=="employment" & estimate=="high") + +df_product <- fread('~/Downloads/indiv_prod_output.csv') %>% + filter(year>=2020 & year<=2026 & demand_scenario=="BAU" & refining_scenario=="historic production") %>% + group_by(demand_scenario,refining_scenario,site_id,refinery_name,year) %>% + summarize(value = sum(value)) %>% + mutate(prev_value = lag(value,n=1), + delta_value = value - prev_value) %>% + #filter(delta_value > 0) %>% + ungroup() +str(df_product) +unique(df_product$refinery_name) + + +# check the relative reduction in compensation for low vs high estimate +df <- fread('./results/figures/figure-3/state_npv_fig_inputs_labor.csv') %>% + filter(metric=="forgone_wages_bil" & indirect_induced_scenario=="bartik-corrected" & product_scenario=="2020 prices") +print(df1) + + + + + + + + + + + + + + + + + + + + +# Import disaggregated results by year, demo group, state +#df <- fread('./results/figures/figure-4/state_labor_levels_fig_gaps_pmil_inputs.csv') + +df <- fread('./intermediate/labor/state_annual_labor_outputs.csv') +df <- fread('~/Downloads/state_annual_labor_outputs(1).csv') + +str(df) + +filter(df, + product_scenario=="2020 prices" & oil_price_scenario=="reference case" & (metric_name=="compensation_pv" | metric_name=="employment") & estimate=="low" & demo_cat=="DAC") %>% + group_by(demand_scenario,refining_scenario,metric_name) %>% + summarize(value = sum(value)) %>% + mutate(value = ifelse(metric_name=="compensation_pv", value - 1143228362, value - 9841)) + +df2 <- filter(df, + product_scenario=="2020 prices" & indirect_induced_scenario=="bartik-corrected" & oil_price_scenario=="reference case") + +# direct impacts in 2020--figure 1 +filter(df2, year==2020 & demand_scenario=="BAU" & refining_scenario=="historic production") %>% + dplyr::select(state_comp_PV_l,state_emp_h) + +# total impacts in 2020 +filter(df2, year==2020 & demand_scenario=="BAU" & refining_scenario=="historic production") %>% + dplyr::select(comp_all_impacts_PV_l,empl_all_impacts_h) + +# cumulative job losses in each scenario between 2020-2045 +filter(df2, (year==2045 | year==2020)) %>% + dplyr::select(demand_scenario,refining_scenario,year,comp_all_impacts_PV_h,empl_all_impacts_h) + +# cumulative impacts relative to reference +## actual figure inputs +test <- fread('./results/figures/figure-3/state_npv_fig_inputs_labor.csv') + +bau <- filter(df2, + product_scenario=="2020 prices" & indirect_induced_scenario=="bartik-corrected" & oil_price_scenario=="reference case" & demand_scenario=="BAU" & refining_scenario=="historic production") %>% + dplyr::select(year,emp_all_impacts_l,comp_all_impacts_PV_l) %>% + rename(bau_emp_all_impacts_l = emp_all_impacts_l, + bau_comp_all_impacts_PV_l = comp_all_impacts_PV_l) + +df3 <- left_join(df2,bau,by=c("year")) %>% + mutate(emp_rel_l = emp_all_impacts_l - bau_emp_all_impacts_l, + comp_pv_rel_l = comp_all_impacts_PV_l - bau_comp_all_impacts_PV_l) %>% + dplyr::select(demand_scenario,refining_scenario,year,emp_all_impacts_l,bau_emp_all_impacts_l,emp_rel_l,empl_all_impacts_h,comp_all_impacts_PV_l,comp_all_impacts_PV_h,bau_comp_all_impacts_PV_l,comp_pv_rel_l) %>% + group_by(demand_scenario,refining_scenario) %>% + summarize(emp_rel_l = sum(emp_rel_l), + comp_pv_rel_l = sum(comp_pv_rel_l)) + + +df4 <- fread('~/Downloads/state_labor_levels_fig_gaps_pmil_inputs_old.csv') %>% + filter(product_scenario=="2020 prices" & oil_price_scenario=="reference case" & demo_cat=="DAC") %>% + group_by(demand_scenario,refining_scenario) %>% + summarize(sum_demo_comp_pv_l = sum(sum_demo_comp_pv_l), + sum_demo_comp_pv_h = sum(sum_demo_comp_pv_h), + sum_demo_emp_revised = sum(sum_demo_emp_revised), + sum_demo_emp = sum(sum_demo_emp)) %>% + ungroup() +str(df4) + +df5 <- fread('~/Downloads/state_labor_levels_fig_gaps_pmil_inputs_new.csv') %>% + filter(product_scenario=="2020 prices" & oil_price_scenario=="reference case" & demo_cat=="DAC") %>% + group_by(demand_scenario,refining_scenario) %>% + summarize(gap_emp = sum(gap_emp), + sum_demo_comp_pv_l = sum(sum_demo_comp_pv_l), + sum_demo_comp_pv_h = sum(sum_demo_comp_pv_h), + sum_demo_emp_revised = sum(sum_demo_emp_revised), + sum_demo_emp = sum(sum_demo_emp)) %>% + ungroup() +str(df5) + +df6 <- fread('~/Downloads/state_levels_labor_pmil_fig_inputs.csv') %>% + filter(product_scenario=="2020 prices" & oil_price_scenario=="reference case" & demo_cat=="DAC") %>% + group_by(demand_scenario,refining_scenario) %>% + summarize(#gap_emp = sum(gap_emp), + sum_demo_comp_pv_l = sum(sum_demo_comp_pv_l), + sum_demo_comp_pv_h = sum(sum_demo_comp_pv_h), + #sum_demo_emp_revised = sum(sum_demo_emp_revised), + sum_demo_emp = sum(sum_demo_emp)) %>% + ungroup() +str(df6) + + + + + + + + +# filter to 2020 prices, low estimates, 2019 pv, labor only +df <- filter(df, + segment=="labor" & metric != "forgone_wages_h" & product_scenario=="2020 prices") %>% + group_by(demand_scenario,refining_scenario,metric,demo_cat) %>% + summarize(value = sum(value)) %>% + ungroup() +print(df,n=40) + +# intermediate file for debugging +t1 <- fread('~/Downloads/step_8_output_for_review.csv') +str(t1) +unique(is.na(t1$state_comp_all_impacts_l)) +test2 <- filter(t1, is.na(state_comp_emp_li)==TRUE & year != 2020 & oil_price_scenario=="reference case" & product_scenario=="2020 prices") + +t2 <- fread('~/Downloads/step_8_output_for_review (5).csv') +test3 <- filter(t2, + indirect_induced_scenario=="bartik-corrected" & product_scenario=="2020 prices" & oil_price_scenario=="reference case" & demand_scenario=="BAU" & refining_scenario=="historic exports") +# +# df <- filter(df,segment=="health") %>% +# group_by(demand_scenario,refining_scenario,metric,demo_cat) %>% +# summarize(value = sum(value)) %>% +# ungroup() +# + +# # + + + +df <- filter(df, + product_scenario=="2020 prices" & oil_price_scenario=="reference case" & (metric_name == "compensation_pv" | metric_name=="employment")) %>% + group_by(demand_scenario,refining_scenario,demo_cat,metric_name,estimate,year) %>% + summarize(value = sum(value)) %>% + ungroup() + +bau <- filter(df, + demand_scenario == "BAU" & refining_scenario=="historical production") %>% + rename(bau_value = value) %>% + dplyr::select(-demand_scenario, -refining_scenario) + +pop_df <- read_excel('~/Downloads/Intercensal_Excel_California.xlsx', + sheet="California-State") %>% + dplyr::select(Sex,`Race/ethnicity recode`,`Age (0-100+)`, `July 1, 2019`) +names(pop_df) <- make_clean_names(names(pop_df)) + +pop_df <- group_by(pop_df, + race_ethnicity_recode) %>% + summarize(pop = sum(july_1_2019)) %>% + ungroup() +pop_df + +pop_white <- pop_df$pop[7] +pop_black <- pop_df$pop[3] +pop_am_ind <- pop_df$pop[1] +pop_asian <- pop_df$pop[2] +pop_aapi <- pop_df$pop[6] +pop_more2 <- pop_df$pop[5] +pop_hispanic <- pop_df$pop[4] + +df <- filter(df, + demand_scenario != "BAU" & refining_scenario != "historical production") %>% + left_join(bau, by=c("demo_cat","metric_name","estimate","year")) %>% + mutate(gap_value = value - bau_value) %>% + group_by(demand_scenario,refining_scenario,demo_cat,metric_name,estimate) %>% + summarize(gap_value = sum(gap_value)) %>% + ungroup() %>% + mutate(white = (0.53*gap_value)/pop_white, + black = (0.07*gap_value)/pop_black, + am_ind = (0.002*gap_value)/pop_am_ind, + asian = (0.12*gap_value)/pop_asian, + aapi = (0.006*gap_value)/pop_aapi, + more_2 = (0.02*gap_value)/pop_more2, + hispanic = (0.25*gap_value)/pop_hispanic) +print(df,n=30) + + + + + From 0c5c91cac2788797cfb4cd7134abd72dc75838bb Mon Sep 17 00:00:00 2001 From: Tracey Mangin Date: Mon, 20 Oct 2025 11:43:55 -0700 Subject: [PATCH 04/11] move files to an archive folder, which will eventually be removed from repo (but stored elsewhere) --- .../archive/health_labor.R | 0 .../archive/labor_functions.R | 0 .../compare-health-npv-plot.R | 0 .../compare-labor-out.R | 0 .../create_ct_xwalk.R | 0 .../srm_ratio_120pm25_pm25.png | Bin .../srm_ratio_120pm25_pm25_no_outliers.png | Bin .../exploratory-figs/srm_ratio_nh3_pm25.png | Bin .../srm_ratio_pollutant_pm25.png | Bin .../labor_check.R | 0 {extras => archive-from-repo}/labor_plots.R | 0 .../labor_revisions_text_numbers.R | 0 .../labor_text_numbers.R | 0 .../ncomms_labor_multipliers.R | 0 .../ncomms_labor_revisions.R | 0 .../srm-120-exploration.R | 0 .../exploratory/labor_revisions_prep.R | 179 ------------------ 17 files changed, 179 deletions(-) rename {before-targets => archive-from-repo}/archive/health_labor.R (100%) rename {before-targets => archive-from-repo}/archive/labor_functions.R (100%) rename {before-targets/exploratory => archive-from-repo}/compare-health-npv-plot.R (100%) rename {before-targets/analysis => archive-from-repo}/compare-labor-out.R (100%) rename {before-targets/analysis => archive-from-repo}/create_ct_xwalk.R (100%) rename {before-targets/exploratory => archive-from-repo}/exploratory-figs/srm_ratio_120pm25_pm25.png (100%) rename {before-targets/exploratory => archive-from-repo}/exploratory-figs/srm_ratio_120pm25_pm25_no_outliers.png (100%) rename {before-targets/exploratory => archive-from-repo}/exploratory-figs/srm_ratio_nh3_pm25.png (100%) rename {before-targets/exploratory => archive-from-repo}/exploratory-figs/srm_ratio_pollutant_pm25.png (100%) rename {before-targets/exploratory => archive-from-repo}/labor_check.R (100%) rename {extras => archive-from-repo}/labor_plots.R (100%) rename {before-targets/exploratory => archive-from-repo}/labor_revisions_text_numbers.R (100%) rename {before-targets/exploratory => archive-from-repo}/labor_text_numbers.R (100%) rename {before-targets/exploratory => archive-from-repo}/ncomms_labor_multipliers.R (100%) rename {before-targets/exploratory => archive-from-repo}/ncomms_labor_revisions.R (100%) rename {before-targets/exploratory => archive-from-repo}/srm-120-exploration.R (100%) delete mode 100644 before-targets/exploratory/labor_revisions_prep.R diff --git a/before-targets/archive/health_labor.R b/archive-from-repo/archive/health_labor.R similarity index 100% rename from before-targets/archive/health_labor.R rename to archive-from-repo/archive/health_labor.R diff --git a/before-targets/archive/labor_functions.R b/archive-from-repo/archive/labor_functions.R similarity index 100% rename from before-targets/archive/labor_functions.R rename to archive-from-repo/archive/labor_functions.R diff --git a/before-targets/exploratory/compare-health-npv-plot.R b/archive-from-repo/compare-health-npv-plot.R similarity index 100% rename from before-targets/exploratory/compare-health-npv-plot.R rename to archive-from-repo/compare-health-npv-plot.R diff --git a/before-targets/analysis/compare-labor-out.R b/archive-from-repo/compare-labor-out.R similarity index 100% rename from before-targets/analysis/compare-labor-out.R rename to archive-from-repo/compare-labor-out.R diff --git a/before-targets/analysis/create_ct_xwalk.R b/archive-from-repo/create_ct_xwalk.R similarity index 100% rename from before-targets/analysis/create_ct_xwalk.R rename to archive-from-repo/create_ct_xwalk.R diff --git a/before-targets/exploratory/exploratory-figs/srm_ratio_120pm25_pm25.png b/archive-from-repo/exploratory-figs/srm_ratio_120pm25_pm25.png similarity index 100% rename from before-targets/exploratory/exploratory-figs/srm_ratio_120pm25_pm25.png rename to archive-from-repo/exploratory-figs/srm_ratio_120pm25_pm25.png diff --git a/before-targets/exploratory/exploratory-figs/srm_ratio_120pm25_pm25_no_outliers.png b/archive-from-repo/exploratory-figs/srm_ratio_120pm25_pm25_no_outliers.png similarity index 100% rename from before-targets/exploratory/exploratory-figs/srm_ratio_120pm25_pm25_no_outliers.png rename to archive-from-repo/exploratory-figs/srm_ratio_120pm25_pm25_no_outliers.png diff --git a/before-targets/exploratory/exploratory-figs/srm_ratio_nh3_pm25.png b/archive-from-repo/exploratory-figs/srm_ratio_nh3_pm25.png similarity index 100% rename from before-targets/exploratory/exploratory-figs/srm_ratio_nh3_pm25.png rename to archive-from-repo/exploratory-figs/srm_ratio_nh3_pm25.png diff --git a/before-targets/exploratory/exploratory-figs/srm_ratio_pollutant_pm25.png b/archive-from-repo/exploratory-figs/srm_ratio_pollutant_pm25.png similarity index 100% rename from before-targets/exploratory/exploratory-figs/srm_ratio_pollutant_pm25.png rename to archive-from-repo/exploratory-figs/srm_ratio_pollutant_pm25.png diff --git a/before-targets/exploratory/labor_check.R b/archive-from-repo/labor_check.R similarity index 100% rename from before-targets/exploratory/labor_check.R rename to archive-from-repo/labor_check.R diff --git a/extras/labor_plots.R b/archive-from-repo/labor_plots.R similarity index 100% rename from extras/labor_plots.R rename to archive-from-repo/labor_plots.R diff --git a/before-targets/exploratory/labor_revisions_text_numbers.R b/archive-from-repo/labor_revisions_text_numbers.R similarity index 100% rename from before-targets/exploratory/labor_revisions_text_numbers.R rename to archive-from-repo/labor_revisions_text_numbers.R diff --git a/before-targets/exploratory/labor_text_numbers.R b/archive-from-repo/labor_text_numbers.R similarity index 100% rename from before-targets/exploratory/labor_text_numbers.R rename to archive-from-repo/labor_text_numbers.R diff --git a/before-targets/exploratory/ncomms_labor_multipliers.R b/archive-from-repo/ncomms_labor_multipliers.R similarity index 100% rename from before-targets/exploratory/ncomms_labor_multipliers.R rename to archive-from-repo/ncomms_labor_multipliers.R diff --git a/before-targets/exploratory/ncomms_labor_revisions.R b/archive-from-repo/ncomms_labor_revisions.R similarity index 100% rename from before-targets/exploratory/ncomms_labor_revisions.R rename to archive-from-repo/ncomms_labor_revisions.R diff --git a/before-targets/exploratory/srm-120-exploration.R b/archive-from-repo/srm-120-exploration.R similarity index 100% rename from before-targets/exploratory/srm-120-exploration.R rename to archive-from-repo/srm-120-exploration.R diff --git a/before-targets/exploratory/labor_revisions_prep.R b/before-targets/exploratory/labor_revisions_prep.R deleted file mode 100644 index 8d0acd2..0000000 --- a/before-targets/exploratory/labor_revisions_prep.R +++ /dev/null @@ -1,179 +0,0 @@ -###### NCOMMS REVISIONS - -rm(list = ls()) - -list.of.packages <- c("dplyr", "data.table", "lubridate", "tidyr", "readxl", "fixest", "modelsummary", "flextable") -new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[, "Package"])] -if (length(new.packages)) install.packages(new.packages) - -library(lubridate) -library(tidyr) -library(dplyr) -library(data.table) -library(readxl) -library(stringr) -library(readr) -library(fixest) -library(modelsummary) -library(flextable) -library(svglite) -library(sf) -library(ggplot2) -library(tigris) -library(cowplot) -library(janitor) - -#PATH.CM <- '/Users/chrismalloy/Library/CloudStorage/GoogleDrive-cmalloy@ucsb.edu/Shared drives/emlab/projects/current-projects/calepa-cn/data-staged-for-deletion/labor/ncomms-revisions' -PATH.CM <- '~/Dropbox/ou/ncomms-revisions' -setwd(PATH.CM) - -### define function for "not in" -"%!in%" <- function(x, y) !("%in%"(x, y)) - -# Check that string doesn't match any non-letter -letters_only <- function(x) !grepl("[^A-Za-z*-]", x) - - -# EMPLOYMENT MULTIPLIERS (FROM IMPLAN) -#multipliers/statewide/output-value/ -rev.statewide <- fread('implan-multipliers/20250423-statewide_ca_refining-Detail Economic Indicators_2020dollars_OUTPUT.csv') %>% - dplyr::select(OriginRegion,DestinationRegion,IndustryCode,ImpactType,Employment,EmployeeCompensation) %>% - rename(emp.rev = Employment, - ec.rev = EmployeeCompensation) -#multipliers/statewide/labor-income/ -li.statewide <- fread('implan-multipliers/20250423-statewide_ca_refining-Detail Economic Indicators_2020dollars_LI.csv') %>% - dplyr::select(OriginRegion,DestinationRegion,IndustryCode,ImpactType,Employment,EmployeeCompensation) %>% - rename(emp.li = Employment, - ec.li = EmployeeCompensation) -statewide <- left_join(rev.statewide,li.statewide, by=c("OriginRegion","DestinationRegion","IndustryCode","ImpactType")) - -rm(rev.statewide,li.statewide) - -# IMPLAN JOB-YEARS TO FTE CONVERSION - -fte <- read_excel('Emp_FTE and W&S_EC_546 Industry Scheme.xlsx',sheet="2022",skip=1) %>% - dplyr::select(Implan546Index,ECtoWSInc,FTEperTotalEmp) - -## CONVERT JOB-YEARS TO FTE JOB-YEARS AND COMPENSATION TO WAGE AND SALARY INCOME FOR LABOR INCOME MULTIPLIER -statewide <- left_join(statewide,fte,by=c("IndustryCode"="Implan546Index")) %>% - mutate(emp.rev = emp.rev*FTEperTotalEmp, - emp.li = emp.li*FTEperTotalEmp, - ec.li = ec.li/ECtoWSInc, - emp.li = emp.li/ECtoWSInc) %>% - dplyr::select(-FTEperTotalEmp,-ECtoWSInc) - - -### ADD UP WORKERS FROM BLOCK TO TRACT LEVEL - -df.tract <- fread('ca_od_main_JT02_2019.csv') %>% - mutate(w_tract_geocode = substr(as.character(w_geocode),1,10), - h_tract_geocode = substr(as.character(h_geocode),1,10)) %>% - filter(h_tract_geocode != "6037980004" & h_tract_geocode != "6037980030" & h_tract_geocode != "6111980000") %>% - dplyr::select(w_tract_geocode, h_tract_geocode,S000,SI01,SI02,SI03) %>% - group_by(w_tract_geocode,h_tract_geocode) %>% - summarize(S000 = sum(S000,na.rm=TRUE), - SI01 = sum(SI01,na.rm=TRUE), - SI02 = sum(SI02,na.rm=TRUE), - SI03 = sum(SI03,na.rm=TRUE)) %>% - ungroup() - -df.tract <- mutate(df.tract, - w_tract_geocode = str_pad(as.character(w_tract_geocode),11,pad="0"), - h_tract_geocode = str_pad(as.character(h_tract_geocode),11,pad="0")) - - - -########################################################################### - -# DIRECT IMPACTS--IMPLAN MULTIPLIER * SHARE OF OUTPUT AT EACH REFINERY CENSUS TRACT * LODES SHARES AT TRACT LEVEL -## IMPLAN MULTIPLIERS -statewide.direct <- filter(statewide,ImpactType=="Direct") - -## SHARE WORKERS IN EACH REFINERY CENSUS TRACT LIVING IN RESIDENTIAL CENSUS TRACT R - -w.tract.total <- group_by(df.tract, - w_tract_geocode) %>% - summarize(S000_w = sum(S000,na.rm=TRUE), - SI01_w = sum(SI01,na.rm=TRUE)) %>% - ungroup() - -wh.tract.share <- left_join(df.tract,w.tract.total,by="w_tract_geocode") %>% - mutate(S000_share = ifelse(S000_w > 0, S000/S000_w, 0), - SI01_share = ifelse(SI01_w > 0, SI01/SI01_w, 0)) %>% - filter(w_tract_geocode == "06037980002" | - w_tract_geocode == "06037980030" | - w_tract_geocode == "06013378000" | - w_tract_geocode == "06095252102" | - w_tract_geocode == "06029002401" | - w_tract_geocode == "06037980014" | - w_tract_geocode == "06037980005" | - w_tract_geocode == "06029000507" | - w_tract_geocode == "06013320001" | - w_tract_geocode == "06013315000" | - w_tract_geocode == "06013358000" | - w_tract_geocode == "06037980015" | - w_tract_geocode == "06079012306" | - w_tract_geocode == "06037553502" | - w_tract_geocode == "06029000507") %>% - dplyr::select(w_tract_geocode,h_tract_geocode,S000_share,SI01_share) %>% - mutate(refinery_name = ifelse(w_tract_geocode == "06037980002","Marathon Carson", - ifelse(w_tract_geocode == "06037980030","Chevron El Segundo", - ifelse(w_tract_geocode == "06013378000","Chevron Richmond", - ifelse(w_tract_geocode == "06095252102","Valero Benicia", - ifelse(w_tract_geocode == "06029002401","Kern Oil Bakersfield", - ifelse(w_tract_geocode == "06037980014","Valero Wilmington", - ifelse(w_tract_geocode == "06037980005","PBF Torrance", - ifelse(w_tract_geocode == "06029000507","San Joaquin Bakersfield", - ifelse(w_tract_geocode == "06013320001","PBF Martinez", - ifelse(w_tract_geocode == "06013315000","Marathon Golden Eagle", - ifelse(w_tract_geocode == "06013358000","Phillips 66 Rodeo", - ifelse(w_tract_geocode == "06037980015","Phillips 66 Wilmington", - ifelse(w_tract_geocode == "06079012306","Phillips 66 Santa Maria", - ifelse(w_tract_geocode == "06037553502","AltAir Paramount", - ifelse(w_tract_geocode == "06029000507","Global Clean Energy",NA))))))))))))))), - cluster = ifelse((refinery_name=="Marathon Carson" | refinery_name=="Chevron El Segundo" | refinery_name=="Valero Wilmington" | - refinery_name=="PBF Torrance" | refinery_name=="Phillips 66 Wilmington" | refinery_name=="AltAir Paramount"),"south","north")) %>% - filter(SI01_share>0) -summary(wh.tract.share$S000_share) -summary(wh.tract.share$SI01_share) - - -## DIRECT MULTIPLIERS BY TRACT -direct.multipliers <- wh.tract.share -direct.multipliers$emp.rev <- statewide.direct$emp.rev -direct.multipliers$ec.rev <- statewide.direct$ec.rev - -direct.multipliers <- mutate(direct.multipliers, - emp.rev = emp.rev*SI01_share, - ec.rev = ec.rev*SI01_share) %>% - group_by(w_tract_geocode,h_tract_geocode) %>% - summarize(emp.rev = sum(emp.rev), - ec.rev = sum(ec.rev), - cluster = first(cluster)) %>% - ungroup() - -summary(direct.multipliers$emp.rev) -summary(direct.multipliers$ec.rev) - - -## ADD MULTIPLIERS ACROSS INDUSTRIES TO THE STATE X IMPACT TYPE LEVEL -statewide.indir.indu <- filter(statewide, ImpactType != "Direct") %>% - group_by(DestinationRegion,ImpactType) %>% - summarize(emp.rev = sum(emp.rev), - ec.rev = sum(ec.rev), - emp.li = sum(emp.li), - ec.li = sum(ec.li)) %>% - ungroup() - -test <- group_by(wh.tract.share, - w_tract_geocode,refinery_name) %>% - summarize(S000_share = sum(S000_share), - SI01_share = sum(SI01_share)) -summary(test$SI01_share) - -# EXPORT FILES TO CSV FOR TRACEY - -fwrite(direct.multipliers,'direct_multipliers_tract_2019.csv') -fwrite(statewide.indir.indu,'indirect_induced_multipliers_state.csv') - - From 16e9bcef3ff04a130c1effbc49515c0a674ce37d Mon Sep 17 00:00:00 2001 From: Tracey Mangin Date: Mon, 20 Oct 2025 13:35:33 -0700 Subject: [PATCH 05/11] clean up health files in repo --- .../age_vsl_test.R | 0 .../compare_demo.R | 0 .../cumlutative_number_health.R | 0 .../exploratory_health_figs.R | 0 archive-from-repo/health_results.R | 157 ++++++++++++++++++ 5 files changed, 157 insertions(+) rename {before-targets/analysis => archive-from-repo}/age_vsl_test.R (100%) rename {before-targets/exploratory => archive-from-repo}/compare_demo.R (100%) rename {before-targets/exploratory => archive-from-repo}/cumlutative_number_health.R (100%) rename {before-targets/exploratory => archive-from-repo}/exploratory_health_figs.R (100%) create mode 100644 archive-from-repo/health_results.R diff --git a/before-targets/analysis/age_vsl_test.R b/archive-from-repo/age_vsl_test.R similarity index 100% rename from before-targets/analysis/age_vsl_test.R rename to archive-from-repo/age_vsl_test.R diff --git a/before-targets/exploratory/compare_demo.R b/archive-from-repo/compare_demo.R similarity index 100% rename from before-targets/exploratory/compare_demo.R rename to archive-from-repo/compare_demo.R diff --git a/before-targets/exploratory/cumlutative_number_health.R b/archive-from-repo/cumlutative_number_health.R similarity index 100% rename from before-targets/exploratory/cumlutative_number_health.R rename to archive-from-repo/cumlutative_number_health.R diff --git a/before-targets/exploratory/exploratory_health_figs.R b/archive-from-repo/exploratory_health_figs.R similarity index 100% rename from before-targets/exploratory/exploratory_health_figs.R rename to archive-from-repo/exploratory_health_figs.R diff --git a/archive-from-repo/health_results.R b/archive-from-repo/health_results.R new file mode 100644 index 0000000..9fd66fc --- /dev/null +++ b/archive-from-repo/health_results.R @@ -0,0 +1,157 @@ +# CalEPA: Summary stats from health results +# vincent.thivierge@uottawa.ca +# created: 07/08/2025 +# updated: 07/08/2025 + +# set up environment + +rm(list = ls()) +`%notin%` <- Negate(`%in%`) +gc() + +options(scipen = 999) + +## Packages + +packages <- c( + "data.table", "dplyr", "janitor", "stringr", "ggplot2", "cowplot", + "forcats", "readxl", "forcats", "tidyr" +) + +for (i in packages) { + if (require(i, character.only = TRUE) == FALSE) { + install.packages(i, repos = "http://cran.us.r-project.org") + } else { + require(i, character.only = TRUE) + } +} + +## Directory + +wd <- c("C:\\git\\ca-refining\\outputs\\rev-submission\\cuf=0.6_beta-scenario=main\\tables\\health") #Vincent's WD +setwd(wd) +getwd() + +## State-wide mortality results + +fread("./cumulative_avoided_mortality.csv", stringsAsFactors = F)%>% + filter(demo_cat%in%"DAC")%>% + group_by(scen_id)%>% + summarise(cumul_mort_level = sum(cumul_mort_level))%>% + ungroup()%>% + mutate(diff = cumul_mort_level[scen_id == "BAU historic production"]-cumul_mort_level, + percent = (cumul_mort_level/cumul_mort_level[scen_id == "BAU historic production"])-1) + +## State-wide monetized mortality results + +fread("./cumulative_health_x_county.csv", stringsAsFactors = F)%>% + filter(demo_cat%in%"DAC")%>% + group_by(scen_id)%>% + summarise(mortality_pv = sum(mortality_pv_dem)/1000000000)%>% + ungroup()%>% + mutate(diff_pv = mortality_pv[scen_id == "BAU historic production"]-mortality_pv) + + +## State-wide monetized mortality by county (new results) + +fread("./cumulative_health_x_county.csv", stringsAsFactors = F)%>% + filter(demo_cat%in%"DAC")%>% + filter(scen_id %in% c("BAU historic production","LC1 low exports"))%>% + group_by(scen_id,NAME)%>% + summarize(mortality_pv_dem = sum(mortality_pv_dem))%>% + ungroup()%>% + group_by(scen_id)%>% + mutate(mortality_pv = sum(mortality_pv_dem))%>% + ungroup()%>% + mutate(diff_pv_state = mortality_pv[scen_id == "BAU historic production"]-mortality_pv, + diff_pv = mortality_pv_dem[scen_id == "BAU historic production"]-mortality_pv_dem)%>% + mutate(share_pv = (diff_pv/diff_pv_state))%>% + #filter(scen_id %in% c("LC1 low exports"))%>% + arrange(-share_pv) + +## By demographic + +fig5 <- fread("C:\\git\\ca-refining\\outputs\\rev-submission\\cuf=0.6_beta-scenario=main\\results\\figures\\figure-5\\state_disaggregated_npv_pc_fig_inputs.csv", + stringsAsFactors = F) + +fread("C:\\git\\ca-refining\\outputs\\rev-submission\\cuf=0.6_beta-scenario=main\\results\\figures\\figure-5\\state_disaggregated_npv_pc_fig_inputs.csv", + stringsAsFactors = F)%>% + filter(scen_id %in% c("BAU historical production","LC1 low exports") & demo_cat %in% "DAC" & segment %in% "health") + +## Sensitivity analyses + +#Refinery-level +fread("./state_npv_fig_inputs_health_ref.csv", stringsAsFactors = F)%>% + filter(unit_desc %in% "USD billion (2019 VSL)")%>% + #filter(scen_id %in% c("BAU historical production","LC1 low exports") & unit_desc %in% "USD billion (2019 VSL)")%>% + select(scen_id,value)%>% + distinct() + +#Growing age-based VSL +fread("C:\\git\\ca-refining\\outputs\\rev-submission\\cuf=0.6_beta-scenario=main\\results\\figures\\figure-3\\state_npv_fig_inputs_health.csv", + stringsAsFactors = F)%>% + filter(scen_id %in% c("BAU historical production","LC1 low exports") & unit_desc %in% "USD billion (annual VSL)") + +#Constant VSL +fread("./state_npv_fig_inputs_health_non_age_vsl.csv", stringsAsFactors = F)%>% + filter(scen_id %in% c("BAU historical production","LC1 low exports") & unit_desc %in% "USD billion (2019 VSL)") + +######################################################################################################################## +############# DEBUGGGING ######################################################################################################################## +######################################################################################################################## + + +fread("./cumulative_health_x_county.csv", stringsAsFactors = F)%>% + filter(demo_cat%in%"DAC")%>% + filter(scen_id %in% c("BAU historic production","LC1 low exports"))%>% + group_by(scen_id,NAME)%>% + summarize(mortality_pv_dem = sum(mortality_pv_dem), + mortality_level_dem = sum(mortality_level_dem))%>% + ungroup()%>% + group_by(scen_id)%>% + mutate(mortality_pv = sum(mortality_pv_dem))%>% + ungroup()%>% + mutate(diff_pv_state = mortality_pv[scen_id == "BAU historic production"]-mortality_pv, + diff_pv = mortality_pv_dem[scen_id == "BAU historic production"]-mortality_pv_dem)%>% + mutate(share_pv = (diff_pv/diff_pv_state))%>% + #filter(scen_id %in% c("LC1 low exports"))%>% + arrange(-share_pv)%>% + filter(NAME %in% c("Solano","San Bernardino")) + + +## State-wide monetized mortality by county (old results) + +fread("C:/Users/vince/Desktop/cumulative_health_x_county.csv", stringsAsFactors = F)%>% + filter(demo_cat%in%"DAC")%>% + filter(scen_id %in% c("BAU historic production","LC1 low exports"))%>% + group_by(scen_id,NAME)%>% + summarize(mortality_pv_dem = sum(mortality_pv_dem), + mortality_level_dem = sum(mortality_level_dem))%>% + ungroup()%>% + group_by(scen_id)%>% + mutate(mortality_pv = sum(mortality_pv_dem))%>% + ungroup()%>% + mutate(diff_pv_state = mortality_pv[scen_id == "BAU historic production"]-mortality_pv, + diff_pv = mortality_pv_dem[scen_id == "BAU historic production"]-mortality_pv_dem)%>% + mutate(share_pv = (diff_pv/diff_pv_state))%>% + #filter(scen_id %in% c("LC1 low exports"))%>% + arrange(-share_pv) + +fread("C:/Users/vince/Desktop/cumulative_health_x_county.csv", stringsAsFactors = F)%>% + filter(demo_cat%in%"DAC")%>% + filter(scen_id %in% c("BAU historic production","LC1 low exports"))%>% + group_by(scen_id,NAME)%>% + summarize(mortality_pv_dem = sum(mortality_pv_dem), + mortality_level_dem = sum(mortality_level_dem))%>% + ungroup()%>% + group_by(scen_id)%>% + mutate(mortality_pv = sum(mortality_pv_dem))%>% + ungroup()%>% + mutate(diff_pv_state = mortality_pv[scen_id == "BAU historic production"]-mortality_pv, + diff_pv = mortality_pv_dem[scen_id == "BAU historic production"]-mortality_pv_dem)%>% + mutate(share_pv = (diff_pv/diff_pv_state))%>% + #filter(scen_id %in% c("LC1 low exports"))%>% + arrange(-share_pv)%>% + filter(NAME %in% c("Solano","San Bernardino")) + + From ddc458e010213ffa46ddb44c9a0ef6c919d0b2d4 Mon Sep 17 00:00:00 2001 From: Tracey Mangin Date: Mon, 20 Oct 2025 13:37:43 -0700 Subject: [PATCH 06/11] remove extra files --- extras/health_results.R | 157 ---------------------------------------- 1 file changed, 157 deletions(-) delete mode 100644 extras/health_results.R diff --git a/extras/health_results.R b/extras/health_results.R deleted file mode 100644 index 9fd66fc..0000000 --- a/extras/health_results.R +++ /dev/null @@ -1,157 +0,0 @@ -# CalEPA: Summary stats from health results -# vincent.thivierge@uottawa.ca -# created: 07/08/2025 -# updated: 07/08/2025 - -# set up environment - -rm(list = ls()) -`%notin%` <- Negate(`%in%`) -gc() - -options(scipen = 999) - -## Packages - -packages <- c( - "data.table", "dplyr", "janitor", "stringr", "ggplot2", "cowplot", - "forcats", "readxl", "forcats", "tidyr" -) - -for (i in packages) { - if (require(i, character.only = TRUE) == FALSE) { - install.packages(i, repos = "http://cran.us.r-project.org") - } else { - require(i, character.only = TRUE) - } -} - -## Directory - -wd <- c("C:\\git\\ca-refining\\outputs\\rev-submission\\cuf=0.6_beta-scenario=main\\tables\\health") #Vincent's WD -setwd(wd) -getwd() - -## State-wide mortality results - -fread("./cumulative_avoided_mortality.csv", stringsAsFactors = F)%>% - filter(demo_cat%in%"DAC")%>% - group_by(scen_id)%>% - summarise(cumul_mort_level = sum(cumul_mort_level))%>% - ungroup()%>% - mutate(diff = cumul_mort_level[scen_id == "BAU historic production"]-cumul_mort_level, - percent = (cumul_mort_level/cumul_mort_level[scen_id == "BAU historic production"])-1) - -## State-wide monetized mortality results - -fread("./cumulative_health_x_county.csv", stringsAsFactors = F)%>% - filter(demo_cat%in%"DAC")%>% - group_by(scen_id)%>% - summarise(mortality_pv = sum(mortality_pv_dem)/1000000000)%>% - ungroup()%>% - mutate(diff_pv = mortality_pv[scen_id == "BAU historic production"]-mortality_pv) - - -## State-wide monetized mortality by county (new results) - -fread("./cumulative_health_x_county.csv", stringsAsFactors = F)%>% - filter(demo_cat%in%"DAC")%>% - filter(scen_id %in% c("BAU historic production","LC1 low exports"))%>% - group_by(scen_id,NAME)%>% - summarize(mortality_pv_dem = sum(mortality_pv_dem))%>% - ungroup()%>% - group_by(scen_id)%>% - mutate(mortality_pv = sum(mortality_pv_dem))%>% - ungroup()%>% - mutate(diff_pv_state = mortality_pv[scen_id == "BAU historic production"]-mortality_pv, - diff_pv = mortality_pv_dem[scen_id == "BAU historic production"]-mortality_pv_dem)%>% - mutate(share_pv = (diff_pv/diff_pv_state))%>% - #filter(scen_id %in% c("LC1 low exports"))%>% - arrange(-share_pv) - -## By demographic - -fig5 <- fread("C:\\git\\ca-refining\\outputs\\rev-submission\\cuf=0.6_beta-scenario=main\\results\\figures\\figure-5\\state_disaggregated_npv_pc_fig_inputs.csv", - stringsAsFactors = F) - -fread("C:\\git\\ca-refining\\outputs\\rev-submission\\cuf=0.6_beta-scenario=main\\results\\figures\\figure-5\\state_disaggregated_npv_pc_fig_inputs.csv", - stringsAsFactors = F)%>% - filter(scen_id %in% c("BAU historical production","LC1 low exports") & demo_cat %in% "DAC" & segment %in% "health") - -## Sensitivity analyses - -#Refinery-level -fread("./state_npv_fig_inputs_health_ref.csv", stringsAsFactors = F)%>% - filter(unit_desc %in% "USD billion (2019 VSL)")%>% - #filter(scen_id %in% c("BAU historical production","LC1 low exports") & unit_desc %in% "USD billion (2019 VSL)")%>% - select(scen_id,value)%>% - distinct() - -#Growing age-based VSL -fread("C:\\git\\ca-refining\\outputs\\rev-submission\\cuf=0.6_beta-scenario=main\\results\\figures\\figure-3\\state_npv_fig_inputs_health.csv", - stringsAsFactors = F)%>% - filter(scen_id %in% c("BAU historical production","LC1 low exports") & unit_desc %in% "USD billion (annual VSL)") - -#Constant VSL -fread("./state_npv_fig_inputs_health_non_age_vsl.csv", stringsAsFactors = F)%>% - filter(scen_id %in% c("BAU historical production","LC1 low exports") & unit_desc %in% "USD billion (2019 VSL)") - -######################################################################################################################## -############# DEBUGGGING ######################################################################################################################## -######################################################################################################################## - - -fread("./cumulative_health_x_county.csv", stringsAsFactors = F)%>% - filter(demo_cat%in%"DAC")%>% - filter(scen_id %in% c("BAU historic production","LC1 low exports"))%>% - group_by(scen_id,NAME)%>% - summarize(mortality_pv_dem = sum(mortality_pv_dem), - mortality_level_dem = sum(mortality_level_dem))%>% - ungroup()%>% - group_by(scen_id)%>% - mutate(mortality_pv = sum(mortality_pv_dem))%>% - ungroup()%>% - mutate(diff_pv_state = mortality_pv[scen_id == "BAU historic production"]-mortality_pv, - diff_pv = mortality_pv_dem[scen_id == "BAU historic production"]-mortality_pv_dem)%>% - mutate(share_pv = (diff_pv/diff_pv_state))%>% - #filter(scen_id %in% c("LC1 low exports"))%>% - arrange(-share_pv)%>% - filter(NAME %in% c("Solano","San Bernardino")) - - -## State-wide monetized mortality by county (old results) - -fread("C:/Users/vince/Desktop/cumulative_health_x_county.csv", stringsAsFactors = F)%>% - filter(demo_cat%in%"DAC")%>% - filter(scen_id %in% c("BAU historic production","LC1 low exports"))%>% - group_by(scen_id,NAME)%>% - summarize(mortality_pv_dem = sum(mortality_pv_dem), - mortality_level_dem = sum(mortality_level_dem))%>% - ungroup()%>% - group_by(scen_id)%>% - mutate(mortality_pv = sum(mortality_pv_dem))%>% - ungroup()%>% - mutate(diff_pv_state = mortality_pv[scen_id == "BAU historic production"]-mortality_pv, - diff_pv = mortality_pv_dem[scen_id == "BAU historic production"]-mortality_pv_dem)%>% - mutate(share_pv = (diff_pv/diff_pv_state))%>% - #filter(scen_id %in% c("LC1 low exports"))%>% - arrange(-share_pv) - -fread("C:/Users/vince/Desktop/cumulative_health_x_county.csv", stringsAsFactors = F)%>% - filter(demo_cat%in%"DAC")%>% - filter(scen_id %in% c("BAU historic production","LC1 low exports"))%>% - group_by(scen_id,NAME)%>% - summarize(mortality_pv_dem = sum(mortality_pv_dem), - mortality_level_dem = sum(mortality_level_dem))%>% - ungroup()%>% - group_by(scen_id)%>% - mutate(mortality_pv = sum(mortality_pv_dem))%>% - ungroup()%>% - mutate(diff_pv_state = mortality_pv[scen_id == "BAU historic production"]-mortality_pv, - diff_pv = mortality_pv_dem[scen_id == "BAU historic production"]-mortality_pv_dem)%>% - mutate(share_pv = (diff_pv/diff_pv_state))%>% - #filter(scen_id %in% c("LC1 low exports"))%>% - arrange(-share_pv)%>% - filter(NAME %in% c("Solano","San Bernardino")) - - From 3bc39ad3dd72bde6a0bbfca0fc3cb8361a2f8a72 Mon Sep 17 00:00:00 2001 From: Tracey Mangin Date: Tue, 21 Oct 2025 10:37:11 -0700 Subject: [PATCH 07/11] add data prep script for labor analysis --- .../data-prep/labor_revisions_prep.R | 179 ++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 before-targets/data-prep/labor_revisions_prep.R diff --git a/before-targets/data-prep/labor_revisions_prep.R b/before-targets/data-prep/labor_revisions_prep.R new file mode 100644 index 0000000..8d0acd2 --- /dev/null +++ b/before-targets/data-prep/labor_revisions_prep.R @@ -0,0 +1,179 @@ +###### NCOMMS REVISIONS + +rm(list = ls()) + +list.of.packages <- c("dplyr", "data.table", "lubridate", "tidyr", "readxl", "fixest", "modelsummary", "flextable") +new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[, "Package"])] +if (length(new.packages)) install.packages(new.packages) + +library(lubridate) +library(tidyr) +library(dplyr) +library(data.table) +library(readxl) +library(stringr) +library(readr) +library(fixest) +library(modelsummary) +library(flextable) +library(svglite) +library(sf) +library(ggplot2) +library(tigris) +library(cowplot) +library(janitor) + +#PATH.CM <- '/Users/chrismalloy/Library/CloudStorage/GoogleDrive-cmalloy@ucsb.edu/Shared drives/emlab/projects/current-projects/calepa-cn/data-staged-for-deletion/labor/ncomms-revisions' +PATH.CM <- '~/Dropbox/ou/ncomms-revisions' +setwd(PATH.CM) + +### define function for "not in" +"%!in%" <- function(x, y) !("%in%"(x, y)) + +# Check that string doesn't match any non-letter +letters_only <- function(x) !grepl("[^A-Za-z*-]", x) + + +# EMPLOYMENT MULTIPLIERS (FROM IMPLAN) +#multipliers/statewide/output-value/ +rev.statewide <- fread('implan-multipliers/20250423-statewide_ca_refining-Detail Economic Indicators_2020dollars_OUTPUT.csv') %>% + dplyr::select(OriginRegion,DestinationRegion,IndustryCode,ImpactType,Employment,EmployeeCompensation) %>% + rename(emp.rev = Employment, + ec.rev = EmployeeCompensation) +#multipliers/statewide/labor-income/ +li.statewide <- fread('implan-multipliers/20250423-statewide_ca_refining-Detail Economic Indicators_2020dollars_LI.csv') %>% + dplyr::select(OriginRegion,DestinationRegion,IndustryCode,ImpactType,Employment,EmployeeCompensation) %>% + rename(emp.li = Employment, + ec.li = EmployeeCompensation) +statewide <- left_join(rev.statewide,li.statewide, by=c("OriginRegion","DestinationRegion","IndustryCode","ImpactType")) + +rm(rev.statewide,li.statewide) + +# IMPLAN JOB-YEARS TO FTE CONVERSION + +fte <- read_excel('Emp_FTE and W&S_EC_546 Industry Scheme.xlsx',sheet="2022",skip=1) %>% + dplyr::select(Implan546Index,ECtoWSInc,FTEperTotalEmp) + +## CONVERT JOB-YEARS TO FTE JOB-YEARS AND COMPENSATION TO WAGE AND SALARY INCOME FOR LABOR INCOME MULTIPLIER +statewide <- left_join(statewide,fte,by=c("IndustryCode"="Implan546Index")) %>% + mutate(emp.rev = emp.rev*FTEperTotalEmp, + emp.li = emp.li*FTEperTotalEmp, + ec.li = ec.li/ECtoWSInc, + emp.li = emp.li/ECtoWSInc) %>% + dplyr::select(-FTEperTotalEmp,-ECtoWSInc) + + +### ADD UP WORKERS FROM BLOCK TO TRACT LEVEL + +df.tract <- fread('ca_od_main_JT02_2019.csv') %>% + mutate(w_tract_geocode = substr(as.character(w_geocode),1,10), + h_tract_geocode = substr(as.character(h_geocode),1,10)) %>% + filter(h_tract_geocode != "6037980004" & h_tract_geocode != "6037980030" & h_tract_geocode != "6111980000") %>% + dplyr::select(w_tract_geocode, h_tract_geocode,S000,SI01,SI02,SI03) %>% + group_by(w_tract_geocode,h_tract_geocode) %>% + summarize(S000 = sum(S000,na.rm=TRUE), + SI01 = sum(SI01,na.rm=TRUE), + SI02 = sum(SI02,na.rm=TRUE), + SI03 = sum(SI03,na.rm=TRUE)) %>% + ungroup() + +df.tract <- mutate(df.tract, + w_tract_geocode = str_pad(as.character(w_tract_geocode),11,pad="0"), + h_tract_geocode = str_pad(as.character(h_tract_geocode),11,pad="0")) + + + +########################################################################### + +# DIRECT IMPACTS--IMPLAN MULTIPLIER * SHARE OF OUTPUT AT EACH REFINERY CENSUS TRACT * LODES SHARES AT TRACT LEVEL +## IMPLAN MULTIPLIERS +statewide.direct <- filter(statewide,ImpactType=="Direct") + +## SHARE WORKERS IN EACH REFINERY CENSUS TRACT LIVING IN RESIDENTIAL CENSUS TRACT R + +w.tract.total <- group_by(df.tract, + w_tract_geocode) %>% + summarize(S000_w = sum(S000,na.rm=TRUE), + SI01_w = sum(SI01,na.rm=TRUE)) %>% + ungroup() + +wh.tract.share <- left_join(df.tract,w.tract.total,by="w_tract_geocode") %>% + mutate(S000_share = ifelse(S000_w > 0, S000/S000_w, 0), + SI01_share = ifelse(SI01_w > 0, SI01/SI01_w, 0)) %>% + filter(w_tract_geocode == "06037980002" | + w_tract_geocode == "06037980030" | + w_tract_geocode == "06013378000" | + w_tract_geocode == "06095252102" | + w_tract_geocode == "06029002401" | + w_tract_geocode == "06037980014" | + w_tract_geocode == "06037980005" | + w_tract_geocode == "06029000507" | + w_tract_geocode == "06013320001" | + w_tract_geocode == "06013315000" | + w_tract_geocode == "06013358000" | + w_tract_geocode == "06037980015" | + w_tract_geocode == "06079012306" | + w_tract_geocode == "06037553502" | + w_tract_geocode == "06029000507") %>% + dplyr::select(w_tract_geocode,h_tract_geocode,S000_share,SI01_share) %>% + mutate(refinery_name = ifelse(w_tract_geocode == "06037980002","Marathon Carson", + ifelse(w_tract_geocode == "06037980030","Chevron El Segundo", + ifelse(w_tract_geocode == "06013378000","Chevron Richmond", + ifelse(w_tract_geocode == "06095252102","Valero Benicia", + ifelse(w_tract_geocode == "06029002401","Kern Oil Bakersfield", + ifelse(w_tract_geocode == "06037980014","Valero Wilmington", + ifelse(w_tract_geocode == "06037980005","PBF Torrance", + ifelse(w_tract_geocode == "06029000507","San Joaquin Bakersfield", + ifelse(w_tract_geocode == "06013320001","PBF Martinez", + ifelse(w_tract_geocode == "06013315000","Marathon Golden Eagle", + ifelse(w_tract_geocode == "06013358000","Phillips 66 Rodeo", + ifelse(w_tract_geocode == "06037980015","Phillips 66 Wilmington", + ifelse(w_tract_geocode == "06079012306","Phillips 66 Santa Maria", + ifelse(w_tract_geocode == "06037553502","AltAir Paramount", + ifelse(w_tract_geocode == "06029000507","Global Clean Energy",NA))))))))))))))), + cluster = ifelse((refinery_name=="Marathon Carson" | refinery_name=="Chevron El Segundo" | refinery_name=="Valero Wilmington" | + refinery_name=="PBF Torrance" | refinery_name=="Phillips 66 Wilmington" | refinery_name=="AltAir Paramount"),"south","north")) %>% + filter(SI01_share>0) +summary(wh.tract.share$S000_share) +summary(wh.tract.share$SI01_share) + + +## DIRECT MULTIPLIERS BY TRACT +direct.multipliers <- wh.tract.share +direct.multipliers$emp.rev <- statewide.direct$emp.rev +direct.multipliers$ec.rev <- statewide.direct$ec.rev + +direct.multipliers <- mutate(direct.multipliers, + emp.rev = emp.rev*SI01_share, + ec.rev = ec.rev*SI01_share) %>% + group_by(w_tract_geocode,h_tract_geocode) %>% + summarize(emp.rev = sum(emp.rev), + ec.rev = sum(ec.rev), + cluster = first(cluster)) %>% + ungroup() + +summary(direct.multipliers$emp.rev) +summary(direct.multipliers$ec.rev) + + +## ADD MULTIPLIERS ACROSS INDUSTRIES TO THE STATE X IMPACT TYPE LEVEL +statewide.indir.indu <- filter(statewide, ImpactType != "Direct") %>% + group_by(DestinationRegion,ImpactType) %>% + summarize(emp.rev = sum(emp.rev), + ec.rev = sum(ec.rev), + emp.li = sum(emp.li), + ec.li = sum(ec.li)) %>% + ungroup() + +test <- group_by(wh.tract.share, + w_tract_geocode,refinery_name) %>% + summarize(S000_share = sum(S000_share), + SI01_share = sum(SI01_share)) +summary(test$SI01_share) + +# EXPORT FILES TO CSV FOR TRACEY + +fwrite(direct.multipliers,'direct_multipliers_tract_2019.csv') +fwrite(statewide.indir.indu,'indirect_induced_multipliers_state.csv') + + From b1e354b14ddf1abc8e110d25158b6d5fbeadaf8d Mon Sep 17 00:00:00 2001 From: Tracey Mangin Date: Wed, 22 Oct 2025 08:47:06 -0700 Subject: [PATCH 08/11] move file (cleaning repo) --- .../debug_refinery_level_emission_factors.R | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {before-targets/exploratory => archive-from-repo}/debug_refinery_level_emission_factors.R (100%) diff --git a/before-targets/exploratory/debug_refinery_level_emission_factors.R b/archive-from-repo/debug_refinery_level_emission_factors.R similarity index 100% rename from before-targets/exploratory/debug_refinery_level_emission_factors.R rename to archive-from-repo/debug_refinery_level_emission_factors.R From e242c128ee2af6f422532e98a5fb8c189d4506ab Mon Sep 17 00:00:00 2001 From: Tracey Mangin Date: Fri, 24 Oct 2025 15:45:25 -0700 Subject: [PATCH 09/11] archive stata --- {stata => archive-from-repo/stata}/0_data_prep.do | 0 {stata => archive-from-repo/stata}/1_regressions_figures_stats.do | 0 {stata => archive-from-repo/stata}/clean_acs5_race_refining.do | 0 {stata => archive-from-repo/stata}/merge_acs_refining.do | 0 .../stata}/repo_clean_acs5_race_refining.do | 0 .../stata}/repo_merge_acs_refining_poverty_updated_ct.do | 0 .../stata}/repo_merge_acs_refining_updated_ct.do | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename {stata => archive-from-repo/stata}/0_data_prep.do (100%) rename {stata => archive-from-repo/stata}/1_regressions_figures_stats.do (100%) rename {stata => archive-from-repo/stata}/clean_acs5_race_refining.do (100%) rename {stata => archive-from-repo/stata}/merge_acs_refining.do (100%) rename {stata => archive-from-repo/stata}/repo_clean_acs5_race_refining.do (100%) rename {stata => archive-from-repo/stata}/repo_merge_acs_refining_poverty_updated_ct.do (100%) rename {stata => archive-from-repo/stata}/repo_merge_acs_refining_updated_ct.do (100%) diff --git a/stata/0_data_prep.do b/archive-from-repo/stata/0_data_prep.do similarity index 100% rename from stata/0_data_prep.do rename to archive-from-repo/stata/0_data_prep.do diff --git a/stata/1_regressions_figures_stats.do b/archive-from-repo/stata/1_regressions_figures_stats.do similarity index 100% rename from stata/1_regressions_figures_stats.do rename to archive-from-repo/stata/1_regressions_figures_stats.do diff --git a/stata/clean_acs5_race_refining.do b/archive-from-repo/stata/clean_acs5_race_refining.do similarity index 100% rename from stata/clean_acs5_race_refining.do rename to archive-from-repo/stata/clean_acs5_race_refining.do diff --git a/stata/merge_acs_refining.do b/archive-from-repo/stata/merge_acs_refining.do similarity index 100% rename from stata/merge_acs_refining.do rename to archive-from-repo/stata/merge_acs_refining.do diff --git a/stata/repo_clean_acs5_race_refining.do b/archive-from-repo/stata/repo_clean_acs5_race_refining.do similarity index 100% rename from stata/repo_clean_acs5_race_refining.do rename to archive-from-repo/stata/repo_clean_acs5_race_refining.do diff --git a/stata/repo_merge_acs_refining_poverty_updated_ct.do b/archive-from-repo/stata/repo_merge_acs_refining_poverty_updated_ct.do similarity index 100% rename from stata/repo_merge_acs_refining_poverty_updated_ct.do rename to archive-from-repo/stata/repo_merge_acs_refining_poverty_updated_ct.do diff --git a/stata/repo_merge_acs_refining_updated_ct.do b/archive-from-repo/stata/repo_merge_acs_refining_updated_ct.do similarity index 100% rename from stata/repo_merge_acs_refining_updated_ct.do rename to archive-from-repo/stata/repo_merge_acs_refining_updated_ct.do From 3c9665b38f1a80a5833b9183ea9582701768bf9c Mon Sep 17 00:00:00 2001 From: Tracey Mangin Date: Fri, 24 Oct 2025 16:03:45 -0700 Subject: [PATCH 10/11] udpate readme and target file for clarity --- README.md | 140 ++++++++++++++++++++++++++++++++++------------------- _targets.R | 4 +- 2 files changed, 94 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index c300b83..1af2f44 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,90 @@ # Distributional and climate impacts of low-carbon transition pathways for California's oil refining (repo) ## Setting up -This repo relies on the R package ``targets`` to maintain the pipeline of the scripts and the reproducibility of the project. -Install the package if you have not already done so: -``` +This repo relies on the R package `targets` to maintain the pipeline of the scripts and the reproducibility of the project. Install the package if you have not already done so: + +``` install.packages("targets") ``` Load the package: -``` +``` library(targets) ``` -All of the functions for the pipeline are in the ``R/`` folder. -To open the ``_targets.R`` script (which is where the workflow is built and specified), run: +All of the functions for the pipeline are in the `R/` folder. To open the `_targets.R` script (which is where the workflow is built and specified), run: -``` +``` tar_edit() ``` -## Changing the file directory - -**IMPORTANT**: Before running the pipeline, one thing needs to be changed -- the path to the ``calepa-cn`` folder. -Look for the ``user`` target: - -``` -tar_target(name = user, "meas"), -``` - -And replace the name in the quotations above with a specified user. +## Changing important user-specific `targets` + +**IMPORTANT**: Before running the pipeline, several things should be modified +to reflect user-specific specifications. The `setup_data_paths.R` file, which is +sources in the main `_targets.R` folder, should auto-configure paths. Make sure +the data folder has been moved into your main repo (note that this folder is not +tracked by git and therefore is not pulled into the repo). + +Next, set the `confidential_data_access` target option based on whether or not +you have access to the confidential datasets. The code is as follows: + +``` +tar_target(name = confidential_data_access, + command = FALSE), +``` + +where `FALSE` indicates that the user does not have access and `TRUE` indicates +access. Users with access will have a subfolder within the data folder called +`confidential-data`. + +Next, set the following target to reflect which values for `beta` and `cuf` +you are running: + +``` +## set module settings for specific run (cuf and beta) + tar_target(name = beta_scenario, command = "main"), ## UPDATE WITH ("main", "high", or "low") + tar_target( + name = beta, + command = ifelse( + beta_scenario == "low", + 0.00422068, + ifelse(beta_scenario == "high", 0.00737932, 0.00582) + ) + ), + + # Coefficient from Krewski et al (2009) for mortality impact + tar_target(name = ref_threshold, command = 0.6), + ``` + + where the target `beta_scenario` can be "main", "low", or "high" and + will be used for file saving name conventions and sets the `beta` target below. + + Finally, specify the `version` target to determine folder names for saving outputs: + + ``` + # list save paths (UPDATE VERSION AS NEEDED) + tar_target(name = version, command = "test-no-conf-data"), + +``` +where in this example will create a folder with `test-no-conf-data` in the name. + ## Using the repo to recreate the analysis ### Debugging the pipeline + In order to check the pipeline is engineered properly, run the following command: -``` +``` tar_manifest(fields=command) ``` The output should look something like: -``` + +``` # A tibble: 90 × 2 name command @@ -59,19 +101,20 @@ The output should look something like: # … with 80 more rows # ℹ Use `print(n = ...)` to see more rows ``` + If there are any issues (missing targets, bugs, etc), you should receive an error message. ### Running the pipeline To build and run the pipeline (this will execute everything), run: -``` +``` tar_make() ``` If you are running this for the first time, it should take a few minutes, but the outputs should look something like: -``` +``` • start target ei_crude • built target ei_crude [0.019 seconds] • start target ei_diesel @@ -87,23 +130,23 @@ If you are running this for the first time, it should take a few minutes, but th ... ``` -Assuming none of the targets change, the next time(s) you run ``tar_make()``, ``targets`` will skip building targets that are already up-to-date. +Assuming none of the targets change, the next time(s) you run `tar_make()`, `targets` will skip building targets that are already up-to-date. ### Viewing and loading targets -If you are new to ``targets`` you might be confused that there are no objects in your environment. That's because the objects are stored locally in a folder called ``_targets`` (in your local repo). +If you are new to `targets` you might be confused that there are no objects in your environment. That's because the objects are stored locally in a folder called `_targets` (in your local repo). -But let's say you want to inspect a specific object, like ``dt_its``. If you want to just view it in your console, you can enter: +But let's say you want to inspect a specific object, like `dt_its`. If you want to just view it in your console, you can enter: -``` +``` tar_read(dt_its) ``` -And that should print the ``data.table``. +And that should print the `data.table`. -If you want to load the ``data.table`` into your environment, you can run the following instead: +If you want to load the `data.table` into your environment, you can run the following instead: -``` +``` tar_load(dt_its) ``` @@ -111,7 +154,7 @@ You'll notice the object is in your environment. You can also view plots. Running the following line should either load the plot in your Plots window or open a new window with the plot: -``` +``` tar_read(fig_demand) ``` @@ -119,58 +162,57 @@ tar_read(fig_demand) If you want to visualize the pipeline, run: -``` +``` tar_visnetwork() ``` -You'll notice the diagram is very small -- you can use your mouse to zoom in on the objects if you'd like. If you make changes to the targets/pipeline and run ``tar_visnetwork()`` before running ``tar_make``, you can see the colors of the objects change. +You'll notice the diagram is very small -- you can use your mouse to zoom in on the objects if you'd like. If you make changes to the targets/pipeline and run `tar_visnetwork()` before running `tar_make`, you can see the colors of the objects change. ## Example of target changes and impacts on the pipeline Want an example of what happens when a target is changed? Here's an easy one: -1. Find the target ``ei_crude`` in ``_targets.R``: +1. Find the target `ei_crude` in `_targets.R`: -``` +``` tar_target(name = ei_crude, command = 5.698) ``` -2. Change the command value to something else, say 10 for example: +2. Change the command value to something else, say 10 for example: -``` +``` tar_target(name = ei_crude, command = 10) ``` -3. Save the script. Then run: +3. Save the script. Then run: -``` +``` tar_visnetwork() ``` -4. You'll see the diagram now looks different, with a few lines and points assigned a different color, representing "Outdated". These are the targets affected by the updated ``ei_crude``. Run ``tar_make()`` to rerun the pipeline with the new ``ei_crude`` value: +4. You'll see the diagram now looks different, with a few lines and points assigned a different color, representing "Outdated". These are the targets affected by the updated `ei_crude`. Run `tar_make()` to rerun the pipeline with the new `ei_crude` value: -``` +``` tar_make() ``` In the outputs you'll see that the targets that are affected are being updated, while the ones that are unaffected are not being rebuilt. -If you run ``tar_visnetwork()`` everything should be up-to-date now in the diagram. +If you run `tar_visnetwork()` everything should be up-to-date now in the diagram. **Remember to change the value of the target back to normal (by ctrl + z for example).** ## Output Structure and Git Tracking -This repository uses a standardized output structure defined in `structure.md` and `output_structure.csv`. -The `output_structure.csv` file specifies: +This repository uses a standardized output structure defined in `structure.md` and `output_structure.csv`. The `output_structure.csv` file specifies: -- `file_name`: The name of each output file -- `relative_path`: The path where the file should be saved (relative to `save_path`) -- `tracked`: Whether the file should be tracked in git (`YES` or `NO`) +- `file_name`: The name of each output file +- `relative_path`: The path where the file should be saved (relative to `save_path`) +- `tracked`: Whether the file should be tracked in git (`YES` or `NO`) ### Directory Structure -```text +``` text outputs/ version/ iteration/ @@ -195,14 +237,14 @@ outputs/ Two utility scripts help manage output files and git tracking: -1. `update_gitignore.R`: Updates all `.gitignore` files based on `output_structure.csv` -2. `verify_file_paths.R`: Verifies that all files in `_targets.R` are saved in the correct locations +1. `update_gitignore.R`: Updates all `.gitignore` files based on `output_structure.csv` +2. `verify_file_paths.R`: Verifies that all files in `_targets.R` are saved in the correct locations ### File Saving Conventions All file-producing targets in `_targets.R` should use the `simple_fwrite_repo` function: -```r +``` r simple_fwrite_repo( data = your_data, folder_path = NULL, # Not needed when using save_path and file_type diff --git a/_targets.R b/_targets.R index 35f8fe1..1f519a8 100644 --- a/_targets.R +++ b/_targets.R @@ -72,7 +72,9 @@ list( 0.00422068, ifelse(beta_scenario == "high", 0.00737932, 0.00582) ) - ), # Coefficient from Krewski et al (2009) for mortality impact + ), + + # Coefficient from Krewski et al (2009) for mortality impact tar_target(name = ref_threshold, command = 0.6), # list save paths (UPDATE VERSION AS NEEDED) From 44b10e7fe76b4cd4a9140b0d1901b442b05d4e28 Mon Sep 17 00:00:00 2001 From: Tracey Mangin Date: Fri, 24 Oct 2025 16:06:31 -0700 Subject: [PATCH 11/11] remove archived files --- archive-from-repo/age_vsl_test.R | 173 - archive-from-repo/archive/health_labor.R | 10906 ---------------- archive-from-repo/archive/labor_functions.R | 1088 -- archive-from-repo/compare-health-npv-plot.R | 16 - archive-from-repo/compare-labor-out.R | 63 - archive-from-repo/compare_demo.R | 80 - archive-from-repo/create_ct_xwalk.R | 59 - archive-from-repo/cumlutative_number_health.R | 57 - .../debug_refinery_level_emission_factors.R | 72 - .../srm_ratio_120pm25_pm25.png | Bin 112353 -> 0 bytes .../srm_ratio_120pm25_pm25_no_outliers.png | Bin 92885 -> 0 bytes .../exploratory-figs/srm_ratio_nh3_pm25.png | Bin 75989 -> 0 bytes .../srm_ratio_pollutant_pm25.png | Bin 135889 -> 0 bytes archive-from-repo/exploratory_health_figs.R | 50 - archive-from-repo/health_results.R | 157 - archive-from-repo/labor_check.R | 424 - archive-from-repo/labor_plots.R | 184 - .../labor_revisions_text_numbers.R | 511 - archive-from-repo/labor_text_numbers.R | 434 - archive-from-repo/ncomms_labor_multipliers.R | 515 - archive-from-repo/ncomms_labor_revisions.R | 687 - archive-from-repo/srm-120-exploration.R | 426 - archive-from-repo/stata/0_data_prep.do | 198 - .../stata/1_regressions_figures_stats.do | 304 - .../stata/clean_acs5_race_refining.do | 60 - archive-from-repo/stata/merge_acs_refining.do | 273 - .../stata/repo_clean_acs5_race_refining.do | 67 - ...o_merge_acs_refining_poverty_updated_ct.do | 177 - .../repo_merge_acs_refining_updated_ct.do | 283 - 29 files changed, 17264 deletions(-) delete mode 100644 archive-from-repo/age_vsl_test.R delete mode 100644 archive-from-repo/archive/health_labor.R delete mode 100644 archive-from-repo/archive/labor_functions.R delete mode 100644 archive-from-repo/compare-health-npv-plot.R delete mode 100644 archive-from-repo/compare-labor-out.R delete mode 100644 archive-from-repo/compare_demo.R delete mode 100644 archive-from-repo/create_ct_xwalk.R delete mode 100644 archive-from-repo/cumlutative_number_health.R delete mode 100644 archive-from-repo/debug_refinery_level_emission_factors.R delete mode 100644 archive-from-repo/exploratory-figs/srm_ratio_120pm25_pm25.png delete mode 100644 archive-from-repo/exploratory-figs/srm_ratio_120pm25_pm25_no_outliers.png delete mode 100644 archive-from-repo/exploratory-figs/srm_ratio_nh3_pm25.png delete mode 100644 archive-from-repo/exploratory-figs/srm_ratio_pollutant_pm25.png delete mode 100644 archive-from-repo/exploratory_health_figs.R delete mode 100644 archive-from-repo/health_results.R delete mode 100644 archive-from-repo/labor_check.R delete mode 100644 archive-from-repo/labor_plots.R delete mode 100644 archive-from-repo/labor_revisions_text_numbers.R delete mode 100644 archive-from-repo/labor_text_numbers.R delete mode 100644 archive-from-repo/ncomms_labor_multipliers.R delete mode 100644 archive-from-repo/ncomms_labor_revisions.R delete mode 100644 archive-from-repo/srm-120-exploration.R delete mode 100644 archive-from-repo/stata/0_data_prep.do delete mode 100644 archive-from-repo/stata/1_regressions_figures_stats.do delete mode 100644 archive-from-repo/stata/clean_acs5_race_refining.do delete mode 100644 archive-from-repo/stata/merge_acs_refining.do delete mode 100644 archive-from-repo/stata/repo_clean_acs5_race_refining.do delete mode 100644 archive-from-repo/stata/repo_merge_acs_refining_poverty_updated_ct.do delete mode 100644 archive-from-repo/stata/repo_merge_acs_refining_updated_ct.do diff --git a/archive-from-repo/age_vsl_test.R b/archive-from-repo/age_vsl_test.R deleted file mode 100644 index 71b9543..0000000 --- a/archive-from-repo/age_vsl_test.R +++ /dev/null @@ -1,173 +0,0 @@ -tar_load(ct_inc_45) -tar_load(growth_cap_rates) -tar_load(vsl_2019) -tar_load(health_weighted) -tar_load(beta) -tar_load(dt_age_vsl) -tar_load(income_elasticity_mort) -tar_load(discount_rate) - -############################################################### - -# for monetary mortality impact - growth in income for use in WTP function -growth_rates <- growth_cap_rates %>% - filter(year > 2019) %>% - mutate(cum_growth = cumprod(1 + growth_2035)) %>% - select(-growth_2035)%>% - drop_na(year) - -# Function to grow WTP -future_WTP <- function(elasticity, growth_rate, WTP) { - return(elasticity * growth_rate * WTP + WTP) -} - -#### VSL age cross-walk - -vsl_cross_walk <- dt_age_vsl %>% - filter(age_min > 29)%>% - select(-year)%>% - fuzzyjoin::fuzzy_left_join( - ct_inc_45 %>% - select(start_age, end_age) %>% - distinct()%>% - filter(start_age > 29), - by = c("age_min" = "start_age", - "age_max" = "end_age"), - match_fun = list(`>=`, `<=`))%>% - group_by(start_age)%>% - summarise(end_age = first(end_age), - age_VSL_2019 = mean(age_VSL_2019))%>% - drop_na(start_age)%>% - ungroup() - - -########### Add VSL 2019 by age group - -ct_inc_45_temp <- ct_inc_45 %>% - select(GEO_ID:end_age, year, pop, incidence_2015) %>% - filter(start_age > 29)%>% - left_join(vsl_cross_walk, by = c("start_age", "end_age"))%>% - mutate(age_VSL_2019 = ifelse(start_age>64, - dt_age_vsl %>% filter(age_min>61) %>% select(age_VSL_2019) %>% pull(), - age_VSL_2019)) - -########### Grow VSL - -# for monetary mortality impact - growth in income for use in WTP function -growth_rates <- growth_cap_rates %>% - filter(year > 2019) %>% - mutate(cum_growth = cumprod(1 + growth_2035)) %>% - select(-growth_2035)%>% - drop_na(year) - -# Function to grow WTP -future_WTP <- function(elasticity, growth_rate, WTP) { - return(elasticity * growth_rate * WTP + WTP) -} - -# Merge growth factors -ct_inc_45_temp <- ct_inc_45_temp%>% - mutate(VSL_2019 = vsl_2019) %>% - left_join(growth_rates, by = c("year" = "year")) %>% - mutate( - VSL = future_WTP( - income_elasticity_mort, - (cum_growth - 1), - VSL_2019 - ), - age_VSL = future_WTP( - income_elasticity_mort, - (cum_growth - 1), - age_VSL_2019 - )) - -########### Aggregate at census tract and year level - -ct_inc_pop_45_weighted <- ct_inc_45_temp %>% - group_by(GEO_ID, year) %>% - mutate( - ct_pop = sum(pop, na.rm = T), - share = pop / ct_pop, - weighted_incidence = sum(share * incidence_2015, na.rm = T), - weighted_monetized_incidence = sum(share * incidence_2015 * VSL, na.rm = T), - weighted_monetized_age_incidence = sum(share * incidence_2015 * age_VSL, na.rm = T), - weighted_monetized_age_incidence_2019 = sum(share * incidence_2015 * age_VSL_2019, na.rm = T)) %>% - summarize( - weighted_incidence = unique(weighted_incidence), - weighted_monetized_incidence = unique(weighted_monetized_incidence), - weighted_monetized_age_incidence = unique(weighted_monetized_age_incidence), - weighted_monetized_age_incidence_2019 = unique(weighted_monetized_age_incidence), - pop = unique(ct_pop) - ) %>% - ungroup() %>% - mutate(GEO_ID = str_remove(GEO_ID, "US")) - -# Delta of pollution change ###################################### - -# refining pm25 BAU -refining_BAU <- subset(health_weighted, (scen_id == "BAU historic production")) %>% - # refining_BAU<-subset(health_income,(scen_id=="BAU historic production"))%>% - rename(bau_total_pm25 = total_pm25) # %>% -# mutate(census_tract = paste0("0",census_tract)) - -# refining pm25 difference -deltas_refining <- health_weighted %>% - # deltas_refining<- health_income%>% - # mutate(census_tract = paste0("0",census_tract))%>% - # left_join(refining_BAU %>% select(-scen_id,-demand_scenario,-refining_scenario,-population:-median_hh_income),by=c("census_tract", "year"))%>% - left_join(refining_BAU %>% select(-scen_id, -demand_scenario, -refining_scenario, -ces4_score, -disadvantaged), by = c("census_tract", "year")) %>% - mutate(delta_total_pm25 = total_pm25 - bau_total_pm25) %>% - select(census_tract, scen_id:year, total_pm25:delta_total_pm25) - -## Merge demographic data to pollution scenarios - -ct_incidence_ca_poll <- deltas_refining %>% - right_join(ct_inc_pop_45_weighted, by = c("census_tract" = "GEO_ID", "year" = "year")) %>% - drop_na(scen_id) # CURRENTLY DROPPING ALL THE MISMATCHED 2010/2022 GEOIDs - -# Monetized mortality for adults (>=29 years old) by age-based VSL - -ct_mort_cost <- ct_incidence_ca_poll %>% - mutate( - mortality_delta = ((exp(beta * delta_total_pm25) - 1)) * weighted_incidence * pop, - mortality_level = ((exp(beta * total_pm25) - 1)) * weighted_incidence * pop, - benefit_delta = ((exp(beta * delta_total_pm25) - 1)) * weighted_monetized_incidence * pop, - benefit_level = ((exp(beta * total_pm25) - 1)) * weighted_monetized_incidence * pop, - benefit_age_delta = ((exp(beta * delta_total_pm25) - 1)) * weighted_monetized_age_incidence * pop, - benefit_age_delta_2019 = ((exp(beta * delta_total_pm25) - 1)) * weighted_monetized_age_incidence_2019 * pop, - benefit_age_level = ((exp(beta * total_pm25) - 1)) * weighted_monetized_age_incidence * pop - )%>% - group_by(year) %>% - mutate( - cost_2019_PV = benefit_age_delta_2019 / ((1 + discount_rate)^(year - 2019)), - cost_PV = benefit_age_delta / ((1 + discount_rate)^(year - 2019)) - )%>% - ungroup() - -# # #### Calculate the cost per premature mortality (old way)################ -# -# ct_health <- ct_incidence_ca_poll %>% -# mutate( -# mortality_delta = ((exp(beta * delta_total_pm25) - 1)) * weighted_incidence * pop, -# mortality_level = ((exp(beta * total_pm25) - 1)) * weighted_incidence * pop -# ) -# -# ct_mort_cost <- ct_health %>% -# mutate(VSL_2019 = vsl_2019) %>% -# left_join(growth_rates, by = c("year" = "year")) %>% -# mutate( -# VSL = future_WTP( -# income_elasticity_mort, -# (cum_growth - 1), -# VSL_2019 -# ), -# cost_2019 = mortality_delta * VSL_2019, -# cost = mortality_delta * VSL -# ) %>% -# group_by(year) %>% -# mutate( -# cost_2019_PV = cost_2019 / ((1 + discount_rate)^(year - 2019)), -# cost_PV = cost / ((1 + discount_rate)^(year - 2019)) -# ) - - diff --git a/archive-from-repo/archive/health_labor.R b/archive-from-repo/archive/health_labor.R deleted file mode 100644 index 0d2eb43..0000000 --- a/archive-from-repo/archive/health_labor.R +++ /dev/null @@ -1,10906 +0,0 @@ -## health and labor figures - -## labor SI figure -## ----------------------------------------------------------------------------- - -## NPV figure -plot_npv_labor_oilpx <- function( - main_path, - save_path, - state_ghg_output, - dt_ghg_2019, - annual_all_impacts_labor -) { - ## add ghg emission reduction - ## 2019 ghg - ghg_2019_val <- dt_ghg_2019$mtco2e[1] - - ## 2045 vs 2019 ghg - ghg_2045 <- state_ghg_output[year == 2045 & source == "total"] - setnames(ghg_2045, "value", "ghg_kg") - ghg_2045[, ghg_2045 := (ghg_kg / 1000) / 1e6] - ghg_2045[, ghg_2019 := ghg_2019_val] - ghg_2045[, perc_diff := (ghg_2045 - ghg_2019) / ghg_2019] - - perc_diff_df <- ghg_2045[, .( - demand_scenario, - refining_scenario, - ghg_2045, - ghg_2019, - perc_diff - )] - - ## summarize by scenario, filter for total - state_ghg_df <- state_ghg_output[ - source == "total", - .(total_ghg = sum(value)), - by = .(demand_scenario, refining_scenario) - ] - - state_ghg_df[, total_ghg_mmt := (total_ghg / 1000) / 1e6] - - ## reference - ref_df <- state_ghg_df[ - demand_scenario == "BAU" & refining_scenario == "historic production", - .(total_ghg_mmt) - ] - setnames(ref_df, "total_ghg_mmt", "ref_ghg_mmt") - ref_value <- ref_df$ref_ghg_mmt[1] - - ## merge with summarized df - state_ghg_df[, ref_ghg := ref_value] - state_ghg_df[, avoided_ghg := (total_ghg_mmt - ref_value) * -1] - - ## summarize labor for state - state_labor <- annual_all_impacts_labor[, - .( - # sum_total_emp = sum(total_emp), - sum_total_comp_pv_h = sum(comp_all_impacts_PV_h), - sum_total_comp_pv_l = sum(comp_all_impacts_PV_l, na.rm = T) - ), - by = .(demand_scenario, refining_scenario, oil_price_scenario) - ] - - ## ref labor - ref_labor <- state_labor[ - demand_scenario == "BAU" & refining_scenario == "historic production" - ] - setnames( - ref_labor, - c("sum_total_comp_pv_h", "sum_total_comp_pv_l"), - c("ref_total_comp_pv_h", "ref_total_comp_pv_l") - ) - ref_labor <- ref_labor[, .( - oil_price_scenario, - ref_total_comp_pv_l, - ref_total_comp_pv_h - )] - - ## add values to labor - state_labor_oil_px <- merge( - state_labor, - ref_labor, - by = c("oil_price_scenario") - ) - - ## compute forgone wages high and low - state_labor_oil_px[, - forgone_wages_bil_h := (sum_total_comp_pv_h - ref_total_comp_pv_h) / 1e9 - ] - state_labor_oil_px[, - forgone_wages_bil_l := (sum_total_comp_pv_l - ref_total_comp_pv_l) / 1e9 - ] - - ## merge with health and ghg - labor_ghg_df <- merge( - state_labor_oil_px[, .( - demand_scenario, - refining_scenario, - oil_price_scenario, - sum_total_comp_pv_h, - ref_total_comp_pv_h, - forgone_wages_bil_h, - sum_total_comp_pv_l, - ref_total_comp_pv_l, - forgone_wages_bil_l - )], - state_ghg_df, - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## add ghg perc reduction - labor_ghg_df <- merge( - labor_ghg_df, - perc_diff_df, - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## add scen id - labor_ghg_df[, scen_id := paste(demand_scenario, refining_scenario)] - - ## prepare to plot - plot_df <- labor_ghg_df[, .( - scen_id, - demand_scenario, - refining_scenario, - oil_price_scenario, - forgone_wages_bil_h, - forgone_wages_bil_l, - avoided_ghg, - perc_diff - )] - - setnames(plot_df, "perc_diff", "ghg_perc_diff") - - plot_df[, `:=`( - forgone_wages_bil_h_ghg = forgone_wages_bil_h / avoided_ghg, - forgone_wages_bil_l_ghg = forgone_wages_bil_l / avoided_ghg - )] - - plot_df_labor <- plot_df %>% - select( - scen_id, - demand_scenario, - refining_scenario, - oil_price_scenario, - ghg_perc_diff, - forgone_wages_bil_h, - forgone_wages_bil_l, - forgone_wages_bil_h_ghg, - forgone_wages_bil_l_ghg - ) %>% - pivot_longer( - forgone_wages_bil_h:forgone_wages_bil_l_ghg, - names_to = "metric", - values_to = "value" - ) %>% - mutate( - segment = "labor", - unit_desc = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_l"), - "USD billion", - "USD billion per GHG" - ), - estimate = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_h_ghg"), - "high", - "low" - ), - metric = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_l"), - "forgone_wages_bil", - "forgone_wages_bil_ghg" - ) - ) %>% - select( - scen_id, - demand_scenario, - refining_scenario, - oil_price_scenario, - ghg_perc_diff, - segment, - metric, - unit_desc, - estimate, - value - ) %>% - pivot_wider(names_from = estimate, values_from = value) - - ## prepare labor ---------------------- - plot_df_labor <- plot_df_labor %>% - mutate( - title = ifelse( - metric == "forgone_wages_bil", - "Labor: forgone wages", - "Labor: forgone wages per avoided GHG" - ) - ) - - plot_df_labor$title <- factor( - plot_df_labor$title, - levels = c("Labor: forgone wages", "Labor: forgone wages per avoided GHG") - ) - - ## rename - setDT(plot_df_labor) - plot_df_labor[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - plot_df_labor[, scenario := gsub("LC1.", "Low ", scenario)] - - ## refactor - plot_df_labor$scenario <- factor( - plot_df_labor$scenario, - levels = c( - "BAU demand - historic production", - "BAU demand - historic exports", - "BAU demand - low exports", - "Low demand - historic exports", - "Low demand - low exports", - "Low demand - historic production" - ) - ) - - ## convert value of scaled outputs (by ghg) to millions, add unit column - plot_df_labor[, - high := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - high * 1000, - high - ) - ] - plot_df_labor[, - low := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - low * 1000, - low - ) - ] - plot_df_labor[, - metric := fifelse( - metric == "forgone_wages_bil_ghg", - "forgone_wages_ghg", - metric - ) - ] - plot_df_labor[, - unit := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_ghg"), - "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)", - "NPV (2019 USD billion)" - ) - ] - - ## change historic to historical - plot_df_labor[, scen_id := str_replace(scen_id, "historic", "historical")] - plot_df_labor[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - plot_df_labor[, scenario := str_replace(scenario, "historic", "historical")] - - ## has oil price label - plot_df_labor[, - oil_px_label := ifelse( - oil_price_scenario == "reference case", - "Reference", - ifelse(oil_price_scenario == "high oil price", "High", "Low") - ) - ] - - plot_df_labor$oil_px_label <- factor( - plot_df_labor$oil_px_label, - levels = c("Low", "Reference", "High") - ) - - ## save figure inputs - fwrite( - plot_df_labor, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_npv_fig_inputs_labor_all_oilpx.csv" - ) - ) - # fwrite(plot_df_labor, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_npv_fig_inputs_labor.csv")) - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - bau_scen <- "BAU historical production" - - ## make the plot - ## --------------------------------------------------- - - ## color for refining scenario - refin_colors <- c( - "LC1 low exports" = "#729b79", - "LC1 historical exports" = "#2F4858", - "BAU low exports" = "#F6AE2D", - "BAU historical exports" = "#F26419" - ) - - refin_labs <- c( - "LC1 low exports" = "Low demand, low exports", - "LC1 historical exports" = "Low demand, historical exports", - "BAU low exports" = "BAU demand, low exports", - "BAU historical exports" = "BAU demand, historical exports" - ) - - ## figs - make each separately - ## ------------------------------------------------------------------- - - hist_prod <- as.data.table( - plot_df_labor %>% - filter( - scen_id == bau_scen, - oil_price_scenario == "reference case", - unit == "NPV (2019 USD billion)" - ) - ) - - ## - forgone_wages_all_oil_px_fig <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - geom_vline( - xintercept = hist_prod$ghg_perc_diff * -100, - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historical production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), linewidth = 0.5, alpha = 0.8) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historical production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = low, color = scen_id), - shape = 16, - size = 3, - alpha = 0.9 - ) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historical production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = high, color = scen_id), - shape = 1, - size = 3, - alpha = 0.9 - ) + - facet_wrap(~oil_px_label) + - labs( - color = NULL, - title = "Labor: forgone wages", - y = "NPV (2019 USD billion)", - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-90, 10) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 2)) - - return(forgone_wages_all_oil_px_fig) -} - - -## ----------------------------------------------------------------------------- -## NPV figure: main text -## ----------------------------------------------------------------------------- - -## NPV figure -plot_npv_health_labor <- function( - main_path, - save_path, - refining_mortality, - state_ghg_output, - dt_ghg_2019, - annual_all_impacts_labor -) { - npv_df <- refining_mortality %>% as.data.table() - - ## state level - state_npv_df <- npv_df[, - .( - sum_cost_2019_pv = sum(cost_2019_PV), ## constant VSL - sum_cost_pv = sum(cost_PV) - ), ## changing VSL - by = .(scen_id, demand_scenario, refining_scenario) - ] - - ## add column - state_npv_df[, sum_cost_2019_pv_b := sum_cost_2019_pv / 1e9] - state_npv_df[, sum_cost_pv_b := sum_cost_pv / 1e9] - - ## add ghg emission reduction - ## 2019 ghg - ghg_2019_val <- dt_ghg_2019$mtco2e[1] - - ## 2045 vs 2019 ghg - ghg_2045 <- state_ghg_output[year == 2045 & source == "total"] - setnames(ghg_2045, "value", "ghg_kg") - ghg_2045[, ghg_2045 := (ghg_kg / 1000) / 1e6] - ghg_2045[, ghg_2019 := ghg_2019_val] - ghg_2045[, perc_diff := (ghg_2045 - ghg_2019) / ghg_2019] - - perc_diff_df <- ghg_2045[, .( - demand_scenario, - refining_scenario, - ghg_2045, - ghg_2019, - perc_diff - )] - - ## summarize by scenario, filter for total - state_ghg_df <- state_ghg_output[ - source == "total", - .(total_ghg = sum(value)), - by = .(demand_scenario, refining_scenario) - ] - - state_ghg_df[, total_ghg_mmt := (total_ghg / 1000) / 1e6] - - ## reference - ref_df <- state_ghg_df[ - demand_scenario == "BAU" & refining_scenario == "historic production", - .(total_ghg_mmt) - ] - setnames(ref_df, "total_ghg_mmt", "ref_ghg_mmt") - ref_value <- ref_df$ref_ghg_mmt[1] - - ## merge with summarized df - state_ghg_df[, ref_ghg := ref_value] - state_ghg_df[, avoided_ghg := (total_ghg_mmt - ref_value) * -1] - - ## merge with health - health_ghg_df <- merge( - state_npv_df, - state_ghg_df[, .( - demand_scenario, - refining_scenario, - total_ghg_mmt, - ref_ghg, - avoided_ghg - )], - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## summarize labor for state - state_labor <- annual_all_impacts_labor[, - .( - # sum_total_emp = sum(total_emp), - sum_total_comp_pv_h = sum(comp_all_impacts_PV_h), - sum_total_comp_pv_l = sum(comp_all_impacts_PV_l, na.rm = T) - ), - by = .(demand_scenario, refining_scenario, oil_price_scenario) - ] - - state_labor <- state_labor[oil_price_scenario == "reference case", ] - - ## ref labor - ref_labor <- state_labor[ - demand_scenario == "BAU" & refining_scenario == "historic production" - ] - setnames( - ref_labor, - c("sum_total_comp_pv_h", "sum_total_comp_pv_l"), - c("ref_total_comp_pv_h", "ref_total_comp_pv_l") - ) - # setnames(ref_labor, c("sum_total_emp", "sum_total_comp_pv_h", "sum_total_comp_pv_l"), c("ref_total_emp", "ref_total_comp_pv_h", "ref_total_comp_pv_l")) - - ## add values to labor - state_labor[, `:=`( - # ref_total_emp = ref_labor$ref_total_emp[1], - ref_total_comp_pv_h = ref_labor$ref_total_comp_pv_h[1], - ref_total_comp_pv_l = ref_labor$ref_total_comp_pv_l[1] - )] - - state_labor[, - forgone_wages_bil_h := (sum_total_comp_pv_h - ref_total_comp_pv_h) / 1e9 - ] - state_labor[, - forgone_wages_bil_l := (sum_total_comp_pv_l - ref_total_comp_pv_l) / 1e9 - ] - - ## merge with health and ghg - health_labor_ghg_df <- merge( - health_ghg_df, - state_labor[, .( - demand_scenario, - refining_scenario, - oil_price_scenario, - sum_total_comp_pv_h, - ref_total_comp_pv_h, - forgone_wages_bil_h, - sum_total_comp_pv_l, - ref_total_comp_pv_l, - forgone_wages_bil_l - )], - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## add ghg perc reduction - health_labor_ghg_df <- merge( - health_labor_ghg_df, - perc_diff_df, - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## prepare to plot - plot_df <- health_labor_ghg_df[, .( - scen_id, - demand_scenario, - refining_scenario, - oil_price_scenario, - sum_cost_pv_b, - sum_cost_2019_pv_b, - forgone_wages_bil_h, - forgone_wages_bil_l, - avoided_ghg, - perc_diff - )] - - setnames(plot_df, "perc_diff", "ghg_perc_diff") - - ## add values / avoided ghgs - plot_df[, avoided_health_cost := sum_cost_2019_pv_b * -1] - plot_df[, avoided_health_cost_annual_vsl := sum_cost_pv_b * -1] - plot_df[, sum_cost_2019_pv_b := NULL] - plot_df[, sum_cost_pv_b := NULL] - - plot_df[, `:=`( - avoided_health_cost_ghg = avoided_health_cost / avoided_ghg, - avoided_health_cost_ghg_vsl2 = avoided_health_cost_annual_vsl / avoided_ghg, - forgone_wages_bil_h_ghg = forgone_wages_bil_h / avoided_ghg, - forgone_wages_bil_l_ghg = forgone_wages_bil_l / avoided_ghg - )] - - plot_df_health <- plot_df %>% - select( - scen_id, - demand_scenario, - refining_scenario, - ghg_perc_diff, - avoided_health_cost, - avoided_health_cost_annual_vsl, - avoided_health_cost_ghg, - avoided_health_cost_ghg_vsl2 - ) %>% - pivot_longer( - avoided_health_cost:avoided_health_cost_ghg_vsl2, - names_to = "metric", - values_to = "value" - ) - - ## add column for vsl - plot_df_health <- plot_df_health %>% - mutate( - segment = "health", - unit_desc = ifelse( - metric == "avoided_health_cost", - "USD billion (2019 VSL)", - ifelse( - metric == "avoided_health_cost_annual_vsl", - "USD billion (annual VSL)", - ifelse( - metric == "avoided_health_cost_ghg", - "USD billion per GHG (2019 VSL)", - "USD billion per GHG (annual VSL)" - ) - ) - ), - metric = ifelse( - metric %in% c("avoided_health_cost", "avoided_health_cost_annual_vsl"), - "avoided_health_cost", - "avoided_health_cost_ghg" - ) - ) - - plot_df_labor <- plot_df %>% - select( - scen_id, - demand_scenario, - refining_scenario, - oil_price_scenario, - ghg_perc_diff, - forgone_wages_bil_h, - forgone_wages_bil_l, - forgone_wages_bil_h_ghg, - forgone_wages_bil_l_ghg - ) %>% - pivot_longer( - forgone_wages_bil_h:forgone_wages_bil_l_ghg, - names_to = "metric", - values_to = "value" - ) %>% - mutate( - segment = "labor", - unit_desc = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_l"), - "USD billion", - "USD billion per GHG" - ), - estimate = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_h_ghg"), - "high", - "low" - ), - metric = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_l"), - "forgone_wages_bil", - "forgone_wages_bil_ghg" - ) - ) %>% - select( - scen_id, - demand_scenario, - refining_scenario, - ghg_perc_diff, - segment, - metric, - unit_desc, - estimate, - value - ) %>% - pivot_wider(names_from = estimate, values_from = value) - - # plot_df_long <- rbind(plot_df_health, plot_df_labor) - - ## prepare health for plotting ------------------------------ - plot_df_health <- plot_df_health %>% - mutate( - title = ifelse( - metric == "avoided_health_cost", - "Health: avoided mortality", - "Health: avoided mortality per avoided GHG" - ) - ) - - plot_df_health$title <- factor( - plot_df_health$title, - levels = c( - "Health: avoided mortality", - "Health: avoided mortality per avoided GHG" - ) - ) - - ## rename - setDT(plot_df_health) - plot_df_health[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - plot_df_health[, scenario := gsub("LC1.", "Low ", scenario)] - # plot_df_long[, scenario := gsub('BAU', 'Reference', scenario)] - # plot_df_long[, short_scen := gsub('BAU', 'Reference', short_scen)] - # plot_df_long[, short_scen := gsub('Low C.', 'Low carbon', short_scen)] - - ## refactor - plot_df_health$scenario <- factor( - plot_df_health$scenario, - levels = c( - "BAU demand - historic production", - "BAU demand - historic exports", - "BAU demand - low exports", - "Low demand - historic exports", - "Low demand - low exports", - "Low demand - historic production" - ) - ) - - ## convert value of scaled outputs (by ghg) to millions, add unit column - plot_df_health[, - value := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - value * 1000, - value - ) - ] - plot_df_health[, - metric := fifelse( - metric == "forgone_wages_bil_ghg", - "forgone_wages_ghg", - metric - ) - ] - plot_df_health[, - unit := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_ghg"), - "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)", - "NPV (2019 USD billion)" - ) - ] - - ## change historic to historical - plot_df_health[, scen_id := str_replace(scen_id, "historic", "historical")] - plot_df_health[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - plot_df_health[, scenario := str_replace(scenario, "historic", "historical")] - - ## save figure inputs - fwrite( - plot_df_health, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_npv_fig_inputs_health.csv" - ) - ) - # fwrite(plot_df_health, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_npv_fig_inputs_health.csv")) - - ## prepare labor ---------------------- - plot_df_labor <- plot_df_labor %>% - mutate( - title = ifelse( - metric == "forgone_wages_bil", - "Labor: forgone wages", - "Labor: forgone wages per avoided GHG" - ) - ) - - plot_df_labor$title <- factor( - plot_df_labor$title, - levels = c("Labor: forgone wages", "Labor: forgone wages per avoided GHG") - ) - - ## rename - setDT(plot_df_labor) - plot_df_labor[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - plot_df_labor[, scenario := gsub("LC1.", "Low ", scenario)] - # plot_df_long[, scenario := gsub('BAU', 'Reference', scenario)] - # plot_df_long[, short_scen := gsub('BAU', 'Reference', short_scen)] - # plot_df_long[, short_scen := gsub('Low C.', 'Low carbon', short_scen)] - - ## refactor - plot_df_labor$scenario <- factor( - plot_df_labor$scenario, - levels = c( - "BAU demand - historic production", - "BAU demand - historic exports", - "BAU demand - low exports", - "Low demand - historic exports", - "Low demand - low exports", - "Low demand - historic production" - ) - ) - - ## convert value of scaled outputs (by ghg) to millions, add unit column - plot_df_labor[, - high := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - high * 1000, - high - ) - ] - plot_df_labor[, - low := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - low * 1000, - low - ) - ] - plot_df_labor[, - metric := fifelse( - metric == "forgone_wages_bil_ghg", - "forgone_wages_ghg", - metric - ) - ] - plot_df_labor[, - unit := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_ghg"), - "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)", - "NPV (2019 USD billion)" - ) - ] - - ## change historic to historical - plot_df_labor[, scen_id := str_replace(scen_id, "historic", "historical")] - plot_df_labor[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - plot_df_labor[, scenario := str_replace(scenario, "historic", "historical")] - - ## save figure inputs - fwrite( - plot_df_labor, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_npv_fig_inputs_labor.csv" - ) - ) - # fwrite(plot_df_labor, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_npv_fig_inputs_labor.csv")) - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - bau_scen <- "BAU historical production" - - ## make the plot - ## --------------------------------------------------- - - ## color for refining scenario - refin_colors <- c( - "LC1 low exports" = "#729b79", - "LC1 historical exports" = "#2F4858", - "BAU low exports" = "#F6AE2D", - "BAU historical exports" = "#F26419" - ) - - refin_labs <- c( - "LC1 low exports" = "Low demand, low exports", - "LC1 historical exports" = "Low demand, historical exports", - "BAU low exports" = "BAU demand, low exports", - "BAU historical exports" = "BAU demand, historical exports" - ) - - ## refactor - # plot_df_health$scen_id <- factor(plot_df_health$scen_id, levels = c('LC1 low exports', - # 'LC1 historical production', - # 'BAU demand\nlow exports', - # 'Low demand\nhistorical exports', - # 'Low demand\nlow exports', - # 'Low demand\nhistorical production')) - # - - ## figs - make each separately - ## ------------------------------------------------------------------- - - hist_prod <- as.data.table( - plot_df_health %>% - filter( - scen_id == bau_scen, - unit == "NPV (2019 USD billion)", - unit_desc == "USD billion (2019 VSL)" - ) - ) - - fig_bxm_a <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - geom_point( - data = plot_df_health %>% - filter( - !scen_id %in% remove_scen, - title == "Health: avoided mortality", - unit == "NPV (2019 USD billion)", - unit_desc == "USD billion (2019 VSL)", - !refining_scenario == "historical production" - ), - aes(x = ghg_perc_diff * -100, y = value, color = scen_id), - shape = 16, - size = 3, - alpha = 0.9 - ) + - labs( - color = NULL, - title = "Health: avoided mortality", - y = "NPV (2019 USD billion)", - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(0, 60) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 2)) - - # ## make separete df for labor high and low for plotting - # plot_df_labor_pts <- plot_df_labor %>% - # filter(!scen_id %in% remove_scen, - # title == "Labor: forgone wages", - # unit == "NPV (2019 USD billion)", - # refining_scenario != "historical production") %>% - # select(scen_id, demand_scenario, refining_scenario, scenario, ghg_perc_diff, high, low) %>% - # pivot_longer(high:low, names_to = "estimate", values_to = "npv_2019_usd_billion") - # - fig_bxm_b <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historical production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), linewidth = 0.5, alpha = 0.8) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historical production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = low, color = scen_id), - shape = 16, - size = 3, - alpha = 0.9 - ) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historical production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = high, color = scen_id), - shape = 1, - size = 3, - alpha = 0.9 - ) + - labs( - color = NULL, - title = "Labor: forgone wages", - y = NULL, - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-60, 0) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 2)) - - ## legends - low_legend_fig <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), size = 0.5, alpha = 0.8) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historic production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = low, color = scen_id), - shape = 16, - size = 3, - alpha = 1 - ) + - # geom_point(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, y = high, color = scen_id), shape = 1, size = 3, alpha = 0.8) + - labs( - color = "with re-emp:", - title = "Labor: forgone wages", - y = NULL, - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-60, 0) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - legend.title = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 1)) - - low_legend <- get_legend( - low_legend_fig - ) - - ## save legends - ggsave( - plot = low_legend, - device = "pdf", - filename = "fig3_low_legend.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - ## legends - high_legend_fig <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), size = 0.5, alpha = 0.8) + - # geom_point(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, y = low, color = scen_id), shape = 16, size = 3, alpha = 1) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historic production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = high, color = scen_id), - shape = 1, - size = 3, - alpha = 0.8 - ) + - labs( - color = "no re-emp:", - title = "Labor: forgone wages", - y = NULL, - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-60, 0) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - legend.title = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 1)) - - high_legend <- get_legend( - high_legend_fig - ) - - ## save legends - ggsave( - plot = high_legend, - device = "pdf", - filename = "fig3_high_legend.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - # fig_bxm_c <- ggplot() + - # geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - # geom_vline(xintercept = hist_prod[title == "Climate: avoided damage", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_point(data = plot_df_long %>% filter(!scen_id %in% remove_scen, - # title == "Climate: avoided damage", - # unit == "NPV (2019 USD billion)", - # !refining_scenario == "historic production"), aes(x = ghg_perc_diff * -100, y = value, color = refining_scenario, shape = demand_scenario), size = 3, alpha = 0.8) + - # geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - # labs(color = "Policy", - # title = "C. Climate: avoided damage", - # y = NULL, - # x = NULL) + - # ylim(-1, 20) + - # xlim(0, 80) + - # scale_color_manual(values = refin_colors) + - # theme_line + - # theme(legend.position = "none", - # plot.title = element_text(hjust = 0), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # axis.ticks.length.y = unit(0.1, 'cm'), - # axis.ticks.length.x = unit(0.1, 'cm')) - - # fig_bxm_c <- ggplot() + - # geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - # geom_vline(xintercept = hist_prod[title == "Health: avoided mortality", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_point(data = plot_df_long %>% filter(!scen_id %in% remove_scen, - # title == "Health: avoided mortality per avoided GHG", - # unit == "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)", - # unit_desc == "USD billion per GHG (2019 VSL)", - # !refining_scenario == "historic production"), aes(x = ghg_perc_diff * -100, y = value, color = refining_scenario, shape = demand_scenario), size = 3, alpha = 0.8) + - # labs(color = "Policy", - # title = "C.", - # y = bquote('NPV (2019 USD million)\nper avoided GHG MtCO'[2]~e), - # x = "GHG emissions reduction (%, 2045 vs 2019)") + - # scale_color_manual(values = refin_colors) + - # ylim(0, 125) + - # xlim(0, 80) + - # theme_line + - # theme(legend.position = "none", - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # axis.ticks.length.y = unit(0.1, 'cm'), - # axis.ticks.length.x = unit(0.1, 'cm')) - # - # fig_bxm_d <- ggplot() + - # geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages per avoided GHG", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_point(data = plot_df_long %>% filter(!scen_id %in% remove_scen, - # title == "Labor: forgone wages per avoided GHG", - # unit == "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)", - # !refining_scenario == "historic production"), aes(x = ghg_perc_diff * -100, y = value, color = refining_scenario, shape = demand_scenario), size = 3, alpha = 0.8) + - # labs(color = "Policy", - # title = "D.", - # y = NULL, - # # y = paste("NPV per avoied GHG ", bquotelab, "(2020 USD million / ", bquotelab), - # x = "GHG emissions reduction (%, 2045 vs 2019)") + - # scale_color_manual(values = refin_colors) + - # theme_line + - # xlim(0, 80) + - # ylim(-125, 0) + - # theme(legend.position = "none", - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # axis.ticks.length.y = unit(0.1, 'cm'), - # axis.ticks.length.x = unit(0.1, 'cm')) - - # fig_bxm_f <- ggplot() + - # geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - # geom_vline(xintercept = hist_prod[title == "Health: avoided mortality", ghg_2045_perc_reduction], color = "darkgray", lty = 2) + - # geom_point(data = npv_dt %>% filter(!scen_id %in% bau_scens, - # title == "Climate: avoided damage", - # measure == "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)", - # !refining_scenario == "historic production"), aes(x = ghg_2045_perc_reduction, y = value, color = refining_scenario, shape = demand_scenario), size = 3, alpha = 0.8) + - # labs(color = "Policy", - # title = "F.", - # y = NULL, - # # y = paste("NPV per avoied GHG ", bquotelab, "(2020 USD million / ", bquotelab), - # x = "GHG emissions reduction target (%, 2045 vs 2019)") + - # scale_color_manual(values = refin_colors) + - # theme_line + - # ylim(0, 80) + - # xlim(0, 80) + - # theme(legend.position = "none", - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # axis.ticks.length.y = unit(0.1, 'cm'), - # axis.ticks.length.x = unit(0.1, 'cm')) - # - ## extract legend - # legend_fig <- ggplot() + - # geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - # geom_point(data = npv_dt %>% filter(!scen_id %in% bau_scens, - # title == "Labor: forgone wages", - # measure == "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)"), aes(x = ghg_2045_perc_reduction, y = value, color = scenario, shape = scenario), size = 3, alpha = 0.8) + - # labs(title = "", - # y = NULL, - # # y = paste("NPV per avoied GHG ", bquotelab, "(2020 USD million / ", bquotelab), - # x = "GHG emissions reduction target (%, 2045 vs 2019)", - # color = NULL, - # shape = NULL) + - # # scale_shape_manual(values = c(16, 16, 16, 17, 17)) + - # scale_color_manual(name = "", - # labels = c("BAU demand - historic exports", - # "BAU demand - historic production", - # "BAU demand - low exports", - # "Low C. demand - historic exports", - # "Low C. demand - low exports"), - # values = c("BAU demand - historic exports" = "#2F4858", - # "BAU demand - historic production" = "#F6AE2D", - # "BAU demand - low exports" = "#F26419", - # "Low C. demand - historic exports" = "#2F4858", - # "Low C. demand - low exports" = "#F26419")) + - # scale_shape_manual(name = "", - # labels = c("BAU demand - historic exports", - # "BAU demand - historic production", - # "BAU demand - low exports", - # "Low C. demand - historic exports", - # "Low C. demand - low exports"), - # values = c(16, 16, 16, 17, 17)) + - # theme_line + - # theme(legend.position = "bottom", - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # axis.ticks.length.y = unit(0.1, 'cm'), - # axis.ticks.length.x = unit(0.1, 'cm')) + - # guides(color = guide_legend(nrow = 2, byrow = TRUE)) - - ## combine figure - ## --------------------------------- - - ## shared x axis - xaxis_lab <- ggdraw() + - draw_label("GHG emissions reduction (%, 2045 vs 2019)", size = 12) - - fig3_plot_grid_ab <- plot_grid( - fig_bxm_a, - fig_bxm_b, - align = "vh", - labels = c("A", "B"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - rel_widths = c(1, 1) - ) - - # fig3_plot_grid2 <- plot_grid( - # fig3_plot_grid_ab, - # align = "v", - # # labels = c("(A)", "(B)", "(C)", ""), - # # # labels = 'AUTO', - # # label_size = 10, - # # hjust = -1, - # ncol = 1, - # rel_heights = c(0.95, 0.05) - # # rel_widths = c(1, 1), - # ) - - return(fig3_plot_grid_ab) -} - - -## ----------------------------------------------------------------------------- -## NPV figure: refinery level emission factors -## ----------------------------------------------------------------------------- - -## NPV figure -plot_npv_health_labor_ref <- function( - main_path, - save_path, - refining_mortality, - state_ghg_output, - dt_ghg_2019, - annual_labor -) { - npv_df <- refining_mortality %>% as.data.table() - - ## state level - state_npv_df <- npv_df[, - .( - sum_cost_2019_pv = sum(cost_2019_PV), ## constant VSL - sum_cost_pv = sum(cost_PV) - ), ## changing VSL - by = .(scen_id, demand_scenario, refining_scenario) - ] - - ## add column - state_npv_df[, sum_cost_2019_pv_b := sum_cost_2019_pv / 1e9] - state_npv_df[, sum_cost_pv_b := sum_cost_pv / 1e9] - - ## add ghg emission reduction - ## 2019 ghg - ghg_2019_val <- dt_ghg_2019$mtco2e[1] - - ## 2045 vs 2019 ghg - ghg_2045 <- state_ghg_output[year == 2045 & source == "total"] - setnames(ghg_2045, "value", "ghg_kg") - ghg_2045[, ghg_2045 := (ghg_kg / 1000) / 1e6] - ghg_2045[, ghg_2019 := ghg_2019_val] - ghg_2045[, perc_diff := (ghg_2045 - ghg_2019) / ghg_2019] - - perc_diff_df <- ghg_2045[, .( - demand_scenario, - refining_scenario, - ghg_2045, - ghg_2019, - perc_diff - )] - - ## summarize by scenario, filter for total - state_ghg_df <- state_ghg_output[ - source == "total", - .(total_ghg = sum(value)), - by = .(demand_scenario, refining_scenario) - ] - - state_ghg_df[, total_ghg_mmt := (total_ghg / 1000) / 1e6] - - ## reference - ref_df <- state_ghg_df[ - demand_scenario == "BAU" & refining_scenario == "historic production", - .(total_ghg_mmt) - ] - setnames(ref_df, "total_ghg_mmt", "ref_ghg_mmt") - ref_value <- ref_df$ref_ghg_mmt[1] - - ## merge with summarized df - state_ghg_df[, ref_ghg := ref_value] - state_ghg_df[, avoided_ghg := (total_ghg_mmt - ref_value) * -1] - - ## merge with health - health_ghg_df <- merge( - state_npv_df, - state_ghg_df[, .( - demand_scenario, - refining_scenario, - total_ghg_mmt, - ref_ghg, - avoided_ghg - )], - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## summarize labor for state - state_labor <- annual_labor[, - .( - sum_total_emp = sum(total_emp), - sum_total_comp_pv_h = sum(total_comp_PV_h), - sum_total_comp_pv_l = sum(total_comp_PV_l) - ), - by = .(demand_scenario, refining_scenario, oil_price_scenario) - ] - - state_labor <- state_labor[oil_price_scenario == "reference case", ] - - ## ref labor - ref_labor <- state_labor[ - demand_scenario == "BAU" & refining_scenario == "historic production" - ] - setnames( - ref_labor, - c("sum_total_emp", "sum_total_comp_pv_h", "sum_total_comp_pv_l"), - c("ref_total_emp", "ref_total_comp_pv_h", "ref_total_comp_pv_l") - ) - - ## add values to labor - state_labor[, `:=`( - ref_total_emp = ref_labor$ref_total_emp[1], - ref_total_comp_pv_h = ref_labor$ref_total_comp_pv_h[1], - ref_total_comp_pv_l = ref_labor$ref_total_comp_pv_l[1] - )] - - state_labor[, - forgone_wages_bil_h := (sum_total_comp_pv_h - ref_total_comp_pv_h) / 1e9 - ] - state_labor[, - forgone_wages_bil_l := (sum_total_comp_pv_l - ref_total_comp_pv_l) / 1e9 - ] - - ## merge with health and ghg - health_labor_ghg_df <- merge( - health_ghg_df, - state_labor[, .( - demand_scenario, - refining_scenario, - oil_price_scenario, - sum_total_comp_pv_h, - ref_total_comp_pv_h, - forgone_wages_bil_h, - sum_total_comp_pv_l, - ref_total_comp_pv_l, - forgone_wages_bil_l - )], - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## add ghg perc reduction - health_labor_ghg_df <- merge( - health_labor_ghg_df, - perc_diff_df, - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## prepare to plot - plot_df <- health_labor_ghg_df[, .( - scen_id, - demand_scenario, - refining_scenario, - oil_price_scenario, - sum_cost_pv_b, - sum_cost_2019_pv_b, - forgone_wages_bil_h, - forgone_wages_bil_l, - avoided_ghg, - perc_diff - )] - - setnames(plot_df, "perc_diff", "ghg_perc_diff") - - ## add values / avoided ghgs - plot_df[, avoided_health_cost := sum_cost_2019_pv_b * -1] - plot_df[, avoided_health_cost_annual_vsl := sum_cost_pv_b * -1] - plot_df[, sum_cost_2019_pv_b := NULL] - plot_df[, sum_cost_pv_b := NULL] - - plot_df[, `:=`( - avoided_health_cost_ghg = avoided_health_cost / avoided_ghg, - avoided_health_cost_ghg_vsl2 = avoided_health_cost_annual_vsl / avoided_ghg, - forgone_wages_bil_h_ghg = forgone_wages_bil_h / avoided_ghg, - forgone_wages_bil_l_ghg = forgone_wages_bil_l / avoided_ghg - )] - - plot_df_health <- plot_df %>% - select( - scen_id, - demand_scenario, - refining_scenario, - ghg_perc_diff, - avoided_health_cost, - avoided_health_cost_annual_vsl, - avoided_health_cost_ghg, - avoided_health_cost_ghg_vsl2 - ) %>% - pivot_longer( - avoided_health_cost:avoided_health_cost_ghg_vsl2, - names_to = "metric", - values_to = "value" - ) - - ## add column for vsl - plot_df_health <- plot_df_health %>% - mutate( - segment = "health", - unit_desc = ifelse( - metric == "avoided_health_cost", - "USD billion (2019 VSL)", - ifelse( - metric == "avoided_health_cost_annual_vsl", - "USD billion (annual VSL)", - ifelse( - metric == "avoided_health_cost_ghg", - "USD billion per GHG (2019 VSL)", - "USD billion per GHG (annual VSL)" - ) - ) - ), - metric = ifelse( - metric %in% c("avoided_health_cost", "avoided_health_cost_annual_vsl"), - "avoided_health_cost", - "avoided_health_cost_ghg" - ) - ) - - plot_df_labor <- plot_df %>% - select( - scen_id, - demand_scenario, - refining_scenario, - oil_price_scenario, - ghg_perc_diff, - forgone_wages_bil_h, - forgone_wages_bil_l, - forgone_wages_bil_h_ghg, - forgone_wages_bil_l_ghg - ) %>% - pivot_longer( - forgone_wages_bil_h:forgone_wages_bil_l_ghg, - names_to = "metric", - values_to = "value" - ) %>% - mutate( - segment = "labor", - unit_desc = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_l"), - "USD billion", - "USD billion per GHG" - ), - estimate = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_h_ghg"), - "high", - "low" - ), - metric = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_l"), - "forgone_wages_bil", - "forgone_wages_bil_ghg" - ) - ) %>% - select( - scen_id, - demand_scenario, - refining_scenario, - ghg_perc_diff, - segment, - metric, - unit_desc, - estimate, - value - ) %>% - pivot_wider(names_from = estimate, values_from = value) - - # plot_df_long <- rbind(plot_df_health, plot_df_labor) - - ## prepare health for plotting ------------------------------ - plot_df_health <- plot_df_health %>% - mutate( - title = ifelse( - metric == "avoided_health_cost", - "Health: avoided mortality", - "Health: avoided mortality per avoided GHG" - ) - ) - - plot_df_health$title <- factor( - plot_df_health$title, - levels = c( - "Health: avoided mortality", - "Health: avoided mortality per avoided GHG" - ) - ) - - ## rename - setDT(plot_df_health) - plot_df_health[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - plot_df_health[, scenario := gsub("LC1.", "Low ", scenario)] - # plot_df_long[, scenario := gsub('BAU', 'Reference', scenario)] - # plot_df_long[, short_scen := gsub('BAU', 'Reference', short_scen)] - # plot_df_long[, short_scen := gsub('Low C.', 'Low carbon', short_scen)] - - ## refactor - plot_df_health$scenario <- factor( - plot_df_health$scenario, - levels = c( - "BAU demand - historic production", - "BAU demand - historic exports", - "BAU demand - low exports", - "Low demand - historic exports", - "Low demand - low exports", - "Low demand - historic production" - ) - ) - - ## convert value of scaled outputs (by ghg) to millions, add unit column - plot_df_health[, - value := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - value * 1000, - value - ) - ] - plot_df_health[, - metric := fifelse( - metric == "forgone_wages_bil_ghg", - "forgone_wages_ghg", - metric - ) - ] - plot_df_health[, - unit := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_ghg"), - "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)", - "NPV (2019 USD billion)" - ) - ] - - ## change historic to historical - plot_df_health[, scen_id := str_replace(scen_id, "historic", "historical")] - plot_df_health[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - plot_df_health[, scenario := str_replace(scenario, "historic", "historical")] - - ## save figure inputs - fwrite( - plot_df_health, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_npv_fig_inputs_health_ref.csv" - ) - ) - # fwrite(plot_df_health, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_npv_fig_inputs_health.csv")) - - ## prepare labor ---------------------- - plot_df_labor <- plot_df_labor %>% - mutate( - title = ifelse( - metric == "forgone_wages_bil", - "Labor: forgone wages", - "Labor: forgone wages per avoided GHG" - ) - ) - - plot_df_labor$title <- factor( - plot_df_labor$title, - levels = c("Labor: forgone wages", "Labor: forgone wages per avoided GHG") - ) - - ## rename - setDT(plot_df_labor) - plot_df_labor[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - plot_df_labor[, scenario := gsub("LC1.", "Low ", scenario)] - # plot_df_long[, scenario := gsub('BAU', 'Reference', scenario)] - # plot_df_long[, short_scen := gsub('BAU', 'Reference', short_scen)] - # plot_df_long[, short_scen := gsub('Low C.', 'Low carbon', short_scen)] - - ## refactor - plot_df_labor$scenario <- factor( - plot_df_labor$scenario, - levels = c( - "BAU demand - historic production", - "BAU demand - historic exports", - "BAU demand - low exports", - "Low demand - historic exports", - "Low demand - low exports", - "Low demand - historic production" - ) - ) - - ## convert value of scaled outputs (by ghg) to millions, add unit column - plot_df_labor[, - high := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - high * 1000, - high - ) - ] - plot_df_labor[, - low := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - low * 1000, - low - ) - ] - plot_df_labor[, - metric := fifelse( - metric == "forgone_wages_bil_ghg", - "forgone_wages_ghg", - metric - ) - ] - plot_df_labor[, - unit := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_ghg"), - "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)", - "NPV (2019 USD billion)" - ) - ] - - ## change historic to historical - plot_df_labor[, scen_id := str_replace(scen_id, "historic", "historical")] - plot_df_labor[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - plot_df_labor[, scenario := str_replace(scenario, "historic", "historical")] - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - bau_scen <- "BAU historical production" - - ## make the plot - ## --------------------------------------------------- - - ## color for refining scenario - refin_colors <- c( - "LC1 low exports" = "#729b79", - "LC1 historical exports" = "#2F4858", - "BAU low exports" = "#F6AE2D", - "BAU historical exports" = "#F26419" - ) - - refin_labs <- c( - "LC1 low exports" = "Low demand, low exports", - "LC1 historical exports" = "Low demand, historical exports", - "BAU low exports" = "BAU demand, low exports", - "BAU historical exports" = "BAU demand, historical exports" - ) - - ## refactor - # plot_df_health$scen_id <- factor(plot_df_health$scen_id, levels = c('LC1 low exports', - # 'LC1 historical production', - # 'BAU demand\nlow exports', - # 'Low demand\nhistorical exports', - # 'Low demand\nlow exports', - # 'Low demand\nhistorical production')) - # - - ## figs - make each separately - ## ------------------------------------------------------------------- - - hist_prod <- as.data.table( - plot_df_health %>% - filter( - scen_id == bau_scen, - unit == "NPV (2019 USD billion)", - unit_desc == "USD billion (2019 VSL)" - ) - ) - - fig_bxm_a <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - geom_point( - data = plot_df_health %>% - filter( - !scen_id %in% remove_scen, - title == "Health: avoided mortality", - unit == "NPV (2019 USD billion)", - unit_desc == "USD billion (2019 VSL)", - !refining_scenario == "historical production" - ), - aes(x = ghg_perc_diff * -100, y = value, color = scen_id), - shape = 16, - size = 3, - alpha = 0.9 - ) + - labs( - color = NULL, - title = "Health: avoided mortality", - y = "NPV (2019 USD billion)", - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(0, 50) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 2)) - - # ## make separete df for labor high and low for plotting - # plot_df_labor_pts <- plot_df_labor %>% - # filter(!scen_id %in% remove_scen, - # title == "Labor: forgone wages", - # unit == "NPV (2019 USD billion)", - # refining_scenario != "historical production") %>% - # select(scen_id, demand_scenario, refining_scenario, scenario, ghg_perc_diff, high, low) %>% - # pivot_longer(high:low, names_to = "estimate", values_to = "npv_2019_usd_billion") - # - fig_bxm_b <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historical production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), linewidth = 0.5, alpha = 0.8) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historical production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = low, color = scen_id), - shape = 16, - size = 3, - alpha = 0.9 - ) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historical production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = high, color = scen_id), - shape = 1, - size = 3, - alpha = 0.9 - ) + - labs( - color = NULL, - title = "Labor: forgone wages", - y = NULL, - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-50, 0) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 2)) - - ## legends - low_legend_fig <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), size = 0.5, alpha = 0.8) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historic production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = low, color = scen_id), - shape = 16, - size = 3, - alpha = 1 - ) + - # geom_point(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, y = high, color = scen_id), shape = 1, size = 3, alpha = 0.8) + - labs( - color = "with re-emp:", - title = "Labor: forgone wages", - y = NULL, - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-50, 0) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - legend.title = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 1)) - - low_legend <- get_legend( - low_legend_fig - ) - - ## legends - high_legend_fig <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), size = 0.5, alpha = 0.8) + - # geom_point(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, y = low, color = scen_id), shape = 16, size = 3, alpha = 1) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historic production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = high, color = scen_id), - shape = 1, - size = 3, - alpha = 0.8 - ) + - labs( - color = "no re-emp:", - title = "Labor: forgone wages", - y = NULL, - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-50, 0) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - legend.title = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 1)) - - high_legend <- get_legend( - high_legend_fig - ) - - ## combine figure - ## --------------------------------- - - ## shared x axis - xaxis_lab <- ggdraw() + - draw_label("GHG emissions reduction (%, 2045 vs 2019)", size = 12) - - fig3_plot_grid_ab <- plot_grid( - fig_bxm_a, - fig_bxm_b, - align = "vh", - labels = c("A", "B"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - rel_widths = c(1, 1) - ) - - fig3_plot_grid2 <- plot_grid( - fig3_plot_grid_ab, - xaxis_lab, - align = "v", - # labels = c("(A)", "(B)", "(C)", ""), - # # labels = 'AUTO', - # label_size = 10, - # hjust = -1, - ncol = 1, - rel_heights = c(0.95, 0.05) - # rel_widths = c(1, 1), - ) - - return(fig3_plot_grid_ab) -} - - -## ----------------------------------------------------------------------------- -## NPV figure: constant VSL -## ----------------------------------------------------------------------------- - -## NPV figure -plot_npv_health_labor_constant_vsl <- function( - main_path, - save_path, - refining_mortality, - state_ghg_output, - dt_ghg_2019, - annual_labor -) { - npv_df <- refining_mortality %>% as.data.table() - - ## state level - state_npv_df <- npv_df[, - .( - sum_cost_2019_pv = sum(cost_2019_PV), ## constant VSL - sum_cost_pv = sum(cost_PV) - ), ## changing VSL - by = .(scen_id, demand_scenario, refining_scenario) - ] - - ## add column - state_npv_df[, sum_cost_2019_pv_b := sum_cost_2019_pv / 1e9] - state_npv_df[, sum_cost_pv_b := sum_cost_pv / 1e9] - - ## add ghg emission reduction - ## 2019 ghg - ghg_2019_val <- dt_ghg_2019$mtco2e[1] - - ## 2045 vs 2019 ghg - ghg_2045 <- state_ghg_output[year == 2045 & source == "total"] - setnames(ghg_2045, "value", "ghg_kg") - ghg_2045[, ghg_2045 := (ghg_kg / 1000) / 1e6] - ghg_2045[, ghg_2019 := ghg_2019_val] - ghg_2045[, perc_diff := (ghg_2045 - ghg_2019) / ghg_2019] - - perc_diff_df <- ghg_2045[, .( - demand_scenario, - refining_scenario, - ghg_2045, - ghg_2019, - perc_diff - )] - - ## summarize by scenario, filter for total - state_ghg_df <- state_ghg_output[ - source == "total", - .(total_ghg = sum(value)), - by = .(demand_scenario, refining_scenario) - ] - - state_ghg_df[, total_ghg_mmt := (total_ghg / 1000) / 1e6] - - ## reference - ref_df <- state_ghg_df[ - demand_scenario == "BAU" & refining_scenario == "historic production", - .(total_ghg_mmt) - ] - setnames(ref_df, "total_ghg_mmt", "ref_ghg_mmt") - ref_value <- ref_df$ref_ghg_mmt[1] - - ## merge with summarized df - state_ghg_df[, ref_ghg := ref_value] - state_ghg_df[, avoided_ghg := (total_ghg_mmt - ref_value) * -1] - - ## merge with health - health_ghg_df <- merge( - state_npv_df, - state_ghg_df[, .( - demand_scenario, - refining_scenario, - total_ghg_mmt, - ref_ghg, - avoided_ghg - )], - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## summarize labor for state - state_labor <- annual_labor[, - .( - sum_total_emp = sum(total_emp), - sum_total_comp_pv_h = sum(total_comp_PV_h), - sum_total_comp_pv_l = sum(total_comp_PV_l) - ), - by = .(demand_scenario, refining_scenario, oil_price_scenario) - ] - - state_labor <- state_labor[oil_price_scenario == "reference case", ] - - ## ref labor - ref_labor <- state_labor[ - demand_scenario == "BAU" & refining_scenario == "historic production" - ] - setnames( - ref_labor, - c("sum_total_emp", "sum_total_comp_pv_h", "sum_total_comp_pv_l"), - c("ref_total_emp", "ref_total_comp_pv_h", "ref_total_comp_pv_l") - ) - - ## add values to labor - state_labor[, `:=`( - ref_total_emp = ref_labor$ref_total_emp[1], - ref_total_comp_pv_h = ref_labor$ref_total_comp_pv_h[1], - ref_total_comp_pv_l = ref_labor$ref_total_comp_pv_l[1] - )] - - state_labor[, - forgone_wages_bil_h := (sum_total_comp_pv_h - ref_total_comp_pv_h) / 1e9 - ] - state_labor[, - forgone_wages_bil_l := (sum_total_comp_pv_l - ref_total_comp_pv_l) / 1e9 - ] - - ## merge with health and ghg - health_labor_ghg_df <- merge( - health_ghg_df, - state_labor[, .( - demand_scenario, - refining_scenario, - oil_price_scenario, - sum_total_comp_pv_h, - ref_total_comp_pv_h, - forgone_wages_bil_h, - sum_total_comp_pv_l, - ref_total_comp_pv_l, - forgone_wages_bil_l - )], - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## add ghg perc reduction - health_labor_ghg_df <- merge( - health_labor_ghg_df, - perc_diff_df, - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## prepare to plot - plot_df <- health_labor_ghg_df[, .( - scen_id, - demand_scenario, - refining_scenario, - oil_price_scenario, - sum_cost_pv_b, - sum_cost_2019_pv_b, - forgone_wages_bil_h, - forgone_wages_bil_l, - avoided_ghg, - perc_diff - )] - - setnames(plot_df, "perc_diff", "ghg_perc_diff") - - ## add values / avoided ghgs - plot_df[, avoided_health_cost := sum_cost_2019_pv_b * -1] - plot_df[, avoided_health_cost_annual_vsl := sum_cost_pv_b * -1] - plot_df[, sum_cost_2019_pv_b := NULL] - plot_df[, sum_cost_pv_b := NULL] - - plot_df[, `:=`( - avoided_health_cost_ghg = avoided_health_cost / avoided_ghg, - avoided_health_cost_ghg_vsl2 = avoided_health_cost_annual_vsl / avoided_ghg, - forgone_wages_bil_h_ghg = forgone_wages_bil_h / avoided_ghg, - forgone_wages_bil_l_ghg = forgone_wages_bil_l / avoided_ghg - )] - - plot_df_health <- plot_df %>% - select( - scen_id, - demand_scenario, - refining_scenario, - ghg_perc_diff, - avoided_health_cost, - avoided_health_cost_annual_vsl, - avoided_health_cost_ghg, - avoided_health_cost_ghg_vsl2 - ) %>% - pivot_longer( - avoided_health_cost:avoided_health_cost_ghg_vsl2, - names_to = "metric", - values_to = "value" - ) - - ## add column for vsl - plot_df_health <- plot_df_health %>% - mutate( - segment = "health", - unit_desc = ifelse( - metric == "avoided_health_cost", - "USD billion (2019 VSL)", - ifelse( - metric == "avoided_health_cost_annual_vsl", - "USD billion (annual VSL)", - ifelse( - metric == "avoided_health_cost_ghg", - "USD billion per GHG (2019 VSL)", - "USD billion per GHG (annual VSL)" - ) - ) - ), - metric = ifelse( - metric %in% c("avoided_health_cost", "avoided_health_cost_annual_vsl"), - "avoided_health_cost", - "avoided_health_cost_ghg" - ) - ) - - plot_df_labor <- plot_df %>% - select( - scen_id, - demand_scenario, - refining_scenario, - oil_price_scenario, - ghg_perc_diff, - forgone_wages_bil_h, - forgone_wages_bil_l, - forgone_wages_bil_h_ghg, - forgone_wages_bil_l_ghg - ) %>% - pivot_longer( - forgone_wages_bil_h:forgone_wages_bil_l_ghg, - names_to = "metric", - values_to = "value" - ) %>% - mutate( - segment = "labor", - unit_desc = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_l"), - "USD billion", - "USD billion per GHG" - ), - estimate = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_h_ghg"), - "high", - "low" - ), - metric = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_l"), - "forgone_wages_bil", - "forgone_wages_bil_ghg" - ) - ) %>% - select( - scen_id, - demand_scenario, - refining_scenario, - ghg_perc_diff, - segment, - metric, - unit_desc, - estimate, - value - ) %>% - pivot_wider(names_from = estimate, values_from = value) - - # plot_df_long <- rbind(plot_df_health, plot_df_labor) - - ## prepare health for plotting ------------------------------ - plot_df_health <- plot_df_health %>% - mutate( - title = ifelse( - metric == "avoided_health_cost", - "Health: avoided mortality", - "Health: avoided mortality per avoided GHG" - ) - ) - - plot_df_health$title <- factor( - plot_df_health$title, - levels = c( - "Health: avoided mortality", - "Health: avoided mortality per avoided GHG" - ) - ) - - ## rename - setDT(plot_df_health) - plot_df_health[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - plot_df_health[, scenario := gsub("LC1.", "Low ", scenario)] - # plot_df_long[, scenario := gsub('BAU', 'Reference', scenario)] - # plot_df_long[, short_scen := gsub('BAU', 'Reference', short_scen)] - # plot_df_long[, short_scen := gsub('Low C.', 'Low carbon', short_scen)] - - ## refactor - plot_df_health$scenario <- factor( - plot_df_health$scenario, - levels = c( - "BAU demand - historic production", - "BAU demand - historic exports", - "BAU demand - low exports", - "Low demand - historic exports", - "Low demand - low exports", - "Low demand - historic production" - ) - ) - - ## convert value of scaled outputs (by ghg) to millions, add unit column - plot_df_health[, - value := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - value * 1000, - value - ) - ] - plot_df_health[, - metric := fifelse( - metric == "forgone_wages_bil_ghg", - "forgone_wages_ghg", - metric - ) - ] - plot_df_health[, - unit := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_ghg"), - "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)", - "NPV (2019 USD billion)" - ) - ] - - ## change historic to historical - plot_df_health[, scen_id := str_replace(scen_id, "historic", "historical")] - plot_df_health[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - plot_df_health[, scenario := str_replace(scenario, "historic", "historical")] - - ## save figure inputs - fwrite( - plot_df_health, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_npv_fig_inputs_health_constant_vsl.csv" - ) - ) - # fwrite(plot_df_health, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_npv_fig_inputs_health.csv")) - - ## prepare labor ---------------------- - plot_df_labor <- plot_df_labor %>% - mutate( - title = ifelse( - metric == "forgone_wages_bil", - "Labor: forgone wages", - "Labor: forgone wages per avoided GHG" - ) - ) - - plot_df_labor$title <- factor( - plot_df_labor$title, - levels = c("Labor: forgone wages", "Labor: forgone wages per avoided GHG") - ) - - ## rename - setDT(plot_df_labor) - plot_df_labor[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - plot_df_labor[, scenario := gsub("LC1.", "Low ", scenario)] - # plot_df_long[, scenario := gsub('BAU', 'Reference', scenario)] - # plot_df_long[, short_scen := gsub('BAU', 'Reference', short_scen)] - # plot_df_long[, short_scen := gsub('Low C.', 'Low carbon', short_scen)] - - ## refactor - plot_df_labor$scenario <- factor( - plot_df_labor$scenario, - levels = c( - "BAU demand - historic production", - "BAU demand - historic exports", - "BAU demand - low exports", - "Low demand - historic exports", - "Low demand - low exports", - "Low demand - historic production" - ) - ) - - ## convert value of scaled outputs (by ghg) to millions, add unit column - plot_df_labor[, - high := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - high * 1000, - high - ) - ] - plot_df_labor[, - low := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - low * 1000, - low - ) - ] - plot_df_labor[, - metric := fifelse( - metric == "forgone_wages_bil_ghg", - "forgone_wages_ghg", - metric - ) - ] - plot_df_labor[, - unit := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_ghg"), - "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)", - "NPV (2019 USD billion)" - ) - ] - - ## change historic to historical - plot_df_labor[, scen_id := str_replace(scen_id, "historic", "historical")] - plot_df_labor[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - plot_df_labor[, scenario := str_replace(scenario, "historic", "historical")] - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - bau_scen <- "BAU historical production" - - ## make the plot - ## --------------------------------------------------- - - ## color for refining scenario - refin_colors <- c( - "LC1 low exports" = "#729b79", - "LC1 historical exports" = "#2F4858", - "BAU low exports" = "#F6AE2D", - "BAU historical exports" = "#F26419" - ) - - refin_labs <- c( - "LC1 low exports" = "Low demand, low exports", - "LC1 historical exports" = "Low demand, historical exports", - "BAU low exports" = "BAU demand, low exports", - "BAU historical exports" = "BAU demand, historical exports" - ) - - ## refactor - # plot_df_health$scen_id <- factor(plot_df_health$scen_id, levels = c('LC1 low exports', - # 'LC1 historical production', - # 'BAU demand\nlow exports', - # 'Low demand\nhistorical exports', - # 'Low demand\nlow exports', - # 'Low demand\nhistorical production')) - # - - ## figs - make each separately - ## ------------------------------------------------------------------- - - hist_prod <- as.data.table( - plot_df_health %>% - filter( - scen_id == bau_scen, - unit == "NPV (2019 USD billion)", - unit_desc == "USD billion (2019 VSL)" - ) - ) - - fig_bxm_a <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - geom_point( - data = plot_df_health %>% - filter( - !scen_id %in% remove_scen, - title == "Health: avoided mortality", - unit == "NPV (2019 USD billion)", - unit_desc == "USD billion (2019 VSL)", - !refining_scenario == "historical production" - ), - aes(x = ghg_perc_diff * -100, y = value, color = scen_id), - shape = 16, - size = 3, - alpha = 0.9 - ) + - labs( - color = NULL, - title = "Health: avoided mortality", - y = "NPV (2019 USD billion)", - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(0, 50) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 2)) - - # ## make separete df for labor high and low for plotting - # plot_df_labor_pts <- plot_df_labor %>% - # filter(!scen_id %in% remove_scen, - # title == "Labor: forgone wages", - # unit == "NPV (2019 USD billion)", - # refining_scenario != "historical production") %>% - # select(scen_id, demand_scenario, refining_scenario, scenario, ghg_perc_diff, high, low) %>% - # pivot_longer(high:low, names_to = "estimate", values_to = "npv_2019_usd_billion") - # - fig_bxm_b <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historical production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), linewidth = 0.5, alpha = 0.8) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historical production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = low, color = scen_id), - shape = 16, - size = 3, - alpha = 0.9 - ) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historical production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = high, color = scen_id), - shape = 1, - size = 3, - alpha = 0.9 - ) + - labs( - color = NULL, - title = "Labor: forgone wages", - y = NULL, - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-50, 0) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 2)) - - ## legends - low_legend_fig <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), size = 0.5, alpha = 0.8) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historic production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = low, color = scen_id), - shape = 16, - size = 3, - alpha = 1 - ) + - # geom_point(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, y = high, color = scen_id), shape = 1, size = 3, alpha = 0.8) + - labs( - color = "with re-emp:", - title = "Labor: forgone wages", - y = NULL, - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-50, 0) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - legend.title = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 1)) - - low_legend <- get_legend( - low_legend_fig - ) - - ## save legends - ggsave( - plot = low_legend, - device = "pdf", - filename = "fig3_low_legend.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - ## legends - high_legend_fig <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), size = 0.5, alpha = 0.8) + - # geom_point(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, y = low, color = scen_id), shape = 16, size = 3, alpha = 1) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historic production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = high, color = scen_id), - shape = 1, - size = 3, - alpha = 0.8 - ) + - labs( - color = "no re-emp:", - title = "Labor: forgone wages", - y = NULL, - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-50, 0) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - legend.title = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 1)) - - high_legend <- get_legend( - high_legend_fig - ) - - ## save legends - ggsave( - plot = high_legend, - device = "pdf", - filename = "fig3_high_legend.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - ## combine figure - ## --------------------------------- - - ## shared x axis - xaxis_lab <- ggdraw() + - draw_label("GHG emissions reduction (%, 2045 vs 2019)", size = 12) - - fig3_plot_grid_ab <- plot_grid( - fig_bxm_a, - fig_bxm_b, - align = "vh", - labels = c("A", "B"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - rel_widths = c(1, 1) - ) - - fig3_plot_grid2 <- plot_grid( - fig3_plot_grid_ab, - xaxis_lab, - align = "v", - # labels = c("(A)", "(B)", "(C)", ""), - # # labels = 'AUTO', - # label_size = 10, - # hjust = -1, - ncol = 1, - rel_heights = c(0.95, 0.05) - # rel_widths = c(1, 1), - ) -} - - -## ----------------------------------------------------------------------------- -## NPV figure: growing VSL, age-based vsl, cluser EFs -## ----------------------------------------------------------------------------- - -## NPV figure -plot_npv_health_labor_growing_vsl <- function( - main_path, - save_path, - refining_mortality, - state_ghg_output, - dt_ghg_2019, - annual_labor -) { - npv_df <- refining_mortality %>% as.data.table() - - ## state level - state_npv_df <- npv_df[, - .( - sum_cost_2019_pv = sum(cost_2019_PV), ## constant VSL - sum_cost_pv = sum(cost_PV) - ), ## changing VSL - by = .(scen_id, demand_scenario, refining_scenario) - ] - - ## add column - state_npv_df[, sum_cost_2019_pv_b := sum_cost_2019_pv / 1e9] - state_npv_df[, sum_cost_pv_b := sum_cost_pv / 1e9] - - ## add ghg emission reduction - ## 2019 ghg - ghg_2019_val <- dt_ghg_2019$mtco2e[1] - - ## 2045 vs 2019 ghg - ghg_2045 <- state_ghg_output[year == 2045 & source == "total"] - setnames(ghg_2045, "value", "ghg_kg") - ghg_2045[, ghg_2045 := (ghg_kg / 1000) / 1e6] - ghg_2045[, ghg_2019 := ghg_2019_val] - ghg_2045[, perc_diff := (ghg_2045 - ghg_2019) / ghg_2019] - - perc_diff_df <- ghg_2045[, .( - demand_scenario, - refining_scenario, - ghg_2045, - ghg_2019, - perc_diff - )] - - ## summarize by scenario, filter for total - state_ghg_df <- state_ghg_output[ - source == "total", - .(total_ghg = sum(value)), - by = .(demand_scenario, refining_scenario) - ] - - state_ghg_df[, total_ghg_mmt := (total_ghg / 1000) / 1e6] - - ## reference - ref_df <- state_ghg_df[ - demand_scenario == "BAU" & refining_scenario == "historic production", - .(total_ghg_mmt) - ] - setnames(ref_df, "total_ghg_mmt", "ref_ghg_mmt") - ref_value <- ref_df$ref_ghg_mmt[1] - - ## merge with summarized df - state_ghg_df[, ref_ghg := ref_value] - state_ghg_df[, avoided_ghg := (total_ghg_mmt - ref_value) * -1] - - ## merge with health - health_ghg_df <- merge( - state_npv_df, - state_ghg_df[, .( - demand_scenario, - refining_scenario, - total_ghg_mmt, - ref_ghg, - avoided_ghg - )], - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## summarize labor for state - state_labor <- annual_labor[, - .( - sum_total_emp = sum(total_emp), - sum_total_comp_pv_h = sum(total_comp_PV_h), - sum_total_comp_pv_l = sum(total_comp_PV_l) - ), - by = .(demand_scenario, refining_scenario, oil_price_scenario) - ] - - state_labor <- state_labor[oil_price_scenario == "reference case", ] - - ## ref labor - ref_labor <- state_labor[ - demand_scenario == "BAU" & refining_scenario == "historic production" - ] - setnames( - ref_labor, - c("sum_total_emp", "sum_total_comp_pv_h", "sum_total_comp_pv_l"), - c("ref_total_emp", "ref_total_comp_pv_h", "ref_total_comp_pv_l") - ) - - ## add values to labor - state_labor[, `:=`( - ref_total_emp = ref_labor$ref_total_emp[1], - ref_total_comp_pv_h = ref_labor$ref_total_comp_pv_h[1], - ref_total_comp_pv_l = ref_labor$ref_total_comp_pv_l[1] - )] - - state_labor[, - forgone_wages_bil_h := (sum_total_comp_pv_h - ref_total_comp_pv_h) / 1e9 - ] - state_labor[, - forgone_wages_bil_l := (sum_total_comp_pv_l - ref_total_comp_pv_l) / 1e9 - ] - - ## merge with health and ghg - health_labor_ghg_df <- merge( - health_ghg_df, - state_labor[, .( - demand_scenario, - refining_scenario, - oil_price_scenario, - sum_total_comp_pv_h, - ref_total_comp_pv_h, - forgone_wages_bil_h, - sum_total_comp_pv_l, - ref_total_comp_pv_l, - forgone_wages_bil_l - )], - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## add ghg perc reduction - health_labor_ghg_df <- merge( - health_labor_ghg_df, - perc_diff_df, - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## prepare to plot - plot_df <- health_labor_ghg_df[, .( - scen_id, - demand_scenario, - refining_scenario, - oil_price_scenario, - sum_cost_pv_b, - sum_cost_2019_pv_b, - forgone_wages_bil_h, - forgone_wages_bil_l, - avoided_ghg, - perc_diff - )] - - setnames(plot_df, "perc_diff", "ghg_perc_diff") - - ## add values / avoided ghgs - plot_df[, avoided_health_cost := sum_cost_2019_pv_b * -1] - plot_df[, avoided_health_cost_annual_vsl := sum_cost_pv_b * -1] - plot_df[, sum_cost_2019_pv_b := NULL] - plot_df[, sum_cost_pv_b := NULL] - - plot_df[, `:=`( - avoided_health_cost_ghg = avoided_health_cost / avoided_ghg, - avoided_health_cost_ghg_vsl2 = avoided_health_cost_annual_vsl / avoided_ghg, - forgone_wages_bil_h_ghg = forgone_wages_bil_h / avoided_ghg, - forgone_wages_bil_l_ghg = forgone_wages_bil_l / avoided_ghg - )] - - plot_df_health <- plot_df %>% - select( - scen_id, - demand_scenario, - refining_scenario, - ghg_perc_diff, - avoided_health_cost, - avoided_health_cost_annual_vsl, - avoided_health_cost_ghg, - avoided_health_cost_ghg_vsl2 - ) %>% - pivot_longer( - avoided_health_cost:avoided_health_cost_ghg_vsl2, - names_to = "metric", - values_to = "value" - ) - - ## add column for vsl - plot_df_health <- plot_df_health %>% - mutate( - segment = "health", - unit_desc = ifelse( - metric == "avoided_health_cost", - "USD billion (2019 VSL)", - ifelse( - metric == "avoided_health_cost_annual_vsl", - "USD billion (annual VSL)", - ifelse( - metric == "avoided_health_cost_ghg", - "USD billion per GHG (2019 VSL)", - "USD billion per GHG (annual VSL)" - ) - ) - ), - metric = ifelse( - metric %in% c("avoided_health_cost", "avoided_health_cost_annual_vsl"), - "avoided_health_cost", - "avoided_health_cost_ghg" - ) - ) - - plot_df_labor <- plot_df %>% - select( - scen_id, - demand_scenario, - refining_scenario, - oil_price_scenario, - ghg_perc_diff, - forgone_wages_bil_h, - forgone_wages_bil_l, - forgone_wages_bil_h_ghg, - forgone_wages_bil_l_ghg - ) %>% - pivot_longer( - forgone_wages_bil_h:forgone_wages_bil_l_ghg, - names_to = "metric", - values_to = "value" - ) %>% - mutate( - segment = "labor", - unit_desc = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_l"), - "USD billion", - "USD billion per GHG" - ), - estimate = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_h_ghg"), - "high", - "low" - ), - metric = ifelse( - metric %in% c("forgone_wages_bil_h", "forgone_wages_bil_l"), - "forgone_wages_bil", - "forgone_wages_bil_ghg" - ) - ) %>% - select( - scen_id, - demand_scenario, - refining_scenario, - ghg_perc_diff, - segment, - metric, - unit_desc, - estimate, - value - ) %>% - pivot_wider(names_from = estimate, values_from = value) - - # plot_df_long <- rbind(plot_df_health, plot_df_labor) - - ## prepare health for plotting ------------------------------ - plot_df_health <- plot_df_health %>% - mutate( - title = ifelse( - metric == "avoided_health_cost", - "Health: avoided mortality", - "Health: avoided mortality per avoided GHG" - ) - ) - - plot_df_health$title <- factor( - plot_df_health$title, - levels = c( - "Health: avoided mortality", - "Health: avoided mortality per avoided GHG" - ) - ) - - ## rename - setDT(plot_df_health) - plot_df_health[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - plot_df_health[, scenario := gsub("LC1.", "Low ", scenario)] - # plot_df_long[, scenario := gsub('BAU', 'Reference', scenario)] - # plot_df_long[, short_scen := gsub('BAU', 'Reference', short_scen)] - # plot_df_long[, short_scen := gsub('Low C.', 'Low carbon', short_scen)] - - ## refactor - plot_df_health$scenario <- factor( - plot_df_health$scenario, - levels = c( - "BAU demand - historic production", - "BAU demand - historic exports", - "BAU demand - low exports", - "Low demand - historic exports", - "Low demand - low exports", - "Low demand - historic production" - ) - ) - - ## convert value of scaled outputs (by ghg) to millions, add unit column - plot_df_health[, - value := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - value * 1000, - value - ) - ] - plot_df_health[, - metric := fifelse( - metric == "forgone_wages_bil_ghg", - "forgone_wages_ghg", - metric - ) - ] - plot_df_health[, - unit := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_ghg"), - "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)", - "NPV (2019 USD billion)" - ) - ] - - ## change historic to historical - plot_df_health[, scen_id := str_replace(scen_id, "historic", "historical")] - plot_df_health[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - plot_df_health[, scenario := str_replace(scenario, "historic", "historical")] - - ## save figure inputs - fwrite( - plot_df_health, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_npv_fig_inputs_health_growing_vsl.csv" - ) - ) - # fwrite(plot_df_health, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_npv_fig_inputs_health.csv")) - - ## prepare labor ---------------------- - plot_df_labor <- plot_df_labor %>% - mutate( - title = ifelse( - metric == "forgone_wages_bil", - "Labor: forgone wages", - "Labor: forgone wages per avoided GHG" - ) - ) - - plot_df_labor$title <- factor( - plot_df_labor$title, - levels = c("Labor: forgone wages", "Labor: forgone wages per avoided GHG") - ) - - ## rename - setDT(plot_df_labor) - plot_df_labor[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - plot_df_labor[, scenario := gsub("LC1.", "Low ", scenario)] - # plot_df_long[, scenario := gsub('BAU', 'Reference', scenario)] - # plot_df_long[, short_scen := gsub('BAU', 'Reference', short_scen)] - # plot_df_long[, short_scen := gsub('Low C.', 'Low carbon', short_scen)] - - ## refactor - plot_df_labor$scenario <- factor( - plot_df_labor$scenario, - levels = c( - "BAU demand - historic production", - "BAU demand - historic exports", - "BAU demand - low exports", - "Low demand - historic exports", - "Low demand - low exports", - "Low demand - historic production" - ) - ) - - ## convert value of scaled outputs (by ghg) to millions, add unit column - plot_df_labor[, - high := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - high * 1000, - high - ) - ] - plot_df_labor[, - low := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_bil_ghg"), - low * 1000, - low - ) - ] - plot_df_labor[, - metric := fifelse( - metric == "forgone_wages_bil_ghg", - "forgone_wages_ghg", - metric - ) - ] - plot_df_labor[, - unit := fifelse( - metric %in% c("avoided_health_cost_ghg", "forgone_wages_ghg"), - "NPV per avoided GHG MtCO2e\n(2019 USD million / MtCO2e)", - "NPV (2019 USD billion)" - ) - ] - - ## change historic to historical - plot_df_labor[, scen_id := str_replace(scen_id, "historic", "historical")] - plot_df_labor[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - plot_df_labor[, scenario := str_replace(scenario, "historic", "historical")] - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - bau_scen <- "BAU historical production" - - ## make the plot - ## --------------------------------------------------- - - ## color for refining scenario - refin_colors <- c( - "LC1 low exports" = "#729b79", - "LC1 historical exports" = "#2F4858", - "BAU low exports" = "#F6AE2D", - "BAU historical exports" = "#F26419" - ) - - refin_labs <- c( - "LC1 low exports" = "Low demand, low exports", - "LC1 historical exports" = "Low demand, historical exports", - "BAU low exports" = "BAU demand, low exports", - "BAU historical exports" = "BAU demand, historical exports" - ) - - ## refactor - # plot_df_health$scen_id <- factor(plot_df_health$scen_id, levels = c('LC1 low exports', - # 'LC1 historical production', - # 'BAU demand\nlow exports', - # 'Low demand\nhistorical exports', - # 'Low demand\nlow exports', - # 'Low demand\nhistorical production')) - # - - ## figs - make each separately - ## ------------------------------------------------------------------- - - hist_prod <- as.data.table( - plot_df_health %>% - filter( - scen_id == bau_scen, - unit == "NPV (2019 USD billion)", - unit_desc == "USD billion (annual VSL)" - ) - ) - - fig_bxm_a <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - geom_point( - data = plot_df_health %>% - filter( - !scen_id %in% remove_scen, - title == "Health: avoided mortality", - unit == "NPV (2019 USD billion)", - unit_desc == "USD billion (annual VSL)", - !refining_scenario == "historical production" - ), - aes(x = ghg_perc_diff * -100, y = value, color = scen_id), - shape = 16, - size = 3, - alpha = 0.9 - ) + - labs( - color = NULL, - title = "Health: avoided mortality", - y = "NPV (2019 USD billion)", - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(0, 50) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 2)) - - # ## make separete df for labor high and low for plotting - # plot_df_labor_pts <- plot_df_labor %>% - # filter(!scen_id %in% remove_scen, - # title == "Labor: forgone wages", - # unit == "NPV (2019 USD billion)", - # refining_scenario != "historical production") %>% - # select(scen_id, demand_scenario, refining_scenario, scenario, ghg_perc_diff, high, low) %>% - # pivot_longer(high:low, names_to = "estimate", values_to = "npv_2019_usd_billion") - # - fig_bxm_b <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historical production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), linewidth = 0.5, alpha = 0.8) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historical production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = low, color = scen_id), - shape = 16, - size = 3, - alpha = 0.9 - ) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historical production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = high, color = scen_id), - shape = 1, - size = 3, - alpha = 0.9 - ) + - labs( - color = NULL, - title = "Labor: forgone wages", - y = NULL, - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-50, 0) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 2)) - - ## legends - low_legend_fig <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), size = 0.5, alpha = 0.8) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historic production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = low, color = scen_id), - shape = 16, - size = 3, - alpha = 1 - ) + - # geom_point(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, y = high, color = scen_id), shape = 1, size = 3, alpha = 0.8) + - labs( - color = "with re-emp:", - title = "Labor: forgone wages", - y = NULL, - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-50, 0) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - legend.title = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 1)) - - low_legend <- get_legend( - low_legend_fig - ) - - ## save legends - ggsave( - plot = low_legend, - device = "pdf", - filename = "fig3_low_legend.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - ## legends - high_legend_fig <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", size = 0.5) + - geom_vline( - xintercept = hist_prod[ - title == "Health: avoided mortality", - ghg_perc_diff * -100 - ], - color = "darkgray", - lty = 2 - ) + - # geom_vline(xintercept = hist_prod[title == "Labor: forgone wages", ghg_perc_diff * -100], color = "darkgray", lty = 2) + - # geom_linerange(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production"), aes(x = ghg_perc_diff * -100, ymin = high, ymax = low, color = scen_id), size = 0.5, alpha = 0.8) + - # geom_point(data = plot_df_labor %>% filter(!scen_id %in% remove_scen, - # refining_scenario != "historic production", - # metric == "forgone_wages_bil"), aes(x = ghg_perc_diff * -100, y = low, color = scen_id), shape = 16, size = 3, alpha = 1) + - geom_point( - data = plot_df_labor %>% - filter( - !scen_id %in% remove_scen, - refining_scenario != "historic production", - metric == "forgone_wages_bil" - ), - aes(x = ghg_perc_diff * -100, y = high, color = scen_id), - shape = 1, - size = 3, - alpha = 0.8 - ) + - labs( - color = "no re-emp:", - title = "Labor: forgone wages", - y = NULL, - x = "GHG emissions reduction (%, 2045 vs 2019)" - ) + - ylim(-50, 0) + - xlim(0, 80) + - scale_color_manual( - values = refin_colors, - labels = refin_labs - ) + - theme_line + - theme( - legend.position = "bottom", - legend.text = element_text(size = 10), - legend.title = element_text(size = 10), - plot.title = element_text(hjust = 0.5, size = 12), - axis.title.y = element_text(size = 12), - axis.title.x = element_text(size = 11), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm"), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5, size = 11), - axis.text.y = element_text(vjust = 0.5, hjust = 0.5, size = 11) - ) + - guides(color = guide_legend(nrow = 1)) - - high_legend <- get_legend( - high_legend_fig - ) - - ## save legends - ggsave( - plot = high_legend, - device = "pdf", - filename = "fig3_high_legend.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - ## combine figure - ## --------------------------------- - - ## shared x axis - xaxis_lab <- ggdraw() + - draw_label("GHG emissions reduction (%, 2045 vs 2019)", size = 12) - - fig3_plot_grid_ab <- plot_grid( - fig_bxm_a, - fig_bxm_b, - align = "vh", - labels = c("A", "B"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - rel_widths = c(1, 1) - ) - - fig3_plot_grid2 <- plot_grid( - fig3_plot_grid_ab, - xaxis_lab, - align = "v", - # labels = c("(A)", "(B)", "(C)", ""), - # # labels = 'AUTO', - # label_size = 10, - # hjust = -1, - ncol = 1, - rel_heights = c(0.95, 0.05) - # rel_widths = c(1, 1), - ) -} - - -# ## compute county-level outputs for low demand low export scenario -# ## --------------------------------------------------------------------- -# -# create_county_health_labor_df <- function(main_path, -# refining_mortality, -# state_ghg_output, -# annual_labor, -# raw_ct_2020_all, -# raw_counties) { -# -# -# ## 2020 population -# ##--------------------------------------------------------------------- -# -# ## geoid to census tract -# county_df <- raw_ct_2020_all %>% -# select(census_tract = GEOID, COUNTYFP) %>% -# st_drop_geometry() -# -# county_names <- raw_counties %>% -# select(COUNTYFP, NAME) %>% -# st_drop_geometry() %>% -# unique() -# -# ## calc 2020 pop by demographic -# pop_2020 <- refining_mortality %>% -# filter(year == 2020) %>% -# select(census_tract, year, pop) %>% -# unique() %>% -# left_join(county_df) %>% -# as.data.table() -# -# ## summarize by county -# pop_2020_county <- pop_2020[, .(pop_2020 = sum(pop)), -# by = .(COUNTYFP)] -# -# -# -# ## make maps for c and d -# ## --------------------------------------------------------------------------- -# -# ## health -# health_map_df <- refining_mortality %>% -# filter(demand_scenario == "LC1" & refining_scenario == "low exports") %>% -# as.data.table() -# -# ## rename -# health_map_df[, scenario := paste0(demand_scenario, " demand - ", refining_scenario)] -# health_map_df[, scenario := gsub('LC1.', 'Low ', scenario)] -# health_map_df[, scenario := str_replace(scenario, "historic", "historical")] -# health_map_df[, scen_id := str_replace(scen_id, "historic", "historical")] -# -# ## group by scenario and census tract, sum cost_2019_pv -# health_map_npv_df <- health_map_df[, .(sum_cost_2019_pv = sum(cost_2019_PV)), -# by = .(census_tract, scenario, scen_id)] -# -# # ## save figure inputs -# # fwrite(health_map_npv_df, file.path(main_path, save_path, "fig-csv-files", "ct_health_npv_fig_inputs.csv")) -# -# -# ## health -# health_map_npv_df <- merge(health_map_npv_df %>% rename(GEOID = census_tract), raw_ct_2020_all %>% select(GEOID, COUNTYFP, ALAND), -# by = "GEOID") -# -# health_map_npv_df <- health_map_npv_df %>% -# mutate(sum_cost_2019_pv = sum_cost_2019_pv * -1) -# -# ## merge with county codes -# health_map_npv_df <- merge(health_map_npv_df, raw_counties %>% select(COUNTYFP, NAME) %>% st_drop_geometry(), -# by = "COUNTYFP", -# allow.cartesian = T, -# all.x = T) -# -# ## summarise by county, rank by sum of sum_cost_2019_pv -# health_county_df <- health_map_npv_df[ALAND > 0, .(sum_cost_2019_pv = sum(sum_cost_2019_pv)), -# by = .(NAME, COUNTYFP, scenario, scen_id)] -# -# -# -# health_county_df <- health_county_df %>% -# select(scenario, scen_id, NAME, COUNTYFP, sum_cost_2019_pv) %>% -# left_join(pop_2020_county) %>% -# rename(npv_health_av_mort = sum_cost_2019_pv) %>% -# mutate(npv_health_av_mort_pc = npv_health_av_mort / pop_2020) %>% -# arrange(-npv_health_av_mort_pc) -# -# # ## save figure inputs -# # fwrite(health_county_df, file.path(main_path, save_path, "fig-csv-files", "county_health_npv_fig_inputs.csv")) -# -# -# ## for plotting health -# health_map_npv_df <- st_as_sf(health_map_npv_df) -# -# health_map_npv_df <- st_transform(health_map_npv_df, crs = "EPSG:4269") -# -# health_map_npv_df <- st_make_valid(health_map_npv_df) -# -# -# ## consrtuct labor df -# labor_map_df <- copy(annual_labor) -# -# labor_map_df[, scen_id := paste(demand_scenario, refining_scenario)] -# labor_map_df[, scen_id := str_replace(scen_id, "historic", "historical")] -# labor_map_df[, scenario := paste0(demand_scenario, " demand - ", refining_scenario)] -# labor_map_df[, scenario := gsub('LC1.', 'Low ', scenario)] -# labor_map_df[, scenario := str_replace(scenario, "historic", "historical")] -# -# labor_map_df <- labor_map_df[scenario == "Low demand - low exports" | scenario == "BAU demand - historical production"] -# -# ## group by scenario and census tract, sum cost_2019_pv -# labor_map_df <- labor_map_df[, .(sum_total_comp_usd19_h = sum(total_comp_usd19_h), -# sum_total_comp_usd19_l = sum(total_comp_usd19_l)), -# by = .(destination, scenario, scen_id)] -# -# -# -# labor_map_df[, ref := ifelse(scenario == "BAU demand - historical production", "bau", "alt")] -# -# ## low -# labor_map_df_l <- labor_map_df %>% -# mutate(county = str_remove(destination, " County, CA")) %>% -# select(county, ref, sum_total_comp_usd19_l) %>% -# pivot_wider(names_from = ref, values_from = sum_total_comp_usd19_l) %>% -# mutate(diff = alt - bau) %>% -# rename(delta_total_comp_usd19_l = diff) %>% -# mutate(scenario = "Low demand - low exports") %>% -# select(scenario, county, delta_total_comp_usd19_l) %>% -# rename(NAME = county) %>% -# left_join(county_names) %>% -# left_join(pop_2020_county) %>% -# mutate(delta_total_comp_usd19_pc_l = delta_total_comp_usd19_l / pop_2020) %>% -# select(scenario, NAME, COUNTYFP, pop_2020, delta_total_comp_usd19_l, delta_total_comp_usd19_pc_l) -# -# labor_map_df_h <- labor_map_df %>% -# mutate(county = str_remove(destination, " County, CA")) %>% -# select(county, ref, sum_total_comp_usd19_h) %>% -# pivot_wider(names_from = ref, values_from = sum_total_comp_usd19_h) %>% -# mutate(diff = alt - bau) %>% -# rename(delta_total_comp_usd19_h = diff) %>% -# mutate(scenario = "Low demand - low exports") %>% -# select(scenario, county, delta_total_comp_usd19_h) %>% -# rename(NAME = county) %>% -# left_join(county_names) %>% -# left_join(pop_2020_county) %>% -# mutate(delta_total_comp_usd19_pc_h = delta_total_comp_usd19_h / pop_2020) %>% -# select(scenario, NAME, COUNTYFP, pop_2020, delta_total_comp_usd19_h, delta_total_comp_usd19_pc_h) -# -# ## merge -# health_map_df_hl <- merge(labor_map_df_l, labor_map_df_h, -# by = c("scenario", "NAME", "COUNTYFP", "pop_2020"), -# all.x = T) -# -# ## join with county-level health -# county_map_df <- merge(health_county_df, health_map_df_hl %>% select(NAME, delta_total_comp_usd19_l, delta_total_comp_usd19_pc_l, -# delta_total_comp_usd19_h, delta_total_comp_usd19_pc_h), -# by = "NAME", -# all.x = T) -# -# county_map_df <- county_map_df %>% -# select(scenario, scen_id, county = NAME, COUNTYFP, pop_2020, npv_health_av_mort, npv_health_av_mort_pc, -# delta_total_comp_usd19_l, delta_total_comp_usd19_pc_l, -# delta_total_comp_usd19_h, delta_total_comp_usd19_pc_h) -# -# -# ## save county-level inputs -# fwrite(county_map_df, file.path(main_path, save_path, "fig-csv-files", "county_health_labor_npv_npv_pc.csv")) -# -# # ## make the maps -# # ##---------------------------------------------------------------------------- -# # -# # california <- st_as_sf(maps::map("state", plot = FALSE, fill = TRUE)) %>% -# # filter(ID == "california") %>% -# # st_transform(crs = "EPSG:4269") -# # -# # -# # # # filter for census tracts that do not experience health benefits -# # # neg_npv_health <- health_map_npv_df %>% -# # # filter(sum_cost_2019_pv < 0) %>% -# # # filter(ALAND > 0) -# # # -# # # ggplot() + -# # # geom_sf(data = neg_npv_health, mapping = aes(geometry = geometry, fill = sum_cost_2019_pv / 1000), lwd = 0.05, alpha = 1, color = "grey", show.legend = TRUE) + -# # # geom_sf(data = california, fill = "transparent", color = "black") -# # # -# # ## filter refining output df for ct's with negative outputs -# # # neg_health_out <- health_map_df %>% -# # # filter(census_tract %in% unique(neg_npv_health$GEOID)) %>% -# # # select(census_tract, year, delta_total_pm25, mortality_delta, cost_2019_PV) %>% -# # # pivot_longer(delta_total_pm25:cost_2019_PV, names_to = "metric", values_to = "value") %>% -# # # mutate(lab = ifelse(metric == "delta_total_pm25", "pm25 - difference from reference", -# # # ifelse(metric == "mortality_delta", "avoided mortality - difference from reference", "avoided mortality - difference from reference (USD)"))) -# # # -# # # ggplot(neg_health_out, aes(x = year, y = value, group = census_tract)) + -# # # geom_line(alpha = 0.4) + -# # # facet_wrap(~lab, scales = "free_y", nrow = 3) + -# # # theme_bw() -# # -# # -# # -# # -# # -# # ## health maps -# # ## --------------------------------------------------------------------------- -# # -# # ## bounding box 1 -# # bay_bb <- st_bbox(c(xmin = -123, ymin = 37.5, xmax = -121, ymax = 38.5), crs = st_crs(health_map_df)) -# # bay_bb <- st_as_sfc(bay_bb) -# # -# # la_bb <- st_bbox(c(xmin = -119, ymin = 33, xmax = -117, ymax = 34.5), crs = st_crs(health_map_df)) -# # la_bb <- st_as_sfc(la_bb) -# # -# # -# # # ## filter for bay area -# # # health_map_df2 <- health_map_df %>% -# # # mutate(bay = st_intersects(geometry, bay_bb), -# # # la = st_intersects(geometry, la_bb)) -# # -# # -# # -# # -# # health_fig_bay <- ggplot() + -# # geom_sf(data = health_map_npv_df %>% filter(ALAND > 0), mapping = aes(geometry = geometry, fill = sum_cost_2019_pv / 1000), lwd = 0.05, alpha = 1, color = "grey", show.legend = TRUE) + -# # # geom_sf(data = california, fill = "transparent", color = "black") + -# # scale_fill_gradient2(high = "navy", mid = "#FAFAFA", low = "#A84268", -# # # high = "navy", mid = "#FAFAFA", low = "#A84268", -# # midpoint = 0, space = "Lab", -# # # limits = c(min(health_map_df$sum_cost_2019_pv / 1000), max(health_map_df$sum_cost_2019_pv / 1000)), -# # limits = c(-2500, 99000), -# # breaks = c(-2500, 0, 49500, 99000), -# # labels = c(-2500, 0, 49500, 99000), -# # na.value = "grey50" -# # # , -# # # labels=function(x) format(x, big.mark = ",", scientific = FALSE) -# # ) + -# # coord_sf(xlim = c(-123, -121), ylim = c(37.5, 38.5)) + -# # labs(fill = "NPV (thousand USD 2019)", -# # color = NULL, -# # x = NULL, -# # y = NULL) + -# # theme_bw() + -# # theme( -# # # legend.justification defines the edge of the legend that the legend.position coordinates refer to -# # # legend.justification = c(0, 1), -# # # Set the legend flush with the left side of the plot, and just slightly below the top of the plot -# # legend.position = "none", -# # legend.key.width = unit(2, "line"), -# # legend.key.height = unit(1, "line"), -# # legend.title = element_text(size = 8), -# # legend.text = element_text(size = 8), -# # plot.margin = margin(0, 2, 0, 8), -# # plot.title = element_text(face = 'bold', size = 10), -# # plot.subtitle = element_text(face = 'bold', size = 8), -# # panel.grid.major = element_blank(), -# # panel.grid.minor = element_blank(), -# # panel.background = element_blank(), -# # axis.text = element_text(size = 8)) + -# # guides(fill = guide_colourbar(title.position="top", -# # title.hjust = 0, -# # direction = "horizontal", -# # ticks.colour = "black", frame.colour = "black"), -# # color = "none") -# # -# # -# # health_fig_la <- ggplot() + -# # geom_sf(data = health_map_npv_df %>% filter(ALAND > 0), mapping = aes(geometry = geometry, fill = sum_cost_2019_pv / 1000), lwd = 0.05, alpha = 1, color = "grey", show.legend = TRUE) + -# # # geom_sf(data = california, fill = "transparent", color = "black") + -# # scale_fill_gradient2(high = "navy", mid = "#FAFAFA", low = "#A84268", -# # # high = "navy", mid = "#FAFAFA", low = "#A84268", -# # midpoint = 0, space = "Lab", -# # # limits = c(min(health_map_df$sum_cost_2019_pv / 1000), max(health_map_df$sum_cost_2019_pv / 1000)), -# # limits = c(-2500, 99000), -# # breaks = c(-2500, 0, 49500, 99000), -# # labels = c(-2500, 0, 49500, 99000), -# # na.value = "grey50" -# # # , -# # # labels=function(x) format(x, big.mark = ",", scientific = FALSE) -# # ) + -# # coord_sf(xlim = c(-119, -117), ylim = c(33.2, 34.4)) + -# # labs(fill = "NPV (thousand USD 2019)", -# # color = NULL, -# # x = NULL, -# # y = NULL) + -# # theme_bw() + -# # theme( -# # # legend.justification defines the edge of the legend that the legend.position coordinates refer to -# # # legend.justification = c(0, 1), -# # # Set the legend flush with the left side of the plot, and just slightly below the top of the plot -# # legend.position = "none", -# # legend.key.width = unit(2, "line"), -# # legend.key.height = unit(1, "line"), -# # legend.title = element_text(size = 8), -# # legend.text = element_text(size = 8), -# # plot.margin = margin(0, 2, 0, 8), -# # plot.title = element_text(face = 'bold', size = 10), -# # plot.subtitle = element_text(face = 'bold', size = 8), -# # panel.grid.major = element_blank(), -# # panel.grid.minor = element_blank(), -# # panel.background = element_blank(), -# # axis.text = element_text(size = 8)) + -# # guides(fill = guide_colourbar(title.position="top", -# # title.hjust = 0, -# # direction = "horizontal", -# # ticks.colour = "black", frame.colour = "black"), -# # color = "none") -# # -# # fig3c_leg <- ggplot() + -# # geom_sf(data = health_map_df %>% filter(ALAND > 0), mapping = aes(geometry = geometry, fill = sum_cost_2019_pv / 1000), lwd = 0.05, alpha = 1, color = "grey", show.legend = TRUE) + -# # # geom_sf(data = california, fill = "transparent", color = "black") + -# # scale_fill_gradient2(low = "black", mid = "#FAFAFA", high = "#A84268", -# # # high = "navy", mid = "#FAFAFA", low = "#A84268", -# # midpoint = 0, space = "Lab", -# # # limits = c(min(health_map_df$sum_cost_2019_pv / 1000), max(health_map_df$sum_cost_2019_pv / 1000)), -# # limits = c(-2500, 99000), -# # breaks = c(-2500, 0, 49500, 99000), -# # labels = c(-2500, 0, 49500, 99000), -# # na.value = "grey50" -# # # , -# # # labels=function(x) format(x, big.mark = ",", scientific = FALSE) -# # ) + -# # coord_sf(xlim = c(-123, -121), ylim = c(37.5, 38.5)) + -# # labs(fill = "NPV (thousand USD 2019)", -# # color = NULL, -# # x = NULL, -# # y = NULL) + -# # theme_bw() + -# # theme( -# # # legend.justification defines the edge of the legend that the legend.position coordinates refer to -# # # legend.justification = c(0, 1), -# # # Set the legend flush with the left side of the plot, and just slightly below the top of the plot -# # legend.position = "bottom", -# # legend.key.width = unit(2, "line"), -# # legend.key.height = unit(1, "line"), -# # legend.title = element_text(size = 8), -# # legend.text = element_text(size = 8), -# # plot.margin = margin(0, 2, 0, 8), -# # plot.title = element_text(face = 'bold', size = 10), -# # plot.subtitle = element_text(face = 'bold', size = 8), -# # panel.grid.major = element_blank(), -# # panel.grid.minor = element_blank(), -# # panel.background = element_blank(), -# # axis.text = element_text(size = 8)) + -# # guides(fill = guide_colourbar(title.position="top", -# # title.hjust = 0, -# # direction = "horizontal", -# # ticks.colour = "black", frame.colour = "black"), -# # color = "none") -# # -# # -# # -# # # # ## quantile for plotting -# # # # numclas <- 12 -# # # # qbrks_h <- seq(0, 1, length.out = numclas + 1) -# # # # qbrks_h -# # # # -# # # # health_map_df <- health_map_df %>% -# # # # mutate(valq = cut(sum_cost_2019_pv, breaks = quantile(sum_cost_2019_pv, breaks = qbrks_h), -# # # # include.lowest = T)) -# # # # -# # # # -# # # fig3c_v2 <- ggplot() + -# # # geom_sf(data = health_map_df %>% filter(ALAND > 0), mapping = aes(geometry = geometry, fill = valq), lwd = 0, alpha = 1, color = "darkgrey", show.legend = TRUE) + -# # # # geom_sf(data = california, fill = "transparent", color = "black") + -# # # scale_fill_discrete(labels=function(x) format(x, big.mark = ",", scientific = FALSE)) + -# # # labs(fill = "NPV (USD 2019)", -# # # color = NULL, -# # # x = NULL, -# # # y = NULL) + -# # # theme_bw() + -# # # theme( -# # # # legend.justification defines the edge of the legend that the legend.position coordinates refer to -# # # # legend.justification = c(0, 1), -# # # # Set the legend flush with the left side of the plot, and just slightly below the top of the plot -# # # legend.position = "bottom", -# # # legend.key.width = unit(2, "line"), -# # # legend.key.height = unit(1, "line"), -# # # legend.title = element_text(size = 8), -# # # legend.text = element_text(size = 8), -# # # plot.margin = margin(0, 2, 0, 8), -# # # plot.title = element_text(face = 'bold', size = 10), -# # # plot.subtitle = element_text(face = 'bold', size = 8), -# # # panel.grid.major = element_blank(), -# # # panel.grid.minor = element_blank(), -# # # panel.background = element_blank(), -# # # axis.text = element_text(size = 8)) + -# # # guides(fill = guide_colourbar(title.position="top", -# # # title.hjust = 0, -# # # direction = "horizontal", -# # # ticks.colour = "black", frame.colour = "black"), -# # # color = "none") -# # -# # -# # ## labor -# # labor_map_df <- merge(raw_ca_counties_sp %>% select(NAME), labor_map_df %>% rename(NAME = county), -# # by = "NAME", -# # all.x = T) -# # -# # labor_map_df <- st_as_sf(labor_map_df) -# # -# # labor_map_df <- st_transform(labor_map_df, crs = "EPSG:4269") -# # -# # labor_map_df <- st_make_valid(labor_map_df) -# # -# # ## labor -# # blues_pal <- c("#FAFAFA", "#778DA9", "#415A77", "#1B263B", "#0D1B2A") -# # -# # fig3d <- ggplot() + -# # geom_sf(data = labor_map_df, mapping = aes(geometry = geometry, fill = delta_total_comp_usd19 / 1e9), lwd = 0.05, alpha = 1, color = "grey", show.legend = TRUE) + -# # # geom_sf(data = california, fill = "transparent", color = "black") + -# # scale_fill_gradientn(colors = rev(blues_pal), -# # na.value = "#FAFAFA") + -# # # coord_sf(xlim = c(-123, -116), ylim = c(33, 39)) + -# # labs(fill = "NPV (billion USD 2019)", -# # color = NULL, -# # x = NULL, -# # y = NULL) + -# # theme_bw() + -# # theme( -# # # legend.justification defines the edge of the legend that the legend.position coordinates refer to -# # # legend.justification = c(0, 1), -# # # Set the legend flush with the left side of the plot, and just slightly below the top of the plot -# # legend.position = "none", -# # legend.key.width = unit(2, "line"), -# # legend.key.height = unit(1, "line"), -# # legend.title = element_text(size = 8), -# # legend.text = element_text(size = 8), -# # plot.margin = margin(0, 2, 0, 8), -# # plot.title = element_text(face = 'bold', size = 10), -# # plot.subtitle = element_text(face = 'bold', size = 8), -# # panel.grid.major = element_blank(), -# # panel.grid.minor = element_blank(), -# # panel.background = element_blank(), -# # axis.text = element_text(size = 8)) + -# # guides(fill = guide_colourbar(title.position="top", -# # title.hjust = 0, -# # direction = "horizontal", -# # ticks.colour = "black", frame.colour = "black"), -# # color = "none") -# # -# # fig3d_leg <- ggplot() + -# # geom_sf(data = labor_map_df, mapping = aes(geometry = geometry, fill = delta_total_comp_usd19 / 1e9), lwd = 0.05, alpha = 1, color = "grey", show.legend = TRUE) + -# # # geom_sf(data = california, fill = "transparent", color = "black") + -# # scale_fill_gradientn(colors = rev(blues_pal), -# # na.value = "#FAFAFA") + -# # # coord_sf(xlim = c(-123, -116), ylim = c(33, 39)) + -# # labs(fill = "NPV (billion USD 2019)", -# # color = NULL, -# # x = NULL, -# # y = NULL) + -# # theme_bw() + -# # theme( -# # # legend.justification defines the edge of the legend that the legend.position coordinates refer to -# # # legend.justification = c(0, 1), -# # # Set the legend flush with the left side of the plot, and just slightly below the top of the plot -# # legend.position = "bottom", -# # legend.key.width = unit(2, "line"), -# # legend.key.height = unit(1, "line"), -# # legend.title = element_text(size = 8), -# # legend.text = element_text(size = 8), -# # plot.margin = margin(0, 2, 0, 8), -# # plot.title = element_text(face = 'bold', size = 10), -# # plot.subtitle = element_text(face = 'bold', size = 8), -# # panel.grid.major = element_blank(), -# # panel.grid.minor = element_blank(), -# # panel.background = element_blank(), -# # axis.text = element_text(size = 8)) + -# # guides(fill = guide_colourbar(title.position="top", -# # title.hjust = 0, -# # direction = "horizontal", -# # ticks.colour = "black", frame.colour = "black"), -# # color = "none") -# # -# # -# # -# # -# # -# # -# # legend_fig_3c <- get_legend( -# # fig3c_leg + -# # theme(legend.title = element_text(size = 8), -# # legend.text = element_text(size = 8)) -# # -# # ) -# # -# # legend_fig_3d <- get_legend( -# # fig3d_leg + -# # theme(legend.title = element_text(size = 8), -# # legend.text = element_text(size = 8)) -# # -# # ) -# # -# # -# -# -# } - -calc_county_pm25 <- function( - main_path, - save_path, - health_weighted, - raw_counties, - raw_ct_2020_all, - refining_mortality -) { - ## calc 2020 pop by demographic - pop_2020 <- refining_mortality %>% - filter(year == 2020) %>% - select(census_tract, year, pop) %>% - unique() %>% - as.data.table() - - health_df <- copy(health_weighted) - - health_df <- health_df[ - year == 2019 & - scen_id == "BAU historic exports" - ] - - county_names <- raw_counties %>% - select(COUNTYFP, NAME) %>% - st_drop_geometry() %>% - unique() - - ## geoid to census tract - county_df <- raw_ct_2020_all %>% - filter(STATEFP == "06") %>% - select(census_tract = GEOID, COUNTYFP, ALAND) %>% - st_drop_geometry() %>% - left_join(county_names) %>% - left_join(pop_2020) %>% - select(census_tract, COUNTYFP, NAME, pop, ALAND) - - health_df <- merge(health_df, county_df, by = "census_tract", all.x = T) - - health_county_df <- health_df %>% - group_by(NAME, COUNTYFP, year) %>% - summarise( - avg_pm25_areaw = weighted.mean(total_pm25, ALAND), - avg_pm25_popw = weighted.mean(total_pm25, pop) - ) %>% - ungroup() %>% - arrange(-avg_pm25_popw) - - fwrite( - health_county_df, - file.path(main_path, save_path, "fig-csv-files", "avg_pm25_county_2019.csv") - ) - # fwrite(health_county_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "avg_pm25_county_2019.csv")) - - return(health_county_df) -} - - -plot_health_levels <- function(main_path, save_path, health_grp) { - fig2_df <- copy(health_grp) - - ## change scenario names, factor - fig2_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # fig2_df[, scenario := gsub('BAU', 'Reference', scenario)] - fig2_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## add scenario title - fig2_df[, scenario_title := str_replace(scenario, " - ", "\n")] - - ## change historic to historical - fig2_df[, scen_id := str_replace(scen_id, "historic", "historical")] - fig2_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - fig2_df[, scenario := str_replace(scenario, "historic", "historical")] - fig2_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - ## refactor - fig2_df$scenario_title <- factor( - fig2_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - ## refactor - fig2_df$scenario <- factor( - fig2_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - ## scenarios for filtering - # remove_scen <- c('LC1 historic production', 'BAU low exports', 'LC1 historic exports') - remove_scen <- c("LC1 historical production") - - ## save figure inputs - fwrite( - fig2_df, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_levels_fig_inputs.csv" - ) - ) - # fwrite(fig2_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_levels_fig_inputs.csv")) - - # health_level_fig <- ggplot(fig2_df %>% filter(!scen_id %in% remove_scen), aes(x = year, y = num_over_den, color = group)) + - # geom_line(linewidth = 1, alpha = 0.8) + - # facet_grid(type ~ scenario) + - # labs(x = NULL, - # y = "num_over_den") + - # theme_line + - # theme(legend.position = "bottom", - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # axis.ticks.length.y = unit(0.1, 'cm'), - # axis.ticks.length.x = unit(0.1, 'cm')) - - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - health_level_fig_a <- ggplot( - fig2_df %>% - filter( - !scen_id %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race" - ) %>% - mutate( - title = factor(title, levels = c("Black", "Hispanic", "Asian", "white")) - ), - aes(x = year, y = mortality_level_dem, color = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 0.4)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figa <- health_level_fig_a + theme(legend.position = "right") - - legend_a <- get_legend( - legend_figa + - theme(legend.text = element_text(size = 8)) - ) - - ## - health_level_fig_b <- ggplot( - fig2_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC" - ), - aes(x = year, y = mortality_level_dem, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 0.4)) + - scale_linetype_manual(values = dac_lty) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figb <- health_level_fig_b + theme(legend.position = "right") - - legend_b <- get_legend( - legend_figb + - theme(legend.text = element_text(size = 8)) - ) - - ## - health_level_fig_c <- ggplot( - fig2_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = mortality_level_dem, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - scale_linetype_manual(values = poverty_lty) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 0.4)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - legend.key.width = unit(10, "mm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figc <- health_level_fig_c + theme(legend.position = "right") - - legend_c <- get_legend( - legend_figc + - theme(legend.text = element_text(size = 8)) - ) - - ## shared y lab - # yaxis_lab <- ggdraw() + draw_label(expression(paste("PM"[2.5], " (",mu,"g ", m^{-3},")", " per person")), - # size = 8, angle = 90) - - yaxis_lab <- ggdraw() + draw_label("Mortalities", size = 8, angle = 90) - - # ## plot together - # fig2l_a <- plot_grid( - # health_level_fig_a, - # legend_a, - # align = 'h', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # ncol = 2, - # rel_widths = c(0.95, 0.5), - # rel_heighs = c(1, 1) - # ) - # - # - - fig2_plot_grid <- plot_grid( - health_level_fig_b, - health_level_fig_c, - health_level_fig_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1, 1), - rel_heights = c(1, 1, 1, 1.05) - ) - - fig2_plot_grid2 <- plot_grid( - yaxis_lab, - fig2_plot_grid, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heighs = c(1, 1) - ) - - fig2_plot_grid2 -} - - -plot_health_levels_pc <- function( - main_path, - save_path, - health_grp, - refining_mortality, - pop_ratios -) { - mort_pc_df <- copy(health_grp) - - ## calc 2020 pop by demographic - pop_2020 <- refining_mortality %>% - filter(year == 2020) %>% - select(census_tract, year, pop) %>% - unique() %>% - left_join(pop_ratios) %>% - as.data.table() - - pop_2020[, demo_pop := pop * pct] - - ## summarize by demographic group - pop_2020 <- pop_2020[, - .(pop_2020 = sum(demo_pop)), - by = .(demo_group, demo_cat) - ] - - ## merge population back with results - mort_pc_df <- merge( - mort_pc_df, - pop_2020, - by = c("demo_group", "demo_cat"), - all.x = T - ) - - ## calculate per capita - mort_pc_df[, value := mortality_level_dem / pop_2020] - mort_pc_df[, value_pmil := value * 1e6] - - ## change scenario names, factor - mort_pc_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # fig2_df[, scenario := gsub('BAU', 'Reference', scenario)] - mort_pc_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## add scenario title - mort_pc_df[, scenario_title := str_replace(scenario, " - ", "\n")] - - ## change historic to historical - mort_pc_df[, scen_id := str_replace(scen_id, "historic", "historical")] - mort_pc_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - mort_pc_df[, scenario := str_replace(scenario, "historic", "historical")] - mort_pc_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - ## refactor - mort_pc_df$scenario_title <- factor( - mort_pc_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - ## refactor - mort_pc_df$scenario <- factor( - mort_pc_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - ## scenarios for filtering - # remove_scen <- c('LC1 historic production', 'BAU low exports', 'LC1 historic exports') - remove_scen <- c("LC1 historical production") - - ## save figure inputs - fwrite( - mort_pc_df, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_levels_pmil_fig_inputs.csv" - ) - ) - # fwrite(mort_pc_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_levels_pmil_fig_inputs.csv")) - - # health_level_fig <- ggplot(fig2_df %>% filter(!scen_id %in% remove_scen), aes(x = year, y = num_over_den, color = group)) + - # geom_line(linewidth = 1, alpha = 0.8) + - # facet_grid(type ~ scenario) + - # labs(x = NULL, - # y = "num_over_den") + - # theme_line + - # theme(legend.position = "bottom", - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # axis.ticks.length.y = unit(0.1, 'cm'), - # axis.ticks.length.x = unit(0.1, 'cm')) - - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - health_level_fig_a <- ggplot( - mort_pc_df %>% - filter( - !scen_id %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race" - ) %>% - mutate( - title = factor(title, levels = c("Black", "Hispanic", "Asian", "white")) - ), - aes(x = year, y = value_pmil, color = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 40)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figa <- health_level_fig_a + theme(legend.position = "right") - - legend_a <- get_legend( - legend_figa + - theme(legend.text = element_text(size = 8)) - ) - - ## - health_level_fig_b <- ggplot( - mort_pc_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC" - ), - aes(x = year, y = value_pmil, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 40)) + - scale_linetype_manual(values = dac_lty) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figb <- health_level_fig_b + theme(legend.position = "right") - - legend_b <- get_legend( - legend_figb + - theme(legend.text = element_text(size = 8)) - ) - - ## - health_level_fig_c <- ggplot( - mort_pc_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = value_pmil, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - scale_linetype_manual(values = poverty_lty) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 40)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - legend.key.width = unit(10, "mm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figc <- health_level_fig_c + theme(legend.position = "right") - - legend_c <- get_legend( - legend_figc + - theme(legend.text = element_text(size = 8)) - ) - - ## shared y lab - # yaxis_lab <- ggdraw() + draw_label(expression(paste("PM"[2.5], " (",mu,"g ", m^{-3},")", " per person")), - # size = 8, angle = 90) - - yaxis_lab <- ggdraw() + - draw_label("Mortalities per million people", size = 8, angle = 90) - - # ## plot together - # fig2l_a <- plot_grid( - # health_level_fig_a, - # legend_a, - # align = 'h', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # ncol = 2, - # rel_widths = c(0.95, 0.5), - # rel_heighs = c(1, 1) - # ) - # - # - - fig2_plot_grid <- plot_grid( - health_level_fig_b, - health_level_fig_c, - health_level_fig_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1, 1), - rel_heighs = c(1, 1, 1, 1.05) - ) - - fig2_plot_grid2 <- plot_grid( - yaxis_lab, - fig2_plot_grid, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heighs = c(1, 1) - ) - - fig2_plot_grid2 -} - - -plot_health_levels_pm25 <- function(main_path, save_path, health_grp) { - fig2_df <- copy(health_grp) - - ## change scenario names, factor - fig2_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # fig2_df[, scenario := gsub('BAU', 'Reference', scenario)] - fig2_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## add scenario title - fig2_df[, scenario_title := str_replace(scenario, " - ", "\n")] - - ## change historic to historical - fig2_df[, scen_id := str_replace(scen_id, "historic", "historical")] - fig2_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - fig2_df[, scenario := str_replace(scenario, "historic", "historical")] - fig2_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - ## refactor - fig2_df$scenario_title <- factor( - fig2_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - ## refactor - fig2_df$scenario <- factor( - fig2_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - ## save figure inputs - fwrite( - fig2_df, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_levels_pm25_inputs.csv" - ) - ) - # fwrite(fig2_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_levels_pm25_inputs.csv")) - - ## scenarios for filtering - # remove_scen <- c('LC1 historic production', 'BAU low exports', 'LC1 historic exports') - remove_scen <- c("LC1 historical production") - - # health_level_fig <- ggplot(fig2_df %>% filter(!scen_id %in% remove_scen), aes(x = year, y = num_over_den, color = group)) + - # geom_line(linewidth = 1, alpha = 0.8) + - # facet_grid(type ~ scenario) + - # labs(x = NULL, - # y = "num_over_den") + - # theme_line + - # theme(legend.position = "bottom", - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # axis.ticks.length.y = unit(0.1, 'cm'), - # axis.ticks.length.x = unit(0.1, 'cm')) - - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - health_level_fig_a <- ggplot( - fig2_df %>% - filter( - !scen_id %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race" - ) %>% - mutate( - title = factor(title, levels = c("Black", "Hispanic", "Asian", "white")) - ), - aes(x = year, y = num_over_den, color = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 0.4)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figa <- health_level_fig_a + theme(legend.position = "right") - - legend_a <- get_legend( - legend_figa + - theme(legend.text = element_text(size = 8)) - ) - - ## - health_level_fig_b <- ggplot( - fig2_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC" - ), - aes(x = year, y = num_over_den, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 0.4)) + - scale_linetype_manual(values = dac_lty) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figb <- health_level_fig_b + theme(legend.position = "right") - - legend_b <- get_legend( - legend_figb + - theme(legend.text = element_text(size = 8)) - ) - - ## - health_level_fig_c <- ggplot( - fig2_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = num_over_den, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - scale_linetype_manual(values = poverty_lty) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 0.4)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - legend.key.width = unit(10, "mm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figc <- health_level_fig_c + theme(legend.position = "right") - - legend_c <- get_legend( - legend_figc + - theme(legend.text = element_text(size = 8)) - ) - - ## shared y lab - yaxis_lab <- ggdraw() + - draw_label( - expression(paste( - "PM"[2.5], - " (", - mu, - "g ", - m^{ - -3 - }, - ")", - " per person" - )), - size = 8, - angle = 90 - ) - - # ## plot together - # fig2l_a <- plot_grid( - # health_level_fig_a, - # legend_a, - # align = 'h', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # ncol = 2, - # rel_widths = c(0.95, 0.5), - # rel_heighs = c(1, 1) - # ) - # - # - - fig2_plot_grid <- plot_grid( - health_level_fig_b, - health_level_fig_c, - health_level_fig_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1, 1), - rel_heighs = c(1, 1, 1, 1.05) - ) - - fig2_plot_grid2 <- plot_grid( - yaxis_lab, - fig2_plot_grid, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heighs = c(1, 1) - ) - - fig2_plot_grid2 -} - - -plot_health_levels_gaps <- function(main_path, save_path, health_grp) { - gaps_df <- copy(health_grp) - - ## change scenario names, factor - gaps_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # gaps_df[, scenario := gsub('BAU', 'Reference', scenario)] - gaps_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## refactor - gaps_df[, scenario_title := scenario] - gaps_df[, scenario_title := str_replace(scenario_title, " - ", "\n")] - - ## calculate gaps (BAU - scenario) - bau_gaps_df <- gaps_df[scen_id == "BAU historic production"] - bau_gaps_df <- bau_gaps_df[, c( - "year", - "demo_cat", - "demo_group", - "title", - "mortality_level_dem" - )] - setnames(bau_gaps_df, "mortality_level_dem", "bau_mortality_level_dem") - - gaps_df <- merge( - gaps_df, - bau_gaps_df, - by = c("year", "demo_cat", "demo_group", "title"), - all.x = T - ) - - gaps_df[, gap := mortality_level_dem - bau_mortality_level_dem] - - ## change historic to historical - gaps_df[, scen_id := str_replace(scen_id, "historic", "historical")] - gaps_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - gaps_df[, scenario := str_replace(scenario, "historic", "historical")] - gaps_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - gaps_df$scenario <- factor( - gaps_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - gaps_df$scenario_title <- factor( - gaps_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - ## save figure inputs - fwrite( - gaps_df, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_levels_fig_gaps_inputs.csv" - ) - ) - # fwrite(gaps_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_levels_fig_gaps_inputs.csv")) - - ## make figures - ## --------------------------------------------------------- - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - - ## figure a - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - health_gap_fig_a <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race" - ) %>% - mutate( - title = factor(title, levels = c("Black", "Hispanic", "Asian", "white")) - ), - aes(x = year, y = gap, color = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - # ylim(c(-0.31, 0)) + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figa <- health_gap_fig_a + theme(legend.position = "right") - - legend_a <- get_legend( - legend_figa + - theme(legend.text = element_text(size = 8)) - ) - - ## - health_gap_fig_b <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC" - ), - aes(x = year, y = gap, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(-0.31, 0)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - scale_linetype_manual(values = dac_lty) + - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figb <- health_gap_fig_b + theme(legend.position = "right") - - legend_b <- get_legend( - legend_figb + - theme(legend.text = element_text(size = 8)) - ) - - ## - health_gap_fig_c <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = gap, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - scale_linetype_manual(values = poverty_lty) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - # ylim(c(-0.31, 0)) + - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - legend.key.width = unit(10, "mm"), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figc <- health_gap_fig_c + theme(legend.position = "right") - - legend_c <- get_legend( - legend_figc + - theme(legend.text = element_text(size = 8)) - ) - - ## shared y lab - # yaxis_lab <- ggdraw() + draw_label(expression(paste("PM"[2.5], " (",mu,"g ", m^{-3},")", " per person, difference from reference")), - # size = 8, angle = 90) - - yaxis_lab <- ggdraw() + - draw_label( - "Avoided mortalities, difference from reference", - size = 8, - angle = 90 - ) - - # ## plot together - # fig2l_a <- plot_grid( - # health_level_fig_a, - # legend_a, - # align = 'h', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # ncol = 2, - # rel_widths = c(0.95, 0.5), - # rel_heighs = c(1, 1) - # ) - # - # - - gaps_plot_grid <- plot_grid( - health_gap_fig_b, - health_gap_fig_c, - health_gap_fig_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1, 1), - rel_heighs = c(1, 1, 1, 1.05) - ) - - gaps_plot_grid2 <- plot_grid( - yaxis_lab, - gaps_plot_grid, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heighs = c(1, 1) - ) - - gaps_plot_grid2 -} - - -plot_health_levels_gaps_pmil <- function( - main_path, - save_path, - health_grp, - refining_mortality, - pop_ratios -) { - ## calc 2020 pop by demographic - pop_2020 <- refining_mortality %>% - filter(year == 2020) %>% - select(census_tract, year, pop) %>% - unique() %>% - left_join(pop_ratios) %>% - as.data.table() - - pop_2020[, demo_pop := pop * pct] - - ## summarize by demographic group - pop_2020 <- pop_2020[, - .(pop_2020 = sum(demo_pop)), - by = .(demo_group, demo_cat) - ] - - ## compute gaps - ## ---------------------------------------------------- - gaps_df <- copy(health_grp) - - ## change scenario names, factor - gaps_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # gaps_df[, scenario := gsub('BAU', 'Reference', scenario)] - gaps_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## refactor - gaps_df[, scenario_title := scenario] - gaps_df[, scenario_title := str_replace(scenario_title, " - ", "\n")] - - ## calculate gaps (BAU - scenario) - bau_gaps_df <- gaps_df[scen_id == "BAU historic production"] - bau_gaps_df <- bau_gaps_df[, c( - "year", - "demo_cat", - "demo_group", - "title", - "mortality_level_dem" - )] - setnames(bau_gaps_df, "mortality_level_dem", "bau_mortality_level_dem") - - gaps_df <- merge( - gaps_df, - bau_gaps_df, - by = c("year", "demo_cat", "demo_group", "title"), - all.x = T - ) - - gaps_df[, gap := mortality_level_dem - bau_mortality_level_dem] - - ## convert to per million - gaps_df <- merge( - gaps_df, - pop_2020, - by = c("demo_group", "demo_cat"), - all.x = T - ) - - ## calculate per capita - gaps_df[, value := gap / pop_2020] - gaps_df[, value_pmil := value * 1e6] - - ## change historic to historical - gaps_df[, scen_id := str_replace(scen_id, "historic", "historical")] - gaps_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - gaps_df[, scenario := str_replace(scenario, "historic", "historical")] - gaps_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - gaps_df$scenario <- factor( - gaps_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - gaps_df$scenario_title <- factor( - gaps_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - ## save figure inputs - fwrite( - gaps_df, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_levels_fig_gaps_pmil_inputs.csv" - ) - ) - # fwrite(gaps_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_levels_fig_gaps_pmil_inputs.csv")) - - ## make figures - ## --------------------------------------------------------- - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - - ## figure a - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - health_gap_fig_a <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race" - ) %>% - mutate( - title = factor(title, levels = c("Black", "Hispanic", "Asian", "white")) - ), - aes(x = year, y = value_pmil, color = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - # ylim(c(-30, 0)) + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figa <- health_gap_fig_a + theme(legend.position = "right") - - legend_a <- get_legend( - legend_figa + - theme(legend.text = element_text(size = 8)) - ) - - ## - health_gap_fig_b <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC" - ), - aes(x = year, y = value_pmil, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(-30, 0)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - scale_linetype_manual(values = dac_lty) + - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figb <- health_gap_fig_b + theme(legend.position = "right") - - legend_b <- get_legend( - legend_figb + - theme(legend.text = element_text(size = 8)) - ) - - ## - health_gap_fig_c <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = value_pmil, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - scale_linetype_manual(values = poverty_lty) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - # ylim(c(-30, 0)) + - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - legend.key.width = unit(10, "mm"), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figc <- health_gap_fig_c + theme(legend.position = "right") - - legend_c <- get_legend( - legend_figc + - theme(legend.text = element_text(size = 8)) - ) - - ## shared y lab - # yaxis_lab <- ggdraw() + draw_label(expression(paste("PM"[2.5], " (",mu,"g ", m^{-3},")", " per person, difference from reference")), - # size = 8, angle = 90) - - yaxis_lab <- ggdraw() + - draw_label( - "Avoided mortalities per million people, difference from reference", - size = 8, - angle = 90 - ) - - # ## plot together - # fig2l_a <- plot_grid( - # health_level_fig_a, - # legend_a, - # align = 'h', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # ncol = 2, - # rel_widths = c(0.95, 0.5), - # rel_heighs = c(1, 1) - # ) - # - # - - gaps_plot_grid <- plot_grid( - health_gap_fig_b, - health_gap_fig_c, - health_gap_fig_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1, 1), - rel_heighs = c(1, 1, 1, 1.05) - ) - - gaps_plot_grid2 <- plot_grid( - yaxis_lab, - gaps_plot_grid, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heighs = c(1, 1) - ) - - gaps_plot_grid2 -} - - -## plot health pm2.5 gaps - -plot_health_levels_gaps_pm25 <- function(main_path, save_path, health_grp) { - gaps_df <- copy(health_grp) - - ## change scenario names, factor - gaps_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # gaps_df[, scenario := gsub('BAU', 'Reference', scenario)] - gaps_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## refactor - gaps_df[, scenario_title := scenario] - gaps_df[, scenario_title := str_replace(scenario_title, " - ", "\n")] - - ## calculate gaps (BAU - scenario) - bau_gaps_df <- gaps_df[scen_id == "BAU historic production"] - bau_gaps_df <- bau_gaps_df[, c( - "year", - "demo_cat", - "demo_group", - "title", - "num_over_den" - )] - setnames(bau_gaps_df, "num_over_den", "bau_num_over_den") - - gaps_df <- merge( - gaps_df, - bau_gaps_df, - by = c("year", "demo_cat", "demo_group", "title"), - all.x = T - ) - - gaps_df[, gap := num_over_den - bau_num_over_den] - - ## change historic to historical - gaps_df[, scen_id := str_replace(scen_id, "historic", "historical")] - gaps_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - gaps_df[, scenario := str_replace(scenario, "historic", "historical")] - gaps_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - gaps_df$scenario <- factor( - gaps_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - gaps_df$scenario_title <- factor( - gaps_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - ## save figure inputs - fwrite( - gaps_df, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_levels_fig_gaps_pm25_inputs.csv" - ) - ) - # fwrite(gaps_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_levels_fig_gaps_pm25_inputs.csv")) - - ## make figures - ## --------------------------------------------------------- - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - - ## figure a - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - health_gap_fig_a <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race" - ) %>% - mutate( - title = factor(title, levels = c("Black", "Hispanic", "Asian", "white")) - ), - aes(x = year, y = gap, color = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - # ylim(c(-0.31, 0)) + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figa <- health_gap_fig_a + theme(legend.position = "right") - - legend_a <- get_legend( - legend_figa + - theme(legend.text = element_text(size = 8)) - ) - - ## - health_gap_fig_b <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC" - ), - aes(x = year, y = gap, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(-0.31, 0)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - scale_linetype_manual(values = dac_lty) + - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figb <- health_gap_fig_b + theme(legend.position = "right") - - legend_b <- get_legend( - legend_figb + - theme(legend.text = element_text(size = 8)) - ) - - ## - health_gap_fig_c <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = gap, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - scale_linetype_manual(values = poverty_lty) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - # ylim(c(-0.31, 0)) + - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - legend.key.width = unit(10, "mm"), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - legend_figc <- health_gap_fig_c + theme(legend.position = "right") - - legend_c <- get_legend( - legend_figc + - theme(legend.text = element_text(size = 8)) - ) - - ## shared y lab - yaxis_lab <- ggdraw() + - draw_label( - expression(paste( - "PM"[2.5], - " (", - mu, - "g ", - m^{ - -3 - }, - ")", - " per person, difference from reference" - )), - size = 8, - angle = 90 - ) - - # ## plot together - # fig2l_a <- plot_grid( - # health_level_fig_a, - # legend_a, - # align = 'h', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # ncol = 2, - # rel_widths = c(0.95, 0.5), - # rel_heighs = c(1, 1) - # ) - # - # - - gaps_plot_grid <- plot_grid( - health_gap_fig_b, - health_gap_fig_c, - health_gap_fig_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1, 1), - rel_heighs = c(1, 1, 1, 1.05) - ) - - gaps_plot_grid2 <- plot_grid( - yaxis_lab, - gaps_plot_grid, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heighs = c(1, 1) - ) - - gaps_plot_grid2 -} - -########################################################################### -## plot labor -########################################################################### - -plot_labor_levels <- function( - main_path, - save_path, - ref_labor_demog_yr, - refining_mortality, - pop_ratios -) { - # ## calc 2020 pop by demographic - # pop_2020 <- refining_mortality %>% - # filter(year == 2020) %>% - # select(census_tract, year, pop) %>% - # unique() %>% - # left_join(pop_ratios) %>% - # as.data.table() - # - # pop_2020[, demo_pop := pop * pct] - # - # ## summarize by demographic group - # pop_2020 <- pop_2020[, .(pop_2020 = sum(demo_pop)), - # by = .(demo_group, demo_cat)] - - fig2_l_df <- copy(ref_labor_demog_yr) - - ## change scenario names, factor - fig2_l_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # fig2_l_df[, scenario := gsub('BAU', 'Reference', scenario)] - fig2_l_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## scenarios for filtering - # remove_scen <- c('LC1 historic production', 'BAU low exports', 'LC1 historic exports') - remove_scen <- c("Low demand - historical production") - - ## add scenario title - fig2_l_df[, scenario_title := str_replace(scenario, " - ", "\n")] - - # ## sum for state - # fig2_l_df <- fig2_l_df[, .( - # sum_demo_emp = sum(demo_emp), - # sum_demo_comp_pv_h = sum(demo_comp_pv_h), - # sum_demo_comp_pv_l = sum(demo_comp_pv_l) - # ), - # by = .( - # year, demand_scenario, refining_scenario, oil_price_scenario, - # scenario, scenario_title, demo_cat, demo_group, title - # ) - # ] - - # ## merge with 2020 pop - # fig2_l_df <- merge(fig2_l_df, pop_2020, - # by = c("demo_cat", "demo_group"), - # all.x = T) - - # ## calculate per capita - # fig2_l_df[, demo_emp_pc := sum_demo_emp / pop_2020] - # fig2_l_df[, demo_comp_pc_h := sum_demo_comp_pv_h / pop_2020] - # fig2_l_df[, demo_comp_pc_l := sum_demo_comp_pv_l / pop_2020] - # - # ## select columns - # fig2_l_df <- fig2_l_df[, .(year, demand_scenario, refining_scenario, - # scenario, scenario_title, demo_cat, demo_group, title, sum_demo_emp, - # demo_emp_pc, sum_demo_comp_pv_h, sum_demo_comp_pv_l, demo_comp_pc_h, demo_comp_pc_l)] - - ## change historic to historical - fig2_l_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - fig2_l_df[, scenario := str_replace(scenario, "historic", "historical")] - fig2_l_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - ## refactor - fig2_l_df$scenario_title <- factor( - fig2_l_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - ## refactor - fig2_l_df$scenario <- factor( - fig2_l_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - # ## test to see if this matches fig 5 outputs - # test_state <- fig2_l_df %>% - # group_by(demand_scenario, refining_scenario, scenario, scenario_title, demo_cat, demo_group) %>% - # summarise(sum_demo_comp_pv = sum(sum_demo_comp_pv), - # demo_comp_pc = sum(demo_comp_pc)) %>% - # ungroup() - # - # bau_state <- test_state %>% - # filter(demand_scenario == "BAU" & refining_scenario == "historical production") %>% - # select(demo_cat, demo_group, sum_demo_comp_pv, demo_comp_pc) %>% - # rename(bau_comp = sum_demo_comp_pv, - # bau_comp_pc = demo_comp_pc) - # - # test_state <- test_state %>% - # left_join(bau_state) %>% - # mutate(diff = sum_demo_comp_pv - bau_comp, nj, - # diff_pc = demo_comp_pc - bau_comp_pc) - # - # ggplot(test_state %>% filter(!scenario_title %in% c("BAU demand\nhistorical production", - # "Low demand\nhistorical production")), aes(y = diff_pc, x = scenario_title, color = demo_group)) + - # geom_point() + - # facet_wrap(~demo_cat, nrow = 3) - # - - ## save figure inputs - fwrite( - fig2_l_df, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_levels_labor_fig_inputs.csv" - ) - ) - # fwrite(fig2_l_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_levels_labor_fig_inputs.csv")) - - ## labor figure - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - # ## make the df longer - split in two, rbind - # fig2_l_df_h <- fig2_l_df %>% - # select(-sum_demo_comp_pv_l, -demo_comp_pc_l) %>% - # pivot_longer(sum_demo_comp_pv_h:demo_comp_pc_h, names_to = "comp_metric", values_to = "high_est") %>% - # mutate(comp_metric = substr(comp_metric, 1, nchar(comp_metric) - 2)) - # - # fig2_l_df <- fig2_l_df %>% - # select(-sum_demo_comp_pv_h, -demo_comp_pc_h) %>% - # pivot_longer(sum_demo_comp_pv_l:demo_comp_pc_l, names_to = "comp_metric", values_to = "low_est") %>% - # mutate(comp_metric = substr(comp_metric, 1, nchar(comp_metric) - 2)) %>% - # left_join(fig2_l_df_h) - # - - ## labor fig a - labor_level_fig_a <- ggplot( - fig2_l_df %>% - filter( - !scenario %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race", - oil_price_scenario == "reference case" - ) %>% - mutate( - title = factor(title, levels = c("Hispanic", "white", "Asian", "Black")) - ), - aes(x = year, y = sum_demo_emp / 1000, color = title, group = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 45)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # legend_figa <- labor_level_fig_a + theme(legend.position = "right") - # - # legend_a <- get_legend( - # legend_figa + - # theme(legend.text = element_text(size = 8))) - - ## - labor_level_fig_b <- ggplot( - fig2_l_df %>% - filter( - !scenario %in% remove_scen, - demo_cat == "DAC", - oil_price_scenario == "reference case" - ), - aes(x = year, y = sum_demo_emp / 1000, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = dac_lty - ) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 45)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # legend_figb <- labor_level_fig_b + theme(legend.position = "right") - # - # legend_b <- get_legend( - # legend_figb + - # theme(legend.text = element_text(size = 8))) - - ## - labor_level_fig_c <- ggplot( - fig2_l_df %>% - filter( - !scenario %in% remove_scen, - demo_cat == "Poverty", - oil_price_scenario == "reference case" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = sum_demo_emp / 1000, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - scale_color_manual( - name = "", - values = poverty_lty - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 45)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - legend.key.width = unit(10, "mm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # legend_figc <- health_level_fig_c + theme(legend.position = "right") - # - # legend_c <- get_legend( - # legend_figc + - # theme(legend.text = element_text(size = 8))) - - ## shared y lab - yaxis_lab <- ggdraw() + - draw_label("Labor: FTE job-years (thousand)", size = 8, angle = 90) - - # ## plot together - # fig2l_a <- plot_grid( - # health_level_fig_a, - # legend_a, - # align = 'h', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # ncol = 2, - # rel_widths = c(0.95, 0.5), - # rel_heighs = c(1, 1) - # ) - # - # - - fig2_l_plot_grid <- plot_grid( - labor_level_fig_b, - labor_level_fig_c, - labor_level_fig_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1, 1), - rel_heighs = c(1, 1, 1, 1.05) - ) - - fig2_l_plot_grid2 <- plot_grid( - yaxis_lab, - fig2_l_plot_grid, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heighs = c(1, 1) - ) - - fig2_l_plot_grid2 -} - - -plot_labor_levels_pmil <- function( - main_path, - save_path, - ref_labor_demog_yr, - refining_mortality, - pop_ratios -) { - ## calc 2020 pop by demographic - pop_2020 <- refining_mortality %>% - filter(year == 2020) %>% - select(census_tract, year, pop) %>% - unique() %>% - left_join(pop_ratios) %>% - as.data.table() - - pop_2020[, demo_pop := pop * pct] - - ## summarize by demographic group - pop_2020 <- pop_2020[, - .(pop_2020 = sum(demo_pop)), - by = .(demo_group, demo_cat) - ] - - fig2_l_df <- copy(ref_labor_demog_yr) - - ## change scenario names, factor - fig2_l_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # fig2_l_df[, scenario := gsub('BAU', 'Reference', scenario)] - fig2_l_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## scenarios for filtering - # remove_scen <- c('LC1 historic production', 'BAU low exports', 'LC1 historic exports') - remove_scen <- c("Low demand - historical production") - - ## add scenario title - fig2_l_df[, scenario_title := str_replace(scenario, " - ", "\n")] - - # - # ## sum for state - # fig2_l_df <- fig2_l_df[, .( - # sum_demo_emp = sum(demo_emp), - # sum_demo_comp_pv_h = sum(demo_comp_pv_h), - # sum_demo_comp_pv_l = sum(demo_comp_pv_l) - # ), - # by = .( - # year, demand_scenario, refining_scenario, oil_price_scenario, - # scenario, scenario_title, demo_cat, demo_group, title - # ) - # ] - - ## merge with 2020 pop - fig2_l_df <- merge( - fig2_l_df, - pop_2020, - by = c("demo_cat", "demo_group"), - all.x = T - ) - - ## calculate per capita - fig2_l_df[, demo_emp_pc := sum_demo_emp / pop_2020] - fig2_l_df[, demo_emp_pmil := demo_emp_pc * 1e6] - fig2_l_df[, demo_comp_pc_h := sum_demo_comp_pv_h / pop_2020] - fig2_l_df[, demo_comp_pc_pmil_h := demo_comp_pc_h * 1e6] - fig2_l_df[, demo_comp_pc_l := sum_demo_comp_pv_l / pop_2020] - fig2_l_df[, demo_comp_pc_pmil_l := demo_comp_pc_l * 1e6] - - ## select columns - fig2_l_df <- fig2_l_df[, .( - year, - demand_scenario, - refining_scenario, - oil_price_scenario, - scenario, - scenario_title, - demo_cat, - demo_group, - title, - sum_demo_emp, - demo_emp_pc, - demo_emp_pmil, - sum_demo_comp_pv_h, - sum_demo_comp_pv_l, - demo_comp_pc_pmil_h, - demo_comp_pc_pmil_l, - demo_comp_pc_h, - demo_comp_pc_l - )] - - ## change historic to historical - fig2_l_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - fig2_l_df[, scenario := str_replace(scenario, "historic", "historical")] - fig2_l_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - ## refactor - fig2_l_df$scenario_title <- factor( - fig2_l_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - ## refactor - fig2_l_df$scenario <- factor( - fig2_l_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - # ## test to see if this matches fig 5 outputs - # test_state <- fig2_l_df %>% - # group_by(demand_scenario, refining_scenario, scenario, scenario_title, demo_cat, demo_group) %>% - # summarise(sum_demo_comp_pv = sum(sum_demo_comp_pv), - # demo_comp_pc = sum(demo_comp_pc)) %>% - # ungroup() - # - # bau_state <- test_state %>% - # filter(demand_scenario == "BAU" & refining_scenario == "historical production") %>% - # select(demo_cat, demo_group, sum_demo_comp_pv, demo_comp_pc) %>% - # rename(bau_comp = sum_demo_comp_pv, - # bau_comp_pc = demo_comp_pc) - # - # test_state <- test_state %>% - # left_join(bau_state) %>% - # mutate(diff = sum_demo_comp_pv - bau_comp, nj, - # diff_pc = demo_comp_pc - bau_comp_pc) - # - # ggplot(test_state %>% filter(!scenario_title %in% c("BAU demand\nhistorical production", - # "Low demand\nhistorical production")), aes(y = diff_pc, x = scenario_title, color = demo_group)) + - # geom_point() + - # facet_wrap(~demo_cat, nrow = 3) - # - - ## save figure inputs - fwrite( - fig2_l_df, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_levels_labor_pmil_fig_inputs.csv" - ) - ) - # fwrite(fig2_l_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_levels_labor_pmil_fig_inputs.csv")) - - ## labor figure - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - ## make the df longer - split in two, rbind - fig2_l_df_h <- fig2_l_df %>% - select(-sum_demo_comp_pv_l, -demo_comp_pc_pmil_l, -demo_comp_pc_l) %>% - pivot_longer( - sum_demo_comp_pv_h:demo_comp_pc_h, - names_to = "comp_metric", - values_to = "no_re_emp" - ) %>% - mutate(comp_metric = substr(comp_metric, 1, nchar(comp_metric) - 2)) %>% - as.data.table() - - fig2_l_df <- fig2_l_df %>% - select(-sum_demo_comp_pv_h, -demo_comp_pc_pmil_h, -demo_comp_pc_h) %>% - pivot_longer( - sum_demo_comp_pv_l:demo_comp_pc_l, - names_to = "comp_metric", - values_to = "with_re_emp" - ) %>% - mutate(comp_metric = substr(comp_metric, 1, nchar(comp_metric) - 2)) %>% - left_join(fig2_l_df_h) %>% - as.data.table() - - ## just employment - fig2_l_df <- fig2_l_df %>% - select(year:demo_emp_pmil) %>% - unique() - - ## labor fig a - labor_level_fig_a <- ggplot( - fig2_l_df %>% - filter( - !scenario %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race", - oil_price_scenario == "reference case" - ) %>% - mutate( - title = factor(title, levels = c("Hispanic", "white", "Asian", "Black")) - ), - aes(x = year, y = demo_emp_pmil, color = title, group = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 3500)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # legend_figa <- labor_level_fig_a + theme(legend.position = "right") - # - # legend_a <- get_legend( - # legend_figa + - # theme(legend.text = element_text(size = 8))) - - ## - labor_level_fig_b <- ggplot( - fig2_l_df %>% - filter( - !scenario %in% remove_scen, - demo_cat == "DAC", - oil_price_scenario == "reference case" - ), - aes(x = year, y = demo_emp_pmil, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = dac_lty - ) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 3500)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # legend_figb <- labor_level_fig_b + theme(legend.position = "right") - # - # legend_b <- get_legend( - # legend_figb + - # theme(legend.text = element_text(size = 8))) - - ## - labor_level_fig_c <- ggplot( - fig2_l_df %>% - filter( - !scenario %in% remove_scen, - demo_cat == "Poverty", - oil_price_scenario == "reference case" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = demo_emp_pmil, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - scale_color_manual( - name = "", - values = poverty_lty - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(0, 3500)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - legend.key.width = unit(10, "mm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # legend_figc <- health_level_fig_c + theme(legend.position = "right") - # - # legend_c <- get_legend( - # legend_figc + - # theme(legend.text = element_text(size = 8))) - - ## shared y lab - yaxis_lab <- ggdraw() + - draw_label("Labor: FTE job-years per million people", size = 8, angle = 90) - - # ## plot together - # fig2l_a <- plot_grid( - # health_level_fig_a, - # legend_a, - # align = 'h', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # ncol = 2, - # rel_widths = c(0.95, 0.5), - # rel_heighs = c(1, 1) - # ) - # - # - - fig2_l_plot_grid <- plot_grid( - labor_level_fig_b, - labor_level_fig_c, - labor_level_fig_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1, 1), - rel_heighs = c(1, 1, 1, 1.05) - ) - - fig2_l_plot_grid2 <- plot_grid( - yaxis_lab, - fig2_l_plot_grid, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heighs = c(1, 1) - ) - - fig2_l_plot_grid2 -} - - -plot_labor_levels_gaps <- function( - main_path, - save_path, - ref_labor_demog_yr, - refining_mortality, - pop_ratios -) { - # ## calc 2020 pop by demographic - # pop_2020 <- refining_mortality %>% - # filter(year == 2020) %>% - # select(census_tract, year, pop) %>% - # unique() %>% - # left_join(pop_ratios) %>% - # as.data.table() - # - # pop_2020[, demo_pop := pop * pct] - # - # ## summarize by demographic group - # pop_2020 <- pop_2020[, .(pop_2020 = sum(demo_pop)), - # by = .(demo_group, demo_cat)] - # - ## labor outputs - l_gaps_df <- copy(ref_labor_demog_yr) - l_gaps_df <- l_gaps_df[oil_price_scenario == "reference case", ] - - ## change scenario names, factor - l_gaps_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # gaps_df[, scenario := gsub('BAU', 'Reference', scenario)] - l_gaps_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## add scenario title - l_gaps_df[, scenario_title := scenario] - l_gaps_df[, scenario_title := str_replace(scenario_title, " - ", "\n")] - - ## change historic to historical - l_gaps_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - l_gaps_df[, scenario := str_replace(scenario, "historic", "historical")] - l_gaps_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - ## scenarios for filtering - remove_scen <- c( - "Low demand - historical production", - "BAU demand - historical production" - ) - - l_gaps_df$scenario <- factor( - l_gaps_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - l_gaps_df$scenario_title <- factor( - l_gaps_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - # ## sum for state - # l_gaps_df <- l_gaps_df[, .(sum_demo_emp = sum(demo_emp)), - # by = .( - # year, demand_scenario, refining_scenario, oil_price_scenario, - # scenario, scenario_title, demo_cat, demo_group, title - # ) - # ] - - ## calculate gaps (BAU - scenario) - l_bau_gaps_df <- l_gaps_df[scenario == "BAU demand - historical production"] - l_bau_gaps_df <- l_bau_gaps_df[, c( - "year", - "demo_cat", - "demo_group", - "title", - "sum_demo_emp" - )] - setnames(l_bau_gaps_df, "sum_demo_emp", "bau_sum_demo_emp") - - l_gaps_df <- merge( - l_gaps_df, - l_bau_gaps_df, - by = c("year", "demo_cat", "demo_group", "title"), - all.x = T - ) - - l_gaps_df[, gap_emp := sum_demo_emp - bau_sum_demo_emp] - - # ## normalize if needed - # ## merge with 2020 pop - # l_gaps_df <- merge(l_gaps_df, pop_2020, - # by = c("demo_cat", "demo_group"), - # all.x = T) - # - # ## calculate per capita - # l_gaps_df[, demo_emp_pc := sum_demo_emp / pop_2020] - # - # ## select columns - l_gaps_df <- l_gaps_df[, .( - year, - demand_scenario, - refining_scenario, - oil_price_scenario, - scenario, - scenario_title, - demo_cat, - demo_group, - title, - sum_demo_emp, - gap_emp - )] - - ## save figure inputs - fwrite( - l_gaps_df, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_labor_levels_fig_gaps_inputs.csv" - ) - ) - # fwrite(l_gaps_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_labor_levels_fig_gaps_inputs.csv")) - - ## figure a - fig_title_vec <- c("Black", "Asian", "white", "Hispanic") - - labor_gap_fig_a <- ggplot( - l_gaps_df %>% - filter( - !scenario %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race", - oil_price_scenario == "reference case" - ) %>% - mutate( - title = factor(title, levels = c("Black", "Asian", "white", "Hispanic")) - ), - aes(x = year, y = gap_emp / 1000, color = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(-40, 0)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # legend_figa <- health_gap_fig_a + theme(legend.position = "right") - # - # legend_a <- get_legend( - # legend_figa + - # theme(legend.text = element_text(size = 8))) - - ## - labor_gap_fig_b <- ggplot( - l_gaps_df %>% - filter( - !scenario %in% remove_scen, - demo_cat == "DAC", - oil_price_scenario == "reference case" - ), - aes(x = year, y = gap_emp / 1000, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_linetype_manual(values = dac_lty) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(-40, 0)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - # ylim(c(-3500, 0)) + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # legend_figb <- health_gap_fig_b + theme(legend.position = "right") - # - # legend_b <- get_legend( - # legend_figb + - # theme(legend.text = element_text(size = 8))) - - ## - labor_gap_fig_c <- ggplot( - l_gaps_df %>% - filter( - !scenario %in% remove_scen, - demo_cat == "Poverty", - oil_price_scenario == "reference case" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = gap_emp / 1000, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - scale_linetype_manual(values = poverty_lty) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(-40, 0)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - legend.key.width = unit(10, "mm"), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - # - # legend_figc <- health_gap_fig_c + theme(legend.position = "right") - # - # legend_c <- get_legend( - # legend_figc + - # theme(legend.text = element_text(size = 8))) - - ## shared y lab - yaxis_lab <- ggdraw() + - draw_label( - "Labor: FTE-jobs, difference from reference (thousand)", - size = 8, - angle = 90 - ) - - # ## plot together - # fig2l_a <- plot_grid( - # health_level_fig_a, - # legend_a, - # align = 'h', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # ncol = 2, - # rel_widths = c(0.95, 0.5), - # rel_heighs = c(1, 1) - # ) - # - # - - l_gaps_plot_grid <- plot_grid( - labor_gap_fig_b, - labor_gap_fig_c, - labor_gap_fig_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1, 1), - rel_heighs = c(1, 1, 1, 1.05) - ) - - l_gaps_plot_grid2 <- plot_grid( - yaxis_lab, - l_gaps_plot_grid, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heighs = c(1, 1) - ) - - l_gaps_plot_grid2 -} -# - -plot_labor_levels_gaps_pmil <- function( - main_path, - save_path, - ref_labor_demog_yr, - refining_mortality, - pop_ratios -) { - ## calc 2020 pop by demographic - pop_2020 <- refining_mortality %>% - filter(year == 2020) %>% - select(census_tract, year, pop) %>% - unique() %>% - left_join(pop_ratios) %>% - as.data.table() - - pop_2020[, demo_pop := pop * pct] - - ## summarize by demographic group - pop_2020 <- pop_2020[, - .(pop_2020 = sum(demo_pop)), - by = .(demo_group, demo_cat) - ] - - ## labor outputs - l_gaps_df <- copy(ref_labor_demog_yr) - - ## change scenario names, factor - l_gaps_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # gaps_df[, scenario := gsub('BAU', 'Reference', scenario)] - l_gaps_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## add scenario title - l_gaps_df[, scenario_title := scenario] - l_gaps_df[, scenario_title := str_replace(scenario_title, " - ", "\n")] - - ## change historic to historical - l_gaps_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - l_gaps_df[, scenario := str_replace(scenario, "historic", "historical")] - l_gaps_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - ## scenarios for filtering - remove_scen <- c( - "Low demand - historical production", - "BAU demand - historical production" - ) - - l_gaps_df$scenario <- factor( - l_gaps_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - l_gaps_df$scenario_title <- factor( - l_gaps_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - # ## sum for state - # l_gaps_df <- l_gaps_df[, .(sum_demo_emp = sum(demo_emp)), - # by = .( - # year, demand_scenario, refining_scenario, oil_price_scenario, - # scenario, scenario_title, demo_cat, demo_group, title - # ) - # ] - - ## select columns - l_gaps_df <- l_gaps_df[, .( - year, - demand_scenario, - refining_scenario, - oil_price_scenario, - scenario, - scenario_title, - demo_cat, - demo_group, - title, - sum_demo_emp - )] - - l_gaps_df <- l_gaps_df[oil_price_scenario == "reference case", ] - - ## calculate gaps (BAU - scenario) - l_bau_gaps_df <- l_gaps_df[scenario == "BAU demand - historical production"] - l_bau_gaps_df <- l_bau_gaps_df[, c( - "year", - "demo_cat", - "demo_group", - "title", - "sum_demo_emp" - )] - setnames(l_bau_gaps_df, "sum_demo_emp", "bau_sum_demo_emp") - - l_gaps_df <- merge( - l_gaps_df, - l_bau_gaps_df, - by = c("year", "demo_cat", "demo_group", "title"), - all.x = T - ) - - l_gaps_df[, gap_emp := sum_demo_emp - bau_sum_demo_emp] - - ## merge with 2020 pop - l_gaps_df <- merge( - l_gaps_df, - pop_2020, - by = c("demo_cat", "demo_group"), - all.x = T - ) - - ## calculate per capita - l_gaps_df[, gap_emp_pc := gap_emp / pop_2020] - l_gaps_df[, gap_emp_pmil := gap_emp_pc * 1e6] - - ## save figure inputs - fwrite( - l_gaps_df, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_labor_levels_fig_gaps_pmil_inputs.csv" - ) - ) - # fwrite(l_gaps_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_labor_levels_fig_gaps_pmil_inputs.csv")) - - ## figure a - fig_title_vec <- c("Black", "Asian", "white", "Hispanic") - - labor_gap_fig_a <- ggplot( - l_gaps_df %>% - filter( - !scenario %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race", - oil_price_scenario == "reference case" - ) %>% - mutate( - title = factor(title, levels = c("Black", "Asian", "white", "Hispanic")) - ), - aes(x = year, y = gap_emp_pmil, color = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - # ylim(-2500, 0) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # legend_figa <- health_gap_fig_a + theme(legend.position = "right") - # - # legend_a <- get_legend( - # legend_figa + - # theme(legend.text = element_text(size = 8))) - - ## - labor_gap_fig_b <- ggplot( - l_gaps_df %>% - filter( - !scenario %in% remove_scen, - demo_cat == "DAC", - oil_price_scenario == "reference case" - ), - aes(x = year, y = gap_emp_pmil, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_linetype_manual(values = dac_lty) + - labs( - x = NULL, - y = NULL - ) + - # ylim(-2500, 0) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - # ylim(c(-3500, 0)) + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # legend_figb <- health_gap_fig_b + theme(legend.position = "right") - # - # legend_b <- get_legend( - # legend_figb + - # theme(legend.text = element_text(size = 8))) - - ## - labor_gap_fig_c <- ggplot( - l_gaps_df %>% - filter( - !scenario %in% remove_scen, - demo_cat == "Poverty", - oil_price_scenario == "reference case" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = gap_emp_pmil, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - scale_linetype_manual(values = poverty_lty) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - # ylim(-2500, 0) + - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - legend.key.width = unit(10, "mm"), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - # - # legend_figc <- health_gap_fig_c + theme(legend.position = "right") - # - # legend_c <- get_legend( - # legend_figc + - # theme(legend.text = element_text(size = 8))) - - ## shared y lab - yaxis_lab <- ggdraw() + - draw_label( - "Labor: FTE-jobs, difference from reference per million people", - size = 8, - angle = 90 - ) - - # ## plot together - # fig2l_a <- plot_grid( - # health_level_fig_a, - # legend_a, - # align = 'h', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # ncol = 2, - # rel_widths = c(0.95, 0.5), - # rel_heighs = c(1, 1) - # ) - # - # - - l_gaps_plot_grid <- plot_grid( - labor_gap_fig_b, - labor_gap_fig_c, - labor_gap_fig_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1, 1), - rel_heighs = c(1, 1, 1, 1.05) - ) - - l_gaps_plot_grid2 <- plot_grid( - yaxis_lab, - l_gaps_plot_grid, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heighs = c(1, 1) - ) - - l_gaps_plot_grid2 -} - - -############################################################################ -############################################################################ - -plot_hl_levels_df <- function( - main_path, - save_path, - ref_mortality_demog, - ref_labor_demog, - state_ghg_output, - dt_ghg_2019 -) { - health_df <- copy(ref_mortality_demog) - - ## group by scenario, demo_cat, demo_group, title, and sum - health_df <- health_df[, - .( - sum_cost_2019_pv = sum(demo_cost_2019_PV, na.rm = T), ## constant VSL - sum_cost_pv = sum(demo_cost_PV, na.rm = T) - ), ## changing VSL - by = .( - scen_id, - demand_scenario, - refining_scenario, - demo_cat, - demo_group, - title - ) - ] - - ## multiply by -1 - health_df[, sum_cost_2019_pv := sum_cost_2019_pv * -1] - health_df[, sum_cost_pv := sum_cost_pv * -1] - - ## add ghg emission reduction ---------------------------- - ## 2019 ghg - ghg_2019_val <- dt_ghg_2019$mtco2e[1] - - ## 2045 vs 2019 ghg - ghg_2045 <- state_ghg_output[year == 2045 & source == "total"] - setnames(ghg_2045, "value", "ghg_kg") - ghg_2045[, ghg_2045 := (ghg_kg / 1000) / 1e6] - ghg_2045[, ghg_2019 := ghg_2019_val] - ghg_2045[, perc_diff := (ghg_2045 - ghg_2019) / ghg_2019] - - perc_diff_df <- ghg_2045[, .( - demand_scenario, - refining_scenario, - ghg_2045, - ghg_2019, - perc_diff - )] - - ## summarize by scenario, filter for total - state_ghg_df <- state_ghg_output[ - source == "total", - .(total_ghg = sum(value)), - by = .(demand_scenario, refining_scenario) - ] - - state_ghg_df[, total_ghg_mmt := (total_ghg / 1000) / 1e6] - - ## reference - ref_df <- state_ghg_df[ - demand_scenario == "BAU" & refining_scenario == "historic production", - .(total_ghg_mmt) - ] - setnames(ref_df, "total_ghg_mmt", "ref_ghg_mmt") - ref_value <- ref_df$ref_ghg_mmt[1] - - ## merge with summarized df - state_ghg_df[, ref_ghg := ref_value] - state_ghg_df[, avoided_ghg := (total_ghg_mmt - ref_value) * -1] - - ## merge with health - health_ghg_df <- merge( - health_df, - state_ghg_df[, .( - demand_scenario, - refining_scenario, - total_ghg_mmt, - ref_ghg, - avoided_ghg - )], - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## labor - labor_df <- copy(ref_labor_demog) - labor_df <- labor_df[oil_price_scenario == "reference case", ] - - ## summarize across years - labor_df <- labor_df[, - .( - sum_demo_emp = sum(sum_demo_emp), - sum_demo_comp_pv_h = sum(sum_demo_comp_pv_h), - sum_demo_comp_pv_l = sum(sum_demo_comp_pv_l) - ), - by = .(demand_scenario, refining_scenario, demo_cat, demo_group, title) - ] - - ## ref labor - ref_labor <- labor_df[ - demand_scenario == "BAU" & refining_scenario == "historic production" - ] - setnames( - ref_labor, - c("sum_demo_emp", "sum_demo_comp_pv_h", "sum_demo_comp_pv_l"), - c("ref_total_emp", "ref_total_comp_pv_h", "ref_total_comp_pv_l") - ) - ref_labor <- ref_labor[, .( - demo_cat, - demo_group, - title, - ref_total_emp, - ref_total_comp_pv_h, - ref_total_comp_pv_l - )] - - ## add values to labor - labor_df <- merge( - labor_df, - ref_labor, - by = c("demo_cat", "demo_group", "title") - ) - - ## calculate difference - labor_df[, forgone_wages_h := (sum_demo_comp_pv_h - ref_total_comp_pv_h)] - labor_df[, forgone_wages_l := (sum_demo_comp_pv_l - ref_total_comp_pv_l)] - - ## merge with health and ghg - health_labor_ghg_df <- merge( - health_ghg_df, - labor_df[, .( - demand_scenario, - refining_scenario, - demo_cat, - demo_group, - title, - sum_demo_comp_pv_h, - sum_demo_comp_pv_l, - ref_total_comp_pv_h, - ref_total_comp_pv_l, - forgone_wages_h, - forgone_wages_l - )], - by = c( - "demand_scenario", - "refining_scenario", - "demo_cat", - "demo_group", - "title" - ), - all.x = T - ) - - ## add ghg perc reduction - health_labor_ghg_df <- merge( - health_labor_ghg_df, - perc_diff_df, - by = c("demand_scenario", "refining_scenario"), - all.x = T - ) - - ## prepare to plot - plot_df <- health_labor_ghg_df[, .( - scen_id, - demand_scenario, - refining_scenario, - demo_cat, - demo_group, - title, - sum_cost_pv, - sum_cost_2019_pv, - forgone_wages_h, - forgone_wages_l, - avoided_ghg, - perc_diff - )] - - setnames(plot_df, "perc_diff", "ghg_perc_diff") - - ## pivot longer - plot_df <- plot_df %>% - select( - scen_id:title, - ghg_perc_diff, - sum_cost_pv, - sum_cost_2019_pv, - forgone_wages_h, - forgone_wages_l - ) %>% - pivot_longer( - sum_cost_pv:forgone_wages_l, - names_to = "metric", - values_to = "value" - ) - - ## add column for vsl - plot_df_health <- plot_df %>% - filter(metric %in% c("sum_cost_pv", "sum_cost_2019_pv")) %>% - mutate( - segment = "health", - unit_desc = ifelse( - metric == "sum_cost_2019_pv", - "USD (2019 VSL)", - "USD (annual VSL)" - ), - metric_desc = "avoided_health_cost" - ) - - plot_df_labor <- plot_df %>% - filter(metric %in% c("forgone_wages_h", "forgone_wages_l")) %>% - mutate( - segment = "labor", - unit_desc = "USD", - metric_desc = "forgone_wages" - ) - - plot_df_long <- rbind(plot_df_health, plot_df_labor) - - plot_df_long <- plot_df_long %>% - mutate( - seg_title = ifelse( - segment == "health", - "Health: avoided mortality", - "Labor: forgone wages" - ) - ) - - ## rename - setDT(plot_df_long) - plot_df_long[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # plot_df_long[, scenario := gsub('BAU', 'Reference', scenario)] - plot_df_long[, scenario := gsub("LC1.", "Low ", scenario)] - # plot_df_long[, short_scen := gsub('BAU', 'Reference', short_scen)] - # plot_df_long[, short_scen := gsub('Low C.', 'Low carbon', short_scen)] - - ## change historic to historical - plot_df_long[, scen_id := str_replace(scen_id, "historic", "historical")] - plot_df_long[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - plot_df_long[, scenario := str_replace(scenario, "historic", "historical")] - - ## refactor - plot_df_long$scenario <- factor( - plot_df_long$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - ## titles for plotting - plot_df_long[, - demand_title := ifelse(demand_scenario == "BAU", "BAU demand", "Low demand") - ] - plot_df_long[, - scen_title := paste0(demand_title, "\n", str_to_sentence(refining_scenario)) - ] - - plot_df_long$scen_title <- factor( - plot_df_long$scen_title, - levels = c( - "BAU demand\nHistorical production", - "BAU demand\nHistorical exports", - "BAU demand\nLow exports", - "Low demand\nHistorical exports", - "Low demand\nLow exports", - "Low demand\nHistorical production" - ) - ) - - ## save figure inputs - fwrite( - plot_df_long, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_disaggregated_npv_fig_inputs.csv" - ) - ) - # fwrite(plot_df_long, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_disaggregated_npv_fig_inputs.csv")) - - return(plot_df_long) -} - - -plot_hl_levels <- function(demographic_npv_df) { - plot_df_long <- copy(demographic_npv_df) - - ## create the figure --------------------------------------------- - ## --------------------------------------------------------------- - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - bau_scen <- "BAU historical production" - - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - ## add column for defining shapes - plot_df_long[, demo_grp_metric := paste0(demo_group, "_", metric)] - - ## health fig - race - health_level_fig_a <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Race", - unit_desc == "USD (2019 VSL)", - title %in% fig_title_vec - ) %>% - mutate( - title = factor( - title, - levels = c("Black", "Asian", "white", "Hispanic") - ) - ), - aes(x = scen_title, y = value / 1e9, color = title), - size = 3, - alpha = 0.8 - ) + - facet_wrap(~seg_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - # ylim(0, 12) + - labs( - y = "NPV (USD billion)", - x = NULL, - color = NULL - ) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## labor fig - race - labor_level_fig_a <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Race", - segment == "labor", - title %in% fig_title_vec - ) %>% - mutate( - title = factor( - title, - levels = c("Black", "Asian", "white", "Hispanic") - ) - ), - aes(x = scen_title, y = value / 1e9, color = title, shape = metric), - size = 3, - alpha = 0.8 - ) + - facet_wrap(~seg_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - scale_shape_manual( - name = "", - values = race_shape_ptc, - labels = high_low_labs - ) + - # ylim(-25, 0) + - labs( - y = "NPV (USD billion)", - x = NULL, - color = NULL - ) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## health fig - poverty - health_level_fig_b <- ggplot() + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty", - unit_desc == "USD (2019 VSL)" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = scen_title, y = value / 1e9, shape = title), - color = "black", - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - scale_shape_manual(values = poverty_ptc_h) + - facet_wrap(~seg_title) + - labs( - y = "NPV (USD billion)", - x = NULL, - color = NULL - ) + - theme_line + - # ylim(0, 20) + - theme( - legend.position = "none", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## labor fig - poverty - labor_level_fig_b <- ggplot() + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty", - segment == "labor" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = scen_title, y = value / 1e9, shape = demo_grp_metric), - color = "black", - size = 3, - alpha = 0.8 - ) + - scale_shape_manual( - values = poverty_ptc_l, - labels = poverty_hl_labs - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_wrap(~seg_title) + - labs( - y = "NPV (USD billion)", - x = NULL, - color = NULL - ) + - # ylim(-50, 0) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## health fig - DAC - health_level_fig_c <- ggplot() + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC", - unit_desc == "USD (2019 VSL)" - ), - aes(x = scen_title, y = value / 1e9, shape = title), - color = "black", - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - scale_shape_manual(values = dac_ptc) + - facet_wrap(~seg_title) + - labs( - y = "NPV (USD billion)", - x = NULL, - color = NULL - ) + - # ylim(0, 15) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## labor fig - DAC - labor_level_fig_c <- ggplot() + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC", - segment == "labor" - ), - aes(x = scen_title, y = value / 1e9, shape = title), - color = "black", - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - scale_shape_manual( - values = dac_ptc - ) + - facet_wrap(~seg_title) + - labs( - y = "NPV (USD billion)", - x = NULL, - color = NULL - ) + - # ylim(-40, 0) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## labor fig - DAC - labor_level_fig_c <- ggplot() + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC", - segment == "labor" - ), - aes(x = scen_title, y = value / 1e9, shape = demo_grp_metric), - color = "black", - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - scale_shape_manual( - values = dac_hl_ptc, - labels = dac_hl_labs - ) + - facet_wrap(~seg_title) + - labs( - y = "NPV (USD billion)", - x = NULL, - color = NULL - ) + - # ylim(-40, 0) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## combine figure - ## --------------------------------- - - fig_text_size <- 12 - - ## health - health_column_fig_nl <- plot_grid( - health_level_fig_c + - theme( - axis.text.x = element_blank(), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1), - strip.text.x = element_text(size = fig_text_size), - axis.text.y = element_text(size = fig_text_size), - axis.title.y = element_text(size = fig_text_size) - ), - health_level_fig_b + - theme( - axis.text.x = element_blank(), - strip.text.x = element_blank(), - axis.text.y = element_text(size = fig_text_size), - axis.title.y = element_text(size = fig_text_size), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1) - ), - health_level_fig_a + - theme( - strip.text.x = element_blank(), - axis.text.y = element_text(size = fig_text_size), - axis.title.y = element_text(size = fig_text_size), - axis.text.x = element_text(size = fig_text_size), - legend.position = "none" - ), - align = "vh", - labels = c("A", "B", "C"), - # # labels = 'AUTO', - label_size = 10, - hjust = -1, - nrow = 3 - # rel_widths = c(1, 0.25, 1), - # rel_heights = c(1, 0.1, 1, 0.1, 1) - ) - - ## labor - labor_column_fig_nl <- plot_grid( - labor_level_fig_c + - labs(y = NULL) + - theme( - axis.text.x = element_blank(), - strip.text.x = element_text(size = fig_text_size), - axis.text.y = element_text(size = fig_text_size), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1) - ), - labor_level_fig_b + - labs(y = NULL) + - theme( - axis.text.x = element_blank(), - axis.text.y = element_text(size = fig_text_size), - strip.text.x = element_blank(), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1) - ), - labor_level_fig_a + - labs(y = NULL) + - theme( - strip.text.x = element_blank(), - axis.text.y = element_text(size = fig_text_size), - axis.text.x = element_text(size = fig_text_size), - legend.position = "none" - ), - align = "vh", - labels = c("D", "E", "F"), - # # labels = 'AUTO', - label_size = 10, - hjust = -1, - nrow = 3 - # rel_widths = c(1, 0.25, 1), - # rel_heights = c(1, 0.1, 1, 0.1, 1) - ) - - ## all together now - hl_pc_plot_grid_nl <- plot_grid( - health_column_fig_nl, - labor_column_fig_nl, - align = "h", - # labels = c("(A)", "(B)", "(C)", ""), - # # labels = 'AUTO', - # label_size = 10, - # hjust = -1, - ncol = 2, - rel_widths = c(1, 1) - # rel_widths = c(1, 1, 1) - ) - - return(hl_pc_plot_grid_nl) -} - -plot_hl_levels_pc <- function( - demographic_npv_df, - refining_mortality, - pop_ratios, - main_path, - save_path -) { - ## copy npv results - plot_df_long <- copy(demographic_npv_df) - - ## add column for defining shapes - plot_df_long[, demo_grp_metric := paste0(demo_group, "_", metric)] - - ## calc 2020 pop by demographic - pop_2020 <- refining_mortality %>% - filter(year == 2020) %>% - select(census_tract, year, pop) %>% - unique() %>% - left_join(pop_ratios) %>% - as.data.table() - - pop_2020[, demo_pop := pop * pct] - - ## summarize by demographic group - pop_2020 <- pop_2020[, - .(pop_2020 = sum(demo_pop)), - by = .(demo_group, demo_cat) - ] - - ## merge population back with results - plot_df_long <- merge( - plot_df_long, - pop_2020, - by = c("demo_group", "demo_cat"), - all.x = T - ) - - ## calculate per capita - plot_df_long[, value := value / pop_2020] - - ## save figure inputs - fwrite( - plot_df_long, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_disaggregated_npv_pc_fig_inputs.csv" - ) - ) - # fwrite(plot_df_long, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_disaggregated_npv_pc_fig_inputs.csv")) - - ## create the figure --------------------------------------------- - ## --------------------------------------------------------------- - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - bau_scen <- "BAU historical production" - - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - ## health fig - race - health_level_fig_a <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Race", - unit_desc == "USD (2019 VSL)", - title %in% fig_title_vec - ) %>% - mutate( - title = factor( - title, - levels = c("Black", "Hispanic", "Asian", "white") - ) - ), - aes(x = scen_title, y = value, color = title), - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_wrap(~seg_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - y = "NPV per capita (USD)", - x = NULL, - color = NULL - ) + - scale_y_continuous(label = comma, limits = c(0, 3000)) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - strip.text = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## labor fig - race - labor_level_fig_a <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Race", - segment == "labor", - title %in% fig_title_vec - ) %>% - mutate( - title = factor( - title, - levels = c("Black", "Hispanic", "Asian", "white") - ) - ), - aes(x = scen_title, y = value, color = title, shape = metric), - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_wrap(~seg_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - scale_shape_manual( - name = "", - values = race_shape_ptc, - labels = high_low_labs - ) + - labs( - y = " ", - x = NULL, - color = NULL - ) + - scale_y_continuous(label = comma, limits = c(-3000, 0)) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - strip.text = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # ## legend - # legend_figa <- labor_level_fig_a + theme(legend.position = "bottom") - # - # legend_a <- get_legend( - # legend_figa + - # theme(legend.text = element_text(size = 12)) + - # guides(color = guide_legend(order = 1), shape = guide_legend(order = 2))) - - # ## save version for presentation - # hl_plot_grid_a_pres <- plot_grid( - # health_level_fig_a + - # theme(axis.title.y = element_text(size = 12), - # axis.text.x = element_text(size = 9), - # axis.text.y = element_text(size = 12), - # strip.text = element_text(size = 12), - # plot.margin = unit(c(0, 0, 0.25, 0.1), "cm")), - # labor_level_fig_a + labs(y = NULL) + - # theme(axis.title.y = element_text(size = 12), - # axis.text.x = element_text(size = 9), - # axis.text.y = element_text(size = 12), - # strip.text = element_text(size = 12), - # plot.margin = unit(c(0, 0, 0.25, 0.1), "cm")), - # align = 'vh', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # rel_widths = c(1, 1) - # ) - # - # ## add legend - # hl_plot_grid_a_pres <- plot_grid( - # hl_plot_grid_a_pres, - # legend_a, - # ncol = 1, - # rel_heights = c(0.95, 0.05) - # ) - # - # - # - # ggsave(plot = hl_plot_grid_a_pres, - # filename = paste0(main_path, "outputs/academic-out/refining/figures/2025-health-revisions/presentation-figs/fig5-race.jpeg"), - # device = "jpeg", - # width = 9, - # height = 4, - # units= "in", - # dpi = 300) - # - - ## health fig - poverty - health_level_fig_b <- ggplot() + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty", - unit_desc == "USD (2019 VSL)" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = scen_title, y = value, shape = title), - color = "black", - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - scale_shape_manual(values = poverty_ptc_h) + - facet_wrap(~seg_title) + - labs( - y = "NPV per capita (USD)", - x = NULL, - color = NULL - ) + - theme_line + - scale_y_continuous(label = comma, limits = c(0, 3000)) + - theme( - legend.position = "none", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## labor fig - poverty - labor_level_fig_b <- ggplot() + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty", - segment == "labor" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = scen_title, y = value, shape = demo_grp_metric), - color = "black", - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - scale_shape_manual( - values = poverty_ptc_l, - labels = poverty_hl_labs - ) + - facet_wrap(~seg_title) + - labs( - y = " ", - x = NULL, - color = NULL - ) + - scale_y_continuous(label = comma, limits = c(-3000, 0)) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # legend_figb <- labor_level_fig_b + - # theme(legend.position = "bottom") - # - # legend_b <- get_legend( - # legend_figb + - # theme(legend.text = element_text(size = 12))) - # - - # ## save version for presentation - # hl_plot_grid_b_pres <- plot_grid( - # health_level_fig_b + - # theme(axis.title.y = element_text(size = 12), - # axis.text.x = element_text(size = 9), - # axis.text.y = element_text(size = 12), - # strip.text = element_text(size = 12), - # plot.margin = unit(c(0, 0, 0.25, 0.1), "cm")), - # labor_level_fig_b + labs(y = NULL) + - # theme(axis.title.y = element_text(size = 12), - # axis.text.x = element_text(size = 9), - # axis.text.y = element_text(size = 12), - # strip.text = element_text(size = 12), - # plot.margin = unit(c(0, 0, 0.25, 0.1), "cm")), - # align = 'vh', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # rel_widths = c(1, 1) - # ) - # - # ## add legend - # hl_plot_grid_b_pres <- plot_grid( - # hl_plot_grid_b_pres, - # legend_b, - # ncol = 1, - # rel_heights = c(0.95, 0.05) - # ) - # - # ggsave(plot = hl_plot_grid_b_pres, - # filename = paste0(main_path, "outputs/academic-out/refining/figures/2025-health-revisions/presentation-figs/fig5-income.jpeg"), - # device = "jpeg", - # width = 9, - # height = 4, - # units= "in", - # dpi = 300) - - ## health fig - DAC - health_level_fig_c <- ggplot() + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC", - unit_desc == "USD (2019 VSL)" - ), - aes(x = scen_title, y = value, shape = title), - color = "black", - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - scale_shape_manual(values = dac_ptc) + - facet_wrap(~seg_title) + - labs( - y = "NPV per capita (USD)", - x = NULL, - color = NULL - ) + - theme_line + - scale_y_continuous(label = comma, limits = c(0, 3000)) + - theme( - legend.position = "none", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## labor fig - DAC - labor_level_fig_c <- ggplot() + - geom_point( - data = plot_df_long %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC", - segment == "labor" - ), - aes(x = scen_title, y = value, shape = demo_grp_metric), - color = "black", - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - scale_shape_manual( - values = dac_hl_ptc, - labels = dac_hl_labs - ) + - facet_wrap(~seg_title) + - labs( - y = " ", - x = NULL, - color = NULL - ) + - scale_y_continuous(label = comma, limits = c(-3000, 0)) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - # legend_figc <- labor_level_fig_c + theme(legend.position = "bottom") - # - # legend_c <- get_legend( - # legend_figc + - # theme(legend.text = element_text(size = 12))) - - # ## save version for presentation - # hl_plot_grid_c_pres <- plot_grid( - # health_level_fig_c + - # theme(axis.title.y = element_text(size = 12), - # axis.text.x = element_text(size = 9), - # axis.text.y = element_text(size = 12), - # strip.text = element_text(size = 12), - # plot.margin = unit(c(0, 0, 0.25, 0.1), "cm")), - # labor_level_fig_c + labs(y = NULL) + - # theme(axis.title.y = element_text(size = 12), - # axis.text.x = element_text(size = 9), - # axis.text.y = element_text(size = 12), - # strip.text = element_text(size = 12), - # plot.margin = unit(c(0, 0, 0.25, 0.1), "cm")), - # align = 'vh', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # rel_widths = c(1, 1) - # ) - # - # ## add legend - # hl_plot_grid_c_pres <- plot_grid( - # hl_plot_grid_c_pres, - # legend_c, - # ncol = 1, - # rel_heights = c(0.95, 0.05) - # ) - # - # - # ggsave(plot = hl_plot_grid_c_pres, - # filename = paste0(main_path, "outputs/academic-out/refining/figures/2025-health-revisions/presentation-figs/fig5-dac.jpeg"), - # device = "jpeg", - # width = 9, - # height = 4, - # units= "in", - # dpi = 300) - - ## combine figure - ## --------------------------------- - - fig_text_size <- 12 - - ## health - health_column_fig_nl <- plot_grid( - health_level_fig_c + - theme( - axis.text.x = element_blank(), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1), - strip.text.x = element_text(size = fig_text_size), - axis.text.y = element_text(size = fig_text_size), - axis.title.y = element_text(size = fig_text_size) - ), - health_level_fig_b + - theme( - axis.text.x = element_blank(), - strip.text.x = element_blank(), - axis.text.y = element_text(size = fig_text_size), - axis.title.y = element_text(size = fig_text_size), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1) - ), - health_level_fig_a + - theme( - strip.text.x = element_blank(), - axis.text.y = element_text(size = fig_text_size), - axis.title.y = element_text(size = fig_text_size), - axis.text.x = element_text(size = fig_text_size), - legend.position = "none" - ), - align = "vh", - labels = c("A", "B", "C"), - # # labels = 'AUTO', - label_size = 10, - hjust = -1, - nrow = 3 - # rel_widths = c(1, 0.25, 1), - # rel_heights = c(1, 0.1, 1, 0.1, 1) - ) - - ## labor - labor_column_fig_nl <- plot_grid( - labor_level_fig_c + - labs(y = NULL) + - theme( - axis.text.x = element_blank(), - strip.text.x = element_text(size = fig_text_size), - axis.text.y = element_text(size = fig_text_size), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1) - ), - labor_level_fig_b + - labs(y = NULL) + - theme( - axis.text.x = element_blank(), - axis.text.y = element_text(size = fig_text_size), - strip.text.x = element_blank(), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1) - ), - labor_level_fig_a + - labs(y = NULL) + - theme( - strip.text.x = element_blank(), - axis.text.y = element_text(size = fig_text_size), - axis.text.x = element_text(size = fig_text_size), - legend.position = "none" - ), - align = "vh", - labels = c("D", "E", "F"), - # # labels = 'AUTO', - label_size = 10, - hjust = -1, - nrow = 3 - # rel_widths = c(1, 0.25, 1), - # rel_heights = c(1, 0.1, 1, 0.1, 1) - ) - - ## all together now - hl_pc_plot_grid_nl <- plot_grid( - health_column_fig_nl, - labor_column_fig_nl, - align = "h", - # labels = c("(A)", "(B)", "(C)", ""), - # # labels = 'AUTO', - # label_size = 10, - # hjust = -1, - ncol = 2, - rel_widths = c(1, 1) - # rel_widths = c(1, 1, 1) - ) - - hl_pc_plot_grid_nl - - # ## race - # hl_plot_grid_a <- plot_grid( - # health_level_fig_a + theme(strip.text.x = element_blank()), - # labor_level_fig_a + labs(y = NULL) + theme(strip.text.x = element_blank()), - # align = 'vh', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # rel_widths = c(1, 1) - # ) - # - # ## add race legend - # hl_plot_grid_a <- plot_grid( - # hl_plot_grid_a, - # legend_a, - # ncol = 1, - # rel_heights = c(0.95, 0.05) - # ) - # - # ## poverty - # hl_plot_grid_b <- plot_grid( - # health_level_fig_b + theme(axis.text.x = element_blank(), - # strip.text.x = element_blank()), - # labor_level_fig_b + labs(y = NULL) + theme(axis.text.x = element_blank(), - # strip.text.x = element_blank()), - # align = 'vh', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # rel_widths = c(1, 1) - # ) - # - # ## add poverty legend - # hl_plot_grid_b <- plot_grid( - # hl_plot_grid_b, - # legend_b, - # ncol = 1, - # rel_heights = c(0.95, 0.05) - # ) - # - # ## DAC - # hl_plot_grid_c <- plot_grid( - # health_level_fig_c + theme(axis.text.x = element_blank()), - # labor_level_fig_c + labs(y = NULL) + theme(axis.text.x = element_blank()), - # align = 'vh', - # # labels = c("A", "B", "C", "D", "E", "F"), - # # # labels = 'AUTO', - # # label_size = 10, - # hjust = -1, - # nrow = 1, - # rel_widths = c(1, 1) - # ) - # - # ## add DAC legend - # hl_plot_grid_c <- plot_grid( - # hl_plot_grid_c, - # legend_c, - # ncol = 1, - # rel_heights = c(0.95, 0.05) - # ) - # - # - # ## all together now - # hl_plot_grid_pc <- plot_grid( - # hl_plot_grid_c, - # NULL, - # hl_plot_grid_b, - # NULL, - # hl_plot_grid_a, - # align = "v", - # # labels = c("(A)", "(B)", "(C)", ""), - # # # labels = 'AUTO', - # # label_size = 10, - # # hjust = -1, - # ncol = 1, - # rel_heights = c(1, 0.1, 1, 0.1, 1) - # # rel_widths = c(1, 1, 1) - # ) - # - - return(hl_pc_plot_grid_nl) -} - - -## npv shares -## ---------------------------------------------------------------------------- - -plot_hl_shares <- function( - main_path, - save_path, - demographic_npv_df, - state_pop_ratios -) { - plot_df_long <- copy(demographic_npv_df) - - ## calculate shares - plot_df_long[, - total_value := sum(value), - by = .( - scen_id, - demand_scenario, - refining_scenario, - demo_cat, - metric, - segment, - unit_desc, - metric_desc, - seg_title, - scenario, - demand_title, - scen_title - ) - ] - - plot_df_long[, share := value / total_value] - - ## shares - pct_df <- copy(state_pop_ratios) - - pct_df[, scen_title := "population"] - - ## create one df for plotting - share_df <- plot_df_long[, .( - scen_id, - demand_scenario, - refining_scenario, - demo_cat, - title, - metric, - unit_desc, - segment, - metric_desc, - seg_title, - scenario, - demand_title, - scen_title, - share - )] - - pop_share_df <- copy(share_df) - pop_share_df[, `:=`( - scen_id = "Population", - demand_scenario = NA, - refining_scenario = NA, - metric = "general_pop_share", - unit_desc = NA, - segment = "general", - metric_desc = "general", - seg_title = "State", - scenario = "State", - demand_title = NA, - scen_title = "State\npopulation", - share = NULL - )] - - pop_share_df <- unique(pop_share_df) - - ## merge - pop_share_df <- merge( - pop_share_df, - pct_df[, .(demo_cat, title, pct)], - by = c("demo_cat", "title") - ) - - setnames(pop_share_df, "pct", "share") - - ## bind - share_df <- rbind(share_df, pop_share_df) - - ## add column for defining shapes - share_df[, demo_grp_metric := paste0(title, "_", metric)] - - ## save figure inputs - fwrite( - share_df, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_disaggreated_npv_share_fig_inputs.csv" - ) - ) - # fwrite(share_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_disaggreated_npv_share_fig_inputs.csv")) - - ## create the figure --------------------------------------------- - ## --------------------------------------------------------------- - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - bau_scen <- "BAU historical production" - - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - ## health fig - race - health_share_fig_a <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - geom_point( - data = share_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Race", - unit_desc == "USD (2019 VSL)", - title %in% fig_title_vec - ) %>% - mutate( - title = factor( - title, - levels = c("Black", "Hispanic", "Asian", "white") - ) - ), - aes(x = scen_title, y = share, color = title), - size = 3, - alpha = 0.8 - ) + - facet_wrap(~seg_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - # ylim(0, 0.5) + - labs( - y = "NPV share", - x = NULL, - color = NULL - ) + - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## labor fig - race - labor_share_fig_a <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - geom_point( - data = share_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Race", - segment == "labor", - title %in% fig_title_vec - ) %>% - mutate( - title = factor( - title, - levels = c("Black", "Hispanic", "Asian", "white") - ) - ), - aes(x = scen_title, y = share, color = title, shape = metric), - size = 3, - alpha = 0.8 - ) + - facet_wrap(~seg_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - scale_shape_manual( - name = "", - values = race_shape_ptc, - labels = high_low_labs - ) + - # ylim(0, 0.6) + - labs( - y = "NPV share", - x = NULL, - color = "with re-emp:" - ) + - theme_line + - theme( - legend.position = "bottom", - legend.title = element_text(size = 8), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) + - guides(shape = "none") - - # legend_fig_labor_h <- ggplot() + - # geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - # geom_point( - # data = share_df %>% filter( - # !scen_id %in% remove_scen, - # demo_cat == "Race", - # segment == "labor", - # title %in% fig_title_vec, - # metric == "forgone_wages_h" - # ) %>% - # mutate(title = factor(title, levels = c("Black", "Hispanic", "Asian", "white"))), - # aes(x = scen_title, y = share, color = title, shape = metric), - # size = 3, alpha = 0.8 - # ) + - # facet_wrap(~seg_title) + - # scale_color_manual( - # name = "no re-emp:", - # values = race_col_pal - # ) + - # scale_shape_manual( - # name = "", - # values = race_shape_ptc, - # labels = high_low_labs - # ) + - # # ylim(0, 0.6) + - # labs( - # y = "NPV share", - # x = NULL, - # color = "no re-emp:" - # ) + - # theme_line + - # theme( - # legend.position = "bottom", - # legend.title = element_text(size = 8), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.ticks.length.y = unit(0.1, "cm"), - # axis.ticks.length.x = unit(0.1, "cm") - # ) + - # guides( - # color = guide_legend(override.aes = list(shape = 21)), - # shape = "none" - # ) - # - # - # legend_a_h <- get_legend( - # legend_fig_labor_h + - # theme(legend.text = element_text(size = 12)) - # ) - - # ## add no-emp legend to labor fig - # labor_share_fig_a2 <- plot_grid( - # labor_share_fig_a, - # legend_a_h, - # ncol = 1, - # rel_heights = c(0.95, 0.05), - # rel_widths = c(1, 1) - # ) - - ## state fig - race - state_share_fig_a <- ggplot() + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - geom_point( - data = share_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Race", - segment == "general", - title %in% fig_title_vec - ) %>% - mutate( - title = factor( - title, - levels = c("Black", "Hispanic", "Asian", "white") - ) - ), - aes(x = scen_title, y = share, color = title), - size = 3, - alpha = 0.8 - ) + - facet_wrap(~seg_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - # ylim(0, 0.5) + - labs( - y = " ", - x = NULL, - color = NULL - ) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## health fig - poverty - health_share_fig_b <- ggplot() + - geom_point( - data = share_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty", - unit_desc == "USD (2019 VSL)" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = scen_title, y = share, shape = title), - color = "black", - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_wrap(~seg_title) + - scale_shape_manual(values = poverty_ptc_h) + - labs( - y = "NPV share", - x = NULL, - color = NULL - ) + - theme_line + - # ylim(0, 0.9) + - theme( - legend.position = "bottom", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) + - guides(shape = guide_legend(nrow = 2, byrow = TRUE)) - - labor_share_fig_b <- ggplot() + - geom_point( - data = share_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty", - segment == "labor" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ), - demo_grp_metric = factor( - demo_grp_metric, - levels = c( - "Above poverty line_forgone_wages_l", - "Below poverty line_forgone_wages_l", - "Above poverty line_forgone_wages_h", - "Below poverty line_forgone_wages_h" - ) - ) - ), - aes(x = scen_title, y = share, shape = demo_grp_metric), - color = "black", - size = 3, - alpha = 0.8 - ) + - scale_shape_manual( - values = poverty_pt_share_l, - labels = poverty_hl_share_labs - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_wrap(~seg_title) + - # ylim(0, 0.9) + - labs( - y = "NPV share", - x = NULL, - color = NULL - ) + - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) + - guides(shape = guide_legend(nrow = 2, byrow = TRUE)) - - ## state - poverty - state_share_fig_b <- ggplot() + - geom_point( - data = share_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty", - segment == "general" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = scen_title, y = share, shape = title), - color = "black", - size = 3, - alpha = 0.8 - ) + - scale_shape_manual(values = poverty_ptc_h) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_wrap(~seg_title) + - # ylim(0, 0.9) + - labs( - y = " ", - x = NULL, - color = NULL - ) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## health fig - DAC - health_share_fig_c <- ggplot() + - geom_point( - data = share_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC", - unit_desc == "USD (2019 VSL)" - ), - aes(x = scen_title, y = share, shape = title), - color = "black", - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - scale_shape_manual(values = dac_ptc) + - facet_wrap(~seg_title) + - # ylim(0, 0.85) + - labs( - y = "NPV share", - x = NULL, - color = NULL - ) + - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) + - guides(shape = guide_legend(nrow = 2, byrow = TRUE)) - - ## labor fig - DAC - labor_share_fig_c <- ggplot() + - geom_point( - data = share_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC", - segment == "labor" - ) %>% - mutate( - demo_grp_metric = factor( - demo_grp_metric, - levels = c( - "DAC_forgone_wages_l", - "Non-DAC_forgone_wages_l", - "DAC_forgone_wages_h", - "Non-DAC_forgone_wages_h" - ) - ) - ), - aes(x = scen_title, y = share, shape = demo_grp_metric), - color = "black", - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - scale_shape_manual( - values = dac_hl_ptc_share, - labels = dac_hl_labs_share - ) + - facet_wrap(~seg_title) + - # ylim(0, 0.85) + - labs( - y = "NPV share", - x = NULL, - color = NULL - ) + - # ylim(-15, 0) + - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) + - guides(shape = guide_legend(nrow = 2, byrow = TRUE)) - - ## general fig - DAC - state_share_fig_c <- ggplot() + - geom_point( - data = share_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC", - segment == "general" - ), - aes(x = scen_title, y = share, shape = title), - color = "black", - size = 3, - alpha = 0.8 - ) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - scale_shape_manual(values = dac_ptc) + - facet_wrap(~seg_title) + - # ylim(0, 0.85) + - labs( - y = " ", - x = NULL, - color = NULL - ) + - # ylim(-15, 0) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - # axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## save legends - ## ----------------------------------------------------------------------- - - health_dac_legend <- get_legend( - health_share_fig_c + - theme(legend.text = element_text(size = 12)) - ) - - health_poverty_legend <- get_legend( - health_share_fig_b + - theme(legend.text = element_text(size = 12)) - ) - - health_race_legend <- get_legend( - health_share_fig_a + - theme(legend.text = element_text(size = 12)) - ) - - ## save legends - ggsave( - plot = health_dac_legend, - device = "pdf", - filename = "health_dac_legend.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - ## save legends - ggsave( - plot = health_poverty_legend, - device = "pdf", - filename = "health_poverty_legend.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - ## save legends - ggsave( - plot = health_race_legend, - device = "pdf", - filename = "health_race_legend.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - labor_dac_legend <- get_legend( - labor_share_fig_c + - theme(legend.text = element_text(size = 12)) - ) - - labor_poverty_legend <- get_legend( - labor_share_fig_b + - theme(legend.text = element_text(size = 12)) - ) - - labor_race_legend <- get_legend( - labor_share_fig_a + - theme(legend.text = element_text(size = 12)) - ) - - ## save legends - ggsave( - plot = labor_dac_legend, - device = "pdf", - filename = "labor_dac_legend.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - ## save legends - ggsave( - plot = labor_poverty_legend, - device = "pdf", - filename = "labor_poverty_legend.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - ## save legends - ggsave( - plot = labor_race_legend, - device = "pdf", - filename = "labor_race_legend.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - ## save legends - ggsave( - plot = legend_a_h, - device = "pdf", - filename = "labor_race_legend_no_re-emp.pdf", - path = file.path(main_path, save_path, "legends"), - dpi = 600 - ) - - ## combine figure - ## --------------------------------- - - fig_text_size <- 12 - - ## health - health_column_fig <- plot_grid( - health_share_fig_c + - ylim(0, 1) + - theme( - axis.text.x = element_blank(), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1), - strip.text.x = element_text(size = fig_text_size), - axis.text.y = element_text(size = fig_text_size), - axis.title.y = element_text(size = fig_text_size) - ), - health_share_fig_b + - ylim(0, 1) + - theme( - axis.text.x = element_blank(), - strip.text.x = element_blank(), - axis.text.y = element_text(size = fig_text_size), - axis.title.y = element_text(size = fig_text_size), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1) - ), - health_share_fig_a + - ylim(0, 1) + - theme( - strip.text.x = element_blank(), - axis.text.y = element_text(size = fig_text_size), - axis.title.y = element_text(size = fig_text_size), - axis.text.x = element_text(size = fig_text_size), - legend.position = "none" - ), - align = "vh", - labels = c("A", "B", "C"), - # # labels = 'AUTO', - label_size = 10, - hjust = -1, - nrow = 3 - # rel_widths = c(1, 0.25, 1), - # rel_heights = c(1, 0.1, 1, 0.1, 1) - ) - - ## state - state_column_fig <- plot_grid( - state_share_fig_c + - ylim(0, 1) + - theme( - axis.text.x = element_blank(), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1), - strip.text.x = element_text(size = fig_text_size), - axis.title.y = element_text(size = fig_text_size), - # axis.text.y = element_text(size = fig_text_size), - axis.text.y = element_blank() - ), - state_share_fig_b + - ylim(0, 1) + - theme( - axis.text.x = element_blank(), - strip.text.x = element_blank(), - axis.title.y = element_text(size = fig_text_size), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1), - # axis.text.y = element_text(size = fig_text_size), - axis.text.y = element_blank() - ), - state_share_fig_a + - ylim(0, 1) + - theme( - strip.text.x = element_blank(), - axis.title.y = element_text(size = fig_text_size), - axis.text.x = element_text(size = fig_text_size), - legend.position = "none", - # axis.text.y = element_text(size = fig_text_size), - axis.text.y = element_blank() - ), - align = "vh", - labels = c("D", "E", "F"), - # # labels = 'AUTO', - label_size = 10, - hjust = -1, - nrow = 3 - # rel_widths = c(1, 0.25, 1), - # rel_heights = c(1, 0.1, 1, 0.1, 1) - ) - - ## labor - labor_column_fig <- plot_grid( - labor_share_fig_c + - ylim(0, 1) + - labs(y = " ") + - theme( - axis.text.x = element_blank(), - strip.text.x = element_text(size = fig_text_size), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1), - # axis.text.y = element_text(size = fig_text_size), - axis.text.y = element_blank() - ), - labor_share_fig_b + - ylim(0, 1) + - labs(y = " ") + - theme( - axis.text.x = element_blank(), - strip.text.x = element_blank(), - legend.position = "none", - plot.margin = margin(1, 1, 20, 1), - # axis.text.y = element_text(size = fig_text_size), - axis.text.y = element_blank() - ), - labor_share_fig_a + - ylim(0, 1) + - labs(y = " ") + - theme( - strip.text.x = element_blank(), - axis.text.x = element_text(size = fig_text_size), - legend.position = "none", - # axis.text.y = element_text(size = fig_text_size), - axis.text.y = element_blank() - ), - align = "vh", - labels = c("G", "H", "I"), - # # labels = 'AUTO', - label_size = 10, - hjust = -1, - nrow = 3 - # rel_widths = c(1, 0.25, 1), - # rel_heights = c(1, 0.1, 1, 0.1, 1) - ) - - ## all together now - hl_pc_plot_grid_nl <- plot_grid( - health_column_fig, - state_column_fig, - labor_column_fig, - align = "h", - # labels = c("(A)", "(B)", "(C)", ""), - # # labels = 'AUTO', - # label_size = 10, - # hjust = -1, - ncol = 3, - rel_widths = c(1, 0.3, 0.9) - # rel_widths = c(1, 1, 1) - ) - - return(hl_pc_plot_grid_nl) -} - -create_health_labor_table <- function( - main_path, - save_path, - demographic_npv_df, - ref_labor_demog, - pop_ratios, - refining_mortality -) { - ## create table of total health benefit (NPV), labor loss (NPV), change in job years, - ## and avoided premature mortality (scenario x demographic group, state) - - ## NPV values - npv_out <- demographic_npv_df[, .( - demand_scenario, - refining_scenario, - demo_cat, - demo_group, - title, - segment, - metric, - metric_desc, - unit_desc, - value - )] - - ## fte-job-years - emp_out <- ref_labor_demog %>% - # select(-sum_demo_comp_pv_h, -sum_demo_comp_pv_l) %>% - select(demand_scenario:title, sum_demo_emp) %>% - rename(value = sum_demo_emp) %>% - group_by( - demand_scenario, - refining_scenario, - oil_price_scenario, - demo_cat, - demo_group, - title - ) %>% - summarise(value = sum(value)) %>% - # summarise(value = sum(value), - # value_revised = sum(value_revised)) %>% - ungroup() %>% - mutate( - segment = "labor", - metric = "fte_job_years", - metric_desc = "job_loss", - unit_desc = "fte-jobs" - ) - - ## bau scen - bau_emp_out <- emp_out %>% - filter( - demand_scenario == "BAU", - refining_scenario == "historic production" - ) %>% - select(oil_price_scenario, demo_cat, demo_group, title, value) %>% - rename(bau_value = value) - # , - # bau_revised = value_revised) - - ## difference - emp_out <- merge( - emp_out, - bau_emp_out, - by = c("oil_price_scenario", "demo_cat", "demo_group", "title"), - all.x = T - ) - - emp_out <- emp_out %>% - mutate( - delta_value = value - bau_value - # , - # delta_revised_value = value_revised - bau_revised - ) %>% - select( - oil_price_scenario:refining_scenario, - segment, - metric, - metric_desc, - unit_desc, - delta_value - ) %>% - rename(value = delta_value) %>% - mutate( - refining_scenario = str_replace( - refining_scenario, - "historic", - "historical" - ) - ) %>% - filter(oil_price_scenario == "reference case") %>% - select(-oil_price_scenario) - - ## avoided mortality - avoid_m_out <- copy(refining_mortality) %>% as.data.table() - - ## select columns - avoid_m_out <- avoid_m_out %>% - select( - census_tract, - demand_scenario, - refining_scenario, - year, - mortality_delta - ) - - ## merge with pop ratios - avoid_m_out <- merge( - avoid_m_out, - pop_ratios, - by = "census_tract", - all.x = TRUE, - allow.cartesian = TRUE - ) - - setDT(avoid_m_out) - - ## calc value by demographic group - avoid_m_out[, value := mortality_delta * pct] - - avoid_m_out_total <- avoid_m_out[, - .(value = sum(value)), - by = .( - demand_scenario, - refining_scenario, - demo_cat, - demo_group, - title - ) - ] - - avoid_m_out_total <- avoid_m_out_total %>% - mutate( - refining_scenario = str_replace( - refining_scenario, - "historic", - "historical" - ), - segment = "health", - metric = "avoided_mortality", - metric_desc = "avoided_mortality", - unit_desc = "persons" - ) %>% - select( - demand_scenario, - refining_scenario, - demo_cat, - demo_group, - title, - segment, - metric, - metric_desc, - unit_desc, - value - ) - - ## bind - result_output <- rbind(npv_out, emp_out, avoid_m_out_total) - - ## save figure inputs - fwrite( - result_output, - file.path( - main_path, - save_path, - "fig-csv-files", - "state_health_labor_ouputs.csv" - ) - ) - # fwrite(result_output, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/", "state_health_labor_ouputs.csv")) - - return(result_output) -} - - -fig4_hl <- function( - health_grp, - ref_labor_demog_yr, - refining_mortality, - pop_ratios -) { - gaps_df <- copy(health_grp) - - ## change scenario names, factor - gaps_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # gaps_df[, scenario := gsub('BAU', 'Reference', scenario)] - gaps_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## refactor - gaps_df[, scenario_title := scenario] - gaps_df[, scenario_title := str_replace(scenario_title, " - ", "\n")] - - ## calculate gaps (BAU - scenario) - bau_gaps_df <- gaps_df[scen_id == "BAU historic production"] - bau_gaps_df <- bau_gaps_df[, c( - "year", - "demo_cat", - "demo_group", - "title", - "mortality_level_dem" - )] - setnames(bau_gaps_df, "mortality_level_dem", "bau_mortality_level_dem") - - gaps_df <- merge( - gaps_df, - bau_gaps_df, - by = c("year", "demo_cat", "demo_group", "title"), - all.x = T - ) - - gaps_df[, gap := mortality_level_dem - bau_mortality_level_dem] - - ## change historic to historical - gaps_df[, scen_id := str_replace(scen_id, "historic", "historical")] - gaps_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - gaps_df[, scenario := str_replace(scenario, "historic", "historical")] - gaps_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - ## refactor - gaps_df$scenario <- factor( - gaps_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - gaps_df$scenario_title <- factor( - gaps_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - ## make figures - ## --------------------------------------------------------- - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - - ## figure a - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - health_gap_fig_a <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race" - ) %>% - mutate( - title = factor(title, levels = c("Black", "Hispanic", "Asian", "white")) - ), - aes(x = year, y = gap, color = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - # ylim(c(-0.31, 0)) + - theme( - legend.position = "none", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## figure b - health_gap_fig_b <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC" - ), - aes(x = year, y = gap, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(-0.31, 0)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - scale_linetype_manual(values = dac_lty) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## figure c - health_gap_fig_c <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = gap, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - scale_linetype_manual(values = poverty_lty) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - # ylim(c(-0.31, 0)) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - legend.key.width = unit(10, "mm"), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## shared y lab - # yaxis_lab <- ggdraw() + draw_label(expression(paste("PM"[2.5], " (",mu,"g ", m^{-3},")", " per person, difference from reference")), - # size = 8, angle = 90) - - yaxis_lab <- ggdraw() + - draw_label( - "Avoided mortalities, difference from reference", - size = 8, - angle = 90 - ) - - gaps_plot_grid_h <- plot_grid( - health_gap_fig_b, - health_gap_fig_c, - health_gap_fig_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1), - rel_heights = c(1.1, 0.9, 0.9) - ) - - gaps_plot_grid2 <- plot_grid( - yaxis_lab, - gaps_plot_grid_h, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heights = c(1, 1) - ) - - ## labor - ## ------------------------------------------------------- - - # ## calc 2020 pop by demographic - # pop_2020 <- refining_mortality %>% - # filter(year == 2020) %>% - # select(census_tract, year, pop) %>% - # unique() %>% - # left_join(pop_ratios) %>% - # as.data.table() - # - # pop_2020[, demo_pop := pop * pct] - # - # ## summarize by demographic group - # pop_2020 <- pop_2020[, .(pop_2020 = sum(demo_pop)), - # by = .(demo_group, demo_cat)] - # - ## labor outputs - l_gaps_df <- copy(ref_labor_demog_yr) - - ## change scenario names, factor - l_gaps_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # gaps_df[, scenario := gsub('BAU', 'Reference', scenario)] - l_gaps_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## add scenario title - l_gaps_df[, scenario_title := scenario] - l_gaps_df[, scenario_title := str_replace(scenario_title, " - ", "\n")] - - ## change historic to historical - l_gaps_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - l_gaps_df[, scenario := str_replace(scenario, "historic", "historical")] - l_gaps_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - ## scenarios for filtering - remove_scen <- c( - "Low demand - historical production", - "BAU demand - historical production" - ) - - l_gaps_df$scenario <- factor( - l_gaps_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - l_gaps_df$scenario_title <- factor( - l_gaps_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - ## sum for state - l_gaps_df <- l_gaps_df[, - .(sum_demo_emp = sum(sum_demo_emp)), - by = .( - year, - demand_scenario, - refining_scenario, - oil_price_scenario, - scenario, - scenario_title, - demo_cat, - demo_group, - title - ) - ] - - # ## merge with 2020 pop - # l_gaps_df <- merge(l_gaps_df, pop_2020, - # by = c("demo_cat", "demo_group"), - # all.x = T) - # - # ## calculate per capita - # l_gaps_df[, demo_emp_pc := sum_demo_emp / pop_2020] - - ## select columns - l_gaps_df <- l_gaps_df[, .( - year, - demand_scenario, - refining_scenario, - oil_price_scenario, - scenario, - scenario_title, - demo_cat, - demo_group, - title, - sum_demo_emp - )] - - # filter for oil px == reference case - l_gaps_df <- l_gaps_df[oil_price_scenario == "reference case"] - - ## calculate gaps (BAU - scenario) - l_bau_gaps_df <- l_gaps_df[scenario == "BAU demand - historical production"] - l_bau_gaps_df <- l_bau_gaps_df[, c( - "year", - "demo_cat", - "demo_group", - "title", - "sum_demo_emp" - )] - setnames(l_bau_gaps_df, "sum_demo_emp", "bau_sum_demo_emp") - # setnames(l_bau_gaps_df, "demo_emp_pc", "bau_demo_emp_pc") - - l_gaps_df <- merge( - l_gaps_df, - l_bau_gaps_df, - by = c("year", "demo_cat", "demo_group", "title"), - all.x = T - ) - - l_gaps_df[, gap_emp := sum_demo_emp - bau_sum_demo_emp] - # l_gaps_df[, gap_emp_pc := demo_emp_pc - bau_demo_emp_pc] - - ## figure labor a - labor_gap_fig_a <- ggplot( - l_gaps_df %>% - filter( - !scenario %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race" - ) %>% - mutate( - title = factor(title, levels = c("Black", "Hispanic", "Asian", "white")) - ), - aes(x = year, y = gap_emp / 1000, color = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - # ylim(-35, 0) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## legend a - legend_a <- labor_gap_fig_a + - geom_line(linewidth = 1, alpha = 0.9) + - theme(legend.position = "right") - - legend_a <- get_legend( - legend_a + - theme(legend.text = element_text(size = 6)) - ) - - ## labor b - labor_gap_fig_b <- ggplot( - l_gaps_df %>% - filter( - !scenario %in% remove_scen, - demo_cat == "DAC" - ), - aes(x = year, y = gap_emp / 1000, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_linetype_manual(values = dac_lty) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(-35, 0)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## legend b - legend_b <- labor_gap_fig_b + - geom_line(linewidth = 1, alpha = 0.9) + - theme(legend.position = "right") - - legend_b <- get_legend( - legend_b + - theme(legend.text = element_text(size = 6)) - ) - - ## labor c - labor_gap_fig_c <- ggplot( - l_gaps_df %>% - filter( - !scenario %in% remove_scen, - demo_cat == "Poverty" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = gap_emp / 1000, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - scale_linetype_manual(values = poverty_lty) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - # ylim(-35, 0) + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - legend.key.width = unit(10, "mm"), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## legend c - legend_c <- labor_gap_fig_c + - geom_line(linewidth = 1, alpha = 0.9) + - theme(legend.position = "right") - - legend_c <- get_legend( - legend_c + - theme(legend.text = element_text(size = 6)) - ) - - ## shared y lab - # yaxis_lab <- ggdraw() + draw_label("Labor: FTE job-years, difference from reference", size = 8, angle = 90) - yaxis_lab <- ggdraw() + - draw_label( - "Labor: FTE job-years, difference from reference (thousand)", - size = 8, - angle = 90 - ) - - l_gaps_plot_grid <- plot_grid( - labor_gap_fig_b + theme(legend.position = "none"), - labor_gap_fig_c + theme(legend.position = "none"), - labor_gap_fig_a + theme(legend.position = "none"), - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1), - rel_heights = c(1.05, 0.9, 0.9) - ) - - l_gaps_plot_grid2 <- plot_grid( - yaxis_lab, - l_gaps_plot_grid, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heights = c(1, 1) - ) - - l_gaps_plot_grid2 - - ## plot legends - legends <- plot_grid( - legend_b, - legend_c, - legend_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 3, - ncol = 1, - rel_widths = c(1, 1, 1), - rel_heights = c(1, 1, 1) - ) - - ## plot side by side - ## ---------------------------------------------- - - health_labor_plot <- plot_grid( - gaps_plot_grid2, - l_gaps_plot_grid2, - NULL, - legends, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 4, - rel_widths = c(1, 1, 0.05, 0.2), - rel_heights = c(1, 1, 1, 1) - ) - - return(health_labor_plot) -} - - -fig4_hl_pmil <- function( - health_grp, - ref_labor_demog_yr, - refining_mortality, - pop_ratios -) { - ## calc 2020 pop by demographic - pop_2020 <- refining_mortality %>% - filter(year == 2020) %>% - select(census_tract, year, pop) %>% - unique() %>% - left_join(pop_ratios) %>% - as.data.table() - - pop_2020[, demo_pop := pop * pct] - - ## summarize by demographic group - pop_2020 <- pop_2020[, - .(pop_2020 = sum(demo_pop)), - by = .(demo_group, demo_cat) - ] - - gaps_df <- copy(health_grp) - - ## change scenario names, factor - gaps_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # gaps_df[, scenario := gsub('BAU', 'Reference', scenario)] - gaps_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## refactor - gaps_df[, scenario_title := scenario] - gaps_df[, scenario_title := str_replace(scenario_title, " - ", "\n")] - - ## calculate gaps (BAU - scenario) - bau_gaps_df <- gaps_df[scen_id == "BAU historic production"] - bau_gaps_df <- bau_gaps_df[, c( - "year", - "demo_cat", - "demo_group", - "title", - "mortality_level_dem" - )] - setnames(bau_gaps_df, "mortality_level_dem", "bau_mortality_level_dem") - - gaps_df <- merge( - gaps_df, - bau_gaps_df, - by = c("year", "demo_cat", "demo_group", "title"), - all.x = T - ) - - gaps_df[, gap := mortality_level_dem - bau_mortality_level_dem] - - ## convert to per million - gaps_df <- merge( - gaps_df, - pop_2020, - by = c("demo_group", "demo_cat"), - all.x = T - ) - - ## calculate per capita - gaps_df[, value := gap / pop_2020] - gaps_df[, value_pmil := value * 1e6] - - ## change historic to historical - gaps_df[, scen_id := str_replace(scen_id, "historic", "historical")] - gaps_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - gaps_df[, scenario := str_replace(scenario, "historic", "historical")] - gaps_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - ## refactor - gaps_df$scenario <- factor( - gaps_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - gaps_df$scenario_title <- factor( - gaps_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - ## make figures - ## --------------------------------------------------------- - - ## scenarios for filtering - remove_scen <- c("LC1 historical production", "BAU historical production") - - ## figure a - fig_title_vec <- c("Asian", "Black", "Hispanic", "white") - - fig_text_size <- 12 - - health_gap_fig_a <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race" - ) %>% - mutate( - title = factor(title, levels = c("Black", "Hispanic", "Asian", "white")) - ), - aes(x = year, y = value_pmil, color = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - # ylim(c(-30, 0)) + - theme( - legend.position = "none", - legend.title = element_blank(), - axis.text.x = element_text( - vjust = 0.5, - hjust = 0.5, - size = fig_text_size - ), - axis.text.y = element_text(size = fig_text_size), - strip.text.y = element_text(size = fig_text_size), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## figure b - health_gap_fig_b <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "DAC" - ), - aes(x = year, y = value_pmil, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(-30, 0)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - scale_linetype_manual(values = dac_lty) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - axis.text.x = element_text( - vjust = 0.5, - hjust = 0.5, - size = fig_text_size - ), - axis.text.y = element_text(size = fig_text_size), - strip.text = element_text(size = fig_text_size), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## figure c - health_gap_fig_c <- ggplot( - gaps_df %>% - filter( - !scen_id %in% remove_scen, - demo_cat == "Poverty" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = value_pmil, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - scale_linetype_manual(values = poverty_lty) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - # ylim(c(-30, 0)) + - theme_line + - theme( - legend.position = "none", - legend.title = element_blank(), - axis.text.x = element_text( - vjust = 0.5, - hjust = 0.5, - size = fig_text_size - ), - axis.text.y = element_text(size = fig_text_size), - strip.text.y = element_text(size = fig_text_size), - legend.key.width = unit(10, "mm"), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## shared y lab - # yaxis_lab <- ggdraw() + draw_label(expression(paste("PM"[2.5], " (",mu,"g ", m^{-3},")", " per person, difference from reference")), - # size = 8, angle = 90) - - yaxis_lab <- ggdraw() + - draw_label( - "Health: Avoided mortalities per million people (difference from reference)", - size = fig_text_size, - angle = 90 - ) - - gaps_plot_grid_h <- plot_grid( - NULL, - health_gap_fig_b, - NULL, - health_gap_fig_c, - NULL, - health_gap_fig_a, - align = "v", - labels = c("", "A", "", "B", "", "C"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -0.5, - vjust = 0.25, - nrow = 6, - ncol = 1, - rel_widths = c(1, 1, 1, 1, 1, 1), - rel_heights = c(0.15, 1.1, 0.15, 0.9, 0.15, 0.9) - ) - gaps_plot_grid_h - - gaps_plot_grid2 <- plot_grid( - yaxis_lab, - gaps_plot_grid_h, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heights = c(1, 1) - ) - - ## labor - ## ------------------------------------------------------- - - # ## calc 2020 pop by demographic - # pop_2020 <- refining_mortality %>% - # filter(year == 2020) %>% - # select(census_tract, year, pop) %>% - # unique() %>% - # left_join(pop_ratios) %>% - # as.data.table() - # - # pop_2020[, demo_pop := pop * pct] - # - # ## summarize by demographic group - # pop_2020 <- pop_2020[, .(pop_2020 = sum(demo_pop)), - # by = .(demo_group, demo_cat) - # ] - - ## labor outputs - l_gaps_df <- copy(ref_labor_demog_yr) - - l_gaps_df <- l_gaps_df[oil_price_scenario == "reference case", ] - - ## change scenario names, factor - l_gaps_df[, - scenario := paste0(demand_scenario, " demand - ", refining_scenario) - ] - # gaps_df[, scenario := gsub('BAU', 'Reference', scenario)] - l_gaps_df[, scenario := gsub("LC1.", "Low ", scenario)] - - ## add scenario title - l_gaps_df[, scenario_title := scenario] - l_gaps_df[, scenario_title := str_replace(scenario_title, " - ", "\n")] - - ## change historic to historical - l_gaps_df[, - refining_scenario := str_replace( - refining_scenario, - "historic", - "historical" - ) - ] - l_gaps_df[, scenario := str_replace(scenario, "historic", "historical")] - l_gaps_df[, - scenario_title := str_replace(scenario_title, "historic", "historical") - ] - - ## scenarios for filtering - remove_scen <- c( - "Low demand - historical production", - "BAU demand - historical production" - ) - - l_gaps_df$scenario <- factor( - l_gaps_df$scenario, - levels = c( - "BAU demand - historical production", - "BAU demand - historical exports", - "BAU demand - low exports", - "Low demand - historical exports", - "Low demand - low exports", - "Low demand - historical production" - ) - ) - - l_gaps_df$scenario_title <- factor( - l_gaps_df$scenario_title, - levels = c( - "BAU demand\nhistorical production", - "BAU demand\nhistorical exports", - "BAU demand\nlow exports", - "Low demand\nhistorical exports", - "Low demand\nlow exports", - "Low demand\nhistorical production" - ) - ) - - # ## sum for state - # l_gaps_df <- l_gaps_df[, .(sum_demo_emp = sum(demo_emp)), - # by = .( - # year, demand_scenario, refining_scenario, - # scenario, scenario_title, demo_cat, demo_group, title - # ) - # ] - - ## select columns - l_gaps_df <- l_gaps_df[, .( - year, - demand_scenario, - refining_scenario, - scenario, - scenario_title, - demo_cat, - demo_group, - title, - sum_demo_emp - )] - - ## calculate gaps (BAU - scenario) - l_bau_gaps_df <- l_gaps_df[scenario == "BAU demand - historical production"] - l_bau_gaps_df <- l_bau_gaps_df[, c( - "year", - "demo_cat", - "demo_group", - "title", - "sum_demo_emp" - )] - setnames(l_bau_gaps_df, "sum_demo_emp", "bau_sum_demo_emp") - - l_gaps_df <- merge( - l_gaps_df, - l_bau_gaps_df, - by = c("year", "demo_cat", "demo_group", "title"), - all.x = T - ) - - l_gaps_df[, gap_emp := sum_demo_emp - bau_sum_demo_emp] - - ## merge with 2020 pop - l_gaps_df <- merge( - l_gaps_df, - pop_2020, - by = c("demo_cat", "demo_group"), - all.x = T - ) - - ## calculate per capita - l_gaps_df[, gap_emp_pc := gap_emp / pop_2020] - l_gaps_df[, gap_emp_pmil := gap_emp_pc * 1e6] - - ## figure labor a - labor_gap_fig_a <- ggplot( - l_gaps_df %>% - filter( - !scenario %in% remove_scen, - title %in% fig_title_vec, - demo_cat == "Race" - ) %>% - mutate( - title = factor(title, levels = c("Black", "Hispanic", "Asian", "white")) - ), - aes(x = year, y = gap_emp_pmil, color = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_color_manual( - name = "", - values = race_col_pal - ) + - labs( - x = NULL, - y = NULL - ) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - axis.text.x = element_text( - vjust = 0.5, - hjust = 0.5, - size = fig_text_size - ), - axis.text.y = element_text(size = fig_text_size), - strip.text.y = element_text(size = fig_text_size), - strip.text.x = element_blank(), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## legend a - legend_a <- labor_gap_fig_a + - geom_line(linewidth = 1, alpha = 0.9) + - theme(legend.position = "right") - - legend_a <- get_legend( - legend_a + - theme(legend.text = element_text(size = fig_text_size)) - ) - - ## labor b - labor_gap_fig_b <- ggplot( - l_gaps_df %>% - filter( - !scenario %in% remove_scen, - demo_cat == "DAC" - ), - aes(x = year, y = gap_emp_pmil, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - scale_linetype_manual(values = dac_lty) + - labs( - x = NULL, - y = NULL - ) + - # ylim(c(-0.31, 0)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text( - vjust = 0.5, - hjust = 0.5, - size = fig_text_size - ), - axis.text.y = element_text(size = fig_text_size), - strip.text.y = element_text(size = fig_text_size), - strip.text.x = element_text(size = fig_text_size), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## legend b - legend_b <- labor_gap_fig_b + - geom_line(linewidth = 1, alpha = 0.9) + - theme(legend.position = "right") - - legend_b <- get_legend( - legend_b + - theme(legend.text = element_text(size = fig_text_size)) - ) - - ## labor c - labor_gap_fig_c <- ggplot( - l_gaps_df %>% - filter( - !scenario %in% remove_scen, - demo_cat == "Poverty" - ) %>% - mutate( - title = factor( - title, - levels = c("Below poverty line", "Above poverty line") - ) - ), - aes(x = year, y = gap_emp_pmil, lty = title) - ) + - geom_line(linewidth = 1, alpha = 0.8, color = "black") + - scale_linetype_manual(values = poverty_lty) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = NULL - ) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - # ylim(-70, 0) + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text( - vjust = 0.5, - hjust = 0.5, - size = fig_text_size - ), - axis.text.y = element_text(size = fig_text_size), - strip.text.y = element_text(size = fig_text_size), - legend.key.width = unit(10, "mm"), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - strip.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - - ## legend c - legend_c <- labor_gap_fig_c + - geom_line(linewidth = 1, alpha = 0.9) + - theme(legend.position = "right") - - legend_c <- get_legend( - legend_c + - theme(legend.text = element_text(size = fig_text_size)) - ) - - ## shared y lab - # yaxis_lab <- ggdraw() + draw_label("Labor: FTE job-years, difference from reference", size = 8, angle = 90) - yaxis_lab <- ggdraw() + - draw_label( - "Labor: FTE employment changes per million people (difference from reference)", - size = fig_text_size, - angle = 90 - ) - - l_gaps_plot_grid <- plot_grid( - NULL, - labor_gap_fig_b + theme(legend.position = "none"), - NULL, - labor_gap_fig_c + theme(legend.position = "none"), - NULL, - labor_gap_fig_a + theme(legend.position = "none"), - align = "v", - labels = c("", "D", "", "E", "", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -0.5, - vjust = 0.25, - nrow = 6, - ncol = 1, - rel_widths = c(1, 1, 1, 1, 1, 1), - rel_heights = c(0.15, 1.1, 0.15, 0.9, 0.15, 0.9) - ) - - l_gaps_plot_grid2 <- plot_grid( - yaxis_lab, - l_gaps_plot_grid, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 2, - rel_widths = c(0.05, 1), - rel_heights = c(1, 1) - ) - - l_gaps_plot_grid2 - - ## plot legends - legends <- plot_grid( - NULL, - legend_b, - NULL, - legend_c, - NULL, - legend_a, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 6, - ncol = 1, - rel_widths = c(1, 1, 1, 1, 1, 1), - rel_heights = c(0.15, 1, 0.15, 1, 0.15, 1) - ) - - ## plot side by side - ## ---------------------------------------------- - - health_labor_plot <- plot_grid( - gaps_plot_grid2, - l_gaps_plot_grid2, - NULL, - legends, - align = "v", - # labels = c("A", "B", "C", "D", "E", "F"), - # # labels = 'AUTO', - # label_size = 10, - hjust = -1, - nrow = 1, - ncol = 4, - rel_widths = c(1, 1, 0.05, 0.2), - rel_heights = c(1, 1, 1, 1) - ) - - return(health_labor_plot) -} diff --git a/archive-from-repo/archive/labor_functions.R b/archive-from-repo/archive/labor_functions.R deleted file mode 100644 index 8c759ff..0000000 --- a/archive-from-repo/archive/labor_functions.R +++ /dev/null @@ -1,1088 +0,0 @@ -## labor functions ## - -create_prod_px_spread <- function(proc_oil_px_df) { - crack_spread <- tibble( - product = c("gasoline", "jet_fuel", "diesel"), - spread = c(23, 20, 23) - ) - - crack_spread_ex <- expand.grid( - year = c(2019:2045), - product = unique(crack_spread$product) - ) - - crack_spread <- merge(crack_spread_ex, crack_spread, - all.x = T - ) - - prod_price <- copy(proc_oil_px_df) - # prod_price <- proc_oil_px_df[oil_price_scenario == "reference case"] - - prod_price <- merge(crack_spread, prod_price, - by = c("year"), - all = T, - allow.cartesian = T - ) - - setDT(prod_price) - - prod_price[, product_price := oil_price_usd_per_bbl + spread] - - prod_price -} - - -calc_labor_outputs <- function(main_path, - indiv_prod_output, - dt_refcap, - product_px, - cpi2019, - cpi2020, - discount_rate, - alpha_comp, - alpha_emp, - refin_locs_ct, - dt_direct_multipliers) { - ## add product for calculating price - county_out_refining <- copy(indiv_prod_output) - - county_out_refining[, fuel := as.character(fuel)] - - county_out_refining[, product := fifelse( - fuel %chin% c("gasoline", "drop-in gasoline"), "gasoline", - fifelse(fuel %chin% c("diesel", "renewable diesel"), "diesel", "jet_fuel") - )] - - ## merge with counties - county_df <- dt_refcap[, .(site_id, county)] - county_df[, site_id := as.character(site_id)] - - - county_out_refining <- merge(county_out_refining, county_df, - by = c("site_id"), - all.x = T - ) - - # fill in missing counties - county_out_refining[, county := fifelse( - site_id == "342-2", "Contra Costa", - fifelse( - site_id == "99999", "Kern", - fifelse(site_id == "t-800", "Los Angeles", county) - ) - )] - - ## merge with prices - product_df <- copy(product_px) - product_df <- product_df[, .(year, oil_price_scenario, product, product_price)] - - county_out_refining <- merge(county_out_refining, product_df, - by = c("year", "product"), - all.x = T, - allow.cartesian = T - ) - - ## calculate revenue - county_out_refining[, revenue := value * product_price] - - ## merge with census tracts - ct_out_refining <- merge(county_out_refining, - refin_locs_ct[, .(GEOID, site_id)], - by = c("site_id"), - all.x = T) - - ## step 1: summarize at the census tract level - ct_out_refining_summary <- ct_out_refining[, .( - production_bbl = sum(value), - revenue = sum(revenue) - ), by = .( - demand_scenario, refining_scenario, - oil_price_scenario, year, county, GEOID - )] - - ## fix columns - ct_out_refining_summary[, county := fifelse(county == "Solano County", "Solano", county)] - - ct_out_refining_summary[, w_tract_geocode := substr(GEOID, 1, 11)] - - ## step 2: merge with direct multipliers on the "w_tract_geocode" - ct_out_refining_direct <- merge(ct_out_refining_summary, - dt_direct_multipliers, - by = c("w_tract_geocode"), - all.x = TRUE, - allow.cartesian = TRUE) - - ## step 3: divide revenue by $1 million and multiply it separately - ## by emp.rev (employment multiplier) and ec.rev (compensation multiplier). - ct_out_refining_direct <- ct_out_refining_direct[, `:=` (empl_direct_impact = (revenue / 1e6) * emp.rev, - comp_direct_impact = (revenue / 1e6) * ec.rev)] - - - ## step 4: summarize by “h” census tract. This is what you will use for - ## Figure 1 D, Figure 4 D-F, and Figure 5 D-F. - - ct_out_refining_direct <- ct_out_refining_direct[, .( - total_emp = sum(empl_direct_impact), - total_comp = sum(comp_direct_impact) - ), .(demand_scenario, refining_scenario, oil_price_scenario, year, h_tract_geocode)] - - - ct_out_refining_direct <- ct_out_refining_direct[, .(h_tract_geocode, - demand_scenario, - refining_scenario, - oil_price_scenario, - year, - total_emp, - total_comp)] - - ## convert comp to 2019 dollars - ct_out_refining_direct[, total_comp_usd19 := total_comp * cpi2019 / cpi2020] - - ## calc PV - ct_out_refining_direct[, total_comp_PV := total_comp_usd19 / ((1 + discount_rate)^(year - 2019))] - - ## rename columns - setnames(ct_out_refining_direct, c("total_comp", "total_comp_usd19", "total_comp_PV"), c("total_comp_h", "total_comp_usd19_h", "total_comp_PV_h")) - - - ## revision: unclear if we need to do the following - ## -------------------------------------------------------------------------- - - ## calculate the lower bound value - ct_out_refining_direct <- ct_out_refining_direct %>% - rename(census_tract = h_tract_geocode) %>% - arrange(demand_scenario, refining_scenario, oil_price_scenario, census_tract, year) %>% - group_by(demand_scenario, refining_scenario, oil_price_scenario, census_tract) %>% - mutate( - prev_emp = ifelse(year == 2020, NA, lag(total_emp)), - total_emp_revised = ifelse(year == 2020, total_emp, total_emp - ((1 - alpha_emp) * prev_emp)), - prev_comp_usd19h = ifelse(year == 2020, NA, lag(total_comp_usd19_h)), - total_comp_usd19_l = ifelse(year == 2020, total_comp_usd19_h, total_comp_usd19_h - ((1 - alpha_comp) * prev_comp_usd19h)) - ) %>% - ungroup() %>% - as.data.table() - - review_df <- ct_out_refining_direct %>% - select(demand_scenario, - refining_scenario, - oil_price_scenario, - census_tract, - year, - total_comp_usd19_h, - prev_comp_usd19h, - total_comp_usd19_l, - total_emp, - prev_emp, - total_emp_revised) - - ## save for review - write_csv(review_df, file.path(main_path, "outputs/academic-out/refining/figures/2025-update/fig-csv-files/labor_result_for_review.csv")) - # write_csv(review_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files/labor_result_for_review.csv")) - - ## calc discounted low - ct_out_refining_direct[, total_comp_PV_l := total_comp_usd19_l / ((1 + discount_rate)^(year - 2019))] - - ## select columns - ct_out_refining_direct <- ct_out_refining_direct[, .( - demand_scenario, refining_scenario, oil_price_scenario, census_tract, year, total_emp, total_emp_revised, total_comp_h, - total_comp_usd19_h, total_comp_usd19_l, total_comp_PV_h, total_comp_PV_l - )] - - - return(ct_out_refining_direct) - - # ## summarize at the county level - # county_out_refining_summary <- county_out_refining[, .( - # production_bbl = sum(value), - # revenue = sum(revenue) - # ), by = .( - # demand_scenario, refining_scenario, - # oil_price_scenario, year, county - # )] -# -# ## calculate labor impacts -# county_out_refining_summary[, county := fifelse(county == "Solano County", "Solano", county)] -# -# -# ## merge with labor multipliers, calculate labor vals -# county_out_labor <- merge(county_out_refining_summary, proc_labor_dest_df, -# by = c("county"), -# all.x = T, -# allow.cartesian = T -# ) - - # county_out_labor[, ':=' (c.dire_emp = (revenue / (10 ^ 6)) * dire_emp_mult, - # c.indi_emp = (revenue / (10 ^ 6)) * indi_emp_mult, - # c.indu_emp = (revenue / (10 ^ 6)) * indu_emp_mult, - # c.dire_comp = (revenue / (10 ^ 6)) * dire_comp_mult, - # c.indi_comp = (revenue / (10 ^ 6)) * ip.indi_comp_mult, - # c.indu_comp = (revenue / (10 ^ 6)) * ip.indu_comp_mult)] - # - # county_out_labor[, ':=' (total_emp = c.dire_emp + c.indi_emp + c.indu_emp, - # total_comp = c.dire_comp + c.indi_comp + c.indu_comp)] -# -# county_out_labor[, ":="(c.emp = (revenue / (10^6)) * employment, -# c.comp = (revenue / (10^6)) * emp_comp)] -# -# county_out_labor <- county_out_labor[, .( -# total_production_bbl = sum(production_bbl), -# total_revenue = sum(revenue), -# total_emp = sum(c.emp), -# total_comp = sum(c.comp) -# ), .(demand_scenario, refining_scenario, oil_price_scenario, year, destination)] - - # ## convert to 2019 dollars - # county_out_labor[, total_comp_usd19 := total_comp * cpi2019 / cpi2020] - # - # ## calc PV - # county_out_labor[, total_comp_PV := total_comp_usd19 / ((1 + discount_rate)^(year - 2019))] - # - # ## rename columns - # setnames(county_out_labor, c("total_comp", "total_comp_usd19", "total_comp_PV"), c("total_comp_h", "total_comp_usd19_h", "total_comp_PV_h")) - # - # ## calculate the lower bound value - # county_out_labor <- county_out_labor %>% - # arrange(demand_scenario, refining_scenario, oil_price_scenario, destination, year) %>% - # group_by(demand_scenario, refining_scenario, oil_price_scenario, destination) %>% - # mutate( - # prev_emp = ifelse(year == 2020, NA, lag(total_emp)), - # total_emp_revised = ifelse(year == 2020, total_emp, total_emp - ((1 - alpha_emp) * prev_emp)), - # prev_comp_usd19h = ifelse(year == 2020, NA, lag(total_comp_usd19_h)), - # total_comp_usd19_l = ifelse(year == 2020, total_comp_usd19_h, total_comp_usd19_h - ((1 - alpha_comp) * prev_comp_usd19h)) - # ) %>% - # ungroup() %>% - # as.data.table() - # - # review_df <- county_out_labor %>% - # select(demand_scenario, refining_scenario, oil_price_scenario, destination, year, total_production_bbl, total_revenue, total_comp_usd19_h, prev_comp_usd19h, total_comp_usd19_l, total_emp, total_emp_revised) - # - # ## save for review - # write_csv(review_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-update/fig-csv-files/labor_result_for_review.csv")) - # # write_csv(review_df, file.path(main_path, "outputs/academic-out/refining/figures/2025-08-beta-adj/fig-csv-files/labor_result_for_review.csv")) - # - # ## calc discounted low - # county_out_labor[, total_comp_PV_l := total_comp_usd19_l / ((1 + discount_rate)^(year - 2019))] - # - # ## select columns - # county_out_labor <- county_out_labor[, .( - # demand_scenario, refining_scenario, oil_price_scenario, destination, year, total_emp, total_emp_revised, total_comp_h, - # total_comp_usd19_h, total_comp_usd19_l, total_comp_PV_h, total_comp_PV_l - # )] - # - # county_out_labor -} - - -calc_state_direct_impacts <- function(annual_direct_labor) { - - dt <- annual_direct_labor - - dt_state <- dt[, .( - state_emp_h = sum(total_emp), - state_emp_l = sum(total_emp_revised), - state_comp_h = sum(total_comp_h), - state_comp_usd19_h = sum(total_comp_usd19_h), - state_comp_PV_h = sum(total_comp_PV_h), - state_comp_usd19_l = sum(total_comp_usd19_l), - state_comp_PV_l = sum(total_comp_PV_l)), - .(demand_scenario, refining_scenario, oil_price_scenario, year)] - - return(dt_state) - -} - - - - -calc_labor_all_impacts_outputs <- function(main_path, - state_annual_direct_impacts, - indiv_prod_output, - dt_refcap, - product_px, - cpi2019, - cpi2020, - discount_rate, - alpha_comp, - alpha_emp, - dt_indirect_state_multipliers) { - ## add product for calculating price - county_out_refining <- copy(indiv_prod_output) - - county_out_refining[, fuel := as.character(fuel)] - - county_out_refining[, product := fifelse( - fuel %chin% c("gasoline", "drop-in gasoline"), "gasoline", - fifelse(fuel %chin% c("diesel", "renewable diesel"), "diesel", "jet_fuel") - )] - - ## merge with counties - county_df <- dt_refcap[, .(site_id, county)] - county_df[, site_id := as.character(site_id)] - - - county_out_refining <- merge(county_out_refining, county_df, - by = c("site_id"), - all.x = T - ) - - # fill in missing counties - county_out_refining[, county := fifelse( - site_id == "342-2", "Contra Costa", - fifelse( - site_id == "99999", "Kern", - fifelse(site_id == "t-800", "Los Angeles", county) - ) - )] - - ## merge with prices - product_df <- copy(product_px) - product_df <- product_df[, .(year, oil_price_scenario, product, product_price)] - - county_out_refining <- merge(county_out_refining, product_df, - by = c("year", "product"), - all.x = T, - allow.cartesian = T - ) - - ## calculate revenue - county_out_refining[, revenue := value * product_price] - - ## step 1: summarize at the state level - state_out_refining_summary <- county_out_refining[, .( - production_bbl = sum(value), - revenue = sum(revenue) - ), by = .( - demand_scenario, refining_scenario, - oil_price_scenario, year - )] - - - ## step 2: process induced df - ## step 3: skip - total_indir_induc_multipliers <- dt_indirect_state_multipliers[, .(emp.rev = sum(emp.rev), - ec.rev = sum(ec.rev), - emp.li = sum(emp.li, na.rm = T), - ec.li = sum(ec.li, na.rm = T)), by = .(DestinationRegion)] - - ## step 4: divide revenue by $1 million. - ## multiple the resulting number separately by emp.rev and ec.rev. - ## You should now have the combined indirect and induced impacts by year and scenario. - state_out_refining_summary[, `:=` (empl_indir_induc_impact = (revenue / 1e6) * total_indir_induc_multipliers$emp.rev[1], - comp_indir_induc_impact = (revenue / 1e6) * total_indir_induc_multipliers$ec.rev[1])] - - - - ## step 5: merge with state direct impacts - state_out_refining_all_impacts <- merge(state_out_refining_summary, state_annual_direct_impacts, - by = c("year", - "demand_scenario", - "refining_scenario", - "oil_price_scenario"), - all = T) - - ## step 6: sum direct and indirct/induced impacts - state_out_refining_all_impacts <- state_out_refining_all_impacts[, state_comp_all_impacts := comp_indir_induc_impact + state_comp_h] - - state_out_refining_all_impacts <- state_out_refining_all_impacts[, .(demand_scenario, - refining_scenario, - oil_price_scenario, - year, - production_bbl, - revenue, - state_comp_all_impacts)] - - - ## merge with BAU to compute relative impact and induced and indirect impacts - state_out_refining_all_impacts_bau <- filter(state_out_refining_all_impacts, - demand_scenario=="BAU" & refining_scenario=="historic production" & oil_price_scenario=="reference case") - - state_out_refining_all_impacts_bau <- state_out_refining_all_impacts_bau[, .(year, - state_comp_all_impacts)] - - setnames(state_out_refining_all_impacts_bau, c("state_comp_all_impacts"), c("state_comp_all_impacts_bau")) - - ## step 7: lag state_comp_all_impacts by one year. - ## step 8: multiply lagged state_comp_all_impacts by 0.8 and - ## then separately by emp.li and ec.li. This will leave you with - ## induced employment and compensation effects from rehires’ labor - ## income at their new jobs for each year and scenario. - state_out_refining_all_impacts <- merge(state_out_refining_all_impacts, state_out_refining_all_impacts_bau, - by=c("year"), - all.x = T) %>% - arrange(demand_scenario, refining_scenario, oil_price_scenario, year) %>% - group_by(demand_scenario, refining_scenario, oil_price_scenario) %>% - mutate( - prev_comp = ifelse(year == 2020, NA, lag(state_comp_all_impacts)), - prev_comp_bau = ifelse(year == 2020, NA, lag(state_comp_all_impacts_bau)), - state_comp_all_impacts_l = ifelse(year == 2020, state_comp_all_impacts, state_comp_all_impacts - ((1 - alpha_comp) * prev_comp)), - state_comp_all_impacts_l_bau = ifelse(year == 2020, state_comp_all_impacts_bau, state_comp_all_impacts_bau - ((1 - alpha_comp) * prev_comp_bau)), - state_comp_all_impacts_l_relative = state_comp_all_impacts_l - state_comp_all_impacts_l_bau, - state_comp_all_impacts_l_relative_adj = ifelse(state_comp_all_impacts_l_relative > 0, NA, state_comp_all_impacts_l_relative), - prev_comp_l = ifelse(year == 2020, NA, lag(state_comp_all_impacts_l_relative_adj)), - state_comp_emp_li = ifelse(year == 2020, NA, - (prev_comp_l / 1e6) * total_indir_induc_multipliers$emp.li[1]), - state_comp_ec_li = ifelse(year == 2020, NA, - (prev_comp_l / 1e6) * total_indir_induc_multipliers$ec.li[1]) - ) %>% - ungroup() %>% - as.data.table() - - ## save for review - write_csv(state_out_refining_all_impacts, file.path(main_path, "outputs/academic-out/refining/figures/2025-update/fig-csv-files/step_8_output_for_review.csv")) - - ## step 9: calc revised statewide indirect and induced impact that is equal to - ## the indirect and induced impact from step 4 - direct and indirect impact from - ## step 7. - state_out_refining_summary <- merge(state_out_refining_summary, - state_out_refining_all_impacts[, .(demand_scenario, - refining_scenario, - oil_price_scenario, - year, - state_comp_all_impacts, - state_comp_emp_li, - state_comp_ec_li)], - by = c("demand_scenario", - "refining_scenario", - "oil_price_scenario", - "year"), - all = T) - - - ## subtract indirect and induced values computed in step 8 (if year 2020, use original 2020 value) - state_out_refining_summary <- arrange(state_out_refining_summary, - demand_scenario, refining_scenario, oil_price_scenario, year) %>% - group_by(demand_scenario, refining_scenario, oil_price_scenario) %>% - mutate( - prev_comp = ifelse(year == 2020, NA, lag(comp_indir_induc_impact)), - prev_empl = ifelse(year == 2020, NA, lag(empl_indir_induc_impact)), - comp_indir_induc_impact_l = ifelse(year == 2020, comp_indir_induc_impact, comp_indir_induc_impact - ((1 - alpha_comp) * prev_comp)), - empl_indir_induc_impact_l = ifelse(year == 2020, empl_indir_induc_impact, empl_indir_induc_impact - ((1 - alpha_emp) * prev_empl)) - ) %>% - as.data.table() - - state_out_refining_summary[, `:=` (empl_indir_induc_impact_l = - fifelse(year == 2020, empl_indir_induc_impact_l, empl_indir_induc_impact_l - state_comp_emp_li), - comp_indir_induc_impact_l = - fifelse(year == 2020, comp_indir_induc_impact_l, comp_indir_induc_impact_l - state_comp_ec_li))] - - ## create df with low and high induced and indirect impacts, convert to 2019, calc pv - state_out_labor_induc_indir <- state_out_refining_summary[, .(demand_scenario, - refining_scenario, - oil_price_scenario, - year, - empl_indir_induc_impact, - empl_indir_induc_impact_l, - comp_indir_induc_impact, - comp_indir_induc_impact_l)] - - setnames(state_out_labor_induc_indir, - c("empl_indir_induc_impact", "comp_indir_induc_impact"), - c("empl_indir_induc_impact_h", "comp_indir_induc_impact_h")) - - ## convert into to 2019 dollars - state_out_labor_induc_indir[, `:=` (comp_indir_induc_impact_h_usd19 = comp_indir_induc_impact_h * cpi2019 / cpi2020, - comp_indir_induc_impact_l_usd19 = comp_indir_induc_impact_l * cpi2019 / cpi2020)] - - ## calc PV - state_out_labor_induc_indir[, `:=` (comp_indir_induc_impact_h_PV = comp_indir_induc_impact_h_usd19 / ((1 + discount_rate)^(year - 2019)), - comp_indir_induc_impact_l_PV = comp_indir_induc_impact_l_usd19 / ((1 + discount_rate)^(year - 2019)))] - - - ## merge with direct impact - state_out_labor_induc_indir <- merge(state_out_labor_induc_indir, - state_annual_direct_impacts[, .(demand_scenario, - refining_scenario, - oil_price_scenario, - year, - state_emp_h, - state_emp_l, - state_comp_h, - state_comp_usd19_h, - state_comp_PV_h, - state_comp_usd19_l, - state_comp_PV_l)]) - - ## compute total impact, high and low - state_out_labor_induc_indir[, `:=` (empl_all_impacts_h = state_emp_h + empl_indir_induc_impact_h, - emp_all_impacts_l = state_emp_l + empl_indir_induc_impact_l, - comp_all_impacts_h = comp_indir_induc_impact_h + state_comp_h, - comp_all_impacts_usd19_h = comp_indir_induc_impact_h_usd19 + state_comp_usd19_h, - comp_all_impacts_PV_h = comp_indir_induc_impact_h_PV + state_comp_PV_h, - comp_all_impacts_usd19_l = comp_indir_induc_impact_l_usd19 + state_comp_usd19_l, - comp_all_impacts_PV_l = comp_indir_induc_impact_l_PV + state_comp_PV_l)] - - - ## final df - state_out_labor_all_impacts <- state_out_labor_induc_indir[, .(demand_scenario, - refining_scenario, - oil_price_scenario, - year, - state_emp_h, - empl_indir_induc_impact_h, - empl_all_impacts_h, - state_emp_l, - empl_indir_induc_impact_l, - emp_all_impacts_l, - state_comp_h, - comp_indir_induc_impact_h, - comp_all_impacts_h, - state_comp_usd19_h, - comp_indir_induc_impact_h_usd19, - comp_all_impacts_usd19_h, - state_comp_PV_h, - comp_indir_induc_impact_h_PV, - comp_all_impacts_PV_h, - state_comp_usd19_l, - comp_indir_induc_impact_l_usd19, - comp_all_impacts_usd19_l, - state_comp_PV_l, - comp_indir_induc_impact_l_PV, - comp_all_impacts_PV_l)] - - # state_out_labor_all_impacts <- state_out_labor_all_impacts |> - # rename(comp_dir_impact_h = state_comp_h, - # comp_dir_usd19_h = state_comp_usd19_h, - # comp_dir_PV_h = state_comp_PV_h, - # comp_dir_usd19_l = state_comp_usd19_l, - # comp_dir_PV_l = state_comp_PV_l) |> - # as.data.table() - - ## save for review - write_csv(state_out_labor_all_impacts, file.path(main_path, "outputs/academic-out/refining/figures/2025-update/fig-csv-files/state_out_labor_all_impacts.csv")) - - return(state_out_labor_all_impacts) - - # ## summarize at the county level - # county_out_refining_summary <- county_out_refining[, .( - # production_bbl = sum(value), - # revenue = sum(revenue) - # ), by = .( - # demand_scenario, refining_scenario, - # oil_price_scenario, year, county - # )] - # - # - # ## calculate labor impacts - # county_out_refining_summary[, county := fifelse(county == "Solano County", "Solano", county)] - # - # - # ## merge with labor multipliers, calculate labor vals - # county_out_labor <- merge(county_out_refining_summary, proc_labor_dest_df, - # by = c("county"), - # all.x = T, - # allow.cartesian = T - # ) - # - # # county_out_labor[, ':=' (c.dire_emp = (revenue / (10 ^ 6)) * dire_emp_mult, - # # c.indi_emp = (revenue / (10 ^ 6)) * indi_emp_mult, - # # c.indu_emp = (revenue / (10 ^ 6)) * indu_emp_mult, - # # c.dire_comp = (revenue / (10 ^ 6)) * dire_comp_mult, - # # c.indi_comp = (revenue / (10 ^ 6)) * ip.indi_comp_mult, - # # c.indu_comp = (revenue / (10 ^ 6)) * ip.indu_comp_mult)] - # # - # # county_out_labor[, ':=' (total_emp = c.dire_emp + c.indi_emp + c.indu_emp, - # # total_comp = c.dire_comp + c.indi_comp + c.indu_comp)] - # - # - # county_out_labor[, ":="(c.emp = (revenue / (10^6)) * employment, - # c.comp = (revenue / (10^6)) * emp_comp)] - # - # county_out_labor <- county_out_labor[, .( - # total_production_bbl = sum(production_bbl), - # total_revenue = sum(revenue), - # total_emp = sum(c.emp), - # total_comp = sum(c.comp) - # ), .( - # demand_scenario, - # refining_scenario, - # oil_price_scenario, - # impact_type, - # year, - # destination - # )] - # - # ## convert to 2019 dollars - # county_out_labor[, total_comp_usd19 := total_comp * cpi2019 / cpi2020] - # - # ## calc PV - # county_out_labor[, total_comp_PV := total_comp_usd19 / ((1 + discount_rate)^(year - 2019))] - # - # ## rename columns - # setnames(county_out_labor, c("total_comp", "total_comp_usd19", "total_comp_PV"), c("total_comp_h", "total_comp_usd19_h", "total_comp_PV_h")) - # - # ## calculate the lower bound value - # county_out_labor <- county_out_labor %>% - # arrange(demand_scenario, refining_scenario, oil_price_scenario, impact_type, destination, year) %>% - # group_by(demand_scenario, refining_scenario, oil_price_scenario, impact_type, destination) %>% - # mutate( - # prev_emp = ifelse(year == 2020, NA, lag(total_emp)), - # total_emp_revised = ifelse(year == 2020, total_emp, total_emp - ((1 - alpha_emp) * prev_emp)), - # prev_comp_usd19h = ifelse(year == 2020, NA, lag(total_comp_usd19_h)), - # total_comp_usd19_l = ifelse(year == 2020, total_comp_usd19_h, total_comp_usd19_h - ((1 - alpha_comp) * prev_comp_usd19h)) - # ) %>% - # ungroup() %>% - # as.data.table() - # - # review_df <- county_out_labor %>% - # select( - # demand_scenario, refining_scenario, oil_price_scenario, impact_type, - # destination, year, total_production_bbl, total_revenue, total_comp_usd19_h, - # prev_comp_usd19h, total_comp_usd19_l, total_emp, total_emp_revised - # ) - # - # ## save file - # write_csv(review_df, file.path(main_path, "outputs/academic-out/refining/figures/2025-08-update/fig-csv-files/labor_result_x_impact_type_for_review.csv")) - # # write_csv(review_df, file.path(main_path, "outputs/academic-out/refining/figures/2025-08-beta-adj/fig-csv-files/labor_result_x_impact_type_for_review.csv")) - # - # - # ## calc discounted low - # county_out_labor[, total_comp_PV_l := total_comp_usd19_l / ((1 + discount_rate)^(year - 2019))] - # - # ## select columns - # county_out_labor <- county_out_labor[, .( - # demand_scenario, refining_scenario, oil_price_scenario, impact_type, destination, year, total_emp, total_emp_revised, total_comp_h, - # total_comp_usd19_h, total_comp_usd19_l, total_comp_PV_h, total_comp_PV_l - # )] - # - # - # ## save file - # write_csv(county_out_labor, file.path(main_path, "outputs/academic-out/refining/figures/2025-08-update/fig-csv-files/labor_result_x_impact_type.csv")) - # # write_csv(county_out_labor, file.path(main_path, "outputs/academic-out/refining/figures/2025-08-beta-adj/fig-csv-files/labor_result_x_impact_type.csv")) - # - # - # county_out_labor -} - - - - - -## labor results grouped by demographic - -calculate_labor_x_demg_annual <- function(main_path, - annual_direct_labor, - pop_ratios) { - - # ## census pop - # census_pop <- refining_mortality %>% - # ungroup() %>% - # filter(year == 2020) %>% - # select(census_tract, pop) %>% - # unique() %>% - # rename(total_pop = pop) %>% - # as.data.table() - - ## merge with demographic info - ct_out_demo <- merge(annual_direct_labor, - pop_ratios, - by = c("census_tract"), - all.x = T, - allow.cartesian = T) - - ct_out_demo <- ct_out_demo[, .(demand_scenario, - refining_scenario, - oil_price_scenario, - census_tract, - demo_cat, - demo_group, - title, - pct, - year, - total_emp, - total_emp_revised, - total_comp_h, - total_comp_usd19_h, - total_comp_usd19_l, - total_comp_PV_h, - total_comp_PV_l)] - - # - # ## merge with population - # ct_out_demo <- merge(ct_out_demo, census_pop, - # by = c("census_tract"), - # all.x = T) - - ## multiply by pct - ct_out_demo[, `:=` (demo_emp = total_emp * pct, - demo_emp_revised = total_emp_revised * pct, - demo_comp_h = total_comp_h * pct, - demo_comp_usd19_h = total_comp_usd19_h * pct, - demo_comp_usd19_l = total_comp_usd19_l * pct, - demo_comp_PV_h = total_comp_PV_h * pct, - demo_comp_PV_l = total_comp_PV_l * pct)] - - ## summarize at the state level - state_demo_labor_out <- ct_out_demo[, .(sum_demo_emp = sum(demo_emp), - sum_demo_emp_revised = sum(demo_emp_revised), - sum_demo_usd19_h = sum(demo_comp_usd19_h), - sum_demo_usd19_l = sum(demo_comp_usd19_l), - sum_demo_comp_pv_h = sum(demo_comp_PV_h), - sum_demo_comp_pv_l = sum(demo_comp_PV_l) - ), - by = .(demand_scenario, refining_scenario, oil_price_scenario, year, demo_cat, demo_group, title)] - - - state_demo_labor_out <- state_demo_labor_out[, .(demand_scenario, - refining_scenario, - oil_price_scenario, - demo_cat, - demo_group, - title, - year, - sum_demo_emp, - sum_demo_emp_revised, - sum_demo_usd19_h, - sum_demo_usd19_l, - sum_demo_comp_pv_h, - sum_demo_comp_pv_l)] - - ## save for review - write_csv(state_demo_labor_out, file.path(main_path, "outputs/academic-out/refining/figures/2025-update/fig-csv-files/state_labor_direct_impacts_demo_annual.csv")) - - - return(state_demo_labor_out) - - - # - # ## get county and census tracts - # c_ct_df <- raw_pop_income_2021[state == "California"] - # c_ct_df[, census_tract := as.character(substr(geoid, 10, nchar(geoid)))] - # c_ct_df <- c_ct_df[, .(county, census_tract)] - # c_ct_df[, county := str_remove(county, " County")] - # - # c_ct_df <- merge(c_ct_df, ca_regions, - # by = c("county"), - # allow.cartesian = T - # ) -# -# ## get pop from refining_mortality -# pop_df <- refining_mortality %>% -# select(census_tract, year, pop) -# -# # ## get - # ratio_df <- copy(county_grp_pop_ratios) - # setnames(ratio_df, "region", "destination") - # - # ## merge - # labor_pct_df <- merge(annual_labor, ratio_df, - # by = c("destination"), - # allow.cartesian = T - # ) - # - # ## multiply by pct - # # labor_pct_df[, demo_emp := total_emp_revised * pct] - # labor_pct_df[, demo_emp := total_emp * pct] - # labor_pct_df[, demo_comp_pv_h := total_comp_PV_h * pct] - # labor_pct_df[, demo_comp_pv_l := total_comp_PV_l * pct] -# -# ## merge with population -# labor_pct_df <- merge(labor_pct_df, pop_df, -# by = c("destination", "year"), -# all.x = T -# ) -# -# ## rename pop column -# setnames(labor_pct_df, "pop", "region_pop") -# -# return(labor_pct_df) -} - - -## function for summarizing labor data -calculate_labor_x_demg <- function(ref_labor_demog_yr) { - labor_pct <- copy(ref_labor_demog_yr) - - # ## county pop by demographic group - # labor_pct[, demo_pop := region_pop * pct] - - ## summarise over years - labor_pct <- labor_pct[, .( - sum_demo_emp = sum(sum_demo_emp), - sum_demo_comp_pv_h = sum(sum_demo_comp_pv_h), - sum_demo_comp_pv_l = sum(sum_demo_comp_pv_l) - ), - by = .(demand_scenario, refining_scenario, oil_price_scenario, demo_cat, demo_group, title) - ] - - return(labor_pct) -} - -## function for creating labor output df -calculate_annual_labor_x_demg_hl <- function(main_path, - ref_labor_demog_yr, - refining_mortality, - pop_ratios) { - labor_pct <- copy(ref_labor_demog_yr) - - # ## county pop by demographic group - # labor_pct[, demo_emp_revised := total_emp_revised * pct] -# -# ## summarise over years -# labor_pct <- labor_pct[, .( -# sum_demo_emp = sum(demo_emp), -# sum_demo_emp_revised = sum(demo_emp_revised), -# sum_demo_comp_pv_h = sum(demo_comp_pv_h), -# sum_demo_comp_pv_l = sum(demo_comp_pv_l) -# ), -# by = .(demand_scenario, refining_scenario, oil_price_scenario, demo_cat, demo_group, title, year) -# ] - - ## change scenario names, factor - labor_pct[, scenario := paste0(demand_scenario, " demand - ", refining_scenario)] - labor_pct[, scenario := gsub("LC1.", "Low ", scenario)] - - ## change historic to historical - labor_pct[, refining_scenario := str_replace(refining_scenario, "historic", "historical")] - labor_pct[, scenario := str_replace(scenario, "historic", "historical")] - - # ## select columns - # labor_pct <- labor_pct[, .( - # scenario, demand_scenario, refining_scenario, oil_price_scenario, year, demo_cat, demo_group, - # title, sum_demo_emp, sum_demo_emp_revised, sum_demo_comp_pv_h, sum_demo_comp_pv_l - # )] - - ## compute per million stat - ## --------------------------------------------------------- - - ## calc 2020 pop by demographic - pop_2020 <- refining_mortality %>% - filter(year == 2020) %>% - select(census_tract, year, pop) %>% - unique() %>% - left_join(pop_ratios) %>% - as.data.table() - - pop_2020[, demo_pop := pop * pct] - - ## summarize by demographic group - pop_2020 <- pop_2020[, .(pop_2020 = sum(demo_pop)), - by = .(demo_group, demo_cat) - ] - - - ## merge with 2020 pop - labor_pct <- merge(labor_pct, pop_2020, - by = c("demo_cat", "demo_group"), - all.x = T - ) - - ## calculate per capita - labor_pct[, demo_emp_pc_h := sum_demo_emp / pop_2020] - labor_pct[, demo_emp_pmil_h := demo_emp_pc_h * 1e6] - labor_pct[, demo_emp_pc_l := sum_demo_emp_revised / pop_2020] - labor_pct[, demo_emp_pmil_l := demo_emp_pc_l * 1e6] - labor_pct[, demo_comp_pc_h := sum_demo_comp_pv_h / pop_2020] - labor_pct[, demo_comp_pc_pmil_h := demo_comp_pc_h * 1e6] - labor_pct[, demo_comp_pc_l := sum_demo_comp_pv_l / pop_2020] - labor_pct[, demo_comp_pc_pmil_l := demo_comp_pc_l * 1e6] - ## remove pop - labor_pct[, pop_2020 := NULL] - labor_pct[, title := NULL] - - ## for renaming - high_est_vec <- c("sum_demo_emp", "demo_emp_pc_h", "demo_emp_pmil_h", "sum_demo_comp_pv_h", "demo_comp_pc_h", "demo_comp_pc_pmil_h") - low_est_vec <- c("sum_demo_emp_revised", "demo_emp_pc_l", "demo_emp_pmil_l", "sum_demo_comp_pv_l", "demo_comp_pc_l", "demo_comp_pc_pmil_l") - - labor_metric_df <- tibble( - metric = c(high_est_vec, low_est_vec), - metric_name = c( - "employment", - "employment_pc", - "employment_pmil", - "compensation_pv", - "compensation_pv_pc", - "compensation_pv_pmil", - "employment", - "employment_pc", - "employment_pmil", - "compensation_pv", - "compensation_pv_pc", - "compensation_pv_pmil" - ) - ) - - ## pivot longer - labor_pct_long <- melt(labor_pct, id.vars = c("demo_cat", "demo_group", "scenario", "demand_scenario", "refining_scenario", "oil_price_scenario", "year"), variable.name = "metric", value.name = "value") - labor_pct_long[, estimate := fifelse(metric %in% high_est_vec, "high", "low")] - - ## merge - labor_pct_long <- merge(labor_pct_long, labor_metric_df, - by = "metric", - all.x = T - ) - - labor_pct_long <- labor_pct_long[, .( - demo_cat, demo_group, scenario, demand_scenario, - refining_scenario, oil_price_scenario, year, metric_name, estimate, value - )] - - - ## save df - fwrite(labor_pct_long, file.path(main_path, "outputs/academic-out/refining/figures/2025-update/fig-csv-files/", "labor_high_low_annual_outputs.csv")) - # fwrite(labor_pct_long, file.path(main_path, "outputs/academic-out/refining/figures/2025-08-beta-adj/fig-csv-files", "labor_high_low_annual_outputs.csv")) - - - return(labor_pct_long) -} - -calc_county_level_outputs <- function(main_path, - annual_direct_labor, - refining_mortality, - raw_pop_income_2021, - pop_ratios) { - - - - ## merge with demographic info - ct_out_demo <- merge(annual_direct_labor, - pop_ratios, - by = c("census_tract"), - all.x = T, - allow.cartesian = T) - - ct_out_demo <- ct_out_demo[, .(demand_scenario, - refining_scenario, - oil_price_scenario, - census_tract, - demo_cat, - demo_group, - title, - pct, - year, - total_emp, - total_emp_revised, - total_comp_h, - total_comp_usd19_h, - total_comp_usd19_l, - total_comp_PV_h, - total_comp_PV_l)] - - ## multiply by pct - ct_out_demo[, `:=` (demo_emp = total_emp * pct, - demo_emp_revised = total_emp_revised * pct, - demo_comp_h = total_comp_h * pct, - demo_comp_usd19_h = total_comp_usd19_h * pct, - demo_comp_usd19_l = total_comp_usd19_l * pct, - demo_comp_PV_h = total_comp_PV_h * pct, - demo_comp_PV_l = total_comp_PV_l * pct)] - - - - ## compute county populations - pop_2020 <- refining_mortality %>% - filter(year == 2020) %>% - select(census_tract, year, pop) %>% - unique() %>% - as.data.table() - - ## census tract x county - c_ct_df <- raw_pop_income_2021[state == "California"] - c_ct_df[, census_tract := as.character(substr(geoid, 10, nchar(geoid)))] - c_ct_df <- c_ct_df[, .(county, census_tract)] - c_ct_df[, county := str_remove(county, " County")] - - ## merge with counties - pop_2020 <- merge(pop_2020, c_ct_df, - by = c("census_tract"), - all.x = T - ) - - pop_2020 <- pop_2020[, .(census_tract, pop, county)] - - ## merge - labor_county_out <- merge(ct_out_demo, pop_2020, - by = c("census_tract"), - all.x = T - ) - - - ## direct impact - ## make labor outputs long and sum by county region - labor_county_out <- labor_county_out %>% - select( - demand_scenario, - refining_scenario, - oil_price_scenario, - demo_cat, - demo_group, - title, - census_tract, - county, - pop, - year, - demo_emp, - demo_emp_revised, - demo_comp_PV_h, - demo_comp_PV_l) - - - ## summarize by county - labor_county_out <- labor_county_out[, .(county_pop = sum(pop), - demo_emp = sum(demo_emp), - demo_emp_revised = sum(demo_emp_revised), - demo_comp_PV_h = sum(demo_comp_PV_h), - demo_comp_PV_l = sum(demo_comp_PV_l)), - by = .(demand_scenario, - refining_scenario, - oil_price_scenario, - demo_cat, - demo_group, - title, - county)] - - - # ## test - # test_df <- labor_county_region_out %>% - # group_by(county, demand_scenario, refining_scenario, demo_cat, metric) %>% - # summarize(sum_value = sum(value)) %>% - # ungroup() - # - # ## total for county - # total_county_test <- ref_labor_demog_yr %>% - # select(demand_scenario, refining_scenario, destination, year, total_emp, total_emp_revised, - # total_comp_PV_h, total_comp_PV_l) %>% - # unique() %>% - # rename(region = destination) %>% - # full_join(county_region_ratio) %>% - # mutate(total_emp_h_county = total_emp * county_ratio, - # total_emp_l_county = total_emp_revised * county_ratio, - # total_comp_PV_h_county = total_comp_PV_h * county_ratio, - # total_comp_PV_l_county = total_comp_PV_l * county_ratio) %>% - # select(county, demand_scenario, refining_scenario, year, total_emp_h_county, - # total_emp_l_county, total_comp_PV_l_county, total_comp_PV_h_county) %>% - # pivot_longer(total_emp_h_county:total_comp_PV_h_county, names_to = "metric", values_to = "value") %>% - # group_by(county, demand_scenario, refining_scenario, metric) %>% - # summarise(value = sum(value)) %>% - # ungroup() - # - - - ## for renaming - high_est_vec <- c("demo_emp", "demo_comp_PV_h") - low_est_vec <- c("demo_emp_revised","demo_comp_PV_l") - - labor_metric_df <- tibble( - metric = c(high_est_vec, low_est_vec), - metric_name = c( - "employment", - "compensation_pv", - "employment", - "compensation_pv" - ) - ) - - labor_county_out_df <- labor_county_out %>% - pivot_longer(demo_emp:demo_comp_PV_l, names_to = "metric", values_to = "value") %>% - left_join(labor_metric_df) %>% - mutate(estimate = ifelse(metric %in% high_est_vec, "high", "low")) %>% - select(demand_scenario:county_pop, metric_name, estimate, value) %>% - as.data.table() - - - ## save df - fwrite(labor_county_out_df, file.path(main_path, "outputs/academic-out/refining/figures/2025-update/fig-csv-files/", "labor_county_outputs.csv")) - # fwrite(labor_county_out_df, file.path(main_path, "outputs/academic-out/refining/figures/2024-08-beta-adj/fig-csv-files", "labor_county_outputs.csv")) - - - return(labor_county_out_df) -} diff --git a/archive-from-repo/compare-health-npv-plot.R b/archive-from-repo/compare-health-npv-plot.R deleted file mode 100644 index 7018867..0000000 --- a/archive-from-repo/compare-health-npv-plot.R +++ /dev/null @@ -1,16 +0,0 @@ -## compare health npv plot outputs - -library(data.table) -library(tidyverse) - -main_path <- "/Users/tracey/Library/CloudStorage/GoogleDrive-tmangin@ucsb.edu/Shared drives/emlab/projects/current-projects/calepa-cn/outputs/academic-out/refining/figures/" - -submission_df <- "2024-orig-submission/fig-csv-files/state_npv_fig_inputs_health.csv" -newer_df <- "2025-health-revisions/fig-csv-files/state_npv_fig_inputs_health.csv" - -orig_df <- fread(paste0(main_path, submission_df)) - -new_df <- fread(paste0(main_path, newer_df)) |> - rename(new_val = value) |> - left_join(orig_df) |> - mutate(diff = new_val - value) diff --git a/archive-from-repo/compare-labor-out.R b/archive-from-repo/compare-labor-out.R deleted file mode 100644 index 2ad02c6..0000000 --- a/archive-from-repo/compare-labor-out.R +++ /dev/null @@ -1,63 +0,0 @@ -## compare outputs - -orig <- fread(file.path(main_path, "outputs/academic-out/refining/figures/2025-update/fig-csv-files/labor_result_for_review.csv"), - colClasses = c(census_tract = "character")) - -compare <- merge(ct_out_refining_direct %>% filter(product_scenario == "changing prices"), - orig, - by = c("demand_scenario", - "refining_scenario", - "oil_price_scenario", - "census_tract", - "year"), suffixes = c("_orig", "_new")) |> - ## compute absolute difference - mutate(diff_total_comp_usd19_h = total_comp_usd19_h_orig - total_comp_usd19_h_new, - diff_prev_comp_usd19h = prev_comp_usd19h_orig - prev_comp_usd19h_new, - diff_total_comp_usd19_l = total_comp_usd19_l_orig - total_comp_usd19_l_new, - diff_total_emp = total_emp_orig - total_emp_new, - diff_prev_emp = prev_emp_orig - prev_emp_new, - diff_r = total_emp_revised_orig - total_emp_revised_new) - - -orig2 <- fread(file.path(main_path, "outputs/academic-out/refining/figures/2025-update/fig-csv-files/state_out_labor_all_impacts.csv")) - -orig2 <- orig2 |> pivot_longer(state_emp_h:comp_all_impacts_PV_l, names_to = "metric", values_to = "orig_value") - -compare2 <- state_out_labor_all_impacts |> pivot_longer(state_emp_h:comp_all_impacts_PV_l, names_to = "metric", values_to = "value") |> - filter(product_scenario == "changing prices") |> - full_join(orig2) |> - mutate(diff = orig_value - value) - -orig3 <- fread(file.path(main_path, "outputs/academic-out/refining/figures/2025-update/fig-csv-files/state_labor_direct_impacts_demo_annual.csv")) |> - pivot_longer(sum_demo_emp:sum_demo_comp_pv_l, names_to = "metric", values_to = "orig_value") - -compare3 <- state_demo_labor_out |> pivot_longer(sum_demo_emp:sum_demo_comp_pv_l, names_to = "metric", values_to = "value") |> - filter(product_scenario == "changing prices") |> - full_join(orig3) |> - mutate(diff = orig_value - value) - -orig4 <- fread(file.path(main_path, "outputs/academic-out/refining/figures/2025-update/fig-csv-files/", "labor_high_low_annual_outputs.csv")) |> - rename(orig_value = value) - -compare4 <- labor_pct_long |> - filter(product_scenario == "changing prices") |> - full_join(orig4) |> - mutate(diff = orig_value - value) - -orig5 <- fread(file.path(main_path, "outputs/academic-out/refining/figures/2025-update/fig-csv-files/state_labor_direct_impacts_demo_annual.csv")) |> - pivot_longer(sum_demo_emp:sum_demo_comp_pv_l, names_to = "metric", values_to = "orig_value") - -compared5 <- state_demo_labor_out |> - filter(product_scenario == "changing prices") |> - pivot_longer(sum_demo_emp:sum_demo_comp_pv_l, names_to = "metric", values_to = "value") |> - full_join(orig5) |> - mutate(diff = orig_value - value) - -npv_comp <- fread(file.path(main_path, "outputs/academic-out/refining/figures/2025-update/fig-csv-files/", "state_npv_fig_inputs_labor.csv")) - -comp6 <- plot_df_labor |> - filter(produc) - - - - \ No newline at end of file diff --git a/archive-from-repo/compare_demo.R b/archive-from-repo/compare_demo.R deleted file mode 100644 index 66d89e9..0000000 --- a/archive-from-repo/compare_demo.R +++ /dev/null @@ -1,80 +0,0 @@ -library(data.table) -library(ggplot2) -library(tidyr) -library(dplyr) -library(cowplot) - -# $tar_target(name = file_population, command = file.path(main_path, "data/benmap/processed/ct_inc_45.csv"), format = "file"), -# tar_target(name = file_dt_ct_inc_pop, command = file.path(main_path, "data/health/processed/ct_inc_45_2020.csv"), format = "file"), - -path <- c("G://Shared drives/emlab/projects/current-projects/calepa-cn") - -old <- fread(paste0(path, "/data/benmap/processed/ct_inc_45.csv")) -new_old <- fread(paste0(path, "/data/health/processed/ct_inc_45_2020_old.csv")) -new <- fread(paste0(path, "/data/health/processed/ct_inc_45_2020.csv")) - -# First compare total pop in 2020 - -old %>% - filter(year == 2020) %>% - summarize(pop = sum(pop) / 1000000) -new_old %>% - filter(year == 2020) %>% - summarize(pop = sum(pop)) -new %>% - filter(year == 2020) %>% - summarize(pop = sum(pop)) - -# Compare age groups -old %>% - select(lower_age, upper_age) %>% - distinct() -new_old %>% - select(start_age, end_age) %>% - distinct() -new %>% - select(start_age, end_age) %>% - distinct() - -# figs by age group - -old_fig <- old %>% - filter(year > 2019) %>% - mutate(age_group = ifelse(lower_age < 30, "<30", ">=30")) %>% - group_by(age_group, year) %>% - summarise(pop = sum(pop) / 1000000) %>% - ggplot(aes(x = year, y = pop, color = age_group, group = age_group)) + - geom_line() + - # scale_y_continuous(limits = c(0,25), breaks = c(0,5,10,15,20,25))+ - scale_y_continuous(limits = c(10, 30), breaks = c(10, 15, 20, 25, 30)) + - theme_cowplot() + - labs(y = "Population (millions)", x = "Year") + - guides(color = "none") -old_fig - -new_old_fig <- new_old %>% - filter(year > 2019) %>% - mutate(age_group = ifelse(start_age < 30, "<30", ">=30")) %>% - group_by(age_group, year) %>% - summarise(pop = sum(pop) / 1000000) %>% - ggplot(aes(x = year, y = pop, color = age_group, group = age_group)) + - geom_line() + - # scale_y_continuous(limits = c(0,25), breaks = c(0,5,10,15,20,25))+ - scale_y_continuous(limits = c(10, 30), breaks = c(10, 15, 20, 25, 30)) + - theme_cowplot() + - labs(y = NULL, x = "Year") + - guides(color = "none") -new_old_fig - -new_fig <- new %>% - mutate(age_group = ifelse(start_age < 30, "<30", ">=30")) %>% - group_by(age_group, year) %>% - summarise(pop = sum(pop) / 1000000) %>% - ggplot(aes(x = year, y = pop, color = age_group, group = age_group)) + - geom_line() + - theme_cowplot() + - scale_y_continuous(limits = c(10, 30), breaks = c(10, 15, 20, 25, 30)) + - labs(y = "Population (millions)", color = "Age group", x = "Year") -new_fig - -plot_grid(old_fig, new_old_fig, new_fig, labels = c("A. Old population data", "B. New (old) population data", "C. New population data")) diff --git a/archive-from-repo/create_ct_xwalk.R b/archive-from-repo/create_ct_xwalk.R deleted file mode 100644 index df686af..0000000 --- a/archive-from-repo/create_ct_xwalk.R +++ /dev/null @@ -1,59 +0,0 @@ -## Tracey Mangin -## May 27, 2023 -## Create crosswalk - -## libraries -library(tidyverse) -library(sf) -library(data.table) -library(plotly) - -## paths -main_path <- "/Volumes/GoogleDrive/Shared drives/emlab/projects/current-projects/calepa-cn/" -main_path <- "/Users/traceymangin/Library/CloudStorage/GoogleDrive-tmangin@ucsb.edu/Shared\ drives/emlab/projects/current-projects/calepa-cn/" -sp_data_path <- paste0(main_path, "data/GIS/raw/") -save_path <- paste0(main_path, "project-materials/refining-paper/model-prep/census-xwalk/") - -## file names - use cartographic boundaries, not tigerlines -prev_ct <- "ct-cartographic-boundaries/cb_2019_06_tract_500k/cb_2019_06_tract_500k.shp" -ct_2020 <- "ct-cartographic-boundaries/nhgis0030_shapefile_tl2020_us_tract_2020/US_tract_2020.shp" - -## crs NAD83 / California Albers -ca_crs <- 3310 - -## previous version of cts -census_tract19 <- read_sf(paste0(sp_data_path, prev_ct)) %>% - select(GEOID) %>% - st_transform(crs = ca_crs) - -## california id -ca_code <- "06" - -census_tract20 <- read_sf(paste0(sp_data_path, ct_2020)) %>% - filter(STATEFP == ca_code) %>% - select(GEOID) %>% - st_transform(crs = ca_crs) - -census_tract20 <- st_make_valid(census_tract20) - -## make a crosswalk for census tracts, tract percentage overlap -## ------------------------------- - -## 2020 cts merged with 2019, all matches -ct_merged <- census_tract20 %>% - rename(GEOID_2020 = GEOID) %>% - mutate(GEOID_2020_area = st_area(.)) %>% - st_intersection(census_tract19) %>% - mutate(intersect_area = st_area(.)) %>% - arrange(GEOID_2020, intersect_area) %>% - group_by(GEOID_2020) %>% - mutate(sum_intersect_area = sum(intersect_area)) %>% - ungroup() %>% - mutate(rel_intersect = intersect_area / sum_intersect_area) %>% - rename(GEOID_2019 = GEOID) %>% - mutate(rel_intersect = units::drop_units(rel_intersect)) %>% - select(GEOID_2020, GEOID_2020_area, GEOID_2019, intersect_area, sum_intersect_area, rel_intersect) %>% - st_drop_geometry() - -## save -fwrite(ct_merged, paste0(save_path, "ct_xwalk.csv")) diff --git a/archive-from-repo/cumlutative_number_health.R b/archive-from-repo/cumlutative_number_health.R deleted file mode 100644 index 1c84258..0000000 --- a/archive-from-repo/cumlutative_number_health.R +++ /dev/null @@ -1,57 +0,0 @@ -### Cumulative NPV for health - -# setwd("G://Shared drives/emlab/projects/current-projects/calepa-cn/outputs/academic-out/refining/figures/2024-08-update/fig-csv-files") -setwd("H://Shared drives/emlab/projects/current-projects/calepa-cn/outputs/academic-out/refining/figures/2024-08-update/fig-csv-files") - -cum_h <- fread("state_npv_fig_inputs_health.csv", stringsAsFactors = F) - -cum_h %>% - filter(metric %in% "avoided_health_cost") %>% - filter(scen_id %in% c("BAU historical production", "BAU historical exports", "LC1 low exports")) %>% - select(scen_id, value, unit_desc, unit) - -# cumulative mortality and pop - -# cum_m <- fread("cumulative_avoided_mortality.csv" , stringsAsFactors = F) ; cum_m -# -# cum_m%>% -# filter(demo_cat %in% c("Race"))%>% -# group_by(scen_id)%>% -# summarise(cumul_mort_level = sum(cumul_mort_level )) -# filter(scen_id %in% c("BAU historical production","LC1 historical exports","LC1 low exports", "BAU historical exports")) - -# cumulative pop - -# fread("state_disaggregated_npv_pc_fig_inputs.csv" , stringsAsFactors = F) - -### SENSITIVITY ANALYSIS TO DIFF BETA - -# Krewski et al Beta (0.0058) and SE (0.0009628) - -# 90% CI [5 percentile; 95 percentile] - -beta_95 <- 0.0058 + 1.64 * 0.000963 -beta_95 -beta_5 <- 0.0058 - 1.64 * 0.000963 -beta_5 - -## High - -setwd("H://Shared drives/emlab/projects/current-projects/calepa-cn/outputs/academic-out/refining/figures/2024-08-beta-adj-high/fig-csv-files") -cum_h <- fread("state_npv_fig_inputs_health.csv", stringsAsFactors = F) - -cum_h %>% - filter(metric %in% "avoided_health_cost") %>% - filter(scen_id %in% c("BAU historical production", "BAU historical exports", "LC1 low exports")) %>% - select(scen_id, value, unit_desc, unit) - - -## High - -setwd("H://Shared drives/emlab/projects/current-projects/calepa-cn/outputs/academic-out/refining/figures/2024-08-beta-adj-low/fig-csv-files") -cum_h <- fread("state_npv_fig_inputs_health.csv", stringsAsFactors = F) - -cum_h %>% - filter(metric %in% "avoided_health_cost") %>% - filter(scen_id %in% c("BAU historical production", "BAU historical exports", "LC1 low exports")) %>% - select(scen_id, value, unit_desc, unit) diff --git a/archive-from-repo/debug_refinery_level_emission_factors.R b/archive-from-repo/debug_refinery_level_emission_factors.R deleted file mode 100644 index 842e86c..0000000 --- a/archive-from-repo/debug_refinery_level_emission_factors.R +++ /dev/null @@ -1,72 +0,0 @@ - - -renewables_info_altair <- tar_read(renewables_info_altair) -dt_ef_ref <- tar_read(dt_ef_ref) -dt_ef <- tar_read(dt_ef) -dt_refcap <- tar_read(dt_refcap) - -ref_ei <- fread("H:/Shared drives/emlab/projects/current-projects/calepa-cn/data-staged-for-deletion/health/processed/refinery_emission_factor.csv" - , stringsAsFactors = F) - - -#refining <- copy(refining_sites_cons_ghg_2019_2045) -refining <- fread("C:/Users/vince/Desktop/refining_sites_cons_ghg_2019_2045_for_review.csv", stringsAsFactors = F) - -cluster_cw <- dt_refcap %>% - dplyr::select(site_id, region) %>% - mutate(site_id = as.character(site_id)) %>% - bind_rows(renewables_info_altair %>% dplyr::select(site_id, region)) %>% - distinct() - -refining <- merge(refining, cluster_cw, by = "site_id", all.x = T, allow.cartesian = T, no.dups = T) - -refining[, site_id := ifelse(site_id == "t-800", "800", site_id)] -refining[, site_id := ifelse(site_id == "342-2", "34222", site_id)] -refining[, site_id := as.numeric(site_id)] - -# Cluster-level emission factors ----------------------------------------- -dt_ef <- dt_ef %>% - mutate(ton_bbl = kg_bbl / 1000) %>% - dplyr::select(-kg_bbl) %>% - spread(pollutant_code, ton_bbl) - -# refining <- merge(refining, dt_ef, by.x = "region", by.y = "cluster", all.x = T, allow.cartesian = T, no.dups = T) -# -# refining <- refining %>% -# mutate( -# nh3 = bbls_consumed * NH3, -# nox = bbls_consumed * NOX, -# pm25 = bbls_consumed * `PM25-PRI`, -# sox = bbls_consumed * SO2, -# voc = bbls_consumed * VOC -# ) %>% -# dplyr::select(-NH3:-VOC) - -# Refinery-level emission factors ----------------------------------------- - -dt_ef_ref <- dt_ef_ref %>% - mutate(ton_bbl = kg_bbl / 1000) %>% - dplyr::select(-kg_bbl) %>% - spread(pollutant_code, ton_bbl)%>% #0 for NH3 for facility 271 (San Joaquin Refining Company Inc., Bakersfield Refinery) - mutate(NH3 = replace_na(NH3,0)) # didnt report any for NEI 2011, 2014 and 2017 - -refining <- merge(refining, dt_ef_ref, by.x = "site_id", by.y = "id1", all.x = T, allow.cartesian = T, no.dups = T) -refining <- merge(refining, dt_ef, by.x = "region", by.y = "cluster", all.x = T, allow.cartesian = T, no.dups = T) - -#Assign cluster-specific EF for renewable fuel refineries -refining <- refining%>% - mutate(NH3 = coalesce(NH3.x,NH3.y), - NOX = coalesce(NOX.x,NOX.y), - `PM25-PRI` = coalesce(`PM25-PRI.x`,`PM25-PRI.y`), - SO2 = coalesce(SO2.x,SO2.y), - VOC = coalesce(VOC.x,VOC.y)) - -refining <- refining %>% - mutate( - nh3 = bbls_consumed * NH3, - nox = bbls_consumed * NOX, - pm25 = bbls_consumed * `PM25-PRI`, - sox = bbls_consumed * SO2, - voc = bbls_consumed * VOC - ) %>% - dplyr::select(-NH3.x:-VOC) \ No newline at end of file diff --git a/archive-from-repo/exploratory-figs/srm_ratio_120pm25_pm25.png b/archive-from-repo/exploratory-figs/srm_ratio_120pm25_pm25.png deleted file mode 100644 index ebf90ff4c7a497af4d03bc5e1384b3776bc2489a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112353 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 diff --git a/archive-from-repo/exploratory-figs/srm_ratio_120pm25_pm25_no_outliers.png b/archive-from-repo/exploratory-figs/srm_ratio_120pm25_pm25_no_outliers.png deleted file mode 100644 index 77b9876bcdb1b7ca236c2522977573c285e7989f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92885 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%0A9Jk&uuw0{snF==3V8GQC-|14u1t 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 diff --git a/archive-from-repo/exploratory-figs/srm_ratio_nh3_pm25.png b/archive-from-repo/exploratory-figs/srm_ratio_nh3_pm25.png deleted file mode 100644 index fa989493a674410602df23c77ca5920728033f99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75989 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

15f; zz5`bRvb?JC6gjYRKm18>#ww*5@Lm_bmA^D4CB=hgJ%{E!FWy-wP3mLsbD~zBJ9jRC zl6Vn5p+Uol;H}oir(f-`7Yz^1BgQ{|?5&D!JIGcV@dR91<7xOq0`Mw(F>^`UP9e*FvjSu?M1#h~+j`HZ~a#e}8|#egc)l zI;gJ&u=^&jpjx1=()$}?5n!rDU+tJAj=zp+ojkPP1-Ov+;E&5xp3jaqG&HDE!!Ifu z9;Q9B6VxYHMMY(Tl2{CDSkW`>be{)oCmYRH_fLVbVT z4L|ra=C3`7X?3PDDu|}eGboY$>9nqcsny!iHVa%#ZK1K_-0|{}d_fCNRTaYscmW)z zEln*G2b_wl52GHz_lKabQo=dqs`8}^7!a*%@Epbghg0jkX!n~83=}GYM?;{psLP=$@F>Z-xW~i~O*5@Y z1+0|q(ndh@8*1-f*B=ABB}|m5mIhqan`m7OYLuy?7Su29d8X2Q^JZrI%H8E0G0rQa z_>ji@-pYp%FY%|nViF{o=_{d!0G=fb^)K0dT@C%I>u|=HEW`7zOdc%@RvBO(vkd7Z z7-!AhPgoF_tFm#-Y3yNj>O4cwa9w2apZF72lcMlmgq52+hzwo|$4Zo8@{~;^3*Ll! zP4`HKGvWYOBXI6$G|b6?%2o^l-jq;?(_R^Vc04fXXooFKjpwSm+KrMvCvL;)Pdmo20Xg(lbr;NOtwBH0KUY+Hn%S@#6UX4xtgWwUHBx1>M>jpc}z^`k9jP?i=rM ztWFZ_+zBEu#Pp=(h{YZ6csxZK=VDzqci5ky0sWI5Hv!@`KfpZ_;(Z4=9rs-RR$d1! zB!EcCrY;iol^NAyejavpmMPS>l+Mo0bvD459zr>roWJ8CNM!?z!r~ijQ39Q;slvPv z$>`_6(f$PfeFzh5nZRS{x)WKe(vu?O&Ylvm@ zzw2%hU;BcmgwuR@#0{EPiqxJ^7f5UopD%({C$WYnQx&aFyem6(9b;&*^p54w8*m$W zr##C07+%C^C3HJrY77gydhXTbFmEq9m2#-s0G)jm)nsHN~+!bBf0s&6;4V(-QsjlQ0KH~ zgyGJUsq@_MuVOtAe`Xu}tr~@Tlpa&1Ao=CI!1{tI>Z_Qd%(WHSV$~W;2%u22>B^Va zX2dSCW37fFWRSRzV#{BX|&CrxhO`pQ0o;T|izW9Q~B2BBqX|BN?YW56`^GpVrnC%<+l5xH-c_w5l# z4S=25UF)wAn*AyL@ghHdVsp zjwES#N5tsumT_<}i33kiSF$aDcvr6X=0Ys*K0f&_o^-C!s;v2Oc%B<^I_aA_TvX%^ z6ofu|`r)t!H0)U#4)x6HZ~iqJ4J|Emuq*5pP|=Dg8%IHqll2ZL{mk|ufoAL^A?!q}$D-)9S@;8t}FRFl~uw3Y=4%(c76b28}?9!_g3T$OzSTA=a z-__~jix^CnMfJuN)NHk8WtHdp$^w%#T!);bb%3TiRV|O*+h$HGgNF;yLk2uo-Hqas z4W|aSA=0kBo;{Ayv@)NnfHIGvTsOY_7$%nthlj|MWSYAw0giK^Ueo$J=%|^{zy}it zE35SMt=+=k&7p|l0Q5Q^sBpIIhXRYy5q`bHil@cITwO6)jWQN3<2S2{u2r)lc~eyz z3%LXCQ0p#`msD{SO$^6@lB__-2BxWj>dlq$b;z>W{DSlT_+^ZqVf%J1IT$;W0=2Zc z(tXAJnlKblom_${Oy9v}#-d!kh(39JPMgiCONr29{=HCfuUiL!@W&JFvJ+?`&W}ZN zxoNj>$)G*_f1{EHSxQt?bU!Kr;scpvSGZT2#mUOLG!9SA-M(u|`fB35{&ty^Tx~TW zYjHtfPtf;s++{X91CJp?$0M#I*ke%uGgL7ZSvFI{40|~`^FboBu)08s4sec^+>2?| z1cm<)mFpZ4q$`LP&QWbn+(|3(yj6Up+w2_81HhJUCnj=jdl{5?<+%c9|l{|NXc3A1RVpVQLm&K%i%e zN~cdRM#GTg<=1|wJa;uH?^DeCP`w3F0E5nPu|UNzJvneCm$=`Ov#ELv@BBFM0OfPa zx#R)hF#FU+E&kdtWl$?NSxFu1Au(_tN1LZ{w&!}vxsa+ie$<)U>Y~}(T>cX=|JJs`Knhb z)e*QhE4!VW+oV}h$RG(%5Q3VR$({CTPi~+Er@wqo=NUqwW?ybgTAaZx z{b3X*vWNTO7QzMlq8%Vxh)&zm>pbf!lb_%V2yOk$C}*L@xv&RvCdhRilbM}}OKXF* zk@*2s2k>wzn2L0pa-F!*1KMgfsWHLmAx&4Z+Q9<_c=uE2jq~7M`HTC?y}0p@AD5g! zd(!N_MU=Mh`n;#w4SR^Km21lI6g?TzW)#@xPa7$uJ{eNSgIr{A1m;*o?wDLi*X)zR zU@*jGA%Rqz#i_**YojD7F|pY^JcXjIM!ttL8Izvog!8w(v&;zo3lP4Jz?iCy_voAp z!!2z>u#E5LPo003FBl|7s!&9mbD+3!xS*urH=7T&SE?U5v?9F`%mBfJRZVuZZocW-NLW`|?Q@S^?t5kI-6C%50fe{Ta58}|!s9O{pic5eI| zWzEI_<2rQw7s_8|4I8TPCCeLDT?MuR;gs_(pBVXes0kEB$ZbFnY%#-3`s$Ha4wkn zrIwBLRcAwDDIHR;YzLvm1eqMvV8y-K=_obePk9y)=h_HnR8my*Qd&&TeVjNgtgMz1 z75x#rzDf-Wc%4H}7|I9kn!*kloCdiaBI*JPqUb6aP{U&NJlXaZ{de6U4%gUN@XZS+ zfL|=`(S*#x3a3{&VvTBs9dXt^nua@fBl@XOWmPdlKhrExyG)u?!IwIpil+daUt7Cs zZWC9J+R!qJbGG<2i6HzjUmQ*kz<$-lVAO8V>RlE<1hQ9XOgTJ%|5pqqG{(9#Kr9zV z2C1o{nY5KU%^p^a0b1dUuX&j`dgD8gtpOw&X@L?Ec((-`eg5*n!{}$6sFrC@DH@%e z+yObhR>0D38erA}IhM^;Fu(yQK`>_C1`$+=VaGul+c%0^vQz7V0C~Q4Zyp+Bh@89! zHtIP9w;~^8s>RV-30B3^>+9>yrXxxx;MXouV0}-bTwA`3oq^c<2L(z3yuShE`+Cqr zAALO6N%RbRvj)n&$V*qvOaONA-yLSR&;%Aci;=pzeIG(Yuw(cEZufd%PZI!+Y)+yr z6fXws@O5nNY=fXBS9s0?!H#;FG&cu83|J2|c2K}8;Ub#(1)yl4T$7XZ&4yWdHZQe| z4{`Ai1=@;MZkeeza<)AJJ+v;6>ZMYXtz$KCQ9zPK9EjXbur}1mg_SmKH8?p6G`f6{ z$&j`Pjn|EaGI2Q1@&FTzDbQ()UoP>WH>i1?y9hg#foeek>j5a*d5UdCMQywo&JLPG z{cdNGFg4Q(xfYdhkYZsza${bF7KeiEkP@7eqz$|=bh^qoyU1#y<&OGQl{+2=U@P(k zs|$5I=#lUU*!T(xsbApMw9MxCpY#kwVEXSuq!dr?Iy`vi+5K&UiePb=ayuq1!f&%zW0k*UnEKeOkzx7CY?)I%KCnYISnAy#M#lDFwNZ zoLU~|0k+A`Fxt-h!Mwo4RBN5Xo~mOv*gQJrGU8Lo&4;OZkBjl38Uv^MNF)?IC$ zt5je^kwOni0q_Pb`Z=6GGVcSDvP59({l3i6^f)ahTYQB$3TaIq~PCy zVq-gyEH#Vd6|W;{ih_wJ-?774CT*S~I%=CoNo#e_j++-Vx`SYkEcmVmCpB4c!0>uM z1;9ael9Wo#17ENde#GSf)NCPJxy7a24kb8Rxy=$(1ek*s4FcJ`5wtiXFPf9z%e_RE z5xG^W)KF%~HLlX(yail_HlNfn^WD$c#_2^d~K%p)# z=L=?@l+LnqaOf>Gzj)+ z-G8ERgtA;|+F>^4(_fl1$+gu|44Zz=eUZ*ZXbFD?gOPYH6Yj3FuX8)L^zPZChc~Kt z9yJCq6By2l_+T*X8JU^I?q*&|)<$GH7iR3n&{jPKxmdM;YiIir6iSnIdmd=ylzqzZ zZ4xnYwd)KiwYqxKhSl&y@prWW>Tvk*S_sLfqbz3?PE^W7uncG2_r}9j1(qVcHo&dA zRrgKyZ6Ux_h@o%psb>vYJ6B4+2bYzVQT7?vM&od}>sg~I!%QMj2j$`CCH2mEqos?J z6BFz`Jv|mX6Ad~%$WZH3VgDZ{FRQ*3P1h9Ncm&UUtexsAP`aymX8Ig$OaX{!-4y*` z>ySKZIb*V{UOIeO(4wk>8!>M2f6y$Hz-e(r6zxtXNTmL{3wJfpu80^%u z{bgtC3vXY9m+#h7$gG*{h6atq#%rfGitNK^15_3~RL=FsMbS_dbYw#7_`D#p-~ZcA zBo|(^JH$5-?qGbVz52QhsW8lXH8IGYjzXbY7^9o6cd+cbD}gmfF17Ct6|=d2p8XHr z$3?xacxOu-_dS_#%F_(Jc29;czbZ5)WTbLS?xeL(je?i9ZQFhUS0d zJ-)LV8c1C1{JIX~x$N`ddcmabLhGgRL1@Wn(>i{Wk>Cl!GO#J=@<`3i8<$1TS){by z)6~>t?s;mBMx#&gI66A^A;jIWahVgZ-p*#;E|L=-|M8w_lMSoHT#wdPsxsS;YPt5; zpogWka)+f^;&xdum*$jz^yrI=%<<^F60*LFU~%6HC3EfZI4F<=y>&s?9wdn=IAL4f zsVAZBU0tOdgwkW??3923%~WlEr%5i_gyg-Gymn)I;KAjq!jI(2rS;nxRNNDRVoX3r zZhgZ;b?10j#~9k;Xy>U>BW{0NM8bE38!%E6)h_cz&+09d4H@c1bZ>Wr5%ON4iM8m7 z<%La_v#Hbkub5$W@!j`(_BksW00q4w<_Gt5IZGI z9`hyM{gExEFDff5nFw|ExDR`Wfs#R?VzbYtxa`CZ+_leG>9n;FK?gDJ8IUm#fW;rN z`uUB==<@38{`_DO{6rnzDQ+N!E%ZW1;`T6C!8Vm^cI9CBg9p3kOu%WRxoCQrKhJ_T zu4lK}`CB{R+-etO^jDwjwXHOS9W4pYq%FzeEsDQy}U9$ z(~boUFULD$^6G~DfzDGfE6pq6!}8e~Hd~G}%6j}McD*^$d=pAezsM87E*L8-*ACQ` ztJ0LiqN%A#1d%@cM>0;LsHn&@e6bKT_7HoxYzYWZhnwCIgL$L*qHP?9yLL9!@0OAp zEEevxm65&}cAH)$b3#b26Jtp3eUADYdhOPTxpw;j`DQ=6TiwTCL!KJ+>EDHLpUYdf zJhJ_%Orlov;R%n1Yi|5{>t|dA(Nfn7y5619MeoGA9h= zn^(t*zQZeUd|IGP({ORDe6?ybe^|P5*!zZ9ojl{<%S+Q~hJv2L26!3@V*`tYhmo4m z04^0;PV{=4_kh0XO76BKok{1?X}2(nD?GZyF&vQMzKh^#)^WJm9A0m`qQ<+w1$v~c zu^=6k3RUFD6AgWRU0r`uJrVj#%o+g-$<5ro{rwx%3-)n1TpcHE$=mLTrRig;vNE{0 zTtdZ^Bc?kCWjj0u*dtc&yfd%~`51)!kjD1W;gKWkvR>+DW_>c}vQ5FOVRS4&UDYsE zj7RSMS85~)v~i^>Np+0gRki|#ChlAOY5 zhRg|Hl+UsK_vBl9d)Ml`2Tn$w$7E(?IBj=Px#UYnut&zMbbjnYzCQRM0DD5ZUtu5Y zY?`&RWf!f(GYp0x*O|mdnNc!5uK4mg-`tzB3Vy)xDzTvaUX*6607z`!;HZ`dg+6id ziALST)YKX~R>bPN&{Xn)$T!2%)!dWoal&S0=Ta_}96$6RAf%ZI1kq;lWBFZ#^2qRe z4ZlzMSvn@h#v7-#ikYo6*a^kRlvE8qM6hw?n!0);cingrZCAg&CHjS*&YzR8_qG;^ z?#;nncb$t03l(I{sS07}Q&h?X3@PG$xSLlv~iapx0w0Jzte6Var za`>jnYsXcz-uek_q8ffPGsAq!r~kfd88^))$X`g+?g;yldK{U*_n~!mhcBR;mQN2g z_)b1=u|2$9zlDpKiFUg+EPXM;efQNKPfqNMjG2^-Nufq#v*QN?+q=70(p{@qXs~2Z=wIN}@A0Ieu{FzRGjCj0sgbd}>DWqC9!R(PeX5*W(_pg8PrcjH+u!U*AL2 zWKV&fS*!J{fizLMZr^m%!6fOn+Y2?W6lTo4%3wjHpL{zByS!Vw$Wg?gopLU9FKYQh z$|djC{49Fig#z?`gZ2XoV47OlX{ISZN`sH2^1LMk;W&7r`ejBUdTuWgLXX?y+f{&Q zd6`k~&3-=$28%fA_CWcCir#Z1ko!SxpaR!XNMecara_exI#4;ze#f`n7_v+<(kXGT4kX9{c>mN6^o*JsrL;6}1HCf~lI)Jy8f5JV}MI zRBLa*hqfy{OZcPcj?mNo);*qjKk%rokE?SsxBvc4N`_M1@%IMs1#+iPpVqgUOlJ8D zCWkq8=B1z#^b1$o;DT(G|I5+N-Ka$uU!dc5YTH;r{zQ6xy5iB~ERJ_hn9- z%kPVfeXpsJ-bR5gP>LxT>0olsDP!D9P5W6XB^evg6}3yL`Fg?KNGIFSt^)*4L{ZFq zHHEexzVM(ACyVQPbdo{`S<;f}@^tm=mA96f3fqMG>?1IN583^E>1sQxJ1f>+u+h%p z#*O73!vT8Qrcn6HJoIKuhpRk)uV@23KVIq>94St7g~zx`wj4rTexltzeXhPBB;F>}D5h~#|J8&wviE(O z#Z?Sl#YIeDeBd%9lxp2ZZazyq{hrRV5R+!uK?S=^y#!!{@= zND8a|dO3ex41tD9Y*tR1AkE-%qkUCnEQD`W8t_nkB)O{eu6*-xm8J+->Js;+1Q zFsG4~l6syue?Q?avbZZTN4s4|d8D}R@ktfqZ*n^<`sj|J?qRwedve%AiqFC~>xAMe z3cRy2o|{FgnRTo?qn1aW+M5+$Ylu3h;_JGvYUL=FNl#C2T_Wu*#a3922?8 zK{|md<<-r=VbH~CZR6hp*ESRx@8sTJ?7Welc=cQpKkUi~+HB?)Y`;rG$N6fjr59pp zr3^X++O^d6Pw^eCD;-vLLT zhX3JS_hkI0Z-IzX805?RNVRQYM=jsN`6Gl=NHMZQWTAQ=f%A4QJpvu|VU(blhfS)xrnotQJ zuDJ6j^P7W&34g^Pf8Za{&u-M^XZ`qELq6QJOCP|eKMVap%0bSDjiXiKU;H~ff)2-T z=HYm6JMOuMvkj)X-AnnreJDb@9&fvEj@83>KOWTDQ zgb)W929MOc3VU&o&UAPrm~|-hj?PZ(U)ABlkn~j*2%k{D{Z*he^D3DgscWzGj)7YV>N=;8>N3b&p>vlpyLUMtlUyxqF z>6g`LbO__Z?q*Qj?2HU!x+BanyY8O7QVl4++F^17ypQd~sk${Fg&|csC>O>qn$T4B zL@hNAcV3LJUJp=`+6OnwHcxnjSz0$Soao_E_VoB^sH&>=v$~66$qWlcWo5F_4cFGRJ8sz8dKZ&dBerx39bfPF=#yp4 z@}!AC{Gr&`BvQqGBH*h>ANO9#>X>V%N_8aI*A=jRw_D!>IU;AS00G{7Ei=#>AA6*b zgVluIoJ+?|lN+uH4p60pvrnQ2xSf2~0rghk@GNCoy!-Fr3#W}~SkUchh6N)hnRbj$ zro-ayJo?eh$P7g+L6p1izVk_GE!XvESn~P_=$`=y&CRgb8{2Q9r?*f#D81%W#}cy3 zg6s*(zS zpMNmx?JtFRz-orn4bM6uest1@2q#|~POU+qjJ@R_YYLhbdk#d@Gtpf-Y)Wc}u0vnH znV$pskJ^m4LbnMh$*|@vzcKDDA9zNdOX(A$P9TG zFUdMV$0#bDG#3wsLzL&if9pr-9zxQ^ux1D zvoOTu`1trB4==B3$Hr=Cl1Hr_o+Z)wA3v@v*eJUJtrVBWp;n38^GYKFgAU59_u5uQ z|Lt4!0-l$buRa={(}LG^5AA{wM5p2f@+KHd~=bbMJxmxcPtJ(s1@G+L-*xP9_;Pg z!|h!TMWXS34?fh981+Wow}Z=uxpO5;z;HL78DIBqsq#L<`3rqJ*TR z-W~H{pn(dItet8F{sYdJ+r!ReT<-5-7`&tAPo%|X<~6KsmZ8hh)8ycB`VpO&)@czS-V_=r!t}AgK8B>1~mK33!m=D{T|| zZY%38+%grWmj7@+55OTe;|5Y|5lh_ikTKk={`l?Tj54u(L=q$Hneq3m1!mBvM;uG0 zdn{h_W?FB-9#)=ur+Uf3-rnSSh7EGuNqk8dsYkFGGm70@e_=6&)V6V-SGpN&^h#V2 zOtL~q+)C9ZLr+n};kE9cBnm%lj_XbF?eg7Zb>t7d_kaEf2*#hsU=9v)zkn63f$|~L zBEd;Tq&~y0KJHGQv5ARAJt3;>_M^{*2wptieyJ+Rd)83TAY!qfwzjF@Wy_5*iiJj( zM>>!hJ(MS$_W9_B&g8lSm%OQtP1ogAcPsj%1~e`hU%=sk5k3UHH*zA+D20BQZT= zhBngOEI@d!f>GtcvH;B}a{)7BTy}GO@AL7u`B{dx(izMIFag(TB$4g?;|F(%Sm|Kx zHsXTwOgq*Sarj+Fl)is4P%YB}ir_BJUr~3+d<-Vlh7}t#MM!tmgt6PghdICny?Sk! zwH;iv$lWoH{w94XAmi%U03 zGiHX%X0Fz|vQw7V`Vk^Sp0EVJV~?kF-Zr31>3=*w^C;rw1XcXWr@Ul~o}$WX+>3L^ z6m9kax+w+Mq0{b(FfiMr-O4k#gwXDE6)b;v`w>dvYXg3Gba!`e46SZ7AR9)&h_3Fw zdzKV+OnoogD<(a&gY1fhk~DvL{Sb|ePTK+Wz!n#emv3s13f8+CE01V6aJ}nR*6Rr= z(~?aLhgMUj+bpkK^34RZUY)xB6KO*XMn!(~T^dgV^O*_+>4`)6T@G(O`mQ7O==nc+ zvCWpB7jHqBVTh>`{eGGOh*~*^o}3fy@1H3@C~6*cGh%cQ*op-8KrtNSqB$XOR4oT1 z)l&O2Gm=jN&wmp9Dkw@=rpBA%VrprQpV^Pm(csU$&5ULEukGz-g6NLDRhl+7BuOyA z#u=c=UYFaiBau(%v9uU?JdF0j7YRU|8_;pEGX|h!-n-)8kbEMf!`mjyX2_-;3Je6P z`?;6f#o;bWCWA#L5Jnf{tOJmQ%^wZ}=XvMO|9CFRw#JU+Im+c^eB*xRV-;WldcCf! zk_5o_fHfG|+>8n3lvX*qPB8gi(1&>;e2m@9%uD# zL5^wHBdv5E=wP-P<*!)HL4VQ$K`;M4KBz^6>CbFxAnaFrhA7ZDaCXWN^_3uGj*`z-}Ca+ zWw6JSGcy~MK_3uY?w2oLdil^hk=lp)2eD>4I__@J2~mj(?boZ7Af<2pEtM}lV?qQu zSbW0&Sx(MO0ia>oByub$F?S9yDiU|6pzc#@)k8ef;D(Ud&c^&K9_1Hux`7N>=P|cZ zgD|mXl3Que%M6CWlA*1r(soyT=78rJ80QI9Zbr_{itoI=nav(q6TyacTxzFq)Q@+!Qh!EL53G&S zueNPL2f+zVB?QY*2#c(0yLv^B^AwIVt93aLk-9U9c6*aiq^qxAh4Ocv^W9g~eeCg^ z2uel-JdVjS#Phb>X;i!IF6ccgQ>AOBXPNJy&x+np{C4av=e=ugR-cR%IfX3 zR6^X(6)GZ|a5xqemhVhk<9B0lYP1*WVX3boM=as#EDPF?@4EZWrI}5M-eoH`{7iaL zJ;A+h>e94_o~B=t*W_{EpAic=Z|KjAGFZdqZ+w|{g3?pPf|KCP&(%E+Vztsw)qcf& zw^|1R3ZV`UrM;Frw<{!AS}JD+Ai8($a#yO7Awr{C`KrREw4!lS63PHAU*b&lIWi}l z5qS=FXV)Dk0XL8P^rs6o%CZtJB8(f`&U0gX0M5Yih`P#(RWM+nk7^P(EBeky0}?*A zeTy!FpnL*LmXk=8Fz*|zOWVdBk*|B=^Yt+~%#n9#(@cCH%M5 zKxup*a7^YLPF0g-%_TX0Td>whH!{x@KgWbxHcz=EO`uftsCLQHww`Mhxp~(fzmNp` z&@L@Z+}8KI^w#CER>&0N5n*()cDqfO7z_Qwp-IyY$K0Hp@CP4c(5*&8tum-mSx8nf zF);~Js4E78A%6bmhyY9;1=0u3j%y19r{MAOpFKMZJcT;2vJ;YMw`#|pdbw~)t8H#y zYb%8HKKC#~w=yy^O0112x(lO)_8nD(&&*&f-xRVF{B8{&#Fhsq2%`P&2A6gf*f1R? zoNzOv9z~cSdhEo@xDO#k2O?SEL~(<7Yy|?9v}8D`gR`Kdg&q2k6L)gkV95JQ2q!Dg zy`O;y{K~;%ZHV9KBzlU>QZpz*jkIVws1kCnIvLhu)68;QsF)Iii?OJ`CT6b-2Z{Urr_B@C zTzYKAMlYp8obRb7&3cHx(min$O=YRi=>86*?ORHySTf?W@O17yB9B7pDeNJB;|9{bR-GNa5|Nly%viU@1l&tJkHWdWAI(wdxEfqs~}*6*hf+`uIt z8jHDo)x`17W`Gt5JJ;^4BB{^a@$et-cHE3LTuPm591=IR9!BvDcsnBwPIigjY2fG* zSH7P*Zw!Y^G&oSznJ13px7cMld*nG~{<4j$NkEJzL95RhDbQ!ATBjZ8=3e$Q~T)qBQ0!HjYF z`{vGd2bidwlMQgg&&tWla=x?c%$#re&WqTQGksne``mnU-?^HY^e|*kVG#CA>a#l^ z%dusJCJw9yL={h~43L47J3PjV@rCIF-4HGZgQR+Vln|JH^-bKZ*bqPJ7M$*bxj ze+bFA^5+4NAdJSh15Ml3EJhpg`0Hiqq|_77E-mhNGcIkOhrc|w}Q)f_l+f>(xF_ZpaITN-YvgcEePxJ3{ViC zV0$Q{+6r=W<*jo&_yO-_d?z}~_+ja8pO??)DfDxfW{xtp^G6#yZkPUOfw0HA)*tz8 zo)}=XZEr>0IZ0cmUSAfDtJW|nb_CWt@V(QP4Vne*H4ot-h? zNGkxIaHNr#2 z*y1INSJyV0-^=PCYcr>=ZYK_Ki?dDb%rRN&O#ndxL-2zQ)^rcRDZwq2aHHL=K)nUq z$dw5*bOLcuxpcrn%ROM~byc5~SBI2Q<6Rts7=Wj)x>rk_x7|$Y*nytZgN(-CgZDTe zyzw7=emGln;HboAD)Yl)mljyg6APa{O}et4Q|bEq-r86!g|_PCm@`%W0ou=z_0$hbVEUMyZAg!zc#_|V!{ZGgIYI8zM;Fba zAAMa0x_jMIkt?aN9_&SK?c>XZfOWb)>^L}H@L`ZaIsm~)vQDAS0d!i{Up^kI?xggE za>-{$Y}!gudJJ*#`qw33uy>GsWjqCs#Orj}+WA_~UK>Ezt#d$&KmHn?fBj*Y(osfO zX|thAJq#BjC@}umP-#L_mIBIBir5LZptNQQac0d&fa zY{QGy3p<1LK%^w+AxLI2_1pfrl$gtRN+18VFiG%D?>pCzFa`$ZzOU}xGVe8LJiqbv zZK41Fh9DaN8f8e9CLkMRlVqwl>>2#uC%|O*gI`IInyN;?pWiPyY*dAK0V+D1TNmF! z>Y#qfItt-KJDYSrJ@9kyS(X@SVQUXutZ)uiH))_l<@*)q-~9S-SZHk8oKdQ5bj55j zHUFsHQUGyj8h21nJ`|Mm{@j00*Ccws+bz2-KW2r`?x{3_)%x%*<_JXIx%%sk_fTR+YYmeQ%w&v-15;b0GXUFRD2apI<-YJ7P28_QrMp2Ft%c13qJI z-b;lD1+I9*GSry3k36BX&4rD8szwC}%(WVDhI|3(EBznL(DA$FKT0P zy`i9BHV;4{5GFM=B4gj#7EeJT%O0niLwJrxuq~Ua5!g)Yx9;AZ)PpUrOnF1hxxoqv zAo)zZ`uEXrey@e5uyO)5h?Oj*KtzMrfQ;a2+`W)DO5Pdh?d>HAmH|D-D;x~@!mGza z;a6`^?;2^WdvWIYNN>XjnSX4bYVWtBmJ|_EF)=muF$0Z>AQU+x3mx`M95}n71$jL` z3SD-bv9r}B@r}gpJ@c6V`SCmoK#zcOrj#~N7IIn@V8j-sKa~} zh%x92aURS;ncZ)1GHsEQlWUOlwSx7~>G@nITbwDT;9_g@54rW9-{)1b_Go6W?T`r5GT^YH?(S^Z$mUDMTqcSk5wY?lR3XY36|oTD+2LvuqI z7}9>%hMfTiN5?+MCU@+4w<&hk2#5?b4GYO9OL5MFH9e4#-GDq3j!Y*VV$P1V&L~gLMBkZG=IsqxG$tOdc$DkKJD)7lc*4N z>>d|EkqaE?L(230-a-<8^;Qk?HkX_RT?~5+9u)(s%kU>~Pn9lUeL3MWA8zd27x-AO zkg^CAe-M{|of*9f(*+3Z*;_)8Cq34&v$K=8dpBO78F|#12f>lq8dX`lD0xtd*dg>; zgvvD9IE<>O6m^U~5+e+eL4+0RtAG7}mJ53%ZL`r(Koqoep6P|Jv8x(-SBSY2RQy)SvMR z3*KO^cR09oAL7Torj=R|f!F{3+?=S1;(RI{&@(z3tQK`^k_z?iHeJ=8FCzVH{c}~ z{r-83ERZK?No_5~MP3*e0j??I`6Xml<~Hj0&cJ~E7onj8Z=CV+I%Oq-FvuLGN?G*M z&9&i(KS+*3{OrJCkVn!iX`*&GP6cG=+p+^9C-!ehQUM#2xHZO}r5;xNRB8}{hKb0t z|3-!nq$#RgjS~NS?6WM$l};UhmQFVo4Oclh7DRc(uIChrVzRAbeut~YT;)BtlhOt& zibo8_W&pZX&+Y%;#ei}4`_n2&ws&y}a#>QaY4b)Y!;(UYds&g+9&&t+tljGn3D-eG zL7$4s%DuoP1<0iiRd87{y*SM45jG*;9|09G@HGRF?&Q6F`?kS&BOkg(ne0KYRq0r}# z?KtCLqrH#%7u|^bd-xmH6x&0M<#S7M zA2I4j#gK5SQiiQ_HU3{}=SW#9yI!@$8JGEPqd1+o>$i9*Q_z(mh0!;ua{|o(J49%5 zE!$fZ5nCPOtEK-!WGE3x^6pcq@O>M106TkxU@oK7eZ^~FOke;(Pe&vYDQ|F9$#P%h zW6VPUUgxK$L2^+Qe|H$lXwat02|z&rl71|FP$;D6dm{37na99^6P{hl@`?B|jZ%Cn z<$tsTGU!C9smG-wr(-TVF~yM7vn4?9npS!fk>I|rfJP`jRPWImdVmr6AZYz(Y;&Sd z4;Vm>smUy)!Mhh~mz(Ygir@)pq)i>da$j`@%IomhO%!Q;b@gu{j2W+|%N`<*hPz~R zG#nnAyk$m*-oX_1fi+5g^3U7QBI>!#`n_-0rs+q?`iegvpAH)B@87gRu|NLe8#Q66 z*6R=8OGo5oddeWmJa8Ul&!35V1xK9m`T6^!i}LfUSsR!0lm93$n%Y$93&fTxDk&8o zSla);?@LW>qr@5FxSxH#o%741>M&h^b@hpm31D9_qGWA8mQu*DL_=;+oN)57r&8P@ zTi2$eU}9x%LK#Dy=C2@B-J^@+8%SaS*M}u}2GnHs=DqBcEj^8h2$H2J*5C1Bwj64R zYE1ounbgv&Nva7qr9(x432Ag?fV_mpO*?np7FDn>mGfyI)xGH1>R|5Kx<*@sNjaAF zzcpryQsofdJ9?h3@#C!_V4NHvaITgbiK5{3GM8cBB!KvW+U-v6(BUyAR1M8U3jiQd zoZ&nv6yD->-IqIZ=QU&vV7n^JI$O2GOK!R2he8c&Y2iS~WGxjWd#*o~;PRQ%w?P7+ zM3pP~y1sCMO!RKCk3g7lL6U zQ8Mjkq7>hL6%X?yH`S4``1rCa=n(U(sy2OqR8T=(k>nTPS|%)zIJ5>gTx9&^Jwq2nV!Jdei7v565z?SelBmMFvE0`vZv=UIs5{Z8*TOE*m?JN3!THFp)fTVGdY(|HKi>oVI$vhAl|4m(h zr#z~LhEY+X;Q7|!#Mia9$!`f{{o9T(7)D1SW0G}70yZ+4EJ0P$kiQ=Jr5Lv8fOOK8 zRE*hwzy=op$yZwval_J8$ww01s1FzhX<7s!MM`SV4GO7;Egs`0edY z>hC}030>J!)TatFsO;$CctBH-^AAsW@Ys3q&?q^2U&)b>29P2;VX-SmvIPUXSz%`Dn)FfyzfE8oxAJ+=I}ffLoh^ zEW_om5(P#QhuqKDz`#8_Ki%TzY9NXLxM2rBAwp{EFe>9nPdeZ}5r|BM{m4K1y2@#A z1Z`4GwRE2)$8{xe?<1sBeKZ+D|9v#<88wUddIG}a&&M-lV4yKYz&YP!-aHgSMUyr| z87sT4sq1*`_!!S!*Vpr%iKG;M55$UYJ- zp991mccYJb`A%l1ofcSjDiq|(Ao}$akJI6AE_Q?+DNF;x;@p{7AufQC_yNLbFcgfJ zK#!oUtOBba7b2md9mFMXoof!mk9i97^JmUAcSi-2VKvCcf$NIY_$7DGAA)ybjXUPD z$A`1K9YNxnQflTT71DBX(i33GH^3W0aPJ%p&TM8GPPd*{-W`T#j$=fKq^@Q}&q*My z0L&q13=b@UGN#&K3MsBB^6$Ug2O&DRN|RSaMbsPA(S1LdL!Nx;2N=L}2&wU5zG@C0 zmImTT$q=rKlY*#sRA#7`+>QM}9^8JY3whDroBTcQ{5raqR3Y>ysmH`nx==cEt9FYr z{ZM;5&NoUPEZt;mg=Q?#a2-`<1<=A8LH$jT%#ar(@hjUUT3IP zkK8=Xd#J^|y5hq>T~%|%ynsoafUzOUXTRA&C}DzvsXzCprlv??HF_m1y(*}Y8-)>H zVo|%V@*^J*W&S6AGHoVXAq+DOViX4?o8M8%^K-0IZCFBh)bqLS3%kV4zfquW*)H$A z2{jW(OxC`h(sMG<%>d%GXuTKueR+5}OSkJ|Twlc>H^pu5gCkb=;K>>Ua#rYX3j ztTNjOZu9&E)2ThBZIA@3+e|@Dg~Zy zmuY^FGKAL~1&T|gsU7|HPU|V~IWnlIgU^BXH`&p1bex^#FA5Y55kY}Ebm4l>9z=x^ zZ~PF^kSsqWD_=y4Yk3iBEoN$BV-An=TrTaeUB&q)|cI%TWIVfekX4kR8eas;U z(0mB;vQdQ3jbBq$cs*9E!@0bz0H4uqQ(e9qwfu~Y?2bT0uz%nVF1NcSi(^+8__hezHAE@d1ZR1#0#|nT*pQ zA$O(^%%h2OC6GlA6WSPdZ~S@Cj@UP+r&ZTYl)`C&T37%LFy%d8D7H#yLL>zdU%;9* zDyKb3h7=De4wpj^$W-ROm;AyuBYGO$Y(ug7#XXj6u>Wq)^D7Wp75tW>Ncv++hu$Zz zr%`YBbhFuQMU(Gus==Q~-N6b*IiwV3@0wx&6y=*xUDpG9OISl#x|b;ITIAAs0lIGAHKQ0463NLQ!Y)ETQN~)9M~#mP@2-m z!NEZ_6~PY^-Z1Qnz@A^BRrLhjco{5Y5?op?WTj*?JSLcW$qMCjyNf-)rX8gBYAt^S zkOioNND$U}-@cST8q>!b@##6wQ9`k!%b_){hljNcR0LYOL-)ER7n`=V z{4I`=&?B2VRo=GQ9>1(?vQ*`_AzWS^t1 z0xp12w)tNEK-7KbXORJ@^v3~==S_2WH6ie{2{-~j?&7XI$(MQN3?O-cuvJn$hM?eF z)H|PhaQ(NB9|oImr9Lja-jjuDM$T&R~~u1zz7T-i-D5jZ!VS ze%KtZUkj+J^jVt`Fs7AlG^Of{rspA*VWmU`#jb(3Hl^WI?j zs1->R=*$bs%F2#~93n7Q)ghTeT!XQ&*NeyZ^8G+{Arh8yBB14uDXQi`wkosl6_ZLD zw;yAh`7^mQ*+>b&eiR@a96y9N$8LQE?a|G1L5o1-+ii`5_)wM~sc(b`RRvJr);on` zAA)7#@9r>CUwW+}}~^eAYHx7-@@uL%u>e4jZA4JQ`4`{ZC)HH!C4RWSEYu7%tsGDDn|XLk7L;H#(Rzt{pR4(B4}J_l%gh1zO#C@xUI&}uEg^9 z6dl;gcSxyCfNF-Co7;v%XQt+0)+d>eyXJdQR|gp_P$QA|pZjcJ2f0zUzUe+rQm``s zyJ3$JiL{B?>ljH3Z#C%I=GjYK(0i>;E94S#_WfdJ-!?YlNv5T-h4yQ`j&~X-vuG_lBSJ;B&mYueF^xaedWC2;I?B_PW}Ivu zd#J1q-GR;M-t5iG?+Ugo%-iZ#Sm=(}=0~A!<)1kk*#}AP>DeaJp6#b9P{7268%Yy7 zo7lgy`hBS<3?}D#shQ>VBWP_LIVc71D!AniZSWg~Xm9OHWcetmTw8x#IF5Rz$rRdd z?p5PO{%roe-&$|Lwg%DIUEJ=uPt!Kq2@0g6{)?k%A+`zz_cvU)g+Z_LoP8b1aEjdP zS1@EQ&dw_D>bW%y(19BcAg@Y0a#ZyFd)0?M!^43I*ab}-H|I|lDqQ_ks#3Fm@HoKD z+;5%!0KKq8*1+niW^^po!R&0d;q?7GHQCvdQV@~#(Og(!?s-&# zU=^|N42jpu+(sp)Z3tDD7I(6B4%D)GtI)U;mPM&hA;&V2--wtNr5d4&8#-v4N=je7 zvbNy}v+X0Vji7I1GLBEN+~BK&76|Fx{r$d^*SOk5H|rm5)1gq8E})Jy;=fIL@SH2V z@!;gWX1Bonu9@JTwwr>}Rj|ymx0tSjfm!sK`%!8})M}s8(RSny6iw5U_%qTV`y^8- zOtF#=nikKoX_qtoAXKk)!a&Qu=pc2$k4M4y^;K3@N^lmTu~_W-%Lfb=r|l!~35@@J ze3JRwHcn^qo;JHqwS{3NcA;+4V>4o8Tkev9tTC-64w{lSD0kMDT@!K|&EbKAjs=F1 zkplMK6ENFiXQ(#%|ebowRd}C;~_e^T>9wvF+F6IIK(G3f+PX3dO;ti$*0HUtp@$H=IB6 zbelhIvTn~SumQBvg#KDz>;>Xmjm-qm0^iL&_NF;&%VXVwUi=WBw$;e?P<<*Z3U#Ia zB&|5kQ?K0DRxwT02F$)sFWC`ZPlL0?^g24A*K(k*&&OL|U*8wq%oH}hU#8|NaiSpm zNF90cM*?;~Dx}pU@Y1r3c8;m89K=%D(4@brxZV{KrH?wh?;)(mNg6 z@=5h3L}hL1vK4r}KJsKLY$y*gtLoL~&?xw(V4eXk6dCt^fhrOxl*}<1*jUDZ&a>kj_T@j|-*L)KD!C4F zbQw@IeQL|p@coih(wud?ek&b;&fVc_GS+X*%ckme zvOVIlMREq*9s-5SW)MpT$kbe^X)Uc*l4lD+>7IjKc%m`=0>1zGf4?Qj zM|C`3P55`W({xQOCc<%gCQYWeg?wY-(f+}eeW;MUaq|wp-aw4E^BZT(xA2rh1!kfn zC++j_15QaUiSU&Cw4pZqR`EhRL;ejeXu=`rk^4M-4%#IT!?^_;2@_FD3na`si#9#( zE$$}q$B%nGudk*oXs_3;_1+K>O!Fj8!aB~&58633tqtqjS1|qF?Q!T&$K{W+|2^kC;Hhh4GeJ!+-X4ov zrIm3+*WPm{fy`n(@zu}uLDxmKncS?ygsL(=uIplI*^q|i#_B2Ntx#?i_C%7dLv`zS zR)VO-yIe9nbM9qBrUN+`=_DRqznht}3TbI+efqzn;oP0r+t9zO0iKKV`D&=c^fJbK z>gVUk;9BdZu-!YOgTT6tWJRl1cPUg}e87{TO`LxA?3qi~>#J%!^@->kmF7<~GM z-u;u}@8@>~cO>+r;Izkl&^g0%WtPChrLmHafJwLm@nC5}!{5ozaO8m61!8N@A9qI8 zjj=;W)455AX5HWJAp_~+IQ*qdEj}tbxGMg^b{zMjN!m~an9~CTYf1zA<&g0=` zK#&W_Mxyx-mM3Euk^#f+eHDM2E_CdQwkCbhe_O8FDmd=!5A2z(NvPoG?HII)5S#EC zaCaGD|)5ssUQS^cE3nKiP_pyH`;(KL;} zz-j41KyEeS?Lpp@9T9qEvChB;6om+*MY2b zRHkfC^l0R0!Q$Z1P^vj7TtDM(-c)fdP8!bsV0-EatJQWI_Kg9X)b@WUl+Agt`7fX( zE!`yTV{kXqbzNOub%EG3cB@SBM?zo9^t%dS*40*~+WnP)%0yvaOVX`i)~TMIdRPvp zlBy&6NttIXA01p=2;ycXV|#pQvLCZWa3iF;y-@D0+i-_A6uhV@F^4tVTHOq?#7N<| zuZk+N57)-;G$3}j0-Cv?9m$5x>iq)KoQpemPp`u3bs3+1xJIu{f>(P~5_Yde`VOrK zZD{P-jaOUy=@(sbH|Og1ChK<@;E|5RpFALW7wJ{KU=yYAxA(*3N{|TyC_}O_g~~^iKp-0F`-b2 zBgnZVv!yNE{wd8RoZ~#ZOX2fc+`hk}K@-oyAAh>gSU6HodHIvoH|7yvQrhIBBkVzH zv8}7xiWi9Yy%Or6=sV$P}3*vz;>vDjFw=b;bwC;oT z%#hG+EEfHq(|TCxC@Iy^)ye7a1l-6)XLS%Tg`eNr=1}yi9l62izp*;mEZ$yT!__>& z++d;^5EJbYmMHA=E~zAlH&4u9SMywoa{)R^GNU60+I13etFkgF6RERc`_=mx*0O0~ zOp*Y|j7-C-b^oyaSZzq`ayUyG+CvHWI50_cR*W-&uX;0+w&@{PdLv} zQskla2Di-il}y>6SIpcw$%*}}$WOI0g=TUW2Z=h?57xY|8KI91Qxg%;~db{@3WY73vDeOVMn+10xf~+tCvAjiE0xEGcW?Dzz(+0 z-NiBVjTx#$cc+(`{QsxGN(38MSq5d`&l7F55?s6Aae$bad|! z`SOQ|;zbro0NQVl4;p$k&Oue}e$vqAft88U z@uwUgrOUYKsVn)I;qJF8j)aaq!`0`8i(mN5G(m5zK)T7L*~!nUbQ@4~X1IF<;E%gM zJgNd7;7_wmjw+GF<;og#6?KS_{3=qV!S9%QCvg_6cag_!yLf?#Q({_Co2JJBoDH;@l`$2r;znj2m$xP;$njy@k|d<4N~T} z1Oj0ew*wd>15h~`xYcHjB&MSfja}ymJJL3HZk|DR*ahSK`S$X9bx?RpzbW6F%P$VW zT|=x7UU0+XZ}7Dj#21MreEX)GO;p3}Km|$^zy_l)R#PpWAs333INMK!l2n4w)~OVN z7QSh&wQ&(`DB)Df6xvF}E*NXy$e)BzN0c_ywwo*wr$Yt(wj^-IIxqB{p+0fo00R#g zd~1k;@59d_Ou2cTryhql%v%j1?_NDl=i*ur&koMt3(Vt@+3n(+bz5jyPzP}?S6S-QvFoP10xiKll6reqizmWYSu6oqG&2 zO6o+F^5mpCBp-OWRS%1?c`F3&Uh&DDvm4$a59pK%V5_?L0;{jflug3BZFWLc1gV=G zo%!2BTMXyGlcyx3RGF3afcyy_|Kx7?e~tLZ6Y^JN<)H6^>(g$vCz+$o?teMK8T52@ zb&dA*L0E9AkPA0ZM{Y=c`3lmJJPF^7-SB3d(ZbrMPaM`W9s;_()=v!fVq3{>Os z2-*$7vpvBQ=Bqm-%l76M7Di+Z_k^BY*Y-=|D~N|x2X=X|z0e%4tkhOmWh|^B>7E5v z)hIERjc))A+-tSZdjcSVrR3cmoT^#DGq#WU^{0JbQLCFZcoGi6C+>l2C{zgvng|`KqeQ~?=UL8I`phL=% z_M88nzP7~UiH%kGqs>kb%mx;cLV*hC20dQaaD}MEnr)zNhUv8wJ-Sz2JOP16mpUYN zI)0XKxLTIY7G+c?Q@8!zs94a7L``&2{O{V;FO3ili61CIU5UQ}>Bv@#-?dV+T5$N& z8up)%1ZHpDIT4w9Tw|A#P)e2+u(nS;I4SR2*aCROJg(l@Q~?M6#`rYzw;V3$`oEv>wWeZQx1XBodf2GE zhY(p{nxLYG*z%C@|MrQZVl&M|cQf#Vtl4`||HIJ{92;c5<8z)U)-&&m<5t<%LV{o@s5ng%V0dFVIqG8Hrrod`UTZA_GJIq(d&cKWi2EAi*@v@vKp{N_U|`C z2}CCKC$P@jzJYGuf89A7X0shQTYR+}&X!G%Y!g4xGsD)>0=PkY>pEm1#nAiXgS?(W zO-CYo%knXt%Nt|i4vC|Ya(chyVXdsPYIa`IR(n&PhUG!JlFd-Q`W|hlN4yHD#?#xS z8-0g31;D9rYtE}qU`Rs>geu2WtQZt+&mLfa?1JtA>S%~I zc4Iuem^j9sf#Z|ewiHkBU*=#8ws6jZOrqZD+%{bIhf1dnBnVwb0Ij{ON}*U|ZCcZgJ`1*0Z>bn}fihYEQ^XO?#m~r|y4?)g6yBfB%GtTqd6<4+c7XA2PETC?8Ww!xrP- zWx;z@@jz7+a4kjE#^Wa(=RK-w%dZI;Uy_GMY?Cf9E#6JQV_CDQe#-Bf1N8CCa|po; zlt>O_-ay=^KtK>KBOAz^crb!!4Q4aJnj>AF=>9EU%s(@!+%$#p@{lbG6{4bP@QXiC z&_FTIFz>H&!Z(#5`~*ZnWqc~?kQyUjkvxQKA!7r!ol6mtark%Gh0K$*y$3EV;kR~y z7@&t_1|7RPJ1#d~U$zgr*Y z5QGT~01+j)T2Tbhl(Wu$QGmHHur+m#Gl~#pxOQ z#x}he&w6}Q!8X7nf&dD%G$}xAAh{fRQohl@!8x-7$w81RJAJ?10D6C6e(p~;?ZAE=z>dfva6lB;+BFPP-8f?Hz{~h=c zL#QIB^o#KGH~jothj(3HTMI0MWfzPtMoKK^Qfn>~L#4R?&@b+sSYNA#?Qd8mNyiTE z)|fPum5L2U&LngONNypb_7c+p*MwDb?W9u9TbM=2v)0Dl;Dy@{TyQJGGwLXI`S0aK zsO}-2)CqdKcVX6}q_}V6;{6wu1pOd>8M8)~kS;*kHSL9G41&Kam_C`ph zKjptrT;vA_hoLG{$UYoj!@pxpG_50_ z5cq8YgTMm4czl#dswqPAeN5K@KEMD>E5i5Yxo0xIMceNh(F*qjJJq(i_)VfAU}g9H zIq;5q5SOPWS&7*%n{B1^Yr+g!UTvhg2{H1?>ASdiUBB0OE$wPFah_1s13j+)1|yhl zU>&5SKm5U`)186W*V($BxeBjj3Ic5(#WZhs&SE!0n&32ZgsR-?+M0^3TD#8VCs8&q zTL%C@3H+u&PS$8o#X7dniEC@=DrPMt!p16wh%7w$UU@^r`wn=SutQCfvSnM@y9+uw zUG1zK3*3h~q+x@ef)Mz)bW)oaPEYSeUsAtm+Z@z@?A(#@kHzzQh1Y-d51tOvFsI2i17xXB@Z{qG?ObID+i=Tmx+P%{-)5kqLu)-L{?!OrPN0I?f^SN>wY)cQJ zDv~vu02d_yk@WY~bvvjS22DXmLbs*Q274`e@hBq)tX7VP)<5hp>g`UOZed6uK*x08 zgCJkv%YnkniV(5xYz0|!?1m><@t&~~8%}D+L??%2)57oA5|R;k%?}^~k_kOpdtfZ} z1|?J$da^r}dW3JS&w)^7s(hshaYa{vtN5-!p47g&guG~Z}&0B>10CzP~doznlNnM;dh`|GAH`8X8S;c zMI3%+ZaCxei=#-Po?~znBfLC)?R!*7IP{$w<8%2h2rENbf$L_)Mp_fTq0|+EwM+4cBI&1q4 z@;BseSDpu4-rR8KtjykWH6S+R57J}SADpCRNPHdxPnnc|v{9!WT8#*4pSwcqXeIU# zO#VJN$Rs)ytH#*0R2c4C3)^O;(5c~wg9FBTB=Xg;c`Y#0c;$oNU95fZnELe zx*N8vx0%bmh2wtK0VY_6f=I{z{m&;NyJC6Ig?9RYjyM|aVP@pqq|jGGd7jsCl5{8d ztM0V7J&Bk)jbJrA^UAR9MEJM_v&N%Bw>e2S%ierM=;j!76!2fr7FF zkg>#sqyv602U1V8EHf%8Du(@Cq%c;FHHMAZtG zy@n6%n9_gHnxlf=Cmjs6R&u`}>rQbD9>}@-_+aC2AfWQPvZN0IlFX->o`StsGtyrO zRn67I>W@lr9ctoBBf+=T7?DWX9h9FwN&PL3&Lm5YuyKXcoE{Fhx7l${4fL?KuNxAzyTd;(t&p>oH zs$lx!MVx04c=)2(Kit}b`GfW{H(0~Qm7tO0aa`K}fPseRp2p>#S|GE$fJ4+w=(CbH zyV9Ylm)ddzOmQ1Z!2SVWl6fFX7blw19(0WeIVu_G2ilIn1_*xp;*^T!8`Y@1wQl6`HM zw}7P7;j^Svr8gDMnA5wbI!8w8Vco4>R^(07Lk|xO_)Xc}7X#ZCC<=t!L3d7n`mkb$ zWL#h^`2-MU5Acg7y2oU;1HgwmG96%7BJFawESnRmB;CzKr-z^{de>t7SFHYSkgMxr zI6v2!GxMpAF{^KOpe`8Ih=<%mMIcSD0kC`AalT=pY3aos#b?f!BAy*jjreIsPassy zCc?HaZfIyQBC^g#`9kIFf<0j6kR8-J@&+OCq#xqY0o^gy7EJDE&~8{8*}LvV=77{h zi|N3tq(G0BC@vBOCmSd9!AK2R0By}YngWqlJzheQ#1{4{GV{01_HF?@(j5-(z}qMp z{j&jH<#;V!zYOxO%(frlByCZ=XBZ!#Vr-h7lj>`_Va55`TsVtba#qj|0y5THe>BB; zmXmik*LIpDE$uOT`dPtjhEipHY>}TAdlqR!$Fgv$e6Y2OwG2E*Zc>n(3kbhj=DRY* zsJj&s78JEvARje448d6YWzwOhrJeG-&(g5ruzTd}qnCQjBNkL}$*l8g+79a@d%lao zu+tNvXHJ5D1a<-IXUF7Uhh12Mjf<%jY@hTHR3HVJI`8)T1E(42I9{MJ4aX$M?Pc`^V{jx*Z&#pT~7|9Gjd6@(S{+IK9O{KM?S zK*Si_xnRE;ZZQL?<{RlU(&eok+ML}7Nh+?;%(v%RIlYYkfP6ST3`hx>)gQoBCg2$z zHliiqNpLOszJ)D)e0hiDSrgB3-&L1y$)MF?XU@|a>ynY^#d1XM?13pGa8rpK$ zUIx%Cnq%e%7#ejzK#cgyb+(@1(TV+D81ESD0zW`;Er7+(hSyYJ#W%@qjR*d6!oE0Y zthP~Y>>rl3%Rhah$6Pq*MggEx(7mfShG2`S*$+^)Tokkce8{&l68uAf9P_FEbQ-o` zeNqn0Mc%1@jG`l7U5QH{!+h1;t>(7+6Jg`nX5R=_)#}~t0fJpdlmXvGz~`O ziy^9h{k$`N8zuPwT-!5@zvvBdK*c%2fc!3-P(gFHL|>6z%o`nrt&40HW(wVc2O>$j z?6TK*0TOSWq77AY+-Y+v#heW4A`d?aeb+BOq<> z{PdJboUW-?K59|?Xry}mk1JrMeZa?=8GcnDcY|!JmStQ-W*b1KzZ!oMg`OyWlzfpC zXh!6Ma8}u8G#CQK#4G=pvS0(^p&p!eHDA<32SO!4b;+NND*`Ku^n}Kw_!sBO^mP@l z`iGTWlK$x*D@iws!5|1z;{C*ZM-r{hF__4fb%4~)Cz^Z*(|c{uoA9|ckn)B8ONY@W zgK|Av&F(|8oqZj!(scdI-^{0;kRC&ZECEOWcktc{Es1d+VWp;2a;<}qxCyGI0xMW&6ssCQ3W;C)h_XO z;0rE`JK_9kvGQ|BXHUUr6Vl}*KIt-*krd-5Q?$+tkeb0ffzQLlz$jgfz!*H}BI`oV zpTXry`%R$|F}lxyS~wN~RqiMmE2aawmkyy@6)I;R^S4xVqJ(3o*< zadGbzUcI2N+8^4~vd_<-1&h^y4XRsC4%cJcT}Q(*aunV_BA zt*sjfKtQNs>>VIfMFSAZL*LWq9~^;4cMm{MEO*X?0ZL3`>6}7&5FX$<%f7$~jy%9* zN>DN(?7|h98Vh0;-s+SnT%hCGWB|OG*{&aXM*6C5EBqsEv z8E>A^>4yMxBQC%OT)=g08bwn2DAexfi_6JlAkG6+(+A?FUXZ4!0o(5)qg3C}u$Okc zHY0{Fso%dq1~`}yd-13VL3xrx`=Aa$>z8JDATGn*v5vB@;GHo|NCq2ymPS2l))QO@SeBwX@s!MLXQyR^&}cLxLPJ;@Fk6EERxhQyj?B zquoc#Q?NEZBC{oNWJVe zdNh~07&9`?)W;mbmcnV6w`B_IRs-6Ab<*c1mEXLL8IAeXR;W$%L6D@i`;)A!R%&x~ z4W54yPk%)dUi|w&1=fW`Yh?wdF2*wfzi984_p*ymOsdQ$rT^IlCd&$hC*^DP57q@Y zuCo=6XJkcg=`B^p%FMLnw`qf1-A{&KrA;-W9~gyTd_C+5 zb9zFF`HF>h;&nCfc1U1f)x7niY5R9k^E>fxVZHGwssw8QoT4l-JNV$C*@Wfp;tPl#R{2@X~!Au;YKkbJIuCi(4JyIXw?L3)81 zaMWcmfECFa_62wz1rngf=pL`&+n}1P2FBzN?w#M-Ov7TdJFLYsi~14sGP4hiv_aRk zk%)hkmD-^|8mUE|5Dwh%^axL?Ga{b13WmZ(RGZs@l92wKqm4N1!jFMSZ#5%Tl6YU$1|e>iVNOx^2nlUp|4rzfsY z$L|4lp&VB|vtF0m&=4HG3$TZ`%(ii+2I8^JL&6yvMS)Pj?JHEd8OrbS;=`v>1oP{=xdK|j2y=uvWd{*X;E$)AlnX99lp)MMP@Dh%UPt&%^iCwg}yzS{Zx^kk8lE zNNRzPgj8S%DYDr8aVO&>ZIoPDv7k$qWT4>EErs)rZg_)5P=boFB($?y!`31dfbz9qdG6(6 z5t)+hxs)A!($H&*_O_Agy-P^ARXrn`OxBhr4W-N^2&|8c{!CSB7(jZErjOT2^k(D$ z$8i_)2ItUmS(;F#vLFL?^t?cD)~!G54%jbuL-K>=+loba zoH4E((?d3C^pK8Uakl2*{x8g06=J6*N#!?HRSGqgq+~hQk;wtBxu7=K9Zw>T@xy}3 zgBygbTW;AJz_SLd9s6>sXFv{kQL58vIoE{dfB|b@$tLlKTEfIpBerLJT@&J5($Hbj zP?Z6jmF$%a30*%;&K8MWMmv6RIJ5j#HyxEo7PH%hKx-~i?3W4!jNX7iJ_KKR*)I>z z%0K_YGd3yE5jGY3v%B``AcKp2k?;mzDL56B!4n>K-AJb}9|phME#%B0RP z5+#omADicdm^lynFa_)Q;lX9eM1KBBziopc1s)Kp!~#MKe4{21|2tQS7Nj8(;63)i zRscQo5kts`ukR2zhPt+j| zEdq2iey?LOwMM=(;1WleF4+$twObaTK~O_fO`n!IyP)3W9DI`{TjKH){?;~W8wD*d zfhDVNOpq!*XpsR+A?YP%{`L-}wtMrbH(W8ry-4!FEjVq0Sx-4hJCeO4cj|LS>@$c4 z7T4&0!u7XKha9}Z3b{NNu9{zrvnU$7(2wh-fW6~emvKqXh0eCpNtf)uEcNu@J|d)# z0*UZlUER#T&=z8^*EutVOrz(@j>v9NwQ41s+upb_cphN)H5XqW6K*?0j5wWYzG@5M&y#IfIU=9kN|0uze^=jBNnn)&of3*;%L(Ig8KCd#;zGCIaZtO*KGf;-H9Qaw{m?5V)Yq4#bZMgZXo|2kuf=SRNim+x=w71aZl)t|iZ2e-YlA3`cR=KZr(j&UKrr}36 zKvW#0p=6C|i^agcdjyEKFx;@J*^VCgAj6+_%{e(K4bI7^VC<25lBp`QJ*sg=~=Xnc(YbfsBlfS^cX4(iKLLSXkw$SoS_hDp*_m+hg@rH*0V~u|jnq zcr|MAhqsfgGftSOdR_GQmwZ&;Gnt1y{L>1!-Bck7PlDA5fY?A1ld~aI;|d!u=C{h& z_}vC91v09Cp2s4j?&mhbRoUQ~y1jL`K#&!P#~AyQqz05?tsp>wJv2D_cS_C_PkZGRr%~P$-yCSfZuDm!_cO<0sHbyrMTRsJO(Tz(pU< z8JexzqhRI%fj>ung)HAJgZA7&y1RN2tW3oev@>Enx9)WyJ0b0KSgu%pSP21vxWAd{ z{j5Xt9JmmRkK{WTVFg0CNd8u*XmW;9`<&%s;JZpHfV7Oh59&%mmXe%I z@FLU|9Iy9tyR8Ka<@NijhV?75dkd z;f+|be?<~BC(;ffN|(jJ-+=acPS9HQY5Q3KIxzB{8i}~xS}k4$x5%S417gz{9QO_9 z^t%{MZ63KYIS@Jgl&@C-3QL+c)QTqwI$*`UlW|XeM{Ua#9D{!pv894p4;6Y6RO+e* zBh|(RQSzBWMXX7C%;_~}2+Pv(lD->E!*IdAFzfdhkJEvxSUpIIs8w5&WcXEzkg(iF z{`I-K`ZlLeNeWslEzAGc-nB+Gb)``l`@pFbraB4&QIwa6pv4j%B`HEJ5fGs$nux$E zO%w!51&Tz7MT>1w+6EMvB&F3TAV`5oc}PN8RxA)igU}Kos8q88r7$DrYEsGUlUcLY z{GBy_=lmL@9zY;j3fI0dIB=>tMXv-I0oo9_M+aFmX4qmvPG|T&ze6R zbM|5ZW~tT~K?S|3)U4A*5GRfQyA3Go9Z?hjp~#@C8s6E_@YyJ_ba1$3`VD`r#^*o+ z+}2uGaHZ<#Wxe8>?k{e5hC03{EJS^@iv9d2yp*?8x9AQQ7eB>@IHDap-SR#1{~8Aa zetbF=%ZR>oH>X5u$#Oq1Xum!e-dLNHn_Jp(#}-4a#85i{FKiILdg+YfzFcrE{05i< zPAtxedauaLUXP%ztv!cI@TlI$mYz*&p z%l>?IOFT?OG@5&FfP=xV*9K}cpt(-KQWUxA<4KTv)E;wo5Y=U7MRpn>8Y343J7K}D z`rTPrpq?}KiVn}x$?F>9(oQN$SbApu{ErI(S&pVmMpacS^9EUw4Jb*C2T-TNbWcKT zz3d-0UQ};|=&P%sona2J6&E5ZXb;4E*%cn*6O!EE#F+F$HxurQy3pX%YBAvgl=-LN zpf;U-zfuernESdc!8Z-)#5nBIh=BpO`n~s&mME36@8Lhr%c;SP)Ks>I?z-@I)_lMr z;LS6=kCA6xMYu;l?-2;As~F)6oXOX3bR?E_WN7GJKN)>k&CL~<^F*eHZep1Gw#uQC z;-Tfw_^# zKxOnfd9KE%9YVF>9o`j*9=a96eK5_%Q?&iN&b&yBawCWkdQ@z85$0t@~t&N zf1Ho4?eqv3E{w$^%3An~A5Y+907K$hNf4ZIb5eJaH6jn`XHI~#&Tc2-BtWHcq0G9~ zgx%G%0R@6Rszk{l?bev=nCFGF1u?1;GSrO_N2cR&&2xzd2b6h4v>clf$8}u+PpISx6rGTX0BN#UXOhWlwUl(46YhLEAX&Q*l8Tu=)n?c zqFY}Hs%(K=LLq+AW2+GM=ruor+(x;bn0@#qM&k7jvb*<{_0FT@5cB=r-dLag4L6!gfa{!glX*LGtS>OGv8_jZXDC64Of)AA04ryPPTNMDo*Y0;^dpJx=Je zd2Ogzcl9Y#sTDzh4t|!tYK5C{2uyMf@+|=rOqXWT3Hw5oV*Zm&uj|PHud=Zf#rKCG zGW*x9YL)|Qn0DiXLX*TL^{1^W-qH)R01yXLPLWY%;)eEXKwv+%`e`bWX#6^*cS4Pj za+M_10j_B#fDUtPl28Yt5mSD2ZWLb3(mXMZ0^}u#J5s?hh1D=a$h|b6VP|OwSQu7C zt1jz@HzD<0-XHfL)gsZ z^wf`);h4N0PphIy*UM$|b}XAft#^H4nBEF0w=e%fZggDJfbu5JfTKr_kclgRK3%i>$Bkg1w)l9bwvo;JsYBPUgv zC}^dSUni}Ry7M7`=pniU96@or6;Yla3lP8fC0@I+Od5f_t{ed#i{-^Jg^=K zBl*T2Fu7qN1_T5YlpK_t5t^JGM@8aDkkkYNAh9LK z1_M!&;7@qz3Y3wx7JdiyXw@beRg>Ev-hcIw^S959zJ&% zg+d)wyn$6mp?+?@6n?_H#IKLVT7k}*-gWZ1CR`Q5R;`poMO&8j({bC&)`1Tst1r_Wyv)P=jEe_F+ zp}RwOw6tz_HItU5cHS(cd$nTzDqENCS|o}c+?(2elm8^*-n5^*Hx`*{b)Maoup)&* zB_GoJo3mj?-7PNF>I6E8$E6B|dWU}AbpVwtL5$;U$Z&GbLInlh=qT{QMowHmib63x zGl<}fHJVZF5S~AWwow}5N1<%7G7+2&K`9F>V|4Me%KIO!-UuIm?BtB+QAqn&d`yRE zwEz7>PTim8#~-&i|GR(jhA%1+g__Sdt_gIXdim72Hux-g5Z7AMo}&EPZE-l4l;~B< zShZdwzEsa)^7Z}0s6_Lw&F`P+$NY9lesKkML`rw=+OU_HRs5Cvf9SjRnW^;GhOx1I zdUBL^i&;#bj*%~z(a76zXqB&g?u6t*iAnsXcBQw+pxcO#fZ69r_iv9Gjk_}L3OxAw z{*09SgClG*QkCm9{PI0H2FlWuqn@g&F;{+1RZALvGap^GZML#7RL;3`2$i5G8XuCD z=y{RVbLyr0=re9(@@P$4x!Yo|NtpELm+SN)-#$H6pziMQipuH`mox5Yj(iz+K~0HE zEUi6{`YqGVFlw9Gp+48lC7Jouy#vno+y)&L^dEenxou=L@@8kqZ6u_Q%})MU%K$0K&o`Jw zvgqrWL)Ffz_+rJfQ$OP+?c;O|mjb-NM{KT4pB$?V3A%m^^M(@_+Ixj$YO+jf4T}}B z5Vg`PceN`ASErOFts}0|(R=?XOTYBf9E0-OKWXTk`i=Z{DB`QVCMIpK| z7A?VWWvv{e!6}PG4|9E3y0(M0#(LI8k2&BH8K0sB&`Y+l$m)hv0J}8Oc5l735m?)jo@{M6ZSP8)!|1FR}Ta z={?R-pJy&xwR$q5rlcf3u03~Bb~L4gKJUu3OF-Sqx|za_x;h}eHi)BP^c2>vaCgLe zOvc(tnAZfJ_8^E~s4j6F8=cEXrWVwvKWRwl&(MPHppRq`kj}xj6A1P){FhNibYu>n$1mCrrL6C`|?D? z6zZay&BtDc$pp#;G1OE)J87~=Tx%(vcX;`N--uOq`x`y3pSm+bm1Y37bg0}gZ%UMw zd~%E>E?-TL(Y@L3E$#&Bt#8Wbk0}@5TkpPow%jT!OH$r^dHreaSePs;az(}N=B(p# zvlwY`ekL{EKJYOe;|o*OJ5}n0>5H*ldg^n?D)dT>!Ya^(xTIzohRputzk17`=F5kQ zt%Y*r@y^>J`s%$LKN74W+Q%8r`D~czRaZ(%j9>e_3YL0GxFu%9sW~P&_r)}+(59!hhS5mBGiGA7*}+$c;j(V$IEmM2Ln$S# z>!ma}NyL-&dXN&va7kPGcw7qxQ~bz2NY8;NLQ*OukJZ)X*0C~4d#wiFJbyB2y_$P8 zr+gvsW~$Xsal%&WZB^rg|7hbyy66nlY|((d-db5vk!Y%FLjU;AfkQu6BVtZVa1Dg( zhss=n2;LLCjv)5Q6%qTvlJKVVPE$%dFC{KVU5Cguud{d%#iFIKEtB_}#Gpf5kgA$CVx?lz*Kis2&lQI;p0^%l=iC=?ae5Z9G9g}UIgLdIY; zv(m1JoA%jUId3;$Uv4+(I$)=g^J>IrZOCM4yn)=;>RZ%MNiX&Nsy?U=;wH1)E?NGa zYPCJeSY_E>)W}y}{ak@HHs66@NHqTV*RSLj$wgr+0)fz4+Hw7N(Q1s&VXL@FVw7h% zCniV>l`Njp^wFTq`59=|X(?A9A0NE;QiDohIe*F5Ki6T*68rLvL3Vb&itit%y0i6E zw|uwe86W+8G?3BI{k{QWe}LP!uAjO35{U#?HUg!KhCOF1wpM3*_|xo~<3wgz#*js-+MeJ?qn|gJjt27P1RSE5 zdY8OGToFv4cBUEkzPsH@0{V{qhTk}MVTg3sXGP`O(e zi`$^UlOtzOJY{j!W`6MgfCrU&R?J=>iBGe;mzwP$8q6A2Eq&(o@N+E6)h@8S-O^9bXf7=N#E(Bk1H(I9@&zQrW! zM$&8LXg+ecoM2_02UjB$n2BJl7vt8bfi|ESKN|&vRYMR+7upsL3J)U&YVL@foJ*gLu z`g}RhlQMHthuGi!>*eQN4~zC3KrpMcgnTG--ABCY$3K!J2~N9V#&} zxzn;+eXXN!Ux(^0#)K5E8Y*1zUjJU<=2Al4-7=Z$&9$4!B=i5wG*{STDA$^O`LmB| zkrtx$4?g~ip{q`m_NoO{h&yE@hn3p?{t4qYEwQuGG4_F$EjYhbrd)9=oJ)E1+f%ks zfFRtq=UsDKkrjqI)#k0rPbKND&Ze?7iDZ5dc<=CI7G%)Yx@x;6DWY;@Rb zF=S+WQcS>MxZ*~Kuneq4El7*?wL(}6kIY5+($UJkH#qY zXzaC}o3Vmi7SDSJ;TC6U*}NZAY%eupf~qGMO2$H`04i?}RPE?p8#{DW;r6pj`g(dy zh)0Mh(z7q+TI3*VWofsiR+hWY$91eikS45IQ^4JH5jvB`l*}oU{pG`#3)ROFZSE(W zs|w4)+5?s_viLmHRiIk0ph+9}5=ECBp;PK)cFC|p99&UZjHsP%#M&|Oul|~ZC+lNu z)H7jHOZ8>*vxKV3=GInLQCsZ~Rev{_=aauaqMs}%F1n|kR6OEat`gJ+pgChIS9i&X zN-?70KfzQ!m)AI2&k+`ES3FcSj zeyg;J!CLnpFl?n=c?|rQBHrmU56123g_KorEH0mpijC{LoJ2c9bSRu&%)0-)1VV9L z^0i0CAO564mH@xgA~Bn#4Hy)=y`wpdi1ZSyHw3wJeYOxsiibUIkl2Z+M$z_jRC0#h z)FphX)m{v!yvinGeP<4y$78KkE3(jgV`-`*O>KAw?6?_U)ZgF#C#eUYWf-GmK~eV$ z&E(3AHYVy>r_>`_dPg23q{`(Klx28Ehv=+B)ZKR&#uwfnoZ>X}-Ix#`|NFYGw;zB@ z>m}{*$(fm%QN5AP?y~uv)d9lSfnOMBcefV9z%`E-6sN_ck?mrcAjVX?^cXNg(i3Dz z^sIr$ISw)48Qad30$0`012E(5ISbiFt0Zvp-rwkq0^lq;__P9|hk)x`?|MhlZl`Hg zynPuDA91BUAmEIo>s*v#zjCy;2@K!c<4N7 zb@(V~aL`wf*ZNbx^{4o9`8@&l+XL}E)`Tw*_Zdu zq7o?f{e&+kbXYEE4lJhsdi7~XzC~*Zh+)}~Jp5IwYV&RdrCV>dhyWAKYq4s}#) z61KhXrXcX$_Tkejx%CPz&em4Dz*C9oS^BK5Ab+Uj$J{K0U27 zF29lAMFLz)RUU@KXk0#svLRT$<$~=Pafa3 z@{x%Gf=+&F@`ea^rkl)TUqpTmQ;PL^iAR*cvjax=UA?Et2wQ8YG^S+ zO(wRZ2nn<6zq~*qoqWi-yDRP+rh=tZs|1ih1=uu3tH2flJb5{ZDwR{YIpZP=F~jgf z(2?ENnXb&`qQ&yXN&%DFVE3^QF=GG&h@s1kRQljnw_4mP^RH3;j7BhhtVr|&Bp{Kt z1B^n*Nj0h5w=%T!toUM|sV^@vcFlxgt1FgYlJP~8T1f}q*CyZ5SqJy%utXP#SP@Se zzI{euqw*3MW%O8+P-`$49X2lYww4xSnCz~55LJbLwT&AD)Bd8>F(rTViQ!_7TKaNX z)-hDn?a*M2^g;GaH$E1~Ks^)w4$C@L5Up_hpe+`Nh`e4{?@raGr@I=4@wK; z&r8|`U_c^>Q(;IV_#)8b8ZAp_jsOCtVBw41>=rbVHt&?z+VX*yStpMn*(GK%dp~zS z6>(lgw+B&I1hE`PSduWI6Zqku%4U$U6v% zsnSnsj@N3h(aj~9dKEf%wF0nWiq>~hyzNuuoVnl~H12JOdY8-V!m!&)-EPGffkK~h z1|ViK*1(+WNQr&hOlc91Y69E*2051* z#d=%SNRzg|G4{xpXPk;B5U8GAJS-s}#>#>yY>Nz=&&qAcSLh&%NVW3b8W=HL8-~1c zkBDd>xopiB*CAY6#W%m8%S8dx9cjho>lfLL8^XCTcC&ikQ6`SA?+?&cH^mB>)c^ha z?2y~)T%ThLhExse%pf-6jcb{Yzs;@fFn&Fa5?JsDSU6zDgEhxs#bwtX#5kYiO~kYy{vT zi!61c71xg-K}M;bT3|e~r2)X0QH~Z4UyibF+{1u5k!RD|0Rk@eN*HSrR(gT|IrP}c z^`P^WR#~cdMAF7Gskj8uUK2=vF!Lddt_XKkwu8Tll245x*)$Hsu$W zbk>H+b!$_`JBcs{jPmeM&Af(Y8B*(KmIL240spr$?KhewDQevEjGF(8( zLK`Bu>jq14V;Pw_fk>v-wUggxtMAmnMFy}`a%p*b&UMhS4qpV0rm%#{plAEMqsVo> z|5YvD1V%?`!(K%S!g9!F<1eV*zduJkMka|bLOhs?4-)MW?24Ogdba00D#sW43vKq| zx($ISy8Hd9?6?o7aW0K^o@d>iK=4g@o~1qI^IU{OSL-xC2Ww0tj_D=~1{~8I1-!Yj z$4|dsrNwpLRuIt{T!E}J(Py=fVQmBunQ?!Cl}f*6wr4^i5%1r{;+t#1 z&=Q4Qt4A1}#ReZ-XLjklO%rxEAi=et2e=Gb5i7lS_pW(Q3ME;QV*pKMzQI}AXJ!`# zMyN{gs7g$~c}pOK!RNf@t%)oV+-jjCI}2`@;sT&^^~NGKRG$ITEzMdk17#fpv%Pli|_sHADW|&u#RVBeZBV*cdbq-n9S_@@LDC~$ky=MQY95a z#zevC_$^b)$Ggg!{9UAya2;Z)dbZm@CdVFD*40`F&i@?;NDk~1kX&5%uOSUHSG`IO z0m0R=&5#9YYY5ExZOzWIbQO{LWkD&VXPge}dvXQK;o`3h4Cu8;@^R{40N1Y>RtiM6 zvcyw1SV3|MzfXFD+NW$Q8*6K0FwC&F*9vv8APj`cP3z%zyIUjF$~U;r-0{uwkd7$& zW_-&C1J+nNZT=Z|qNO9%d$G{fYpnau0LBBjwmNVtCSQ`TIgUS9n5>Wm-9m`IhFTkX zIysa?rjyw>FiQ>+`8Na!17Vz*tF#I4qHhhqDo(eVhi7OPe_F52t?;IDDJyZjJe*CFk2THS&F zjra0Bfd3A+O|%9u8$g=jhGuzlO4vy|VCAwoRlA$vA+#vryDgWbTxL4)MQ9HBQ{LNP zQDa&8E!Imopf)G|>mW z4Z_oS&{_0nZrE9Iu=}p&C)Hdo9z4+qjE~!0WzdpK+V6hjD;*EV?*KX6`e&^tc&dJ} zKGjJ`b*%D;kjIEaYCqQMw~I5)?}Ky{$nC1?+X^gEILQSdL}eD2Ctwi=dx3X}-`?Kr zsj|;g<7sVBpB<_4!-LPj%=Z|$89=Af?mS1}!7m$;LUd}0QkXP5z+5zJvXD^q zg003ET-GnS!UtTMJJ2%h?8cOtE;5vL>OgyAaJH3MdKW;JJQPyN2_2&T?2vlKWCdU5 zq4%3n7su{M6xW07E$U|`n9J_~J~%V6by*x`mJ6N&iSDP6U>C897~A5j*SWw`Qps%8 z+npuN4p#l@@AZI(K!PA<9sxcquDvglbNQ;am&B*vMD$D51q3*b)z%;&;f)<2DkS4P z-DRYAltn@q=3R_eDAjjvlXGm7W6WM#hiXtAW99e9_*JM}Ocoqvl@c#=TVzFeQ79VZ zd{t<5)&#Q0?Ff@-Rs%~a1D}3O@l<*)uo2Z^e%oUei(NfE3a~P&dL~g4+;o(oMPD)d zvguTO9eX0ApO=TzZLT|JnxZ7)oy@-h)3bJX<>4XPBCAjUA9q!$kb-&*!eV5ziU954;;m39>%D+-Smr1p|eT3&SVIvy*0445=(>4yI? z%k6b?E*MwAMhQ>`DYju$n=kD`WdlpLE5=pAVFA4W=tui)2$$WdnS{!+sobRoQ$a^q z>l&cMbvwymy@c1mabe~!8xZq>Y$LaXu1#OpA(tM}Fe5&s7NiE?(@tU% zB4<#u*hq!JnC3F34@i&_V0Li*Nl-~+Xhq1^iKdU>KAWv(k;HngHx6n@oT`|KNKuw$ z0(FzX5S^M789U5tuPZqT zek>5IW7%Vb3VDV`#gZ&j(t4hIh&0y`tXRBv8xA}4w5bRY`F&_JR4v(-S*63Gs=us&R+0V zxD~SJUq3n{{#C20C8jHLhdCT*#_zxU;eYJ3{9MeBUI6P36|sY@2y7I9Z4jJr32^yo5Kht)f`8ajW*TiAl1tr=0l=(7;-M+cGn?cWXjYc@HJLQK0+QG@m5HI5OR|mg!Tur z22Eb8qgenwcdSM$R6nF;)ox#YrQ6yN5D*s^hg9K4V@yJ=+L1~WRBe6HCUv1h_i$EC zf1v$aQt>+O@YtBWdckcUF2xhviSEYCxF!K)@%O6Dkl&MmnyV2VussQ-FtuQ2j35Bw zcX?8w*MUZy*k;zcn5k86-GqS4Q#pGczRaaN%dnaBHyF?3{D}P?fUFGY8j#2+D=P!9 zDHwaxRPgLWrh8)rHsPFH)XB>#9XaUS)XtrQwwFv@Q0${Zis2R7NUK0I7Q0J2edwJb z43ExL2U%GND)nhSC;BsCxWTr{-SbBE0&w2JI!q#P( ze$?GMEo+%CalmEZ@th5pLk7xRW{W1wc?_6 zY=p$USY3orA4H2X)6&!1szT>FyiWDnTwA14l$vRE^T7%u+J)`ZkKEGI61xYaMS6B8 zK3Sx&uy9cUn z=|)w)CKoZ>mWpLejx!tOd>>>C$*VZgiTZ`>^G#NYVY{(Zz=!JT!Bma%1{0??|KZq?6#m@W?Kr_ zZyn&*YXG2a;F9O*f!ePG;)ZQFdu98F^fI0wywqC{NN5GuXS*86sd$VC)#>;upL^I# zXC<7c-hlrL0@hePJ>c= zV%Z0C+JDaea^S-IKSMMGP3!+=;usAVW$pmq8UOUi*`-HLDoDc|awNaL?N7t>5`w3n zBzvXK__v-TtWxW|DR}z*?@?D3Qc!fFf`~(>aw_K7DljUBbBY}~EBMBy;rx%@sxQ}g z;8r)!M{KBKSL`jsBvY(53)P!`%p{pZ18$OJqSV>?_5|h7KO=v+k6cs_#n6pm@Yg(> zO5x-0)mQ%g`uX11z){NH{NVim`r*E({yuf@ zL#>(PuUoo;kkgl)Sp6}FFW(Sp)Z;O@;jn;cr8cd&RJG_=Y(Itzy$Qp4vtGI_OCS06 z-%pPzBcJ-RqS*@b!yW?*T$On$0wT%YF;x%uk_RM&2?DdplJWJ^n__WR zv6DXxZGYySKord)->8blOAD)X^kvV-b2c~##y0&8RHh*#div)$_J2mb+BK^_{VOVp zQYX9X=!u;Z0~Ig;o+L6fPfpM zrr70n2jAs*F0{bA+gpDk40s^n$D`?fMgR5Vchvt`eRlu9HWKbN`7w1vZ$hrJib^vN z+7XMLJAr1Cuf_+IR6(qEQ^SjscLG(9|5zP~<22f4!qBePhtAc)4(@_)O46Njw7@&c z_tXS2`t^2`J%OmjjaEOSYz#{xhPE=@L3$#rQq{HnE=;U(9TJRkaoM-#qPPYJ6$O7#V>Ky<~_yAv& z%U4IrFB%Czy}dQc>DZ4^zMS>=>Hb-SIHNVs?`s@rt4TX&*xA#wC;@$m8#S)Z>))O_ zoIsDAgQ!lNgx(blKfCegNEZ>UWe($YsHrR}cR1g{V#7JzKC&lw~|e+=#Hdib5v zy`~reX}}IdJJEQSaL$Hw@Y&y8T}y2~0gF&}$zDwX2x6){w$r;}L%uapTFu2Zt8k0iS_sCT?8p3Ps@8|!W!wtqye_jl zLVCp#hGK@=@rdP$_@@B(0{>iYkqXt0m1^TUq&FHl{6iih6M%L{Zfx~mlk*(%!RwA# z{o(H2y>$a$=^7evqhlp(K2{Itp;g<0Qgi4Jn)Sio7mfEhAEBcaUEBoTHLf5n@4!a_|>L=uagjR zd!Hc)%d97cOmzZieA_ZefyeUu=AJ8td&{tUo>vrvEVKL^QF9s;nLeo%BKg2eXedvJu?vvrm4226E7N-hX8!WLP63u z8wRuYVRGP9%u84fw}#faHHV6#;DCBl!PkJMly@B%BL9d>HDK~H2TdLy(az8wTlD5o z>9Cg}bfu-Hnp;DOZG_*Y$|~+Wz&Gh4WIR350oJLCH@YcSo>vpIe4Xv=>>8-ef2u=k zv|fJeoCVCOP$}H>R-7o$(A3PbuFvPFE{;?8?!KNsXUM52XbnwWYjW5yb2$Moh3a7u z5s?ul0pn`6aL%*R9!uj@lhZZ>@;*d^`ma!~v~q>^RU3|1Hdrhaua_TRR|G~Yxp6Yy z!B-2jnd;tr-7TDxR=)aSRP51H6RApSsKZgI(^COw45mGEyGrorPkrx%Mm6eNF;ATIa~iEnjc&3 z2=-JW$GoY!%C6^-_=HM!?({U#XE~<1ya~MZJ7Lmx=P*q$Y zdq-U~p7@($cs`N?c!-@d`zhno3*fKb+%)LnQe@B6iiO1*Q4F8!dY8c2Fdne(N|W|e z_J(y_YLA$Gy?MS@S7&GBgyheb1Ys4U;DF(fxLpp#a2v=Ow8Pi{4GzfJO}KH*(Wf zj?uW!&A;dZ@}*}V#mf)y0{B@tjX&W5ooU7TItB+c6{0yC{N7mg-|{~Vzt;)TV0y$rnWko`&mFD?gcW3}gFDi0X z8MD(#ur7kk&8&FZ&F#wPaQwtqra-+0nNH-`RX#gbw6*Krjd~w9kQbR z4wkI5!s8y&f|Dxa{wz2eU2;g5G*51fR(@NBj$P?0H!KUI(qhUOlw~5F`Dv zzfrE!ORs2Rv%Fs5MB{g!!e|YqEw%;J1R53QA47@43^Je>q$(^R2i+#3(vi=>t}`M4 zE=^0g-`fe0N(kH8m{coIpVzyDjrC9+4;CP`27r3Vxsh2}xm#?v`6G`&y_c6ipm{o- zKuBu0T+aXWl%DEpvlVtmV6;S7ML`78W2gJeK9IPJR<=zhBW(fmI3(Hwy}@eVxe}DF zk;cdWVCKin-rZLBzbm)9RYlz@+>627ic3ix3ZWG)M8gQ_~#tRJ`G*>Pn zXvY!VwvK*Sl_2G@v>3nU0jwQ=Xh0^yFA(pqfB#0^2T$ldI0g`l?H%}W3l8JfFt@F@ z0OuGZzlHrs08t5nAY#}DZEp%C228T`Ks1W$qjc1%)-2wryT z#io9)ag7|B{8ZjVAN*QzRmd3uc7qCcavZ0kxmuH|BDvuuOHBi@&LRf z8yFznE}U@d>+f!>Q*9>2fD#CnR!?EyKsR)A`tY!y&q*V!v5(?lIlp8bL{LR?6JWJ= zN~}fV^bU0D)goI0kir1;gRZd%ncq}NA?;z0t61QmlJnz0BvEKbGl4o^{l8rL0SNJ{ zb~rm@nOV@+*^MItv`_d|#dnP%?9V!xTj}pTaa#X zftZ|}vHEwbU&eyV>x0b!YnLheS)*mb9s&9GAPhBq8eL_nz&Hf(hyRoAURrwZ(NYRR zP~LectkN0~kUh}X{1p=a&G=bx{y{PVR8RISvoSoK#6MbJ)vQ{~y_-pubwL*EDrb@ed-FE{@CZn5B; za=7O9psc?pG~5B2JPi9#<_Eau7KorDIT!Ey?MA zU2$Y2tLOhO0$^ptRyP?RgC*zzM7SYmmA2;*-f!+t_M!k}8HLiGD`(E4=?lqUjG$dr z7yHI62AM1hl|6-I&~Q*m&_SY)M%N*{NCANGkN~xUysd4Jev+iy!XYMeSL8I5FzFa< zJ9|&HSR8&dCp9biftrX@E!NHB9OMWNS(V%2x%gynDdu7uw}T{}2-oIjrK zlCrhyeFi7WO|ut2;V=o8noqCeP8DbKIU*VKIc>Bt%9eo?2! z7oE||b8LB1mvy4Mr_)>vy=9UzawHZ97MHV)?&{5_l~<8`9?ncd@5|WG*6Mt@aLUR@ zk`xK!MJSz&D}iqJQRvLDmV%zyT~DmkR=YC)j?M%x@&x|FPPB+-y?qO8D05&yE3z$M zB*GOHVXRL1XBJ7~a_rlB{ zYUr?{Em$x&cwC%X=2=@lIXX)uq#42XzLARw@i^9)n3$4sXFfVtLu_y6^2y&*gd=e> zUJIpooMehALG><6xt8CRV~ag614H{W>%NUV>dn+@6?*dYX_bzIFiAf?CT9KGv_3KH(L#J+|Pf%TH zb!M9r!yCGrg1Hk*^rT6Noa@?(CrU)QR1iJai4w9pb6p#X;U9;yovaJ{Us2widN=h9 zHkPywLYn~pG=-V@GHJUzz-vHvUNQpEQTho8t=H4|om*pmNOA$k& zuW76D-g4kcshaPSdLWpfN*YOx^qsDERGNMmP?G+X!;u+7@?zle6a_IE3SdaG&jPw| zsyjHPY3ejwak#Y!Q{}txEV5k%O}-j7`7mO}S;8+tUDtD5Jf#4`F4O+$`BziJ=eWdj zt$`$U&%3Ru-%8Y#MvUG}*%Az;F{EN_wV6VwhLRq~sG64;8s918)KVqAhHcsCD%72? zBcA(3^*m`?OMn#8#FG*xSN(MFBz_WJj0IDVk-d}IWj{A@mAU7Y^v<;dL5Vkbn&qo6 z6B8f3E*zL2!Ay1zWol+Gxx5NrT^RD38>4-#ndvhFeJex)_JM_ z#RDB^@{I$$q-_x|whU`yW8?7{jgHlyb~sWZKN%98;J#b6CJWtEA1YsZhHE)-r5A@G zsS$JwXB3Drw5lmX_En@94Wl*b7a1^^R;#osPhaL*Y=1iczoF%;`~SC*qS5XG_m5tH z{|QVe)c=bSJiTr9pJn~Z-Bw*){l2;yJ2z4#tC^*Z2G{Y3nD{HoUr6l-l$f-#wY8ms zj)nE?$o5Qo*vXqo^5sh@$nCSWSK%Rg!JbC8-aNC$n*^wud~MnX;}9-lp0>5MrKzc^ z`f{YKtOk^9_O_Dn9PEj4xLrSPZtki);GIP*yl&!0z6;Hd)azSfD# zzC|6=-d4`e&bH{fgQ(<#KUDB5XI%4SAx{cDw)(vlpFtw7(#+J6YTIA|BAiX29KwFsm=mcUiv zhQ6B_pluT`N7ACM%3Zj3jST_z4~T};W!1FhrGNkk7^LT|EaDG-JH{;j05JWvw2qAg z^ZX4Xj?w09&Doc%A^RB6;?CFDe zWiO#Y-HqZHjo|uIT`B3}^Fyes6nM@g9e7S0Qq!e6To3iIe7!%FmBntV;zt>~%vL23_9 zzs*866pyemGjDGMtXsBVlIHp&+ihDm_+b~D<0p6r!vtH>OY{NM6q@GJ6i1p*ug&jhE6!dt-j5BG(-Bd4WaJ)mx$h1MADsRbO8p@6^J-;IuKTprB9(hpe{q z1!w~LBx(M#bsR5yi=8`VrH9K223J7zyQ&o4#!!jJ?Os)yW`uj(4ik%wjZIIB6itnk z!AMAyrS#eE-XWONp#1B~pee;LTz!-H*mN8};tAb(33si}179EqD%upvA}MnYEy)o6 zTz%7FY-~)DE(FZ1NkC9=X3g- z+@V8<2p0ul0lGkMcG5I5yL?61SKUf?%QZAK2>ck(s0Z3$2ZAXpZ2{V@amr6YlVQgy z(G*>K5asW?7IeB1Uan$%>RmFu9h4c|l%{JOH@UJF(;^K^kn@5BfU{dE)x~=M#$M)g zseua|0{`I_P+=bjSno!T(ZD|(XZL*yD0*5g2v7FPmG5+D0fAPok-&hokgza67sMg@ zSBeM<=JBxS7~X5*4-E}9)G%g+n2Bt2U_2cxX#sxw?LGM9^h+=SYs98h)zqrQ*fpDR z4G|opJD})89zo(@rz_yvL%5urS_qfG9#L4~b0K}<9`ml{8iMpFf9qRd7S7Q8n9wur zEW?PF^@>wY5|NhP8R^N=5h^)@JAk@cb&iS223w6gTq9kDSl9{?HrEZEM3>&uhknW- zjmLSA+#Ux_zYfr4G4zvLfrK4~WO3x^(II_Tb`)yLf%X`4$pv;L>A-PC^z*}JFs9J} zgq08YW%p-Uk?pck^&nSIkZWs}Uh#qzhQ!E!Wpcy-Hu!|`BZht)faBbsj*q~PTOl?$ zWdmR>svZ=zIP%|1n_60SH6O;j1nt`Q8(3_%X8eUSYqv7HByJ&ww>c!qF*;0R?k$wE zQq1+_pLQLjg&d=me>fV21?XP@f4gaz+0`GdzB$5pybT-!)dtLn zPxKVHAMk)arXYJ@L_8jk=3IzGMUh*3-N@gI?F;`>h3qm`^_!5h7SSmW|>`^ z`Ety3KnEd929AOC!WlP9sEKOOEQ4DhfS2K)#5)+=kXM@Kw}-tL4$*PIw1_LQva$Jj zwQPLGFV~G$%Vk~XNm-Mto`7)j$>M(vWrvuJhIKGw;P)~zc z@KcD_(UI-*X!0Ar7bBI>fg{Gqii`@c+mNheK=UKJom+i6;)hpKe705%il840*>Q(= z>DHlc7ZnrdH-Tl8?w!RPK#AjEfy3rtyHy6ji)R5OK4E~hrH|DRBQAvYja3oYh`lp6 zHTvW*2@Aq0L}j9jc82Jh4#E(GznE{c8BLS0F1 z;{(0#yOj^L^s+UkPELa7&!2Bm<&owhZI2I!?vc{|5O-ce`NctvhbX98^_Png)^-r~ z&0N0r_gU=`p94q{^9$Og`=4(!KG-bL9!NC{G*2eW1yq0q%9kUYcd3YsM4g(IT@o zCk{L7WnJM_0+m@kLI+V-lWu?$c*K*^aoLE4tnuj4BR>XomA(_)3=UP*19a}yklG7* z!B(#(X_1ah9WaWK;NakGV_(61Y_>gr7Z13tnP(t+;Sf6+)lYPmzJWryp26pf` zI$Ey!5xOlfK<~+uCo*{+%acCDCU7SAz5%wZEbg;i2nxujtM(CMcY4UYH~8cSmUj$o zPmVGbIlzuFYiJ-}lpZQXW*@>NR{7eH;K#u}dAJl-*kTV&zK4aY@Q?U10u;)TVjt?TMb*yK@mIWvQg!>35GNxQIkT6 zY=^eg-tUqY5J|x3$O{M0<_if4E%NW9w)avz_b!Kj`0$~}xxA>$ddE}AY7DQzmY9&> zqn_WFMSt|Dh`EIYe^@|k)5f-+Zk6wjh{Z)@q$Sw!;Db?@GUC~drP%qVjpwz%d`7h0_ZLbPWO*1sQAaz-F2@ii)rdS} zA0YJBA#*4#j^9P!_FMm6j&v8ajiHv|of7tOIPYoLBty`hLxjnomf2Ot&7R1H9+7TN zDL)rdyXOQ;elgjz#Rn%2Ytt3L1`g^57%cq+e(@%c4<~zK@%wr)W)HwNkKlb8t%*|~ z;m2YlX2f&6L^G4PbYvW^eir~9i3P$epxb3BzNC-e*=!|Y*uMWFYN7w+Ay zr}P;4K?b3QQ}x-sW23IbCcPv<+ICm zNXUYf<|Q$!4#Bp8HN3S-TE|&J7wdGJK?UqRNP)yh=G_@Y@_3zWO&bO5oMrKVS}TSi z={$7{dB+zd3@ogyGHo3DOD+Cr5ESrDq(oXd5HyjPr?7(F86vPzXzRn^*i(3=*=WsY zu!>|ibtM5|;Zr;*hGBbF{hoQj|L*TRDM<;q^{$O9*rVEP3QsX!Vn|40M7v#Ey|iY`h7Lf9|XdK8kE_-EdQUEWO)% zGDLpt(CW;c-n>#;o|Nd~f%!}?kt6tzt<1QJK^OuEw%Hb0>UKFYh7F8CB_cH9hCrR# z@?!X5uTDehlohRc*R5OpPab+``!PoGPlp_z=>o!=uJft=moe>W2L%=(?%ozMK6C;nrV}jen1b)6NJ!@>v zi=7>K!e`HMMOtZjq07>)zs(I@=r$LHVCMZ}^49wd7^59S zP$Ow3<>L%{79{?}T~dNRD3?UwRMTqe&98OW z;w^Yc_yL|2!rB8?@mRXCn1QC$$fA~=VcOHn1>$8Fb|8kmk}^4W*j*hf^{xJzk`63OSjj|n4#g<4_nv&3S zC+yGyU5|9`$>apRmOSdFP+hfZeoDMFvi&5kMOK95ex3wurT~mWe_6BWpk`r{&&{vx zCk-ie7xJtK{jdqWkH<79Aqi2JjtE~0UuexJ}!X8%4e(MfntT~GECa;eRucuXfI&Rn}B5sL6aYrlE9aXAsgK1Swnu}?y@fi zl=&HxHY^L{J|)J{s+t=ckA?yJDoN^mL-eEql@3xx2+VR3_QX9t*9;2n@yHZzl@Ixv zVYexRIEeXj$XkfQJcUo-@01T!^0T){JK@zg-)G#-^d&sy`0y(*vD7o@D!*~yFOrF# ze$YL1SdpjM$6{z~GT+?RHVcib48@Sx_%-)EJgCkCVVbPN4H!R*mf1#C*LgJfas$yd z_j~ugChj?veeDWO1xJD*CE$)Jkn&U8ET!(ZeCvePU$Re7)Q|RO6tl{K%s+s!V8I<@ zD+Z^2I!!kMR|)U;i)>HhVE?c8+^FW3Ark{isP&FO?QCdd14yjGkT&W0&HtClSvO!v zRHyOZQdYXbhBy8)dW|52XBd)#(%t<0{3N|`B+%>~_m0tI1)gPQ_U^%d5`kBuxX+Vw z29WsWN!)D!`8&dfK{yR#{ayhIL=!FtHZ zddNdS21afG^$6JND0-vSFL1=SV*j1ucUcHAU&hDB7v-wEIqG;);%RAV7l+>6zg`Jk zSgN`b^#oehXM7p*-%@b=!)~cdKW^{;>D0T6mf*$#C=QrVvYV)_S6}GTNPiq2i#DW&XR;QqI`PqvgN%3@bU42b& zvK75$#s*fc97k^UHY%UrYu;m?O|->wEvBZp`8$k;doEZHYi^Wk8E!o z{{BQvAHk({Kz*7_e2&V6d@YIT?AeVFpf{T#d#c+ZCZ0qtN>17rs_57$Bn z3*a)^nbBg~K++6$c2>xE8zG_>ivo)TZ;2eG4(}7edv)X=GCb`xU)Uof!(JJK^EJU< z!qiMyC{(i{#4zM|iNy7eeZ+HVj|6@j09*fECz_g?NbJV*R(wPmc6%$)_(OXs4NU4E zjC@)^NN5=t&p^ItSxI)^s;@xY!qEg&9Q?TRzP|p35W8XN`xvn--n5f~q}gzY|GM`uQ@N^XLONIM&0!<@)5H6i1wnRj#upQKfy?%N>`lhN za!GaxgdRbzqxt7L=+;t8iCo}&9;Lo1{~xrCFuNJw!Xbwx`Dw84Phr3I}jYh(){ z*{RT?3@ymM?`sjGWS{Dl%H9acT20BmXC0J1j2c^_QN$!=Dl|#>UuX1ve}0eu>+yI$ z-p!c%+~+>`IoI;Mp4WA8{WP$I|NmSXOrpxB0=c+$-#z3!z@J)}5PNnzgvX>)tH4_q z{@-8tNz9}D$ChL_2CIKw(f_#%FSwZ=Vq#(k!h5{!=I*WEb5-Q&)29f4DutqWrQSs~ zQ^Sz+xTHNFtOYo~;Qv+yccrr)63Dq`k*Dth=p6#pLJdyT?-k{TwAj@@9gDySYzF|n zPDXSk956;h{pqnPt3vIWH}}CjJi2x~kEkjsmFKxofrMk+35QoiRFnfe-uK&nJXLQ! zv)NeRKy{A_%r9uMdX;6>3gC#xn6$~cI-BI?5a~I%;PtolRg45ih1Xo zryxdg?B4=jnH|;GwoP~TdJ<0F47rk`Yaxrf2(`5Tn+~*)m&V}j8_Mkq(^7dYeDc&O zd!B6(p-}S6CKDHzjyrJz?2455m>3(g;vxHTcopAB8QU?KJ$?RwCY;FW3u--f159?= zgG@-0yeKC9gq`+vq>BD{+mAWUtPTI*>?@N==60Iu>eX_zdKu9@(sn{`rUSgBpSb1p z)r3LRq!*F{hkPKtG~!$&f>)~n8mk)es=T?Y#0~j8=UqgY>k7uAspvjh=oz#d^V-EW zJUoYF$`f$1LqwehLW|Bx7iOlX*B1k#P=n$KI`&r2FAS^slWzeSi))}m$%`e&+*FV& zV-P8r-DosR_q=h_AD}K?1PelSn*|hZ^%WZrpr;<*y6q4w*f8_h&sPGR{TEih^B4rC zccXeQD^Jkk=`?m}tlD(e13tDT1$J;YKZ0EcW)>pu^c}DldUN}B@h(9)CAV+iqZk-` z0{1-yL4g=i&5XFlCoGst`l_+7-Qhl~JGU9^=AHWu<-dNiGyOd9N6`s0{pnOD zQhghcuLH^5BVZcWxxiT%07rhAc3I*WR9E>)Tl-0FZmz+jrMmt-GmlD3OHV$8*vMyZ zKsN8o3r_pu05LkM8uZ$pL(EC{VZpwguh3jLHn}~ahtWe8u7h5CUFA=X-=A6qS(C03 zAWNQcAQ%t!PzK|CQDgb9Y_+ZFF#wzeYK_5R-#fcEpl0S5a1 zM*Y#*3orS94-zI$3k~e7hfzn(k*EI0lDx=y^O2S< z5_jr0O){5<^46>RQV&}L+=<_W0ws!Y_8wm%3iH4LO1Nj7bK)#{SW5_l+2mPi)wiv* z+;DVkH#{K|3y%jxd8fo&TU#4Hnq+qGk^B>S`qS*pRckiZr_0=%%iIn#Gl>UK>n>QI zb0J6IS-*RrM0@iSExkNZb zbU!n*0btWbNEzpoU4u;r*cFXo!{_S22s?>~S;Aa`ga3?3OkAN;k1*pce+Ij|Pv^K$ zU%xh#PerRLtJ}iK>6-Mv2l)D~GGA!hliBN+%~4e7a|oCw44#-JBZTxa-^0uU?;=QT ziG;w>X+ik_7R+~E6hn|W)zWUjHsDp+h+^shhsrv?#exW26teo@4^H`9`#KhHU!-Q@Yt4}X!DE0 z=3libdyP-WT?C-^@AhVp=(o_kzMm_146B(p8(QraN@`j zQ7t=BFp;lT00wTWeCW_pU1DNlF{%z7I(slH+zx`>;V0_%iLO)(czuH%4~O}_n!370 z)`JH!J5%%Vj!L!bvCCQqJ*`#)t`r6ZUGu~ z$TmM3RI|y#O+5uPdIbpSmyf=verIZKTUqeGFc;A*-jU7|ZZAL?a;w z_xLuy!NVzBpxJukVq)q;*8*tDaEie|y8`CjdSsv(ZbRD#B9I#F6Ujy3(3hZ*=ShH6 z$4Wn`x>8z^X&k%?)@Au`LlCR&sLrXdZp*`Ceu1a{Kj(cajFtu)|XyfKjUNscm|75=A|HL2YvsDO%y_a7kBWc~_*tlog z?gQc?w8NSZ@N0MtJG#kHSY{hUK`$}YG4lvPom_XZak{?CWV$xfI8>LV{Vh9Yl*T-b z+kSk40;6KvN<$!o0fEV-RdWQP5R$(w0Ygvm#Du*T?Wq&(ad&jx|wy(!4iJ0hv6^5^Spy4K5xXcTtu{WCRNzT7tenA zqN%#=GCHH4rZP!whjhkWHX|&)-rzBOhf$9`_V7|MQ9E&drZ0m=icr{ao#6vwmR6Gs z!U5y=h=o%x7c3{AE!Q1taI??L)sNhppES;$kAe`8w#u7I=Eyj3?S!w8zo|tX8hP^@ zjoT)Y)l0Lowr&)ezJl%5eqTeb*?r0=;G9<0syB8vod@0({_Sf#JMk@WPkvpX)-Q4c zeLa{SW-gidV_(Bm`gzqfZi!{Zv>rQKDIRKbw>b>j^xqHa(!@#2<&&^KF__HBblmEf z^g6$oq2>5ct%$k*Oh6IiTe4x!rITGL_SI14o_^Euw+d}^T!AZ#@8$%_yvByC7i?K$ z)1Z{q8{r9UC(b*|qI{NTmW!cU`#g(`Mh`y*Erh{{!R)oak|O%l53GI%9aN+w2b0F! zImWsx!5GzF5RH0thPpJS9o?rypk{PU&ej0edg@%jMfjD@JGP^j9um`yM%R_LAXd49 z8!(o3YtjbI5O*%^A33S7STOfJs#+hBcFm@eVQ6EGbuD83kahH`VFekICAzC9Ru-}s0A zHTAs;vmOr()qRkqfFVA>&00N{%12Kp&c$t^^GeqG`BxQk&5#M-T+!g*pj+Z~_!Gth zyp1J^1q+uTx^M|HTrncC1smQt@l?HByJcc*9fp|5(0U6sB79qIPw|r`<$M>fo;x?t zds(rkrzZ>53-+yiwvjhpD#~s=T_Ei1t4y$t?(453i=VHVAVoNyJJ*{(F2kXoAr&Q` z_jk`sde;w{N|62&3JI!?DrHUH4q5n(LOj+$O~IK~YM}JRAG3AzDZ1?VJmJmy>mt=< zIXSdTf~^?$aZ+zwEyJ>dv}OC(M@CDQEA^7+cq19MK!I&9z>yd}&`0FrV2wISc=dPt z+zJ%4dLuLY7re#~c>p+Xv1DK8{4qTwm$9PJ4(Vn4gM))Nx0-CfB>8xWPkx-be&h2? z{aTDK8k1(~WkqnC+icyxoC1*q98D=T^BP#$c1*pFy?noH&l=u;H`zkyC0{uSD$7BApkjT+5C%@eiJ0NmLkzd6-?RTKI-`|#%$L;h$ zE~uueXd5({G@J!pJziW@DuRmmmtYcqm#$YYw~=apH(Ym_uoFt`#LW(n82;oRM^uBV z&5QR!equuS+*p)fs^;Z9{~E!@TetgsNApAI24oE_i&LUO^qG@|kuOP_gqV4Y6~)?`1(8T3?)UHC-!KbmvOvybFm2R)e>~(E^>}%CY4Vz%X_}6ajn^m~ zfBg;$5dO8bS-|9!Lx}O5CQZxC&tnyqb*jZ|Yl7%v=*k>{YOmXpwR6+W0~Q0UF$iHA z8z-#>PnP=EguZ|(k|E=H8`U#l1KMHx_HSNZhKsefnICDI2KwQua6Ln~SUtc4YC0%6 z@86(z2jqw$Ws$=uo@didw;O^EHn1P4veN=d?T@5tzX$b(P^qww&*sDK(-@1$z^V0Q z9$6}OmffiS1a8roGOxDtRxs32P!cN&zBC&fVj_p{+?UuXSo!KF^%OjFz*kU7n3J#) z5(Mgb*Y07Hv680`4}9)c9RE3%>cX`g_~dobysjuFYevF5^v zMbEu?)f-mu4Mq>uv=OA)kc>uUOErOtpmPQZ?7POf0hypUMn^A{%`(%KG_c+=W#PTd z^Q%Yluene<|6${0IXSuW++bs^DIw|Yx^GyTt0&Nli41~ob-d)PDm)^IyZKuy`H^jn z$u*Zr+RWd^y(_xanfVjF4M^*F`uI?1NL5}B-gzT#35IAVpHlZ)!RMs4we<~0q{|Yl zpiCPG75>&EqMZV+u#H8IdNi#wCYF~g1&~u?ihfXqE7xR=t0G_5upV*Bv@^==fu>(LsTNm>3Xg zJ49P)6+se^DJ(^)OF;w>%z{6V+lEmn1!z2+HhLg-T$PvkkO>tK*j`Nt$bP^@8*K(N zLWVyH>6QN;2CdV(ds_0mFK-I;^x|s0FbftU}LV8t&s5F7d1pWJ1vWB>x*&|3>Y7)GQACCnR8 z7Ek&eAbg5pS|%ds{yTKv&?J)bV}`RjT^f9t8x>EJ;n|dRFMvc`DX;&OO&q#7TsAo- zSs;bRd2(IkzALZ!7=@xZz*JfrkAj9$gfMW31?BO8%T>DCdm!tdiqS{sKtcbZ;qTq_ z$Iz=k?d?6&C2nhVCK5Mm zYHs7#8v2+3zsAH+AVZCoUU$abF0;iJstj&{dgEU|;*5}bPf&$kR$uQ1^h?bi%m_*V zfs2vc3oquLADPrH@^o)Xm#r_88{lvch>DTq8c*k%wve&<&_)0JTgTAwCj+iri6m>} z^SRR%k3WHWST!(gucAC=$Kxs+JNbgA{*Kk%7b}y&%^$wmlq-Zk6&pOZ3$T| z-i0g|y*+44pxRY}*z%ZhJ16F;(V;*U$_F<@Jn|%)HL6DQ(7C}N6S$tLQC0ftK3UHC zInU`$uxvWx%p(9sOp`)UZcR-M^`ChF-2uMrjZOy=oKO|>G=1l?mrog!oc^v}98qQ> z^WMV}(Mkw6kuZKFrRl`0_V)ezBQ9(9K}Pw8A5=9f@Mpon8hn0nWKZ0q&kS*0=Xzy- zvTfhMK&7wf7j%0?bo&m7y!c=x9#`*^2wFRC19rd4QVL`0n6ZBMilfdE&v%_LYN6bK z@l@i_Eu&h;6BsKwyDZ5y!q&|DB)nAkTkrQNsEsLb@+zM{|HXb(p~%uZ19uq;S{=0X zM~AzUY2~cCZ5vNtddfTm7%b&jR|&kThG7I8Vf4y}>Zeqq({X)yolueC06}@+nK*ne zetMMKqBwc}!QCO34t7ZrRAr7hPPt*)Hd+d?e|w95bS!jalJuW4hQP{Qj&fy+D>uN& zM}6-0y?Ynj!9=_}cLcHy+7iMQf0hL>*e2H{Qi0U+icplItWLh2DHTO^H%F8GQAL8reVQI@IBP69D~cE2&$Ef49~@152&J^8q8^Q*I$}F^ zFv&UzR**njT-9w|>6PTkoQ)Z3-Lkvg7R{AVyi1@&KDrL$peV(&DPw}SqOTEr;n*F_ zqnY3a$f%Os9CU0_7<|E`{+x9J`=`oc3IKtpYire+aAZB*FY)XVG1Eztd^LlpysN_d zJTr+iGI8IEM7KQiEG#U%%Lp$JvY7k17#i`=&?7zJ5qh|LuiVOGsUhX{z?@UTYI^KK z1~Jh@HOud9Dh&Pn|`7>6`kP!v=)(E27xhEm@|#uaHUUTD{xjHs+ILF1u@WSO&!(I*pmy%26X1{%J60=LwUpdU%~biq67-c(y~k z4YtbP4aiIDls_`UcI76qdSoRB= zjL4*aO&ciPqA@+!nU9 z>|G)QP}Mfz@~8?7fl;rypc*0`^(YUQj+50!3(vc;`Fn{g73x{!H%^0kyHgGn$EQMv zGB3ubD!S@Rw)ts^^nEdv4)fW5LWjF&-d)41qKATXd=bVRJuL&j1_s>C|$rM ztWN};ij6H_&+9}Xa*SJ7J@nfeEJPBXOP%(Vx6KtyVpI1u5%+$K&*eWOp0L3+dw_=l zk2>MfC(?G?-T~FQR&?}Wm_LH9R;f49i<=&FzCWqvGy2x|p9jSVufi1-$YkaR(U;O5 zJlM>i4EMpaVPA1soHe$iSYfr30`!cUCPaqe&$RYNW^jcLg*{(pT?Zr zhvL&Ektt#YQ|t~c$W_|c0%+r4awpS68XRq&|4$!n+~&?Y zs6ucv{kjGFr-W!AuA-Nh7|=jWHEqBg?((kwQR+pm@%^`9Hr;%=hrXO`G^)jPzeN_x zh6`L-lc7$jVlvVVdXee^B`euZOL*c9)Ir%n|S~f}L6EvKzK;LWWH*^{E$YI!=qLId@kp+yKM7EAnG| zUe6`+P1u_eR%@E!Cso@`aM(K?)*a7wyPU;4y!BT^s~LNOBDp5eH0>j)SFaXIilgh( z5&U|FF#8NDH$UnHZ)I7UX_(;q4?$D8W-~Y)C5BS>3Vyg!KlzUc?jP2}jS$+GB2dPxT`J7%DszVLS{y}Scv=73}u z{!?cgR9@Gw4R$%S&r_<+3U2}}Iv3fEcr4|FesBK=W^B57jQ(@7t2pM-XKe{v|K~$N zbhTvtC*HG-tKld6STTmpT8o|MRt8ahUiV))XVO%~+WhhT8?JxwrY^;srA?4l>vfT& z)yq_OZ~9}|`m6qJ9>$nxBd^`7AU^^EVC{%Fyq%Ni;qPK6*DONSh25tO(KR~A+Fd3Q zCy@Eau!TDQRsT%tJFuc*t-rF+iprPEHP_bFrPiSLsBo{BcHqvV&u6jD89n3d)Ft6U zt4gn_6aDC16D`fnhf1ZQR$S_bLg-;o_{SM?V>~R8p+^uSa})>>RO2qJ24eR+7qIKy z6xncExUHh1!a~j+$xR)9>XI+ki=Vc@Y4C(1m&}efFE1ih`(pomQa=#U3tjOT_Q?oE z5wRS<&_o~(8OX$57!#WgbShwf7Ibv$*UIkwyP{3c)F6!PgC*$8{0v-Ie&=_p{m{F2 zwQuu~62$awy8ht`efiBnyFsyO_caAg5CbVlBD_2GT!|1aJAI1qlkjC+X45lMBc6+D zG5Zao)_fil&g&nVcWIDo1myhDP=~!;YQ8TZtF%5K4mV4N;~H{o6TE#LQ5Wa%)p$5e zUhzcEQ*pK`KM6z@Y-4hOp|MnF{KS!>g0hp@Zs5#P!LzlXaNVfB#ifXb)cf-JbH`!m z5mgKannV;}+WZ*3vy>t69zj?e62m?rAj47@{q$b7K#A5~>A(lYYI?zMH1gQ>q7R9a zYTj+7jcN<@gGq?dp^!5U(Wd-sV!##U))wLK6=ANy4Ag%kCEAA={fa>w&1T%+^KwS0JQS3OjLImwhfI#z`?HU4o# z&BxW8%Jnwt@Efnws#6T%n8oF5{XeOU*g49?)0^mi35@V2MPCn(XL+veXjgGXKk_I7 zM;x4?N^oLSy4hg-buC9&cj0*v_?AJ?Qpog%l|~&|(k`O4*7=eu|HBrVMaZeo%y|4)oUFZ41g z6YHK0uupzI<7lpwa*g-~Y_&VpCpv!$P2Q{yM$;U|e_-cv1b? z;>r#x*jinR@HxYki5>SiPisCgo<2rPx1>UBL6P6?%MQ3uXXka1tFlpFGn=8%;FkML z6G7Sx7O}dqaZHB1JGymmz5@JC{M4wy*0U)l{Vgi?SPD&2LEyg0BPqqO4NB_j9z#87 z4n&JwlXpI;Ln9*wYipEkBGaQ9g9AwB@*1*o8=bj*o-1swrwCed)6qNbZ8@z882Q2G z>SuLzA+Oh5zCr-G8eI1aQl6HrL)wzl(|0fK%RNfjjx83}Sp6?Vq7v)Wa=_3Ln!}v}qs4(RNmA=Xn^**J zIZ~&h@0&-uyT_nEZ@iTo+9aO$I$bzqwYLcK^4<>dhmDOnjTG#=liwQkDUn9)4RW6O zL|w6^48qx8EI&ge3i~h34RW4*UYs~@nr3|M-6iN~K(ln!psnLpJ4U&K7R97fLv29u zKw6Kg1=FJNgwiurfzU(6EvVJ$$9+p=yKEOD%P&2T`er?!)?-fK(f@O-b%i~rv(DT& znz+ND;JwWB;>3Y1&yGy`2VHZuGcYh9ula}h{xyGvy6Pd6q2;k=MGXK*XYVf9NkeO= zA_Zz=a_5M>R!`6&ndiOAA-zV}M%&WW)woKj>|_nv{Xzuk>SaTT^yMaXMMWkL*w_=! z`g=vxmbkbAnPNJMEyMWB*w$a2$vY2!yc6|pcZTll1ffB-EG&t*=$yCdnIjyfI=Q*1 zR;M+;L@ys5DLy&+HZe#3}>2jSgS50Na7Xy)-F?1i~m?i^vw(J0PwIuwySTxD{h zSZgK<&#$JS;4rK(={k=`nhj3Q-A={-s7s7BCq4m6V9!={d;9okd7)>og^f++)Z(zz`T?SGy|zBJo*ca@yde`(k7^3D;1c4HpHiD0HWw|s}ThC&%| zy{}0{HQ1bqWUL%_dWzu7CW?Gl33R>c4Zt3UkK)H+w8nzBT7BJSNi&XFXO5dr7JI+2 zG-vCt7TI8TQLyud5V{IMe?n|8gv}E_rY{-78_r+uP(J0DuqGE+ zS%vv;SFRJ=`qHh3@e3>E9S!wPOC1(b>%1Tc6kg>@1)|d8x~?_1A|0ouuUY)+el&z4 zS6@G3A}|E7`Cs}7e}jX7!Jas3;)>WB{~YP9VBq$OXIM0RWhaF1&DA9w>a0n6%vqE; z|FiGYlz7-!9HXf z00~=R=G^*!W}=oQ2;mabB}Cs?&A=*R;m#$7-k${G-2OOrF}^ejxjc0(O-{W+1+EA$ zrVD%Tn@-j>zU7H#VbiVR!32 zknxNoo}1}c@?gnDJ$>e}UlgO34y>8!6vwU-U?GY9vpY0s54g&&gMyScV>&Q#o$v6M zuc!3y&pp-LwRxR-Irpx;fTS_uB}@W1OrES}@+lJ!k$vPKlGgK}h|NfLS5PL%R>K>B zJ_T12hhpj_kINf!p5D`wq-sS_vX#yl5PmufXsNu^Z$o@ zWh4e9=_W85-mhtEZ~*rt^6<4T@J+(Cm|Ups_eE|FJQn7g)KPSqkat+8j!mtO*2{zT zCx0lXCFibS%?)ZzC@CYV5UCu#-QS){qRY?~5^36!Uaw{vV zFUVnbL}qM)TVrxX2{Lz^2U3{kE`KIVR~buwd3j$NG6O^oBJk#n=0c1~P1LtE)A#(b4?yH^)D|&GX zTaZboZK8Z)>)b~nY7{tzQ~XE(3x+1sMYBWB+h>&z?-n-K42h)RV%b3 z{n19Lxl6J$I)CE?HOioaT&K7<@otyTTeP+bPN){TNR((=+QP@lsSNRxgGj8H{-mx? z4uYD6-aAZ84SDC2@p5a4&>m@5EkEwH{E6 z0^RG|S8kxAHT?GNZ}S{=urG!hNlvTdz))%X&5^3=-66B#Y#M#ye;%X88=j@8zPW~>wuRS2I*tIk+qA^MV7&~=f|@sB!W zeZlHmfWV)!BWz}j={sPX_VwqUFB~Vg_WprybY!m5dwlvyjE2XL#c;JR5QcF--Rttk zmsoG;opFr_Jpvfv-YS;R*&|x!$}MQ=9@sX?^;qhiP3fVk$B!SEKHyJ~HR8E!J*A?m zdiKlk6byhTBDL}eRQBK~G~5wbbA9^(WM%dEJxn(W%42VXwi9PGYy)ZRq0ZGdC)2d>4swuzjud29bxI|H-5`bXPZOl zK=kbSYDIe+0$uUCizAl3%j*%8-&b7wC2w!JjssUZ?(*aKB>g9CsPCn|-~z^Z5>X*` zVi!=ls0OP_JtI!LxKk-`c9eyd9(4RLLb!LwC4Qc>0BrwBE#gy2G#Ea*g7W1ht(`NhsQs*#1Wahe_N-(oQMe`gXS zjfB_9-K`K$?EK64_3KwGxkjxB2-eeyE;|Uf_OZ;N(-f{OHLFOALDBY0B{(TQepZkaPdGUF)g#>YTP(R|s@f4!OM~+TuFT zDuf04)VUVJO$zeln#S%){|LT7p{CC6EbUc|rP2I-eb5TbPG~OjsW?&^bE*WjLJ=-dh(lbP889dTK&`ojRYEd6wX2NK&pLj-PO8C$a54 z=|{GOU9gWpuGsZkhQ90!wE}u3_btAI<${f;9;vw5r2qISH*P-uvb2I%ArTaT%djgk z&cI9bc%T;iYcKjV(Kj;U{lHv4<;(nS{~qTqy*H! zmpgL?*pGgX9wN}$SF=)xxLE z88Ej|Q)shaxBUXNsc^G|rrAcS0*opYV$4>Z zXE4&HxVgBVL2=&heMo7l7mAc*bTw%*b@kRjM#}=hf5+cFiFqvE(5Ur*Ky!`u1z+D) zd%}v-r`OzY{)D08!r>pCVUuMyVl_j01E#Oix1`Uu{P6Pek%u<(A4ogy#-2|D21=KU zVisp}$(P1J>e6v?O}uqKd(0^w-2*r>>2m+acy*eE0pA^vdId5M(k0%1Os@lS2EK3l z+qdQ0#NB3sKgl(WR?{tKfkyQ;E&FqaMmy<`#ucd4ThA2{&VBtuZ#u5v;`Qo+d1~Xu z{?d3&T3nkk_azR9q&&tIJsf|XL9Q7A@`!pYDpOlSG&uV;gkEEQF8hM&A)~&u;Msv* zQpTac1|3R!!B4P!wbY?J>E8Uq4ziD=tY9(?KkqYEoR4l5ypt>bq2iI$pNMqad6~`2 z9U4{g&#&YAKEpf{h*LYzt_51$`y-CSJ9ft4nl%`f^yNDovS6(>=ot@n3}rsM&mXul z{0YDySJP7ECybR6+sa;0UW5kaZNuu7px6FDri`_0*`KAQW?&x8h1`A%{F`EX3XZ=7 zoJAj?aBE(TGQe9b%+HS&&{Q2RjxR|OzAQr{5Nnk@mT2wb=@+En!@CaH{e5L4?>>kh zc=P7Ri?Qi@@_eaxjT4-3+*1IpU@;)D(3+cH!EV&<{O% z9!&)CmHMZ*aOCKa1)LA~&%RaNb zZNIxWa0H(+&F{!+_om<#^`ed91K0u>4<vix*xw6xphFKXqV)$#O3lqce7!&XwQQ%s8#J3|#x*unm((hU7wcw*eL-9#U_b?12A`nJ zh%bNZSkWak2-<5n4^gQr^l#t39Y_CzTLiTa+aLh$RcfP&z5VLvJKs<<);e(^%~E0A zH~V|&(6;S0;A2mt-iJV>aDNKd zJauW+_HM*nM~vmZ%L@bM_FzLl#qQ^77LK3Zjc?(+o;|Es{N%}#Dfd+L&}4R+&7fkj ziA-wGGqff|%dKpD6MB7-^6)|Yc%g~|w)u>OaQ@o}XPcWbro54XW?$ujti2F&E-*YK zWa%<>X(;P$AbEMA> zFj}#ct|M-|w7S|_i$UZ_mN>psP*G4Y^j$-3p0$Fj{?4fM{T}O`&H>OP{4h|#0-eS* z0=s}Rvf>IAoKoIjYUb9!B23=~iW6~;jEpo&<@(=g5-tX!~=pt_IBCVt!uUxALBEIy~D2`1x1-*M;A?oyu4V?W%{m_X_{RD33h( z$fCRJ4_7(N5^uuUe5u$m{lKp1_J62FBu(VNW_dj1|W|q9M0{f}X7j13dU;FjzN+S>-_W~tLobFA+aSHPe~GlQBcxn=?- zWjjauob#Oo2aD|^Y$%h|CF|aw1YaNr)L(`2NMSjefJ<>hc>b>pHp9I`Q`WN;HC(q( zpA2y(fGMagHwQM$xkVasshfspV0rbt6r#$RNe{-w4u@_>J9B<~9CPN9N)^ z?6kzrkt3z12hWO~v7p;Porkfj^f9SvD{K(_n#=#c}UX^e0Ns05lJC{~>n(rO3f|ScXf|mBrvR7XT^Vja~ zHg*H8J@-3kCzZoam~V-H{di=YEq zK6DTp5<8x$yhfseV8~#ESG8Xr|21L|L0+?SNT1MP?y6;|bX|mZp6WB67k!|i+D3|} z8~Ggg3NH_jj%0m_eDxs;g#bag~N#cc(EwP-%zBEb9ux-#%3Zx0uv%LRZEYvI8=^m=e`7vmE`WA9@s z2l1u}^WoTX;6OEXTErD~e!n3Ke{pzRR5W|ISv}|7QV>dx1>@ZZz-oK@F%u>bDSmvk zXU80uVm>QFa@qkPLWlKO(OSPZeFsY%C!m$r7~D-QYGZ~gijU2<3Y{8MG#Q$L4c zF?F~R?{piT)LNFcuk1@J1KEI0uWXtNY60Y{cCY7v&tAv2vXyg9*ccc@PyU>MFZ4D% z*oWuoob*3mP?nB^ZR5@ij^pojSw@0a86ARldy~#qwp-j2kDN-ccK;utQ1s~5tH4^3 z;(4{kr}T0yx9pmHiBQh}2k(Rb$}mt|yzoB6zU&pOn@-v3c>-IA>*1(CLAN&Gp*Vqw z>aNIFe(ie^a2Dd$AA-B-EPzesi8SB!Hefj|Sg*x80-(jOB$h1NrI8}k`Di0hII`PL z2e1w_E(PkG?CcMINKr(s-?ScpnG^QL%udZt<- zt_>PjgvA2rIn^q#@z%&)hMbS2f}0eJb8>Rp*I?q(iDXBBYm}KbGlbI;L?JG9-_}uRmz+{W@ zc0yFJyi3s4;v*DC=tq{oe;-qi%Dxp0NkSKr2Onn{kLR6+?5PjUECzxpl1fI{d+|vzJ!v zuzqSD_f^v|iI$RyK~h}b!k>FzxZq-fs2C0oKsn3O@P}5&$+nVGTL8VuH8Pc|9AiJJbP##1LK*UFmkJHYA6iqy%!6VH|AW z6zJUr(wDGOjFROZWP9NO**g=V1yIAKHN+;WMr6YSx$7?#3a&)%#ypdT;?@tOr+4nM zJi4{uc?S#r2b1@%z$JHTpbm;s#{6TQ!)v|8H6iMjj|ROUi|Fi(hBt7G-52?eU`_`E z)2CJOi{*D}6@bl6SI-2nnq`RZp5tuVKqpO)-O0?{vl55iCI|dSR*K=|l|`T4KFiM! zdFYsK4I9w}f@SynAvd5&fvm`hfj%%L_<-SyJ3pl#LNTv0Qzq-q&5?J|dI}tvPq4}0 z@hUc5cYt^YI3av*xiDgnq`oM{ly}4XdyMG&pf2}!5*-Y#R+RS^eXy-slxhi zIg(_X0aSL@{Jjn%sYDyy5$Ts~iBWJvjBP?MEl2Maf2*bZU36NB??4dJTA1Wf{20X6 zH+R)T?&bGv5Fe-AfDayYg5rGAPy6627QA1nR|`gA<5hZEhEm#l^_-8ASrJoYMum-ioI3cBcu>DRtdO2hIPMLfx@zl5azoLNKhr1GCfiGan$|d3-4=_ zBsMr#K}2YenzuGKN#@Tt>#CtA4m}ehEf;q)WzW>?r>Yg66~aN zk5iHecA-&oSM>j+5=X?BjVT{-#zG2rlDb^^$oMA>4O-z}m{B2h+U5{nHL}N_`RU7U zOoe8%KR9?nWPSdDIpBJf1 zCcVdgK_5qL_lQfEUSstaR(C+sj5ulktR^{0WOkiQzri1CY#3oSd48Yf<+&trTgmBj z67MCZ6CiXb$a-m$5sy$=_sq9%XDCeN>_CAS*r;N0et!NxRg(|7SQXtsx}o7NV-T@! zKX>teDsD%&9&Uhj7HgAWX}T{lDe3!=cuIUZgV?REv|>oPL0CCMF-a@Kzaw-_W>$31 z%+Bs9TMOZNeSCS7VGX1aG3=E-Pjqgir_x8fQvvqs@c)Q0d{|g0C&2ci(fjJlF90qmdL%#qNY z`hN(KLoY}7PJieq)z{!wb0S$#W|ZrBJ}&OGw-=eV!yb5}o+HEN^#-C!z5=H>2)u=? zm}f!2V}BF1bN@J+8%>K*Q*EHLDTtnPh?YkN7sL3*8fgYLY#4PUR@VnC1Y@ue9K<`taeyj6~Rb5zdp)tvVm{TXk2H#{6txqxCuM<$zJw7D-^0MI_8$k6N}C z4?9gMRkATBRJebtbo}(d3~QfI;q@tfxBeetf|i%Lyh07^KL4(I1Nj=4Ut;lx%h2|N zMUke-))tGiCpSZ4ItXAK`CHY6Cg4T82Xk;>a!arN80QpEjR{?#+Kcg*Yv9@a_8PdEM7@kqo`Nj&w? z3muDN8?5z2ln!>CR-Dlo8xvN#mUi=`h00Md-I!bemnpLQEJMDSHgPaM6X#D4p`LZD zu3_LB#`pp)ATwI6n94Nco|(iS`So_d%yJa;M@Xv6eU)JaPE4fiC(K}~M!UUo_X0r+ z@|=qtRShYK(&m<$ayBQQ$zj0j4*)Ry=Ur`aF`b2J8)O?p=ehlKDgnLGr~zF~kK;6DN}1Zf|w3#(8{s;@^}x+3?#@ot3x%&E;@xm2{&} zy_I-a>+_u$F53>d4ZhtPEBmnf_$JSS>k2tB7X|UgW~QdD!R|er2kIR()KN;3N!h;G zx$R7&I9pWLD4@WVx^Z9nr8{U7+<@MXhiIddgvi=Qj0u>mFWi{x`MM4Auw{1;lBd#( z?*$AhC~ZlcFCo@mo3q1KZBg1GB>=xvvz$WZkZ0Bm9sNmCmIu?Fx(DL|Op%+HmzTWf zx6ut)(Wx=udFj-6`1q^<)Fg{7yb)B-2rnfLL9WP!><`6B))XbycIgG* z-M>#^&Gl-{jTs`ixO?;4u&dSW3ys3ZI1D$QUJZlnv3;8VyR9}THvqz|jyHPqVDN;# z*RQi7KkT)Np$;@z)!)8r>BPs1s;bpf;2Vb&{@kqn_xrCSRXf-*dP?qO!HM*xXT(mJ z4sN!GTvMh0C+qG-4$O@m!I&9KEX|-+f(F6t@SK%z+h@&J4F?kms`~F9u9(*G_cy*X zO(aH(pBXvztB0_1kr>7L1gyoGev?x!jX+NG*Vy=k?9qcFz`OEI+Tic^=@@7(bU{$lRvML3yPpBLpA~DOhT$!6x_bOdDG?{WY_^>5@NGLbxVdS_P>xWcLlC}lD7${% zB2p;)_s0>K$I&i5G!1zB{j;R^_KxRsc_M_7tImbmU+^or#aP;@rnzD`F~42|)_a^b zY8Y8;H$__YgJ!$UU{P5(z6Uuby2;j|N$89H8?WjmJ9@&rIYFK$a4RO{&LfYzuGGhX zR;B-Y`QTi8r&d9`L!o~MoFB3)vY)@?FMx;I-8{YlW2g*3eIG$y_~ePpg6(4|E>#uk zm`@KaI7-B)C9o-anpPBs_(h?YIN=m{|2rg>Z3;r!zb4{lA@O5&*2k^`W{=?j5z=Ng z^`vjw>z_~xqMxhiUYg5VwebdT>hmdg(GjOL|&ZoOF^B zu&~8dNWwGy&#nCDSSzLPZ`&m@^9fWXZuZj6c*yeHwZu*oXu4i`HnMy7&s|vU6 zKaSMeuFY!XwCoijTTJ#ibV`0~Myc6lNnPTUc<+3d9kVFa#!_HgPjp}3ko;fax_h^3 zYir5safRa+o(O_d*sg2zDx@yut)HM06PM?`M7~%NS}5-s?aB+H8H}D(LK|;uj|v#; z^*nvM{==NKICn07GD9qj;>@s(*nB>ricfqq29Mc=?l1yuRW2^SG#wYfap~-j}UvG%z(C0MMVxv=N@2 z@DmhvNmUE_`N@b7EUUzlZK6S||0r|gj_Fp+r^meOOP=Ph#?lxDuRK=s1CGc|@4`ll zzdw*0(lWv#AsaU#og4%J6z_rDp0(i&rMpT%+F8ntAxG2%`b{NG?)nd+2~U^!*6B!t zI=CsNI8xz#gE{}UQkpdA1kbF2g2ai0gDom%1a-QB}=kl^nj6-YUT*C9IRBNDU!NF z>~SAXaZ}%xI$Hv0!*RlB{u%Kifj=^Bk`&?aI~F4n(W;1Fkj9SfaXYC`p-F_lGF=x6*+lum@ARCTlb!`pidg~hlIFAjm@`5vhino_jMdSBfdvcTE}XB9#NeII+uD*K6jD?aSI68{ ztVTQ;Ua4vjx>rIVNq-Q%_?~jXPH{-geqK>=*u!Ka=I3^hjfWSCt&;N3EazJYiRD^R zOt6s4auyr0clsE%d_dbn#f)Nu)uvDz@2wh8q{U1HrF3E02(DD%x%l#}$GAEIusDnYSC0T@CB=7Xmi<`CUGAKX_f)*FoDXSWI2Ma^(urBe~X) zQ2Urr#DDUHFOP0k$ro14;wBBe>Eo51h5lg{6dtU0LWP;}7>lB&xE$o^e;M2T%RS`p zqHlkr%3cf>*e{Re=1#`%v6UUUzfR}P)i1d@4PQx(>hU>)nzR*PU={ZD7_eZXGI8Yj z;~9uC#N<6D$wWP}x1K@**$yr6j(uDcHKv5qyB}ikq5las)fz7ExA^A&fS9EpHP=0p z5Rgjjow7NkPnf2Z=tx5^ViJIbU<=!VL^S*Yz!HE{5&S1x{%dGxSiac9g^_}SE(4ZG zm>K;Ono$$KCA;bYe*Id~&5Ac3>hBMTgj2B%2w#na7OxMO>+sx{!^uC?B$nSuG4!!j zpVAw9rFKiLZ?}pJqW1zb4{uC^aCl_RpQpH4;DO;D8A)Jtrr-M9-|1dHd=@YbSYM}B zzj_G2)zzi3uwXi%x$FSP!CMf>3cd0agHZxAj+%}OE%f`9gNqyUNawy+Adan-o68LQ zH4G*jCi@-|zYE3RH7*4CIBtOb3!+J?(`%&3U3@KJIQtOdvm1GQ_1#Qj5 zd8=qy`tqs&XDYVQ1br3Ac4@f7@6`pQK$5PObdS^r&G9phOLEN)2^C&f(hJ}s8fume zUnqveKy>}Zf7y+&?Ss4Op*v~ZbM(-IRBHIsuWq}}BDA9(-i}okPEf#|HdUIUs?emt zV4vt{0q&K)89}_SpbYX+Ea5=v-@?rTA$o>|3;0vXv}@$i8JuDGA9IW0@8yyJM}$(#XDL-?dpHG`7f+ z(AXzill^-gJRaY{t4fC*Q6=SO7OY80+aEk~BhN~q_3c95|QvU!0 z?SKK(r&T&~<}J^FBNUTedxNiSJ(1h|kE_9n^wEd#33-o>X<&Z(i+p-oUB_x#9);58t>@{|A%2Mrh{Il)q=FhDSS0OK*6Jx%EfS{HuBhJvz zq^cJR2`?RoJd{gOuwmTNVAxiq9)-ZWmMCi>STY2_6w9GHrq_$j$9Dp}VR+EI2x<6(D;z=300p!w^op70tElhhQydXZZ*#*_2^M)+H zSKDG;ONmrd1RxH1Qh%Mk^fQ znMk>p=k4vgGYqV@=&NOBKC^e?pMal@c!jMAX^_T0zcgt*h+(vXyxIWbSUVDWwt{D@#;kO4%5qcY9pnIU zx<*Dus?5D2x^hsX*9X)J?ht~4`(gnF*PfV4qnJ7eJ4XX60@(o{GX#6^yOg1uTQTHZ z&e)NNd5=VQVpiWCdZ@Vl3AnsR5Ws=-4y0_^b@}{(zbdcI?Bm%3EpY&m2Iz>%kOj~c zn52GX9c**-P8uuX3Bq>$aH&u}(;p~5$Uln$mfiEcBk|TKLg&(FSidS}KioV#zz9XN z?ceJ#hc20D8r88Y_{!EQ!7&)x3D>@P+g&^I(GT39a<2ZNCNM#jb&}KxSsMLteZgXg z89m{9aijE4NaRauy{Ew+3JPV&Q%&W!oLwG`>@|VmC+!hOZw%aTIY-vmKjZ=|pQJqk zuMGmXP}rXWY{6(3$DnJ2K>RMV6|}j;!CJRXuo3Me?ZnzpvXy6wkP0;dR4Oo?3H%W@ zx)4N*kHDl^}#k`$>1{TnhiQ z>rW-2oyq5a537A6Ar`G3@}~kr&;b033HvDs{hHLHQ>UiyFG~10TAk-;Z(k|n8m7MR zLCkkQq~uZjq%?ab}y!IOMzdH1%Bp9&><0t=E|`c zvl^&K9seS{k98ZlKUmI!3J_qY(vlMQ9hr2~u~gqE7g6e3KU}AYMrha|8|sqZDr}4> zJj%TXkgBU%VkOir9v^U#nvSR(kE0Q$D}d*B13WS=#(|flmKSnnF|@{z>Ek-VKns2g zI!E?xl4r1~^fi~R@@iV~VWwxkJz#nvU}rmiv>c*Qx!467;ibH&7W<`b05b@-8;lar z8?*2Y^dRY7(-t4Vqd%59cglnSd%x#9+TI_ za0_<-D^IbipKq@<9IfoBPE|ZNJyl#mq_R}dpI{xt=UCQS0Of)%l(_I}#w9_v!TVR4 z^N4N0?4xR^(|DLmIDQHSb`YDeuR=AKKhT%|35{@67_^PYLJjmLTZL+>=i+D8=U0E* zUH~+M7)Y~&fOC9oD@E4&I?}g!mtsQ004suexNp6_X!GH3B5ekogfKA}4pbyl5 z2Qo6adMz10ZN0j4%!?w2-Zg~afLEzW&nix``1H&CAG`_ zI&lTxGG|)-6Y5oOKfxBB<%JF|$@nnoA8~0p^MvHvt(-g)i~UdrzZw00w=q9EWJ9x8 z+cwwQ4jScNmPRSEU*6elkxqkaImoO|7jo79e9MrCOVwSC7rZcxw&SZJmIlBz(S}K< z2Uk;*@uTyDVPA4-s)C^JrzUUVTYO@{$Av+z4if1KewFEj8a#s)4S=?}&TmlkT=Hm= zZdxEgi;EIp`4+$Fj&obR+t|@so&~ARg_kH8Ox74nnpngkhGQ0$Kc3m20&u!w$iBCK zqE$U)ixnNP2%cZ^xwK*1_M%!gFopMB<3Ruqk390MO9Fc_tVI3x}T z-J(^BX}UT{sjgLdaKsz(R-C=JVyFs%iV$RK!QzfKRl7sKMLQ@QPZs=(0B|5@UlG2|#u!!Pd@5eY}E*%1251sn>20f-r@!K=bIE4t;P~zOVXWMvw03&(dt?04p>%Y5 zZpOL>5Sef?z6xOqTBI?=F|tURJt{8n-iC!rcpvz|h!E)B8jBRig`}~vd+bv@Sh^2I!^KYH8FIf?RSwoFk04(G~ z#i02W@FDm)GxR4TV?2R~6;A?7QXQpu42@W1N3HbdTTbhT69hNnN-2B)(9u3~#3Fn# zg*Zq%TCKYNz&KLmBh8pC2&u17^UtMKU-vxZ);YlFU|6NUKjuDK0EI>$kSc%-M1iF0 zt~Mmm1qqY;m%;cakUsbKSII)2gx_coA32;wgXa6MCe!EN#13$0h>}f(CvM^vcsPYK z)OD+gcE~G6*)-d4zeA9k)D4lHE*B$Cnx#)w&NoT03j zKKjWFcwl-cu22XuMiGWd_dhtVNe9Jaaq_oNN9`?M;hi7~(xBOoNxA^0e}Y2<&m;`tgNfSYct3s8X-`{EoCz*3cJVZ>a>oUEx!W}&ZI_d> zfhWfsH8hMMF*ShA&_TX7yt_hKr=V=!p?ojyrc~Fl&?Jq*QpVq5R(9I#>!~s9>F$07 z(PT7i2%)cprmM3cM{A63P3^{nFSaW&nL~cA_SHsL(n2xd2BJS1CSZ~{?oyP79`45Q zI|Dg)9p&Ux%~)#9Y+cx(BxSuGHPAd+Fr(vBQ~0V^uj;YQ(mi$u=rEoTsag6JKXNu| z^QS@X1riwx#9A)j`lJ!Z6OB7Qk^q3vo#nT^d_2d=XQ~xqrPWn#WFRWCs2YBBE};91iS3R8(Dtdv+5o!XE8KccM^6LRDrJ({O}hqe#!=G+kxwe1?JNC zZjt5#4H^q^&_m&v&c{>8gX;> zQ)?|)^367vZs-Up1e4h!1YC(q3(~Ns{ALj7o;ToQnu%yw|3*o7axB}f&_`bdG*+@u z(p!|=rkWTDlv0D?*rv1u7qTbCa$|u%@Bo-MIOK9KiS%0VvL1%t7s{@$Lriq0wVVMB zOV@r*IfzLrLXBM;L_S6JeVc(it@3&dPH5bu&x4z#Zw zyjjP-7+1RI+_bk>>QSU|^Dz3g!we=+20LTA;{=agx<<)t7(Uttyo~)|)3#CvYbWZ$ zyaBgHK?|rn0Mbz4?eNgL0$MXE83C39QbEpnM7&t}C=z=8g{SRe?iA`HuRw?8Svi_4 z8burq8J*M@Je^Ggg7OiR%kij0V=&jCN?G0wT4~PSU71L0n67YNn`@{ogMi?pJdD*o zKtsxg+K4@GTjV<3NJ!>d`$nHEgxSt=hvDt5*13rKUcEb^iQ=u`K7HY%tT*hvq6Mu% z?*{#0f}(-&u*;+8!|`XwM}aPeKuN9)iT&jfgR*ss&kthKP%?NMV?*`dX@K~J?R1Hf$&d7qO*B6Kf!8aJnBeMqbKUjeEusv7K zcu}0r02-~zzyJPE72FW36r^E$G`zkX^GG35pbMm3IAmV)Eg=<=2R_bLh~)1oXV}Ci z}WMomoXwy9z}S@5m}JQ9j$nt0r_AE=n~#MyYnqzPbhUz81So@bXN%b zbR@X&LSjBr^S;#&vcjh4II84XUw|9xfyK>-6AL_LH~pSJf9_{%z8mvMaP-haWN|ir zBx!tliYl@ob;eKmL8j*}3#|MdsU3oi(mnQ|I>2D5;17I-lE?7< zNwbU}ZkVH^_*|3+jFWb}f?rM3EHmZ=$6rQ3v~-;(L2M!>-aakUk0tv8X?>FGqn9p8 z1$VYn;Z%3hMpy1LtU1=s(kZ21cw$H;6S#O3a{;elHef)h4!d|Cu7*)t9#F2;Zk<$C zKtJI~Ft1R*DS6`tLs3Yogwsc=ErePtiRbam61bg z^Y0wt5uexzTL|Q(ErZbyaIF*H;zyKF!jq)CK8?p-CId0%6Js;Gs+hP<^Y09kBzI<$|6CNPZvF0HXb4!_{}fg{f$Pqlby_+D4FN8NqamT9689Ej8X6!re+G9nCsMzWi~E{W0Bj zaMdfT>t^+^Im+>+m>QHae(YV@6BHbD^@A({mf0l<1dGd-@5CX*dMs*E5y1IO3>o=? zZN?8d9H2YtZC# z@19mQ-d>P{f+ei@LPu6}Af!2!^V(`8B}kM6(H~TF4gm5IA~##7^7?oill4w;CuV*> zB*V_&x@a5DXs9e!Dv@$?@WL*rO1SvI`Vg%#dV3K7vADn+X-6Fl<8+LnZfpw6zyX+W z2=A42cXfI8dcPX738%q$3NP@NXDqWoAD=igQfW7SQ|>uZfs9_7_};vocCue@1Rg7H0ra( zQfs;MKL=L#mfVBtE8{=eQ&Ak^*eta*o;#d%6-J~dNVmTz%$Z<4PzbQWqCuC?$#R`5 zb#!nPY_Sw+varXrU{5dPKvMRZ?Q11v)ixEV=dB%=Ro0blp%m+pG-x+r=_Og|W^_Jz zfk)1&)*k*#b(R$eO({@bR3Jj6K;Ju0ivCI*qVQ$zxX+*;1E3)KUIWQFkl1| zsDpQkO&w$4J!U%I0ZK7w2}$RN3YO&Of}rFgD&Ww&?2CU7u+StEjhYgQBhSN~3xTWP zxN~hCPO6CpR4ythJutW&0Eu;YToW*=LL6fJ;puktVYH98Z^zW_&eBHjAnt_q+a^O3 z9p+E@f8T@4EY%Paaqe4XFi9i;kFZqGVvMZ;CIU`3M*~ClYXr+?^GEp0ko#}G6P7=Q z-hS|V=e6_Wj2J6_RNi2Y*u4|J4mmMU5k**>?UDKr$(F5A4sbs*8AP*I!GDg^Lk9qQ zvs5Z{$dT2^=Fe{`=yUGJyT}23XgJeWxOWeb4G)}#0~MWRNGF1*dgxfV!3xke2JKS{ z+DB3T?mPIdP7%R=J?{bUF!_??%g?PjBrVVnDpgdyy@l?uj1=X;&j%s3PdTDD0qR>| zwlC69_3!;MqO=fQkg)&fSilI&{EcJNKt@Hgpu{tAtFrXc1cJ3Ig`-0tyG8JZ zI4Xu2ZK+e3;1c_2c0UP#g7$aX67jR;Pe8M$C9g0);1A3-fq1@BG9FAm9p;PL2-bBk zdK>u1DdVp1dM5kZw=^|KyR(5U7FWUwcEgz=gkJUiDvoP6fXE<=KG0fvt5-sWW#i=B zpjga%%pn3TWRCZ?mbasmgqi*ehe)#58yvBvQEbvk>rmB@5pWF)hmdf=*Xs^IhMc3F z)^Qj`#35Ld8gO&=Zru&oE{8u9d=ecR#KSt=$Gj!Y&hVmDl4F9AO;v69&8Bv_^IpUL zhbLXyxbV{j0sw=!mM;IH4!_9+85zHw1GI{B3xnE)6((<;d$wby>+yayF0=S#{6pvt z`f8wcYbp@OJsq#4h`JdXJnJ&9OqdT)21?O?7yG5kkpAzh?nvPWE=L$mk}y~o8qZiN zRMkLTS0;FPc=V*d_2Wg@VdY$sc=ZsKf*30&9p;c9K5m$?`!o>m36=W(xSi#aBK)E+ z|DHhv&1i#k&ulgMffXE^^gG|-82r8Tu!?G?!d1!if8RWnzdzmzIV zV8PAPS`y0n10j!6c;1o6b7Pt825qYSb7_(;K>oZ}T2cgV9$xriB~duuT*9`#a+fsd2X~-i2jRe2HN~|RE{|ausXyYR&#Vmgqasvx z5u3$oWnmHV2!@X2tVz-;mhTiNxRnu0)ovoL!Ne${8xo_wl0ytxz1#W}af~_T#pQR# z<=fOt+P3OT5W9eT_dg}>N)sF}<};xIX84zPMm6)%=nMj;#|p!s2yg(oy7g}eS7UB&W}3-|830yIm9%N*NiUGBpLDe;BIMyR^R;|Z+QfS4Tv=#cCHGHN-M;u zIZ(?OGtb;GcOmPXmSOc?z_91RMFx(-dH}w*gh~j~?y79n%ZNg-8RLmhsJ?FFjQ;xR zG}*yK1@+9M?`<~KbziO+HL|B|MCU!4WIzDZuX3~vL{p=x(>Qu|%&&U)Vfdrye5dsy z!vM`0XkE3OO)N$CFWPt)kNVvm9tjXQSOIG5yc9p)=vVuu?rR~7gdLLJ#m&OFA!Kpa zl9NuE#&HxD5$E=hsD$O@n=nU?_HmC)A)&2V;vky#0XX{#$Vl{(KdPN}4xmD;4yN`X z;~GDPf3LqW%~Sw#^A4ExK9=iWcjp>y61w&ytr3gP)e^UtcH!it+wi8ODISL}+amR zBYT;9=8931m)&?540%VJbZLmg#g9tBckpVhm-v413{tu%A1;(yunBPi+p*Uoj+V*bGZ#x zFu%iTdf%Oxs7Db;>tuw;W#;RC(vCxIBc)8TwmHQ9bqk0k^&hJxf12d_-nUfU7U?>0 zERmr~7Pk(efK+OSqa_hm>$LGLii?3b(TD#XA zOvK|=)U%M>PP&Xv4FJFWveua_XGkIw6rOcna-Vj^_?Ue4YN z3msr^;rxN;d!Rv|^Xg1#KrWmVEQ!H(RGwg_MFLZyhL;7%xc&s;eisq`cM?5RH*YPIuV1^Qz`wKVxl1G8c;>jX{qOPA2nJ;R=O z(X&N9kB1~ZQghgpyg_o-g-es`x7GlN(AM(Mf36GOsuCzsA#OQ>K?0eo4v2_}BPszE z*0P|kt@7*tk-CHUU%OFD4w3bS4Em^K`V%Gh@p1b?cPLU5`G)G5PH;7=J zVLig-j@AKQ_cuMlyJxsO>rTz1$pz^KjfK1N=*X}*65AhnQmw2L_0Ks9wjCn8);axl zIp|KPs)nh+#6_e#@7QiJZqALPrG-rqD3ug=;}@Tc|2 z`PpQIF~&88D5>t1M|>uC)TNwQ^Oqzzp{&O#avmPr6lox%v889AkM>rG0G;8VnY+aa zEE>=>#82IeD!);sqRSiBe;qsHgnOH)u`(ok2lnwJ;lLEp+3c;yf1r6QDX;wa$a9*g z$n(|9?LrfBla|}3=C*m)3SoWHF+*^iBG6M&82=V~Wjd(v<<|J+;$!~z>Z!kuT5XD-)lsLxaCgD>;TKh);c6s* z@+@s$$>F@xT8LO6MdwLeAd~EZbW~xApe*!{vxklj^zJ>d;Ab?llk*Z9P z;q;VZ|NMLF5aaAl_-j>%A3D6XivIkI@YZI_7Osy1JNn-j^U*C+35*u@KPv2>gR|I& z*FJN{E3ls3vUA7U@QHsGB7~NTRJnZgb>6RUMyG6PQn<~O6R?8Jum)j2sZ#q6|6YB0 zfd`jDt=(KlR|*s|pz*l3Rn$A7v7DGo{E5pg*UuY4h!47#fZ)Io&aE`pt~Ix_pzrS= znV=C)BFX^^G)OFr`a_pcmV8VSVYXr_ck76)TMWk*Y%u}uwJ?H7`1{53mE|#$p4H;*zw1hv;K?!g(N4*4TQq(W0Rv{u%m$M?klu z&HgyibnK8D(E2TQ!zs-Vyw=-)R~YrS2H=9X3Y!o;Fac(a}>SAiQyMYTmKTk^dhWQp8*qN6(DI{Z#1SPT$wf)vZD_k_2(L+Y{KLmdOQWAC#zt7 z&KqvSM1?D?PiU(`XL!y^b9_(b;Axqy69Z-0$}=e1NvN5E%yKT+T4Gmum|1C!Ss;{b zF&p2^SyLe&I@0zD5Fg8c(5wWeLyiRX)S9#nhh01q_P{wfm=JVW%;IR0DB&+Cy4&QP z7;l%`Jrm})HnIzEQ3(<4O`*sp*V(DLF<~5H2>|Cc)$yYbA|ORAI>C^P52l0KV2l-S zq>1%YBjGCQSIA>M1=k33X(!~^6C)R&!Rc}UUAHKg2i)bq1HskH`D^7Nl-@c3fJ!o8 zR-6?M1W;QIYemCOai5$QT4}K+KUg9l@BQmyvWC@Wt28;DTs7oyuWz&Z;J@Tup^B{5OeQQisOM+Xs$x9yd!l{1zW)7?+KNZBWda2ty zwnt5da-Tu;cQJM2I1WlhONngA7snm^=K+*xN@Bt`;r$ATIO`)U7OJWZ7Cl~gy!PHp zJW}NT-;iilC5^yP0+Ls!n<2>fiVujEbR(%RYO#CHmv6+!yUaY*v<<}qNJF8@b%GRl zpZggECBZ>|PE_(TPTa`TZ|F_Dhf= zw_s0F7niC6IDHB+1g0}cDYiEj#X%F_fpezOH}%SOTF(T%*94f(90bmZSIFzS_x(M_ z@F{?{*9pYVx(OFZDJJ5h16DulcwCkf%?Pk8Ti*R`h?S;O7g`XUesD7f8&d(U>=NP_O$1DIBv$S~$$o;*lkdEPA=@6TbFFk0-OTpEzmkUugty2)f|Jv7H5w3lnlmj!dF3Epm|iH)mvi4c2;K zz5Yw!fs>srVF=|Ux~+C?Dat`-j*d&?kW=J%E%SV9nvtKcr!*Zb5OHSYn!P#sh55$y{EF zPbTn8&~}%zz5ucH3)=GORJJyR9O?0euJjuQjapwyp?RrM?Lq=&4}j2qgex&hyLP;~ zsJu*>rq)oa$1|XhmK9`P0-!Icr^>kePQX0Z06&3PBr(i)@g@1F-`ZT7|Lj8_8PBkV ziYx2ux=oNv_4R2#NAFMw;5AhML;2Yy1Pz0n`qT~A|6JKRH91-0Gje3;+feiIB5+DG zA%<`YVhK+lFv;J&S+G&MIGL5#9jPr}eig6oZOP=;a4J(`sOeJcP?bxWx^)Hqp!b^9O3h zOF4g^jA*poo;~mWGxq@&w;}tG>=1KG8Akh(@uxB7-i6OXm5pA0b(|_X_3=}Qdadi% zQ;a_)Dp&#pCfPptF|~>;_sX-!(y!XiqTtI?8yH`hz~+gx#9UzI3&<6RCWV94XFt~G zV{1=+5;_DSFO2?usA5n@AQPA&m0RUmkH!6383HGLT`)}43G!4ZAb4@2L&-=w>13;v z5-j1HPfeCGnj>ZQ&7PkJCk%7BFtO0vywNN?Sn8ouM_F>U$iaYr{Ka^UcV#{ON$1Prpe1UqkL9P%(b zy^-yfQKD;KZ0wwNbDy>2`3npx_Bx%%%Dm5=+s>f8UwP+wH3=7AKY&w8L|#Q&t{#~8 zl0Uj|w?!I)0d4+goA_K5sPWyJLArj|`&r*f+=Ke_;ev*v9RPNeklO=}sCCORT330f zTuk51z;F`%3WEueUFy`k!@<|_4$9-zJhpXP1Zuy!86;=sc%SY{Ea!A@;QC}*e}1=b zLdEbckH)_O^!>nH_v!d7*_R9HI~H7nN^^G~x$yOC(WY~U8e9&+3tTxH{^J{V2S3OhJQV*22J-eF2$+g@6=uLf(8-|A6E1Ds@ z2Fw7G$RohxC$!>SL-mm#637^5xDf;@YzS8&_-fKDv8`vhM{ClS#F}MxWvMmo)vF)Z zY+B~f)0V(#Pq=Vzdv=I1fZ^Tn&rX%DfK~4rH#W9?6>^Dfe5vDjH=7n!U|b-&Gwr_d z5>9%A$NZpPaT9rAZ)4}(aAS5Gx0qx75o|Vw%CX0yiku`?N5{sNv0ZI3*K*d+>{W^s zuUA*s7`jmjRN#@@qbb7uB+v*_i*#<+vpvU9m`iK(w& z+W<1H71WR2CUFH0+iQESxZCu~{n-b`)h;(Vvdrx5e_u{1G_CdZxtx7;xBnT4o4!EL z0JKRPlJF;eFGOIo-Xn&T+$sCgyM)TlecY~JI zcSvvA^|lv#57mGA_|f$Fq%#dB|D|c!?cu#QS6??FMBqGK&^^V0F1Y=W8*WWSZUyaq zu48WQqZjxHjeH*a9wIpyck9TtxKcyl=@H3bXTlU2R9vqU)ZhJz;lfvA`=QgXHWD{~ z|L9YJ*3lc{A0|N$IcP4|fs1_4KwtkZG&kfhJaXk&Ue78;a`3K=7yBdBPj$t!u&}%+ zsh>pTeW9VZU*e=Vs?o!t3ti_A;{nskD^OsxDYp0BHi97zmjCoAYMAZa>Otze;T4?J zuf25J%HLS!_bv(N6gQ|umIRBZ-XurD)^b&iIC8cascM=+#Mizkw;@aZYAaCmO`ZbQXf%SwDl57IzZ@vmrcV z4*fRWCJ%Z)=OA7ego4Eruici#vwNE?%MHyf~z<_zZLEO=b!D2=zRb4Y3r}MG1lroM~P89k_uGH z2_5}@i>!Lsb*VQcm*_cATEBl^ijvW@blEv}vzvQxn^8sh`wl00E~+ie{nu$+ZD7Re zvDG|syb~>SUk$Sy&tyx=+)@1ZEa;mGF6~$J?dm27v=~v~(W(Jg?B4O^|C%{P`f>G> zR_m8YCy`$l^JkQCht*eJbJL^6A^*OT@Kd`_TFvm<#Ss03-ypHTt}1s=LmRr44R&wle$1EL>M*mXHMhDIMab-?*E!Y zf{M)7J;s%4&qOCgKJZ!k2nkr~zEInu%KP_J?YmrK=!Cd&ovnh;RK^xk^g-; z+_mF0&FPMYS#F3ZE`Qw#`GuTP5|%`9BmcgV4o;2p>;#63Y@*GB|sBJ%3N zsu-a;iHH9^+G}yAsForESvuw+#Irm;2|sL9FHR(l{MSL_wh|FQ3r+F~{jaYp1YqU< z*Ebk*mRf=6YGNJDk8~&nUV6)Eo6rmqIftJE!%)boR$A#$)WE7v#&~?jP zMfGS!1cl8e#@1^eCcF_Eu(^Ev__5@g7Z?`PH)Nk4MSu18>sa-g@8%fTY%}6E_0vx$ z3IG=IvT1RTacsKvfiIm}eSEsWY6k}s+_zf7V3J&}KtMPlbcj;h&$`f~HunIGunstX z&ByU1)X4ZP;k{Oi`xq#YcHBge)8~K00gg@l%KKdK>eqQYMli&(Q6b!lV_Jgy_hBJd z9I&VNa|;RCYo1`mGGP?c-X8d$<);|e(aVL2Ert%Id?+&rbZ)St~(%m#h07_b)KB0~N%Z|z$C z{{Cm#Y;4s(MvS5?L3Ns8y9N$78GZTO+1a^x$$UNKF z+d^pKliI*45}%Tiayx+OfL)J%_g2Dj>r4d06ZKWsa^%kHV&PPoAx%cMo#{FazrAac zkzWPfzSncs+gVSxxebWe9hGPoj7Tit=B6yO1+|VE;y$MaWbv4fR?I3C`;d|pevrwV z{2Yv8LPA1jiTU)dp8u&|1@Ier_i z6eshsZ-#+EId?b&Oq4b`{I9B)Wo2bD<_~t5a{s!Xt#(J5Z~soZJ2}O%s?GIrxHnd} zy++)D`FnHrOGNU^YhJs~|2sWa0pI5C3Ksd41XZhsa+Is`Hau|r@aWxe5H=?`3J+~Y zwY55Le}DhP|s#buXUrPGf4Ff~NU(qFeY+g`RKVKcZ_t2Nw@Hnc| zp~Hs*Ouyb6qO`eikcrHpyV%-UVve0c+>t020VgQT`I`72LW9)m9AC&IXP>jgZZj&? zDv1nA)C(7Ni!LsEI{{9mhGzngTn(01C#`9QvJGgQVD)aGP_@t0ubtLix_a*18!EU! z>z26PblVP_*tdoBj+xufa6v7zY*tlORkw5e0FU|c2|-+?22$*P+tG2B6Y=ecAm5+8 z2CxJAhv$>;;AoE<(5ta?F$TcQ8ywk57h`OHSiO&Zpn=t;h#1JoCA{yQX{AdGDXuqX zV2DB`v)QQgh=>UbbM(j1iMler8sp{6O(SxFd9bL2qkVpZ8bO54r%{Wqh)!p(x~lE6 zcL*hB{v(eWCF{N8C$(~lP5L&7!tm4x-K#IeZS9&rwRc^J%)@$`-KbF3&1+nZoaSu z^WS^V(XbpsRKOwPKSr!hNL|8d@t=a0(j19xRDYuRaf1=_9v@LTZsiKMS9IANxE@@E zi3ok}6It#IHMb`w*`f?lF;Kzq&`HX*bUF zl^Q~581a;3-Yp_3A~Fy@S+EUZhHb@DZIdG>tm_s=?BV$o7-b2~QGS|y;>l!YX69gF z42Zq4DmPYJmWx;J+Y#a@A|}?>Q|Upu2kzTyeVk2B@sQC#+gEebzS0OvcCm)+QSDO# z_Rdlq8%f#Ox6Ifd?M+Wg`u6^|)S4|sKG+WJ*S?$_Y_B5JWi&ADW%;-#LPifeEy zLU1EY`VLc`->-S4@r-|>l6lep6sSoU(+$b3%|>W_0`7>_`^Wn$ZLeSFvd@w0W<7ZE z0Bd@;wnVzU09e@gG;ac<7E!R?J=(;p}jZC+nBqiNNOEHmA0C#_tVhJ_(`M^=b>JMe;P& zAa>{1yy*2#Q~N}I0fF)hxK>R%Y*u=DBe;`u<;Ryr>*E5U57^!WX!LziVs&+WW3E2# z`tc8&6}gpu74?COlY4d<)2o?gHi~WV>f=^S-Of!pBCk!yU5be#SfA+obARpqKhHAj zxuCG{w26U%8xd^$f!;@=8`BlD2FIl_b088FbOzMV(;jj7YL(-|&%ArU#L%!LV=feg z=y98tB9*SZ^4zn+PifDFy1XKmf4&2OW=B+azlt8A*9H2ANNn|f0mswz&_3^Rv3q`r z*k&I={MB*h-FvThpCf7<+gJ9{6tAt>HIqBFA^Oy3-FNenP0M|?0+QQ+dJ1JY&HwrQlYW`yWx=#@#}zKn~d>WwY)!ot2uujtweExwPH9Rs2BpPUQr@Pd%^2ZUxjwZ7Q$BiMXQBS{D5Cr zxPJl?rC*y&E0c?xx5&mBUz5>|(Uy~K z(+QE03n@e{-ty)i(B!`%=93eg0Zl=zPOgLCebd}6w}g@r{J z;7XW!g!^ueHb(e>&QZb1w3=3yf?ILbt|t~KW4hm$h@h&5gRwTV0{4hmK{0M~m|Te> zzI}V%3FyS=`(9Y#)21pUiNpHsG!jn%p-lW3H=l=@&a2D9s1 z)ZRk__lGE4PQjkMrf2FebMDzeap-qMCF76L(W zS2sN_AgSwCK2_mo-}MB8fZL#49~XeV#`n2Ole9f|D%UCV-iTC>Mg_O-TG&)YQ|kfx zA`st6eo`Ew5zM98_S-BW9s|A@VZcS@DNKQXq)4gg#DeFzO5QA%zXM;uANs$zKk zT3=2zUftGx3U^p}F!9*L4D&C!3vSxS)xeAPjd@!Wu??)m3_TN*3`m&RZ>%kQQL3p$ zzUy8PV4DO$21y_-K4opqdx?Iq}r5+kkxq}ln87&!$SoLwQe)*Ppq zSKluWX~PbbjjB@)%0fSW`s8qh33Hb9Kt6$a($V?0kz)3sG;yS`z^;Q=ZgXwn8Sqfa zul-a4izUNvb3h@6}jbBJ8>ywQ|@y+NM(SaA#+h42$CXya7-n0!X(V&*U zKfXa;ujS=sdQaIGEPcKds(g=|U&jmaV8BLDpqASc2@Qw+($L*U0TZ^E zqd{7gv>2CZisR|-+ij!i)b;7{>7vh$Le&-&HppnMV098<4+`5mm=Mcyzzy?3%xm`D zXodN6|J2%Q!9NimH^~$t?vh>noQG4;E|@r2u*znWyJyD(y_7MpQVDDp8Nvt%bAi`7MxdgNl7<($t!@>hF62V>qbulx^$dVu-S^o!tHYg zm_?4*Jlg)?O%LgW_cURCVZm>7?rutt#zmlKsx5aR`*!pLs3yv8HBc$9Ecdx4<_bqc zIgS(vK0oE7sc z8(^~e3jVrYPI1^x{00H*V*!AT2cSvH#8y>9*t^=Mmb%3{Y;)uah{VyH`WZs^9S$-M zrx3zyk2ROR`}14C6~7);q-Zv>^V^S5@gJ|PPW-mgv{VWfXR2?#^yOi#zM-Lo0cfh{ zDIJQBeoNe)uD&u@T4v}j^nv#mN8I-snk2p7&6XP}FtI`zC9tAN0KS4B}@@2Y<%R7sO@Qtg`kqmOL{Y8MXN- zDc?14J(9DMta}V)LJQAFu$=;Hf+vFDPh_>x3KS5%C9tdx?zR)VP0B9gYD8KS?6_uA zdn30wRy-%fAVi)HTSR0o_AN5d{P86!8`YoFr-`rz1Q7wcW_ z@iG7M*IjtnpTsH8%`_@SG!If}tO9-x;sIT)e76(W=a!&;BSmQ?k_g}+MWf5k%DPR! zXCnNW$@eF1HK6Ho*l8>nR8!S>229cj z?2DlrtJOqUv3K1LHt+6(l^aFmQVU#9_DvX(dU>eLudnzO!bS5tEaXbMAYWYhU}?Ui#5P`(odI z%Le!(0s0Bv6c=9yYD)%Ot)5uf0*(w+c_C92;X%eiQ!)xf<#QV*`b#Gt0)VcF%fW3` z2V>`E*WIDZ8qJoS5&KR~^hV(0*y*tm0DFFLvDz28)vs~nw-qNQngt8i@LRdxZ3wH0 z(1Q@w;TmKdG1%Ze?{hlnkv3tqRWOF@`S~gkxPd73#9uWLU-a+tf(>-Jes}GV0`e=F z>WM(kzt$73iD6Rrl8W?(g-&9cO^-p|QqlauTxe6e)DZ2% ziAl-5vp#mep3urrwEY|y9?>^c(Cm5z!vB{lJQpFPfw4zXQtr9HE4-#=JFX+X-`fY>xkk-zvN}?j}laVMp_9pa;>@l^Q~lp9{D9Y!^(lI zm_P>Qpf8!GP{%FAU6E>e4uTLb8>TO(nc{D_8mM5hw87 z6(NZ+^3xR9Hj7ASR(}56z00C{i*M4>0`wjTSh$AEmSuWgq+Wh92>|dqZ*s9GY@Q_C z4_C!{DnqEavH%kwjF$L$uD#*2Yihy5N!;r|LF%@9)d@ouyqk4z5PJBNi*--!x%28K z)W&|z2*4I!4hsvjg}Tlmg@Ds;-)2239Cm2cM0|KQkp2yvq?Dk)>yrwLAVECR!_Tx^ zCZlvP;I)r5Xzli>iJx`e6RB9`ade0_j|5*;C6?g=D)Lscl36yN(|$f;^*tVV%R4BB z&>G<20;E>EYsxOZ5L}{z8Sa%rXRYzvr}#r^k7tq7j|Yogs5TbJB*J<*56;Zs zZNF*lGl*?~a^|2?$^a1)9lP_j?nwKhjhc48^ zi?vH%SZ>0+%)9CWkL(&xo3Tz|^Xn_=Ae)Grh~C(X?{w4AxcPh!G=L?quC5k)d(Mv~ zL6_esgf-B0f8YRTfxg9+k*mWORv9p)>Dy9!!ndm-q)iCp?rrhm8VA)yUQP4KeYbDRwL(*3XCPt;Ft41CKfF zb+EOsp&f9p41Jc(VUdhNUs4FjkiFc(Aa(8d<-pItQb`AXLDr!1F?a~cdiE6s=X+qB zj|dbKEEb_fGZu||K~`*ZeQj#}SNbzBFami)%h&3AB3?_k_OMHw`9^Gl^SuN}p=?c` zg;l`#9F00y_kveaGE(P_s6ZSt$t9OkB4&m?BR&n&k{ChQ8=k+`b zrS5u-hK9`)4YodJ=P)PS*){G3I?M@4Nl$}%p=NJ1VfhJ7LRQ&|Gceke7=_u!6|I&y*&7$){1Ilw;nBm*Yf(=_woJX z{dvjCv0W=JEqAbhK!ubW+UMVvNAVQc*{4p2Fl$0+%N^e&s-sqz7#k>~K}J19PIoenM!**kt7jnr6N z1Or}MU^Tg|0SIoaZt9j`btfuQ^KMVyh;?cdcM#qW(-suL0JMUtpfkm`X!NtJj;V0KIb=%n4y=OQHRMr46Q-Drb&=axsWSbDn;Vbsk*l@8EcwEjdHy zHPCbMFktD|l7R`SJVPP&7>tBIteH!dv<1DM+x-ig`|L_bxh8--*6^eG8tPu=CEkxU zD9l^-zhmgvCgSAEe=Jh_zu&?|0co8}DXML9Z9l{ViE8-ozBha^PeGS;8G_ez?4GBI zQ1N`i`QemP`*Uz5gTei)3N5#ALNzfN5AqH^yM6zxlfj~Jt%Ke3IZGS|RK*@E73{fx zA>}<*zDau*IS#-VBB(+}LqYH-#DK)-dsrR`f&d(xDC4Q~BdmKxuO60Dn)ezIS+wEg zdM%^R(%yX-;FaG4_!ek#+LrYLe<&?}jKZXDO$d^~&BCWmIvOnInMoFOG(LAepLqNB z&e|uZkG1Z&o{kkqx+6+MHAQ!6!Nj68g-^Pttq6%z8bvnW8`GjEtRE!`BKxEditDxX zwTj%rd}IXDVOxtuhpzO`sx1!lsDIa`3fJ8H`1I(WF>oh+X2fxFR!BO2sv!Wf!!cAk z=E(%y-Q@gw4WP=WLm_ztQgo#>bc~;Kr}>Lf=ss?H|5#~lPsK&tyvvK5+cIDx&TEnn z3d~uSL@H6mGvzjs8(wO#}&Qgt`Ju z`pp6Ky@EBD>^mmIU{g~Z4cr3y#l)eJzEz)0OG|aFiQxFaI4shxoTgAIR3k+wB?%ht z*t$6d@xOm2rv_vw3yS2S4i?idcHDq`3U5`rLZ3l98Kuue|FCQ_^z?`#K>6xerLpGM zwTF;3mL8~?S~8hVYV~B`rH@fouL`~D>Yw&HkoUv0HbXWz;2nZ<;aN+P<=L$W&y|-j}M^BId$5wf9gAVMC2sUZR5L{QxVLkhTB zd*9lEC>lxH%2)_N4!l;(-NiWyrp>;6U1x4v{ohyEUY)h=PW<>7O%h>)WqR%-tM2CpTKbzyua#V zqm-eX5x0{-vpEy@7?<`Wo*(8h77wl-srdb(0IT8 zehpK4JfwD38{p}*GRyGSrO|}rVXF;VM)g0UrGwDhq&TPZA zNCHVax8uRZSJ#SD7tVPO4h*c8q@`ISi3Z0t8G@OGhx{R0JDSQr5F~i-MsIE3c8u8lf=DekEPK`X z)Q_{h!LcAKk%(iV1p8Emp24-40)gzD=q!xT5{a&NfG+S6NEMo{`#!FZ5f?UTQSh|e z`~LLwzQK797l>`F03`;O{sJAW0lRIa3!kO5+;ZgAHF>npTAv14=iEDvwQDdJTaAaY z1r2imoEp8yz;fDc4bU_wc*!GYKrnhGNf=dNDCX4N2jz+MBu;hR*Cm4ny6FUR59I3o zV;(^CGn0ixB{&_gvRSJ?NuGtrz_@K&Ts?2Ru>}OR3#%36_aB!r;OU_f#$SKCD(W)JINb*G* z@2g=??(wOOhxi1?pF-A34JJHpf85TBAGb7x;foF~fEI@IBhD;kqsh^rB<9!y?P&xK zn<(cYC!FT0$`1zPE9%#;kMw|>T;!aexh)mn1RKS?|13}r!ui-(kg6eJ>F3$K< zg&$|xQ^di+WEoj-os?)jH@5`F`ysn)M4bCjWHBusx)1$nuE{Bt!bv6nrgfe5xTcIpTD4Ks{ZzaMg#hyG3NmOR7vr65?%+U@r&5kLz= z7=0Xqm%RD;2yJy(*8Wz*Bm_!3WT!yB4wqiL8FP+{la)?(;fpEwA{X!FO6sJ-c=0db zXMcK;mQ#F?edRJ&W@eIq(i>2dyf8cL7U#(qJFlq{RsLxzE!30(DNsZqw=u58 z0hV(X6mRu~Yrpg{&B{Xo-8~Je>gwtfcg#vMq0JyYAGIN5o}on=gkMBRzwRT}$21Lb zO;CQu1DPbMblMCo-xFE9r{XmoJ-z6tR6=u-GcXC>sBkK2^)QTW!N#5h*)iX1J^5LS z3M&NAL@kdVX`l% zfftt^z4&0{{eBh2FKgiX+am-`yS&OTNyRN05nwC`8A5{ZaWYesqO3K@D@J}LkC1n` z;C%1&^(3xHD5LWYR#J$jN|8cxbuakIXxafW=g6yvhY|945Z(wtr_2-x89bAGe1Aq;Yr@(c18DM<0L8jvc_<$P| z;CrlC)&E3~gw}3LQ%d1`BQhGHpjQewRwhgaKz$Pm`LmEGwTUa5Da&qCfy2nyQv4T= zs$gRjUJCAqVBh;vi($}NhS2dkc;8D2{ZQhG z2cQ1L%Gc7tVS1=7c1P)xb4RjY^otcq2G1tBKa`~)F zRe9!hpYajY!c^6WTv1-;gj0BZ9UUF_$V7KR%`Kc2P<}kTd+X*L*>t6slOZjlgaWGE z*xI3;_cIl$e{RAd1q+1{-}lx!uqf)uz}~!%_#{v4ARIQW?*aH|Y6WO{2ST$CY~Q*7 zAxqO0%a-R*N(uvKYm_w2_!;LC&bfVm4x%MzI2g&k6Z3-!>TO!+O_UhV$P;QYf(Zi9 z&y{h=P=58u7ql2N0WHk7htZC~?_;3e9xqbX1l<+nf!kd-z~i>UE$#YB8i|TxK@(8a zW`I?32Jy&osQRg`uhCop7)tr^rAIDd{B*P9y@pd1H3I{7?H8e;t;y5=?@Z8D)0J-( zib~?x6KPt944j`qSx>hw84^QBwkx3hjt*Y?V!RF`5XR83)zDL9O(xqGy%^5&)YiBp zdg|P0XtqqVQqmfY%54)J7Ir|J+_ne!GZJM(-@ihaNa>oJgR*jPX4z@!zQ0o>3c0kn zwN&n3iVwQ<*dE100NrUe?&u0tmcRk4q!qGt*7teP$=(LSC0VAy;#?K?R4!Obz0jyd zV+z-;V0tTzToi7IB&7&iSRdK@MV4uIZ^p-lc3_4j`4D{*1&8Et%^Z(XJf-3mH{Ypx zjaaal0`GURsAH{LSMqFfQxQ09FH2qJ?UHAReX?8#-xty3mD@O37q;OhfF4A{U%b#3 zAwMiAyyATMD&F>SnN1bvQaK=l)o8g?>u?fl`_#F(!1Y{xCIuU-r>o0CJS_J4GB|5{AfzQE zj&NjYD|m<$291}l&rxY6ruC-KeUKJ%re?LyAx5Mof+3?oQV*|k?cL*$IH(=w2v@#h z9j%ADx1W~S>d$ut9`n}FLWKv%>_M9+yG#_2YrIL~RxMcQFv;&6>}+Z70}avyNOG^h z&;VR9NCb>RDdze<%dULDqd&BZ7)rd#0c<4Opw_0ofBGg2v4nYa`rU;9dNf1`UKF;d zf0M;3WcCQMRH+~qk(1^Mm$>@j4{fn-u9Z{%T^>E0rOXjGb>6;di0KpMsRch8Tua!-y<0gjC|-*H_@TGbco)MJ3h+NsAYok|ZK*`|>I{r9EF!ux7y zEop5d^y_@>OGh zY|AvX^r zamP=XJd^S2=-PpBorx1sM*;;opyT4;^A|5fX=jc+J%^1PbQh^;8?;Afb?%>?ouxH! zf-Sm1#>t#b_C>Ou3f(z(gse-=K1NO#Ony5&i}vK|vs&e9v=F1lfr)t=ud3P{A@}5< z!J)`IJRY_lz+Evh?YqhXRfhB(g_|aB5NN(N5jQu76M^gH34K0m#4l%Ip)`SYF|UcZ zfqPhE(?!-Tv%f2oG66ig7bmOLvPTXt@iJpvkJKbC`XPs^>k?M}VwXB{la^-Yl(z%xZ^&N@5| zJRmDpvdZ{d@3vt+>lAPv&gmEfupynF<5txs7D-o|Zl8%T6dA3sdOtSZHPguiSe$+| zI)ayE8sjmR>fi#N%fA1SdOB~cg5{I-$Fxn(FTadlS^r)-sgpV0xD&V>P%*a-6qi$@ z9lBT(!3qqFi2$762>_2?CMR1wN+c@m6mb(Ut>4wr#qsp>-3~~=rtk#X!$KoZ3Rc>j z5X)tS&yNM#8uWfS`uOU_Nnr@wSxZd#n-X zfS59Wt%EXj{M0fYJm|p*+yWjpAdLvr>_+Bd5~H@3JqQ#O&M3H2nn_i=J8`Zo?D_NZ zR}todkb7t<Ek$(<^Ayv;JCjN9k~$2*7Rnkh^)4f5?pL zZux>0&}>X_SX`h4j8tR6#Hyc5It5d!LQney>Y8Lh^*tzXTv5BF0sI#bl_Ku+HV# z^^~sIf>wpyTfxMC_No2VG+EYP@c9CuVj`WEeU;OT2l3VtwTtA~W&KC%o6bR~KO--p z2_e@msK2kWibUNx#3-u4a6DM#|O2VI|Ak+CGocf?*sJexNzlQjfELMtf8lli!cmy+q>FCoyVWlZ-3P;p-$w(!ppQCys1JSS z@=y$7wJ%piM`&MN@c_`&1z0x)-2#`>vdRE{kg$t~qQ^O~ZJCBhFT^0lrO>Ni{K0`c z_tv+!+ss31Umv}=uOVFDlD4umHL%blYM0#QS_1kZE?_4|fs$u)%}7=C6-rB)YgJJh zo$g9Y9aMs@$L*s5_e|S6xQIKI@@*3a0ySzo-jBIFYTpk~mv)-U zTeTmK{)h$?JoH=kAa)Sl2>&`c-Fv2`=F1^oEN-4EaK zvzRJ}vtUj3sN}P~5*&*A==cD6ekkwp0B_>mXU>-fXdN&)YBI@KfQif_D@z1E z!GNZVUyNG#h<)qn07B3ugaJE~mGfEgT@68$kPj89VXoA9ZLgMwM%g(>}iVI-f|)Ujp&fCJ;sta52+ zCNOq`_*2QnR~3qsPH$NyP|Og9`^3($N+5Gkvy{!W16SWLISas2lJjn|zEhC0^nBa4 ztdU#>!z}GB+jf73M(;VuHb#J+gIkhY!e>>4w+M3X12#G2IEc1h+#BV27q_o>=xS_z zK`UtgLID8ZgzGs8=MCazyxU+pm_=>(b7<98gbosdZ_r_BUDmVjz3Gmn+F1mmRF)Nu z-uGnyT?5pCMVUxIzjB~(D@7%OUhi}EEa~DMTQDCJoj+6q76~pP_IibQ>Y5Fk!~4G- zDA1lc&qYn7I#4CFQwm9U3#!(sT{shQ^-&2;iV-kqY38CV?dNUBV_G zP#B04_IZ9Z$gf&l*+*jm_FotyQ|O>T#e8_b}z`6X6MIzc@^VO!|dP!tSg(hg)kCL?ky{Cj!I-o zsVoj8A)X!fo@*|4MTr(LK}H{b#89@e(gs6f=4v6?{hC;+2WMww6y*c(!` zJ%+-TTt2stOG@eireUJ*osg2~b|$rQ5@Hi>sCMO7FF>qyiNkwNwc7`CVN!S>bBATB9JF!qafrj8v22pbbz4X#F=lB0U z9nR55?X2tTeE@29mAgB2`@q=14u~E1YWH>T&SOs%j@vaY>o*B)5zR;(kSer3G<)D} z-z0h8tNywZKapxJx9{NR!_YA#T^q=p7tLa5ly$bfG7NVe3XcX{C!(Yc5fYG zrdUmVy5D$knARIXNB_*ZBLYC-f9!xS0x%#Tas5(28A@sXp3iVlG6ULOH(}K3rxxKx zPr4CXAplWZPqK$h47HN}qT*=%AKa?6El}&~IL@4fLSm0oll07TOVP@N-=;15WR&!; zU3&>i;5loleL!=8S$F*3g6=O^mk->-qA&FThGc=sy9X=WpYeEn!Ho|)d%R{F940~} z#@-|b&qJNB&_0{_dGPpTivm9+=MdCdkG3S`c0hmbC=APO*3>pQK%RuUpt4va$Wh^| z{5I_|gePlu?`(fw94cLKGc8I`dqnKTJDNl|*}<7p7D%e(486i769T z&3W2VAGLnq@`b8h+wbxmxqDZBdb8&0PR-M}q1`WQcBIVMoIfxv@lj~t~w(_XyN?pUnyJ{_(DfU{K~7J#4Yk+f}hr*qv@~e|ECHZ!THXww1Wp>*>^j;~s=E za^2Uj#-DQQQPDRvZlu`017OV30!5@J>$+Y&?xu3b(sU)3*ZL}C1@x>7x_aErG{dhj zaPZg7ym=hcMguD#&hn`ryhJ z4hpZEi|vh#jXzwva2-%NVg*mYI_o!Hi}O0+zM|cy1HPBsyLZoMa%yTFr^*;F?|7T? zc?~-(1B6&QQI;T)pv(Ooph4DjP;NS)a8^ZnZK?kdoyE1h&Q)Ds-}O5^+|nqj}VYu-u%OiUSi~B`PaYrzf3Nb_0cBT zU{F^lY+OgM(?c0~ja_z0v2age{kdrkQ>R0GV^Gm|N`o61mm!>rM~mzFE9oxN{Plsj zH_b98=+wLz2<*inwBzuR&hi@Mt?jvNnie;oVL6!nj-CRa(mS7t+GK_-*SYuHGJ^cK zt9Q**OnKW!JHWKKPk{aw^(^l?XmjXO6X55u_vj^f0H?fu#pZ+{voOu&1r`XX7ZzYI z*#`HxkPY0MpBO$ziGy@(x6U;J0y4L_XfHejj;MZrd~rhniGh`g>5Cofi#vC0WzV@U zeS0{(+~m9FI$SwnYhPDQ$Fceo@7^gBu_;2AY*&@s;)$Hs!i3FG+)cYNV50s@@R-Jl#IoL3~iMR{9{w>NMt>t5c4x7_AK& z<=$*w&{GYW$5GK*x)tkl;z~L(>gUcqk{;+94XyMMnl-8gu^t$YqQEsz8oMGrrYa6> zC~kvy@*LDJwYlqSRF$z9fW9Qr;h`DCzjJO+e=nc%o`OYqh`97YkZ82YSX;1l@wl*U z@)V&by-Yj)P3KbY($9yoF{p%;+N}3#KSvWVGTg|zj;byVDfrhb~G zMhm^s2XL1uylY(vJX&X>8}hJcYlO~@8IV`9ZyN^M8o5cso!vB<7##XabUqXEgCFQUj+y#+JfxnuP9;KH zK&`=`=Y{ao22t?YGN^7U_Zc53BQCeRs61n7&xOK_;$Qu?6iTj9;T;sh_Oma%b{_Ui zYp9`pRE!$+#4nCbwsTvbtrP_bZUhol>o&rXD;{mH4~PBwLs+rI`4reh<-ayjq2Pt< z!=THhxbz?a*1hkxZQHtvj!P9~W!b+|>>y<(@zoI(h068EYOuaK;e$H3%)^3n-5wQ{ z@1pOM{IiYEW*C$$R9oaNrzP;vE6jYtW{r%Ec{t{Eda1&V7rLld5|maT^zA3ZUAME* z4IGWHp}T5b;Uc@7=| zwbMWn(MPiaHkUS4;T5hb$U$eS8GHm#?cO}t2>O5%m&|wQ&F00^_`tMy2Ft9Buz{St z_(XmySA}keGjQVvL7=A&H5<0Uec*PMKVFeRM9WRya%_)P?e*XEa(_L#NFskNl8fEx zD)lyA_Ao#h3puDNDlRqvDx%H+X_tB}mh~wK<9GdYnD3A558%yQYWx(&t1>bQ4ee3+Y?V>4p>FpMPf)g201nAgrCH!06BxDQA-7`0m$us_H~ z%wTKR=^f3G25+Q%bC=tBPT&}+m%%i(@WAfPP5|MlfDh8fx~q+UW`M$>*8miweZ`06 zE<}4&tbIw~F*FJvWJRPro*!k{Lr*`M2TLoy$;I|ZdDo=d z7Uuh?__AU&`qPrh~6 zIUe*N)9Z3qYZV3k(e?mNh@-fLm-ZRA{JLNmQ!5iSu!NoJhJ<(pBpqu(e=;_7KndrH z-_xU(-fox;5LI+q+JVawFq$YFHR3<8z7b}(`4`g25a^L2LP{JmNadKD|mOVc8nK;e@^JA7~$krE+&z%|M{s^@h|xzY_Q ziTnS>{_+iZ{E*pA$)af++)N9Ijf&EVR41bRvR$Z_a35dYOapFBe<>jKjYP~D)=e4j zko72jHFPXyu2(9T{j0paJ$~J#(4fRRHvk*bbS=tj z$%9p|c0}NRKIbEF5#x-~+s_U>+uP9rkG1RO85Yfs538-Mt$9YOjAU+iN9uGgpHUl` z>^8BraXl8)5Dy;ZbG-nRhLv6#jYfNR+4Y1ccD<-o4teGC%HXXyT4>x^a5* z^@()-hJsz8F$T>A%n$#270?UoZcm4GJ2yWslAiHo*)ni%M-lkl_#Ci1r}m2(ZGRGL z0D|@bG>|{VH(1O*?5rNM$IRjgW1B5HJ=0JB(*)}`2B^r|E;-c;1KqIK-82mL&$dF2=+oBM=j&Ct z$Ao65qSE9kd}pr~oF&DE_3cVC*z~E0QHf1{ks^om_R84CjCV&}xnSHRFC@@_hZAuV zj7E(Mk8H*GS>^o&eZ9_HdV5{7dwYAiA!S$(3e$-&=he#iLM$tzu3+gHICulTOTz}} ziL4?URT%neBC;$@Ot+g4KopB|o1~7j)t~28Maggw>S?e0qe#n=g-R|K2m=TlTgG!Kd!gS z=IoS}Z^D7Mr7{;^5lno0cbaU%%wDpsy=c*H&ncbWki!&@i^Ak=$7ukY%ou*{^&!@oZ zYOYdA57Dlt;X_RevpMEHs4%Lgt*;8l`*T~vu7wSmxq+1cPIU!2m~@%aT(HLSLXCE z8o7$@8r*_$x>>m`yGy%VA}ROeKj-s{{R9E#gT9O27skm%`}-+1YG+x3cEL?J9#XEd z{093X4z);Kbiw=Hu4qB>X=$14hGH8qWK&N!&)VCI>PUIL)t;$tMgTKyr#-%2{%=N%h3mxr8?sDkZP{8W&)e7 zFOaPWhURdCS*G>CGV6q;`oTbWaVN&_r1J#~J_O5g)v<%G!PoP_T?6O6|8069{6d`r zWDI0Zck2g*?B%i~(VlyWur6i_+|793dPCg3fJCP6!;DHi&i}-z|u1j7TblJ|Q^#+^xaD;$i>zI3+lN z40m70L{!dqj9+k@!MB1Cd%Q0XY5sK}v%I6vgS%R|TsN2y8!?rPeaKxRLb`)Ht>~zP za3~WsEUG)OOm297MQYf*E6Jy2Ny z=4&m@`tEc$q$tDT<|Q|a`+9mRd;sbiPtVv<;|M2;Ju4=5yX6*4O;5!7QKKcEU{Bc zj)M>YjKQK_fBP#RV?zesfAi4^Kh)$?fH@bI1_M057A{;**X5-6s0}>bQBS2|*W0Y) zW6X#+O;oJ`j;E?c$Gcx^r5lhb6lyJWiTB#!tDz+I17grY+`&S6?>scE({JB}(Rlso zK=$F*j$Wz8;suo}GER4$VAZATPQ+n3VsC?Z?yuwGWt|=AWsm`OgC*CQ_n>in%3Te? zLJIAVwI?0t{lFy3cmc z!?Iz#53cc4z;`FWS5A}4X62Wxoe<&Zh9MUx{gW`_0`_X39eyh3UXEy?PY*xo`;K~= zu^yGorOx=zB~{6r`e!4r!ZKI%CaB1&6LJyWoHCRvgLx?di=nc+qqq5!mJuGWg1y$h zR=N;>OYZlVF=gWQ*JS(n&%jxBhd2FEuxhW+d>O9vvNZw+eIFglT^xYzGj9q_3p&_Dx!pY|)6dXJjp(6R2S^pT_IAyVzcBR`aIbKV zh6v>{n_k?&;Ojtd+M_kP&{aOtJ?5P^_n7e{x|mTSjIhh~ff~OR89!TOOl-doPMfUe zg2CevOU@F<&8GJ9j@3N1hqyZ}1D!k&n>byoe?AV=&kA=ei)^H2Zh)!kPL=Qr+f6Vo zI7U(rUDW~0v=}6~;DS3HQxyZtz~n*U$=_c#LgY1MLSAaycVS%j#O|$PSs-BXh!p=t z%HCj$Bcx7TTGjF={Wj~%wJ-==(qEGoG#(l9&aXh zxHI^tAGU~lxeR*+t8-oT*GM7s6&T4jgXwvGoAzti5?NA9$8;ZF8X35Q)k}5=x}wsr z|LZmI!%t9?9cD_A?y?7V68^+`kXG?%+W#8({_Azwt^0myFa7#ML;~u(uTO)k`+X$W z@BCLEQ5}m$oBtdFa%gn+`}qIbU$hyxZ0hF`65f<^hdE+Hh}Bp!c3;&=ge^8PZonUV zg{#wP+b}wD_tz2O0IOO8ixVcj(meEgeZf*-hG->Nab~{0UhCeUmtvgKU@hFmlFfho zZ12D>a-SH^IQHi+{cxxiI7u??T4CT^4#mbR&GcjS(s(u&jd21jj*1Kdtre@HlADvD z`{$h)F58TW^`W;pwiDWyU_JjnzK}GStGcoXwELgZ{`?LTkpPBbv7mq>BV*%*zgDA* zx}N8GbIpwxDyo7RY$__?Fw%ke`}d))VU9`f?C>%D-xpGl?l0CvagyMHj(=}~73>CN zU=FLNH^I*-p7ZuUE;wln)1iX2=}lx}wYf`#NW!6f8EHI!KF06yNaoVYRQxy9M{@gnoaqRma9w6i7?ka@{w|tXiyzU)k{^Tl>FPaN_^Ipt~!+ zk8eC=MVq@>Wz*PkHe(xkFbXC>p+SA<%;E=>W+ zAYFq|qrVU1j`p*cSVM}bLzkhgv zg19fj4sLvR$!BnbcZIHc7Va_HgI$(KRJcn{k(zXCyH0()ws$-m%PW+>=iBS9xIS5u z5-u*vtj>l}=5GiP(s6Om2KGY|*S=qR3R)R-vY~=T<@T%q*rDI7@L+`7A z!RNDpClQaUC^)Jip}+@S{RXos$bdo^oaw~>c}h?;7(2DSFLc1KaP1-T_b;GO+-Rcs_W0z3Hl>DJ5b{=<0_+ZK?CcxFy75jAa9#zQFb7^%21(IYz@taJe%NsqFU)pYHrbqlX7=LzBbpk4>u zTH3^to-pG`loRkGS1VHE^uh;ygmvmp6?M-WIF?7AKW2Xzt$)x&NY~ zX~33;tXsBhd1wf-4}FnimtZDDOG`ejH{5*r4xk@J+@u5AQZXef%19i922GIscp!iz zI3V1XJlz`~8JGZOXcwhx-G1BfsnAsiBrAV~SGaD|FE|12NSzPVOq(F!ZioMJD>;3- z_>i@yr-wB~7>4>h@sY%7r&I5NI7MJVg>eZ;eD`%iL^w)VI}d2V6#(?TO(n>Gwk7rAYu2Ohl(x-Pu+}fKteH=MP) z>xA`)y-`*+n{LmLxMd|Mm21AyRRyxr-KXnjGE)D2x9eY;cITJUu}@G#L=zTs6TIwM zBLZ1@sJ__DZOEA|kwrz<;liTj?a3V{0&d(oIZUhdU9Fudob(MA zzqR>Ou2cenI;dzYLIAa$iN=LBl>9s8Z2jk}qIdE@cBYD>W4gC1A{$p-;z{Y!ZunZB zX9r8|+t2Gd;eEjEo6m(ZUyQhzSaBLp03eZ&^SD8v-VIrPZ5E8nvNsDf)>LIw!H=(z zFJ<~d8Mn`^?o^0be{Ig`)<0YT7#)8&c3|N|MTEn1^Uexri7#rHD_7L>ye$YRFWMKm zj??^5Mb9QZQw3;RpBMZ_uOLLZ;MS$}<+b1>b--7~kJC>KjTg-F!I-Jnz#Uy5Rcz7= zHzz}u)GO0ED`ZRYLh+xJ<;p~L0ISz@Rc*?SxC06nJqf82mG|V18qM&*gujjQYL_L$ zmEr$qFV7vKdQ3<`Zh1%wnw^L#V?a;#D^Z8&I}g`Owk94YaSJybh}S(FI#6D?CL$~_ ztS@0)tjhRd6smk{ipYnF^&J}FgQ~b-U^;m?RTvU;0C)l%M)FD|o>*8i8TIi4H0%mr z&mtFb={&{4UJHr*KF&mTBT{=Zp&4_wB2Q3M7?S_vp=>%X>;kIhI+geVR_V{xhSwQC z>`Fhqnd@dz0#A3DO9VUyF9}j0T{hCT>h4yVz!MiYFe=HmojrkP=QoTi7ZEPYUc+Fk z;w4o^1*F(*TmZEtHv3Sp<;#7IlE1zcg?4}GSoc6elf{R9n0GpyvYRjBDshZ*YD|T* zwRF&Wq-Jz$X2t>BvxnNimB5+q-giM@DdLq90w4ChhgDXDi}|w?F=fwTuizXn>y`0d zr2OS`g7g@7Q0Yb-H>bNV!eLIaW$ukItDCzT$)$-ZBpJMjQANj`hoqWRI3ZwqEV9NW6O3_?$AXt26+!p4fgx?xkftqR#a?U3}) z-CWBz9$e5_4>dDIsKSgal;aoE4WuPWqqqeQ^GO$+jD+6(rtn-oUqU+@ScL&FXLw4y z5$ykqxXQ?ZK#vL^98#yJGSS=9LnGr1DQC6UZSID-)0hcR_b!unD7D`8Irc=R}*+XM^qc9g^Rh_fFg^L4o~KOWjgvaU6N zD2Ra~L=D(c1;?w%e5Y$ck}k5|>Y=E0oHX{sUv>b>(Wcyjt_EO9e37Ce`q(^=`7u$T z(JWMJ5xptZoRP&>7(`)rj^5sqG6tibIuUmJtdDFIKqne-ahGjDV5`EX< z3~uV0BGtE19mzWE1aBSD4LyJBugigo;uKiy*mpFjfmFizr9H}>z*a?gL(nDmBW*X~ zrc39UVMs*MLu0}X212XkRAVT;ec)b>+BWqxFSPmWkDP*b*C}NRSxzUM7-1Lm$J7ZJ zxm?BY;(U++P8_|mqa8xp>RTB$u!u-;k>omeXjew1U4HH0_8@#(1%WjQm_Tshf;yK_ zAJj=*@l*WQvyJk+vIWN{Sf$K#E7(&^e4pi;FpG*Jgv)Wg4#E5HI8ULdQ zssD7=UGlNe#Vp@G6w>(iQ%5JLxTd9oBbJ<#UN25o$xDr9u@{9T#q-n zDFRcK|2ZNul)LWUdI3d2S;(?E(#Ycs^9u`=9><2g=F^R&^DBtpXekdVPzv-Y*MvQd&Dkl9Nqulf|b{E12TZsW-loaCxxOU2R+{X%}nJ4tN zg#!?5OIhUrMT&+9-y!G|@VcQB&hRiFO8%K~Z5uJCpFto-i;kIzsW^e)X$GOocnzx& z6fWVkbKhY2yRVRAJ?NA1-yA=@R*>aw+a|6JO(uyj0umPQaVXvtyWLIt_sUW|!-vB!uBd8wAO2RzCgWbT4ZURc=tnBc! zzH~Z>#8zwbsMde7SmR+)%D0qz!ud(P8u5LD5Gh?o)~`Am!=hRS@&feHn~u$UKrkxR zWhDy*?IhC%cNAX5qYh9O=TqSlBmzcTUpV?sRz{JHtdLejN|@Awb>l7(BoWbdKVkmDpwQu%lO0Hu zC?GFj4IKuiMkh{-3+hVzq21v9xZxSg^ssFB1;r|qeiT16Tb2*I$`V=6nvX~ow^y2> zBW%1zU{4-dM|93$O@U1xXDi;o9DX0FMy&D^*d%(9*2xW^I$cZ!*$dJSV zZa6af2WbT?B3ya9@x-%%i@3(9q-CP4!oQEBtQb%_6ZuAo66qh0`>e6B##4-ViKZABYa-N}Uu!rWqu54*ag_h)WwapQe}%-GuE5A_F9kbz;s z!YsF#8@2F0?*>o}Y565h=BgD}J1vtaUa}472`=LL=ewLCTv_27YY!)pma&< zc8=j~CmwH2>oOv*{qIMKbaeruAk_F}0n@?CC9wFn?Sv=yA58quM|mL+btkqU-A@O8 zVn6VhQnc$Nj+2~fBi+s;D*5xoGeImH_p1hA9lQeKRxlrOb;bw>R_OcRrlP>R(py(R zeWt2ytu;a1PI+dou>bh*zc=RZUjR=zwkSxfP>NJ{g_*kYH;sX7SqGsLX8g?Z@tXYj z$3j7({7fWs>Tkpz7O_7pIlWLRUQ*b8CeMq=uFK+;Vk8;UnAT9U*|w|y?q4H_tjuoy zm3{yqg@Gm^#{5$Iz?>`v$8TGQypE7|3Fm7b{d3={GDiF{9ohDrI-vvZ%v}#|oq;8y zJo5t^uPh|?ec2N!KXsA!hJh%r=ElY6J8K(MG4{lmxgf_bnh@^eCYwHgLZ@>5b2#0w z++)0lH*__3?AV{*`5CAKCU(dIuE~U~p}Fz+t29uc?Wx&$Jt7nS$e&lA<4)7OJrN%~ z;-;y#0ghHN!YU|ryyQD|^?xwA;gAtx@&CfcWMoxcZ+%P7&JA=Ydw;5sUl=wE=jf7N zp@(E~iD#EO{`p7@SLPT-%NIG|ZYKE_9(~-v6vFn*%tY>A^ZDbN+Xpf+Tl3;G0DKhm zYJIcjCbCB4uyoL$+5!esqXD}=1G~#rz@n&Q|Ju!*t zh;zf+@;@iQFhqyw?LFv@1uci)hX8)a6f^$$Km3vF9@KVw3NHj`?CR>`kQWjQ8fU~E zjvojtG-XW@+<^J2iieK*&3D+a=Cjy$D^dh@Ic=;FY-GIN-a=3N_KlCh%##0~6ckv~ zYf(>5Z4bGs7C7BaaK~<42*hq_E$`TZ^J!W6*NAB~$YI6{9pYF&9^aIqH~ezrhWIfH z8x>4yR?Fu~63u{{X$1FEpUm%*_1hM=2<{x}_)X z`*J6N=U}i@Arz=MD=j*880B)R$h@&>e06`xsY-S82PFKQ?{Y^;`3-WayBp`qAsy{F zyErDNTCAO73Rx~%P!0|=A2o~()(kgq_L))-Px5q;(9#Ltb(zgEtM`t@xFP$R@4}>v zVpCq`|KaP+oJZHnR2F-LfNU)q8Xw_l3fu($k_Mlv=&t zSt3~nt@b5ivJGVz3?_S);dk9L={Udd_x1h!^E^kNxj*-Et?%o)uWS9>BqdUtR7AZL z752BOmcsJw2M$C&^~-!?^c&VV>f7e9_OC)2f2G}7Ih34|Yh?OqgPJ&fgM?eSe$$4H zzmC*zJNl_T@Zj$9rz7jU?!Nq`-hIcFR~K6ftJ+wjrI>CV+Z~~i#Gcr(Io}{lCS6m-t%;#__S?N+!Dvy*iKb9UGHz%b;$bCk`o>qE z)re!h(;aX%4r5jm+v3rnkvKI!F`7K1eK_Fz4&yGLq=6xQ=of+x>x1A(~%% zLR(vv22! zVCyv)?_DKXBkx8o4X(X#un;*M;kUUsKdJ z|C+F0U7exyktD<{C}>r+D3JSh)PT7O7CNJY8xE zNMnZ*#Y(pPou$b~TYo||Gb3#D{gL2`Ep^oc}-GQ=&D!}|jA)eh&v2XbRkNW$H%HR^XSZ1* z&auogJl(qA5?2(@_QaI;D=~jAn{rx4=xi;=X#N680h1)`;<4SU0cZBp3V#%7CX!)R zpFJ1(5^F9tYHZ53*F%i-jfyjAY2!KjYZg38f#db9OPj8nvaj9G3U*DE zv8MZ6QS)WVo|&0r!qJG`1djt6Lsyu_@(pBeDTo?CP*@>{Me z+&dB;>?od3z;w(!*+}c{*GU}hoxE}5h8fC=pTtaY0RNlL!ekr#)XLJwXl?C1O=;r~ zag5k52{A=u11T>*`moAot2bTsAam0hfL)b_7H%)kQjXE-o11(0?wtkpf)=*B3F@9Z zNNn0PC8f4$!5*~;>A$eVK7bU*QT9JaiowMyR~C|(kh0O_Hgp)Lu28A!X(GC5lb0Fr z=kWyhI2Ec9TSGS!Ror6tc*y=(WuTlUtP(e}3#Z=f=IchP#Z2AB)att65;`{6?=A1f znLT6b->{bpFuiwuF70 zWP_P{^D8SZhS`oAIw1>%d8fQz?8K>4n3bBv9tI=@DW&0$wsfhybZ(imbt_yj=>(`> zqGznqpj0)9JdzM5w?I*pByZCaJeYfslvZ>xEwA&RE;!Mrp(Z|xtNZl|&ZzA#-;eX(UCx!ub@G6eH5WrtG-)6@ajNs4f~;)j z)28X?$1c+qDi*$_Xem7I9avh2%k1i<>+Vq61&Q5zPGk=BPDr{}6`>0x=XY_RNQTasGpQihe+e<`$+@OX$Ut4gY0hGu{K@Tsauw&jm;JeS ze&Rq?OZrbsa;)IJQAz$^FI&30jul}hbIOvl{S%HZM0QFd9rkU= z00%fFvgNUjYI&)(XGahQV)wSBaAuX~^KD~zsq#zrGv}V4`uUSh_WOR%SRtohI87kM zX=l2GDMgbUv|MyaZkLW-D~&T^&loYu1V;0=1upN@Mnd)=35l1+ilaF9?aeKF*NZFQ zvC*54s--L%IR(Ts9pg3eD=P@&r9}$Z|Ms52_NkOo#rX-0ZsfStx9_J(4j0LdJAV#+ zud#Az(+H;cqZ{Nr0!SOm+<;>ocuSdon6!@mUX$L=kj+{9Ww<-aJ}qx=`Gxym(;UeQ zu7L9gU>kNM?nZE0u$5g-GEkvvW#KTUBbwQ5$~v&!tKVVeKc&$|?Dd;JnC4nnM}5&V zUl2gwzM~Hd6*Os3m_x_%0BGva9Z{~ME63ElzHxay^xulLjaZl^Z~^e=Vfu9Y{j7jI zd+xmt&CVY-i;K_UNiBa3Nrbv?zOX-LMSib)u`GSVt$rEO&7Z)($@Iy0|GvDA=xHS&Jg%Hj%}1~NAYu~PtUY{vejt#Hcvg@B5K`Do_&nJbd}{;(nvz!pjp0Y2%urHg7jw0-E_ksIc$( zZ5WjPP12_`i`mey#9Na-eIHkpeQKy46HwJU}bEVs-bk(SPIxF3;t6j zdd*LPumXuH8&a)n_3$vpIFzhpWfsAlz=XTS%!Dd2Uw1)i{{rB!6S&n?-@<0V!ilB9 z2pTb^&@_|()ci%0wrIr2^edZ@n1eX=hs^DfJN2rM;4+oVWwvk9%1mSXI33S)stJA5 z^{KbFR|0P3Jl7d9#ua&!D(7A_d5;2opVkKTSXOR?F3kKV@Tk+X(sTSHv%vfCQ+ zgE%KfzGy$p9MT#&m~h9~MrtYnV;^b~$9!H|#)xHZ?6I`h5GZjK(E{mKL}99gKF5uiliC6{PY&Tm4g+}VMI89NFbM(a!1v#Nd9$8tN}_L{ z8pc2-u?wj()FhHws9im4L8_ISnu(_ePo6*dV}k@974QDAv}xb|^6()4>hX{NLW0%1 z6EuJOsbndqe$QC=iGVeZ*B_4e-xgsvywytN@h!i<+aYT8^A+D~?+GP4aZOUq6lNr@ zX@^qrxdRLTc#wGaaiH4;5+E(v^lJ-$6`%x}ZOmxektcUaeE&}XBjXWpgAs{2&t!I| zNP>7z5<0MU;U^^*dx6uvaA(}bBy>jPaEymciO?bq3R=oP> zdYoHyCcYP6|2FTM>U3x1rz7lq16Z1kGi4VKHUHdvfvit3%3RvGq+0aP0W880N5|XK zp4#Xw%txS#0IVs|Z=~_!|NqAv_f+%NEbPxWt&%i{rA@vVT(y8i5|R_a+}1YV6=k7L0vkN zTC#30j3kh$Cl{yU?_^NI^|4Ge|DuvY{C zTAHn_5D6E^(zIMICy0mUs+M2C?NRft{q}KOE)?7Xx=tBQx?C*M``<=lB+@45Awg}t%kmB%}vgJ20IUc5?Ow4@J)Vqc63TTdJ2D<5x z;(C?mLbNxeuddpbvSZVUkul7C9(z{TD!Fb!C=1k?04X6W-HX)W_@EgFEHanOZX=2^ zf0D89wa4N`6CQ4<^OkShqL_)Hz5~6(Ft4ZQ=C0<$<-S;1MaA!Tw7DEle1iKgq9;ab zpaL8X71CZaCcB_z1f~sTJW9OJ(7ipn26Ww1(=SofEFr6b@d66PzD4N`+y>et+-DPQ z0U6DK@(BJ1$^(vP9w^Vm>INStVp}M8x}z z)*PtWBV{NP@#V`GiKszZe0+TR9;yTQwxyw=q2a;z?ycGbx9V-dNlt=fjd8Ad{_qFU zbi-#0dPKmY;^JV{r_Z(|c5s@EZf4@SiS_wS9tu@4AqXUxf8Nknc<#WYI!mcmNu}IL zLM1J`Xc+1paCEnq&oCx!HT%JxLN^ZMnvBdNFjVq<44}KpasN(~KJK#e`JgG=V1LaJ zW3aDQ)F$8>u^^kMS@6@J>Niaps&#;vZt^sW!J7%L8dDxzWQi%GKseb&Nj)_8E1x_=KdcFbd) zo^(}?i7~wy4p%narhNYmvy_VV53>XIL1t!-d(4atPW{2tQ0CjnofqJWo*HhoRkHl6 zZF&W!m$XOTV8YdoP56*z8NR~)JE>%y)bW=?N!k9!*zV6?IxtEXN(^mc#vejqE_H8I zI?6nXDKr|gU;+wkLC^!n%ZbF=F_on~c-5`yASu9qjP2S^va+{6sc58)$Lg|`XFq8V zLHV%ixsM+|Y6e4mT&C*do73z?8v-ivq4uE5_*2ZhIca0{pR9u$q^u7zmpgFa zKzMQdKVEwFYQwZ?FEm_s6U!Wm1F3(8V4|PZi{ByDwg>|Wut!O7(swW&-!{5S4M$>% zBbjSRTcX1IL_WMP6^YSdr6gYND8lF-ClTf}zeOBp+;5JS4M0>S}b@o zXV2cv4s<(}Ag-2cxq|NRLjrE9VjmHDL>_r>8N5n+|N${6d%ZWAhwz_Gf*+ZthAV0n$2#k{xU zFlZe>jA?=U_w5^Qfx@7!g$8o3(M#s!u8x#q78EX-o-(TzY-k35P83dI`Ex0SH4^;(^Kn0;%R&CdHOU~F3)Caq}#?#LdGzY z8T+3z2J7KkAJlbY>gKPn8rwzchz&R@L-GWR(C zuJ&C`|H|uOZ<_HZaH^%e+}~E+B@N(5>a{my*8BmvI&lN8%B8F0Pz_e16Xbky8`|~k zY58Ol21}haBx%MeeO3mQ9C#gF5V?z*Fh4}yhs2?h3UXVZ8%2}C{d@PG{~;ze{&*8o zk%8jKa@#-kVWcqx1I{i>uF6xN1j!txQj`E6QsR!OHj@=5$2nfLK1GnJ(v!YDZz~Rb zVL4KvQ@#&ylYd52QqXC@pSq^1fY2?zIJD&sBcx0VH}@V@mk3{9#H}R_hyk({3Q00? zt>9X1^xnITr=a@=C4T`^>wa37B;2qDlQ8}G$g52~v+3FobN8s{4^4#S-Ouf`OC47T z76a(P6S}FyjnR8=h&q1nF=ERFiRtR-_*=w|!e9{r7XbE3=eQ~tpt$n8k;Z+8agP12 z$^n4jjQ9yD@R_z9jCOBp(wBI)BuXr=#;vZEb%Hqk4lgfy-igSTkOb zTC&+40JXuzI#YGHYG_YS>c|^>)hbTmAhF#;M>n}snx=113O(JPP;m@d_)yoVA|F?l z`uKmr5$-ZnI;Lts*Yv*t%-;!mtK8RsBpW(d1RCE2H8Pl>yxUx%KW?y8UVra}H8RGp z1`;=JLuWdL>Lo}#%bxot?KD3g5)#6a7vniefqKaEUIapfnq?nHxTQ^KoBu#A*=6+G zw{JzDGw9F&hUJXyj>n~`PH^EYI1JG5fPb6 z|%1{|SkpCCR`_wJHn2I5+?qm+*8l;pLV{rkp9! zR~4KX;*{1`p-_l+XQmMYWN#wEiSU5diFt|V+KSo>JR}?!eIyxY_Q?&(GPQ>K?kv}m z)lZ1JO#&;?94{MYWlEo9Jh1AZNP%%5=rtA+>}wT3(p9)q5dQ;bliLff-@I#rJFNxa z;ftoFlRKuI6Yz$U+r75xy-&>w_0=O~4DK|q4mCK2tTcX&=L(MpOOjDDC8;R>7owDb8@W8M8 z$9Rs2#ftwIx{)BRhbY~K47L+we#|-yrDo4H0-nTRcw*omz-2zSPxb1zBLU%XkJ%r2 zU$GSC2*zNCl8m05MnqEagSme}58I1KPCUytQ;PP{!q!3_U00UJz~|xcRDSkICsV|7 z2|FT+sij%mGj01f41e}hT7G}BkX>rA`psKcK)5A92b`hSS56)3A077cW{{8_Az#Thw z$f~MRvYemX$-R~6Sr;`XBSt2yu+6ln? zoGTQn(;{U$brfk9Uxq4`TNIr;3o*rcP+4O>r=f3_4h8nOp0zuc3j~(FfIMy=_?prC z!B!|b{rJo|-deP4rOrRrh2pW^jUXF~l!2FKF&Faf?NhHotP(U&Ta1Mx5!5-q3<6=ZPxCN+68E;6R8(N*L6!c{=`g$1W-3O0B1 zzO`5Ie`o7%7Ja)e1BvYQ&27f`JWuZQc)&+Q61_fPOcw9(f{Q^$pg<=_JqKw(tBwC#I%U(>m^RAemD zh|S3^i=H0JSvL6@VTt4><+NUN+WAvC_VR~wy7da4!DnwgOz3z znUkodU^t2nquOa%aPwWIV?51+Hed-g)L7nXQfRn?#aV(PVjFKhMA%G8R+OZm;rxR76LXP<`4-RM`T$mP(=WoY7^r+^eRfgHshBXhtpP6(EV zzmp)1fu>TfD+R_{5m|OG*n%3+BJkUXsTf|0V_@kMwDsWe%cW-Gu?X6qhyWwdwim?| zyujg|%F4@Wnnv{-0#32{sxTrJ=paPb_v`vDoH)St)MHApaU|rY$5AM=c}gE zNeS$=gjt!}VY^?690F=wW6Xp<>Y<`O8kMUgR6J#=lrb6%xB+)V z^u1}_qSxof-siQcDk*sxq#S|~o{~pmc6ZgM@#C>2SYW!iJZS48qcyUgNBPrm3nolq zGo+|bo28CN8~0oSn~sEz1Re?naRRg~rtdI3P#RGgv_)wo-53!H2As(F-J|XxOR4{P z*@!J9q6cLCKpU*Je0?y2_4&{$Z^=OXR!2#@V9pI_&eIHVx7{wLJSX5$)6tjuKLj4I zlsduQ@BG``yPC(2g~`Jg1B<}GzkIH;5GqErtl*gh7FUo6*|d3cl*1qNJfLA^VK6=( zIe~MbRxj%W_s0(J=366*O3S5tC0DNA@*V#+*C*#vYf~n|&A0=V!dW{sH8rC}@_Fm! zzX!zO|5tgb=zG6hq;AJ(Dnq%Js<_a4$fl4Wc`oDeW64sGE_0(bB7aiJ9@%9;*d$C0 zp$f(QUCt<8uNp`Q{FM7xo!Ga1k+8pR01p<_|GQJX85hg`5lqu5n%0!G5|_sQ`4FlBgDsZN?dU!6!af!wE%sF;Kr%b8c(7DKHQ_M#ZCrAC0nDf(22Q zls$BjOteAfl|{u+d%+qhFMU$E;jw}A>^X~p(>yVe@d$>k{bUr^hLQp-E}@q@*w7V0|Fqg_sLyxZI?~A|y~Z98WMd264wiXHhUROh-p&2M$C|rU!>H zN}3((?CeYg`RZ>2{i#`FE@o&df&K|dQ!XSL?4;x8RiR(xC0wWb}-%GWAah89|b zfR*6sl4#aP-YPs-p$$;RIohxL)K|#cvTtr+n}#PVp-F4dSj z@D%3-FbCnXHFt}pe`i0m7Rp>?h>ty%)C?+=E!U_TnJ89*27KlnF0eyeaU=aJHeG`) z?daJ0L*EjBpvP|O`ksGI9-&|Y0-|!}s)3baivh5^#+&lk3t%*&@v=svIQnAgnhiE# z?dmma%tM(0JCYJ}XHR0g={0as)5ibn`nW%g1BZbc(h*?t6~p2saA=Y0xBYN!k-l?B zlHU#XR3i$aOGWOa${_%HzCzjYku3M3rQioID)YikI?yK0Q$4oE<_LSWr+BBE3O{r^61o= z6!`z}SRaIaDT7kdIdG0+B8J&bHaSSfBrsB>44b#5kTa7JQNx48y&v<-O^G7;a*O!f zN)q{)A=EIVuim2g?VY@LfT_J{HrSSDI5WI&D=tTZ3@p5X8<*cgyClPUBsHg-fEnv= zTo#0+MMerwIZFTbL*j|s|Do{0XL9H*UyO<=xiA?wE>D8z#kE+_kNZBcm-OmpH@yaA zpTim7!nKCpE?Q>O_2CD~cT!g&1V0(~M^%jn#q(=fh@^~!sHjTa-E*C%?NYVyN<-xY zHh0T~wKEgzgTkk{`QHHv3 zw=9?TJ`XbgFv^&X_EFO;hKx?9O$MaGsefdbjGYD;j~mNel}ROMQt5|FR>kPyhZ&ck zel%s4jj4tdwG~`%nL_YCD1cN=^&1o`vz}}1$z#eE-;n;h_zO+h=0P=;Tn!Nb>nCKF zGwbHt&8;8?q7em7EbRELr6OuCKs)7wDAS$v4)RB(jfdMX;n^UqdrGbd#;L)zJLTOY z79wXbUSEG@sfSx-uFNXYR^4B!G3TXP&VclQhU9EB6TD%wo1LtlhNa;V5RE;fm+KfQ zG8u<&u6~&AH)!8czs=sk!C_lD%h>9*v{!mfWKZs7e|8g%N=}G7f9=MZ?Rn4GpMA!U zLNw7uy#pQo-3P(qe?xNLro02?9WN_Hf#r@9jJsd={UItkGe@Y9aE%ic7dOj;%9VLe zqDw~MfP4c;M92v)v};T@??re$oP;@W|IIW#AA?l5-DV?rNa8bq7aM@|IHK>}(%}C5 z7ciQz1$FCzxVW)KYzg)@ViK=Uu?#0cYjzs0bX_~ zj|dedP_VJ+IdVhBvJkNsVN&sWKTJ!Q@B;gnqEPPHe-I`FW?!Xd$e5>sr7Uq#37w;WKq9Da?gjJ841_4y zBCnk5h|HQHS7n*!*|9@DgFg1D3JfS!Jy~68!TSk?j4T}^_O;!k;DM>NAxQT);GE`q zc%>P6C!aSEGfs~Vh6%#McZflf>r@s(FY+yRyiY*Je%kcw+qZ9rSM@N!9-r?)rJi>g z)$*i!$rv)~X6Fam{UTy){60_3_}3_nK2fMVKIIOIdUF7cSRdK|m{JtbbQW9nCScU2WfbrQ6vvz3#B zgY-+-o)eJ&uI{^sGY?I$bdK@!g-YI>ExEd)&%MCl*aRFSYnu-ojuk2bK1UhNvmR+> zOuPy{%6EZy?^^dA`2eLSa#Sua)z@=#-l?kso-V#OfLwJ=NthozV>U~KHe0#7PY8$56pE*+D|z!iO(n;N(9#3A z>;Um*o??2WA#}EGE0w%I1Y(bJqVUJSgbJm3b{Rvo1Hq*aU?6{<8s3>Fg8Bd-B0+%DRF+^c+gtow0HP`#JW9 zUS5ZmU#l@cTSUN%kyRoHI}h!K7hh6FhdZrQa^Y-1NJyaLfWx;*PWD!R@{kx*7zKeI zc_VCh-?K9{c{yO~^*sY20Z$@t-$6(kVlU_)Nl9ZjqI2I$y(!`U{p|np-#B#YJMqr= ztN?%GQ{s)_+(U~G!&~oAmN*XEed`SN{qQy3cz4T2mdPK-UifP-9Yna(@(D1nUi9?z zG-+nL)J%b+X1=MBw=11vXvgl|yQjK7LPdVxzI|vX13%bh8?~32nbIFGI>=0L1#I;2 zx<_BS)U45Tg;ODeJT!P>L?wHJe2|Lw=6#wHi)f5QXp#7Ihri$!NWs1?h^0o}I#V-s z@Ca{n0tqs@w z$ED`&fB3?be#)R27~u=Vta8vi>a3uo==Qv zZ2GdEu=~Nm!7E^o;87Gt8?3KyD$?9q;E^5=J;b(_3=9l>ENN?l;8l6aj{`f0h$)S2 zBk2Q0tlP`rukwx5aI<_3R+~_Tm@YQY2nYfY$!)MsVOa%*$%iE-G@IJkW;B3&)2C0T z_fVOK&=nzgDFq!r6S|tHoy6ZZifY;T3AEUUl;r-3-zSx(?~q9s_MrCykDiAGP??nA z>;K@V&Y+z3iSgic2!qZZCO<%78enr zxOOqG41kcogr#oy2rr9&gaHWN;3%)Al7lqim^*@c(U1Zed(oIKHEbx_4k2}C3&hCJ zb+9Ln{)5NXB3gjw>>p_7+)RrPWKOowiw=e>QE#B@+M@>9hDIlV&uWzq~y(TUwaQ5pE^ypwCMD{C8 zPffYx@}sq|g_Bj))z^Ul8sU;wFOdE12U~dqBwj#U&}c_XX&t;V4%_+GNT8&C7@9%) zaS)epbV@hMu2?EUvB}EHI;>P``m+Dqm$zdNSl8?WeK8Ji z%tyqQkeFD2rLH4q{fIH#LL11WNNgE{36yxi#g{z5&?P~1K4y;kp%n!l?GnnY+Y0VG zs5(eeI=nEaGsm*=*i@*1E37%rTe_keU-CXM_!L)hLPw`&8BeI@w>vV28MPdU{97Tm zfFT<)_;b^;*b{vJzL!48&}E*`9D8*)C3snP(OO_`cr2En$$^(8wz{esjfVu#qjEfU zJ9Emra~mJm5JEZ&!6=dBde@Ufx5)(NhHUhj3%+mU7Jvhpi)qseAjo!deZVb9b8+5rEk31ufyhf9GP!F9ULOQL) zzyg8i(HgXE(FZQ&%d^^U+jdjZ?;x3ig>q8TBfq?%_!jXtEyLFLkjQ4{yW8uXey!>T z5B32PdA9jx=^lrzoIo*RkO%-t7JwvC%izTB5E}H7&*9l87U4%ev<$kdEPlnM28ay0 z7N;k#6bSrdW}D^ABq#1ZUqsf$Ar)1t`9a+O`tf{BuOzGr@#2SbR zagG2fJ^Jz{HYJf<4+5}u@`oUkDf=5)H{2_EHj@L*a-uvPd`ErHETpYO+*vf~2MFyx ziSIjj1keX5-l4n%AFPf=2WXmuBp^J!waB6>SE@Y%iZaa~u#!Uw2?;k=s__m)z@`-a z^B(H+U+vm|<0+a-rTNA(1^_@e7f+m74IRCr$o0pM>|*)4@sthRzX~g3Kr!bhW}dvM zmuy02?!{~)g`>bOyZM`~#45fuFxXx&X}iGCE!V^Y-=pXudpz|F+Yd|ippwnv2+Fa9 zsN+~a2Y?rY!3*+tcqHfo{T4U4jHl=wJ9exEOKmQLn5XU!U6o)b3vM9 z24*j#&2u@Nfz}+3e!vS~aNJzs>K@HtIu98F;PZ})Qps^%Qw3D=&~a@0J~cINGyoPX z-FB!EUhE-aNj&%cjFrRr^Iwnf%z=K?^C$;o`${!1AK|fiz4jliI=Na^q9HzsD57EZ z5w0?uqRXkl=I5sRyFrq4KnLVXnb?{1tK04N$b#N|b%s9{BbJ+k4A(>ZXq#ONv> zOFuFJ@PPkLR-qfiG~hFPJWUMDGYE6P^r12G$@PAt{&V3RXmryGDD%Z)5K+8>RsED6ujZrP>-84oF&{2j#;H1zSyhZ9ouaHJ%1Q$ z5@6s-S}t+i6W><@KE~W-Y_}SgN+!+~>)|c2RF_v0(bUA&!6DJjoBvk{mwf**I|cB_ z<^eF3P=YlrZl;YDbnF1{$UQHlnPthRs*E2iXlHorc?_Y6;)eufH|@3@K*MLmWX{4o zI}|t*<7lU&Yr8G8#^?*#N1J(OF(B7# zloc`KlgKDjn(qQEU~*c`84k4+k5$oWPfPB1itQ@3zKzOl=F4f=y*4Ue2c!OjCJ{w9+Y$VJ~^T9pC#1BVRJNVCoHq%$GvInn%QU9jUfm& z!nfm~?BzPROUK*dyQNE;))ApVk^z<~O27jL)aAW|8=a0(9z=Hl7Hw2(GSb*9djNKU z1owEBte}>bDSbxL2cha~ks@9(Q!8l+Wsrn%uZUl+i&f^&@4pi%PDY@TPSXL%W+I%Cz*EZc2wdrzc)$>N`lJxF`U0 zhuu>e^QEaTC!hQ8ON5Knu~4i^A!aJ%NDCashT>t-;uo_3?52R^?jhYTA>?>Zvv3_7&>Q8h$E z#WvpF)4_UpNhQ`siIey|C8{eirEyvUas)DWv1SjexDR+vZ!n@)*{fweSc6JI(jm(o zcHIpQo6a`%4=WC8fRwU<=Vr8NO4_&gDU&x83jdT1XXpEapLq1Z7Yg!A!QVXlj8L%> z7;)tawUvdWU1^?ulcmI(JUZKJ=+!&;wYMq0Z+P^9;|z!P-G89eU;5~7i*8Ej{0-^- z&{?{6g_>aD|1=udceLIyvGmu$S7JH>0=K?FgU=fv zq?6KOM0oaW##vxHH5sM;c=Cv*5-SIsK&GK+#B6ghn&`VRq9y7sF95Sdo|Xq zUD)6a7A=n0FS9N6%z%3PZ2Ug(i?Te%dOz01viRlM}oN&Eh;1ei>w~0QT&6`C${uu6 zT!6X0z6OP$eBe5xlnR_rk4j7{>q(u)N`dFi9KDahu3gH(tPSn%J{Ww(YFlh z+2eCAb#jQ(A!T&=9@Z?3r6+XuqP2C;4RXDt%xs%EnV`e{v|p(25~DCLrbq0AA^x`C zrU@aJ8aI4j11rAzqCVc6&6U41U3i~$!{ie>>s z{}`aT;%nXG!v=-3Ma|94F(_B`^`R<38y84b4UcP`{)eS5t$%a1*z~T^qMm4%8lpcc zLAJ{5-MSTmFQLyf;04WkIa*kHwa<)94~;v0eGJqKtGGqRO*zJIiDjlMnKEi}noz4v@^m@a;Q$($e#hhc-dipu*1(kD#!6jbX?y;Ivjy$`?S;`< zs3EM_8t1hLXi%lfZ~2(a_CAUXo$oap?n(N9Q;=oj|2yomfWTT9s}mJ+-AQ$AEG#fn zH7;tj^Si*{(jCB&>5lXU^`%RTA2@ek-Urp)RtL9da z#`d5j8R$1c52#s*J+{t!Fj9iXG=NcE1$lmL>KS`4D-LYDnKsYb%Qy~9{-+X4gD21+ zwWO9x9*JZmHrjDV3ZvsXAfP)dDF_frKs0^6absG<_#J4&>fz^v?S8*K)hvCo&tP20 zqC7e>vRNX6oj~sA!57VqAumvFM$3XGg8P<#0~7g;Iu=c#l(>>U@nTq*1eRLJ`ZP!x zl_{Ft2iqwT=|SW|2hHzys)0H0zcNbo>1iJ~j+_3J7;D_wYqAwghg#27-6?hdLmqg1 zqnp~6HlH2;+Vx=%P;Wv=!US8OMroddI+!S+Z0pIn$>QQr0v>drJ?j2ScWln=R?x$b z2LCcU79^%JH_%-TO@A$C2zUu)w*vBrD6&p8ym*EI9?LT$QFX;=a3PB+g#5niH)H;Q z1oZ2p-?Xes`t!}!N7#cicile}@=BwUlaoWrAQbj1?Fkqk@Ni)R&b!oTkO*UdPtmm>|dRflr#^}jXk3@*9ZKtZxCp$fU~eB z)|i8#>fFytNuEwOb0`0~F?juzR9Ph@CB9RzllqU@Id?ldJ04QX_fo<5P z;q3WlI_C@qwJ=DV-kJB~kn7-H&^{CpLTK^7(e#mAe<|+!JE@|KlHls)3825161Qi7 zhj9N4-L3bo=$TZbZo41U`BbfU$#+K?>2ut7V7$zqf@|M^J5b3V^zdL`uB`V+vmT!Z zW*n5+vd{AvIzwv$UIR7yRR|~eZ=;T-k?Y5?RIo2)z<+;4XZwv^FTETB(BdvZ9*k7S zWIpWxA?6$e{+xp;{TwYnEl&6@PjNUKiDZOjh^e@%#t^2*H~JshFM-2y+k`Z1BOG&l zp0=-^vFyl3Uj9CBn%P6*YPKnKDh0b?;>L2`?|UoP{!_QL-Eq?5bPD=jl~}`N3sy|{!lHC*h-oarbr^1i8dP- z`A+roM*&y`qqxa?mVen42=eNRq+~l?D<=rA)*b=R@KKUWO;!jE05iwMv(eVo)eu35 zI1yRA%gU5A#G2Wz%G>{CI-bA%_}LjO6|(Ve6yc%PSX45Y8X+_Y*Mu%wys)f_N`XwW zzP`Q;m8lQD?r)D8`lRm;TmsbYKmPl+;v@*rMmcB(=>4R6yJ4;%U{}Wf!fD z*o7=|ao%utIjwRbv@+6yJb{AM{Z17#c{( zr6!r3gz0ZiPfmsy2y|WbRb0GbC_m~b9=o#J_b|Nm_4%!P4+&fN?H7 zp2{F+Uq#Xf#eigZnB2A0|2ZI>rtCW4H1O~MqvNJ@2pc3eB%yFp-Dx>Fxs`%MDXASh zbP!ku4g2Hi2^fcvNv>96AJVsZgq2-ktCtFcu6^k7ZIFTX?Z7D0@rPr@N{A zl_UF%cN`^45%!Rjyc2xn{dAMjUFgVdlYvpqB8fGJ@nztE+E@^M;2XJwi$Bahemz=vl|(Vj!0E+XIlfR*bj^9v;3@1}ND4 z2|jo6k#3io$3l9LS9d~cF(rt5c3yEhl8qm}>J3IX0k5>Kc?P;2yYk|EKTsyae#+>V zM@`|^fYa+dA;6nghEgPNETZ)&n?2hgl9t8C>p-K}EG42Nk6Fd%8b0a|+P9~XO5P<2 zF`04xt31F6OvguU^#AN_a&p@Ls#3x7;qY+Ga(vCy@Pm_BpKUM)c%%WHM<{l?P}M`| z)m*e1K69{P_uX5k_4jW^aRLA^&mltIqTxT=S7Op!CV-4H$@QY!U=BIQ z7Ka8>&!jBtndQQd58<%}D|^zMO?bkpX>wp-pa0`8}(0h|@Y z7BIYkfMX8l)$&vwGe-ShSlumKbtE;E$ISVgWhRx{kPtkkjf{K1jgh zvHPdzLn)(o4%L>tzhrA`>jojJJUhTKT@l!Hnh#>nfk>!!QI&NEho+RrG8Q)ljfs%m zCWUkiTF(u14Ebpu$0p!HlF9}iLFPk)xiu?#TFMuKeIJmn1M?~lL>A|MKisC6o_Z!C zAbkNfo`-8FDJ#@g-0h8*;MywttB!qr>};ga?%I%CVzSzScaqL45U2_gNJtN)+jE#n z#%W|k^+8K$(Xl_IpCG4PB;)L9xC7tO!5)9(4fpfKQ8vEoS^i3jU?sxfl^i%S@ox}Y zpFZAke_#+YG3)=e6R)l)S4zJ%0H{j{UvJe+xrNXmEwE5+G26J*tPi0of*gqKRWRN^fq58q2{FWnUfH! zulWx@!#z^}KQk4OrN!H2sFZEL%?EO^7OQvAy8gyioStZ>IW~W0V2ywj@b+$D&G1g_ z?z@dvj}2pk??Kv+xeq^@-{_bF&@*%&Mgj#Mz9Io66xImSh8R3BmmYYRfWktip37p{ za45fh$jZtI5))H+^S4O9eUGOX7Z0Vc@28TP1DSICJcHA2rX5?FefpCU_bgU$VdUoW+~2RDV4yhxA)}9rPR6=<4qu!Fa9LcwVC z8+d*o@FTV;S!3WhUuvYWAD5wfj7E!X1cJVP@6sm7Qz7zSY8?zZf|S7L#XAUQ3Fr{W z);-MAZ@_Yp7XcQw4$=Vd@R9f4lul@K+rdvT0Ar97JOBY^^Ph)bxgLc{Z|*TI>O0}o zKiHflCHt%Mz6x;1J>NoF*>KI5w>KNc#$5B6BrQVC)O~dAtpas|*SjYETj1*y_H_Cg z{kDd2v-F$;R99(f@JK+Bn4|McPTriv&eao~9BMa)u>840fp@hSkaHQM#0rQacvs%k znEetyKN}EA@UBI7QDs=O8oJur1IDv!mz>?{QuEQ^xsmun;70Sezrj{*Ix+!wc$y&! zVImEk6Xcb_(RU)&s1Wc@O4WyNg3}X2@OFR;aveFxyOv}u>!wUXh2>To3_FH1DH>i-sbQ{jDoQAjnwp$Eb1k%X`6T+KKrf0x zl>zn-wi;}*QSVaENU+fYA_*9ptAwLj-aKKDlurtpwK1GX>$-yrajk zR7H8&9%%Z#j&Qx%7{aEkE$b=)Y6(9lxWxH&nNoNe1JyQNe1^wU8vBo;#2pk^+~Z0m z2mJORuM5?W*#AhdWI2XaxGgg$VBWvBktaa;p=iozGB1jv5~3C;)C}!_GzoZ4kS*~2 zBn0Dfo#8t2AI-+l-uOo$;RQRt5}?15_x+z=SSlot|1N4arH>DS^4{~8!O;&u;XL~u z76c~!Qh{IU?6T8t+d&vD$Zm=Axo64!!=22>oqRyp5AjXkxc5p3^_09%CX)n-L7vNP zBhI93$Pdg0EU{}b#iOKzYGl>Jtq7X~$t#`Le%|=GfB7reOp4;=ulZ$+s;a8w1+GR| zbB3o;>KSI-)Vj}0b2~wPfGd&r%!Jwa5`J=8KU*nNK}AIcNsh1^HnCpTFUj*`7xD;q zHX4HPkY2*4&wNz~hNU5KECp)&NtD3GOc0^(0lDvd19?AZt(@SNJe~SEMQ*8pRtaae zhT|~X#!{dBItUm1a{ISK9Cux35<>0E^k3)I`uc5Q_r zWFuZFG0_S7bD1ajuaPAtRziV72le$I*QVOo*t|{i2jK%F_91Uc$$$2{DDNns<)T^` zA^Dn%`LF!~&R71TZV4U`Q}Z6{Ti6WrI)vM~q9HVJcT+)ro0Pe87=DV>vC}A9rS>Q~ zZ@`6RG$+8N-oNpO_$-F-`=dxa7V<*H@}264^3^NVzg-yyi{!?*`oxQ1KNrY$$U1k( z(=E+=N({W20D#L5bvRgU?a$ZIn0>3^+c;XQ5m1vlSu{zT|JD#UH|8Vw;j6T7_bzk8 zsmb}d4hc}#`%v|qE4qIDdRqNZ6qAhElW0|Xo33!jbC$UMC}IsnjN%av=y3;j;ME$Q=RN=oDnU-0OL z>&tV+f}3s>f$Oeo0={>^zFtU-419074pfM)z_bLDk~uqir7VztXhdY3nnF93u~&-tJL`rB`q^2gv>dkoVj&? zrPt7jZXknhX9m7Mc<=uG@zr9=W5FxcG#gYQfuEy$r9*KG)ZU|#Nd|l6egl}=rG^t3 zU|us7_mH5o+HObGB@ie8U_3}Uqc-=wtM(~*PXEYV16Y6`U=8YfdzH=_6^(-s!cxb| z57qAL059pwC^=0JADbeRsgoG$QsWU0B0N+7?c29fdiZ&13u(n&fVGne{?2oLRPq`~ z30PydLlJ;EjVh%zwFUMz_&$x*wp$caL0!gaWBqEATDw(@)90<6*AL?XXkX3CY_qs* zSaN==OASQ(HN?iYoIv+eQz8k;~ zCE1AEw)x<>UBcQfVMBI?9AuymbC`jJun?M(VaeAEMYG*98g*oia3z)*?EF@^1L=IU zW{N|xw*hS158j{hSS$CsS<$t(E*K)YnSl_5ntQJgAg}X5$=4Uf;O;7iO74-d;2P@9 zwX@!g5;Z1?9PLq&3!Bb-Xl6%?_c(YX$=fBA8p^r5ct(m)dsG1krF7W_maRWP zZ-K|)E6bW4CthSy=7Y%uG5K{RN6!JBd<63k@;&12qkIqa{D17dc|4Tu`#(&pO46Nh z7ik$wh>?Ad5<@EM$i5UIOUAyJQXw+PPBBPA5*m96(HJ$hWUHiUkV%%oSf1me&-eTN zeV^yA=g;T$%pcwEnYrdVuX8!h_whd7$8k~-*~O#n;1Taur0#QCoJ!aOM^j&j;s;FZPlF!-0JRpIbzpc_a0W$9fm6>4fyQhU8_9cgS9qSi{F{Vv(A z8*m^N;t*#PLf5tRi7$@lb*m1I>K<_!e?ND zf$~cQ$j6O0ntKk-!e2ZQ1MW4yB0>LxL9`ynb53V~Mev4Tt47@GqY$Y0aBSlOWE9}1 z0Vq@ei-|Lf<`r1}0tn!5EA(m_IS@_S?a6L1?Fo9#ic z0YTAtu$(%3U;d^5%PU?$ z27Q2sk(R*jG`$Y&AU3V`G--3^$#uaytU;*52jdFoLLI~X-$v+#{d)8dxjY)wJ}jqV z-u>6<6n`fKOw7N0G2B>f{kK3Ge(!(3r+b|FA7K#7^96BR7;C^g{0LWwyc)j&sm;PU z`lr!!#|Bvd>o^|ibrwZx?_a$IJTNTn^|w6s{O`x=^9lMNZI$22%CafZ(9w%*KzzPF z2__e&M`?h4BMwDqfxzsMHr#bV0_nz0-!nWm8lpclqrNs1aR?bM`ZPybB z01Z^Zk(CqMWjhT&(7fkER%f!a56o^Po2<7BhA+fq>{|{Cwduo$4@_8k4ZO2_5wpKM z!kB_p4f7SHRuHvVvdzDA0KE4w_&edR()UZvt@SZI_&@sGl69B0C#3C_PWsj)BMkxO zAz<|vVC!CROKg;%1U$S68c9T9_#GD0!}_OBdz1h1^|Do)IgJbv7?C_s)z*Ib-j<-A zfLrZBmJ_14*K-epv(`e~bZL^?r8_7OaP?w&voHZz#Q}M^0@4Mqu?zBmWt|}ik97Ym zkRthTUyV5E=->aWKWn0)bwc?rEUWlK8)k*g!C5x(9MIhr*evDQ9Do%duFBmN}KME0kwWItIhi+)i&URhc6SzK5;cMA-L2+?K zq73y_s~|5|J;{sh#Wy!a@qF(+ZgNWMO_^-RWai5QTCZ^`qN-UDhi1R*zc`u{Eh6e~ zTpP4Sb<5*aRp+gH&A$s%#ED zSbWKK?BA60S>(`p^OYRrpqEFRazwl)!(~GuLVgK&ZJPv+&ACs^#Dx&C)y7NV)Wz_v zlTG`vmhs+fyjq}QqyW>L;LXdzagj{?h3C*!;)sa>_FshtbNTNJebyj+>ul4EO5K!C zsh$#hOpb7t|IJO}EKQD%Yo6o|xaL1!WnsyEuZIw>;nR&XwVw$N|NQ}aNdznu%M%vq zbiDW9#fW@*R$#rtuJN{j9)&Vc2#op_GYadYlf9)jYkM$N$i-xZ(HOl$A+sN|e0_W>5Ov(Xr3T1A z-*}x0gSIT$IW8^rHDr17@@hfERbOcf%XTz%&{R4--g{$htbh3|&sMWj>ZEfcOTATi zj?FBd;plRGd@KeYIz=ldgDbXY)5gKBS|Gr|>Vh_X5L+3ec7f0UXy&^yC zpF0J@Izm&U2og%z`29xf|Mc>)Qe@P_4dy`tc=GRPenH}f;kuq=;{Wr=Y+SQ(PocxH z?W{{*1F{e$^WU44BSkF0nrZR(A-9?}s%_DDfbKVvAfPi|$vg=fHUKgzm|HH;_$j1j}yrEil-z=?bEMT~ZLYu{8W@hfuwNKvw66nJ_ zk?l@2{F@m3=S!pKw|m09-90^ZSV|tAg9a71RloCL8d9a5$hw^~YA=DIG|4@LLfXNi z@W|8n??MRQ@pXTxfAiOhiV8oy>a&z1%mWh{LHARKlFt`NK77l+p@n{Avp(9$wY&^y z%B<#N&nny$>BzYmRERS zMtcEW_&>mv7~VG0-)|2447_5F{da4t;B?;eiN;3vDoEm1_coAU#H^OO{?k}$B!E{#$*D~-vlh+HXep8nX$cGO7+Y1U`f~TWx&cT{&yy0NI zwa;t6?VPa$Pgm1oE0}|CZz*a>N9(|IQc7Pv8k_wzGYjxBO6s3JZOF{dd zZ z?h&#)-CB@1fSj+MjZ|4Ylz#b~L%1M6OLb=8c%dW=;!-ir{SiGiA6BrXQs(MtccGC@ zB`7kNpKM{%G5Fh2;nVjwJ=@{<_04Tzf?;7;(#wmK9r&!I?&GvxIEPxGs-i;w=dlH( z@iCbE9oE;nm_NlkXHYwLqPLNt3*F1iECroKs5SfpJv|j;TOr$eR(*wbfy>TLMkW2P zEw>Gx0h^ec3(qdfcC!@Pqm2qVLutd0qdF30Y$$y*i_7`vgl0-HEgM#xgS{Xta6HD2 z%Od=O#shXj)|Zu)frxj1FLmo?c6~)^{U~!a-i|la-T3C_ zaJwbYcKQ7QPx6)aNWW9IstM)C<)fRzr$?dMDqRIs%hvx+d=Bir5)1}(m~30+25fIB;j z@7U=UbhW1Ui)}x250+>~wm18+%YE?3u>Y=y4OlqNaM|9+f#qF0dfdciHGo3EB+pBC zySTcp$!2#-idMwEzkE`d>P57P3r=K-gqTv+Q@L`wF#qLOs^%2 z@TFwnJRn6~GGP{(>%#ch0!cE_$aqPDZJ)KtVhc$mN-fPBjo1VhKAl>^=Eis6>??fO`w^_1&ROET}WcgD_g9>>;nXq3|S()t`*m?WScdwf2YNar!6cr}dmhzzrR%)fo z^tWcrof}d=QXFCxS7ANzCWJYK&E^X5FN3~gunH*3rbA)N)1wKo+uI7CJ{8RfU7{5U z(vTVxko8iYt*0b3c_J#O@9hAY*mgmEWj19wIQ1PwECYTSX!Fl`=k>{!cY`iM&4lJt z7Be3SPZ*uJ0&%E`i(u}2% z6?^H?wJu&`E2~U^R}mb*a5%J%kMu)rybE}5@c1U+sB(RU11M)$bS8)_k1QhFi9YBV zaURvESfxEc64E=6kS)3Il8?_EL-79F+Xf!bR@GA9L1?M3W@77d*nxDzLSxDiTlO?q z+$k%{L6Ex{wMl$d4)=p3_2*$Q+b2o^&{?yVyh+f6WkgO#5xACAiDIGs|3 zq3ktexNlG5*m>$ohUc3dcml{u1o<#0N$2Vs*yn5S1-vMs2Eck&0^cHmg;2 z-l2U9wOC(T)vy8ptL(yK&b6z4PYVkTO!nLGtgmx4 z-*R*ypLDtAVj0d|WZ+GA%a1X!1KnAXFT{Ax-oUx1r8cYc`09RsXsps$pK=MHfo^T5 zA|vMd*-ig=b?M6&Lir6ti-RcyC()PO=*y0B{fbx~`akqGsa8_XUdt@Ykjd11)wSIh zN|4=z?m+Swp4Xxdf;)?1P4d(Se2 z6aYJhDMm@P*9ZAJSx@xPVTsK1HWIY12!0R8O2E|A2FT$Gv)|IRX&%yV#k|VTb7`eR zF)5#`g1ws}M`;Dwt1+oo+@OPpA9y!}Jknvi(IpAeJ+dOh|CwSC8aF;MQN$HwlhUs) ziZ~0SNvT$b_pSiZ%o zdoNYF^EX3i0$#R~&|?mc^Zt|5kLDj_!^ZmEAM9PAL*D2n7Ta2+ep|)#vG6;&)zwQG zy3H_K(B?>4f)n5zNh>KU*Ckv~Qw;k3dV5i2rKyjPkJ6ua$7Ep-lLy0EjVSHRhgz?& z=DL8WL-J#2Jwv6_!s4;#`mGxknh3d{gA%cuhwC7u?h6rQ zw>j9Tj`A=CRm`%e6`+4?Fqhh72S_f4o4HI?4~tISI!)Gm{QPKohtU3ghcV-mlNs^n z3+^zj`p7*+*aEQwf1L{XPpqzddU=L>-lmmD98OXCz$dL-vHVG~@5q$yRuMSYv}wJ+g`nLaJ=9PokAv`52Ygx__1e2MXp9p zP6fiwO@|`~z;e9wgeg^iR%s)Q;%Pg|_GY?+H2I!PG{tz4t%g2-Uh3-Y?R`@E8jh|H zu1}rga^4@^tbF$Pc{uhr59;&HuqN#s7J!20B|y&&Y+sp<3o|w{N`Pc0wSa}McdCRA z9)TO9rC@N#4+%?4OEX!Zr#_e~@`qGS&rCUarM(i-S6{>^<74)&4-%gOg8o2+?f$94 z73*3U@C^|Io~F#zwSs4UuAMq#_iV!TeX`_;(gCSWEa<&_zMt%terl^9pnprTfuA^R zCuaI=VH#H5+-^*l{g6$DtSk3_Cf^5zo1Pgppj438t$sQvS3Yqvl_bn9ZsvIxb>h+s zf>J_TMtmnV>;#QKc}@kVMD26yhBR%xZSar1NMjlcxEd14-ZsQv8LkjY?ElWJhdLkE z3vg4(cx&U(;hEY#zPl z?0E5AVpC*Y>IFgEeCPY5~`X?&=QBM;Zk+sEFZEiB7KpKs>=pWkL--?z>T{r7w5bN}U3Z@k%v2CnVDKZn1X5YYKQ zU;khG5hD}uGkJ|nF@gDm=<@CRVzzz~mLB+-Q6oK!72(>6Y2M8KW(Y5obdXGJ{U>HC z@4H-lpc+753;3UKl(fbEwVJDrdr<%GL5JUuS~(O?fSF>oqj?j1%T7$f``unXF;@(@ zR*tNO+)ecn{C7P$`+s)l|Nr;@s~!m73}UgYx zciaKD=m8sypKLvSt$-k@r*w&8#f9t&@UlG$)Lx_7V!e6;v_&YxhTsv8hg`Z!bqF6p^AA^xDh;It3{RBzU&G$CV{M{zcYD7i1fepsy&+7r zIgZZMcYK)Oy#$3IpMp2=Gk0OUUi0zqB}l&T&=(c5eFerj3ud#a5>-M+X=6RZogQsE zl?_oEC$8vb3sfG;xjpf?B!1TOg@N7C+=ZQ^a9mj`Y&eoARU67ADHResCl);V+fbdwB5-QYNO1Ztw~z#r0;5jl62%f?P+$IUMy z(#+cg9vvmk@8i5pHxK(iCNNU_ReZww)*j)e@~_DS)%cGf`&Hu;dtjJD%%Ng6HzrK7 zDih@Hyc|LbQKjhNGX^qRL*U?h>j)(%injTO*NdCKyqZsEj(Cz)#cArOjwBgv%798I zvyjddgM>tzv}=itZ;eG=7G0l3Tk_v~3=j3;vJa09h7tp#Miu1U^`QV6|8LCIzK%&d z=^7mh4SzmiR!-XD(3aQj@SS8qJ|Seh&xwGg{27aE>;da}{JvQEzus zbCBv?s1LjL_~NSzlz)z2}t zm0-JRBv@xiF@VYOUU%dUDH$j(H&DxuF@W!6`0R zegUIofVXdsz|Y13t#>;&R%!g{LHAd7eRt2Wv-2w_+mf7}ol~HQ7B*Q5u< z?P~HI`+0WTqbe{XWcxA^%*k@<3A5*4IHQhA>1Gi6nm=0^aLG;;Er=$xiF=Vl+DX>K ztzBzuH@`${^IdHUR3GCw%?L&2h2;7(G3`4v|}1Cc7Y) z?*OXjVcMR~Ol1ZW)3W)Tw+3fzeS>A4x5L|GW4`+OyNOC?qd}B0V}n{Dc4v(T3^SJw zn6>vbjAhiA7}~&slxZTVRX`Dc8(0KCb+)k2Ua=tta%oLlt~5iHkBXK1ThHo&cex4U zllS8o5REl(8)SliN;v4x7CsHVRok!Vm*C6e;EsRUPMTt<&{q-F$kXEDm8jHAo50l^ zH2a!z>Q$+|i}h=|n1+jt*!w>MhL-_IDLb47%dP%!Hs9K4W;|3~prp<(sJ5Y`WNNaq zvNH47e)+=~m=LWz(akl2`$?0b)WH=;-!-J36Ud*BN@BpcYf-KN^v%R~IEE!$CY=&W zAPy=roMCk7-@S-_91iz!s+|MyX`iv0rtP=iA#3`0cYLC#kK4nSPnVgHHRWOgOW%|- z0Besi48|-(^Q-+Pz_Wo`Tv`nejEkpoORWVWzw(zIAv0D4FoC$z!ZFL0=aj)$J-0Q# z_8`bs%JBMTeD|kM{u$H&v6pm9II$=8Apy8jI>6a z&Iw7^EC&lE1SHRk*PDyc?w47HRN|%#f29^>TU%MJD6$?CF%9m)mJILT^7_CCqd}BL z{KMBd^R6deK|1}AD~BR>&&@9tj=f(qj;+h_!}m6Fm^E(crceyap=j_PMd}Y-C4Gw2 zY0DfDnjK~WRV-cZ<2XM-iNAd+PjQ6d5&!a4cYQ%o(ZnDex}bluTo|RFjG_)=fv1vm zN9a-ON3&a*oq~0bx=qgI8A>8YEM%WO5_%53i(6cQke~k}6eG#^t-FIv>~ZX!=~n{k zSslUwXOD3TeJFsTyzGcgO51bW?$gM1gCNA#Bz98Qgq)uO?fK18!f!z5?T#2Hpo3%= zgI6Q)=leo`j5}6>o8i-Je_a(;%*QAfCjAWHi^mkc?&k`*0XBC=VaEKSXnu*Car9D*C_isxmYx0txPQ{#|PQc z5-s_2VP@!&CesXOzM|P}5e?s33T9%R4?>@fXq7d4R9DvMRT7> zyClMO9^zR-G#P1SeTtsUtks{@?->?OjuRc%h6tDhcWR2fv8JBh``KW%k>fOfSYBeN zVjprvQl$80a03Q*2nV(y?iQc^u|irWr)H6)8rv}oIAQek$T>Q zv31s{f_e12ty{vZtF#3*!$Q*83jC|P4gqMx;E}MT>bTG(=*Lu|k3-D=3vV)ZhF@vSd1-vS7jzX{F=VcSo1j6CU>ZricQ*S(#|s< zmUh12Aj9MdzU?wRTXEMEy|A7u@+(steeIkr)ZQ%&{nI9FGZ`@KJWlRnh++N6#gZdu zG)iLQy8)p&a%rte_Rfu?+3Ea~!7!;3XL}82deQ77&r6~1G+@%lj{)puo12>p0nNGs z^GhAGGT24)p0+GF zOjEYwt+xnn$$0~JH-tHc`4wt2JkrxM_jFY)JqRY(CTV82;Y=BtJx(D0)Que_8AU-^ zekG~9sjn(sVQd~OsNM`+k8kyrs5X94+VU`BoB2> zN?wxyK%W>_`(}n;g>Eln9$0sucn?67eA0-XK@Y!az#vkyx73!&y{moyjx!XBh5TpI+cCLZs9`2;_K9Nj*oFAxx$>( z{43@CC6DV_9vLFQ@mIjGYTgey%!o0=X@U=vz)Y=tT2kU3YGE<(@Z;UR`v7qZ#CvNI z-5iTyq!J=h4{mwg?^yYwdyp^kD=Gf&-cwbECBuS+XYm<09O>FaU+Q>)p3>7knW)m| zk|o|ZR!8xHJf~ET(Ok(yF=qSYkdd(DYFz58nkKZ06Ixw??Pgzk{~xa!xaYP-4m{VE z*Owekhpm1pQV07wu4T<<7L}gQGn`3AP|nAD|LoH*J=P>h>w?f?@B`c^op!>Gm&2z| z9+_l~YV33GHnD7f^6=rq2yO{Wf57Rde>LX%iSZv<81NcUWPF1O%GUI|+>Tf7j-7vE zs_F&GQA{>OouW!VWFuFB=Tw%uazOyW-ggP_|12&qLBc^YBlKi?N2n2H&u9plSP`+Z z2-2B``&GMczc~_-xhv)tC?(c}dR3kPQfUV>GSt%}JEZ6rMexHcMG`8;>(jFUMZW@D zC8H>b%_^qs>e$Qss+Z`tU<@Nm?RhR2ntJ7j`oFz3Ooq2BRnT zuX;-|(uL4xov1o5&Zam3H&lIneOwU#iL0>Nu0iv<@YbSjIU-BVwhkiP(bLfiTGGr3 zTk56|XBQWxHWJx@VUXs7Uj;i81!azc$82M7Ty=FF0I$UXADaLmVL=zuPnlM0IKHx2 ziR$U=>(kFv>Vd5)$o;J~XG;Y%fVLQ1Z!n}i&Ud7+$lJ2J6Bwh&Kd%5G{en`D9&;*m zcg%52R_f3sb2YsQeT@zYa!X61)Iq_q%G47FiP+723t(CArCNbWPwAw_MURaaW#H6@ zK~GQ>`JgCU2;=A*Nf2nwMqyiRN!jXQx&S@+$wcYxQp>MIqC)GzvUeem45mgMf}vgG z_3u3Jk%>jgtA}(9LE=(z{evXS&(k)gvH;1HcU(?=Fnn zrty18L!78KzYr6(E&AS@v6)2ym(FiR;Fh??s{DDE1_Al&kJH&34Q=0JwIqD_=P@OOb4Hw&fDV33TwJegL817)<+N0q@JViV?q_CT0ANz z8>t^0f0%9f@oRp_yZ_gs+H<%7a&^8pp}*hchQl#^^&mTF z?$~@z_-3<^kdP!gGaEk(zPPIB{;v;>^_1R|N|5gg029Ic7XN+xlMS*^w%0|KKEyng zq>keyrjm*}k+8H$sU;Pnlm2p1Iov)xi}kKHw`=Oa6x7M~2HQT^dbiOUh>!DsLc+i+ zs7@U!14m&5JVG*fvaAg}KIHf!hciiDb7J6BWhHtiq=sCiY;~M>$Bg)pSK1gW9xb>z zFi`hL77iD-DEjGfZn62KU9y_=>HK$#Oq|WXA9>bwzxzJeO6=UE5H1dsZXjgORVh%n z`50epb812_rz|N(p%U79Y<=}PvH}Rwecp0m<;i>ZO6k5 z3}m`h4OJF4uxfAylSpbNE+t@7EB5c;dVruBYJp)PM|14K{yPP^BGr#TVli(x0M3je zMt~+ewL`k5U6Ci>u&~&G3#PF^va!IyE-F<8{Sld%flva`4WG76xs_Cs0_g!`h^ubX z3EO{VYO%QNF0dk9KqFLQk6NE&uctR?QS{47)^;}i{;bx*FG}M`^0iC=Y*7Sjer-b4 z_X#l&hntxO99c*3`q~Iv&T@+_b@LUtQjZem>PZZ|L#TrNaaOIj<{ZUIw<8D`>5f(H z9o{n`YrGgmOc4LX=Q{R>Q+@K;^F75FLgOEt_c zQYgP`FQ|PKlVT5!Vv+foYPD}-$vli_OwT4bn}?1gpO|u;yeRSW@=4%iR=q-W3n#u} z5`QQ0WN(fnRxIe^CnpWQ zA9fXtyIv5tjp|iLtlrWs+|*gjbmjpLFpCAicjXukyg}D?D>BqDw?Dng&BXQT1=gC0 zt2sFOIfE6TN80&YjoIw={4xN%mr2xqo78?u!4nscV2=~U|@~Q%qBlfeJcV$*0W-ZJknt{ zSm*l9UOv=8w=&B*#(mZMcvD$9xkCk^Z~Yqa>)hWqqfcAefxFa_797e`jV=xJ^1-Ml z&R&}&p6<9t1b*{`-z_`;RKl7uqd`v)<2bJ(T_cgCyHW@bV^sb4MZrS5A|nF!PnDCU z5E)}(5t5Vm%{r>Xxy329zqzag5iI7_O+8#oB`AlCtnomILdFD7ntTHlSyuHat%0Qj zA3sjV(3x?1fuV&H>=?%VchQZnq=P zL;?;$a{qph1DXj&%tKf|&0EjH!lDd#4M(U8=pj`unbJ?9yvlT(=k|?kyqFaAWVL3{ zm+X_)ztxU+RYI+#u#lDwyJ##SSI??dui6##6Hdc{6U7IEO4D`odbJHYTW7z6JC})a z9=co0c21_xmGRM0ITJ_E1ldZ}w}96OR|4i?0#%ncNX@7jW~}f7q|(C!Hk1Tss-b#h zt)MXMM@9`8_xaP~PFQ{0qaf#T(g{QYL(E{%u<4XquAIlHcV0dTNxfFW&gO+{5XH<4 zOYpu#_d!tTLj9U{QY^nDe|$w>?3q(GfDDRI{Fhv&Vsf4^O6~-`8}nKNTLfs~`~mY4 zpdp1xlkp`bC6%xTZ~<6%K`MJ@rG{uw9*^;Y3Mt=2y9|j7g54GF))=D1Kz6`y%!Kb5- zB8yv_G}&Mu2S_sXWp=KvIC~R4Aj|I|p`rPQLRx4#%?f7{oHRODa zpFz+?ifa&%xrRYO%uFzX!kC>7Ly|}c(Za@$R8>_4#LkaTonNK7nGmw0ox`ZsB&PHq z1R`;F-ONo$2XZswjr5Q$-^Epfv!?Xvy6WH&yRVd)W&l{!Hqwi-DXO+XcQ23_U9Ahd@qw`-Ks^Mv*nU7v~-83Q?mki@Ag?43lp?Xl)Z^j3OrbS`MQGj z(M^bnwA_Pqb8}26F;h2B?J4WjRaXy>utpNM&gTOYtKeE11;zdHF>orqx%rVgnV9xz zG?RJYU_zAYszpPtZt%z+t^os0iZ@2`V^*_8I_d;_({JI37}lRqbylTGvFgd-yb9f_ z|5{~H!?c^5n+4#1ZoO*R-jH5MpjYc}^)!0+&SZ#gW!sR_Kj6?I@WYGvyrB%A_TpV~3<} zgeFRiGx$`01`LN20|6LCkcnIIfl+-O&pIuKNbh>2#HTH-f~*HelCvy_W@=e+bLWH- z?v02OrZR`-+j}x`sn_HNlXWWj(Da>6p3X1> z$B$vdjO5a<_^m5&dF>$5FnR{~(vSFda{sUGdmZOr50AFn zD5UlG0C7CZCj=snQU@b8@8)QFUN?K?yTFovU=eO=luUGJ zLf1N6)Yx2y9ITDPQ~(_d$^yn787G8M03$OaI5+tU>>Hu1Z2Hx(gM(H{5k$o2m3DIT zib@A*EtXLOMg&M1mJ(IZu;$*XYojYnl!2IV09<8|4vX`^vWTk5PQ>mhNSs9^fZ6zd75h#S#9?FxTD;cAjRbO zw;j240$;`z)R3N4TomC;24Ys}ZuaiUJP?SW5EglDcfLq%Vv)@w)wtEwQXn`+gW~Ro zw3N)N#C4h(zp4EbAriGMsR%ZgY$fV9#nrFXz7q5E{T zUF!!(5+J*rBNM4G2QScFtB%?p&Z4SH_6B=BpD}%A7N0!J;Uf@s93z`&bz%OZsFxL} zf8@g+w0dvaObh6Q%|@fa38FPjS&Z0wH|ii0in2IOI_wPBK<>>Dp?vU~TZ`wCJZeL! z(aE0;`ksbnSC>hwxM97a6>O;l*Uq5*FB8=qumDOI!H-&LUDev96E!xTMP0e_JOKu)PjJWz9C8V3 zM3%Wfb~geB*2My&w^CPBdsVK18oN{A^QjHQ&55G`!-E`UitYRJKmC{ z**r6>9$aS?9D|#pa@jn76F6L+Mcuum3LEHw)c)Ie-=yksaI_B2%WiLM+<9A51*_i8 zSaG<69)fp+9DZH8ptks3ahlbRS50Gjf8;UtrV-3|e?YsUp9$v{$w`l3;6REA3GKhY z={SP)+*G|+Nft~q-I7?{PuZ3skij+4F}bU(V)&CXwzRO282wGm*l<~OB174Q&8S1M z>P$^s4B+tM5C^S@^P!bZOv{#1T==hw{@e|m|oyQ$fbuEQ##5P|L*>0A@Lzb zK&Vi)cl8S={aG?W7EyLKiT$(x(Ny%J<9wOnOrPUCoyi;OJ2`E&5-Zwv`6Sf?6g0oy z+};)Usr2xT5O9~O@PQKOw0_~plVLCbVM*(Hn}dd|JRh=Q_w8h?bXI~MXnf9Cd+`Qt ziXWi7bfQnkWUpBQL+tt5ISM5!vVS}9cX0>59Vl{$YYVz4g-q{=R4Y@L)%=ShwKWZ8 zz%G${7?&0RV_87n#4C4ziKjm&vGGR1WE{aPIS_&Td*C&9O^zv#VYF1g3%Ph49PZAA zdUYZ;OnY*A0G6l?nxK_gb7DS)A%-lCn7xS2zKfd@!$;-)Kw4+MCTW1y3Jd4 z3?-6lz;ktmt%+#IJ2kP=gR25QE!f5t6!lOa=WboPY{zR&EIlX)W=R!XD-5%}=Y2C)l^FQ=;$dv-T?jbX z7>i?*XXgMAT{>-c(~^Jx7;}|Ln#?hrY4}DA1mL+3Uw`Oe)^y04&9<6KWC>dA+5_RSv=~_iQ-L$h_NF(;?-`47`BAg7i{hTI2$T#R4Ut_h1%H3oSL87PN&h5_5YQ4%0_ z4$xVguBVsIhlC~2nHQGo!*c1&X~_y7kVbpRmG5b;j!o$P2qDJbr__(J-8}niH72AI z7-p?zYZf7K=^EkQU<0*m#%L!53rsNw?X5=UL)4`|R3kB5{ICUBF|H}6Cyo9;fCFG(NOXx}Vs4n9W?)vt(5OZ*A)0d)znU2-+M(k3ks(THcQY z@Y9H;*EKjZ3cx!J1zTF+O*)810R_3;>1662h$4zUEE<6*=)#|cR|s%Mg&gknxdsd8 z1>%sL{Ll%p^tsPg;d2>;8nO9JXge(fuFjsgPU=j@G?aLKs#d5PT~Plo(8wREk>DAb zxEA9RzkbM6Bd-Q4H#$;QMy4ASl9h^7_Xpl)r3IZ}7AHWEqFoFAk*^|kSj5@&88e}t zJ~G^?b$F|W=M93Zy;b(Err$)}+HJNXDxJ|hwX?+X&CS?_wO>PF-c}}=jOk9s;DF55 zn`}xubHZ=lzTTp7YI(=D5B3S=7bxvo!55Qrj8BDJG-zqH+4AAKV|Qw+_P=}MuX}%p zXLBQ~VXhkNh*EFlKFh!5DcjvBrQFyKk>hQu%*A8EvoeFrSBaR(G%!a zVwUxTOw}Oy1f2U7h^A#8xz&*1ok3U;9v<{H8M=vWS^JAgQ)vrzDUKtxMZqDSp1;*QCcWL1&pO>B_`q>m z@Jfz58Fc2tg$u^Trs^ebyCcGQ`T18Ue1tud^H6qH50C28S&BJiRg}%8`Km*a5$T22 z@3O-T^o$?575zzhr*EAj#!>ZEB&wqJmUfg zV;_@d24OmTD$Q3+Kr43`gP(anQ^&w!mXZyBz5*MQo`4D<8#mSgprpcF&9Xqy$r5H5(>s6Sq z*q7th(+MXtE@hwCW4qdXefg5Kvg?o3>UTk5g#`3oPja2vsKD&Yq#yTnt92tdrh{l17J;*%b;r{Y`6P(d#ex)3o|5XD9nCora=}p`N}2ViEF*B*O$$u z(-#_-al_2M5{24 z%QIKS;CXIyZmS3>RuiI?2V|8(J;?@fmpOSIQF_Ys5L9m82WGEj%j6?iiNe|jvke`S zmofV>erFB5FWK0PoG8DPjcO}8&1UleCCv;@%OBuR-rqVc)-f5Kv$#{Avvpe0asEQu zQu%uuj8a=r7*_Gq@bK{G-d?#!(`&++5A>>Q&5NxqO8}}`;nf6bZCaB&NxEZ_Q1B3| z*3S9K89=q(68Wt{=gdAPli6@7%c!<0)Ouj8cD@wwjLq;Bqd|ZTJr=Pn&ck=p{I|_h|qRQAKZP!+jaSU%Aba&WPf^)@sho8>}bQu za#ulBhldcigyA?Zz03D3Uu!{Xf6`}P@wQvGjsmcFLe}6&=3d%VJgO~?^G!kY*M>m4 zjr8^VKg47}sJkCuZ@AMs;Y~)hVUFA?P1fwwTkrIu3| zt5%;^cct%(K6~TOb>TRdH&7xh4vv#rd_pLf=_t!}oKMot^CE)`JZyl}ccc07RYzKn z%$k){xrc;Rb+>-i%!Q9{do0-3nu6Ann^&CcHM_Xz(F`4>M{Gkbj%~4_8lSql_92lJ zRY%`4N44HX2LAlaa9BuWKqH5k%gyvCyC;1U+8pfc*RoVP75!pbMvAi4q6b0);cSc( zlP@;Qn692Qp{NJaB`+3kqfbt%9Er-Yb{k+Vv)k7T+20IUD*_)En)W9-hmKX?$+ICWjSfu)&VfCWBUBS2Wj}P;N9i`pVy6RA8?YDXJ z=7!JlOsKYa2GYUk9t3&qW+#_e_x&UFJ`HNkS=KTwQdA0U%D+wi8{CsHFUyx?dVGritGXPvs4qj zxn37YcigO`O!k>Vrd<~VFP!XEna8c+0cmYQ1KH0#!|fR@eNy1X6UUyE!=A zQ{6kD{^z{AvvYtimsXex+%MFsBoea|NUi1@oKS3XDLkM5p=+A^g$$b zcNO4)pI)HmUeUgBCmnOswE8l`!rE(3g`Q1KO`V>YTdLdVARXkDMg8UITTv;?NeRB) z`c~1ejIf8RsRnrIZ27L~Au_Q}lP#?0iK!o%|2XX*Oi}kM(}rHsa8^D|GJWA>_%8)& zeTiGEy)~`Q!~fRxprD`$Kyn*ZjEICZ#o+F^*-MEC~UQ7$iy1diDUxj8@+OI=4Tn)9_jL3nru$a z13ZZgy})ROnpo$rsi|S4u4kSB7r((Evp%pcbTn42cu%4k9D@KvQOMQ&d)N80?H%{k z$i)~J^_Di~&Jf2k&$`tRY9qiHJP$9r5VuE1oy1eE0;3lRKZ z3C@8-#xv0^PY=pQ3q9M>J$^MG(;@DsGyZ#c?HnG?x()dPMGllOt;rA9AE72sCQOI2 z1KCfI++RX2m`YRlktSoDvXT-x;CN}?%3uQ$N(kyjilO7Ye`x_-tRFC#EgwJi*m6va^aT%YLTfrV{X`dP`8+?)QFa z83!}IR{8Y)UD4Bm!_4R(YWlX*I(UK*P2i78*wC3Khb(F*%-c1Z_r!r;=E_FKZ`a5NR>$X_u<(YOcVgt~i z7oYlzwJF5F*%DJc%mN}nM788adjo0eV5?xJ1kK~loja1*g{Bwq-}5=&>}Xy%J{G4waL1BhjU!ISifu5U0NAqxJV=JQJ@B%$rb!z z#`ZP*TdS+EJaF@XHU$92TuAcPJ083Y=ln*R7tghfi(o} z*qq%*Y9%pvy)(tJMEUEpU#i>SHZlqdudcun7{k{a?G(V4_Idn77R8@s8U2QTG#ADR z=nm}FsI084!_M~dkLzk`YW5tr@$m2{Rictzot+oU2vsgoKg3|JUqE60WDwtTM}Imq z(_E-|7{Z?IS(2EXu9|@kkw2#R%!<#@Za#U7xgWafTMV>9aB~ zyoIW%&*}#y)1H6U+Q z?D;fbDaDSC0%peJrewi-tE0<-6$*9+HpmLH+{*<)rFY|~b+Iu3y{hkJR~4wS3A0g{ zuLZX_SDm4TSUCtmp=`mWlL1y?VQbqkRoqRRQINGQy_GwT^Nq*L;^SZ9&4);iCPiJh zZZFCdnr44ez1nUbvOWE|CYKgf_p^Bn?8wqvF;)8P<8w<5E!TsW;gGvkaSR>{V-{jV zxguJ(M{g;F?J;CxJ3%@}fW7MniX*nYXX+p<{(|$Acdb-aqXb{{f)L-MEM` zHy5HmFzh7I;7y~H|4=Yl?=h9p2y0s&3hXOz=LmfJh1UV}kYvXIm3z1;9gMt7aBIvC zKJB~tkRhN)5yV%^4!>pE;LQbp9it5mGaJ&~L$33E-F9Cf;^gD6*Kd)D^16WsVT3DD z7;Apbg*W2)v6v6$X$)y^B+54~E0I!01T!fo~+LA&Y!2ib+# z9MtqrCNv#9M-;y0*#^Shk}0s7m#au9jM8bg{ zayLl=D3kX+z=6h1K1@Zmy+6$s(fqp}5dX3EzV-Z;8u!KYQNod&+W;xIlE`{p zvqt50+PT0KSj6YkcK=`PU3)x~Y5Q00w&X4L6}6STwwVxR%SaAGJ0%7~q{;b^j6q5{ zAHu$kY`m$ajGT)xIxHr~9A|cxq#1@GLP&~+smVHw2=Dcbc0a%WfB(MEKR%eb@8`Mi z>$$G)b-2G5fuNFNMMe2h6is!7_I4Ll&Y8^tqoa2C)=WVv#v9?576T3Wm#N3Tn@o}o z#}`mF{$povgf>c+OIo*p`{)Z@RU)W!X;AB*+tb@CVZV(!3`7Z)&yOfzp$dH2MQ~vw z<5ds|+p;5sr{BC-YB+w-%82nKE>p7HA7#DulU6xn*2Z%=Kdgr>I<3J&P58 z>BOz({5RRg?t(2SLYU(R37G5aIS;fVEHat*U+lNw8CDY=dNCpAo=t!Gvb?-(tl{|{ ztQZ73XI$}%c!vfLvrsRu*UN^_l~dfNR;~N#N|3M)sYW(8bf)w8-AGPm~+lU z)|)`{&C3wR4Gs=2!uHK(!YlsMmh6z2j6P*`ik^mhKX@NGCEogYYLy~K?D%Do36-#y zOAxG7l&OHZ3Z<}u`E+CLZEmb10&|3+v>$i{(9|B4Dc5?5uA;t72WDd?^P-;dE<)E( z-%tUWvrRC+PDyQc$WwC}+iVM`SWTd4M;tKbvh+%ayDv`|*St=tH&BJ(#C8jA|9}== z#FuKdfP<%BemzorzGJgEqtYcP?~V6WbaUoqfDz4ZTa6CcNAg)?JvK zbMDTal-cAr_vK7^zuSgDb&Wu)`BOS6JdIv=M7C7B8SUT1^T=cft4Xzfos`O-2h7k` zpc&IbK0Z_AOpy-m78(yN#`rxR%b}V&{6j1mQZq_7Tzd-*s@R0Diz)BYk8A4Q#S;yK zBE-$#rL%N68t`PfVv}F6&X)`RXhFTGmrQ~*q42cvC=YI#=tw@X#piYQz`umP&7Xe8 zpUUWSSEuyS-cT#_`P1pM5=ndrBL-G%5{)h03~*ukA(@EvZ~&koo|8ycLK*rOcCg@l z1o0ngpN7hT*wtbTJMc##+BIL( zrL(s;f~)fpTO&7_8c-SiXVcOz?t~pJ7I*rBsB>C4@!m|gU!r>Z`aaKSChxluN~8DS z)77XIHdLIfKh3vGb#$GV2IggDxXoxw+}vI-7pF7XA$GSg7wY@%c%o+i%;nmxu2htG zgZdYD|JGpHk!~Gsqh43Tc8vF+KS?9)qk;(h3_}x2a2EX_SV9E=Y{IogiRO@g0cfB~ znp>|N7S(#B(1|56%^em=g(E~gGipOZqJznrUUi|JIT=a~x3@fYMV|O=R9sUNAE5H{ zHhU}Ez+ zx0qR_?>QJq%DXcxN(fq5T#TP+h!3fB!8Y;0Z;=#ougA9fkhFnKtw#LCPgc|?z${(K z2(w)9`Tn8R1c8cjhTE9mVLAnggr6Q5?xFiHNT}`mn)`WYFYRd2y(4@IIyRmh6a*AL zdjYG~{R#kq3@OzZyVQuVuq8n6fdI)+g9b)M3saxlHobfr6MvrOdtP<>cH^U9mf}v; zx}AF#?HmyyiJQ)nI(A&%<26+o7`{k?!0pd$l3I5&+;Qs%tPDxXze3!yv zc`7I3=}~G1UQYHd zVQkRi-Pk6ctz}o}D92a+Y$@^42fYIa{yc^k-bL4BOoBVoR zc$IL_UG0#OQGdqx=XLg*-F1ZqK*DU7!63#L(D}D<#uZ9E5V~>oZ{*;#!@U|E1SxHz z26YNF16*#>OddKz8V?*;{6xH__WPHHM6Sw9aPJ2EfUo8}1Ox8|RT}9_(`cff$?Ub^ zN}#yrampbi;DP-v6`GMJD&}elt*IVpAxXR>*HvsyJwuQk=_>5_EsL3uNQ}KV?TjzY z@}BrLqu8ozW+BQ_{-rkpVg5uq(4HiP$6c7&RJr!27BYtuJMsQ~|4MKCOGFtgF?hLR8i%i6Nd`Ev4g^436kq{uM~ zm~dHIR^$ksX@f?2S65G2{PIh8E z*T`&}8XBfgt)DYfzK5ok5UBK!kupv$8E~-)UShLB4Ll}mlFMWRl>Qk6xE2tzGK#N{ z&VNg=RU%j2Uu?g>0KTN(GnVZe0DX$>6_ zaWy6-!!Ef3_S)cGwz0E=3U2-=%~!0VcJTBj8!$my;-xJ86jqHCROG!H9%enL$pFPH zGP1Hr@*Hbm9q*pFv(DY!-L7pq)>6=AJ)&JN87Hg6hg{2KqH;Lrq)Z`z=u<~!aWF^2 zN^J%xiR$f$tOX4h&a*P=h1qIe=*ftWxDmPK-5!H)r&uII8mJ_&lJoq#mWVwNFcE6l&; zaB=GAVCda?-f-f6LC+P%S`@ZXHV>*^E)D>zbB9jPa2!zMnEp!`tY>UU=`(~7?h!`4^aWE01FDmc!*IrxhVmoX=?2U$ww=8sI}#vXa=+EP*&=E9 zzTg4{q&Aa*g>QF%J=V?kIRdl?ItSWo_Tlqx&NOK;-cpx8k0hxz1_M9Hz=u~I_vN%H zpO$sFriUzqh_Ow9kZ(J$0<5PJ!@5 z|5n^fSAje#XZM533ei0i{wcs7rMkn9?3HL44H|?l1^$Oe$RKkjKzQ>CNS}vx3FXYm zVB)leG3Ld~vDbPhxK`X_sN%UH1)BJz$R(zrYFIACJ#bZ@Bp4n=*6p9|H42uQhvMEQ zQBQ-cJ`edTD5HTc-j@jVecj**+vgfL+d8eZ#H>`e@sVB`FGC=cVyahHv31D)f#Vwp z+6|t{gWWg;6<$}TymO{4olbr* zmTi1Wpi%K*{?-a4^kdo~1kdLx6_Ghc12OTwx4Mut&YV+w&H2Dsi+(dO5vqnYANM^z zlsbHdly}=v>ohAR|NVR9<#{gs7Tl|FchOh+1)bdR|z=bB0LKn{L?XyZ}q6Y2+$95KtzqbGbkUT?nNs1xJCYr zRQe6yzITAz(TP7+#W#4YR0A)Kj+Whyty`b4JW8vrYfEJT98G4XW8u4SCCC97X74-vyVD?e|Y@RJx$KJNq z)&3?jhkpR_TlUU9cUmgKOir^#v}9~ z&kYv?tbhzN=|FkW6~#?DS7HL|KU-0A4F+N$6#f?SP#Ig36gQO+AGs535Q5cGb?*!@)ldJ&Pg66=U0ryxb7XBF`JxO;N^0hCq6$ZEh#&AaS8a@OCo{kYMhgy!$seCR@ax+xgA~OJR?j zz_4(!*S@}NDC6|aHhu4mJ~QL-Tw|{54uh#9vLhO8?T9El{l*}3YWF~}$1f`7BEhcs zD*>#I%r>C4y-Dt%R9>ggf|=6IJ_lrdmUs+9;Q!1Q_Mq`) zZUQZ(Q4{`y)h0YL3Ez6j=YZ;pgWB4LpZL?0=t|{#_IfeHkkm5k85nTY1q%jddp({D zwcE>BLYEIJF^YgVdrseEhw#%YJOqvAWE;UE_{?SpYKY>AiRggb@kzAmNlM)71~Zqx z*SWp`)>-A=dV&)*G>NVaA>?24pP_Pg;3Dhj4Jng8q;RWD#_%0+EV5qB`9CYsP)pBv zCE&m>o#!it zNAdfT^WPzGNqWhrAXLIP1DQ%a;N*nrxr!U&EghWLGw|O8^GCniI{8rBZ(uC{+9Qz> z6imyg)T}r5KG`PPhSzS|f`k#+|Mq7p5l;$Oco(gJRcc$n1HZ!?BZI#d!J#@%50!#f zBpvkp!yIP4q<5biQF;eZua7YP9CjGZVWMWAUZ@XP(}mbKl?JVF&H@~HQNpOA@eV+^SKVDYjo%sPxwLO>q~${(Ar-41zMR86 zHf^#ph#Ny#DDRHgIzeD?iQ_Bfq=b3Sftr+II0kSQPRicf#Vxy+*p3imvBL>YtPSc< zU>mDC48Lvx$m#|NQ1s!(k(+-IS1@h5|bn8@JGZI71V Hy#D=PHok8I diff --git a/archive-from-repo/exploratory_health_figs.R b/archive-from-repo/exploratory_health_figs.R deleted file mode 100644 index f78022e..0000000 --- a/archive-from-repo/exploratory_health_figs.R +++ /dev/null @@ -1,50 +0,0 @@ -# setwd("G://Shared drives/emlab/projects/current-projects/calepa-cn/outputs/refining-2024/health") -setwd("H://Shared drives/emlab/projects/current-projects/calepa-cn/outputs/refining-2024/health") - -mort <- fread("refining_mortality_2023.csv", stringsAsFactors = F) - -## pop-weighted pollution exposure - -mort %>% - group_by(disadvantaged, year) %>% - mutate(weight = pop / sum(pop, na.rm = F)) %>% - ungroup() %>% - group_by(scen_id, disadvantaged, year) %>% - summarise(per_cap = sum(total_pm25 * weight, na.rm = T)) %>% - ungroup() %>% - ggplot(aes(x = year, y = per_cap, group = disadvantaged, color = disadvantaged)) + - facet_wrap(~scen_id) + - geom_line() + - geom_point() + - theme_cowplot() + - labs(y = "PM2.5 (pop-weighted)", color = "DAC") - -## pop-weighted health cost per cap - -mort %>% - mutate(per_cap = cost_2019_PV / pop) %>% - group_by(scen_id, disadvantaged, year) %>% - summarise(per_cap = mean(per_cap, na.rm = T)) %>% - ungroup() %>% - ggplot(aes(x = year, y = per_cap, group = disadvantaged, color = disadvantaged)) + - facet_wrap(~scen_id) + - geom_line() + - geom_point() + - theme_cowplot() + - labs(y = "NPV per cap (unweighted)", color = "DAC") - -## pop-unweighted health cost per cap - -mort %>% - group_by(disadvantaged, year, scen_id) %>% - summarize( - cost_2019_PV = sum(cost_2019_PV, na.rm = F), - pop = sum(pop, na.rm = F) - ) %>% - ungroup() %>% - ggplot(aes(x = year, y = cost_2019_PV / pop, group = disadvantaged, color = disadvantaged)) + - facet_wrap(~scen_id) + - geom_line() + - geom_point() + - theme_cowplot() + - labs(y = "NPV per cap (pop-weighted)", color = "DAC") diff --git a/archive-from-repo/health_results.R b/archive-from-repo/health_results.R deleted file mode 100644 index 9fd66fc..0000000 --- a/archive-from-repo/health_results.R +++ /dev/null @@ -1,157 +0,0 @@ -# CalEPA: Summary stats from health results -# vincent.thivierge@uottawa.ca -# created: 07/08/2025 -# updated: 07/08/2025 - -# set up environment - -rm(list = ls()) -`%notin%` <- Negate(`%in%`) -gc() - -options(scipen = 999) - -## Packages - -packages <- c( - "data.table", "dplyr", "janitor", "stringr", "ggplot2", "cowplot", - "forcats", "readxl", "forcats", "tidyr" -) - -for (i in packages) { - if (require(i, character.only = TRUE) == FALSE) { - install.packages(i, repos = "http://cran.us.r-project.org") - } else { - require(i, character.only = TRUE) - } -} - -## Directory - -wd <- c("C:\\git\\ca-refining\\outputs\\rev-submission\\cuf=0.6_beta-scenario=main\\tables\\health") #Vincent's WD -setwd(wd) -getwd() - -## State-wide mortality results - -fread("./cumulative_avoided_mortality.csv", stringsAsFactors = F)%>% - filter(demo_cat%in%"DAC")%>% - group_by(scen_id)%>% - summarise(cumul_mort_level = sum(cumul_mort_level))%>% - ungroup()%>% - mutate(diff = cumul_mort_level[scen_id == "BAU historic production"]-cumul_mort_level, - percent = (cumul_mort_level/cumul_mort_level[scen_id == "BAU historic production"])-1) - -## State-wide monetized mortality results - -fread("./cumulative_health_x_county.csv", stringsAsFactors = F)%>% - filter(demo_cat%in%"DAC")%>% - group_by(scen_id)%>% - summarise(mortality_pv = sum(mortality_pv_dem)/1000000000)%>% - ungroup()%>% - mutate(diff_pv = mortality_pv[scen_id == "BAU historic production"]-mortality_pv) - - -## State-wide monetized mortality by county (new results) - -fread("./cumulative_health_x_county.csv", stringsAsFactors = F)%>% - filter(demo_cat%in%"DAC")%>% - filter(scen_id %in% c("BAU historic production","LC1 low exports"))%>% - group_by(scen_id,NAME)%>% - summarize(mortality_pv_dem = sum(mortality_pv_dem))%>% - ungroup()%>% - group_by(scen_id)%>% - mutate(mortality_pv = sum(mortality_pv_dem))%>% - ungroup()%>% - mutate(diff_pv_state = mortality_pv[scen_id == "BAU historic production"]-mortality_pv, - diff_pv = mortality_pv_dem[scen_id == "BAU historic production"]-mortality_pv_dem)%>% - mutate(share_pv = (diff_pv/diff_pv_state))%>% - #filter(scen_id %in% c("LC1 low exports"))%>% - arrange(-share_pv) - -## By demographic - -fig5 <- fread("C:\\git\\ca-refining\\outputs\\rev-submission\\cuf=0.6_beta-scenario=main\\results\\figures\\figure-5\\state_disaggregated_npv_pc_fig_inputs.csv", - stringsAsFactors = F) - -fread("C:\\git\\ca-refining\\outputs\\rev-submission\\cuf=0.6_beta-scenario=main\\results\\figures\\figure-5\\state_disaggregated_npv_pc_fig_inputs.csv", - stringsAsFactors = F)%>% - filter(scen_id %in% c("BAU historical production","LC1 low exports") & demo_cat %in% "DAC" & segment %in% "health") - -## Sensitivity analyses - -#Refinery-level -fread("./state_npv_fig_inputs_health_ref.csv", stringsAsFactors = F)%>% - filter(unit_desc %in% "USD billion (2019 VSL)")%>% - #filter(scen_id %in% c("BAU historical production","LC1 low exports") & unit_desc %in% "USD billion (2019 VSL)")%>% - select(scen_id,value)%>% - distinct() - -#Growing age-based VSL -fread("C:\\git\\ca-refining\\outputs\\rev-submission\\cuf=0.6_beta-scenario=main\\results\\figures\\figure-3\\state_npv_fig_inputs_health.csv", - stringsAsFactors = F)%>% - filter(scen_id %in% c("BAU historical production","LC1 low exports") & unit_desc %in% "USD billion (annual VSL)") - -#Constant VSL -fread("./state_npv_fig_inputs_health_non_age_vsl.csv", stringsAsFactors = F)%>% - filter(scen_id %in% c("BAU historical production","LC1 low exports") & unit_desc %in% "USD billion (2019 VSL)") - -######################################################################################################################## -############# DEBUGGGING ######################################################################################################################## -######################################################################################################################## - - -fread("./cumulative_health_x_county.csv", stringsAsFactors = F)%>% - filter(demo_cat%in%"DAC")%>% - filter(scen_id %in% c("BAU historic production","LC1 low exports"))%>% - group_by(scen_id,NAME)%>% - summarize(mortality_pv_dem = sum(mortality_pv_dem), - mortality_level_dem = sum(mortality_level_dem))%>% - ungroup()%>% - group_by(scen_id)%>% - mutate(mortality_pv = sum(mortality_pv_dem))%>% - ungroup()%>% - mutate(diff_pv_state = mortality_pv[scen_id == "BAU historic production"]-mortality_pv, - diff_pv = mortality_pv_dem[scen_id == "BAU historic production"]-mortality_pv_dem)%>% - mutate(share_pv = (diff_pv/diff_pv_state))%>% - #filter(scen_id %in% c("LC1 low exports"))%>% - arrange(-share_pv)%>% - filter(NAME %in% c("Solano","San Bernardino")) - - -## State-wide monetized mortality by county (old results) - -fread("C:/Users/vince/Desktop/cumulative_health_x_county.csv", stringsAsFactors = F)%>% - filter(demo_cat%in%"DAC")%>% - filter(scen_id %in% c("BAU historic production","LC1 low exports"))%>% - group_by(scen_id,NAME)%>% - summarize(mortality_pv_dem = sum(mortality_pv_dem), - mortality_level_dem = sum(mortality_level_dem))%>% - ungroup()%>% - group_by(scen_id)%>% - mutate(mortality_pv = sum(mortality_pv_dem))%>% - ungroup()%>% - mutate(diff_pv_state = mortality_pv[scen_id == "BAU historic production"]-mortality_pv, - diff_pv = mortality_pv_dem[scen_id == "BAU historic production"]-mortality_pv_dem)%>% - mutate(share_pv = (diff_pv/diff_pv_state))%>% - #filter(scen_id %in% c("LC1 low exports"))%>% - arrange(-share_pv) - -fread("C:/Users/vince/Desktop/cumulative_health_x_county.csv", stringsAsFactors = F)%>% - filter(demo_cat%in%"DAC")%>% - filter(scen_id %in% c("BAU historic production","LC1 low exports"))%>% - group_by(scen_id,NAME)%>% - summarize(mortality_pv_dem = sum(mortality_pv_dem), - mortality_level_dem = sum(mortality_level_dem))%>% - ungroup()%>% - group_by(scen_id)%>% - mutate(mortality_pv = sum(mortality_pv_dem))%>% - ungroup()%>% - mutate(diff_pv_state = mortality_pv[scen_id == "BAU historic production"]-mortality_pv, - diff_pv = mortality_pv_dem[scen_id == "BAU historic production"]-mortality_pv_dem)%>% - mutate(share_pv = (diff_pv/diff_pv_state))%>% - #filter(scen_id %in% c("LC1 low exports"))%>% - arrange(-share_pv)%>% - filter(NAME %in% c("Solano","San Bernardino")) - - diff --git a/archive-from-repo/labor_check.R b/archive-from-repo/labor_check.R deleted file mode 100644 index 9fdf384..0000000 --- a/archive-from-repo/labor_check.R +++ /dev/null @@ -1,424 +0,0 @@ -###### CHECK LABOR OUTPUTS - -rm(list = ls()) - -list.of.packages <- c("dplyr", "data.table", "lubridate", "tidyr", "readxl", "fixest", "modelsummary", "flextable") -new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[, "Package"])] -if (length(new.packages)) install.packages(new.packages) - -library(lubridate) -library(tidyr) -library(dplyr) -library(data.table) -library(readxl) -library(stringr) -library(readr) -library(fixest) -library(modelsummary) -library(flextable) -library(svglite) -library(sf) -library(ggplot2) -library(tigris) -library(cowplot) -library(janitor) - - -# setwd('C:/Users/mall0065/Dropbox/calepa/refining-labor') -setwd("~/Dropbox/calepa/refining-labor") - -### define function for "not in" -"%!in%" <- function(x, y) !("%in%"(x, y)) - -# Check that string doesn't match any non-letter -letters_only <- function(x) !grepl("[^A-Za-z*-]", x) - - -# READ IN LABOR MULTIPLIERS - -multipliers <- fread("20240605-census_regions-Detail Economic Indicators.csv") - -multipliers <- janitor::clean_names(multipliers) - -multipliers <- multipliers[, .( - employment = sum(employment), - emp_comp = sum(employee_compensation) -), .(origin_region, destination_region, impact_type)] - -multipliers[, impact_type := tolower(impact_type)] - -multipliers[, county := str_remove(origin_region, " County, CA Group")] - -setnames(multipliers, c("origin_region", "destination_region"), c("origin", "destination")) - -multipliers <- multipliers[, .(county, origin, destination, impact_type, employment, emp_comp)] - -str(multipliers) - -multipliers %>% - filter(destination == "Los Angeles County, CA") %>% - summary() - -multipliers %>% - filter(destination != "Los Angeles County, CA") %>% - summary() - -# READ IN LABOR IMPACTS - -df <- fread("labor_result_for_review (2).csv") -str(df) - -## CALCULATE DIFFERENCE FROM BAU AND AGGREGATE - -df.agg <- group_by( - df, - demand_scenario, refining_scenario, year -) %>% - summarize( - total_comp_usd19_h = sum(total_comp_usd19_h, na.rm = TRUE), - total_comp_usd19_l = sum(total_comp_usd19_l, na.rm = TRUE), - total_emp = sum(total_emp, na.rm = TRUE), - total_emp_revised = sum(total_emp_revised, na.rm = TRUE), - total_revenue = sum(total_revenue, na.rm = TRUE), - total_production_bbl = sum(total_production_bbl, na.rm = TRUE) - ) %>% - ungroup() -summary(df.agg$total_comp_usd19_h) -summary(df.agg$total_comp_usd19_l) -summary(df.agg$total_emp) -summary(df.agg$total_emp_revised) - - -df.bau <- filter( - df, - demand_scenario == "BAU" & refining_scenario == "historic production" -) %>% - group_by(demand_scenario, refining_scenario, year) %>% - summarize( - total_comp_usd19_h = sum(total_comp_usd19_h, na.rm = TRUE), - total_comp_usd19_l = sum(total_comp_usd19_l, na.rm = TRUE), - total_emp = sum(total_emp, na.rm = TRUE), - total_emp_revised = sum(total_emp_revised, na.rm = TRUE), - total_revenue = sum(total_revenue, na.rm = TRUE), - total_production_bbl = sum(total_production_bbl, na.rm = TRUE) - ) %>% - rename( - total_comp_usd19_h_bau = total_comp_usd19_h, - total_comp_usd19_l_bau = total_comp_usd19_l, - total_emp_bau = total_emp, - total_emp_revised_bau = total_emp_revised, - total_revenue_bau = total_revenue, - total_production_bbl_bau = total_production_bbl - ) %>% - ungroup() %>% - dplyr::select(-demand_scenario, -refining_scenario) - -df.county.bau <- filter( - df, - demand_scenario == "BAU" & refining_scenario == "historic production" -) %>% - group_by(demand_scenario, refining_scenario, year, destination) %>% - summarize( - total_comp_usd19_h = sum(total_comp_usd19_h, na.rm = TRUE), - total_comp_usd19_l = sum(total_comp_usd19_l, na.rm = TRUE), - total_emp = sum(total_emp, na.rm = TRUE), - total_emp_revised = sum(total_emp_revised, na.rm = TRUE), - total_revenue = sum(total_revenue, na.rm = TRUE), - total_production_bbl = sum(total_production_bbl, na.rm = TRUE) - ) %>% - rename( - total_comp_usd19_h_bau = total_comp_usd19_h, - total_comp_usd19_l_bau = total_comp_usd19_l, - total_emp_bau = total_emp, - total_emp_revised_bau = total_emp_revised, - total_revenue_bau = total_revenue, - total_production_bbl_bau = total_production_bbl - ) %>% - ungroup() %>% - dplyr::select(-demand_scenario, -refining_scenario) - - -df.agg <- left_join(df.agg, df.bau, by = c("year")) %>% - mutate( - total_comp_usd19_h = total_comp_usd19_h - total_comp_usd19_h_bau, - total_comp_usd19_l = total_comp_usd19_l - total_comp_usd19_l_bau, - total_emp = total_emp - total_emp_bau, - total_emp_revised = total_emp_revised - total_emp_revised_bau - ) - -summary(df.agg$total_comp_usd19_h) -summary(df.agg$total_comp_usd19_l) -summary(df.agg$total_emp) -summary(df.agg$total_emp_revised) -summary(df.agg$total_revenue) -summary(df.agg$total_production_bbl) - -df.county <- left_join(df, df.county.bau, by = c("destination", "year")) %>% - mutate( - total_comp_usd19_h = total_comp_usd19_h - total_comp_usd19_h_bau, - total_comp_usd19_l = total_comp_usd19_l - total_comp_usd19_l_bau, - total_emp = total_emp - total_emp_bau, - total_emp_revised = total_emp_revised - total_emp_revised_bau, - total_revenue_gap = total_revenue - total_revenue_bau, - total_production_bbl_gap = total_production_bbl - total_production_bbl_bau - ) - -### PATHWAYS - -#### FIG 1: COMPENSATION LOWER BOUND -fig1 <- filter( - df.agg, - demand_scenario == "LC1" & refining_scenario == "low exports" -) %>% - ggplot(aes(y = total_comp_usd19_l / 1000, x = year)) + - geom_line(size = 1, color = "#841617") + - theme_cowplot(12) + - scale_x_continuous(limits = c(2020, 2045)) + - # scale_y_continuous(limits = c(0,20)) + - labs(y = "Compensation (2019 USD)", x = "Year", color = "", linetype = "") + - theme( - panel.background = element_blank(), - legend.position = "top", legend.justification = "center", - panel.grid.major.y = element_line(color = "gray", size = 0.5), - panel.grid.major.x = element_blank(), - panel.grid.minor.x = element_blank(), - axis.text = element_text(size = 14), - axis.title = element_text(size = 14) - ) -fig1 - -#### FIG 2: COMPENSATION UPPER BOUND -fig2 <- filter( - df.agg, - demand_scenario == "LC1" & refining_scenario == "low exports" -) %>% - ggplot(aes(y = total_comp_usd19_h / 1000, x = year)) + - geom_line(size = 1, color = "#841617") + - theme_cowplot(12) + - scale_x_continuous(limits = c(2020, 2045)) + - # scale_y_continuous(limits = c(0,20)) + - labs(y = "Compensation (2019 USD)", x = "Year", color = "", linetype = "") + - theme( - panel.background = element_blank(), - legend.position = "top", legend.justification = "center", - panel.grid.major.y = element_line(color = "gray", size = 0.5), - panel.grid.major.x = element_blank(), - panel.grid.minor.x = element_blank(), - axis.text = element_text(size = 14), - axis.title = element_text(size = 14) - ) -fig2 - -#### FIG 3: FTE JOBS -fig3 <- filter( - df.agg, - demand_scenario == "LC1" & refining_scenario == "low exports" -) %>% - ggplot(aes(y = total_emp_revised / 1000, x = year)) + - geom_line(size = 1, color = "#841617") + - theme_cowplot(12) + - scale_x_continuous(limits = c(2020, 2045)) + - # scale_y_continuous(limits = c(-60,60)) + - labs(y = "Labor FTE Job-years (Thousands)", x = "Year", color = "", linetype = "") + - theme( - panel.background = element_blank(), - legend.position = "top", legend.justification = "center", - panel.grid.major.y = element_line(color = "gray", size = 0.5), - panel.grid.major.x = element_blank(), - panel.grid.minor.x = element_blank(), - axis.text = element_text(size = 14), - axis.title = element_text(size = 14) - ) -fig3 - - -## FIG 4: FTE JOBS BY COUNTY - -fig4 <- filter( - df.county, - demand_scenario == "LC1" & refining_scenario == "low exports" -) %>% - ggplot(aes(y = total_emp_revised / 1000, x = year, color = destination)) + - geom_line(size = 1, aes(color = destination)) + - theme_cowplot(12) + - scale_x_continuous(limits = c(2020, 2045)) + - # scale_y_continuous(limits = c(-60,60)) + - labs(y = "Labor FTE Job-years (Thousands)", x = "Year", color = "", linetype = "") + - theme( - panel.background = element_blank(), - legend.position = "top", legend.justification = "center", - panel.grid.major.y = element_line(color = "gray", size = 0.5), - panel.grid.major.x = element_blank(), - panel.grid.minor.x = element_blank(), - axis.text = element_text(size = 14), - axis.title = element_text(size = 14) - ) -fig4 - -ggsave("emp_check.png", fig4, width = 10, height = 5, units = "in", dpi = 300, bg = "white") - - -## FIG 5: Compensation BY COUNTY - -fig5 <- filter( - df.county, - demand_scenario == "LC1" & refining_scenario == "low exports" -) %>% - ggplot(aes(y = total_comp_usd19_l / 1000000, x = year, color = destination)) + - geom_line(size = 1, aes(color = destination)) + - theme_cowplot(12) + - scale_x_continuous(limits = c(2020, 2045)) + - # scale_y_continuous(limits = c(-60,60)) + - labs(y = "Compensation (Millions)", x = "Year", color = "", linetype = "") + - theme( - panel.background = element_blank(), - legend.position = "top", legend.justification = "center", - panel.grid.major.y = element_line(color = "gray", size = 0.5), - panel.grid.major.x = element_blank(), - panel.grid.minor.x = element_blank(), - axis.text = element_text(size = 14), - axis.title = element_text(size = 14) - ) -fig5 - -ggsave("comp_check.png", fig5, width = 10, height = 5, units = "in", dpi = 300, bg = "white") - - -#### FIG 6: COMPENSATION LOWER BOUND -fig6 <- filter( - df.county, - demand_scenario == "LC1" & refining_scenario == "low exports" & year > 2022 & destination == "Siskiyou County, CA" -) %>% - ggplot(aes(y = total_comp_usd19_l / 1000000, x = year)) + - geom_line(size = 1, color = "#841617") + - theme_cowplot(12) + - scale_x_continuous(limits = c(2020, 2045)) + - # scale_y_continuous(limits = c(0,20)) + - labs(y = "Compensation (2019 USD)", x = "Year", color = "", linetype = "") + - theme( - panel.background = element_blank(), - legend.position = "top", legend.justification = "center", - panel.grid.major.y = element_line(color = "gray", size = 0.5), - panel.grid.major.x = element_blank(), - panel.grid.minor.x = element_blank(), - axis.text = element_text(size = 14), - axis.title = element_text(size = 14) - ) -fig6 - -#### FIG 7: FTE JOBS -fig7 <- filter( - df.county, - demand_scenario == "LC1" & refining_scenario == "historic exports" -) %>% - ggplot(aes(y = total_emp_revised / 1000, x = year)) + - geom_line(size = 1, color = "#841617") + - theme_cowplot(12) + - scale_x_continuous(limits = c(2020, 2045)) + - # scale_y_continuous(limits = c(-60,60)) + - labs(y = "Labor FTE Job-years (Thousands)", x = "Year", color = "", linetype = "") + - theme( - panel.background = element_blank(), - legend.position = "top", legend.justification = "center", - panel.grid.major.y = element_line(color = "gray", size = 0.5), - panel.grid.major.x = element_blank(), - panel.grid.minor.x = element_blank(), - axis.text = element_text(size = 14), - axis.title = element_text(size = 14) - ) -fig7 - - -#### FIG 8: REVENUE -fig8 <- filter( - df.county, - demand_scenario == "LC1" & refining_scenario == "low exports" -) %>% - ggplot(aes(y = total_revenue_gap / 10^9, x = year, color = destination)) + - geom_line(size = 1, aes(color = destination)) + - theme_cowplot(12) + - scale_x_continuous(limits = c(2020, 2045)) + - # scale_y_continuous(limits = c(-60,60)) + - labs(y = "Revenue (Billions of Dollars, Difference with BAU)", x = "Year", color = "", linetype = "") + - theme( - panel.background = element_blank(), - legend.position = "top", legend.justification = "center", - panel.grid.major.y = element_line(color = "gray", size = 0.5), - panel.grid.major.x = element_blank(), - panel.grid.minor.x = element_blank(), - axis.text = element_text(size = 14), - axis.title = element_text(size = 14) - ) -fig8 - -ggsave("revenue_check.png", fig8, width = 10, height = 5, units = "in", dpi = 300, bg = "white") - -#### FIG 9: PRODUCTION GAP - -fig9 <- filter( - df.county, - demand_scenario == "LC1" & refining_scenario == "low exports" -) %>% - ggplot(aes(y = total_production_bbl_gap / 10^9, x = year, color = destination)) + - geom_line(size = 1, aes(color = destination)) + - theme_cowplot(12) + - scale_x_continuous(limits = c(2020, 2045)) + - # scale_y_continuous(limits = c(-60,60)) + - labs(y = "Total Production (Billions of Barrels, Difference with BAU)", x = "Year", color = "", linetype = "") + - theme( - panel.background = element_blank(), - legend.position = "top", legend.justification = "center", - panel.grid.major.y = element_line(color = "gray", size = 0.5), - panel.grid.major.x = element_blank(), - panel.grid.minor.x = element_blank(), - axis.text = element_text(size = 14), - axis.title = element_text(size = 14) - ) -fig9 - -#### FIG 10: PRODUCTION LEVEL -fig10 <- filter( - df.agg, - demand_scenario == "LC1" & refining_scenario == "historic exports" -) %>% - ggplot(aes(y = total_production_bbl_bau / 10^9, x = year)) + - geom_line(size = 1, color = "#841617") + - geom_line(aes(y = total_production_bbl / 10^9), size = 1, color = "blue") + - theme_cowplot(12) + - scale_x_continuous(limits = c(2020, 2045)) + - # scale_y_continuous(limits = c(0,20)) + - labs(y = "Production (Billions of Barrels)", x = "Year", color = "", linetype = "") + - theme( - panel.background = element_blank(), - legend.position = "top", legend.justification = "center", - panel.grid.major.y = element_line(color = "gray", size = 0.5), - panel.grid.major.x = element_blank(), - panel.grid.minor.x = element_blank(), - axis.text = element_text(size = 14), - axis.title = element_text(size = 14) - ) -fig10 - - -#### FIG 11: REVENUE GAP, JUST LA -fig11 <- filter( - df.county, - demand_scenario == "LC1" & refining_scenario == "low exports" & destination == "Los Angeles" -) %>% - ggplot(aes(y = total_revenue / 10^9, x = year)) + - geom_line(size = 1, color = "#841617") + - geom_line(aes(y = total_revenue_bau / 10^9), size = 1, color = "blue") + - theme_cowplot(12) + - scale_x_continuous(limits = c(2020, 2045)) + - # scale_y_continuous(limits = c(-60,60)) + - labs(y = "Revenue (Billions of Dollars)", x = "Year", color = "", linetype = "") + - theme( - panel.background = element_blank(), - legend.position = "top", legend.justification = "center", - panel.grid.major.y = element_line(color = "gray", size = 0.5), - panel.grid.major.x = element_blank(), - panel.grid.minor.x = element_blank(), - axis.text = element_text(size = 14), - axis.title = element_text(size = 14) - ) -fig11 diff --git a/archive-from-repo/labor_plots.R b/archive-from-repo/labor_plots.R deleted file mode 100644 index f11c33e..0000000 --- a/archive-from-repo/labor_plots.R +++ /dev/null @@ -1,184 +0,0 @@ -main_path <- "/Users/tracey/Library/CloudStorage/GoogleDrive-tmangin@ucsb.edu/Shared\ drives/emlab/projects/current-projects/calepa-cn/" - -tar_load(annual_labor) -tar_load(county_pop_ratios) - -labor_tmp <- annual_labor %>% - mutate(scenario = paste0(demand_scenario, "-", refining_scenario)) - - -ggplot(labor_tmp, aes(x = year, y = revenue / 1e9, color = county)) + - geom_line() + - facet_wrap(~scenario) + - labs( - x = NULL, - y = "Revenue (USD billion)", - color = NULL - ) + - theme_line - -## dac -## -------------------------------------------------------------- - -tar_load(ref_labor_demog_yr) - -dac_df <- copy(ref_labor_demog_yr) - -## change scenario names, factor -dac_df[, scenario := paste0(demand_scenario, " demand - ", refining_scenario)] -dac_df[, scenario := gsub("LC1.", "Low ", scenario)] - -## scenarios for filtering -remove_scen <- c("Low demand - historic production") - -## add scenario title -dac_df[, scenario_title := str_replace(scenario, " - ", "\n")] - -## refactor -dac_df$scenario_title <- factor(dac_df$scenario_title, levels = c( - "BAU demand\nhistoric production", - "BAU demand\nhistoric exports", - "BAU demand\nlow exports", - "Low demand\nhistoric exports", - "Low demand\nlow exports", - "Low demand\nhistoric production" -)) - - -## refactor -dac_df$scenario <- factor(dac_df$scenario, levels = c( - "BAU demand - historic production", - "BAU demand - historic exports", - "BAU demand - low exports", - "Low demand - historic exports", - "Low demand - low exports", - "Low demand - historic production" -)) - -dac_fig <- ggplot(dac_df %>% filter( - !scenario %in% remove_scen, - demo_cat == "DAC" -), aes(x = year, y = demo_emp / 1000, lty = title, color = county)) + - geom_line(linewidth = 0.8, alpha = 0.7) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = "Labor: FTE jobs (thousand)" - ) + - # ylim(c(0, 35)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - -ggsave( - plot = dac_fig, - device = "png", - filename = "dac_labor_levels.png", - path = paste0(main_path, "outputs/academic-out/refining/figures/2022-12-update/labor/"), - width = 12, - height = 4, - dpi = 600 -) - - - -## gaps -## ------------------------------------------------------------- - -dac_gaps_df <- copy(ref_labor_demog_yr) - -## change scenario names, factor -dac_gaps_df[, scenario := paste0(demand_scenario, " demand - ", refining_scenario)] -dac_gaps_df[, scenario := gsub("LC1.", "Low ", scenario)] - -## scenarios for filtering -remove_scen <- c("Low demand - historic production", "BAU demand - historic production") - -## refactor -dac_gaps_df[, scenario_title := scenario] -dac_gaps_df[, scenario_title := str_replace(scenario_title, " - ", "\n")] - -dac_gaps_df$scenario <- factor(dac_gaps_df$scenario, levels = c( - "BAU demand - historic production", - "BAU demand - historic exports", - "BAU demand - low exports", - "Low demand - historic exports", - "Low demand - low exports", - "Low demand - historic production" -)) - -dac_gaps_df$scenario_title <- factor(dac_gaps_df$scenario_title, levels = c( - "BAU demand\nhistoric production", - "BAU demand\nhistoric exports", - "BAU demand\nlow exports", - "Low demand\nhistoric exports", - "Low demand\nlow exports", - "Low demand\nhistoric production" -)) -## filter for dac -dac_gaps_df <- dac_gaps_df[demo_cat == "DAC"] - - -## calculate gaps (BAU - scenario) -dac_bau_gaps_df <- dac_gaps_df[scenario == "BAU demand - historic production"] -dac_bau_gaps_df <- dac_bau_gaps_df[, c("county", "year", "demo_cat", "demo_group", "title", "demo_emp")] -setnames(dac_bau_gaps_df, "demo_emp", "bau_demo_emp") - -dac_gaps_df <- merge(dac_gaps_df, dac_bau_gaps_df, - by = c("county", "year", "demo_cat", "demo_group", "title"), - all.x = T -) - -dac_gaps_df[, gap := demo_emp - bau_demo_emp] - -## fig -dac_gap_fig_b <- ggplot(dac_gaps_df %>% filter( - !scenario %in% remove_scen, - demo_cat == "DAC" -), aes(x = year, y = gap / 1000, lty = title, color = county)) + - geom_line(linewidth = 0.8, alpha = 0.7) + - geom_hline(yintercept = 0, color = "darkgray", linewidth = 0.5) + - facet_grid(demo_cat ~ scenario_title) + - labs( - x = NULL, - y = "Labor: FTE jobs difference from reference (thousand)" - ) + - # ylim(c(-0.31, 0)) + - scale_x_continuous( - breaks = c(2020, 2045), # Specify tick mark positions - labels = c(2020, 2045) - ) + # Specify tick mark labels - theme_line + - theme( - legend.position = "bottom", - legend.title = element_blank(), - axis.text.x = element_text(vjust = 0.5, hjust = 0.5), - # strip.text.x = element_blank(), - plot.margin = unit(c(0, 0, 0, 0), "cm"), - # axis.text.x = element_blank(), - axis.ticks.length.y = unit(0.1, "cm"), - axis.ticks.length.x = unit(0.1, "cm") - ) - -ggsave( - plot = dac_gap_fig_b, - device = "png", - filename = "dac_labor_gaps.png", - path = paste0(main_path, "outputs/academic-out/refining/figures/2022-12-update/labor/"), - width = 12, - height = 4, - dpi = 600 -) diff --git a/archive-from-repo/labor_revisions_text_numbers.R b/archive-from-repo/labor_revisions_text_numbers.R deleted file mode 100644 index a0cbfcf..0000000 --- a/archive-from-repo/labor_revisions_text_numbers.R +++ /dev/null @@ -1,511 +0,0 @@ -###### NCOMMS REVISIONS--in-text numbers - -rm(list = ls()) - -list.of.packages <- c("dplyr", "data.table", "lubridate", "tidyr", "readxl", "fixest", "modelsummary", "flextable") -new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[, "Package"])] -if (length(new.packages)) install.packages(new.packages) - -library(lubridate) -library(tidyr) -library(dplyr) -library(data.table) -library(readxl) -library(stringr) -library(readr) -library(fixest) -library(modelsummary) -library(flextable) -library(svglite) -library(sf) -library(ggplot2) -library(tigris) -library(cowplot) -library(janitor) - -PATH.CM <- '~/Dropbox/ca-refining/outputs/rev-submission/cuf=0.6_beta-scenario=main/' -setwd(PATH.CM) - -### define function for "not in" -"%!in%" <- function(x, y) !("%in%"(x, y)) - -# Check that string doesn't match any non-letter -letters_only <- function(x) !grepl("[^A-Za-z*-]", x) - - -# Direct impacts: Figure 1 -df <- fread('./results/figures/figure-1/fig1_labor_inputs.csv') -str(df) - -filter(df, - demand_scenario=="BAU" & refining_scenario=="historic production" & oil_price_scenario=="reference case" & product_scenario=="2020 prices" & is.na(year)==FALSE) %>% - group_by() %>% - summarize(value = sum(value)/9130) - - -# Overall impact (direct + indirect + induced): Figure 3 -df <- fread('./intermediate/labor/state_annual_labor_outputs.csv') %>% - filter(product_scenario=="2020 prices" & indirect_induced_scenario=="bartik-corrected" & oil_price_scenario=="reference case") - -df %>% - filter((year==2020 | year==2045)) %>% - dplyr::select(demand_scenario,refining_scenario,product_scenario,indirect_induced_scenario,oil_price_scenario,year,empl_all_impacts_h,state_comp_PV_h) -# reference case emp reduced by 7,100, comp by 687 million - -# Total impacts relative to reference -bau <- filter(df, - demand_scenario=="BAU" & refining_scenario=="historic production") %>% - dplyr::select(year,emp_all_impacts_l,comp_all_impacts_PV_l,comp_all_impacts_PV_h,state_comp_PV_l,state_emp_l,state_comp_PV_h) %>% - rename(bau_emp_all_impacts_l = emp_all_impacts_l, - bau_comp_all_impacts_PV_l = comp_all_impacts_PV_l, - bau_state_comp_PV_l = state_comp_PV_l, - bau_state_comp_PV_h = state_comp_PV_h, - bau_state_emp_l = state_emp_l, - bau_comp_all_impacts_PV_h = comp_all_impacts_PV_h) - -left_join(df,bau,by=c("year")) %>% - mutate(emp_rel_l = emp_all_impacts_l - bau_emp_all_impacts_l, - comp_pv_rel_l = comp_all_impacts_PV_l - bau_comp_all_impacts_PV_l, - comp_pv_rel_h = comp_all_impacts_PV_h - bau_comp_all_impacts_PV_h, - dir_emp_rel_l = state_emp_l - bau_state_emp_l, - dir_comp_pv_rel_h = state_comp_PV_h-bau_state_comp_PV_h, - dir_comp_pv_rel_l = state_comp_PV_l-bau_state_comp_PV_l) %>% - dplyr::select(demand_scenario,refining_scenario,year,emp_all_impacts_l,bau_emp_all_impacts_l,emp_rel_l,empl_all_impacts_h,comp_all_impacts_PV_l,comp_all_impacts_PV_h,bau_comp_all_impacts_PV_l,comp_pv_rel_l,dir_emp_rel_l,dir_comp_pv_rel_l,dir_comp_pv_rel_h,comp_pv_rel_h) %>% - group_by(demand_scenario,refining_scenario) %>% - summarize(emp_rel_l = sum(emp_rel_l), - comp_pv_rel_l = sum(comp_pv_rel_l), - dir_emp_rel_l = sum(dir_emp_rel_l), - dir_comp_pv_rel_l = sum(dir_comp_pv_rel_l), - dir_comp_pv_rel_h = sum(dir_comp_pv_rel_h), - comp_pv_rel_h = sum(comp_pv_rel_h)) - -# Total cumulative NPV compensation losses in reference scenario -df %>% - filter(demand_scenario=="BAU" & refining_scenario=="historic production") %>% - mutate(f1.comp_all_impacts_PV_h = lag(comp_all_impacts_PV_h,n=1), - f1.comp_all_impacts_PV_h = ifelse(year==2020,0,f1.comp_all_impacts_PV_h), - level_comp_all_impacts_PV_l = f1.comp_all_impacts_PV_h+comp_all_impacts_PV_l, - f1.state_comp_PV_h = lag(state_comp_PV_h,n=1), - f1.state_comp_PV_h = ifelse(year==2020,0,f1.state_comp_PV_h), - level_state_comp_PV_l = f1.state_comp_PV_h+state_comp_PV_l) %>% - group_by() %>% - summarize(comp_all_impacts_PV_h = sum(comp_all_impacts_PV_h), - level_comp_all_impacts_PV_l = sum(level_comp_all_impacts_PV_l), - comp_all_impacts_PV_l = sum(comp_all_impacts_PV_l), - state_comp_PV_h = sum(state_comp_PV_h), - level_state_comp_PV_l = sum(level_state_comp_PV_l), - state_comp_PV_l = sum(state_comp_PV_l)) %>% - ungroup() - -rm(bau,df) - -# County-level numbers (direct impacts only) -df <- fread('./tables/labor/labor_county_outputs.csv') %>% - filter(product_scenario=="2020 prices" & oil_price_scenario=="reference case" & demo_cat=="DAC") - -str(df) - -bau <- filter(df, - demand_scenario=="BAU" & refining_scenario=="historic production") %>% - dplyr::select(demo_cat,demo_group,county,metric_name,estimate,value) %>% - rename(bau_value = value) - -df2 <- left_join(df,bau,by=c("demo_cat","demo_group","county","metric_name","estimate")) %>% - mutate(gap_value = value-bau_value) %>% - group_by(demand_scenario,refining_scenario,county,metric_name,estimate) %>% - summarize(gap_value = sum(gap_value)) - -ttl_impact <- group_by(df2, - demand_scenario,refining_scenario,metric_name,estimate) %>% - filter(gap_value < 0) %>% - summarize(ttl_value = sum(gap_value)) %>% - ungroup() - -df2 %>% - filter(gap_value<0) %>% - left_join(ttl_impact,by=c("demand_scenario","refining_scenario","metric_name","estimate")) %>% - mutate(share = gap_value/ttl_value) %>% - filter(metric_name=="compensation_pv" & estimate=="low" & demand_scenario=="LC1" & refining_scenario=="low exports") %>% - arrange(-share) %>% - print(n=57) - -# top 2 counties -0.479+0.125 -# next 8 counties -0.096+0.0841+0.0574+0.0359+0.0244+0.0194+0.0075+0.0067 -# remaining compensation losses -1-(0.479+0.125+0.096+0.0841+0.0574+0.0359+0.0244+0.0194+0.0075+0.0067) - - -# county-level results: share of direct compensation impact over total county compensation -## import IMPLAN zip code tables, sum compensation to county level - -load.implan.zip <- function(x){ - df <- fread(paste0("~/Dropbox/ou/ncomms-revisions/implan-zip/",x)) - names(df) <- make.names(names(df)) - separated.string <- str_split(x,"_") - - df <- dplyr::select(df, - Description,Employee.Compensation) %>% - filter(Description != "" & Description != "* Employment and payroll of federal govt, military" & Description != "* Employment and payroll of federal govt, non-military" & Description=="Petroleum refineries") %>% - mutate(zip = str_extract(separated.string[[1]][4],pat <- "(\\d)+"), - county = separated.string[[1]][3], - Employee.Compensation = as.numeric(str_remove_all(Employee.Compensation,"[$,]"))) %>% - group_by(county) %>% - summarize(ec_ttl = sum(Employee.Compensation,na.rm=TRUE)) %>% - ungroup() -} - -file.names <- list.files(path="~/Dropbox/ou/ncomms-revisions/implan-zip",pattern="*.csv") - -output <- lapply(file.names,load.implan.zip) %>% - bind_rows() %>% - group_by(county) %>% - summarize(ec_ttl = sum(ec_ttl,na.rm=TRUE)) %>% - ungroup() %>% - mutate(county = str_remove_all(county," County")) -summary(output$ec_ttl) - -output %>% - group_by() %>% - summarize(ec_ttl = sum(ec_ttl)) - -filter(df2, gap_value<0) %>% - filter(metric_name=="compensation_pv" & estimate=="low" & demand_scenario=="LC1" & refining_scenario=="low exports") %>% - left_join(output,by=c("county")) %>% - mutate(share = abs(gap_value)/ec_ttl) %>% - arrange(-share) %>% - print(n=57) - -rm(df,df2,ttl_impact,bau,output,file.names) - -# Demographic numbers - -## Figure 4 -df <- fread('./tables/labor/labor_high_low_annual_outputs.csv') -str(df) - -df <- filter(df, - product_scenario=="2020 prices" & oil_price_scenario=="reference case" & metric_name != "") - - - -### difference with bau -bau <- filter(df, - demand_scenario == "BAU" & refining_scenario=="historical production") %>% - rename(bau_value = value) %>% - dplyr::select(demo_cat,demo_group,metric_name,estimate,bau_value,year) - -df_pmil <- filter(df, - scenario != "BAU demand - historical production") %>% - left_join(bau, by=c("demo_cat","demo_group","metric_name","estimate","year")) %>% - mutate(gap_value = value-bau_value) %>% - group_by(demand_scenario,refining_scenario,demo_cat,demo_group,metric_name,estimate) %>% - summarize(min_value = min(gap_value), - max_value = max(gap_value), - gap_value = sum(gap_value)) %>% - ungroup() %>% - filter(metric_name == "employment_pmil" & estimate=="high" & demo_cat=="Race") -print(df_pmil,n=60) - - -# test difference in overall outputs -df2 <- fread('~/Downloads/labor_high_low_annual_outputs(1).csv') %>% - filter(product_scenario=="2020 prices" & oil_price_scenario=="reference case" & metric_name != "") - -test <- left_join(df,df2,by=c("demo_cat","demo_group","scenario","demand_scenario","refining_scenario","product_scenario","oil_price_scenario","year","metric_name","estimate")) %>% - mutate(gap = value-value_temp) %>% - filter(estimate=="low" & metric_name=="employment_pmil") -summary(test$gap) - -bau2 <- filter(df2, - demand_scenario == "BAU" & refining_scenario=="historical production") %>% - rename(bau_value = value) %>% - dplyr::select(demo_cat,demo_group,metric_name,estimate,bau_value,year) - -df_pmil2 <- filter(df2, - scenario != "BAU demand - historical production") %>% - left_join(bau2, by=c("demo_cat","demo_group","metric_name","estimate","year")) %>% - mutate(gap_value = value-bau_value) %>% - group_by(demand_scenario,refining_scenario,demo_cat,demo_group,metric_name,estimate) %>% - summarize(min_value = min(gap_value), - max_value = max(gap_value), - gap_value = sum(gap_value)) %>% - ungroup() %>% - filter(metric_name == "employment_pmil" & estimate=="high" & demo_cat=="Race") -print(df_pmil2,n=60) - - -temp <- left_join(df_pmil,df_pmil2,by=c("demand_scenario","refining_scenario","demo_cat","demo_group","metric_name","estimate")) %>% - mutate(gap = gap_value.x-gap_value.y, - share.x = gap/gap_value.x, - share.y = gap/gap_value.y) -summary(temp$gap) -summary(temp$share.x) -summary(temp$share.y) - -rm(df_pmil) - -## figure 5: NPV per capita for each scenario -df_npvpc <- filter(df, - scenario != "BAU demand - historical production") %>% - left_join(bau, by=c("demo_cat","demo_group","metric_name","estimate","year")) %>% - mutate(gap_value = value-bau_value) %>% - group_by(demand_scenario,refining_scenario,demo_cat,demo_group,metric_name,estimate) %>% - summarize(gap_value = sum(gap_value)) %>% - ungroup() %>% - filter(metric_name == "compensation_pv_pc" & estimate=="low" & demo_cat=="DAC") -print(df_npvpc,n=60) - -## check difference with 2019 commuting patterns -df_npvpc2 <- filter(df2, - scenario != "BAU demand - historical production") %>% - left_join(bau, by=c("demo_cat","demo_group","metric_name","estimate","year")) %>% - mutate(gap_value = value-bau_value) %>% - group_by(demand_scenario,refining_scenario,demo_cat,demo_group,metric_name,estimate) %>% - summarize(gap_value = sum(gap_value)) %>% - ungroup() %>% - filter(metric_name == "compensation_pv_pc" & estimate=="low" & demo_cat=="DAC") -print(df_npvpc,n=60) - -temp <- left_join(df_npvpc,df_npvpc2,by=c("demand_scenario","refining_scenario","demo_cat","demo_group","metric_name","estimate")) %>% - mutate(gap = gap_value.x-gap_value.y, - share.x = gap/gap_value.x, - share.y = gap/gap_value.y) -summary(temp$gap) -summary(temp$share.x) -summary(temp$share.y) - - -# calculate impact share by demo_cat - -group_impact <- filter(df, - scenario != "BAU demand - historical production") %>% - left_join(bau, by=c("demo_cat","demo_group","metric_name","estimate","year")) %>% - mutate(gap_value = value-bau_value) %>% - group_by(demand_scenario,refining_scenario,demo_cat,demo_group,metric_name,estimate) %>% - summarize(gap_value = sum(gap_value)) %>% - ungroup() %>% - filter(metric_name == "compensation_pv" & estimate=="low") - -ttl_impact <- filter(group_impact, - demo_cat=="DAC") %>% - group_by(demand_scenario,refining_scenario,metric_name,estimate) %>% - summarize(ttl_gap_value = sum(gap_value)) %>% - ungroup() - -group_impact <- left_join(group_impact,ttl_impact,by=c("demand_scenario","refining_scenario","metric_name","estimate")) %>% - mutate(share = gap_value/ttl_gap_value) -print(group_impact,n=60) - -rm(group_impact,ttl_impact,df_npvpc,df_pmil) - -# check the increase in job years relative to reference for non-DAC, above-poverty line, white hispanic and asian - -df_emp <- filter(df, - scenario != "BAU demand - historical production") %>% - left_join(bau, by=c("demo_cat","demo_group","metric_name","estimate","year")) %>% - mutate(gap_value = value-bau_value) %>% - filter(year <= 2026 & metric_name=="employment" & estimate=="high") - -df_product <- fread('~/Downloads/indiv_prod_output.csv') %>% - filter(year>=2020 & year<=2026 & demand_scenario=="BAU" & refining_scenario=="historic production") %>% - group_by(demand_scenario,refining_scenario,site_id,refinery_name,year) %>% - summarize(value = sum(value)) %>% - mutate(prev_value = lag(value,n=1), - delta_value = value - prev_value) %>% - #filter(delta_value > 0) %>% - ungroup() -str(df_product) -unique(df_product$refinery_name) - - -# check the relative reduction in compensation for low vs high estimate -df <- fread('./results/figures/figure-3/state_npv_fig_inputs_labor.csv') %>% - filter(metric=="forgone_wages_bil" & indirect_induced_scenario=="bartik-corrected" & product_scenario=="2020 prices") -print(df1) - - - - - - - - - - - - - - - - - - - - -# Import disaggregated results by year, demo group, state -#df <- fread('./results/figures/figure-4/state_labor_levels_fig_gaps_pmil_inputs.csv') - -df <- fread('./intermediate/labor/state_annual_labor_outputs.csv') -df <- fread('~/Downloads/state_annual_labor_outputs(1).csv') - -str(df) - -filter(df, - product_scenario=="2020 prices" & oil_price_scenario=="reference case" & (metric_name=="compensation_pv" | metric_name=="employment") & estimate=="low" & demo_cat=="DAC") %>% - group_by(demand_scenario,refining_scenario,metric_name) %>% - summarize(value = sum(value)) %>% - mutate(value = ifelse(metric_name=="compensation_pv", value - 1143228362, value - 9841)) - -df2 <- filter(df, - product_scenario=="2020 prices" & indirect_induced_scenario=="bartik-corrected" & oil_price_scenario=="reference case") - -# direct impacts in 2020--figure 1 -filter(df2, year==2020 & demand_scenario=="BAU" & refining_scenario=="historic production") %>% - dplyr::select(state_comp_PV_l,state_emp_h) - -# total impacts in 2020 -filter(df2, year==2020 & demand_scenario=="BAU" & refining_scenario=="historic production") %>% - dplyr::select(comp_all_impacts_PV_l,empl_all_impacts_h) - -# cumulative job losses in each scenario between 2020-2045 -filter(df2, (year==2045 | year==2020)) %>% - dplyr::select(demand_scenario,refining_scenario,year,comp_all_impacts_PV_h,empl_all_impacts_h) - -# cumulative impacts relative to reference -## actual figure inputs -test <- fread('./results/figures/figure-3/state_npv_fig_inputs_labor.csv') - -bau <- filter(df2, - product_scenario=="2020 prices" & indirect_induced_scenario=="bartik-corrected" & oil_price_scenario=="reference case" & demand_scenario=="BAU" & refining_scenario=="historic production") %>% - dplyr::select(year,emp_all_impacts_l,comp_all_impacts_PV_l) %>% - rename(bau_emp_all_impacts_l = emp_all_impacts_l, - bau_comp_all_impacts_PV_l = comp_all_impacts_PV_l) - -df3 <- left_join(df2,bau,by=c("year")) %>% - mutate(emp_rel_l = emp_all_impacts_l - bau_emp_all_impacts_l, - comp_pv_rel_l = comp_all_impacts_PV_l - bau_comp_all_impacts_PV_l) %>% - dplyr::select(demand_scenario,refining_scenario,year,emp_all_impacts_l,bau_emp_all_impacts_l,emp_rel_l,empl_all_impacts_h,comp_all_impacts_PV_l,comp_all_impacts_PV_h,bau_comp_all_impacts_PV_l,comp_pv_rel_l) %>% - group_by(demand_scenario,refining_scenario) %>% - summarize(emp_rel_l = sum(emp_rel_l), - comp_pv_rel_l = sum(comp_pv_rel_l)) - - -df4 <- fread('~/Downloads/state_labor_levels_fig_gaps_pmil_inputs_old.csv') %>% - filter(product_scenario=="2020 prices" & oil_price_scenario=="reference case" & demo_cat=="DAC") %>% - group_by(demand_scenario,refining_scenario) %>% - summarize(sum_demo_comp_pv_l = sum(sum_demo_comp_pv_l), - sum_demo_comp_pv_h = sum(sum_demo_comp_pv_h), - sum_demo_emp_revised = sum(sum_demo_emp_revised), - sum_demo_emp = sum(sum_demo_emp)) %>% - ungroup() -str(df4) - -df5 <- fread('~/Downloads/state_labor_levels_fig_gaps_pmil_inputs_new.csv') %>% - filter(product_scenario=="2020 prices" & oil_price_scenario=="reference case" & demo_cat=="DAC") %>% - group_by(demand_scenario,refining_scenario) %>% - summarize(gap_emp = sum(gap_emp), - sum_demo_comp_pv_l = sum(sum_demo_comp_pv_l), - sum_demo_comp_pv_h = sum(sum_demo_comp_pv_h), - sum_demo_emp_revised = sum(sum_demo_emp_revised), - sum_demo_emp = sum(sum_demo_emp)) %>% - ungroup() -str(df5) - -df6 <- fread('~/Downloads/state_levels_labor_pmil_fig_inputs.csv') %>% - filter(product_scenario=="2020 prices" & oil_price_scenario=="reference case" & demo_cat=="DAC") %>% - group_by(demand_scenario,refining_scenario) %>% - summarize(#gap_emp = sum(gap_emp), - sum_demo_comp_pv_l = sum(sum_demo_comp_pv_l), - sum_demo_comp_pv_h = sum(sum_demo_comp_pv_h), - #sum_demo_emp_revised = sum(sum_demo_emp_revised), - sum_demo_emp = sum(sum_demo_emp)) %>% - ungroup() -str(df6) - - - - - - - - -# filter to 2020 prices, low estimates, 2019 pv, labor only -df <- filter(df, - segment=="labor" & metric != "forgone_wages_h" & product_scenario=="2020 prices") %>% - group_by(demand_scenario,refining_scenario,metric,demo_cat) %>% - summarize(value = sum(value)) %>% - ungroup() -print(df,n=40) - -# intermediate file for debugging -t1 <- fread('~/Downloads/step_8_output_for_review.csv') -str(t1) -unique(is.na(t1$state_comp_all_impacts_l)) -test2 <- filter(t1, is.na(state_comp_emp_li)==TRUE & year != 2020 & oil_price_scenario=="reference case" & product_scenario=="2020 prices") - -t2 <- fread('~/Downloads/step_8_output_for_review (5).csv') -test3 <- filter(t2, - indirect_induced_scenario=="bartik-corrected" & product_scenario=="2020 prices" & oil_price_scenario=="reference case" & demand_scenario=="BAU" & refining_scenario=="historic exports") -# -# df <- filter(df,segment=="health") %>% -# group_by(demand_scenario,refining_scenario,metric,demo_cat) %>% -# summarize(value = sum(value)) %>% -# ungroup() -# - -# # - - - -df <- filter(df, - product_scenario=="2020 prices" & oil_price_scenario=="reference case" & (metric_name == "compensation_pv" | metric_name=="employment")) %>% - group_by(demand_scenario,refining_scenario,demo_cat,metric_name,estimate,year) %>% - summarize(value = sum(value)) %>% - ungroup() - -bau <- filter(df, - demand_scenario == "BAU" & refining_scenario=="historical production") %>% - rename(bau_value = value) %>% - dplyr::select(-demand_scenario, -refining_scenario) - -pop_df <- read_excel('~/Downloads/Intercensal_Excel_California.xlsx', - sheet="California-State") %>% - dplyr::select(Sex,`Race/ethnicity recode`,`Age (0-100+)`, `July 1, 2019`) -names(pop_df) <- make_clean_names(names(pop_df)) - -pop_df <- group_by(pop_df, - race_ethnicity_recode) %>% - summarize(pop = sum(july_1_2019)) %>% - ungroup() -pop_df - -pop_white <- pop_df$pop[7] -pop_black <- pop_df$pop[3] -pop_am_ind <- pop_df$pop[1] -pop_asian <- pop_df$pop[2] -pop_aapi <- pop_df$pop[6] -pop_more2 <- pop_df$pop[5] -pop_hispanic <- pop_df$pop[4] - -df <- filter(df, - demand_scenario != "BAU" & refining_scenario != "historical production") %>% - left_join(bau, by=c("demo_cat","metric_name","estimate","year")) %>% - mutate(gap_value = value - bau_value) %>% - group_by(demand_scenario,refining_scenario,demo_cat,metric_name,estimate) %>% - summarize(gap_value = sum(gap_value)) %>% - ungroup() %>% - mutate(white = (0.53*gap_value)/pop_white, - black = (0.07*gap_value)/pop_black, - am_ind = (0.002*gap_value)/pop_am_ind, - asian = (0.12*gap_value)/pop_asian, - aapi = (0.006*gap_value)/pop_aapi, - more_2 = (0.02*gap_value)/pop_more2, - hispanic = (0.25*gap_value)/pop_hispanic) -print(df,n=30) - - - - - diff --git a/archive-from-repo/labor_text_numbers.R b/archive-from-repo/labor_text_numbers.R deleted file mode 100644 index 4de8954..0000000 --- a/archive-from-repo/labor_text_numbers.R +++ /dev/null @@ -1,434 +0,0 @@ -###### CHECK LABOR OUTPUTS - -rm(list = ls()) - -list.of.packages <- c("dplyr", "data.table", "lubridate", "tidyr", "readxl", "fixest", "modelsummary", "flextable") -new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[, "Package"])] -if (length(new.packages)) install.packages(new.packages) - -library(lubridate) -library(tidyr) -library(dplyr) -library(data.table) -library(readxl) -library(stringr) -library(readr) -library(fixest) -library(modelsummary) -library(flextable) -library(svglite) -library(sf) -library(ggplot2) -library(tigris) -library(cowplot) -library(janitor) - - -# setwd('G:/Shared drives/emlab/projects/current-projects/calepa-cn/outputs/academic-out/refining/figures') -setwd("~/Library/CloudStorage/GoogleDrive-cmalloy@ucsb.edu/Shared drives/emlab/projects/current-projects/calepa-cn/outputs/academic-out/refining/figures") - -### define function for "not in" -"%!in%" <- function(x, y) !("%in%"(x, y)) - -# Check that string doesn't match any non-letter -letters_only <- function(x) !grepl("[^A-Za-z*-]", x) - -# IMPORT DISAGGREGATED RESULTS - -df <- fread("2024-08-update/fig-csv-files/labor_high_low_annual_outputs.csv") -str(df) -summary(df$sum_demo_emp) -summary(df$sum_demo_emp_revised) - -# IMPORT COUNTY LEVEL RESULTS - -df.county <- fread("2024-08-update/fig-csv-files/labor_county_outputs.csv") %>% - filter(oil_price_scenario == "reference case") -str(df.county) - -# CALCULATE PERCENT REDUCTION RELATIVE TO BAU - -## AGGREGATE IMPACTS ACROSS DEMOGRAPHIC GROUPS AND YEARS, SELECT 1 DEMOGRAPHIC CATEGORY SO IMPACTS ARENT DUPLICATED -df <- pivot_wider(df, - id_cols = c("scenario", "demo_cat", "demo_group", "demand_scenario", "refining_scenario", "oil_price_scenario", "year"), - names_from = c("metric_name", "estimate"), - values_from = value -) %>% - filter(oil_price_scenario == "reference case") -str(df) - -df.agg <- filter( - df, - demo_cat == "DAC" -) %>% - group_by(scenario, year) %>% - summarize( - sum_demo_emp = sum(employment_high), - sum_demo_emp_revised = sum(employment_low), - sum_demo_comp_pv_h = sum(compensation_pv_high), - sum_demo_comp_pv_l = sum(compensation_pv_low) - ) %>% - ungroup() - -## SUBTRACT BAU FROM SCENARIO IMPACT AND DIVIDE BY BAU FOR PERCENT REDUCTION - -df.lc1 <- filter( - df.agg, - scenario == "Low demand - low exports" -) - -df.bau <- filter( - df.agg, - scenario == "BAU demand - historical production" -) %>% - rename( - sum_demo_emp_bau = sum_demo_emp, - sum_demo_emp_revised_bau = sum_demo_emp_revised, - sum_demo_comp_pv_h_bau = sum_demo_comp_pv_h, - sum_demo_comp_pv_l_bau = sum_demo_comp_pv_l - ) %>% - dplyr::select(-scenario) - -df.agg <- filter( - df.agg, - scenario != "BAU demand - historical production" -) %>% - left_join(df.bau, by = "year") %>% - group_by(scenario) %>% - summarize( - sum_demo_emp = sum(sum_demo_emp), - sum_demo_emp_revised = sum(sum_demo_emp_revised), - sum_demo_comp_pv_h = sum(sum_demo_comp_pv_h), - sum_demo_comp_pv_l = sum(sum_demo_comp_pv_l), - sum_demo_emp_bau = sum(sum_demo_emp_bau), - sum_demo_emp_revised_bau = sum(sum_demo_emp_revised_bau), - sum_demo_comp_pv_h_bau = sum(sum_demo_comp_pv_h_bau), - sum_demo_comp_pv_l_bau = sum(sum_demo_comp_pv_l_bau) - ) %>% - ungroup() %>% - mutate( - perc_emp = 1 - sum_demo_emp / sum_demo_emp_bau, - perc_emp_revised = 1 - sum_demo_emp_revised / sum_demo_emp_revised_bau, - perc_comp_h = 1 - sum_demo_comp_pv_h / sum_demo_comp_pv_h_bau, - perc_comp_l = 1 - sum_demo_comp_pv_l / sum_demo_comp_pv_l_bau, - gap_emp = sum_demo_emp - sum_demo_emp_bau, - gap_emp_revised = sum_demo_emp_revised - sum_demo_emp_revised_bau, - gap_comp_h = sum_demo_comp_pv_h - sum_demo_comp_pv_h_bau, - gap_comp_l = sum_demo_comp_pv_l - sum_demo_comp_pv_l_bau - ) - -summary(df.agg$perc_emp) -summary(df.agg$perc_emp_revised) -summary(df.agg$perc_comp_h) -summary(df.agg$perc_comp_l) - - -# CALCULATE SHARE OF TOTAL IMPACT FROM EACH COUNTY - -df.total <- group_by( - df.county, - demand_scenario, refining_scenario, metric_name, estimate -) %>% - summarize(total_value = sum(value)) %>% - ungroup() - - -df.county.agg <- group_by( - df.county, - county, demand_scenario, refining_scenario, metric_name, estimate -) %>% - summarize(value = sum(value)) %>% - ungroup() - -df.county.agg <- left_join(df.county.agg, df.total, by = c("demand_scenario", "refining_scenario", "metric_name", "estimate")) %>% - mutate(share = value / total_value) %>% - arrange(demand_scenario, refining_scenario, metric_name, estimate, -share) -summary(df.county.agg$share) - - -# CALCULATE SHARE OF IMPACT RELATIVE TO BAU FOR EACH COUNTY - -df.total.bau <- filter( - df.county, - demand_scenario == "BAU" & refining_scenario == "historic production" -) %>% - group_by(metric_name, estimate) %>% - summarize(total_value_bau = sum(value)) %>% - ungroup() - -df.total2 <- filter( - df.county, - demand_scenario != "BAU" & refining_scenario != "historic production" -) %>% - group_by(demand_scenario, refining_scenario, metric_name, estimate) %>% - summarize(total_value = sum(value)) %>% - ungroup() %>% - left_join(df.total.bau, by = c("metric_name", "estimate")) %>% - mutate(gap_total_value = total_value - total_value_bau) - - -df.county.agg.bau <- filter( - df.county, - demand_scenario == "BAU" & refining_scenario == "historic production" -) %>% - group_by(county, metric_name, estimate) %>% - summarize(value_bau = sum(value)) %>% - ungroup() - -df.county.agg2 <- filter( - df.county, - demand_scenario != "BAU" & refining_scenario != "historic production" -) %>% - group_by(county, demand_scenario, refining_scenario, metric_name, estimate) %>% - summarize(value = sum(value)) %>% - ungroup() %>% - left_join(df.county.agg.bau, by = c("county", "metric_name", "estimate")) %>% - mutate(gap_value = value - value_bau) %>% - left_join(df.total2, by = c("demand_scenario", "refining_scenario", "metric_name", "estimate")) %>% - mutate(share = gap_value / gap_total_value) %>% - arrange(demand_scenario, refining_scenario, metric_name, estimate, -share) - - - -# AVERAGE ANNUAL JOB LOSSES (DAN AND NON-DAC) SHOULD THIS BE ADJUSTED FOR FIRST FEW YRS? - -df.agg2 <- filter( - df, - demo_cat == "Poverty" -) %>% - group_by(scenario, year, demo_group) %>% - summarize( - sum_demo_emp = sum(employment_pc_high), - sum_demo_emp_revised = sum(employment_pc_low), - sum_demo_comp_pv_h = sum(compensation_pv_pc_high), - sum_demo_comp_pv_l = sum(compensation_pv_pc_low) - ) %>% - ungroup() - -df.bau2 <- filter( - df, - demo_cat == "Poverty" & - scenario == "BAU demand - historical production" -) %>% - group_by(year, demo_group) %>% - summarize( - sum_demo_emp_bau = sum(employment_pc_high), - sum_demo_emp_revised_bau = sum(employment_pc_low), - sum_demo_comp_pv_h_bau = sum(compensation_pv_pc_high), - sum_demo_comp_pv_l_bau = sum(compensation_pv_pc_low) - ) %>% - ungroup() - - - -# TREND IN EMPLOYMENT IMPACT DIFFERENCE BETWEEN DAC AND NON-DAC -df.year <- filter( - df.agg2, - scenario != "BAU demand - historical production" -) %>% - left_join(df.bau2, by = c("year", "demo_group")) %>% - mutate( - gap_emp = sum_demo_emp - sum_demo_emp_bau, - gap_emp_revised = sum_demo_emp_revised - sum_demo_emp_revised_bau, - gap_comp_h = sum_demo_comp_pv_h - sum_demo_comp_pv_h_bau, - gap_comp_l = sum_demo_comp_pv_l - sum_demo_comp_pv_l_bau - ) - - -fig1 <- filter(df.year, scenario == "Low demand - low exports") %>% - ggplot(aes(y = gap_emp, x = year, group = demo_group)) + - geom_line(aes(color = demo_group)) -fig1 - - -## COMPARE TO FIG 4 CSV FILE - -df.f4 <- fread("2022-12-update/fig-csv-files/state_labor_levels_fig_gaps_inputs.csv") - -# AVERAGE ANNUAL JOB LOSSES (DAN AND NON-DAC) SHOULD THIS BE ADJUSTED FOR FIRST FEW YRS? - -df.agg2 <- filter( - df.agg2, - scenario != "BAU demand - historical production" -) %>% - left_join(df.bau2, by = c("year", "demo_group")) %>% - mutate( - gap_emp = sum_demo_emp - sum_demo_emp_bau, - gap_emp_revised = sum_demo_emp_revised - sum_demo_emp_revised_bau, - gap_comp_h = sum_demo_comp_pv_h - sum_demo_comp_pv_h_bau, - gap_comp_l = sum_demo_comp_pv_l - sum_demo_comp_pv_l_bau - ) %>% - group_by(scenario, demo_group) %>% - summarize( - gap_emp = sum(gap_emp), - gap_emp_revised = sum(gap_emp_revised), - gap_comp_h = sum(gap_comp_h), - gap_comp_l = sum(gap_comp_l) - ) %>% - ungroup() - - - - -# IMPORT DISAGGREGATED RESULTS WITH 3 DIFFERENT OIL PRICE PATHWAYS - -df <- fread("2024-08-update/fig-csv-files/labor_high_low_annual_outputs.csv") -str(df) -summary(df$sum_demo_emp) -summary(df$sum_demo_emp_revised) - - -# KEEP JUST 2045 AND COMPUTE GAP BETWEEN SCENARIO AND BAU FOR EACH OIL PRICE PATHWAY - -# df <- filter(df,year==2045) - -## AGGREGATE IMPACTS ACROSS DEMOGRAPHIC GROUPS AND YEARS, SELECT 1 DEMOGRAPHIC CATEGORY SO IMPACTS ARENT DUPLICATED -df <- pivot_wider(df, - id_cols = c("scenario", "demo_cat", "demo_group", "demand_scenario", "refining_scenario", "oil_price_scenario", "year"), - names_from = c("metric_name", "estimate"), - values_from = value -) %>% - filter(demo_cat == "DAC") %>% - group_by(scenario, oil_price_scenario, year) %>% - summarize( - compensation_pv_high = sum(compensation_pv_high), - compensation_pv_low = sum(compensation_pv_low), - employment_high = sum(employment_high), - employment_low = sum(employment_low) - ) %>% - ungroup() - -## BAU - -df.bau <- filter(df, scenario == "BAU demand - historical production") %>% - rename( - compensation_pv_high_bau = compensation_pv_high, - compensation_pv_low_bau = compensation_pv_low, - employment_high_bau = employment_high, - employment_low_bau = employment_low - ) %>% - dplyr::select(-scenario) - - -## JOIN BAU TO DF AND COMPUTE GAPS - -df <- filter(df, scenario != "BAU demand - historical production") %>% - left_join(df.bau, by = c("oil_price_scenario", "year")) %>% - group_by(scenario, oil_price_scenario) %>% - summarize( - compensation_pv_high = sum(compensation_pv_high), - compensation_pv_low = sum(compensation_pv_low), - employment_high = sum(employment_high), - employment_low = sum(employment_low), - compensation_pv_high_bau = sum(compensation_pv_high_bau), - compensation_pv_low_bau = sum(compensation_pv_low_bau), - employment_high_bau = sum(employment_high_bau), - employment_low_bau = sum(employment_low_bau) - ) %>% - ungroup() %>% - mutate( - gap_comp_pv_high = compensation_pv_high - compensation_pv_high_bau, - gap_comp_pv_low = compensation_pv_low - compensation_pv_low_bau, - gap_emp_high = employment_high - employment_high_bau, - gap_emp_low = employment_low - employment_low_bau - ) - - -## NEEDS: COMP AND EMP IN 2019 (FROM IMPLAN), COMP AND EMP IN 2045 HIGH AND LOW ESTIMATES FOR EACH SCENARIO - -## FROM IMPLAN: SPREADSHEETS ARE AT /Dropbox/calepa/refining-labor/2019-baseline-ica -fte.per.emp <- 0.991150442477876 - -direct.emp.2019 <- 11456.6380044314 * fte.per.emp -indirect.emp.2019 <- 70118.2031857474 * fte.per.emp -induced.emp.2019 <- 43395.822784118 * fte.per.emp -total.emp.2019 <- direct.emp.2019 + indirect.emp.2019 + induced.emp.2019 - -direct.comp.2019 <- 3028965833 -indirect.comp.2019 <- 4812737405.89 -induced.comp.2019 <- 2273210360.05 -total.comp.2019 <- direct.comp.2019 + indirect.comp.2019 + induced.comp.2019 - - -## READ IN IMPACTS - -# IMPORT DISAGGREGATED RESULTS ADD ACROSS COUNTIES - -df <- fread("2024-08-update/fig-csv-files/labor_result_for_review.csv") %>% - filter(oil_price_scenario == "reference case") %>% - group_by(demand_scenario, refining_scenario, year) %>% - summarize( - total_emp = sum(total_emp), - total_emp_revised = sum(total_emp_revised), - total_comp_usd19_h = sum(total_comp_usd19_h), - total_comp_usd19_l = sum(total_comp_usd19_l) - ) %>% - ungroup() -str(df) - - -# KEEP JUST 2045 AND COMPUTE 1-SHARE OF 2019 EMPLOMENT OR COMPENSATION FOR W/REEMPLOYMENT (HIGH) - -df.2045 <- filter(df, year == 2045) - -df.high <- mutate(df.2045, - emp_perc_h = 1 - (total_emp / total.emp.2019), - emp_comp_h = 1 - (total_comp_usd19_h / total.comp.2019) -) - - - -# DIRECT,INDIRECT,INDUCED SHARES RELATIVE TO 2019 - -df <- fread("2024-08-update/fig-csv-files/labor_result_x_impact_type.csv") -str(df) -unique(df$oil_price_scenario) - -df.review <- fread("2024-08-update/fig-csv-files/labor_result_x_impact_type_for_review.csv") -str(df.review) -unique(df.review$oil_price_scenario) - -df <- filter( - df, - oil_price_scenario == "reference case" -) %>% - group_by(demand_scenario, refining_scenario, impact_type, year) %>% - summarize( - total_emp = sum(total_emp), - total_emp_revised = sum(total_emp_revised), - total_comp_usd19_h = sum(total_comp_usd19_h), - total_comp_usd19_l = sum(total_comp_usd19_l) - ) %>% - ungroup() - -# KEEP JUST 2045 AND COMPUTE 1-SHARE OF 2019 EMPLOMENT OR COMPENSATION FOR W/REEMPLOYMENT (HIGH) - -df.2045 <- filter(df, year == 2045) - -df.high <- mutate(df.2045, - emp_perc_h = ifelse(impact_type == "direct", 1 - (total_emp / direct.emp.2019), - ifelse(impact_type == "indirect", 1 - (total_emp / indirect.emp.2019), - ifelse(impact_type == "induced", 1 - (total_emp / induced.emp.2019), NA) - ) - ), - comp_perc_h = ifelse(impact_type == "direct", 1 - (total_comp_usd19_h / direct.comp.2019), - ifelse(impact_type == "indirect", 1 - (total_comp_usd19_h / indirect.comp.2019), - ifelse(impact_type == "induced", 1 - (total_comp_usd19_h / induced.comp.2019), NA) - ) - ) -) - - -# TOTAL IMPACT LEVEL BY SCENARIO - -df.cumu <- group_by( - df, - demand_scenario, refining_scenario -) %>% - summarize( - total_emp = sum(total_emp), - total_emp_revised = sum(total_emp_revised), - total_comp_usd19_h = sum(total_comp_usd19_h), - total_comp_usd19_l = sum(total_comp_usd19_l) - ) %>% - ungroup() diff --git a/archive-from-repo/ncomms_labor_multipliers.R b/archive-from-repo/ncomms_labor_multipliers.R deleted file mode 100644 index 4cede8c..0000000 --- a/archive-from-repo/ncomms_labor_multipliers.R +++ /dev/null @@ -1,515 +0,0 @@ -###### NCOMMS REVISIONS - -rm(list = ls()) - -list.of.packages <- c("dplyr", "data.table", "lubridate", "tidyr", "readxl", "fixest", "modelsummary", "flextable") -new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[, "Package"])] -if (length(new.packages)) install.packages(new.packages) - -library(lubridate) -library(tidyr) -library(dplyr) -library(data.table) -library(readxl) -library(stringr) -library(readr) -library(fixest) -library(modelsummary) -library(flextable) -library(svglite) -library(sf) -library(ggplot2) -library(tigris) -library(cowplot) -library(janitor) - - -# setwd('G:/Shared drives/emlab/projects/current-projects/calepa-cn/outputs/academic-out/refining/figures') -setwd("~/Dropbox/ou/ncomms-revisions") - -### define function for "not in" -"%!in%" <- function(x, y) !("%in%"(x, y)) - -# Check that string doesn't match any non-letter -letters_only <- function(x) !grepl("[^A-Za-z*-]", x) - - -# IMPORT LODES DATA--FILTERED USING CENSUS BLOCK IDs - -df <- fread('ca_od_main_JT02_2020.csv') %>% - filter(w_geocode == 60379800021006 | - w_geocode == 60379800301000 | - w_geocode == 60133780001024 | - w_geocode == 60952521022025 | - w_geocode == 60290024011034 | - w_geocode == 60379800141083 | - w_geocode == 60379800051007 | - w_geocode == 60290005072025 | - w_geocode == 60133200011067 | - w_geocode == 60133150001075 | - w_geocode == 60133580005003 | - w_geocode == 60379800151000 | - w_geocode == 60790123061000 | - w_geocode == 60375535021000 | - w_geocode == 60290005072077) %>% - dplyr::select(w_geocode,h_geocode,S000,SI01) %>% - mutate(refinery_name = ifelse(w_geocode == 60379800021006,"Marathon Carson", - ifelse(w_geocode == 60379800301000,"Chevron El Segundo", - ifelse(w_geocode == 60133780001024,"Chevron Richmond", - ifelse(w_geocode == 60952521022025,"Valero Benicia", - ifelse(w_geocode == 60290024011034,"Kern Oil Bakersfield", - ifelse(w_geocode == 60379800141083,"Valero Wilmington", - ifelse(w_geocode == 60379800051007,"PBF Torrance", - ifelse(w_geocode == 60290005072025,"San Joaquin Bakersfield", - ifelse(w_geocode == 60133200011067,"PBF Martinez", - ifelse(w_geocode == 60133150001075,"Marathon Golden Eagle", - ifelse(w_geocode == 60133580005003,"Phillips 66 Rodeo", - ifelse(w_geocode == 60379800151000,"Phillips 66 Wilmington", - ifelse(w_geocode == 60790123061000,"Phillips 66 Santa Maria", - ifelse(w_geocode == 60375535021000,"AltAir Paramount", - ifelse(w_geocode == 60290005072077,"Global Clean Energy",NA)))))))))))))))) -str(df) -summary(df$SI01) -summary(df$S000) - -df.refinery <- group_by(df,refinery_name) %>% - summarize(SI01 = sum(SI01), - S000 = sum(S000)) %>% - ungroup() -summary(df.refinery$SI01) -summary(df.refinery$S000) - - - -# IMPORT LODES -- FILTER USING CENSUS TRACT IDS - -df.tract <- fread('ca_od_main_JT02_2020.csv') %>% - filter(substr(as.character(w_geocode),1,10) == 6037980002 | - substr(as.character(w_geocode),1,10) == 6037980030 | - substr(as.character(w_geocode),1,10) == 6013378000 | - substr(as.character(w_geocode),1,10) == 6095252102 | - substr(as.character(w_geocode),1,10) == 6029002401 | - substr(as.character(w_geocode),1,10) == 6037980014 | - substr(as.character(w_geocode),1,10) == 6037980005 | - substr(as.character(w_geocode),1,10) == 6029000507 | - substr(as.character(w_geocode),1,10) == 6013320001 | - substr(as.character(w_geocode),1,10) == 6013315000 | - substr(as.character(w_geocode),1,10) == 6013358000 | - substr(as.character(w_geocode),1,10) == 6037980015 | - substr(as.character(w_geocode),1,10) == 6079012306 | - substr(as.character(w_geocode),1,10) == 6037553502 | - substr(as.character(w_geocode),1,10) == 6029000507) %>% - mutate(w_tract_geocode = substr(as.character(w_geocode),1,10), - h_tract_geocode = substr(as.character(h_geocode),1,10)) %>% - dplyr::select(w_geocode,h_geocode,w_tract_geocode,h_tract_geocode,S000,SI01) %>% - mutate(refinery_name = ifelse(substr(as.character(w_geocode),1,10) == 6037980002,"Marathon Carson", - ifelse(substr(as.character(w_geocode),1,10) == 6037980030,"Chevron El Segundo", - ifelse(substr(as.character(w_geocode),1,10) == 6013378000,"Chevron Richmond", - ifelse(substr(as.character(w_geocode),1,10) == 6095252102,"Valero Benicia", - ifelse(substr(as.character(w_geocode),1,10) == 6029002401,"Kern Oil Bakersfield", - ifelse(substr(as.character(w_geocode),1,10) == 6037980014,"Valero Wilmington", - ifelse(substr(as.character(w_geocode),1,10) == 6037980005,"PBF Torrance", - ifelse(substr(as.character(w_geocode),1,10) == 6029000507,"San Joaquin Bakersfield", - ifelse(substr(as.character(w_geocode),1,10) == 6013320001,"PBF Martinez", - ifelse(substr(as.character(w_geocode),1,10) == 6013315000,"Marathon Golden Eagle", - ifelse(substr(as.character(w_geocode),1,10) == 6013358000,"Phillips 66 Rodeo", - ifelse(substr(as.character(w_geocode),1,10) == 6037980015,"Phillips 66 Wilmington", - ifelse(substr(as.character(w_geocode),1,10) == 6079012306,"Phillips 66 Santa Maria", - ifelse(substr(as.character(w_geocode),1,10) == 6037553502,"AltAir Paramount", - ifelse(substr(as.character(w_geocode),1,10) == 6029000507,"Global Clean Energy",NA)))))))))))))))) -str(df) -summary(df$SI01) -summary(df$S000) - -df.refinery <- group_by(df.tract,refinery_name) %>% - summarize(SI01 = sum(SI01), - S000 = sum(S000)) %>% - ungroup() -summary(df.refinery$SI01) -summary(df.refinery$S000) - - -# ADD UP JOBS BY WORK-RESIDENCE TRACT PAIRS - -df.tract <- group_by(df.tract, - w_tract_geocode,h_tract_geocode) %>% - summarize(SI01 = sum(SI01), - refinery_name = first(refinery_name)) %>% - filter(SI01 > 0) %>% - ungroup() - -df.tract <- mutate(df.tract, - w_tract_geocode = str_pad(as.character(w_tract_geocode),11,pad="0"), - h_tract_geocode = str_pad(as.character(h_tract_geocode),11,pad="0")) - -# IMPORT CENSUS TRACTS FOR CA - -ca.tracts <- tracts(state="CA",year=2020) - -# JOIN SHAPEFILE TO LODES BY RESIDENTIAL TRACT - -df.tract.r <- left_join(df.tract,ca.tracts,by=c("h_tract_geocode"="GEOID")) -unique(is.na(df.tract.r$STATEFP)) # FALSE FOR ALL OBSERVATIONS - -df.tract.r <- st_as_sf(df.tract.r, - crs=4269, - sf_column_name = "geometry") - - -sf1 <- filter(df.tract.r, refinery_name=="Marathon Carson" | refinery_name=="Chevron El Segundo" | - refinery_name=="Valero Wilmington" | refinery_name=="PBF Torrance" | - refinery_name=="Phillips 66 Wilmington" | refinery_name=="AltAir Paramount") %>% - mutate(refinery_name = as.factor(refinery_name)) %>% - rename(South_Cluster=SI01) -sf2 <- filter(df.tract.r, refinery_name!="Marathon Carson" & refinery_name!="Chevron El Segundo" & - refinery_name!="Valero Wilmington" & refinery_name!="PBF Torrance" & - refinery_name!="Phillips 66 Wilmington" & refinery_name!="AltAir Paramount") %>% - mutate(refinery_name = as.factor(refinery_name)) %>% - rename(North_Cluster=SI01) - -library(ggnewscale) -fig1 <- ggplot(data=sf1) + - geom_sf(aes(color=South_Cluster)) + - scale_color_viridis_c(option = "D") + - new_scale_color() + - geom_sf(data=sf2,aes(color=North_Cluster)) + - scale_color_viridis_c(option = "C") + - scale_fill_gradient() + - geom_sf(data=ca.tracts,fill=NA) + - theme_bw() + - theme(panel.border = element_blank(), - panel.grid = element_blank(), - axis.ticks.x = element_blank(), - axis.text.x = element_blank(), - axis.ticks.y = element_blank(), - axis.text.y = element_blank(), - axis.title = element_blank()) -fig1 - -sf1 <- mutate(sf1, South_Cluster = 1,North_Cluster=0) -sf2 <- mutate(sf2, North_Cluster = 1,South_Cluster=0) - -sf3 <- bind_rows(sf1,sf2) - -fig2 <- ggplot(data=sf3) + - geom_sf(aes(fill=as.factor(South_Cluster))) + - geom_sf(data=ca.tracts,fill=NA) + - theme_bw() + - theme(panel.border = element_blank(), - panel.grid = element_blank(), - axis.ticks.x = element_blank(), - axis.text.x = element_blank(), - axis.ticks.y = element_blank(), - axis.text.y = element_blank(), - axis.title = element_blank()) -fig2 - -sf4 <- filter(df.tract.r, SI01>1) - -sf1 <- filter(sf4, refinery_name=="Marathon Carson" | refinery_name=="Chevron El Segundo" | - refinery_name=="Valero Wilmington" | refinery_name=="PBF Torrance" | - refinery_name=="Phillips 66 Wilmington" | refinery_name=="AltAir Paramount") %>% - mutate(refinery_name = as.factor(refinery_name)) %>% - rename(South_Cluster=SI01) -sf2 <- filter(sf4, refinery_name!="Marathon Carson" & refinery_name!="Chevron El Segundo" & - refinery_name!="Valero Wilmington" & refinery_name!="PBF Torrance" & - refinery_name!="Phillips 66 Wilmington" & refinery_name!="AltAir Paramount") %>% - mutate(refinery_name = as.factor(refinery_name)) %>% - rename(North_Cluster=SI01) - -sf1 <- mutate(sf1, South_Cluster = 1,North_Cluster=0) -sf2 <- mutate(sf2, North_Cluster = 1,South_Cluster=0) - -sf3 <- bind_rows(sf1,sf2) - -fig3 <- ggplot(data=sf3) + - geom_sf(aes(fill=as.factor(South_Cluster))) + - geom_sf(data=ca.tracts,fill=NA) + - theme_bw() + - theme(panel.border = element_blank(), - panel.grid = element_blank(), - axis.ticks.x = element_blank(), - axis.text.x = element_blank(), - axis.ticks.y = element_blank(), - axis.text.y = element_blank(), - axis.title = element_blank()) -fig3 - -ggsave('ns_emp_map.png',fig1) -ggsave('ns_emp_map_v2.png',fig2) -ggsave('ns_emp_map_v3.png',fig3) -rm(fig1,fig2,fig3,sf1,sf2,sf3,sf4,df.tract.r,df.tract,df.refinery,df,ca.tracts) - -# SHARE OF ZIP CODE OUTPUT VALUE FROM REFINING -filenames <- list.files(".", pattern="Industry Detail_9*", full.names=TRUE) -zips <- as.numeric(gsub(".*?([0-9]+).*", "\\1", filenames)) -zips <- rep(zips,times=c(rep(528,12))) -ldf <- lapply(filenames, fread) -df <- rbindlist(ldf) %>% - filter(is.na(V1)==FALSE) -df$zcta <- zips -names(df) <- make.names(names(df)) -str(df) -rm(zips,filenames,ldf) - -df <- mutate(df, - Total.Output = str_remove_all(Total.Output,"[$,]"), - Total.Output = as.numeric(Total.Output)) - -df_total <- group_by(df, - zcta) %>% - summarize(Total.Output = sum(Total.Output)) %>% - ungroup() - -df_refining <- group_by(df, - zcta) %>% - filter(Industry.Code==146) %>% - summarize(refinery.output = sum(Total.Output)) %>% - ungroup() %>% - left_join(df_total,by="zcta") %>% - mutate(share = refinery.output/Total.Output) - -summary(df_refining$share) - -rm(df,df_total) - -# SHARE OF CLUSTER AND STATEWIDE OUTPUT - -df_nc <- fread('Industry Detail_north_cluster.csv') -names(df_nc) <- make.names(names(df_nc)) -df_nc <- filter(df_nc, - Industry.Code==146 & is.na(V1)==FALSE) %>% - mutate(Total.Output = str_remove_all(Total.Output,"[$,]"), - Total.Output = as.numeric(Total.Output)) %>% - summarize(total_north = sum(Total.Output)) -str(df_nc) - -df_sc <- fread('Industry Detail_south_cluster.csv') -names(df_sc) <- make.names(names(df_sc)) -df_sc <- filter(df_sc, - Industry.Code==146 & is.na(V1)==FALSE) %>% - mutate(Total.Output = str_remove_all(Total.Output,"[$,]"), - Total.Output = as.numeric(Total.Output)) %>% - summarize(total_south = sum(Total.Output)) -str(df_sc) - - -df_refining$total_north <- rep(df_nc$total_north,12) -df_refining$total_south <- rep(df_sc$total_south,12) -df_refining <- mutate(df_refining, - share_north = refinery.output/total_north, - share_south = refinery.output/total_south, - share_state = refinery.output/(total_north+total_south)) -summary(df_refining$share_north) -summary(df_refining$share_south) -summary(df_refining$share_state) - - - - -### SHARE OF WORKERS IN ESTABLISHMENT TRACT THAT LIVE IN HOME TRACT - -df.tract <- fread('ca_od_main_JT02_2020.csv') %>% - mutate(w_tract_geocode = substr(as.character(w_geocode),1,10), - h_tract_geocode = substr(as.character(h_geocode),1,10)) %>% - dplyr::select(w_tract_geocode, h_tract_geocode,S000,SI01,SI02,SI03) %>% - group_by(w_tract_geocode,h_tract_geocode) %>% - summarize(S000 = sum(S000,na.rm=TRUE), - SI01 = sum(SI01,na.rm=TRUE), - SI02 = sum(SI02,na.rm=TRUE), - SI03 = sum(SI03,na.rm=TRUE)) %>% - ungroup() - -df.work.total <- group_by(df.tract, - w_tract_geocode) %>% - summarize(S000_w = sum(S000,na.rm=TRUE), - SI01_w = sum(SI01,na.rm=TRUE), - SI02_w = sum(SI02,na.rm=TRUE), - SI03_w = sum(SI03,na.rm=TRUE)) %>% - ungroup() - -df.tract <- left_join(df.tract,df.work.total, by="w_tract_geocode") %>% - mutate(S000_share = S000/S000_w, - SI01_share = SI01/SI01_w, - SI02_share = SI02/SI02_w, - SI03_share = SI03/SI03_w) -summary(df.tract$S000_share) -summary(df.tract$SI01_share) -summary(df.tract$SI02_share) -summary(df.tract$SI03_share) - -df.tract <- mutate(df.tract, - w_tract_geocode = str_pad(as.character(w_tract_geocode),11,pad="0"), - h_tract_geocode = str_pad(as.character(h_tract_geocode),11,pad="0")) - -######################################## -# Census Tract to Zip Code Xwalk - -df <- read_excel('TRACT_ZIP_122024.xlsx') %>% - filter(USPS_ZIP_PREF_STATE=="CA") %>% - dplyr::select(TRACT,ZIP,BUS_RATIO) -str(df) -summary(df$BUS_RATIO) - - -# Crosswalk work census tract to work zip code - -df2 <- left_join(df.tract,df,by=c("w_tract_geocode"="TRACT")) - -df2 <- mutate(df2, - S000 = ifelse(is.na(BUS_RATIO)==FALSE,S000*BUS_RATIO,S000), - SI01 = ifelse(is.na(BUS_RATIO)==FALSE,SI01*BUS_RATIO,SI01), - SI02 = ifelse(is.na(BUS_RATIO)==FALSE,SI02*BUS_RATIO,SI02), - SI03 = ifelse(is.na(BUS_RATIO)==FALSE,SI03*BUS_RATIO,SI03)) %>% - filter(is.na(ZIP)==FALSE) %>% - group_by(ZIP,h_tract_geocode) %>% - summarize(S000 = sum(S000,na.rm=TRUE), - SI01 = sum(SI01,na.rm=TRUE), - SI02 = sum(SI02,na.rm=TRUE), - SI03 = sum(SI03,na.rm=TRUE)) %>% - ungroup() - -total.zip <- group_by(df2, - ZIP) %>% - summarize(S000_w = sum(S000,na.rm=TRUE), - SI01_w = sum(SI01,na.rm=TRUE), - SI02_w = sum(SI02,na.rm=TRUE), - SI03_w = sum(SI03,na.rm=TRUE)) %>% - ungroup() - -df2 <- left_join(df2,total.zip, by="ZIP") %>% - mutate(S000_share = S000/S000_w, - SI01_share = SI01/SI01_w, - SI02_share = SI02/SI02_w, - SI03_share = SI03/SI03_w) -summary(df2$S000_share) -summary(df2$SI01_share) -summary(df2$SI02_share) -summary(df2$SI03_share) - -######################################## -# IMPLAN zip code tables - -load.implan.zip.agg <- function(x){ - df <- fread(paste0("implan-zip/",x)) - names(df) <- make.names(names(df)) - separated.string <- str_split(x,"_") - - df <- dplyr::select(df, - Industry.Code,Description,Total.Output) %>% - filter(Description != "" & Description != "* Employment and payroll of federal govt, military" & Description != "* Employment and payroll of federal govt, non-military") %>% - mutate(zip = str_extract(separated.string[[1]][4],pat <- "(\\d)+"), - county = separated.string[[1]][3], - Total.Output = as.numeric(str_remove_all(Total.Output,"[$,]"))) - - - df <- left_join(df,implan.naics.xwalk, by=c("Industry.Code"="Implan546Index")) %>% - mutate(ind_type = ifelse((substr(as.character(`2017NaicsCode`),1,2)=="11" | - substr(as.character(`2017NaicsCode`),1,2)=="21" | - substr(as.character(`2017NaicsCode`),1,2)=="23" | - substr(as.character(`2017NaicsCode`),1,2)=="31" | - substr(as.character(`2017NaicsCode`),1,2)=="32" | - substr(as.character(`2017NaicsCode`),1,2)=="33" | - Description == "Construction of new commercial structures, including farm structures" | - Description == "Construction of new multifamily residential structures" | - Description == "Construction of other new residential structures" | - Description == "Maintenance and repair construction of nonresidential structures" | - Description == "Maintenance and repair construction of residential structures" | - Description == "Maintenance and repair construction of highways, streets, bridges, and tunnels" | - Description == "Dog and cat food manufacturing" | - Description == "Other animal food manufacturing" | - Description == "Flour milling" | - Description == "Rice milling" | - Description == "Malt manufacturing" | - Description == "Construction of other new nonresidential structures" | - Description == "Construction of new single-family residential structures"), "SI01", - ifelse((substr(as.character(`2017NaicsCode`),1,2)=="42" | - substr(as.character(`2017NaicsCode`),1,2)=="44" | - substr(as.character(`2017NaicsCode`),1,2)=="45" | - substr(as.character(`2017NaicsCode`),1,2)=="48" | - substr(as.character(`2017NaicsCode`),1,2)=="49" | - substr(as.character(`2017NaicsCode`),1,2)=="22"), "SI02","SI03")), - ind_type = ifelse(Description=="Veterinary services","SI03",ind_type), - cluster = ifelse((county == "Ventura County" | - county == "Los Angeles County" | - county == "San Bernardino County" | - county == "Orange County" | - county == "Riverside County" | - county == "Imperial County" | - county == "San Diego County"), "south", "north")) %>% - dplyr::select(-`2017NaicsCode`,-Description,-Industry.Code,-NaicsDescription) %>% - group_by(zip,county,cluster,ind_type) %>% - summarize(Total.Output = sum(Total.Output,na.rm=TRUE)) %>% - ungroup() %>% - pivot_wider(id_cols=c("zip","county","cluster"),values_from = "Total.Output", names_from = "ind_type",names_prefix = "output_") - -} - - -# disaggregated by IMPLAN industry and zip - -load.implan.zip <- function(x){ - df <- fread(paste0("implan-zip/",x)) - names(df) <- make.names(names(df)) - separated.string <- str_split(x,"_") - - df <- dplyr::select(df, - Industry.Code,Description,Total.Output) %>% - filter(Description != "" & Description != "* Employment and payroll of federal govt, military" & Description != "* Employment and payroll of federal govt, non-military") %>% - mutate(zip = str_extract(separated.string[[1]][4],pat <- "(\\d)+"), - county = separated.string[[1]][3], - Total.Output = as.numeric(str_remove_all(Total.Output,"[$,]"))) - - - df <- left_join(df,implan.naics.xwalk, by=c("Industry.Code"="Implan546Index")) %>% - mutate(ind_type = ifelse((substr(as.character(`2017NaicsCode`),1,2)=="11" | - substr(as.character(`2017NaicsCode`),1,2)=="21" | - substr(as.character(`2017NaicsCode`),1,2)=="23" | - substr(as.character(`2017NaicsCode`),1,2)=="31" | - substr(as.character(`2017NaicsCode`),1,2)=="32" | - substr(as.character(`2017NaicsCode`),1,2)=="33" | - Description == "Construction of new commercial structures, including farm structures" | - Description == "Construction of new multifamily residential structures" | - Description == "Construction of other new residential structures" | - Description == "Maintenance and repair construction of nonresidential structures" | - Description == "Maintenance and repair construction of residential structures" | - Description == "Maintenance and repair construction of highways, streets, bridges, and tunnels" | - Description == "Dog and cat food manufacturing" | - Description == "Other animal food manufacturing" | - Description == "Flour milling" | - Description == "Rice milling" | - Description == "Malt manufacturing" | - Description == "Construction of other new nonresidential structures" | - Description == "Construction of new single-family residential structures"), "SI01", - ifelse((substr(as.character(`2017NaicsCode`),1,2)=="42" | - substr(as.character(`2017NaicsCode`),1,2)=="44" | - substr(as.character(`2017NaicsCode`),1,2)=="45" | - substr(as.character(`2017NaicsCode`),1,2)=="48" | - substr(as.character(`2017NaicsCode`),1,2)=="49" | - substr(as.character(`2017NaicsCode`),1,2)=="22"), "SI02","SI03")), - ind_type = ifelse(Description=="Veterinary services","SI03",ind_type), - cluster = ifelse((county == "Ventura County" | - county == "Los Angeles County" | - county == "San Bernardino County" | - county == "Orange County" | - county == "Riverside County" | - county == "Imperial County" | - county == "San Diego County"), "south", "north")) %>% - dplyr::select(-`2017NaicsCode`) -} - -file.names <- list.files(path="implan-zip",pattern="*.csv") -implan.naics.xwalk <- read_xlsx("Bridge_2017NaicsToImplan546.xlsx") %>% - dplyr::select(Implan546Index,`2017NaicsCode`) %>% - mutate(`2017NaicsCode` = substr(`2017NaicsCode`,1,2)) %>% - group_by(Implan546Index,`2017NaicsCode`) %>% - summarize() %>% - ungroup() - - -output <- lapply(file.names,load.implan.zip) %>% - bind_rows() - -fwrite(output,'implan_zip_output.csv') - - diff --git a/archive-from-repo/ncomms_labor_revisions.R b/archive-from-repo/ncomms_labor_revisions.R deleted file mode 100644 index da62e5b..0000000 --- a/archive-from-repo/ncomms_labor_revisions.R +++ /dev/null @@ -1,687 +0,0 @@ -###### NCOMMS REVISIONS - -rm(list = ls()) - -list.of.packages <- c("dplyr", "data.table", "lubridate", "tidyr", "readxl", "fixest", "modelsummary", "flextable") -new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[, "Package"])] -if (length(new.packages)) install.packages(new.packages) - -library(lubridate) -library(tidyr) -library(dplyr) -library(data.table) -library(readxl) -library(stringr) -library(readr) -library(fixest) -library(modelsummary) -library(flextable) -library(svglite) -library(sf) -library(ggplot2) -library(tigris) -library(cowplot) -library(janitor) - - -# setwd('G:/Shared drives/emlab/projects/current-projects/calepa-cn/outputs/academic-out/refining/figures') -setwd("~/Dropbox/ou/ncomms-revisions") - -### define function for "not in" -"%!in%" <- function(x, y) !("%in%"(x, y)) - -# Check that string doesn't match any non-letter -letters_only <- function(x) !grepl("[^A-Za-z*-]", x) - - -# EMPLOYMENT MULTIPLIERS (FROM IMPLAN) -rev.mrio <- fread('multipliers/mrio/output-value/20250402-ns_cluster_mrio-Detail Economic Indicators.csv') %>% - mutate(cluster = ifelse(DestinationRegion=="north_cluster (2023)","north","south")) %>% - dplyr::select(OriginRegion,DestinationRegion,IndustryCode,ImpactType,Employment,EmployeeCompensation,cluster) %>% - rename(emp.rev = Employment, - ec.rev = EmployeeCompensation) -li.mrio <- fread('multipliers/mrio/labor-income/20250402-ns_cluster_mrio-Detail Economic Indicators.csv') %>% - mutate(cluster = ifelse(DestinationRegion=="north_cluster (2023)","north","south")) %>% - dplyr::select(OriginRegion,DestinationRegion,IndustryCode,ImpactType,Employment,EmployeeCompensation,cluster) %>% - rename(emp.li = Employment, - ec.li = EmployeeCompensation) -mrio <- left_join(rev.mrio,li.mrio, by=c("OriginRegion","DestinationRegion","IndustryCode","ImpactType","cluster")) - -rev.not.mrio <- fread('multipliers/non-mrio/output-value/20250402-ns_cluster-Detail Economic Indicators.csv') %>% - mutate(cluster = ifelse(DestinationRegion=="north_cluster (2023)","north","south")) %>% - dplyr::select(OriginRegion,DestinationRegion,IndustryCode,ImpactType,Employment,EmployeeCompensation,cluster) %>% - rename(emp.rev = Employment, - ec.rev = EmployeeCompensation) -li.not.mrio <- fread('multipliers/non-mrio/labor-income/20250402-ns_cluster-Detail Economic Indicators.csv') %>% - mutate(cluster = ifelse(DestinationRegion=="north_cluster (2023)","north","south")) %>% - dplyr::select(OriginRegion,DestinationRegion,IndustryCode,ImpactType,Employment,EmployeeCompensation,cluster) %>% - rename(emp.li = Employment, - ec.li = EmployeeCompensation) -not.mrio <- left_join(rev.not.mrio,li.not.mrio, by=c("OriginRegion","DestinationRegion","IndustryCode","ImpactType","cluster")) - -rev.statewide <- fread('multipliers/statewide/output-value/20250402-statewide_ca_refining-Detail Economic Indicators.csv') %>% - dplyr::select(OriginRegion,DestinationRegion,IndustryCode,ImpactType,Employment,EmployeeCompensation) %>% - rename(emp.rev = Employment, - ec.rev = EmployeeCompensation) -li.statewide <- fread('multipliers/statewide/labor-income/20250402-statewide_ca_refining-Detail Economic Indicators.csv') %>% - dplyr::select(OriginRegion,DestinationRegion,IndustryCode,ImpactType,Employment,EmployeeCompensation) %>% - rename(emp.li = Employment, - ec.li = EmployeeCompensation) -statewide <- left_join(rev.statewide,li.statewide, by=c("OriginRegion","DestinationRegion","IndustryCode","ImpactType")) - -rm(rev.mrio,li.mrio,rev.not.mrio,li.not.mrio,rev.statewide,li.statewide) - - -### ADD UP WORKERS FROM BLOCK TO TRACT LEVEL - -df.tract <- fread('ca_od_main_JT02_2020.csv') %>% - mutate(w_tract_geocode = substr(as.character(w_geocode),1,10), - h_tract_geocode = substr(as.character(h_geocode),1,10)) %>% - dplyr::select(w_tract_geocode, h_tract_geocode,S000,SI01,SI02,SI03) %>% - group_by(w_tract_geocode,h_tract_geocode) %>% - summarize(S000 = sum(S000,na.rm=TRUE), - SI01 = sum(SI01,na.rm=TRUE), - SI02 = sum(SI02,na.rm=TRUE), - SI03 = sum(SI03,na.rm=TRUE)) %>% - ungroup() - -df.tract <- mutate(df.tract, - w_tract_geocode = str_pad(as.character(w_tract_geocode),11,pad="0"), - h_tract_geocode = str_pad(as.character(h_tract_geocode),11,pad="0")) - -######################################## -# Census Tract to Zip Code Xwalk - -df <- read_excel('TRACT_ZIP_122024.xlsx') %>% - filter(USPS_ZIP_PREF_STATE=="CA") %>% - dplyr::select(TRACT,ZIP,BUS_RATIO) -str(df) -summary(df$BUS_RATIO) - - -# Crosswalk work census tract to work zip code - -df.zip <- left_join(df.tract,df,by=c("w_tract_geocode"="TRACT")) - -df.zip <- mutate(df.zip, - S000 = ifelse(is.na(BUS_RATIO)==FALSE,S000*BUS_RATIO,S000), - SI01 = ifelse(is.na(BUS_RATIO)==FALSE,SI01*BUS_RATIO,SI01), - SI02 = ifelse(is.na(BUS_RATIO)==FALSE,SI02*BUS_RATIO,SI02), - SI03 = ifelse(is.na(BUS_RATIO)==FALSE,SI03*BUS_RATIO,SI03)) %>% - filter(is.na(ZIP)==FALSE) %>% - group_by(ZIP,h_tract_geocode) %>% - summarize(S000 = sum(S000,na.rm=TRUE), - SI01 = sum(SI01,na.rm=TRUE), - SI02 = sum(SI02,na.rm=TRUE), - SI03 = sum(SI03,na.rm=TRUE)) %>% - ungroup() - -total.zip <- group_by(df.zip, - ZIP) %>% - summarize(S000_w = sum(S000,na.rm=TRUE), - SI01_w = sum(SI01,na.rm=TRUE), - SI02_w = sum(SI02,na.rm=TRUE), - SI03_w = sum(SI03,na.rm=TRUE)) %>% - ungroup() - -df.zip <- left_join(df.zip,total.zip, by="ZIP") %>% - mutate(S000_share = ifelse(S000_w > 0, S000/S000_w, 0), - SI01_share = ifelse(SI01_w > 0, SI01/SI01_w, 0), - SI02_share = ifelse(SI02_w > 0, SI02/SI02_w, 0), - SI03_share = ifelse(SI03_w > 0, SI03/SI03_w, 0)) -summary(df.zip$S000_share) -summary(df.zip$SI01_share) -summary(df.zip$SI02_share) -summary(df.zip$SI03_share) - -rm(total.zip) - -######################################## -# IMPLAN zip code tables -# -# load.implan.zip.agg <- function(x){ -# df <- fread(paste0("implan-zip/",x)) -# names(df) <- make.names(names(df)) -# separated.string <- str_split(x,"_") -# -# df <- dplyr::select(df, -# Industry.Code,Description,Total.Output) %>% -# filter(Description != "" & Description != "* Employment and payroll of federal govt, military" & Description != "* Employment and payroll of federal govt, non-military") %>% -# mutate(zip = str_extract(separated.string[[1]][4],pat <- "(\\d)+"), -# county = separated.string[[1]][3], -# Total.Output = as.numeric(str_remove_all(Total.Output,"[$,]"))) -# -# -# df <- left_join(df,implan.naics.xwalk, by=c("Industry.Code"="Implan546Index")) %>% -# mutate(ind_type = ifelse((substr(as.character(`2017NaicsCode`),1,2)=="11" | -# substr(as.character(`2017NaicsCode`),1,2)=="21" | -# substr(as.character(`2017NaicsCode`),1,2)=="23" | -# substr(as.character(`2017NaicsCode`),1,2)=="31" | -# substr(as.character(`2017NaicsCode`),1,2)=="32" | -# substr(as.character(`2017NaicsCode`),1,2)=="33" | -# Description == "Construction of new commercial structures, including farm structures" | -# Description == "Construction of new multifamily residential structures" | -# Description == "Construction of other new residential structures" | -# Description == "Maintenance and repair construction of nonresidential structures" | -# Description == "Maintenance and repair construction of residential structures" | -# Description == "Maintenance and repair construction of highways, streets, bridges, and tunnels" | -# Description == "Dog and cat food manufacturing" | -# Description == "Other animal food manufacturing" | -# Description == "Flour milling" | -# Description == "Rice milling" | -# Description == "Malt manufacturing" | -# Description == "Construction of other new nonresidential structures" | -# Description == "Construction of new single-family residential structures"), "SI01", -# ifelse((substr(as.character(`2017NaicsCode`),1,2)=="42" | -# substr(as.character(`2017NaicsCode`),1,2)=="44" | -# substr(as.character(`2017NaicsCode`),1,2)=="45" | -# substr(as.character(`2017NaicsCode`),1,2)=="48" | -# substr(as.character(`2017NaicsCode`),1,2)=="49" | -# substr(as.character(`2017NaicsCode`),1,2)=="22"), "SI02","SI03")), -# ind_type = ifelse(Description=="Veterinary services","SI03",ind_type), -# cluster = ifelse((county == "Ventura County" | -# county == "Los Angeles County" | -# county == "San Bernardino County" | -# county == "Orange County" | -# county == "Riverside County" | -# county == "Imperial County" | -# county == "San Diego County"), "south", "north")) %>% -# dplyr::select(-`2017NaicsCode`,-Description,-Industry.Code,-NaicsDescription) %>% -# group_by(zip,county,cluster,ind_type) %>% -# summarize(Total.Output = sum(Total.Output,na.rm=TRUE)) %>% -# ungroup() %>% -# pivot_wider(id_cols=c("zip","county","cluster"),values_from = "Total.Output", names_from = "ind_type",names_prefix = "output_") -# -# } -# -# -# # disaggregated by IMPLAN industry and zip -# -# load.implan.zip <- function(x){ -# df <- fread(paste0("implan-zip/",x)) -# names(df) <- make.names(names(df)) -# separated.string <- str_split(x,"_") -# -# df <- dplyr::select(df, -# Industry.Code,Description,Total.Output) %>% -# filter(Description != "" & Description != "* Employment and payroll of federal govt, military" & Description != "* Employment and payroll of federal govt, non-military") %>% -# mutate(zip = str_extract(separated.string[[1]][4],pat <- "(\\d)+"), -# county = separated.string[[1]][3], -# Total.Output = as.numeric(str_remove_all(Total.Output,"[$,]"))) -# -# -# df <- left_join(df,implan.naics.xwalk, by=c("Industry.Code"="Implan546Index")) %>% -# mutate(ind_type = ifelse((substr(as.character(`2017NaicsCode`),1,2)=="11" | -# substr(as.character(`2017NaicsCode`),1,2)=="21" | -# substr(as.character(`2017NaicsCode`),1,2)=="23" | -# substr(as.character(`2017NaicsCode`),1,2)=="31" | -# substr(as.character(`2017NaicsCode`),1,2)=="32" | -# substr(as.character(`2017NaicsCode`),1,2)=="33" | -# Description == "Construction of new commercial structures, including farm structures" | -# Description == "Construction of new multifamily residential structures" | -# Description == "Construction of other new residential structures" | -# Description == "Maintenance and repair construction of nonresidential structures" | -# Description == "Maintenance and repair construction of residential structures" | -# Description == "Maintenance and repair construction of highways, streets, bridges, and tunnels" | -# Description == "Dog and cat food manufacturing" | -# Description == "Other animal food manufacturing" | -# Description == "Flour milling" | -# Description == "Rice milling" | -# Description == "Malt manufacturing" | -# Description == "Construction of other new nonresidential structures" | -# Description == "Construction of new single-family residential structures"), "SI01", -# ifelse((substr(as.character(`2017NaicsCode`),1,2)=="42" | -# substr(as.character(`2017NaicsCode`),1,2)=="44" | -# substr(as.character(`2017NaicsCode`),1,2)=="45" | -# substr(as.character(`2017NaicsCode`),1,2)=="48" | -# substr(as.character(`2017NaicsCode`),1,2)=="49" | -# substr(as.character(`2017NaicsCode`),1,2)=="22"), "SI02","SI03")), -# ind_type = ifelse(Description=="Veterinary services","SI03",ind_type), -# cluster = ifelse((county == "Ventura County" | -# county == "Los Angeles County" | -# county == "San Bernardino County" | -# county == "Orange County" | -# county == "Riverside County" | -# county == "Imperial County" | -# county == "San Diego County"), "south", "north")) %>% -# dplyr::select(-`2017NaicsCode`) -# } -# -# file.names <- list.files(path="implan-zip",pattern="*.csv") -# implan.naics.xwalk <- read_xlsx("Bridge_2017NaicsToImplan546.xlsx") %>% -# dplyr::select(Implan546Index,`2017NaicsCode`) %>% -# mutate(`2017NaicsCode` = substr(`2017NaicsCode`,1,2)) %>% -# group_by(Implan546Index,`2017NaicsCode`) %>% -# summarize() %>% -# ungroup() -# -# -# output <- lapply(file.names,load.implan.zip) %>% -# bind_rows() -# -# fwrite(output,'implan_zip_output.csv') - -## IMPORT ZIP CODE TABLES, CALCULATE SHARE OF CLUSTER OR STATEWIDE OUTPUT ATTRIBUTABLE TO EACH ZIP CODE -zip.output <- fread('implan_zip_output.csv') - -cluster.output <- group_by(zip.output, - cluster,Industry.Code) %>% - summarize(cluster_output = sum(Total.Output,na.rm=TRUE)) %>% - ungroup() - -state.output <- group_by(zip.output, - Industry.Code) %>% - summarize(state_output = sum(Total.Output,na.rm=TRUE)) %>% - ungroup() - -zip.output <- left_join(zip.output,cluster.output,by=c("cluster","Industry.Code")) %>% - mutate(share_output = ifelse(cluster_output > 0, Total.Output/cluster_output,0)) %>% - dplyr::select(-cluster_output) -summary(zip.output$share_output) - -zip.output <- left_join(zip.output,state.output,by=c("Industry.Code")) %>% - mutate(share_output_state = ifelse(state_output > 0, Total.Output/state_output,0)) %>% - dplyr::select(-state_output) -summary(zip.output$share_output_state) - -rm(cluster.output,state.output) - -## JOIN ZIP CODE SHARE OF OUTPUT TO IMPLAN MULTIPLIERS, CALCULATE EFFECT FOR EACH ZIP CODE, ADD UP ACROSS INDUSTRIES - -### MRIO -mrio.multipliers <- left_join(mrio,zip.output,by=c("IndustryCode"="Industry.Code","cluster")) %>% - mutate(emp.rev = emp.rev*share_output, - ec.rev = ec.rev*share_output, - emp.li = emp.li*share_output, - ec.li = ec.li*share_output) %>% - group_by(OriginRegion,cluster,zip,ImpactType,county,ind_type) %>% - summarize(emp.rev = sum(emp.rev, na.rm=TRUE), - ec.rev = sum(ec.rev, na.rm=TRUE), - emp.li = sum(emp.li, na.rm=TRUE), - ec.li = sum(ec.li, na.rm=TRUE)) %>% - ungroup() - - -mrio.multipliers <- pivot_wider(mrio.multipliers, - id_cols=c("zip","county","cluster","OriginRegion","ImpactType"),values_from = c("emp.rev","ec.rev","emp.li","ec.li"), names_from = "ind_type") %>% - mutate(emp.rev_SI01 = ifelse(is.na(emp.rev_SI01)==TRUE,0,emp.rev_SI01), - emp.rev_SI02 = ifelse(is.na(emp.rev_SI02)==TRUE,0,emp.rev_SI02), - emp.rev_SI03 = ifelse(is.na(emp.rev_SI03)==TRUE,0,emp.rev_SI03), - ec.rev_SI01 = ifelse(is.na(ec.rev_SI01)==TRUE,0,ec.rev_SI01), - ec.rev_SI02 = ifelse(is.na(ec.rev_SI02)==TRUE,0,ec.rev_SI02), - ec.rev_SI03 = ifelse(is.na(ec.rev_SI03)==TRUE,0,ec.rev_SI03), - emp.li_SI01 = ifelse(is.na(emp.li_SI01)==TRUE,0,emp.li_SI01), - emp.li_SI02 = ifelse(is.na(emp.li_SI02)==TRUE,0,emp.li_SI02), - emp.li_SI03 = ifelse(is.na(emp.li_SI03)==TRUE,0,emp.li_SI03), - ec.li_SI01 = ifelse(is.na(ec.li_SI01)==TRUE,0,ec.li_SI01), - ec.li_SI02 = ifelse(is.na(ec.li_SI02)==TRUE,0,ec.li_SI02), - ec.li_SI03 = ifelse(is.na(ec.li_SI03)==TRUE,0,ec.li_SI03)) - -### NOT MRIO -not.mrio.multipliers <- left_join(not.mrio,zip.output,by=c("IndustryCode"="Industry.Code","cluster")) %>% - mutate(emp.rev = emp.rev*share_output, - ec.rev = ec.rev*share_output, - emp.li = emp.li*share_output, - ec.li = ec.li*share_output) %>% - group_by(OriginRegion,cluster,zip,ImpactType,county,ind_type) %>% - summarize(emp.rev = sum(emp.rev, na.rm=TRUE), - ec.rev = sum(ec.rev, na.rm=TRUE), - emp.li = sum(emp.li, na.rm=TRUE), - ec.li = sum(ec.li, na.rm=TRUE)) %>% - ungroup() - - -not.mrio.multipliers <- pivot_wider(not.mrio.multipliers, - id_cols=c("zip","county","cluster","OriginRegion","ImpactType"),values_from = c("emp.rev","ec.rev","emp.li","ec.li"), names_from = "ind_type") %>% - mutate(emp.rev_SI01 = ifelse(is.na(emp.rev_SI01)==TRUE,0,emp.rev_SI01), - emp.rev_SI02 = ifelse(is.na(emp.rev_SI02)==TRUE,0,emp.rev_SI02), - emp.rev_SI03 = ifelse(is.na(emp.rev_SI03)==TRUE,0,emp.rev_SI03), - ec.rev_SI01 = ifelse(is.na(ec.rev_SI01)==TRUE,0,ec.rev_SI01), - ec.rev_SI02 = ifelse(is.na(ec.rev_SI02)==TRUE,0,ec.rev_SI02), - ec.rev_SI03 = ifelse(is.na(ec.rev_SI03)==TRUE,0,ec.rev_SI03), - emp.li_SI01 = ifelse(is.na(emp.li_SI01)==TRUE,0,emp.li_SI01), - emp.li_SI02 = ifelse(is.na(emp.li_SI02)==TRUE,0,emp.li_SI02), - emp.li_SI03 = ifelse(is.na(emp.li_SI03)==TRUE,0,emp.li_SI03), - ec.li_SI01 = ifelse(is.na(ec.li_SI01)==TRUE,0,ec.li_SI01), - ec.li_SI02 = ifelse(is.na(ec.li_SI02)==TRUE,0,ec.li_SI02), - ec.li_SI03 = ifelse(is.na(ec.li_SI03)==TRUE,0,ec.li_SI03)) - -### STATEWIDE - -state.multipliers <- left_join(statewide,zip.output,by=c("IndustryCode"="Industry.Code")) %>% - mutate(emp.rev = emp.rev*share_output_state, - ec.rev = ec.rev*share_output_state, - emp.li = emp.li*share_output_state, - ec.li = ec.li*share_output_state) %>% - group_by(OriginRegion,zip,ImpactType,county,ind_type) %>% - summarize(emp.rev = sum(emp.rev, na.rm=TRUE), - ec.rev = sum(ec.rev, na.rm=TRUE), - emp.li = sum(emp.li, na.rm=TRUE), - ec.li = sum(ec.li, na.rm=TRUE)) %>% - ungroup() - - -state.multipliers <- pivot_wider(state.multipliers, - id_cols=c("zip","county","OriginRegion","ImpactType"),values_from = c("emp.rev","ec.rev","emp.li","ec.li"), names_from = "ind_type") %>% - mutate(emp.rev_SI01 = ifelse(is.na(emp.rev_SI01)==TRUE,0,emp.rev_SI01), - emp.rev_SI02 = ifelse(is.na(emp.rev_SI02)==TRUE,0,emp.rev_SI02), - emp.rev_SI03 = ifelse(is.na(emp.rev_SI03)==TRUE,0,emp.rev_SI03), - ec.rev_SI01 = ifelse(is.na(ec.rev_SI01)==TRUE,0,ec.rev_SI01), - ec.rev_SI02 = ifelse(is.na(ec.rev_SI02)==TRUE,0,ec.rev_SI02), - ec.rev_SI03 = ifelse(is.na(ec.rev_SI03)==TRUE,0,ec.rev_SI03), - emp.li_SI01 = ifelse(is.na(emp.li_SI01)==TRUE,0,emp.li_SI01), - emp.li_SI02 = ifelse(is.na(emp.li_SI02)==TRUE,0,emp.li_SI02), - emp.li_SI03 = ifelse(is.na(emp.li_SI03)==TRUE,0,emp.li_SI03), - ec.li_SI01 = ifelse(is.na(ec.li_SI01)==TRUE,0,ec.li_SI01), - ec.li_SI02 = ifelse(is.na(ec.li_SI02)==TRUE,0,ec.li_SI02), - ec.li_SI03 = ifelse(is.na(ec.li_SI03)==TRUE,0,ec.li_SI03)) - -rm(zip.output) - -## JOIN ZIP CODE EFFECTS TO LODES DATA AND MULTIPLY BY THE SHARE OF WORKERS IN EACH ZIP CODE WORKING IN DIFFERENT CENSUS TRACTS -df.zip <- mutate(df.zip, - ZIP = as.numeric(ZIP)) - -### MRIO -mrio.multipliers <- left_join(mrio.multipliers,df.zip,by=c("zip"="ZIP")) %>% - mutate(emp.rev_SI01 = emp.rev_SI01*SI01_share, - emp.rev_SI02 = emp.rev_SI02*SI02_share, - emp.rev_SI03 = emp.rev_SI03*SI03_share, - ec.rev_SI01 = ec.rev_SI01*SI01_share, - ec.rev_SI02 = ec.rev_SI02*SI02_share, - ec.rev_SI03 = ec.rev_SI03*SI03_share, - emp.rev = emp.rev_SI01+emp.rev_SI02+emp.rev_SI03, - ec.rev = ec.rev_SI01+ec.rev_SI02+ec.rev_SI03, - emp.li_SI01 = emp.li_SI01*SI01_share, - emp.li_SI02 = emp.li_SI02*SI02_share, - emp.li_SI03 = emp.li_SI03*SI03_share, - ec.li_SI01 = ec.li_SI01*SI01_share, - ec.li_SI02 = ec.li_SI02*SI02_share, - ec.li_SI03 = ec.li_SI03*SI03_share, - emp.li = emp.li_SI01+emp.li_SI02+emp.li_SI03, - ec.li = ec.li_SI01+ec.li_SI02+ec.li_SI03) %>% - group_by(OriginRegion,cluster,h_tract_geocode,county,ImpactType) %>% - summarize(emp.rev = sum(emp.rev,na.rm=TRUE), - ec.rev = sum(ec.rev,na.rm=TRUE), - emp.li = sum(emp.li,na.rm=TRUE), - ec.li = sum(ec.li,na.rm=TRUE)) - -### NOT MRIO -not.mrio.multipliers <- left_join(not.mrio.multipliers,df.zip,by=c("zip"="ZIP")) %>% - mutate(emp.rev_SI01 = emp.rev_SI01*SI01_share, - emp.rev_SI02 = emp.rev_SI02*SI02_share, - emp.rev_SI03 = emp.rev_SI03*SI03_share, - ec.rev_SI01 = ec.rev_SI01*SI01_share, - ec.rev_SI02 = ec.rev_SI02*SI02_share, - ec.rev_SI03 = ec.rev_SI03*SI03_share, - emp.rev = emp.rev_SI01+emp.rev_SI02+emp.rev_SI03, - ec.rev = ec.rev_SI01+ec.rev_SI02+ec.rev_SI03, - emp.li_SI01 = emp.li_SI01*SI01_share, - emp.li_SI02 = emp.li_SI02*SI02_share, - emp.li_SI03 = emp.li_SI03*SI03_share, - ec.li_SI01 = ec.li_SI01*SI01_share, - ec.li_SI02 = ec.li_SI02*SI02_share, - ec.li_SI03 = ec.li_SI03*SI03_share, - emp.li = emp.li_SI01+emp.li_SI02+emp.li_SI03, - ec.li = ec.li_SI01+ec.li_SI02+ec.li_SI03) %>% - group_by(OriginRegion,cluster,h_tract_geocode,county,ImpactType) %>% - summarize(emp.rev = sum(emp.rev,na.rm=TRUE), - ec.rev = sum(ec.rev,na.rm=TRUE), - emp.li = sum(emp.li,na.rm=TRUE), - ec.li = sum(ec.li,na.rm=TRUE)) - -### STATEWIDE -state.multipliers <- left_join(state.multipliers,df.zip,by=c("zip"="ZIP")) %>% - mutate(emp.rev_SI01 = emp.rev_SI01*SI01_share, - emp.rev_SI02 = emp.rev_SI02*SI02_share, - emp.rev_SI03 = emp.rev_SI03*SI03_share, - ec.rev_SI01 = ec.rev_SI01*SI01_share, - ec.rev_SI02 = ec.rev_SI02*SI02_share, - ec.rev_SI03 = ec.rev_SI03*SI03_share, - emp.rev = emp.rev_SI01+emp.rev_SI02+emp.rev_SI03, - ec.rev = ec.rev_SI01+ec.rev_SI02+ec.rev_SI03, - emp.li_SI01 = emp.li_SI01*SI01_share, - emp.li_SI02 = emp.li_SI02*SI02_share, - emp.li_SI03 = emp.li_SI03*SI03_share, - ec.li_SI01 = ec.li_SI01*SI01_share, - ec.li_SI02 = ec.li_SI02*SI02_share, - ec.li_SI03 = ec.li_SI03*SI03_share, - emp.li = emp.li_SI01+emp.li_SI02+emp.li_SI03, - ec.li = ec.li_SI01+ec.li_SI02+ec.li_SI03) %>% - group_by(OriginRegion,h_tract_geocode,county,ImpactType) %>% - summarize(emp.rev = sum(emp.rev,na.rm=TRUE), - ec.rev = sum(ec.rev,na.rm=TRUE), - emp.li = sum(emp.li,na.rm=TRUE), - ec.li = sum(ec.li,na.rm=TRUE)) - - -########################################################################### - -# DIRECT IMPACTS--IMPLAN MULTIPLIER * SHARE OF OUTPUT AT EACH REFINERY CENSUS TRACT * LODES SHARES AT TRACT LEVEL -## IMPLAN MULTIPLIERS -mrio <- filter(mrio, ImpactType=="Direct") -statewide <- filter(statewide,ImpactType=="Direct") - -## SHARE WORKERS IN EACH REFINERY CENSUS TRACT LIVING IN RESIDENTIAL CENSUS TRACT R - -w.tract.total <- group_by(df.tract, - w_tract_geocode) %>% - summarize(S000_w = sum(S000,na.rm=TRUE), - SI01_w = sum(SI01,na.rm=TRUE)) %>% - ungroup() - -wh.tract.share <- left_join(df.tract,w.tract.total,by="w_tract_geocode") %>% - mutate(S000_share = ifelse(S000_w > 0, S000/S000_w, 0), - SI01_share = ifelse(SI01_w > 0, SI01/SI01_w, 0)) %>% - filter(w_tract_geocode == "06037980002" | - w_tract_geocode == "06037980030" | - w_tract_geocode == "06013378000" | - w_tract_geocode == "06095252102" | - w_tract_geocode == "06029002401" | - w_tract_geocode == "06037980014" | - w_tract_geocode == "06037980005" | - w_tract_geocode == "06029000507" | - w_tract_geocode == "06013320001" | - w_tract_geocode == "06013315000" | - w_tract_geocode == "06013358000" | - w_tract_geocode == "06037980015" | - w_tract_geocode == "06079012306" | - w_tract_geocode == "06037553502" | - w_tract_geocode == "06029000507") %>% - dplyr::select(w_tract_geocode,h_tract_geocode,S000_share,SI01_share) %>% - mutate(refinery_name = ifelse(w_tract_geocode == "06037980002","Marathon Carson", - ifelse(w_tract_geocode == "06037980030","Chevron El Segundo", - ifelse(w_tract_geocode == "06013378000","Chevron Richmond", - ifelse(w_tract_geocode == "06095252102","Valero Benicia", - ifelse(w_tract_geocode == "06029002401","Kern Oil Bakersfield", - ifelse(w_tract_geocode == "06037980014","Valero Wilmington", - ifelse(w_tract_geocode == "06037980005","PBF Torrance", - ifelse(w_tract_geocode == "06029000507","San Joaquin Bakersfield", - ifelse(w_tract_geocode == "06013320001","PBF Martinez", - ifelse(w_tract_geocode == "06013315000","Marathon Golden Eagle", - ifelse(w_tract_geocode == "06013358000","Phillips 66 Rodeo", - ifelse(w_tract_geocode == "06037980015","Phillips 66 Wilmington", - ifelse(w_tract_geocode == "06079012306","Phillips 66 Santa Maria", - ifelse(w_tract_geocode == "06037553502","AltAir Paramount", - ifelse(w_tract_geocode == "06029000507","Global Clean Energy",NA))))))))))))))), - cluster = ifelse((refinery_name=="Marathon Carson" | refinery_name=="Chevron El Segundo" | refinery_name=="Valero Wilmington" | - refinery_name=="PBF Torrance" | refinery_name=="Phillips 66 Wilmington" | refinery_name=="AltAir Paramount"),"south","north")) -summary(wh.tract.share$S000_share) -summary(wh.tract.share$SI01_share) - -mrio <- dplyr::select(mrio, - emp.rev,ec.rev,cluster) %>% - rename(emp.rev.mrio = emp.rev, - ec.rev.mrio = ec.rev) -direct.multipliers <- left_join(wh.tract.share,mrio,by="cluster") -direct.multipliers$emp.rev.state <- statewide$emp.rev -direct.multipliers$ec.rev.state <- statewide$ec.rev - -direct.multipliers <- mutate(direct.multipliers, - emp.rev.mrio = emp.rev.mrio*SI01_share, - ec.rev.mrio = ec.rev.mrio*SI01_share, - emp.rev.state = emp.rev.state*SI01_share, - ec.rev.state = ec.rev.state*SI01_share) %>% - dplyr::select(-S000_share, -SI01_share) - -summary(direct.multipliers$emp.rev.mrio) -summary(direct.multipliers$ec.rev.mrio) -summary(direct.multipliers$emp.rev.state) -summary(direct.multipliers$ec.rev.state) - - - -# COMPARE TO OLD MULTIPLIERS - -mrio.multipliers <- filter(mrio.multipliers, - ImpactType != "Direct") %>% - ungroup() %>% - mutate(county = str_remove_all(county," County"), - region = ifelse((county=="Butte" | county=="Colusa" | county=="El Dorado" | county=="Glenn" | county=="Lassen" | - county=="Modoc" | county=="Nevada" | county=="Placer" | county=="Plumas" | county=="Sacramento" | - county=="Shasta" | county=="Sierra" | county=="Siskiyou" | county=="Sutter" | county=="Tehama" | - county=="Yolo" | county=="Yuba"),"1", - ifelse((county=="Del Norte" | county=="Humboldt" | county=="Lake" | county=="Mendocino" | county=="Napa" | - county=="Sonoma" | county=="Trinity"),"2", - ifelse((county=="Alameda" | county=="Marin" | county=="San Francisco" | county=="San Mateo" | county=="Santa Clara"),"3", - ifelse((county=="Alpine" | county=="Amador" | county=="Calaveras" | county=="Madera" | county=="Mariposa" | - county=="Merced" | county=="Mono" | county=="San Joaquin" | county=="Stanislaus" | county=="Tuolumne"),"4", - ifelse((county=="Monterey" | county=="San Benito" | county=="Santa Barbara" | county=="Santa Cruz" | county=="Ventura"),"5", - ifelse((county=="Fresno" | county=="Inyo" | county=="Kings" | county=="Tulare"),"6", - ifelse((county=="Riverside" | county=="San Bernardino"),"7", - ifelse(county=="Orange","9", - ifelse((county=="Imperial" | county=="San Diego"),"10",county)))))))))) %>% - group_by(region,ImpactType) %>% - summarize(emp.rev = sum(emp.rev,na.rm = FALSE), - ec.rev = sum(ec.rev,na.rm = FALSE)) %>% - ungroup() - - -not.mrio.multipliers <- filter(not.mrio.multipliers, - ImpactType != "Direct") %>% - ungroup() %>% - mutate(county = str_remove_all(county," County"), - region = ifelse((county=="Butte" | county=="Colusa" | county=="El Dorado" | county=="Glenn" | county=="Lassen" | - county=="Modoc" | county=="Nevada" | county=="Placer" | county=="Plumas" | county=="Sacramento" | - county=="Shasta" | county=="Sierra" | county=="Siskiyou" | county=="Sutter" | county=="Tehama" | - county=="Yolo" | county=="Yuba"),"1", - ifelse((county=="Del Norte" | county=="Humboldt" | county=="Lake" | county=="Mendocino" | county=="Napa" | - county=="Sonoma" | county=="Trinity"),"2", - ifelse((county=="Alameda" | county=="Marin" | county=="San Francisco" | county=="San Mateo" | county=="Santa Clara"),"3", - ifelse((county=="Alpine" | county=="Amador" | county=="Calaveras" | county=="Madera" | county=="Mariposa" | - county=="Merced" | county=="Mono" | county=="San Joaquin" | county=="Stanislaus" | county=="Tuolumne"),"4", - ifelse((county=="Monterey" | county=="San Benito" | county=="Santa Barbara" | county=="Santa Cruz" | county=="Ventura"),"5", - ifelse((county=="Fresno" | county=="Inyo" | county=="Kings" | county=="Tulare"),"6", - ifelse((county=="Riverside" | county=="San Bernardino"),"7", - ifelse(county=="Orange","9", - ifelse((county=="Imperial" | county=="San Diego"),"10",county)))))))))) %>% - group_by(region,ImpactType) %>% - summarize(emp.rev = sum(emp.rev,na.rm = FALSE), - ec.rev = sum(ec.rev,na.rm = FALSE)) %>% - ungroup() - -state.multipliers <- filter(state.multipliers, - ImpactType != "Direct") %>% - ungroup() %>% - mutate(county = str_remove_all(county," County"), - region = ifelse((county=="Butte" | county=="Colusa" | county=="El Dorado" | county=="Glenn" | county=="Lassen" | - county=="Modoc" | county=="Nevada" | county=="Placer" | county=="Plumas" | county=="Sacramento" | - county=="Shasta" | county=="Sierra" | county=="Siskiyou" | county=="Sutter" | county=="Tehama" | - county=="Yolo" | county=="Yuba"),"1", - ifelse((county=="Del Norte" | county=="Humboldt" | county=="Lake" | county=="Mendocino" | county=="Napa" | - county=="Sonoma" | county=="Trinity"),"2", - ifelse((county=="Alameda" | county=="Marin" | county=="San Francisco" | county=="San Mateo" | county=="Santa Clara"),"3", - ifelse((county=="Alpine" | county=="Amador" | county=="Calaveras" | county=="Madera" | county=="Mariposa" | - county=="Merced" | county=="Mono" | county=="San Joaquin" | county=="Stanislaus" | county=="Tuolumne"),"4", - ifelse((county=="Monterey" | county=="San Benito" | county=="Santa Barbara" | county=="Santa Cruz" | county=="Ventura"),"5", - ifelse((county=="Fresno" | county=="Inyo" | county=="Kings" | county=="Tulare"),"6", - ifelse((county=="Riverside" | county=="San Bernardino"),"7", - ifelse(county=="Orange","9", - ifelse((county=="Imperial" | county=="San Diego"),"10",county)))))))))) %>% - group_by(region,ImpactType) %>% - summarize(emp.rev = sum(emp.rev,na.rm = FALSE), - ec.rev = sum(ec.rev,na.rm = FALSE)) %>% - ungroup() - - -lodes.xwalk <- fread('ca_xwalk.csv') %>% - dplyr::select(trct,ctyname) %>% - mutate(trct = str_pad(as.character(trct),11,pad="0"), - ctyname = str_remove_all(ctyname," County,CA")) -str(lodes.xwalk) - -## where are new impacts actually felt? all 58 counties -direct.v2 <- inner_join(direct.multipliers,lodes.xwalk,by=c("h_tract_geocode"="trct")) %>% - group_by(ctyname) %>% - summarize(emp.rev.mrio = sum(emp.rev.mrio,na.rm = FALSE), - ec.rev.mrio = sum(ec.rev.mrio,na.rm = FALSE), - emp.rev.state = sum(emp.rev.state,na.rm = FALSE), - ec.rev.state = sum(ec.rev.state,na.rm = FALSE)) %>% - ungroup() %>% - mutate(ec.rev.mrio.per.worker = ec.rev.mrio/emp.rev.mrio) -summary(direct.v2$ec.rev.mrio.per.worker) - -fwrite(direct.v2, 'direct_impact_by_home_county.csv') - -direct.multipliers <- mutate(direct.multipliers, - county = ifelse((refinery_name=="Marathon Golden Eagle" | refinery_name=="Chevron Richmond" | - refinery_name=="PBF Martinez" | refinery_name=="Phillips 66 Rodeo"),"Contra Costa", - ifelse((refinery_name=="Marathon Carson" | refinery_name=="Chevron El Segundo" | - refinery_name=="Valero Wilmington" | refinery_name=="PBF Torrance" | - refinery_name=="Phillips 66 Wilmington" | refinery_name=="AltAir Paramount"), "Los Angeles", - ifelse((refinery_name=="Valero Benicia"),"Solano", - ifelse((refinery_name=="Kern Oil Bakersfield" | refinery_name=="San Joaquin Bakersfield"),"Kern", - ifelse(refinery_name=="Phillips 66 Santa Maria","San Luis Obispo",NA)))))) %>% - group_by(county) %>% - summarize(emp.rev.mrio = sum(emp.rev.mrio,na.rm = FALSE), - ec.rev.mrio = sum(ec.rev.mrio,na.rm = FALSE), - emp.rev.state = sum(emp.rev.state,na.rm = FALSE), - ec.rev.state = sum(ec.rev.state,na.rm = FALSE)) %>% - mutate(n_refineries = ifelse(county=="Contra Costa",4, - ifelse(county=="Los Angeles",6, - ifelse(county=="Solano",1, - ifelse(county=="Kern",2, - ifelse(county=="San Luis Obispo",1,NA)))))) %>% - ungroup() - -### COMPARISON IS OLD MULTIPLIERS -old.mult <- fread('old_multipliers.csv') %>% - filter(ImpactType=="Direct") %>% - rename(old_emp = Employment, - old_ec = EmployeeCompensation) %>% - mutate(county = str_remove_all(DestinationRegion," County, CA"), - county = trimws(county)) %>% - dplyr::select(county, old_emp, old_ec) -str(old.mult) - -old.mult.indir.indu <- fread('old_multipliers.csv') %>% - filter(ImpactType=="Indirect" | ImpactType=="Induced") %>% - rename(old_emp = Employment, - old_ec = EmployeeCompensation) %>% - mutate(county = str_remove_all(DestinationRegion," County, CA"), - county = trimws(county)) %>% - dplyr::select(county,ImpactType, old_emp, old_ec) %>% - group_by(county,ImpactType) %>% - summarize(old_emp = sum(old_emp,na.rm=TRUE), - old_ec = sum(old_ec, na.rm=TRUE)) %>% - ungroup() -str(old.mult.indir.indu) - -comparison.df <- left_join(direct.multipliers,old.mult,by="county") -fwrite(comparison.df,'multiplier_comparison.csv') - -comparison.df.indir.indu <- left_join(mrio.multipliers,old.mult.indir.indu,by=c("region"="county","ImpactType")) - - -statewide.indir.indu <- filter(rev.statewide, ImpactType != "Direct") %>% - group_by(DestinationRegion,ImpactType) %>% - summarize(emp.rev = sum(emp.rev, na.rm=TRUE), - ec.rev = sum(ec.rev, na.rm=TRUE)) - -li.statewide <- filter(statewide, ImpactType=="Induced") %>% - group_by(DestinationRegion) %>% - summarize(emp.li = sum(emp.li, na.rm=TRUE), - ec.li = sum(ec.li, na.rm=TRUE)) - - - diff --git a/archive-from-repo/srm-120-exploration.R b/archive-from-repo/srm-120-exploration.R deleted file mode 100644 index d43dd16..0000000 --- a/archive-from-repo/srm-120-exploration.R +++ /dev/null @@ -1,426 +0,0 @@ -## tracey mangin -## july 7, 2025 -## srm exploration for refinery 120 - -## attach libraries -library(data.table) -library(sf) -library(rnaturalearth) -library(rnaturalearthhires) -library(tidyverse) - -## user -user <- "vincent-home" - -## paths -## ------------------------------------------- - -# list paths -list_paths <- c( - "tracey-laptop" = "/Users/traceymangin/Library/CloudStorage/GoogleDrive-tmangin@ucsb.edu/Shared\ drives/emlab/projects/current-projects/calepa-cn/", - "tracey-desktop" = "/Users/tracey/Library/CloudStorage/GoogleDrive-tmangin@ucsb.edu/Shared\ drives/emlab/projects/current-projects/calepa-cn/", - "vincent-work" = "H://Shared drives/emlab/projects/current-projects/calepa-cn", - "vincent-home" = "G://Shared drives/emlab/projects/current-projects/calepa-cn", - "meas" = "data" - ) - -# set main path -main_path <- list_paths[user] - -file_inmap_re <- file.path(main_path, - "data-staged-for-deletion/health/source_receptor_matrix/inmap_processed_srm/refining") - -file_refin_locs <- file.path(main_path, - "/data-staged-for-deletion/stocks-flows/processed/refinery_lat_long_revised.csv") - -file_refin_locs_orig <- file.path(main_path, - "data-staged-for-deletion/GIS/raw/Petroleum_Refineries_US_EIA/Petroleum_Refineries_US_2019_v2.shp" -) - -ca_crs <- 3310 - -## functions -## -------------------------------------------- - -read_inmap_data <- function(inmap_path, bsite) { - - if (bsite != 120) { - - nh3 <- fread( - paste0(inmap_path, "/nh3/srm_nh3_site", bsite, ".csv"), - header = TRUE, - colClasses = c(GEOID = "character") - ) - } else {nh3 <- data.table()} - - nox <- fread( - paste0(inmap_path, "/nox/srm_nox_site", bsite, ".csv"), - header = TRUE, - colClasses = c(GEOID = "character") - ) - pm25 <- fread( - paste0(inmap_path, "/pm25/srm_pm25_site", bsite, ".csv"), - header = TRUE, - colClasses = c(GEOID = "character") - ) - sox <- fread( - paste0(inmap_path, "/sox/srm_sox_site", bsite, ".csv"), - header = TRUE, - colClasses = c(GEOID = "character") - ) - voc <- fread( - paste0(inmap_path, "/voc/srm_voc_site", bsite, ".csv"), - header = TRUE, - colClasses = c(GEOID = "character") - ) - - nh3[, pollutant := "nh3"] - nox[, pollutant := "nox"] - pm25[, pollutant := "pm25"] - sox[, pollutant := "sox"] - voc[, pollutant := "voc"] - - all_pollutants <- rbind(nox, pm25, sox, voc, nh3, fill = TRUE) - all_pollutants[, site := bsite] - -} - -process_weighted_pm25 <- function(dt_inmap_re) { - dt <- copy(dt_inmap_re) - setnames(dt, "totalpm25_aw", "weighted_totalpm25") - - dt_wide <- dcast( - dt, - GEOID + site ~ pollutant, - value.var = "weighted_totalpm25" - ) - setnames( - dt_wide, - c("nh3", "nox", "pm25", "sox", "voc"), - paste0("weighted_totalpm25_", c("nh3", "nox", "pm25", "sox", "voc")) - ) - - dt_wide <- dt_wide[!is.na(GEOID)] - - setnames(dt_wide, "site", "site_id") - - dt_wide <- unique(dt_wide) - - dt_wide -} - -read_refin_locs <- function(file_refin_locs, file_refin_locs_orig, ca_crs) { - refin_crs <- st_crs(st_read(file_refin_locs_orig)) - - ## Refineries plus - refin_new_locations <- fread(file_refin_locs) %>% - mutate(coords = gsub("^c\\(|\\)$", "", geometry)) %>% - separate(coords, c("lon", "lat"), sep = ",") %>% - select(-geometry) %>% - st_as_sf( - coords = c("lon", "lat"), - crs = refin_crs - ) %>% - st_transform(ca_crs) -} - - -## read data -## -------------------------------------------- - -buff_sites <- c( - 97, - 119, - 120, - 164, - 202, - 209, - 226, - 271, - 279, - 332, - 342, - 343, - 800, - 3422, - 34222, - 99999 -) - -# refinery locations -refin_locs <- read_refin_locs(file_refin_locs, - file_refin_locs_orig, - ca_crs -) - -# read inputs -dt_inmap_re <- rbindlist(lapply( - buff_sites, - read_inmap_data, - inmap_path = file_inmap_re -)) - -# process srm -srm_weighted_pm25 <- process_weighted_pm25(dt_inmap_re) - -## find closest refineries -## -------------------------------------------------- - -# Select the reference point (e.g., id == "A") -ref_point <- refin_locs[refin_locs$site_id == 120, ] - -# Compute distances from the reference point to all others -distances <- st_distance(ref_point, refin_locs) - -# Optional: add to the original data -refin_locs$distance_to_120 <- as.numeric(distances) # units in meters by default - -# rank -refin_locs$dist_rank <- rank(refin_locs$distance_to_120, ties.method = "min") - -# disance in km -refin_locs$dist_km <- refin_locs$distance_to_120 / 1000 - -## modify so that 120 doesn't count -refin_locs <- refin_locs |> - mutate(dist_rank = ifelse(site_id == 120, 0, dist_rank - 1), - site_name = paste0(site_id, " dist = ", round(dist_km, 1), " km")) - -refin_locs <- refin_locs %>% - mutate(site_name = fct_reorder(site_name, dist_rank)) - -# usa <- ne_states(country = "united states of america", returnclass = "sf") -# california <- usa[usa$name == "California", ] -# -# california <- st_transform(california, ca_crs) -# -# refinery_fig <- ggplot() + -# geom_sf(data = california, fill = NA, color = "black") + -# geom_sf(data = refin_locs, aes(color = site_id), alpha = 0.7, size = 1) + # point locations -# # geom_sf_text(data = refin_locs, aes(label = site_id), nudge_y = 0.05) + # labels -# theme_minimal() -# -# plotly::ggplotly(refinery_fig) - -## compute ratio, NH3 to PM2.5 -## -------------------------------------------- - -srm_ratio_df_nh3 <- srm_weighted_pm25 |> - select(GEOID, site_id, weighted_totalpm25_nh3) - -srm_ratio_df <- srm_weighted_pm25 |> - pivot_longer(weighted_totalpm25_nh3:weighted_totalpm25_voc, - names_to = "pollutant", - values_to = "concentration") |> - filter(pollutant != "weighted_totalpm25_nh3") |> - left_join(srm_ratio_df_nh3) |> - mutate(site_id = as.character(site_id), - ratio_nh3_pol = weighted_totalpm25_nh3 / concentration) |> - left_join(refin_locs |> - select(site_id, cluster, distance_to_120, dist_rank, site_name, geometry)) |> - mutate(pollutant_name = str_remove(pattern = "weighted_totalpm25_", pollutant)) - -allboxplot <- ggplot(srm_ratio_df |> filter(site_id != 120, - cluster == "Bay Area"), aes(x = pollutant_name, y = ratio_nh3_pol)) + - geom_boxplot() + - facet_wrap(~ site_name, scales = "fixed") + # or facet_grid(pollutant ~ site_id) - scale_fill_brewer(palette = "Set2") + # or manual colors - labs(y = "concentration ratio: NH3 to pollutant", - x = NULL) + - theme_minimal() + - theme( - axis.text.x = element_text(angle = 45, hjust = 1), - strip.background = element_rect(fill = "white", color = NA), - strip.text = element_text(face = "bold") - ) - -ggsave(filename = "srm_ratio_pollutant_pm25.png", - plot = allboxplot, - path = here::here("outputs", "exploratory", "exploratory-figs"), - width = 8, - height = 6, - dpi = 300) - - -boxplot_summary_df <- srm_ratio_df |> - filter(!site_id %in% c(120, 3422), - cluster == "Bay Area", - pollutant_name == "pm25") |> - group_by(site_id, site_name, pollutant) |> - summarise( - Q1 = quantile(ratio_nh3_pol, 0.25, na.rm = TRUE), - Median = quantile(ratio_nh3_pol, 0.5, na.rm = TRUE), - Q3 = quantile(ratio_nh3_pol, 0.75, na.rm = TRUE), - IQR = IQR(ratio_nh3_pol, na.rm = TRUE), - Lower_Whisker = max(min(ratio_nh3_pol), Q1 - 1.5 * IQR), - Upper_Whisker = min(max(ratio_nh3_pol), Q3 + 1.5 * IQR) - ) - -ratio_fig <- ggplot(srm_ratio_df |> filter(!site_id %in% c(120, 3422), - cluster == "Bay Area", - pollutant_name == "pm25"), - aes(x = site_name, y = ratio_nh3_pol)) + - geom_boxplot() + - geom_text(data = boxplot_summary_df, aes(x = site_name, y = Median, label = round(Median, 2)), - vjust = -0.5, size = 3, color = "black") + - labs(y = "concentration ratio: NH3 to PM2.5", - x = NULL) + - theme_minimal() + - theme(axis.text.x = element_text(angle = 45, hjust = 1), - strip.background = element_rect(fill = "white", color = NA), - strip.text = element_text(face = "bold") - ) - -ggsave(filename = "srm_ratio_nh3_pm25.png", - plot = ratio_fig, - path = here::here("exploratory", "exploratory", "exploratory-figs"), - width = 8, - height = 6, - dpi = 300) - -## repeat, 120 PM2.5 to other site PM2.5 -## -------------------------------------------- - -srm_ratio_df_120 <- srm_weighted_pm25 |> - filter(site_id == 120) |> - select(GEOID, pm25_120 = weighted_totalpm25_pm25) - -srm_ratio_pm25_df <- srm_weighted_pm25 |> - filter(site_id != 120) |> - select(GEOID, site_id, pm25 = weighted_totalpm25_pm25) |> - left_join(srm_ratio_df_120) |> - mutate(site_id = as.character(site_id), - ratio_pm25 = pm25_120 / pm25) |> - left_join(refin_locs |> - select(site_id, cluster, distance_to_120, dist_rank, site_name, geometry)) - -pm25_boxplot_summary_df <- srm_ratio_pm25_df |> - filter(!site_id %in% c(120, 3422), - cluster == "Bay Area") |> - group_by(site_id, site_name) |> - summarise( - Q1 = quantile(ratio_pm25, 0.25, na.rm = TRUE), - Median = quantile(ratio_pm25, 0.5, na.rm = TRUE), - Q3 = quantile(ratio_pm25, 0.75, na.rm = TRUE), - IQR = IQR(ratio_pm25, na.rm = TRUE), - Lower_Whisker = max(min(ratio_pm25), Q1 - 1.5 * IQR), - Upper_Whisker = min(max(ratio_pm25), Q3 + 1.5 * IQR) - ) - -pm25_ratio_fig <- ggplot(srm_ratio_pm25_df |> filter(!site_id %in% c(120, 3422), - cluster == "Bay Area"), - aes(x = site_name, y = ratio_pm25)) + - geom_boxplot() + - geom_text(data = pm25_boxplot_summary_df, aes(x = site_name, y = Median, label = round(Median, 2)), - vjust = -0.5, size = 3, color = "black") + - labs(y = "Concentration ratio: site 120 PM2.5 to PM2.5", - x = NULL) + - theme_minimal() + - theme(axis.text.x = element_text(angle = 45, hjust = 1), - strip.background = element_rect(fill = "white", color = NA), - strip.text = element_text(face = "bold") - ) - -ggsave(filename = "srm_ratio_120pm25_pm25.png", - plot = pm25_ratio_fig, - path = here::here("exploratory", "exploratory", "exploratory-figs"), - width = 8, - height = 6, - dpi = 300) - -pm25_ratio_fig_no <- ggplot(srm_ratio_pm25_df |> filter(!site_id %in% c(120, 3422), - cluster == "Bay Area"), - aes(x = site_name, y = ratio_pm25)) + - geom_boxplot(outlier.shape = NA) + - geom_text(data = pm25_boxplot_summary_df, aes(x = site_name, y = Median, label = round(Median, 2)), - vjust = -0.2, size = 3, color = "black") + - labs(y = "Concentration ratio: site 120 PM2.5 to PM2.5", - x = NULL) + - ylim(0.75, 1.3) + - theme_minimal() + - theme(axis.text.x = element_text(angle = 45, hjust = 1), - strip.background = element_rect(fill = "white", color = NA), - strip.text = element_text(face = "bold") - ) - -ggsave(filename = "srm_ratio_120pm25_pm25_no_outliers.png", - plot = pm25_ratio_fig_no, - path = here::here("exploratory", "exploratory", "exploratory-figs"), - width = 8, - height = 6, - dpi = 300) - -#### importance of NH3 - -#across sites -total <- srm_weighted_pm25 %>% - #filter(!(site_id %in% "120"))%>% - group_by(site_id)%>% - mutate(across(starts_with("weighted"), sum))%>% - select(-GEOID)%>% - ungroup()%>% - unique()%>% - gather("poll", "total_pm25", -site_id)%>% - mutate(poll = toupper(gsub("^.*_", "", poll))) - -#refinery specific EF -ef <- fread(paste0(main_path,"/data-staged-for-deletion/health/processed/refinery_emission_factor.csv"), - stringsAsFactors = F)%>% - mutate(ton_bbl = 0.001*kg_bbl)%>% - select(-kg_bbl) - -poll_importance <- ef %>% - mutate(pollutant_code = ifelse(pollutant_code == "SO2", "SOX", pollutant_code), - pollutant_code = ifelse(pollutant_code == "PM25-PRI", "PM25", pollutant_code))%>% - full_join(total, by = c("id1"="site_id", "pollutant_code"= "poll"))%>% - mutate(total_pm25_bbl = ton_bbl*total_pm25) - -#cluster level EF -ef_cluster <- fread(paste0(main_path,"/data-staged-for-deletion/health/processed/cluster_emission_factor_v2.csv"), - stringsAsFactors = F)%>% - mutate(ton_bbl = 0.001*kg_bbl)%>% - select(-kg_bbl) - -site_cluster <- fread(paste0(main_path,"/data-staged-for-deletion/health/raw/ref_match/ref_to_match_eia.csv"), - stringsAsFactors = F)%>% - select(site_id, cluster) - - -poll_importance <- ef_cluster %>% - mutate(pollutant_code = ifelse(pollutant_code == "SO2", "SOX", pollutant_code), - pollutant_code = ifelse(pollutant_code == "PM25-PRI", "PM25", pollutant_code))%>% - right_join(total %>% left_join(site_cluster, by = c("site_id")) %>% drop_na(cluster), - by = c("cluster", "pollutant_code"="poll"))%>% - mutate(total_pm25_bbl = ton_bbl*total_pm25) - -#tot pm25 dispersed per barrel -poll_importance %>% - group_by(site_id)%>% - mutate(total_site_pm25 = sum(total_pm25_bbl,na.rm = T), - share = total_pm25_bbl/total_site_pm25)%>% - ungroup()%>% - ggplot(aes(x= as.factor(site_id), y = share))+ - geom_point()+ - facet_wrap(~pollutant_code)+ - labs(x = "Site ID", y = "Share of total dispersed secondary PM2.5 dispersed per site per barrel")+ - theme_gray(16) - -#tot pm25 dispersed per ton of precursor -poll_importance %>% - group_by(site_id)%>% - mutate(total_site_pm25 = sum(total_pm25,na.rm = T), - share = total_pm25/total_site_pm25)%>% - ungroup()%>% - ggplot(aes(x= as.factor(id1), y = share))+ - geom_point()+ - facet_wrap(~pollutant_code)+ - labs(x = "Site ID", y = "Share of total secondary PM2.5 dispersed per site per ton emitted")+ - theme_gray(16) - -#what is site 800? its a renewable fuel - -ref_analysis <- fread(paste0(main_path,"/data-staged-for-deletion/stocks-flows/processed/refinery_loc_cap_manual.csv"), - stringsAsFactors = F) - -ref <- fread(paste0(main_path,"/data-staged-for-deletion/stocks-flows/processed/refinery_lat_long.csv"), - stringsAsFactors = F) diff --git a/archive-from-repo/stata/0_data_prep.do b/archive-from-repo/stata/0_data_prep.do deleted file mode 100644 index 07bfe65..0000000 --- a/archive-from-repo/stata/0_data_prep.do +++ /dev/null @@ -1,198 +0,0 @@ - -******************************************************************************** -******************************************************************************** -global startDir "/Users/paigeweber/Dropbox/Refining" -cd $startDir - - - - - - - -******************************************************************************** -******************************************************************************** - -cd data/ - -******************************************************************************** -* refinery bbl processed -import delimited "reg_refin_crude_receipts.csv", clear - -gen ym = ym(year,month) -format ym %tm - -destring bbls, replace force - -keep ym bbls region - -sort ym region -bysort ym region: egen bbl_r = sum(bbls) -bysort ym region: gen count = _n - -replace bbl_r = bbl_r/10^6 -label variable bbl_r "bbl millions" -drop bbls -keep if count ==1 -drop count -rename bbl_r bbl -reshape wide bbl, i(ym) j(region) string - - - - -reshape long bbl, i(ym) j(product) string - -sort ym product - -gen tho_bbl = bbl*10^3 -label variable tho_bbl "thousands of barrels" - -drop bbl - -save "reg_refin_ym.dta", replace - -isid ym product -******************************************************************************** - - -clear -import delimited "Cushing_OK_WTI_Spot_Price_FOB.csv", clear - -rename cushing* WTI - -split(month), parse("-") -drop month - -rename month2 year -destring year, replace - -gen year2 = 2000 + year - -replace year2 = year2-100 if year2>2023 -tab year2 - - -drop year -rename year2 year - -rename month1 month - -gen month2 = month(date(month,"M")) -drop month -rename month2 month -gen ym = ym(year,month) -format ym %tm - -save "WTI_monthly_1986_2023.dta", replace -******************************************************************************** - -import excel "Finished_Products_Movements.xlsx", sheet("Gasoline Chart Data") cellrange(A5:FB24) clear -** UNITS IN THIS SHEET ARE THOUSANDS OF BARRELS ** -duplicates drop - -rename A product - -drop if product =="" - - -foreach v of varlist C-FB{ - - rename `v' date_`v' -} - -drop B - -reshape long date, i(product) j(ym) string - -rename date quantity - -egen seq month = seq(), f(1) t(12) -egen seq year = seq(), f(2007) t(2019) b(12) - -drop ym - -gen date = mdy(month, 1, year) -format date %td - -gen ym = ym(year, month) -format ym %tm - -drop date - -*reshape wide to construct net variables -drop month year -br - -isid ym product - -rename quantity tho_bbl - -* clean up product names -replace product = trim(product) - -replace product = "NC_FEx" if product =="NC Foreign Export" -replace product = "NC_FIm" if product =="NC Foreign Import" -replace product = "NC_NetIm" if product =="NC Net Imports" -replace product = "NC_InterEx" if product =="NC Interstate Export" -replace product = "NC_InterIm" if product =="NC Interstate Import" -replace product = "NC_Reno" if product =="NC Reno (North)" -replace product = "N_to_S" if product =="North to South" -replace product = "S_to_N" if product =="South to North" - -replace product = "Gas_BlndStck" if product =="Product: Gasoline & Blendstocks" -replace product = "SC_CalEvn_W_Adj" if product =="SC CalNEv P/L (West) Adjusted" -replace product = "SC_FEx" if product =="SC Foreign Export" -replace product = "SC_FIm" if product =="SC Foreign Import" -replace product = "SC_InterEx" if product =="SC Interstate Export" -replace product = "SC_InterIm" if product =="SC Interstate Import" - -replace product = "SC_W_Adj" if product =="SC Phoenix (West) Adjusted" -replace product = "Pipeline_KM" if product =="Source: Pipeline (KM Export Spreadsheet)" - -replace product = "SC_W_Adj" if product =="SC Phoenix (West) Adjusted" -replace product = "Pipeline_SC" if product =="Total SC Pipeline" - - -replace product = "SC_NetIm" if product =="SC Net Imports" - - -isid ym product - - - - -merge m:1 ym using "WTI_monthly_1986_2023" - -keep if _merge ==3 - -tab year - -drop _merge - -append using "reg_refin_ym" - -drop year -gen date = dofm(ym) -format date %d -gen year = year(date) - -keep if year >2006 - -sort ym product - -order ym product - -drop month - -gen month = month(date) - -bysort ym: carryforward WTI, replace - -tab year - -isid ym product - -drop if tho_bbl ==. -save "temp.dta", replace - diff --git a/archive-from-repo/stata/1_regressions_figures_stats.do b/archive-from-repo/stata/1_regressions_figures_stats.do deleted file mode 100644 index d547366..0000000 --- a/archive-from-repo/stata/1_regressions_figures_stats.do +++ /dev/null @@ -1,304 +0,0 @@ - - - - - -******************************************************************************** -******************************************************************************** -global startDir "/Users/paigeweber/Dropbox/Refining" -cd $startDir - - - - - - - -******************************************************************************** -******************************************************************************** - - -*run code/0_data_prep.do // this creates temp.dta for analysis - - -use "data/temp.dta", clear - -drop if tho_bbl ==. - -isid ym product - -rename tho_bbl bbl - -reshape wide bbl, i(ym) j(product) string - -rename bbl* * - -******************************************************************************** -******************************************************************************** - - - - -gen NC_net = NC_FEx + NC_FIm -gen SC_net = SC_FEx + SC_FIm - - -replace NC_net = -1*NC_net -replace SC_net = -1*SC_net - -su NC_net, detail -scalar NCmean = r(mean) - -su SC_net, detail // mean is negative -scalar SCmean = r(mean) - -* rescaling so both are above zero - -scalar pct = 100*(SCmean - NCmean)/SCmean - -di "percent larger exports in NC is:" -di pct - -gen pct = 100*(SC_net - NC_net)/SC_net - -su pct, detail - - -bysort year: egen sum_pct = mean(pct) - -gen pct_mean = . -gen pct_high = . -gen pct_low = . - -su pct, detail -gen pct_all = r(mean) - -foreach y of numlist 2007(1)2020{ - - su pct if year ==`y', detail - replace pct_mean = r(mean) if year ==`y' - replace pct_high = r(mean) + r(sd) if year == `y' - replace pct_low = r(mean) - r(sd) if year == `y' - - } - -set scheme lean1 - -twoway (scatter pct_mean year, msymbol(o) mcolor(blue%60)) /// - (rcap pct_high pct_low year) /// - (line pct_all year, lpattern(dash)), /// - xtitle("") ytitle("Percent", size(medsmall)) /// - xscale(r(2007 2020)) xlabel(2010(2)2020) /// - legend(pos(6) col(3) label(1 "Annual mean") label( 2 "95 Pct. CI") label(3 "Average all years")) /// - title("NC exports compared to SC exports", size(medsmall)) - - - -* sum to year since model does not include monthly - - -bysort year: egen yr_NC_net = sum(NC_net) -bysort year: egen yr_SC_net = sum(SC_net) - -bysort year: egen yr_north = sum(north) -bysort year: egen yr_south = sum(south) - -bysort year: egen yr_WTI = mean(WTI) - -bysort year: gen count = _n -count if count ==1 - -gen northXWTI = north*WTI -gen southXWTI = south*WTI - -gen WTIsq = WTI*WTI -gen northsq = north*north -gen southsq = south*south - -gen yearsq = year*year - - -**************************************************** - - -reghdfe NC_net north -estimates store m0 - -reghdfe NC_net north south WTI -estimates store m1 - -reghdfe NC_net north south WTI northXWTI southXWTI -estimates store m2 - -reghdfe NC_net northsq southsq WTI WTIsq northXWTI southXWTI north south -estimates store m3 - -reghdfe NC_net northsq southsq WTI WTIsq northXWTI southXWTI north south year yearsq -estimates store m3b - -reghdfe NC_net northsq southsq WTI WTIsq northXWTI southXWTI north south year yearsq N_to_S S_to_N -estimates store m3c - - - -reghdfe SC_net south -estimates store m4a - -reghdfe SC_net north south WTI -estimates store m4 - -reghdfe SC_net north south WTI northXWTI southXWTI -estimates store m5 - -reghdfe SC_net north south northsq southsq WTI WTIsq northXWTI southXWTI -estimates store m6 - -reghdfe SC_net north south northsq southsq WTI WTIsq northXWTI southXWTI year yearsq -estimates store m6b - - -reghdfe NC_net northsq southsq WTI WTIsq northXWTI southXWTI north south year yearsq N_to_S S_to_N -estimates store m6c - - -esttab m6b m6c m3b m3c, stats(N r2 stars) p - - - - - - -******************************************************************************** -******************************************************************************** - -gen CA_net = NC_net + SC_net -gen CA = north + south -gen CAXWTI = CA*WTI - -gen CAsq = CA*CA - -reghdfe CA_net CA WTI, absorb(i.year i.month) -estimates store m7 - -reghdfe CA_net CA WTI CAXWTI, absorb(i.year i.month) -estimates store m8 - -reghdfe CA_net CA CAsq WTI WTIsq CAXWTI, absorb(i.year i.month) -estimates store m9 - -esttab m7 m8 m9, stats(N r2 stars) p - - -reg CA_net WTI WTIsq i.year i.month -predict hat - -gen resid = CA_net - hat - -binscatter resid CA - -binscatter CA CA_net - -binscatter north NC_net - -binscatter south SC_net - - -twoway (scatter CA_net CA) /// - (lfit CA_net CA, lpattern(solid) lwidth(medthick) lcolor(midblue)), /// - legend(off) /// - xtitle("In state consumption (tho BBL)", size(small)) ytitle("Net exports (tho BBL)", size(small)) /// - title("California", size(small)) xlabel(,labsize(small)) ylabel(,labsize(small)) - -graph save figures/CA_net.gph, replace - -twoway (scatter NC_net north) /// - (lfit NC_net north, lpattern(solid) lwidth(medthick) lcolor(emerald)), /// - legend(off) /// - xtitle("In state consumption (tho BBL)", size(small)) ytitle("Net exports (tho BBL)", size(small)) /// - title("Northern CA", size(small)) xlabel(,labsize(small)) ylabel(,labsize(small)) yline(0, lpattern(dash)) - -graph save figures/NC_net.gph, replace - -twoway (scatter SC_net north) /// - (lfit SC_net north, lpattern(solid) lwidth(medthick) lcolor(purple)), /// - legend(off) /// - xtitle("In state consumption (tho BBL)", size(small)) ytitle("Net exports (tho BBL)", size(small)) /// - title("Southern CA", size(small)) xlabel(,labsize(small)) ylabel(,labsize(small)) yline(0, lpattern(dash)) - -graph save figures/SC_net.gph, replace - - - -graph combine figures/NC_net.gph figures/SC_net.gph, rows(1) ycommon - - -******************************************************************************** -******************************************************************************** - -* norht to south export share - -gen NoverS = NC_net/SC_net -su NoverS, detail - -* monthly -twoway (line NC_net ym, lcolor(midblue)) /// - (line SC_net ym, lcolor(gs8)), /// - legend(pos(6) col(2) label(1 "North CA") label(2 "South CA")) /// - yline(0, lcolor(black)) xtitle("") title("Net exports", size(medsmall)) /// - ytitle("BBL (tho)") - -* annual average - - -twoway (line yr_NC_net year, lcolor(midblue)) /// - (line yr_north year, lcolor(gs8) yaxis(2) ytitle(BBL (tho))), /// - legend(pos(6) col(2) label(1 "North CA net exports") label(2 "North comsumption")) /// - xtitle("") title("North: Net exports and consumption", size(medsmall)) /// - ytitle("BBL (tho)") - -save figures/north_net_consumption.gph, replace - - -twoway (line yr_SC_net year, lcolor(green%60)) /// - (line yr_south year, lcolor(gs8) yaxis(2) ytitle(BBL (tho))), /// - legend(pos(6) col(2) label(1 "South CA net exports") label(2 "South comsumption")) /// - xtitle("") title("South: Net exports and consumption", size(medsmall)) /// - ytitle("BBL (tho)") - -save figures/south_net_consumption.gph, replace - -cd figures/ -graph combine south_net_consumption.gph north_net_consumption.gph - - - -twoway (line yr_NC_net year, lcolor(midblue)) /// - (line yr_SC_net year, lcolor(gs8) ), /// - legend(pos(6) col(2) label(1 "North CA") label(2 "South CA")) /// - yline(0, lcolor(black)) xtitle("") title("Net exports", size(medsmall)) /// - ytitle("BBL (tho)") - -twoway (line yr_SC_net year, lcolor(green%50)) /// - (line yr_south year, lcolor(gs8) yaxis(2)), /// - legend(pos(6) col(2) label(1 "North CA") label(2 "South CA")) /// - yline(0, lcolor(black)) xtitle("") title("Net exports", size(medsmall)) /// - ytitle("BBL (tho)") - - - -twoway (line NC_net ym, lcolor(midblue) lpattern(dash)) /// - (line NC_hat_3 ym, lcolor(gs6) lpattern(solid)), /// - legend(pos(6) col(2) label(1 "Actuals") label(2 "Predicted")) /// - yline(0, lcolor(black)) xtitle("") title("North, net exports", size(medsmall)) /// - ytitle("BBL (tho)") - -twoway (line SC_net ym, lcolor(green%60) lpattern(dash)) /// - (line SC_hat_6 ym, lcolor(gs6) lpattern(solid)), /// - legend(pos(6) col(2) label(1 "Actuals") label(2 "Predicted")) /// - yline(0, lcolor(black)) xtitle("") title("South, net exports", size(medsmall)) /// - ytitle("BBL (tho)") - - - - - diff --git a/archive-from-repo/stata/clean_acs5_race_refining.do b/archive-from-repo/stata/clean_acs5_race_refining.do deleted file mode 100644 index a5bc124..0000000 --- a/archive-from-repo/stata/clean_acs5_race_refining.do +++ /dev/null @@ -1,60 +0,0 @@ -/*************************** HEADER **********************************/ - clear all - - //set local directory - if regexm("`c(pwd)'","")==1 { //Paige's machine - global startDir "" - global repoDir "" - } - if regexm("`c(pwd)'","/Users/kylemeng")==1 { //Kyle's machine - global startDir "" - global repoDir "" - //sysdir set PLUS $startDir/../../toolbox/STATA_toolbox/plus - sysdir set PLUS $repoDir/scripts/toolbox/STATA/plus - } - else if regexm(c(os),"Windows")==1 { //Danae's machine - global startDir "C:\Users\dhern125\Dropbox\UCSB-PhD\emLab\CALEPA\data_refining_paper" - global repoDir "C:\Users\Danae\Documents\GitHub\us_ej_disparities" - } - if "$startDir"=="" exit - disp "local path is $startDir" - - //set subfolders - global rawDir "$startDir/raw" - global processedDir "$startDir/processed" - global tempDir "$startDir/temp" - global tablesDir "$repoDir/tables" - global figuresDir "$repoDir/figures" - - - ***************2020 - import delimited using $rawDir/nhgis0024_csv/nhgis0024_ds249_20205_tract, clear - - gen total_pop=amp3e001 - gen hispanic=amp3e012 - gen white=amp3e003 - gen black=amp3e004 - gen aialnative=amp3e005 - gen asian=amp3e006 - - gen median_income=amr8e001 - - keep gisjoin total_pop hispanic white black aialnative asian median_income geoid year - - saveold $processedDir/pop_income_2020, replace - - ***************2021 - import delimited using $rawDir/nhgis0024_csv/nhgis0024_ds254_20215_tract, clear - - gen total_pop=aooce001 - gen hispanic=aooce012 - gen white=aooce003 - gen black=aooce004 - gen aialnative=aooce005 - gen asian=aooce006 - - gen median_income=aoqie001 - rename geo_id geoid - keep gisjoin total_pop hispanic white black aialnative asian median_income geoid year - - saveold $processedDir/pop_income_2021, replace \ No newline at end of file diff --git a/archive-from-repo/stata/merge_acs_refining.do b/archive-from-repo/stata/merge_acs_refining.do deleted file mode 100644 index 48c45ea..0000000 --- a/archive-from-repo/stata/merge_acs_refining.do +++ /dev/null @@ -1,273 +0,0 @@ -global dataDir "C:\Users\dhern125\Dropbox\UCSB-PhD\emLab\CALEPA\data_refining_paper" -global figuresDir "C:\Users\dhern125\Dropbox\UCSB-PhD\emLab\CALEPA\data_refining_paper\figures" - -******************************************************************************** -import delimited $dataDir/raw/refining-2023/refining_health_income_2023.csv, clear - - saveold $dataDir/processed/refining_health_income_2023, replace - - - -use $dataDir/processed/pop_income_2020, clear -*2020: 14000US01001020100 - gen census_tract=substr(geoid,8,.) - destring census_tract, replace - drop year - duplicates tag census_tract, gen(dup) - sort geoid - browse if dup==1 - - saveold $dataDir/processed/pop_income_2020_mod, replace - -use $dataDir/processed/refining_health_income_2023, clear - merge m:1 census_tract using $dataDir/processed/pop_income_2020_mod - /* - *issue here - Result # of obs. - ----------------------------------------- - not matched 269,189 - from master 190,674 (_merge==1) - from using 78,515 (_merge==2) - - matched 1,114,560 (_merge==3) - ----------------------------------------- - */ - drop if _merge==2 - - -/* - rename et1001 total_pop - gen minority_pct=(et2002+et2003+et2004+et2005+et2006+et2007+et2008+et2009+et2010)/total_pop - gen black_pct=et2002/total_pop - gen hispanic_pct=(et2006+et2007+et2008+et2009+et2010)/total_pop - sum minority_pct, det -*/ - - gen minority_pct=(hispanic+black+aialnative+asian)/total_pop - gen black_pct=black/total_pop - gen hispanic_pct=hispanic/total_pop - gen asian_pct=asian/total_pop - gen aialnative_pct=aialnative/total_pop - - rename total_pm25 totalpm25 - - gen white_num=totalpm25*(1-minority_pct)*total_pop - gen white_den=(1-minority_pct)*total_pop - -local group "minority black hispanic asian aialnative" - -foreach g in `group'{ - gen `g'_num=totalpm25*`g'_pct*total_pop - gen `g'_den=`g'_pct*total_pop -} -collapse (sum) white_num white_den minority_num minority_den black_num black_den hispanic_num hispanic_den asian_num asian_den aialnative_num aialnative_den, by(scen_id demand_scenario refining_scenario year) - -gen W=white_num/white_den -gen B=black_num/black_den -gen H=hispanic_num/hispanic_den -gen M=minority_num/minority_den -gen A=asian_num/asian_den -gen AIAL=aialnative_num/aialnative_den - -gen stat_BW=B-W -gen stat_MW=M-W -gen stat_HW=H-W -gen stat_AW=A-W -gen stat_AIALW=AIAL-W - -*FIGURE 1 -preserve -keep if scen_id=="BAU historic exports" - twoway (line B year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line H year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line W year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line A year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)) (line AIAL year, lwidth(medthick) lcolor(green) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Black" 2 "Hispanic" 3 "white" 4 "Asian" 5 "American Indian" ) size(medsmall)) title("BAU historic exports") - graph export $figuresDir/bau_his_exports.png, as(png) -restore - -*FIGURE 2 -preserve -keep if scen_id=="BAU historic production" - twoway (line B year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line H year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line W year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line A year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)) (line AIAL year, lwidth(medthick) lcolor(green) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Black" 2 "Hispanic" 3 "white" 4 "Asian" 5 "American Indian" ) size(medsmall)) title("BAU historic production") - graph export $figuresDir/bau_his_prod.png, as(png) -restore - -*FIGURE 3 -preserve -keep if scen_id=="BAU low exports" - twoway (line B year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line H year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line W year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line A year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)) (line AIAL year, lwidth(medthick) lcolor(green) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Black" 2 "Hispanic" 3 "white" 4 "Asian" 5 "American Indian" ) size(medsmall)) title("BAU low exports") - graph export $figuresDir/bau_low_exports.png, as(png) -restore - -*FIGURE 4 -preserve -keep if scen_id=="LC1 historic exports" - twoway (line B year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line H year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line W year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line A year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)) (line AIAL year, lwidth(medthick) lcolor(green) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Black" 2 "Hispanic" 3 "white" 4 "Asian" 5 "American Indian" ) size(medsmall)) title("LC1 historic exports") - graph export $figuresDir/lc1_his_exports.png, as(png) -restore - -*FIGURE 5 -preserve -keep if scen_id=="LC1 historic production" - twoway (line B year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line H year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line W year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line A year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)) (line AIAL year, lwidth(medthick) lcolor(green) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Black" 2 "Hispanic" 3 "white" 4 "Asian" 5 "American Indian" ) size(medsmall)) title("LC1 historic production") - graph export $figuresDir/lc1_his_prod.png, as(png) -restore - -*FIGURE 6 -preserve -keep if scen_id=="LC1 low exports" - twoway (line B year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line H year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line W year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line A year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)) (line AIAL year, lwidth(medthick) lcolor(green) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Black" 2 "Hispanic" 3 "white" 4 "Asian" 5 "American Indian" ) size(medsmall)) title("LC1 low exports") - graph export $figuresDir/lc1_low_exports.png, as(png) -restore - - -***GAPS -*FIGURE 1 -preserve -keep if scen_id=="BAU historic exports" - twoway (line stat_BW year, lwidth(medthick) lcolor(gs10) lpattern(dash) xlabel(2020(5)2045)) (line stat_HW year, lwidth(medthick) lcolor(sky) lpattern(dash) xlabel(2020(5)2045, labsize(medium)) ) (line stat_AW year, lwidth(medthick) lcolor(orange) lpattern(dash) xlabel(2020(5)2045)) (line stat_AIALW year, lwidth(medthick) lcolor(green) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Bw gap" 2 "Hw gap" 3 "Aw gap" 5 "AIALw gap" ) size(medsmall)) title("BAU historic exports") - graph export $figuresDir/bau_his_exports_gap.png, as(png) -restore - -*FIGURE 2 -preserve -keep if scen_id=="BAU historic production" - twoway (line stat_BW year, lwidth(medthick) lcolor(gs10) lpattern(dash) xlabel(2020(5)2045)) (line stat_HW year, lwidth(medthick) lcolor(sky) lpattern(dash) xlabel(2020(5)2045, labsize(medium)) ) (line stat_AW year, lwidth(medthick) lcolor(orange) lpattern(dash) xlabel(2020(5)2045)) (line stat_AIALW year, lwidth(medthick) lcolor(green) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Bw gap" 2 "Hw gap" 3 "Aw gap" 5 "AIALw gap" ) size(medsmall)) title("BAU historic production") - graph export $figuresDir/bau_his_prod_gap.png, as(png) -restore - -*FIGURE 3 -preserve -keep if scen_id=="BAU low exports" - twoway (line stat_BW year, lwidth(medthick) lcolor(gs10) lpattern(dash) xlabel(2020(5)2045)) (line stat_HW year, lwidth(medthick) lcolor(sky) lpattern(dash) xlabel(2020(5)2045, labsize(medium)) ) (line stat_AW year, lwidth(medthick) lcolor(orange) lpattern(dash) xlabel(2020(5)2045)) (line stat_AIALW year, lwidth(medthick) lcolor(green) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Bw gap" 2 "Hw gap" 3 "Aw gap" 5 "AIALw gap" ) size(medsmall)) title("BAU low exports") - graph export $figuresDir/bau_low_exports_gap.png, as(png) -restore - -*FIGURE 4 -preserve -keep if scen_id=="LC1 historic exports" - twoway (line stat_BW year, lwidth(medthick) lcolor(gs10) lpattern(dash) xlabel(2020(5)2045)) (line stat_HW year, lwidth(medthick) lcolor(sky) lpattern(dash) xlabel(2020(5)2045, labsize(medium)) ) (line stat_AW year, lwidth(medthick) lcolor(orange) lpattern(dash) xlabel(2020(5)2045)) (line stat_AIALW year, lwidth(medthick) lcolor(green) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Bw gap" 2 "Hw gap" 3 "Aw gap" 5 "AIALw gap" ) size(medsmall)) title("LC1 historic exports") - graph export $figuresDir/lc1_his_exports_gap.png, as(png) -restore - -*FIGURE 5 -preserve -keep if scen_id=="LC1 historic production" - twoway (line stat_BW year, lwidth(medthick) lcolor(gs10) lpattern(dash) xlabel(2020(5)2045)) (line stat_HW year, lwidth(medthick) lcolor(sky) lpattern(dash) xlabel(2020(5)2045, labsize(medium)) ) (line stat_AW year, lwidth(medthick) lcolor(orange) lpattern(dash) xlabel(2020(5)2045)) (line stat_AIALW year, lwidth(medthick) lcolor(green) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Bw gap" 2 "Hw gap" 3 "Aw gap" 5 "AIALw gap" ) size(medsmall)) title("LC1 historic production") - graph export $figuresDir/lc1_his_prod_gap.png, as(png) -restore - -*FIGURE 6 -preserve -keep if scen_id=="LC1 low exports" - twoway (line stat_BW year, lwidth(medthick) lcolor(gs10) lpattern(dash) xlabel(2020(5)2045)) (line stat_HW year, lwidth(medthick) lcolor(sky) lpattern(dash) xlabel(2020(5)2045, labsize(medium)) ) (line stat_AW year, lwidth(medthick) lcolor(orange) lpattern(dash) xlabel(2020(5)2045)) (line stat_AIALW year, lwidth(medthick) lcolor(green) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Bw gap" 2 "Hw gap" 3 "Aw gap" 5 "AIALw gap" ) size(medsmall)) title("LC1 low exports") - graph export $figuresDir/lc1_low_exports_gap.png, as(png) -restore - - - - -******************************************************************************* - ***INCOME -use $dataDir/processed/pop_income_2021, clear -*2021: 1400000US01001020100 - gen census_tract=substr(geoid,10,.) - destring census_tract, replace - drop year - duplicates tag census_tract, gen(dup) - sort geoid - browse if dup==1 - - saveold $dataDir/processed/pop_income_2021_mod, replace - -use $dataDir/processed/refining_health_income_2023, clear - merge m:1 census_tract using $dataDir/processed/pop_income_2021_mod - -/* -*issue here - - ----------------------------------------- - not matched 269,189 - from master 190,674 (_merge==1) - from using 78,515 (_merge==2) - - matched 1,114,560 (_merge==3) - ----------------------------------------- -*/ - - - -egen deciles_inc=xtile(median_hh_income), nq(10) by(year) - -forvalues d=1/10{ - gen dec_`d'=(deciles_inc==`d') - gen deciles_num_`d'=total_pm25*dec_`d'*total_pop - gen deciles_den_`d'=dec_`d'*total_pop -} - -egen quantiles_inc=xtile(median_income), nq(4) by(year) - -forvalues d=1/4{ - gen quan_`d'=(deciles_inc==`d') - gen quantiles_num_`d'=total_pm25*quan_`d'*total_pop - gen quantiles_den_`d'=quan_`d'*total_pop -} - -collapse (sum) deciles_num_* deciles_den_* quantiles_den_* quantiles_num_*, by(scen_id demand_scenario refining_scenario year) - -gen D1=deciles_num_1/deciles_den_1 -gen D10=deciles_num_10/deciles_den_10 -gen Q1=quantiles_num_1/quantiles_den_1 -gen Q2=quantiles_num_2/quantiles_den_2 -gen Q3=quantiles_num_3/quantiles_den_3 -gen Q4=quantiles_num_4/quantiles_den_4 - - -gen stat_deciles=D1-D10 -gen stat_quantiles=Q1-Q4 - -la var stat_deciles "Decile 1-Decile 10 Gap" -la var stat_deciles "Q 1-Q 10 Gap" - - -*FIGURE 1 -preserve -keep if scen_id=="BAU historic exports" - twoway (line Q1 year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line Q2 year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line Q3 year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line Q4 year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Q1" 2 "Q2" 3 "Q3" 4 "Q4" ) size(medsmall)) title("BAU historic exports") - graph export $figuresDir/bau_his_exports_inc.png, as(png) replace -restore - -*FIGURE 2 -preserve -keep if scen_id=="BAU historic production" - twoway (line Q1 year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line Q2 year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line Q3 year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line Q4 year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Q1" 2 "Q2" 3 "Q3" 4 "Q4" ) size(medsmall)) title("BAU historic production") - graph export $figuresDir/bau_his_prod_inc.png, as(png) replace -restore - -*FIGURE 3 -preserve -keep if scen_id=="BAU low exports" - twoway (line Q1 year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line Q2 year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line Q3 year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line Q4 year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Q1" 2 "Q2" 3 "Q3" 4 "Q4" ) size(medsmall)) title("BAU low exports") - graph export $figuresDir/bau_low_exports_inc.png, as(png) replace -restore - -*FIGURE 4 -preserve -keep if scen_id=="LC1 historic exports" - twoway (line Q1 year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line Q2 year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line Q3 year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line Q4 year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Q1" 2 "Q2" 3 "Q3" 4 "Q4" ) size(medsmall)) title("LC1 historic exports") - graph export $figuresDir/lc1_his_exports_inc.png, as(png) replace -restore - -*FIGURE 5 -preserve -keep if scen_id=="LC1 historic production" - twoway (line Q1 year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line Q2 year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line Q3 year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line Q4 year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Q1" 2 "Q2" 3 "Q3" 4 "Q4" ) size(medsmall)) title("LC1 historic production") - graph export $figuresDir/lc1_his_prod_inc.png, as(png) replace -restore - -*FIGURE 6 -preserve -keep if scen_id=="LC1 low exports" - twoway (line Q1 year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line Q2 year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line Q3 year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line Q4 year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Q1" 2 "Q2" 3 "Q3" 4 "Q4" ) size(medsmall)) title("LC1 low exports") - graph export $figuresDir/lc1_low_exports_inc.png, as(png) replace -restore - - - diff --git a/archive-from-repo/stata/repo_clean_acs5_race_refining.do b/archive-from-repo/stata/repo_clean_acs5_race_refining.do deleted file mode 100644 index f368c2c..0000000 --- a/archive-from-repo/stata/repo_clean_acs5_race_refining.do +++ /dev/null @@ -1,67 +0,0 @@ -/*************************** HEADER **********************************/ - clear all - - //set local directory - if regexm("`c(pwd)'","")==1 { //Paige's machine - global startDir "" - global repoDir "" - } - else if regexm(c(os),"Windows")==1 { //Danae's machine - global startDir "drives/emlab/projects/current-projects/calepa-cn" - global repoDir "C:\Users\Danae\Documents\GitHub\ca-refining" - } - if "$startDir"=="" exit - disp "local path is $startDir" - - //set subfolders - global rawDir "$startDir/data/Census/nhgis_2020" - global processedDir "$startDir/data/Census" - - ***************2020 - import delimited using $rawDir/nhgis0024_csv/nhgis0024_ds249_20205_tract, clear - - gen total_pop=amp3e001 - gen hispanic=amp3e012 - gen white=amp3e003 - gen black=amp3e004 - gen aialnative=amp3e005 - gen asian=amp3e006 - - gen median_income=amr8e001 - - keep gisjoin total_pop hispanic white black aialnative asian median_income geoid year state - - saveold $processedDir/pop_income_2020, replace - keep if state=="California" - export delimited $processedDir/pop_CA_geoid.csv, replace - - ***************2021 - import delimited using $rawDir/nhgis0024_csv/nhgis0024_ds254_20215_tract, clear - - gen total_pop=aooce001 - gen hispanic=aooce012 - gen white=aooce003 - gen black=aooce004 - gen aialnative=aooce005 - gen asian=aooce006 - - gen median_income=aoqie001 - rename geo_id geoid - keep gisjoin total_pop hispanic white black aialnative asian median_income geoid year - - saveold $processedDir/pop_income_2021, replace - - - ****************2017-2021 poverty - import delimited using $rawDir/nhgis0029_csv/nhgis0029_csv/nhgis0029_ds254_20215_tract.csv - - - rename aoqge001 total_pop - rename aoqge002 total_below_poverty - rename aoqge003 total_above_poverty - - rename geo_id geoid - keep gisjoin geoid year total_above_poverty total_below_poverty total_pop - - saveold $processedDir/pop_poverty_2020, replace - \ No newline at end of file diff --git a/archive-from-repo/stata/repo_merge_acs_refining_poverty_updated_ct.do b/archive-from-repo/stata/repo_merge_acs_refining_poverty_updated_ct.do deleted file mode 100644 index cc937ef..0000000 --- a/archive-from-repo/stata/repo_merge_acs_refining_poverty_updated_ct.do +++ /dev/null @@ -1,177 +0,0 @@ -/*************************** HEADER **********************************/ - clear all - - //set local directory - if regexm("`c(pwd)'","")==1 { //Paige's machine - global startDir "" - global repoDir "" - } - - else if regexm(c(os),"Windows")==1 { //Danae's machine - global startDir "drives/emlab/projects/current-projects/calepa-cn" - global repoDir "C:\Users\Danae\Documents\GitHub\ca-refining" - } - if "$startDir"=="" exit - disp "local path is $startDir" - - //set subfolders - global rawDir "$startDir/data/Census/nhgis_2020" - global processedDir "$startDir/data/Census" - global concentrationsDir "$startDir/outputs/refining-2023/health" - global figuresDir "$repoDir/stata/figures" - global graphDir "$repoDir/stata/gph" -******************************************************************************* - ***INCOME -use $processedDir/pop_poverty_2020, clear - gen census_tract=substr(geoid,10,.) - destring census_tract, replace - drop year - duplicates tag census_tract, gen(dup) - sort geoid - browse if dup==1 - - saveold $processedDir/pop_poverty_2021_mod, replace - -use $concentrationsDir/refining_health_census_tract, clear - merge m:1 census_tract using $processedDir/pop_poverty_2021_mod - -/* - Result # of obs. - ----------------------------------------- - not matched 76,286 - from master 0 (_merge==1) - from using 76,286 (_merge==2) - - matched 1,475,658 (_merge==3) - ----------------------------------------- - -*/ - -gen total_below_poverty_pct=total_below_poverty/total_pop -gen total_above_poverty_pct=total_above_poverty/total_pop -rename total_pm25 totalpm25 - -local group "total_above_poverty total_below_poverty" - -foreach g in `group'{ - gen `g'_num=totalpm25*`g'_pct*total_pop - gen `g'_den=`g'_pct*total_pop -} -collapse (sum) total_above_poverty_num total_above_poverty_den total_below_poverty_num total_below_poverty_den, by(scen_id demand_scenario refining_scenario year) - -gen NP=total_above_poverty_num/total_above_poverty_den -gen P=total_below_poverty_num/total_below_poverty_den - -gen stat_PNP=P-NP - - -*FIGURE 1 -preserve -keep if scen_id=="BAU historic exports" - twoway (line P year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line NP year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Below poverty" 2 "Above poverty" ) size(medsmall)) title("BAU historic exports") - graph export $figuresDir/bau_his_exports_pov.png, as(png) replace -restore - -*FIGURE 2 -preserve -keep if scen_id=="BAU historic production" - twoway (line P year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line NP year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Below poverty" 2 "Above poverty" ) size(medsmall)) title("BAU historic production") - graph export $figuresDir/bau_his_prod_pov.png, as(png) replace -restore - -*FIGURE 3 -preserve -keep if scen_id=="BAU low exports" - twoway (line P year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line NP year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Below poverty" 2 "Above poverty" ) size(medsmall)) title("BAU low exports") - graph export $figuresDir/bau_low_exports_pov.png, as(png) replace -restore - -*FIGURE 4 -preserve -keep if scen_id=="LC1 historic exports" - twoway (line P year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line NP year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Below poverty" 2 "Above poverty" ) size(medsmall)) title("LC1 historic exports") - graph export $figuresDir/lc1_his_exports_pov.png, as(png) replace -restore - -*FIGURE 5 -preserve -keep if scen_id=="LC1 historic production" - twoway (line P year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line NP year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Below poverty" 2 "Above poverty" ) size(medsmall)) title("LC1 historic production") - graph export $figuresDir/lc1_his_prod_pov.png, as(png) replace -restore - -*FIGURE 6 -preserve -keep if scen_id=="LC1 low exports" - twoway (line P year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line NP year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Below poverty" 2 "Above poverty" ) size(medsmall)) title("LC1 low exports") - graph export $figuresDir/lc1_low_exports_pov.png, as(png) replace -restore - - - -*GAP -*FIGURE 1 -preserve -keep if scen_id=="BAU historic exports" - twoway (line stat_PNP year, lwidth(medthick) lcolor(turquoise) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("Gap in PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Gap Below poverty and Above poverty" ) size(medsmall)) ylabel(0(0.01)0.04) title("BAU historic exports") saving($graphDir/bau_his_exp_pov_gap.gph, replace) - graph export $figuresDir/bau_his_exports_pov_gap.png, as(png) replace -restore - -*FIGURE 2 -preserve -keep if scen_id=="BAU historic production" - twoway (line stat_PNP year, lwidth(medthick) lcolor(turquoise) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("Gap in PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Gap Below poverty and Above poverty" ) size(medsmall)) ylabel(0(0.01)0.04) title("BAU historic production") saving($graphDir/bau_his_prod_pov_gap.gph, replace) - graph export $figuresDir/bau_his_prod_pov_gap.png, as(png) replace -restore - -*FIGURE 3 -preserve -keep if scen_id=="BAU low exports" - twoway (line stat_PNP year, lwidth(medthick) lcolor(turquoise) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("Gap in PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Gap Below poverty and Above poverty" ) size(medsmall)) ylabel(0(0.01)0.04) title("BAU low exports") saving($graphDir/bau_low_exp_pov_gap.gph, replace) - graph export $figuresDir/bau_low_exports_pov_gap.png, as(png) replace -restore - -*FIGURE 4 -preserve -keep if scen_id=="LC1 historic exports" - twoway (line stat_PNP year, lwidth(medthick) lcolor(turquoise) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("Gap in PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Gap Below poverty and Above poverty" ) size(medsmall)) ylabel(0(0.01)0.04) title("LC1 historic exports") saving($graphDir/lc1_his_exp_pov_gap.gph, replace) - graph export $figuresDir/lc1_his_exports_pov_gap.png, as(png) replace -restore - -*FIGURE 5 -preserve -keep if scen_id=="LC1 historic production" - twoway (line stat_PNP year, lwidth(medthick) lcolor(turquoise) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("Gap in PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Gap Below poverty and Above poverty" ) size(medsmall)) ylabel(0(0.01)0.04) title("LC1 historic production") saving($graphDir/lc1_his_prod_pov_gap.gph, replace) - graph export $figuresDir/lc1_his_prod_pov_gap.png, as(png) replace -restore - -*FIGURE 6 -preserve -keep if scen_id=="LC1 low exports" - twoway (line stat_PNP year, lwidth(medthick) lcolor(turquoise) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("Gap in PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Gap Below poverty and Above poverty" ) size(medsmall)) ylabel(0(0.01)0.04) title("LC1 low exports") saving($graphDir/lc1_low_exp_pov_gap.gph, replace) - graph export $figuresDir/lc1_low_exports_pov_gap.png, as(png) replace -restore - -*FINAL FIGURE WITH RELEVANT SCENARIOS - -grc1leg $graphDir/bau_his_prod_pov_gap.gph $graphDir/bau_his_exp_pov_gap.gph $graphDir/lc1_low_exp_pov_gap.gph, col(2) - - graph export $figuresDir/all_gap_poverty.png, as(png) replace - -************************************************************ -keep if year==2045 - -keep year scen_id stat_* - -sdf -reshape long stat_, i(scen_id year) j(group, string) - -rename stat_ gap - - - -la var gap "Gap value in end point (2045)" -gen groupt=" Poor-no poor gap" if group=="PNP" - -save $dataDir/processed/gaps_2045_poor, replace -graph hbar (mean) gap, over(scen_id) asyvars over(groupt) diff --git a/archive-from-repo/stata/repo_merge_acs_refining_updated_ct.do b/archive-from-repo/stata/repo_merge_acs_refining_updated_ct.do deleted file mode 100644 index f1e088b..0000000 --- a/archive-from-repo/stata/repo_merge_acs_refining_updated_ct.do +++ /dev/null @@ -1,283 +0,0 @@ -/*************************** HEADER **********************************/ - clear all - - //set local directory - if regexm("`c(pwd)'","")==1 { //Paige's machine - global startDir "" - global repoDir "" - } - - else if regexm(c(os),"Windows")==1 { //Danae's machine - global startDir "drives/emlab/projects/current-projects/calepa-cn" - global repoDir "C:\Users\Danae\Documents\GitHub\ca-refining" - } - if "$startDir"=="" exit - disp "local path is $startDir" - - //set subfolders - global rawDir "$startDir/data/Census/nhgis_2020" - global processedDir "$startDir/data/Census" - global concentrationsDir "$startDir/outputs/refining-2023/health" - global figuresDir "$repoDir/stata/figures" - global graphDir "$repoDir/stata/gph" -******************************************************************************** -import delimited $concentrationsDir/refining_health_census_tract.csv, clear - - saveold $concentrationsDir/refining_health_census_tract, replace - - - -use $dataDir/processed/pop_income_2020, clear -*2020: 14000US01001020100 - gen census_tract=substr(geoid,8,.) - destring census_tract, replace - drop year - duplicates tag census_tract, gen(dup) - sort geoid - browse if dup==1 - - saveold $processedDir/pop_income_2020_mod, replace - -use $concentrationsDir/refining_health_census_tract, clear - merge m:1 census_tract using $processedDir/pop_income_2020_mod - /* - - Result # of obs. - ----------------------------------------- - not matched 76,286 - from master 0 (_merge==1) - from using 76,286 (_merge==2) - - matched 1,475,658 (_merge==3) - ----------------------------------------- - - */ - drop if _merge==2 - - gen minority_pct=(hispanic+black+aialnative+asian)/total_pop - gen black_pct=black/total_pop - gen hispanic_pct=hispanic/total_pop - gen asian_pct=asian/total_pop - gen aialnative_pct=aialnative/total_pop - - rename total_pm25 totalpm25 - - gen white_num=totalpm25*(1-minority_pct)*total_pop - gen white_den=(1-minority_pct)*total_pop - -local group "minority black hispanic asian aialnative" - -foreach g in `group'{ - gen `g'_num=totalpm25*`g'_pct*total_pop - gen `g'_den=`g'_pct*total_pop -} - -*creating dac index -gen dac_population=total_pop if disadvantaged=="Yes" - replace dac_population=0 if disadvantaged=="No" -gen dac_num=totalpm25*dac_population - gen dac_den=dac_population -gen nodac_population=total_pop if disadvantaged=="No" - replace nodac_population=0 if disadvantaged=="Yes" -gen nodac_num=totalpm25*nodac_population - gen nodac_den=nodac_population - - -collapse (sum) white_num white_den minority_num minority_den black_num black_den hispanic_num hispanic_den asian_num asian_den aialnative_num aialnative_den dac_num dac_den nodac_num nodac_den, by(scen_id demand_scenario refining_scenario year) - -gen W=white_num/white_den -gen B=black_num/black_den -gen H=hispanic_num/hispanic_den -gen M=minority_num/minority_den -gen A=asian_num/asian_den -gen AIAL=aialnative_num/aialnative_den - -gen DAC=dac_num/dac_den -gen nDAC=nodac_num/nodac_den - -gen stat_BW=B-W -gen stat_MW=M-W -gen stat_HW=H-W -gen stat_AW=A-W -gen stat_AIALW=AIAL-W -gen stat_DAC=DAC-nDAC - - -*LEVELS -*FIGURE 1 -preserve -keep if scen_id=="BAU historic exports" - twoway (line B year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line H year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2025(10)2045, labsize(medium)) ) (line W year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line A year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)) (line AIAL year, lwidth(medthick) lcolor(green) lpattern(solid) xlabel(2020(10)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Black" 2 "Hispanic" 3 "white" 4 "Asian" 5 "American Indian" ) size(medsmall)) title("BAU historic exports") saving($graphDir/bau_his_exports.gph, replace) - graph export $figuresDir/bau_his_exports.png, as(png) replace -restore - -*FIGURE 2 -preserve -keep if scen_id=="BAU historic production" - twoway (line B year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line H year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(10)2045, labsize(medium)) ) (line W year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line A year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)) (line AIAL year, lwidth(medthick) lcolor(green) lpattern(solid) xlabel(2020(10)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Black" 2 "Hispanic" 3 "white" 4 "Asian" 5 "American Indian" ) size(medsmall)) title("BAU historic production") saving($graphDir/bau_his_prod.gph, replace) - graph export $figuresDir/bau_his_prod.png, as(png) replace -restore - -*FIGURE 3 -preserve -keep if scen_id=="BAU low exports" - twoway (line B year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line H year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(10)2045, labsize(medium)) ) (line W year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line A year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)) (line AIAL year, lwidth(medthick) lcolor(green) lpattern(solid) xlabel(2020(10)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Black" 2 "Hispanic" 3 "white" 4 "Asian" 5 "American Indian" ) size(medsmall)) title("BAU low exports") saving($graphDir/bau_low_exports.gph, replace) - graph export $figuresDir/bau_low_exports.png, as(png) replace -restore - -*FIGURE 4 -preserve -keep if scen_id=="LC1 historic exports" - twoway (line B year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line H year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line W year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line A year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)) (line AIAL year, lwidth(medthick) lcolor(green) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Black" 2 "Hispanic" 3 "white" 4 "Asian" 5 "American Indian" ) size(medsmall)) title("LC1 historic exports") - graph export $figuresDir/lc1_his_exports.png, as(png) replace -restore - -*FIGURE 5 -preserve -keep if scen_id=="LC1 historic production" - twoway (line B year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line H year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line W year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line A year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)) (line AIAL year, lwidth(medthick) lcolor(green) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Black" 2 "Hispanic" 3 "white" 4 "Asian" 5 "American Indian" ) size(medsmall)) title("LC1 historic production") - graph export $figuresDir/lc1_his_prod.png, as(png) replace -restore - -*FIGURE 6 -preserve -keep if scen_id=="LC1 low exports" - twoway (line B year, lwidth(medthick) lcolor(gs10) lpattern(solid) xlabel(2020(5)2045)) (line H year, lwidth(medthick) lcolor(sky) lpattern(solid) xlabel(2020(5)2045, labsize(medium)) ) (line W year, lwidth(medthick) lcolor(black) lpattern(solid) xlabel(2020(5)2045)) (line A year, lwidth(medthick) lcolor(orange) lpattern(solid) xlabel(2020(5)2045)) (line AIAL year, lwidth(medthick) lcolor(green) lpattern(solid) xlabel(2020(5)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Black" 2 "Hispanic" 3 "white" 4 "Asian" 5 "American Indian" ) size(medsmall)) title("LC1 low exports") saving($graphDir/lc1_low_exports.gph, replace) - graph export $figuresDir/lc1_low_exports.png, as(png) replace -restore - -*FINAL FIGURE WITH RELEVANT SCENARIOS -grc1leg $graphDir/bau_his_prod.gph $graphDir/bau_his_exports.gph $graphDir/lc1_low_exports.gph, col(2) - graph export $figuresDir/all_race.png, as(png) replace - - - - -***GAPS -*FIGURE 1 -preserve -keep if scen_id=="BAU historic exports" - twoway (line stat_BW year, lwidth(medthick) lcolor(gs10) lpattern(dash) xlabel(2020(5)2045)) (line stat_HW year, lwidth(medthick) lcolor(sky) lpattern(dash) xlabel(2020(5)2045, labsize(medium)) ) (line stat_AW year, lwidth(medthick) lcolor(orange) lpattern(dash) xlabel(2020(15)2045)) (line stat_AIALW year, lwidth(medthick) lcolor(green) lpattern(dash) xlabel(2020(10)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Bw gap" 2 "Hw gap" 3 "Aw gap" 4 "AIALw gap" ) size(medsmall)) title("BAU historic exports") saving($graphDir/bau_his_exp_gap.gph, replace) - graph export $figuresDir/bau_his_exports_gap.png, as(png) replace -restore - -*FIGURE 2 -preserve -keep if scen_id=="BAU historic production" - twoway (line stat_BW year, lwidth(medthick) lcolor(gs10) lpattern(dash) xlabel(2020(5)2045)) (line stat_HW year, lwidth(medthick) lcolor(sky) lpattern(dash) xlabel(2020(5)2045, labsize(medium)) ) (line stat_AW year, lwidth(medthick) lcolor(orange) lpattern(dash) xlabel(2020(5)2045)) (line stat_AIALW year, lwidth(medthick) lcolor(green) lpattern(dash) xlabel(2020(10)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Bw gap" 2 "Hw gap" 3 "Aw gap" 4 "AIALw gap" ) size(medsmall)) title("BAU historic production") saving($graphDir/bau_his_prod_gap.gph, replace) - graph export $figuresDir/bau_his_prod_gap.png, as(png) replace -restore - -*FIGURE 3 -preserve -keep if scen_id=="BAU low exports" - twoway (line stat_BW year, lwidth(medthick) lcolor(gs10) lpattern(dash) xlabel(2020(5)2045)) (line stat_HW year, lwidth(medthick) lcolor(sky) lpattern(dash) xlabel(2020(5)2045, labsize(medium)) ) (line stat_AW year, lwidth(medthick) lcolor(orange) lpattern(dash) xlabel(2020(5)2045)) (line stat_AIALW year, lwidth(medthick) lcolor(green) lpattern(dash) xlabel(2020(10)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Bw gap" 2 "Hw gap" 3 "Aw gap" 4 "AIALw gap" ) size(medsmall)) title("BAU low exports") saving($graphDir/bau_low_exp_gap.gph, replace) - graph export $figuresDir/bau_low_exports_gap.png, as(png) replace -restore - -*grc1leg $graphDir/bau_his_exp_gap.gph $graphDir/bau_his_prod_gap.gph $graphDir/bau_low_exp_gap.gph, col(3) - -*FIGURE 4 -preserve -keep if scen_id=="LC1 historic exports" - twoway (line stat_BW year, lwidth(medthick) lcolor(gs10) lpattern(dash) xlabel(2020(5)2045)) (line stat_HW year, lwidth(medthick) lcolor(sky) lpattern(dash) xlabel(2020(5)2045, labsize(medium)) ) (line stat_AW year, lwidth(medthick) lcolor(orange) lpattern(dash) xlabel(2020(5)2045)) (line stat_AIALW year, lwidth(medthick) lcolor(green) lpattern(dash) xlabel(2020(10)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Bw gap" 2 "Hw gap" 3 "Aw gap" 4 "AIALw gap" ) size(medsmall)) title("LC1 historic exports") saving($graphDir/lc1_his_exp_gap.gph, replace) - graph export $figuresDir/lc1_his_exp_gap.png, as(png) replace -restore - -*FIGURE 5 -preserve -keep if scen_id=="LC1 historic production" - twoway (line stat_BW year, lwidth(medthick) lcolor(gs10) lpattern(dash) xlabel(2020(5)2045)) (line stat_HW year, lwidth(medthick) lcolor(sky) lpattern(dash) xlabel(2020(5)2045, labsize(medium)) ) (line stat_AW year, lwidth(medthick) lcolor(orange) lpattern(dash) xlabel(2020(5)2045)) (line stat_AIALW year, lwidth(medthick) lcolor(green) lpattern(dash) xlabel(2020(10)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Bw gap" 2 "Hw gap" 3 "Aw gap" 4 "AIALw gap" ) size(medsmall)) title("LC1 historic production") saving($graphDir/lc1_his_prod_gap.gph, replace) - graph export $figuresDir/lc1_his_prod_gap.png, as(png) replace -restore - -*FIGURE 6 -preserve -keep if scen_id=="LC1 low exports" - twoway (line stat_BW year, lwidth(medthick) lcolor(gs10) lpattern(dash) xlabel(2020(5)2045)) (line stat_HW year, lwidth(medthick) lcolor(sky) lpattern(dash) xlabel(2020(5)2045, labsize(medium)) ) (line stat_AW year, lwidth(medthick) lcolor(orange) lpattern(dash) xlabel(2020(5)2045)) (line stat_AIALW year, lwidth(medthick) lcolor(green) lpattern(dash) xlabel(2020(10)2045)), xtitle("") ytitle("PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Bw gap" 2 "Hw gap" 3 "Aw gap" 4 "AIALw gap" ) size(medsmall)) title("LC1 low exports") saving($graphDir/lc1_low_exp_gap.gph, replace) - graph export $figuresDir/lc1_low_exp_gap.png, as(png) replace -restore - -*FINAL FIGURE WITH RELEVANT SCENARIOS - -grc1leg $graphDir/bau_his_prod_gap.gph $graphDir/bau_his_exp_gap.gph $graphDir/lc1_low_exp_gap.gph, col(2) - graph export $figuresDir/all_gap_race.png, as(png) replace - - - - - - -***GAPS DAC AND NON DAC -*FIGURE 1 -preserve -keep if scen_id=="BAU historic exports" - twoway (line stat_DAC year, lwidth(medthick) lcolor(sea) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("Gap in PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Gap DAC and non-DAC" ) size(medsmall)) ylabel(0(.1).4) title("BAU historic exports") saving($graphDir/bau_his_exp_dac_gap.gph, replace) - graph export $figuresDir/bau_his_exports_dac_gap.png, as(png) replace -restore - -*FIGURE 2 -preserve -keep if scen_id=="BAU historic production" - twoway (line stat_DAC year, lwidth(medthick) lcolor(sea) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("Gap in PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Gap DAC and non-DAC" ) size(medsmall)) ylabel(0(.1).4) title("BAU historic production") saving($graphDir/bau_his_prod_dac_gap.gph, replace) - graph export $figuresDir/bau_his_prod_dac_gap.png, as(png) replace -restore - -*FIGURE 3 -preserve -keep if scen_id=="BAU low exports" - twoway (line stat_DAC year, lwidth(medthick) lcolor(sea) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("Gap in PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Gap DAC and non-DAC" ) size(medsmall)) ylabel(0(.1).4) title("BAU low exports") saving($graphDir/bau_low_exp_dac_gap.gph, replace) - graph export $figuresDir/bau_low_exports_dac_gap.png, as(png) replace -restore - -*FIGURE 4 -preserve -keep if scen_id=="LC1 historic exports" - twoway (line stat_DAC year, lwidth(medthick) lcolor(sea) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("Gap in PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Gap DAC and non-DAC" ) size(medsmall)) ylabel(0(.1).4) title("LC1 historic exports") saving($graphDir/lc1_his_exp_dac_gap.gph, replace) - graph export $figuresDir/lc1_his_exports_dac_gap.png, as(png) replace -restore - -*FIGURE 5 -preserve -keep if scen_id=="LC1 historic production" - twoway (line stat_DAC year, lwidth(medthick) lcolor(sea) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("Gap in PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Gap DAC and non-DAC") size(medsmall)) ylabel(0(.1).4) title("LC1 historic production") saving($graphDir/lc1_his_prod_dac_gap.gph, replace) - graph export $figuresDir/lc1_his_prod_dac_gap.png, as(png) replace -restore - -*FIGURE 6 -preserve -keep if scen_id=="LC1 low exports" - twoway (line stat_DAC year, lwidth(medthick) lcolor(sea) lpattern(dash) xlabel(2020(5)2045)), xtitle("") ytitle("Gap in PM{sub:2.5} ({&mu}g/m{sup:3}/person)", size(medium)) legend(pos(6) col(5) order(1 "Gap DAC and non-DAC") size(medsmall)) ylabel(0(.1).4) title("LC1 low exports") saving($graphDir/lc1_low_exp_dac_gap.gph, replace) - graph export $figuresDir/lc1_low_exports_dac_gap.png, as(png) replace -restore - -*FINAL FIGURE WITH RELEVANT SCENARIOS - -grc1leg $graphDir/bau_his_prod_dac_gap.gph $graphDir/bau_his_exp_dac_gap.gph $graphDir/lc1_low_exp_dac_gap.gph, col(2) - - graph export $figuresDir/all_gap_dac.png, as(png) replace - -*/ - - -******************************* - -keep if year==2045 - -keep year scen_id stat_* - -reshape long stat_, i(scen_id year) j(group, string) - -rename stat_ gap - -la var gap "Gap value in end point (2045)" -gen groupt=" Black-white gap" if group=="BW" - replace groupt="Asian-white gap" if group=="AW" - replace groupt="AIAN-white gap" if group=="AIALW" - replace groupt="Hispanic-white gap" if group=="HW" - replace groupt="Minority-white gap" if group=="MW" - replace groupt="DAC-nonDAC gap" if group=="DAC" - -append using $processedDir/gaps_2045_poor -graph hbar (mean) gap, over(scen_id) asyvars over(groupt) -sdf \ No newline at end of file