diff --git a/.github/decrypt_secret.sh b/.github/decrypt_secret.sh deleted file mode 100755 index 60176fdf..00000000 --- a/.github/decrypt_secret.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh - -# Decrypt the file - -mkdir -p $HOME/.config/earthengine/ndef/ - -mkdir -p /home/rstudio/.config/earthengine/ndef/ - -mkdir -p /github/home/config/earthengine - -mkdir -p ./secrets - -# --batch to prevent interactive command -# --yes to assume "yes" for questions - - -# Decrypt ee credentials (currently decrypting to a bunch of places hoping that earth engine finds one) - -gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output $HOME/.config/earthengine/ndef/credentials ./scratch_code/credentials.gpg - -gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output /home/rstudio/.config/earthengine/ndef/credentials ./scratch_code/credentials.gpg - -gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output ~/.config/earthengine/credentials ./scratch_code/credentials.gpg - -gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output /github/home/config/earthengine/credentials ./scratch_code/credentials.gpg - - -# Decrypt google drive credentials -gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output $HOME/.config/earthengine/ndef/20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner@gmail.com ./scratch_code/20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner@gmail.com.gpg - -gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output /home/rstudio/.config/earthengine/ndef/20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner@gmail.com ./scratch_code/20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner@gmail.com.gpg - - -# Decrypt google drive credentials json creds - -#Note: directly encrypting hte .json provided by Google failed. Instead, I loaded it into R, re-saved it, THEN encrypted the new version. - -echo " json token " - -gpg --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ ---output ./secrets/ee-wilsonlab-emma-ef416058504a.json ./scratch_code/ee-wilsonlab-emma-ef416058504a.json.gpg - -#Encrypting - - #gpg --output your-json-token.json.gpg --symmetric your-json-token.json - diff --git a/.github/decrypt_secret_gd.sh b/.github/decrypt_secret_gd.sh deleted file mode 100644 index 77c91518..00000000 --- a/.github/decrypt_secret_gd.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -# Decrypt the file - - -# --batch to prevent interactive command -# --yes to assume "yes" for questions - - -# Decrypt google drive credentials (newer version) -gpg --quiet --batch --yes --decrypt --passphrase="$GD_SECRET" \ ---output /home/rstudio/.config/earthengine/ndef/maitner-f590bfc7be54.json ./scratch_code/maitner-f590bfc7be54.json.gpg - -gpg --quiet --batch --yes --decrypt --passphrase="$GD_SECRET" \ ---output $HOME/.config/earthengine/ndef/maitner-f590bfc7be54.json ./scratch_code/maitner-f590bfc7be54.json.gpg - -gpg --quiet --batch --yes --decrypt --passphrase="$GD_SECRET" \ ---output $HOME/.config/earthengine/ndef/maitner-f590bfc7be54.json ./scratch_code/maitner-f590bfc7be54.json.gpg - diff --git a/.github/workflow-logs/failure-20260116-184436.log b/.github/workflow-logs/failure-20260116-184436.log new file mode 100644 index 00000000..e72fd2a1 --- /dev/null +++ b/.github/workflow-logs/failure-20260116-184436.log @@ -0,0 +1,127 @@ +Starting tar_make() +[1] "Starting tar_make() - print" +Registered S3 method overwritten by 'httr': + method from + print.cache_info hoardr + +Attaching package: ‘arrow’ + +The following object is masked from ‘package:utils’: + + timestamp + +System info: sysname=Linux; release=6.11.0-1018-azure; version=#18~24.04.1-Ubuntu SMP Sat Jun 28 04:46:03 UTC 2025; nodename=0ff9e842763b; machine=x86_64; login=unknown; user=root; effective_user=root +Run mode: update +Setting up NASA EarthData authentication (keyring file backend) +AppEEARS authentication configured +terra 1.8.86 + +Attaching package: ‘terra’ + +The following object is masked from ‘package:arrow’: + + buffer + +── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ── +✔ dplyr 1.1.4 ✔ readr 2.1.5 +✔ forcats 1.0.1 ✔ stringr 1.6.0 +✔ ggplot2 4.0.0 ✔ tibble 3.3.0 +✔ lubridate 1.9.4 ✔ tidyr 1.3.1 +✔ purrr 1.2.0 +── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ── +✖ lubridate::duration() masks arrow::duration() +✖ tidyr::extract() masks terra::extract() +✖ dplyr::filter() masks stats::filter() +✖ readr::guess_encoding() masks rvest::guess_encoding() +✖ dplyr::lag() masks stats::lag() +ℹ Use the conflicted package () to force all conflicts to become errors +Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.4.0; sf_use_s2() is TRUE +udunits database from /usr/share/xml/udunits/udunits2.xml +[targets] Update mode: pre-downloading targets from GitHub releases +[tar_github_release] Found 25 assets on GitHub release +[tar_github_release] Downloading: CHELSA_bio01_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio01_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio01_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio02_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio02_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio02_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio03_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio03_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio03_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio04_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio04_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio04_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio05_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio05_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio05_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio06_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio06_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio06_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio07_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio07_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio07_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio08_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio08_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio08_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio09_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio09_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio09_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio10_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio10_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio10_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio11_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio11_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio11_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio12_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio12_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio12_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio13_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio13_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio13_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio14_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio14_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio14_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio15_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio15_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio15_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio16_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio16_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio16_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio17_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio17_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio17_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio18_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio18_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio18_1981-2010_V.2.1 +[tar_github_release] Downloading: CHELSA_bio19_1981-2010_V.2.1.nc +[tar_github_release] Downloaded: CHELSA_bio19_1981-2010_V.2.1.nc +[tar_github_release] Restored file-format target: CHELSA_bio19_1981-2010_V.2.1 +[tar_github_release] Downloading: climate_chelsa.nc +[tar_github_release] Downloaded: climate_chelsa.nc +[tar_github_release] Restored file-format target: climate_chelsa +[tar_github_release] Downloading: country.parquet +[tar_github_release] Downloaded: country.parquet +[tar_github_release] Restored file-format target: country +[tar_github_release] Downloading: domain_bbox.parquet +[tar_github_release] Downloaded: domain_bbox.parquet +[tar_github_release] Restored file-format target: domain_bbox +[tar_github_release] Downloading: elevation_nasadem.nc +[tar_github_release] Downloaded: elevation_nasadem.nc +[tar_github_release] Restored file-format target: elevation_nasadem +[tar_github_release] Downloading: elevation_task_id +[tar_github_release] Downloaded: elevation_task_id +[tar_github_release] Restored: elevation_task_id +[tar_github_release] Downloading: vegmap.nc +[tar_github_release] Downloaded: vegmap.nc +[tar_github_release] Restored file-format target: vegmap +[tar_github_release] Download complete ++ vegmap_shp dispatched +Downloading vegmap from GitHub release using piggyback... +Unzipping vegmap... +✖ vegmap_shp errored +✖ errored pipeline [9.1s, 0 completed, 1 skipped] +Error: +! Error in tar_make(): + Error resolving output location: missing files: data/manual_download/NVM2024/shapefile/NVM2024Final_IEM5_12_07012025.shp + See https://books.ropensci.org/targets/debugging.html +Execution halted diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index 314a3032..d793d7bb 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -30,109 +30,47 @@ on: branches: - main - master + - dev-adam-appeears - dev-jiyeon # Allows you to run this workflow manually from the Actions tab workflow_dispatch: schedule: - # - cron: '1 0 * * 0' # runs every Sunday at 00:01 - - cron: '0 0 * * *' # runs every day at midnight + - cron: '0 0 * * 0' # runs every Sunday at midnight UTC + # - cron: '0 0 * * *' # runs every day at midnight # - cron: '0 */6 * * *' # run every 6th hour name: targets jobs: targets: - runs-on: ubuntu-24.04 #ubuntu-22.04 + runs-on: ubuntu-latest container: adamwilsonlab/emma:latest + permissions: + contents: write + pull-requests: write + issues: write env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + R_KEEP_PKG_SOURCE: yes + EARTHDATA_PASSWORD: ${{ secrets.EARTHDATA_PASSWORD }} + EARTHDATA_USER: ${{ secrets.EARTHDATA_USER }} RENV_PATHS_ROOT: ~/.local/share/renv ACTIONS_RUNNER_DEBUG: true - PYTHONPATH: /opt/conda/envs/r-reticulate/bin/python - RETICULATE_PYTHON: /opt/conda/envs/r-reticulate/bin/python - # GARGLE_AUTH_FILE: secrets/ee-wilsonlab-emma-ef416058504a.json - GOOGLE_APPLICATION_CREDENTIALS: secrets/ee-wilsonlab-emma-ef416058504a.json steps: - uses: actions/checkout@v2 with: - ref: main + ref: dev-adam-appeears lfs: true - name: Whitelist directory run: git config --global --add safe.directory /__w/emma_envdata/emma_envdata - - name: Checkout LFS objects - run: git lfs checkout - continue-on-error: true - # - name: List files in scratch_code - # run: ls -lh scratch_code/ -# - name: Setup Python -# uses: actions/setup-python@v2 -# with: -# python-version: '3.x' -# - name: Install Python Dependencies -# run: | -# pip install earthengine-api -# pip install -r requirements.txt # If you have other dependencies listed in a requirements file -# - name: Verify Python Installation -# run: | -# python -m pip show earthengine-api -# python -c "import ee; print(ee.__version__)" -# # - name: Install Linux system dependencies -# # if: runner.os == 'Linux' -# # run: | -# # sudo apt-get update - - name: Install Google Cloud SDK in container + - name: Install system deps for keyring run: | apt-get update - apt-get install -y curl apt-transport-https ca-certificates gnupg - echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" \ - | tee /etc/apt/sources.list.d/google-cloud-sdk.list - curl https://packages.cloud.google.com/apt/doc/apt-key.gpg \ - | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - - apt-get update - apt-get install -y google-cloud-cli=492.0.0-0 - - name: DECRYPT rgee SECRETS - run: ./.github/decrypt_secret.sh - env: - RGEE_SECRET: ${{ secrets.RGEE_SECRET }} - continue-on-error: true - # - name: List files in secrets - # run: ls -lh secrets/ -# - name: Check git settings -# run: -# git config --get http.postBuffer -# continue-on-error: true - - # - name: Display Service Account JSON - # run: | - # echo "=== Service Account JSON ===" - # cat secrets/ee-wilsonlab-emma-ef416058504a.json - # echo "============================" - - - name: Install Earth Engine API 1.5.4 in r-reticulate env - run: | - /opt/conda/envs/r-reticulate/bin/pip install --upgrade earthengine-api==0.1.370 #0.1.381 - # conda install -n r-reticulate -y -c conda-forge earthengine-api=1.5.4 - - - name: Verify EE API version - run: | - /opt/conda/envs/r-reticulate/bin/pip show earthengine-api - + apt-get install -y libsecret-1-0 libsecret-1-dev - name: Install R Package Dependencies run: |- Rscript -e "questionr::qscan(list.files(pattern='*.R',recursive=T), load = TRUE, detail = TRUE)" # this scans all scripts and installs any needed packages - # - name: Upgrade rgee to latest from GitHub - # run: | - # Rscript -e "if (!requireNamespace('devtools', quietly = TRUE)) install.packages('devtools')" - # Rscript -e 'devtools::install_github("r-spatial/rgee", ref="v.1.1.5")' - - # - name: Install rgee v1.1.5 from CRAN Archive - # run: | - # Rscript -e 'if (!requireNamespace("remotes", quietly=TRUE)) install.packages("remotes", repos="https://cloud.r-project.org")' - # Rscript -e 'remotes::install_version("rgee", version="1.1.5", repos="https://cloud.r-project.org")' - - - name: Install rgee from bmaitner/rgee - run: Rscript -e 'devtools::install_github(repo = "bmaitner/rgee", ref = "noninteractive_auth")' - name: Parse _targets.R run: Rscript -e "parse('_targets.R')" @@ -144,175 +82,149 @@ jobs: key: ${{ runner.os }}-renv-${{ hashFiles('**/renv.lock') }} restore-keys: ${{ runner.os }}-renv- - - name: Authenticate to GCP - run: | - # write the JSON secret to disk - # activate the service account (no --scopes flag) - gcloud auth activate-service-account \ - --key-file="secrets/ee-wilsonlab-emma-ef416058504a.json" \ - --project=ee-wilsonlab-emma \ - --quiet - - - name: Add r-reticulate env to PATH - run: echo "/opt/conda/envs/r-reticulate/bin" >> $GITHUB_PATH - - # - name: Authenticate Earth Engine - # run: earthengine authenticate \ - # --service_account \ - # --quiet \ - # #--key_file=${{ runner.temp }}/gee-key.json - - # - name: Authenticate to GCP (ADC with scopes) - # run: | - # gcloud auth application-default login \ - # --project=ee-wilsonlab-emma \ - # --scopes=https://www.googleapis.com/auth/cloud-platform \ - # --quiet - - # - name: Restore packages - # shell: Rscript {0} - # run: | - # if (!requireNamespace("renv", quietly = TRUE)) install.packages("renv") - # renv::restore() - - - name: Check if previous runs exists - id: runs-exist - run: git ls-remote --exit-code --heads origin targets-runs - continue-on-error: true - - - name: Checkout previous run - if: steps.runs-exist.outcome == 'success' - uses: actions/checkout@v2 + - name: Cache targets store + uses: actions/cache@v3 with: - ref: targets-runs - fetch-depth: 1 - path: .targets-runs - lfs: 'true' #attempting to fix issue with target-committed lfs files not being treated as lfs - - - name: Restore output files from the previous run - if: steps.runs-exist.outcome == 'success' + path: _targets/ + key: targets-${{ hashFiles('_targets.R', 'R/**') }} + restore-keys: targets- + - name: Run targets pipeline run: | - for (dest in scan(".targets-runs/.targets-files", what = character())) { - source <- file.path(".targets-runs", dest) - if (!file.exists(dirname(dest))) dir.create(dirname(dest), recursive = TRUE) - if (file.exists(source)) file.rename(source, dest) + Rscript -e "targets::tar_make()" 2>&1 | tee targets-output.log + shell: bash + - name: Export final data products to releases + if: github.ref == 'refs/heads/main' + run: | + # Load final targets and export to data/releases/ + targets::tar_load_everything() + + # Create releases directory + dir.create("data/releases", recursive = TRUE, showWarnings = FALSE) + + # Export domain as gpkg (example - adjust to your actual target names) + if (exists("domain")) { + sf::st_write( + sf::st_as_sf(domain), + "data/releases/domain.gpkg", + delete_dsn = TRUE + ) } + + # Add other final outputs here as needed + # Example: write.csv(final_data, "data/releases/final_data.csv") + shell: Rscript {0} - # - name: Find credential JSON - # run: | - # echo "Searching for ee-wilsonlab-emma-ef416058504a.json ..." - # find / -name 'ee-wilsonlab-emma-ef416058504a.json' 2>/dev/null || true -# - name: Run targets pipeline -# run: | -# Sys.setenv(HOME="/home/rstudio") -# cmdstanr::set_cmdstan_path("/home/rstudio/.cmdstanr/cmdstan-2.28.1") -# cmdstanr::check_cmdstan_toolchain() -# #cmdstanr::install_cmdstan() -# targets::tar_make() -# shell: Rscript {0} -# - name: Run targets pt 1 -# run: | -# Sys.setenv(HOME="/home/rstudio") -# cmdstanr::set_cmdstan_path("/home/rstudio/.cmdstanr/cmdstan-2.28.1") -# cmdstanr::check_cmdstan_toolchain() -# #cmdstanr::install_cmdstan() -# shell: Rscript {0} - - name: Verify credentials - run: | - ./.github/decrypt_secret.sh -# ls ~/.config/earthengine -# /usr/bin/earthengine -h -# echo " main dir" -# ls -# echo "scratch dir" -# ls scratch_code -# echo "secrets dir" -# ls secrets - env: - RGEE_SECRET: ${{ secrets.RGEE_SECRET }} - GD_SECRET: ${{ secrets.GD_SECRET }} continue-on-error: true - # - name: Install custom rgee - # run: | - # # added below on april 9 from https://github.com/r-spatial/rgee/issues/353#issuecomment-1983765552 - # library(reticulate) - # py_config() # see the name of your conda (python) environment, in my case "r-reticulate" - # reticulate::py_install('earthengine-api==0.1.370', envname='r-reticulate') - # # Check the installation of "earthengine-api" with - # py_list_packages() - # pyl <- py_list_packages() - # pyl[pyl$package == "earthengine-api", ] - # # check python version with - # py_run_string("import sys; print(sys.version)") - # devtools::install_github(repo = "bmaitner/rgee", ref = "noninteractive_auth") - # - name: Install custom rgee - # run: | - # Rscript -e "library(reticulate)" - # Rscript -e "reticulate::py_install('earthengine-api==0.1.370', envname='r-reticulate')" - # Rscript -e "pyl <- py_list_packages(); print(pyl[pyl$package == 'earthengine-api', ])" - # Rscript -e "reticulate::py_run_string('import sys; print(sys.version)')" - # Rscript -e "devtools::install_github(repo = 'bmaitner/rgee', ref = 'noninteractive_auth')" -# shell: Rscript {0} - # - name: Print environment - # run: env - # - name: Print R session info - # run: Rscript -e 'sessionInfo()' - # - name: “Set up gcloud CLI” - # uses: google-github-actions/setup-gcloud@v1 - # with: - # project_id: ${{ secrets.GCP_PROJECT }} - # service_account_key: ${{ secrets.GCP_SA_KEY }} - - name: Run targets pt 2 + + - name: Upload to GitHub Releases + if: github.ref == 'refs/heads/main' + uses: softprops/action-gh-release@v1 + with: + tag_name: latest + files: | + data/releases/* + body: | + Latest data products from targets pipeline + Updated: ${{ github.event.head_commit.timestamp }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Install GitHub CLI + if: failure() && github.event_name == 'push' run: | - #reticulate::use_python('/usr/bin/python3') - #rgee::ee_set_pyenv('/usr/bin/python3','r-reticulate', confirm = F) - #targets::tar_destroy(destroy = "all",ask = FALSE) #uncomment to reset - targets::tar_make() - shell: Rscript {0} - - name: Identify files that the targets pipeline produced - run: git ls-files -mo --exclude=renv > .targets-files - - name: Create the runs branch if it does not already exist - if: steps.runs-exist.outcome != 'success' - run: git checkout --orphan targets-runs - - name: Put the worktree in the runs branch if the latter already exists - if: steps.runs-exist.outcome == 'success' + apt-get update + apt-get install -y gh + + - name: Create review PR on failure + if: failure() && github.event_name == 'push' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - rm -r .git - mv .targets-runs/.git . - rm -r .targets-runs + # Create error log if it doesn't exist + if [ ! -f targets-output.log ]; then + echo "No targets-output.log file found. Pipeline may have failed during execution." > targets-output.log + fi + # Get last 100 lines of error + tail -100 targets-output.log > error-summary.txt + + # Create branch + BRANCH="auto-fix-$(date +%s)" + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git checkout -b "$BRANCH" + + # Add error log + mkdir -p .github/workflow-logs + cp targets-output.log .github/workflow-logs/failure-$(date +%Y%m%d-%H%M%S).log + git add .github/workflow-logs/ + git commit -m "Add workflow failure log for review" || true + git push origin "$BRANCH" + + # Create PR (Copilot will auto-review it) + gh pr create \ + --title "🚨 Targets workflow failed - Review needed" \ + --body "## Workflow Failure - - name: update md - run: | - webshot::install_phantomjs() - knitr::knit("README.Rmd") - shell: Rscript {0} - - name: Upload latest run - run: | - git config --local user.name "GitHub Actions" - git config --local user.email "actions@github.com" - rm -r .gitignore .github/workflows - git lfs track _targets/objects/* #use git LFS to track the targets output (larger files) - git lfs track data/raw_data/* - git lfs track data/* #use git LFS to track the data output (larger files) - git lfs track "raw_data/**" #use git LFS to track raw_data output (larger files) - git lfs track "data/**" - git lfs track _targets/metadata/* #track metadata - git lfs track *.tif - git add .gitattributes - git add --all -- ':!renv' ':!*json' - for file in $(git ls-files ':!*.json' -mo --exclude=renv) - do - git add -f $file - done - git commit -am "Run pipeline" - git push origin targets-runs -# Move the loop below up two lines (after git add) to commit large files. - - name: Prepare failure artifact - if: failure() - run: rm -rf .git .github .targets-files .targets-runs + The targets pipeline failed. GitHub Copilot will review this PR. + + ### Error Summary + \`\`\` + $(cat error-summary.txt) + \`\`\` + + ### Full Log + See \`.github/workflow-logs/\` for complete output. + + **Next steps:** + 1. Review Copilot's suggestions in the PR + 2. Apply fixes + 3. Close this PR once resolved" \ + --base main \ + --head "$BRANCH" \ + --label "bug" + + # Request Copilot review + gh pr comment $BRANCH --body "@github-copilot review" + + # Request Copilot coding agent to fix the issue + gh pr comment $BRANCH --body "@github-copilot-agent Please analyze the error log and create fixes for this targets pipeline failure" + - name: Post failure artifact if: failure() uses: actions/upload-artifact@main with: - name: ${{ runner.os }}-r${{ matrix.config.r }}-results + name: ${{ runner.os }}-results path: . + + - name: Prepare failure artifact + if: failure() + run: rm -rf .git .github + + - name: Comment on existing PR with status + if: always() && github.event_name == 'pull_request' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + STATUS="${{ steps.targets.outcome }}" + if [ "$STATUS" = "success" ]; then + EMOJI="✅" + MESSAGE="Targets workflow completed successfully!" + else + EMOJI="❌" + MESSAGE="Targets workflow failed. See logs below." + fi + + if [ ! -f targets-output.log ]; then + echo "No targets-output.log file found. Pipeline completed without explicit log output." > targets-output.log + fi + gh pr comment ${{ github.event.pull_request.number }} --body "## $EMOJI Targets Workflow Result + + $MESSAGE + +
+ Show last 50 lines of output + + \`\`\` + $(tail -50 targets-output.log) + \`\`\` +
" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 889aa851..317eeea2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,53 +1,78 @@ -# History files +# R session files .Rhistory .Rapp.history -# Session Data files .RData -# User-specific files .Ruserdata -# Example code in package build process + +# RStudio files +.Rproj.user/ + +# Targets workflow - track meta/meta for pipeline state +_targets/objects/ +_targets/user/ +_targets/workspaces/ +_targets/meta/process +_targets/meta/progress + +# Data directories +data/temp/ +data/other_data/ +data/raw_data/ +data/manual_download/*.gpkg +data/manual_download/NVM* +data/raw* +data/.tar_cache/ +data/target_outputs/ + +# Terra auxiliary files (from terra_preserve_metadata) +*.tif.aux.xml +*.tif.zip +*.ovr + +# Secrets & credentials +.Renviron +.httr-oauth +~/.boxr-oauth +.secrets +secrets/ +debugging_auth.R + +# JSON files - specific patterns only +secrets/*.json +scratch_code/*.json + +# AppEEARS/NASA downloads +*.hdf +*.h5 + +# Test scripts +test_*.R + +# R package build *-Ex.R -# Output files from R CMD build /*.tar.gz -# Output files from R CMD check /*.Rcheck/ -# RStudio files -.Rproj.user/ -# produced vignettes + +# Vignettes vignettes/*.html vignettes/*.pdf -# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 -.httr-oauth -# knitr and R markdown default cache directories + +# knitr and R markdown *_cache/ /cache/ -# Temporary files created by R markdown *.utf8.md *.knit.md -# R Environment Variables -.Renviron -# targets related workflow stuff -~/.boxr-oauth index.md -index_files/* -firemodel_predict -#raw_data/ +index_files/ + +# Output/legacy directories processed_data/ -#data/* -*.gpkg -data/other_data/ -*/other_data/* -.DS_Store -#*/meta -img/network.html +firemodel_predict + +# Image outputs +img/*_files +img/*.html img/network* -scratch_code/*.json -scratch_code/!*.json.gpg -.secrets -secrets -secrets/ -secrets/* -secrets/*.json -secrets/!*.json.gpg -debugging_auth.R -*.json + +# OS files +.DS_Store diff --git a/.targets-files b/.targets-files new file mode 100644 index 00000000..50cfbbde --- /dev/null +++ b/.targets-files @@ -0,0 +1,2443 @@ +.targets-files +.targets-runs/ +Rplots.pdf +_targets/meta/.gitignore +_targets/meta/meta +_targets/meta/process +_targets/meta/progress +_targets/objects/alos +_targets/objects/burn_date_to_last_burned_date +_targets/objects/climate_chelsa +_targets/objects/clouds_wilson +_targets/objects/correct_fire_proj +_targets/objects/correct_kndvi_proj +_targets/objects/correct_ndvi_date_proj +_targets/objects/correct_ndvi_proj +_targets/objects/country +_targets/objects/data +_targets/objects/domain +_targets/objects/elevation_nasadem +_targets/objects/fire_dates_to_parquet +_targets/objects/fire_doy_to_unix_date +_targets/objects/fire_modis +_targets/objects/group_data +_targets/objects/kndvi_modis +_targets/objects/landcover_za +_targets/objects/model +_targets/objects/model_fit +_targets/objects/most_recent_fire_dates_to_parquet +_targets/objects/ndvi_dates_modis +_targets/objects/ndvi_modis +_targets/objects/ndvi_relative_days_since_fire +_targets/objects/ndvi_to_parquet +_targets/objects/posterior_summary +_targets/objects/precipitation_chelsa +_targets/objects/projected_alos +_targets/objects/projected_climate_chelsa +_targets/objects/projected_clouds_wilson +_targets/objects/projected_elevation_nasadem +_targets/objects/projected_landcover_za +_targets/objects/projected_precipitation_chelsa +_targets/objects/raw_data +_targets/objects/stan_data +_targets/objects/template +_targets/objects/test_tif +_targets/objects/vegmap +data/domain.gpkg +data/model_data.csv +data/processed_data/alos/alos_chili.tif +data/processed_data/alos/alos_mtpi.tif +data/processed_data/alos/alos_topographic_diversity.tif +data/processed_data/alos/landforms.tif +data/processed_data/climate_chelsa/CHELSA_bio10_01_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_02_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_03_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_04_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_05_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_06_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_07_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_08_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_09_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_10_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_11_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_12_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_13_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_14_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_15_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_16_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_17_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_18_V1.2_clipped.tif +data/processed_data/climate_chelsa/CHELSA_bio10_19_V1.2_clipped.tif +data/processed_data/clouds_wilson/MODCF_interannualSD.tif +data/processed_data/clouds_wilson/MODCF_intraannualSD.tif +data/processed_data/clouds_wilson/MODCF_meanannual.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_01.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_02.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_03.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_04.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_05.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_06.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_07.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_08.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_09.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_10.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_11.tif +data/processed_data/clouds_wilson/MODCF_monthlymean_12.tif +data/processed_data/clouds_wilson/MODCF_seasonality_concentration.tif +data/processed_data/clouds_wilson/MODCF_seasonality_rgb.tif +data/processed_data/clouds_wilson/MODCF_seasonality_theta.tif +data/processed_data/clouds_wilson/MODCF_seasonality_visct.tif +data/processed_data/clouds_wilson/MODCF_spatialSD_1deg.tif +data/processed_data/elevation_nasadem/nasadem.tif +data/processed_data/fire_dates/2000_11_01.tif +data/processed_data/fire_dates/2000_12_01.tif +data/processed_data/fire_dates/2001_01_01.tif +data/processed_data/fire_dates/2001_02_01.tif +data/processed_data/fire_dates/2001_03_01.tif +data/processed_data/fire_dates/2001_04_01.tif +data/processed_data/fire_dates/2001_05_01.tif +data/processed_data/fire_dates/2001_06_01.tif +data/processed_data/fire_dates/2001_07_01.tif +data/processed_data/fire_dates/2001_08_01.tif +data/processed_data/fire_dates/2001_09_01.tif +data/processed_data/fire_dates/2001_10_01.tif +data/processed_data/fire_dates/2001_11_01.tif +data/processed_data/fire_dates/2001_12_01.tif +data/processed_data/fire_dates/2002_01_01.tif +data/processed_data/fire_dates/2002_02_01.tif +data/processed_data/fire_dates/2002_03_01.tif +data/processed_data/fire_dates/2002_04_01.tif +data/processed_data/fire_dates/2002_05_01.tif +data/processed_data/fire_dates/2002_06_01.tif +data/processed_data/fire_dates/2002_07_01.tif +data/processed_data/fire_dates/2002_08_01.tif +data/processed_data/fire_dates/2002_09_01.tif +data/processed_data/fire_dates/2002_10_01.tif +data/processed_data/fire_dates/2002_11_01.tif +data/processed_data/fire_dates/2002_12_01.tif +data/processed_data/fire_dates/2003_01_01.tif +data/processed_data/fire_dates/2003_02_01.tif +data/processed_data/fire_dates/2003_03_01.tif +data/processed_data/fire_dates/2003_04_01.tif +data/processed_data/fire_dates/2003_05_01.tif +data/processed_data/fire_dates/2003_06_01.tif +data/processed_data/fire_dates/2003_07_01.tif +data/processed_data/fire_dates/2003_08_01.tif +data/processed_data/fire_dates/2003_09_01.tif +data/processed_data/fire_dates/2003_10_01.tif +data/processed_data/fire_dates/2003_11_01.tif +data/processed_data/fire_dates/2003_12_01.tif +data/processed_data/fire_dates/2004_01_01.tif +data/processed_data/fire_dates/2004_02_01.tif +data/processed_data/fire_dates/2004_03_01.tif +data/processed_data/fire_dates/2004_04_01.tif +data/processed_data/fire_dates/2004_05_01.tif +data/processed_data/fire_dates/2004_06_01.tif +data/processed_data/fire_dates/2004_07_01.tif +data/processed_data/fire_dates/2004_08_01.tif +data/processed_data/fire_dates/2004_09_01.tif +data/processed_data/fire_dates/2004_10_01.tif +data/processed_data/fire_dates/2004_11_01.tif +data/processed_data/fire_dates/2004_12_01.tif +data/processed_data/fire_dates/2005_01_01.tif +data/processed_data/fire_dates/2005_02_01.tif +data/processed_data/fire_dates/2005_03_01.tif +data/processed_data/fire_dates/2005_04_01.tif +data/processed_data/fire_dates/2005_05_01.tif +data/processed_data/fire_dates/2005_06_01.tif +data/processed_data/fire_dates/2005_07_01.tif +data/processed_data/fire_dates/2005_08_01.tif +data/processed_data/fire_dates/2005_09_01.tif +data/processed_data/fire_dates/2005_10_01.tif +data/processed_data/fire_dates/2005_11_01.tif +data/processed_data/fire_dates/2005_12_01.tif +data/processed_data/fire_dates/2006_01_01.tif +data/processed_data/fire_dates/2006_02_01.tif +data/processed_data/fire_dates/2006_03_01.tif +data/processed_data/fire_dates/2006_04_01.tif +data/processed_data/fire_dates/2006_05_01.tif +data/processed_data/fire_dates/2006_06_01.tif +data/processed_data/fire_dates/2006_07_01.tif +data/processed_data/fire_dates/2006_08_01.tif +data/processed_data/fire_dates/2006_09_01.tif +data/processed_data/fire_dates/2006_10_01.tif +data/processed_data/fire_dates/2006_11_01.tif +data/processed_data/fire_dates/2006_12_01.tif +data/processed_data/fire_dates/2007_01_01.tif +data/processed_data/fire_dates/2007_02_01.tif +data/processed_data/fire_dates/2007_03_01.tif +data/processed_data/fire_dates/2007_04_01.tif +data/processed_data/fire_dates/2007_05_01.tif +data/processed_data/fire_dates/2007_06_01.tif +data/processed_data/fire_dates/2007_07_01.tif +data/processed_data/fire_dates/2007_08_01.tif +data/processed_data/fire_dates/2007_09_01.tif +data/processed_data/fire_dates/2007_10_01.tif +data/processed_data/fire_dates/2007_11_01.tif +data/processed_data/fire_dates/2007_12_01.tif +data/processed_data/fire_dates/2008_01_01.tif +data/processed_data/fire_dates/2008_02_01.tif +data/processed_data/fire_dates/2008_03_01.tif +data/processed_data/fire_dates/2008_04_01.tif +data/processed_data/fire_dates/2008_05_01.tif +data/processed_data/fire_dates/2008_06_01.tif +data/processed_data/fire_dates/2008_07_01.tif +data/processed_data/fire_dates/2008_08_01.tif +data/processed_data/fire_dates/2008_09_01.tif +data/processed_data/fire_dates/2008_10_01.tif +data/processed_data/fire_dates/2008_11_01.tif +data/processed_data/fire_dates/2008_12_01.tif +data/processed_data/fire_dates/2009_01_01.tif +data/processed_data/fire_dates/2009_02_01.tif +data/processed_data/fire_dates/2009_03_01.tif +data/processed_data/fire_dates/2009_04_01.tif +data/processed_data/fire_dates/2009_05_01.tif +data/processed_data/fire_dates/2009_06_01.tif +data/processed_data/fire_dates/2009_07_01.tif +data/processed_data/fire_dates/2009_08_01.tif +data/processed_data/fire_dates/2009_09_01.tif +data/processed_data/fire_dates/2009_10_01.tif +data/processed_data/fire_dates/2009_11_01.tif +data/processed_data/fire_dates/2009_12_01.tif +data/processed_data/fire_dates/2010_01_01.tif +data/processed_data/fire_dates/2010_02_01.tif +data/processed_data/fire_dates/2010_03_01.tif +data/processed_data/fire_dates/2010_04_01.tif +data/processed_data/fire_dates/2010_05_01.tif +data/processed_data/fire_dates/2010_06_01.tif +data/processed_data/fire_dates/2010_07_01.tif +data/processed_data/fire_dates/2010_08_01.tif +data/processed_data/fire_dates/2010_09_01.tif +data/processed_data/fire_dates/2010_10_01.tif +data/processed_data/fire_dates/2010_11_01.tif +data/processed_data/fire_dates/2010_12_01.tif +data/processed_data/fire_dates/2011_01_01.tif +data/processed_data/fire_dates/2011_02_01.tif +data/processed_data/fire_dates/2011_03_01.tif +data/processed_data/fire_dates/2011_04_01.tif +data/processed_data/fire_dates/2011_05_01.tif +data/processed_data/fire_dates/2011_06_01.tif +data/processed_data/fire_dates/2011_07_01.tif +data/processed_data/fire_dates/2011_08_01.tif +data/processed_data/fire_dates/2011_09_01.tif +data/processed_data/fire_dates/2011_10_01.tif +data/processed_data/fire_dates/2011_11_01.tif +data/processed_data/fire_dates/2011_12_01.tif +data/processed_data/fire_dates/2012_01_01.tif +data/processed_data/fire_dates/2012_02_01.tif +data/processed_data/fire_dates/2012_03_01.tif +data/processed_data/fire_dates/2012_04_01.tif +data/processed_data/fire_dates/2012_05_01.tif +data/processed_data/fire_dates/2012_06_01.tif +data/processed_data/fire_dates/2012_07_01.tif +data/processed_data/fire_dates/2012_08_01.tif +data/processed_data/fire_dates/2012_09_01.tif +data/processed_data/fire_dates/2012_10_01.tif +data/processed_data/fire_dates/2012_11_01.tif +data/processed_data/fire_dates/2012_12_01.tif +data/processed_data/fire_dates/2013_01_01.tif +data/processed_data/fire_dates/2013_02_01.tif +data/processed_data/fire_dates/2013_03_01.tif +data/processed_data/fire_dates/2013_04_01.tif +data/processed_data/fire_dates/2013_05_01.tif +data/processed_data/fire_dates/2013_06_01.tif +data/processed_data/fire_dates/2013_07_01.tif +data/processed_data/fire_dates/2013_08_01.tif +data/processed_data/fire_dates/2013_09_01.tif +data/processed_data/fire_dates/2013_10_01.tif +data/processed_data/fire_dates/2013_11_01.tif +data/processed_data/fire_dates/2013_12_01.tif +data/processed_data/fire_dates/2014_01_01.tif +data/processed_data/fire_dates/2014_02_01.tif +data/processed_data/fire_dates/2014_03_01.tif +data/processed_data/fire_dates/2014_04_01.tif +data/processed_data/fire_dates/2014_05_01.tif +data/processed_data/fire_dates/2014_06_01.tif +data/processed_data/fire_dates/2014_07_01.tif +data/processed_data/fire_dates/2014_08_01.tif +data/processed_data/fire_dates/2014_09_01.tif +data/processed_data/fire_dates/2014_10_01.tif +data/processed_data/fire_dates/2014_11_01.tif +data/processed_data/fire_dates/2014_12_01.tif +data/processed_data/fire_dates/2015_01_01.tif +data/processed_data/fire_dates/2015_02_01.tif +data/processed_data/fire_dates/2015_03_01.tif +data/processed_data/fire_dates/2015_04_01.tif +data/processed_data/fire_dates/2015_05_01.tif +data/processed_data/fire_dates/2015_06_01.tif +data/processed_data/fire_dates/2015_07_01.tif +data/processed_data/fire_dates/2015_08_01.tif +data/processed_data/fire_dates/2015_09_01.tif +data/processed_data/fire_dates/2015_10_01.tif +data/processed_data/fire_dates/2015_11_01.tif +data/processed_data/fire_dates/2015_12_01.tif +data/processed_data/fire_dates/2016_01_01.tif +data/processed_data/fire_dates/2016_02_01.tif +data/processed_data/fire_dates/2016_03_01.tif +data/processed_data/fire_dates/2016_04_01.tif +data/processed_data/fire_dates/2016_05_01.tif +data/processed_data/fire_dates/2016_06_01.tif +data/processed_data/fire_dates/2016_07_01.tif +data/processed_data/fire_dates/2016_08_01.tif +data/processed_data/fire_dates/2016_09_01.tif +data/processed_data/fire_dates/2016_10_01.tif +data/processed_data/fire_dates/2016_11_01.tif +data/processed_data/fire_dates/2016_12_01.tif +data/processed_data/fire_dates/2017_01_01.tif +data/processed_data/fire_dates/2017_02_01.tif +data/processed_data/fire_dates/2017_03_01.tif +data/processed_data/fire_dates/2017_04_01.tif +data/processed_data/fire_dates/2017_05_01.tif +data/processed_data/fire_dates/2017_06_01.tif +data/processed_data/fire_dates/2017_07_01.tif +data/processed_data/fire_dates/2017_08_01.tif +data/processed_data/fire_dates/2017_09_01.tif +data/processed_data/fire_dates/2017_10_01.tif +data/processed_data/fire_dates/2017_11_01.tif +data/processed_data/fire_dates/2017_12_01.tif +data/processed_data/fire_dates/2018_01_01.tif +data/processed_data/fire_dates/2018_02_01.tif +data/processed_data/fire_dates/2018_03_01.tif +data/processed_data/fire_dates/2018_04_01.tif +data/processed_data/fire_dates/2018_05_01.tif +data/processed_data/fire_dates/2018_06_01.tif +data/processed_data/fire_dates/2018_07_01.tif +data/processed_data/fire_dates/2018_08_01.tif +data/processed_data/fire_dates/2018_09_01.tif +data/processed_data/fire_dates/2018_10_01.tif +data/processed_data/fire_dates/2018_11_01.tif +data/processed_data/fire_dates/2018_12_01.tif +data/processed_data/fire_dates/2019_01_01.tif +data/processed_data/fire_dates/2019_02_01.tif +data/processed_data/fire_dates/2019_03_01.tif +data/processed_data/fire_dates/2019_04_01.tif +data/processed_data/fire_dates/2019_05_01.tif +data/processed_data/fire_dates/2019_06_01.tif +data/processed_data/fire_dates/2019_07_01.tif +data/processed_data/fire_dates/2019_08_01.tif +data/processed_data/fire_dates/2019_09_01.tif +data/processed_data/fire_dates/2019_10_01.tif +data/processed_data/fire_dates/2019_11_01.tif +data/processed_data/fire_dates/2019_12_01.tif +data/processed_data/fire_dates/2020_01_01.tif +data/processed_data/fire_dates/2020_02_01.tif +data/processed_data/fire_dates/2020_03_01.tif +data/processed_data/fire_dates/2020_04_01.tif +data/processed_data/fire_dates/2020_05_01.tif +data/processed_data/fire_dates/2020_06_01.tif +data/processed_data/fire_dates/2020_07_01.tif +data/processed_data/fire_dates/2020_08_01.tif +data/processed_data/fire_dates/2020_09_01.tif +data/processed_data/fire_dates/2020_10_01.tif +data/processed_data/fire_dates/2020_11_01.tif +data/processed_data/fire_dates/2020_12_01.tif +data/processed_data/fire_dates/2021_01_01.tif +data/processed_data/fire_dates/2021_02_01.tif +data/processed_data/fire_dates/2021_03_01.tif +data/processed_data/fire_dates/2021_04_01.tif +data/processed_data/fire_dates/2021_05_01.tif +data/processed_data/fire_dates/2021_06_01.tif +data/processed_data/fire_dates/2021_07_01.tif +data/processed_data/fire_dates/2021_08_01.tif +data/processed_data/fire_dates/2021_09_01.tif +data/processed_data/fire_dates/2021_10_01.tif +data/processed_data/fire_dates/2021_11_01.tif +data/processed_data/fire_dates/2021_12_01.tif +data/processed_data/landcover_za/SA_NLC_2020_GEO.tif +data/processed_data/landcover_za/SA_NLC_2020_GEO.tif.vat.cpg +data/processed_data/landcover_za/SA_NLC_2020_GEO.tif.vat.dbf +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11262.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11292.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11323.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11354.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11382.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11413.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11443.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11474.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11504.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11535.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11566.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11596.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11627.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11657.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11688.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11719.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11747.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11778.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11808.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11839.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11869.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11900.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11931.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11961.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/11992.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12022.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12053.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12084.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12112.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12143.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12173.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12204.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12234.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12265.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12296.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12326.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12357.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12387.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12418.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12449.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12478.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12509.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12539.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12570.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12600.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12631.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12662.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12692.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12723.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12753.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12784.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12815.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12843.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12874.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12904.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12935.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12965.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/12996.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13027.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13057.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13088.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13118.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13149.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13180.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13208.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13239.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13269.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13300.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13330.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13361.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13392.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13422.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13453.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13483.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13514.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13545.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13573.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13604.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13634.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13665.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13695.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13726.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13757.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13787.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13818.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13848.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13879.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13910.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13939.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/13970.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14000.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14031.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14061.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14092.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14123.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14153.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14184.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14214.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14245.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14276.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14304.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14335.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14365.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14396.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14426.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14457.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14488.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14518.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14549.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14579.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14610.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14641.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14669.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14700.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14730.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14761.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14791.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14822.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14853.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14883.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14914.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14944.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/14975.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15006.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15034.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15065.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15095.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15126.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15156.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15187.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15218.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15248.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15279.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15309.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15340.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15371.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15400.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15431.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15461.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15492.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15522.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15553.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15584.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15614.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15645.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15675.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15706.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15737.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15765.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15796.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15826.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15857.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15887.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15918.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15949.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/15979.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16010.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16040.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16071.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16102.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16130.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16161.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16191.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16222.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16252.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16283.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16314.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16344.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16375.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16405.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16436.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16467.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16495.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16526.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16556.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16587.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16617.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16648.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16679.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16709.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16740.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16770.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16801.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16832.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16861.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16892.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16922.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16953.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/16983.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17014.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17045.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17075.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17106.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17136.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17167.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17198.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17226.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17257.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17287.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17318.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17348.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17379.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17410.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17440.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17471.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17501.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17532.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17563.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17591.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17622.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17652.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17683.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17713.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17744.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17775.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17805.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17836.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17866.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17897.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17928.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17956.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/17987.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18017.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18048.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18078.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18109.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18140.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18170.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18201.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18231.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18262.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18293.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18322.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18353.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18383.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18414.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18444.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18475.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18506.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18536.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18567.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18597.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18628.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18659.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18687.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18718.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18748.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18779.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18809.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18840.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18871.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18901.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18932.gz.parquet +data/processed_data/model_data/dynamic_parquet/most_recent_burn_dates/18962.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11005.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11021.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11037.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11053.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11069.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11085.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11101.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11117.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11133.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11149.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11165.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11181.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11197.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11213.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11229.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11245.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11261.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11277.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11293.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11309.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11323.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11339.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11355.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11371.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11387.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11403.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11419.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11435.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11451.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11467.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11483.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11499.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11515.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11531.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11547.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11563.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11579.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11595.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11611.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11627.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11643.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11659.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11675.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11688.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11704.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11720.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11736.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11752.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11768.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11784.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11800.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11816.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11832.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11848.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11864.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11880.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11896.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11912.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11928.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11944.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11960.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11976.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/11992.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12008.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12024.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12040.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12053.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12069.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12085.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12101.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12117.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12133.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12149.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12165.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12181.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12197.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12213.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12229.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12245.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12261.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12277.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12293.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12309.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12325.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12341.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12357.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12373.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12389.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12405.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12418.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12434.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12450.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12466.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12482.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12498.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12514.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12530.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12546.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12562.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12578.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12594.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12610.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12626.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12642.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12658.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12674.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12690.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12706.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12722.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12738.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12754.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12770.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12784.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12800.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12816.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12832.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12848.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12864.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12880.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12896.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12912.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12928.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12944.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12960.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12976.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/12992.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13008.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13024.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13040.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13056.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13072.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13088.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13104.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13120.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13136.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13149.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13165.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13181.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13197.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13213.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13229.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13245.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13261.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13277.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13293.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13309.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13325.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13341.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13357.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13373.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13389.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13405.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13421.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13437.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13453.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13469.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13485.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13501.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13514.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13530.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13546.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13562.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13578.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13594.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13610.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13626.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13642.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13658.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13674.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13690.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13706.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13722.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13738.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13754.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13770.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13786.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13802.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13818.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13834.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13850.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13866.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13879.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13895.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13911.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13927.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13943.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13959.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13975.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/13991.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14007.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14023.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14039.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14055.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14071.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14087.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14103.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14119.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14135.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14151.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14167.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14183.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14199.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14215.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14231.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14245.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14261.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14277.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14293.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14309.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14325.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14341.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14357.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14373.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14389.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14405.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14421.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14437.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14453.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14469.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14485.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14501.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14517.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14533.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14549.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14565.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14581.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14597.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14610.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14626.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14642.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14658.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14674.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14690.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14706.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14722.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14738.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14754.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14770.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14786.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14802.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14818.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14834.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14850.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14866.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14882.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14898.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14914.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14930.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14946.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14962.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14975.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/14991.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15007.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15023.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15039.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15055.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15071.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15087.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15103.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15119.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15135.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15151.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15167.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15183.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15199.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15215.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15231.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15247.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15263.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15279.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15295.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15311.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15327.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15340.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15356.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15372.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15388.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15404.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15420.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15436.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15452.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15468.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15484.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15500.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15516.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15532.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15548.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15564.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15580.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15596.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15612.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15628.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15644.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15660.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15676.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15692.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15706.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15722.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15738.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15754.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15770.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15786.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15802.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15818.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15834.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15850.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15866.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15882.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15898.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15914.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15930.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15946.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15962.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15978.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/15994.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16010.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16026.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16042.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16058.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16071.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16087.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16103.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16119.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16135.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16151.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16167.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16183.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16199.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16215.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16231.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16247.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16263.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16279.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16295.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16311.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16327.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16343.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16359.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16375.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16391.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16407.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16423.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16436.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16452.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16468.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16484.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16500.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16516.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16532.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16548.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16564.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16580.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16596.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16612.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16628.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16644.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16660.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16676.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16692.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16708.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16724.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16740.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16756.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16772.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16788.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16801.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16817.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16833.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16849.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16865.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16881.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16897.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16913.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16929.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16945.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16961.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16977.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/16993.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17009.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17025.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17041.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17057.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17073.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17089.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17105.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17121.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17137.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17153.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17167.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17183.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17199.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17215.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17231.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17247.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17263.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17279.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17295.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17311.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17327.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17343.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17359.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17375.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17391.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17407.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17423.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17439.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17455.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17471.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17487.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17503.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17519.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17532.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17548.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17564.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17580.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17596.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17612.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17628.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17644.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17660.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17676.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17692.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17708.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17724.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17740.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17756.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17772.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17788.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17804.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17820.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17836.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17852.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17868.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17884.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17897.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17913.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17929.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17945.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17961.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17977.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/17993.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18009.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18025.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18041.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18057.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18073.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18089.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18105.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18121.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18137.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18153.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18169.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18185.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18201.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18217.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18233.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18249.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18262.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18278.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18294.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18310.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18326.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18342.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18358.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18374.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18390.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18406.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18422.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18438.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18454.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18470.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18486.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18502.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18518.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18534.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18550.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18566.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18582.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18598.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18614.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18628.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18644.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18660.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18676.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18692.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18708.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18724.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18740.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18756.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18772.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18788.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18804.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18820.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18836.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18852.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18868.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18884.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18900.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18916.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18932.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18948.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18964.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18980.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/18993.gz.parquet +data/processed_data/model_data/dynamic_parquet/ndvi/19009.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11005.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11021.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11037.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11053.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11069.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11085.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11101.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11117.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11133.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11149.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11165.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11181.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11197.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11213.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11229.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11245.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11261.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11277.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11293.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11309.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11323.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11339.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11355.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11371.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11387.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11403.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11419.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11435.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11451.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11467.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11483.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11499.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11515.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11531.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11547.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11563.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11579.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11595.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11611.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11627.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11643.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11659.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11675.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11688.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11704.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11720.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11736.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11752.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11768.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11784.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11800.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11816.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11832.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11848.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11864.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11880.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11896.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11912.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11928.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11944.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11960.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11976.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/11992.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12008.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12024.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12040.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12053.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12069.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12085.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12101.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12117.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12133.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12149.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12165.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12181.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12197.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12213.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12229.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12245.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12261.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12277.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12293.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12309.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12325.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12341.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12357.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12373.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12389.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12405.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12418.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12434.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12450.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12466.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12482.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12498.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12514.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12530.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12546.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12562.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12578.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12594.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12610.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12626.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12642.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12658.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12674.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12690.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12706.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12722.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12738.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12754.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12770.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12784.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12800.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12816.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12832.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12848.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12864.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12880.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12896.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12912.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12928.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12944.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12960.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12976.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/12992.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13008.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13024.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13040.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13056.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13072.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13088.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13104.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13120.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13136.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13149.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13165.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13181.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13197.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13213.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13229.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13245.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13261.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13277.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13293.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13309.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13325.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13341.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13357.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13373.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13389.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13405.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13421.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13437.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13453.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13469.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13485.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13501.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13514.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13530.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13546.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13562.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13578.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13594.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13610.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13626.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13642.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13658.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13674.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13690.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13706.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13722.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13738.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13754.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13770.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13786.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13802.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13818.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13834.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13850.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13866.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13879.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13895.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13911.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13927.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13943.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13959.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13975.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/13991.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14007.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14023.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14039.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14055.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14071.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14087.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14103.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14119.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14135.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14151.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14167.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14183.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14199.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14215.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14231.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14245.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14261.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14277.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14293.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14309.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14325.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14341.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14357.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14373.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14389.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14405.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14421.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14437.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14453.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14469.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14485.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14501.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14517.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14533.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14549.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14565.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14581.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14597.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14610.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14626.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14642.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14658.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14674.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14690.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14706.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14722.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14738.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14754.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14770.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14786.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14802.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14818.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14834.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14850.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14866.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14882.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14898.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14914.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14930.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14946.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14962.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14975.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/14991.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15007.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15023.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15039.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15055.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15071.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15087.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15103.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15119.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15135.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15151.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15167.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15183.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15199.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15215.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15231.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15247.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15263.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15279.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15295.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15311.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15327.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15340.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15356.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15372.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15388.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15404.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15420.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15436.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15452.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15468.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15484.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15500.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15516.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15532.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15548.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15564.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15580.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15596.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15612.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15628.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15644.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15660.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15676.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15692.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15706.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15722.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15738.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15754.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15770.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15786.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15802.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15818.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15834.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15850.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15866.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15882.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15898.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15914.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15930.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15946.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15962.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15978.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/15994.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16010.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16026.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16042.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16058.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16071.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16087.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16103.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16119.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16135.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16151.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16167.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16183.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16199.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16215.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16231.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16247.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16263.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16279.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16295.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16311.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16327.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16343.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16359.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16375.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16391.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16407.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16423.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16436.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16452.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16468.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16484.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16500.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16516.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16532.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16548.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16564.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16580.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16596.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16612.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16628.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16644.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16660.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16676.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16692.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16708.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16724.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16740.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16756.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16772.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16788.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16801.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16817.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16833.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16849.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16865.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16881.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16897.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16913.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16929.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16945.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16961.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16977.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/16993.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17009.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17025.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17041.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17057.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17073.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17089.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17105.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17121.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17137.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17153.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17167.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17183.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17199.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17215.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17231.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17247.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17263.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17279.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17295.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17311.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17327.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17343.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17359.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17375.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17391.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17407.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17423.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17439.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17455.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17471.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17487.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17503.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17519.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17532.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17548.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17564.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17580.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17596.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17612.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17628.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17644.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17660.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17676.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17692.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17708.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17724.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17740.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17756.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17772.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17788.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17804.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17820.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17836.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17852.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17868.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17884.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17897.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17913.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17929.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17945.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17961.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17977.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/17993.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18009.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18025.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18041.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18057.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18073.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18089.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18105.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18121.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18137.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18153.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18169.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18185.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18201.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18217.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18233.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18249.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18262.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18278.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18294.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18310.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18326.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18342.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18358.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18374.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18390.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18406.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18422.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18438.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18454.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18470.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18486.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18502.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18518.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18534.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18550.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18566.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18582.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18598.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18614.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18628.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18644.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18660.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18676.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18692.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18708.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18724.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18740.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18756.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18772.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18788.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18804.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18820.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18836.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18852.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18868.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18884.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18900.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18916.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18932.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18948.gz.parquet +data/processed_data/model_data/dynamic_parquet/time_since_fire/18964.gz.parquet +data/processed_data/model_data/stable_data.gz.parquet +data/processed_data/most_recent_burn_dates/2000_11_01.tif +data/processed_data/most_recent_burn_dates/2000_12_01.tif +data/processed_data/most_recent_burn_dates/2001_01_01.tif +data/processed_data/most_recent_burn_dates/2001_02_01.tif +data/processed_data/most_recent_burn_dates/2001_03_01.tif +data/processed_data/most_recent_burn_dates/2001_04_01.tif +data/processed_data/most_recent_burn_dates/2001_05_01.tif +data/processed_data/most_recent_burn_dates/2001_06_01.tif +data/processed_data/most_recent_burn_dates/2001_07_01.tif +data/processed_data/most_recent_burn_dates/2001_08_01.tif +data/processed_data/most_recent_burn_dates/2001_09_01.tif +data/processed_data/most_recent_burn_dates/2001_10_01.tif +data/processed_data/most_recent_burn_dates/2001_11_01.tif +data/processed_data/most_recent_burn_dates/2001_12_01.tif +data/processed_data/most_recent_burn_dates/2002_01_01.tif +data/processed_data/most_recent_burn_dates/2002_02_01.tif +data/processed_data/most_recent_burn_dates/2002_03_01.tif +data/processed_data/most_recent_burn_dates/2002_04_01.tif +data/processed_data/most_recent_burn_dates/2002_05_01.tif +data/processed_data/most_recent_burn_dates/2002_06_01.tif +data/processed_data/most_recent_burn_dates/2002_07_01.tif +data/processed_data/most_recent_burn_dates/2002_08_01.tif +data/processed_data/most_recent_burn_dates/2002_09_01.tif +data/processed_data/most_recent_burn_dates/2002_10_01.tif +data/processed_data/most_recent_burn_dates/2002_11_01.tif +data/processed_data/most_recent_burn_dates/2002_12_01.tif +data/processed_data/most_recent_burn_dates/2003_01_01.tif +data/processed_data/most_recent_burn_dates/2003_02_01.tif +data/processed_data/most_recent_burn_dates/2003_03_01.tif +data/processed_data/most_recent_burn_dates/2003_04_01.tif +data/processed_data/most_recent_burn_dates/2003_05_01.tif +data/processed_data/most_recent_burn_dates/2003_06_01.tif +data/processed_data/most_recent_burn_dates/2003_07_01.tif +data/processed_data/most_recent_burn_dates/2003_08_01.tif +data/processed_data/most_recent_burn_dates/2003_09_01.tif +data/processed_data/most_recent_burn_dates/2003_10_01.tif +data/processed_data/most_recent_burn_dates/2003_11_01.tif +data/processed_data/most_recent_burn_dates/2003_12_01.tif +data/processed_data/most_recent_burn_dates/2004_01_01.tif +data/processed_data/most_recent_burn_dates/2004_02_01.tif +data/processed_data/most_recent_burn_dates/2004_03_01.tif +data/processed_data/most_recent_burn_dates/2004_04_01.tif +data/processed_data/most_recent_burn_dates/2004_05_01.tif +data/processed_data/most_recent_burn_dates/2004_06_01.tif +data/processed_data/most_recent_burn_dates/2004_07_01.tif +data/processed_data/most_recent_burn_dates/2004_08_01.tif +data/processed_data/most_recent_burn_dates/2004_09_01.tif +data/processed_data/most_recent_burn_dates/2004_10_01.tif +data/processed_data/most_recent_burn_dates/2004_11_01.tif +data/processed_data/most_recent_burn_dates/2004_12_01.tif +data/processed_data/most_recent_burn_dates/2005_01_01.tif +data/processed_data/most_recent_burn_dates/2005_02_01.tif +data/processed_data/most_recent_burn_dates/2005_03_01.tif +data/processed_data/most_recent_burn_dates/2005_04_01.tif +data/processed_data/most_recent_burn_dates/2005_05_01.tif +data/processed_data/most_recent_burn_dates/2005_06_01.tif +data/processed_data/most_recent_burn_dates/2005_07_01.tif +data/processed_data/most_recent_burn_dates/2005_08_01.tif +data/processed_data/most_recent_burn_dates/2005_09_01.tif +data/processed_data/most_recent_burn_dates/2005_10_01.tif +data/processed_data/most_recent_burn_dates/2005_11_01.tif +data/processed_data/most_recent_burn_dates/2005_12_01.tif +data/processed_data/most_recent_burn_dates/2006_01_01.tif +data/processed_data/most_recent_burn_dates/2006_02_01.tif +data/processed_data/most_recent_burn_dates/2006_03_01.tif +data/processed_data/most_recent_burn_dates/2006_04_01.tif +data/processed_data/most_recent_burn_dates/2006_05_01.tif +data/processed_data/most_recent_burn_dates/2006_06_01.tif +data/processed_data/most_recent_burn_dates/2006_07_01.tif +data/processed_data/most_recent_burn_dates/2006_08_01.tif +data/processed_data/most_recent_burn_dates/2006_09_01.tif +data/processed_data/most_recent_burn_dates/2006_10_01.tif +data/processed_data/most_recent_burn_dates/2006_11_01.tif +data/processed_data/most_recent_burn_dates/2006_12_01.tif +data/processed_data/most_recent_burn_dates/2007_01_01.tif +data/processed_data/most_recent_burn_dates/2007_02_01.tif +data/processed_data/most_recent_burn_dates/2007_03_01.tif +data/processed_data/most_recent_burn_dates/2007_04_01.tif +data/processed_data/most_recent_burn_dates/2007_05_01.tif +data/processed_data/most_recent_burn_dates/2007_06_01.tif +data/processed_data/most_recent_burn_dates/2007_07_01.tif +data/processed_data/most_recent_burn_dates/2007_08_01.tif +data/processed_data/most_recent_burn_dates/2007_09_01.tif +data/processed_data/most_recent_burn_dates/2007_10_01.tif +data/processed_data/most_recent_burn_dates/2007_11_01.tif +data/processed_data/most_recent_burn_dates/2007_12_01.tif +data/processed_data/most_recent_burn_dates/2008_01_01.tif +data/processed_data/most_recent_burn_dates/2008_02_01.tif +data/processed_data/most_recent_burn_dates/2008_03_01.tif +data/processed_data/most_recent_burn_dates/2008_04_01.tif +data/processed_data/most_recent_burn_dates/2008_05_01.tif +data/processed_data/most_recent_burn_dates/2008_06_01.tif +data/processed_data/most_recent_burn_dates/2008_07_01.tif +data/processed_data/most_recent_burn_dates/2008_08_01.tif +data/processed_data/most_recent_burn_dates/2008_09_01.tif +data/processed_data/most_recent_burn_dates/2008_10_01.tif +data/processed_data/most_recent_burn_dates/2008_11_01.tif +data/processed_data/most_recent_burn_dates/2008_12_01.tif +data/processed_data/most_recent_burn_dates/2009_01_01.tif +data/processed_data/most_recent_burn_dates/2009_02_01.tif +data/processed_data/most_recent_burn_dates/2009_03_01.tif +data/processed_data/most_recent_burn_dates/2009_04_01.tif +data/processed_data/most_recent_burn_dates/2009_05_01.tif +data/processed_data/most_recent_burn_dates/2009_06_01.tif +data/processed_data/most_recent_burn_dates/2009_07_01.tif +data/processed_data/most_recent_burn_dates/2009_08_01.tif +data/processed_data/most_recent_burn_dates/2009_09_01.tif +data/processed_data/most_recent_burn_dates/2009_10_01.tif +data/processed_data/most_recent_burn_dates/2009_11_01.tif +data/processed_data/most_recent_burn_dates/2009_12_01.tif +data/processed_data/most_recent_burn_dates/2010_01_01.tif +data/processed_data/most_recent_burn_dates/2010_02_01.tif +data/processed_data/most_recent_burn_dates/2010_03_01.tif +data/processed_data/most_recent_burn_dates/2010_04_01.tif +data/processed_data/most_recent_burn_dates/2010_05_01.tif +data/processed_data/most_recent_burn_dates/2010_06_01.tif +data/processed_data/most_recent_burn_dates/2010_07_01.tif +data/processed_data/most_recent_burn_dates/2010_08_01.tif +data/processed_data/most_recent_burn_dates/2010_09_01.tif +data/processed_data/most_recent_burn_dates/2010_10_01.tif +data/processed_data/most_recent_burn_dates/2010_11_01.tif +data/processed_data/most_recent_burn_dates/2010_12_01.tif +data/processed_data/most_recent_burn_dates/2011_01_01.tif +data/processed_data/most_recent_burn_dates/2011_02_01.tif +data/processed_data/most_recent_burn_dates/2011_03_01.tif +data/processed_data/most_recent_burn_dates/2011_04_01.tif +data/processed_data/most_recent_burn_dates/2011_05_01.tif +data/processed_data/most_recent_burn_dates/2011_06_01.tif +data/processed_data/most_recent_burn_dates/2011_07_01.tif +data/processed_data/most_recent_burn_dates/2011_08_01.tif +data/processed_data/most_recent_burn_dates/2011_09_01.tif +data/processed_data/most_recent_burn_dates/2011_10_01.tif +data/processed_data/most_recent_burn_dates/2011_11_01.tif +data/processed_data/most_recent_burn_dates/2011_12_01.tif +data/processed_data/most_recent_burn_dates/2012_01_01.tif +data/processed_data/most_recent_burn_dates/2012_02_01.tif +data/processed_data/most_recent_burn_dates/2012_03_01.tif +data/processed_data/most_recent_burn_dates/2012_04_01.tif +data/processed_data/most_recent_burn_dates/2012_05_01.tif +data/processed_data/most_recent_burn_dates/2012_06_01.tif +data/processed_data/most_recent_burn_dates/2012_07_01.tif +data/processed_data/most_recent_burn_dates/2012_08_01.tif +data/processed_data/most_recent_burn_dates/2012_09_01.tif +data/processed_data/most_recent_burn_dates/2012_10_01.tif +data/processed_data/most_recent_burn_dates/2012_11_01.tif +data/processed_data/most_recent_burn_dates/2012_12_01.tif +data/processed_data/most_recent_burn_dates/2013_01_01.tif +data/processed_data/most_recent_burn_dates/2013_02_01.tif +data/processed_data/most_recent_burn_dates/2013_03_01.tif +data/processed_data/most_recent_burn_dates/2013_04_01.tif +data/processed_data/most_recent_burn_dates/2013_05_01.tif +data/processed_data/most_recent_burn_dates/2013_06_01.tif +data/processed_data/most_recent_burn_dates/2013_07_01.tif +data/processed_data/most_recent_burn_dates/2013_08_01.tif +data/processed_data/most_recent_burn_dates/2013_09_01.tif +data/processed_data/most_recent_burn_dates/2013_10_01.tif +data/processed_data/most_recent_burn_dates/2013_11_01.tif +data/processed_data/most_recent_burn_dates/2013_12_01.tif +data/processed_data/most_recent_burn_dates/2014_01_01.tif +data/processed_data/most_recent_burn_dates/2014_02_01.tif +data/processed_data/most_recent_burn_dates/2014_03_01.tif +data/processed_data/most_recent_burn_dates/2014_04_01.tif +data/processed_data/most_recent_burn_dates/2014_05_01.tif +data/processed_data/most_recent_burn_dates/2014_06_01.tif +data/processed_data/most_recent_burn_dates/2014_07_01.tif +data/processed_data/most_recent_burn_dates/2014_08_01.tif +data/processed_data/most_recent_burn_dates/2014_09_01.tif +data/processed_data/most_recent_burn_dates/2014_10_01.tif +data/processed_data/most_recent_burn_dates/2014_11_01.tif +data/processed_data/most_recent_burn_dates/2014_12_01.tif +data/processed_data/most_recent_burn_dates/2015_01_01.tif +data/processed_data/most_recent_burn_dates/2015_02_01.tif +data/processed_data/most_recent_burn_dates/2015_03_01.tif +data/processed_data/most_recent_burn_dates/2015_04_01.tif +data/processed_data/most_recent_burn_dates/2015_05_01.tif +data/processed_data/most_recent_burn_dates/2015_06_01.tif +data/processed_data/most_recent_burn_dates/2015_07_01.tif +data/processed_data/most_recent_burn_dates/2015_08_01.tif +data/processed_data/most_recent_burn_dates/2015_09_01.tif +data/processed_data/most_recent_burn_dates/2015_10_01.tif +data/processed_data/most_recent_burn_dates/2015_11_01.tif +data/processed_data/most_recent_burn_dates/2015_12_01.tif +data/processed_data/most_recent_burn_dates/2016_01_01.tif +data/processed_data/most_recent_burn_dates/2016_02_01.tif +data/processed_data/most_recent_burn_dates/2016_03_01.tif +data/processed_data/most_recent_burn_dates/2016_04_01.tif +data/processed_data/most_recent_burn_dates/2016_05_01.tif +data/processed_data/most_recent_burn_dates/2016_06_01.tif +data/processed_data/most_recent_burn_dates/2016_07_01.tif +data/processed_data/most_recent_burn_dates/2016_08_01.tif +data/processed_data/most_recent_burn_dates/2016_09_01.tif +data/processed_data/most_recent_burn_dates/2016_10_01.tif +data/processed_data/most_recent_burn_dates/2016_11_01.tif +data/processed_data/most_recent_burn_dates/2016_12_01.tif +data/processed_data/most_recent_burn_dates/2017_01_01.tif +data/processed_data/most_recent_burn_dates/2017_02_01.tif +data/processed_data/most_recent_burn_dates/2017_03_01.tif +data/processed_data/most_recent_burn_dates/2017_04_01.tif +data/processed_data/most_recent_burn_dates/2017_05_01.tif +data/processed_data/most_recent_burn_dates/2017_06_01.tif +data/processed_data/most_recent_burn_dates/2017_07_01.tif +data/processed_data/most_recent_burn_dates/2017_08_01.tif +data/processed_data/most_recent_burn_dates/2017_09_01.tif +data/processed_data/most_recent_burn_dates/2017_10_01.tif +data/processed_data/most_recent_burn_dates/2017_11_01.tif +data/processed_data/most_recent_burn_dates/2017_12_01.tif +data/processed_data/most_recent_burn_dates/2018_01_01.tif +data/processed_data/most_recent_burn_dates/2018_02_01.tif +data/processed_data/most_recent_burn_dates/2018_03_01.tif +data/processed_data/most_recent_burn_dates/2018_04_01.tif +data/processed_data/most_recent_burn_dates/2018_05_01.tif +data/processed_data/most_recent_burn_dates/2018_06_01.tif +data/processed_data/most_recent_burn_dates/2018_07_01.tif +data/processed_data/most_recent_burn_dates/2018_08_01.tif +data/processed_data/most_recent_burn_dates/2018_09_01.tif +data/processed_data/most_recent_burn_dates/2018_10_01.tif +data/processed_data/most_recent_burn_dates/2018_11_01.tif +data/processed_data/most_recent_burn_dates/2018_12_01.tif +data/processed_data/most_recent_burn_dates/2019_01_01.tif +data/processed_data/most_recent_burn_dates/2019_02_01.tif +data/processed_data/most_recent_burn_dates/2019_03_01.tif +data/processed_data/most_recent_burn_dates/2019_04_01.tif +data/processed_data/most_recent_burn_dates/2019_05_01.tif +data/processed_data/most_recent_burn_dates/2019_06_01.tif +data/processed_data/most_recent_burn_dates/2019_07_01.tif +data/processed_data/most_recent_burn_dates/2019_08_01.tif +data/processed_data/most_recent_burn_dates/2019_09_01.tif +data/processed_data/most_recent_burn_dates/2019_10_01.tif +data/processed_data/most_recent_burn_dates/2019_11_01.tif +data/processed_data/most_recent_burn_dates/2019_12_01.tif +data/processed_data/most_recent_burn_dates/2020_01_01.tif +data/processed_data/most_recent_burn_dates/2020_02_01.tif +data/processed_data/most_recent_burn_dates/2020_03_01.tif +data/processed_data/most_recent_burn_dates/2020_04_01.tif +data/processed_data/most_recent_burn_dates/2020_05_01.tif +data/processed_data/most_recent_burn_dates/2020_06_01.tif +data/processed_data/most_recent_burn_dates/2020_07_01.tif +data/processed_data/most_recent_burn_dates/2020_08_01.tif +data/processed_data/most_recent_burn_dates/2020_09_01.tif +data/processed_data/most_recent_burn_dates/2020_10_01.tif +data/processed_data/most_recent_burn_dates/2020_11_01.tif +data/processed_data/most_recent_burn_dates/2020_12_01.tif +data/processed_data/most_recent_burn_dates/2021_01_01.tif +data/processed_data/most_recent_burn_dates/2021_02_01.tif +data/processed_data/most_recent_burn_dates/2021_03_01.tif +data/processed_data/most_recent_burn_dates/2021_04_01.tif +data/processed_data/most_recent_burn_dates/2021_05_01.tif +data/processed_data/most_recent_burn_dates/2021_06_01.tif +data/processed_data/most_recent_burn_dates/2021_07_01.tif +data/processed_data/most_recent_burn_dates/2021_08_01.tif +data/processed_data/most_recent_burn_dates/2021_09_01.tif +data/processed_data/most_recent_burn_dates/2021_10_01.tif +data/processed_data/most_recent_burn_dates/2021_11_01.tif +data/processed_data/most_recent_burn_dates/2021_12_01.tif +data/processed_data/ndvi_relative_time_since_fire/2000_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2000_03_05.tif +data/processed_data/ndvi_relative_time_since_fire/2000_03_21.tif +data/processed_data/ndvi_relative_time_since_fire/2000_04_06.tif +data/processed_data/ndvi_relative_time_since_fire/2000_04_22.tif +data/processed_data/ndvi_relative_time_since_fire/2000_05_08.tif +data/processed_data/ndvi_relative_time_since_fire/2000_05_24.tif +data/processed_data/ndvi_relative_time_since_fire/2000_06_09.tif +data/processed_data/ndvi_relative_time_since_fire/2000_06_25.tif +data/processed_data/ndvi_relative_time_since_fire/2000_07_11.tif +data/processed_data/ndvi_relative_time_since_fire/2000_07_27.tif +data/processed_data/ndvi_relative_time_since_fire/2000_08_12.tif +data/processed_data/ndvi_relative_time_since_fire/2000_08_28.tif +data/processed_data/ndvi_relative_time_since_fire/2000_09_13.tif +data/processed_data/ndvi_relative_time_since_fire/2000_09_29.tif +data/processed_data/ndvi_relative_time_since_fire/2000_10_15.tif +data/processed_data/ndvi_relative_time_since_fire/2000_10_31.tif +data/processed_data/ndvi_relative_time_since_fire/2000_11_16.tif +data/processed_data/ndvi_relative_time_since_fire/2000_12_02.tif +data/processed_data/ndvi_relative_time_since_fire/2000_12_18.tif +data/processed_data/ndvi_relative_time_since_fire/2001_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2001_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2001_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2001_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2001_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2001_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2001_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2001_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2001_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2001_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2001_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2001_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2001_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2001_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2001_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2001_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2001_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2001_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2001_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2001_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2001_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2001_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2001_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2002_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2002_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2002_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2002_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2002_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2002_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2002_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2002_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2002_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2002_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2002_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2002_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2002_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2002_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2002_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2002_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2002_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2002_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2002_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2002_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2002_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2002_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2002_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2003_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2003_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2003_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2003_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2003_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2003_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2003_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2003_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2003_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2003_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2003_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2003_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2003_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2003_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2003_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2003_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2003_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2003_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2003_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2003_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2003_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2003_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2003_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2004_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2004_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2004_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2004_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2004_03_05.tif +data/processed_data/ndvi_relative_time_since_fire/2004_03_21.tif +data/processed_data/ndvi_relative_time_since_fire/2004_04_06.tif +data/processed_data/ndvi_relative_time_since_fire/2004_04_22.tif +data/processed_data/ndvi_relative_time_since_fire/2004_05_08.tif +data/processed_data/ndvi_relative_time_since_fire/2004_05_24.tif +data/processed_data/ndvi_relative_time_since_fire/2004_06_09.tif +data/processed_data/ndvi_relative_time_since_fire/2004_06_25.tif +data/processed_data/ndvi_relative_time_since_fire/2004_07_11.tif +data/processed_data/ndvi_relative_time_since_fire/2004_07_27.tif +data/processed_data/ndvi_relative_time_since_fire/2004_08_12.tif +data/processed_data/ndvi_relative_time_since_fire/2004_08_28.tif +data/processed_data/ndvi_relative_time_since_fire/2004_09_13.tif +data/processed_data/ndvi_relative_time_since_fire/2004_09_29.tif +data/processed_data/ndvi_relative_time_since_fire/2004_10_15.tif +data/processed_data/ndvi_relative_time_since_fire/2004_10_31.tif +data/processed_data/ndvi_relative_time_since_fire/2004_11_16.tif +data/processed_data/ndvi_relative_time_since_fire/2004_12_02.tif +data/processed_data/ndvi_relative_time_since_fire/2004_12_18.tif +data/processed_data/ndvi_relative_time_since_fire/2005_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2005_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2005_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2005_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2005_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2005_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2005_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2005_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2005_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2005_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2005_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2005_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2005_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2005_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2005_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2005_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2005_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2005_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2005_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2005_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2005_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2005_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2005_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2006_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2006_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2006_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2006_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2006_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2006_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2006_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2006_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2006_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2006_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2006_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2006_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2006_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2006_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2006_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2006_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2006_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2006_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2006_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2006_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2006_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2006_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2006_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2007_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2007_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2007_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2007_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2007_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2007_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2007_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2007_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2007_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2007_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2007_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2007_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2007_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2007_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2007_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2007_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2007_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2007_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2007_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2007_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2007_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2007_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2007_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2008_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2008_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2008_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2008_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2008_03_05.tif +data/processed_data/ndvi_relative_time_since_fire/2008_03_21.tif +data/processed_data/ndvi_relative_time_since_fire/2008_04_06.tif +data/processed_data/ndvi_relative_time_since_fire/2008_04_22.tif +data/processed_data/ndvi_relative_time_since_fire/2008_05_08.tif +data/processed_data/ndvi_relative_time_since_fire/2008_05_24.tif +data/processed_data/ndvi_relative_time_since_fire/2008_06_09.tif +data/processed_data/ndvi_relative_time_since_fire/2008_06_25.tif +data/processed_data/ndvi_relative_time_since_fire/2008_07_11.tif +data/processed_data/ndvi_relative_time_since_fire/2008_07_27.tif +data/processed_data/ndvi_relative_time_since_fire/2008_08_12.tif +data/processed_data/ndvi_relative_time_since_fire/2008_08_28.tif +data/processed_data/ndvi_relative_time_since_fire/2008_09_13.tif +data/processed_data/ndvi_relative_time_since_fire/2008_09_29.tif +data/processed_data/ndvi_relative_time_since_fire/2008_10_15.tif +data/processed_data/ndvi_relative_time_since_fire/2008_10_31.tif +data/processed_data/ndvi_relative_time_since_fire/2008_11_16.tif +data/processed_data/ndvi_relative_time_since_fire/2008_12_02.tif +data/processed_data/ndvi_relative_time_since_fire/2008_12_18.tif +data/processed_data/ndvi_relative_time_since_fire/2009_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2009_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2009_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2009_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2009_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2009_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2009_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2009_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2009_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2009_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2009_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2009_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2009_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2009_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2009_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2009_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2009_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2009_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2009_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2009_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2009_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2009_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2009_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2010_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2010_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2010_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2010_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2010_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2010_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2010_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2010_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2010_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2010_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2010_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2010_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2010_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2010_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2010_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2010_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2010_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2010_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2010_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2010_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2010_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2010_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2010_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2011_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2011_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2011_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2011_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2011_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2011_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2011_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2011_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2011_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2011_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2011_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2011_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2011_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2011_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2011_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2011_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2011_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2011_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2011_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2011_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2011_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2011_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2011_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2012_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2012_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2012_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2012_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2012_03_05.tif +data/processed_data/ndvi_relative_time_since_fire/2012_03_21.tif +data/processed_data/ndvi_relative_time_since_fire/2012_04_06.tif +data/processed_data/ndvi_relative_time_since_fire/2012_04_22.tif +data/processed_data/ndvi_relative_time_since_fire/2012_05_08.tif +data/processed_data/ndvi_relative_time_since_fire/2012_05_24.tif +data/processed_data/ndvi_relative_time_since_fire/2012_06_09.tif +data/processed_data/ndvi_relative_time_since_fire/2012_06_25.tif +data/processed_data/ndvi_relative_time_since_fire/2012_07_11.tif +data/processed_data/ndvi_relative_time_since_fire/2012_07_27.tif +data/processed_data/ndvi_relative_time_since_fire/2012_08_12.tif +data/processed_data/ndvi_relative_time_since_fire/2012_08_28.tif +data/processed_data/ndvi_relative_time_since_fire/2012_09_13.tif +data/processed_data/ndvi_relative_time_since_fire/2012_09_29.tif +data/processed_data/ndvi_relative_time_since_fire/2012_10_15.tif +data/processed_data/ndvi_relative_time_since_fire/2012_10_31.tif +data/processed_data/ndvi_relative_time_since_fire/2012_11_16.tif +data/processed_data/ndvi_relative_time_since_fire/2012_12_02.tif +data/processed_data/ndvi_relative_time_since_fire/2012_12_18.tif +data/processed_data/ndvi_relative_time_since_fire/2013_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2013_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2013_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2013_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2013_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2013_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2013_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2013_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2013_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2013_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2013_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2013_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2013_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2013_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2013_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2013_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2013_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2013_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2013_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2013_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2013_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2013_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2013_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2014_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2014_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2014_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2014_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2014_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2014_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2014_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2014_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2014_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2014_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2014_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2014_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2014_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2014_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2014_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2014_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2014_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2014_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2014_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2014_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2014_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2014_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2014_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2015_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2015_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2015_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2015_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2015_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2015_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2015_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2015_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2015_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2015_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2015_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2015_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2015_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2015_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2015_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2015_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2015_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2015_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2015_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2015_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2015_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2015_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2015_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2016_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2016_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2016_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2016_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2016_03_05.tif +data/processed_data/ndvi_relative_time_since_fire/2016_03_21.tif +data/processed_data/ndvi_relative_time_since_fire/2016_04_06.tif +data/processed_data/ndvi_relative_time_since_fire/2016_04_22.tif +data/processed_data/ndvi_relative_time_since_fire/2016_05_08.tif +data/processed_data/ndvi_relative_time_since_fire/2016_05_24.tif +data/processed_data/ndvi_relative_time_since_fire/2016_06_09.tif +data/processed_data/ndvi_relative_time_since_fire/2016_06_25.tif +data/processed_data/ndvi_relative_time_since_fire/2016_07_11.tif +data/processed_data/ndvi_relative_time_since_fire/2016_07_27.tif +data/processed_data/ndvi_relative_time_since_fire/2016_08_12.tif +data/processed_data/ndvi_relative_time_since_fire/2016_08_28.tif +data/processed_data/ndvi_relative_time_since_fire/2016_09_13.tif +data/processed_data/ndvi_relative_time_since_fire/2016_09_29.tif +data/processed_data/ndvi_relative_time_since_fire/2016_10_15.tif +data/processed_data/ndvi_relative_time_since_fire/2016_10_31.tif +data/processed_data/ndvi_relative_time_since_fire/2016_11_16.tif +data/processed_data/ndvi_relative_time_since_fire/2016_12_02.tif +data/processed_data/ndvi_relative_time_since_fire/2016_12_18.tif +data/processed_data/ndvi_relative_time_since_fire/2017_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2017_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2017_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2017_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2017_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2017_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2017_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2017_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2017_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2017_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2017_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2017_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2017_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2017_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2017_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2017_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2017_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2017_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2017_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2017_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2017_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2017_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2017_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2018_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2018_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2018_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2018_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2018_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2018_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2018_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2018_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2018_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2018_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2018_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2018_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2018_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2018_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2018_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2018_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2018_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2018_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2018_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2018_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2018_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2018_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2018_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2019_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2019_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2019_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2019_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2019_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2019_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2019_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2019_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2019_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2019_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2019_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2019_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2019_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2019_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2019_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2019_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2019_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2019_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2019_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2019_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2019_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2019_12_03.tif +data/processed_data/ndvi_relative_time_since_fire/2019_12_19.tif +data/processed_data/ndvi_relative_time_since_fire/2020_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2020_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2020_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2020_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2020_03_05.tif +data/processed_data/ndvi_relative_time_since_fire/2020_03_21.tif +data/processed_data/ndvi_relative_time_since_fire/2020_04_06.tif +data/processed_data/ndvi_relative_time_since_fire/2020_04_22.tif +data/processed_data/ndvi_relative_time_since_fire/2020_05_08.tif +data/processed_data/ndvi_relative_time_since_fire/2020_05_24.tif +data/processed_data/ndvi_relative_time_since_fire/2020_06_09.tif +data/processed_data/ndvi_relative_time_since_fire/2020_06_25.tif +data/processed_data/ndvi_relative_time_since_fire/2020_07_11.tif +data/processed_data/ndvi_relative_time_since_fire/2020_07_27.tif +data/processed_data/ndvi_relative_time_since_fire/2020_08_12.tif +data/processed_data/ndvi_relative_time_since_fire/2020_08_28.tif +data/processed_data/ndvi_relative_time_since_fire/2020_09_13.tif +data/processed_data/ndvi_relative_time_since_fire/2020_09_29.tif +data/processed_data/ndvi_relative_time_since_fire/2020_10_15.tif +data/processed_data/ndvi_relative_time_since_fire/2020_10_31.tif +data/processed_data/ndvi_relative_time_since_fire/2020_11_16.tif +data/processed_data/ndvi_relative_time_since_fire/2020_12_02.tif +data/processed_data/ndvi_relative_time_since_fire/2020_12_18.tif +data/processed_data/ndvi_relative_time_since_fire/2021_01_01.tif +data/processed_data/ndvi_relative_time_since_fire/2021_01_17.tif +data/processed_data/ndvi_relative_time_since_fire/2021_02_02.tif +data/processed_data/ndvi_relative_time_since_fire/2021_02_18.tif +data/processed_data/ndvi_relative_time_since_fire/2021_03_06.tif +data/processed_data/ndvi_relative_time_since_fire/2021_03_22.tif +data/processed_data/ndvi_relative_time_since_fire/2021_04_07.tif +data/processed_data/ndvi_relative_time_since_fire/2021_04_23.tif +data/processed_data/ndvi_relative_time_since_fire/2021_05_09.tif +data/processed_data/ndvi_relative_time_since_fire/2021_05_25.tif +data/processed_data/ndvi_relative_time_since_fire/2021_06_10.tif +data/processed_data/ndvi_relative_time_since_fire/2021_06_26.tif +data/processed_data/ndvi_relative_time_since_fire/2021_07_12.tif +data/processed_data/ndvi_relative_time_since_fire/2021_07_28.tif +data/processed_data/ndvi_relative_time_since_fire/2021_08_13.tif +data/processed_data/ndvi_relative_time_since_fire/2021_08_29.tif +data/processed_data/ndvi_relative_time_since_fire/2021_09_14.tif +data/processed_data/ndvi_relative_time_since_fire/2021_09_30.tif +data/processed_data/ndvi_relative_time_since_fire/2021_10_16.tif +data/processed_data/ndvi_relative_time_since_fire/2021_11_01.tif +data/processed_data/ndvi_relative_time_since_fire/2021_11_17.tif +data/processed_data/ndvi_relative_time_since_fire/2021_12_03.tif +data/processed_data/precipitation_chelsa/CHELSA_prec_01_V1.2_land_clipped.tif +data/processed_data/precipitation_chelsa/CHELSA_prec_07_V1.2_land_clipped.tif +data/raw_data/alos/alos_chili.tif +data/raw_data/alos/alos_mtpi.tif +data/raw_data/alos/alos_topographic_diversity.tif +data/raw_data/alos/landforms.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_01_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_02_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_03_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_04_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_05_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_06_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_07_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_08_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_09_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_10_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_11_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_12_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_13_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_14_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_15_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_16_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_17_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_18_V1.2_clipped.tif +data/raw_data/climate_chelsa/bio/bio_V1.2/clipped/CHELSA_bio10_19_V1.2_clipped.tif +data/raw_data/climate_chelsa/chelsa_citation.bib +data/raw_data/clouds_wilson/MODCF_interannualSD.tif +data/raw_data/clouds_wilson/MODCF_intraannualSD.tif +data/raw_data/clouds_wilson/MODCF_meanannual.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_01.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_02.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_03.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_04.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_05.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_06.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_07.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_08.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_09.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_10.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_11.tif +data/raw_data/clouds_wilson/MODCF_monthlymean_12.tif +data/raw_data/clouds_wilson/MODCF_seasonality_concentration.tif +data/raw_data/clouds_wilson/MODCF_seasonality_rgb.tif +data/raw_data/clouds_wilson/MODCF_seasonality_theta.tif +data/raw_data/clouds_wilson/MODCF_seasonality_visct.tif +data/raw_data/clouds_wilson/MODCF_spatialSD_1deg.tif +data/raw_data/elevation_nasadem/nasadem.tif +data/raw_data/fire_modis/2021_11_01.tif +data/raw_data/fire_modis/2021_12_01.tif +data/raw_data/kndvi_modis/.tif +data/raw_data/landcover_za/SA_NLC_2020_GEO.tif +data/raw_data/landcover_za/SA_NLC_2020_GEO.tif.vat.cpg +data/raw_data/landcover_za/SA_NLC_2020_GEO.tif.vat.dbf +data/raw_data/ndvi_dates_modis/.tif +data/raw_data/ndvi_dates_modis/2022_01_01.tif +data/raw_data/ndvi_dates_modis/2022_01_17.tif +data/raw_data/ndvi_modis/.tif +data/raw_data/ndvi_modis/2022_01_01.tif +data/raw_data/ndvi_modis/2022_01_17.tif +data/raw_data/precipitation_chelsa/chelsa_citation.bib +data/raw_data/precipitation_chelsa/prec/prec_V1.2/clipped/CHELSA_prec_01_V1.2_land_clipped.grd +data/raw_data/precipitation_chelsa/prec/prec_V1.2/clipped/CHELSA_prec_01_V1.2_land_clipped.gri +data/raw_data/precipitation_chelsa/prec/prec_V1.2/clipped/CHELSA_prec_01_V1.2_land_clipped.tif +data/raw_data/precipitation_chelsa/prec/prec_V1.2/clipped/CHELSA_prec_07_V1.2_land_clipped.grd +data/raw_data/precipitation_chelsa/prec/prec_V1.2/clipped/CHELSA_prec_07_V1.2_land_clipped.gri +data/raw_data/precipitation_chelsa/prec/prec_V1.2/clipped/CHELSA_prec_07_V1.2_land_clipped.tif +data/remnant_distance.tif +data/remnants.tif +firemodel_predict +index.md +index_files/figure-gfm/p1-1.png +index_files/figure-gfm/plot-1.png +scratch_code/test.zip +scratch_code/wc2.1_10m_tmin_01.tif +data/raw_data/fire_modis/log.csv +data/raw_data/ndvi_dates_modis/log.csv +data/raw_data/ndvi_modis/log.csv diff --git a/DESCRIPTION b/DESCRIPTION index 9bf7a592..9503053d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,10 +1,10 @@ Package: EMMAv1 Type: Project Title: EMMA Targets Workflow -Version: 0.1.0 +Version: 0.2.0 Author: Adam M. Wilson Maintainer: Adam M. Wilson - Description: Example targets workflow for GitHub actions + Description: EMMA data workflow using targets, AppEEARS, and GitHub releases License: MIT + file LICENSE Encoding: UTF-8 LazyData: true @@ -14,12 +14,22 @@ Imports: viridis, colourvalues, sf, - raster, + terra, testthat, kableExtra, knitr, - cmdstanr, - posterior, - bayesplot + appeears, + piggyback, + lubridate, + jsonlite, + dplyr, + arrow, + targets, + geotargets, + janitor, + ncdf4 Suggests: + rgee, + reticulate, + raster, RoxygenNote: 7.1.1 diff --git a/OBJECTS_RELEASE.md b/OBJECTS_RELEASE.md new file mode 100644 index 00000000..0214efcf --- /dev/null +++ b/OBJECTS_RELEASE.md @@ -0,0 +1,129 @@ +# Target Objects Release (`objects_current`) + +This GitHub release contains cached computational artifacts from the emma_envdata workflow pipeline using content-addressable storage. Objects are stored with hash-based filenames for deduplication and efficient caching, enabling the workflow to avoid redundant computation of expensive intermediate datasets. + +## Contents + +This release stores two types of objects: + +### File Outputs (Spatial Data) +Published directly as files on the release such as parquet and netCDF files. However, due to the targets workflow's content-addressable storage system, these files are referenced by their content hash in the workflow metadata. The targets workflow automatically manages hash lookups and downloads based on content. + +### Serialized R Objects (Intermediate Results) +Stored with hash-based filenames (content-addressable storage) for efficient deduplication. These intermediate objects are serialized as QS files (`.qs`) and referenced by content hash on the release page. The targets workflow automatically manages hash lookups and downloads based on content. + + +## How the Workflow Uses These Objects + +### Prime Mode (Full Processing) +When running on the analysis server (`run_mode = "prime"`), the workflow: +1. **Retrieves** objects from this release using the `tar_github_release_repo()` backend +2. **Caches locally** in `data/target_outputs/.tar_cache/` for speed +3. **Recomputes** targets only if: + - Source code has changed + - Input data has changed + - Objects are manually invalidated with `tar_invalidate()` +4. **Uploads** new/modified targets back to this release + +### Update Mode (GitHub Actions) +When running on GitHub Actions (`run_mode = "update"`), the workflow: +1. **Retrieves** all cached objects from this release +2. **Never recomputes** (cue mode = "never") to save CI/CD time +3. **Uses cached objects** for downstream operations only +4. **Skips** expensive computations (elevation API calls, climate downloads) unless manually invalidated + +This separation allows: +- **Local development** with full control and recomputation +- **Efficient CI/CD** that leverages pre-computed intermediate results +- **Reproducibility** by pinning exact object versions in the release + +## File Formats & Storage + +### Spatial Files (NetCDF) +Published with human-readable filenames on the release: +- `.nc` files are CF-1.8 compliant netCDF4 format +- Include geospatial metadata (CRS, bounds, variable attributes) +- Can be read with standard tools (GDAL, xarray, R terra/ncdf4) + +### Serialized Objects (QS Format) +Stored with hash-based filenames (content-addressable storage): +- `.qs` files are R object serializations (fast, lossless) +- Filenames are SHA-256 hashes of content +- Hash naming enables deduplication: identical objects share one file +- Managed transparently by targets—humans don't interact with hashes directly +- Only the workflow's metadata tracks which hash corresponds to which target + +## When Objects Are Updated + +Objects in this release are regenerated and pushed automatically when: +1. Running `tar_make()` on the analysis server with changes to: + - R functions in `R/` folder + - Data download URLs or APIs + - Target definitions in `_targets.R` +2. Manual `tar_make(targets = "target_name")` calls +3. Scheduled workflows or CI/CD pipelines + +## Accessing Objects + +### Automatic (Preferred) +Objects are automatically retrieved by `tar_load()` and `tar_read()`: +```r +tar_load(elevation) # Loads from cache or downloads from release +``` + +### Manual Download +To download specific objects manually: +```bash +gh release download objects_current --dir data/target_outputs +``` + +## Cache Management + +The local cache in `data/target_outputs/.tar_cache/` can be cleared to force re-downloads: +```r +unlink("data/target_outputs/.tar_cache", recursive = TRUE) +tar_make() # Will re-download from release +``` + +## Hash-to-File Mapping + +The targets metadata stores the relationship between hash-based filenames and human-readable target names. To view this mapping: + +```r +# Show all targets with their store information +tar_manifest() %>% + select(name, type, path, repository) %>% + filter(!is.na(path)) # Only file-based targets +``` + +This shows: +- **name**: Target name (e.g., `domain.parquet`, `elevation`) +- **type**: Object type (e.g., "file", "qs") +- **path**: Output file path (for file targets like NetCDF) +- **repository**: Storage location (gh_repo for GitHub release objects) + +For serialized R objects without human-readable filenames, the mapping is stored in `_targets/meta/objects/` as metadata files that track content hashes. + +## Troubleshooting + +**Objects not loading?** +- Check GitHub credentials: `gitcreds::gitcreds_set()` +- Verify network connectivity +- Clear cache and retry: `unlink("data/target_outputs/.tar_cache", recursive = TRUE)` + +**Out-of-sync objects?** +- Invalidate and recompute: `tar_invalidate(target_name)` +- Rebuild all: `tar_destroy(); tar_make()` + +**Need to recompute everything?** +```r +unlink("_targets", recursive = TRUE) # Clear all metadata +unlink("data/target_outputs/.tar_cache", recursive = TRUE) # Clear cache +tar_make() # Recompute all targets +``` + +## Related Files + +- [`_targets.R`](https://github.com/AdamWilsonLab/emma_envdata/blob/main/_targets.R) - Workflow pipeline definition +- [`R/`](https://github.com/AdamWilsonLab/emma_envdata/tree/main/R) - R functions that generate these objects +- [DESCRIPTION](https://github.com/AdamWilsonLab/emma_envdata/blob/main/DESCRIPTION) - Package dependencies diff --git a/R/appeears_auth.R b/R/appeears_auth.R new file mode 100644 index 00000000..2ec66a98 --- /dev/null +++ b/R/appeears_auth.R @@ -0,0 +1,42 @@ +library(appeears) + +# AppEEARS authentication via keyring (no .netrc) +earthdata_user <- Sys.getenv("EARTHDATA_USER") +earthdata_pass <- Sys.getenv("EARTHDATA_PASSWORD") + +if (earthdata_user != "" && earthdata_pass != "") { + message("Setting up NASA EarthData authentication (keyring file backend)") + + # Configure file keyring backend and location + if (Sys.getenv("R_KEYRING_PASSWORD") == "") { + Sys.setenv(R_KEYRING_PASSWORD = earthdata_pass) + } + if (Sys.getenv("R_KEYRING_FILE") == "") { + Sys.setenv(R_KEYRING_FILE = path.expand("~/.config/r-keyring/appeears.keyring")) + } + options(keyring_backend = "file") + suppressWarnings(dir.create(dirname(Sys.getenv("R_KEYRING_FILE")), recursive = TRUE, showWarnings = FALSE)) + + kr_name <- "appeears" + kr_pwd <- Sys.getenv("R_KEYRING_PASSWORD") + + # Create keyring only if missing + existing_kr <- tryCatch(keyring::keyring_list()$keyring, error = function(e) character(0)) + if (!(kr_name %in% existing_kr)) { + keyring::keyring_create(kr_name, password = kr_pwd) + } + + # Unlock if locked (non-interactive using env password) + if (keyring::keyring_is_locked(kr_name)) { + keyring::keyring_unlock(kr_name, password = kr_pwd) + } + + # Store credentials for appeears token refresh + suppressMessages(appeears::rs_set_key(user = earthdata_user, password = earthdata_pass)) + + # Authenticate (reads from keyring) + rstoken <- appeears::rs_login(earthdata_user) + message("AppEEARS authentication configured") +} else { + warning("EARTHDATA credentials not found. Set EARTHDATA_USER and EARTHDATA_PASSWORD environment variables.") +} diff --git a/R/ccr_startup.sh b/R/ccr_startup.sh new file mode 100644 index 00000000..6a187c46 --- /dev/null +++ b/R/ccr_startup.sh @@ -0,0 +1,29 @@ +#!/bin/bash + + +## Script to launch an interactive Apptainer session on CCR + +ssh vortex.ccr.buffalo.edu +salloc --cluster=faculty --qos=adamw --partition=adamw \ + --job-name=InteractiveJob --nodes=1 --ntasks=4 \ + --mem=10G -C INTEL --time=24:00:00 + + +export GROUP="adamw" +export PROJECT_FOLDER="/projects/academic/"$GROUP +export APPTAINER_CACHEDIR="/vscratch/grp-adamw/"$USER"/singularity" +export SIF_PATH=$PROJECT_FOLDER"/users/"$USER"/singularity" +export SIF_FILE="AdamWilsonLab-emma_docker-latest.sif" + +# set singularity cache and tmp directories to the same as apptainer +# needed because CCR is still using singularity and it will use these directories +export SINGULARITY_CACHEDIR=$APPTAINER_CACHEDIR +export SINGULARITY_TMPDIR=$APPTAINER_TMPDIR +export SINGULARITY_LOCALCACHEDIR=$APPTAINER_LOCALCACHEDIR + + +apptainer run \ + --bind $PROJECT_FOLDER:$PROJECT_FOLDER \ + --bind $APPTAINER_CACHEDIR/tmp:/tmp \ + --bind $APPTAINER_CACHEDIR/run:/run \ + $SIF_PATH/$SIF_FILE R diff --git a/R/data_chelsa.R b/R/data_chelsa.R new file mode 100644 index 00000000..8a5bbbb6 --- /dev/null +++ b/R/data_chelsa.R @@ -0,0 +1,184 @@ +#R script to download climate data (CHELSA) + +library(terra) +library(ncdf4) + +#' @author Brian Maitner & Adam Wilson +#' @description This function will download CHELSA climate data if it isn't present, and (invisibly) return a NULL if it is present +#' @param temp_directory Where to save the files, defaults to "data/raw_data/climate_chelsa/" +#' @param domain domain (sf polygon) used for masking +#' @param tag Tag for the release +#' @import terra +get_chelsa <- function(temp_directory = "data/temp/raw_data/climate_chelsa/", + tag = "raw_static", + domain){ + + #ensure temp directory is empty + + if(dir.exists(temp_directory)){ + unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) + } + + #make a directory if one doesn't exist yet + + if(!dir.exists(temp_directory)){ + dir.create(temp_directory,recursive = TRUE) + } + + + #Make sure there is a release by attempting to create one. If it already exists, this will fail + + tryCatch(expr = pb_new_release(repo = "AdamWilsonLab/emma_envdata", + tag = tag), + error = function(e){message("Previous release found")}) + + #Adjust the download timeout duration (this needs to be large enough to allow the download to complete) + + if(getOption('timeout') < 1000){ + options(timeout = 1000) + } + + + #Transform domain to wgs84 to get the coordinates + + # domain_extent <- + # domain %>% + # st_transform(crs("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")@projargs)%>% + # extent() + + domain_tf <- + domain %>% + st_as_sf() %>% + sf::st_transform(crs("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")) + + # Download the data + # Note that it would be useful to clip these to a polygon to save space + # It would also be useful if only the relevant data could be downloaded (rather than downloading and THEN pruning) + + # CF-compliant metadata for CHELSA bioclimatic variables + bio_metadata <- tribble( + ~bio_name, ~long_name, ~units, + "bio01", "Annual Mean Temperature", "°C * 10", + "bio02", "Mean Diurnal Range", "°C * 10", + "bio03", "Isothermality", "%", + "bio04", "Temperature Seasonality", "°C * 10", + "bio05", "Max Temperature of Warmest Month", "°C * 10", + "bio06", "Min Temperature of Coldest Month", "°C * 10", + "bio07", "Temperature Annual Range", "°C * 10", + "bio08", "Mean Temperature of Wettest Quarter", "°C * 10", + "bio09", "Mean Temperature of Driest Quarter", "°C * 10", + "bio10", "Mean Temperature of Warmest Quarter", "°C * 10", + "bio11", "Mean Temperature of Coldest Quarter", "°C * 10", + "bio12", "Annual Precipitation", "mm", + "bio13", "Precipitation of Wettest Month", "mm", + "bio14", "Precipitation of Driest Month", "mm", + "bio15", "Precipitation Seasonality", "%", + "bio16", "Precipitation of Wettest Quarter", "mm", + "bio17", "Precipitation of Driest Quarter", "mm", + "bio18", "Precipitation of Warmest Quarter", "mm", + "bio19", "Precipitation of Coldest Quarter", "mm" + ) + + # Record download date + download_date <- Sys.Date() + + for(idx in 1:nrow(bio_metadata)){ + i <- bio_metadata$bio_name[idx] + +# Download the file + robust_download_file(url = paste("https://os.unil.cloud.switch.ch/chelsa02/chelsa/global/bioclim/",i,"/1981-2010/CHELSA_bio",sprintf("%02d", idx),"_1981-2010_V.2.1.tif",sep = ""), + destfile = file.path(temp_directory,paste("CHELSA_bio",sprintf("%02d", idx),"_1981-2010_V.2.1.tif",sep = "")), + max_attempts = 10, + sleep_time = 10 + ) + + # load + rast_i <- terra::rast(file.path(temp_directory,paste("CHELSA_bio",sprintf("%02d", idx),"_1981-2010_V.2.1.tif",sep = ""))) + + # crop + + rast_i <- terra::crop(x = rast_i, + y = ext(domain_tf)) + + # mask + rast_i <- + terra::mask(rast_i, + mask = terra::vect(domain_tf)) + + # Write as NetCDF with CF-compliant metadata + nc_filename <- file.path(temp_directory, paste("CHELSA_", i, "_1981-2010_V.2.1.nc", sep = "")) + + # Use terra's writeCDF function which creates NetCDF4 files + terra::writeCDF(x = rast_i, + filename = nc_filename, + overwrite = TRUE, + compression = 9) + + # Add CF-compliant metadata using ncdf4 package + nc_file <- ncdf4::nc_open(nc_filename, write = TRUE) + + # Get variable name (should be the first variable in the file) + var_name <- names(rast_i) + if (is.null(var_name) || var_name == "") { + var_name <- i + } + + # Get metadata for this bioclimatic variable + long_name <- bio_metadata$long_name[idx] + units <- bio_metadata$units[idx] + + # Add global attributes + ncdf4::ncatt_put(nc_file, 0, "title", + paste("CHELSA Bioclimatic Variable", i, sep = " ")) + ncdf4::ncatt_put(nc_file, 0, "source", "CHELSA v.2.1 (Climatologies at high resolution for the earth land areas)") + ncdf4::ncatt_put(nc_file, 0, "dataset_url", "https://chelsa-climate.org/") + ncdf4::ncatt_put(nc_file, 0, "download_date", as.character(download_date)) + ncdf4::ncatt_put(nc_file, 0, "temporal_range", "1981-2010") + ncdf4::ncatt_put(nc_file, 0, "Conventions", "CF-1.8") + ncdf4::ncatt_put(nc_file, 0, "history", + paste("Downloaded on", as.character(download_date), + "and clipped to domain. Processed using terra and ncdf4 R packages. ")) + + # Add variable attributes (long_name and units) + ncdf4::ncatt_put(nc_file, 1, "long_name", long_name) + ncdf4::ncatt_put(nc_file, 1, "units", units) + ncdf4::ncatt_put(nc_file, 1, "standard_name", paste("bioclimatic_variable_", i, sep = "")) + + ncdf4::nc_close(nc_file) + + rm(rast_i) + + } + + rm(i) + + # release + to_release <- + list.files(path = file.path(temp_directory), + recursive = TRUE, + full.names = TRUE) + + + to_release <- + to_release[grepl(pattern = "CHELSA", + ignore.case = TRUE, + x = basename(to_release))] + + # Filter for NetCDF files only + to_release <- to_release[grepl(pattern = "\\.nc$", x = to_release)] + + # pb_upload(repo = "AdamWilsonLab/emma_envdata", + # file = to_release, + # tag = tag) + + # delete directory and contents + # unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) + + + + message("CHELSA climate files downloaded") + return(Sys.Date()) + + +} # end fx + diff --git a/R/data_vegmap.R b/R/data_vegmap.R new file mode 100644 index 00000000..f4028f9a --- /dev/null +++ b/R/data_vegmap.R @@ -0,0 +1,167 @@ +## Process Vegmap to add field related to biome type + +data_vegmap <- function(domain_raster, + vegmap_shp, + disagg_factor = 10, + out_file = "data/raw/vegmap.nc") { + + # Load domain raster (may be passed as file path or raster object) + domain <- if (is.character(domain_raster)) { + rast(domain_raster, "domain") + } else { + domain_raster + } + + # Load and prep vegmap + vegmap_sf <- st_read(vegmap_shp, quiet = TRUE) %>% + janitor::clean_names() %>% + st_make_valid() %>% + st_transform(st_crs(domain, proj = TRUE)) %>% + st_intersection(st_as_sfc(st_bbox(domain))) |> #crop to domain + mutate(t_vegtypeid = as.numeric(factor(t_mapcode))) #create numeric vegtype ID + + # Create fine template to reduce sliver effects, then modal aggregate back + template_fine <- disagg(domain, disagg_factor) + + rasterize_modal <- function(field_name) { + r_fine <- terra::rasterize( + x = vect(vegmap_sf), + y = template_fine, + field = field_name, + touches = TRUE + ) + aggregated <- terra::aggregate(r_fine, disagg_factor, fun = "modal") + # Resample to exactly match domain grid (nearest neighbor for categorical) + terra::resample(aggregated, domain, method = "near") + } + + biome_raster <- rasterize_modal("t_biomeid") + bioregion_raster <- rasterize_modal("t_brgnid") + vegtype_raster <- rasterize_modal("t_vegtypeid") + + # Combine into multiband raster + multiband <- c(biome_raster, bioregion_raster, vegtype_raster) + names(multiband) <- c("vegbiome", "vegbioregion", "vegtype") + + # Mask to domain (set to NA where domain is NA) + domain_mask <- !is.na(domain) + multiband <- terra::mask(multiband, domain_mask, maskvalues = 0) + + # Set units (preserved through cache with terra_preserve_metadata = "zip") + units(multiband) <- c("dimensionless", "dimensionless", "dimensionless") + + # Lookup table for IDs -> names + lookup_tbl <- vegmap_sf %>% + st_drop_geometry() %>% + dplyr::select(t_biomeid, t_brgnid, t_vegtypeid, t_mapcode, t_name, t_biome, t_bioregio) %>% + dplyr::rename(vegbiome = t_biomeid, vegbioregion = t_brgnid, vegtype = t_vegtypeid) %>% + dplyr::distinct() + + # Create output file path (ensure directory exists) + output_file <- out_file + dir.create(dirname(output_file), recursive = TRUE, showWarnings = FALSE) + + # Get spatial extent and resolution for dimensions + ext <- ext(multiband) + dx <- res(multiband)[1] + dy <- res(multiband)[2] + + x_vals <- seq(ext$xmin + dx/2, ext$xmax - dx/2, by = dx) + y_vals <- seq(ext$ymax - dy/2, ext$ymin + dy/2, by = -dy) + + # Define dimensions with coordinate vectors + dim_x <- ncdf4::ncdim_def(name = "easting", units = "meter", vals = x_vals, longname = "easting") + dim_y <- ncdf4::ncdim_def(name = "northing", units = "meter", vals = y_vals, longname = "northing") + + # Define variables with compression level 9 for categorical data (storage as short integers) + var_biome <- ncdf4::ncvar_def( + name = "vegbiome", + units = "dimensionless", + dim = list(dim_x, dim_y), + longname = "Biome ID (biomeid_18)", + missval = -32768, + prec = "short", + compression = 9 + ) + + var_bioregion <- ncdf4::ncvar_def( + name = "vegbioregion", + units = "dimensionless", + dim = list(dim_x, dim_y), + longname = "Bioregion ID (brgnid_18)", + missval = -32768, + prec = "short", + compression = 9 + ) + + var_vegtype <- ncdf4::ncvar_def( + name = "vegtype", + units = "dimensionless", + dim = list(dim_x, dim_y), + longname = "Vegetation type code (mapcode18)", + missval = -32768, + prec = "short", + compression = 9 + ) + + # Create NetCDF file with all variables + unlink(output_file) + nc <- ncdf4::nc_create( + filename = output_file, + vars = list(var_biome, var_bioregion, var_vegtype), + force_v4 = TRUE + ) + + # Convert rasters to matrices, transpose to match dimension order, replace NAs with fill values + biome_matrix <- t(as.matrix(biome_raster, wide = TRUE)) + biome_matrix <- as.integer(biome_matrix) + biome_matrix[is.na(biome_matrix)] <- -32768 + + bioregion_matrix <- t(as.matrix(bioregion_raster, wide = TRUE)) + bioregion_matrix <- as.integer(bioregion_matrix) + bioregion_matrix[is.na(bioregion_matrix)] <- -32768 + + vegtype_matrix <- t(as.matrix(vegtype_raster, wide = TRUE)) + vegtype_matrix <- as.integer(vegtype_matrix) + vegtype_matrix[is.na(vegtype_matrix)] <- -32768 + + # Write data to variables + ncdf4::ncvar_put(nc, var_biome, biome_matrix) + ncdf4::ncvar_put(nc, var_bioregion, bioregion_matrix) + ncdf4::ncvar_put(nc, var_vegtype, vegtype_matrix) + + # Add global attributes + ncdf4::ncatt_put(nc, 0, "title", "Vegetation Map - Biome, Bioregion, and Vegetation Type") + ncdf4::ncatt_put(nc, 0, "source", "South Africa National Vegetation Map 2024") + ncdf4::ncatt_put(nc, 0, "history", paste0("created: ", Sys.time())) + ncdf4::ncatt_put(nc, 0, "crs", as.character(crs(multiband))) + ncdf4::ncatt_put(nc, 0, "Conventions", "CF-1.8") + ncdf4::ncatt_put(nc, 0, "lookup_table_json", jsonlite::toJSON(lookup_tbl, dataframe = "rows", auto_unbox = TRUE)) + + # Add CRS variable for CF compliance and GIS compatibility + crs_var <- ncdf4::ncvar_def("crs", "", list(), prec = "integer") + nc <- ncdf4::ncvar_add(nc, crs_var) + + crs_wkt <- as.character(crs(multiband)) +# ncdf4::ncatt_put(nc, "crs", "grid_mapping_name", "albers_conical_equal_area") + ncdf4::ncatt_put(nc, "crs", "crs_wkt", crs_wkt) + ncdf4::ncatt_put(nc, "crs", "spatial_ref", crs_wkt) + + # Add geotransform for GDAL compatibility + ncdf4::ncatt_put(nc, "crs", "GeoTransform", paste(ext$xmin, dx, 0, ext$ymax, 0, -dy)) + + # Add grid_mapping to data variables + ncdf4::ncatt_put(nc, "vegbiome", "grid_mapping", "crs") + ncdf4::ncatt_put(nc, "vegbioregion", "grid_mapping", "crs") + ncdf4::ncatt_put(nc, "vegtype", "grid_mapping", "crs") + + # Close file + ncdf4::nc_close(nc) + + return(output_file) +} + +if(F){ + test=rast(output_file) + plot(test) +} \ No newline at end of file diff --git a/R/domain_bbox.R b/R/domain_bbox.R new file mode 100644 index 00000000..ff64d241 --- /dev/null +++ b/R/domain_bbox.R @@ -0,0 +1,34 @@ +# Create buffered domain bounding box and write GeoParquet + +#' Create a buffered bounding box around the domain +#' +#' @param domain_parquet Path to domain polygon GeoParquet (output of domain_define). +#' @param buffer_m Numeric buffer distance in meters applied to the bbox (default 50 km). +#' @param out_file Output GeoParquet path (default data/raw/domain_bbox.parquet). +#' @return Character path to the written GeoParquet file. +#' @details Reads the domain polygon, builds its bounding box, converts to sf, buffers, and writes to GeoParquet. +make_domain_bbox <- function(domain_parquet, buffer_m = 50000, out_file = "data/target_outputs/domain_bbox.parquet") { + domain_sf <- sfarrow::st_read_parquet(domain_parquet) + bbox_geom <- domain_sf |> sf::st_bbox() |> sf::st_as_sfc() |> sf::st_buffer(buffer_m) + bbox_sf <- sf::st_as_sf(bbox_geom) + + # Ensure directory exists + dir.create(dirname(out_file), recursive = TRUE, showWarnings = FALSE) + + # Try writing with sfarrow, fall back to sf::st_write if needed + tryCatch({ + sfarrow::st_write_parquet(bbox_sf, out_file) + message("[domain_bbox] Wrote with sfarrow: ", out_file) + }, error = function(e) { + message("[domain_bbox] sfarrow failed, trying sf::st_write: ", conditionMessage(e)) + sf::st_write(bbox_sf, out_file, quiet = TRUE, delete_dsn = TRUE) + }) + + # Verify file exists + if (!file.exists(out_file)) { + stop("[domain_bbox] Failed to create output file: ", out_file) + } + + message("[domain_bbox] File created: ", out_file, " (", file.size(out_file), " bytes)") + out_file +} diff --git a/R/domain_define.R b/R/domain_define.R index 44659341..93c5010d 100644 --- a/R/domain_define.R +++ b/R/domain_define.R @@ -1,54 +1,46 @@ -# Make Domain +# Define buffered project domain #' @author Adam M. Wilson +#' @description Build a smoothed, buffered domain polygon from the 2018 vegetation map and country boundary, then write it to GeoParquet. +#' @param vegmap_shp Path to the vegetation map shapefile (e.g., VEGMAP2018). +#' @param country Path to the country boundary GeoParquet file. +#' @return Character path to the written GeoParquet file (`data/raw/domain.parquet`). +#' @details Filters to target biomes, unions polygons, simplifies (500 m), buffers (50 km), smooths (ksmooth, smoothness=120), intersects with country, and writes to GeoParquet. -# Process 2018 Vegetation dataset to define project domain +domain_define <- function(vegmap_shp, country){ - -#' @param vegmap is the domains of interest from the 2018 national vegetation map -#' @param vegmap_shp is the path to the 2018 national vegetation map - used to get national boundary -#' @param buffer size of domain buffer (in m) - -domain_define <- function(vegmap, country){ + # Always read country from a parquet path + if (!is.character(country)) { + stop("country must be a path to a GeoParquet file") + } + country <- sfarrow::st_read_parquet(country) biomes = c("Fynbos")#,"Succulent Karoo")#,"Albany Thicket") - vegmap_union=vegmap %>% - filter(biome_18 %in% biomes ) %>% #filter to list above + vegmap_union=st_read(vegmap_shp) %>% + janitor::clean_names() %>% + filter(t_biome %in% biomes ) %>% #filter to list above st_union() # union all polygons into one multipolygon, dissolving internal boundaries - - #buffer domain biomes - vegmap_buffer= vegmap_union %>% - st_simplify(dTolerance=500) %>% - st_buffer(50000) %>% - st_simplify(dTolerance=100) - - - - + +vegmap_buffer = vegmap_union %>% + st_simplify(dTolerance=500) %>% + st_buffer(50000) %>% + smooth(method="ksmooth",smoothness=120) #%>% + +country= st_as_sf(country) %>% + st_transform(crs=st_crs(vegmap_buffer)) + domain <- vegmap_buffer %>% - st_intersection(st_transform(country,crs=st_crs(vegmap))) %>% #only keep land areas of buffer - no ocean + st_intersection(st_transform(country,crs=st_crs(vegmap_union))) %>% #only keep land areas of buffer - no ocean st_as_sf() %>% mutate(domain=1) - #Delete file if it exists (this should be handled by the line below, but that seems to fail on github) - if(file.exists("data/domain.gpkg")){file.remove("data/domain.gpkg")} - - # save the files - st_write(domain,dsn="data/domain.gpkg", append = F, delete_layer = TRUE)# overwrite layer if it exists (caused an error in targets) - - #release the domain - piggyback::pb_upload(file = "data/domain.gpkg", - repo = "AdamWilsonLab/emma_envdata", - tag = "raw_static", - overwrite = TRUE) - - return(domain) - -} - - - + # Write to GeoParquet + out_file <- "data/raw/domain.parquet" + sfarrow::st_write_parquet(domain, out_file) + + return(out_file) +} \ No newline at end of file diff --git a/R/domain_define_bioscape.R b/R/domain_define_bioscape.R new file mode 100644 index 00000000..0f05139f --- /dev/null +++ b/R/domain_define_bioscape.R @@ -0,0 +1,52 @@ +# Make Domain + +#' @author Adam M. Wilson + +# Process 2018 Vegetation dataset to define project domain + + +#' @param vegmap is the domains of interest from the 2018 national vegetation map +#' @param vegmap_shp is the path to the 2018 national vegetation map - used to get national boundary +#' @param buffer size of domain buffer (in m) + +domain_define <- function(vegmap, country){ + + require(smoothr) + + biomes = c("Fynbos")#,"Succulent Karoo")#,"Albany Thicket") + + + vegmap_union=vegmap %>% + filter(biome_18 %in% biomes ) %>% #filter to list above + st_union() # union all polygons into one multipolygon, dissolving internal boundaries + + #buffer domain biomes + vegmap_buffer= vegmap_union %>% + st_simplify(dTolerance=500) %>% + st_buffer(set_units(set_units(100,km),m)) #%>% + +# v2<- vegmap_buffer %>% +# smooth(method = "ksmooth",smoothness=25) +# +# plot(vegmap_union); plot(v2,add=T) + + domain <- + vegmap_buffer %>% + smooth(method = "ksmooth",smoothness=50) %>% +# st_intersection(st_transform(country,crs=st_crs(vegmap))) %>% #only keep land areas of buffer - no ocean + st_as_sf() %>% + mutate(domain=1) %>% + st_make_valid() %>% + st_transform(4326) + + # save the files + st_write(domain,dsn="data/bioscape_domain.gpkg",append=F) + file.remove("data/bioscape_domain.geojson"); st_write(domain,dsn="data/bioscape_domain.geojson",append=F) + + return(domain) + +} + + + + diff --git a/R/domain_rasterize.R b/R/domain_rasterize.R index 862c3e15..842a4274 100644 --- a/R/domain_rasterize.R +++ b/R/domain_rasterize.R @@ -1,28 +1,198 @@ -# Rasterize Domain +# Rasterize Domain and Remnants +#' @title Rasterize domain with pixel IDs, remnants, and distance to remnants #' @author Adam M. Wilson +#' @description Creates a multivariate NetCDF file with four variables: domain mask, pixel IDs, remnant indicators, and distance to nearest remnant. Each variable is written separately with maximum compression and CF-1.8 compliant metadata. +#' @param domain sf or SpatVector object defining the study area (typically from domain_define). +#' @param remnants_shp Path to remnant vegetation shapefile. +#' @param dx Numeric x-resolution in CRS units (default 250 m). +#' @param dy Numeric y-resolution in CRS units (default 250 m). +#' @param out_file Character path for output NetCDF file (default "data/raw/domain.nc"). +#' @return Character path to the written NetCDF file. +#' @details Generates a raster template from domain bounding box, rasterizes domain and remnants, computes pixel IDs (sequential within domain) and Euclidean distance to nearest remnant (in km). Writes four variables (domain, pid, remnants, remnants_distance) to NetCDF with FORMAT=NC4, COMPRESS=DEFLATE, ZLEVEL=9, SHUFFLE=YES. Adds CF-compliant metadata via ncdf4 including long_name, units, CRS, history, and Conventions attributes. -# Rasterize domain to common grid to define the raster domain +domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file = "data/raw/domain.nc") { -#' @param domain vector file of study domain -#' @param dx x resolution -#' @param dy y resolution + # Generate raster template and rasterize domain with terra (touches = TRUE) + domain_template <- rast(st_as_stars(st_bbox(domain), dx = dx, dy = dy)) -domain_rasterize <- function(domain,dx = 500, dy = 500){ + domain_raster <- domain %>% + st_as_sf() %>% + mutate(domain = 1) %>% + vect() %>% + terra::rasterize( + x = ., + y = domain_template, + field = "domain", + touches = TRUE + ) + + # Ensure pixels outside domain are NA (not 0) + domain_raster[domain_raster == 0] <- NA - # generate raster version of domain - domain_template=st_as_stars(st_bbox(domain), dx = dx, dy = dy) - domain_raster <- domain %>% - dplyr::select(biomeid_18) %>% - st_rasterize(template = domain_template) +## Process remnants to add fields related to whether the cell is in a remnant and distance to remnant - domain_raster - #writeRaster(domain_raster,file="data/domain.tif") +# Load remnants file + remnants <- st_read(remnants_shp) %>% + janitor::clean_names() %>% + st_transform(crs = crs(domain)) %>% + st_crop(st_as_sfc(st_bbox(domain))) #crop to domain box +# st_union() %>% +# st_make_valid() -} + remnants_raster <- remnants %>% + st_as_sf() |> + mutate(remnant=1) %>% + vect() %>% + rasterize(x = ., + y = domain_raster, + field = "remnant", + touches = T, + cover = T)|> + terra::mask(mask=domain_raster)*100 #set to NA outside domain and convert to integer + + remnants_distance <- remnants_raster |> + terra::app(fun=function(x) ifelse(is.na(x),0,1)) |> + terra::distance(target=1)|> + terra::mask(mask=domain_raster) #set to NA outside domain + + # Create pixel ID raster: 1:ncell where domain=1, NA elsewhere + pid_raster <- domain_raster + pid_values <- rep(NA, ncell(pid_raster)) + domain_cells <- which(!is.na(values(domain_raster))) + pid_values[domain_cells] <- seq_along(domain_cells) + values(pid_raster) <- pid_values + # Prepare layers and units for per-variable write + layers <- list( + domain = domain_raster, + pid = pid_raster, + remnants = remnants_raster, + remnants_distance = remnants_distance + ) + units(layers$domain) <- "dimensionless" + units(layers$pid) <- "dimensionless" + units(layers$remnants) <- "dimensionless" + units(layers$remnants_distance) <- "meters" + + # Get spatial extent and create dimensions for NetCDF + ext <- ext(domain_raster) + x_vals <- seq(ext$xmin + dx/2, ext$xmax - dx/2, by = dx) + y_vals <- seq(ext$ymax - dy/2, ext$ymin + dy/2, by = -dy) + + # Define dimensions + dim_x <- ncdf4::ncdim_def(name = "easting", units = "meter", vals = x_vals, longname = "easting") + dim_y <- ncdf4::ncdim_def(name = "northing", units = "meter", vals = y_vals, longname = "northing") + + # Define variables with optimal data types and compression + var_domain <- ncdf4::ncvar_def( + name = "domain", + units = "dimensionless", + dim = list(dim_x, dim_y), + longname = "Domain mask (1 = in domain, NA = outside)", + missval = -128, + prec = "byte", + compression = 9 + ) + + var_pid <- ncdf4::ncvar_def( + name = "pid", + units = "dimensionless", + dim = list(dim_x, dim_y), + longname = "Pixel ID for domain grid cells", + missval = -2147483648, + prec = "integer", + compression = 9 + ) + + var_remnants <- ncdf4::ncvar_def( + name = "remnants", + units = "dimensionless", + dim = list(dim_x, dim_y), + longname = "Remnant vegetation proportion (100 = full remnant, 5 = 5% remnant, NA = not remnant)", + missval = -128, + prec = "byte", + compression = 9 + ) + + var_dist <- ncdf4::ncvar_def( + name = "remnants_distance", + units = "meters", + dim = list(dim_x, dim_y), + longname = "Distance to nearest remnant vegetation", + missval = -2147483648, + prec = "integer", + compression = 9 + ) + + # Create NetCDF file with all variables +unlink(out_file) + + nc <- ncdf4::nc_create( + filename = out_file, + vars = list(var_domain, var_pid, var_remnants, var_dist), + force_v4 = TRUE + ) + + # Convert rasters to matrices and replace NAs with fill values + # Note: as.matrix() from terra returns (nrow, ncol), but ncdf4 expects (ncol, nrow) for (x, y) dims + domain_matrix <- t(as.matrix(layers$domain, wide = TRUE)) + domain_matrix[is.na(domain_matrix)] <- -128 + + pid_matrix <- t(as.matrix(layers$pid, wide = TRUE)) + pid_matrix[is.na(pid_matrix)] <- -2147483648 + + remnants_matrix <- t(as.matrix(layers$remnants, wide = TRUE)) + remnants_matrix[is.na(remnants_matrix)] <- -128 + + dist_matrix <- t(as.matrix(layers$remnants_distance, wide = TRUE)) + dist_matrix[is.na(dist_matrix)] <- -2147483648 + + # Write data to variables + ncdf4::ncvar_put(nc, var_domain, domain_matrix) + ncdf4::ncvar_put(nc, var_pid, pid_matrix) + ncdf4::ncvar_put(nc, var_remnants, remnants_matrix) + ncdf4::ncvar_put(nc, var_dist, dist_matrix) + + # Add global attributes + ncdf4::ncatt_put(nc, 0, "title", "Rasterized domain with remnants and distance") + ncdf4::ncatt_put(nc, 0, "history", paste0("created: ", Sys.time())) + ncdf4::ncatt_put(nc, 0, "Conventions", "CF-1.8") + + # Add CRS variable with comprehensive attributes for GIS compatibility + crs_var <- ncdf4::ncvar_def("crs", "", list(), prec = "integer") + nc <- ncdf4::ncvar_add(nc, crs_var) + + # Get CRS as WKT string (most reliable for terra) + crs_wkt <- as.character(crs(domain_raster)) + + # Add CRS attributes + ncdf4::ncatt_put(nc, "crs", "grid_mapping_name", "albers_conical_equal_area") + ncdf4::ncatt_put(nc, "crs", "crs_wkt", crs_wkt) + ncdf4::ncatt_put(nc, "crs", "spatial_ref", crs_wkt) + + # Add geotransform for GDAL compatibility + ext_vals <- ext(domain_raster) + geotransform <- paste(ext_vals$xmin, dx, 0, ext_vals$ymax, 0, -dy) + ncdf4::ncatt_put(nc, "crs", "GeoTransform", geotransform) + + # Add grid_mapping attribute to all data variables + ncdf4::ncatt_put(nc, "domain", "grid_mapping", "crs") + ncdf4::ncatt_put(nc, "pid", "grid_mapping", "crs") + ncdf4::ncatt_put(nc, "remnants", "grid_mapping", "crs") + ncdf4::ncatt_put(nc, "remnants_distance", "grid_mapping", "crs") + + # Close file + ncdf4::nc_close(nc) + + out_file +} +if(F){ +test=rast(out_file) +plot(test$domain) +} \ No newline at end of file diff --git a/R/download_vegmap_release.R b/R/download_vegmap_release.R new file mode 100644 index 00000000..a3648164 --- /dev/null +++ b/R/download_vegmap_release.R @@ -0,0 +1,46 @@ +#' Download vegetation map release and return shapefile path +#' +#' Downloads a zipped vegetation map from a GitHub release using piggyback, +#' unzips it into a local directory, and returns the path to the `.shp` file +#' for use in targets. +#' +#' @param repo character. GitHub repository in "owner/repo" format. +#' @param tag character. Release tag (e.g., "latest" or "v1.0.0"). +#' @param file character. Name of the release asset file to download (e.g., "vegmap.zip"). +#' @param local_dir character. Local directory to store the unzipped files. +#' @param shapefile_name character. Name of the shapefile to return (e.g., "NVM2024Final_IEM5_12_07012025.shp"). +#' +#' @return character. Full path to the shapefile on disk. +#' +#' @details If the shapefile already exists at `local_dir`, no download +#' is performed. Otherwise, the zip file is downloaded via piggyback and extracted. +#' +#' +#' @importFrom piggyback pb_download +#' @importFrom utils unzip +#' @export +download_vegmap_release <- function(repo, tag, file, local_dir, shapefile_name) { + dir.create(local_dir, recursive = TRUE, showWarnings = FALSE) + + # Check if shapefile already exists in the expected location (with shapefile subdirectory) + shp_file_correct <- file.path(local_dir, "shapefile", shapefile_name) + + if (!file.exists(shp_file_correct)) { + message("Downloading vegmap from GitHub release using piggyback...") + piggyback::pb_download( + file = file, + repo = repo, + tag = tag, + dest = local_dir, + overwrite = FALSE + ) + message("Unzipping vegmap...") + list.files(local_dir,recursive = T) + zip_file <- file.path(local_dir, file) + utils::unzip(zip_file, exdir = local_dir) + unlink(zip_file) + } + + # Return the correct path (shapefile is in a subdirectory after extraction) + shp_file_correct +} diff --git a/R/generate_release_manifest.R b/R/generate_release_manifest.R new file mode 100644 index 00000000..7e2bfce7 --- /dev/null +++ b/R/generate_release_manifest.R @@ -0,0 +1,47 @@ +#' Generate a human-readable manifest of all targets for the GitHub release +#' +#' Creates a JSON file mapping target names to descriptions and file hashes +#' from the targets store. Useful for cross-referencing hash-based filenames +#' in the GitHub release with human-readable target names. +#' +#' @return Path to manifest file +#' @export +#' +generate_release_manifest <- function() { + + # Target descriptions + descriptions <- c( + vegmap_shp = "Vegetation map shapefile (from GitHub release vegmap2024)", + remnants_shp = "Vegetation remnants shapefile (manual download)", + capenature_fires_shp = "Fire extent shapefile (manual download)", + country.parquet = "Country boundary geometry (derived from geodata)", + domain.parquet = "Study domain boundary (intersection of vegetation map and country)", + domain_bbox.parquet = "50km-buffered download boundary (locked to prevent re-downloads)", + domain_nc = "Domain raster grid with pixel IDs, remnants, and distance-to-remnants", + vegmap_nc = "Vegetation map rasterized to analysis grid", + climate_chelsa = "CHELSA bioclimatic variables (19 NetCDF files: bio01-bio19)", + elevation_task_id = "AppEEARS task ID for NASADEM elevation download (task submission only)", + elevation = "NASADEM elevation data (resampled to analysis grid, masked to domain)" + ) + + # Build JSON string directly to avoid complex object serialization + json_lines <- c("{", " \"targets\": [") + + for (i in seq_along(descriptions)) { + target_name <- names(descriptions)[i] + description <- descriptions[i] + # Escape quotes in description + description <- gsub('"', '\\"', description, fixed = TRUE) + comma <- if (i < length(descriptions)) "," else "" + json_lines <- c(json_lines, sprintf(' {"name": "%s", "description": "%s"}%s', target_name, description, comma)) + } + + json_lines <- c(json_lines, " ]", "}") + json_manifest <- paste(json_lines, collapse = "\n") + + # Write to file + out_file <- "data/target_outputs/TARGET_MANIFEST.json" + writeLines(json_manifest, con = out_file) + + out_file # Return the file path for targets +} diff --git a/R/get_climate_chelsa.R b/R/get_climate_chelsa.R new file mode 100644 index 00000000..b2f4b83d --- /dev/null +++ b/R/get_climate_chelsa.R @@ -0,0 +1,139 @@ +#' @title Download and process CHELSA climate data +#' @description Downloads CHELSA bioclimatic variables, clips to domain, and writes as NetCDF files +#' @author Brian Maitner & Adam Wilson +#' @param domain domain (sf polygon) used for masking +#' @param temp_directory Temporary working directory for downloads (default: "data/temp/raw_data/climate_chelsa/") +#' @param out_dir Output directory for NetCDF files (default: "data/target_outputs/") +#' @param verbose Logical for progress messages +#' @return Character vector of output NetCDF file paths +#' @import terra +#' @import sf +#' @import ncdf4 + +get_climate_chelsa <- function( + domain, + temp_directory = "data/temp/raw_data/climate_chelsa/", + out_dir = "data/target_outputs/", + verbose = TRUE +) { + + # Ensure temp directory is clean + if (dir.exists(temp_directory)) { + unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) + } + dir.create(temp_directory, recursive = TRUE, showWarnings = FALSE) + dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + + # Adjust download timeout + if (getOption('timeout') < 1000) { + options(timeout = 1000) + } + + # Transform domain to WGS84 + domain_tf <- domain %>% + st_as_sf() %>% + sf::st_transform(crs("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")) + + # CF-compliant metadata for CHELSA bioclimatic variables + bio_metadata <- tribble( + ~bio_name, ~long_name, ~units, + "bio01", "Annual Mean Temperature", "°C * 10", + "bio02", "Mean Diurnal Range", "°C * 10", + "bio03", "Isothermality", "%", + "bio04", "Temperature Seasonality", "°C * 10", + "bio05", "Max Temperature of Warmest Month", "°C * 10", + "bio06", "Min Temperature of Coldest Month", "°C * 10", + "bio07", "Temperature Annual Range", "°C * 10", + "bio08", "Mean Temperature of Wettest Quarter", "°C * 10", + "bio09", "Mean Temperature of Driest Quarter", "°C * 10", + "bio10", "Mean Temperature of Warmest Quarter", "°C * 10", + "bio11", "Mean Temperature of Coldest Quarter", "°C * 10", + "bio12", "Annual Precipitation", "mm", + "bio13", "Precipitation of Wettest Month", "mm", + "bio14", "Precipitation of Driest Month", "mm", + "bio15", "Precipitation Seasonality", "%", + "bio16", "Precipitation of Wettest Quarter", "mm", + "bio17", "Precipitation of Driest Quarter", "mm", + "bio18", "Precipitation of Warmest Quarter", "mm", + "bio19", "Precipitation of Coldest Quarter", "mm" + ) + + # Record download date + download_date <- Sys.Date() + output_files <- character() + + for (idx in 1:nrow(bio_metadata)) { + i <- bio_metadata$bio_name[idx] + + if (verbose) message("Processing ", i, " (", idx, "/", nrow(bio_metadata), ")") + + # Download the file + robust_download_file( + url = paste("https://os.unil.cloud.switch.ch/chelsa02/chelsa/global/bioclim/", i, + "/1981-2010/CHELSA_bio", sprintf("%02d", idx), "_1981-2010_V.2.1.tif", sep = ""), + destfile = file.path(temp_directory, paste("CHELSA_bio", sprintf("%02d", idx), + "_1981-2010_V.2.1.tif", sep = "")), + max_attempts = 10, + sleep_time = 10 + ) + + # Load, crop, and mask + rast_i <- terra::rast(file.path(temp_directory, paste("CHELSA_bio", sprintf("%02d", idx), + "_1981-2010_V.2.1.tif", sep = ""))) + rast_i <- terra::crop(x = rast_i, y = ext(domain_tf)) + rast_i <- terra::mask(rast_i, mask = terra::vect(domain_tf)) + + # Write as NetCDF with CF-compliant metadata + nc_filename <- file.path(out_dir, paste("CHELSA_", i, "_1981-2010_V.2.1.nc", sep = "")) + + terra::writeCDF(x = rast_i, + filename = nc_filename, + overwrite = TRUE, + compression = 9) + + # Add CF-compliant metadata using ncdf4 package + nc_file <- ncdf4::nc_open(nc_filename, write = TRUE) + + # Get variable name + var_name <- names(rast_i) + if (is.null(var_name) || var_name == "") { + var_name <- i + } + + # Get metadata for this bioclimatic variable + long_name <- bio_metadata$long_name[idx] + units <- bio_metadata$units[idx] + + # Add global attributes + ncdf4::ncatt_put(nc_file, 0, "title", + paste("CHELSA Bioclimatic Variable", i, sep = " ")) + ncdf4::ncatt_put(nc_file, 0, "source", "CHELSA v.2.1 (Climatologies at high resolution for the earth land areas)") + ncdf4::ncatt_put(nc_file, 0, "dataset_url", "https://chelsa-climate.org/") + ncdf4::ncatt_put(nc_file, 0, "download_date", as.character(download_date)) + ncdf4::ncatt_put(nc_file, 0, "temporal_range", "1981-2010") + ncdf4::ncatt_put(nc_file, 0, "Conventions", "CF-1.8") + ncdf4::ncatt_put(nc_file, 0, "history", + paste("Downloaded on", as.character(download_date), + "and clipped to domain. Processed using terra and ncdf4 R packages.")) + + # Add variable attributes + ncdf4::ncatt_put(nc_file, 1, "long_name", long_name) + ncdf4::ncatt_put(nc_file, 1, "units", units) + ncdf4::ncatt_put(nc_file, 1, "standard_name", paste("bioclimatic_variable_", i, sep = "")) + + ncdf4::nc_close(nc_file) + output_files <- c(output_files, nc_filename) + + rm(rast_i) + } + + # Cleanup temp directory + unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) + + if (verbose) message("CHELSA climate files processed to: ", out_dir) + + # Return output file paths for targets to track + output_files + +} + diff --git a/R/get_country.R b/R/get_country.R new file mode 100644 index 00000000..fddefaa9 --- /dev/null +++ b/R/get_country.R @@ -0,0 +1,34 @@ +# National Boundary + +#' @author Adam M. Wilson +#' @description Download national boundary file from the UN +#' @source https://data.humdata.org/dataset/cod-ab-zaf + +get_country <- function(){ + + #Adjust timeout to allow for slow internet + if(getOption('timeout') < 1000){ + options(timeout = 1000) + } + + url="https://data.humdata.org/dataset/061d4492-56e8-458c-a3fb-e7950991adf0/resource/37175ff4-41a3-4753-a2c3-ced24142a96c/download/zaf_admin_boundaries.geojson.zip" + tmpfile1=tempfile() + tmpdir1=tempdir() + download.file(url,destfile = tmpfile1) + unzip(tmpfile1,exdir=tmpdir1) + + # Read the converted GeoJSON, union, and convert to sf + country <- st_read(file.path(tmpdir1, "zaf_admin0.geojson"), quiet = TRUE) |> + st_union() |> + st_as_sf() + + # Write to GeoParquet + out_file <- "data/target_outputs/country.parquet" + suppressWarnings(sfarrow::st_write_parquet(country, out_file)) + + return(out_file) +} +# end function + + + diff --git a/R/get_elevation.R b/R/get_elevation.R new file mode 100644 index 00000000..93b4fa2d --- /dev/null +++ b/R/get_elevation.R @@ -0,0 +1,213 @@ +#' @title Submit NASADEM elevation request via AppEEARS +#' @description Submits an AppEEARS area request for NASADEM elevation data +#' over the provided domain polygon. Returns task ID for polling. +#' @author EMMA Team +#' @param domain_vector A SpatVector or sf polygon defining the domain boundary +#' @param verbose Logical for progress messages +#' @return Character string with AppEEARS task ID + +submit_elevation_task <- function( + domain_vector, + verbose = TRUE +) { + + # Convert domain vector to sf, fix geometry, simplify, merge, and reproject to WGS84 (required by AppEEARS) + domain_sf <- st_as_sf(domain_vector) %>% + st_simplify(dTolerance = 100, preserveTopology = TRUE) %>% + st_buffer(0) %>% + st_make_valid() %>% + st_transform(crs = 4326) %>% + geojsonsf::sf_geojson(simplify = FALSE) %>% + jsonlite::fromJSON() + + # Build AppEEARS request with proper structure + req <- list( + task_type = "area", + task_name = paste0("NASADEM_", format(Sys.time(), "%Y%m%d%H%M%S")), + params = list( + dates = list(list( + startDate = "02-11-2000", + endDate = "02-11-2000" + )), + layers = list(list( + product = "SRTMGL3_NC.003", + layer = "SRTMGL3_DEM" + )), + output = list( + format = list(type = "netcdf4"), + projection = "native" + ), + geo = domain_sf + ) + ) + + # Submit task + if (verbose) message("Submitting AppEEARS elevation task...") + task <- appeears::rs_request( + request = req, + user = Sys.getenv("EARTHDATA_USER"), + transfer = FALSE, + verbose = verbose + ) + + task_id <- task$get_task_id() + if (verbose) message("Task submitted with ID: ", task_id) + + task_id +} + + +#' @title Download and process NASADEM elevation from AppEEARS +#' @description Polls for completion of AppEEARS task and downloads results, +#' then resamples elevation to domain grid and writes to NetCDF. +#' @author EMMA Team +#' @param task_id Character string with AppEEARS task ID (from submit_elevation_task) +#' @param domain_vector A SpatVector or sf polygon defining the domain boundary +#' @param domain_raster A SpatRaster (domain.tif) defining the output grid and mask +#' @param out_file Output NetCDF file path +#' @param temp_directory Temporary working directory for downloads +#' @param verbose Logical for progress messages +#' @return Character path to output NetCDF file + +download_elevation_results <- function( + task_id, + domain_vector, + domain_raster, + out_file = "data/target_outputs/elevation_nasadem.nc", + temp_directory = "data/temp/raw_data/elevation_nasadem/", + verbose = TRUE +) { + + # Ensure clean temp directory + unlink(temp_directory, recursive = TRUE, force = TRUE) + dir.create(temp_directory, recursive = TRUE, showWarnings = FALSE) + + # Clean terra temp + terra_tmp <- file.path(getwd(), "data/temp/terra") + unlink(terra_tmp, recursive = TRUE, force = TRUE) + dir.create(terra_tmp, recursive = TRUE, showWarnings = FALSE) + terraOptions(tempdir = terra_tmp, memfrac = 0.8) + + # Reconnect to task and poll for completion + if (verbose) message("Polling task ", task_id, " for completion...") + + # Poll for task completion using rs_list_task + max_retries <- 120 # 2 hours at 60s intervals + retry_count <- 0 + task_status <- "pending" + + repeat { + retry_count <- retry_count + 1 + + # Check task status + task_info <- appeears::rs_list_task(task_id = task_id, user = Sys.getenv("EARTHDATA_USER")) + task_status <- task_info$status + + if (task_status == "done") { + if (verbose) message("Task completed successfully") + break + } + + if (task_status %in% c("failed", "error")) { + stop("AppEEARS task ", task_id, " failed with status: ", task_status) + } + + if (retry_count >= max_retries) { + stop("Task ", task_id, " polling timed out after ", max_retries, " minutes") + } + + if (verbose && retry_count %% 10 == 0) { + message("Task status: ", task_status, " (", retry_count, "/", max_retries, ")") + } + + Sys.sleep(60) + } + + # Download results using rs_transfer + if (verbose) message("Downloading files for task: ", task_id) + appeears::rs_transfer( + task_id = task_id, + user = Sys.getenv("EARTHDATA_USER"), + path = temp_directory, + verbose = verbose + ) + + # Load the NetCDF file + nc_paths <- list.files(temp_directory, pattern = "\\.nc$", full.names = TRUE, recursive = TRUE) + if (length(nc_paths) == 0) { + stop("No NetCDF files downloaded from AppEEARS") + } + + if (verbose) message("Reading elevation data from: ", nc_paths[1]) + elev_raster <- terra::rast(nc_paths[grepl(nc_paths, pattern = "SRTMGL3_NC.003_90m_aid0001.nc")]) + + # Ensure we have a SpatRaster template (accept path or raster) + domain_template <- if (is.character(domain_raster)) terra::rast(domain_raster) else domain_raster + + # Project to domain CRS/grid and mask to domain + if (verbose) message("Projecting elevation to domain CRS/grid") + elev_on_grid <- terra::project(elev_raster, domain_template, method = "average") + + # Mask to domain (NA where domain is NA) + mask_layer <- if ("domain" %in% names(domain_template)) domain_template[["domain"]] else domain_template + elev_masked <- terra::mask(elev_on_grid, mask_layer) + + # Set metadata + names(elev_masked) <- "elevation" + + # Write NetCDF with compression and CF metadata + dir.create(dirname(out_file), recursive = TRUE, showWarnings = FALSE) + unlink(out_file) + + ext_vals <- ext(elev_masked) + dx <- res(elev_masked)[1] + dy <- res(elev_masked)[2] + x_vals <- seq(ext_vals$xmin + dx/2, ext_vals$xmax - dx/2, by = dx) + y_vals <- seq(ext_vals$ymax - dy/2, ext_vals$ymin + dy/2, by = -dy) + + dim_x <- ncdf4::ncdim_def(name = "easting", units = "meter", vals = x_vals, longname = "easting") + dim_y <- ncdf4::ncdim_def(name = "northing", units = "meter", vals = y_vals, longname = "northing") + + var_elev <- ncdf4::ncvar_def( + name = "elevation", + units = "meters", + dim = list(dim_x, dim_y), + longname = "NASADEM elevation above mean sea level", + missval = -3.4e38, + prec = "float", + compression = 9 + ) + + nc <- ncdf4::nc_create(filename = out_file, vars = list(var_elev), force_v4 = TRUE) + + elev_matrix <- t(as.matrix(elev_masked, wide = TRUE)) + elev_matrix[is.na(elev_matrix)] <- -3.4e38 + ncdf4::ncvar_put(nc, var_elev, elev_matrix) + + crs_wkt <- as.character(crs(elev_masked)) + crs_var <- ncdf4::ncvar_def("crs", "", list(), prec = "integer") + nc <- ncdf4::ncvar_add(nc, crs_var) + ncdf4::ncatt_put(nc, "crs", "crs_wkt", crs_wkt) + ncdf4::ncatt_put(nc, "crs", "spatial_ref", crs_wkt) + ncdf4::ncatt_put(nc, "crs", "GeoTransform", paste(ext_vals$xmin, dx, 0, ext_vals$ymax, 0, -dy)) + ncdf4::ncatt_put(nc, "elevation", "grid_mapping", "crs") + + ncdf4::ncatt_put(nc, 0, "title", "NASADEM elevation resampled to domain") + ncdf4::ncatt_put(nc, 0, "source", "NASADEM_HGT.001 via AppEEARS") + ncdf4::ncatt_put(nc, 0, "history", paste0("created: ", Sys.time())) + ncdf4::ncatt_put(nc, 0, "Conventions", "CF-1.8") + + ncdf4::nc_close(nc) + + # Cleanup + unlink(temp_directory, recursive = TRUE, force = TRUE) + gc() + unlink(terra_tmp, recursive = TRUE, force = TRUE) + + if (verbose) message("Elevation data saved to: ", out_file) + out_file +} + + + + diff --git a/R/get_modis_vi.R b/R/get_modis_vi.R new file mode 100644 index 00000000..a7019a74 --- /dev/null +++ b/R/get_modis_vi.R @@ -0,0 +1,262 @@ +#' @title Submit MODIS NDVI and EVI request via AppEEARS +#' @description Submits an AppEEARS area request for MOD13Q1.061 and MYD13Q1.061 NDVI, EVI, and QA +#' (250m resolution, 16-day composite) over the provided domain. In prime mode downloads full history +#' (2000-present), in update mode downloads from last available date to present. +#' @author EMMA Team +#' @param domain_vector A SpatVector or sf polygon defining the domain boundary +#' @param mode Either "prime" (2000-present) or "update" (from last available date to present) +#' @param verbose Logical for progress messages +#' @return Character string with AppEEARS task ID + +submit_modis_vi_task <- function( + domain_vector, + mode = c("prime", "update"), + verbose = TRUE +) { + mode <- match.arg(mode) + + # Convert domain vector to sf, fix geometry, simplify, merge, and reproject to WGS84 (required by AppEEARS) + domain_sf <- st_as_sf(domain_vector) %>% + st_simplify(dTolerance = 100, preserveTopology = TRUE) %>% + st_buffer(0) %>% + st_make_valid() %>% + st_transform(crs = 4326) %>% + geojsonsf::sf_geojson(simplify = FALSE) %>% + jsonlite::fromJSON() + + # Determine date range based on mode + if (mode == "prime") { + start_date <- "2000-02-18" # MODIS Terra start + end_date <- as.character(Sys.Date()) + } else { # update mode + # Check the last date in the historical file + hist_file <- "data/target_outputs/modis_vi_historical.nc" + if (file.exists(hist_file)) { + tryCatch({ + r <- terra::rast(hist_file) + tt <- terra::time(r) + if (!is.null(tt) && length(tt) > 0) { + last_date <- max(as.Date(tt)) + start_date <- as.character(last_date + 1) # Start from next day + end_date <- as.character(Sys.Date()) + } else { + if (verbose) message("Could not extract time from historical file, using default start date") + start_date <- "2000-02-18" + end_date <- as.character(Sys.Date()) + } + }, error = function(e) { + if (verbose) message("Error reading historical file: ", conditionMessage(e), ". Using default start date") + start_date <<- "2000-02-18" + end_date <<- as.character(Sys.Date()) + }) + } else { + if (verbose) message("Historical file not found, defaulting to 2000-02-18") + start_date <- "2000-02-18" + end_date <- as.character(Sys.Date()) + } + } + + if (verbose) message("AppEEARS request (", mode, " mode): ", start_date, " to ", end_date) + + # Resolve layer names dynamically + ndvi_layer <- "250m_16_days_NDVI" + evi_layer <- "250m_16_days_EVI" + qa_layer <- "250m_16_days_VI_Quality" + + try({ + lyr <- appeears::rs_layers("MOD13Q1.061") + cand_cols <- intersect(c("Layer", "Name", "layer", "name"), names(lyr)) + if (length(cand_cols)) { + vals <- unlist(lapply(cand_cols, function(cc) lyr[[cc]])) + ndvi_cand <- vals[grepl("NDVI", vals, ignore.case = TRUE)][1] + evi_cand <- vals[grepl("EVI", vals, ignore.case = TRUE)][1] + qa_cand <- vals[grepl("VI.*Quality|Quality", vals, ignore.case = TRUE)][1] + if (!is.na(ndvi_cand)) ndvi_layer <- ndvi_cand + if (!is.na(evi_cand)) evi_layer <- evi_cand + if (!is.na(qa_cand)) qa_layer <- qa_cand + } + }, silent = TRUE) + + if (verbose) message("Using layers: ", ndvi_layer, ", ", evi_layer, ", ", qa_layer) + + # Build request payload - NDVI, EVI, and QA from both MOD13Q1.061 (Terra) and MYD13Q1.061 (Aqua) in one request + req <- list( + task_type = "area", + task_name = paste0("MODIS_VI_", mode, "_", format(Sys.time(), "%Y%m%d%H%M%S")), + params = list( + dates = list(list( + startDate = format(as.Date(start_date), "%m-%d-%Y"), + endDate = format(as.Date(end_date), "%m-%d-%Y") + )), + layers = list( + # MOD13Q1.061 (Terra) + list(product = "MOD13Q1.061", layer = ndvi_layer), + list(product = "MOD13Q1.061", layer = evi_layer), + list(product = "MOD13Q1.061", layer = qa_layer), + # MYD13Q1.061 (Aqua) + list(product = "MYD13Q1.061", layer = ndvi_layer), + list(product = "MYD13Q1.061", layer = evi_layer), + list(product = "MYD13Q1.061", layer = qa_layer) + ), + output = list( + format = list(type = "netcdf4"), + projection = "native" + ), + geo = domain_sf + ) + ) + + # Submit task + if (verbose) message("Submitting AppEEARS MODIS VI task...") + task <- appeears::rs_request( + request = req, + user = Sys.getenv("EARTHDATA_USER"), + transfer = FALSE, + verbose = verbose + ) + + task_id <- task$get_task_id() + if (verbose) message("Task submitted with ID: ", task_id) + + task_id +} + + +#' @title Download and process MODIS NDVI and EVI from AppEEARS +#' @description Polls for completion of AppEEARS task and downloads results, +#' then processes into a NetCDF file with NDVI, EVI, and QA variables. +#' In prime mode writes to historical file, in update mode writes to update file. +#' @author EMMA Team +#' @param task_id Character string with AppEEARS task ID (from submit_modis_vi_task) +#' @param domain_vector A SpatVector or sf polygon defining the domain boundary +#' @param domain_raster A SpatRaster (domain.tif) defining the output grid and mask +#' @param mode Either "prime" or "update" +#' @param out_dir Output directory (default: "data/target_outputs") +#' @param temp_directory Temporary working directory for downloads +#' @param verbose Logical for progress messages +#' @return Character path to output NetCDF file + +download_modis_vi_results <- function( + task_id, + domain_vector, + domain_raster, + mode = c("prime", "update"), + out_dir = "data/target_outputs", + temp_directory = "data/temp/raw_data/modis_vi/", + verbose = TRUE +) { + mode <- match.arg(mode) + + # Ensure clean temp directory + unlink(temp_directory, recursive = TRUE, force = TRUE) + dir.create(temp_directory, recursive = TRUE, showWarnings = FALSE) + + # Clean terra temp + terra_tmp <- file.path(getwd(), "data/temp/terra") + unlink(terra_tmp, recursive = TRUE, force = TRUE) + dir.create(terra_tmp, recursive = TRUE, showWarnings = FALSE) + terraOptions(tempdir = terra_tmp, memfrac = 0.8) + + # Reconnect to task and poll for completion + if (verbose) message("Polling task ", task_id, " for completion...") + + max_retries <- 120 # 2 hours at 60s intervals + retry_count <- 0 + task_status <- "pending" + + repeat { + retry_count <- retry_count + 1 + + # Check task status + task_info <- appeears::rs_list_task(task_id = task_id, user = Sys.getenv("EARTHDATA_USER")) + task_status <- task_info$status + + if (task_status == "done") { + if (verbose) message("Task completed successfully") + break + } + + if (task_status %in% c("failed", "error")) { + stop("AppEEARS task ", task_id, " failed with status: ", task_status) + } + + if (retry_count >= max_retries) { + stop("Task ", task_id, " polling timed out after ", max_retries, " minutes") + } + + if (verbose && retry_count %% 10 == 0) { + message("Task status: ", task_status, " (", retry_count, "/", max_retries, ")") + } + + Sys.sleep(60) + } + + # Download results using rs_transfer + if (verbose) message("Downloading files for task: ", task_id) + appeears::rs_transfer( + task_id = task_id, + user = Sys.getenv("EARTHDATA_USER"), + path = temp_directory, + verbose = verbose + ) + + # Load the NetCDF files + nc_paths <- list.files(temp_directory, pattern = "\\.nc$", full.names = TRUE, recursive = TRUE) + if (length(nc_paths) == 0) { + stop("No NetCDF files downloaded from AppEEARS") + } + + if (verbose) message("Reading ", length(nc_paths), " NetCDF files from AppEEARS") + + # Read all layers from the AppEEARS output + raster_stack <- terra::rast(nc_paths) + + # Ensure we have a SpatRaster template (accept path or raster) + domain_template <- if (is.character(domain_raster)) terra::rast(domain_raster) else domain_raster + + # Project to domain CRS/grid and mask to domain + if (verbose) message("Projecting MODIS VI data to domain CRS/grid") + + # Resample each band to domain grid + resampled_stack <- terra::project(raster_stack, domain_template, method = "average") + + # Mask to domain (NA where domain is NA) + mask_layer <- if ("domain" %in% names(domain_template)) domain_template[["domain"]] else domain_template + masked_stack <- terra::mask(resampled_stack, mask_layer) + + # Determine output filename based on mode + dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + if (mode == "prime") { + out_file <- file.path(out_dir, "modis_vi_historical.nc") + } else { + out_file <- file.path(out_dir, "modis_vi_update.nc") + } + + unlink(out_file) + + if (verbose) message("Writing NetCDF: ", out_file) + + # Use terra::writeCDF to write the full stack with metadata + terra::writeCDF( + masked_stack, + filename = out_file, + overwrite = TRUE, + compression = 9 + ) + + # Add global attributes + nc <- ncdf4::nc_open(out_file, write = TRUE) + ncdf4::ncatt_put(nc, 0, "title", paste0("MODIS NDVI and EVI (", mode, " mode) resampled to domain")) + ncdf4::ncatt_put(nc, 0, "source", "MOD13Q1.061 and MYD13Q1.061 (250m, 16-day composite) via AppEEARS") + ncdf4::ncatt_put(nc, 0, "history", paste0("created: ", Sys.time())) + ncdf4::ncatt_put(nc, 0, "Conventions", "CF-1.8") + ncdf4::nc_close(nc) + + # Cleanup + unlink(temp_directory, recursive = TRUE, force = TRUE) + gc() + unlink(terra_tmp, recursive = TRUE, force = TRUE) + + if (verbose) message("MODIS VI data saved to: ", out_file) + out_file +} diff --git a/R/get_release_alos.R b/R/get_release_alos.R deleted file mode 100644 index d3e88137..00000000 --- a/R/get_release_alos.R +++ /dev/null @@ -1,167 +0,0 @@ -#ALOS - -#' @author Brian Maitner - -#make a function to reduce code duplication - -#' @param image_text is the text string used by gee to refer to an image, e.g. "CSP/ERGo/1_0/Global/ALOS_mTPI" -#' @param dir directory to save data in -#' @param domain domain (sf polygon) used for masking -#' @note This code is only designed to work with a handful of images by CSP/ERGo -get_alos_data <- function(image_text, dir, domain, - json_token){ - - #Load the image - - focal_image <- ee$Image(image_text) - - focal_name <- focal_image$getInfo()$properties$visualization_0_name - - focal_name <- tolower(focal_name) - - focal_name <-gsub(pattern = " ", replacement = "_", x = focal_name) - - #Format the domain - domain <- sf_as_ee(x = domain) - domain <- domain$geometry() - - #get CRS - crs <- focal_image$getInfo()$bands[[1]]$crs - - #Download the raster - ee_as_raster(image = focal_image, - region = domain, - #scale = 100, #used to adjust the scale. commenting out uses the default - dsn = file.path(dir,focal_name), - maxPixels = 10000000000, - drive_cred_path = json_token) - - -}# end function - - - -#' @description This function makes use of the previous helper function to download data -#' @param domain domain (sf polygon) used for masking -#' @param temp_directory Where to save the files, defaults to "data/raw_data/alos/" -#' @param tag tag for the release you want the data stored in -get_release_alos <- function(temp_directory = "data/temp/raw_data/alos/", - tag = "raw_static", - domain, - json_token){ - - #make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - dir.create(temp_directory, recursive = TRUE) - } - - - #Make sure there is a release by attempting to create one. If it already exists, this will fail - - tryCatch(expr = pb_new_release(repo = "AdamWilsonLab/emma_envdata", - tag = tag), - error = function(e){message("Previous release found")}) - - - #Initialize earth engine (for targets works better if called here) - - #ee_Initialize() - - # Get files that have been downloaded - - alos_files <- list.files(temp_directory, pattern = ".tif$") - - #Download files that have not previously been downloaded - - # mTPI - if(!length(grep(pattern = "mtpi",x = alos_files)) > 0){ - - get_alos_data(image_text = "CSP/ERGo/1_0/Global/ALOS_mTPI", - dir = temp_directory, - domain = domain, - json_token = json_token) - - } - - # release - pb_upload(repo = "AdamWilsonLab/emma_envdata", - file = file.path(temp_directory,"alos_mtpi.tif"), - tag = tag, - name = "alos_mtpi.tif") - - # delete - file.remove(file.path(temp_directory,"alos_mtpi.tif")) - - - # CHILI - if(!length(grep(pattern = "chili",x = alos_files)) > 0){ - - get_alos_data(image_text = "CSP/ERGo/1_0/Global/ALOS_CHILI", - dir = temp_directory, - domain = domain, - json_token = json_token) - - } - - # release - pb_upload(repo = "AdamWilsonLab/emma_envdata", - file = file.path(temp_directory,"alos_chili.tif"), - tag = tag, - name = "alos_chili.tif") - - # delete - file.remove(file.path(temp_directory,"alos_chili.tif")) - - - # landforms - if(!length(grep(pattern = "landforms",x = alos_files)) > 0){ - get_alos_data(image_text = 'CSP/ERGo/1_0/Global/ALOS_landforms', - dir = temp_directory, - domain = domain, - json_token = json_token) - } - - # release - pb_upload(repo = "AdamWilsonLab/emma_envdata", - file = file.path(temp_directory,"landforms.tif"), - tag = tag, - name = "alos_landforms.tif") - - # delete - file.remove(file.path(temp_directory,"landforms.tif")) - - - # topo diversity - if(!length(grep(pattern = "topographic",x = alos_files)) > 0){ - get_alos_data(image_text = 'CSP/ERGo/1_0/Global/ALOS_topoDiversity', - dir = temp_directory, - domain = domain, - json_token = json_token) - } - - # release - pb_upload(repo = "AdamWilsonLab/emma_envdata", - file = file.path(temp_directory,"alos_topographic_diversity.tif"), - tag = tag, - name = "alos_topodiversity.tif") - - # delete - file.remove(file.path(temp_directory,"alos_topographic_diversity.tif")) - - - # Clean up - unlink(x = file.path(temp_directory), recursive = TRUE) - - - message("Finished downloading ALOS layers") - - - return(tag) - -} - - - -################################## - diff --git a/R/get_release_climate_chelsa.R b/R/get_release_climate_chelsa.R index 23c8d1eb..89b76c59 100644 --- a/R/get_release_climate_chelsa.R +++ b/R/get_release_climate_chelsa.R @@ -1,129 +1,139 @@ -#R script to download climate data (CHELSA) - -library(terra) - -#' @author Brian Maitner -#' @description This function will download CHELSA climate data if it isn't present, and (invisibly) return a NULL if it is present -#' @param temp_directory Where to save the files, defaults to "data/raw_data/climate_chelsa/" +#' @title Download and process CHELSA climate data +#' @description Downloads CHELSA bioclimatic variables, clips to domain, and writes as NetCDF files +#' @author Brian Maitner & Adam Wilson #' @param domain domain (sf polygon) used for masking -#' @param tag Tag for the release +#' @param temp_directory Temporary working directory for downloads (default: "data/temp/raw_data/climate_chelsa/") +#' @param out_dir Output directory for NetCDF files (default: "data/target_outputs/") +#' @param verbose Logical for progress messages +#' @return Character vector of output NetCDF file paths #' @import terra -get_release_climate_chelsa <- function(temp_directory = "data/temp/raw_data/climate_chelsa/", - tag = "raw_static", - domain){ - - #ensure temp directory is empty - - if(dir.exists(temp_directory)){ - unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) - } - - #make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - dir.create(temp_directory,recursive = TRUE) - } - - - #Make sure there is a release by attempting to create one. If it already exists, this will fail - - tryCatch(expr = pb_new_release(repo = "AdamWilsonLab/emma_envdata", - tag = tag), - error = function(e){message("Previous release found")}) +#' @import sf +#' @import ncdf4 + +get_climate_chelsa <- function( + domain, + temp_directory = "data/temp/raw_data/climate_chelsa/", + out_dir = "data/target_outputs/", + verbose = TRUE +) { + + # Ensure temp directory is clean + if (dir.exists(temp_directory)) { + unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) + } + dir.create(temp_directory, recursive = TRUE, showWarnings = FALSE) + dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) - #Adjust the download timeout duration (this needs to be large enough to allow the download to complete) + # Adjust download timeout + if (getOption('timeout') < 1000) { + options(timeout = 1000) + } - if(getOption('timeout') < 1000){ - options(timeout = 1000) + # Transform domain to WGS84 + domain_tf <- domain %>% + st_as_sf() %>% + sf::st_transform(crs("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")) + + # CF-compliant metadata for CHELSA bioclimatic variables + bio_metadata <- tribble( + ~bio_name, ~long_name, ~units, + "bio01", "Annual Mean Temperature", "°C * 10", + "bio02", "Mean Diurnal Range", "°C * 10", + "bio03", "Isothermality", "%", + "bio04", "Temperature Seasonality", "°C * 10", + "bio05", "Max Temperature of Warmest Month", "°C * 10", + "bio06", "Min Temperature of Coldest Month", "°C * 10", + "bio07", "Temperature Annual Range", "°C * 10", + "bio08", "Mean Temperature of Wettest Quarter", "°C * 10", + "bio09", "Mean Temperature of Driest Quarter", "°C * 10", + "bio10", "Mean Temperature of Warmest Quarter", "°C * 10", + "bio11", "Mean Temperature of Coldest Quarter", "°C * 10", + "bio12", "Annual Precipitation", "mm", + "bio13", "Precipitation of Wettest Month", "mm", + "bio14", "Precipitation of Driest Month", "mm", + "bio15", "Precipitation Seasonality", "%", + "bio16", "Precipitation of Wettest Quarter", "mm", + "bio17", "Precipitation of Driest Quarter", "mm", + "bio18", "Precipitation of Warmest Quarter", "mm", + "bio19", "Precipitation of Coldest Quarter", "mm" + ) + + # Record download date + download_date <- Sys.Date() + output_files <- character() + + for (idx in 1:nrow(bio_metadata)) { + i <- bio_metadata$bio_name[idx] + + if (verbose) message("Processing ", i, " (", idx, "/", nrow(bio_metadata), ")") + + # Download the file + robust_download_file( + url = paste("https://os.unil.cloud.switch.ch/chelsa02/chelsa/global/bioclim/", i, + "/1981-2010/CHELSA_bio", sprintf("%02d", idx), "_1981-2010_V.2.1.tif", sep = ""), + destfile = file.path(temp_directory, paste("CHELSA_bio", sprintf("%02d", idx), + "_1981-2010_V.2.1.tif", sep = "")), + max_attempts = 10, + sleep_time = 10 + ) + + # Load, crop, and mask + rast_i <- terra::rast(file.path(temp_directory, paste("CHELSA_bio", sprintf("%02d", idx), + "_1981-2010_V.2.1.tif", sep = ""))) + rast_i <- terra::crop(x = rast_i, y = ext(domain_tf)) + rast_i <- terra::mask(rast_i, mask = terra::vect(domain_tf)) + + # Write as NetCDF with CF-compliant metadata + nc_filename <- file.path(out_dir, paste("CHELSA_", i, "_1981-2010_V.2.1.nc", sep = "")) + + terra::writeCDF(x = rast_i, + filename = nc_filename, + overwrite = TRUE, + compression = 9) + + # Add CF-compliant metadata using ncdf4 package + nc_file <- ncdf4::nc_open(nc_filename, write = TRUE) + + # Get variable name + var_name <- names(rast_i) + if (is.null(var_name) || var_name == "") { + var_name <- i } - - - #Transform domain to wgs84 to get the coordinates - - # domain_extent <- - # domain %>% - # st_transform(crs("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")@projargs)%>% - # extent() - - domain_tf <- - domain %>% - sf::st_transform(crs("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")) - - # Download the data - # Note that it would be useful to clip these to a polygon to save space - # It would also be useful if only the relevant data could be downloaded (rather than downloading and THEN pruning) - - bio_vec <- - c("1","2","3","4","5","6","7","8","9", - "10","11","12","13","14","15","16","17","18","19") - - for(i in bio_vec){ - - # download files - # download.file(url = paste("https://os.zhdk.cloud.switch.ch/envicloud/chelsa/chelsa_V1/climatologies/bio/CHELSA_bio10_",i,".tif",sep = ""), - # destfile = file.path(temp_directory,paste("CHELSA_bio10_",i,"_V1.2.tif",sep = "")) - # ) - - # https://os.zhdk.cloud.switch.ch/chelsav2/GLOBAL/climatologies/1981-2010/bio/CHELSA_bio1_1981-2010_V.2.1.tif - robust_download_file(url = paste("https://os.zhdk.cloud.switch.ch/chelsav2/GLOBAL/climatologies/1981-2010/bio/CHELSA_bio",i,"_1981-2010_V.2.1.tif",sep = ""), - destfile = file.path(temp_directory,paste("CHELSA_bio",i,"_1981-2010_V.2.1.tif",sep = "")), - max_attempts = 10, - sleep_time = 10 - ) - - # load - rast_i <- terra::rast(file.path(temp_directory,paste("CHELSA_bio",i,"_1981-2010_V.2.1.tif",sep = ""))) - - # crop - - rast_i <- terra::crop(x = rast_i, - y = ext(domain_tf)) - - # mask - rast_i <- - terra::mask(rast_i, - mask = terra::vect(domain_tf)) - - # save raster - terra::writeRaster(x = rast_i, - filename = file.path(temp_directory,paste("CHELSA_bio",i,"_1981-2010_V.2.1.tif",sep = "")), - overwrite = TRUE) - - # plot - # plot(rast_i) - # plot(domain_tf,add=TRUE,col=NA) - + + # Get metadata for this bioclimatic variable + long_name <- bio_metadata$long_name[idx] + units <- bio_metadata$units[idx] + + # Add global attributes + ncdf4::ncatt_put(nc_file, 0, "title", + paste("CHELSA Bioclimatic Variable", i, sep = " ")) + ncdf4::ncatt_put(nc_file, 0, "source", "CHELSA v.2.1 (Climatologies at high resolution for the earth land areas)") + ncdf4::ncatt_put(nc_file, 0, "dataset_url", "https://chelsa-climate.org/") + ncdf4::ncatt_put(nc_file, 0, "download_date", as.character(download_date)) + ncdf4::ncatt_put(nc_file, 0, "temporal_range", "1981-2010") + ncdf4::ncatt_put(nc_file, 0, "Conventions", "CF-1.8") + ncdf4::ncatt_put(nc_file, 0, "history", + paste("Downloaded on", as.character(download_date), + "and clipped to domain. Processed using terra and ncdf4 R packages.")) + + # Add variable attributes + ncdf4::ncatt_put(nc_file, var_name, "long_name", long_name) + ncdf4::ncatt_put(nc_file, var_name, "units", units) + ncdf4::ncatt_put(nc_file, var_name, "standard_name", paste("bioclimatic_variable_", i, sep = "")) + + ncdf4::nc_close(nc_file) + output_files <- c(output_files, nc_filename) + rm(rast_i) - } - rm(i,bio_vec) - - - # release - to_release <- - list.files(path = file.path(temp_directory), - recursive = TRUE, - full.names = TRUE) - - - to_release <- - to_release[grepl(pattern = "CHELSA", - ignore.case = TRUE, - x = basename(to_release))] - - pb_upload(repo = "AdamWilsonLab/emma_envdata", - file = to_release, - tag = tag) - - # delete directory and contents - unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) - - - - message("CHELSA climate files downloaded") - return(Sys.Date()) + # Cleanup temp directory + unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) + if (verbose) message("CHELSA climate files processed to: ", out_dir) + + # Return output file paths for targets to track + output_files -} # end fx +} diff --git a/R/get_release_clouds_wilson.R b/R/get_release_clouds_wilson.R index b538a5c4..47a4cfca 100644 --- a/R/get_release_clouds_wilson.R +++ b/R/get_release_clouds_wilson.R @@ -96,15 +96,15 @@ get_release_clouds_wilson <- function(temp_directory = "data/temp/raw_data/cloud # Push release - pb_upload(file = file.path(temp_directory, filename), - repo = "AdamWilsonLab/emma_envdata", - tag = tag, - name = filename, - overwrite = TRUE) + # pb_upload(file = file.path(temp_directory, filename), + # repo = "AdamWilsonLab/emma_envdata", + # tag = tag, + # name = filename, + # overwrite = TRUE) # Delete file - file.remove(file.path(temp_directory, filename)) + # file.remove(file.path(temp_directory, filename)) # pause to keep github happy Sys.sleep(sleep_time) diff --git a/R/get_release_fire_modis_appeears.R b/R/get_release_fire_modis_appeears.R new file mode 100644 index 00000000..c54587e7 --- /dev/null +++ b/R/get_release_fire_modis_appeears.R @@ -0,0 +1,210 @@ +#' @title Download MODIS Fire via AppEEARS and publish monthly NetCDF +#' @description Alternative to rgee-based downloader. Submits an AppEEARS area request +#' for MCD64A1.061 Burn Date over the provided domain and date range, downloads NetCDF +#' outputs, splits to monthly NetCDF files, and uploads them to GitHub Releases. +#' @author EMMA Team +#' @param temp_directory Temporary working directory for downloads and intermediate files. +#' @param tag Release tag to upload monthly NetCDFs to (e.g., "raw_fire_modis_nc"). +#' @param domain An `sf` polygon defining the area of interest. +#' @param sleep_time Seconds to sleep between uploads to avoid rate limiting. +#' @param start_date Optional ISO date (YYYY-MM-DD). If NULL, inferred from existing releases. +#' @param end_date Optional ISO date (YYYY-MM-DD). Defaults to `Sys.Date()`. +#' @param earthdata_user NASA Earthdata username. Defaults to `Sys.getenv("EARTHDATA_USER")`. +#' @param earthdata_password NASA Earthdata password. Defaults to `Sys.getenv("EARTHDATA_PASSWORD")`. +#' @param max_layers Maximum number of monthly files to process in one run. NULL for all. +#' @param verbose Logical for progress messages. +#' @return Character string of the latest YYYY-MM successfully uploaded, or NULL if nothing new. +#' @importFrom piggyback pb_list pb_upload pb_new_release +#' @importFrom terra rast time writeCDF +#' @importFrom sf st_write st_is_longlat st_transform st_crs +get_release_fire_modis_appeears <- function( + temp_directory = "data/temp/raw_data/fire_modis/", + tag = "raw_fire_modis_nc", + domain, + sleep_time = 1, + start_date = NULL, + end_date = as.character(Sys.Date()), + earthdata_user = Sys.getenv("EARTHDATA_USER"), + earthdata_password = Sys.getenv("EARTHDATA_PASSWORD"), + max_layers = NULL, + verbose = TRUE +) { + + # Package checks + required_pkgs <- c("appeears", "terra", "sf", "piggyback", "lubridate", "jsonlite", "dplyr") + missing <- required_pkgs[!sapply(required_pkgs, requireNamespace, quietly = TRUE)] + if (length(missing)) { + stop("Required packages missing: ", paste(missing, collapse = ", "), + ". Install with: install.packages(c('", paste(missing, collapse = "', '"), "'))") + } + + if (earthdata_user == "") { + stop("EARTHDATA_USER not found. Set EARTHDATA_USER env var and configure ~/.netrc with password.") + } + + # Ensure clean temp directory + if (dir.exists(temp_directory)) { + unlink(temp_directory, recursive = TRUE, force = TRUE) + } + dir.create(temp_directory, recursive = TRUE, showWarnings = FALSE) + + # Ensure release exists + tryCatch( + piggyback::pb_new_release(repo = "AdamWilsonLab/emma_envdata", tag = tag), + error = function(e) { + if (verbose) message("Release ", tag, " already exists") + } + ) + + # Determine start_date from existing release assets if not provided + released_files <- piggyback::pb_list(repo = "AdamWilsonLab/emma_envdata") + existing_nc <- released_files[released_files$tag == tag & grepl("\\.nc$", released_files$file_name), , drop = FALSE] + + parse_month_from_name <- function(x) { + # expects names like fire_MCD64A1_YYYY-MM.nc or YYYY-MM.nc + m <- sub(".*([0-9]{4}-[0-9]{2})\\.nc$", "\\1", x) + if (grepl("^[0-9]{4}-[0-9]{2}$", m)) return(m) else return(NA_character_) + } + + if (is.null(start_date)) { + months_done <- vapply(existing_nc$file_name, parse_month_from_name, character(1)) + months_done <- months_done[!is.na(months_done)] + if (length(months_done) == 0) { + start_date <- "2000-11-01" # MODIS Terra fire start + } else { + # next day after last completed month + last_month <- max(months_done) + start_date <- as.character(lubridate::ceiling_date(as.Date(paste0(last_month, "-01")), unit = "month")) + } + } + + if (verbose) message("AppEEARS Fire request from ", start_date, " to ", end_date) + + # Authentication via ~/.netrc (automatically used by appeears package) + if (verbose) message("Using EARTHDATA_USER: ", earthdata_user) + + # Ensure domain is in WGS84 and write to GeoJSON for the request + dom <- domain + if (!sf::st_is_longlat(dom)) { + if (is.na(sf::st_crs(dom))) stop("'domain' must have a valid CRS.") + dom <- sf::st_transform(dom, 4326) + } + aoi_path <- file.path(temp_directory, "aoi.geojson") + suppressWarnings(sf::st_write(dom, aoi_path, driver = "GeoJSON", delete_dsn = TRUE, quiet = TRUE)) + aoi_json <- jsonlite::read_json(aoi_path, simplifyVector = FALSE) + + # Resolve Burn Date layer name dynamically + burn_layer <- NULL + try({ + lyr <- appeears::rs_layers("MCD64A1.061") + cand_cols <- intersect(c("Layer", "Name", "layer", "name"), names(lyr)) + if (length(cand_cols)) { + vals <- unlist(lapply(cand_cols, function(cc) lyr[[cc]])) + burn_layer <- vals[grepl("Burn.*Date", vals, ignore.case = TRUE)][1] + } + }, silent = TRUE) + if (is.null(burn_layer) || is.na(burn_layer)) burn_layer <- "Burn_Date" + + if (verbose) message("Using layer: ", burn_layer) + + # Build request payload (area extract) + req <- list( + task_type = "area", + task_name = paste0("emma_fire_", format(Sys.time(), "%Y%m%d%H%M%S")), + params = list( + dates = list(start = as.character(start_date), end = as.character(end_date)), + layers = list( + list(product = "MCD64A1.061", layer = burn_layer), + list(product = "MCD64A1.061", layer = "QA") + ), + output = list(format = "netcdf4", projection = "native"), + geo = aoi_json + ) + ) + + # Submit, poll, and download + task <- appeears::rs_request(request = req) + if (verbose) message("Submitted AppEEARS task: ", task$task_id) + + # Polling loop + repeat { + st <- appeears::rs_status(task$task_id) + if (isTRUE(tolower(st$status) %in% c("done", "complete", "completed"))) break + if (isTRUE(tolower(st$status) %in% c("error", "failed"))) stop("AppEEARS task failed.") + Sys.sleep(30) + if (verbose) message("Waiting for AppEEARS task... status: ", st$status) + } + + # Download results (often ZIPs) + dl_paths <- appeears::rs_download(task_id = task$task_id, path = temp_directory) + zips <- list.files(temp_directory, pattern = "\\.zip$", full.names = TRUE, recursive = TRUE) + if (length(zips)) { + for (z in zips) utils::unzip(z, exdir = temp_directory) + } + + # Collect NetCDFs + nc_paths <- list.files(temp_directory, pattern = "\\.nc$", full.names = TRUE, recursive = TRUE) + if (length(nc_paths) == 0) { + if (verbose) message("No NetCDF files downloaded.") + return(invisible(NULL)) + } + + # Helper: write monthly subsets from a multi-time NetCDF + write_monthly_netcdf <- function(nc_file, out_dir) { + r <- terra::rast(nc_file) + tt <- try(terra::time(r), silent = TRUE) + if (inherits(tt, "try-error") || is.null(tt) || length(tt) == 0) { + # No time axis; write as-is with month from end_date + out <- file.path(out_dir, sprintf("fire_MCD64A1_%s.nc", format(as.Date(end_date), "%Y-%m"))) + terra::writeCDF(r, filename = out, varname = "Burn_Date", overwrite = TRUE) + return(out) + } + months <- unique(format(as.Date(tt), "%Y-%m")) + outs <- character(0) + for (m in months) { + idx <- which(format(as.Date(tt), "%Y-%m") == m) + if (length(idx) == 0) next + r_m <- r[[idx]] + out <- file.path(out_dir, sprintf("fire_MCD64A1_%s.nc", m)) + terra::writeCDF(r_m, filename = out, varname = "Burn_Date", overwrite = TRUE) + outs <- c(outs, out) + } + outs + } + + monthly_files <- unique(unlist(lapply(nc_paths, write_monthly_netcdf, out_dir = temp_directory))) + monthly_files <- monthly_files[file.exists(monthly_files)] + if (length(monthly_files) == 0) { + if (verbose) message("No monthly NetCDF files prepared.") + return(invisible(NULL)) + } + + # Apply max_layers limit if specified + if (!is.null(max_layers) && length(monthly_files) > max_layers) { + if (verbose) message("Limiting to ", max_layers, " files out of ", length(monthly_files)) + monthly_files <- monthly_files[1:max_layers] + } + + # Remove any duplicates already in release + existing_names <- existing_nc$file_name + to_upload <- monthly_files[!basename(monthly_files) %in% existing_names] + if (length(to_upload) == 0) { + if (verbose) message("Releases already up to date for tag ", tag) + latest <- vapply(existing_names, parse_month_from_name, character(1)) + return(invisible(max(latest[!is.na(latest)]))) + } + + # Upload each file + for (f in to_upload) { + Sys.sleep(sleep_time) + piggyback::pb_upload(file = f, repo = "AdamWilsonLab/emma_envdata", tag = tag) + if (verbose) message("Uploaded ", basename(f), " to ", tag) + } + + latest_month <- max(sub(".*([0-9]{4}-[0-9]{2})\\.nc$", "\\1", basename(to_upload))) + + # Clean temp + unlink(temp_directory, recursive = TRUE, force = TRUE) + + invisible(latest_month) +} diff --git a/R/get_release_ndvi_viirs_appeears.R b/R/get_release_ndvi_viirs_appeears.R new file mode 100644 index 00000000..2082a2d6 --- /dev/null +++ b/R/get_release_ndvi_viirs_appeears.R @@ -0,0 +1,207 @@ +#' @title Download VIIRS NDVI via AppEEARS and publish monthly NetCDF +#' @description Submits an AppEEARS area request for VNP13A1.001 NDVI and QA +#' over the provided domain and date range, downloads NetCDF outputs, splits to +#' monthly NetCDF files, and uploads them to GitHub Releases. +#' @author EMMA Team +#' @param temp_directory Temporary working directory for downloads and intermediate files. +#' @param tag Release tag to upload monthly NetCDFs to (e.g., "raw_ndvi_viirs_nc"). +#' @param domain An `sf` polygon defining the area of interest. +#' @param sleep_time Seconds to sleep between uploads to avoid rate limiting. +#' @param start_date Optional ISO date (YYYY-MM-DD). If NULL, inferred from existing releases. +#' @param end_date Optional ISO date (YYYY-MM-DD). Defaults to `Sys.Date()`. +#' @param earthdata_user NASA Earthdata username. Defaults to `Sys.getenv("EARTHDATA_USER")`. +#' @param earthdata_password NASA Earthdata password. Defaults to `Sys.getenv("EARTHDATA_PASSWORD")`. +#' @param max_layers Maximum number of monthly files to process in one run. NULL for all. +#' @param verbose Logical for progress messages. +#' @return Character string of the latest YYYY-MM successfully uploaded, or NULL if nothing new. +get_release_ndvi_viirs_appeears <- function( + temp_directory = "data/temp/raw_data/ndvi_viirs/", + tag = "raw_ndvi_viirs_nc", + domain, + sleep_time = 1, + start_date = NULL, + end_date = as.character(Sys.Date()), + earthdata_user = Sys.getenv("EARTHDATA_USER"), + earthdata_password = Sys.getenv("EARTHDATA_PASSWORD"), + max_layers = NULL, + verbose = TRUE +) { + + # Package checks + required_pkgs <- c("appeears", "terra", "sf", "piggyback", "lubridate", "jsonlite", "dplyr") + missing <- required_pkgs[!sapply(required_pkgs, requireNamespace, quietly = TRUE)] + if (length(missing)) { + stop("Required packages missing: ", paste(missing, collapse = ", ")) + } + + if (earthdata_user == "") { + stop("EARTHDATA_USER not found. Set EARTHDATA_USER env var and configure ~/.netrc with password.") + } + + # Ensure clean temp directory + if (dir.exists(temp_directory)) { + unlink(temp_directory, recursive = TRUE, force = TRUE) + } + dir.create(temp_directory, recursive = TRUE, showWarnings = FALSE) + + # Ensure release exists + tryCatch( + piggyback::pb_new_release(repo = "AdamWilsonLab/emma_envdata", tag = tag), + error = function(e) { + if (verbose) message("Release ", tag, " already exists") + } + ) + + # Determine start_date from existing releases + released_files <- piggyback::pb_list(repo = "AdamWilsonLab/emma_envdata") + existing_nc <- released_files[released_files$tag == tag & grepl("\\.nc$", released_files$file_name), , drop = FALSE] + + parse_month_from_name <- function(x) { + m <- sub(".*([0-9]{4}-[0-9]{2})\\.nc$", "\\1", x) + if (grepl("^[0-9]{4}-[0-9]{2}$", m)) return(m) else return(NA_character_) + } + + if (is.null(start_date)) { + months_done <- vapply(existing_nc$file_name, parse_month_from_name, character(1)) + months_done <- months_done[!is.na(months_done)] + if (length(months_done) == 0) { + start_date <- "2012-01-19" # VIIRS start + } else { + last_month <- max(months_done) + start_date <- as.character(lubridate::ceiling_date(as.Date(paste0(last_month, "-01")), unit = "month")) + } + } + + if (verbose) message("AppEEARS VIIRS NDVI request from ", start_date, " to ", end_date) + + # Authentication via ~/.netrc (automatically used by appeears package) + if (verbose) message("Using EARTHDATA_USER: ", earthdata_user) + + # Ensure domain in WGS84 + dom <- domain + if (!sf::st_is_longlat(dom)) { + if (is.na(sf::st_crs(dom))) stop("'domain' must have a valid CRS.") + dom <- sf::st_transform(dom, 4326) + } + aoi_path <- file.path(temp_directory, "aoi.geojson") + suppressWarnings(sf::st_write(dom, aoi_path, driver = "GeoJSON", delete_dsn = TRUE, quiet = TRUE)) + aoi_json <- jsonlite::read_json(aoi_path, simplifyVector = FALSE) + + # Resolve layer names (include composite day of year for exact acquisition date) + ndvi_layer <- "500_m_16_days_NDVI" + qa_layer <- "500_m_16_days_VI_Quality" + doy_layer <- "composite_day_of_the_year" + + try({ + lyr <- appeears::rs_layers("VNP13A1.001") + cand_cols <- intersect(c("Layer", "Name", "layer", "name"), names(lyr)) + if (length(cand_cols)) { + vals <- unlist(lapply(cand_cols, function(cc) lyr[[cc]])) + ndvi_cand <- vals[grepl("NDVI", vals, ignore.case = TRUE)][1] + qa_cand <- vals[grepl("Quality", vals, ignore.case = TRUE)][1] + doy_cand <- vals[grepl("Day[_ ]?of[_ ]?Year|composite.*day", vals, ignore.case = TRUE)][1] + if (!is.na(ndvi_cand)) ndvi_layer <- ndvi_cand + if (!is.na(qa_cand)) qa_layer <- qa_cand + if (!is.na(doy_cand)) doy_layer <- doy_cand + } + }, silent = TRUE) + + if (verbose) message("Using layers: ", ndvi_layer, ", ", qa_layer, ", ", doy_layer) + + # Build request + req <- list( + task_type = "area", + task_name = paste0("emma_viirs_", format(Sys.time(), "%Y%m%d%H%M%S")), + params = list( + dates = list(start = as.character(start_date), end = as.character(end_date)), + layers = list( + list(product = "VNP13A1.001", layer = ndvi_layer), + list(product = "VNP13A1.001", layer = qa_layer), + list(product = "VNP13A1.001", layer = doy_layer) + ), + output = list(format = "netcdf4", projection = "native"), + geo = aoi_json + ) + ) + + # Submit and poll + task <- appeears::rs_request(request = req) + if (verbose) message("Submitted AppEEARS task: ", task$task_id) + + repeat { + st <- appeears::rs_status(task$task_id) + if (isTRUE(tolower(st$status) %in% c("done", "complete", "completed"))) break + if (isTRUE(tolower(st$status) %in% c("error", "failed"))) stop("AppEEARS task failed.") + Sys.sleep(30) + if (verbose) message("Waiting... status: ", st$status) + } + + # Download and unzip + dl_paths <- appeears::rs_download(task_id = task$task_id, path = temp_directory) + zips <- list.files(temp_directory, pattern = "\\.zip$", full.names = TRUE, recursive = TRUE) + if (length(zips)) { + for (z in zips) utils::unzip(z, exdir = temp_directory) + } + + # Collect NetCDFs + nc_paths <- list.files(temp_directory, pattern = "\\.nc$", full.names = TRUE, recursive = TRUE) + if (length(nc_paths) == 0) { + if (verbose) message("No NetCDF files downloaded.") + return(invisible(NULL)) + } + + # Split monthly + write_monthly_netcdf <- function(nc_file, out_dir) { + r <- terra::rast(nc_file) + tt <- try(terra::time(r), silent = TRUE) + if (inherits(tt, "try-error") || is.null(tt) || length(tt) == 0) { + out <- file.path(out_dir, sprintf("ndvi_VNP13A1_%s.nc", format(as.Date(end_date), "%Y-%m"))) + terra::writeCDF(r, filename = out, overwrite = TRUE) + return(out) + } + months <- unique(format(as.Date(tt), "%Y-%m")) + outs <- character(0) + for (m in months) { + idx <- which(format(as.Date(tt), "%Y-%m") == m) + if (length(idx) == 0) next + r_m <- r[[idx]] + out <- file.path(out_dir, sprintf("ndvi_VNP13A1_%s.nc", m)) + terra::writeCDF(r_m, filename = out, overwrite = TRUE) + outs <- c(outs, out) + } + outs + } + + monthly_files <- unique(unlist(lapply(nc_paths, write_monthly_netcdf, out_dir = temp_directory))) + monthly_files <- monthly_files[file.exists(monthly_files)] + if (length(monthly_files) == 0) { + if (verbose) message("No monthly NetCDF files prepared.") + return(invisible(NULL)) + } + + # Apply max_layers + if (!is.null(max_layers) && length(monthly_files) > max_layers) { + if (verbose) message("Limiting to ", max_layers, " files") + monthly_files <- monthly_files[1:max_layers] + } + + # Skip duplicates + existing_names <- existing_nc$file_name + to_upload <- monthly_files[!basename(monthly_files) %in% existing_names] + if (length(to_upload) == 0) { + if (verbose) message("Releases already up to date") + latest <- vapply(existing_names, parse_month_from_name, character(1)) + return(invisible(max(latest[!is.na(latest)]))) + } + + # Upload + for (f in to_upload) { + Sys.sleep(sleep_time) + piggyback::pb_upload(file = f, repo = "AdamWilsonLab/emma_envdata", tag = tag) + if (verbose) message("Uploaded ", basename(f)) + } + + latest_month <- max(sub(".*([0-9]{4}-[0-9]{2})\\.nc$", "\\1", basename(to_upload))) + unlink(temp_directory, recursive = TRUE, force = TRUE) + invisible(latest_month) +} diff --git a/R/national_boundary.R b/R/national_boundary.R deleted file mode 100644 index fd86f380..00000000 --- a/R/national_boundary.R +++ /dev/null @@ -1,30 +0,0 @@ -# National Boundary - -#' @author Adam M. Wilson -#' @description Download national boundary file from the UN -#' @source https://data.humdata.org/dataset/south-africa-admin-level-1-boundaries - -national_boundary <- function(file="data/south_africa.gpkg"){ - - #Adjust timeout to allow for slow internet - if(getOption('timeout') < 1000){ - options(timeout = 1000) - } - - - url="https://data.humdata.org/dataset/061d4492-56e8-458c-a3fb-e7950991adf0/resource/f5b08257-8d03-48dc-92c8-aaa4fb7285f0/download/zaf_adm_sadb_ocha_20201109_shp.zip" - tmpfile1=tempfile() - tmpdir1=tempdir() - download.file(url,destfile = tmpfile1) - unzip(tmpfile1,exdir=tmpdir1) - - country=st_read(file.path(tmpdir1,"zaf_adm_sadb_ocha_20201109_SHP/zaf_admbnda_adm0_sadb_ocha_20201109.shp")) -# st_write(country,dsn=file,append=F) -# return(file) - - return(country) -} -# end function - - - diff --git a/R/network_drive_explore.R b/R/network_drive_explore.R deleted file mode 100644 index 48a9a49c..00000000 --- a/R/network_drive_explore.R +++ /dev/null @@ -1,62 +0,0 @@ -# # box code not working -# library(boxr) -# library(tidyverse) -# -# # library(fs) -# # dir_create("~/.boxr-auth") -# -# # from https://github.com/r-box/boxr/issues/166 -# # options(boxr.retry.times = 10) -# -# #box_auth() -# -# # sometimes this fails for no apparent reason - must just wait for it to work again! -# # https://github.com/r-box/boxr/issues/166 -# box_auth_service() -# #box_auth_service(token_text = unlist(read_lines('~/.boxr-auth/token.json'))) -# -# # root directory -# -# -# box_setwd() -# -# -# # create new directory to hold results -# dir_name="emmabox" -# box_dir_create(dir_name = dir_name) -# -# eid <- box_ls() %>% as.data.frame() %>% filter(name==dir_name) -# -# # Share folder with -# uid=271686873 # adamw@buffalo.edu -# -# -# box_collab_create( -# dir_id = eid$id, -# user_id = uid, -# role = "co-owner", -# can_view_path = TRUE -# ) -# -# # set box working directory -# box_setwd(eid$id) -# box_setwd("..") -# -# boxr_options() -# box_ls() -# -# # test writing to folder -# box_write( -# iris, -# "iris.csv") -# -# files <- box_ls() %>% as.data.frame -# -# files %>% -# filter(name=="iris.csv") %>% -# select(id) %>% unlist() %>% -# box_delete_file() -# -# -# -# diff --git a/R/process_dynamic_data.R b/R/process_dynamic_data.R new file mode 100644 index 00000000..26f8e33b --- /dev/null +++ b/R/process_dynamic_data.R @@ -0,0 +1,101 @@ + +library(arrow) +library(tidyverse) + + +############################################################# +#' @author Brian Maitner +#' @description this function takes in tif file from the input, converts them to tidy format, and saves as .gz.parquet +#' @param input_dir Directory containing input files. +#' @param output_dir Directory to stick output files in +#' @param variable_name This is included in the tidy file output +#' @param ... Does nothing. Used for targets. +#' @note Output dataframes have three columns: CellID, date, variable, value. ALso note that cells with NA values are omitted. +process_dynamic_data_to_parquet <- function(input_dir = "data/raw_data/ndvi_modis/", + output_dir = "data/processed_data/dynamic_parquet/ndvi/", + variable_name = "ndvi", + ...){ + + + # make a directory if one doesn't exist yet + + if(!dir.exists(output_dir)){ + + dir.create(output_dir, recursive = TRUE) + + } + + # get files + + all_files <- list.files(path = input_dir,pattern = ".tif$",full.names = TRUE) + + all_files_int <- + all_files %>% + gsub(pattern = input_dir, replacement = "") %>% + gsub(pattern = "/", replacement = "") %>% + gsub(pattern = ".tif", replacement = "") %>% + lubridate::as_date()|> + as.numeric() + + + # figure out which files have been processed + + output_files <- + list.files(path = output_dir, pattern = ".gz.parquet", full.names = TRUE) %>% + gsub(pattern = output_dir, replacement = "") %>% + gsub(pattern = "/", replacement = "") %>% + gsub(pattern = ".gz.parquet", replacement = "") + + #Don't worry about files that have been processed already + + all_files <- all_files[which(!all_files_int %in% output_files)] + + rm(output_files, all_files_int) + + #end if things are already done + if(length(all_files) == 0){ + + message(paste("Finished converting ", + variable_name, + " files to parquet", sep = "")) + + return(output_dir) + + } + + + # process the files that haven't been done yet + + + for(i in 1:length(all_files)){ + + # Get the date in integer format (will append to the data) + all_files[i] |> + gsub(pattern = input_dir, replacement = "")|> + gsub(pattern = "/", replacement = "")|> + gsub(pattern = ".tif", replacement = "")|> + lubridate::as_date()|> + as.numeric()-> integer_date_i + + + # Process ith file + + all_files[i] |> + stars::read_stars() |> + as.data.frame() %>% + mutate(cellID = row_number(), + date = integer_date_i, + variable = variable_name) %>% + rename( value := 3) %>% + dplyr::select(cellID, date, variable, value ) %>% + drop_na() %>% + write_parquet(sink = paste(output_dir, integer_date_i, ".gz.parquet", sep = ""), + compression = "gzip") + + } #end i loop + + #End fx + message(paste("Finished converting ",variable_name, " files to parquet",sep = "")) + return(output_dir) + +}#end fx diff --git a/R/process_fix_modis_projection.R b/R/process_fix_modis_projection.R new file mode 100644 index 00000000..df74d08e --- /dev/null +++ b/R/process_fix_modis_projection.R @@ -0,0 +1,94 @@ + +#'@description to check the projection of MODIS products downloaded from rgee +#'@author Brian Maitner +#'@param A directory containing MODIS files with incorrect projections + +process_fix_modis_projection <- +function(directory, ...){ + + #specify the correct projection + nasa_proj <- "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +R=6371007.181 +units=m +no_defs" + + #get a vector of rasters + rasters <- list.files(path = directory, + pattern = ".tif$", + full.names = TRUE) + + #set up a change log if needed + if(exists(paste(directory,"log.csv",sep = ""))){ + + suppressWarnings(expr = + cbind("file","original_proj","assigned_proj") %>% + write.table(x = ., + file = paste(directory,"log.csv",sep = ""), + append = TRUE, + col.names = FALSE, + row.names=FALSE, + sep = ",") + ) + + + } + + + #iterate and fix + for(i in 1:length(rasters)){ + + #load ith raster + rast_i <- terra::rast(x = rasters[i]) + + #get the projection + + original_proj <- crs(rast_i, proj = TRUE) + + #check whether the raster matches the correct projection + if(!identical(nasa_proj, original_proj)){ + + message("Detected error in MODIS projection, correcting and logging the change") + + crs(rast_i) <- nasa_proj + + #write a new raster with a different name + terra::writeRaster(x = rast_i, + filename = gsub(pattern = ".tif$", + replacement =".temp.tif", + x = rasters[i]), + filetype="GTiff", + overwrite = TRUE) + + #delete old raster + file.remove(rasters[i]) + + #update new name + file.rename(from = gsub(pattern = ".tif$", + replacement =".temp.tif", + x = rasters[i]), + to = rasters[i]) + + #log the change + + + data.frame(file = rasters[i], + original_proj = original_proj, + assigned_proj = nasa_proj) %>% + + write.table(x = ., + file = paste(directory,"log.csv",sep = ""), + append = TRUE, + col.names = FALSE, + row.names=FALSE, + sep = ",") + + + + } + + } + + + +} + + + + diff --git a/R/process_release_alos.R b/R/process_release_alos.R deleted file mode 100644 index 1c488feb..00000000 --- a/R/process_release_alos.R +++ /dev/null @@ -1,160 +0,0 @@ -#' @author Brian Maitner -#' @param input_dir directory where the input files live -#' @param output_dir directory for the output files -#' @param template_release path to raster file to use as a template for reprojection -#' @param ... Does nothing, but is used in making connections between files in the targets framework -#' @note This function uses bilinear for continuous variables and nearest neighbor for categorical -process_release_alos <- function(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/alos/", - template_release, - sleep_time = 30, - ...){ - - # #Ensure directory is empty if it exists - - if(dir.exists(temp_directory)){ - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - } - - # make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - dir.create(temp_directory, recursive = TRUE) - } - - - # get template raster - - robust_pb_download(file = template_release$file, - dest = temp_directory, - repo = template_release$repo, - tag = template_release$tag, - max_attempts = 10, - sleep_time = sleep_time) - - template <- terra::rast(file.path(temp_directory, template_release$file)) - - # get input rasters - - raster_list <- pb_list(repo = "AdamWilsonLab/emma_envdata", - tag = input_tag) %>% - filter(grepl(pattern = "alos_", - x = file_name)) - - robust_pb_download(file = raster_list$file_name, - dest = temp_directory, - repo = "AdamWilsonLab/emma_envdata", - tag = input_tag, - max_attempts = 10, - sleep_time = sleep_time) - - - # reformat and save each - - for(i in 1:nrow(raster_list)){ - - raster_i <- terra::rast(file.path(temp_directory, raster_list$file_name[i])) - - - #Use bilinear for everything except landforms - - if(length(grep(pattern = "landforms", x = raster_list$file_name[i])) > 0){ - - method <- "near" # uncomment for terra - - }else{ - - method <- "bilinear" - - } - - # terra doesn't overwrite, so I have to delete and rename - - terra::project(x = raster_i, - y = template, - method = method, - filename = file.path(temp_directory, - gsub(pattern = ".tif$", - replacement = ".temp.tif", - x = raster_list$file_name[i])), - overwrite=TRUE) - - # check the projection - - if(terra::crs(rast(file.path(temp_directory, - gsub(pattern = ".tif$", - replacement = ".temp.tif", - x = raster_list$file_name[i]))), - proj=TRUE) != terra::crs(template, proj=TRUE)){ - stop("Issue with reprojection")} - - # delete the original - - file.remove(file.path(temp_directory, raster_list$file_name[i])) - - file.rename(from = file.path(temp_directory, - gsub(pattern = ".tif$", - replacement = ".temp.tif", - x = raster_list$file_name[i])), - to = file.path(temp_directory, raster_list$file_name[i])) - - # check the new projection - - if(terra::crs(rast(file.path(temp_directory, raster_list$file_name[i])), - proj=TRUE) != terra::crs(template, proj=TRUE)){ - stop("Issue with reprojection")} - - # upload the new file - - pb_upload(file = file.path(temp_directory, raster_list$file_name[i]), - repo = "AdamWilsonLab/emma_envdata", - tag = output_tag, - name = raster_list$file_name[i]) - - rm(raster_i) - - file.remove(file.path(temp_directory, raster_list$file_name[i])) - - Sys.sleep(sleep_time) - - - } #i loop - - - #Clear out the folder - - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - - #End functions - - message("Finished processing ALOS layers") - return(invisible(NULL)) - - - -} #end fx - - - -################################# - - -# CSP/ERGo/1_0/Global/ALOS_mTPI -#continuous measure of hills vs valleys -> bilinear -#270 - - -# "CSP/ERGo/1_0/Global/ALOS_CHILI" -#continuous -> bilinear -#90 - -# 'CSP/ERGo/1_0/Global/ALOS_landforms' -# categorical land classes -> near -#90 meter - -# 'CSP/ERGo/1_0/Global/ALOS_topoDiversity' -#continuous -> bilinear -#270 m - - diff --git a/R/process_release_biome_raster.R b/R/process_release_biome_raster.R deleted file mode 100644 index 95d2875b..00000000 --- a/R/process_release_biome_raster.R +++ /dev/null @@ -1,107 +0,0 @@ -# Make Domain - -#' @author Brian S. Maitner - -# Process 2018 Vegetation dataset into a raster with MODIS specs - - -#' @param vegmap_shp path to the 2018 national vegetation map shapefile -#' @param template_release path information to template release. -#' @param temp_directory temporary directory. will be deleted. -#' @param sleep_time amount of time (in seconds) to pause after a Github query. Defaults to 10. - -process_release_biome_raster <- function(template_release, - vegmap_shp, - domain, - temp_directory = "data/temp/raw_data/vegmap_raster/", - sleep_time = 10){ - - # Ensure directory is empty if it exists - - if(dir.exists(file.path(temp_directory))){ - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - } - - # make a directory if one doesn't exist yet - - if(!dir.exists(file.path(temp_directory))){ - dir.create(file.path(temp_directory), recursive = TRUE) - } - - # get template raster - - robust_pb_download(file = template_release$file, - dest = temp_directory, - repo = template_release$repo, - tag = template_release$tag, - max_attempts = 10, - sleep_time = sleep_time) - - # load template - - template <- terra::rast(file.path(temp_directory, template_release$file)) - - # load vegmap - - vegmap_za <- st_read(vegmap_shp) %>% - janitor::clean_names() %>% - st_make_valid() %>% - st_transform(crs = crs(template)) - - #transform domain - domain %>% st_transform(crs = crs(template)) -> domain - - #crop vegmap to save size? - - vegmap_za %>% - st_intersection(y = domain) -> vegmap_za - - # rasterize vegmap - - # Note: the Github version of exactextractr could do this more simply using exactextractr::coverage_fraction() - - n <- 10 #number of subcells to use for aggregation - - template <- disagg(rast(template), n) #break raster into smaller one - - #r <- disagg(template, n) #break raster into smaller one: this is more memory-intense - - r <- rasterize(x = vect(vegmap_za), - y = template, - field = "biome_18") #rasterize at fine resolution - - out_rast <- aggregate(r, n, "modal") #re-aggregate using modal biome - - # save output version - - writeRaster(x = out_rast, - filename = file.path(temp_directory,"biome_raster_modis_proj.tif"), - overwrite=TRUE) - - # upload transformed version - - pb_upload(file = file.path(temp_directory,"biome_raster_modis_proj.tif"), - repo = "AdamWilsonLab/emma_envdata", - tag = "processed_static", - name = "biome_raster_modis_proj.tif") - - pb_upload(file = file.path(temp_directory,"biome_raster_modis_proj.tif.aux.xml"), - repo = "AdamWilsonLab/emma_envdata", - tag = "processed_static", - name = "biome_raster_modis_proj.tif.aux.xml") - - # cleanup - - unlink(file.path(temp_directory), recursive = TRUE, force = TRUE) - - # End functions - - message("Finished rasterizing vegmap") - return(as.character(Sys.Date())) - - -} - - - - diff --git a/R/process_stable_data.R b/R/process_stable_data.R new file mode 100644 index 00000000..ba742f6f --- /dev/null +++ b/R/process_stable_data.R @@ -0,0 +1,65 @@ +library(arrow) + +#' @param output_dir directory (no file name) in which to save the csv that is returned +#' @param precip_dir directory containing the precipitation layers +#' @param landcover_dir directory containing the landcover layers +#' @param elevation_dir directory containing the elevation layer +#' @param cloud_dir directory containing the could layers +#' @param climate_dir directory containing the climate layers +#' @param alos_dir directory containing the alos layers +#' @param ... Does nothing, used to ensure upstream changes impact things +process_stable_data <- function(output_dir = "data/processed_data/model_data/", + precip_dir = "data/processed_data/precipitation_chelsa/", + landcover_dir = "data/processed_data/landcover_za/", + elevation_dir = "data/processed_data/elevation_nasadem/", + cloud_dir = "data/processed_data/clouds_wilson/", + climate_dir = "data/processed_data/climate_chelsa/", + alos_dir = "data/processed_data/alos/", + ...) { + + + # make a directory if one doesn't exist yet + + if(!dir.exists(output_dir)){ + dir.create(output_dir, recursive = TRUE) + } + + # process data + + c(precip_dir, + landcover_dir, + elevation_dir, + cloud_dir, + climate_dir, + alos_dir) |> + + lapply(FUN = function(x){ + list.files(path = x, + pattern = ".tif$", + full.names = T, + recursive = T)}) |> + unlist() |> + stars::read_stars() |> + as.data.frame() |> + mutate(cellID = row_number()) %>% + mutate(count_na = apply(., 1,FUN = function(x){sum(is.na(x))} )) %>% + filter(count_na < 20) %>% + write_parquet(sink = paste(output_dir,"stable_data.gz.parquet",sep = ""), + compression = "gzip") + + #The following line of code can be used to break things down by a grouping variable + # write_dataset(path = output_dir, + # format = "parquet", + # basename_template = "stable_data{i}.parquet.gz", + # compression = "gzip", + # existing_data_behavior = "delete_matching") + + #cleanup + gc() + + # Return filename + + message("Finished processing stable model data") + return(paste(output_dir,"stable_data.gz.parquet",sep = "")) + +} diff --git a/R/tar_release_storage.R b/R/tar_release_storage.R new file mode 100644 index 00000000..903158b1 --- /dev/null +++ b/R/tar_release_storage.R @@ -0,0 +1,392 @@ +#' Download targets from GitHub Release +#' @description Download locally stored targets from GitHub releases (useful for GitHub Actions) +#' @param repo Repository in "owner/repo" format (default from environment or "AdamWilsonLab/emma_envdata") +#' @param tag Release tag to store objects (default from environment or "objects_current") +#' @param cache_dir Cache directory (default: "data/target_outputs/.tar_cache") +#' @param which_targets Optional vector of specific target names to download +#' @param verbose Logical for progress messages +#' @details Call this at the start of tar_make() in update mode to download targets +#' @export +tar_download_github_release <- function( + repo = NULL, + tag = NULL, + cache_dir = "data/target_outputs/.tar_cache", + which_targets = NULL, + verbose = TRUE +) { + # Use environment variables as fallback, but allow explicit parameters + repo <- repo %||% Sys.getenv("TAR_GH_RELEASE_REPO") %||% "AdamWilsonLab/emma_envdata" + tag <- tag %||% Sys.getenv("TAR_GH_RELEASE_TAG") %||% "objects_current" + cache_dir <- cache_dir %||% Sys.getenv("TAR_GH_RELEASE_CACHE_DIR") %||% "data/target_outputs/.tar_cache" + objects_dir <- "_targets/objects" + + if (!nzchar(repo) || !nzchar(tag)) { + stop("GitHub release configuration not set. Provide repo and tag parameters or set environment variables.") + } + + dir.create(cache_dir, recursive = TRUE, showWarnings = FALSE) + dir.create(objects_dir, recursive = TRUE, showWarnings = FALSE) + + # Get list of assets on GitHub release + tryCatch({ + assets <- piggyback::pb_list(repo = repo, tag = tag) + if (verbose) message("[tar_github_release] Found ", nrow(assets), " assets on GitHub release") + }, error = function(e) { + stop("[tar_github_release] Could not access GitHub release: ", conditionMessage(e)) + }) + + # Filter assets if specific targets requested + if (!is.null(which_targets)) { + assets <- assets[assets$file_name %in% which_targets | startsWith(assets$file_name, which_targets), ] + } + + if (nrow(assets) == 0) { + if (verbose) message("[tar_github_release] No assets to download") + return(invisible(NULL)) + } + + # Download each asset + for (i in seq_len(nrow(assets))) { + asset_name <- assets$file_name[i] + + # Check if this is a file-format target (has extension) + # File-format targets are stored as "target_name.extension" (e.g., "country.parquet") + # Regular objects are stored as "target_name" (e.g., "elevation_task_id") + is_file_format <- grepl("\\.[^.]+$", asset_name) + + if (is_file_format) { + # Extract target name by removing extension + target_name <- sub("\\.[^.]+$", "", asset_name) + file_ext <- sub(".*\\.", "", asset_name) + } else { + target_name <- asset_name + file_ext <- NULL + } + + local_path <- file.path(objects_dir, target_name) + cached_path <- file.path(cache_dir, asset_name) + + # Download to cache if not already there + if (!file.exists(cached_path)) { + if (verbose) message("[tar_github_release] Downloading: ", asset_name) + max_attempts <- 3 + for (attempt in 1:max_attempts) { + tryCatch({ + piggyback::pb_download( + file = asset_name, + repo = repo, + tag = tag, + dest = cache_dir, + overwrite = TRUE + ) + if (verbose) message("[tar_github_release] Downloaded: ", asset_name) + break + }, error = function(e) { + if (attempt < max_attempts) { + if (verbose) message("[tar_github_release] Download attempt ", attempt, " failed: ", conditionMessage(e)) + Sys.sleep(2) + } else { + warning("[tar_github_release] Failed to download after ", max_attempts, " attempts: ", conditionMessage(e)) + } + }) + } + } else { + if (verbose) message("[tar_github_release] Already cached: ", asset_name) + } + + # Copy from cache to appropriate target location + if (file.exists(cached_path)) { + if (is_file_format) { + # For file-format targets: + # 1. Copy actual file to _targets/workspaces/ (where targets expects it) + # 2. Copy to data/target_outputs/ (for user access) + # 3. Create RDS wrapper in _targets/objects/ pointing to workspaces location + + ws_dir <- "_targets/workspaces" + dir.create(ws_dir, recursive = TRUE, showWarnings = FALSE) + ws_path <- file.path(ws_dir, asset_name) + file.copy(cached_path, ws_path, overwrite = TRUE) + + # Also copy to data/target_outputs/ for user access + out_dir <- "data/target_outputs" + dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + out_path <- file.path(out_dir, asset_name) + file.copy(cached_path, out_path, overwrite = TRUE) + + # Create RDS wrapper in _targets/objects/ that points to the workspaces file path + obj_dir <- "_targets/objects" + dir.create(obj_dir, recursive = TRUE, showWarnings = FALSE) + obj_path <- file.path(obj_dir, target_name) + saveRDS(ws_path, obj_path) + if (verbose) message("[tar_github_release] Restored file-format target: ", target_name) + } else { + # Regular object file: copy to _targets/objects/ + obj_dir <- "_targets/objects" + dir.create(obj_dir, recursive = TRUE, showWarnings = FALSE) + obj_path <- file.path(obj_dir, target_name) + file.copy(cached_path, obj_path, overwrite = TRUE) + if (verbose) message("[tar_github_release] Restored: ", target_name) + } + } + } + + if (verbose) message("[tar_github_release] Download complete") + invisible(NULL) +} + +#' Upload targets to GitHub Release after tar_make() completes +#' @description Upload locally stored targets to GitHub releases +#' @param repo Repository in "owner/repo" format (default from environment or "AdamWilsonLab/emma_envdata") +#' @param tag Release tag to store objects (default from environment or "objects_current") +#' @param format Serialization format: "qs", "rds", or "parquet" (default: "qs") +#' @param cache_dir Cache directory (default: "data/target_outputs/.tar_cache") +#' @param which_targets Optional vector of specific target names to upload +#' @param verbose Logical for progress messages +#' @details Call this after tar_make() to upload all targets +#' @export +tar_upload_github_release <- function( + repo = NULL, + tag = NULL, + format = "qs", + cache_dir = "data/target_outputs/.tar_cache", + which_targets = NULL, + verbose = TRUE +) { + # Use environment variables as fallback, but allow explicit parameters + repo <- repo %||% Sys.getenv("TAR_GH_RELEASE_REPO") %||% "AdamWilsonLab/emma_envdata" + tag <- tag %||% Sys.getenv("TAR_GH_RELEASE_TAG") %||% "objects_current" + cache_dir <- cache_dir %||% Sys.getenv("TAR_GH_RELEASE_CACHE_DIR") %||% "data/target_outputs/.tar_cache" + + if (!nzchar(repo) || !nzchar(tag)) { + stop("GitHub release configuration not set. Provide repo and tag parameters or set environment variables.") + } + + # Ensure release exists + tryCatch({ + piggyback::pb_list(repo = repo, tag = tag) + }, error = function(e) { + if (verbose) message("[tar_github_release] Creating release: ", tag) + piggyback::pb_new_release(repo = repo, tag = tag) + }) + + # Get metadata to find file-format target paths + meta_df <- tryCatch({ + tar_meta() + }, error = function(e) { + if (verbose) message("[tar_github_release] Could not read targets metadata") + data.frame(name = character(0), format = character(0), path = list()) + }) + + # Get current assets on GitHub to check what exists + remote_assets <- tryCatch({ + piggyback::pb_list(repo = repo, tag = tag) + }, error = function(e) { + data.frame(file_name = character(0)) + }) + + # Get list of local target files + if (is.null(which_targets)) { + # Get all targets from _targets/objects/ (regular objects) + regular_files <- list.files("_targets/objects", full.names = TRUE, recursive = FALSE) + + # Also get file-format targets from _targets/workspaces/ + file_format_targets <- character(0) + if (dir.exists("_targets/workspaces")) { + ws_files <- list.files("_targets/workspaces", full.names = FALSE, recursive = FALSE) + # Filter to only include those that are file-format targets (have metadata) + for (ws_file in ws_files) { + target_meta <- meta_df[meta_df$name == ws_file, ] + if (nrow(target_meta) > 0 && target_meta$format[1] == "file") { + file_format_targets <- c(file_format_targets, file.path("_targets/workspaces", ws_file)) + } + } + } + + # Also get actual data files from data/target_outputs/ + data_output_files <- character(0) + if (dir.exists("data/target_outputs")) { + all_output_files <- list.files("data/target_outputs", full.names = TRUE, recursive = FALSE) + # Exclude cache directory + data_output_files <- all_output_files[!grepl("\\.tar_cache", all_output_files)] + } + + local_files <- c(regular_files, file_format_targets, data_output_files) + if (verbose) message("[tar_github_release] Found ", length(local_files), " local target files to upload") + } else { + # Find specific targets - check all locations + regular_files <- character(0) + file_format_targets <- character(0) + data_output_files <- character(0) + + for (target in which_targets) { + obj_file <- file.path("_targets/objects", target) + ws_file <- file.path("_targets/workspaces", target) + data_file <- file.path("data/target_outputs", target) + + if (file.exists(obj_file)) { + regular_files <- c(regular_files, obj_file) + } else if (file.exists(ws_file)) { + target_meta <- meta_df[meta_df$name == target, ] + if (nrow(target_meta) > 0 && target_meta$format[1] == "file") { + file_format_targets <- c(file_format_targets, ws_file) + } + } else if (file.exists(data_file)) { + data_output_files <- c(data_output_files, data_file) + } + } + local_files <- c(regular_files, file_format_targets, data_output_files) + } + + if (length(local_files) == 0) { + message("[tar_github_release] No targets to upload") + return(invisible(NULL)) + } + + # Upload each file + for (local_file in local_files) { + target_name <- basename(local_file) + + # Determine if this is a file-format target based on location + # Files in _targets/workspaces/ are file-format targets + is_file_target <- grepl("_targets/workspaces", local_file) + + if (is_file_target) { + # This is a file-format target in _targets/workspaces/ + # Use the file from workspaces as the source to upload + # Get extension from metadata or from actual file + target_meta <- meta_df[meta_df$name == target_name, ] + + # Try to get extension from metadata path + ext <- "" + if (nrow(target_meta) > 0) { + metadata_path <- target_meta$path[[1]] + # Handle case where path is a vector with multiple values + if (is.character(metadata_path) && length(metadata_path) > 0) { + # Take the first one and get the extension from it + ext <- tools::file_ext(metadata_path[1]) + } + } + + # If we couldn't get extension from metadata, skip this file + if (nchar(ext) == 0) { + if (verbose) message("[tar_github_release] Skipping file-format target (no extension found): ", target_name) + next + } + + # Create upload name - avoid double extensions + # If target name already ends with this extension, don't add it again + if (grepl(paste0("\\.", ext, "$"), target_name)) { + upload_name <- target_name + } else { + upload_name <- paste0(target_name, ".", ext) + } + + if (verbose) message("[tar_github_release] Uploading file-format target: ", upload_name, " from ", local_file) + + # Check if already exists on GitHub + exists_on_github <- any(remote_assets$file_name == upload_name) + if (exists_on_github) { + if (verbose) message("[tar_github_release] File already on GitHub, deleting old version: ", upload_name) + tryCatch({ + # Delete old version + old_asset <- remote_assets[remote_assets$file_name == upload_name, ] + if (nrow(old_asset) > 0) { + piggyback::pb_delete(repo = repo, tag = tag, file = upload_name) + Sys.sleep(1) + } + }, error = function(e) { + if (verbose) message("[tar_github_release] Could not delete old asset: ", conditionMessage(e)) + }) + } + + max_attempts <- 3 + for (attempt in 1:max_attempts) { + tryCatch({ + piggyback::pb_upload( + file = local_file, + repo = repo, + tag = tag, + name = upload_name, + overwrite = FALSE + ) + if (verbose) message("[tar_github_release] Uploaded: ", upload_name) + Sys.sleep(1) + break + }, error = function(e) { + if (attempt < max_attempts) { + if (verbose) message("[tar_github_release] Upload attempt ", attempt, " failed: ", conditionMessage(e)) + Sys.sleep(2) + } else { + warning("[tar_github_release] Failed to upload after ", max_attempts, " attempts: ", conditionMessage(e)) + } + }) + } + } else { + # Regular objects or data output files + # Determine if it's from data/target_outputs or _targets/objects + is_data_output <- grepl("data/target_outputs", local_file) + + if (is_data_output) { + # Data output file - upload with its original name + upload_name <- basename(local_file) + if (verbose) message("[tar_github_release] Uploading data file: ", upload_name) + } else { + # Serialized object from _targets/objects + upload_name <- target_name + if (verbose) message("[tar_github_release] Uploading object: ", target_name) + } + + # Check if already exists on GitHub + exists_on_github <- any(remote_assets$file_name == upload_name) + if (exists_on_github) { + if (verbose) message("[tar_github_release] File already on GitHub, deleting old version: ", upload_name) + tryCatch({ + # Delete old version + piggyback::pb_delete(repo = repo, tag = tag, file = upload_name) + Sys.sleep(1) + }, error = function(e) { + if (verbose) message("[tar_github_release] Could not delete old asset: ", conditionMessage(e)) + }) + } + + max_attempts <- 3 + for (attempt in 1:max_attempts) { + tryCatch({ + piggyback::pb_upload( + file = local_file, + repo = repo, + tag = tag, + name = upload_name, + overwrite = FALSE + ) + if (verbose) message("[tar_github_release] Uploaded: ", upload_name) + Sys.sleep(1) + break + }, error = function(e) { + if (attempt < max_attempts) { + if (verbose) message("[tar_github_release] Upload attempt ", attempt, " failed: ", conditionMessage(e)) + Sys.sleep(2) + } else { + warning("[tar_github_release] Failed to upload: ", conditionMessage(e)) + } + }) + } + } + } + + if (verbose) message("[tar_github_release] Upload complete") + invisible(NULL) +} + +#' Create GitHub Releases repository for targets +#' @description DEPRECATED - Use tar_upload_github_release() instead +#' @export +tar_github_release_repo <- function( + repo, + tag, + format = "qs", + cache_dir = "data/.tar_cache" +) { + stop("tar_github_release_repo() is deprecated. Use tar_upload_github_release() after tar_make() instead.") +} + diff --git a/R/vegetation_map.R b/R/vegetation_map.R index df37576e..315ee82a 100644 --- a/R/vegetation_map.R +++ b/R/vegetation_map.R @@ -8,7 +8,7 @@ #' @biomes list of biomes to keep get_vegmap <- function(vegmap_shp, biomes = c("Fynbos","Succulent Karoo","Albany Thicket")){ - + # Must manually download the following and put in the raw_data folder # 2018 National Vegetation Map # http://bgis.sanbi.org/SpatialDataset/Detail/1674 @@ -19,9 +19,8 @@ get_vegmap <- function(vegmap_shp, biomes = c("Fynbos","Succulent Karoo","Alban vegmap <- vegmap_za %>% filter(biome_18 %in% biomes ) %>% #filter to list above - st_make_valid() #some polygons had errors - this fixes them - -# st_write(vegmap,dsn = "data/vegmap.gpkg",append=F) + st_make_valid() |> #some polygons had errors - this fixes them + vect() return(vegmap) diff --git a/README_files/figure-gfm/unnamed-chunk-3-1.png b/README_files/figure-gfm/unnamed-chunk-3-1.png index 4dbfc023..ab241357 100644 Binary files a/README_files/figure-gfm/unnamed-chunk-3-1.png and b/README_files/figure-gfm/unnamed-chunk-3-1.png differ diff --git a/_targets.R b/_targets.R index d8714617..968a266b 100644 --- a/_targets.R +++ b/_targets.R @@ -2,303 +2,238 @@ message("Starting tar_make()") print("Starting tar_make() - print") library(targets) +suppressMessages(library(qs)) library(tarchetypes) +library(geotargets) library(visNetwork) -library(future) #not sure why this is needed, but we get an error in some of the files without it -library(googledrive) +library(rdryad) +library(appeears)#,lib.loc=Sys.getenv("R_LIBS_USER")) +library(keyring)#,lib.loc=Sys.getenv("R_LIBS_USER")) +library(filelock)#,lib.loc=Sys.getenv("R_LIBS_USER")) +library(arrow) +library(sfarrow) + +#if (!requireNamespace("remotes", quietly = TRUE)) install.packages("remotes") +#remotes::install_deps(dependencies = TRUE) + +#library(future) #not sure why this is needed, but we get an error in some of the files without it + + +# check what system we are on + sys_info <- Sys.info() + message(paste("System info:",paste(names(sys_info), sys_info, sep="=", collapse = "; "))) + # if nodename includes "ccr.buffalo.edu", set working directory to /gscratch/scrubbed/... + if (grepl("ccr.buffalo.edu", sys_info[["nodename"]])) { + setwd("~/project/projects/emma/emma_envdata") + message(paste("Set working directory to:", getwd())) + } + +# Determine run mode: "prime" (full processing on server) or "update" (incremental on GitHub Actions) + run_mode <- if (tolower(Sys.getenv("GITHUB_ACTIONS")) == "true") { + "update" # Run incremental updates on GitHub Actions + } else { + "prime" # Default to prime meaning all targets are run + } + message(paste("Run mode:", run_mode)) #If running this locally, make sure to set up github credentials using gitcreds::gitcreds_set() -#devtools::install_github(repo = "bmaitner/rgee", -# ref = "noninteractive_auth") - -# Ensure things are clean - unlink(file.path("data/temp/"), recursive = TRUE, force = TRUE) - unlink(file.path("data/raw_data/", recursive = TRUE, force = TRUE)) - message(paste("Objects:",ls(),collapse = "\n")) # source all files in R folder - lapply(list.files("R",pattern="[.]R",full.names = T), source) - message(paste("Objects:",ls(),collapse = "\n")) # To make sure all packages are loaded + lapply(list.files("R",pattern="[.]R",full.names = T), function(x) {source(x)}) + # message(paste("Objects:",ls(),collapse = "\n")) # To make sure all packages are loaded options(tidyverse.quiet = TRUE) - #options(clustermq.scheduler = "multicore") - - tar_option_set(packages = c("cmdstanr", "posterior", "bayesplot", "tidyverse", - "stringr","knitr","sf","stars","units", - "cubelyr","rgee", "reticulate")) - -#set JSON token location (should be authorized for drive and earth engine) - json_token <- "secrets/ee-wilsonlab-emma-ef416058504a.json" -# ee authentication - if(T) { - message("loading rgee") -# rgee::ee_install_set_pyenv('/usr/bin/python3','r-reticulate', confirm = F) - library(rgee) - #Initializing with service account key - - service_account <- jsonlite::read_json(json_token)$client_email - credentials <- ee$ServiceAccountCredentials(service_account, json_token) - ee$Initialize(credentials = credentials) - - #Setting up needed objects for rgee - - message("Initializing rgee") + # Ensure output directories exist early (before terra options) + dir.create("data/raw", recursive = TRUE, showWarnings = FALSE) + dir.create("data/temp", recursive = TRUE, showWarnings = FALSE) + dir.create("data/temp/terra", recursive = TRUE, showWarnings = FALSE) + dir.create("data/releases", recursive = TRUE, showWarnings = FALSE) + dir.create("data/target_outputs", recursive = TRUE, showWarnings = FALSE) + + # GitHub release repository configuration - releases are used to store target objects and publish final data + gh_repo_config <- list( + repo = "AdamWilsonLab/emma_envdata", + tag = "objects_current", + format = "qs", + cache_dir = "data/target_outputs/.tar_cache" #this is local cache for speed + ) - ee_Initialize(drive = TRUE, - gcs = FALSE, - use_oob = FALSE, - drive_cred_path = json_token, - gcs_cred_path = json_token, - ee_cred_path = json_token) + # Store config as environment variables for upload function to use + Sys.setenv( + TAR_GH_RELEASE_REPO = gh_repo_config$repo, + TAR_GH_RELEASE_TAG = gh_repo_config$tag, + TAR_GH_RELEASE_FORMAT = gh_repo_config$format, + TAR_GH_RELEASE_CACHE_DIR = gh_repo_config$cache_dir + ) + # In "update" mode (GitHub Actions), pre-download targets from GitHub releases + if (run_mode == "update") { + message("[targets] Update mode: pre-downloading targets from GitHub releases") + tryCatch({ + tar_download_github_release(which_targets = NULL, verbose = TRUE) + }, error = function(e) { + message("[targets] Warning: Could not pre-download targets: ", conditionMessage(e)) + }) } -# # Sys.setenv(GOOGLE_APPLICATION_CREDENTIALS = "secrets/ee-wilsonlab-emma-ef416058504a.json") -# message("Starting tar_make()") -# print("Starting tar_make() - print") - -# library(targets) -# library(tarchetypes) -# library(visNetwork) -# library(future) #not sure why this is needed, but we get an error in some of the files without it -# options(gargle_verbosity = "debug") -# library(googledrive) -# library(jsonlite) - -# library(jsonlite) -# # tok <- fromJSON("secrets/ee-wilsonlab-emma-ef416058504a.json") -# # print(tok$scopes) # or tok$scopes - -# library(reticulate) -# # message("------ reticulate::py_discover_config() ------") -# # print(py_discover_config()) - -# # message("------ checking ee module availability ------") -# # print(py_module_available("ee")) - -# # message("------ py_config() output ------") -# # print(py_config()) - -# #If running this locally, make sure to set up github credentials using gitcreds::gitcreds_set() - -# #devtools::install_github(repo = "bmaitner/rgee", -# # ref = "noninteractive_auth") - -# # Ensure things are clean -# unlink(file.path("data/temp/"), recursive = TRUE, force = TRUE) -# unlink(file.path("data/raw_data/"), recursive = TRUE, force = TRUE) -# message(paste("Objects:",ls(),collapse = "\n")) - -# # source all files in R folder -# lapply(list.files("R",pattern="[.]R",full.names = T), source) -# message(paste("Objects:",ls(),collapse = "\n")) # To make sure all packages are loaded - - -# options(tidyverse.quiet = TRUE) -# #options(clustermq.scheduler = "multicore") - -# tar_option_set(packages = c("cmdstanr", "posterior", "bayesplot", "tidyverse", -# "stringr","knitr","sf","stars","units", -# "cubelyr","rgee", "reticulate")) - -# #set JSON token location (should be authorized for drive and earth engine) -# json_token <- "secrets/ee-wilsonlab-emma-ef416058504a.json" - -# # drive_auth(path = json_token) - -# # ee authentication -# if(T) { -# message("loading rgee") -# py_run_string("import ee") -# py_run_string("print(ee.__version__)") -# # rgee::ee_install_set_pyenv('/usr/bin/python3','r-reticulate', confirm = F) -# library(rgee) -# print(packageVersion("rgee")) -# options(rgee.verbose = TRUE) -# options(gargle_verbosity = "debug") -# #Initializing with service account key - - -# # unlink("~/.config/earthengine", recursive = TRUE, force = TRUE) -# #ee$Authenticate(auth_mode='appdefault', quiet=TRUE) -# message("Authentication is completed") -# # rgee::ee_clean_credentials() -# service_account <- jsonlite::read_json(json_token)$client_email -# credentials <- ee$ServiceAccountCredentials(service_account, json_token) -# ee$Initialize(credentials=credentials) -# message("Initialization is completed") - -# # point to your service-account JSON -# # Sys.setenv(GOOGLE_APPLICATION_CREDENTIALS = json_token) - -# # preload Drive & GCS creds headlessly -# #googledrive::drive_auth(path = json_token, cache = FALSE) -# #googleCloudStorageR::gcs_auth(json_file = json_token) -# #dir.create("~/.config/earthengine", recursive = TRUE, showWarnings = FALSE) -# message("Before ee_Initialize") - -# # App-Default auth for rgee (no browser) -# # drive_auth(path = json_token, cache = FALSE) -# # gargle::gargle_oauth_cache() -# # token <- gargle::credentials_service_account( -# # path = json_token, -# # scopes = NULL - -# # ) -# # googledrive::drive_auth(token = token) -# ee_Authenticate(auth_mode='appdefault', quiet=TRUE) # , scopes='https://www.googleapis.com/auth/cloud-platform', -# # ee_Initialize( -# # # user= "20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner", -# # # # user = "emma-envdata@ee-wilsonlab-emma.iam.gserviceaccount.com", -# # # credentials = "secrets/ee-wilsonlab-emma-ef416058504a.json", -# # credentials = "/github/home/.config/earthengine/", -# # # # drive = TRUE, -# # # # gcs = FALSE, -# # # project = "ee-wilsonlab-emma", -# # # # auth_mode = 'service_account', -# # auth_quiet = TRUE, -# # quiet = TRUE -# # ) -# #ee_clean_user_credentials() -# #ee_install_upgrade() -# # ee_Authenticate(auth_mode='appdefault', quiet=TRUE) - -# #ee_Authenticate() -# ee_Initialize() -# # #project = "ee-wilsonlab-emma", -# # #scopes='https://www.googleapis.com/auth/devstorage.full_control', -# # credentials=credentials, -# # auth_mode = "gcloud", -# # quiet = TRUE -# # ) #auth_mode="appdefault", quiet = TRUEㅣ, credentials=credentials, project = "ee-wilsonlab-emma", -# reticulate::py_last_error() -# message("ee_Initialize is completed") -# # unlink("~/.config/earthengine", recursive = TRUE, force = TRUE) -# # unlink("~/.rgee", recursive = TRUE, force = TRUE) -# # dir.create("~/.config/earthengine", recursive = TRUE, showWarnings = FALSE) -# # file.create("~/.config/earthengine/rgee_sessioninfo.txt") -# # options(rgee.session.info = FALSE) - -# #Setting up needed objects for rgee -# message("Initializing rgee") - -# # ee_Initialize( -# # service_account = "emma-envdata@ee-wilsonlab-emma.iam.gserviceaccount.com", -# # credentials = "secrets/ee-wilsonlab-emma-ef416058504a.json", -# # drive = TRUE, -# # gcs = TRUE -# # ) -# message("After ee_Initialize") -# # # 3) JSON에서 서비스 계정 이메일 추출 -# # key_path <- Sys.getenv("GOOGLE_APPLICATION_CREDENTIALS") -# # sa_email <- read_json(key_path)$client_email - -# # # 4) SaK(Service account Key)를 rgee 자격증명 폴더로 복사·검증 -# # ee_utils_sak_copy( -# # sakfile = key_path, -# # users = sa_email -# # ) -# # ee_utils_sak_validate( -# # users = sa_email, -# # quiet = TRUE -# # ) - -# # # 5) Earth Engine 비대화형 초기화 (서비스 계정 모드) -# # ee_Initialize( -# # email = sa_email, -# # project = "ee-wilsonlab-emma", -# # auth_mode = "service_account", -# # quiet = TRUE -# # ) - -# # # 6) rgee_sessioninfo.txt 생성 보장 -# # ee_sessioninfo( -# # email = sa_email, -# # user = sa_email -# # ) - -# # message("Earth Engine non-interactive initialization complete.") -# } + tar_option_set( + packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", + "appeears", "terra", "smoothr", "janitor", "sfarrow", "jsonlite", + "piggyback", "qs", "arrow"), + repository = "local", # Store locally; manual upload after tar_make() completes + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") # Prime: recompute if needed; Update: never recompute unless manually invalidated + ) + terraOptions(tempdir = "data/temp/terra", memfrac = 0.6) -list( +## Authenticate with AppEEARS +# source("R/appeears_auth.R") +# Ensure things are clean +# unlink(file.path("data/temp/"), recursive = TRUE, force = TRUE) +# unlink(file.path("data/raw_data/", recursive = TRUE, force = TRUE)) +# message(paste("Objects:",ls(),collapse = "\n")) -# #Prep needed files # start +list( tar_target( - vegmap_shp, # 2018 National Vegetation Map http://bgis.sanbi.org/SpatialDataset/Detail/1674 - "data/manual_download/VEGMAP2018_AEA_16082019Final/NVM2018_AEA_V22_7_16082019_final.shp", - format = "file" + vegmap_shp, + download_vegmap_release( + repo = "AdamWilsonLab/emma_envdata", + tag = "vegmap2024", + file = "NVM2024final_Shapefile.zip", + local_dir = "data/manual_download/NVM2024", + shapefile_name = "NVM2024Final_IEM5_12_07012025.shp" + ), + format = "file", + repository = "local" #because it's just downloaded from release - don't need to upload again. ), tar_target( remnants_shp, "data/manual_download/RLE_2021_Remnants/RLE_Terr_2021_June2021_Remnants_ddw.shp", - format = "file" + format="file", + repository = "local" ), tar_target( - sanbi_fires_shp, - st_read("data/manual_download/All_Fires/All_Fires_20_21_gw.shp") + capenature_fires_shp, + "data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp", + format="file", + repository = "local" ), tar_target( - country, - national_boundary() - ) -, + country.parquet, + get_country(), + format = "file" + ), tar_target( - vegmap, - get_vegmap(vegmap_shp) + domain.parquet, + domain_define(vegmap = vegmap_shp, country = country.parquet), + format = "file" ), + # Stable bounding box for downloads (50km buffer around domain) + # Never re-downloads unless manually invalidated, even if analysis domain changes tar_target( - domain, - domain_define(vegmap = vegmap, country) - ) -, + domain_bbox.parquet, + make_domain_bbox(domain.parquet, buffer_m = 50000, out_file = "data/target_outputs/domain_bbox.parquet"), + format = "file", + cue = tar_cue(mode = "never") + ), + # Domain raster with pixel IDs, remnants, and distance to remnants + tar_target( + domain_nc, + domain_rasterize( + domain = sfarrow::st_read_parquet(domain.parquet), + remnants_shp = remnants_shp, + out_file = "data/target_outputs/domain.nc" + ), + format = "file" + # tar_invalidate(domain_nc) # run this to force recompute, which will trigger redownloading all RS data from appeears -# # # # Infrequent updates via releases + ), + # Vegetation map raster tar_target( - alos_release, - get_release_alos(temp_directory = "data/temp/raw_data/alos/", - tag = "raw_static", - domain = domain, - json_token) - ) -, + vegmap_nc, + data_vegmap(domain_raster = domain_nc, + vegmap_shp = vegmap_shp, + out_file = "data/target_outputs/vegmap.nc"), + format = "file"), +# # # # Infrequent updates via releases - tar_target( - climate_chelsa_release, - get_release_climate_chelsa(temp_directory = "data/temp/raw_data/climate_chelsa/", - tag = "raw_static", - domain = domain) - ) -, - tar_target( - clouds_wilson_release, - get_release_clouds_wilson(temp_directory = "data/temp/raw_data/clouds_wilson/", - tag = "raw_static", - domain, - sleep_time = 180) + # tar_target( + # protected_area_distance_release, + # process_release_protected_area_distance(template_release, + # out_file = "protected_area_distance.tif", + # temp_directory = "data/temp/protected_area", + # out_tag = "processed_static") + # ), + +# tar_target( +# alos_release, +# get_release_alos(temp_directory = "data/temp/raw_data/alos/", +# tag = "raw_static", +# domain = domain, +# json_token) +# ) +#, + + tar_target( + climate_chelsa, + get_climate_chelsa( + domain = sfarrow::st_read_parquet(domain.parquet), + verbose = TRUE), + format = "file" ), + # tar_terra_rast( + # clouds_wilson_release, + # get_release_clouds_wilson(temp_directory = "data/temp/raw_data/clouds_wilson/", + # tag = "raw_static", + # domain, + # sleep_time = 180) + # ), + + # Sequential targets for AppEEARS elevation: submit task, then poll for results + # Allows independent timeouts and retries for long-running API calls tar_target( - elevation_nasadem_release, - get_release_elevation_nasadem(temp_directory = "data/temp/raw_data/elevation_nasadem/", - tag = "raw_static", - domain) + elevation_task_id, + submit_elevation_task( + domain_vector = sfarrow::st_read_parquet(domain.parquet), + verbose = TRUE ) -, + ), + + tar_target( + elevation, + download_elevation_results( + task_id = elevation_task_id, + domain_vector = sfarrow::st_read_parquet(domain.parquet), + domain_raster = domain_nc, + out_file = "data/target_outputs/elevation_nasadem.nc", + temp_directory = "data/temp/raw_data/elevation_nasadem/", + verbose = TRUE + ), + format = "file" + ), + + # Generate human-readable manifest of all targets for release documentation +# tar_target( +# release_manifest, +# generate_release_manifest(), +# format = "file" +# ) +# #, #Temporarily commented out, seems to be an issue with URL for landcover data at present # tar_target( @@ -308,12 +243,12 @@ list( # domain = domain) # ), # - tar_target( - precipitation_chelsa_release, - get_release_precipitation_chelsa(temp_directory = "data/temp/raw_data/precipitation_chelsa/", - tag = "raw_static", - domain = domain) - ), + # tar_target( + # precipitation_chelsa_release, + # get_release_precipitation_chelsa(temp_directory = "data/temp/raw_data/precipitation_chelsa/", + # tag = "raw_static", + # domain = domain) + # )#, # ## commented out soil_gcfr_release at present due to API/rdryad issues. # ## Emailed dryad folks on 2024/01/04, it seems the API update broke RDryad @@ -329,404 +264,305 @@ list( # # # # # # Frequent updates via releases - tar_age( - fire_modis_release, - get_release_fire_modis(temp_directory = "data/temp/raw_data/fire_modis/", - tag = "raw_fire_modis", - domain = domain, - max_layers = 5, - sleep_time = 5, - json_token = json_token, - verbose = FALSE), - #age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - age = as.difftime(0, units = "hours") - ), - - tar_age( - kndvi_modis_release, - get_release_kndvi_modis(temp_directory = "data/temp/raw_data/kndvi_modis/", - tag = "raw_kndvi_modis", - domain = domain, - max_layers = 5, - sleep_time = 5, - json_token = json_token, - verbose = TRUE), - age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - #age = as.difftime(0, units = "hours") - ), - - tar_age( - ndvi_modis_release, - get_release_ndvi_modis(temp_directory = "data/temp/raw_data/ndvi_modis/", - tag = "raw_ndvi_modis", - domain = domain, - max_layers = 12, - sleep_time = 5, - json_token = json_token), - #age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - age = as.difftime(0, units = "hours") - ), - - tar_age( - ndvi_viirs_release, - get_release_ndvi_viirs(temp_directory = "data/temp/raw_data/ndvi_viirs/", - tag = "raw_ndvi_viirs", - domain, - max_layers = 3, - sleep_time = 30, - json_token = json_token), - age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - #age = as.difftime(0, units = "hours") - ), - - - tar_age( - ndvi_dates_modis_release, - get_release_ndvi_dates_modis(temp_directory = "data/temp/raw_data/ndvi_dates_modis/", - repo_tag = "raw_ndvi_dates_modis", - domain = domain, - max_layers = 5, - sleep_time = 10, - json_token = json_token), - #age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - age = as.difftime(0, units = "hours") - ), - - tar_age( - ndvi_dates_viirs_release, - get_release_ndvi_dates_viirs(temp_directory = "data/temp/raw_data/ndvi_dates_viirs/", - tag = "raw_ndvi_dates_viirs", - domain = domain, - max_layers = 3, - sleep_time = 30, - json_token = json_token), - age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - #age = as.difftime(0, units = "hours") - ), - - - - tar_age(mean_ndvi_release, - get_release_mean_ndvi_modis(temp_directory = "data/temp/raw_data/mean_ndvi_modis/", - tag = "current", - domain = domain, - sleep_time = 1, - json_token = json_token), - #age = as.difftime(7, units = "days") - #age = as.difftime(1, units = "days") - age = as.difftime(0, units = "hours") - ), - -# # # # tar_age( -# # # # ndwi_modis_release, -# # # # get_release_ndwi_modis(temp_directory = "data/temp/raw_data/NDWI_MODIS/", -# # # # tag = "current", -# # # # domain, -# # # # drive_cred_path = json_token), -# # # # age = as.difftime(7, units = "days") -# # # # #age = as.difftime(1, units = "days") -# # # # #age = as.difftime(0, units = "hours") -# # # # ), -# # # -# # # -# # # -# # # # # # Fixing projection via releases - - - tar_target( - correct_fire_release_proj_and_extent, - process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/fire_modis/", - input_tag = "raw_fire_modis", - output_tag = "clean_fire_modis", - max_layers = NULL, - sleep_time = 30, - verbose = TRUE, - ... = fire_modis_release) - ), - - tar_target( - correct_ndvi_release_proj_and_extent, - process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/ndvi_modis/", - input_tag = "raw_ndvi_modis", - output_tag = "clean_ndvi_modis", - max_layers = NULL, - sleep_time = 30, - verbose = TRUE, - ... = ndvi_modis_release) - ), - +# tar_age( +# fire_modis_release, +# get_release_fire_modis_appeears(temp_directory = "data/temp/raw_data/fire_modis/", +# tag = "raw_fire_modis_nc", +# domain = domain, +# max_layers = 5, +# sleep_time = 5, +# verbose = TRUE), +# age = as.difftime(7, units = "days") +# #age = as.difftime(1, units = "days") +# #age = as.difftime(0, units = "hours"), +# cue = tar_cue(mode = if (run_mode == "update") "always" else "thorough") +# ), + + # Sequential targets for AppEEARS MODIS NDVI/EVI: submit task, then poll for results + # Allows independent timeouts and retries for long-running API calls tar_target( - correct_ndvi_dates_release_proj_and_extent, - process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/ndvi_dates_modis/", - input_tag = "raw_ndvi_dates_modis", - output_tag = "clean_ndvi_dates_modis", - max_layers = NULL, - sleep_time = 30, - verbose = TRUE, - ... = ndvi_dates_modis_release) + modis_vi_task_id, + submit_modis_vi_task( + domain_vector = sfarrow::st_read_parquet(domain.parquet), + mode = run_mode + ) ), - tar_target( - correct_ndvi_viirs_release_proj_and_extent, - process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/ndvi_viirs/", - input_tag = "raw_ndvi_viirs", - output_tag = "clean_ndvi_viirs", - max_layers = 30, - sleep_time = 30, - verbose = TRUE, - ... = ndvi_viirs_release) - ), - - - tar_target( - correct_ndvi_dates_viirs_release_proj_and_extent, - process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/ndvi_dates_viirs/", - input_tag = "raw_ndvi_dates_viirs", - output_tag = "clean_ndvi_dates_viirs", - max_layers = 30, - sleep_time = 30, - verbose = TRUE, - ... = ndvi_dates_viirs_release) - ), - - tar_target( - correct_kndvi_release_proj_and_extent, - process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/kndvi_modis/", - input_tag = "raw_kndvi_modis", - output_tag = "clean_kndvi_modis", - max_layers = 30, - sleep_time = 45, - verbose = TRUE, - ... = kndvi_modis_release) - ), # second chunk - -# # # Processing via release - - tar_target( - fire_doy_to_unix_date_release, - process_release_fire_doy_to_unix_date(input_tag = "clean_fire_modis", - output_tag = "processed_fire_dates", - temp_directory = "data/temp/processed_data/fire_dates/", - sleep_time = 20, - template_release = template_release, - ... = correct_fire_release_proj_and_extent) - ), - - tar_target( - burn_date_to_last_burned_date_release, - process_release_burn_date_to_last_burned_date(input_tag = "processed_fire_dates", - output_tag = "processed_most_recent_burn_dates", - temp_directory_input = "data/temp/processed_data/fire_dates/", - temp_directory_output = "data/temp/processed_data/most_recent_burn_dates/", - sleep_time = 180, - sanbi_sf = sanbi_fires_shp, - expiration_date = NULL, - ... = fire_doy_to_unix_date_release) + modis_vi, + download_modis_vi_results( + task_id = modis_vi_task_id, + domain_vector = sfarrow::st_read_parquet(domain.parquet), + domain_raster = domain_nc, + mode = run_mode ), - - - tar_target( - ndvi_relative_days_since_fire_release, - process_release_ndvi_relative_days_since_fire(temp_input_ndvi_date_folder = "data/temp/raw_data/ndvi_dates_modis/", - temp_input_fire_date_folder = "data/temp/processed_data/most_recent_burn_dates/", - temp_fire_output_folder = "data/temp/processed_data/ndvi_relative_time_since_fire/", - input_fire_dates_tag = "processed_most_recent_burn_dates", - input_modis_dates_tag = "clean_ndvi_dates_modis", - output_tag = "processed_ndvi_relative_days_since_fire", - sleep_time = 60, - ... = burn_date_to_last_burned_date_release, - ... = correct_ndvi_dates_release_proj_and_extent) - ), - - tar_target( - template_release, - get_release_template_raster(input_tag = "clean_ndvi_modis", - output_tag = "raw_static", - temp_directory = "data/temp/template", - ... = correct_ndvi_release_proj_and_extent) - ), - - tar_target( - remnants_release, - domain_remnants_release(domain = domain, - remnants_shp = remnants_shp, - template_release, - temp_directory = "data/temp/remnants", - out_file = "remnants.tif", - out_tag = "processed_static") - ), # 3-1 - - tar_target( - remnant_distance_release, - domain_distance_release(remnants_release = remnants_release, - out_file = "remnant_distance.tif", - temp_directory = "data/temp/remnants", - out_tag = "processed_static") - ), - - tar_target( - protected_area_distance_release, - process_release_protected_area_distance(template_release, - out_file = "protected_area_distance.tif", - temp_directory = "data/temp/protected_area", - out_tag = "processed_static") - ), - - tar_target( - projected_alos_release, - process_release_alos(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/alos/", - template_release = template_release, - sleep_time = 60, - ... = alos_release) - ), - - tar_target( - projected_climate_chelsa_release, - process_release_climate_chelsa(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/climate_chelsa/", - template_release = template_release, - ... = climate_chelsa_release) - ), - - tar_target( - projected_clouds_wilson_release, - process_release_clouds_wilson(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/clouds_wilson/", - template_release = template_release, - sleep_time = 180, - ... = clouds_wilson_release) - ), # 3-2 - - tar_target( - projected_elevation_nasadem_release, - process_release_elevation_nasadem(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/elevation_nasadem/", - template_release = template_release, - sleep_time = 0, - ... = elevation_nasadem_release) - ), - - tar_target( - projected_landcover_za_release, - process_release_landcover_za(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/landcover_za/", - template_release, - sleep_time = 60, - ... = landcover_za_release) - ) - , - - tar_target( - projected_precipitation_chelsa_release, - process_release_precipitation_chelsa(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/precipitation_chelsa/", - template_release, - sleep_time = 60, - ... = precipitation_chelsa_release) - - ), - - tar_target( - projected_soil_gcfr_release, - process_release_soil_gcfr(input_tag = "raw_static", - output_tag = "processed_static", - temp_directory = "data/temp/raw_data/soil_gcfr/", - template_release, - sleep_time = 60, - ... = soil_gcfr_release) - - ), - - tar_target( - vegmap_modis_proj, - process_release_biome_raster(template_release = template_release, - vegmap_shp = vegmap_shp, - domain = domain, - temp_directory = "data/temp/raw_data/vegmap_raster/", - sleep_time = 10) - - ), - - - - -# # # # # Prep model data - - tar_target( - stable_data_release, - process_release_stable_data(temp_directory = "data/temp/processed_data/static/", - input_tag = "processed_static", - output_tag = "current", - sleep_time = 120, - ... = projected_precipitation_chelsa_release, - ... = projected_landcover_za_release, - ... = projected_elevation_nasadem_release, - ... = projected_clouds_wilson_release, - ... = projected_climate_chelsa_release, - ... = projected_alos_release, - ... = remnant_distance_release, - ... = protected_area_distance_release, - ... = projected_soil_gcfr_release) - ), - - tar_target( - ndvi_to_parquet_release, - process_release_dynamic_data_to_parquet(temp_directory = "data/temp/raw_data/ndvi_modis/", - input_tag = "clean_ndvi_modis", - output_tag = "current", - variable_name = "ndvi", - sleep_time = 30, - ... = correct_ndvi_release_proj_and_extent) - ), - - tar_target( - fire_dates_to_parquet_release, - process_release_dynamic_data_to_parquet(temp_directory = "data/temp/processed_data/ndvi_relative_time_since_fire/", - input_tag = "processed_ndvi_relative_days_since_fire", - output_tag = "current", - variable_name = "time_since_fire", - sleep_time = 30, - ... = ndvi_relative_days_since_fire_release) - ), - - tar_target( - most_recent_fire_dates_to_parquet_release, - process_release_dynamic_data_to_parquet(temp_directory = "data/temp/processed_data/most_recent_burn_dates/", - input_tag = "processed_most_recent_burn_dates", - output_tag = "current", - variable_name = "most_recent_burn_dates", - sleep_time = 30, - ... = burn_date_to_last_burned_date_release) - ), - -# periodically clean up google drive folder - - tar_age( - remove_ee_backup, - clean_up(), - #age = as.difftime(7, units = "days") - age = as.difftime(0, units = "hours") + format = "file" ) +# tar_age( +# ndvi_viirs_release, +# get_release_ndvi_viirs_appeears(temp_directory = "data/temp/raw_data/ndvi_viirs/", +# tag = "raw_ndvi_viirs_nc", +# domain, +# max_layers = 3, +# sleep_time = 1), +# age = as.difftime(7, units = "days") +# #age = as.difftime(1, units = "days") +# #age = as.difftime(0, units = "hours") +# ), + +# # # # # # # Fixing projection via releases + + +# tar_target( +# correct_fire_release_proj_and_extent, +# process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/fire_modis/", +# input_tag = "raw_fire_modis", +# output_tag = "clean_fire_modis", +# max_layers = NULL, +# sleep_time = 30, +# verbose = TRUE, +# ... = fire_modis_release) +# ), + +# tar_target( +# correct_ndvi_release_proj_and_extent, +# process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/ndvi_modis/", +# input_tag = "raw_ndvi_modis", +# output_tag = "clean_ndvi_modis", +# max_layers = NULL, +# sleep_time = 30, +# verbose = TRUE, +# ... = ndvi_modis_release) +# ), + +# tar_target( +# correct_ndvi_dates_release_proj_and_extent, +# process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/ndvi_dates_modis/", +# input_tag = "raw_ndvi_dates_modis", +# output_tag = "clean_ndvi_dates_modis", +# max_layers = NULL, +# sleep_time = 30, +# verbose = TRUE, +# ... = ndvi_dates_modis_release) +# ), + + +# tar_target( +# correct_ndvi_viirs_release_proj_and_extent, +# process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/ndvi_viirs/", +# input_tag = "raw_ndvi_viirs", +# output_tag = "clean_ndvi_viirs", +# max_layers = 30, +# sleep_time = 30, +# verbose = TRUE, +# ... = ndvi_viirs_release) +# ), + + +# tar_target( +# correct_ndvi_dates_viirs_release_proj_and_extent, +# process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/ndvi_dates_viirs/", +# input_tag = "raw_ndvi_dates_viirs", +# output_tag = "clean_ndvi_dates_viirs", +# max_layers = 30, +# sleep_time = 30, +# verbose = TRUE, +# ... = ndvi_dates_viirs_release) +# ), + +# tar_target( +# correct_kndvi_release_proj_and_extent, +# process_fix_modis_release_projection_and_extent(temp_directory = "data/temp/raw_data/kndvi_modis/", +# input_tag = "raw_kndvi_modis", +# output_tag = "clean_kndvi_modis", +# max_layers = 30, +# sleep_time = 45, +# verbose = TRUE, +# ... = kndvi_modis_release) +# ), # second chunk + +# # # # Processing via release + +# tar_target( +# fire_doy_to_unix_date_release, +# process_release_fire_doy_to_unix_date(input_tag = "clean_fire_modis", +# output_tag = "processed_fire_dates", +# temp_directory = "data/temp/processed_data/fire_dates/", +# sleep_time = 20, +# template_release = template_release, +# ... = correct_fire_release_proj_and_extent) +# ), + +# tar_target( +# burn_date_to_last_burned_date_release, +# process_release_burn_date_to_last_burned_date(input_tag = "processed_fire_dates", +# output_tag = "processed_most_recent_burn_dates", +# temp_directory_input = "data/temp/processed_data/fire_dates/", +# temp_directory_output = "data/temp/processed_data/most_recent_burn_dates/", +# sleep_time = 180, +# sanbi_sf = sanbi_fires_shp, +# expiration_date = NULL, +# ... = fire_doy_to_unix_date_release) +# ), + + +# tar_target( +# ndvi_relative_days_since_fire_release, +# process_release_ndvi_relative_days_since_fire(temp_input_ndvi_date_folder = "data/temp/raw_data/ndvi_dates_modis/", +# temp_input_fire_date_folder = "data/temp/processed_data/most_recent_burn_dates/", +# temp_fire_output_folder = "data/temp/processed_data/ndvi_relative_time_since_fire/", +# input_fire_dates_tag = "processed_most_recent_burn_dates", +# input_modis_dates_tag = "clean_ndvi_dates_modis", +# output_tag = "processed_ndvi_relative_days_since_fire", +# sleep_time = 60, +# ... = burn_date_to_last_burned_date_release, +# ... = correct_ndvi_dates_release_proj_and_extent) +# ), + +# tar_target( +# template_release, +# get_release_template_raster(input_tag = "clean_ndvi_modis", +# output_tag = "raw_static", +# temp_directory = "data/temp/template", +# ... = correct_ndvi_release_proj_and_extent) +# ), + + + +# tar_target( +# projected_alos_release, +# process_release_alos(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/alos/", +# template_release = template_release, +# sleep_time = 60, +# ... = alos_release) +# ), + +# tar_target( +# projected_climate_chelsa_release, +# process_release_climate_chelsa(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/climate_chelsa/", +# template_release = template_release, +# ... = climate_chelsa_release) +# ), + +# tar_target( +# projected_clouds_wilson_release, +# process_release_clouds_wilson(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/clouds_wilson/", +# template_release = template_release, +# sleep_time = 180, +# ... = clouds_wilson_release) +# ), # 3-2 + +# tar_target( +# projected_elevation_nasadem_release, +# process_release_elevation_nasadem(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/elevation_nasadem/", +# template_release = template_release, +# sleep_time = 0, +# ... = elevation_nasadem_release) +# ), + +# tar_target( +# projected_landcover_za_release, +# process_release_landcover_za(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/landcover_za/", +# template_release, +# sleep_time = 60, +# ... = landcover_za_release) +# ) +# , + +# tar_target( +# projected_precipitation_chelsa_release, +# process_release_precipitation_chelsa(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/precipitation_chelsa/", +# template_release, +# sleep_time = 60, +# ... = precipitation_chelsa_release) + +# ), + +# tar_target( +# projected_soil_gcfr_release, +# process_release_soil_gcfr(input_tag = "raw_static", +# output_tag = "processed_static", +# temp_directory = "data/temp/raw_data/soil_gcfr/", +# template_release, +# sleep_time = 60, +# ... = soil_gcfr_release) + +# ), + +# tar_target( +# vegmap_modis_proj, +# process_release_biome_raster(template_release = template_release, +# vegmap_shp = vegmap_shp, +# domain = domain, +# temp_directory = "data/temp/raw_data/vegmap_raster/", +# sleep_time = 10) + +# ), + + + + +# # # # # # Prep model data + +# tar_target( +# stable_data_release, +# process_release_stable_data(temp_directory = "data/temp/processed_data/static/", +# input_tag = "processed_static", +# output_tag = "current", +# sleep_time = 120, +# ... = projected_precipitation_chelsa_release, +# ... = projected_landcover_za_release, +# ... = projected_elevation_nasadem_release, +# ... = projected_clouds_wilson_release, +# ... = projected_climate_chelsa_release, +# ... = projected_alos_release, +# ... = remnant_distance_release, +# ... = protected_area_distance_release, +# ... = projected_soil_gcfr_release) +# ), + +# tar_target( +# ndvi_to_parquet_release, +# process_release_dynamic_data_to_parquet(temp_directory = "data/temp/raw_data/ndvi_modis/", +# input_tag = "clean_ndvi_modis", +# output_tag = "current", +# variable_name = "ndvi", +# sleep_time = 30, +# ... = correct_ndvi_release_proj_and_extent) +# ), + +# tar_target( +# fire_dates_to_parquet_release, +# process_release_dynamic_data_to_parquet(temp_directory = "data/temp/processed_data/ndvi_relative_time_since_fire/", +# input_tag = "processed_ndvi_relative_days_since_fire", +# output_tag = "current", +# variable_name = "time_since_fire", +# sleep_time = 30, +# ... = ndvi_relative_days_since_fire_release) +# ), + +# tar_target( +# most_recent_fire_dates_to_parquet_release, +# process_release_dynamic_data_to_parquet(temp_directory = "data/temp/processed_data/most_recent_burn_dates/", +# input_tag = "processed_most_recent_burn_dates", +# output_tag = "current", +# variable_name = "most_recent_burn_dates", +# sleep_time = 30, +# ... = burn_date_to_last_burned_date_release) +# ) ) - - - - -################################################################################ diff --git a/_targets/.gitignore b/_targets/.gitignore index a8c51cda..23ab7917 100644 --- a/_targets/.gitignore +++ b/_targets/.gitignore @@ -1,3 +1,9 @@ +# CAUTION: do not edit this file by hand! +# _targets/objects/ may have large data files, +# and _targets/meta/process may have sensitive information. +# It is good pratice to either commit nothing from _targets/, +# or if your data is not too sensitive, +# commit only _targets/meta/meta. * !.gitignore !meta diff --git a/_targets/meta/meta b/_targets/meta/meta new file mode 100644 index 00000000..77024ef3 --- /dev/null +++ b/_targets/meta/meta @@ -0,0 +1,165 @@ +name|type|data|command|depend|seed|path|time|size|bytes|format|repository|iteration|parent|children|seconds|warnings|error +remnants_shp|stem|d03b72197917a3dc|4adc3961bf1f92a3|2c530c1562a7fbd1|977857804|data/manual_download/RLE_2021_Remnants/RLE_Terr_2021_June2021_Remnants_ddw.shp|t20445.6915274758s|s726393404b|726393404|file|local|vector|||0.039|| +vegmap_shp|stem|9cade294bcf5aff4|66bbc84b2758a527|00bcda0fe14dd1f7|-979952299|data/manual_download/NVM2024/shapefile/NVM2024Final_IEM5_12_07012025.shp|t20465.9081331559s|s499322168b|499322168|file|local|vector|||0.001|| +capenature_fires_shp|stem|13d0029b14d0e2de|cb2c5823b318874b|2c530c1562a7fbd1|-1931602475|data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp|t19949.7370138889s|s15173392b|15173392|file|local|vector|||0|| +tar_github_release_resources|function|5005c1e1d1f13042 +gh_repo|object|16746eb5bfe821e5 +country.parquet|stem|04cdeab4a28eb840|81ddbcfc163d4096|a9ed219479ad558a|1129261391|data/target_outputs/country.parquet|t20468.8978158307s|s4488799b|4488799|file|local|vector|||14.168|| +domain.parquet|stem|c46b7f544a0c0629|7f3fdd56ef8d2af4|523b06acb3644474|522092063|data/raw/domain.parquet|t20468.8979740126s|s2564266b|2564266|file|local|vector|||13.64|This is an initial implementation of Parquet/Feather file support and geo metadata. This is tracking version 0.1.0 of the metadata (https://github.com/geopandas/geo-arrow-spec). This metadata specification may change and does not yet make stability promises. We do not yet recommend using this in a production setting unless you are able to rewrite your Parquet/Feather files.| +elevation_task_id|stem|1d0231df9e8c8ba7|55a3c73e6beea760|41b787fd3eb7f933|1108492909||t20468.898017958s|s89b|89|rds|local|vector|||3.772|| +climate_chelsa|stem|ba5507a031702ef1|7609b9045a1f1bf6|5952698dfc9e50de|175391582|data/target_outputs//CHELSA_bio01_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio02_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio03_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio04_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio05_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio06_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio07_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio08_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio09_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio10_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio11_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio12_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio13_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio14_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio15_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio16_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio17_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio18_1981-2010_V.2.1.nc*data/target_outputs//CHELSA_bio19_1981-2010_V.2.1.nc|t20469.0581677964s|s6813490b|6813490|file|local|vector|||1193.846|[mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match. [mask] CRS do not match| +domain_bbox.parquet|stem|25cd0fd1894c1176|8ef5b89424c2d345|fb33e4abae37e8ee|1651755667|data/target_outputs/domain_bbox.parquet|t20469.0581704592s|s15057b|15057|file|local|vector|||0.059|This is an initial implementation of Parquet/Feather file support and geo metadata. This is tracking version 0.1.0 of the metadata (https://github.com/geopandas/geo-arrow-spec). This metadata specification may change and does not yet make stability promises. We do not yet recommend using this in a production setting unless you are able to rewrite your Parquet/Feather files.| +get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 +run_mode|object|2a9122a6b200ac1c +domain_map|function|9b57e91e94d73101 +rstoken|object|36a62e4262736b46 +robust_pb_download_solo|function|d148e32c5f7beb8f +fit_model|function|8f8e281853bbef05 +process_dynamic_data_to_parquet|function|49f8abfce5758803 +clean_data|function|860451632161bcc2 +gh_repo_config|object|148485602b17d22f +domain_rasterize|function|ec9f6819b53a9141 +robust_download_file|function|2ea70b1df9a469fc +verbose|object|988c41ba10911dc8 +kr_pwd|object|b61b0b830c8b3de2 +get_release_precipitation_chelsa|function|e5a54d4f8a475a6c +summarize_posteriors|function|848f748de452ef0d +generate_release_manifest|function|78d2547358ff6e21 +robust_pb_upload|function|bf296132f5183235 +.Random.seed|object|7764f589aaea2c5d +submit_elevation_task|function|92fc82902368a1a4 +tag|object|64ff18d09ad298f3 +earthdata_user|object|a72c4475a256a3c1 +sys_info|object|ada53e2071fe586e +max_layers|object|08d5f59e833de599 +get_country|function|0fa48242b80aef5e +existing_kr|object|1bb3bf184f7669e1 +tar_download_github_release|function|ae9cf6649e00a63e +download_vegmap_release|function|0273ecf8e3505b66 +process_fix_modis_projection|function|08e12464ac799094 +group_data_function|function|3e4778f64d247976 +data_vegmap|function|3aea21ddb80cc68d +get_release_soil_gcfr|function|a0922c0000fe3eac +get_release_ndvi_viirs_appeears|function|e0bb04ad860b66e9 +release_data|function|2c9988c7000cc9cb +spatial_outputs|function|d4fac95c20424f91 +stan_data_function|function|7bb856cb63dafc1b +process_stable_data|function|7b7dbd9205f1e1aa +tar_upload_github_release|function|db4c1417c241733e +robust_max|function|6d27abe569a34028 +get_release_landcover_za|function|9ece1e5f946d7a70 +get_vegmap|function|8590caba91b9be39 +get_release_fire_modis_appeears|function|9992a7da9cc6cf78 +domain_define|function|6e7942fc59c20a13 +kr_name|object|643fa3c4a8310651 +temp_directory|object|40d122f36d50a344 +submit_modis_vi_task|function|a1115504e2b1117d +earthdata_pass|object|b61b0b830c8b3de2 +sleep_time|object|9f0cda529028d8d9 +update_git|function|8d72fa6c21b94951 +download_elevation_results|function|c4d32844b7a0c79c +download_modis_vi_results|function|626e66805aa1cbfa +get_model_data|function|dc3148c05e8961ed +make_domain_bbox|function|39ee8fcd6d65cd43 +tar_github_release_repo|function|a519c9bb3c290bb0 +robust_min|function|21d2e9972a741573 +robust_pb_download|function|4df763e84d88eae4 +get_release_clouds_wilson|function|76923df0f19c017f +get_chelsa|function|f63060c4751e6183 +get_climate_chelsa|function|9bc2b341f111c0cd +process_release_precipitation_chelsa|function|d0ff995578684615 +process_fix_modis_NDVI_release_extent|function|78480d840c75d726 +process_release_stable_data|function|d7e21566c1505209 +process_release_landcover_za|function|df1122d1616ce553 +process_release_ndvi_relative_days_since_fire|function|1618a29d1bc7ce97 +process_release_elevation_nasadem|function|73c3236559d7c4cc +process_release_soil_gcfr|function|51a95877cbbd87c2 +process_release_protected_area_distance|function|4ded7cf04ce267a2 +process_release_climate_chelsa|function|bbaf017bff9aa203 +process_release_fire_doy_to_unix_date|function|4ed8b31bf3143599 +process_release_dynamic_data_to_parquet|function|ebe5748129d83a52 +process_fix_modis_release_extent|function|a7fcb6002d0c81b0 +process_fix_modis_release_projection_and_extent|function|0b5c9acab6c0fda2 +process_release_clouds_wilson|function|82bb664b6826489b +process_release_burn_date_to_last_burned_date|function|72c41eb8a175408f +process_fix_modis_release_projection|function|d5471fb33885fc04 +get_release_template_raster|function|67f3e5666754d69d +domain_nc|stem|c8997ef9648703da|44c56a6de456a0fc|44a1851f1c7c45da|191087344|data/target_outputs/domain.nc|t20469.7212669576s|s8239559b|8239559|file|local|vector|||307.884|attribute variables are assumed to be spatially constant throughout all geometries. NAs introduced by coercion to integer range. NAs introduced by coercion to integer range| +modis_vi_task_id|stem|7ce1386f8ab4d69f|f9e6c519592715a2|d07be0277633f47e|-544630002||t20469.7213228447s|s89b|89|rds|local|vector|||4.78|| +elevation|stem|4ad3c0e593ba0059|ef9f4e01e54fb273|9de4b5dcef7d82c8|223776802|data/target_outputs/elevation_nasadem.nc|t20469.7216113194s|s12700599b|12700599|file|local|vector|||25.056|| +vegmap_nc|stem|1d9b0776ca50b8e6|ff356bc5e06835c0|cfef7ad3000e3367|573083685|data/target_outputs/vegmap.nc|t20469.6217865806s||1262002|file|local|vector|||18.968|attribute variables are assumed to be spatially constant throughout all geometries|[disagg] path does not exist +run_mode|object|2a9122a6b200ac1c +domain_map|function|9b57e91e94d73101 +rstoken|object|36a62e4262736b46 +robust_pb_download_solo|function|d148e32c5f7beb8f +fit_model|function|8f8e281853bbef05 +process_dynamic_data_to_parquet|function|49f8abfce5758803 +clean_data|function|860451632161bcc2 +gh_repo_config|object|148485602b17d22f +domain_rasterize|function|ec9f6819b53a9141 +robust_download_file|function|2ea70b1df9a469fc +verbose|object|988c41ba10911dc8 +kr_pwd|object|b61b0b830c8b3de2 +get_release_precipitation_chelsa|function|e5a54d4f8a475a6c +summarize_posteriors|function|848f748de452ef0d +generate_release_manifest|function|78d2547358ff6e21 +robust_pb_upload|function|bf296132f5183235 +.Random.seed|object|612476a84f3c2799 +submit_elevation_task|function|92fc82902368a1a4 +tag|object|64ff18d09ad298f3 +earthdata_user|object|a72c4475a256a3c1 +sys_info|object|ada53e2071fe586e +max_layers|object|08d5f59e833de599 +get_country|function|0fa48242b80aef5e +existing_kr|object|1bb3bf184f7669e1 +tar_download_github_release|function|ae9cf6649e00a63e +download_vegmap_release|function|0273ecf8e3505b66 +process_fix_modis_projection|function|08e12464ac799094 +group_data_function|function|3e4778f64d247976 +data_vegmap|function|3aea21ddb80cc68d +get_release_soil_gcfr|function|a0922c0000fe3eac +get_release_ndvi_viirs_appeears|function|e0bb04ad860b66e9 +release_data|function|2c9988c7000cc9cb +spatial_outputs|function|d4fac95c20424f91 +stan_data_function|function|7bb856cb63dafc1b +process_stable_data|function|7b7dbd9205f1e1aa +tar_upload_github_release|function|db4c1417c241733e +robust_max|function|6d27abe569a34028 +get_release_landcover_za|function|9ece1e5f946d7a70 +get_vegmap|function|8590caba91b9be39 +get_release_fire_modis_appeears|function|9992a7da9cc6cf78 +domain_define|function|6e7942fc59c20a13 +kr_name|object|643fa3c4a8310651 +temp_directory|object|40d122f36d50a344 +submit_modis_vi_task|function|a1115504e2b1117d +earthdata_pass|object|b61b0b830c8b3de2 +sleep_time|object|9f0cda529028d8d9 +update_git|function|8d72fa6c21b94951 +download_elevation_results|function|c4d32844b7a0c79c +download_modis_vi_results|function|626e66805aa1cbfa +get_model_data|function|dc3148c05e8961ed +make_domain_bbox|function|39ee8fcd6d65cd43 +tar_github_release_repo|function|a519c9bb3c290bb0 +robust_min|function|21d2e9972a741573 +robust_pb_download|function|4df763e84d88eae4 +get_release_clouds_wilson|function|76923df0f19c017f +get_chelsa|function|f63060c4751e6183 +get_climate_chelsa|function|9bc2b341f111c0cd +process_release_precipitation_chelsa|function|d0ff995578684615 +process_fix_modis_NDVI_release_extent|function|78480d840c75d726 +process_release_stable_data|function|d7e21566c1505209 +process_release_landcover_za|function|df1122d1616ce553 +process_release_ndvi_relative_days_since_fire|function|1618a29d1bc7ce97 +process_release_elevation_nasadem|function|73c3236559d7c4cc +process_release_soil_gcfr|function|51a95877cbbd87c2 +process_release_protected_area_distance|function|4ded7cf04ce267a2 +process_release_climate_chelsa|function|bbaf017bff9aa203 +process_release_fire_doy_to_unix_date|function|4ed8b31bf3143599 +process_release_dynamic_data_to_parquet|function|ebe5748129d83a52 +process_fix_modis_release_extent|function|a7fcb6002d0c81b0 +process_fix_modis_release_projection_and_extent|function|0b5c9acab6c0fda2 +process_release_clouds_wilson|function|82bb664b6826489b +process_release_burn_date_to_last_burned_date|function|72c41eb8a175408f +process_fix_modis_release_projection|function|d5471fb33885fc04 +get_release_template_raster|function|67f3e5666754d69d +vegmap_nc|stem|0d0a5bfccaaffa6c|ff356bc5e06835c0|cfef7ad3000e3367|573083685|data/target_outputs/vegmap.nc|t20469.7247331646s|s1262002b|1262002|file|local|vector|||225.048|attribute variables are assumed to be spatially constant throughout all geometries| diff --git a/ccr_startup.sh b/ccr_startup.sh new file mode 100644 index 00000000..840233c0 --- /dev/null +++ b/ccr_startup.sh @@ -0,0 +1,28 @@ +#! /bin/bash + +# Connect to CCR and request an interactive job + +ssh vortex.ccr.buffalo.edu +salloc --cluster=faculty --qos=adamw --partition=adamw \ + --job-name=InteractiveJob --nodes=1 --ntasks=4 \ + --mem=10G -C INTEL --time=24:00:00 + +export GROUP="adamw" +export PROJECT_FOLDER="/projects/academic/"$GROUP +export APPTAINER_CACHEDIR="/vscratch/grp-adamw/"$USER"/singularity" +export SIF_PATH=$PROJECT_FOLDER"/users/"$USER"/singularity" +export SIF_FILE="AdamWilsonLab-emma_docker-latest.sif" + + +apptainer run \ + --bind $PROJECT_FOLDER:$PROJECT_FOLDER \ + --bind $APPTAINER_CACHEDIR/tmp:/tmp \ + --bind $APPTAINER_CACHEDIR/run:/run \ + $SIF_PATH/$SIF_FILE R + + + +# Test github actions locally +act -j targets \ + --platform ubuntu-latest=adamwilsonlab/emma:latest \ + --container-architecture linux/amd64 \ No newline at end of file diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.dbf b/data/manual_download/All_Fires/All_Fires_20_21_gw.dbf deleted file mode 100644 index 712fa7ae..00000000 --- a/data/manual_download/All_Fires/All_Fires_20_21_gw.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6b6256fd8c9c3b9943579d919ac4d2605a4a7c5b66ec19e5c590d28017fb6df -size 4455696 diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.lyr b/data/manual_download/All_Fires/All_Fires_20_21_gw.lyr deleted file mode 100644 index 91c7cbad..00000000 Binary files a/data/manual_download/All_Fires/All_Fires_20_21_gw.lyr and /dev/null differ diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.pdf b/data/manual_download/All_Fires/All_Fires_20_21_gw.pdf deleted file mode 100644 index ecda38f4..00000000 Binary files a/data/manual_download/All_Fires/All_Fires_20_21_gw.pdf and /dev/null differ diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.prj b/data/manual_download/All_Fires/All_Fires_20_21_gw.prj deleted file mode 100644 index a30c00a5..00000000 --- a/data/manual_download/All_Fires/All_Fires_20_21_gw.prj +++ /dev/null @@ -1 +0,0 @@ -GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.qml b/data/manual_download/All_Fires/All_Fires_20_21_gw.qml deleted file mode 100644 index a784974e..00000000 --- a/data/manual_download/All_Fires/All_Fires_20_21_gw.qml +++ /dev/null @@ -1,577 +0,0 @@ - - - - 1 - 1 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 0 - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - 0 - generatedlayout - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RES_NAME - - 2 - diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.qpj b/data/manual_download/All_Fires/All_Fires_20_21_gw.qpj deleted file mode 100644 index 5fbc831e..00000000 --- a/data/manual_download/All_Fires/All_Fires_20_21_gw.qpj +++ /dev/null @@ -1 +0,0 @@ -GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]] diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.sbn b/data/manual_download/All_Fires/All_Fires_20_21_gw.sbn deleted file mode 100644 index fb296b86..00000000 Binary files a/data/manual_download/All_Fires/All_Fires_20_21_gw.sbn and /dev/null differ diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.sbx b/data/manual_download/All_Fires/All_Fires_20_21_gw.sbx deleted file mode 100644 index 15303df9..00000000 Binary files a/data/manual_download/All_Fires/All_Fires_20_21_gw.sbx and /dev/null differ diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.shp b/data/manual_download/All_Fires/All_Fires_20_21_gw.shp deleted file mode 100644 index e729e422..00000000 --- a/data/manual_download/All_Fires/All_Fires_20_21_gw.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acafbdd28da2f5329a16bfa4bc69e7c77baad88f9cc43dbc1a925672e230b8e5 -size 14277344 diff --git a/data/manual_download/All_Fires/All_Fires_20_21_gw.shx b/data/manual_download/All_Fires/All_Fires_20_21_gw.shx deleted file mode 100644 index 9d0c67a7..00000000 Binary files a/data/manual_download/All_Fires/All_Fires_20_21_gw.shx and /dev/null differ diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.cpg b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.cpg new file mode 100644 index 00000000..3ad133c0 --- /dev/null +++ b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.cpg @@ -0,0 +1 @@ +UTF-8 \ No newline at end of file diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.dbf b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.dbf new file mode 100644 index 00000000..4a2ce1e6 --- /dev/null +++ b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.dbf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a0a89f91aea8c4c393f11a356ecbb87a7eb0b6c379a395fd4fdb8f9b11e343d +size 3752962 diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.lyr b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.lyr new file mode 100644 index 00000000..f4ba38cf Binary files /dev/null and b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.lyr differ diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.pdf b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.pdf new file mode 100644 index 00000000..2024f82b Binary files /dev/null and b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.pdf differ diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.prj b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.prj new file mode 100644 index 00000000..f45cbadf --- /dev/null +++ b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.qml b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.qml new file mode 100644 index 00000000..8026a13c --- /dev/null +++ b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.qml @@ -0,0 +1,972 @@ + + + + 1 + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + generatedlayout + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + "RES_NAME" + + 2 + diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbn b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbn new file mode 100644 index 00000000..bc393860 Binary files /dev/null and b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbn differ diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbx b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbx new file mode 100644 index 00000000..c98d69a1 Binary files /dev/null and b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbx differ diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp new file mode 100644 index 00000000..3c62efb3 --- /dev/null +++ b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c9d77abce418d99fe169e64914d7779dc3d5db38c221a0396166ab46515c53c +size 15173392 diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp.xml b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp.xml new file mode 100644 index 00000000..02e803eb --- /dev/null +++ b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp.xml @@ -0,0 +1,2 @@ + +20240726134913001.0FALSECalculateField All_Fires_23_24_merge_fields1 AREA [Area_ha] VB #CalculateField All_Fires_23_24_merge_fields Area_ha [AREA] VB #CalculateField All_Fires_23_24_merge_fields RES_CODE Left( [FIRE_CODE],4 ) VB #CalculateField All_Fires_23_24_merge_fields yr_temp Mid( [FIRE_CODE],9,4 ) VB #CalculateField All_Fires_23_24_merge_fields mnth_temp Mid( [FIRE_CODE],6,2 ) VB #CalculateField All_Fires_23_24_merge_fields MONTH [mnth_temp] VB #CalculateField All_Fires_23_24_merge_fields YEAR [yr_temp] VB #CalculateField All_Fires_23_24_merge_fields Yr_mnth "[yr_temp] +"-" + [mnth_temp]" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Witzenberg Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Boland Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Kogelberg Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Garden Route Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Karoo Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Anysberg Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Overberg Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Langeberg Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "De Hoop Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Peninsula Landscape Unit" VB #CalculateField All_Fires_23_24_merge_fields LAND_UNIT "Ceder-Berg Landscape Unit" VB #Sort All_Fires_23_24_merge_fields D:\1_GIS_work\9_00_CNC2024_1161_Fires\1_FINAL\All_fires_23_24_gw.shp "YEAR ASCENDING" URRepairGeometry All_fires_23_24_gw DELETE_NULLRepairGeometry All_fires_23_24_gw DELETE_NULLCalculateField All_fires_23_24_gw FIRE_CODE "DEHP/02/1992/01" VB #CalculateField All_fires_23_24_gw LOCAL_DESC "Witklip Infanta" VB #CalculateField All_fires_23_24_gw LOCAL_DESC "Buffelsfontein" VB #CalculateField All_fires_23_24_gw FIRE_CODE "DEHP/02/1992/02" VB #All_fires_23_24_gw0020.000file://\\CAPWKSLAP165\D$\1_GIS_work\9_00_CNC2024_1161_Fires\1_FINAL\All_fires_23_24_gw.shpLocal Area NetworkGeographicGCS_WGS_1984Angular Unit: Degree (0.017453)<GeographicCoordinateSystem xsi:type='typens:GeographicCoordinateSystem' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:typens='http://www.esri.com/schemas/ArcGIS/10.8'><WKT>GEOGCS[&quot;GCS_WGS_1984&quot;,DATUM[&quot;D_WGS_1984&quot;,SPHEROID[&quot;WGS_1984&quot;,6378137.0,298.257223563]],PRIMEM[&quot;Greenwich&quot;,0.0],UNIT[&quot;Degree&quot;,0.0174532925199433],AUTHORITY[&quot;EPSG&quot;,4326]]</WKT><XOrigin>-400</XOrigin><YOrigin>-400</YOrigin><XYScale>11258999068426.238</XYScale><ZOrigin>-100000</ZOrigin><ZScale>10000</ZScale><MOrigin>-100000</MOrigin><MScale>10000</MScale><XYTolerance>8.983152841195215e-09</XYTolerance><ZTolerance>0.001</ZTolerance><MTolerance>0.001</MTolerance><HighPrecision>true</HighPrecision><LeftLongitude>-180</LeftLongitude><WKID>4326</WKID><LatestWKID>4326</LatestWKID></GeographicCoordinateSystem>20240805112217002024080511221700 Version 6.2 (Build 9200) ; Esri ArcGIS 10.8.1.14362All_fires_23_24_gwShapefile0.000datasetEPSG6.14(3.0.1)0SimpleFALSE0FALSEFALSEAll_fires_23_24_gwFeature Class0FIDFIDOID400Internal feature number.EsriSequential unique whole numbers that are automatically generated.ShapeShapeGeometry000Feature geometry.EsriCoordinates defining the features.IDIDDouble16160FIRE_CODEFIRE_CODEString1600FILE_NAMEFILE_NAMEString1600FIREWEBFIREWEBString1600RES_CODERES_CODEString500LAND_UNITLAND_UNITString5000MONTHMONTHInteger550YEARYEARInteger10100RES_CENTRERES_CENTREString25400RES_NAMERES_NAMEString10000LOCAL_DESCLOCAL_DESCString10000DATE_STARTDATE_STARTString1500DATE_EXTINDATE_EXTINString1500DATE_WITHDDATE_WITHDString1500REPORT_OFFREPORT_OFFString7500POLIC_CASEPOLIC_CASEString5000IGNITIONCAIGNITIONCAString5000Yr_mnthYr_mnthString1000Area_haArea_haDouble1900RESCODE_LURESCODE_LUString100020240805 diff --git a/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shx b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shx new file mode 100644 index 00000000..6b52ca09 Binary files /dev/null and b/data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shx differ diff --git a/data/manual_download/README.md b/data/manual_download/README.md new file mode 100644 index 00000000..32b307d4 --- /dev/null +++ b/data/manual_download/README.md @@ -0,0 +1,3 @@ +# Raw Data + +This folder contains files that cannot be programmatically downloaded (such as those from BGIS) diff --git a/decrypt_secret.sh b/decrypt_secret.sh new file mode 100644 index 00000000..81deface --- /dev/null +++ b/decrypt_secret.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +# Decrypt the file + +mkdir -p $HOME/.config/earthengine/ndef/ + +# --batch to prevent interactive command +# --yes to assume "yes" for questions + +gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ +--output $HOME/.config/earthengine/ndef/20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner@gmail.com $HOME/emma_envdata/scratch_code/20061abcbc1c6ecf51bd9cf7e37350f6_bmaitner@gmail.com.gpg + +gpg --quiet --batch --yes --decrypt --passphrase="$RGEE_SECRET" \ +--output $HOME/.config/earthengine/ndef/credentials $HOME/emma_envdata/scratch_code/credentials.gpg diff --git a/docs/APPEEARS_SETUP.md b/docs/APPEEARS_SETUP.md new file mode 100644 index 00000000..74abefde --- /dev/null +++ b/docs/APPEEARS_SETUP.md @@ -0,0 +1,110 @@ +# AppEEARS Setup Guide + +This project now uses NASA AppEEARS instead of Google Earth Engine for satellite data access. + +## Prerequisites + +1. **NASA EarthData Account**: Register at https://urs.earthdata.nasa.gov/ +2. **AppEEARS Access**: Approve AppEEARS application at https://appeears.earthdatacloud.nasa.gov/ + +## Local Setup + +Set environment variables in your `.Renviron` file: + +```r +# Edit .Renviron +usethis::edit_r_environ() + +# Add these lines: +EARTHDATA_USER=your_username +EARTHDATA_PASSWORD=your_password +``` + +Restart R session for changes to take effect. + +## GitHub Actions Setup + +Add secrets to your repository: + +1. Go to repository Settings → Secrets and variables → Actions +2. Add two secrets: + - `EARTHDATA_USER`: Your NASA EarthData username + - `EARTHDATA_PASSWORD`: Your NASA EarthData password + +## Verify Setup + +Test authentication in R: + +```r +library(appeears) +rs_login( + user = Sys.getenv("EARTHDATA_USER"), + password = Sys.getenv("EARTHDATA_PASSWORD") +) + +# List available products +rs_products() +``` + +## Migration Notes + +### Changes from rgee to AppEEARS + +- **Authentication**: Simple username/password instead of service account JSON +- **Output format**: Monthly NetCDF files instead of individual GeoTIFFs +- **Storage efficiency**: ~20% reduction in file sizes +- **Simpler CI/CD**: No Python/conda dependencies required + +### Product Mapping + +| Current (rgee) | AppEEARS Product | Status | +|----------------|------------------|--------| +| MODIS Fire (MCD64A1) | MCD64A1.061 | ✅ Migrated | +| MODIS NDVI (MOD13A1) | MOD13A1.061 | ✅ Migrated | +| VIIRS NDVI | VNP13A1.001 | 🔄 Pending | +| KNDVI | Calculate from reflectances | 🔄 Pending | +| CHELSA Climate | Direct download (unchanged) | ✅ No change | +| NASADEM | NASADEM.001 | 🔄 Pending | + +### Release Tags + +NetCDF outputs use new tag names to distinguish from GeoTIFF: + +- `raw_fire_modis_nc` - Raw fire monthly NetCDF +- `raw_ndvi_modis_nc` - Raw NDVI monthly NetCDF +- etc. + +### File Naming Convention + +Monthly NetCDF files follow the pattern: `{product}_{collection}_{YYYY-MM}.nc` + +Examples: +- `fire_MCD64A1_2025-12.nc` +- `ndvi_MOD13A1_2025-12.nc` + +## Troubleshooting + +### Authentication Errors + +If you see "EARTHDATA credentials not found": +1. Check environment variables are set: `Sys.getenv("EARTHDATA_USER")` +2. Restart R session after setting `.Renviron` +3. Verify credentials at https://urs.earthdata.nasa.gov/ + +### AppEEARS Task Failures + +Check task status: +```r +appeears::rs_status(task_id = "your_task_id") +``` + +Common issues: +- Date range too large (split into smaller requests) +- Invalid area of interest (ensure valid WGS84 coordinates) +- Service temporarily unavailable (retry after delay) + +## Resources + +- [AppEEARS Documentation](https://appeears.earthdatacloud.nasa.gov/help) +- [appeears R package](https://docs.ropensci.org/appeears/) +- [NASA EarthData](https://earthdata.nasa.gov/) diff --git a/emma-targets.Rproj b/emma-targets.Rproj index aad884da..699e3ae1 100644 --- a/emma-targets.Rproj +++ b/emma-targets.Rproj @@ -1,4 +1,5 @@ Version: 1.0 +ProjectId: d3bc4aff-88e6-458a-b2fc-6bc8e9e06f1c RestoreWorkspace: No SaveWorkspace: No diff --git a/emma_envdata.code-workspace b/emma_envdata.code-workspace new file mode 100644 index 00000000..876a1499 --- /dev/null +++ b/emma_envdata.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/img/network.png b/img/network.png new file mode 100644 index 00000000..a74d2d3f Binary files /dev/null and b/img/network.png differ diff --git a/R/clean_up.R b/old/clean_up.R similarity index 100% rename from R/clean_up.R rename to old/clean_up.R diff --git a/R/domain_remnants.R b/old/domain_remnants.R similarity index 100% rename from R/domain_remnants.R rename to old/domain_remnants.R diff --git a/R/domain_remnants_release.R b/old/domain_remnants_release.R similarity index 100% rename from R/domain_remnants_release.R rename to old/domain_remnants_release.R diff --git a/R/get_domain.R b/old/get_domain.R similarity index 100% rename from R/get_domain.R rename to old/get_domain.R diff --git a/R/get_release_elevation_nasadem.R b/old/get_release_elevation_nasadem.R similarity index 100% rename from R/get_release_elevation_nasadem.R rename to old/get_release_elevation_nasadem.R diff --git a/R/get_release_fire_modis.R b/old/get_release_fire_modis.R similarity index 100% rename from R/get_release_fire_modis.R rename to old/get_release_fire_modis.R diff --git a/R/get_release_kndvi_modis.R b/old/get_release_kndvi_modis.R similarity index 100% rename from R/get_release_kndvi_modis.R rename to old/get_release_kndvi_modis.R diff --git a/R/get_release_mean_ndvi_modis.R b/old/get_release_mean_ndvi_modis.R similarity index 100% rename from R/get_release_mean_ndvi_modis.R rename to old/get_release_mean_ndvi_modis.R diff --git a/R/get_release_ndvi_dates_modis.R b/old/get_release_ndvi_dates_modis.R similarity index 100% rename from R/get_release_ndvi_dates_modis.R rename to old/get_release_ndvi_dates_modis.R diff --git a/R/get_release_ndvi_dates_viirs.R b/old/get_release_ndvi_dates_viirs.R similarity index 100% rename from R/get_release_ndvi_dates_viirs.R rename to old/get_release_ndvi_dates_viirs.R diff --git a/R/get_release_ndvi_modis.R b/old/get_release_ndvi_modis.R similarity index 100% rename from R/get_release_ndvi_modis.R rename to old/get_release_ndvi_modis.R diff --git a/R/get_release_ndvi_viirs.R b/old/get_release_ndvi_viirs.R similarity index 100% rename from R/get_release_ndvi_viirs.R rename to old/get_release_ndvi_viirs.R diff --git a/R/get_release_ndwi_modis.R b/old/get_release_ndwi_modis.R similarity index 100% rename from R/get_release_ndwi_modis.R rename to old/get_release_ndwi_modis.R