diff --git a/scripts/output/comparison/policyCosts.R b/scripts/output/comparison/policyCosts.R new file mode 100644 index 0000000000000000000000000000000000000000..f31f4db6500abfc36b889019df5bb5cf1833960f --- /dev/null +++ b/scripts/output/comparison/policyCosts.R @@ -0,0 +1,197 @@ +# | (C) 2006-2019 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of REMIND and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | REMIND License Exception, version 1.0 (see LICENSE file). +# | Contact: remind@pik-potsdam.de + +# policyCosts.R +# +# This script produces a pdf in which the policy costs of policy-runs with +# respect to specified reference runs are displayed. +# It can be called via the output.R script. If that is the case, the order +# in which the runs are selected is important: +# 1: policy run 1 +# 2: reference run 1 +# 3: policy run 2 +# 4: reference run 2 +# and so on... +# + +suppressPackageStartupMessages(library(tidyverse)) + +# TODO: Loading magclass shouldn't actually be necessary... but running on the +# cluster without doing so throws an error... +suppressPackageStartupMessages(library(magclass)) + +# Function defintions +get_run_names <- function(filepaths) { + # The run names are found between a "/" and the time-stamp of the run. + run_names <- str_match(filepaths, pattern = "^.*\\/(.*)(_....-..-..*)$")[,2] + + # If for some reason there isn't a time-stamp, return the name of the folder + if (any(is.na(run_names))) { + run_names <- str_match(filepaths, pattern = "^.*\\/(.*)\\/.*$")[,2] + } + return(run_names) +} + +policy_costs_pdf <- function(policy_costs, fileName="PolicyCost.pdf") { + + cat(paste0("A pdf with the name ",crayon::green(fileName)," is being created.\n")) + + template <- c("\\documentclass[a4paper,landscape,twocolumn]{article}", + "\\setlength{\\oddsidemargin}{-0.8in}", + "\\setlength{\\evensidemargin}{-0.5in}", + "\\setlength{\\topmargin}{-0.8in}", + "\\setlength{\\parindent}{0in}", + "\\setlength{\\headheight}{0in}", + "\\setlength{\\topskip}{0in}", + "\\setlength{\\headsep}{0in}", + "\\setlength{\\footskip}{0.2in}", + "\\setlength\\textheight{0.95\\paperheight}", + "\\setlength\\textwidth{0.95\\paperwidth}", + "\\setlength{\\parindent}{0in}", + "\\usepackage{float}", + "\\usepackage[bookmarksopenlevel=section,colorlinks=true,linkbordercolor={0.9882353 0.8352941 0.7098039}]{hyperref}", + "\\hypersetup{bookmarks=true,pdfauthor={GES group, PIK}}", + "\\usepackage{graphicx}", + "\\usepackage[strings]{underscore}", + "\\usepackage{Sweave}", + "\\begin{document}", + "<<echo=false>>=", + "options(width=110)", + "@") + + # Create temporaray folder in which to create the policyCost pdf + system("mkdir tmp_policyCost") + + # Open stream in tmp_folder + sw <- lusweave::swopen(fileName, folder = "tmp_policyCost", template = template) + + # Write title + lusweave::swlatex(sw,"\\section{Policy Costs}") + + # Loop over subsections and create plots + sub_section_variables <- grep("Policy Cost", names(policy_costs), value = T) + sub_section_titles <- str_match(sub_section_variables, "\\|(.*) \\(|\\|")[,2] + + my_ggplot <- function(data, y_var) { + gg1 <- ggplot(data) + + geom_line(aes(x=period, y=!!sym(y_var), color = `Model Output`)) + + geom_point(aes(x=period, y=!!sym(y_var), color = `Model Output`)) + + geom_vline(aes(xintercept = min(period)), linetype = 2) + + facet_wrap("region", ncol = 3, scales = "free_y") + + xlab("Year") + + theme_bw() + + theme(legend.position = "bottom", + legend.direction = "vertical", + legend.title.align=0.5, + legend.title = element_text(face="bold"), + axis.title.x = element_text(face="bold"), + axis.title.y = element_text(face="bold")) + return(gg1) + } + + for(i in 1:length(sub_section_titles)){ + lusweave::swlatex(sw, paste0("\\subsection{", sub_section_titles[i], "}")) + + p <- my_ggplot(filter(policy_costs, region=="GLO"), sub_section_variables[i]) + lusweave::swfigure(sw,print,p,sw_option="height=8,width=8") + + p <- my_ggplot(filter(policy_costs, region!="GLO"), sub_section_variables[i]) + lusweave::swfigure(sw,print,p,sw_option="height=9,width=8") + } + + # Close stream to-pdf + lusweave::swclose(sw) + + # Copy pdf from tmp folder to remind folder and delete tmp folder + system(paste0("mv tmp_policyCost/",fileName," .")) + system("rm -r tmp_policyCost") + +} + +# Check for an object called "source_include". If found, that means, this script +# is being called from another (output.R most likely), and the input variables +# are already in the environment. If not found, the input variables are given +# default values, and made over-writable with command line values. +if(!exists("source_include")) { + # Set default value + outputdirs <- c("../../femulator_hq/remind_runs_lab/base_allT_lab_0point7_2020-03-12_09.36.25", + "../../femulator_hq/remind_runs_lab/base_allT_lab_0point95_2020-03-16_15.35.20", + "../../femulator_hq/remind_runs_lab/base_allT_lab_0point7_2020-03-12_09.36.25", + "../../femulator_hq/remind_runs_lab/base_allT_lab_0point8_2020-03-12_09.36.24") + # Make over-writtable from command line + lucode::readArgs("outputdirs") + +} + +# Check that the input variable "outputdirs" has an even number of entries. +if (length(outputdirs) %% 2!=0) { + cat(paste0(crayon::red("\nERROR: "), "The number of directories is not even!\n")) + cat("Remember, the order in which you choose the directories should be:\n") + cat("\t1: policy run 1\n\t2: reference run 1\n\t3: policy run 2\n\t4: reference run 2\nand so on...\n") + cat(crayon::red("\nStopping execution now.\n\n")) + stop("Number of directories is not even!") +} + +# Get gdx paths +pol_gdxs <- paste0(outputdirs[seq(1,length(outputdirs),2)], "/fulldata.gdx") +ref_gdxs <- paste0(outputdirs[seq(2,length(outputdirs),2)], "/fulldata.gdx") + +# Get run names +pol_names <- get_run_names(pol_gdxs) +ref_names <- get_run_names(ref_gdxs) + +# Define pol-ref, policyCost pair names +pc_pairs <- paste0(pol_names, "_w.r.t_",ref_names) + +# If scrpit was called from output.R, check with user if the pol-ref pairs are the +# ones he wanted. +if(exists("source_include")) { + cat(crayon::blue("\nPlease confirm the set-up:\n")) + cat("From the order with which you selected the directories, the following policy-cost curves will be created:\n") + cat(crayon::green(paste0("\t", pc_pairs ,"\n"))) + cat("Is that what you intended?\n") + cat(paste0("Type '",crayon::green("y"),"' to continue, '",crayon::red("n"),"' to abort: ")) + user_input <- get_line() + if(!user_input %in% c("y","Y","yes")) { + cat(crayon::red("\nShame... \n")) + cat("Remember, the order in which you choose the directories should be:\n") + cat("\t1: policy run 1\n\t2: reference run 1\n\t3: policy run 2\n\t4: reference run 2\nand so on...\n") + cat(crayon::red("\nStopping execution now.\n\n")) + stop("Wrong set up.") + } else cat(crayon::green("Great!\n")) +} + +# Tell the user what's going on +cat(crayon::blue("\nPolicy cost computations:\n")) + +# Get Policy costs for every policy-reference pair +tmp_policy_costs <- mapply(remind::reportPolicyCosts, pol_gdxs, ref_gdxs, SIMPLIFY = FALSE) %>% + lapply(quitte::as.quitte) %>% + lapply(select, region, period, data, value) + +# Combine results in single tibble, with names like "Pol_w.r.t_Ref" +policy_costs <- rename(tmp_policy_costs[[1]], !!sym(paste0(pol_names[1], "_w.r.t_",ref_names[1])):=value) +if (length(tmp_policy_costs)>1){ + for (i in 2:length(tmp_policy_costs)) { + policy_costs <- tmp_policy_costs[[i]] %>% + rename(!!sym(paste0(pol_names[i], "_w.r.t_",ref_names[i])):=value) %>% + left_join(policy_costs, tmp_policy_costs[[i]], by=c("region", "period", "data")) + } +} +# and do some pivotting +policy_costs <- policy_costs %>% + pivot_longer(cols = matches(".*w\\.r\\.t.*"), names_to = "Model Output") %>% + pivot_wider(names_from = data) + +# Tell the user what's going on +cat(crayon::green("Done!\n")) + +# Create Pdf +cat(crayon::blue("\nPdf creation:\n")) +time_stamp <- format(Sys.time(), "_%Y-%m-%d_%H.%M.%S") +policy_costs_pdf(policy_costs, fileName = paste0("PolicyCost",time_stamp,".pdf")) +cat(crayon::green("Done!\n\n"))