diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..978cb3e --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.ipynb filter=nbstripout diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 93f11ff..7f7adae 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -37,12 +37,14 @@ jobs: node-version: 18.x - name: Install Jupyter Book (via myst) run: npm install -g jupyter-book + working-directory: handbook - name: Build HTML Assets run: jupyter-book build --html + working-directory: handbook - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: - path: './_build/html' + path: './handbook/_build/html' - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 1a14ead..bb12301 100755 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ handbook/data handbook/outputs - +**/.ipynb_checkpoints/ +**/.DS_Store # MyST build outputs _build diff --git a/README.md b/README.md index ea4e532..d14eb38 100755 --- a/README.md +++ b/README.md @@ -4,21 +4,30 @@
-# ECMWF - Probability of Fire (POF) Model Pipeline +# Getting started -This repository contains three main scripts representing the end-to-end workflow for generating, training, and forecasting Probability of Fire (POF) using environmental and human -datasets. The model framework is based around the operation Sparky-PoF system used by ECMWF. +In this book, we will show how you can create your own version of the Probability of Fire (PoF) system. A pof in a box! -Building the environment +Before you begin, please note that the workflow presented here is not intended to reproduce the exact operational system currently running at ECMWF. Instead, it provides a simplified sequence of steps designed to help you get started. +The notebook can only be used with past forecasts—it will generate a tool that allows you to explore and analyse previous forecast data. +That said, we believe this provides a valuable starting point: a complete, working system built entirely from data that are publicly available through the Climate Data Store (CDS) or accessible via temporary data repositories linked within this notebook. -conda env create -f environment.yml -conda activate POF_IN_A_BOX -Building the Jupyter Book + +CC BY-NC-SA
+ +## Building the environment +``` +conda env create -f environment.yml +conda activate POF_IN_A_BOX +``` +## Building the Jupyter Book +``` rm -rf _build jupyter-book build - -Visualising the book locally. - -jupyter-book start \ No newline at end of file +``` +## Visualising the book locally. +``` +jupyter-book start +``` \ No newline at end of file diff --git a/bootstrap.sh b/bootstrap.sh new file mode 100755 index 0000000..fc1c5fe --- /dev/null +++ b/bootstrap.sh @@ -0,0 +1,11 @@ +mkdir -p handbook/data/CLIMATE +set -x +for f in 10U 10V D2M T2M WS;do + curl -u ecbox:1hHfYAwUtuzVbSXFHaDVlzNrKDttMwT2RBA0L95Cvr32pgzpsWAoybmjTgJkgeRpcyz3NybnWfd31GWdmOTQBBDXkSRVKTvXGoQkXEXMVPnErYNnQ8V https://sites.ecmwf.int/ecbox/POF_IN_A_BOX/s/dav/data/${f}_2003_01.nc --output handbook/data/${f}_2003_01.nc +done +for f in DFMC LFMC FUEL;do + curl -u ecbox:1hHfYAwUtuzVbSXFHaDVlzNrKDttMwT2RBA0L95Cvr32pgzpsWAoybmjTgJkgeRpcyz3NybnWfd31GWdmOTQBBDXkSRVKTvXGoQkXEXMVPnErYNnQ8V https://sites.ecmwf.int/ecbox/POF_IN_A_BOX/s/dav/data/${f}_MAP_2003_01_R.nc --output handbook/data/${f}_2003_01_R.nc +done +for f in POP_2020.nc_2 road_density_2015_c.nc_2 landcover_2015_c.nc_2;do + curl -u ecbox:1hHfYAwUtuzVbSXFHaDVlzNrKDttMwT2RBA0L95Cvr32pgzpsWAoybmjTgJkgeRpcyz3NybnWfd31GWdmOTQBBDXkSRVKTvXGoQkXEXMVPnErYNnQ8V https://sites.ecmwf.int/ecbox/POF_IN_A_BOX/s/dav/data/CLIMATE/${f} --output handbook/data/CLIMATE/${f} +done diff --git a/bootstrap_ecmwf.sh b/bootstrap_ecmwf.sh new file mode 100755 index 0000000..02639b7 --- /dev/null +++ b/bootstrap_ecmwf.sh @@ -0,0 +1,3 @@ +ln -sf /perm/maca/POF_IN_A_BOX_data handbook/data + + diff --git a/environment.yml b/environment.yml index 0fe3a80..d2e5f15 100755 --- a/environment.yml +++ b/environment.yml @@ -7,6 +7,7 @@ dependencies: - xarray - netcdf4 - cdsapi +- cartopy - numpy - joblib - matplotlib diff --git a/handbook/.ipynb_checkpoints/PoF_Forecast-checkpoint.ipynb b/handbook/.ipynb_checkpoints/PoF_Forecast-checkpoint.ipynb deleted file mode 100644 index 14d9d4c..0000000 --- a/handbook/.ipynb_checkpoints/PoF_Forecast-checkpoint.ipynb +++ /dev/null @@ -1,207 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 9, - "id": "0add9849", - "metadata": {}, - "outputs": [], - "source": [ - "import xarray as xr\n", - "import numpy as np\n", - "import pandas as pd\n", - "import joblib\n", - "from pathlib import Path\n", - "import cftime\n", - "from xarray.coding.times import CFDatetimeCoder\n", - "import os\n" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "9040e021", - "metadata": {}, - "outputs": [], - "source": [ - "# -----------------------------\n", - "# CONFIG\n", - "# -----------------------------\n", - "base_path = Path(\"./data/\")\n", - "year = 2003\n", - "month = 1\n", - "os.makedirs(\"./outputs/\", exist_ok=True)\n", - "output_file = f\"./outputs/POF_prediction_{year}_{month:02d}.nc\"\n", - "\n", - "# Load trained model\n", - "model = joblib.load(\"./data/POF_model.joblib\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "09d062ce", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# -----------------------------\n", - "# LOAD STATIC DATA\n", - "# -----------------------------\n", - "time_coder = CFDatetimeCoder(use_cftime=True)\n", - "PO = xr.open_dataset(base_path / \"CLIMATE/POP_2020.nc_2\")\n", - "UR = xr.open_dataset(base_path / \"CLIMATE/urban_C.nc_2\", decode_times=time_coder)\n", - "RD = xr.open_dataset(base_path / \"CLIMATE/road_density_2015_c.nc_2\")\n", - "\n", - "UR_arr = UR.vegdiff.squeeze().values # keep 2D shape\n", - "PO_arr = PO.population_density.values \n", - "RD_arr = RD.road_length.values \n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "debaf10e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "CC BY-NC-SA
diff --git a/handbook/.ipynb_checkpoints/index-checkpoint.md b/handbook/.ipynb_checkpoints/index-checkpoint.md deleted file mode 100644 index f1e2e91..0000000 --- a/handbook/.ipynb_checkpoints/index-checkpoint.md +++ /dev/null @@ -1,38 +0,0 @@ - - -__PoF in a Box provides a ready-to-run set of notebooks designed to help you get started with your own Predictability of Fire (PoF) experiments. It includes all the tools, data access, and workflows needed to explore fire activity prediction, from input preparation to model evaluation—right out of the box.__ - - -# Wildfire prediction - -Given their chaotic nature, how can we know when and where wildfires will occur? That is a question that has puzzled wildfire forecasters for decades and now, thanks to advances in **machine learning**, we are one step closer to answering it, although we still have some way to go. - -The topic of **wildfire forecasting** is not a new one. However, in recent years media attention around the subject has grown as unprecedented wildfire seasons in Australia (2019/2020) and Canada (2023) and Europe (2025) have resulted in widespread devastation of local ecosystems and communities. - -These events have far-reaching consequences for both air quality and greenhouse gas emissions - -## Traditional fire forecasting -For nearly half a century, fire danger forecasts have relied on a method that links weather conditions with fire activity to create an index of fire risk, with the **Canadian Fire Weather Index (FWI)** - being the most widely used. However, this approach has its limitations. -  - -**A fire needs fuel**, and for wildfires that fuel is both **living** and **dead** vegetation. The abundance and arrangement of that fuel is known as the ‘**fuel bed**’. If all else is equal, the drier the fuel bed, the higher the fire risk. The FWI primarily estimates the state of fuel moisture based on meteorological conditions affecting a predetermined typical Canadian forest fuel bed. However, a typical fuel bed does not capture controls such as the moisture levels in living vegetation, the composition of vegetation types, or the actual abundance of available fuel. Consequently, the FWI tends to overestimate fire risk in areas with limited fuel. Moreover, because the FWI was originally developed for Canadian forests, its applicability becomes complex when extrapolated to different ecosystems. - -All this is before we even consider the factors that might start a wildfire in the first place (known as ignitions). Ninety per cent of ignitions are caused by the unpredictable behaviour of humans, making them chaotic in nature and hard to predict. - -```{tip} -These shortcomings highlight the need for more advanced forecasting techniques to accurately assess wildfire risk across diverse landscapes. -``` - -# Machine learning evolution - -In recent months, there has been a remarkable growth in the integration of machine learning into weather forecasting systems. **With the intricate dynamics governing wildfires, it seems only natural to explore similar applications of machine learning in fire forecasting.** - -We have developed a new tool, known as **Probability of Fire, or PoF,** which uses machine learning techniques to effectively forecast fire occurrence globally at high resolution, up to ten days in advance. -```{tip} -A key strength of PoF is found not only in the accurate predictions but also in computational cost. The model itself is extremely cheap to run compared with more traditional physical models, which allows us to perform global 1 km forecasts. -``` -  -The foundation of PoF lies in its utilisation of diverse datasets, including information from the ECMWF Integrated Forecasting System (IFS), land cover data, and a **newly developed fuel characteristic model**. - -The training of PoF is made possible thanks to the wealth of historic observations of active fires from satellites. The model mimics what it anticipates satellites will detect in the next few days. Consequently, it could only ever hope to perform as well as the satellite, which emphasises the importance of accurate satellite data for training. diff --git a/handbook/PoF_Data_Generator.ipynb b/handbook/POF_Data_Generator.ipynb similarity index 60% rename from handbook/PoF_Data_Generator.ipynb rename to handbook/POF_Data_Generator.ipynb index f8979ae..47120a8 100755 --- a/handbook/PoF_Data_Generator.ipynb +++ b/handbook/POF_Data_Generator.ipynb @@ -1,9 +1,38 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# 💿 PoF Data Generator" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "Importing all the necessary python libraries\n", + "before we begin, we must prepare our enviroment. This includes installing the Application Programming Interface (API) of the CDS, and importing the various python libraries we will need.\n", + "\n", + "These should have been installed into a conda environment before running the Notebook." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -q cdsapi" + ] + }, { "cell_type": "code", - "execution_count": 1, - "id": "ce6f7bca", + "execution_count": null, + "id": "3", "metadata": {}, "outputs": [], "source": [ @@ -14,13 +43,23 @@ "from pathlib import Path\n", "import cdsapi\n", "import os\n", - "import zipfile\n" + "import zipfile\n", + "import requests\n" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "Here we will define some configuration options. \n", + "For the purpose of the book we try to keep the volume of data small. This will involve downloading data from the CDS." ] }, { "cell_type": "code", - "execution_count": 2, - "id": "22ddcd71", + "execution_count": null, + "id": "5", "metadata": {}, "outputs": [], "source": [ @@ -32,29 +71,103 @@ "cds_days= [f\"{d:02d}\" for d in range(1, 32)]" ] }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "ECBox Data Download\n", + "\n", + "Some of the data we will use is available on an EC Box at ECMWF\n", + "We have provided the download here to retrieve the files needed for the Climate and for Active Fire Data." + ] + }, { "cell_type": "code", - "execution_count": 3, - "id": "616ed1ac", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "os.makedirs(\"data\", exist_ok=True)\n", + "os.makedirs(\"data/CLIMATE\", exist_ok=True)\n", + "def retrieve_file(path):\n", + " \n", + " output_path=f\"data/{path}\"\n", + " if not os.path.exists(output_path):\n", + " username = \"ecbox\"\n", + " token = \"1vXbp0THtxZkla015skARAqTnf2DxxoQS0qlwrgpKiIGpPRKLtXklYO39tOJTXtnZrxP16WZs99iSoFgTTAy3orpmjykOBAO7CVk5RQIWFvZFhiSv0Ev3O3\"\n", + "\n", + " base_url = \"https://sites.ecmwf.int/ecbox/POF_IN_A_BOX/s/dav/data/\"\n", + "\n", + " response = requests.get(f'{base_url}/{path}', auth=(username, token))\n", + "\n", + " if response.status_code == 200:\n", + " with open(f\"data/{path}\", \"wb\") as f:\n", + " f.write(response.content)\n", + " # print(\"Downloaded!\")\n", + " else:\n", + " print(response.status_code, response.text)\n", + "\n", + "for year in range(2003, 2022):\n", + " for month in range(1, 13):\n", + " retrieve_file(f\"ACTIVE_FIRE_MAP_{year}_{month:02d}_R.nc\")\n", + " \n", + "retrieve_file(f\"CLIMATE/POP_2020.nc\")\n", + "retrieve_file(f\"CLIMATE/road_density_2015_agg_r.nc\")" + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "##Enter your CDS API key and XDS-Preprod API Key\n", + "\n", + "We will request data from the Climate Data Store (CDS) and the Cross Data Store (XDS) programmatically with the help of the CDS API.\n", + "\n", + "If you have not set up your CDS API credentials with a ~/.cdsapirc file, it is possible to provide the credentials when initialising the cdsapi.Client. To do this we must define the two variables needed to establish a connection: URL and KEY . The URL for the cds api is common and you do not need to modify that field. The KEY is string of characters made up of your your personal User ID and CDS API key. To obtain these, first register or login to the CDS (https://cds.climate.copernicus.eu), then visit https://cds.climate.copernicus.eu/how-to-api and copy the string of characters listed after \"key:\". Replace the ######### below with this string.\n", + "\n", + "For XDS the URL and instance are different as so we need the a different set of credentials for XDS. The API functions in the same way, but you will need to register and login on the XDS (https://xds-preprod.ecmwf.int/) and retrieve your API key here: https://xds-preprod.ecmwf.int/how-to-api \n", + "\n", + "NOTE: If you have set up your cdsapi key using a ~/.cdsapirc you will need to update it for using the xds key or override it as we have demonstrated below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", "metadata": {}, "outputs": [], "source": [ "\n", "cds_kwargs = {\n", " 'url': 'https://cds.climate.copernicus.eu/api',\n", - " 'key': '14e44bc7-0f33-4a57-847f-f41f44c5ec4d',\n", + " 'key': '#####################################',\n", "}\n", "\n", "xds_kwargs = {\n", " 'url': 'https://xds-preprod.ecmwf.int/api',\n", - " 'key': '081c061b-d9b9-42eb-a483-a78e2b61cfd1',\n", + " 'key': '#####################################',\n", "}" ] }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "CDS Data Retrieval\n", + "\n", + "This code block will retrieve the datasets needed from the CDS including temperature, wind speed, precipidation and dewpoint. We will retreive for the years and months that were configured above.\n", + "\n", + "We require wind speed, we will calculate this from the 10U and 10V wind components." + ] + }, { "cell_type": "code", - "execution_count": 4, - "id": "4e2a9617", + "execution_count": null, + "id": "11", "metadata": {}, "outputs": [], "source": [ @@ -91,13 +204,32 @@ " dsw=dsw.rename(\"ws\")\n", " dsw.to_netcdf(f\"data/WS_{year}_{month}.nc\")\n", " del dsw\n", - "\n" + "\n", + " if not os.path.exists(f\"data/RH_{year}_{month}.nc\"):\n", + " with xr.open_dataset(f\"data/T2M_{year}_{month}.nc\") as dst,\\\n", + " xr.open_dataset(f\"data/D2M_{year}_{month}.nc\") as dsd:\n", + " es = 10**(7.5*(dst.t2m-273.15)/(237.7+(dst.t2m-273.15))) * 6.11\n", + " e = 10**(7.5*(dsd.d2m-273.15)/(237.7+(dsd.d2m-273.15))) * 6.11\n", + " dsrh = (e/es)*100\n", + " dsrh = dsrh.rename(\"rh\")\n", + " dsrh.to_netcdf(f\"data/RH_{year}_{month}.nc\")\n", + " del dsrh" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "We will now retrieve some data from the XDS.\n", + "\n", + "The XDS data is stored at a different grid to ERA5 Land and so we will regrid the data on the fly once it is downloaded." ] }, { "cell_type": "code", - "execution_count": 5, - "id": "6d6731ce", + "execution_count": null, + "id": "13", "metadata": { "vscode": { "languageId": "shellscript" @@ -124,7 +256,7 @@ " ],\n", " \"version\": [\"1\"],\n", " \"year\": [\n", - " year\n", + " f'{year}'\n", " ],\n", " \"month\": [\n", " month\n", @@ -144,41 +276,30 @@ " del ds_regrid" ] }, + { + "cell_type": "markdown", + "id": "14", + "metadata": {}, + "source": [ + "Build an XGBoost-compatible training dataset by combining\n", + "climate, vegetation, and anthropogenic data from multiple NetCDF sources." + ] + }, { "cell_type": "code", - "execution_count": 6, - "id": "7a12a1ca", + "execution_count": null, + "id": "15", "metadata": { "vscode": { "languageId": "shellscript" } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Loading static datasets...\n", - "Processing year 2003...\n", - "Combining sampled data...\n", - "Saving dataset → ./data/training_data.parquet\n", - "✅ Training dataset ready.\n" - ] - } - ], + "outputs": [], "source": [ - "\"\"\"\n", - "Build an XGBoost-compatible training dataset by combining\n", - "climate, vegetation, and anthropogenic data from multiple NetCDF sources.\n", - "\"\"\"\n", - "\n", - "# -----------------------------\n", - "# CONFIG & CONSTANTS\n", - "# -----------------------------\n", "output_path=\"./data/training_data.parquet\"\n", "base_path = Path(\"./data/\")\n", "\n", - "sample_frac = 1 / 100 # keep ~10% of total samples\n", + "sample_frac = 1 # keep all data for training.\n", "\n", "# -----------------------------\n", "# LOAD STATIC DATASETS\n", @@ -186,11 +307,9 @@ "time_coder = CFDatetimeCoder(use_cftime=True)\n", "\n", "print(\"Loading static datasets...\")\n", - "PO = xr.open_dataset(base_path / \"CLIMATE/POP_2020.nc_2\")\n", - "UR = xr.open_dataset(base_path / \"CLIMATE/urban_C.nc_2\", decode_times=time_coder)\n", - "RD = xr.open_dataset(base_path / \"CLIMATE/road_density_2015_c.nc_2\")\n", + "PO = xr.open_dataset(base_path / \"CLIMATE/POP_2020.nc\")\n", + "RD = xr.open_dataset(base_path / \"CLIMATE/road_density_2015_agg_r.nc\")\n", "\n", - "ur = UR.vegdiff.squeeze().values.flatten()\n", "po = PO.population_density.values.flatten()\n", "rd = RD.road_length.values.flatten()\n", "\n", @@ -213,8 +332,8 @@ " \"LF\": f\"LFMC_MAP_{year}_{mon}_R.nc\",\n", " \"PR\": f\"P_{year}_{mon}.nc\",\n", " \"T2\": f\"T2M_{year}_{mon}.nc\",\n", - " \"D2\": f\"D2M_{year}_{mon}.nc\",\n", - " \"WS\": f\"WS_{year}_{mon}.nc\",\n", + " \"RH\": f\"RH_{year}_{mon}.nc\",\n", + " \"WS\": f\"WS_{year}_{mon}.nc\"\n", " }\n", "\n", " # Load datasets efficiently with context managers\n", @@ -224,9 +343,9 @@ " xr.open_dataset(base_path / ds_paths[\"LF\"]) as LF, \\\n", " xr.open_dataset(base_path / ds_paths[\"PR\"]) as PR, \\\n", " xr.open_dataset(base_path / ds_paths[\"T2\"]) as T2, \\\n", - " xr.open_dataset(base_path / ds_paths[\"D2\"]) as D2, \\\n", + " xr.open_dataset(base_path / ds_paths[\"RH\"]) as RH, \\\n", " xr.open_dataset(base_path / ds_paths[\"WS\"]) as WS:\n", - "\n", + " AF=AF.fillna(0) # Fill NaNs in ACTIVE_FIRE with 0\n", " days = len(AF.ACTIVE_FIRE)\n", "\n", " # Process only the first day (change np.arange(1) to range(len(AF.ACTIVE_FIRE)) if needed)\n", @@ -241,7 +360,7 @@ " lf = LF.LFMC[i].values.flatten()\n", " pr = PR.tp[i].values.flatten()\n", " t2 = T2.t2m[i].values.flatten()\n", - " d2 = D2.d2m[i].values.flatten()\n", + " rh = RH.rh[i].values.flatten()\n", " ws = WS.ws[i].values.flatten()\n", "\n", " # Mask where total fuel > 0\n", @@ -253,7 +372,7 @@ " \"AF\": af[mask],\n", " \"PR\": pr[mask],\n", " \"T2\": t2[mask],\n", - " \"D2\": d2[mask],\n", + " \"RH\": rh[mask],\n", " \"WS\": ws[mask],\n", " \"FU_LL\": fu_ll[mask],\n", " \"FU_LW\": fu_lw[mask],\n", @@ -262,7 +381,6 @@ " \"DF\": df[mask],\n", " \"DW\": dw[mask],\n", " \"LF\": lf[mask],\n", - " \"UR\": ur[mask],\n", " \"PO\": po[mask],\n", " \"RD\": rd[mask],\n", " }, dtype=float)\n", @@ -295,7 +413,7 @@ ], "metadata": { "kernelspec": { - "display_name": "POF_IN_A_BOX", + "display_name": "Python 3.12.11-01", "language": "python", "name": "python3" }, @@ -309,7 +427,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.14.0" + "version": "3.12.11" } }, "nbformat": 4, diff --git a/handbook/POF_Forecast.ipynb b/handbook/POF_Forecast.ipynb new file mode 100755 index 0000000..5aeafb1 --- /dev/null +++ b/handbook/POF_Forecast.ipynb @@ -0,0 +1,371 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# POF Forecast" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "Importing all the necessary python libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "import xarray as xr\n", + "import numpy as np\n", + "import pandas as pd\n", + "import joblib\n", + "from pathlib import Path\n", + "import cftime\n", + "from xarray.coding.times import CFDatetimeCoder\n", + "import os\n", + "import cdsapi\n", + "import zipfile\n" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "Configuration Options\n", + "\n", + "Here we define the paths for files and the dates we will use for our forecast.\n", + "\n", + "We also load the model we created in the Trainer notebook\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "# Folder structure\n", + "base_path = Path(\"./data/\")\n", + "os.makedirs(\"./outputs/\", exist_ok=True)\n", + "\n", + "# Dates of Forecast\n", + "year = 2019\n", + "years=[year]\n", + "months = [12]\n", + "cds_months=[f'{m:02d}' for m in months]\n", + "cds_days= [f\"{d:02d}\" for d in range(1, 32)]\n", + "\n", + "# Where we will store our predictions\n", + "output_file = f\"./outputs/POF_prediction_{year}_{month:02d}.nc\"\n", + "\n", + "# Load trained model\n", + "model = joblib.load(\"./data/POF_model.joblib\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "cds_kwargs = {\n", + " 'url': 'https://cds.climate.copernicus.eu/api',\n", + " 'key': '14e44bc7-0f33-4a57-847f-f41f44c5ec4d',\n", + "}\n", + "\n", + "xds_kwargs = {\n", + " 'url': 'https://xds-preprod.ecmwf.int/api',\n", + " 'key': '081c061b-d9b9-42eb-a483-a78e2b61cfd1',\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "for year in years:\n", + " for month in cds_months: \n", + " for shortname,var in [[\"T2M\",\"2m_temperature\"],\n", + " [\"D2M\",\"2m_dewpoint_temperature\"],\n", + " [\"10U\",\"10m_u_component_of_wind\"],\n", + " [\"10V\",\"10m_v_component_of_wind\"],\n", + " [\"P\",\"total_precipitation\"]]:\n", + "\n", + " dataset = \"reanalysis-era5-land\"\n", + " request = {\n", + " \"variable\": [\n", + " var,\n", + " ],\n", + " \"year\": year,\n", + " \"month\": month,\n", + " \"day\": cds_days,\n", + " \"time\": [\n", + " \"00:00\"\n", + " ],\n", + " \"data_format\": \"netcdf\",\n", + " \"download_format\": \"unarchived\"\n", + " }\n", + " client = cdsapi.Client(**cds_kwargs)\n", + " if not os.path.exists(f\"data/{shortname}_{year}_{month}.nc\"):\n", + " client.retrieve(dataset, request, target=f\"data/{shortname}_{year}_{month}.nc\")\n", + " if not os.path.exists(f\"data/WS_{year}_{month}.nc\"):\n", + " with xr.open_dataset(f\"data/10U_{year}_{month}.nc\") as dsu,\\\n", + " xr.open_dataset(f\"data/10V_{year}_{month}.nc\") as dsv:\n", + " dsw=dsu.u10**2+ dsv.v10**2\n", + " dsw=dsw.rename(\"ws\")\n", + " dsw.to_netcdf(f\"data/WS_{year}_{month}.nc\")\n", + " del dsw\n", + "\n", + " if not os.path.exists(f\"data/RH_{year}_{month}.nc\"):\n", + " with xr.open_dataset(f\"data/T2M_{year}_{month}.nc\") as dst,\\\n", + " xr.open_dataset(f\"data/D2M_{year}_{month}.nc\") as dsd:\n", + " es = 10**(7.5*(dst.t2m-273.15)/(237.7+(dst.t2m-273.15))) * 6.11\n", + " e = 10**(7.5*(dsd.d2m-273.15)/(237.7+(dsd.d2m-273.15))) * 6.11\n", + " dsrh = (e/es)*100\n", + " dsrh = dsrh.rename(\"rh\")\n", + " dsrh.to_netcdf(f\"data/RH_{year}_{month}.nc\")\n", + " del dsrh" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "This section will download data from the XDS-Preprod.\n", + "\n", + "The data is large and so may take some time to download." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "lat_lon_data = xr.open_dataset(f\"data/T2M_{years[0]}_{cds_months[0]}.nc\").sortby(\"latitude\").sortby(\"longitude\")\n", + "lat_lon_data=lat_lon_data.rename(valid_time=\"time\",latitude='lat',longitude='lon')\n", + "lat_lon_data=lat_lon_data.drop_vars(['expver','number'])\n", + "\n", + "for year in years:\n", + " for month in cds_months: \n", + " for shortname, var in \\\n", + " [[\"DFMC_MAP\",\"dead_fuel_moisture_content_group\"],\n", + " [\"LFMC_MAP\",\"live_fuel_moisture_content_group\"],\n", + " [\"FUEL_MAP\",\"fuel_group\"]]:\n", + "\n", + "\n", + " dataset = \"derived-fire-fuel-biomass\"\n", + " request = {\n", + " \"variable\": [\n", + " var,\n", + " ],\n", + " \"version\": [\"1\"],\n", + " \"year\": [\n", + " f'{year}'\n", + " ],\n", + " \"month\": [\n", + " month\n", + " ]\n", + " }\n", + "\n", + " client = cdsapi.Client(**xds_kwargs)\n", + " if not os.path.exists(f\"data/{shortname}_{year}_{month}_R.nc\"):\n", + " client.retrieve(dataset, request, target=f\"data/{shortname}_{year}_{month}.zip\")\n", + "\n", + " with zipfile.ZipFile(f\"data/{shortname}_{year}_{month}.zip\", 'r') as zip_ref:\n", + " zip_ref.extractall(\"data/\")\n", + " print(f\"Regridding {shortname} for {year}-{month}\")\n", + " with xr.open_dataset(f\"data/{shortname}_{year}_{month}.nc\") as ds_temp:\n", + " ds_regrid=ds_temp.interp_like(lat_lon_data, method=\"linear\")\n", + " ds_regrid.to_netcdf(f\"data/{shortname}_{year}_{month}_R.nc\")\n", + " del ds_regrid" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "Load Static Data\n", + "\n", + "We will load some CLIMATE data files" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "# Open the Climate files\n", + "time_coder = CFDatetimeCoder(use_cftime=True)\n", + "PO = xr.open_dataset(base_path / \"CLIMATE/POP_2020.nc\")\n", + "RD = xr.open_dataset(base_path / \"CLIMATE/road_density_2015_agg_r.nc\")\n", + "\n", + "# Extract the arrays\n", + "PO_arr = PO.population_density.values \n", + "RD_arr = RD.road_length.values " + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "Load Dynamic Data\n", + "\n", + "Here we open the data files we retrieved from the XDS and the CDS as well as the Active Fire Maps\n", + "\n", + "We iterate through each day within the dataset and store the into an output NetCDF file." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "for year in years:\n", + " for month in months:\n", + " # Define the paths of the files\n", + " ds_paths = {\n", + " \"AF\": f\"ACTIVE_FIRE_MAP_{year}_{month:02d}_R.nc\",\n", + " \"FU\": f\"FUEL_MAP_{year}_{month:02d}_R.nc\",\n", + " \"DF\": f\"DFMC_MAP_{year}_{month:02d}_R.nc\",\n", + " \"LF\": f\"LFMC_MAP_{year}_{month:02d}_R.nc\",\n", + " \"PR\": f\"P_{year}_{month:02d}.nc\",\n", + " \"T2\": f\"T2M_{year}_{month:02d}.nc\",\n", + " \"RH\": f\"RH_{year}_{month:02d}.nc\",\n", + " \"WS\": f\"WS_{year}_{month:02d}.nc\",\n", + " }\n", + " # Open all dynamic datasets\n", + " with xr.open_dataset(base_path / ds_paths[\"FU\"]) as FU, \\\n", + " xr.open_dataset(base_path / ds_paths[\"DF\"]) as DF, \\\n", + " xr.open_dataset(base_path / ds_paths[\"LF\"]) as LF, \\\n", + " xr.open_dataset(base_path / ds_paths[\"PR\"]) as PR, \\\n", + " xr.open_dataset(base_path / ds_paths[\"T2\"]) as T2, \\\n", + " xr.open_dataset(base_path / ds_paths[\"RH\"]) as RH, \\\n", + " xr.open_dataset(base_path / ds_paths[\"WS\"]) as WS, \\\n", + " xr.open_dataset(base_path / ds_paths[\"AF\"]) as AF:\n", + "\n", + " n_days = len(AF.ACTIVE_FIRE)\n", + " all_grids = []\n", + "\n", + " for i in range(n_days):\n", + " # Extract arrays for timestep i\n", + " FU_LL = FU.Live_Leaf[i].values\n", + " FU_LW = FU.Live_Wood[i].values\n", + " FU_DF = FU.Dead_Foliage[i].values\n", + " FU_DW = FU.Dead_Wood[i].values\n", + " DF_ = DF.DFMC_Foliage[i].values\n", + " DW_ = DF.DFMC_Wood[i].values\n", + " LF_ = LF.LFMC[i].values\n", + " PR_ = PR.tp[i].values\n", + " T2_ = T2.t2m[i].values\n", + " RH_ = RH.rh[i].values\n", + " WS_ = WS.ws[i].values\n", + "\n", + " # Mask where total fuel > 0\n", + " ft = FU_LL + FU_LW + FU_DF + FU_DW\n", + " mask = ft > 0\n", + "\n", + " # Flatten and build dataframe for prediction\n", + " feature_arrays = {\n", + " \"PR\": PR_[mask],\n", + " \"T2\": T2_[mask],\n", + " \"RH\": RH_[mask],\n", + " \"WS\": WS_[mask],\n", + " \"FU_LL\": FU_LL[mask],\n", + " \"FU_LW\": FU_LW[mask],\n", + " \"FU_DF\": FU_DF[mask],\n", + " \"FU_DW\": FU_DW[mask],\n", + " \"DF\": DF_[mask],\n", + " \"DW\": DW_[mask],\n", + " \"LF\": LF_[mask],\n", + " \"PO\": PO_arr[mask],\n", + " \"RD\": RD_arr[mask],\n", + " }\n", + " X_pred = pd.DataFrame(feature_arrays)\n", + "\n", + " # Predict probability\n", + " y_proba = model.predict_proba(X_pred)[:, 1]\n", + "\n", + " # Create full grid and fill masked values\n", + " fire_prob_grid = np.full(ft.shape, np.nan, dtype=float)\n", + " fire_prob_grid[mask] = y_proba\n", + " all_grids.append(fire_prob_grid)\n", + "\n", + " # Stack all timesteps into 3D array (time, lat, lon)\n", + " fire_prob_array = np.stack(all_grids, axis=0)\n", + " \n", + " # -----------------------------\n", + " # SAVE TO NETCDF\n", + " # -----------------------------\n", + " time = [cftime.DatetimeJulian(year, month, day+1) for day in range(n_days)]\n", + "\n", + " ds_out = xr.Dataset(\n", + " {\"fire_probability\": ([\"time\", \"latitude\", \"longitude\"], fire_prob_array)},\n", + " coords={\n", + " \"time\": time,\n", + " \"latitude\": PO.latitude,\n", + " \"longitude\": PO.longitude,\n", + " }\n", + " )\n", + " os.remove(output_file) if os.path.exists(output_file) else None\n", + " ds_out.to_netcdf(output_file)\n", + " print(f\"✅ Prediction saved → {output_file}\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "month" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.12.11-01", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/handbook/POF_Trainer.ipynb b/handbook/POF_Trainer.ipynb new file mode 100755 index 0000000..71ced13 --- /dev/null +++ b/handbook/POF_Trainer.ipynb @@ -0,0 +1,308 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "\n", + "\n", + "\n", + "To evaluate and compare multiple machine learning strategies, we tested several model configurations, including gradient-boosted decision trees, random forests, and neural networks. \n", + "Among these, the **XGBoost-based approach** demonstrated the best overall performance and computational efficiency. For this reason the PoF system uses gradient-boosted decision trees that iteratively improve prediction accuracy by correcting errors made in previous iterations. We found that this method provides an efficient optimization framework for large-scale, global applications. \n", + "\n", + "The model is trained using a classifier setup, where a positive event is defined as the occurrence of an active fire detection within a grid cell on a given day. \n", + "```{note} \n", + "While tree-based models do not explicitly represent temporal dependencies, this limitation is mitigated through input features that encode environmental memory—such as live fuel moisture, vegetation state, and soil moisture—capturing information about preceding conditions. \n", + "```\n", + "\n", + "\n", + "Overall, the XGBoost configuration provided the most robust and interpretable results, balancing accuracy, computational cost, and operational suitability.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import os\n", + "import time\n", + "import joblib\n", + "import matplotlib.pyplot as plt\n", + "import xgboost as xgb\n", + "from xgboost import XGBClassifier, plot_importance\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score, RocCurveDisplay\n" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "Load your data created from the previous notebook\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "df = pd.read_parquet(\"./data/training_data.parquet\")\n", + "\n", + "print(\"Loaded data shape:\", df.shape)\n", + "print(\"Columns:\", list(df.columns))" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "\n", + "Define your features and target" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5", + "metadata": {}, + "outputs": [], + "source": [ + "target_col = \"AF\"\n", + "feature_cols = [c for c in df.columns if c not in [\"AF\"]]\n", + "\n", + "X = df[feature_cols]\n", + "y = df[target_col]\n" + ] + }, + { + "cell_type": "markdown", + "id": "6", + "metadata": {}, + "source": [ + "```{note}🔀 Train–Test Split\n", + "\n", + "The dataset is divided into training and testing subsets to evaluate model performance on unseen data. \n", + "We use an **80/20 split**, meaning 80% of the samples are used for training and 20% are reserved for testing. \n", + "\n", + "To ensure reproducibility, the split is controlled by a fixed random seed (`random_state=42`). \n", + "Additionally, **stratification** is applied (`stratify=y`) so that the proportion of active fire and non-fire samples remains consistent across both training and testing subsets. \n", + "This helps maintain balanced class representation and prevents bias during model evaluation. \n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "X_train, X_test, y_train, y_test = train_test_split(\n", + " X, y, test_size=0.2, random_state=42, stratify=y\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "min(y_train)" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "| Parameter | Description |\n", + "| --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n", + "| **`objective=\"binary:logistic\"`** | Specifies that this is a **binary classification** problem. The model outputs probabilities between 0 and 1 using a logistic function. |\n", + "| **`tree_method=\"hist\"`** | Uses the **histogram-based algorithm** to speed up training, especially for large datasets. It groups feature values into discrete bins instead of processing each unique value. |\n", + "| **`n_estimators=300`** | The number of **boosting rounds (trees)** to build. Higher values can improve accuracy but may increase training time or risk overfitting. |\n", + "| **`max_depth=8`** | Maximum depth of each decision tree. Deeper trees can model more complex patterns but may overfit the data. |\n", + "| **`learning_rate=0.1`** | Shrinks the contribution of each tree. Lower values make learning slower but more robust; typically balanced with `n_estimators`. |\n", + "| **`subsample=0.8`** *(optional)* | Fraction of the training data used for each tree. Prevents overfitting and increases generalization. Default is `1.0` (use all data). |\n", + "| **`colsample_bytree=0.8`** *(optional)* | Fraction of features (columns) randomly sampled for each tree, adding diversity and reducing overfitting. |\n", + "| **`eval_metric=\"logloss\"`** | Evaluation metric for binary classification. Measures the model’s prediction accuracy in terms of probability calibration (lower is better). |\n", + "| **`random_state=42`** *(optional)* | Sets the random seed for reproducibility. Ensures consistent results when running the code multiple times. |\n", + "| **`n_jobs=-1`** | Uses **all available CPU cores** for parallel computation, speeding up training. |\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# -----------------------------\n", + "# TRAIN CLASSIFIER\n", + "# -----------------------------\n", + "print(\"Training XGBoost Binary Classifier...\")\n", + "start_time = time.time()\n", + "\n", + "model = XGBClassifier(\n", + " objective=\"binary:logistic\",\n", + " tree_method=\"hist\",\n", + " n_estimators=300,\n", + " max_depth=8,\n", + " learning_rate=0.1,\n", + "# subsample=0.8,\n", + "# colsample_bytree=0.8,\n", + " eval_metric=\"logloss\",\n", + "# random_state=42,\n", + " n_jobs=-1\n", + ")\n", + "\n", + "model.fit(X_train, y_train)\n", + "\n", + "end_time = time.time()\n", + "print(f\"✅ Training completed in {end_time - start_time:.2f} seconds\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# -----------------------------\n", + "# EVALUATE MODEL\n", + "# -----------------------------\n", + "y_pred = model.predict(X_test)\n", + "y_proba = model.predict_proba(X_test)[:, 1]\n", + "\n", + "print(\"\\nClassification report:\")\n", + "print(classification_report(y_test, y_pred, digits=3))\n", + "\n", + "roc_auc = roc_auc_score(y_test, y_proba)\n", + "print(f\"ROC-AUC: {roc_auc:.3f}\")\n", + "\n", + "# Confusion matrix\n", + "print(\"\\nConfusion Matrix:\")\n", + "print(confusion_matrix(y_test, y_pred))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# -----------------------------\n", + "# PLOT ROC CURVE & FEATURE IMPORTANCE\n", + "# -----------------------------\n", + "os.makedirs(\"./outputs\", exist_ok=True)\n", + "plt.figure(figsize=(6, 5))\n", + "RocCurveDisplay.from_estimator(model, X_test, y_test)\n", + "plt.title(\"ROC Curve\")\n", + "plt.savefig(\"./outputs/POF_ROC.png\", dpi=300)\n", + "plt.show()\n", + "plt.close()\n", + "\n", + "plt.figure(figsize=(10, 6))\n", + "plot_importance(model, max_num_features=20, importance_type=\"gain\")\n", + "plt.title(\"Feature Importance (Gain)\")\n", + "plt.tight_layout()\n", + "plt.savefig(\"./outputs/POF_importance.png\", dpi=300)\n", + "plt.show()\n", + "plt.close()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# -----------------------------\n", + "# SAVE MODEL\n", + "# -----------------------------\n", + "out_model = \"./data/POF_model.joblib\"\n", + "joblib.dump(model, out_model, compress=3)\n", + "print(f\"Model saved → {out_model}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "authors": [ + { + "name": "Christopher Barnard" + }, + { + "name": "Joe McNorton" + }, + { + "name": "Francesca Di Giuseppe" + } + ], + "kernelspec": { + "display_name": "Python 3.12.11-01", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.11" + }, + "show-body-title": false, + "title": "🗂️ Training Dataset Summary" + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/handbook/POF_plotter.ipynb b/handbook/POF_plotter.ipynb new file mode 100644 index 0000000..381aec1 --- /dev/null +++ b/handbook/POF_plotter.ipynb @@ -0,0 +1,221 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# POF Plotter" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "Importing all the necessary python libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib import colors\n", + "from matplotlib import cm\n", + "from matplotlib.colors import Normalize\n", + "import numpy as np\n", + "import xarray as xr\n", + "import matplotlib as mpl\n", + "from cartopy import config\n", + "import cartopy.crs as ccrs\n", + "import cartopy as cart\n", + "import sys\n", + "import datetime\n", + "from matplotlib.colors import ListedColormap,LinearSegmentedColormap\n" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "Open Prediction Netcdf" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "year=2019\n", + "month=12\n", + "\n", + "\n", + "fire= xr.open_dataset(f\"./outputs/POF_prediction_{year}_{month:02d}.nc\")\n", + "fire = fire.assign_coords(longitude=((fire.longitude + 360) % 360)).sortby('longitude')\n", + "lats = fire.latitude.values\n", + "lons = fire.longitude.values\n", + "fire\n" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "Define a subregion to plot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "lat1 = -10\n", + "lat2 = -45\n", + "lon1 = 110\n", + "lon2 = 155\n", + "\n", + "sub_ds = fire.sel(\n", + " latitude=slice(lat1, lat2), \n", + " longitude=slice(lon1, lon2)\n", + ")\n", + "# x1 = (np.argmin(np.abs(lons - lon1)))\n", + "# x2 = (np.argmin(np.abs(lons - lon2)))\n", + "# y1 = (np.argmin(np.abs(lats - lat1)))\n", + "# y2 = (np.argmin(np.abs(lats - lat2)))\n", + "\n", + "# sub_lons = lons[x1:x2]\n", + "# sub_lats = lats[y2:y1]\n", + "# print(y2)\n", + "# print(y1)\n", + "# print(sub_lats)\n", + "sub_ds\n" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "Create colour pallete" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "cols = ['#4a5a60','#edcc00','#edcc00','#e57d0f','#e57d0f','#e57d0f','#e57d0f','#e57d0f','#e57d0f','#e21819','#e21819','#e21819','#e21819','#e21819','#000000','#000000']\n", + "test = ListedColormap(cols)" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "Define levels" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "index=0 # Which index to plot (1st of the month)\n", + "\n", + "fires = sub_ds.fire_probability[index].values\n", + "plot_title = f\"Probability of Fire Forecast for {sub_ds.time.values[index].strftime('%d %B %Y') }\"\n", + "\n", + "fires[fires>0.006]=0.006 # 1km\n", + "\n", + "levels = np.arange(16)/2500 # 1km\n", + "\n", + "print(np.shape(fires))\n", + "print(np.nanmax(fire.fire_probability.values))\n", + "print(np.nanmin(fire.fire_probability.values))\n", + "print(np.nanmean(fire.fire_probability.values))" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "Plot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "ax = plt.axes(projection=ccrs.PlateCarree())\n", + "ax.coastlines(linewidth=1)\n", + "\n", + "fig = ax.contourf(sub_ds.longitude, sub_ds.latitude, fires,levels=levels,vmin=0,vmax=0.006,transform=ccrs.PlateCarree(),cmap=test)\n", + "\n", + "ax.add_feature(cart.feature.OCEAN,zorder=1,edgecolor='k',color='white')\n", + "ax.add_feature(cart.feature.BORDERS,linewidth=0.5,color='white')\n", + "ax.add_feature(cart.feature.LAKES,color='white', edgecolor='k', linewidth=0.2, zorder=2)\n", + "\n", + "states_provinces = cart.feature.NaturalEarthFeature(\n", + " category='cultural',\n", + " name='admin_1_states_provinces_lines',\n", + " scale='50m',\n", + " edgecolor='black'\n", + ")\n", + "\n", + "for spine in ax.spines.values():\n", + " spine.set_visible(False)\n", + "\n", + "cbar = plt.colorbar(fig,ticks=[0.0002,0.0008,0.0022,0.0044,0.0056],fraction=0.025, pad=0.04)\n", + "cbar.ax.set_yticklabels(['Low', 'Medium','High', 'Very High', 'Extreme'])\n", + "\n", + "plt.title(plot_title, fontsize=16)\n", + "\n", + "plt.tight_layout()\n", + "\n", + "plt.savefig('./outputs/My_PoF_Plot.png', dpi=300)\n", + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.12.11-01", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/handbook/PoF_Forecast.ipynb b/handbook/PoF_Forecast.ipynb deleted file mode 100755 index 3e79342..0000000 --- a/handbook/PoF_Forecast.ipynb +++ /dev/null @@ -1,205 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "455844af-4444-4882-8351-e27486fe7946", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "0add9849", - "metadata": {}, - "outputs": [], - "source": [ - "import xarray as xr\n", - "import numpy as np\n", - "import pandas as pd\n", - "import joblib\n", - "from pathlib import Path\n", - "import cftime\n", - "from xarray.coding.times import CFDatetimeCoder\n", - "import os\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "9040e021", - "metadata": {}, - "outputs": [], - "source": [ - "# -----------------------------\n", - "# CONFIG\n", - "# -----------------------------\n", - "base_path = Path(\"./data/\")\n", - "year = 2003\n", - "month = 1\n", - "os.makedirs(\"./outputs/\", exist_ok=True)\n", - "output_file = f\"./outputs/POF_prediction_{year}_{month:02d}.nc\"\n", - "\n", - "# Load trained model\n", - "model = joblib.load(\"./data/POF_model.joblib\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "09d062ce", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# -----------------------------\n", - "# LOAD STATIC DATA\n", - "# -----------------------------\n", - "time_coder = CFDatetimeCoder(use_cftime=True)\n", - "PO = xr.open_dataset(base_path / \"CLIMATE/POP_2020.nc_2\")\n", - "UR = xr.open_dataset(base_path / \"CLIMATE/urban_C.nc_2\", decode_times=time_coder)\n", - "RD = xr.open_dataset(base_path / \"CLIMATE/road_density_2015_c.nc_2\")\n", - "\n", - "UR_arr = UR.vegdiff.squeeze().values # keep 2D shape\n", - "PO_arr = PO.population_density.values \n", - "RD_arr = RD.road_length.values \n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "debaf10e", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "✅ Prediction saved → ./outputs/POF_prediction_2003_01.nc\n" - ] - } - ], - "source": [ - "\n", - "# -----------------------------\n", - "# LOAD DYNAMIC DATA\n", - "# -----------------------------\n", - "mon = f\"{month:02d}\"\n", - "ds_paths = {\n", - " \"AF\": f\"ACTIVE_FIRE_MAP_{year}_{mon}_R.nc\",\n", - " \"FU\": f\"FUEL_MAP_{year}_{mon}_R.nc\",\n", - " \"DF\": f\"DFMC_MAP_{year}_{mon}_R.nc\",\n", - " \"LF\": f\"LFMC_MAP_{year}_{mon}_R.nc\",\n", - " \"PR\": f\"P_{year}_{mon}.nc\",\n", - " \"T2\": f\"T2M_{year}_{mon}.nc\",\n", - " \"D2\": f\"D2M_{year}_{mon}.nc\",\n", - " \"WS\": f\"WS_{year}_{mon}.nc\",\n", - "}\n", - "# Open all dynamic datasets\n", - "with xr.open_dataset(base_path / ds_paths[\"FU\"]) as FU, \\\n", - " xr.open_dataset(base_path / ds_paths[\"DF\"]) as DF, \\\n", - " xr.open_dataset(base_path / ds_paths[\"LF\"]) as LF, \\\n", - " xr.open_dataset(base_path / ds_paths[\"PR\"]) as PR, \\\n", - " xr.open_dataset(base_path / ds_paths[\"T2\"]) as T2, \\\n", - " xr.open_dataset(base_path / ds_paths[\"D2\"]) as D2, \\\n", - " xr.open_dataset(base_path / ds_paths[\"WS\"]) as WS, \\\n", - " xr.open_dataset(base_path / ds_paths[\"AF\"]) as AF:\n", - "\n", - " n_days = len(AF.ACTIVE_FIRE)\n", - " all_grids = []\n", - "\n", - " for i in range(n_days):\n", - " # Extract arrays for timestep i\n", - " FU_LL = FU.Live_Leaf[i].values\n", - " FU_LW = FU.Live_Wood[i].values\n", - " FU_DF = FU.Dead_Foliage[i].values\n", - " FU_DW = FU.Dead_Wood[i].values\n", - " DF_ = DF.DFMC_Foliage[i].values\n", - " DW_ = DF.DFMC_Wood[i].values\n", - " LF_ = LF.LFMC[i].values\n", - " PR_ = PR.tp[i].values\n", - " T2_ = T2.t2m[i].values\n", - " D2_ = D2.d2m[i].values\n", - " WS_ = WS.ws[i].values\n", - "\n", - " # Mask where total fuel > 0\n", - " ft = FU_LL + FU_LW + FU_DF + FU_DW\n", - " mask = ft > 0\n", - "\n", - " # Flatten and build dataframe for prediction\n", - " feature_arrays = {\n", - " \"PR\": PR_[mask],\n", - " \"T2\": T2_[mask],\n", - " \"D2\": D2_[mask],\n", - " \"WS\": WS_[mask],\n", - " \"FU_LL\": FU_LL[mask],\n", - " \"FU_LW\": FU_LW[mask],\n", - " \"FU_DF\": FU_DF[mask],\n", - " \"FU_DW\": FU_DW[mask],\n", - " \"DF\": DF_[mask],\n", - " \"DW\": DW_[mask],\n", - " \"LF\": LF_[mask],\n", - " \"UR\": UR_arr[mask],\n", - " \"PO\": PO_arr[mask],\n", - " \"RD\": RD_arr[mask],\n", - " }\n", - " X_pred = pd.DataFrame(feature_arrays)\n", - "\n", - " # Predict probability\n", - " y_proba = model.predict_proba(X_pred)[:, 1]\n", - "\n", - " # Create full grid and fill masked values\n", - " fire_prob_grid = np.full(ft.shape, np.nan, dtype=float)\n", - " fire_prob_grid[mask] = y_proba\n", - " all_grids.append(fire_prob_grid)\n", - "\n", - " # Stack all timesteps into 3D array (time, lat, lon)\n", - " fire_prob_array = np.stack(all_grids, axis=0)\n", - "\n", - " # -----------------------------\n", - " # SAVE TO NETCDF\n", - " # -----------------------------\n", - " time = [cftime.DatetimeJulian(year, month, day+1) for day in range(n_days)]\n", - " ds_out = xr.Dataset(\n", - " {\"fire_probability\": ([\"time\", \"lat\", \"lon\"], fire_prob_array)},\n", - " coords={\n", - " \"time\": time,\n", - " \"latitude\": PO.latitude,\n", - " \"longitude\": PO.longitude\n", - " }\n", - " )\n", - "\n", - " ds_out.to_netcdf(output_file)\n", - " print(f\"✅ Prediction saved → {output_file}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "803a3aa7-95c8-46f2-81fd-99cb141b21c3", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.12.9-01", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.9" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/handbook/PoF_Trainer.ipynb b/handbook/PoF_Trainer.ipynb deleted file mode 100755 index 952160d..0000000 --- a/handbook/PoF_Trainer.ipynb +++ /dev/null @@ -1,260 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "8233ea18", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import time\n", - "import joblib\n", - "import matplotlib.pyplot as plt\n", - "import xgboost as xgb\n", - "from xgboost import XGBClassifier, plot_importance\n", - "from sklearn.model_selection import train_test_split\n", - "from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score, RocCurveDisplay\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "fb6a66ef", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Loaded data shape: (2162, 15)\n", - "Columns: ['AF', 'PR', 'T2', 'D2', 'WS', 'FU_LL', 'FU_LW', 'FU_DF', 'FU_DW', 'DF', 'DW', 'LF', 'UR', 'PO', 'RD']\n" - ] - } - ], - "source": [ - "\n", - "# -----------------------------\n", - "# LOAD DATA\n", - "# -----------------------------\n", - "df = pd.read_parquet(\"./data/training_data.parquet\")\n", - "\n", - "print(\"Loaded data shape:\", df.shape)\n", - "print(\"Columns:\", list(df.columns))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "c69612a4", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# -----------------------------\n", - "# DEFINE FEATURES & TARGET\n", - "# -----------------------------\n", - "target_col = \"AF\"\n", - "feature_cols = [c for c in df.columns if c not in [\"AF\"]]\n", - "\n", - "X = df[feature_cols]\n", - "y = df[target_col]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "32260560", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "# -----------------------------\n", - "# TRAIN / TEST SPLIT\n", - "# -----------------------------\n", - "X_train, X_test, y_train, y_test = train_test_split(\n", - " X, y, test_size=0.2, random_state=42, stratify=y\n", - ")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "id": "90c00182", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Training XGBoost Binary Classifier...\n", - "✅ Training completed in 0.18 seconds\n" - ] - } - ], - "source": [ - "\n", - "# -----------------------------\n", - "# TRAIN CLASSIFIER\n", - "# -----------------------------\n", - "print(\"Training XGBoost Binary Classifier...\")\n", - "start_time = time.time()\n", - "\n", - "model = XGBClassifier(\n", - " objective=\"binary:logistic\",\n", - " tree_method=\"hist\",\n", - " n_estimators=300,\n", - " max_depth=8,\n", - " learning_rate=0.1,\n", - "# subsample=0.8,\n", - "# colsample_bytree=0.8,\n", - " eval_metric=\"logloss\",\n", - "# random_state=42,\n", - " n_jobs=-1\n", - ")\n", - "\n", - "model.fit(X_train, y_train)\n", - "\n", - "end_time = time.time()\n", - "print(f\"✅ Training completed in {end_time - start_time:.2f} seconds\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "4c19db4a", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Classification report:\n", - " precision recall f1-score support\n", - "\n", - " 0.0 0.993 0.998 0.995 430\n", - " 1.0 0.000 0.000 0.000 3\n", - "\n", - " accuracy 0.991 433\n", - " macro avg 0.497 0.499 0.498 433\n", - "weighted avg 0.986 0.991 0.988 433\n", - "\n", - "ROC-AUC: 0.967\n", - "\n", - "Confusion Matrix:\n", - "[[429 1]\n", - " [ 3 0]]\n" - ] - } - ], - "source": [ - "\n", - "# -----------------------------\n", - "# EVALUATE MODEL\n", - "# -----------------------------\n", - "y_pred = model.predict(X_test)\n", - "y_proba = model.predict_proba(X_test)[:, 1]\n", - "\n", - "print(\"\\nClassification report:\")\n", - "print(classification_report(y_test, y_pred, digits=3))\n", - "\n", - "roc_auc = roc_auc_score(y_test, y_proba)\n", - "print(f\"ROC-AUC: {roc_auc:.3f}\")\n", - "\n", - "# Confusion matrix\n", - "print(\"\\nConfusion Matrix:\")\n", - "print(confusion_matrix(y_test, y_pred))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "66d0964f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "
CC BY-NC-SA
diff --git a/handbook/_config.yml b/handbook/_config.yml deleted file mode 100644 index 920860d..0000000 --- a/handbook/_config.yml +++ /dev/null @@ -1,49 +0,0 @@ - -# Book settings -# Learn more at https://jupyterbook.org/customize/config.html - -title: "POF IN A BOX" -author: Christopher Barnard -logo: ../images/image.png - -# Force re-execution of notebooks on each build. -# See https://jupyterbook.org/content/execute.html -execute: - execute_notebooks: force - -# Define the name of the latex output file for PDF builds -latex: - latex_documents: - targetname: book.tex - -# Add a bibtex file so that we can create citations -# bibtex_bibfiles: -# - references.bib - -# Information about where the book exists on the web -repository: - url: https://github.com/enyfeo/POF_IN_A_BOX/handbook # Online location of your book - path_to_book: docs # Optional path to your book, relative to the repository root - branch: develop # Which branch of the repository should be used when creating links (optional) - -# Add GitHub buttons to your book -# See https://jupyterbook.org/customize/config.html#add-a-link-to-your-repository -# https://jupyterbook.org/en/stable/advanced/html.html -html: - use_issues_button: true - use_repository_button: true - -sphinx: - config: - html_css_files: ["custom.css"] - html_show_copyright: false - language: en - html_js_files: - - https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js - suppress_warnings: ["mystnb.unknown_mime_type"] - -execute: - timeout: 500 - -exclude_patterns: - - handbook/data \ No newline at end of file diff --git a/handbook/_site/site.yml b/handbook/_site/site.yml new file mode 100644 index 0000000..b4933f7 --- /dev/null +++ b/handbook/_site/site.yml @@ -0,0 +1,23 @@ +--- +version: 1 +site: + template: book-theme + nav: + - title: Data Portals + children: + - title: Early Warning Data Store (EWDS) + url: https://ewds.climate.copernicus.eu + - title: Cross Data Store (XDS) + url: https://xds-preprod.ecmwf.int + + # - title: Contribute + # url: /contribute + # Commenting this out while there's a bug that adds BASE_URL to the nav links + # - title: Blog + # url: https://blog.jupyterbook.org + - title: Help + children: + - title: Ask a question ❓ + url: https://confluence.ecmwf.int/site/support + - title: Report a bug 🐛 + url: https://github.com/ecmwf-projects/AI-Probability-of-Fire/issues diff --git a/handbook/_toc.yml b/handbook/_toc.yml deleted file mode 100755 index 882e914..0000000 --- a/handbook/_toc.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -# Table of contents -# Learn more at https://jupyterbook.org/customize/toc.html - -format: jb-book -root: index - -parts: - - caption: "Retrieving data" - chapters: - - file: POF_Data_Generator - title: "POF Data Generator" - - caption: "Training and forecasting" - chapters: - - file: POF_Trainer - title: "POF Trainer" - - file: POF_Forecast - title: "POF Forecast" \ No newline at end of file diff --git a/handbook/data/ACTIVE_FIRE_MAP_2003_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2003_01_R.nc new file mode 100644 index 0000000..a0da668 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2003_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2003_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2003_02_R.nc new file mode 100644 index 0000000..29f5a66 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2003_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2003_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2003_03_R.nc new file mode 100644 index 0000000..5cf616d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2003_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2003_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2003_04_R.nc new file mode 100644 index 0000000..07a72ad Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2003_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2003_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2003_05_R.nc new file mode 100644 index 0000000..11cfd89 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2003_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2003_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2003_06_R.nc new file mode 100644 index 0000000..98ff5ef Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2003_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2003_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2003_07_R.nc new file mode 100644 index 0000000..9f60efd Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2003_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2003_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2003_08_R.nc new file mode 100644 index 0000000..df2c084 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2003_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2003_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2003_09_R.nc new file mode 100644 index 0000000..462a1fc Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2003_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2003_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2003_10_R.nc new file mode 100644 index 0000000..19a1c69 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2003_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2003_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2003_11_R.nc new file mode 100644 index 0000000..32a0181 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2003_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2003_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2003_12_R.nc new file mode 100644 index 0000000..9b4b121 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2003_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2004_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2004_01_R.nc new file mode 100644 index 0000000..7b1edd4 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2004_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2004_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2004_02_R.nc new file mode 100644 index 0000000..9120a2d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2004_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2004_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2004_03_R.nc new file mode 100644 index 0000000..4686dac Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2004_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2004_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2004_04_R.nc new file mode 100644 index 0000000..05b1140 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2004_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2004_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2004_05_R.nc new file mode 100644 index 0000000..177d251 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2004_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2004_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2004_06_R.nc new file mode 100644 index 0000000..a931077 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2004_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2004_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2004_07_R.nc new file mode 100644 index 0000000..0e6fa9b Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2004_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2004_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2004_08_R.nc new file mode 100644 index 0000000..0a5901d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2004_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2004_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2004_09_R.nc new file mode 100644 index 0000000..86be647 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2004_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2004_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2004_10_R.nc new file mode 100644 index 0000000..3f9f343 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2004_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2004_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2004_11_R.nc new file mode 100644 index 0000000..82302b8 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2004_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2004_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2004_12_R.nc new file mode 100644 index 0000000..0f86dbf Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2004_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2005_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2005_01_R.nc new file mode 100644 index 0000000..16569be Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2005_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2005_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2005_02_R.nc new file mode 100644 index 0000000..f01451e Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2005_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2005_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2005_03_R.nc new file mode 100644 index 0000000..5b6e43c Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2005_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2005_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2005_04_R.nc new file mode 100644 index 0000000..50a4696 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2005_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2005_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2005_05_R.nc new file mode 100644 index 0000000..af88197 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2005_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2005_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2005_06_R.nc new file mode 100644 index 0000000..a7cf2a1 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2005_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2005_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2005_07_R.nc new file mode 100644 index 0000000..9c7e351 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2005_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2005_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2005_08_R.nc new file mode 100644 index 0000000..44685aa Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2005_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2005_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2005_09_R.nc new file mode 100644 index 0000000..c0d05b8 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2005_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2005_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2005_10_R.nc new file mode 100644 index 0000000..5868543 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2005_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2005_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2005_11_R.nc new file mode 100644 index 0000000..50cfef0 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2005_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2005_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2005_12_R.nc new file mode 100644 index 0000000..b81a273 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2005_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2006_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2006_01_R.nc new file mode 100644 index 0000000..2495fa0 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2006_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2006_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2006_02_R.nc new file mode 100644 index 0000000..6f85db8 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2006_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2006_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2006_03_R.nc new file mode 100644 index 0000000..095e769 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2006_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2006_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2006_04_R.nc new file mode 100644 index 0000000..aa0550e Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2006_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2006_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2006_05_R.nc new file mode 100644 index 0000000..1214146 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2006_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2006_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2006_06_R.nc new file mode 100644 index 0000000..a548025 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2006_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2006_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2006_07_R.nc new file mode 100644 index 0000000..458ff69 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2006_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2006_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2006_08_R.nc new file mode 100644 index 0000000..2956ab3 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2006_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2006_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2006_09_R.nc new file mode 100644 index 0000000..773122d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2006_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2006_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2006_10_R.nc new file mode 100644 index 0000000..626adcc Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2006_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2006_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2006_11_R.nc new file mode 100644 index 0000000..d6186b5 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2006_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2006_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2006_12_R.nc new file mode 100644 index 0000000..d78399d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2006_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2007_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2007_01_R.nc new file mode 100644 index 0000000..0f579ec Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2007_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2007_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2007_02_R.nc new file mode 100644 index 0000000..62835ef Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2007_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2007_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2007_03_R.nc new file mode 100644 index 0000000..77a99a2 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2007_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2007_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2007_04_R.nc new file mode 100644 index 0000000..f83ef8b Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2007_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2007_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2007_05_R.nc new file mode 100644 index 0000000..8e21abc Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2007_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2007_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2007_06_R.nc new file mode 100644 index 0000000..03c3716 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2007_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2007_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2007_07_R.nc new file mode 100644 index 0000000..2f63da4 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2007_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2007_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2007_08_R.nc new file mode 100644 index 0000000..f6f4646 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2007_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2007_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2007_09_R.nc new file mode 100644 index 0000000..6115649 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2007_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2007_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2007_10_R.nc new file mode 100644 index 0000000..c78069f Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2007_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2007_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2007_11_R.nc new file mode 100644 index 0000000..181d339 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2007_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2007_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2007_12_R.nc new file mode 100644 index 0000000..f207ae9 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2007_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2008_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2008_01_R.nc new file mode 100644 index 0000000..c9a6100 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2008_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2008_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2008_02_R.nc new file mode 100644 index 0000000..caad709 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2008_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2008_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2008_03_R.nc new file mode 100644 index 0000000..2760e58 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2008_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2008_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2008_04_R.nc new file mode 100644 index 0000000..05fed7d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2008_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2008_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2008_05_R.nc new file mode 100644 index 0000000..8f724c5 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2008_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2008_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2008_06_R.nc new file mode 100644 index 0000000..602f4b4 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2008_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2008_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2008_07_R.nc new file mode 100644 index 0000000..91645da Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2008_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2008_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2008_08_R.nc new file mode 100644 index 0000000..b610c12 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2008_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2008_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2008_09_R.nc new file mode 100644 index 0000000..dff8bd6 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2008_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2008_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2008_10_R.nc new file mode 100644 index 0000000..01e472a Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2008_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2008_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2008_11_R.nc new file mode 100644 index 0000000..7152701 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2008_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2008_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2008_12_R.nc new file mode 100644 index 0000000..8ea3099 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2008_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2009_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2009_01_R.nc new file mode 100644 index 0000000..a5e4213 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2009_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2009_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2009_02_R.nc new file mode 100644 index 0000000..273a294 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2009_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2009_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2009_03_R.nc new file mode 100644 index 0000000..e9ecd3c Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2009_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2009_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2009_04_R.nc new file mode 100644 index 0000000..9d1340a Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2009_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2009_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2009_05_R.nc new file mode 100644 index 0000000..838932f Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2009_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2009_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2009_06_R.nc new file mode 100644 index 0000000..ca9e797 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2009_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2009_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2009_07_R.nc new file mode 100644 index 0000000..f428a4b Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2009_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2009_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2009_08_R.nc new file mode 100644 index 0000000..9ada8ea Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2009_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2009_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2009_09_R.nc new file mode 100644 index 0000000..cd8ff80 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2009_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2009_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2009_10_R.nc new file mode 100644 index 0000000..d20c4be Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2009_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2009_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2009_11_R.nc new file mode 100644 index 0000000..8c89b0e Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2009_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2009_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2009_12_R.nc new file mode 100644 index 0000000..a898d91 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2009_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2010_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2010_01_R.nc new file mode 100644 index 0000000..bf9e1f1 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2010_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2010_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2010_02_R.nc new file mode 100644 index 0000000..0380bee Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2010_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2010_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2010_03_R.nc new file mode 100644 index 0000000..176041e Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2010_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2010_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2010_04_R.nc new file mode 100644 index 0000000..1e6c74f Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2010_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2010_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2010_05_R.nc new file mode 100644 index 0000000..cd297ee Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2010_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2010_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2010_06_R.nc new file mode 100644 index 0000000..1c212e9 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2010_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2010_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2010_07_R.nc new file mode 100644 index 0000000..22c05b4 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2010_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2010_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2010_08_R.nc new file mode 100644 index 0000000..188d98c Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2010_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2010_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2010_09_R.nc new file mode 100644 index 0000000..a867df9 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2010_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2010_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2010_10_R.nc new file mode 100644 index 0000000..1992830 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2010_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2010_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2010_11_R.nc new file mode 100644 index 0000000..33cd988 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2010_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2010_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2010_12_R.nc new file mode 100644 index 0000000..1a8843a Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2010_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2011_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2011_01_R.nc new file mode 100644 index 0000000..f10eaec Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2011_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2011_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2011_02_R.nc new file mode 100644 index 0000000..c448927 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2011_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2011_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2011_03_R.nc new file mode 100644 index 0000000..cab5db6 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2011_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2011_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2011_04_R.nc new file mode 100644 index 0000000..7001daa Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2011_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2011_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2011_05_R.nc new file mode 100644 index 0000000..a56823f Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2011_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2011_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2011_06_R.nc new file mode 100644 index 0000000..5346719 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2011_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2011_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2011_07_R.nc new file mode 100644 index 0000000..8d29838 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2011_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2011_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2011_08_R.nc new file mode 100644 index 0000000..ea68c45 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2011_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2011_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2011_09_R.nc new file mode 100644 index 0000000..dd25c38 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2011_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2011_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2011_10_R.nc new file mode 100644 index 0000000..d4f8e7d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2011_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2011_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2011_11_R.nc new file mode 100644 index 0000000..f0e67d2 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2011_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2011_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2011_12_R.nc new file mode 100644 index 0000000..1d28e48 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2011_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2012_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2012_01_R.nc new file mode 100644 index 0000000..3821f53 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2012_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2012_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2012_02_R.nc new file mode 100644 index 0000000..26c6fb3 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2012_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2012_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2012_03_R.nc new file mode 100644 index 0000000..c43980a Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2012_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2012_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2012_04_R.nc new file mode 100644 index 0000000..31da51a Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2012_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2012_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2012_05_R.nc new file mode 100644 index 0000000..a561e5a Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2012_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2012_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2012_06_R.nc new file mode 100644 index 0000000..949d18f Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2012_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2012_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2012_07_R.nc new file mode 100644 index 0000000..1e2a0da Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2012_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2012_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2012_08_R.nc new file mode 100644 index 0000000..b1326e9 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2012_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2012_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2012_09_R.nc new file mode 100644 index 0000000..454047f Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2012_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2012_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2012_10_R.nc new file mode 100644 index 0000000..b147789 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2012_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2012_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2012_11_R.nc new file mode 100644 index 0000000..681d7b7 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2012_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2012_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2012_12_R.nc new file mode 100644 index 0000000..5742381 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2012_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2013_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2013_01_R.nc new file mode 100644 index 0000000..1dfe423 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2013_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2013_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2013_02_R.nc new file mode 100644 index 0000000..351f54d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2013_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2013_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2013_03_R.nc new file mode 100644 index 0000000..6bbcfab Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2013_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2013_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2013_04_R.nc new file mode 100644 index 0000000..0ac7673 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2013_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2013_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2013_05_R.nc new file mode 100644 index 0000000..559b90d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2013_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2013_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2013_06_R.nc new file mode 100644 index 0000000..88b274a Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2013_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2013_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2013_07_R.nc new file mode 100644 index 0000000..07df219 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2013_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2013_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2013_08_R.nc new file mode 100644 index 0000000..ae1464c Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2013_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2013_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2013_09_R.nc new file mode 100644 index 0000000..1ce4087 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2013_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2013_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2013_10_R.nc new file mode 100644 index 0000000..b31d37b Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2013_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2013_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2013_11_R.nc new file mode 100644 index 0000000..18b05f6 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2013_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2013_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2013_12_R.nc new file mode 100644 index 0000000..5ee236e Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2013_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2014_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2014_01_R.nc new file mode 100644 index 0000000..92e7f9a Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2014_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2014_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2014_02_R.nc new file mode 100644 index 0000000..fe56f9a Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2014_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2014_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2014_03_R.nc new file mode 100644 index 0000000..be50b64 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2014_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2014_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2014_04_R.nc new file mode 100644 index 0000000..71a4cd9 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2014_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2014_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2014_05_R.nc new file mode 100644 index 0000000..d8b2036 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2014_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2014_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2014_06_R.nc new file mode 100644 index 0000000..1613331 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2014_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2014_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2014_07_R.nc new file mode 100644 index 0000000..cbeff55 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2014_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2014_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2014_08_R.nc new file mode 100644 index 0000000..7fe8c23 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2014_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2014_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2014_09_R.nc new file mode 100644 index 0000000..1c94c48 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2014_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2014_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2014_10_R.nc new file mode 100644 index 0000000..ee7b4d9 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2014_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2014_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2014_11_R.nc new file mode 100644 index 0000000..944c32c Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2014_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2014_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2014_12_R.nc new file mode 100644 index 0000000..6158b22 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2014_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2015_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2015_01_R.nc new file mode 100644 index 0000000..24ebb50 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2015_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2015_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2015_02_R.nc new file mode 100644 index 0000000..f38e428 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2015_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2015_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2015_03_R.nc new file mode 100644 index 0000000..da8a128 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2015_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2015_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2015_04_R.nc new file mode 100644 index 0000000..c22c1ac Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2015_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2015_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2015_05_R.nc new file mode 100644 index 0000000..c75e976 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2015_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2015_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2015_06_R.nc new file mode 100644 index 0000000..2ad523f Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2015_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2015_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2015_07_R.nc new file mode 100644 index 0000000..eab8fe0 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2015_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2015_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2015_08_R.nc new file mode 100644 index 0000000..31635c6 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2015_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2015_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2015_09_R.nc new file mode 100644 index 0000000..a999a71 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2015_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2015_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2015_10_R.nc new file mode 100644 index 0000000..d526566 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2015_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2015_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2015_11_R.nc new file mode 100644 index 0000000..b181c64 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2015_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2015_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2015_12_R.nc new file mode 100644 index 0000000..dfc94bc Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2015_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2016_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2016_01_R.nc new file mode 100644 index 0000000..29f2c40 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2016_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2016_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2016_02_R.nc new file mode 100644 index 0000000..b7a566e Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2016_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2016_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2016_03_R.nc new file mode 100644 index 0000000..c44343e Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2016_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2016_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2016_04_R.nc new file mode 100644 index 0000000..042a3a9 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2016_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2016_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2016_05_R.nc new file mode 100644 index 0000000..7a1720a Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2016_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2016_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2016_06_R.nc new file mode 100644 index 0000000..12e9126 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2016_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2016_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2016_07_R.nc new file mode 100644 index 0000000..3ed9620 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2016_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2016_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2016_08_R.nc new file mode 100644 index 0000000..4b50aa8 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2016_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2016_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2016_09_R.nc new file mode 100644 index 0000000..d3b4621 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2016_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2016_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2016_10_R.nc new file mode 100644 index 0000000..27c1925 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2016_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2016_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2016_11_R.nc new file mode 100644 index 0000000..8c80e1d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2016_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2016_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2016_12_R.nc new file mode 100644 index 0000000..596aeaa Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2016_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2017_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2017_01_R.nc new file mode 100644 index 0000000..ca9e71d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2017_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2017_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2017_02_R.nc new file mode 100644 index 0000000..ffbe217 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2017_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2017_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2017_03_R.nc new file mode 100644 index 0000000..71f82ea Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2017_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2017_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2017_04_R.nc new file mode 100644 index 0000000..2ba157c Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2017_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2017_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2017_05_R.nc new file mode 100644 index 0000000..86b6538 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2017_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2017_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2017_06_R.nc new file mode 100644 index 0000000..5fad21c Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2017_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2017_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2017_07_R.nc new file mode 100644 index 0000000..0951249 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2017_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2017_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2017_08_R.nc new file mode 100644 index 0000000..6ee7f4b Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2017_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2017_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2017_09_R.nc new file mode 100644 index 0000000..c174814 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2017_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2017_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2017_10_R.nc new file mode 100644 index 0000000..a069205 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2017_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2017_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2017_11_R.nc new file mode 100644 index 0000000..af7b5b5 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2017_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2017_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2017_12_R.nc new file mode 100644 index 0000000..45c1dae Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2017_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2018_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2018_01_R.nc new file mode 100644 index 0000000..78a10e5 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2018_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2018_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2018_02_R.nc new file mode 100644 index 0000000..d2189d4 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2018_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2018_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2018_03_R.nc new file mode 100644 index 0000000..5d64202 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2018_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2018_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2018_04_R.nc new file mode 100644 index 0000000..2b1760a Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2018_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2018_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2018_05_R.nc new file mode 100644 index 0000000..0e89fa5 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2018_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2018_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2018_06_R.nc new file mode 100644 index 0000000..036261a Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2018_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2018_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2018_07_R.nc new file mode 100644 index 0000000..1861ab6 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2018_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2018_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2018_08_R.nc new file mode 100644 index 0000000..148743e Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2018_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2018_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2018_09_R.nc new file mode 100644 index 0000000..eeac5a3 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2018_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2018_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2018_10_R.nc new file mode 100644 index 0000000..d8557c2 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2018_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2018_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2018_11_R.nc new file mode 100644 index 0000000..1c84bda Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2018_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2018_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2018_12_R.nc new file mode 100644 index 0000000..9e5ee73 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2018_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2019_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2019_01_R.nc new file mode 100644 index 0000000..e666eeb Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2019_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2019_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2019_02_R.nc new file mode 100644 index 0000000..ad19d9c Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2019_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2019_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2019_03_R.nc new file mode 100644 index 0000000..29d99c2 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2019_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2019_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2019_04_R.nc new file mode 100644 index 0000000..b224bad Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2019_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2019_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2019_05_R.nc new file mode 100644 index 0000000..8b81f2d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2019_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2019_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2019_06_R.nc new file mode 100644 index 0000000..88ec27f Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2019_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2019_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2019_07_R.nc new file mode 100644 index 0000000..c65e4b4 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2019_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2019_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2019_08_R.nc new file mode 100644 index 0000000..a023cc3 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2019_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2019_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2019_09_R.nc new file mode 100644 index 0000000..1dcb243 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2019_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2019_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2019_10_R.nc new file mode 100644 index 0000000..7ec84d4 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2019_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2019_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2019_11_R.nc new file mode 100644 index 0000000..bf2410c Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2019_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2019_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2019_12_R.nc new file mode 100644 index 0000000..f562f7f Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2019_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2020_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2020_01_R.nc new file mode 100644 index 0000000..6c6c10e Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2020_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2020_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2020_02_R.nc new file mode 100644 index 0000000..99f3037 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2020_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2020_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2020_03_R.nc new file mode 100644 index 0000000..8ffe7c1 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2020_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2020_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2020_04_R.nc new file mode 100644 index 0000000..032ece7 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2020_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2020_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2020_05_R.nc new file mode 100644 index 0000000..bc7bb5b Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2020_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2020_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2020_06_R.nc new file mode 100644 index 0000000..aca2c1d Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2020_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2020_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2020_07_R.nc new file mode 100644 index 0000000..0a17e83 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2020_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2020_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2020_08_R.nc new file mode 100644 index 0000000..67c69b8 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2020_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2020_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2020_09_R.nc new file mode 100644 index 0000000..ae1e9ff Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2020_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2020_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2020_10_R.nc new file mode 100644 index 0000000..d197f47 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2020_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2020_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2020_11_R.nc new file mode 100644 index 0000000..aacd648 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2020_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2020_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2020_12_R.nc new file mode 100644 index 0000000..6375dc2 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2020_12_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2021_01_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2021_01_R.nc new file mode 100644 index 0000000..a49db05 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2021_01_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2021_02_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2021_02_R.nc new file mode 100644 index 0000000..b115d4c Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2021_02_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2021_03_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2021_03_R.nc new file mode 100644 index 0000000..7ceea10 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2021_03_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2021_04_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2021_04_R.nc new file mode 100644 index 0000000..090b7b8 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2021_04_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2021_05_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2021_05_R.nc new file mode 100644 index 0000000..2c45fde Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2021_05_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2021_06_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2021_06_R.nc new file mode 100644 index 0000000..a9be4d0 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2021_06_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2021_07_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2021_07_R.nc new file mode 100644 index 0000000..4ac9c9e Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2021_07_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2021_08_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2021_08_R.nc new file mode 100644 index 0000000..6a3b638 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2021_08_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2021_09_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2021_09_R.nc new file mode 100644 index 0000000..bce243c Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2021_09_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2021_10_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2021_10_R.nc new file mode 100644 index 0000000..1cb5b13 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2021_10_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2021_11_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2021_11_R.nc new file mode 100644 index 0000000..e7fda69 Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2021_11_R.nc differ diff --git a/handbook/data/ACTIVE_FIRE_MAP_2021_12_R.nc b/handbook/data/ACTIVE_FIRE_MAP_2021_12_R.nc new file mode 100644 index 0000000..888413e Binary files /dev/null and b/handbook/data/ACTIVE_FIRE_MAP_2021_12_R.nc differ diff --git a/handbook/data/CLIMATE/POP_2020.nc b/handbook/data/CLIMATE/POP_2020.nc new file mode 100755 index 0000000..f47eb32 Binary files /dev/null and b/handbook/data/CLIMATE/POP_2020.nc differ diff --git a/handbook/data/CLIMATE/road_density_2015_agg_r.nc b/handbook/data/CLIMATE/road_density_2015_agg_r.nc new file mode 100644 index 0000000..74e60a1 Binary files /dev/null and b/handbook/data/CLIMATE/road_density_2015_agg_r.nc differ diff --git a/handbook/forecasting.md b/handbook/forecasting.md new file mode 100644 index 0000000..cbc2f19 --- /dev/null +++ b/handbook/forecasting.md @@ -0,0 +1,47 @@ +--- +title: "Forecasting With PoF" +show-body-title: false +--- + + +# Using Your PoF Model + +Now that you have gathered your data and trained your model, you can use it for historical or future fire–occurrence predictions. + +In this example, we generate predictions for an entire month using historical inputs. This type of prediction is often referred to as an **analysis prediction**, because it relies on observation-based data. An alternative—mirroring how PoF is used operationally at ECMWF—is to use *forecast* inputs. These are typically short-range (up to ~10 days), but the same workflow can be extended to seasonal, annual, or even decadal predictions. + +--- + +
-
-
+ Reproducible notebooks for building local PoF models with your own data +
+
-
-
-
-
+ A set of environmental predictors and fire activity collocated dataset +
+ \ No newline at end of file diff --git a/handbook/training.md b/handbook/training.md new file mode 100644 index 0000000..d522cfc --- /dev/null +++ b/handbook/training.md @@ -0,0 +1,89 @@ +# How we train an XGBoost Model for PoF + +PoF uses XGBoost, a powerful gradient-boosted decision-tree algorithm widely applied to tabular environmental data. + +The training procedure follows a simple, reproducible workflow based on a probabilistic classifier: + +__Prepare the training dataset__ + +You will assemble a table where each row represents a gridcell in space and time (daily & 9km grid) and includes: + +--- + +1 = fire detected, 0 = no fire.
++ A trained, validated XGBoost model providing daily probability-of-fire estimates + from environmental predictors +
+