Kaynağa Gözat

[DATALAD] Recorded changes

Daniel Busch 2 ay önce
ebeveyn
işleme
99944659e4
1 değiştirilmiş dosya ile 586 ekleme ve 586 silme
  1. 586 586
      tests/unit/test_conversion.py

+ 586 - 586
tests/unit/test_conversion.py

@@ -1,4 +1,3 @@
-import climate_categories as cc
 import primap2 as pm2
 
 from src.faostat_data_primap.helper.paths import (
@@ -128,589 +127,590 @@ def test_read_2023():
     )
 
 
-def test_yaml_to_python():
-    cat = cc.from_yaml("FAO.yaml")
-    cat.to_python("FAO.py")
-
-
-def test_python_to_yaml():
-    from FAO import spec
-
-    cat = cc.from_spec(spec)
-    assert cat
-
-
-def test_fao_categorisation():  # noqa: PLR0912 PLR0915
-    spec = {
-        "name": "FAOSTAT",
-        "title": (
-            "Food and Agriculture Organization of the United Nations (FAO) "
-            "FAOSTAT data set categorisation"
-        ),
-        "comment": "Needed to add FAOSTAT data to PRIMAP-hist",
-        "references": "",
-        "institution": "FAO",
-        "hierarchical": True,
-        "last_update": "2024-12-10",
-        "version": "2024",
-        "total_sum": True,
-        "canonical_top_level_category": "0",
-    }
-
-    categories = {}
-
-    # 0. main categories
-    categories["0"] = {
-        "title": "Total",
-        "comment": "All emissions and removals",
-        "children": [["1", "2", "3", "4", "5", "6", "7"]],
-    }
-    children_1 = ["1.A", "1.B"]
-    children_2 = ["2.A", "2.B", "2.C", "2.D", "2.E"]
-    children_3 = [f"3.{i}" for i in "ABCDEFGHIJKLMNOPQR"]
-
-    main_categories = (
-        # category code, name and comment, gases, children
-        ("1", "Crops", ["CH4", "N2O"], children_1),
-        (
-            "2",
-            "Energy use in agriculture",
-            ["CH4", "N2O", "CO2"],
-            children_2,
-        ),
-        ("3", "Livestock", ["CH4", "N2O"], children_3),
-        # ("4", "Forest", ["CO2"], children_4),
-        # (
-        #     "5",
-        #     "Drained organic soils",
-        #     ["N2O", "CO2"],
-        #     children_5,
-        # ),
-        # ("6", "Fires", ["CH4", "N2O", "CO2"], children_6),
-        # (
-        #     "7",
-        #     "Pre and post agricultural production",
-        #     ["CH4", "N2O", "CO2"],
-        #     children_7,
-        # ),
-    )
-    for code, name, gases, children in main_categories:
-        categories[code] = {
-            "title": name,
-            "comment": name,
-            # "alternative_codes": code.replace(".", ""),
-            "children": [children],
-            "info": {"gases": gases},
-        }
-
-    # 1. crops
-    # all crops category
-    code_all_crops = "1.A"
-    codes_crops = [f"1.A.{i}" for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]
-    categories[code_all_crops] = {
-        "title": "All crops",
-        "comment": "All crops",
-        # "alternative_codes": code_all_crops.replace(".", ""),
-        "children": [codes_crops],
-        "info": {"gases": ["CH4", "N2O"]},
-    }
-
-    crops = [
-        "Wheat",
-        "Rice",
-        "Potatoes",
-        "Millet",
-        "Barley",
-        "Maize (corn)",
-        "Sugar cane",
-        "Beans, dry",
-        "Oats",
-        "Rye",
-        "Sorghum",
-        "Soya beans",
-    ]
-
-    crop_burnings = [
-        True,
-        True,
-        False,
-        False,
-        False,
-        True,
-        True,
-        False,
-        False,
-        False,
-        False,
-        False,
-    ]
-    rice_cultivations = [
-        False,
-        True,
-        False,
-        False,
-        False,
-        False,
-        False,
-        False,
-        False,
-        False,
-        False,
-        False,
-    ]
-
-    for crop, code, crop_burning, rice_cultivation in zip(
-        crops, codes_crops, crop_burnings, rice_cultivations
-    ):
-        # all crops have at least N2O emissions
-        gases_main = "N2O"
-
-        if crop_burning or rice_cultivation:
-            gases_main = ["CH4", "N2O"]
-
-        # all crops have at least crop residues as child
-        children_main = [f"{code}.a"]
-
-        if crop_burning:
-            children_main.append(f"{code}.b")
-
-        if rice_cultivation:
-            children_main.append(f"{code}.c")
-
-        categories[f"{code}"] = {
-            "title": f"{crop}",
-            "comment": f"{crop}",
-            # "alternative_codes": [f"{code}".replace(".", "")],
-            "info": {"gases": gases_main},
-            "children": [children_main],
-        }
-
-        # crop residues (every crop has it)
-        categories[f"{code}.a.i"] = {
-            "title": f"{crop} crop residues direct emissions",
-            "comment": f"{crop} crop residues direct emissions",
-            # "alternative_codes": [f"{code}.a".replace(".", "")],
-            "info": {"gases": ["N2O"]},
-        }
-
-        categories[f"{code}.a.ii"] = {
-            "title": f"{crop} crop residues indirect emissions",
-            "comment": f"{crop} crop residues indirect emissions",
-            # "alternative_codes": [f"{code}.a.i".replace(".", "")],
-            "info": {"gases": ["N2O"]},
-        }
-
-        categories[f"{code}.a"] = {
-            "title": f"{crop} crop residues",
-            "comment": f"{crop} crop residues",
-            # "alternative_codes": [f"{code}.a".replace(".", "")],
-            "info": {"gases": ["N2O"]},
-            "children": [[f"{code}.a.ii", f"{code}.a.i"]],
-        }
-
-        if crop_burning:
-            categories[f"{code}.b"] = {
-                "title": f"{crop} burning crop residues",
-                "comment": f"{crop} burning crop residues",
-                # "alternative_codes": [f"{code}.b".replace(".", "")],
-                "info": {"gases": ["CH4", "N2O"]},
-            }
-        if rice_cultivation:
-            categories[f"{code}.c"] = {
-                "title": "Rice cultivation",
-                "comment": "Rice cultivation",
-                # "alternative_codes": [f"{code}.c".replace(".", "")],
-                "info": {"gases": ["CH4"]},
-            }
-
-    # synthetic fertilisers
-    codes_synthetic_fertilisers = ["1.B", "1.B.1", "1.B.2", "1.B.2.a", "1.B.2.b"]
-    names = [
-        "Synthetic fertilisers",
-        "Direct emissions",
-        "Indirect emissions",
-        "Indirect emissions that volatilise",
-        "Indirect emissions that leach",
-    ]
-    children_cats = [["1.B.1", "1.B.2"], None, ["1.B.2.a", "1.B.2.b"], None, None]
-
-    for code, name, child_cat in zip(codes_synthetic_fertilisers, names, children_cats):
-        categories[code] = {
-            "title": name,
-            "comment": name,
-            # "alternative_codes": [code.replace(".", "")],
-            "info": {"gases": ["N2O"]},
-        }
-        if child_cat:
-            categories[code]["children"] = [child_cat]
-
-    # 2. energy use
-    names = [
-        "Natural gas",
-        "Electricity",
-        "Coal",
-        "Heat",
-        "Petroleum",
-    ]
-    codes = children_2
-    for name, code in zip(names, codes):
-        categories[code] = {
-            "title": name,
-            "comment": name,
-            # "alternative_codes": code.replace(".", ""),
-            "info": {"gases": ["CH4", "N2O", "CO2"]},
-        }
-
-    # 3 livestock
-    animals = [
-        "Asses",
-        "Camels",
-        "Cattle, dairy",
-        "Cattle, non-dairy",
-        "Chickens, broilers",
-        "Chickens, layers",
-        "Goats",
-        "Horses",
-        "Mules and hinnies",
-        "Sheep",
-        "Llamas",
-        "Chickens",
-        "Poultry Birds",
-        "Buffalo",
-        "Ducks",
-        "Swine, breeding",
-        "Swine, market",
-        "Turkeys",
-    ]
-
-    codes_animals = [f"3.{i}" for i in "ABCDEFGHIJKLMNOPQR"]
-
-    enteric_fermentation = [
-        "Asses",
-        "Camels",
-        "Cattle, dairy",
-        "Cattle, non-dairy",
-        "Goats",
-        "Horses",
-        "Sheep",
-        "Mules and hinnies",
-        "Buffalo",
-        "Swine, breeding",
-        "Swine, market",
-        "Llamas",
-    ]
-
-    for animal, code in zip(animals, codes_animals):
-        if animal in enteric_fermentation:
-            gases = ["CH4"]
-            animal_children = [f"{code}.{i}" for i in "1234"]
-            categories[f"{code}.4"] = {
-                "title": f"{animal} enteric fermentation",
-                "comment": f"{animal} enteric fermentation",
-                # "alternative_codes" : code.replace(".", ""),
-                "info": {"gases": gases},
-            }
-        else:
-            gases = ["N2O"]
-            animal_children = [f"{code}.{i}" for i in "123"]
-
-        categories[code] = {
-            "title": animal,
-            "comment": animal,
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": gases},
-            "children": [animal_children],
-        }
-
-        # manure management branch
-        manure_management_children = [f"{code}.1.{i}" for i in "abc"]
-        categories[f"{code}.1"] = {
-            "title": f"{animal} manure management",
-            "comment": f"{animal} manure management",
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": gases},
-            "children": [manure_management_children],
-        }
-
-        categories[f"{code}.1.a"] = {
-            "title": f"{animal} decomposition of organic matter",
-            "comment": f"{animal} decomposition of organic matter",
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "CH4"},
-        }
-
-        categories[f"{code}.1.b"] = {
-            "title": f"{animal} manure management (Direct emissions N2O)",
-            "comment": f"{animal} manure management (Direct emissions N2O)",
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "N2O"},
-        }
-
-        categories[f"{code}.1.c"] = {
-            "title": f"{animal} manure management (Indirect emissions N2O)",
-            "comment": f"{animal} manure management (Indirect emissions N2O)",
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "N2O"},
-        }
-
-        # manure left on pasture branch
-        manure_left_on_pasture_children = [f"{code}.2.{i}" for i in "ab"]
-        categories[f"{code}.2"] = {
-            "title": f"{animal} manure left on pasture",
-            "comment": f"{animal} manure left on pasture",
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "N2O"},
-            "children": [manure_left_on_pasture_children],
-        }
-
-        categories[f"{code}.2.a"] = {
-            "title": f"{animal} manure left on pasture (direct emissions N2O)",
-            "comment": f"{animal} manure left on pasture (direct emissions N2O)",
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "N2O"},
-        }
-
-        categories[f"{code}.2.b"] = {
-            "title": f"{animal} manure left on pasture (indirect emissions N2O)",
-            "comment": f"{animal} manure left on pasture (indirect emissions N2O)",
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "N2O"},
-            "children": [[f"{code}.2.b.i", f"{code}.2.b.ii"]],
-        }
-
-        categories[f"{code}.2.b.i"] = {
-            "title": (
-                f"{animal} manure left on pasture "
-                f"(indirect emissions, N2O that leaches)"
-            ),
-            "comment": (
-                f"{animal} manure left on pasture (indirect "
-                f"emissions, N2O that leaches)"
-            ),
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "N2O"},
-        }
-
-        categories[f"{code}.2.b.ii"] = {
-            "title": (
-                f"{animal} manure left on pasture "
-                f"(indirect emissions, N2O that volatilises)"
-            ),
-            "comment": (
-                f"{animal} manure left on pasture (indirect "
-                f"emissions, N2O that volatilises)"
-            ),
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "N2O"},
-        }
-
-        # manure applied branch
-
-        manure_applied_children = [f"{code}.3.{i}" for i in "ab"]
-        categories[f"{code}.3"] = {
-            "title": f"{animal} manure applied",
-            "comment": f"{animal} manure applied",
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "N2O"},
-            "children": [manure_applied_children],
-        }
-
-        categories[f"{code}.3.a"] = {
-            "title": f"{animal} manure applied (direct emissions N2O)",
-            "comment": f"{animal} manure applied (direct emissions N2O)",
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "N2O"},
-        }
-
-        categories[f"{code}.3.b"] = {
-            "title": f"{animal} manure applied (indirect emissions N2O)",
-            "comment": f"{animal} manure applied (indirect emissions N2O)",
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "N2O"},
-            "children": [[f"{code}.3.b.i", f"{code}.3.b.ii"]],
-        }
-
-        categories[f"{code}.3.b.i"] = {
-            "title": (
-                f"{animal} manure applied " f"(indirect emissions, N2O that leaches)"
-            ),
-            "comment": (
-                f"{animal} manure applied (indirect " f"emissions, N2O that leaches)"
-            ),
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "N2O"},
-        }
-
-        categories[f"{code}.3.b.ii"] = {
-            "title": (
-                f"{animal} manure applied "
-                f"(indirect emissions, N2O that volatilises)"
-            ),
-            "comment": (
-                f"{animal} manure applied (indirect "
-                f"emissions, N2O that volatilises)"
-            ),
-            # "alternative_codes" : code.replace(".", ""),
-            "info": {"gases": "N2O"},
-        }
-
-    # forests
-    categories["4"] = {
-        "title": "Carbon stock change in forests",
-        "comment": "Carbon stock change in forests",
-        "info": {"gases": "CO2"},
-        "children": [["4.A", "4.B"]],
-    }
-
-    categories["4.A"] = {
-        "title": "Forest land",
-        "comment": "Forest land",
-        "info": {"gases": "CO2"},
-    }
-
-    categories["4.B"] = {
-        "title": "Net Forest conversion",
-        "comment": "Net Forest conversion",
-        "info": {"gases": "CO2"},
-    }
-
-    # drained organic soils
-    categories["5"] = {
-        "title": "Drained organic soils",
-        "comment": "Drained organic soils",
-        "info": {"gases": "CO2"},
-        "children": [["5.A", "5.B"]],
-    }
-
-    categories["5.A"] = {
-        "title": "Drained grassland",
-        "comment": "Drained grassland",
-        "info": {"gases": ["CO2", "N2O"]},
-    }
-
-    categories["5.B"] = {
-        "title": "Drained cropland",
-        "comment": "Drained cropland",
-        "info": {"gases": ["CO2", "N2O"]},
-    }
-
-    # 6 Fires
-    # Forest fires
-    forest_fires_children = ["Humid tropical forests", "Other forests"]
-    forest_fires_children_codes = ["6.A.1", "6.A.2"]
-    for cat_name, code in zip(forest_fires_children, forest_fires_children_codes):
-        categories[code] = {
-            "title": cat_name,
-            "comment": cat_name,
-            "info": {"gases": ["CO2", "N2O", "CH4"]},
-        }
-    categories["6.A"] = {
-        "title": "Forest fires",
-        "comment": "Forest fires",
-        "info": {"gases": ["CO2", "N2O", "CH4"]},
-        "children": [forest_fires_children_codes],
-    }
-
-    # Savanna fires
-    savanna_fires_children = [
-        "Closed shrubland",
-        "Grassland",
-        "Open shrubland",
-        "Savanna",
-        "Woody savanna",
-    ]
-    savanna_fires_children_codes = ["6.B.1", "6.B.2", "6.B.3", "6.B.4", "6.B.5"]
-    for cat_name, code in zip(savanna_fires_children, savanna_fires_children_codes):
-        categories[code] = {
-            "title": cat_name,
-            "comment": cat_name,
-            "info": {"gases": ["CO2", "N2O", "CH4"]},
-        }
-    categories["6.B"] = {
-        "title": "Savanna fires",
-        "comment": "Savanna fires",
-        "info": {"gases": ["CO2", "N2O", "CH4"]},
-        "children": [savanna_fires_children_codes],
-    }
-
-    # fires in organic soils
-    categories["6.C"] = {
-        "title": "Fires in organic soils",
-        "comment": "Fires in organic soils",
-        "info": {"gases": ["CO2", "N2O", "CH4"]},
-    }
-
-    # 6 fires
-    categories["6"] = {
-        "title": "Fires",
-        "comment": "Fires",
-        "info": {"gases": ["CO2", "N2O", "CH4"]},
-        "children": [["6.A", "6.B", "6.C"]],
-    }
-
-    # 7 pre and post production
-    pre_post_production_categories = [
-        "Fertilizers Manufacturing",
-        "Food Transport",
-        "Food Retail",
-        "Food Household Consumption",
-        "Solid Food Waste",
-        "Domestic Wastewater",
-        "Industrial Wastewater",
-        "Incineration",
-        "Pre- and Post- Production",
-        "Energy Use (Pre- and Post-Production)",
-        "Agrifood Systems Waste Disposal",
-        "Cold Chain F-Gas",
-        "Pesticides Manufacturing",
-        "Food Processing",
-        "Food Packaging",
-    ]
-    pre_post_production_categories_codes = ["7." + i for i in "ABCDEFGHIJKLMNO"]
-    pre_post_production_categories_gases = [
-        ["CO2", "N2O", "KYOTOGHG (AR5GWP100)"],
-        ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)", "FGASES (AR5GWP100)"],
-        ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)", "FGASES (AR5GWP100)"],
-        ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)", "FGASES (AR5GWP100)"],
-        ["KYOTOGHG (AR5GWP100)", "CH4"],
-        ["KYOTOGHG (AR5GWP100)", "CH4", "N2O"],
-        ["KYOTOGHG (AR5GWP100)", "CH4", "N2O"],
-        ["CO2", "KYOTOGHG (AR5GWP100)"],  # incineration
-        ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)", "FGASES (AR5GWP100)"],
-        ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)"],
-        ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)"],
-        ["FGASES (AR5GWP100)"],
-        ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)"],
-        ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)", "FGASES (AR5GWP100)"],
-        ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)"],
-    ]
-    for cat_name, code, gases in zip(
-        pre_post_production_categories,
-        pre_post_production_categories_codes,
-        pre_post_production_categories_gases,
-    ):
-        categories[code] = {
-            "title": cat_name,
-            "comment": cat_name,
-            "info": {"gases": gases},
-        }
-    categories["7"] = {
-        "title": "Pre and post agricultural production",
-        "comment": "Pre and post agricultural production",
-        "info": {
-            "gases": [
-                "CO2",
-                "CH4",
-                "N2O",
-                "KYOTOGHG (AR5GWP100)",
-                "FGASES (AR5GWP100)",
-            ],
-        },
-        "children": [pre_post_production_categories_codes],
-    }
+#
+# def test_yaml_to_python():
+#     cat = cc.from_yaml("FAO.yaml")
+#     cat.to_python("FAO.py")
+#
+#
+# def test_python_to_yaml():
+#     from FAO import spec
+#
+#     cat = cc.from_spec(spec)
+#     assert cat
 
-    spec["categories"] = categories
-    fao_cats = cc.HierarchicalCategorization.from_spec(spec.copy())
-    # run print(fao_cats.show_as_tree())
-    fao_cats.to_python("FAO.py")
-    fao_cats.to_yaml("FAO.yaml")
+#
+# def test_fao_categorisation():
+#     spec = {
+#         "name": "FAOSTAT",
+#         "title": (
+#             "Food and Agriculture Organization of the United Nations (FAO) "
+#             "FAOSTAT data set categorisation"
+#         ),
+#         "comment": "Needed to add FAOSTAT data to PRIMAP-hist",
+#         "references": "",
+#         "institution": "FAO",
+#         "hierarchical": True,
+#         "last_update": "2024-12-10",
+#         "version": "2024",
+#         "total_sum": True,
+#         "canonical_top_level_category": "0",
+#     }
+#
+#     categories = {}
+#
+#     # 0. main categories
+#     categories["0"] = {
+#         "title": "Total",
+#         "comment": "All emissions and removals",
+#         "children": [["1", "2", "3", "4", "5", "6", "7"]],
+#     }
+#     children_1 = ["1.A", "1.B"]
+#     children_2 = ["2.A", "2.B", "2.C", "2.D", "2.E"]
+#     children_3 = [f"3.{i}" for i in "ABCDEFGHIJKLMNOPQR"]
+#
+#     main_categories = (
+#         # category code, name and comment, gases, children
+#         ("1", "Crops", ["CH4", "N2O"], children_1),
+#         (
+#             "2",
+#             "Energy use in agriculture",
+#             ["CH4", "N2O", "CO2"],
+#             children_2,
+#         ),
+#         ("3", "Livestock", ["CH4", "N2O"], children_3),
+#         # ("4", "Forest", ["CO2"], children_4),
+#         # (
+#         #     "5",
+#         #     "Drained organic soils",
+#         #     ["N2O", "CO2"],
+#         #     children_5,
+#         # ),
+#         # ("6", "Fires", ["CH4", "N2O", "CO2"], children_6),
+#         # (
+#         #     "7",
+#         #     "Pre and post agricultural production",
+#         #     ["CH4", "N2O", "CO2"],
+#         #     children_7,
+#         # ),
+#     )
+#     for code, name, gases, children in main_categories:
+#         categories[code] = {
+#             "title": name,
+#             "comment": name,
+#             # "alternative_codes": code.replace(".", ""),
+#             "children": [children],
+#             "info": {"gases": gases},
+#         }
+#
+#     # 1. crops
+#     # all crops category
+#     code_all_crops = "1.A"
+#     codes_crops = [f"1.A.{i}" for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]
+#     categories[code_all_crops] = {
+#         "title": "All crops",
+#         "comment": "All crops",
+#         # "alternative_codes": code_all_crops.replace(".", ""),
+#         "children": [codes_crops],
+#         "info": {"gases": ["CH4", "N2O"]},
+#     }
+#
+#     crops = [
+#         "Wheat",
+#         "Rice",
+#         "Potatoes",
+#         "Millet",
+#         "Barley",
+#         "Maize (corn)",
+#         "Sugar cane",
+#         "Beans, dry",
+#         "Oats",
+#         "Rye",
+#         "Sorghum",
+#         "Soya beans",
+#     ]
+#
+#     crop_burnings = [
+#         True,
+#         True,
+#         False,
+#         False,
+#         False,
+#         True,
+#         True,
+#         False,
+#         False,
+#         False,
+#         False,
+#         False,
+#     ]
+#     rice_cultivations = [
+#         False,
+#         True,
+#         False,
+#         False,
+#         False,
+#         False,
+#         False,
+#         False,
+#         False,
+#         False,
+#         False,
+#         False,
+#     ]
+#
+#     for crop, code, crop_burning, rice_cultivation in zip(
+#         crops, codes_crops, crop_burnings, rice_cultivations
+#     ):
+#         # all crops have at least N2O emissions
+#         gases_main = "N2O"
+#
+#         if crop_burning or rice_cultivation:
+#             gases_main = ["CH4", "N2O"]
+#
+#         # all crops have at least crop residues as child
+#         children_main = [f"{code}.a"]
+#
+#         if crop_burning:
+#             children_main.append(f"{code}.b")
+#
+#         if rice_cultivation:
+#             children_main.append(f"{code}.c")
+#
+#         categories[f"{code}"] = {
+#             "title": f"{crop}",
+#             "comment": f"{crop}",
+#             # "alternative_codes": [f"{code}".replace(".", "")],
+#             "info": {"gases": gases_main},
+#             "children": [children_main],
+#         }
+#
+#         # crop residues (every crop has it)
+#         categories[f"{code}.a.i"] = {
+#             "title": f"{crop} crop residues direct emissions",
+#             "comment": f"{crop} crop residues direct emissions",
+#             # "alternative_codes": [f"{code}.a".replace(".", "")],
+#             "info": {"gases": ["N2O"]},
+#         }
+#
+#         categories[f"{code}.a.ii"] = {
+#             "title": f"{crop} crop residues indirect emissions",
+#             "comment": f"{crop} crop residues indirect emissions",
+#             # "alternative_codes": [f"{code}.a.i".replace(".", "")],
+#             "info": {"gases": ["N2O"]},
+#         }
+#
+#         categories[f"{code}.a"] = {
+#             "title": f"{crop} crop residues",
+#             "comment": f"{crop} crop residues",
+#             # "alternative_codes": [f"{code}.a".replace(".", "")],
+#             "info": {"gases": ["N2O"]},
+#             "children": [[f"{code}.a.ii", f"{code}.a.i"]],
+#         }
+#
+#         if crop_burning:
+#             categories[f"{code}.b"] = {
+#                 "title": f"{crop} burning crop residues",
+#                 "comment": f"{crop} burning crop residues",
+#                 # "alternative_codes": [f"{code}.b".replace(".", "")],
+#                 "info": {"gases": ["CH4", "N2O"]},
+#             }
+#         if rice_cultivation:
+#             categories[f"{code}.c"] = {
+#                 "title": "Rice cultivation",
+#                 "comment": "Rice cultivation",
+#                 # "alternative_codes": [f"{code}.c".replace(".", "")],
+#                 "info": {"gases": ["CH4"]},
+#             }
+#
+#     # synthetic fertilisers
+#     codes_synthetic_fertilisers = ["1.B", "1.B.1", "1.B.2", "1.B.2.a", "1.B.2.b"]
+#     names = [
+#         "Synthetic fertilisers",
+#         "Direct emissions",
+#         "Indirect emissions",
+#         "Indirect emissions that volatilise",
+#         "Indirect emissions that leach",
+#     ]
+#     children_cats = [["1.B.1", "1.B.2"], None, ["1.B.2.a", "1.B.2.b"], None, None]
+#
+#     for code, name, child_cat in zip(codes_synthetic_fertilisers, names, children_cats):
+#         categories[code] = {
+#             "title": name,
+#             "comment": name,
+#             # "alternative_codes": [code.replace(".", "")],
+#             "info": {"gases": ["N2O"]},
+#         }
+#         if child_cat:
+#             categories[code]["children"] = [child_cat]
+#
+#     # 2. energy use
+#     names = [
+#         "Natural gas",
+#         "Electricity",
+#         "Coal",
+#         "Heat",
+#         "Petroleum",
+#     ]
+#     codes = children_2
+#     for name, code in zip(names, codes):
+#         categories[code] = {
+#             "title": name,
+#             "comment": name,
+#             # "alternative_codes": code.replace(".", ""),
+#             "info": {"gases": ["CH4", "N2O", "CO2"]},
+#         }
+#
+#     # 3 livestock
+#     animals = [
+#         "Asses",
+#         "Camels",
+#         "Cattle, dairy",
+#         "Cattle, non-dairy",
+#         "Chickens, broilers",
+#         "Chickens, layers",
+#         "Goats",
+#         "Horses",
+#         "Mules and hinnies",
+#         "Sheep",
+#         "Llamas",
+#         "Chickens",
+#         "Poultry Birds",
+#         "Buffalo",
+#         "Ducks",
+#         "Swine, breeding",
+#         "Swine, market",
+#         "Turkeys",
+#     ]
+#
+#     codes_animals = [f"3.{i}" for i in "ABCDEFGHIJKLMNOPQR"]
+#
+#     enteric_fermentation = [
+#         "Asses",
+#         "Camels",
+#         "Cattle, dairy",
+#         "Cattle, non-dairy",
+#         "Goats",
+#         "Horses",
+#         "Sheep",
+#         "Mules and hinnies",
+#         "Buffalo",
+#         "Swine, breeding",
+#         "Swine, market",
+#         "Llamas",
+#     ]
+#
+#     for animal, code in zip(animals, codes_animals):
+#         if animal in enteric_fermentation:
+#             gases = ["CH4"]
+#             animal_children = [f"{code}.{i}" for i in "1234"]
+#             categories[f"{code}.4"] = {
+#                 "title": f"{animal} enteric fermentation",
+#                 "comment": f"{animal} enteric fermentation",
+#                 # "alternative_codes" : code.replace(".", ""),
+#                 "info": {"gases": gases},
+#             }
+#         else:
+#             gases = ["N2O"]
+#             animal_children = [f"{code}.{i}" for i in "123"]
+#
+#         categories[code] = {
+#             "title": animal,
+#             "comment": animal,
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": gases},
+#             "children": [animal_children],
+#         }
+#
+#         # manure management branch
+#         manure_management_children = [f"{code}.1.{i}" for i in "abc"]
+#         categories[f"{code}.1"] = {
+#             "title": f"{animal} manure management",
+#             "comment": f"{animal} manure management",
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": gases},
+#             "children": [manure_management_children],
+#         }
+#
+#         categories[f"{code}.1.a"] = {
+#             "title": f"{animal} decomposition of organic matter",
+#             "comment": f"{animal} decomposition of organic matter",
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "CH4"},
+#         }
+#
+#         categories[f"{code}.1.b"] = {
+#             "title": f"{animal} manure management (Direct emissions N2O)",
+#             "comment": f"{animal} manure management (Direct emissions N2O)",
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "N2O"},
+#         }
+#
+#         categories[f"{code}.1.c"] = {
+#             "title": f"{animal} manure management (Indirect emissions N2O)",
+#             "comment": f"{animal} manure management (Indirect emissions N2O)",
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "N2O"},
+#         }
+#
+#         # manure left on pasture branch
+#         manure_left_on_pasture_children = [f"{code}.2.{i}" for i in "ab"]
+#         categories[f"{code}.2"] = {
+#             "title": f"{animal} manure left on pasture",
+#             "comment": f"{animal} manure left on pasture",
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "N2O"},
+#             "children": [manure_left_on_pasture_children],
+#         }
+#
+#         categories[f"{code}.2.a"] = {
+#             "title": f"{animal} manure left on pasture (direct emissions N2O)",
+#             "comment": f"{animal} manure left on pasture (direct emissions N2O)",
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "N2O"},
+#         }
+#
+#         categories[f"{code}.2.b"] = {
+#             "title": f"{animal} manure left on pasture (indirect emissions N2O)",
+#             "comment": f"{animal} manure left on pasture (indirect emissions N2O)",
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "N2O"},
+#             "children": [[f"{code}.2.b.i", f"{code}.2.b.ii"]],
+#         }
+#
+#         categories[f"{code}.2.b.i"] = {
+#             "title": (
+#                 f"{animal} manure left on pasture "
+#                 f"(indirect emissions, N2O that leaches)"
+#             ),
+#             "comment": (
+#                 f"{animal} manure left on pasture (indirect "
+#                 f"emissions, N2O that leaches)"
+#             ),
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "N2O"},
+#         }
+#
+#         categories[f"{code}.2.b.ii"] = {
+#             "title": (
+#                 f"{animal} manure left on pasture "
+#                 f"(indirect emissions, N2O that volatilises)"
+#             ),
+#             "comment": (
+#                 f"{animal} manure left on pasture (indirect "
+#                 f"emissions, N2O that volatilises)"
+#             ),
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "N2O"},
+#         }
+#
+#         # manure applied branch
+#
+#         manure_applied_children = [f"{code}.3.{i}" for i in "ab"]
+#         categories[f"{code}.3"] = {
+#             "title": f"{animal} manure applied",
+#             "comment": f"{animal} manure applied",
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "N2O"},
+#             "children": [manure_applied_children],
+#         }
+#
+#         categories[f"{code}.3.a"] = {
+#             "title": f"{animal} manure applied (direct emissions N2O)",
+#             "comment": f"{animal} manure applied (direct emissions N2O)",
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "N2O"},
+#         }
+#
+#         categories[f"{code}.3.b"] = {
+#             "title": f"{animal} manure applied (indirect emissions N2O)",
+#             "comment": f"{animal} manure applied (indirect emissions N2O)",
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "N2O"},
+#             "children": [[f"{code}.3.b.i", f"{code}.3.b.ii"]],
+#         }
+#
+#         categories[f"{code}.3.b.i"] = {
+#             "title": (
+#                 f"{animal} manure applied " f"(indirect emissions, N2O that leaches)"
+#             ),
+#             "comment": (
+#                 f"{animal} manure applied (indirect " f"emissions, N2O that leaches)"
+#             ),
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "N2O"},
+#         }
+#
+#         categories[f"{code}.3.b.ii"] = {
+#             "title": (
+#                 f"{animal} manure applied "
+#                 f"(indirect emissions, N2O that volatilises)"
+#             ),
+#             "comment": (
+#                 f"{animal} manure applied (indirect "
+#                 f"emissions, N2O that volatilises)"
+#             ),
+#             # "alternative_codes" : code.replace(".", ""),
+#             "info": {"gases": "N2O"},
+#         }
+#
+#     # forests
+#     categories["4"] = {
+#         "title": "Carbon stock change in forests",
+#         "comment": "Carbon stock change in forests",
+#         "info": {"gases": "CO2"},
+#         "children": [["4.A", "4.B"]],
+#     }
+#
+#     categories["4.A"] = {
+#         "title": "Forest land",
+#         "comment": "Forest land",
+#         "info": {"gases": "CO2"},
+#     }
+#
+#     categories["4.B"] = {
+#         "title": "Net Forest conversion",
+#         "comment": "Net Forest conversion",
+#         "info": {"gases": "CO2"},
+#     }
+#
+#     # drained organic soils
+#     categories["5"] = {
+#         "title": "Drained organic soils",
+#         "comment": "Drained organic soils",
+#         "info": {"gases": "CO2"},
+#         "children": [["5.A", "5.B"]],
+#     }
+#
+#     categories["5.A"] = {
+#         "title": "Drained grassland",
+#         "comment": "Drained grassland",
+#         "info": {"gases": ["CO2", "N2O"]},
+#     }
+#
+#     categories["5.B"] = {
+#         "title": "Drained cropland",
+#         "comment": "Drained cropland",
+#         "info": {"gases": ["CO2", "N2O"]},
+#     }
+#
+#     # 6 Fires
+#     # Forest fires
+#     forest_fires_children = ["Humid tropical forests", "Other forests"]
+#     forest_fires_children_codes = ["6.A.1", "6.A.2"]
+#     for cat_name, code in zip(forest_fires_children, forest_fires_children_codes):
+#         categories[code] = {
+#             "title": cat_name,
+#             "comment": cat_name,
+#             "info": {"gases": ["CO2", "N2O", "CH4"]},
+#         }
+#     categories["6.A"] = {
+#         "title": "Forest fires",
+#         "comment": "Forest fires",
+#         "info": {"gases": ["CO2", "N2O", "CH4"]},
+#         "children": [forest_fires_children_codes],
+#     }
+#
+#     # Savanna fires
+#     savanna_fires_children = [
+#         "Closed shrubland",
+#         "Grassland",
+#         "Open shrubland",
+#         "Savanna",
+#         "Woody savanna",
+#     ]
+#     savanna_fires_children_codes = ["6.B.1", "6.B.2", "6.B.3", "6.B.4", "6.B.5"]
+#     for cat_name, code in zip(savanna_fires_children, savanna_fires_children_codes):
+#         categories[code] = {
+#             "title": cat_name,
+#             "comment": cat_name,
+#             "info": {"gases": ["CO2", "N2O", "CH4"]},
+#         }
+#     categories["6.B"] = {
+#         "title": "Savanna fires",
+#         "comment": "Savanna fires",
+#         "info": {"gases": ["CO2", "N2O", "CH4"]},
+#         "children": [savanna_fires_children_codes],
+#     }
+#
+#     # fires in organic soils
+#     categories["6.C"] = {
+#         "title": "Fires in organic soils",
+#         "comment": "Fires in organic soils",
+#         "info": {"gases": ["CO2", "N2O", "CH4"]},
+#     }
+#
+#     # 6 fires
+#     categories["6"] = {
+#         "title": "Fires",
+#         "comment": "Fires",
+#         "info": {"gases": ["CO2", "N2O", "CH4"]},
+#         "children": [["6.A", "6.B", "6.C"]],
+#     }
+#
+#     # 7 pre and post production
+#     pre_post_production_categories = [
+#         "Fertilizers Manufacturing",
+#         "Food Transport",
+#         "Food Retail",
+#         "Food Household Consumption",
+#         "Solid Food Waste",
+#         "Domestic Wastewater",
+#         "Industrial Wastewater",
+#         "Incineration",
+#         "Pre- and Post- Production",
+#         "Energy Use (Pre- and Post-Production)",
+#         "Agrifood Systems Waste Disposal",
+#         "Cold Chain F-Gas",
+#         "Pesticides Manufacturing",
+#         "Food Processing",
+#         "Food Packaging",
+#     ]
+#     pre_post_production_categories_codes = ["7." + i for i in "ABCDEFGHIJKLMNO"]
+#     pre_post_production_categories_gases = [
+#         ["CO2", "N2O", "KYOTOGHG (AR5GWP100)"],
+#         ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)", "FGASES (AR5GWP100)"],
+#         ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)", "FGASES (AR5GWP100)"],
+#         ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)", "FGASES (AR5GWP100)"],
+#         ["KYOTOGHG (AR5GWP100)", "CH4"],
+#         ["KYOTOGHG (AR5GWP100)", "CH4", "N2O"],
+#         ["KYOTOGHG (AR5GWP100)", "CH4", "N2O"],
+#         ["CO2", "KYOTOGHG (AR5GWP100)"],  # incineration
+#         ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)", "FGASES (AR5GWP100)"],
+#         ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)"],
+#         ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)"],
+#         ["FGASES (AR5GWP100)"],
+#         ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)"],
+#         ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)", "FGASES (AR5GWP100)"],
+#         ["CO2", "CH4", "N2O", "KYOTOGHG (AR5GWP100)"],
+#     ]
+#     for cat_name, code, gases in zip(
+#         pre_post_production_categories,
+#         pre_post_production_categories_codes,
+#         pre_post_production_categories_gases,
+#     ):
+#         categories[code] = {
+#             "title": cat_name,
+#             "comment": cat_name,
+#             "info": {"gases": gases},
+#         }
+#     categories["7"] = {
+#         "title": "Pre and post agricultural production",
+#         "comment": "Pre and post agricultural production",
+#         "info": {
+#             "gases": [
+#                 "CO2",
+#                 "CH4",
+#                 "N2O",
+#                 "KYOTOGHG (AR5GWP100)",
+#                 "FGASES (AR5GWP100)",
+#             ],
+#         },
+#         "children": [pre_post_production_categories_codes],
+#     }
+#
+#     spec["categories"] = categories
+#     fao_cats = cc.HierarchicalCategorization.from_spec(spec.copy())
+#     # run print(fao_cats.show_as_tree())
+#     fao_cats.to_python("FAO.py")
+#     fao_cats.to_yaml("FAO.yaml")