File size: 3,936 Bytes
ca86b1a
 
 
 
 
 
 
a58aedd
ca86b1a
64cc758
a58aedd
ca86b1a
 
 
 
 
fa58ff0
 
ca86b1a
 
 
64cc758
 
 
 
 
 
3c60617
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ca86b1a
3c60617
64cc758
ca86b1a
 
64cc758
ca86b1a
64cc758
 
ca86b1a
 
64cc758
ca86b1a
 
 
64cc758
ca86b1a
a58aedd
ca86b1a
 
 
a58aedd
 
ca86b1a
 
a58aedd
 
 
 
3c60617
 
 
 
 
 
 
 
 
 
 
 
 
ca86b1a
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import json
import sys
import pandas as pd
import openpyxl
from openpyxl.styles import Font

from pathlib import Path

sys.path.insert(0, str(Path(__file__).parent.parent))
from config.config import (resource_order, method_order, resource_unit_map, resource_groups)
from utils.data_utils import strip_unit_suffix

# Data
with open("data/cost_sliders.json") as f:
    cost_sliders = json.load(f)

with open("data/secondary_resources.json") as _f:
    secondary_resources = {tuple(p) for p in json.load(_f)}

wb = openpyxl.Workbook()

resource_to_unit = {
    r: resource_unit_map[group]
    for group, resources in resource_groups.items()
    for r in resources
}

# instructions
ws0 = wb.active
ws0.title = "instructions"
ws0.column_dimensions["A"].width = 25
ws0.column_dimensions["B"].width = 80
header_font = Font(bold=True)
ws0.append(["Sheet", "Description", "Columns to edit", "Do not modify"])
ws0["A1"].font = header_font
ws0["B1"].font = header_font
ws0["C1"].font = header_font
ws0["D1"].font = header_font
ws0.column_dimensions["C"].width = 35
ws0.column_dimensions["D"].width = 30
ws0.append(["resource_caps",
    "Total available quantities of each resource for 1 year of optimization. Leave blank to exclude a resource.",
    "Available Amount",
    "Resource, Unit"])
ws0.append(["constraints",
    "Which CDR methods are active and their maximum deployment cap (percent of total potential, or absolute value in MtCO2/yr).",
    "active (TRUE/FALSE), cap_type (percent or absolute), cap_value",
    "method"])
ws0.append(["coefficients",
    "Resource usage coefficients for each CDR method. Adjust to reflect your country conditions.",
    "value",
    "method, resource, secondary"])
ws0.append(["custom_resources",
    "User-defined resource batches: sub-types of an existing resource group (e.g. 'Forest biomass - Eucalyptus' within 'Forest biomass'), with their own availability and per-method coefficients. Add one row per method linked to the resource.",
    "All columns (add new rows)",
    "—"])
ws0.append(["enabled_methods",
    "Which CDR methods are allowed to use each standard resource. Set to FALSE to prevent a method from using a resource.",
    "enabled (TRUE/FALSE)",
    "resource, method"])

# resource_caps
ws1 = wb.create_sheet("resource_caps")
ws1.append(["Resource", "Unit", "Available Amount"])
ws1["A1"].font = Font(bold=True)
ws1["B1"].font = Font(bold=True)
ws1["C1"].font = Font(bold=True)
for r in resource_order:
    ws1.append([r, resource_to_unit.get(r, ""), float("nan")])
    
# constraints
ws2 = wb.create_sheet("constraints")
ws2.append(["method", "active", "cap_type (percent or absolute)", "cap_value"])
ws2["A1"].font = Font(bold=True)
ws2["B1"].font = Font(bold=True)
ws2["C1"].font = Font(bold=True)
ws2["D1"].font = Font(bold=True)
for m in method_order:
    ws2.append([m, True, "percent", 100])

ws3 = wb.create_sheet("coefficients")
ws3.append(["method", "resource", "value", "secondary"])
for cell in ws3[1]:
    cell.font = Font(bold=True)
for m in method_order:
    for r, conf in cost_sliders.get(m, {}).items():
        is_secondary = (m, strip_unit_suffix(r)) in secondary_resources
        ws3.append([m, strip_unit_suffix(r), conf["median"], True if is_secondary else False])

ws4 = wb.create_sheet("custom_resources")
ws4.append(["name", "group", "amount", "unit", "method", "min", "median", "max"])
for cell in ws4[1]:
    cell.font = Font(bold=True)
ws4.append(["(Example) Forest biomass - Eucalyptus", "Forest biomass", 5.0, "Mt", "Bio-char - Forest biomass", 0.33, 0.37, 0.82])

ws5 = wb.create_sheet("enabled_methods")
ws5.append(["resource", "method", "enabled"])
for cell in ws5[1]:
    cell.font = Font(bold=True)
for m in method_order:
    for r_with_unit in cost_sliders.get(m, {}):
        r = strip_unit_suffix(r_with_unit)
        ws5.append([r, m, True])

wb.save("data/inputs_template.xlsx")
print("Template generated: data/inputs_template.xlsx")