From 479b07276f856ab9d04b29bac88fe7ed5a34be02 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson (horae)" Date: Tue, 11 Jan 2022 13:51:01 -0500 Subject: [PATCH 01/58] playing with chelsa script --- R/get_climate_chelsa.R | 5 ++++- _targets.R | 2 +- _targets/meta/meta | 12 ++++++------ raw_data/README.md | 3 --- 4 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 raw_data/README.md diff --git a/R/get_climate_chelsa.R b/R/get_climate_chelsa.R index 643e1789..97634014 100644 --- a/R/get_climate_chelsa.R +++ b/R/get_climate_chelsa.R @@ -22,6 +22,9 @@ get_climate_chelsa <- function(directory = "data/raw_data/climate_chelsa/",domai #Get the extent # ext <- readRDS(file = "data/other_data/domain_extent.RDS") + ext=domain %>% + st_transform(4326) %>% + st_bbox() if( length(list.files(directory,pattern = ".tif", recursive = T)) == 19){ message("CHELSA files found, skipping download") @@ -37,7 +40,7 @@ get_climate_chelsa <- function(directory = "data/raw_data/climate_chelsa/",domai ClimDatDownloadR::Chelsa.Clim.download(save.location = directory, parameter = "bio", - clip.extent = st_bbox(domain)[c(1,3,2,4)], + clip.extent = ext[c(1,3,2,4)], clipping = TRUE, delete.raw.data = TRUE ) diff --git a/_targets.R b/_targets.R index df4549f0..ddd247cf 100644 --- a/_targets.R +++ b/_targets.R @@ -59,7 +59,7 @@ list( ), tar_target( chelsa, - get_climate_chelsa(directory = "data/raw_data/climate_chelsa/"), + get_climate_chelsa(directory = "data/raw_data/climate_chelsa/",domain=domain), format = "file" ), # tar_target( diff --git a/_targets/meta/meta b/_targets/meta/meta index 92462b7f..072544d2 100644 --- a/_targets/meta/meta +++ b/_targets/meta/meta @@ -12,8 +12,8 @@ model_data|stem|4b47a4fede880056|8223ad42e5e049cb|f92b99e321a7c2ab|-495503059|da vegmap_shp|stem|d3744d69c8da6bb2|193e3e8d55a8bbd4|ef46db3751d8e999|-232248272|data/manual_download/VEGMAP2018_AEA_16082019Final/NVM2018_AEA_V22_7_16082019_final.shp|t18977.7951949704s|9cc1ad1c26fc3f86|493121012|file|vector|||1.075|| remnants_shp|stem|9dc0c644eedf6430|81ff8511059852c0|ef46db3751d8e999|1961884837|data/manual_download/RLE_2021_Remnants/RLE_Terr_2021_June2021_Remnants_ddw.shp|t18977.7962072854s|9fd0b3ef5a76431f|726393404|file|vector|||0.001|| ndvi|stem||0845e9d612c00988|a6ca0a7681325c6b|-1608034659||t18998.8862528718s||0|file|vector|||4459.479||Error in the HTTP2 framing layer -alos|stem|3ae505606be9ddd9|e075079d0c926a3a|997e759716ec9a40|1794838964|data/raw_data/alos/|t18998.9404815127s|a75e104011428481|4096|file|vector|||1.059|| domain|stem|655dea841d382d95|7a783623d7c8b012|ea1ef9ffbef37d3b|640757417||t18999.000194083s|c233e5bdd1ddd8a9|2171832|rds|vector|||75.127|| +alos|stem|3ae505606be9ddd9|e075079d0c926a3a|38fbb58df5295dcb|1794838964|data/raw_data/alos/|t18998.9404815127s|a75e104011428481|4096|file|vector|||0.989|| getQABits_match|function|866042616e64190c|||||||||||||| domain_map|function|b3a8249eb2758de6|||||||||||||| get_soil_gcfr|function|e4af25f0baf15c88|||||||||||||| @@ -24,7 +24,7 @@ domain_remnants|function|199dfa8f66690059|||||||||||||| national_boundary|function|98c948356a6f3853|||||||||||||| get_landcover_za|function|0e6c77fc4f9a908e|||||||||||||| update_git|function|f837db84a6c90d8a|||||||||||||| -.Random.seed|object|a2767b997f617db5|||||||||||||| +.Random.seed|object|b1f71cbe64618c82|||||||||||||| process_domain|function|cd5c58bd66fc7f66|||||||||||||| group_data_function|function|cf81a22df7ca8418|||||||||||||| clean_data|function|484d9c4667cbdd4d|||||||||||||| @@ -37,17 +37,17 @@ fit_model|function|d0d4e0ea8d7f400c|||||||||||||| process_ndvi_relative_days_since_fire|function|e1f0dfff752a7b8c|||||||||||||| domain_rasterize|function|44797f03c1431513|||||||||||||| stan_data_function|function|60507201f11a2ffe|||||||||||||| -get_climate_chelsa|function|09406f624a7b1302|||||||||||||| +get_climate_chelsa|function|dffa9818d69643cf|||||||||||||| get_precipitation_chelsa|function|4dd53febf8e63cca|||||||||||||| summarize_posteriors|function|92d2f12f0d1f6071|||||||||||||| process_fire_doy_to_unix_date|function|1520f6e331cbfaf4|||||||||||||| get_clouds_wilson|function|3cf71ddc4f215e0a|||||||||||||| MCD64A1_clean|function|497d11983dd6d889|||||||||||||| -get_alos_data|function|892f6f04b6132eef|||||||||||||| +get_alos_data|function|72b73f07593c2c4d|||||||||||||| get_elevation_nasadem|function|644ec3ea1b2e9e7c|||||||||||||| get_ndvi|function|22c06484e3e1c498|||||||||||||| get_kndvi|function|c1d650ecc7a0bf6a|||||||||||||| get_ndvi_dates_modis|function|c37d34760309839f|||||||||||||| get_fire_modis|function|22c0379798b1b53f|||||||||||||| -get_alos|function|a842944ca65625e6|||||||||||||| -chelsa|stem||e9c447909f8ca42e|33a755d10676f91f|-2121112400||t18998.8158226411s||0|file|vector|||1.049||error reading from connection +get_alos|function|fc76439d48ebe5bb|||||||||||||| +chelsa|stem|7a8d851df7618ac1|ecea8a3dc8adc659|a5b5647198251502|-2121112400|data/raw_data/climate_chelsa/|t18999.9569645207s|a75e104011428481|4096|file|vector|||5381.694|| diff --git a/raw_data/README.md b/raw_data/README.md deleted file mode 100644 index e44915a8..00000000 --- a/raw_data/README.md +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:524644e080001fa838b17a4d5aa47b9a1e3523f5d674016c43d613714723dd08 -size 108 From 9f4cf326d23fc17e1e75e01fead6422b2feaed5f Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson (horae)" Date: Tue, 18 Jan 2022 16:38:02 -0500 Subject: [PATCH 02/58] udpate meta --- _targets/meta/meta | 83 ++++++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 33 deletions(-) diff --git a/_targets/meta/meta b/_targets/meta/meta index 072544d2..385c68ef 100644 --- a/_targets/meta/meta +++ b/_targets/meta/meta @@ -1,53 +1,70 @@ name|type|data|command|depend|seed|path|time|size|bytes|format|iteration|parent|children|seconds|warnings|error -define_domain|function|0b94ffd79402925f|||||||||||||| -rasterize_domain|function|875039500aad9c48|||||||||||||| -get_national_boundary|function|99fa5ffc020cbd63|||||||||||||| -domain_edgedistance|stem||401d57c2fb24d7dc|df145d2b69e6d3fc|2127448252||t18981.9115219128s||0|file|vector|||0.002||could not find function domain_distance -za|stem|a17ad732d16586d7|b6a9176b6c51da0c|8618c820e3bd8672|249565237||t18982.713246292s|ff026697d66e9a9f|75|rds|vector|||8.816|| -country|stem|e1ba870f74ff51d0|b6a9176b6c51da0c|4b52215de67bc2a9|-396713552||t18982.752184375s|762b0ff687cec244|3225950|rds|vector|||7.121|| -vegmap|stem|b502445ec7320d62|1811b4a0f90e1688|26cd61d94db2b5bd|602754364||t18982.8214810449s|d2ddbb368a516aaa|79094695|rds|vector|||53.369|| -remnants|stem|69d4225f3763addb|7d78ea0be657b6ea|a45d26b42f8abebe|630969701|data/remnants.tif|t18983.6288393025s|9e5c852f0832e47b|915859|file|vector|||82.567|| -remnant_distance|stem|f2baefe7161f7453|9326018404110314|dc6f6cfa0b47fd6a|-1777723304|data/remnant_distance.tif|t18983.6288453036s|cdcc17971c8665ee|721827|file|vector|||0.479|| -model_data|stem|4b47a4fede880056|8223ad42e5e049cb|f92b99e321a7c2ab|-495503059|data/model_data.csv|t18997.6696188887s|2166b4d5a598ebf2|132850454|file|vector|||4.594|| -vegmap_shp|stem|d3744d69c8da6bb2|193e3e8d55a8bbd4|ef46db3751d8e999|-232248272|data/manual_download/VEGMAP2018_AEA_16082019Final/NVM2018_AEA_V22_7_16082019_final.shp|t18977.7951949704s|9cc1ad1c26fc3f86|493121012|file|vector|||1.075|| -remnants_shp|stem|9dc0c644eedf6430|81ff8511059852c0|ef46db3751d8e999|1961884837|data/manual_download/RLE_2021_Remnants/RLE_Terr_2021_June2021_Remnants_ddw.shp|t18977.7962072854s|9fd0b3ef5a76431f|726393404|file|vector|||0.001|| -ndvi|stem||0845e9d612c00988|a6ca0a7681325c6b|-1608034659||t18998.8862528718s||0|file|vector|||4459.479||Error in the HTTP2 framing layer -domain|stem|655dea841d382d95|7a783623d7c8b012|ea1ef9ffbef37d3b|640757417||t18999.000194083s|c233e5bdd1ddd8a9|2171832|rds|vector|||75.127|| -alos|stem|3ae505606be9ddd9|e075079d0c926a3a|38fbb58df5295dcb|1794838964|data/raw_data/alos/|t18998.9404815127s|a75e104011428481|4096|file|vector|||0.989|| +country|stem|e1ba870f74ff51d0|b6a9176b6c51da0c|4b52215de67bc2a9|-396713552||t19010.7503285516s|762b0ff687cec244|3225950|rds|vector|||12.398|| +vegmap_shp|stem|d3744d69c8da6bb2|193e3e8d55a8bbd4|ef46db3751d8e999|-232248272|data/manual_download/VEGMAP2018_AEA_16082019Final/NVM2018_AEA_V22_7_16082019_final.shp|t19010.7230592s|9cc1ad1c26fc3f86|493121012|file|vector|||0.001|| +remnants_shp|stem|9dc0c644eedf6430|81ff8511059852c0|ef46db3751d8e999|1961884837|data/manual_download/RLE_2021_Remnants/RLE_Terr_2021_June2021_Remnants_ddw.shp|t19010.7228826241s|9fd0b3ef5a76431f|726393404|file|vector|||0|| +vegmap|stem|b502445ec7320d62|1811b4a0f90e1688|26cd61d94db2b5bd|602754364||t19010.7510550017s|d2ddbb368a516aaa|79094695|rds|vector|||49.487|| +domain|stem|655dea841d382d95|7a783623d7c8b012|ea1ef9ffbef37d3b|640757417||t19010.7519258264s|c233e5bdd1ddd8a9|2171832|rds|vector|||74.221|| +alos|stem|79422857d543d9b8|a73bb6286224cc7c|893266c9a485d13d|1794838964||t19010.7519476304s|991ef619886270ed|69|rds|vector|||1.82|| +climate_chelsa|stem|4ac1eb883db90b0f|99f4a2e0245696e3|58b8ca812daa711e|558800862||t19010.7519484276s|a1c456b03adbfbf8|44|rds|vector|||0.037|| +clouds_wilson|stem|4ac1eb883db90b0f|6ecb469165f9be5d|d50df5d8a744a12d|526667795||t19010.7519492106s|a1c456b03adbfbf8|44|rds|vector|||0.035|| +fire_modis|stem|4ac1eb883db90b0f|47cd490ca08744a2|9d37093d488149dc|1443052342||t19010.7531680655s|a1c456b03adbfbf8|44|rds|vector|||105.284|| +ndvi_dates_modis|stem|4ac1eb883db90b0f|869e283b2f788933|cd58ca99f17d6ef1|1534273282||t19010.7543892415s|a1c456b03adbfbf8|44|rds|vector|||105.481|| +landcover_za|stem|4ac1eb883db90b0f|3386a5338d2753ab|30dd604f0a320f22|-69106787||t19010.7543900616s|a1c456b03adbfbf8|44|rds|vector|||0.028|| +precipitation_chelsa|stem|4ac1eb883db90b0f|7199549b0a2f0b42|e0274b0fd94d57ea|-1119422601||t19010.7543908838s|a1c456b03adbfbf8|44|rds|vector|||0.047|| +elevation_nasadem|stem|4ac1eb883db90b0f|168eaedd9e679f1f|22030e93ab91c3d6|-1875480619||t19010.7543912094s|a1c456b03adbfbf8|44|rds|vector|||0.002|| +remnants|stem|69d4225f3763addb|7d78ea0be657b6ea|a45d26b42f8abebe|630969701|data/remnants.tif|t19010.7554528325s|9e5c852f0832e47b|915859|file|vector|||91.713|| +ndvi_modis|stem|9b674d12b8f6fe05|de45493152f51759|a9eabc12cafc1b8f|305104419||t19010.7566994782s|ff026697d66e9a9f|75|rds|vector|||107.664|| +fire_doy_to_unix_date|stem|4ac1eb883db90b0f|bf360ba34319669b|1c4f28a90c55cc95|-1541145076||t19010.7567007488s|a1c456b03adbfbf8|44|rds|vector|||0.065|| +remnant_distance|stem|f2baefe7161f7453|9326018404110314|dc6f6cfa0b47fd6a|-1777723304|data/remnant_distance.tif|t19010.7567064373s|cdcc17971c8665ee|721827|file|vector|||0.469|| +template|stem|0065ce2e6fbc9fd7|b60205904e5ebb71|382019eba689d359|-1092328110||t19010.7567068069s|a3c4b57a6f0085ec|90|rds|vector|||0.003|| +burn_date_to_last_burned_date|stem|4ac1eb883db90b0f|bf7282dcd7badc0f|5659b5c27d630b7b|1181387558||t19010.7567079753s|a1c456b03adbfbf8|44|rds|vector|||0.059|| +model_data|stem|4b47a4fede880056|8223ad42e5e049cb|f92b99e321a7c2ab|-495503059|data/model_data.csv|t19010.7567261441s|2166b4d5a598ebf2|132850454|file|vector|||1.543|| +projected_alos|stem|4ac1eb883db90b0f|70f0cbec3ed05d83|b8f84d0364860842|-14066847||t19010.7568385638s|a1c456b03adbfbf8|44|rds|vector|||9.63|| +projected_climate_chelsa|stem|4ac1eb883db90b0f|eda61e0b3f525eec|88ba78acfb686129|548473637||t19010.7571726449s|a1c456b03adbfbf8|44|rds|vector|||28.824|| +projected_clouds_wilson|stem|4ac1eb883db90b0f|ea7fd60d1374ec17|a880dd36d698db69|836157549||t19010.7574374492s|a1c456b03adbfbf8|44|rds|vector|||22.844|| +projected_landcover_za|stem|4ac1eb883db90b0f|2aa6a682b99d12fb|34b25929b783409e|773277741||t19010.7576016743s|a1c456b03adbfbf8|44|rds|vector|||14.138|GDAL Message 1 Value 284943666 of field Count of feature 40 not successfully written. Possibly due to too larger number with respect to field width| +projected_precipitation_chelsa|stem|4ac1eb883db90b0f|f920bb843cc67d43|da038c020df410f1|-843765989||t19010.7576356575s|a1c456b03adbfbf8|44|rds|vector|||2.906|| +projected_elevation_nasadem|stem|4ac1eb883db90b0f|d57ec667d25555d0|3393fb9548961eae|945590385||t19010.7578106988s|a1c456b03adbfbf8|44|rds|vector|||15.09|| getQABits_match|function|866042616e64190c|||||||||||||| domain_map|function|b3a8249eb2758de6|||||||||||||| +process_climate_chelsa|function|f08153cd7da37a96|||||||||||||| get_soil_gcfr|function|e4af25f0baf15c88|||||||||||||| -get_domain|function|f4a2cb4148ca73b4|||||||||||||| get_integer_date|function|b7ba3e11b179e923|||||||||||||| +get_ndvi_modis|function|96de177976c64e6f|||||||||||||| spatial_outputs|function|4c1a11d0b9579d31|||||||||||||| domain_remnants|function|199dfa8f66690059|||||||||||||| +process_clouds_wilson|function|3a9e74e71b7e1da8|||||||||||||| national_boundary|function|98c948356a6f3853|||||||||||||| -get_landcover_za|function|0e6c77fc4f9a908e|||||||||||||| +get_landcover_za|function|9c2b773a22add072|||||||||||||| +process_precipitation_chelsa|function|efa7c78c9025c5d2|||||||||||||| update_git|function|f837db84a6c90d8a|||||||||||||| -.Random.seed|object|b1f71cbe64618c82|||||||||||||| -process_domain|function|cd5c58bd66fc7f66|||||||||||||| +.Random.seed|object|e9a5117e62d6b9dd|||||||||||||| +get_domain|function|f4a2cb4148ca73b4|||||||||||||| group_data_function|function|cf81a22df7ca8418|||||||||||||| clean_data|function|484d9c4667cbdd4d|||||||||||||| +get_alos_data|function|26aa3ba42cf425c1|||||||||||||| get_model_data|function|9e05be8a27aace67|||||||||||||| -process_burn_date_to_last_burned_date|function|4f888f0c4b9d8f75|||||||||||||| +get_template_raster|function|88629727ca4e2301|||||||||||||| +get_kndvi_modis|function|f7d7475ddcb4b3e8|||||||||||||| +process_alos|function|b9e157819129d360|||||||||||||| +get_elevation_nasadem|function|e7f7a3b0415747eb|||||||||||||| +process_burn_date_to_last_burned_date|function|049eadff781b174d|||||||||||||| domain_define|function|4b4a20bae19cff79|||||||||||||| domain_distance|function|e0b30c1a161fe043|||||||||||||| get_vegmap|function|aaa6165a398f62e5|||||||||||||| +get_ndvi|function|7748a64461edb4ec|||||||||||||| +process_landcover_za|function|b91353e311adff49|||||||||||||| fit_model|function|d0d4e0ea8d7f400c|||||||||||||| -process_ndvi_relative_days_since_fire|function|e1f0dfff752a7b8c|||||||||||||| +process_ndvi_relative_days_since_fire|function|6c81958b34170768|||||||||||||| domain_rasterize|function|44797f03c1431513|||||||||||||| stan_data_function|function|60507201f11a2ffe|||||||||||||| -get_climate_chelsa|function|dffa9818d69643cf|||||||||||||| -get_precipitation_chelsa|function|4dd53febf8e63cca|||||||||||||| +get_precipitation_chelsa|function|777975e073c90bc6|||||||||||||| +get_climate_chelsa|function|b600ca99f7b34606|||||||||||||| summarize_posteriors|function|92d2f12f0d1f6071|||||||||||||| -process_fire_doy_to_unix_date|function|1520f6e331cbfaf4|||||||||||||| -get_clouds_wilson|function|3cf71ddc4f215e0a|||||||||||||| +process_elevation_nasadem|function|744783eb9a692603|||||||||||||| +process_fire_doy_to_unix_date|function|c078835d35dbcc59|||||||||||||| +get_clouds_wilson|function|0907844bd0aee4a1|||||||||||||| MCD64A1_clean|function|497d11983dd6d889|||||||||||||| -get_alos_data|function|72b73f07593c2c4d|||||||||||||| -get_elevation_nasadem|function|644ec3ea1b2e9e7c|||||||||||||| -get_ndvi|function|22c06484e3e1c498|||||||||||||| -get_kndvi|function|c1d650ecc7a0bf6a|||||||||||||| -get_ndvi_dates_modis|function|c37d34760309839f|||||||||||||| -get_fire_modis|function|22c0379798b1b53f|||||||||||||| -get_alos|function|fc76439d48ebe5bb|||||||||||||| -chelsa|stem|7a8d851df7618ac1|ecea8a3dc8adc659|a5b5647198251502|-2121112400|data/raw_data/climate_chelsa/|t18999.9569645207s|a75e104011428481|4096|file|vector|||5381.694|| +get_ndvi_dates_modis|function|e95ad8095ccca511|||||||||||||| +get_alos|function|04f279a3ab183c2f|||||||||||||| +get_fire_modis|function|f693ac66d85dc593|||||||||||||| From eb31274c5c0b56fe5510f1b8b634251d8543f351 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson (horae)" Date: Wed, 26 Jan 2022 15:44:36 -0500 Subject: [PATCH 03/58] update targets file --- .gitignore | 4 +++- _targets.R | 16 +++++----------- _targets/.gitignore | 4 ++-- img/network.png | Bin 0 -> 75313 bytes 4 files changed, 10 insertions(+), 14 deletions(-) create mode 100644 img/network.png diff --git a/.gitignore b/.gitignore index 33eb87c9..deb37be0 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,6 @@ processed_data/ data/* */other_data/* .DS_Store -*/meta +img/*_files +img/*html +_targets/meta/meta diff --git a/_targets.R b/_targets.R index e794b871..e806352c 100644 --- a/_targets.R +++ b/_targets.R @@ -96,11 +96,11 @@ list( get_fire_modis(domain = domain), age = as.difftime(7, units = "days") ), - # tar_age( - # kndvi_modis, - # get_kndvi_modis(domain = domain), - # age = as.difftime(7, units = "days") - # ), + tar_age( + kndvi_modis, + get_kndvi_modis(domain = domain), + age = as.difftime(7, units = "days") + ), tar_age( ndvi_modis, get_ndvi_modis(domain = domain), @@ -119,14 +119,8 @@ list( process_fire_doy_to_unix_date(... = fire_modis) ), tar_target( -<<<<<<< HEAD - chelsa, - get_climate_chelsa(directory = "data/raw_data/climate_chelsa/",domain=domain), - format = "file" -======= burn_date_to_last_burned_date, process_burn_date_to_last_burned_date(... = fire_doy_to_unix_date) ->>>>>>> main ), # tar_target( # ndvi_relative_days_since_fire, diff --git a/_targets/.gitignore b/_targets/.gitignore index a8c51cda..ce2af28d 100644 --- a/_targets/.gitignore +++ b/_targets/.gitignore @@ -1,5 +1,5 @@ * !.gitignore -!meta +#!meta meta/* -!meta/meta +#!meta/meta diff --git a/img/network.png b/img/network.png new file mode 100644 index 0000000000000000000000000000000000000000..a74d2d3f2c23cf2e4c76aa937f77750d0d2f2925 GIT binary patch literal 75313 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 z z5ytmPA^~o;_P^p%WaW}(%1v>(^U*tFechKiWzlamlSlz-B80@~pHx#n^Z|Uebrv9t zHp6tU*rb-1e2l~g`0}CnyS19ViE~g&y_Sp~5O6QdPg?mp+?g3VSG)(ZE{mVj%p{Rn zC1XQ|PSvma%roe@?oSUa(NSf6HJvMTJT)cW?xOijy}Lhm`S*GL54U@U#;!hYitoQv zk|ui(+UNZX=VM7`z|>uqhw_lboCu&}S^i9k$I-1*lyp6}%E&<10v)Vbk@=&fjs0T{ zY4>d!&rlhef{*ic_H-5lnM_XKLohjg>^dpz zIicO0H&WUy9N=4Ehty}`)J@#9UA-k-=_^?7HDA0MQ}C!*Pw%VqRMMk+sF?JaiVid> z`HXvdUQGJr&A`)PgX5sH`Lkf-Y~=2K_nL9Hab9*U`cm{nntquCP-%{jiYyeE;UZTP z?NGo4B%9YdjZf4|y|pdXc9`j7lqtw8=wc$i9`?0e^^TRRJvTDK0~={QQuY%zb-ZTNlqcW_N_6t&BZ%`Iw~g+;oj*#l;U`UUf|nW+dS z;>f4ynx&b}OksHh;XWeztf#ng3lP_z{%yCt?)DSsG)IVyNU`u@>9Vihyb|_k!9(D? z0>@7&h)q5YZqpdeR<<6nEn$go*NlI8z-pL?P|iuu?Y;C^DS#20rXpH+hMNH8yc-x7 z3hlFMiiv{*U5f94AOV=2P(}s3kx==v+}xxkEr39vrjknaM9~ag1*mS4}6P&Not3@Irl?J6~^B&cI)R%~fmT z`dgO^@;;x-=?m3HC2bk9oXgdI%_o99Zj=fY6R+JxrEz)>SHs!x2p4eE|54%q<+tGz z@WtY}CCP?Q&2byuSX^lTn|;*;{YWV^6Gj^4p;#YxwZp+#ao`jcYhm-E!WIwb6rOrMh zTN3!!#_I@DJP)M56NH5pe2lQ+OQysgIc?#&-hv?M@3Z}&6pRjByL-ByTBTled9;a< zx2z;PO2~EZLVoq8pWF5ppc~urwdix5WLI%5@XiwTrwYxo9ctVa(Gi0?imkS@h-PL7 z;TtJ9b*yj4IPw=d#@PFYeC(Kc>N;fATl~dE$dmdB<2GhaeCROag6|PQ#qhYCwF+0= zQB%Q#qquq%6Q9W6gB1KoqT5&VgG~96J&Q!R!tGW~sq%?5Lk~+LRWj`Kl`-R*fA*Yx zhN$^-wU5ss7UyUs!!}!W;?k672JY(q+4Oqt-oR~ zttyn|7vfAy8ucnW7gs?ReMF)*fz{m>FM0*_yxLrj9I1&_}+v zDC6)>u2M%^TJLIKzcVN@dl0ZWP}elQeJi^4plf8^ysg{#@2`X1LXIJrv-9Z}UKxM< za=TCr@Bs=}_)@f>!2N{;E*ADbRaTUE5y`!~9x((Gi6RN)!)ZTBU71^mi%P_j+GGKk$l za|RGYV-JgPq}Bh`-gieenRn|(QJJxTV*{j(BZwl1(mRX=q$?o3sPtY!hY-ssHbAM; z#{x{G2}p+kqky!~OGxM?K!51S@JBDxa4JQPimUc4pH#6P6cnnbHgi~Fgw5f~C2 z)Fj3P#(#WvzM+Q{R_FTueYVe?eN`z+RWT=8l!MsD&rYMmKM%VWw4PH`RtaR=s*LcU zPG8OJ5Os3iS}iCjxOG0pXLaSanc?eVKR7ShmdFm&UwDwxW8QzeYClvIi*$^qXIKwJ zwf~C?zzH67ZdF-2Ha;0FAZSDLoJV2Hmtwh@34;+)|_rHoduD)^YN!ezqHbDi=wI z+DhN|6aE{QmqtQZRAygHUh>2KTl#OSGt|C+Yi)D9 zJi>keVoInY0j;7d!mB^$aCulf&+lIY_Lkj}japOH-UE6$(y_6(N-tH_?&|xlt_*sv zDDpgiubFu1Bd(a3F`oZX%0;rqh zyS$|`M^zK*XXcNCs0)+p*w2vZ9F;It$ZJ9dwfI28REiR&X5;*qM#s`qBB7=3=6eAC zhjQPPwzo8YP*sG92>zqAJ&Y&s^l?2Qh~T&x4lGK2inA(i!4<5Rwp1g)|_Nwqaxd1ZNe5l25H?GNIL{VT=)qNt-o%z_#@=9+~7JAwD;XnwJK0s z{noyC{szOK&xoM|I~5v7>hby0tV$<(-pqEl3U%4^`x2KAF9FR)@p6Xb1Bj%fABgV0x7$ zyr@g`E7&{~Cl^;Obv4&V=9?%O#N(CHFO-!9i7NA);Lm@}{7Oy2d%Rn7%{q7bN3pV$ z#z(bB6|#gS3W_oL1M-%x=Py)_dX3)vO{D0w?}1+HyciP^H5YXb<78f_be*?|Zy4NK ze{ECvPG7ieJp!|xhusi|in{2XviAicN-*ZN$X-cw=UKzE2=FMd5X`@j34zn$-cv1H z2M-+rG!mfGa2VITwlJs#h2$GIZorK8sI)Xa5Dx-MJ_sGH(T3apvt9vg1fVhi+5vED zZ;mq?&Hy2Vm-||Dtkh&FPsK?{-A~aw)$k>5xDgqT zoqP2zB5L9ZP^9wmq~!{h#9qoBQijMra4^l|NRA4-`g+uD1hcGd2-XR zQ2}t|T|n!uFC0$qg9rg^Sr>WeNsn_%G4{%~l^E;VTnttQPIODscKy-&M;OQid*DsV z0`uj6E*8kk%R2&!UQ!a@9FNGM2kxx)0hwZKqA?n1IWJzkfB6m5E@f)Ey`;pt6sXve(ia?B$;VF0l5XQ%$%*M@-G*E!hUT5qT- z1&J3RgU8rXd<>a`L*D+>yL z=nY*5@wm%Q)1ma)7w-$3Su%^}y9Lsmj|2`O?zn zTrYkKv{lp-I0lz9YKhaDLB5vd>>T_x*2o(@H!(W=WkK1nr3qswmqSMXN`h-;hoiE)s==(O(4!F{RSWTd7{d_F^zBp&UY1I=zw?)qXV0B4qHQd$0`jOq9)j@NG za+sZh`^`BkHaOrnprN>vEFKOfR*leu4;*-|_C7}RJ=qjSD;DFP6vk5>z5HNe&h4y1 z)jb{4oC3!U<2>#T6G(r2B7ga$Igea*213U;dcQ6_2m>|{DXO9#e?5Dc?TEphe6NB0 z(VH<^M|9?fiR|~_I>I5;-_y53y5$4aKxw2 z`j?BAfO))+YP;J&ezSu`@;E4i>@Ki{u z*wLB-&CJr^5arp#yaFf81*$i%ma|r74^Vr6D59k~ooOfx(UOVy3K@Ys5gr0W1Ak*c z3Nqk6_B?rXQ&N6>iR$e=&Cg?2&zEa8h}nUIJf23}3z+zq(>kA4#+*9`WmFyf`4PER zZ%^e~5S!4wwjYH=7|}+<9(IVC5%^%Gch~#9Y_wPJH!FCKm5RaUo}xSR&cVjc^USLo z+k3Rtt{n*aA_>f#cb;$E%!O}d89KT2-76GVoYgQ7h8W`dxxe@1&gIh?2d04mJ7hZh z?&8UVz}0zt?Q3&S)g2tXdN}nZhi@)~?!H~5B(s!1x`iR&%cz=nE&S2?XVs9W+H(lB z;Cu$6M<}+`I$pMrdF1}5gt}AqHkoJBebi~8Bmat`GJoBE#!LBOpp==Z;tI4Y$N~G4 z>aIH7`?Wq7gs8brzj0cC&oL4M>j_cw!E=vORj0pR_p_<}(S z>A?3)?em2#9%inU{HUv`FJld~6h7cSY>%+2m@JlQ-RTR7eQ|`!fx)-&f2-8YC{3%d z(9^ibOs2L*fnSy(^y@dtb)tI5q29?WBYbI7%94`bmc|>PRyQ#@IlA;JPX-SIv!Qbe z4kaN?Memn4H+Qf<9~}W&Gmx>MISqKiP`VQFUHENazzkFk;Wyz&on2hK$}GSK0P}?D zf^l_spMtV1RKTH519dT5PtT(;#0P^>0&P|we}6GX;q2_pSLZ7>Ruex2Tt1iQ5C9^P)}2?z57}yEhGvE zBtW5Za&wy`m!WF{MCnj+v?(D1`y;J4vavxo)DL+R@Xj#J0|so5(;1}!OTWN^BUA;L zfrA88lX1{s}eS#j;|>qF0WUjU`PM%yT; z{@pS+R~W~`w|(ev)W@Wj#>2E7VD);*r&v@4#S#dFZU>}hzX~ukoU%_~WE%CeepFX( zA-kuZz0HGw4^UVGvZCT@x4|5-Ff3X~FJp}#CLRHQ8WyXlsHk#hjRfVzpIHihFkIZR5}P zsq2N-cv`dXXD|?o%EnG8vQROalQFb~&U7t=7y+Rg(gXr@aYO_Xo*7xzsHkHQBmj5Q zm0bGfqH(S#b2|{aOT*at5&kTc=`SlvLhUZ8z~?;<=hT#c+$v~B5ZJOH!2CWd>t&x+ z@R1xNE!gLLlf%#k3?cC9>gwNdpnlu8Z}d_iMWf^@7Wf$AyNQfq5W-oCgS`;c4pU{pf!l5^ItBstQ}w z1ceM_r|wBk|M)al>jWhUlUQN&q4vJG*QE1BzY5;RwKbW_tGI3^v|37g3~ArEu^*(9 zL9HGpE;&!g^03)JWOwl*%gDdV`W@7!3e21h|2TxPuEc^T>%&<7$F&c1Gq2?sVf+0* zya8HW#v{e*;mAhYUu0zBfe!*#h+EpVru3Wd@T##HF1Nq*qx7S9mx*z)S(Cgk8|3_P z5lW;iA`lahqW}zxaJ6gj9IWhoAIr+*RtJGa2l5Sj{*4*|{HY9`r1QXK8L55zH;17t zXjS;bhYxVPd-JT@da{ghxqQ`ejd$M`uvMj}+rfr_uI3E1M%aqK>zXMAK7|}KIKVOk zU1AaV3aPiwUxyV0*_sc~3z`QSupkBtLczebg7{QECE{NM2%>&gk3lNJLsOttUenWK zhf_!n-9ox#ydc?8;7V4631Wp`8<}3|`&~<>jfEWSh7L8(Dy?GMs&O~m-!u!g~ zWH<0UIN#_^4R?RE5Iv*02wGZ@$ptc&k^gzHEgo6h7UHG|jd>=KX zATKjB?C#~80>|DJ7Dgi-XF#QZxhkB8b&2b5B0~gxt%0%7weX(-ziy_)Dj7jQs!nJm zP!YOHEGOq_dq>-toTMfL5|CEy9ac|$Io+B~vHZj3aHyN?{qYPu<)KmP=R@1ULc1LaodkG-35<_6^M5-tU->+?d6 zjqi9Rr4-5peVekRatMTOO zn@z?h{c-Kc7m61`Wdy|zscUCB55Mnl1VU8Tn&qxyo1Yj0Y_QF8^Z$ZWXxSmcaaix} zn0)T-0zg|fCH6%2*B(+^?~7%pEy=$9YkjPbqOnH8vAB_KAeiA+%X@lyBo4fmDL0aT z{E;3{EwfpV5G)yAV&sb~@BgNsQf1fxRi%taTEN6K%1T)+OxaLW;$w$fuPw^{mS;s6 zs`(61>ytWZg)`J;YztX`sBWn1s15a=EAIAJ=<@g7S(hWOHnjOLpe(_toAsy=Hqp*Q-wd#cvjnmPFQo_uy%p!EjWLt9|@xaKWvJ#HXboHyU@~RezI2X zl`-oN>K_c2c_G(1n)MKP#}IOz{1ED_L%)LaW2( z*q>jDW>&Z2rEa-<`Q2?Te(h2sN|K^{kj1*;+mXry`X8HrA8fwv!S;KKNfjOuLDR=y z(CMCjz7C&UnuSwudKOhhLloNCYyb0!t63c%k4@Q`g=MiqkI`s3nVY||rFT-E^E4Oa z_%H+$-tpOqze6rzwXfYj`D|RiO%9Jab+TP%`ds+|XQgWF!Y=@nWESb%6wLP3J>@^qj?BK(`{Vq@^g5!~IE!&U$cN@* z`=n!vtH72hJEe_A>#$E+s5@zqKAqS1{NtCNmjb@p#&kHJ?L=35Own&T>p%XZ# zXXd3*tOMtt2C^Zqsr}F5p?4(xA??tNec>q}pGUtaon3uFy+f>9>a$(fffaeT0TK+Z zdR8|MIAy`+MPul!s&Z-?BxauqUD~AKa2~b+wm#_oL)w4AeX zP68<&D*auTyn6ut*SxQBZtpU&51=Jx-_M-fu^N^OJU3XFrD$S!y_FTu6CxlwyaB@?SZwOg#q0gBkY z=&Pfb0ly5u?78)dqUPD3&4rzThZ*brCq-y*l|054mg!mu-3&W>mc8A1erJIOrb)m8 zzN7mYLwamTCT&j`@dsN7m7Z~L1Bs=8N7>mT(4yTa0OW(4-^N{uhJ<%J!JTGnBBvtJ zQ};!|zS)Y%hPCvmtZ!@s#M^(nNY1A3rchR0%j2}tH2$g;@i)^OEw6ebF1ZhT!Jr-} z>t#A$LNDm^?mWKc=xf#urCMv*WAA$ASkL?O1_FW?Um)3yeK++3 z+|qgTiv}b>ET9cz4xi&ZG!NewKp#AwoRvcvUl08)5;GCu)Bq0}usZKwcB}6}qigNm z%de%ruFOH}2PkxN{_q(HPhor;9$LDkQ*_op+{*u)S15UtPMA}mzg*Rci9h8aa8vJG zbh2#l!^k;O^jfh*YY(Y`-D+b$r1Cr!;ky)meDZ)lh_$%2W3mWI$XE zfyH@F0U(3Lr&Xo_E2cU4I9&AJ!-1_A;dOeh{FVA%Ab}zfQ`K>ZSS%)EHJX{X9fvMj zMe%HnkiRUuKx5Ew$gEsqO3H~7C*P!`DA{O|>yzUEWt@Rjpz(*<+T>3%DNOAL5-%@9)iCi$&F2d+np&H0y}+gsvU|n!*_w z4_*+UADV~Q6iTyl=(5z|%2nM1!AL-r^G`xz+pX6+!FK%l*p#t*4%A+-+hddss>+V6 z+E>WN{B=WAMfikHMbaNrun(;~YHTemMm}}Td?xa2Pp8LI28Grae`sj4sBx9f540h^ z&#mB05YFqR@%@r|6KX0l^KN1?=EYC)b_OYO!DSH{#eO^yJSScx)VEMF423@{@N{>} zpf~Tk9S9PJXA=F#lK5b7QYI!!KAdTxmC(4v?6a|+A}A>=u|7&JGilE6qWqw40|R3O zS8r$bz3bzK%_vjXf)*d}6EptofL!Y?Qxc{xSt{aJB7YD2^CxgU!~(BtW+Y3EgC`D` zhIz{Je10|(@<{*Pw*}9|q>|w}?4Uk0e;mDk>2HG@`|7~gFDNAv^e#UaDHVNe)$kY& zB6gD$CWjdnrzOjV3zDMZLK8(#nGGlanfk34R&N&t4RpZV(e<6ocopZIq;pQK-DUQ) z`+zT{kTL(}gGtLN!%yjyeGo0YeWf-OvVQ$^&^fRwM*moqM#uJ_e$e5?7-sdH=d{+t zb5dU(BvuD2KzQw&c&zZkiG#1yj%O13J{I3-s0YRg!r%Qt{g)8i;nb5^NB9oHq%A`y zo$JP=?my#nCjYqe=}S>rCltedTSecB&IEd~+%0%3XH8O7r zJF~YV{X6D+B_-c=QR6#{oL;H1#GlR^Ids6Oa-bfVq+b$6p#G~B=%itmS9Hq?8>HR_ z;2bb6=6dJgn@&rX6x&F0o+?@hkrqxrn4;UzvzGg%2uXe2{@K-!f2F?9uYWKoCKZUj z5;>zvTbKdDwP;bW0pJSnZLZ8F<&J$eg{X%Oe0Wz-c-?Y9R|zxZ+jt$7{g#o%+qgBO z=(SvTL$0?!!Buwj_s#sLnDciWkdtt%E}V55f1`-wWdk&lpO-lLY^F&5ARXO^?(Z5} z)BotQPYIeb+B=(yMNc|S_smMnExm72RSJsLtb69qe0~IcE_vXeOamN)lj-MJO~G>? z_=Xj!@AOVZT)*Xj(-;<*V!se`@XygFLZ6#If;p5uR{Qqpg&p94%?%mFKDElxt@V^W z`{VWr&6BlUan6VzlYp8#l2b}`{UHCK_5QtppSs9Lf|T-2c%mA8d^}zRC`J%tm}cWz zSFEhuoYE)mhG6`DwYn6PBYmXGEG66CKrO0F@Yt2?Q#J!6ghM6$cgd(HQR=ouvEA+G zV=)K!LnLK#U~m3S$wxf}D|cm6I&WL$0P8JXzqXt_nKOtd&q-fg3J{r}uOI)BN806| z58BzCAKdb{TD?bOMDjI8@macR729zuNEhcnapk^>=IF0)X# zZCl!Ihwfnmg zlk+=Vsuh_Zw6(QudzxY|$ef}crUyH;=c%--H`Jpy$qd)wf zJ8yAP30avkzW1~2k3Oh_IXDYK|He1LygZ9gOja2UPl?8bINEJ+OI=Y;wOl7FW!ey) za9jTDKAaR*KuxU+9%gL04F#CPgduUMus0Az>kIeT?hHtwrO%;WCaJRi-k#VL&b8Bi z)vGZ$tIWF1Zoz*jU(mNG{gw5(&Af({79Z#`TK>+m-qsj^wzKsSY1NsG$)%SKP}W1O9rv(k37pN8e`{uIhDEiaxd#1}k~A)@(1&6q&@p7UR(GBRFSEgar_ z(Ys=;t{n?MUpE|}c(Yb8%yTWD z`e6d`vdV5PExjlG%YlD!0jl%Fy1M$R?~=O>1zC1j7<#*FFJ&e>+)yG`%w80-e(~6D zv#4x$m*$$q@4n$%9-;K5YLHG0mF)!&J4{$`+n!SC zx-E|Vs7k%E{4>$9I76}H9T$ziWMr1?me-5MYBH>uJMqhn^CWL3x$IS>bx<7BTR2wp zl7(zqY>p^Hg-OS18JRq)s!MGvmu_M=rQ>@KZig)miBT&H=o zeTz5qw+tP!xOh0ft75JHdVJ+F8oSqmf3ST+y*z@#Jsf&wJUX^praKd7p=&u<&>f?hkYgmFBoY05X-Qk>j<}Lk zte7IRIdIWH!N8z>e|NcVs-_z*Mu$6>DZYA5J;Kg+t0~*GC-k^O@#n+guO`gJwtr?F zR!)QiEg8pMn2kTQXlmo$xl>mNcbDCO;Rw1zg;~opw^- z{K)9aD!W~X_b-54LE-xQr`U^yTSFCeT!r69x4LCUsxazMGTgt#^0wq=+sWlUfwOar zS9;nL5hR&bhL?lAz5b^h%Uh9+iK(dsJ*(iekrtD8_J2M5K`vR*oFD>KgOh8d4M>d-Xe|2{Ovu=_`-y+iL4_MnWf{m%0FXGxh@3BM=JMYxklOb|6M{+O951Xv)_gh_|mY9q(Y1_O3S+SQe}LhgHuhehx;Ut1pz?wYz~3vU69bha=S z1u)GtgG}8?&{SwnlyZUIup~g>9M%^GFTfaUpXpoB3JXX+PJs4gy$!nnXc+X~RN8K@ z(?B3D1sY#7($fV&AFl;k98-{Wrl;+OKpntWOPL)dqR2Et!LBi$#ge0Kb%M?7v3_gY z(7OdbW@{O`HPhi$tf85=lT1!VreY@~C%2>lN711xLq{%n%@qs{GzQ`n7i(Bx)%1`J ziD{nXQ4F{Ylj9np^E3YG)2B$01qP-OEBrm6M+@l(w70bt*xiWSeXEa)Syw4qfr3F9 zR0rtc9wBD|bqCQK!a$J=9U7H(GB8+h6o-#kE(I>a{#hw`dN$SvMnOr1lHic4fkvb8 z+mm9M@RCTAm00KjXi`jpQi?dhNi9QF!Jy9^B>?C+v!-pwTe-4rWaKV91R8p);VBo# z#KHg^_GqN+dGJI7Ig}yYnhP481D!B1D-ky{gNW`COFXQhu@UBC#ox&?vTKeLb#iwn zJUPVC+0pR^{wDpyhqF*#L3+0D8wDQtv(=~!+bh7Ev9_Z0MvbEvRr0LS4C z`!-pO@^uUOq+w`30!NAnVP*g)2M~Xpp>W9r9aZxuxNMW7Q2jD6H&1FzOL@2b8P)(l zl)62U8H}7+*sIjk)RzwUit=*g4nadFbS+P$$6GbQ@rId{;_$hk7!$@o)D;w$z8z;w z$y6smBlbjxI)5v)nJ0Q+sOF3o2jytw{KH~hh}DEYGqbZzNgnvXMhh$G$gSL3sF3p- zyADnKlK`CCd3%cs=_Y@N@{A6HiP*KJC1;fZ?9c3j*tRIF-+Fudt@4Tr^k1*(Pb{$G z;^uCK7V84Iriv@=*N{fb+}w6eKmU*e9K;@HDJUPnLudvE z2ea|WzJ`j;d|U`0%H*xH{V-OC4|SrSJ1o-nYk9=Qr_evxoGf9m@s)Fa zg@uI)iHVvR%uZb&1WujZ-7y02j~v)Di}&Eu!KlGqHCCd5tAa%=FHb62Y1XsGN&x*_ zy@`J_alMLRE`CER}q*A>5?4k_Zc*Yd&jG(zV^kNW{HXVIY#u($aVWZLIqrL z#o?~KsNBbh+j4SqCoE1+tGgRS+YTo7$f5C+UTtT-)gx@_P`FSD+-cn&`^x^YcCRh! z^WDF`r8jQsaAe2|*NQ-y+hAg{vj4)V7RS&OMYOaM1`{~(aI5f3nl~HjP}<)g@3h%3 zG2Ixvp4Hda=dfXODa`si!D6~G0nM>Io$24UZispy_cN@_EqF?Cc|YF{%vL?g`y+Kw zpz(fi#&oTJ1Qekq%GL?u=rCtU^p` zz%Fqtf3t}UnOHmf!DdD=RQ&PRuUtG_I$CAPlR2$rnDM89SRbN7!%(ZOopANW;$xhK z_uK>yh`jf#DEm+?ybs}gKwy~s@ZG5Gyt>Ewrn!g1ZtXQWp9zx;2m6BE)@zKS2EH=e zD@8;B4?g86Y$(IJtBaI2HI?x(;~egSU=Oi{K(N1mUr}fBsp8t=U?1U8<7ZeNBWJEsd2MAB^c^)lA9V zaSoL_2Vf!=7EC?Ilu74^7 zgp=gvqOe@OyM+C&L^HqXwp;s^W4D^V(YOuTg1h1dIgN=C5i!j=@!|A|Du*l?Ny(3x zo>|GFOKrx?%_K$#lLfuJYM~2q#B2PDU@pob6kTT>Q`ES$vX*XBq{{lB?mFVDilk*6 zCWKGDxF{n%5y@O!UuHC5FK8^!Qa$XYHP#c*ftwyo<#}*WW$BE>)H6f<{ja6q!M4|} z33wTH%V7@B{gmLX<=KaiUav{JW0LDJ#KSN32?o&Ly6>#|`%(VGPqP$D;T zRLsx22f8#jxSK~$81n_nCb^rZgKf19awpntvL>iaMd!Iycu~!T$ql zzYjiBri$fp*;YhO-xq5SYb<_Q1`DdZwv$cV*0C5LAIWCT#@)3vW~Ph$p7=H#B)z9wj1v$qTNyvzrs)`*gn)&G=JJYt6{bII*-ON|=n4 zjKf_=0S|va%T;BVBa1{ccGrw(zQG)D+|h+JZzf?YX8PwJ)0> zro3GvmFBB5OmbNDLz#R;ESwP}uTRz03cUlVcW8yQk#~~PRt)9>wZqW8Y19TL&1G?X z#oF7S1DX~W7q5=quBxy>muc5fTuzd-RS$-4?ES7ptYV=oI5&e0b>bNqoLaN|%E?5Q zo$V(>uG`--W5^U3>X6Ia;HTw#aN$MA4HRb%@37LaJUHvMx)6hMcZj(%# zX+E7*!cz0z?u{(!RCa8$xx{735U3Nj7#e)KVAYub$Hkr5hX|-Rg4mUsQ`~k#Rmb_n`rCrmD5@Sw{bMc*ST4`B1 z!V6+Q(kv`Hj1=pw$?l%PWTAMr$XEChPOGvIgL+of3nYOWv7}mhP3D&k_v*o8uNa+=;SR*#UPlr%Hr zq7ZGBL&zw}6rw5^QPx#SQ^TsNWik^;b%=wGEIx`}HfMWkGMU1fC1_qovl^GjNOt6&IIC z0Ghq^64&T}R~<>hdn^z{@|M;F%WF^UXpf9u*5$)EXMl z)8F$eeLqS-Sqbh9peM@B=H_ThZ)+KaFz;lZAHwEzdIr||^K!0#&V!b==|`EAeV^WbyhybWyX&z+kJ7M5{!4w455 z0C`7F5GGo~bN=#`W$bg;m6Vj`wy%k&M07iIgDrM1TLlXPp#t@NyKU_76ecVfRq+OQ5bGqS@8*- zi4VOnKR>S#H8eEDqZ}d&1BG?5SS(D^Mz75g5kVCvC#SN2IruE=<)PZgtpCb(AsS`O z=wU%dI2p;O;cKe`$OxPV^eqjDoCVSN@d$+ik74|mk`ll{&Q-BoOE}H1rK8iDvwHx% z5P=Ke3mT{u{#zbt6|w_KU?V&~eUq9;fiyCZ$)FT|$`J*|j5fds|C#Dth6_skeD9i3 zo>htmc8dhp5>eLyWts&=#zZt^Z*9?f$_Wt>5r|R-zbtcdi2Fa&P)K6t8o^Y676_rK`oM3o(IB=(Iirq+Ynv;*$KVvtlIyyQKX~yQ6u1xd-xh!O} zD~$k{13fxzTL99ijT$dt3niu~_}haHSbPh}LD=E)^4btAqnjKR?7x5<41n3(XVy9X zGEl0cO52NHk@N;`LvRI%HLRQRPi6G$y2GNkiV@6h$@)p`M7Y0%xjDET96B!w4U9j8V zZvvZ|8>kEg6L6ToaN=ly_0a>?RDDB3SAT!NQt9#I$C0#eELksAISDWV*TFAKiIhDk z5kBO4&mib-po>;-jw!}+3#4c!#y-)Ym!b*4nM9<^g#aL?SHaF^X0AkIm^vK1R8uU^c zhcR1El4UV|LsM6-m}(fW&yX<oM}c;ZHNY};LBd8c?qE`f&M)?}{s^Z__*U~UY;S>@dTzd$e*6eQo( zWdO&$nZQe0e$s%IbGsO4y~+asFOnjWq_Ou2)yk;5OUO6u3{T5JLDk&xI>7rtaB?d+G?{;1;q~w~`2%Ch zAD`C4>!NSIIeoc0n@9xA$9`SOf9g==?y{hVHF#V|ve3JP3ipssR817(q`a9+Y1KgW zSX1lGwS={zT8kB#lP==Dn})@21skVQO!VzNME{_#P;+@GOQBZ+}6r%_r>GiVAL+-tUVb*OH= zi=*rJX~zpHf%Dt-&o2r zEek1=WkuyeP3*2l;CQ>j1sSQ1Z8N3d z%y8C5@yvIl|Mu_SzFl|Lk4}`UtlXhMO-cNG`<@5f$a09o=7_JmF;f#0yW_Tt4x%hn zcB4>t8yz=@>GM6r+2ly2I|)rMCKrB%CqV!M4bwrqcsg%{2^C(Mx{CiW0GeOD{zB)x{@2}?wg;cQH#ou zf_g&=8^n45TzfJA0$*|*Tj#lDCXScn6ms&QJiB1kQK<7Mi2P6})jj|G-$OR|%l)vw zDAeyL#5AdSczA%=I8)@WK+I}26qasgVF90E!wUd73?pheIs6~BiqpqYCIj$WhlZf4 zP=MWKLZ6)-fRW(rkx&FcP0*ZrD>D>;K+8z~AR5H`1R5crqBmX41H^8sKi>ukV7!+n z8euGqJ;-fylmu4;#E3w!2+9nK_le+FE0>!ta&d8KMEUsnP4yUC>qLR#8FVpR1}}?% zqsRwFm!1n}j-UTGj-Di3I-HpCJU{3@w>m{|kHKp#F1RA$Xrc=w`C z9RvsV$PeIrGQ?nkFsZ39XmwUV0~|KoL4AO-k;2YkxfDqFwLzey4>8n#iIG63^CLjv zliqR=G`4_(X%y_2#j$CS+e2cTc>GGbK;zRR+y$7eH5dpCf`R`Y$t}>+#V{AJJAK%c z@rFnWu+kZ|?4hsWX1;V7+=B|$g-q>tB?Jr)139qmI_vElNX!HH`C0Xdj};X_C8rZu zncMW;wUrfH2z~%9M&NHayj@W1!7}2pjnI)91NwZxSO18^&9F2K;3O2g62;pjV8bN-zBnU%e_yKqdW}%16Ax5b zQK$!d!C|6Mw@`a|;Xemee`onW+`a$%zcl0 Date: Mon, 7 Feb 2022 16:35:32 -0500 Subject: [PATCH 04/58] add side script for bioscape domain definition --- R/domain_define_bioscape.R | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 R/domain_define_bioscape.R 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) + +} + + + + From 5cd40b02c0819b274ec05f25af5cd4e7e9e348ce Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson (horae)" Date: Mon, 14 Feb 2022 11:09:33 -0500 Subject: [PATCH 05/58] update gitignore --- .gitignore | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.gitignore b/.gitignore index c2ddab49..deb37be0 100644 --- a/.gitignore +++ b/.gitignore @@ -36,12 +36,6 @@ processed_data/ data/* */other_data/* .DS_Store -<<<<<<< HEAD img/*_files img/*html _targets/meta/meta -======= -*/meta -img/network.html -img/network* ->>>>>>> main From 76719145ed7ae6934fd0d16848705144f7cf8ca7 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson (horae)" Date: Mon, 14 Feb 2022 11:10:06 -0500 Subject: [PATCH 06/58] update readme fig --- README_files/figure-gfm/unnamed-chunk-3-1.png | Bin 0 -> 68403 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README_files/figure-gfm/unnamed-chunk-3-1.png diff --git a/README_files/figure-gfm/unnamed-chunk-3-1.png b/README_files/figure-gfm/unnamed-chunk-3-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ab24135744c8c6db95053a6c711fc1b85c37c82c GIT binary patch literal 68403 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 literal 0 HcmV?d00001 From e9819144df3a620d15077ec72a103976ec5aecf2 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson (horae)" Date: Mon, 14 Feb 2022 12:56:23 -0500 Subject: [PATCH 07/58] add Brian's files --- .github/decrypt_secret.sh | 40 + .targets-files | 2443 ++++++++++++++++++++++++++++++ R/process_dynamic_data.R | 101 ++ R/process_fix_modis_projection.R | 94 ++ R/process_stable_data.R | 65 + decrypt_secret.sh | 14 + 6 files changed, 2757 insertions(+) create mode 100755 .github/decrypt_secret.sh create mode 100644 .targets-files create mode 100644 R/process_dynamic_data.R create mode 100644 R/process_fix_modis_projection.R create mode 100644 R/process_stable_data.R create mode 100644 decrypt_secret.sh diff --git a/.github/decrypt_secret.sh b/.github/decrypt_secret.sh new file mode 100755 index 00000000..fdfc6cd4 --- /dev/null +++ b/.github/decrypt_secret.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +# Decrypt the file + +mkdir -p $HOME/.config/earthengine/ndef/ + +mkdir -p /home/rstudio/.config/earthengine/ndef/ + +mkdir -p /github/home/config/earthengine + + +# --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 + + + + 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/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_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/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 From 73c92e3a69903adc0fed38d39fc857e207087f96 Mon Sep 17 00:00:00 2001 From: adammwilson <900623+adammwilson@users.noreply.github.com> Date: Thu, 10 Apr 2025 16:49:50 -0400 Subject: [PATCH 08/58] update targets --- DESCRIPTION | 3 ++- _targets.R | 1 + emma-targets.Rproj | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 9bf7a592..7c280845 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -20,6 +20,7 @@ Imports: knitr, cmdstanr, posterior, - bayesplot + bayesplot, + rdryad Suggests: RoxygenNote: 7.1.1 diff --git a/_targets.R b/_targets.R index 5cc0f943..98690228 100644 --- a/_targets.R +++ b/_targets.R @@ -6,6 +6,7 @@ library(tarchetypes) 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) #If running this locally, make sure to set up github credentials using gitcreds::gitcreds_set() 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 From 80ba45d8f9ceba7a93127e88e7c8d9fbcd5ce944 Mon Sep 17 00:00:00 2001 From: adammwilson <900623+adammwilson@users.noreply.github.com> Date: Tue, 29 Apr 2025 09:39:08 -0400 Subject: [PATCH 09/58] start playing with appeears instead of earth engine --- .gitignore | 1 + R/get_release_elevation_nasadem_appears.R | 142 ++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 R/get_release_elevation_nasadem_appears.R diff --git a/.gitignore b/.gitignore index deb37be0..79b26e17 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ data/* img/*_files img/*html _targets/meta/meta +*.hdf diff --git a/R/get_release_elevation_nasadem_appears.R b/R/get_release_elevation_nasadem_appears.R new file mode 100644 index 00000000..bd48848e --- /dev/null +++ b/R/get_release_elevation_nasadem_appears.R @@ -0,0 +1,142 @@ +#Code for extracting elevation data from google earth engine + +#' @author Brian Maitner +#' @description This function will download NASADEM elevation data if it isn't present, and (invisibly) return a NULL if it is present +#' @import rgee +#' @param directory directory to save data in. Defaults to "data/raw_data/elevation_nasadem/" +#' @param domain domain (spatialpolygons* object) used for masking +get_release_elevation_nasadem <- function(temp_directory = "data/temp/raw_data/elevation_nasadem/", + tag = "raw_static", + domain){ + + API_URL = 'https://appeears.earthdatacloud.nasa.gov/api/' + + + # Make a directory if one doesn't exist yet + + if(!dir.exists(temp_directory)){ + dir.create(temp_directory,recursive = TRUE) + } + + + library(sf) + library(httr) + library(jsonlite) + library(lubridate) + + # Helper to read .netrc credentials + read_netrc <- function(machine = "appeears.earthdatacloud.nasa.gov", netrc_path = "~/.netrc") { + lines <- readLines(path.expand(netrc_path)) + start <- grep(paste("machine", machine), lines) + if (length(start) == 0) stop("Machine not found in .netrc") + chunk <- lines[start:min(start+2, length(lines))] + login <- sub(".*login\\s+", "", grep("login", chunk, value = TRUE)) + password <- sub(".*password\\s+", "", grep("password", chunk, value = TRUE)) + list(username = login, password = password) + } + + download_nasadem_nc_from_sf <- function(aoi_sf, out_file = "nasadem.nc", netrc_path = "~/.netrc") { + # Authenticate using .netrc file + auth_response <- POST( + url = "https://appeears.earthdatacloud.nasa.gov/api/login", + #config = httr::config(netrc = TRUE, netrc_file = "~/.netrc"), + set_cookies("LC" = "cookies") + ) + str(auth_response) + + response <- GET(files[i], write_disk(filename, overwrite = TRUE), progress(), + config(netrc = TRUE, netrc_file = netrc), set_cookies("LC" = "cookies")) + + + response <- httr::POST( + url = "https://appeears.earthdatacloud.nasa.gov/api/task", + body = jsonlite::toJSON(request_body, auto_unbox = TRUE), + config = httr::config(netrc = TRUE, netrc_file = "~/.netrc"), + httr::content_type_json() +) + + if (status_code(auth_response) != 200) { + stop("Authentication failed. Check your .netrc file.") + } + + token <- content(auth_response)$token + + # Transform AOI to WGS84 if needed + if (sf::st_crs(aoi_sf)$epsg != 4326) { + aoi_sf <- sf::st_transform(aoi_sf, crs = 4326) + } + + # Extract coordinates + coords <- st_coordinates(st_geometry(st_union(aoi_sf)))[, 1:2] + coords <- as.matrix(coords) + coords <- coords[!duplicated(coords), ] + coords_list <- lapply(seq_len(nrow(coords)), function(i) unname(as.numeric(coords[i, ]))) + + # Close polygon if needed + if (!all.equal(coords_list[[1]], coords_list[[length(coords_list)]])) { + coords_list[[length(coords_list) + 1]] <- coords_list[[1]] + } + + # Build request + request_body <- list( + task_type = "area", + task_name = paste0("NASADEM_", Sys.Date()), + params = list( + dates = list(list(startDate = "2020-01-01", endDate = "2020-01-01")), + layers = list(list(layer = "NASADEM-HGT", product = "NASADEM_HGT.001")), + output = list(format = "netCDF4"), + geo = list( + type = "Feature", + properties = new.env(), + geometry = list( + type = "Polygon", + coordinates = list(coords_list) + ) + ) + ) + ) + + # Submit task + submit_response <- POST( + url = "https://appeears.earthdatacloud.nasa.gov/api/task", + body = toJSON(request_body, auto_unbox = TRUE), + add_headers(Authorization = paste("Bearer", token)), + content_type_json() + ) + + if (status_code(submit_response) != 200) { + stop("Failed to submit task.") + } + + task_id <- content(submit_response)$task_id + message("Task submitted: ", task_id) + + # Poll for completion + repeat { + Sys.sleep(10) + status_response <- GET(paste0("https://appeears.earthdatacloud.nasa.gov/api/status/", task_id), + add_headers(Authorization = paste("Bearer", token))) + status <- content(status_response)$status + message("Task status: ", status) + if (status == "done") break + if (status == "failed") stop("Task failed.") + } + + # Get download URL + bundle_response <- GET(paste0("https://appeears.earthdatacloud.nasa.gov/api/bundle/", task_id), + add_headers(Authorization = paste("Bearer", token))) + files <- content(bundle_response)$files + nc_file_url <- files[[which(sapply(files, function(f) grepl("\\.nc$", f$file_name)))]]$url + + # Download the file + GET(nc_file_url, write_disk(out_file, overwrite = TRUE), + add_headers(Authorization = paste("Bearer", token))) + + message("Download complete: ", out_file) + } + + +}#end fx + + + From 791fdfefa6d26a5e14438a5f40247ced3c67c49c Mon Sep 17 00:00:00 2001 From: adammwilson <900623+adammwilson@users.noreply.github.com> Date: Mon, 5 May 2025 13:59:00 -0400 Subject: [PATCH 10/58] clean up merge --- .github/workflows/targets.yaml | 28 ++-------------- _targets.R | 61 +--------------------------------- 2 files changed, 3 insertions(+), 86 deletions(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index bd4d014f..849a638f 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -30,6 +30,7 @@ on: branches: - main - master + - dev-adam # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -57,22 +58,6 @@ jobs: - name: Checkout LFS objects run: git lfs checkout continue-on-error: true -# - 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: DECRYPT rgee SECRETS # run: ./.github/decrypt_secret.sh # env: @@ -85,7 +70,6 @@ jobs: - name: Install R Package Dependencies run: |- Rscript -e "questionr::qscan(list.files(pattern='*.R',recursive=T), load = TRUE, detail = FALSE)" # this scans all scripts and installs any needed packages - Rscript -e "remotes::install_github('ROpenSci/bibtex')" - name: Cache packages uses: actions/cache@v3 with: @@ -118,21 +102,13 @@ jobs: if (file.exists(source)) file.rename(source, dest) } shell: Rscript {0} -# - name: Run targets pipeline +# - 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() -# 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 diff --git a/_targets.R b/_targets.R index 4f7c9181..ddba1942 100644 --- a/_targets.R +++ b/_targets.R @@ -98,66 +98,7 @@ list( ) , - -<<<<<<< HEAD - tar_age( - alos, - get_alos(domain = domain), - age = as.difftime(26, units = "weeks") - ), - tar_age( - climate_chelsa, - get_climate_chelsa(domain = domain), - age = as.difftime(26, units = "weeks") - ), - tar_age( - clouds_wilson, - get_clouds_wilson(domain = domain), - age = as.difftime(26, units = "weeks") - ), - tar_age( - elevation_nasadem, - get_elevation_nasadem(domain = domain), - age = as.difftime(26, units = "weeks") - ), - tar_age( - landcover_za, - get_landcover_za(domain = domain), - age = as.difftime(26, units = "weeks") - ), - tar_age( - precipitation_chelsa, - get_precipitation_chelsa(domain = domain), - age = as.difftime(26, units = "weeks") - ), - -# Frequent updates - - tar_age( - fire_modis, - get_fire_modis(domain = domain), - age = as.difftime(7, units = "days") - ), - tar_age( - kndvi_modis, - get_kndvi_modis(domain = domain), - age = as.difftime(7, units = "days") - ), - tar_age( - ndvi_modis, - get_ndvi_modis(domain = domain), - age = as.difftime(7, units = "days") - ), - tar_age( - ndvi_dates_modis, - get_ndvi_dates_modis(domain = domain), - age = as.difftime(7, units = "days") - ), - -# Processing -======= -# # # Infrequent updates via releases ->>>>>>> main + #infrequent updates via releases tar_target( alos_release, From d00f9728817f60f81e3b5f09db8dae6ba187667f Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Tue, 27 May 2025 17:09:03 -0400 Subject: [PATCH 11/58] Update targets.yaml --- .github/workflows/targets.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index 849a638f..6cfc6f49 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -43,7 +43,7 @@ name: targets jobs: targets: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest container: adamwilsonlab/emma:latest env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} From 93cfcd2e50e14d7246835470d014f2a42dadb5fd Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Mon, 5 Jan 2026 09:56:29 -0500 Subject: [PATCH 12/58] - update appeears_auth file - works now locally - started working through functions auto summary below: Add functions to download and process NDVI and NDWI data from MODIS and VIIRS - Implemented `get_release_ndvi_dates_modis` to download MODIS NDVI dates and convert to UNIX format. - Created `get_release_ndvi_dates_viirs` for downloading VIIRS NDVI data with appropriate quality checks. - Added `get_release_ndwi_modis` to download the most recent MODIS NDWI layer. - Introduced helper functions for date conversion and quality assessment. - Ensured proper directory management and error handling during downloads. - Updated documentation for clarity and usage instructions. --- DESCRIPTION | 22 +- R/appeears_auth.R | 42 ++ R/get_release_fire_modis_appeears.R | 210 ++++++++++ R/get_release_ndvi_evi_modis_appeears.R | 211 ++++++++++ R/get_release_ndvi_viirs_appeears.R | 207 ++++++++++ R/vegetation_map.R | 7 +- _targets.R | 360 ++---------------- _targets/.gitignore | 10 +- _targets/meta/meta | 145 +++---- docs/APPEEARS_SETUP.md | 110 ++++++ {R => img/old}/clean_up.R | 0 .../old}/get_release_elevation_nasadem.R | 0 {R => img/old}/get_release_fire_modis.R | 0 {R => img/old}/get_release_kndvi_modis.R | 0 {R => img/old}/get_release_mean_ndvi_modis.R | 0 {R => img/old}/get_release_ndvi_dates_modis.R | 0 {R => img/old}/get_release_ndvi_dates_viirs.R | 0 {R => img/old}/get_release_ndvi_modis.R | 0 {R => img/old}/get_release_ndvi_viirs.R | 0 {R => img/old}/get_release_ndwi_modis.R | 0 20 files changed, 921 insertions(+), 403 deletions(-) create mode 100644 R/appeears_auth.R create mode 100644 R/get_release_fire_modis_appeears.R create mode 100644 R/get_release_ndvi_evi_modis_appeears.R create mode 100644 R/get_release_ndvi_viirs_appeears.R create mode 100644 docs/APPEEARS_SETUP.md rename {R => img/old}/clean_up.R (100%) rename {R => img/old}/get_release_elevation_nasadem.R (100%) rename {R => img/old}/get_release_fire_modis.R (100%) rename {R => img/old}/get_release_kndvi_modis.R (100%) rename {R => img/old}/get_release_mean_ndvi_modis.R (100%) rename {R => img/old}/get_release_ndvi_dates_modis.R (100%) rename {R => img/old}/get_release_ndvi_dates_viirs.R (100%) rename {R => img/old}/get_release_ndvi_modis.R (100%) rename {R => img/old}/get_release_ndvi_viirs.R (100%) rename {R => img/old}/get_release_ndwi_modis.R (100%) diff --git a/DESCRIPTION b/DESCRIPTION index 7c280845..b12e75eb 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,13 +14,21 @@ Imports: viridis, colourvalues, sf, - raster, + terra, testthat, kableExtra, knitr, - cmdstanr, - posterior, - bayesplot, - rdryad + appeears, + piggyback, + lubridate, + jsonlite, + dplyr, + arrow, + targets, + geotargets, + janitor Suggests: + rgee, + reticulate, + raster, RoxygenNote: 7.1.1 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/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_evi_modis_appeears.R b/R/get_release_ndvi_evi_modis_appeears.R new file mode 100644 index 00000000..d0c50022 --- /dev/null +++ b/R/get_release_ndvi_evi_modis_appeears.R @@ -0,0 +1,211 @@ +#' @title Download MODIS NDVI and EVI via AppEEARS and publish monthly NetCDF +#' @description Submits an AppEEARS area request for MOD13A1.061 NDVI, EVI, 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_evi_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. +get_release_ndvi_evi_modis_appeears <- function( + temp_directory = "data/temp/raw_data/ndvi_evi_modis/", + tag = "raw_ndvi_evi_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 = ", ")) + } + + 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 + 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 <- "2000-02-18" # MODIS Terra 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 NDVI+EVI 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 + 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 dynamically (include composite Day of Year for exact acquisition date) + ndvi_layer <- "500m_16_days_NDVI" + evi_layer <- "500m_16_days_EVI" + qa_layer <- "500m_16_days_VI_Quality" + doy_layer <- "Day_of_Year_1km" + + try({ + lyr <- appeears::rs_layers("MOD13A1.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] + 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(evi_cand)) evi_layer <- evi_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, ", ", evi_layer, ", ", qa_layer, ", ", doy_layer) + + # Build request payload - NDVI, EVI, and QA in one request + req <- list( + task_type = "area", + task_name = paste0("emma_ndvi_evi_", 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 = "MOD13A1.061", layer = ndvi_layer), + list(product = "MOD13A1.061", layer = evi_layer), + list(product = "MOD13A1.061", layer = qa_layer), + list(product = "MOD13A1.061", 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 into monthly files + 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_evi_MOD13A1_%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_evi_MOD13A1_%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 limit + 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/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/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/_targets.R b/_targets.R index 2a924911..5c6139ae 100644 --- a/_targets.R +++ b/_targets.R @@ -3,20 +3,18 @@ print("Starting tar_make() - print") library(targets) 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(appeears) library(rdryad) +#library(future) #not sure why this is needed, but we get an error in some of the files without it #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")) +# 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) @@ -24,212 +22,16 @@ library(rdryad) 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") - - ee_Initialize(drive = TRUE, - gcs = FALSE, - use_oob = FALSE, - drive_cred_path = json_token, - gcs_cred_path = json_token, - ee_cred_path = json_token) - - } -# # 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")) #"cubelyr", +## Authenticate with AppEEARS +source("R/appeears_auth.R") list( - # #Prep needed files # start - 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", @@ -254,7 +56,7 @@ list( ) , - tar_target( + tar_terra_vect( vegmap, get_vegmap(vegmap_shp) ), @@ -268,14 +70,14 @@ list( # # # # Infrequent updates via releases - tar_target( - alos_release, - get_release_alos(temp_directory = "data/temp/raw_data/alos/", - tag = "raw_static", - domain = domain, - json_token) - ) -, +# 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_release, @@ -293,13 +95,13 @@ list( sleep_time = 180) ), - tar_target( - elevation_nasadem_release, - get_release_elevation_nasadem(temp_directory = "data/temp/raw_data/elevation_nasadem/", - tag = "raw_static", - domain) - ) -, + # tar_target( + # elevation_nasadem_release, + # get_release_elevation_nasadem(temp_directory = "data/temp/raw_data/elevation_nasadem/", + # tag = "raw_static", + # domain) + # ) +#, #Temporarily commented out, seems to be an issue with URL for landcover data at present # tar_target( @@ -332,111 +134,39 @@ list( tar_age( fire_modis_release, - get_release_fire_modis(temp_directory = "data/temp/raw_data/fire_modis/", - tag = "raw_fire_modis", + 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, - 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", + get_release_ndvi_modis_appeears(temp_directory = "data/temp/raw_data/ndvi_modis/", + tag = "raw_ndvi_modis_nc", 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), + sleep_time = 5, + verbose = TRUE), 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), + 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") ), - - - 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 @@ -712,17 +442,7 @@ list( 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") - ) - + ) ) diff --git a/_targets/.gitignore b/_targets/.gitignore index ce2af28d..23ab7917 100644 --- a/_targets/.gitignore +++ b/_targets/.gitignore @@ -1,5 +1,11 @@ +# 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 +!meta meta/* -#!meta/meta +!meta/meta diff --git a/_targets/meta/meta b/_targets/meta/meta index 385c68ef..a0df8508 100644 --- a/_targets/meta/meta +++ b/_targets/meta/meta @@ -1,70 +1,75 @@ -name|type|data|command|depend|seed|path|time|size|bytes|format|iteration|parent|children|seconds|warnings|error -country|stem|e1ba870f74ff51d0|b6a9176b6c51da0c|4b52215de67bc2a9|-396713552||t19010.7503285516s|762b0ff687cec244|3225950|rds|vector|||12.398|| -vegmap_shp|stem|d3744d69c8da6bb2|193e3e8d55a8bbd4|ef46db3751d8e999|-232248272|data/manual_download/VEGMAP2018_AEA_16082019Final/NVM2018_AEA_V22_7_16082019_final.shp|t19010.7230592s|9cc1ad1c26fc3f86|493121012|file|vector|||0.001|| -remnants_shp|stem|9dc0c644eedf6430|81ff8511059852c0|ef46db3751d8e999|1961884837|data/manual_download/RLE_2021_Remnants/RLE_Terr_2021_June2021_Remnants_ddw.shp|t19010.7228826241s|9fd0b3ef5a76431f|726393404|file|vector|||0|| -vegmap|stem|b502445ec7320d62|1811b4a0f90e1688|26cd61d94db2b5bd|602754364||t19010.7510550017s|d2ddbb368a516aaa|79094695|rds|vector|||49.487|| -domain|stem|655dea841d382d95|7a783623d7c8b012|ea1ef9ffbef37d3b|640757417||t19010.7519258264s|c233e5bdd1ddd8a9|2171832|rds|vector|||74.221|| -alos|stem|79422857d543d9b8|a73bb6286224cc7c|893266c9a485d13d|1794838964||t19010.7519476304s|991ef619886270ed|69|rds|vector|||1.82|| -climate_chelsa|stem|4ac1eb883db90b0f|99f4a2e0245696e3|58b8ca812daa711e|558800862||t19010.7519484276s|a1c456b03adbfbf8|44|rds|vector|||0.037|| -clouds_wilson|stem|4ac1eb883db90b0f|6ecb469165f9be5d|d50df5d8a744a12d|526667795||t19010.7519492106s|a1c456b03adbfbf8|44|rds|vector|||0.035|| -fire_modis|stem|4ac1eb883db90b0f|47cd490ca08744a2|9d37093d488149dc|1443052342||t19010.7531680655s|a1c456b03adbfbf8|44|rds|vector|||105.284|| -ndvi_dates_modis|stem|4ac1eb883db90b0f|869e283b2f788933|cd58ca99f17d6ef1|1534273282||t19010.7543892415s|a1c456b03adbfbf8|44|rds|vector|||105.481|| -landcover_za|stem|4ac1eb883db90b0f|3386a5338d2753ab|30dd604f0a320f22|-69106787||t19010.7543900616s|a1c456b03adbfbf8|44|rds|vector|||0.028|| -precipitation_chelsa|stem|4ac1eb883db90b0f|7199549b0a2f0b42|e0274b0fd94d57ea|-1119422601||t19010.7543908838s|a1c456b03adbfbf8|44|rds|vector|||0.047|| -elevation_nasadem|stem|4ac1eb883db90b0f|168eaedd9e679f1f|22030e93ab91c3d6|-1875480619||t19010.7543912094s|a1c456b03adbfbf8|44|rds|vector|||0.002|| -remnants|stem|69d4225f3763addb|7d78ea0be657b6ea|a45d26b42f8abebe|630969701|data/remnants.tif|t19010.7554528325s|9e5c852f0832e47b|915859|file|vector|||91.713|| -ndvi_modis|stem|9b674d12b8f6fe05|de45493152f51759|a9eabc12cafc1b8f|305104419||t19010.7566994782s|ff026697d66e9a9f|75|rds|vector|||107.664|| -fire_doy_to_unix_date|stem|4ac1eb883db90b0f|bf360ba34319669b|1c4f28a90c55cc95|-1541145076||t19010.7567007488s|a1c456b03adbfbf8|44|rds|vector|||0.065|| -remnant_distance|stem|f2baefe7161f7453|9326018404110314|dc6f6cfa0b47fd6a|-1777723304|data/remnant_distance.tif|t19010.7567064373s|cdcc17971c8665ee|721827|file|vector|||0.469|| -template|stem|0065ce2e6fbc9fd7|b60205904e5ebb71|382019eba689d359|-1092328110||t19010.7567068069s|a3c4b57a6f0085ec|90|rds|vector|||0.003|| -burn_date_to_last_burned_date|stem|4ac1eb883db90b0f|bf7282dcd7badc0f|5659b5c27d630b7b|1181387558||t19010.7567079753s|a1c456b03adbfbf8|44|rds|vector|||0.059|| -model_data|stem|4b47a4fede880056|8223ad42e5e049cb|f92b99e321a7c2ab|-495503059|data/model_data.csv|t19010.7567261441s|2166b4d5a598ebf2|132850454|file|vector|||1.543|| -projected_alos|stem|4ac1eb883db90b0f|70f0cbec3ed05d83|b8f84d0364860842|-14066847||t19010.7568385638s|a1c456b03adbfbf8|44|rds|vector|||9.63|| -projected_climate_chelsa|stem|4ac1eb883db90b0f|eda61e0b3f525eec|88ba78acfb686129|548473637||t19010.7571726449s|a1c456b03adbfbf8|44|rds|vector|||28.824|| -projected_clouds_wilson|stem|4ac1eb883db90b0f|ea7fd60d1374ec17|a880dd36d698db69|836157549||t19010.7574374492s|a1c456b03adbfbf8|44|rds|vector|||22.844|| -projected_landcover_za|stem|4ac1eb883db90b0f|2aa6a682b99d12fb|34b25929b783409e|773277741||t19010.7576016743s|a1c456b03adbfbf8|44|rds|vector|||14.138|GDAL Message 1 Value 284943666 of field Count of feature 40 not successfully written. Possibly due to too larger number with respect to field width| -projected_precipitation_chelsa|stem|4ac1eb883db90b0f|f920bb843cc67d43|da038c020df410f1|-843765989||t19010.7576356575s|a1c456b03adbfbf8|44|rds|vector|||2.906|| -projected_elevation_nasadem|stem|4ac1eb883db90b0f|d57ec667d25555d0|3393fb9548961eae|945590385||t19010.7578106988s|a1c456b03adbfbf8|44|rds|vector|||15.09|| -getQABits_match|function|866042616e64190c|||||||||||||| -domain_map|function|b3a8249eb2758de6|||||||||||||| -process_climate_chelsa|function|f08153cd7da37a96|||||||||||||| -get_soil_gcfr|function|e4af25f0baf15c88|||||||||||||| -get_integer_date|function|b7ba3e11b179e923|||||||||||||| -get_ndvi_modis|function|96de177976c64e6f|||||||||||||| -spatial_outputs|function|4c1a11d0b9579d31|||||||||||||| -domain_remnants|function|199dfa8f66690059|||||||||||||| -process_clouds_wilson|function|3a9e74e71b7e1da8|||||||||||||| -national_boundary|function|98c948356a6f3853|||||||||||||| -get_landcover_za|function|9c2b773a22add072|||||||||||||| -process_precipitation_chelsa|function|efa7c78c9025c5d2|||||||||||||| -update_git|function|f837db84a6c90d8a|||||||||||||| -.Random.seed|object|e9a5117e62d6b9dd|||||||||||||| -get_domain|function|f4a2cb4148ca73b4|||||||||||||| -group_data_function|function|cf81a22df7ca8418|||||||||||||| -clean_data|function|484d9c4667cbdd4d|||||||||||||| -get_alos_data|function|26aa3ba42cf425c1|||||||||||||| -get_model_data|function|9e05be8a27aace67|||||||||||||| -get_template_raster|function|88629727ca4e2301|||||||||||||| -get_kndvi_modis|function|f7d7475ddcb4b3e8|||||||||||||| -process_alos|function|b9e157819129d360|||||||||||||| -get_elevation_nasadem|function|e7f7a3b0415747eb|||||||||||||| -process_burn_date_to_last_burned_date|function|049eadff781b174d|||||||||||||| -domain_define|function|4b4a20bae19cff79|||||||||||||| -domain_distance|function|e0b30c1a161fe043|||||||||||||| -get_vegmap|function|aaa6165a398f62e5|||||||||||||| -get_ndvi|function|7748a64461edb4ec|||||||||||||| -process_landcover_za|function|b91353e311adff49|||||||||||||| -fit_model|function|d0d4e0ea8d7f400c|||||||||||||| -process_ndvi_relative_days_since_fire|function|6c81958b34170768|||||||||||||| -domain_rasterize|function|44797f03c1431513|||||||||||||| -stan_data_function|function|60507201f11a2ffe|||||||||||||| -get_precipitation_chelsa|function|777975e073c90bc6|||||||||||||| -get_climate_chelsa|function|b600ca99f7b34606|||||||||||||| -summarize_posteriors|function|92d2f12f0d1f6071|||||||||||||| -process_elevation_nasadem|function|744783eb9a692603|||||||||||||| -process_fire_doy_to_unix_date|function|c078835d35dbcc59|||||||||||||| -get_clouds_wilson|function|0907844bd0aee4a1|||||||||||||| -MCD64A1_clean|function|497d11983dd6d889|||||||||||||| -get_ndvi_dates_modis|function|e95ad8095ccca511|||||||||||||| -get_alos|function|04f279a3ab183c2f|||||||||||||| -get_fire_modis|function|f693ac66d85dc593|||||||||||||| +name|type|data|command|depend|seed|path|time|size|bytes|format|repository|iteration|parent|children|seconds|warnings|error +correct_ndvi_dates_release_proj_and_extent|stem|49be87cd8aaf3e80|1d0f5f39ef47d1b6|edb3a13ae4cb1ccc|-1844360325||t20458.6135571947s|s63b|63|rds|local|vector|||17.619|| +remove_ee_backup|stem||befe0ca90eb2c488|2c530c1562a7fbd1|-773029837||t20458.6135575072s||0|rds|local|vector|||0.003||could not find function 'clean_up' +vegmap_shp|stem|495c02a4c1083ae3|64fa0ae6793b59bf|2c530c1562a7fbd1|-979952299|data/manual_download/VEGMAP2018_AEA_16082019Final/NVM2018_AEA_V22_7_16082019_final.shp|t20445.6913461798s|s493121012b|493121012|file|local|vector|||0.026|| +domain_map|function|9b57e91e94d73101 +rstoken|object|6dc8d7df7129e26b +robust_pb_download_solo|function|d148e32c5f7beb8f +fit_model|function|8f8e281853bbef05 +process_dynamic_data_to_parquet|function|49f8abfce5758803 +clean_data|function|860451632161bcc2 +national_boundary|function|865305b12ad0bf45 +domain_rasterize|function|29d78831857df164 +robust_download_file|function|2ea70b1df9a469fc +verbose|object|988c41ba10911dc8 +kr_pwd|object|b61b0b830c8b3de2 +get_release_precipitation_chelsa|function|e5a54d4f8a475a6c +summarize_posteriors|function|848f748de452ef0d +robust_pb_upload|function|bf296132f5183235 +get_domain|function|73c97bc96bfedda4 +.Random.seed|object|08752509bdabcc8a +tag|object|64ff18d09ad298f3 +earthdata_user|object|a72c4475a256a3c1 +max_layers|object|08d5f59e833de599 +existing_kr|object|1bb3bf184f7669e1 +get_alos_data|function|75cf21dd60609648 +process_fix_modis_projection|function|08e12464ac799094 +group_data_function|function|3e4778f64d247976 +domain_distance|function|939a115603a9b4df +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 +robust_max|function|6d27abe569a34028 +get_release_landcover_za|function|9ece1e5f946d7a70 +get_vegmap|function|8590caba91b9be39 +get_release_fire_modis_appeears|function|9992a7da9cc6cf78 +domain_define|function|a01b7cc8a65adde0 +kr_name|object|643fa3c4a8310651 +temp_directory|object|40d122f36d50a344 +domain_remnants|function|4c6497b244bdbc02 +earthdata_pass|object|b61b0b830c8b3de2 +update_git|function|8d72fa6c21b94951 +sleep_time|object|9f0cda529028d8d9 +get_model_data|function|dc3148c05e8961ed +get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 +get_release_elevation_nasadem|function|0404b4ce37dd6a41 +robust_min|function|21d2e9972a741573 +robust_pb_download|function|4df763e84d88eae4 +get_release_clouds_wilson|function|810ed2ec5c642649 +get_release_climate_chelsa|function|4a50043c539c8eeb +get_release_alos|function|3d0bd84374208048 +process_release_precipitation_chelsa|function|d0ff995578684615 +domain_remnants_release|function|d06ba69c89670801 +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_alos|function|d1225f8b3a3fa4da +domain_distance_release|function|c9d2a5f3c74dfc11 +process_release_soil_gcfr|function|51a95877cbbd87c2 +process_release_biome_raster|function|a0b27b083f7ed85e +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|stem|0c98d327f6beefbe|f82077cc150b71ed|774ecf7dbe3e5980|986433229||t20458.6208086331s|s141541376b|141541376|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||18.36|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)| 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/R/clean_up.R b/img/old/clean_up.R similarity index 100% rename from R/clean_up.R rename to img/old/clean_up.R diff --git a/R/get_release_elevation_nasadem.R b/img/old/get_release_elevation_nasadem.R similarity index 100% rename from R/get_release_elevation_nasadem.R rename to img/old/get_release_elevation_nasadem.R diff --git a/R/get_release_fire_modis.R b/img/old/get_release_fire_modis.R similarity index 100% rename from R/get_release_fire_modis.R rename to img/old/get_release_fire_modis.R diff --git a/R/get_release_kndvi_modis.R b/img/old/get_release_kndvi_modis.R similarity index 100% rename from R/get_release_kndvi_modis.R rename to img/old/get_release_kndvi_modis.R diff --git a/R/get_release_mean_ndvi_modis.R b/img/old/get_release_mean_ndvi_modis.R similarity index 100% rename from R/get_release_mean_ndvi_modis.R rename to img/old/get_release_mean_ndvi_modis.R diff --git a/R/get_release_ndvi_dates_modis.R b/img/old/get_release_ndvi_dates_modis.R similarity index 100% rename from R/get_release_ndvi_dates_modis.R rename to img/old/get_release_ndvi_dates_modis.R diff --git a/R/get_release_ndvi_dates_viirs.R b/img/old/get_release_ndvi_dates_viirs.R similarity index 100% rename from R/get_release_ndvi_dates_viirs.R rename to img/old/get_release_ndvi_dates_viirs.R diff --git a/R/get_release_ndvi_modis.R b/img/old/get_release_ndvi_modis.R similarity index 100% rename from R/get_release_ndvi_modis.R rename to img/old/get_release_ndvi_modis.R diff --git a/R/get_release_ndvi_viirs.R b/img/old/get_release_ndvi_viirs.R similarity index 100% rename from R/get_release_ndvi_viirs.R rename to img/old/get_release_ndvi_viirs.R diff --git a/R/get_release_ndwi_modis.R b/img/old/get_release_ndwi_modis.R similarity index 100% rename from R/get_release_ndwi_modis.R rename to img/old/get_release_ndwi_modis.R From 6fe3870159cacae78156d97f6ad38e26b83e0635 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Mon, 5 Jan 2026 11:55:34 -0500 Subject: [PATCH 13/58] Refactor domain and national boundary functions for improved clarity and performance --- R/domain_define.R | 21 +++++++++------------ R/national_boundary.R | 12 ++++++------ _targets.R | 4 ++-- _targets/meta/meta | 10 ++++++---- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/R/domain_define.R b/R/domain_define.R index 44659341..71b135df 100644 --- a/R/domain_define.R +++ b/R/domain_define.R @@ -6,7 +6,6 @@ #' @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){ @@ -15,6 +14,7 @@ domain_define <- function(vegmap, country){ vegmap_union=vegmap %>% + st_as_sf() %>% filter(biome_18 %in% biomes ) %>% #filter to list above st_union() # union all polygons into one multipolygon, dissolving internal boundaries @@ -25,25 +25,22 @@ domain_define <- function(vegmap, country){ st_simplify(dTolerance=100) - +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_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")} + mutate(domain=1) |> + vect() - # 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) + # piggyback::pb_upload(file = "data/domain.gpkg", + # repo = "AdamWilsonLab/emma_envdata", + # tag = "raw_static", + # overwrite = TRUE)# return(domain) diff --git a/R/national_boundary.R b/R/national_boundary.R index fd86f380..78ec332d 100644 --- a/R/national_boundary.R +++ b/R/national_boundary.R @@ -2,9 +2,9 @@ #' @author Adam M. Wilson #' @description Download national boundary file from the UN -#' @source https://data.humdata.org/dataset/south-africa-admin-level-1-boundaries +#' @source https://data.humdata.org/dataset/cod-ab-zaf -national_boundary <- function(file="data/south_africa.gpkg"){ +national_boundary <- function(){ #Adjust timeout to allow for slow internet if(getOption('timeout') < 1000){ @@ -12,15 +12,15 @@ national_boundary <- function(file="data/south_africa.gpkg"){ } - 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" + url="https://data.humdata.org/dataset/061d4492-56e8-458c-a3fb-e7950991adf0/resource/69c947ad-dc17-416c-bafa-b66fb523c322/download/zaf_admin_boundaries.gdb.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) + country=vect(file.path(tmpdir1,"zaf_admin_boundaries.gdb"),"zaf_admin0")|> + st_union() |> + vect() return(country) } diff --git a/_targets.R b/_targets.R index 5c6139ae..d6d17509 100644 --- a/_targets.R +++ b/_targets.R @@ -50,7 +50,7 @@ list( ), - tar_target( + tar_terra_vect( country, national_boundary() ) @@ -61,7 +61,7 @@ list( get_vegmap(vegmap_shp) ), - tar_target( + tar_terra_vect( domain, domain_define(vegmap = vegmap, country) ) diff --git a/_targets/meta/meta b/_targets/meta/meta index a0df8508..cc09df45 100644 --- a/_targets/meta/meta +++ b/_targets/meta/meta @@ -2,13 +2,15 @@ name|type|data|command|depend|seed|path|time|size|bytes|format|repository|iterat correct_ndvi_dates_release_proj_and_extent|stem|49be87cd8aaf3e80|1d0f5f39ef47d1b6|edb3a13ae4cb1ccc|-1844360325||t20458.6135571947s|s63b|63|rds|local|vector|||17.619|| remove_ee_backup|stem||befe0ca90eb2c488|2c530c1562a7fbd1|-773029837||t20458.6135575072s||0|rds|local|vector|||0.003||could not find function 'clean_up' vegmap_shp|stem|495c02a4c1083ae3|64fa0ae6793b59bf|2c530c1562a7fbd1|-979952299|data/manual_download/VEGMAP2018_AEA_16082019Final/NVM2018_AEA_V22_7_16082019_final.shp|t20445.6913461798s|s493121012b|493121012|file|local|vector|||0.026|| +vegmap|stem|0c98d327f6beefbe|f82077cc150b71ed|774ecf7dbe3e5980|986433229||t20458.6208086331s|s141541376b|141541376|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||18.36|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)| +country|stem|598a2c51f10208d0|53feefadcddcbd52|7a9b46642a0f23a6|-430139696||t20458.6382681568s|s98304b|98304|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||22.279|PROJ: proj_identify: Cannot find proj.db (GDAL error 1). Error occurred in /Volumes/Builds/recipes/build/src/gdal-3.8.5/ogr/ogrsf_frmts/openfilegdb/filegdbtable.cpp at line 900 (GDAL error 1)| domain_map|function|9b57e91e94d73101 rstoken|object|6dc8d7df7129e26b robust_pb_download_solo|function|d148e32c5f7beb8f fit_model|function|8f8e281853bbef05 process_dynamic_data_to_parquet|function|49f8abfce5758803 clean_data|function|860451632161bcc2 -national_boundary|function|865305b12ad0bf45 +national_boundary|function|3c354daa2fdf282b domain_rasterize|function|29d78831857df164 robust_download_file|function|2ea70b1df9a469fc verbose|object|988c41ba10911dc8 @@ -17,7 +19,7 @@ get_release_precipitation_chelsa|function|e5a54d4f8a475a6c summarize_posteriors|function|848f748de452ef0d robust_pb_upload|function|bf296132f5183235 get_domain|function|73c97bc96bfedda4 -.Random.seed|object|08752509bdabcc8a +.Random.seed|object|befb0e4a3b4f41b9 tag|object|64ff18d09ad298f3 earthdata_user|object|a72c4475a256a3c1 max_layers|object|08d5f59e833de599 @@ -36,7 +38,7 @@ robust_max|function|6d27abe569a34028 get_release_landcover_za|function|9ece1e5f946d7a70 get_vegmap|function|8590caba91b9be39 get_release_fire_modis_appeears|function|9992a7da9cc6cf78 -domain_define|function|a01b7cc8a65adde0 +domain_define|function|a47d5ecfec78a568 kr_name|object|643fa3c4a8310651 temp_directory|object|40d122f36d50a344 domain_remnants|function|4c6497b244bdbc02 @@ -72,4 +74,4 @@ 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|stem|0c98d327f6beefbe|f82077cc150b71ed|774ecf7dbe3e5980|986433229||t20458.6208086331s|s141541376b|141541376|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||18.36|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)| +domain|stem||3b892a93e2976da1|5996787d2119be31|-103757746||t20458.6377718343s||0|rds|local|vector|||0.003||no applicable method for 'filter' applied to an object of class 'SpatVector' From edcd1f0b617c3aaf7e429a7ac95a2db684a9255e Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Thu, 8 Jan 2026 11:21:53 -0500 Subject: [PATCH 14/58] Add functions to download and process NDVI and NDWI layers from MODIS and VIIRS - Implemented `get_release_ndvi_dates_modis` to download MODIS NDVI dates, including functions for date conversion and error handling. - Created `get_release_ndvi_dates_viirs` for downloading VIIRS NDVI dates with appropriate quality checks. - Developed `get_release_ndwi_modis` to fetch the most recent MODIS NDWI layer, including domain formatting and raster processing. - Added error handling and release management for GitHub uploads across all functions. - Ensured compatibility with existing data structures and improved documentation for clarity. --- R/ccr_startup.sh | 29 +++++++++++++++++++ emma_envdata.code-workspace | 8 +++++ {img/old => old}/clean_up.R | 0 .../get_release_elevation_nasadem.R | 0 {img/old => old}/get_release_fire_modis.R | 0 {img/old => old}/get_release_kndvi_modis.R | 0 .../old => old}/get_release_mean_ndvi_modis.R | 0 .../get_release_ndvi_dates_modis.R | 0 .../get_release_ndvi_dates_viirs.R | 0 {img/old => old}/get_release_ndvi_modis.R | 0 {img/old => old}/get_release_ndvi_viirs.R | 0 {img/old => old}/get_release_ndwi_modis.R | 0 12 files changed, 37 insertions(+) create mode 100644 R/ccr_startup.sh create mode 100644 emma_envdata.code-workspace rename {img/old => old}/clean_up.R (100%) rename {img/old => old}/get_release_elevation_nasadem.R (100%) rename {img/old => old}/get_release_fire_modis.R (100%) rename {img/old => old}/get_release_kndvi_modis.R (100%) rename {img/old => old}/get_release_mean_ndvi_modis.R (100%) rename {img/old => old}/get_release_ndvi_dates_modis.R (100%) rename {img/old => old}/get_release_ndvi_dates_viirs.R (100%) rename {img/old => old}/get_release_ndvi_modis.R (100%) rename {img/old => old}/get_release_ndvi_viirs.R (100%) rename {img/old => old}/get_release_ndwi_modis.R (100%) 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/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/old/clean_up.R b/old/clean_up.R similarity index 100% rename from img/old/clean_up.R rename to old/clean_up.R diff --git a/img/old/get_release_elevation_nasadem.R b/old/get_release_elevation_nasadem.R similarity index 100% rename from img/old/get_release_elevation_nasadem.R rename to old/get_release_elevation_nasadem.R diff --git a/img/old/get_release_fire_modis.R b/old/get_release_fire_modis.R similarity index 100% rename from img/old/get_release_fire_modis.R rename to old/get_release_fire_modis.R diff --git a/img/old/get_release_kndvi_modis.R b/old/get_release_kndvi_modis.R similarity index 100% rename from img/old/get_release_kndvi_modis.R rename to old/get_release_kndvi_modis.R diff --git a/img/old/get_release_mean_ndvi_modis.R b/old/get_release_mean_ndvi_modis.R similarity index 100% rename from img/old/get_release_mean_ndvi_modis.R rename to old/get_release_mean_ndvi_modis.R diff --git a/img/old/get_release_ndvi_dates_modis.R b/old/get_release_ndvi_dates_modis.R similarity index 100% rename from img/old/get_release_ndvi_dates_modis.R rename to old/get_release_ndvi_dates_modis.R diff --git a/img/old/get_release_ndvi_dates_viirs.R b/old/get_release_ndvi_dates_viirs.R similarity index 100% rename from img/old/get_release_ndvi_dates_viirs.R rename to old/get_release_ndvi_dates_viirs.R diff --git a/img/old/get_release_ndvi_modis.R b/old/get_release_ndvi_modis.R similarity index 100% rename from img/old/get_release_ndvi_modis.R rename to old/get_release_ndvi_modis.R diff --git a/img/old/get_release_ndvi_viirs.R b/old/get_release_ndvi_viirs.R similarity index 100% rename from img/old/get_release_ndvi_viirs.R rename to old/get_release_ndvi_viirs.R diff --git a/img/old/get_release_ndwi_modis.R b/old/get_release_ndwi_modis.R similarity index 100% rename from img/old/get_release_ndwi_modis.R rename to old/get_release_ndwi_modis.R From 08ba1d6f523c93a1c5119ec19988d27243d6281e Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Thu, 8 Jan 2026 15:10:18 -0500 Subject: [PATCH 15/58] Add README and ccr_startup script for CCR job setup --- _targets.R | 25 +++++++++++++++++++++---- ccr_startup.sh | 21 +++++++++++++++++++++ data/manual_download/README.md | 3 +++ emma_envdata.code-workspace | 8 ++++++++ 4 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 ccr_startup.sh create mode 100644 data/manual_download/README.md create mode 100644 emma_envdata.code-workspace diff --git a/_targets.R b/_targets.R index d6d17509..4b06a9d0 100644 --- a/_targets.R +++ b/_targets.R @@ -5,10 +5,26 @@ library(targets) library(tarchetypes) library(geotargets) library(visNetwork) -library(appeears) 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")) + +#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())) + } + #If running this locally, make sure to set up github credentials using gitcreds::gitcreds_set() # Ensure things are clean @@ -24,7 +40,8 @@ library(rdryad) options(tidyverse.quiet = TRUE) tar_option_set(packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", - "appeears", "terra")) #"cubelyr", + "appeears", "terra"),library=c("/usr/local/lib/R/site-library", + "/usr/local/lib/R/library", "/user/adamw/R/x86_64-pc-linux-gnu-library/4.5")) #"cubelyr", ## Authenticate with AppEEARS source("R/appeears_auth.R") @@ -44,9 +61,9 @@ list( format = "file" ), - tar_target( + tar_terra_vect( sanbi_fires_shp, - st_read("data/manual_download/All_Fires/All_Fires_20_21_gw.shp") + st_read("data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp") |> vect() ), diff --git a/ccr_startup.sh b/ccr_startup.sh new file mode 100644 index 00000000..ec758326 --- /dev/null +++ b/ccr_startup.sh @@ -0,0 +1,21 @@ +#! /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 \ No newline at end of file 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/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 From 913a557a66698311ae51400be736791556bac457 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Thu, 8 Jan 2026 16:47:18 -0500 Subject: [PATCH 16/58] Update DESCRIPTION and R scripts to include ncdf4 package and improve national boundary function --- DESCRIPTION | 3 +- R/get_release_climate_chelsa.R | 106 ++++++++++++++++++++++++++------- R/national_boundary.R | 24 +++++--- _targets.R | 2 +- 4 files changed, 101 insertions(+), 34 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index b12e75eb..9503053d 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,8 @@ Imports: arrow, targets, geotargets, - janitor + janitor, + ncdf4 Suggests: rgee, reticulate, diff --git a/R/get_release_climate_chelsa.R b/R/get_release_climate_chelsa.R index 23c8d1eb..59853366 100644 --- a/R/get_release_climate_chelsa.R +++ b/R/get_release_climate_chelsa.R @@ -1,8 +1,9 @@ #R script to download climate data (CHELSA) library(terra) +library(ncdf4) -#' @author Brian Maitner +#' @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 @@ -47,17 +48,42 @@ get_release_climate_chelsa <- function(temp_directory = "data/temp/raw_data/clim 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) - 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){ + # 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 files # download.file(url = paste("https://os.zhdk.cloud.switch.ch/envicloud/chelsa/chelsa_V1/climatologies/bio/CHELSA_bio10_",i,".tif",sep = ""), @@ -65,14 +91,14 @@ get_release_climate_chelsa <- function(temp_directory = "data/temp/raw_data/clim # ) # 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 = "")), + robust_download_file(url = paste("https://os.zhdk.cloud.switch.ch/chelsav2/GLOBAL/climatologies/1981-2010/bio/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",i,"_1981-2010_V.2.1.tif",sep = ""))) + rast_i <- terra::rast(file.path(temp_directory,paste("CHELSA_bio",sprintf("%02d", idx),"_1981-2010_V.2.1.tif",sep = ""))) # crop @@ -84,21 +110,52 @@ get_release_climate_chelsa <- function(temp_directory = "data/temp/raw_data/clim 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) + # 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")) + + # 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,bio_vec) - + rm(i) # release to_release <- @@ -111,13 +168,16 @@ get_release_climate_chelsa <- function(temp_directory = "data/temp/raw_data/clim 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) + # 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) + # unlink(x = file.path(temp_directory), recursive = TRUE, force = TRUE) diff --git a/R/national_boundary.R b/R/national_boundary.R index 78ec332d..923e67e2 100644 --- a/R/national_boundary.R +++ b/R/national_boundary.R @@ -11,18 +11,24 @@ national_boundary <- function(){ options(timeout = 1000) } - - url="https://data.humdata.org/dataset/061d4492-56e8-458c-a3fb-e7950991adf0/resource/69c947ad-dc17-416c-bafa-b66fb523c322/download/zaf_admin_boundaries.gdb.zip" - tmpfile1=tempfile() - tmpdir1=tempdir() - download.file(url,destfile = tmpfile1) - unzip(tmpfile1,exdir=tmpdir1) - - country=vect(file.path(tmpdir1,"zaf_admin_boundaries.gdb"),"zaf_admin0")|> + url="https://data.humdata.org/dataset/061d4492-56e8-458c-a3fb-e7950991adf0/resource/69c947ad-dc17-416c-bafa-b66fb523c322/download/zaf_admin_boundaries.gdb.zip" + tmpfile1=tempfile() + tmpdir1=tempdir() + download.file(url,destfile = tmpfile1) + unzip(tmpfile1,exdir=tmpdir1) + + # Use ogr2ogr to convert GDB to GeoJSON to avoid GDAL GDB driver issues + gdb_path <- file.path(tmpdir1, "zaf_admin_boundaries.gdb") + geojson_path <- file.path(tmpdir1, "zaf_admin0.geojson") + system(paste0("ogr2ogr -f GeoJSON ", geojson_path, " ", gdb_path, " zaf_admin0")) + + # Read the converted GeoJSON, union, and convert to SpatVector + country <- st_read(geojson_path, quiet = TRUE) |> st_union() |> + st_as_sf() |> vect() - return(country) + return(country) } # end function diff --git a/_targets.R b/_targets.R index 4b06a9d0..f75b36c4 100644 --- a/_targets.R +++ b/_targets.R @@ -40,7 +40,7 @@ library(filelock,lib.loc=Sys.getenv("R_LIBS_USER")) options(tidyverse.quiet = TRUE) tar_option_set(packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", - "appeears", "terra"),library=c("/usr/local/lib/R/site-library", + "appeears", "terra"),library=c(Sys.getenv("R_LIBS_USER"),"/usr/local/lib/R/site-library", "/usr/local/lib/R/library", "/user/adamw/R/x86_64-pc-linux-gnu-library/4.5")) #"cubelyr", ## Authenticate with AppEEARS From 2a488a35869a8a83242ad4213e089fd92ee8f851 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 08:31:48 -0500 Subject: [PATCH 17/58] Enhance domain definition by adding "Succulent Karoo" biome and updating climate data download URLs for improved accuracy and reliability. --- R/domain_define.R | 15 ++++++++++++++- R/get_release_climate_chelsa.R | 11 +++-------- R/get_release_clouds_wilson.R | 12 ++++++------ 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/R/domain_define.R b/R/domain_define.R index 71b135df..ed8d51b6 100644 --- a/R/domain_define.R +++ b/R/domain_define.R @@ -10,7 +10,7 @@ domain_define <- function(vegmap, country){ - biomes = c("Fynbos")#,"Succulent Karoo")#,"Albany Thicket") + biomes = c("Fynbos","Succulent Karoo")#,"Albany Thicket") vegmap_union=vegmap %>% @@ -24,6 +24,19 @@ domain_define <- function(vegmap, country){ st_buffer(50000) %>% st_simplify(dTolerance=100) +# Further clean up the buffered domain +# library(smoothr) +# vegmap_buffer <- vegmap_union %>% +# fill_holes(set_units(100, km^2))|> +# # st_simplify(dTolerance=500) %>% +# drop_crumbs(set_units(100, km^2)) |> +# smooth(method = "chaikin", refinements = 5) # or method = "ksmooth" +# st_buffer(1000000)|> +# # st_buffer(-1000000) |> +# st_simplify(dTolerance=100)|> +# st_make_valid() + + country= st_as_sf(country) %>% st_transform(crs=st_crs(vegmap_buffer)) diff --git a/R/get_release_climate_chelsa.R b/R/get_release_climate_chelsa.R index 59853366..55c593c3 100644 --- a/R/get_release_climate_chelsa.R +++ b/R/get_release_climate_chelsa.R @@ -85,13 +85,8 @@ get_release_climate_chelsa <- function(temp_directory = "data/temp/raw_data/clim for(idx in 1:nrow(bio_metadata)){ i <- bio_metadata$bio_name[idx] - # 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",sprintf("%02d", idx),"_1981-2010_V.2.1.tif",sep = ""), +# 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 @@ -142,7 +137,7 @@ get_release_climate_chelsa <- function(temp_directory = "data/temp/raw_data/clim 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")) + "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) 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) From cbaba880a751bc52e00cd809020e18dcc6bda9e5 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 08:33:35 -0500 Subject: [PATCH 18/58] Update GitHub Actions workflow to include 'dev-adam-appeears' branch and clean up unused steps in targets pipeline --- .github/workflows/targets.yaml | 274 +++----------- _targets.R | 636 ++++++++++++++++----------------- 2 files changed, 366 insertions(+), 544 deletions(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index d108700a..9c5bc7b5 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -30,7 +30,7 @@ on: branches: - main - master - - dev-adam + - dev-adam-appeears - dev-jiyeon # Allows you to run this workflow manually from the Actions tab @@ -50,10 +50,6 @@ jobs: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} 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: @@ -64,76 +60,9 @@ jobs: - 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 - 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 - - 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')" @@ -145,174 +74,67 @@ 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' - 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) - } - 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() -# 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 }} + path: _targets/ + key: targets-${{ hashFiles('_targets.R', 'R/**') }} + restore-keys: targets- - name: Run targets pt 2 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' - run: | - rm -r .git - mv .targets-runs/.git . - rm -r .targets-runs - - - name: update md + + - name: Update README run: | webshot::install_phantomjs() knitr::knit("README.Rmd") shell: Rscript {0} - - name: Upload latest run + + - name: Export final data products to releases + if: github.ref == 'refs/heads/main' 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. + # 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} + continue-on-error: true + + - 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: Prepare failure artifact if: failure() - run: rm -rf .git .github .targets-files .targets-runs + run: rm -rf .git .github + - 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: . diff --git a/_targets.R b/_targets.R index f75b36c4..e8458a6d 100644 --- a/_targets.R +++ b/_targets.R @@ -104,13 +104,13 @@ list( ) , - 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_terra_rast( + # clouds_wilson_release, + # get_release_clouds_wilson(temp_directory = "data/temp/raw_data/clouds_wilson/", + # tag = "raw_static", + # domain, + # sleep_time = 180) + # ), # tar_target( # elevation_nasadem_release, @@ -149,317 +149,317 @@ list( # # # # # # Frequent updates via releases - 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") - ), - - tar_age( - ndvi_modis_release, - get_release_ndvi_modis_appeears(temp_directory = "data/temp/raw_data/ndvi_modis/", - tag = "raw_ndvi_modis_nc", - domain = domain, - sleep_time = 5, - verbose = TRUE), - age = as.difftime(7, units = "days") - ), - - 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( - 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) - ) +# 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") +# ), + +# tar_age( +# ndvi_modis_release, +# get_release_ndvi_modis_appeears(temp_directory = "data/temp/raw_data/ndvi_modis/", +# tag = "raw_ndvi_modis_nc", +# domain = domain, +# sleep_time = 5, +# verbose = TRUE), +# age = as.difftime(7, units = "days") +# ), + +# 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( +# 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) +# ) ) From 2c1409434854c7b63da1724c0df5a906f9da2fbb Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 09:02:01 -0500 Subject: [PATCH 19/58] Remove deprecated secret decryption scripts and comment out unused steps in the GitHub Actions workflow --- .github/decrypt_secret.sh | 53 ---------------------------------- .github/decrypt_secret_gd.sh | 19 ------------ .github/workflows/targets.yaml | 8 ++--- 3 files changed, 4 insertions(+), 76 deletions(-) delete mode 100755 .github/decrypt_secret.sh delete mode 100644 .github/decrypt_secret_gd.sh diff --git a/.github/decrypt_secret.sh b/.github/decrypt_secret.sh deleted file mode 100755 index 7dfef4ba..00000000 --- a/.github/decrypt_secret.sh +++ /dev/null @@ -1,53 +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/workflows/targets.yaml b/.github/workflows/targets.yaml index 9c5bc7b5..7ab58ad0 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -47,7 +47,7 @@ jobs: runs-on: ubuntu-latest container: adamwilsonlab/emma:latest env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + # GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} RENV_PATHS_ROOT: ~/.local/share/renv ACTIONS_RUNNER_DEBUG: true steps: @@ -57,9 +57,9 @@ jobs: 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: Checkout LFS objects + # run: git lfs checkout + # continue-on-error: true - 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 From daad59cd6592ee0c529674608efb71cc8fb7734c Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 09:14:44 -0500 Subject: [PATCH 20/58] Update GitHub Actions workflow to use 'dev-adam-appeears' branch and add local testing for actions --- .github/workflows/targets.yaml | 5 +---- ccr_startup.sh | 9 ++++++++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index 7ab58ad0..23d1ea5a 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -53,13 +53,10 @@ jobs: 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: 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 diff --git a/ccr_startup.sh b/ccr_startup.sh index ec758326..840233c0 100644 --- a/ccr_startup.sh +++ b/ccr_startup.sh @@ -18,4 +18,11 @@ apptainer run \ --bind $PROJECT_FOLDER:$PROJECT_FOLDER \ --bind $APPTAINER_CACHEDIR/tmp:/tmp \ --bind $APPTAINER_CACHEDIR/run:/run \ - $SIF_PATH/$SIF_FILE R \ No newline at end of file + $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 From cab8ff0bdda550ae598937185a1bf95b9819f15f Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 09:23:58 -0500 Subject: [PATCH 21/58] Refactor library loading in _targets.R to streamline package options and maintain consistency. --- _targets.R | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/_targets.R b/_targets.R index e8458a6d..503aad89 100644 --- a/_targets.R +++ b/_targets.R @@ -40,11 +40,10 @@ library(filelock,lib.loc=Sys.getenv("R_LIBS_USER")) options(tidyverse.quiet = TRUE) tar_option_set(packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", - "appeears", "terra"),library=c(Sys.getenv("R_LIBS_USER"),"/usr/local/lib/R/site-library", - "/usr/local/lib/R/library", "/user/adamw/R/x86_64-pc-linux-gnu-library/4.5")) #"cubelyr", + "appeears", "terra")) ## Authenticate with AppEEARS -source("R/appeears_auth.R") +source("R/appeears_auth.R") list( From af020fbd964131a5e664b87b4ef86bded604aaa8 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 09:32:59 -0500 Subject: [PATCH 22/58] Refactor library loading in _targets.R to remove unnecessary lib.loc parameters for clarity. --- _targets.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_targets.R b/_targets.R index 503aad89..44aa2eab 100644 --- a/_targets.R +++ b/_targets.R @@ -6,9 +6,9 @@ library(tarchetypes) library(geotargets) library(visNetwork) 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(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")) #if (!requireNamespace("remotes", quietly = TRUE)) install.packages("remotes") #remotes::install_deps(dependencies = TRUE) From e165243cb3571bb40fb0b94c9c6f348ad1674edd Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 09:46:04 -0500 Subject: [PATCH 23/58] Add environment variables for Earthdata credentials and R package source retention --- .github/workflows/targets.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index 23d1ea5a..0953ff17 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -47,7 +47,10 @@ jobs: runs-on: ubuntu-latest container: adamwilsonlab/emma:latest env: - # GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + 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 steps: From e2957b386a0a1a02f429b806777e1b8322c6213f Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 09:47:49 -0500 Subject: [PATCH 24/58] Add installation of system dependencies for keyring in GitHub Actions workflow --- .github/workflows/targets.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index 0953ff17..9f1d6b61 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -60,6 +60,10 @@ jobs: lfs: true - name: Whitelist directory run: git config --global --add safe.directory /__w/emma_envdata/emma_envdata + - name: Install system deps for keyring + run: | + apt-get update + 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 From 01772e85e3988eba87e197d745fd0a06c1a10167 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 09:58:59 -0500 Subject: [PATCH 25/58] Comment out the closing parenthesis for the precipitation_chelsa target in _targets.R for clarity. --- _targets.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_targets.R b/_targets.R index 44aa2eab..be62c70c 100644 --- a/_targets.R +++ b/_targets.R @@ -132,7 +132,7 @@ list( 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 From 90534259c8659ce5018bf65c15848899eb6ab6f8 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 10:13:01 -0500 Subject: [PATCH 26/58] Update national_boundary function to download GeoJSON directly and remove GDB conversion step --- R/national_boundary.R | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/R/national_boundary.R b/R/national_boundary.R index 923e67e2..f0e4c87c 100644 --- a/R/national_boundary.R +++ b/R/national_boundary.R @@ -11,19 +11,14 @@ national_boundary <- function(){ options(timeout = 1000) } - url="https://data.humdata.org/dataset/061d4492-56e8-458c-a3fb-e7950991adf0/resource/69c947ad-dc17-416c-bafa-b66fb523c322/download/zaf_admin_boundaries.gdb.zip" + 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) - # Use ogr2ogr to convert GDB to GeoJSON to avoid GDAL GDB driver issues - gdb_path <- file.path(tmpdir1, "zaf_admin_boundaries.gdb") - geojson_path <- file.path(tmpdir1, "zaf_admin0.geojson") - system(paste0("ogr2ogr -f GeoJSON ", geojson_path, " ", gdb_path, " zaf_admin0")) - # Read the converted GeoJSON, union, and convert to SpatVector - country <- st_read(geojson_path, quiet = TRUE) |> + country <- st_read(file.path(tmpdir1, "zaf_admin0.geojson"), quiet = TRUE) |> st_union() |> st_as_sf() |> vect() From 8f3b145a88fd0d151d6ee6537f32e5ebba5e4e16 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 10:31:06 -0500 Subject: [PATCH 27/58] Add shapefile and associated metadata for All_fires_23_24_gw dataset - Created new shapefile (All_fires_23_24_gw.shp) with size 15,173,392 bytes. - Added accompanying XML metadata file (All_fires_23_24_gw.shp.xml) detailing data lineage and properties. - Included additional files: All_fires_23_24_gw.shx and All_fires_23_24_gw.sbn, .sbx for complete shapefile structure. --- _targets.R | 4 +- .../All_Fires/All_Fires_20_21_gw.dbf | 3 - .../All_Fires/All_Fires_20_21_gw.lyr | Bin 10752 -> 0 bytes .../All_Fires/All_Fires_20_21_gw.pdf | Bin 45587 -> 0 bytes .../All_Fires/All_Fires_20_21_gw.prj | 1 - .../All_Fires/All_Fires_20_21_gw.qml | 577 ----------- .../All_Fires/All_Fires_20_21_gw.qpj | 1 - .../All_Fires/All_Fires_20_21_gw.sbn | Bin 44260 -> 0 bytes .../All_Fires/All_Fires_20_21_gw.sbx | Bin 2236 -> 0 bytes .../All_Fires/All_Fires_20_21_gw.shp | 3 - .../All_Fires/All_Fires_20_21_gw.shx | Bin 34044 -> 0 bytes .../All_fires_23_24_gw/All_fires_23_24_gw.cpg | 1 + .../All_fires_23_24_gw/All_fires_23_24_gw.dbf | 3 + .../All_fires_23_24_gw/All_fires_23_24_gw.lyr | Bin 0 -> 11264 bytes .../All_fires_23_24_gw/All_fires_23_24_gw.pdf | Bin 0 -> 51403 bytes .../All_fires_23_24_gw/All_fires_23_24_gw.prj | 1 + .../All_fires_23_24_gw/All_fires_23_24_gw.qml | 972 ++++++++++++++++++ .../All_fires_23_24_gw/All_fires_23_24_gw.sbn | Bin 0 -> 46452 bytes .../All_fires_23_24_gw/All_fires_23_24_gw.sbx | Bin 0 -> 2292 bytes .../All_fires_23_24_gw/All_fires_23_24_gw.shp | 3 + .../All_fires_23_24_gw.shp.xml | 2 + .../All_fires_23_24_gw/All_fires_23_24_gw.shx | Bin 0 -> 36180 bytes 22 files changed, 984 insertions(+), 587 deletions(-) delete mode 100644 data/manual_download/All_Fires/All_Fires_20_21_gw.dbf delete mode 100644 data/manual_download/All_Fires/All_Fires_20_21_gw.lyr delete mode 100644 data/manual_download/All_Fires/All_Fires_20_21_gw.pdf delete mode 100644 data/manual_download/All_Fires/All_Fires_20_21_gw.prj delete mode 100644 data/manual_download/All_Fires/All_Fires_20_21_gw.qml delete mode 100644 data/manual_download/All_Fires/All_Fires_20_21_gw.qpj delete mode 100644 data/manual_download/All_Fires/All_Fires_20_21_gw.sbn delete mode 100644 data/manual_download/All_Fires/All_Fires_20_21_gw.sbx delete mode 100644 data/manual_download/All_Fires/All_Fires_20_21_gw.shp delete mode 100644 data/manual_download/All_Fires/All_Fires_20_21_gw.shx create mode 100644 data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.cpg create mode 100644 data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.dbf create mode 100644 data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.lyr create mode 100644 data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.pdf create mode 100644 data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.prj create mode 100644 data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.qml create mode 100644 data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbn create mode 100644 data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.sbx create mode 100644 data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp create mode 100644 data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp.xml create mode 100644 data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shx diff --git a/_targets.R b/_targets.R index be62c70c..2ea53b45 100644 --- a/_targets.R +++ b/_targets.R @@ -61,8 +61,8 @@ list( ), tar_terra_vect( - sanbi_fires_shp, - st_read("data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp") |> vect() + capenature_fires, + st_read("data/manual_download/All_Fires_23_24_gw/All_fires_23_24_gw.shp") |> vect() ), 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 91c7cbade03a42733bddcf9287a6271535189709..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10752 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 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 ecda38f41b41e64114f771fbe796c9b9b8038d71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45587 zcma%iV{m4{wst0*SQBSr+n(6AZQHhOTW@UJwr$(a&AI3P`~G}YyK3!T-Mv(`Yd=p{ zFJf6iVQP9BCMe?JiUW;{AP8+~&qE-qS0BWn{!Q#_U*jXbTenWdwVJsz#FrJkda zppk)%p%FJXl!K$ak)9QlYv!bvMgsA$o%RdCxHhNfC&)cp!49_aa#6cDqBkC-e7+z* z!f&xWI&2sq50F+?eYC=!o9Y`{XC>pD3EKCAv~0%q*v9uc_L8yvA4a>|)2%b0s*vF7=@t{`R+{(Sj0- zdztUO*=w9d0nG0cc-POx@p4?BrFI*YPraN+jkix~nTK^p=0^JyFX>0wbH~Tkagp!y zH=WHufhviy$2XmA$q-EO%z0O4jtM@5@Om?m)Nj(>EDw>+!trt-HtW_SUEn z1oO~k9}XG~>Uq!4Ya8p5ek6_2tr;|~U7pQ>eocPsm4|y9YwLME$Rh3U-Va~nH1(B0iCyDXRADgOGxi!X+4sgmv08|Y6Vfc&hNEvWsCA7oK(gMX`45j{TL^5 zYVB{A6(bw>b7z(Ij+&FT@-4W}{`m_gpK!{tb`)g^nIm+Fj_}rzSxlMrQ*9mTw zcHG0G-C_BB1br7a@>33S-1wT_R5F!dG9mjg-w|Oe0!EDCalhNtrDzk~h}sB!wWp@Y-9Dg;KfAtrqIodu?r&?|FHRq=kQIL34Eet41_451|d(@>F^ibRes zV9wPnATitGx@^Qeg~L1RaErw|sga`6Mk?-f8Xu0~_bTbiG5)~`1FCsb*UC;&S$(ch7Ig^JuJvN2rB z`!5w{M$NPC4p{~N#a|<|(ANUV96>@F0%*oK;fj1q3`niSMuIp+jOhg80JF>?4ht24 zv8Sv$6kLG~5FA4iSjmhMurys%(fnx%)9zm3FTyrQvzsIuODJd>52#KB_a>*PNz!Ej{o{F-8M+~#|`s&V!q7u7y$XIPh1ZZjS20h zcp#z5pQF#VV2v<1N2{;%z#Wq}0)4ryxb!s+6qm0atIEe#5cw6cx1-z30J$^ND_q8~ zzmtLIZf%-~R9J52h;p!Hc4L9u^Y=X^1ID02QJEMqv=v1F?ckA1xfKKuD}Y5k*8=CK zm{?J8tmdsXR9)BMW@$p>-yOiG1bolnP6G_MUx^@io+@NOX*aVltPde7wLDG})GC%8 zqN{_clU2FPji<(t+SintZcRNtnpO3sHR<~^%NnRWmKzocq=pSltA(xK#Ew-rRcx1Z zT0$R`EID1b`LKc1a2$Li7@*iSmMmoEPka_RLKHtljOS`4rvFu_73ZWRIc>%=Efs;G zRAxK@*abx)HnWSx&W|(d0?CeLV$mVVfFB8k7Y}%KQUnlZ@|Q975*?rmBL#{7rnC^+ zQTjs+;gLe7$`S)1We!Tz3+pfB4=f}G0tS$5$uldBtq=yf4OWLKToI%!WMgxV%Z9ua z)P-EFCrf2YmR4g53Wv$$=X;gH&;J-wmh)~O4!y&I6c&uuXO>5`XgUbo!%kU^7k(0h zCNKkKnOaCnCs~Xv`@?voZ<2@=?l3_#HOGkGUlE=eE4%m+2#p0vX547-Tj;QLlnp+P z#j#dcCW{IX#Rv=*SH`@;1UVV23xJsgaxkwk&9sdjn~o!9+5uI1GKeOdYG4y;j`Rgy za@&A@+C#6$!@rbMi?mZi-Q1=(X2um8TR6eTuryzYhbpMO&;u3xIhGh%V#FD0C ztwURk#|M#{%=V{LTR~ECu;5b3l8=@xRp4loFGvAs|J!hxTrAaK z)J=fJq1qJo3L_tD(3u&})GW9HIl6T{j9=RH*w#_tz=b4=@LaMy&sYXc3)vqZY~f)` zS5klOqBoFVF(jE~cMe7V!Q5k6pX#0iquonQR*li7G>(ULA9w--Za|zKRQ)ayFNvDfWRDW*3GQ<7&xSt-z=CPm!4}h9?tAWES04$$>P1SO+ zo6VV|43^;`Bb~o6@eiC>H*up5ICSZx&`~71Y1l%=Z_wVnvS&pk%$+bvkD&fJSs`TA zBQc;x^X9@3RN4hrLJ zWrbbpxm5(xvin*Mj-v7^XD5~;=9mr@lB4=Ki5VCuLZ(g=gVMGwgzTljC5`dqv4x;c z8zH8ln}Tm#(AdUxhop;71(fs!_KbA#>ycPveo#`p2sXZVtT^C<5=?C~f9d}?Lorx* zR@dBHNrEJO@>_R~aH~O4yc1)^l*Ojx(mVU(#r4WZ2BNB~;+X{c^Z!D^yX<5pC`&ZQ z9iYpP`!)p^Yspi{MW4=BPchV~gdu#dFkVE(Bj!5qgsx(wwDt3MV~|r`dK#qgnVgaw zO4#QTjSiOVWs0sRE;w~7OP(-R%uAyW(Kr4RIh&VHU++k&Szf3i%!`k%0nS4@sT3t8 z=AUn9L{yu;{1IXO%nPoT$xsM$N83LqWBxjo7>!6$_`73FE>E|s?!<78KA5-8b4 zB8%XVU#IBOhhz^?5C9qp$LcVg!PQbyJb|Gh3u6%!uioRTw7+r>iK}Xn=f%j9t-B8j za4fUPQu!vXv29ak=sRLbDy1z(KWho;33nL)%Mug0y(nWBqWgMJM3W-2#t?m^h-!|L z7bBe@kO{%`Wc7rcBWZt~Cc`ELL+mFA$;8^$Ni_3~RU?&pp6r$D2uA4G*L6$`xGh30 zCZU)m&gft~Z%dgX<07;A6=sSgSj>|m)g)#UGo_e_1zrMkWl%%-rP_=P@kyhKV=t}b zMPvUEJ{HPh%gdx^=Cid0dy4)GgGNa4ZOc#o-zVl6GZ-0;0;8o1HyS~434dji-AIGeT^bm_ z#vTuWCHjz#M*rp~srkc!L5E=(szz{$Z&vy$3LfQQT-`j3Km zR5qTkj+KN_+)!!MlYAh?a9~icStgl=I#nS0f^dq#m?6PPK~&`=nOHn{k^zRH)~Fr% zc<6yISZO7W`YtyOcz!mXK_@}W&(v9l~t{5mIi>fno7=_({t^Skc*jvqO=-vrvh$bkih=Cj(Ag6xa#GjAWo=Czybn1zPX7|Ub0_;QZ1OEHf_p*L2dD%nQa%K zZDw*kQ!N33SMpwc>3nH^cNzM1f((>N)uEkE&x|(B=GFe|QlnReJ*_Jkh#993VUSLz zp$1N9p`A)72=~w|vE-SG<*^2|E3u>c$d)@~ym4}Ize>&`is8qiEcpuFX=;_;S@ z#TvD z1dQNxd+gvPBhmuE2_2pD#5_b&#*9oTc71Tr;EgG1RMG&xC9@0zxHh5Def?RY|7pCa zw84@SNs(IA-gw(Z;d%yF$_4NySRHwKqewahA_a#0QOQO)0}rwO0pA}ja|UCmbx1LB zK?d45{!CHh`P2%2;?aD|rH@3tn#wgrT3ujM=J1Th>I{94p+P-H+?q`)D!xt{4;pl_ z7){wi@jwc=Ti$DOlw$U)t=93!%N}r%LxaE7rfIX;t)Fa=nsl ztdPqEAD0ZB!Cd8!Nlb9&0CEN<3O&tmAW8yKi-jU4UbfA?dNze&pSrKGknNs+bDRpr zo^P|Bg6TiQ0s^+%B`hV=2-~G;yK1k?=-ad78HF8`szA1IU&E3m} zI5{^l;6@%xfjTB$u{-ylf>;T6ia5SuY*Mmxu`GZ>oJ19%El{ijxDq?Vx6q_Z&@||i zpW~qL3I|o8L=z*%mx@z_MH$bfpw0rtrdX5|3)C|sA@7_K7l+Zy6D$t|OEwNaLmP{d zAac%gO4i+%M^xc3yX%A&LMLi#v31q-DdI~1GKX?cqiV9N)iQd|#h##(rw>THftKRi zpJVEUDc1{sHM6U$5@t;Mqpm6!*>QoHQiUC=Z9C4?tw1UcJ{l}fAjV&vMD<*jiOkpR z5>K^S5U9*BOr*vuSxSGIJ`;0_ozcT$@`TEnlE&j_n!C6SM(W=6t5y>WMJg1s4#@*MAp?#bL~kQX7x%Fi>?J%H%h@FzRn1WLiuqrdo2ou~LX6NboKp z4;i&zG#N{rKGavckp!khPq(Z`20V}Fz@Q-8QoLfn^eSBA@V=KzzcmWOa@ST9j@591 z)O;W%*0x!XFTofUrqn=LXP9uO)WfIDz*En!Gx&;xWRB222ZxFh_4~;wr2ymNTpEcm z?1Gi4loKOPN%Sd+^*8H)e>Upfi_tThJ%Ukt%AlbQn*A?gt}fYBVc;+5G;}`qVzR2f z->Z>GC0Zk{a-Jmf!nfgbDPryUZ{e1rU_+Kr6sejd^RBg8iEuPpEzlZUBRwMpEC_1o}x@qo`}7LBXd08-4C?{ zkYz9;tPndCRW@B%E*$KskUOFZx@;=UK*6&3r|X0%K+;v}jgV%Q|Z4T=*n zy#BF5YMw4Rdwuf}cj#-}KzcPgnI>?d*mj^Qwc11g8!}OUXadH8VZ69rA5y%uF{4)% zbAq01Z7@w1Io&A{PT46@w%7@gQvN8%JtEj8ROOd6xNa~Y?y-_Zkr7hEohKl}$6 zs@PIsvNXt{U%9T~IPh9)2RWug3H5xBK3;_V>?S-odWorS0t3RBv0*u|juOZS;^c?4 zFvt-L2qM7}1KoW1d*gBtK_M!mo-0B`>j&bf+xP1~p`gF?pdl!31DpxIgiu=Lx*-xsrTyLDk6< z#da{olxuo;1sK9L&=QfwD>9mp1Qs2@$>6t8qVWwIWwXVl?LzH%dC5cVc+YjT6a*Ud zh%AkRnLgHqXM+OPLkK5C#pN6rypF}fEJ2vU4MygQlcf`!W@oZ0@_6BW@q2PiRWF&a z00g0^gj1-QXoa!a__ZWEs`HMXu+x{<@o9{W)8;qwT z%F4tDlwAepxu#61W=d2-kBL%}q%fHQ6OCX4v$h>YGSi{H9Yd7_%py$u`GgUaW)Mv~ zZ*KWK>ADt?V}AeNI!EN)<`)=bwNZTmDcEg+nNdiuV8CwL7k76!cmKdvv7?gQqf?#l z^voy>w*V=!>8$kLxp;Kp7AL+3BgW&FZ+>rKC<-gLFm#L|3p^BZJViH?Xp(ih{}{KF z?EMFm*C4Dq_9KSr>4Hfr#TrA$#TldIA2pOoy4#Eh)D796nRXP?5@R{0RE7|ANi&pM zj2#EMB$0u9-^&DYeS#$4SrX$>yO0}8E>0FE zj@Zv9&7%=iK-0oi)=ii}i?}S{SuYOOgejh|xog`UIg?9vNHj!dF`QHak zSbR~`vP%_a38VHk-@U(T$Uk|zEY6Vlbr7_#?_&*EZ+FCl=-GY~uwhXyZ@?H-T$}b= z%+hs)yAbh+5!&Iq#-8TRD zN#9v;9PkBGc^t6_1}iQFAI@vZZbfjM2R;F3So7yreI2T?!wwljfHwluN{xu7*;_IXap|dN?bR z>Ph&Gq%)7YNk$$$Wd$lD;aY(uK0BrE4|)`Kku8HQK(Am`+ugiNK8Il}}m}#kveRd;NRJT|dtNn(AC&d0?EL@SXEu!2a z5+wL?$uWh_LH;=}8<(@PQkuFt4U|8Vb?nV4KN>p`q?~r@IftJ9-(l06Qw&GG+@AT% zj$ymWrOJ}NG>5(+h)B3||IW?^jJ}5_r7Tu`5RfXz2bj%y^D#17a$*11&)a`R72L=m zQ+5P#g4+xiMjaF5i2P*anB|d19dW@AaZM{4cSXmS(<^m_4}%hLQfSeYYoapxPnd0T zO&J!r5!@p+P-x<)ZU`xI;?tUj>=^Q@OlgD)W|hlS$%*u&KP#8!rj5le#f@x3t@aps zhwCB3$|XrJv8G8XTtW=R?hWM}%__aJsMG9_@}K9_h1YHW3BndP9yRUEg)1Kfp+%%M z3nda==c!JFN%)|hQtYpS9z_>wrp@{qPl@-qnDUZV$tVjmGXI;{5qq`HrV2AbM#7zx zWy#FIM~kehmnHb2D(bMS{%*0g!07C{ij}H!Q>A$!u}eQJGRl?3FHcS-9{zj0?iezl z6K16?0Q3o|PEROrA{Jm?GUh;-Ev5Ukw0Ud*SNE>j)?FIj4^=WiO5!Mtp_Mz3^Z|7Y zIZZ-DbD=UBdt=GJ=YU;iNRTacasVUDM|%6C*e5ER{86Z)4V&`=noSl{c&+wUL6?m6 zmxD8~?GVWTss3Qb*(QW2`)F zrebim!fj45On3F$9D>=%n=2#s1zkUZe!3nXO){Ox+k`N7m5C%pYczQx0Q09dQp?5e zzao-Uuv*m|+R2-KVqAm-vSfuG7a=O^Bl$_i(_1A;^v8DC)_U>!Bm~)?*PjG+OI3u& zj($syEx|N|WX!uis5yn}T|cfgP~cT$i=O*kSdNrF@9BXWjL2a}{bL%sPFZR{|5}&i z4#?ynmJeUr;~$2lN;^;l?IbQ1O-#};ppoX}P63xsz$BxEFpD-;s=^56H6cR<=D;*SMvgk#+P;D)&gfu&&q&QAIXsu`O6CVt~bOkUfvkr?tr5R?nXlwY# zCdG@!+m#i+H71bQYmyt$%;vS}T6vIS@j6!|TBoe&9_}=6SQKm~75rds1IDO%!?yp0 zZ~_UUOrlYRvwxVv6wwkeN?;T~V@JJa?!lYheJi5wd$}n7h zW(YM+Q7)VYEJ9(3#wL$He>@WiLzw!pt{+eZ-M!re#U6mRF$%10ON#8;8+R7U95xWb zU+0VxtAy&!YK>(7tJ#H^*svK#c-G@q3SUJ2`mY39Iq{=5m4t@a=%l@Y7=7h|J`NFo zb38JfJXmu1(YobmbX{CtlZ3&!kYSv*7h1o(sMd_>DVC%3)FGF8z*$m zkY5s$x)J>~N|a-b$Re6mc=0c^du_QbSt)!PmfjJv@*CwzMB^na^NzY^{Tb=`Z01yZ za%C@bc`%2I^rW&2xkl2K@_)TjA&|^*8n63g;;8d%%mT&^Zy5s^!EzU=tFVfOsy#*O zQdnxRO#x;86aJK9KuNvILd`DBOA8l8|KycqrL15xVzK0hB7aZBYAznSx5kHKS7yeW z=QLtVi+L%g$%wLxO~S9mo>hY1+m$CRKqz4k-G6bihl_N^_i0XU9+7G6InW~k4CM)S zG!v;1Z;}$LRt87-_gWVR9w$X042fg%7saSjB+kRIF5SR8eq;t&A!I1TeO>l|&l3`l;|jnC1JxWWWR`zb?4 zN@Nq|bo>lwBQ|Go)rOT(@ZxK6sGpO%*Afh^W$87D$p{RT?sRc1G{$WVi(C$|h=QmB zwWrlW;$r>h=G2Q3K{`UYcYv;w2PrZ-MpkAIs2K8KI`Isn+z!FGLwy*D47U4}ah3xE zXQ~q#fv=7U5mmTqD-AjF9%Nur4zcFcL{3E_xmvBie$sZ~odv;{Clf8Xwh=ZFh@!GB zBk}=A0K?~FXb`YLPtkrsXkCrx9)I$`KU7j;o+^3MRs)~(}hgNdF7)1#gZ?xjVU7X{3#!IQg~8G-qh+^ zfkc!Nm?l(TG7pzXwXjGk!{T(w+fC$o>QxmsQBt!U$O#GcSEsFDAbV*ffFI>H1O@mFlzLWCl zqmWcA&vB^HM^5iygBywvEW8{T&nw{f)*v5_Tlz>tRyPUMgX2!AH&XClXkt7^ho zi0!D}7xl~05$lv~eLpxpW3IiNISwnl0y*U{`S`h$S-+v`+8`~<$bO#~=US(HoTKdr z^l1%C+diIW)M7R^o##ZwAh_H}EbEL{Z*Lq3JZBfbzJ)b-P^!4wB$nGAS0~(`GrC>j zzA14##?)xy8vcH3Ii9oJOJFFAcvc>PTIe0Dy`#PTaQ zJcziz@qQm>m54N`A3AOb@j@9UZFoiA>W)vEDUY$O0bCzsn(20M=!_F;k1Qr+*u^(b z-9P4RKm5g-&acGG$-w!+1m$fmeHx2y1oO&+&gdo9X5~MDRS%^KoWr+j!R;qK-o9TD_7EJ{#a?$T1E8x1Hu1Ibdm5hE_de(40@+IE-I-=tuS85GJ!~1G) zKfMO`-#EMzj2PGyk$>EZur_BYoGXSXN>tmnHeCi=qYc~!5*Kb9D$;y*dw;chY&$B9 zT~yj$%&fHexnjL>-v*kIYM9@?L7(Lg*lNzutetzF#&8WW3>+|5%byeaP)O}Qqq#$N zdb`Z?d7n;UKD|xq9?J=|>q6+5fw(S>Z#BiRJoI+WcK7vXyDGe_{e7nFj8si# z>r(aBtjvWcbAJ`^0%j_;4k+~rYPwmj&v4=FvGerbcUBi<^YLWdqQWWWhi1nW#&^lN zW$1Cjfc`hbF_^j>r9Z^=^??{>nLQ@Qt&z>C10CU0)a=7}&>`?K!_`dx^lOF&yGTw5 z!P}dfr<*|btdu!R=hE6`E!pd;5f#?s-^y z-eqmE`AtQIZ3jSW)_qrl+HEWH+sEq&?x=SC8q4N)^)pGa)bgsM9nRn}pJ)&V(|k`>o-bKlo1CtV{EJbdUmzZ!c*6fTXWF^5=d zBW+&(?g}V}V*Vuia?aQpIF%bhY7Kw=V0N>^YKky+ScX-66<2Xjo;BDV51>rsRk`t9 zz9QOH)1WHg`OQmT>aJUVQS??p9xKz&R6ViYSQ0g5iPNq6b6E+^=8pqkW(l=f%D+Wn3ql zHJ6|ChZ0;NKj(2vUY_OSw!m|S2n;aY+oR)-wJM15L(sT?O4D{b4L^<|?UM@g9EBL3;Z*+}H9GJiHgN z*h&pl4oXvRx4^%w#N>#pRIP$PU%#|`HXDupxyw*F{W@Io*AA*?1=L2YI)rtZ3Lepa zNNMu@PVU#q8I{`JEVS$4!JxeiL6UBp8=0Y{qmc2b0NBjG7?>pp;+I6d+I2vBLwvo9 z!hj(k7xbX0z2fO+%p7ZmJlbX6wK3TZ&HkfPZ^TYsEcqH|Ubu14%Fr!s`B)HrNxwV<)Es9n z5thE49Ii!c*qAVO4Ud?>$$$F=TVCcPrl-{S)3;j8l;I!R#2dkP|0Pk$unzVL_jMJXd ze)S$U-ev{V+zR(X>^?9Z(|br2$)oMx&d^12o(#daPCQpe_d+PtAoFln;tuKZ2}XHG z4`NzFLO!maeZwe4dks;4_1Enq%K32U=40h_Ypl0pV}xKQ7VFJ(SNrPqSNpAOP{p!# z&rrbXW@^xEI{46$tEmw``g?63I&VUZR#yhBF9_NFxOIN=Ee`ZUd>#ld{t1vKzUx(Q z<2;R+-TPFL#a3%_tcB?3lm59Fy$92#dxVDIV*$u>gyz<-s;+r>t7T$KJ4@Jm!z-F8 z`-9Pc62D)NQ;{?UR}N`6ahxpyTAV;%XX>`?WM{&H+l-Ahq&+d4S@wH`vPw$IDF^+f-Ra!^SzwvQGcc{02t48lOWPQ*S@^s@DJ$a;Epmcc?WBW& z==#Q>)1z?h4Ksyer?p&pD)D@ym|{Ax&p9nSv*pG1f%Ukkd2Xwpy%d))8Wka%!`1PDHZ9U<+ z%r?|Yha{!Nj*D@mmwmT%m{D;H>U;0Ohw-wnRVM-4wIH!g{D41BUE+b>_OGJGyBoBx ze&r*u09ufStK%Nr7L#L+8T{DjT=`8o85eL*dKA0~<8Ox{dg){8lH%8c;K%7D19>n2 z`|!qRU<%~jXHDjYCVUN{*#Lj7F<85#mEx}M`l$zESgd*Q)Z*8y@K+>!c|TqI3Dz>Y z`iU#A)Cblh#T)c@?mW5oKNZn$fX+>Afp3=RZFYj)wEc>d=>m#HH`_(py9y8S%WxLP zhSHa9j)1LgopGc8x##c6a=k#Sb((i&qG>_)zf0ds@1IDUrz(wG9PjzShhyulD*!Zf z&M;=H@3Rn_uam>!EB1a^%d5eSZd=kL_Y&`!;b~5P>Ie16^;?#hBrQ*soBqNb4(p^q zmdG5a0Iu$w)O!cVFDqa5nI)HvT+s1a`G(}3xdtTkPK3)}cp*(WIv(-Y1ryqMZ_!k% z#a-Kzo4pJq+c8as)jf~x z*H&BJT%*DP(|42n--3w=OCY?S`@nm{C9u!Y;2qzHL+vsDK(5~45^(G7$GLVPpQ*cn zLQIg0zq1RRJsry>>otO;?7)^j=d}B^ zKUZPBOJ3U}?zgr#S%3AhVohhMI=K!(aHLkgS7;GC^I5xCC2uQ6Xbbu4?Zc$Mt%KWQduqbyS@4}HHZf$e zJWh-obS$3bB&FTjc-V!wn*y(ynDESNL~93hi^OVs;}vrD3=HjYc<*zVRmWqXF)HQV z3yrNDdR6Z!d7p%~@g$yk+u%wrX_NwSw!mn@LzO5U@|qcNl_R+36$kGd5AQd#gVeIY zY$Ahc88=-W3Gk zc4C?x{qC0tRCl}hqDsy+;@re8-BvtYD5P;=j?yEv5RD&qPy2j&qg3$^rbU&Vi7C3u z@^(o;>Y9CC>Tjf(3nXZhWFPu4wf7{$5>QDT+$J+9}8x4hIqz0`U? zzE2BSy~BF3+SKoW-qU+%6-wL1BwL{Vyc@XXGCS#62ktn7;$76WVlk&qf#y|LbVIo_Y8v(R5#w4V#JSpK zsn1S~=i%Yy0r6PU6``}OWMd<|I$`1hHPiDG2G*07zg%edkco5=3mu!=C)Q&b3#9oh zP~^Il=c%5ARF};@Kt~k+`UUiIwD!{H*U`s6d|Oo@_(;Bwti%fet6z!gFOMkJ2fs*; zFrT`xbC~a9-u;zcNj059I&0tGl6B6l;NP_o9c|?=WIA3fI+?Z^ZZUoFE5$Jl$0wg( zP{30P4|gZ&Wj1~&k!`k{Lyk!|j~(r2;kxwc>p$(|;WA_HhFEL`A6m8RZslz++(}|U zo&t|shsCx^Udr!k9`J5V`)jB7l$OWq4Bk5dW?TjXH?f!ZMwf64*5bQg6j_zO6ovp< zj7q3{Jlaww21{QIqNd@VOpudWP2s$4>z7U-Aa2%$E^hWn5|3Hd(Iz2 zYw!htVptIxHg|FLxECp5eSyr`MCOC{q|CVvd||l8mE@W&+K>5a=W$`=*GTh6A3$Bu z-SNgAp>=w*^~<$VpG>5s4JjSQ_i`AZw!EE0VU>0i)7}y(wX*7CQMuC4@nDv^rk-6- zrK%=g0Zw7#{(64*W#wJWfjN#w52axKKK#|yuvwpNxc-E@i7=FQ*D~JXuF-ZE#F;Fy z1?@RHa1|j&$h%vfmB89j0qo@HW&dY+SVm3zZi;EUX|w#K#YMd6fbs5gi{Nor`w84< zb7|g&fbohmiN@{rqo02ZzKUIMM>>RUl5>~V0<)ptvk4m>Z`h|c;T!nQhsAe&jIe{r zK_wDj^WNny8SFc>Z%ae)37G80IYEL~OnUle>t+{&Ze!z~v0aUe_4znQB2c0k?)TlH zx6&c;(&`qa@dr^B?#GrF{?z9)TyYJsFe6MYSY(ug`=~`)j(caHqBPLHB7_}(HBMbd zmL0xZbFjy?<-W&oyl26j%U0J$Q|B^dh6J3~$IxOvydx$pfNeAA9scw)r!2Z?9iY%= zb9C??^ZlAsx=w4A*pHp!wZGTvHS_b-1W~xO!6G5TdfnA zClO-XRrcHrn)vxHX7eWd8oR}${SyH6p6Su*dvAXX|C;V6L9m#u*=hs3IixkuwfyNY zpW?ek1M{jqK&6)J2JNu8;fX{-oW+%@f%<19%PiVhb|I>LF(N({GjsLAcqw z*XNgi&T;!%g2v6j=be9N=-p>lStm&Ex=e?S&-Op+-5iViAVka#n>Wgn_#a<-MsPTL&QIZdNz zSB^9(X~-i%0}+aSzS>*#I1c7MO{+n_`HZ%jx1O}`{xN><2Yl)9d~bBxa8Qa2zxreQ z0fAU{+R^e!d*-!E5Y2fR!p*H)K-^~n9e!wqAhz(=Lc7*{@i_JmUzK~w;1|o@C=EIJ zgPF9upV6Z~7@j?|j2Thxx_E)PD_NYD_ zkD9dTi+luE>-e}ZhJZK>+|F;{dSty*xj66bk8@Q{74%5)UYzy@vGecBY;QnRfA7n+mMw)Jv6dLMz#0$V{^}3(0)z z?}Z7;EoPsBGN!3D&kR!HEXm0-xLB4LV(*ivj@QN!h;#Q9s+x(w*_iL$+lAKS((Yc*}%;9mhP|SWh_PXEI7ii|B>`etaNNp|EHv9 z{eSv7>Dm5&8agkv*6lY~n!J`(Zff5XGw^|si0+x1NVD$}6GlhIHl(GCh#F}|N6dv% z*s`l}eTiz&Mh30LqV3}q_ry^mV1coEwk&jhdF7zA&Z+Hw2Zijrc;s9xudYsNKXa^q z&)?X3H9dc7Ct!W+JOk&%Y#Y(SZG?y$Ic+snTGa*2clPllJ1sKHr2!nZnbNE?G}V&+ zcC5c|4<3&vExE0x+S}Dp*{>_M%|xshO<^gaUhc_iSEZCQuo_uldP-y%k1J)Bmsu_B z#YiNnRGKk=p9Fe8IJer@m#;VNes*hAC7w6gc4|W^<Wd~%>`hAbVG(Uf_| z!7o{_iN7)2y@biij;w=YEx0MLG-;cP_+hDF1xPh=l^H3i$xN6)c=$MR&L%ciTC#ZA zzMGfLAzCn6l&yK?q%|?8WjH+Fy%}CV_)*Qg0a%M_d}~3V6G>>#n#Ro6kBsPVc$9_ysjJN%CNt6p+!|vI)PexuWteLD>tEdQvVyn`Jm?(<5Yd_>i@a+9d ziqc&g3Y_^L*VfEZ;z_s__Pp`3C>dXrUpS!v&NhF)zTX;PW6DL*N24iOpYvoTp&oY? z^1Xi;%Cs||y_S@iZ5~cYs?8hRx>B;aFJb;_EV$o3F5guY4YJ<3lEjeSwdBE85r+NS zblO#Z5yzQ6oTaX{Ygn|_ir#GdBYoQ#hiL>sV&l~C(N=AJ_{{0%@s9ziJq3-ShxP7> zQEg4a?Y+Nl!eTKQbu?a^bqr53#gW@_L#p9Q7Z=aQvcka-T20x!FFw? z$sWdj((*FH4kByz-SZSfj5!)V1CJbS4w=iFP%CTf86Hz*j5&Ks~=wG`)L(Rti}#DH$@Ozal_0sR>NX9~P7( z<3?lok`hsAOudJ_j;p6y9S7R&0QQfSElJGv`ytr{0a{nQ-n5)C#IsQys~$VIyA9l) z2yU{`;lT9hY*GcPWfagiT2?m2Uz-+KSTAl{9*cb@l7u}*`-)#mrAc=4k;(Y<`G-`m#mmhXI< zZI74O<_Gktg|pr!iEUl>w>wVp z6W1=@#H!ZdaOmiI;5+~Px9in{&@dw6%GEDDJz;UsqU2#saMQ!f<7iUK{Rxlb%jp$A z<>Mjx(&H{Vew(V~PH~v~u9IUWH1nEwu967q-~O?KInM=-Q8o6lIP|{;%{#O?QcJN+ z68Fh68hptjv z!1=ZfZEA zb0h()dVAV7&^iP(H^a*nLfvguEwi*tN`S>iI~#Zw zm-U2UqLEBciIBYxoEJ$X0`4&O`Xd}Vc`8^jOiO|1y590jO?|o;N@GIOni&c0=Q+aV znJoImtU%uX@b->jf^5sSXxX-H+qP}nwr#t*j4rE-UAAr8wtai8v)4ZRy>q|!?yvhZ zGv|zqjF|al#F!By5k4xDDJ%^L0XN?#f?c35RGd~T&~WGbS5h?snpLdg%xL!+(7OX4 z8M5?8;ezYKYG+b6u@~?UchPWuzQUpC>05u*I2}3lIy-_W0 z-_=u+6(-GKj5p_ke@nW|sLU(Dk}OS9mYuE~c5#Rp@%EjllPC@CqWwORz|t96N8Tlz zMS>3r88z&82{O6pD#_wXi*k5op|IL|mC z8FA~1aXScuBY@+&R54PQ3`-R?_4pQ$+GDE!J=1SIoReN-IGl=S+geZ+EPx(6u}=Zg zETfZ4FO9!xSCKIJ#6u?*i@_Bz!9Mpc8`ArFB6R-26e@Rma|Z}jDxb&HUI0) zk^^FIm^$!&KnQ*t_)Z@pf7&^2OgdTQf^QQ1y~o zQm98x)mxHsrP_L5IznQs7W?hpU%<%B(@;ZpJJ~ij44othQt(G~*(#tgK@DVU)&fdY z+@f5J2`=k>c)=f0Fd%B`}NdXB< z?tO)@rV_qRnwf#D2c^eMmJL*fgdG7RyztoEObb_U`tjn6n0~&b-E#&TJ7yU_Che)|2)YSS8nCuuG_TILUyspvK-f~4(nad*dg%Cl`HSRl9s z&Ud`bAT0p>>wYCq343f7zF!%@!i!UeOezGTAU3FuCz~Aj9fK|tr#gc4A1lhb&CFv= zA~<^HbL0rVWVH1A7o4&;ZnCn^+L0xAS0~V6sCprgeZ)75 zki=*uIrftgV0OEj>@zI+kpSN$9snl<5|BeTFPAAso zZ+l+jP;HZxLh(zBTf`To6?P-&S$M3xno-O%=)x=$&56yIwzST6-3ZzMzpqiY z%z~wuxGT`g?fP_yjSHod+pf9ejj1GT+j8$!6YKD!P#Nfsx!<GTAP=~jzx?)ZekZbXrp5XmtDBKZyU@P6wAOr58Oxnmg%Ju;Lt1zeGy-pcOq zk*N>>ndG=g*1eu(M(s_mZ!X2JXJ<20J7jL(N^$z3&zP&&?T@7-I{Eaz&u^(V8F)lt zITFb>27d&pd+ImMB)3TWU1pEU=0jaBBEbc>7L%QT5KRbzm8mIsV4D!2{nl!t981ufZvmbyl7*c8H`a}qC5CAGT@bHX)1`nqx_ncM!s{Md z`cMae(BxTYjXlQ5_CQedo<3a>`n7xhl%T!*$@>#j-mN5=c~X&?W8H1w=1=!vbf0 zirPPafvsY3Jc13%J{zuIWjVi^MIT-Jbr(jG>iL5aZ!lKm2kT_Uv3|cizgzg}{%(CL zPE3soxK#yVXIMC`ql?g)kNUud3J&@NNOmv)2<7&3$x~VU#T49quRzoo`XFP)F4cMe zWZ{EkKp@+Dn=lqgJ)s}#JFlo{mLyG7)0S-_L(N(G2$rvUb)r+OtbumI>XJ;>)}R5x4Ti znY5Y=b1J78oq>0XK!L%jHFZJ6I*|x$tuuPjQE#t{}YReB}Ye-(2khYz#Rf!>v`sodC-Pv8qe2egWWl-ZCz4IFRJ$sPDaS znDxzj*e4t-z|IGGA;%=nRW=lDxs;WZq_Q7t?`Y4ZtX>9_L%YE&ImQp!pmJd58cnOb zEy4svPuJMhaVuS5gk?5 zR`V{X29Pjn)z7L3;6JUP!sIZkvU+cgBRCjchIYtHZoPS+xS3pdo^qH)NKMV#KxjQU z#1@LK7$P0-vBox+Q49bGPVCIOF53{n{PMDMF^%E7y-d-kZmErvM4)cA{B7Z$e&;(L!l&;GnYO%Y_8&2KP zUG~JAD$4K`Gmr))B6Q-K)SP^fWwcPC9mS%*dvI0+R@&-e3o9mQ)Q7uN82>b>;=6m{ zm4PzA`u!;^;}zlMunl|g*)*0{zI{0(6)P3bGNpZ0a<MzB|eR% zQGQ01S)KE7)aVX0RZ5=+;E~<^1@$1ktJT+v2tE4RGteLh5EZ3w=AG#KP-CB2+hRv+ z4N7F<-~tP%zHo-3dp_ao>5?_dPJoCd&x;OkxV1Z^TVpU4d-Ev6lHoW{c_%3n#*R`% zF#;?ghiQ#~xakmZHcxH6R(U~Bh8?VA^lDfe%9{b$9&NyC{dzzX)mI7N6Tnh)HLZ3k%WG5{_#%3yIVB(MxnElRHHp>9G>-m(XIDAB&`Axj~6X&PsqY_|(!@QW*g z5#X_6ckbkiV-o4s%bH(8+WPKTQT5#sm34=5-B;K=HLd4xWTUY{n6gO`1*KR$NHNxY zc@cG!{i%aR6ug+A5Gc&-ZI-9mT2W!cLxXFjrTbuZXqk_R0=CFmDd16)V2sLhkb?Uu za)5lE%F#?I5p@^59W1+C3|<S8SMni?po#=Fpu_;@GFa0h2blE z4{NAxRA`&{m5!_GS>r>t#|_JwFLwp#dB*KNuCZa;T7O3rkjB6imDQRu*T*aI4j8F( zj)gXc#V)|e@LeYR!`A4ZPg9R;XhR7*yhyFiD{(Mcl! z(8tjc`vkUz9MYk0o8slinu2YkH@Y?YlW_tB$$d&_Fc~v^U53J)yG$K82jUmf0>eGg zgpUgHkFB?>N)|ynVAkzTDgxB>BgJ z@P4ND;t4y>M2X$Ae+m znfo7IC|em<$qh1H#;Ssnot6ZT>jUx>Z_p<6#pHtL!7umW#gun#Gkl*2TY+AZnpO2} z)GBID!-qSIKqhrYrdX{2;Wz>Z&fhEeUdMJV9v4bubk}g?AvV+nFdJxc(lk+rz3vAV z3Isg{n2S?Yem7`m}BODV>E+jS@n2A$$4&=wMd!);}(;&u9;{_7* zh#$37*#_Bo%^13w*#J%Eq%A9Zl@VSy>3200XR>g}F13(KE)wfx&FA2pEgC{&K_7hj zuDWi!ued(UjhVHRC-&DN(4d+6J3Kjj*r(PZomyz#3$P3-5@>SfMm0AN{Rh?rFq9&(-s?Bg%v9~2^oYY0J)i?@SS(Xy8^SVUC&TIE6IDJ-_7 zqOLy7?_GR$BFkFqp>Gu#=W4wU%Jg-f^An*KvgjtCc;4tMJeCGs%|b74!p!c~wK>U; ztZdyDJ>%ba{;b}PJnvvWcWau)m5*Q-3Yf5b>ti6cy;j9S3aK+hu3LH2bbQD$2#7aW zy$Wo>1*+?u0R5vimp)+our_RsTo%gw_9@o3r6Qjdh}G)7(QgP^L(-IhO|1&m_4R(U z0YCe^K-*YEY<@+se|$}g+LJD z%69gp5Thchz}=EtE5=l|F@_D_p`g&JKpV2%o0t1*_}M_ZN7JP*p#=y7$cZZgAR6uG zcW*Jr^HfG^QBrkX{TOvFpcc4g1td`449;7s3e_+kGU__FjR|>gAwxCnm?%9G6Tn4u z$Zue+BaXDNBu&rjIW!)_rNSz&3|u$B%@~dk#cm|QU@7x-2dFV%{D4X&HwT3HSew9n zjHdl(cnkl)&h!-;x+!pq{UCy;kV8Mt_FnTHukM5(()7a=38}IKlU379_z{6C9zndQ zv3{=zprOZBhSmq%7dvfZpR#V5x4E3T$7Tw|yot7zN^E1A(ze$>nWfZoSR^D7-rgJQ ztR`Ua%yWQjKox>w2Zcq@IwX6z&o$*4;B$Pa%DB-T2%tcP6E)fbahtBWDyw?IBW66i zCGTY~Oy0DliGWms@F6tNoOC|nJVfC~V?&o^b)oS#X^mvhft@WyTY@5Hic?(9YD#S; z9?2{^=6fP-^c&!oc6-+-%Vo1z))J&;#2JDYN3NioxTsr*W!?!PjEoOP&V*fWj)bQo zSgx#jAosvW)dXh&qa&TcZT=(1yv3N%n@@%;U>m;Fv9O!S46)!g@e^9lGhD*BkQ`|g zTLryP)l(e=WRCQ={l0(u%rc>WBg0ZpiH4s*F4f`i_@l>D4^sL-(y=U!b||}W3sU~j zrws%@9Phx$yQ&qb%rYoiKZhZ`;X(gd;{r+Hi#c#uOAGZ5Ld-payXw(_;q3C|P#Ko_ z>Q3NzP0@b34isiVSVs}}xJ}1l(1hwP#4I?rB>ad3(!9Dycq@&VQeS&^gyF5tyekn} zfuneiE_+cl71G>t=oy9|z2yZ4H~T<=VZrmK`{_8_;0b|ZrwJ04uK{_14?BJre6=?B zTi4x+$AcxDWU2RjF>sc;yO8C~n!|vGs*%QkYmFm;Hb2(9)K9^?;Cau|pDS#9YYUQ4 z&Dy_fwT$j@N>w>*{k>?JA{Q)HHz{iAfMXd!++%5zdiZJ!KzEBJvn%bHI7ozy=SGBP z-AD=G2G707;(M|kLAL1ch^ojFV@MVrCkFvMnz5K%c84^gpoviFx-IaP{19_4bGcfJ zv~wNndd5Z%18#oo(~N-_z;E>~YMLUAIzo5?)sDF%`J)SWD6|2ig$c4`1PCfCCPWXP zpoQKVqc|M}PilyrWOM1ka&W9TfP*vvNIh{fc zF4XYP0r|m!6Z@4J+9}xnB zyaRP_9C?xjqTn$?$7B}urlqLQ98L<=*x@zFd1yn{fZ}}Y5!XJ2?Avr>* zaJt<`B6?O7{+TXkJAelaQ7Lh&&WraTjBkz_G#D*@mX%A~hE}8Fh67=>x+|%v1WhA# zrsJj41XU#EeFO}IDGda_P=-i%1A|eZuVJ77mkpE+nA#{#)jpq!K?>C~^<25UCA?zS zN~pL}O^uOMr)4e8`)j!TBzNPw^_8M?_OaZ-vNaak8axr~21b)N*CYVGKprdpRirm5 zl>Btsl;RIv#>ZUxl+ygQHpGLyPlZ9v$Y*C;hk#uio3)wRZFk;-(XvisxV)0bAwk_O z;xFpwSIM!mQIN;uG^ykDgGSn1It>PKn>;D5_C2qNmfRFMyVPz7K{n#c4(lW<`^1q_ zN7>c#RPj$FV~M3rb3^Qk{P`gl-Stsej}EbT$y#G&9L=0x7PT*=J2ov3)#UTuUO%y` zw(EFEfW;^cppHHtk7vZaTyZ@_^n@e%Mrnu^%cIOTr=(B=-VdYuK51RyrbUB>L9NrK z<2ve~(VVbAbAfKrBNl$eLI`-{Q#_eiDpBjmMSMI9J~xgyH24w5*Udxv;Uc56Q3QbK zIvo?RLSRN)-W652LlVi7e5b*C>S@8N6t2H!10Iw23c)>34R@9 z+pS}ra6uIRk_*)ld%+RMLxu42-hj6;-BCfT|NSK5XWBf(*ImbGsy$e50{NAzI?j@R z0Qitp>GrC?Aayt)3>^4n(rm8UN7l!vmz@O_nG>jY_d~w?ne!8v@<<$p#u9Q_Vjw%n zaPmotj?2(}sIq&)i;1QobNU$_TZ@m{!`D; zSGxZZN&Oum{S`?uF>$c|6G^fBcOa$W>0nB)U}$biFKcRI zX((jxL7>g>=Q1lND**=!lP(m!lD*3xN?`(qKck#X?OX`{4!QoEHg&dlbuu<}{=-D9 z;AC&CZ0e#-|A(uXfL_Ja!{yIBQ4be!<-eyg{&hbkD0(sbKhqiiVlY;M`a@1kFZ}2D zk3?sJf1mniSNxy7@;|cwuPDg*9||)4_4xlU1^?cr|NGp(G-P7@Gw3g~{$J9N=|4@# z^ly9pw+a6aj{j4`zufd+3jXoPA14$1?PX^IdTC1&X98`g{}RafH+wYH-;bjNrAzQf zpzB{g{%^PcanwIv`M1P>2^2PTF|@Ha|3~tFEsXyj{~x6de>?Ht3j&H>UO|?Ck&o{m z!T+%ymDr*Fny2*NV*Xw*|1z}_BO?^!U#3^0S7Ky_V*LA-^h%sie>?C$=KOX1&z%1u z@ox|RbM=2G@xKNAZTEkM{!c-FIpUwI|38BMV@WH!8oB)S+Wln}M&W-^cmF4I_dnF$ zO#d>)ziGU6)h#tpmglYlPjk(%afZN9b1=~r6cA8RMSewHToo1~D4Gl#inGm*BeBEL zIrd{K2neE}GeqR)8>x7RtQIQ9l(8?jkdd{h$xnIYd3%XXreA|QaQMo(E^4b@Ytt4E zfTc)~Fg-)6mxh&!gokmo3|IDtR5NxoMc~`?z%%MZ?|-|@n#>B9aSl#TCX^F0q2goG zXxsP3r}b(&k6egjMv0uhhBoXWGbI%g|5Q@>nMMOui_Pmbq0haqqpPc0$;`*E=ovyT zEk?}q*6~sLPNtN)AE}|1h-4<5Vbl^P9j2H zH8#_<6zlqcWh(Fki=Up$?QzW{)n7uV-YQP&=G&edMN~F}nVFc*rN-OLXQe|EayRgv z7l|0ngG|(mRGjusF7oMF6T4xB-8E7_lgq@->*5R`HF#g6)Ny`DUY|3x5U0#gg@85h zE+40SR|TOd;I3#$iMT8@1^rNrQ;}_fXe|`Myju1)8+5D1~z|K1mTRB`8Um$_mU>wl%Rz!RT&} z;0)nWghexj#>{(Txp`L5^X|+GpD&VN@s?LwU?4seG+*eqz=pRx?|(W>v4jsyvxRAd{}s z^vdSSv?h#-5+1_D$3F6eZv|VZge`NCIN{ zfNMM`m z8rs_*D>POWZ91XiN>VuJm15;DREiakEW^F<6bEEw^-l(-zLdqfz}$JsYJ4JFu{Lt7 z0C`@1+5z-|k5%RyN-71)CkPHb7)CWggYUr`GvG+;gP?wG2Tz+B=MhqmI5F`*T2%uXjU zL-ZzS{DTv&ea#5*X+Y2SM-b)C9he9MvRV9FKq)0O!{npR4VD%54yW;3{S~`Co!hqR z84M<8%AIj9M7A_d9Fp~_&{e$$x3mJHg-T08WZQ>oD?DUaL;vTE$#Z?iBA}F~vVg3& zOS>yLm%d*`#^6u~=5xR2FGM%Nt=wEe-R|$%mCfpf)Z&Cdxu9*%BtXCBVmJry%Vn6F z{cbW>vYttFh=9@n&~E6r=(AD5N&XiVJLUB-tw+pn{NbElqPw@n7Jj_QhFh?N{luaH zpWX}HmPlSuNofTNjU^nHD`82p;mvv`&Ai7?JRGh^T&MN>8Kk%G^Iejgc)fmS z-zEu>FWg11O|Tk6*o<1lwoI~Wumtn&fjlY2|{=mK2u$ef# z%fr*mePD>;wPj`lvcK4_!5QsmwI6mww9U1L-LGe{L1YH3yRTMtmE+)rZ2+&P17AB6 zJ$Qa+8AZ$1WoY9&Ztwcx|Db&2E&TI0fP-f$PsMoBY_lE&S9O*qo%5=Qqb%z!- zgEjNxCF14qnaJ?$|Q~d+qLi&Zu#Izl_oWWYCS{X z_9R=}C0o2fg(O2iaVE?SW~S*4QC8YEhK*BR;^G87_=%_d?ZoRp!+z6w!h z<@-KiPIh*h1a^1EvJ!Fd$Wrvgzo;OwVMwOnK#Fsfst;K8Pa4&TuDu+NCW7sskL)?i z0t}Nnf@Ce2Gh;u5jW#tsC%uJA0`_w|h#mMAdnGYY*?I)1J?Z(wG#nF0{M!-h3!Q3M zulTXXYq4|RFrp0&)=z_J(^IaHx_brq$2C?P1LD&u&u7c*ZIScVVKn+0n~ z+`7owZrDMNuB5MsFVkLI-fK=g9^W?LbEI-G65N)DUw3A|2D#KkFlH_w*DddYphSX^@4i4cqU-wp91Xob<63nT5&R^@SzAFMunjg3m`g)0+lq_W-=! zE3byGT7wUU6u*iNT~bXbm|U*6*zYSkWv>Rtelw%%%;35-l|6Y}-u9y_FrUR)-B1kX zqJxK^9$ko;UexWA%0hYSgL5V7AdL7WGV}!(!tG5eDG}io%}1051?k$C*>k&bc-tlx zG8hkgp$zVYbKwf(V#Xq>o<;502PdLy;o<)d2t|t2OOS>Hi;noiHX25R5&RyUlbRha zQ?_pa=G?&KxFwd7+%1@q7ssT)cDGgcWPk#V9M3@c?%XXp%-)|l>5XfRkHbG7q=lLx9CKWf{L7v*?RM>QMMAHvJ_aA z5(U8=si0dFcSU=2o>lO}01g=`kaFT^kyFwdS<|zBY-BJJy1Fjo-h1z+B{!X*TO|+G zT}U&tj^5dy16nu(hRA#_eI=NL6bOFU*bz%E1krva$_{G7wu3jEpser;=*Bt6k?-s@~69&kxRs*y)*-YL_PiC_l=?(0LSA zi4(W)QUO;O+H~5&Xm9|65`hTKSh**~p}M>bFs$Dc!)~Pe(A}YoxRS4)?dC4!XGr@E zjkY=u%)B~!f0@VOc_aUv_1>Y zb0|`?F_q#or3Idw_Y!4Z`Yd7dE0q)FH8F(`F?tJEpoXgeaU8!Q^ttx(@6 z9|tddaD|e`k4eLkYkURoAXT8QcF0;RZ}TGM_R_jYA~!=wN4Kmjc!LIsYLT%X#kFCf zYgk(3E1$1jNVwQ)kk=FlE|ls_gd79Cge_NfLDQr{dDMb6rqEexY~YV1d}8s6@}kbh z%D$_t4*`eHkIH#dV}?eiNjoF-L8(@wdo3#gqNAy}QFb=`(m^HoFK0Fux-Y4XbV)Sr z{?9!Ir24XJ7x`Ptdd84&L8WXlm12n&SRb)`q*kD5l@rEGx%=G7rV<+^9=h89} zI;4%Qxd|tZA|wGzmNPyWLnS!4ej^%C#JH0EufSi6P$nE-yfU=$+q z8bSYjR3?HK(+6w2WcN2;bW(Rcgu+xHc*>jy)qV`Qe86ZQ6psVtQ|}>*jA?G~La9eZ zZPJ(JlWCGYDZs?cx5j9e*7r2a_PU<#y4ROQ9~J1*ncLSBzdfNR`#V=jM{v@oFiIqP zI?kh@v!caW)L>Odx$xb0_*5Fbu=zN78|m6y-Z* z2skLID7|5U0?^P4(DLE|=N#S4{P=$56#Fk1s_)WpJX+aoQV{4oe&mp|YI0($&YC34 zOHC%ZJk%${rW;L@$pFZ0I3?S51e!Qi+@<*?S zaY;?do9c#?n2r*7Ui65q%)rQq`h)R@ji(3m^f|p|d-Bx1aF{nt0ffm11R8`sX_tsy zxLFy%rQ=dtTcG#ki|Mn!XkZ*YVlHn+BBxgTh{vc$)OzxTC*)a=?R5A%$Bea-u(%C{ zLD^hmf84YFHhNXTu93J!uM>8frN8qI5Ci(0f)O=<`ziERKiq6h=NpeVF} zz!Lef(v{U+?qr?2-&?XL*599`-4i*Zo$gbwQ|?{Pbn$bTqPHGAy4x!U*(+58Clr%8 zu;xSiWHEbWcMXnb_|dAbL6IswyLk_Zc=)HMDl!JkSdNBa4!$%8z9P4t9UYtDXvM|H z<|ISpCX&@c!Ri|Fd3N{D$lmDa=%;TV-=D;fF_SVe@~Lv9!PzSZjSnd+3pDDdL`>YA zoQzsndD(fn36!x>k&&^pG|z(u`vx2vOynBN`}iYfX%eIE-aseyQ)mW;d7XvM=|o^~DR-sW6xLKR zS~8r<^JSl-p3^=SpG9>K4RP2u($*3q%%% zQKV%HV@>>}-sG5Q&E zjfsXjmYJ8dtC~fxTf2Vx)qmlAYQOb^rSzHvYl88CDT1NHw!!-0w%c6n$DhQv!REkL z!eGOuirtD$$D|P9mND*VCFqdS>_1Yx)+(g-t-+N#>^fDIz^b^F;SiZ@Ofcc4Ls?!h zXOnrz?<1*30i4gaxNwNxP;Y`-0=;Mr?FnH$Y5HI_hvnmzLSqQkoMx z*y&0VSQ6lt>tuwYZCBuJl-6OE237=alT#N5{Jk6c>_kNfc>fSPjw#W zLLQ6ZYTJ0<8P`LeeTAzpI7w;ifTx2H&H3)yy4~9iJpo|+lBXv}g?rJ@J44Ies}rN) z`h|eRT;Il#MW;6jkS87FesQeMo;OwZEdm`fmh53NbXu@~#6Ud&*>CJvZ&d}*&`${kXAz+m zEO5`od66hwuu-NBxj9BEg^ajt3**#=tIMn8ABgD7p{>5;(~m+~sBJUNM0901nPDw2 zt0-+Jd~v$Myu0m%h>mSZ>Ng-n_yU!s`1oY(IqcjmDL6|}Lg8s_C#HAygldvR@7LRh zH-f4sM$V2uNy3dk$@K%pJ_?CXc5G^FN@leKjS)n8VHDHlu7v;zpeX}fr{q?+Dc1n- zcq`IWsAc*zxurPa*C}5TExIbxFp4bEs>V~7|3Kt&&uLs9uzuW4P`%zHTkx`X1y46M3M*{imHM&-}Vq+`q@_6rqgMhu=4}k)h?3f`O5C1MQS(4z491OcC~ zPdYXc!!#M(^NyPEF`;$r-Y8lJ?LEz~*=-)j`ZukgwUMH{dAgKU@;JiE=>a3edF8o#ifI*BfK2f9$!1f63CjtHT z8t~u-^3G0mgKlUdmOj1DysaxzEQ(3a?uQ+Mr0jyD_$*=bEFb{@0}0Ta8sGyQ3PJMo zV}{IW?a|@ELzwnFv=c=RE#Sl<+)lg|3kfPeOjMH)-*!qpUX$XRL zzxr?na%6|?7o;6x5#&`{>w`mV#5AtyOHQ{FziAi)u!!{eYz>x1l^^bQ0VHwAIekkm z+S`2f3-^fk+zhvJC)=SA_PfZO0tb4>ONBez(zSUBa1=N1ohTCT{gnE4u=yO1=%8O8 zU|n7vJ~O0`<5=>=VPvw`L&>9Wn|4u1Co@h3AVVO*wbfeN!m6DTVkAb=ohXv-!y;}~tn8Ts}(2YUj}>(CAKh*KhI zZcP?O;h=Ey5g7#!udU4e3ND z3uQ5`+o`VPa&~p$uzk>fsg9hXJ7#%SdJLmGxNO8hik{Li6G%<9si{^*N3)h6c#x4e zR0eT|%XD|GY7o(ggR@ZZCb$F-gEBQB{HTi&(KmoppvaedQybfs9?@~|%i?l5v6ymS zP(hGf#g4!0UY7CXFek@76Qb>7qr9@S#DL`&u6D$2ej2?JF45a+5nc9%TB0{isS9wF zNj9-@)xa7LEJe5%r^;w79c8Pm6H!lvL!9X?Ec(buabyLSd|u!%{X?~t2D#p1HdjCx z#?33NOE20BZ!h!Mz^{{7gHYGEI%+3@==vb_=_jpFP>3uB4rsEy41_OhciU%Uq7~G6 zkY)%->w2zMOWO{=B#L(k$85tp9G=zr<2o&=@EloB1-0MrmB@Q=yGQhFsQy7eUTEK~ zNdxpDUX6}ElpfqlI8VzZe{_zbe0@`*L58MwuOfY;c2Pv4#w__=*Fc=lGkMM`OdsR zGr;%RxJ8QZNmzIm$1J}m&68qzgfbvMQ>#+`Zjt2$Ta(y-M0#VTOkKpRxg9?dq`x4H zN*O-Ha6WW)NLFys#M(PNKzF^${ee8Cs12Ee7xJ;RsIj<3fp+L=0nl46uZr9l;et?M zIrfOX8x<6ks!z~ZDR4o#(S2XJr!>%EQ{_#gcnVD@Wgh2AUoDG;N_*VPPGb61&17tt zrL%bjv>ra0(x^7U;(Bu_%@>0BHbszTl_U|(2Y(i02&+!_L(rJI2|LZn&IAJR%&GUg z#A4!4M;VKx@-XX$zBvCiAiWOtOAeXpGi$k<9}s0MvqPAGwxsGFlU}z{v=XuAPdY>` zZ?N6jg2dusq=8#4Dlj~z}3syn4tR!4g80a zfA2ZAsN!PdjdRT~?QOJRAE|{{<&DMA%}>BhCWwRCS9)v;RR+KF+E2F$hH;v%C{(&W zl!CBy#vXf#cH*1Iay}{MU~wcI@o<#~=54t@Ey}uiz`H-rTu(S$@${;~w@54)K6>sq zs)-3H*{^RBAjYpcR@&+&axiJqsNn5OPQ|g0&2c$~u+F07=E7U8M~1B)SZEqc4iT@n z?h+T|7qp&bni#^o&&(?~lvr&Jd5a*jOUNC5tH1zcge|I2|At*AmHHh>Z&n|MzTOpx zAW$|In!a~O0y^Z5LPMS^K;#aw8?z$*uZHpKV3)~dk%h8i+HwJ>f|J+yYWKCP+{j1N zeZxuM$;+GuM!!sLyTTh&i-sn3m8m%h$GgWeDg1-bB^w>=o(QZws6RcRdgq~Lb2O-W z^HJ9g;zEl1NzSz8Ic5ZSMAbpyE!_S+d!p3y=|d9vS`f;PoRv7I$w1$$)^YM;wCAZNtDRZV@YcnS52FL(c@D05~aIXx%n??AwEyZgi0z4tI z5jfa_vVbNs_|tm}k9|nx47P(td2hrG;(G`IK4^PGH07vkMTuv*=Ms#DAuf(0SjVkK z(6yIf({91|Zos!1(3`ScShh2%%2B7343pM6d>G zvaLncR)a_PfR&6&0@4FHK229%NAG8*<=%+KWKC6uorVZnFHO|`*8PMI5!C3fR7bLv zR8177#8J7~C1}o4y;dvhONUHmq;E!$r!WADSS-ep+1fhlCMEma?pyb#SzrKybwF?P z$R0cc)VvGqYCFRoRTX_DSTulZ}ELi`c|zbw>P| z-~ERv{LMgga1cMPnV{s@?dBr^wi0NM)Q!4!@xrxh{bu4;r=IQ7RN)o|syzk^MS<&p zS0v7^7SZGau+1%9;9*x*`G6+;(9msOUH|oy8PbwC=y@1dj_Z6r@g}ShNm(B*;8a0q zzRF5z5g(6#@nHo8=E%*6*@kf&R{mS4D&JjqL)ml3Li4kDOl@EUYl#M8T0ZhsB&n73 z^}feQEE-nB-5C%h7Y|4tzNKMB7w`(dZL-z%OXx!em!=j~$eBHw*xyQxz>Sya*Vocyf4wMZCM7-cwA|2epB{;zq73>=rjp$Cp>-k(^ zRrvwSc%Ay7=CGt3YYAtsPgkQNJE zZ`_>tHzF5vkGG4MKOHO`e6)1TQ#PI^_rf!$Z`Jli)!~4cE3h{l>PS~EeLRm8Tr##a z9&&m1Jib5jpU-}Gzorxi&TpzOKOZD$;OPA3ulCt*ogp9PB|$^8-|lBgSnC=>?)%AJ zT$P?300F4;$~@$5(s@X4(jgt}ka*D*OrZwIaKFwNx{;u6qask`PB+Smw#&FZ*^Qup z?!&HG!kN|S35|qd{%e5f*WoF(5ox=@?&I?HjIImg5jK9z0 zyRywkG_Qo<+c-k)=4`Xh+2D^rV3XYj>clNS#6)OxF&(dkC6Ci`5cbmuKlKf`3}$YM zfi2DxG5hPw^CxEP*wwz_cr0pd{{)o%P{R4rLV?DbuCmy`_*U4ekDBdjk~3YFOfm!PIk$LF&pN>SY%SK-5N=X7`v2 zYTnK-BwpXBH+nb6>EQnjT=q|q%by*3mVe+f=D(_!{sou)*ALw^vBEIIPdi@~eKEF9LBf!p589-6CgJfyy*b7^Ls)7RY-15sYdX*WY z!ScyhU&d(OV&KQ1$pqUfbA}07h7EIuj2W5Pgh|#cz_;>qXXptD=WF-9zxfwuI9={L z&!gJrSw(Z&yPhbfdCckxT#4y?$r2hG<6*;&tBzSCjlEv+k+XxP^=d60LhI>C)=am# zOkRh>V&UPoANMNMr~Hsn5?YS$lu(6!#}CHkzCq|r?e6o9XGUY|>u|>vBMck(VOryf zD=|Lf+dJ2+vM-@VduuLlQ)%YI%A3z}<}`MDtyHz@PPj*DLzpTHy)J>vX+Iq#^=h5= zxI1fl)Wgap8jU8Kyb|ok^VyDI#{KFT*K0Fh{`nQ9-)Q@ry>w>nD|SyP-tm*>=mMKP zcIMCZ;2I&klX@oCwcp`+SI!UP8LHk1m_MTHa*=t5+pa;m9_xH*+7q2mfl6t3<8tYz zYJF!r+lOa2EhCK04)wB*WHq|?ba}~HOo_IcWe!-=1=dr!yI8i?I)A-)G5aX=o7Jt_ zz*(EfR$=bjn?|o9d6;2xXVIEdr))r_(Du0!I^8Q&f;NTlsalh2gH{=yuXz0iv_yT- zVkI9_qkes~A)X_1gIk~YU0ZFF<+WL+@w?EZA!!@L#{AgGY|8kUT8c@N&H%kWn!!4~ zR(h4*kLfvDZ*j=2ew<-Cy@A?K<(iAuopet1!m28q_X5j}wjJ+$kId~JbLkxAJ@!J) z4SOkuq8%)49fed1-+a0b_yX~FJa5HIJ*XaWyhJyRicbp^-%1ps-c0H6L3eED)>>R$ zbX`+9@g~UotMAoH{+r@L2LNk1Y9{#X*l%VYN75mIw}l7__gJPc<)tpYSIWwV;YnW} z=j0^hGnw=FQ|ndQl|c6$st&4!oS7m!Wf%ST>P}aC^*i^v_Ep{=(eEgv88pvA+rwAG zTYd?brtpM0bH1pz#21F9M?_UQqMG3A@fkiTxF$JKpQU4dBU=S)KReTeFBsi0s1GFF zK*%SVCFbrxY~;(Aen!RKP1ouZ(OW5AaX#_LmFd@|uZ&-?KG8V+qFP2z@XqNR^_$$< zWh-M}(Ra8s`gP84SZ4z>bvnFroVBXM#?DgXy0tOH*OvzQ3u+v>a!)#*i%QWi5iOp}v)ssk)@AzArs( zDSt(ybxv(S0gsW&7Bnq_uOTP!>4Vrd-IZ(QqlCxWy0*zv&R1kTCTp!R)z&s$B-=A_ z!$6e8{hnM8##4}lUqcad6uPkP?6gzAhxkoKoMGk(R`@u0n2&#Ru1X6gBhLOuf>A`L zolxrnjIS^}V^<@~YYjnHI$>h)Qf8Cg&wFCR+m%+ zaZzkRt2aadWc+C? z4tmxaKWg=Y))b~t+7uka*5K1YF&CvhKKwq1HFt84tb14PJ7+E?b~4{PkF{8dtD^nB>t_{0zd%2POU9V9Z<@%4%#F?lo2e*cgw`1dk%dvwBrBqO*kfptwHmWv zs>YKt#Ajn1df*VVW22If@Ju{A@ysbpdyQk|(+s;`#0JM-V>jn1btRlFKnSs&<-qrH z9M93N(U8y>?mbiUV29Y+g36)0IYQ4bi8NGzf9u}O;AfRllBMa@`y>Mz$}Z-p=TV2dUUw4~1wBvV-JD9y3b6ChF;o!QI|l#Pyj91>MpYNqz`+WALw^=CqQt{JD}-CdA_r`PE}q(1KN zc*s@IVo1AhNzc{hRh%Gt^z?_83oq@II8zz~-R_qTFf3B}KxL44Wm!|9=9h)b?U@2k zm@c*wX|Jd4UTX{dgpJ;vD|<3#Id?#aT!V8>#iv6o@&<&-4zSKdd=i8=ZvaXTg7s^a z8OQYDN-pE`AmX{EQshCLL=wIbaxB+Wf-DT<&@NMnF@~AvUIo<4A-cFHN%-54c-)gj zd=;cTmw1U}9dix$mX&gf!tDU+r)T!@mus9r7?z3Yzl8%T+9%YoGGo)Kc zBw55r!5UJ>b0H$R>#2~fxJ{#& zM$M&bkg$|-L)g~?WD(q^L5#BIQW->0Yv~3=P;;pP(wI7~2phRF9)R04jtR&Ow1^qi zTuOm7ri|;tMlOx}!K{-C zX>r2;QSx4#B|!GWS&EacH5J*uzgteoQ7T5yRZ{E4HvS#uto+a(FKT^^c_V|F%h0)1iR@576a~An6zmL zlEDd|1Km4oLuCzM2D`eYNjG{2SV(y1ylA3yH`KZ05)t~!L?u~2SpyX=nkpJ4nx57v z+@33gj6Q>X*Xzq;5I(=mp2wEQa*+K~^ktHkp~?m92=V!e<1_{e+=^ItL@nskGETgO z-c5q1JUVKhhuEEXP4s-b4)&<98p?}DQ&6{r`dxH|eedxEc6ekUvq3d3GQeOy7<{pS zNWt96(c|q(+Hvas(jfV5PNp{#Q!@<$$uiCARETKm~ zI+FAY+p|R1cD?zkS)XYVJ{y&x+l_*ah5`QG@wv>;jhE;mk} zMPfOzin~>(*spW0oKux23GlUU4i`9b5#_sOYD2|eRYwwidV3fTN4bw;D-wyc-9aQj ztV`iLwC{#9$;d!|H}N34>Ws6L$l-J%cQ=l7(03G1QtvH~^xdE#85a#6L1h(OE4V-u z=(gnX-M`|>)a}aiQNp=4qM;y@c*rk+KGfiM&2#l)Q4RcMhqO{+T9;)ga%Lr}=_*PN!G)<$`hnl*CL19gj9aEjlKrGvqjH zA0MAzOvK)p!{iZ(13a45oX;?m>~9S0XrsLg%lJsHBni@!0>ePqSy4^5n}+F5y{6&j zOYC{iLt)s*SS8W{QcFP&>ty`lw`bT$38%6Hg_#r6AE`q$FtYFH8MxnL%dj%S;(Zmz zb&=e5(Ugfy+t+KT%g2!p9aBO48$jp|&=L4QJ>zuAz=ibYYS&Z?H zxePSYe2usZBq}p)@~_j#(r-*PjUHb$ncSiYq2J_QNBJji>6gWR$)XC|@s%oM&r6Ll z<_PBSwZtvOb;U8Ov4AEIw~oz)0s4(m`mI*~sx3*2l&u#{>CZd{K5X8hy+eJ6w7GA< zx=M1bamN?&Y0eubOC?v7JuJqcZu{y7^^`Q$@r3Bt;*JZcjkt)K=5w``m-DK`37R~9+7OU<|S?nWRBNYL5>+q*!*Bft1 z&k7dL-=A%+U725*?RROk?pnJ&wQu%Q_KIb5zkEMKzss%Jhb|9Y)^6`ANB8v4nX;SZ z@N%0ick}GEXa*0`8i)JWam7tHZn?N76!pEn^4ciaEAmd!pvEt^WRpTg;lmuq|0eK~b+ZAG#7ao+`Yj{J=W?A^JUXII@78I0!#Q7m~ zQhvS%ezGN?B|pAg(Z|mb{#em z6$-G~7aP#RFkUGDuUdcXXT+Fl#KJ646zAt1B3;}*|JwiJXinkBU|FBjlM3^_L7Cq5 zZ=VgkA9i0Tb2;LFqPp#~9eVsZd+}Z}lT_i|mzy&2_dX6(ED7;SkjSpH6}4h@WRLE1 z9TJ9;X_xX!>c#9~TqnpC3QckoOqco(1U*pvDmFKp5O{kkFthqa-`h7v0cistXQG{k z=5{usE}MzpzL93e+MLJAk%_KrxW3%MJ5+PCUTT~pY_@n37^;ko*DXxQ?d{ia*LNyN zmZW!;|XfcP7n7^iLP? z5J${I`n4u%vl?c%)|j{S1I8M+dOBMGvAB2LmXFNQoK#b^Q`GX|J`wMmWNgGs=?3;> z(7Mvd(C~(@G#$2)Eafq!E7@U8)e%u1L1@C+>?-9l-664qgX)&bZfQXxeOmabCd+Kr ztF%w(9jN!JC`z+mr9KyNIGf`tQ!iCdcwrO71|hwxfc_8-d-zh5Y&K)T4zX}=8wqLp zoz#RT;+TXDM4F9@dJltk1e*<)G=z%=LaW|nW5aTM=bjym;UQ3FE~-fyITe{pboMmd zDlD1|&%>$47;q5~DEA_@mWuEg9b0%{6YV`}P8J4PY6cqyJTOg@&ra%r^#!a?B(AUV)D9|bFQlM5~;-eR!Wum^` zq&j9WMpY^}O+`|XXQ5uDzDUJP%S;^{!4Sa^z7eqz9vl%I4!)};Ts}fR{AI+;aEl0w z@brlEaNY>s@Y#r;T*;W&nD!Xsn70k5CwD13k@hsTC8H&cE+7*%h&_TJ=)%5w2>kehl zCPM>TF=?d>Z;EWGB?8$e>J{u?IJq(;U2Z?a5XIx~1pc4oLqp?}d%HDGnZ01Jy2Ifg z>M7wK_!@4#{<%T}-{ax`|Jp z37I|kXc~{_MU>cARNWIb%JDnaL5zRo^FDpF>$%>01hI;t!vQjDm^9~}u6jpnwRK-y zyKir2Cm&jxT!7}O2ugzI+q(v>3|@J+z;hjzxt=VW1d}>Ak~EI;zn_0mafvx}?y>i) zL6J4$-u+X_1mYb`I_mJ*8_2$NSsVMIbKL%^YK~rV8B2%kGJ4Vs;rX+8{kz2dgA+HZ zY7aF_KFDOReIJB5=4dvTq9&0uRsO}8Aqz5hLfzQ0Yv~Ke&R9rb{$T-aHnAR|+cIyQ zjc(uI%Y?-&ONMwKl@?!iDJIY8>hDT(Q?Pa<7)KeE1M4RiE3;*Yd(9_sH`^jtY>kbL zIWQrCwzhUTNZWht&&}p!jVC3}w=MHH)w14lY;EI(q&m9vRFnOmk*UEyE67I#P&JG_j4)T z-5_&W#OVpn#=cOOEIV|o-@bZoW=Qz7-L0Cbd!0r4GBhM1pMAbtH1HecW&WfSL-uF2PMg)JUY(32dv;Vt3#MhNvp%f?T*h~ z{0_y!s)#c)g-HL(ls#@W-m8<9XtlYc<*LEYUdPA!O*w4L%zyomBHu8IX=CRCA8I&A zu1T_jgOAf(;Z(lw*TFuO@L22#Le{WMOaQMFK(}hdw_F~7Bl#|B{sVqeisAfwZ@VYA zW%mrcArq~l(BmiX9ZdANd}378)o|V7b^3umj8+t@2e}E;PjrpHljK-AJ8L>vcGvo3 zy*euJc+LRfLB+?C8=XSUF+I}W6D)!Iry&W?tl$%w6KnoqiI>vTn~)1zb17-GYQ{=| zOAV{Hm~V66u37q;w5GG>INRB^+EqVW&YQw_&vSgOvs*rs!zU)usTyzp$yF^FS9LgN z(D_bzpS5H0{Z8ZH>#qvE&g1cx)FxEd^=Bq;UUJjmP`*q)*)?uvb{@OLU{{sqdK`Rx z#aZ@TuN9s>#mCKtn0Sm65ncJr$F5DIrnqr+Mvhh2YW-tbojKB658W3?b*H_UR%+=7 ze`bgpwnxskl0S{>pv(<3y7;Gj(rQy%WiMNKX))QY*(CMk$JI@pt74kybnqF9m+~9_ zCB$unOGf71RhdG_E@8?Wx$#9*bX@BiJD=lq@sdvOq z?c+z(&}xnNR_{`~g)7mpddx)*%xRwT`ji2;3PTLV1u06^YP5(NwnRIuh1__V%Up`^ zcN9G+H#omfyjR?~;6+4P;8Wup(u{YmD)I)4r8C@B8`K>fa;-ajni6W0-p}Y&6;D*h zj<$>QJ&X#JuQ?SK^m*}NcT^2`7eBHqp6QNXz=zG%hurvvvh?ed2}k|-F){)N>B?tP zd;FJ6+44>4@YUiYXL5W)R~z-JwH)vA+{*I-u2#-H*h{#QE@&$4-0^I_Iz!KDPv@<4 zi6yVM_gH=2Rx>rMF4sArlsxC!FH8XiI*8e~wK&V0B@t$ZL*ScBRvty}gTXd4KJK~K zZSQ@c&9CnAUEK5g{jE_63pGpFTshd)^kltRHO$_wh$H&$m!2girS#}boloKfs>hn;UER5xu|8Fwhh z+&xF#gB7?HB zA-dt4x0wpCWgm3reLe7LFLSSzl&BXR2oyZl>HIuyKIo|Pt2&(D^=DkU#%r8+qP7%V zhaTKLSGa3~twP67$k6K12~I>`Bp40e<4CHRdZZfoaPI2uJ)F&RiaU{8ZqoJEtMaW$ zDVGMStMh|I_3NBJid~3TZc*svzc}<$Sl@e$!!B$7-Q=kmuh!is6JNdaIlWSA>^ke5 zp#`_nVE4`w|1>-P!2JDc4c_yxqHvwxhXgLiyEAY#0li#qoIVzH^SsPf-4z-6 zHp1EiH`NuA5#5)X1|M)n$F4YX%yvoiXPK2Kmz#z;yteB1Igl)Bc^zKTI<8x~FNlE| zweI7*XoOM!|QB~pL+5GF?+A0rY)rq9_ zwo8uQ8|>`QEf47il=Y8mc?IKMapV9*6r9r#qvmijVO zYPL|z%Gdj1w`=drqO``N0JS?`MyR>_bNNQskdtVeDK+$|qa=O6U1 zv+%q5(Eo}XqabIeZ*ixuc&84Una}h~1j*xsoF{v=a-)Z3^>xp3=S_ti>)J zU=hc9WqFP?e!5+1YK53AEGe0@38|lA*t}AtE800zUgZ1IE%Shd7S3OK`kgf&S5iqg zQAeur#q34o8xdXo$E*3WpQ4j()z9ANV?L6q3|C@tE3WqU$oev;11Lj%0k#}&L)Sw&MG>LF|sNwoXI(06q=k{)Tyf&m;LMs+tOI+3wmxU8k;*)58pB$Zc=>;Yk=Q!}G;C0FlFomDicuPpwcvN|_wa;x^VwR?Zb zY=23EmwUq7A&Ul&EX?wVhezY|58tVyASu6xUi`e% zyTxA9jUBryRQU4Sc0WL#-C>n=Tz?~kIMJN$-*)dg8@Uhxy%0>VV|_OSHy@FR0knU?ecUNxeNk*-&rt6DF@779bp0ds}tju=%=8BFN*=3iv zoU=}iHb@rD5oOI0V=cElW2SVK_lQjO6PP9Sn-f+OKLVujNV3ASi1o#8BOw9CgBf(p ze452t$CYYkdaA6THs>7bT&t32ZliDJZ>#VLqXp!+Ew=D~q4VsxDxT?5@ zxeK+N++*Ey@@;%yJ*s?ewll%%Y})~&JJ&Ds^T|5~+GwgK1Y4C9))nK;@n%a#YbF(O zD-)OCw#+uM%mRpViGh_mYZ2kz=Pqt}NaK`?W+=aN@-iO1$q!zIJ<;s8MmcGn>3*gN zbDKnE$V>z!I9Zf>94b{7#M>w%;aoWG$Bb(Rbpd2N`Pu5p;n$e&%=nNu~=Z_GCHsWwX{ zAyT4KWf!o^tR&>J;pUesW(91H7m%kR_(58`kk7+I>w1~R^J+Q|;Q7(L%O807+xYN> znK6j*g0Z;0MM=EL)>{lbrziWKX1l>g12rbDUO{RcGG*z#hL6p^m1#O;nrVOveH=sX ziPey*DUt$TiDe*lRxbx_8kh1grj@n%=3XtaBCA@wlN<&g%v?`XB2g^zMi=dH6nlkesY)hm6wYHaZbv{NDLVB7g7~ z{*q1Ksb3a2%JEr9VX9UF0gHy=z6V9u%{8U2Dsrz@R z^Jx&LGGI3z%D2yU2yi#66yCuM?Y@%Ad+@XJDVK#K86Mt;>MTD-aR_^B8tF-4c$;{b zYz;Oyp&c=FN!cy8HI5jwK5@`n;~u}s+X5XwFJ4Ai;LDm(5HN2(4`YVS)t?);ZPvCN z*XJLf*n9Npju?N1oAbqzLBam!&JOkJqlu=;xmsKq_fEQa<%tj`4}awNY87xiA*%7t zDU1-zIKR1AZ;hb#BA&0I_MC@w8;{@Tf!x3h!>HhfiMomxqWZ!o<(p|8J5+s~rM)hX zC}m!`k6UE~B);C89uOmy%G%9keMFD$*?u_<=}?)bJcLZzV#zx0OT`R*N@ zzHf39g(Po5A3N)cWrt-1FdVdAXMcCYP%Ek6rpsxlpUXm`mPui*co-toQ|w&;&)v_t z7Gbj7?8zVZ9PG(ddNZYigTJw`rZ3lZ+sP}%=D#OdP%U4hr77An5WMD8C1-6Q+w%-?&-H}zCo+9@*_TJ zs$a4^{L1p1PSTD(IJ33?MCn_>mZ`ZL4bM)mBA29tH9ZLBUFYV5D{_wHY-FjuTyK`H zKfA!cxc_R4`B#tZV;af_XY?6bG4l*du<|WHs8aCDw1)EM?u(~C=77<*EddnwT+r1f^Fq8i^}OTDVN~69 zH+cTMEo%F2CdwU9a!6UZ@3%#5lLmdeE$WD^4}n5O1*jSuVRa3~H3_c%1YajRTgf9H zuJ+q3Rakzmzt=<^32cW%%3q-^+ozl>Sm=-!HJV%(vl!t^UXFc0K|D z|Nod1$e);jk2<;f61@M3O$+SqHnG@`+Z?SD;qJ6TEb75}5BB<-o_&9%#A&Woouv7g z&XlV}@`-T0l=p_TPKGd9EeL-Jq+ecM@qXHIGwNdPdHo?@bMKOmrdjAqneVFX2}k); zOTU;aH^1UUXN-n?`Ye_ElIkGAUbrMtfXq;&G^%->YB8BjtbJ+p%C$*yhII}-T`7a> zVG@-;{?!dC_cmvPa8^@(Mw|V!0(7MbE8#S<9YI*?65H#?sa|?0GL|lvAQ^3FT~w%t zAMqGay=YVw4c9H%MOWH(^XB_APVKBZ9nJ@UvZ|7!ALh+0jQ5|)Z)kXt8JJ{AwXpSS zR4dByR&w?kCUpb+F|wDr^^I5`r(B`FP2@+c)40WFaG&&f{J-O&}~hGYZ`eF<*HP&g9I(RK3i z0Ui4GW=L^6U`60&3GzdV0zm|C4?qV{1x^9(fF0oB4$@8nM}Q!}1F#1OUVgT&fNy{Y zpa-Y{o&W(b2lN3f-~~7UUVa20UndWD;5eWTcms~WQNRZv0ysbe@CBRzLqHSo1Dt^q zfEM5n7y;Tq0N@Jvx!V)Gee68E34kqN=iv$#KL!K>ZU7!I0en1d?FazzlqZqk4tNs0 zojmLTA6Hu+B5d1?pc^58-hG=M@h1R&ax~ks50uCVC=MU@K`T`D4{)BHR_&5dr zKmu=T=dx`^z=z-uTJ}3K+wx@&}Ipx`N>7 z-%vzL%lt*1N|}-f==Kf%Khb0UG$TP8R(n4?g14x~aUG}z(Zk30uTv~kRtk=Wfqn5N z*ise|7UXjk#U4gTBjD1qa3owB1xL$*`MMtV|CV*a$=8)2>h0-!QrFhW9ZT@Fb#nFj zUZsb(=yAjC^D-qjUq46Zt`87Nu`A%y^yRQ-I3ppKm<0R+;A;12u2{2Ay?Z~*sx zB$`qB#|J8dMkCQs2k2ii1QJd;GEqKI_ir*33XK6*<}We?Qd;g08A1jQ+UFNNFhOAy z{Y3`8l2s1e_kNKfkd$rbR~ZV0lm*W)zv!Wmpws(92EMo8cNrWb_s2MpaujCSU+Y64 zz%$;jGO#a{^ZPG)piJ%$83Kd(y3zmFFM$6$W9 z9}3*9{=^6lZj`_F1qIsWr~dhRgR6ny4RQfP0Yj%C@VJA9g0#sVAlWhH*aHQ$+#Nii zV5cY~$XZyah3Iuj5r&}kb5Xlw#T5uci6q#c5-SQtvX8H=x9|2ML7^}*XvTvF)%A}u F{y%g!G7A6z 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 fb296b8697964fd41d63ed69ece330112d4d0d90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44260 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 Krj||k#{UE7ZiSTq 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 15303df9b3797b44304e405b4410a6c49c8dc404..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2236 zcmZwHO-Nj46vpwRh=`OlwN?|W`LcA^UinisVs`qQRL8aNKFj~|!`9$f*TGlwp;XV;iQg6jpKPV7e)@ZM~%Iy}5@ev-&0+z+3nlevaRoy;Y4hSm)`( z1m`?n$2FWYYoMOp#04b2VHwBF8Y^)W$FU0UAaxoykUkps@xbiNCO$ViyN>m^jl`eb z!TV-SX{4W~Lp*~gc-8Ff9G*sYXT7MpSu7&+HETZNn_nRLnsv`_*5V?4w#1P>T5e$s z=aGCZD_Fo|Y&P>XU>6R1XU)N$d{g+NS*!AJZcQR_t&>Rp)@kqgqIXta^0z+5Q9h0G zK0xiU9-o%Klbh$vJnjM#@2(>KyV{S`ed@W}$US%8dtOBPJy%&ipR2_=&P(`+(X}t` z`<0*m{3FOd{Ilqw@{`xUiHcMH7`{OI2vj5c3Una%1Dcn(zz|Y5FpgQ=K*j66;&zem z5IFLlmyr0Nulzn3Mdk>mz4I`VH+Tc-C#bv$T*eu*kc;FGUBuhChSUjZFAnaZ-m4yY zLh7G-;W|vAmp81u)D2G|bB5J7{fCdyZx&I1)Q`l`!90>LqTdVmBKMHFA`3{p$SU&P zB8Nyn5pUi|seF#s;)Gdr63H8#^;|;oMpuwIqkkaxqsl}6=n0a)?G$pa&4*#kA#rWq zJZ+kX__k?Oyz)Az?|Fq0tC9S%OXcUW5u|QR_lS>u;i-A_T=%IH+r}d%>V4C8aN&LmQ&Q+XX+M)G#551p02mylWwLGE{Zd+634xZka~di)fb zr+WeEuX`1#e=&}au!!HA^~@uE_N?P5B~O)~_dY2<@6|r8nDx0hgNh@*ZwHyTProzz zyrg?Fhhz8{6ZjX>XTJ~qI8=V#ukTIX{%2(e>M+KrX>@ShJ1-$~3~b{Avv=}1f%*=Z zjG}|X$o=FL5}#C`HK;l0BYA}ECwYQ=x62Kf#Sx_M%i8~+{L{Y2|DWu8Q2mo<@DNAM z(&~#j(&{^fs!yKuKC*{&5goHkHM0MV57|>DiOikRJU3Bua4)00^p{az#AR!dy4f63 zCp(Sg&CYx8*XirF*-#T_<{Tofg1qml-#J!UDnEZu-}k^Qr|&U=>X*E^P2xCT4PwFU z{VAmG@CxsLHoJBM@8S-!kL#M_OPnQ+`yV{x%>8@^{%iK3+`?mY_(`g-hq!^{E$kxu PE-+_BjoC*>oM-+6=g0xM 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 9d0c67a72471a688fa8666da5d52c8e6e76b168a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34044 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 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 0000000000000000000000000000000000000000..f4ba38cf2c8319c5ca3121c83c1969d6d6da153c GIT binary patch literal 11264 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2024f82bbf4204abf197843e31dba01593dcc24a GIT binary patch literal 51403 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 + + + 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 0000000000000000000000000000000000000000..bc393860f64d86412c985090947477109d8ac0dc GIT binary patch literal 46452 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∨I)mAR(%I}qjbw6#9Uk8B;)e9RYl)FNhAYi#{&>;ue6ooCAfEU$VeTMzXK z)~8>Ichi3GPh|1_0Q2`Rf=8OT4pHnyR z!3EfA^hHTN&lreeeVpC;KotDW%Z*hr>^tY3kpUfgS6c6-dR#~FaftTgh0r69`-o=w zyPwhe4fwfVF$SYp4^KYx_k>Y5_&xWqyk0YE)$1*><)0hfQOw8tI6iJ+UA!+LFV@BT zj&AXJe?mNXeY)OF&!6^{vi!a=^o#y|cd zO3^p=uTXC5r?S32s_Poj2cUeLChQJ6N6aWacMFwSFD_$}trtkFtH`PqMoF8CI8nD%KNy`>UWwyua4g&(#O%{PHii z{Wq|6@#9`*z2`Vtx`duT>UgbmaoG}_7c;Yqr$F|;P`teKJnX~5(&c49uBdovb~*5~ z;x2klEB8goBJ$&YC|z8RdznyEvZM@l)lW%`Q%z%CE6zVpWh3cb6D!+lW&!6{cht?sd6%5pR1H6OcTFStyRU>l(DOr8 zLk-Y-R!vJS;=Og%O|>LnUDr4bJl^|jTI$+?k1~Jnb5+f?sKfhW)eOqx^Hw%gH39vV zjnyQdQ)AWRtFLaXA^n2d)@g|MZJXLqMfMA-8;PF_R5ez^&J|QP6F)bF@pG+H8>voi zFZ|%oy<5{nC^%}Zx&_9)lZIulFSkqBE6Z?Gu?C=wp)HKvJ0`IA^@{5l!lpHL- z6t1=UmXXde}x}<9n4_QuDHBfzW@6-mWM}7u#0l)k*<_*1)SI2NC%ctzI z@g6om$Ln^QY3*DX7=!%eGgb59jpamMr>rR~Jvug4f+&+)~zw zb*arZmSfJI`-w-ncB zF-Q5wY;zg5oCK8`QUKz1(0dl$|_ zy^hqP%wp8}ReE6&&I@kPoI}q?64qu`6w!YFx4Desg >=s8K^E3nT4{*aneG#~rF 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ⅅ)YjH!PNX<-K_rw?r1X$O z7-f?pV+1Ku%H~0a2Vqh=D8qvk*ve6VCEhJX6{My~YYa&EHFxA=?Q@m>7Yg72#rw&T}>xwY5t zwEh1^Lgf8F_YDg&<1}{T3ciQW@u|p1c|3*pjSsM$ z^*UxnTxakRuHr3`vreS`tP3ZRJH2%m9jy0|bL#y_uKE%DTjXQ%RyByYbzO&gF7@tN zyodYvSmfLslKb2;UdJP(zTq@7x8WLczlKHT)ry?gTo!I2^UnW;oa?DZa(cASi%E>& zG}7nM+*#a4a(NE1U8FHoSvL+K@6vdJuUJo+QtNp); z`0iBpeVT`UpS~ye_pPCYI#2h@$ay|}_lSt!jpXph%z6U3pFfY(`Dc-H{R_yu`L$2$ zPmsER6S-fYsj?qPBK3h$^L@&EFPOFFVs79E<06tPu!3>i!H4`P^?jM!QpDSMfSlKI zjFw1H@6Y$3p2xgk3OP48fi^B9bA$Rmykl?+xo_|U(;}e^dhrfY7b+tCp(SKqNb@j1 zv|;vlQR_6vry}7Hk|(U^^B&;=v(|ghu--)K!{*(?W!B6M>-%xfhzIG9=p6DzG!Jtk z<49j5k6NdBv~JbxuOo9JI$!%Vm-Zc^B@%Vv6`Vr)ql;$W^hLFgdqsDUzNp@ZdC?iW2CRuj}{If-&;qJzScap57exlc`N6lLA z<>mVva(-e3?}>ck!4f{he~G+`o|kt?(pM7)ErM4F^xZqTsn=^U()ZBIA7WCOd$8@96|2ixrC2J zy7d0+ca5V1r_ja~$b0oqpcggA7@EF* z?IT~ti5A9?+!=FDM$h5=%r-JVvxCgb9Fy;RqR+GDzE?I_lk0Ql>FxT*75XZ_S= uMZPGqp22xjg_$$`T12bcRa!R+y4MaY72J& literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6b52ca0980f79ff36e60e61dacca8dc8cf0c22f7 GIT binary patch literal 36180 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

9CoiJP4^DY&!lqvE!ZpJ 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 Cr&Kop literal 0 HcmV?d00001 From 7b585ed3855a14f55443791f537fe1092d3f5d37 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 11:50:45 -0500 Subject: [PATCH 28/58] Add vegmap processing and enhance domain rasterization Introduces data_vegmap.R for processing vegetation map rasters with biome, bioregion, and vegtype bands. Updates domain_rasterize to output a multiband raster with domain, pixel ID, remnant indicators, and distance to remnants, including CF-compliant metadata. Updates _targets.R to use new targets and file-based inputs, and sets geotargets options for GDAL drivers. --- R/data_chelsa.R | 0 R/data_vegmap.R | 57 +++++++++++++++++++++++ R/domain_rasterize.R | 105 ++++++++++++++++++++++++++++++++++++++++--- _targets.R | 75 ++++++++++++++++++------------- 4 files changed, 199 insertions(+), 38 deletions(-) create mode 100644 R/data_chelsa.R create mode 100644 R/data_vegmap.R diff --git a/R/data_chelsa.R b/R/data_chelsa.R new file mode 100644 index 00000000..e69de29b diff --git a/R/data_vegmap.R b/R/data_vegmap.R new file mode 100644 index 00000000..c64bef2b --- /dev/null +++ b/R/data_vegmap.R @@ -0,0 +1,57 @@ +## Process Vegmap to add field related to biome type + +data_vegmap <- function(domain_raster, vegmap_shp, disagg_factor = 10) { + + # Load and prep vegmap + vegmap_sf <- st_read(vegmap_shp, quiet = TRUE) %>% + janitor::clean_names() %>% + st_make_valid() %>% + st_transform(st_crs(domain_raster)) %>% + st_intersection(st_as_sfc(st_bbox(domain_raster)))|> #crop to domain + mutate(vegtype_id = as.numeric(factor(mapcode18))) #create numeric vegtype ID + + # Create fine template to reduce sliver effects, then modal aggregate back + template_fine <- disagg(rast(domain_raster), disagg_factor) + + rasterize_modal <- function(field_name) { + r_fine <- terra::rasterize( + x = vect(vegmap_sf), + y = template_fine, + field = field_name, + touches = TRUE + ) + terra::aggregate(r_fine, disagg_factor, fun = "modal") + } + + biome_raster <- rasterize_modal("biomeid_18") + bioregion_raster <- rasterize_modal("brgnid_18") + vegtype_raster <- rasterize_modal("vegtype_id") + + multiband <- c(biome_raster, bioregion_raster, vegtype_raster) + names(multiband) <- c("vegbiome", "vegbioregion", "vegtype") + + # Per-band metadata + attr(multiband[[1]], "long_name") <- "Biome ID (biomeid_18)" + attr(multiband[[1]], "units") <- "dimensionless" + + attr(multiband[[2]], "long_name") <- "Bioregion ID (brgnid_18)" + attr(multiband[[2]], "units") <- "dimensionless" + + attr(multiband[[3]], "long_name") <- "Vegetation type code (mapcode18)" + attr(multiband[[3]], "units") <- "dimensionless" + + # Lookup table for IDs -> names (stored as JSON for CF attributes) + lookup_tbl <- vegmap_sf %>% + st_drop_geometry() %>% + dplyr::select(biomeid_18, brgnid_18, vegtype_id, mapcode18, name_18, biome_18, bioregion) %>% + dplyr::rename(vegbiome = biomeid_18, vegbioregion = brgnid_18,vegtype=vegtype_id) %>% + dplyr::distinct() + + attr(multiband, "lookup_table_json") <- jsonlite::toJSON(lookup_tbl, dataframe = "rows", auto_unbox = TRUE) + attr(multiband, "date_generated") <- as.character(Sys.time()) + attr(multiband, "crs") <- as.character(crs(multiband)) + attr(multiband, "Conventions") <- "CF-1.8" + + multiband +} + diff --git a/R/domain_rasterize.R b/R/domain_rasterize.R index 862c3e15..d05bb151 100644 --- a/R/domain_rasterize.R +++ b/R/domain_rasterize.R @@ -8,21 +8,112 @@ #' @param dx x resolution #' @param dy y resolution -domain_rasterize <- function(domain,dx = 500, dy = 500){ +domain_rasterize <- function(domain, remnants_shp, vegmap_shp, dx = 250, dy = 250) { - # generate raster version of domain - domain_template=st_as_stars(st_bbox(domain), dx = dx, dy = dy) + # Generate raster version of domain + domain_template <- st_as_stars(st_bbox(domain), dx = dx, dy = dy) +# rasterize domain domain_raster <- domain %>% - dplyr::select(biomeid_18) %>% - st_rasterize(template = domain_template) + st_as_sf() %>% + st_rasterize(template = domain_template) %>% + rast() - domain_raster - #writeRaster(domain_raster,file="data/domain.tif") +## Process remnants to add fields related to whether the cell is in a remnant and distance to remnant +# Load remnants file + remnants <- st_read(remnants_shp) %>% + janitor::clean_names() %>% + st_transform(crs = crs(domain)) %>% + st_make_valid() + + + remnants_raster <- remnants %>% + mutate(remnant=1) %>% + vect() %>% + rasterize(x = ., + y = domain_raster, + field = "remnant", + touches = T, + cover = T) + + remnants_distance <- remnants_raster |> + terra::app(fun=function(x) ifelse(is.na(x),0,1)) |> + terra::gridDist(target=1)/1000 + +## Process Vegmap to add field related to biome type + +# load vegmap + + vegmap <- st_read(vegmap_shp) %>% + janitor::clean_names() %>% + st_make_valid() %>% + st_transform(crs = crs(domain)) |> # project to match domain + st_intersection(y = st_as_sf(domain)) #crop to domain + + + # 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(domain_raster), n) #break raster into smaller ones + r <- rasterize(x = vegmap, + y = template, + field = "biome_18") #rasterize at fine resolution + + biome <- aggregate(r, n, "modal") #re-aggregate using modal biome + + + + # 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 + + # Combine into multiband raster + multiband_raster <- c(domain_raster, pid_raster, remnants_raster, remnants_distance) + + # Set layer names + names(multiband_raster) <- c("domain", "pid", "remnants", "remnants_distance") + + # Add CF-compliant metadata for each layer + # Layer 1: domain + attr(multiband_raster[[1]], "long_name") <- "Domain mask (1 = in domain, NA = outside)" + attr(multiband_raster[[1]], "units") <- "dimensionless" + + # Layer 2: pid + attr(multiband_raster[[2]], "long_name") <- "Pixel ID for domain grid cells" + attr(multiband_raster[[2]], "units") <- "1" + + # Layer 3: remnants + attr(multiband_raster[[3]], "long_name") <- "Remnant vegetation indicator (1 = in remnant, NA = outside)" + attr(multiband_raster[[3]], "units") <- "dimensionless" + + # Layer 4: remnants_distance + attr(multiband_raster[[4]], "long_name") <- "Distance to nearest remnant" + attr(multiband_raster[[4]], "units") <- "kilometers" + + # Global attributes + attr(multiband_raster, "date_generated") <- as.character(Sys.time()) + attr(multiband_raster, "crs") <- as.character(crs(multiband_raster)) + attr(multiband_raster, "Conventions") <- "CF-1.8" + + multiband_raster } +# library(geoarrow) +# # Convert raster stack to points +# domain_points <- terra::as.points(domain_raster)|> +# sf::st_as_sf() |> +# filter(domain==1) + +# # Write GeoParquet +# arrow::write_parquet(domain_points, "domain.parquet") + + + diff --git a/_targets.R b/_targets.R index 2ea53b45..ca65baf9 100644 --- a/_targets.R +++ b/_targets.R @@ -39,8 +39,11 @@ library(filelock)#,lib.loc=Sys.getenv("R_LIBS_USER")) options(tidyverse.quiet = TRUE) - tar_option_set(packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", - "appeears", "terra")) + tar_option_set( + packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", + "appeears", "terra")) + +geotargets_option_set(gdal_raster_driver = "netCDF", gdal_vector_driver = "geoparquet") ## Authenticate with AppEEARS source("R/appeears_auth.R") @@ -57,12 +60,13 @@ list( tar_target( remnants_shp, "data/manual_download/RLE_2021_Remnants/RLE_Terr_2021_June2021_Remnants_ddw.shp", - format = "file" + format="file" ), tar_terra_vect( - capenature_fires, - st_read("data/manual_download/All_Fires_23_24_gw/All_fires_23_24_gw.shp") |> vect() + capenature_fires_shp, + "data/manual_download/All_Fires_23_24_gw/All_fires_23_24_gw.shp", + format="file" ), @@ -80,12 +84,45 @@ list( tar_terra_vect( domain, domain_define(vegmap = vegmap, country) - ) -, + ), +tar_terra_rast( + domain_raster, + domain_rasterize(domain = domain,remnants_shp, vegmap_shp) + ), +tar_terra_rast( + vegmap_raster, + data_vegmap(domain_raster, vegmap_shp) + ), # # # # Infrequent updates via releases + # 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( # alos_release, # get_release_alos(temp_directory = "data/temp/raw_data/alos/", @@ -300,31 +337,7 @@ list( # ... = 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, From 20b4f928beae4c78503e0a4372e0736bab20c3d5 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 12:01:36 -0500 Subject: [PATCH 29/58] Fix gdal_vector_driver option and update domain_rasterize call in _targets.R --- _targets.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_targets.R b/_targets.R index ca65baf9..1e1b6dc7 100644 --- a/_targets.R +++ b/_targets.R @@ -43,7 +43,7 @@ library(filelock)#,lib.loc=Sys.getenv("R_LIBS_USER")) packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", "appeears", "terra")) -geotargets_option_set(gdal_raster_driver = "netCDF", gdal_vector_driver = "geoparquet") +geotargets_option_set(gdal_raster_driver = "netCDF", gdal_vector_driver = "Parquet") ## Authenticate with AppEEARS source("R/appeears_auth.R") @@ -88,7 +88,7 @@ list( tar_terra_rast( domain_raster, - domain_rasterize(domain = domain,remnants_shp, vegmap_shp) + domain_rasterize(domain = domain,remnants_shp) ), tar_terra_rast( From 71f0c50cffdfa64387c2865aca2aabc6153f214e Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 12:43:34 -0500 Subject: [PATCH 30/58] Refactor data processing functions: update vegmap handling in data_vegmap and domain_define, remove unused parameters in domain_rasterize, and enhance target definitions in _targets.R. --- R/data_vegmap.R | 6 +- R/domain_define.R | 16 +---- R/domain_rasterize.R | 23 +------ R/network_drive_explore.R | 62 ------------------ R/process_release_biome_raster.R | 107 ------------------------------- _targets.R | 51 +++++++-------- 6 files changed, 33 insertions(+), 232 deletions(-) delete mode 100644 R/network_drive_explore.R delete mode 100644 R/process_release_biome_raster.R diff --git a/R/data_vegmap.R b/R/data_vegmap.R index c64bef2b..004f14da 100644 --- a/R/data_vegmap.R +++ b/R/data_vegmap.R @@ -9,7 +9,6 @@ data_vegmap <- function(domain_raster, vegmap_shp, disagg_factor = 10) { st_transform(st_crs(domain_raster)) %>% st_intersection(st_as_sfc(st_bbox(domain_raster)))|> #crop to domain mutate(vegtype_id = as.numeric(factor(mapcode18))) #create numeric vegtype ID - # Create fine template to reduce sliver effects, then modal aggregate back template_fine <- disagg(rast(domain_raster), disagg_factor) @@ -27,9 +26,14 @@ data_vegmap <- function(domain_raster, vegmap_shp, disagg_factor = 10) { bioregion_raster <- rasterize_modal("brgnid_18") vegtype_raster <- rasterize_modal("vegtype_id") + # 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_raster is NA) + domain_mask <- !is.na(rast(domain_raster)) + multiband <- terra::mask(multiband, domain_mask, maskvalues = 0) + # Per-band metadata attr(multiband[[1]], "long_name") <- "Biome ID (biomeid_18)" attr(multiband[[1]], "units") <- "dimensionless" diff --git a/R/domain_define.R b/R/domain_define.R index ed8d51b6..a60f52a7 100644 --- a/R/domain_define.R +++ b/R/domain_define.R @@ -8,12 +8,12 @@ #' @param vegmap is the domains of interest from the 2018 national vegetation map #' @param buffer size of domain buffer (in m) -domain_define <- function(vegmap, country){ +domain_define <- function(vegmap_shp, country){ biomes = c("Fynbos","Succulent Karoo")#,"Albany Thicket") - vegmap_union=vegmap %>% + vegmap_union=st_read(vegmap_shp) %>% st_as_sf() %>% filter(biome_18 %in% biomes ) %>% #filter to list above st_union() # union all polygons into one multipolygon, dissolving internal boundaries @@ -49,16 +49,6 @@ country= st_as_sf(country) %>% vect() - #release the domain - # piggyback::pb_upload(file = "data/domain.gpkg", - # repo = "AdamWilsonLab/emma_envdata", - # tag = "raw_static", - # overwrite = TRUE)# - return(domain) -} - - - - +} \ No newline at end of file diff --git a/R/domain_rasterize.R b/R/domain_rasterize.R index d05bb151..41bb52ee 100644 --- a/R/domain_rasterize.R +++ b/R/domain_rasterize.R @@ -8,7 +8,7 @@ #' @param dx x resolution #' @param dy y resolution -domain_rasterize <- function(domain, remnants_shp, vegmap_shp, dx = 250, dy = 250) { +domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250) { # Generate raster version of domain domain_template <- st_as_stars(st_bbox(domain), dx = dx, dy = dy) @@ -42,27 +42,6 @@ domain_rasterize <- function(domain, remnants_shp, vegmap_shp, dx = 250, dy = 25 terra::app(fun=function(x) ifelse(is.na(x),0,1)) |> terra::gridDist(target=1)/1000 -## Process Vegmap to add field related to biome type - -# load vegmap - - vegmap <- st_read(vegmap_shp) %>% - janitor::clean_names() %>% - st_make_valid() %>% - st_transform(crs = crs(domain)) |> # project to match domain - st_intersection(y = st_as_sf(domain)) #crop to domain - - - # 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(domain_raster), n) #break raster into smaller ones - r <- rasterize(x = vegmap, - y = template, - field = "biome_18") #rasterize at fine resolution - - biome <- aggregate(r, n, "modal") #re-aggregate using modal biome - # Create pixel ID raster: 1:ncell where domain=1, NA elsewhere 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_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/_targets.R b/_targets.R index 1e1b6dc7..de2460c3 100644 --- a/_targets.R +++ b/_targets.R @@ -43,7 +43,11 @@ library(filelock)#,lib.loc=Sys.getenv("R_LIBS_USER")) packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", "appeears", "terra")) -geotargets_option_set(gdal_raster_driver = "netCDF", gdal_vector_driver = "Parquet") +geotargets_option_set( + gdal_raster_driver = "netCDF", + gdal_raster_creation_options = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9"), + gdal_vector_driver = "GPKG" +) ## Authenticate with AppEEARS source("R/appeears_auth.R") @@ -63,7 +67,7 @@ list( format="file" ), - tar_terra_vect( + tar_target( capenature_fires_shp, "data/manual_download/All_Fires_23_24_gw/All_fires_23_24_gw.shp", format="file" @@ -71,30 +75,24 @@ list( tar_terra_vect( - country, + country.gpkg, national_boundary() - ) -, - - tar_terra_vect( - vegmap, - get_vegmap(vegmap_shp) ), tar_terra_vect( - domain, - domain_define(vegmap = vegmap, country) + domain.gpkg, + domain_define(vegmap = vegmap_shp, country) ), tar_terra_rast( - domain_raster, + domain.nc, domain_rasterize(domain = domain,remnants_shp) ), tar_terra_rast( - vegmap_raster, + vegmap.nc, data_vegmap(domain_raster, vegmap_shp) - ), + )#, # # # # Infrequent updates via releases # tar_target( @@ -132,13 +130,12 @@ tar_terra_rast( # ) #, - tar_target( - climate_chelsa_release, - get_release_climate_chelsa(temp_directory = "data/temp/raw_data/climate_chelsa/", - tag = "raw_static", - domain = domain) - ) -, + # tar_target( + # climate_chelsa_release, + # get_release_climate_chelsa(temp_directory = "data/temp/raw_data/climate_chelsa/", + # tag = "raw_static", + # domain = domain) + # )#, # tar_terra_rast( # clouds_wilson_release, @@ -164,12 +161,12 @@ tar_terra_rast( # 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 From 68c361abff75071827991c43c3b0f614bf109e2a Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 12:44:11 -0500 Subject: [PATCH 31/58] Fix domain parameter references in tar_terra_rast calls for correct data processing --- _targets.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_targets.R b/_targets.R index de2460c3..08ee8737 100644 --- a/_targets.R +++ b/_targets.R @@ -86,12 +86,12 @@ list( tar_terra_rast( domain.nc, - domain_rasterize(domain = domain,remnants_shp) + domain_rasterize(domain = domain.gpkg,remnants_shp) ), tar_terra_rast( vegmap.nc, - data_vegmap(domain_raster, vegmap_shp) + data_vegmap(domain.nc, vegmap_shp) )#, # # # # Infrequent updates via releases From 8c00b716bebed8312f51f662381baf49e78d5aa4 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 12:46:56 -0500 Subject: [PATCH 32/58] Fix data reading in domain_define function by applying janitor::clean_names for improved consistency --- R/domain_define.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/domain_define.R b/R/domain_define.R index a60f52a7..0fd9847e 100644 --- a/R/domain_define.R +++ b/R/domain_define.R @@ -14,7 +14,7 @@ domain_define <- function(vegmap_shp, country){ vegmap_union=st_read(vegmap_shp) %>% - st_as_sf() %>% + janitor::clean_names() %>% filter(biome_18 %in% biomes ) %>% #filter to list above st_union() # union all polygons into one multipolygon, dissolving internal boundaries From 1022235df95b0c849b1122d71f2227bc938640c0 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 12:47:57 -0500 Subject: [PATCH 33/58] Fix domain_define call in tar_terra_vect to use correct parameter for country data --- _targets.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_targets.R b/_targets.R index 08ee8737..7f03f9ab 100644 --- a/_targets.R +++ b/_targets.R @@ -81,7 +81,7 @@ list( tar_terra_vect( domain.gpkg, - domain_define(vegmap = vegmap_shp, country) + domain_define(vegmap = vegmap_shp, country.gpkg) ), tar_terra_rast( From d4ddac586466263d95b0a5082ed6c156b4f8776e Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 12:50:19 -0500 Subject: [PATCH 34/58] Fix st_intersection call in domain_define to use correct CRS from vegmap_union --- R/domain_define.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/domain_define.R b/R/domain_define.R index 0fd9847e..5e4da0a6 100644 --- a/R/domain_define.R +++ b/R/domain_define.R @@ -43,7 +43,7 @@ country= st_as_sf(country) %>% 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) |> vect() From 9f1f674432935316174af02574881c825dc54732 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 13:04:46 -0500 Subject: [PATCH 35/58] Fix file path in tar_target for capenature_fires_shp to ensure correct data reference --- _targets.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_targets.R b/_targets.R index 7f03f9ab..3efc487a 100644 --- a/_targets.R +++ b/_targets.R @@ -69,7 +69,7 @@ list( tar_target( capenature_fires_shp, - "data/manual_download/All_Fires_23_24_gw/All_fires_23_24_gw.shp", + "data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp", format="file" ), From afb2d2670b0dc4cede69fa107f58e026e63842d4 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 14:44:52 -0500 Subject: [PATCH 36/58] Refactor workflow and R scripts: update cron schedule, add get_country function, enhance metadata handling in data processing functions --- .github/workflows/targets.yaml | 4 +- R/data_chelsa.R | 184 ++++++++++++++++++++++ R/{national_boundary.R => data_country.R} | 2 +- R/data_vegmap.R | 29 ++-- R/domain_rasterize.R | 33 ++-- _targets.R | 44 ++---- {R => old}/domain_remnants.R | 0 {R => old}/domain_remnants_release.R | 0 {R => old}/get_domain.R | 0 9 files changed, 228 insertions(+), 68 deletions(-) rename R/{national_boundary.R => data_country.R} (95%) rename {R => old}/domain_remnants.R (100%) rename {R => old}/domain_remnants_release.R (100%) rename {R => old}/get_domain.R (100%) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index 9f1d6b61..c1a14035 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -36,8 +36,8 @@ on: # 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 diff --git a/R/data_chelsa.R b/R/data_chelsa.R index e69de29b..8a5bbbb6 100644 --- a/R/data_chelsa.R +++ 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/national_boundary.R b/R/data_country.R similarity index 95% rename from R/national_boundary.R rename to R/data_country.R index f0e4c87c..7913703c 100644 --- a/R/national_boundary.R +++ b/R/data_country.R @@ -4,7 +4,7 @@ #' @description Download national boundary file from the UN #' @source https://data.humdata.org/dataset/cod-ab-zaf -national_boundary <- function(){ +get_country <- function(){ #Adjust timeout to allow for slow internet if(getOption('timeout') < 1000){ diff --git a/R/data_vegmap.R b/R/data_vegmap.R index 004f14da..33214f1d 100644 --- a/R/data_vegmap.R +++ b/R/data_vegmap.R @@ -34,27 +34,26 @@ data_vegmap <- function(domain_raster, vegmap_shp, disagg_factor = 10) { domain_mask <- !is.na(rast(domain_raster)) multiband <- terra::mask(multiband, domain_mask, maskvalues = 0) - # Per-band metadata - attr(multiband[[1]], "long_name") <- "Biome ID (biomeid_18)" - attr(multiband[[1]], "units") <- "dimensionless" + # Set units (preserved through cache with terra_preserve_metadata = "zip") + units(multiband) <- c("dimensionless", "dimensionless", "dimensionless") - attr(multiband[[2]], "long_name") <- "Bioregion ID (brgnid_18)" - attr(multiband[[2]], "units") <- "dimensionless" - - attr(multiband[[3]], "long_name") <- "Vegetation type code (mapcode18)" - attr(multiband[[3]], "units") <- "dimensionless" - - # Lookup table for IDs -> names (stored as JSON for CF attributes) + # Lookup table for IDs -> names lookup_tbl <- vegmap_sf %>% st_drop_geometry() %>% dplyr::select(biomeid_18, brgnid_18, vegtype_id, mapcode18, name_18, biome_18, bioregion) %>% - dplyr::rename(vegbiome = biomeid_18, vegbioregion = brgnid_18,vegtype=vegtype_id) %>% + dplyr::rename(vegbiome = biomeid_18, vegbioregion = brgnid_18, vegtype = vegtype_id) %>% dplyr::distinct() - attr(multiband, "lookup_table_json") <- jsonlite::toJSON(lookup_tbl, dataframe = "rows", auto_unbox = TRUE) - attr(multiband, "date_generated") <- as.character(Sys.time()) - attr(multiband, "crs") <- as.character(crs(multiband)) - attr(multiband, "Conventions") <- "CF-1.8" + # Add metadata using metags (preserved in GeoTIFF) + metags(multiband) <- c( + "lookup_table_json" = jsonlite::toJSON(lookup_tbl, dataframe = "rows", auto_unbox = TRUE), + "vegbiome_long_name" = "Biome ID (biomeid_18)", + "vegbioregion_long_name" = "Bioregion ID (brgnid_18)", + "vegtype_long_name" = "Vegetation type code (mapcode18)", + "date_generated" = as.character(Sys.time()), + "crs" = as.character(crs(multiband)), + "Conventions" = "CF-1.8" + ) multiband } diff --git a/R/domain_rasterize.R b/R/domain_rasterize.R index 41bb52ee..d885bba7 100644 --- a/R/domain_rasterize.R +++ b/R/domain_rasterize.R @@ -57,27 +57,18 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250) { # Set layer names names(multiband_raster) <- c("domain", "pid", "remnants", "remnants_distance") - # Add CF-compliant metadata for each layer - # Layer 1: domain - attr(multiband_raster[[1]], "long_name") <- "Domain mask (1 = in domain, NA = outside)" - attr(multiband_raster[[1]], "units") <- "dimensionless" - - # Layer 2: pid - attr(multiband_raster[[2]], "long_name") <- "Pixel ID for domain grid cells" - attr(multiband_raster[[2]], "units") <- "1" - - # Layer 3: remnants - attr(multiband_raster[[3]], "long_name") <- "Remnant vegetation indicator (1 = in remnant, NA = outside)" - attr(multiband_raster[[3]], "units") <- "dimensionless" - - # Layer 4: remnants_distance - attr(multiband_raster[[4]], "long_name") <- "Distance to nearest remnant" - attr(multiband_raster[[4]], "units") <- "kilometers" - - # Global attributes - attr(multiband_raster, "date_generated") <- as.character(Sys.time()) - attr(multiband_raster, "crs") <- as.character(crs(multiband_raster)) - attr(multiband_raster, "Conventions") <- "CF-1.8" + # Set units (preserved through cache with terra_preserve_metadata = "zip") + units(multiband_raster) <- c("dimensionless", "1", "dimensionless", "kilometers") + + # Add metadata using metags (preserved in GeoTIFF) + metags(multiband_raster) <- c( + "domain_long_name" = "Domain mask (1 = in domain, NA = outside)", + "pid_long_name" = "Pixel ID for domain grid cells", + "remnants_long_name" = "Remnant vegetation indicator (1 = remnant, NA = not remnant)", + "remnants_distance_long_name" = "Distance to nearest remnant vegetation (km)", + "date_generated" = as.character(Sys.time()), + "crs" = as.character(crs(multiband_raster)) + ) multiband_raster } diff --git a/_targets.R b/_targets.R index 3efc487a..79a1a88b 100644 --- a/_targets.R +++ b/_targets.R @@ -42,11 +42,12 @@ library(filelock)#,lib.loc=Sys.getenv("R_LIBS_USER")) tar_option_set( packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", "appeears", "terra")) - +terraOptions(tempdir = "data/temp/terra", memfrac = 0.6) geotargets_option_set( - gdal_raster_driver = "netCDF", - gdal_raster_creation_options = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9"), - gdal_vector_driver = "GPKG" + gdal_raster_driver = "GTiff", + gdal_raster_creation_options = c("COMPRESS=DEFLATE", "ZLEVEL=9"), + gdal_vector_driver = "GPKG", + terra_preserve_metadata = "zip" # Preserve names() and units() through cache ) ## Authenticate with AppEEARS @@ -76,7 +77,7 @@ list( tar_terra_vect( country.gpkg, - national_boundary() + get_country() ), tar_terra_vect( @@ -84,34 +85,19 @@ list( domain_define(vegmap = vegmap_shp, country.gpkg) ), -tar_terra_rast( - domain.nc, - domain_rasterize(domain = domain.gpkg,remnants_shp) + # Domain raster with metadata (names and units preserved via terra_preserve_metadata = "zip") + tar_terra_rast( + domain.tif, + domain_rasterize(domain = domain.gpkg, remnants_shp) ), -tar_terra_rast( - vegmap.nc, - data_vegmap(domain.nc, vegmap_shp) + # Vegetation map raster with metadata + tar_terra_rast( + vegmap.tif, + data_vegmap(domain.tif, vegmap_shp) )#, # # # # Infrequent updates via releases - # 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, @@ -132,7 +118,7 @@ tar_terra_rast( # tar_target( # climate_chelsa_release, - # get_release_climate_chelsa(temp_directory = "data/temp/raw_data/climate_chelsa/", + # get_chelsa(temp_directory = "data/temp/raw_data/climate_chelsa/", # tag = "raw_static", # domain = domain) # )#, 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 From 6fac51f75c0c123c48558345caa802236a4020c2 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 14:48:58 -0500 Subject: [PATCH 37/58] Update .gitignore with additional patterns and cleanup Expanded .gitignore to include more R, RStudio, targets, data, secrets, and output file patterns. Cleaned up and reorganized entries for clarity and removed merge conflict markers. --- .gitignore | 100 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 57 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index f48db630..81a57d00 100644 --- a/.gitignore +++ b/.gitignore @@ -1,60 +1,74 @@ -# 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 + +# 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 -<<<<<<< HEAD +firemodel_predict + +# Image outputs img/*_files -img/*html -_targets/meta/meta -*.hdf -======= -#*/meta -img/network.html +img/*.html img/network* -scratch_code/*.json -scratch_code/!*.json.gpg -.secrets -secrets -secrets/ -secrets/* -secrets/*.json -secrets/!*.json.gpg -debugging_auth.R -*.json ->>>>>>> main + +# OS files +.DS_Store From f55bf030fa4d68efeb654836548c9285ca9a7bcc Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 14:49:11 -0500 Subject: [PATCH 38/58] Add new spatial data layers and update functions Introduces new shapefiles (remnants_shp, capenature_fires_shp), raster and NetCDF outputs (domain.tif, vegmap.tif, domain.nc, vegmap.nc), and updates or adds several functions and objects related to spatial data processing. Also updates metadata for country and domain layers, and removes the process_release_biome_raster function. --- _targets/meta/meta | 102 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 92 insertions(+), 10 deletions(-) diff --git a/_targets/meta/meta b/_targets/meta/meta index cc09df45..a2627162 100644 --- a/_targets/meta/meta +++ b/_targets/meta/meta @@ -3,15 +3,25 @@ correct_ndvi_dates_release_proj_and_extent|stem|49be87cd8aaf3e80|1d0f5f39ef47d1b remove_ee_backup|stem||befe0ca90eb2c488|2c530c1562a7fbd1|-773029837||t20458.6135575072s||0|rds|local|vector|||0.003||could not find function 'clean_up' vegmap_shp|stem|495c02a4c1083ae3|64fa0ae6793b59bf|2c530c1562a7fbd1|-979952299|data/manual_download/VEGMAP2018_AEA_16082019Final/NVM2018_AEA_V22_7_16082019_final.shp|t20445.6913461798s|s493121012b|493121012|file|local|vector|||0.026|| vegmap|stem|0c98d327f6beefbe|f82077cc150b71ed|774ecf7dbe3e5980|986433229||t20458.6208086331s|s141541376b|141541376|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||18.36|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)| -country|stem|598a2c51f10208d0|53feefadcddcbd52|7a9b46642a0f23a6|-430139696||t20458.6382681568s|s98304b|98304|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||22.279|PROJ: proj_identify: Cannot find proj.db (GDAL error 1). Error occurred in /Volumes/Builds/recipes/build/src/gdal-3.8.5/ogr/ogrsf_frmts/openfilegdb/filegdbtable.cpp at line 900 (GDAL error 1)| +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.064|| +country|stem|fb8900f4b7b88ca5|53feefadcddcbd52|80f7245c40a53951|-430139696||t20462.6945185888s|s4964352b|4964352|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||13.132|| +domain|stem|e6d498ad1ef6d5de|3b892a93e2976da1|079d4f875c5b950e|-103757746||t20462.6947265009s|s3072000b|3072000|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||17.511|| +process_release_biome_raster|function|a0b27b083f7ed85e +domain_raster|stem|f326af31f3a5d493|ff3f8f4fb81299ee|f6d4e813438fd81c|1482803489||t20462.7181557878s|s202093691b|202093691|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IE5VTEwpLCAKICAgICAgICBsaXN0KCkpKQp9&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1520.736|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). [rast] unknown extent| +vegmap_raster|stem||7c1fa6d4fe95368b|ea12d674ae33b1c9|1016620066||t20462.7183129309s||0|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IE5VTEwpLCAKICAgICAgICBsaXN0KCkpKQp9&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||13.393||crs not found: is it missing? +climate_chelsa_release|stem|88f9252bc7d9ed1a|4c496a15fe2faf91|97208ffa76a10d39|-670781068||t20461.8983898142s||81|rds|local|vector|||7.083|Failed to create release: 'raw_static' already exists!|object 'domain' not found +country.gpkg|stem|c722efec868fe851|53feefadcddcbd52|80f7245c40a53951|728599321||t20462.7366079847s|s4964352b|4964352|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||12.191|| +domain.gpkg|stem|4b6f1df83658fdde|d071234244cc8a00|36f02d5ec48f881e|105859277||t20462.7434722827s|s3072000b|3072000|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||17.599|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)| +domain.nc|stem|314f0006ad321020|f4caf66b195bedfe|7d2ec7c5e07cf5d8|797368847||t20462.7618461726s|s3623507b|3623507|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IGMoIkZPUk1BVD1OQzQiLCAKICAgICAgICAiQ09NUFJFU1M9REVGTEFURSIsICJaTEVWRUw9OSIpKSwgbGlzdCgpKSkKfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1585.126|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). [writeRaster] consider writeCDF to write ncdf files| +vegmap.nc|stem||f1094a5facfce02e|98fce78e25b3b6cb|-1931934530||t20462.7644244077s||0|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IGMoIkZPUk1BVD1OQzQiLCAKICAgICAgICAiQ09NUFJFU1M9REVGTEFURSIsICJaTEVWRUw9OSIpKSwgbGlzdCgpKSkKfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||222.555|attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1)|[==] raster has no values domain_map|function|9b57e91e94d73101 -rstoken|object|6dc8d7df7129e26b +rstoken|object|8a5100a24851eef6 robust_pb_download_solo|function|d148e32c5f7beb8f fit_model|function|8f8e281853bbef05 process_dynamic_data_to_parquet|function|49f8abfce5758803 clean_data|function|860451632161bcc2 -national_boundary|function|3c354daa2fdf282b -domain_rasterize|function|29d78831857df164 +national_boundary|function|8e86fb14d36f5061 +domain_rasterize|function|440cf8a14918d503 robust_download_file|function|2ea70b1df9a469fc verbose|object|988c41ba10911dc8 kr_pwd|object|b61b0b830c8b3de2 @@ -19,14 +29,16 @@ get_release_precipitation_chelsa|function|e5a54d4f8a475a6c summarize_posteriors|function|848f748de452ef0d robust_pb_upload|function|bf296132f5183235 get_domain|function|73c97bc96bfedda4 -.Random.seed|object|befb0e4a3b4f41b9 +.Random.seed|object|1bb5f1a7b0bb6e39 tag|object|64ff18d09ad298f3 earthdata_user|object|a72c4475a256a3c1 +sys_info|object|ada53e2071fe586e max_layers|object|08d5f59e833de599 existing_kr|object|1bb3bf184f7669e1 get_alos_data|function|75cf21dd60609648 process_fix_modis_projection|function|08e12464ac799094 group_data_function|function|3e4778f64d247976 +data_vegmap|function|b1daf0507f348162 domain_distance|function|939a115603a9b4df get_release_soil_gcfr|function|a0922c0000fe3eac get_release_ndvi_viirs_appeears|function|e0bb04ad860b66e9 @@ -38,7 +50,7 @@ robust_max|function|6d27abe569a34028 get_release_landcover_za|function|9ece1e5f946d7a70 get_vegmap|function|8590caba91b9be39 get_release_fire_modis_appeears|function|9992a7da9cc6cf78 -domain_define|function|a47d5ecfec78a568 +domain_define|function|81c8649b7bee00f6 kr_name|object|643fa3c4a8310651 temp_directory|object|40d122f36d50a344 domain_remnants|function|4c6497b244bdbc02 @@ -50,8 +62,8 @@ get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 get_release_elevation_nasadem|function|0404b4ce37dd6a41 robust_min|function|21d2e9972a741573 robust_pb_download|function|4df763e84d88eae4 -get_release_clouds_wilson|function|810ed2ec5c642649 -get_release_climate_chelsa|function|4a50043c539c8eeb +get_release_clouds_wilson|function|76923df0f19c017f +get_release_climate_chelsa|function|f63060c4751e6183 get_release_alos|function|3d0bd84374208048 process_release_precipitation_chelsa|function|d0ff995578684615 domain_remnants_release|function|d06ba69c89670801 @@ -63,7 +75,6 @@ process_release_elevation_nasadem|function|73c3236559d7c4cc process_release_alos|function|d1225f8b3a3fa4da domain_distance_release|function|c9d2a5f3c74dfc11 process_release_soil_gcfr|function|51a95877cbbd87c2 -process_release_biome_raster|function|a0b27b083f7ed85e process_release_protected_area_distance|function|4ded7cf04ce267a2 process_release_climate_chelsa|function|bbaf017bff9aa203 process_release_fire_doy_to_unix_date|function|4ed8b31bf3143599 @@ -74,4 +85,75 @@ 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|stem||3b892a93e2976da1|5996787d2119be31|-103757746||t20458.6377718343s||0|rds|local|vector|||0.003||no applicable method for 'filter' applied to an object of class 'SpatVector' +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.074|| +domain.tif|stem|e51bb36f9f6f3a70|f4caf66b195bedfe|df22595d26cedbec|1539589734||t20462.8142474563s|s6091277b|6091277|format_custom&read=ewogICAgdG1wIDwtIHRlbXBkaXIoKQogICAgemlwOjp1bnppcCh6aXBmaWxlID0gcGF0aCwgZXhkaXIgPSB0bXApCiAgICB0ZXJyYTo6cmFzdChmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkpCn0&write=ewogICAgdG1wIDwtIHdpdGhyOjpsb2NhbF90ZW1wZGlyKCkKICAgIHJhc3Rlcl90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkKICAgIHppcF90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCAib2JqZWN0LnppcCIpCiAgICBkby5jYWxsKHRlcnJhOjp3cml0ZVJhc3RlciwgYyhsaXN0KHggPSBvYmplY3QsIGZpbGVuYW1lID0gcmFzdGVyX3RtcF9maWxlLCAKICAgICAgICBmaWxldHlwZSA9ICJHVGlmZiIsIG92ZXJ3cml0ZSA9IFRSVUUsIGdkYWwgPSBjKCJDT01QUkVTUz1ERUZMQVRFIiwgCiAgICAgICAgIlpMRVZFTD05IikpLCBsaXN0KCkpKQogICAgcmFzdGVyX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHRtcCwgZnVsbC5uYW1lcyA9IFRSVUUpCiAgICB6aXA6OnppcCh6aXBmaWxlID0gemlwX3RtcF9maWxlLCBmaWxlcyA9IHJhc3Rlcl9maWxlcywgY29tcHJlc3Npb25fbGV2ZWwgPSAxLCAKICAgICAgICBtb2RlID0gImNoZXJyeS1waWNrIiwgcm9vdCA9IHRtcCkKICAgIGZpbGUuY29weSh6aXBfdG1wX2ZpbGUsIHBhdGgpCn0&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1370.939|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1)| +vegmap.tif|stem||ba090534dd7ca5ef|9c77befa3fc97dcc|-1280618250||t20462.816821373s||0|format_custom&read=ewogICAgdG1wIDwtIHRlbXBkaXIoKQogICAgemlwOjp1bnppcCh6aXBmaWxlID0gcGF0aCwgZXhkaXIgPSB0bXApCiAgICB0ZXJyYTo6cmFzdChmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkpCn0&write=ewogICAgdG1wIDwtIHdpdGhyOjpsb2NhbF90ZW1wZGlyKCkKICAgIHJhc3Rlcl90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkKICAgIHppcF90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCAib2JqZWN0LnppcCIpCiAgICBkby5jYWxsKHRlcnJhOjp3cml0ZVJhc3RlciwgYyhsaXN0KHggPSBvYmplY3QsIGZpbGVuYW1lID0gcmFzdGVyX3RtcF9maWxlLCAKICAgICAgICBmaWxldHlwZSA9ICJHVGlmZiIsIG92ZXJ3cml0ZSA9IFRSVUUsIGdkYWwgPSBjKCJDT01QUkVTUz1ERUZMQVRFIiwgCiAgICAgICAgIlpMRVZFTD05IikpLCBsaXN0KCkpKQogICAgcmFzdGVyX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHRtcCwgZnVsbC5uYW1lcyA9IFRSVUUpCiAgICB6aXA6OnppcCh6aXBmaWxlID0gemlwX3RtcF9maWxlLCBmaWxlcyA9IHJhc3Rlcl9maWxlcywgY29tcHJlc3Npb25fbGV2ZWwgPSAxLCAKICAgICAgICBtb2RlID0gImNoZXJyeS1waWNrIiwgcm9vdCA9IHRtcCkKICAgIGZpbGUuY29weSh6aXBfdG1wX2ZpbGUsIHBhdGgpCn0&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||222.265|attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)|[==] raster has no values +domain_map|function|9b57e91e94d73101 +rstoken|object|8a5100a24851eef6 +robust_pb_download_solo|function|d148e32c5f7beb8f +fit_model|function|8f8e281853bbef05 +process_dynamic_data_to_parquet|function|49f8abfce5758803 +clean_data|function|860451632161bcc2 +domain_rasterize|function|440cf8a14918d503 +robust_download_file|function|2ea70b1df9a469fc +verbose|object|988c41ba10911dc8 +kr_pwd|object|b61b0b830c8b3de2 +get_release_precipitation_chelsa|function|e5a54d4f8a475a6c +summarize_posteriors|function|848f748de452ef0d +robust_pb_upload|function|bf296132f5183235 +.Random.seed|object|1533272c03bd0130 +tag|object|64ff18d09ad298f3 +earthdata_user|object|a72c4475a256a3c1 +sys_info|object|ada53e2071fe586e +max_layers|object|08d5f59e833de599 +get_country|function|8e86fb14d36f5061 +existing_kr|object|1bb3bf184f7669e1 +get_alos_data|function|75cf21dd60609648 +process_fix_modis_projection|function|08e12464ac799094 +group_data_function|function|3e4778f64d247976 +data_vegmap|function|b1daf0507f348162 +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 +robust_max|function|6d27abe569a34028 +get_release_landcover_za|function|9ece1e5f946d7a70 +get_vegmap|function|8590caba91b9be39 +get_release_fire_modis_appeears|function|9992a7da9cc6cf78 +domain_define|function|81c8649b7bee00f6 +kr_name|object|643fa3c4a8310651 +temp_directory|object|40d122f36d50a344 +earthdata_pass|object|b61b0b830c8b3de2 +update_git|function|8d72fa6c21b94951 +sleep_time|object|9f0cda529028d8d9 +get_model_data|function|dc3148c05e8961ed +get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 +get_release_elevation_nasadem|function|0404b4ce37dd6a41 +robust_min|function|21d2e9972a741573 +robust_pb_download|function|4df763e84d88eae4 +get_release_clouds_wilson|function|76923df0f19c017f +get_chelsa|function|f63060c4751e6183 +get_release_climate_chelsa|function|f63060c4751e6183 +get_release_alos|function|3d0bd84374208048 +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_alos|function|d1225f8b3a3fa4da +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 +country.gpkg|stem|c986d4ad66c0a65e|81ddbcfc163d4096|b233eb6ed97aaec2|728599321||t20462.8195868714s|s4964352b|4964352|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||13.608|| +domain.gpkg|stem|3752155dbbfebdfc|d071234244cc8a00|c3152e2a22ed6a1e|105859277||t20462.8197902732s|s3072000b|3072000|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||17.522|| From f5835e927a422a46de058dae97b8edc30bf2d88e Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 9 Jan 2026 15:25:54 -0500 Subject: [PATCH 39/58] update distance calculation --- R/domain_rasterize.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/R/domain_rasterize.R b/R/domain_rasterize.R index d885bba7..920735df 100644 --- a/R/domain_rasterize.R +++ b/R/domain_rasterize.R @@ -26,6 +26,8 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250) { remnants <- st_read(remnants_shp) %>% janitor::clean_names() %>% st_transform(crs = crs(domain)) %>% + st_intersection(st_as_sfc(st_bbox(domain)))|> #crop to domain box + st_union() %>% st_make_valid() @@ -36,7 +38,8 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250) { y = domain_raster, field = "remnant", touches = T, - cover = T) + cover = T)|> + terra::mask(domain_raster) remnants_distance <- remnants_raster |> terra::app(fun=function(x) ifelse(is.na(x),0,1)) |> From b29b1ea86f0bfeb5feec203a5946a80e0343d0df Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Mon, 12 Jan 2026 11:47:54 -0500 Subject: [PATCH 40/58] Enhance workflow: rename step and add error handling for targets pipeline --- .github/workflows/targets.yaml | 72 +++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index c1a14035..a0997f80 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -84,7 +84,7 @@ jobs: path: _targets/ key: targets-${{ hashFiles('_targets.R', 'R/**') }} restore-keys: targets- - - name: Run targets pt 2 + - name: Run targets pipeline run: | targets::tar_make() shell: Rscript {0} @@ -142,3 +142,73 @@ jobs: with: name: ${{ runner.os }}-results path: . + + - name: Create review PR on failure + if: failure() && github.event_name == 'push' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # 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 + + 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,auto-generated" + + - 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 + + 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 From ec8f4460120acc0281ae183dec3b483d7a040279 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Mon, 12 Jan 2026 13:28:59 -0500 Subject: [PATCH 41/58] Enhance data processing workflows: add error handling to targets pipeline, update country and domain functions to write GeoParquet, and refactor elevation data retrieval with AppEEARS --- .github/workflows/targets.yaml | 18 +- R/data_country.R | 11 +- R/domain_bbox.R | 16 ++ R/domain_define.R | 61 +++--- R/domain_rasterize.R | 110 ++++++----- R/get_release_elevation_nasadem_appears.R | 224 ++++++++++------------ _targets.R | 71 ++++--- 7 files changed, 275 insertions(+), 236 deletions(-) create mode 100644 R/domain_bbox.R diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index a0997f80..3f055743 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -86,14 +86,9 @@ jobs: restore-keys: targets- - name: Run targets pipeline run: | - targets::tar_make() - shell: Rscript {0} - - - name: Update README - run: | - webshot::install_phantomjs() - knitr::knit("README.Rmd") - shell: Rscript {0} + Rscript -e "targets::tar_make()" 2>&1 | tee targets-output.log || echo "tar_make failed, see log above" + shell: bash + continue-on-error: true - name: Export final data products to releases if: github.ref == 'refs/heads/main' @@ -148,6 +143,10 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | + # 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 @@ -201,6 +200,9 @@ jobs: 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 diff --git a/R/data_country.R b/R/data_country.R index 7913703c..bcd819ec 100644 --- a/R/data_country.R +++ b/R/data_country.R @@ -17,13 +17,16 @@ get_country <- function(){ download.file(url,destfile = tmpfile1) unzip(tmpfile1,exdir=tmpdir1) - # Read the converted GeoJSON, union, and convert to SpatVector + # 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() |> - vect() + st_as_sf() - return(country) + # Write to GeoParquet + out_file <- "data/raw/country.parquet" + sfarrow::st_write_parquet(country, out_file) + + return(out_file) } # end function diff --git a/R/domain_bbox.R b/R/domain_bbox.R new file mode 100644 index 00000000..71f82d96 --- /dev/null +++ b/R/domain_bbox.R @@ -0,0 +1,16 @@ +# 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/raw/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) + sfarrow::st_write_parquet(bbox_sf, out_file) + out_file +} diff --git a/R/domain_define.R b/R/domain_define.R index 5e4da0a6..33234e52 100644 --- a/R/domain_define.R +++ b/R/domain_define.R @@ -1,54 +1,47 @@ -# Make Domain +# Define buffered project 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 buffer size of domain buffer (in m) +#' @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. domain_define <- function(vegmap_shp, country){ - biomes = c("Fynbos","Succulent Karoo")#,"Albany Thicket") + # 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=st_read(vegmap_shp) %>% janitor::clean_names() %>% - filter(biome_18 %in% biomes ) %>% #filter to list above + 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) - -# Further clean up the buffered domain -# library(smoothr) -# vegmap_buffer <- vegmap_union %>% -# fill_holes(set_units(100, km^2))|> -# # st_simplify(dTolerance=500) %>% -# drop_crumbs(set_units(100, km^2)) |> -# smooth(method = "chaikin", refinements = 5) # or method = "ksmooth" -# st_buffer(1000000)|> -# # st_buffer(-1000000) |> -# st_simplify(dTolerance=100)|> -# st_make_valid() - - + +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)) + st_transform(crs=st_crs(vegmap_buffer)) %>% + st_buffer(500) # small buffer to fix potential topology issues domain <- vegmap_buffer %>% st_intersection(st_transform(country,crs=st_crs(vegmap_union))) %>% #only keep land areas of buffer - no ocean st_as_sf() %>% - mutate(domain=1) |> - vect() - + mutate(domain=1) - 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_rasterize.R b/R/domain_rasterize.R index 920735df..6d570f55 100644 --- a/R/domain_rasterize.R +++ b/R/domain_rasterize.R @@ -1,14 +1,17 @@ -# 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 - -#' @param domain vector file of study domain -#' @param dx x resolution -#' @param dy y resolution - -domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250) { +domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file = "data/raw/domain.nc") { # Generate raster version of domain domain_template <- st_as_stars(st_bbox(domain), dx = dx, dy = dy) @@ -26,7 +29,7 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250) { remnants <- st_read(remnants_shp) %>% janitor::clean_names() %>% st_transform(crs = crs(domain)) %>% - st_intersection(st_as_sfc(st_bbox(domain)))|> #crop to domain box + st_crop(st_as_sfc(st_bbox(domain)))|> #crop to domain box st_union() %>% st_make_valid() @@ -45,8 +48,6 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250) { terra::app(fun=function(x) ifelse(is.na(x),0,1)) |> terra::gridDist(target=1)/1000 - - # Create pixel ID raster: 1:ncell where domain=1, NA elsewhere pid_raster <- domain_raster pid_values <- rep(NA, ncell(pid_raster)) @@ -54,39 +55,56 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250) { pid_values[domain_cells] <- seq_along(domain_cells) values(pid_raster) <- pid_values - # Combine into multiband raster - multiband_raster <- c(domain_raster, pid_raster, remnants_raster, remnants_distance) - - # Set layer names - names(multiband_raster) <- c("domain", "pid", "remnants", "remnants_distance") - - # Set units (preserved through cache with terra_preserve_metadata = "zip") - units(multiband_raster) <- c("dimensionless", "1", "dimensionless", "kilometers") - - # Add metadata using metags (preserved in GeoTIFF) - metags(multiband_raster) <- c( - "domain_long_name" = "Domain mask (1 = in domain, NA = outside)", - "pid_long_name" = "Pixel ID for domain grid cells", - "remnants_long_name" = "Remnant vegetation indicator (1 = remnant, NA = not remnant)", - "remnants_distance_long_name" = "Distance to nearest remnant vegetation (km)", - "date_generated" = as.character(Sys.time()), - "crs" = as.character(crs(multiband_raster)) + # Prepare layers and units for per-variable write + layers <- list( + domain = domain_raster, + pid = pid_raster, + remnants = remnants_raster, + remnants_distance = remnants_distance ) - - multiband_raster -} - - - -# library(geoarrow) -# # Convert raster stack to points -# domain_points <- terra::as.points(domain_raster)|> -# sf::st_as_sf() |> -# filter(domain==1) - -# # Write GeoParquet -# arrow::write_parquet(domain_points, "domain.parquet") - - - - + units(layers$domain) <- "dimensionless" + units(layers$pid) <- "dimensionless" + units(layers$remnants) <- "dimensionless" + units(layers$remnants_distance) <- "kilometers" + + # Write each variable separately to NetCDF with maximum compression + terra::writeCDF( + layers$domain, + filename = out_file, + varname = "domain", + overwrite = TRUE, + gdal = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9", "SHUFFLE=YES") + ) + terra::writeCDF(layers$pid, filename = out_file, varname = "pid", overwrite = FALSE, append = TRUE, + gdal = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9", "SHUFFLE=YES")) + terra::writeCDF(layers$remnants, filename = out_file, varname = "remnants", overwrite = FALSE, append = TRUE, + gdal = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9", "SHUFFLE=YES")) + terra::writeCDF(layers$remnants_distance, filename = out_file, varname = "remnants_distance", overwrite = FALSE, append = TRUE, + gdal = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9", "SHUFFLE=YES")) + + # Add detailed CF-style metadata via ncdf4 + nc <- ncdf4::nc_open(out_file, write = TRUE) + on.exit(ncdf4::nc_close(nc), add = TRUE) + + # 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, "crs", as.character(crs(domain_raster))) + ncdf4::ncatt_put(nc, 0, "Conventions", "CF-1.8") + + # Variable-specific attributes + attr_map <- list( + domain = list(long_name = "Domain mask (1 = in domain, NA = outside)", units = "dimensionless"), + pid = list(long_name = "Pixel ID for domain grid cells", units = "1"), + remnants = list(long_name = "Remnant vegetation indicator (1 = remnant, NA = not remnant)", units = "dimensionless"), + remnants_distance = list(long_name = "Distance to nearest remnant vegetation", units = "kilometers") + ) + for (v in names(attr_map)) { + if (v %in% names(nc$var)) { + ncdf4::ncatt_put(nc, v, "long_name", attr_map[[v]]$long_name) + ncdf4::ncatt_put(nc, v, "units", attr_map[[v]]$units) + } + } + + out_file +} \ No newline at end of file diff --git a/R/get_release_elevation_nasadem_appears.R b/R/get_release_elevation_nasadem_appears.R index bd48848e..4d37aae6 100644 --- a/R/get_release_elevation_nasadem_appears.R +++ b/R/get_release_elevation_nasadem_appears.R @@ -1,142 +1,122 @@ -#Code for extracting elevation data from google earth engine - -#' @author Brian Maitner -#' @description This function will download NASADEM elevation data if it isn't present, and (invisibly) return a NULL if it is present -#' @import rgee -#' @param directory directory to save data in. Defaults to "data/raw_data/elevation_nasadem/" -#' @param domain domain (spatialpolygons* object) used for masking -get_release_elevation_nasadem <- function(temp_directory = "data/temp/raw_data/elevation_nasadem/", - tag = "raw_static", - domain){ - - API_URL = 'https://appeears.earthdatacloud.nasa.gov/api/' - - - # Make a directory if one doesn't exist yet - - if(!dir.exists(temp_directory)){ - dir.create(temp_directory,recursive = TRUE) +#' @title Download NASADEM elevation via AppEEARS and resample to domain +#' @description Submits an AppEEARS area request for NASADEM elevation data +#' over the provided domain polygon, downloads, and resamples to domain grid. +#' @author EMMA Team +#' @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 temp_directory Temporary working directory for downloads +#' @param verbose Logical for progress messages +#' @return SpatRaster with elevation resampled to domain, with metadata + +get_release_elevation_nasadem_appears <- function( + domain_vector, + domain_raster, + temp_directory = "data/temp/raw_data/elevation_nasadem/", + verbose = TRUE +) { + + # Package checks + required_pkgs <- c("appeears", "terra", "sf", "lubridate", "jsonlite") + missing <- required_pkgs[!sapply(required_pkgs, requireNamespace, quietly = TRUE)] + if (length(missing)) { + stop("Required packages missing: ", paste(missing, collapse = ", ")) } - - library(sf) - library(httr) - library(jsonlite) - library(lubridate) - - # Helper to read .netrc credentials - read_netrc <- function(machine = "appeears.earthdatacloud.nasa.gov", netrc_path = "~/.netrc") { - lines <- readLines(path.expand(netrc_path)) - start <- grep(paste("machine", machine), lines) - if (length(start) == 0) stop("Machine not found in .netrc") - chunk <- lines[start:min(start+2, length(lines))] - login <- sub(".*login\\s+", "", grep("login", chunk, value = TRUE)) - password <- sub(".*password\\s+", "", grep("password", chunk, value = TRUE)) - list(username = login, password = password) + # Ensure clean temp directory + if (dir.exists(temp_directory)) { + unlink(temp_directory, recursive = TRUE, force = TRUE) } - - download_nasadem_nc_from_sf <- function(aoi_sf, out_file = "nasadem.nc", netrc_path = "~/.netrc") { - # Authenticate using .netrc file - auth_response <- POST( - url = "https://appeears.earthdatacloud.nasa.gov/api/login", - #config = httr::config(netrc = TRUE, netrc_file = "~/.netrc"), - set_cookies("LC" = "cookies") + 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) + + # Convert domain vector to sf and reproject to WGS84 (required by AppEEARS) + domain_sf <- st_as_sf(domain_vector) + domain_wgs84 <- st_transform(domain_sf, crs = 4326) + + # Write to GeoJSON and read back as plain list (avoids geo_list serialization issues) + aoi_path <- file.path(temp_directory, "aoi.geojson") + suppressWarnings(sf::st_write(domain_wgs84, aoi_path, driver = "GeoJSON", delete_dsn = TRUE, quiet = TRUE)) + aoi_json <- jsonlite::read_json(aoi_path, simplifyVector = FALSE) + + if (verbose) message("Submitting AppEEARS NASADEM request over domain polygon") + + # Build AppEEARS request + req <- list( + task_type = "area", + task_name = paste0("NASADEM_", format(Sys.time(), "%Y%m%d%H%M%S")), + params = list( + dates = list(start = "2000-02-11", end = "2000-02-11"), # NASADEM static date + layers = list( + list(product = "NASADEM_HGT.001", layer = "NASADEM_HGT") + ), + output = list(format = "netcdf4", projection = "native"), + geo = aoi_json ) - str(auth_response) - - response <- GET(files[i], write_disk(filename, overwrite = TRUE), progress(), - config(netrc = TRUE, netrc_file = netrc), set_cookies("LC" = "cookies")) - - - response <- httr::POST( - url = "https://appeears.earthdatacloud.nasa.gov/api/task", - body = jsonlite::toJSON(request_body, auto_unbox = TRUE), - config = httr::config(netrc = TRUE, netrc_file = "~/.netrc"), - httr::content_type_json() -) - - if (status_code(auth_response) != 200) { - stop("Authentication failed. Check your .netrc file.") - } + ) - token <- content(auth_response)$token + # Submit and poll for completion + task <- appeears::rs_request(request = req, user= Sys.getenv("EARTHDATA_USER")) + if (verbose) message("Submitted AppEEARS task: ", task$task_id) - # Transform AOI to WGS84 if needed - if (sf::st_crs(aoi_sf)$epsg != 4326) { - aoi_sf <- sf::st_transform(aoi_sf, crs = 4326) + 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. Status: ", st$status) } + Sys.sleep(30) + if (verbose) message("Waiting... status: ", st$status) + } - # Extract coordinates - coords <- st_coordinates(st_geometry(st_union(aoi_sf)))[, 1:2] - coords <- as.matrix(coords) - coords <- coords[!duplicated(coords), ] - coords_list <- lapply(seq_len(nrow(coords)), function(i) unname(as.numeric(coords[i, ]))) - - # Close polygon if needed - if (!all.equal(coords_list[[1]], coords_list[[length(coords_list)]])) { - coords_list[[length(coords_list) + 1]] <- coords_list[[1]] - } + # Download results + 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) + } - # Build request - request_body <- list( - task_type = "area", - task_name = paste0("NASADEM_", Sys.Date()), - params = list( - dates = list(list(startDate = "2020-01-01", endDate = "2020-01-01")), - layers = list(list(layer = "NASADEM-HGT", product = "NASADEM_HGT.001")), - output = list(format = "netCDF4"), - geo = list( - type = "Feature", - properties = new.env(), - geometry = list( - type = "Polygon", - coordinates = list(coords_list) - ) - ) - ) - ) + # 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") + } - # Submit task - submit_response <- POST( - url = "https://appeears.earthdatacloud.nasa.gov/api/task", - body = toJSON(request_body, auto_unbox = TRUE), - add_headers(Authorization = paste("Bearer", token)), - content_type_json() - ) + if (verbose) message("Reading elevation data from: ", nc_paths[1]) + elev_raster <- terra::rast(nc_paths[1]) - if (status_code(submit_response) != 200) { - stop("Failed to submit task.") - } + # Resample to domain grid using bilinear interpolation + if (verbose) message("Resampling elevation to domain grid") + elev_resampled <- terra::resample(elev_raster, domain_raster, method = "bilinear") - task_id <- content(submit_response)$task_id - message("Task submitted: ", task_id) - - # Poll for completion - repeat { - Sys.sleep(10) - status_response <- GET(paste0("https://appeears.earthdatacloud.nasa.gov/api/status/", task_id), - add_headers(Authorization = paste("Bearer", token))) - status <- content(status_response)$status - message("Task status: ", status) - if (status == "done") break - if (status == "failed") stop("Task failed.") - } + # Mask to domain (NA where domain is NA) + elev_masked <- terra::mask(elev_resampled, domain_raster) - # Get download URL - bundle_response <- GET(paste0("https://appeears.earthdatacloud.nasa.gov/api/bundle/", task_id), - add_headers(Authorization = paste("Bearer", token))) - files <- content(bundle_response)$files - nc_file_url <- files[[which(sapply(files, function(f) grepl("\\.nc$", f$file_name)))]]$url + # Set metadata + names(elev_masked) <- "elevation" + units(elev_masked) <- "meters" - # Download the file - GET(nc_file_url, write_disk(out_file, overwrite = TRUE), - add_headers(Authorization = paste("Bearer", token))) + metags(elev_masked) <- c( + "elevation_long_name" = "NASADEM elevation above mean sea level", + "elevation_source" = "NASADEM_HGT.001 via AppEEARS", + "date_generated" = as.character(Sys.time()), + "crs" = as.character(crs(elev_masked)), + "Conventions" = "CF-1.8" + ) - message("Download complete: ", out_file) - } + # Cleanup + unlink(temp_directory, recursive = TRUE, force = TRUE) + gc() + unlink(terra_tmp, recursive = TRUE, force = TRUE) + if (verbose) message("Elevation data ready") + elev_masked +} -}#end fx diff --git a/_targets.R b/_targets.R index 79a1a88b..523b337f 100644 --- a/_targets.R +++ b/_targets.R @@ -27,10 +27,6 @@ library(filelock)#,lib.loc=Sys.getenv("R_LIBS_USER")) #If running this locally, make sure to set up github credentials using gitcreds::gitcreds_set() -# 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) @@ -41,24 +37,37 @@ library(filelock)#,lib.loc=Sys.getenv("R_LIBS_USER")) tar_option_set( packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", - "appeears", "terra")) + "appeears", "terra", "smoothr", "janitor", "sfarrow", "jsonlite")) + + terraOptions(tempdir = "data/temp/terra", memfrac = 0.6) geotargets_option_set( - gdal_raster_driver = "GTiff", - gdal_raster_creation_options = c("COMPRESS=DEFLATE", "ZLEVEL=9"), - gdal_vector_driver = "GPKG", - terra_preserve_metadata = "zip" # Preserve names() and units() through cache + gdal_raster_driver = "netCDF", + gdal_raster_creation_options = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9"), + gdal_vector_driver = "GPKG" ) ## Authenticate with AppEEARS source("R/appeears_auth.R") +# Ensure output directories exist +dir.create("data/raw", recursive = TRUE, showWarnings = FALSE) +dir.create("data/temp", recursive = TRUE, showWarnings = FALSE) +dir.create("data/releases", recursive = TRUE, showWarnings = FALSE) + + +# 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")) + + list( # #Prep needed files # start 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", + "data/manual_download/NVM2024/NVM2024Final_IEM5_12_07012025.shp", format = "file" ), @@ -75,26 +84,44 @@ list( ), - tar_terra_vect( - country.gpkg, - get_country() + tar_target( + country.parquet, + get_country(), + format = "file" ), - tar_terra_vect( - domain.gpkg, - domain_define(vegmap = vegmap_shp, country.gpkg) + tar_target( + domain.parquet, + domain_define(vegmap = vegmap_shp, country = country.parquet), + format = "file" ), - # Domain raster with metadata (names and units preserved via terra_preserve_metadata = "zip") - tar_terra_rast( - domain.tif, - domain_rasterize(domain = domain.gpkg, remnants_shp) + # Stable bounding box for downloads (50km buffer around domain) + # Never re-downloads unless manually invalidated, even if analysis domain changes + tar_target( + domain_bbox.parquet, + make_domain_bbox(domain.parquet, buffer_m = 50000), + format = "file", + cue = tar_cue(mode = "never") # Never re-download RS data unless manually invalidated - changes in domain.parquet won't affect this. + ), + + # Domain raster with pixel IDs, remnants, and distance to remnants (NetCDF with CF-1.8 metadata) + tar_target( + domain_nc, + domain_rasterize( + domain = sfarrow::st_read_parquet(domain.parquet), + remnants_shp = remnants_shp, + out_file = "data/raw/domain.nc" + ), + format = "file", + cue = tar_cue(mode = "never") #slow - restrict to manual updates ), # Vegetation map raster with metadata tar_terra_rast( - vegmap.tif, - data_vegmap(domain.tif, vegmap_shp) + vegmap.nc, + data_vegmap(domain_raster = terra::rast(domain_nc), vegmap_shp), + filetype = "netCDF" )#, # # # # Infrequent updates via releases From 24f166a929f209323fbe35103d77ddf6814b4624 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Mon, 12 Jan 2026 14:08:13 -0500 Subject: [PATCH 42/58] Add functions to download and process vegetation map, including metadata handling and NetCDF output --- R/data_vegmap.R | 45 ++++++++++++++++++++++++++++--------- R/domain_rasterize.R | 5 +++-- R/download_vegmap_release.R | 31 +++++++++++++++++++++++++ _targets.R | 13 +++++++---- 4 files changed, 77 insertions(+), 17 deletions(-) create mode 100644 R/download_vegmap_release.R diff --git a/R/data_vegmap.R b/R/data_vegmap.R index 33214f1d..6f2c71cf 100644 --- a/R/data_vegmap.R +++ b/R/data_vegmap.R @@ -44,17 +44,40 @@ data_vegmap <- function(domain_raster, vegmap_shp, disagg_factor = 10) { dplyr::rename(vegbiome = biomeid_18, vegbioregion = brgnid_18, vegtype = vegtype_id) %>% dplyr::distinct() - # Add metadata using metags (preserved in GeoTIFF) - metags(multiband) <- c( - "lookup_table_json" = jsonlite::toJSON(lookup_tbl, dataframe = "rows", auto_unbox = TRUE), - "vegbiome_long_name" = "Biome ID (biomeid_18)", - "vegbioregion_long_name" = "Bioregion ID (brgnid_18)", - "vegtype_long_name" = "Vegetation type code (mapcode18)", - "date_generated" = as.character(Sys.time()), - "crs" = as.character(crs(multiband)), - "Conventions" = "CF-1.8" + # Create output file path + output_file <- "vegmap.nc" + + # Prepare metadata + metadata <- list( + title = "Vegetation Map - Biome, Bioregion, and Vegetation Type", + source = "South Africa National Vegetation Map 2024", + Conventions = "CF-1.8", + lookup_table_json = jsonlite::toJSON(lookup_tbl, dataframe = "rows", auto_unbox = TRUE), + vegbiome_long_name = "Biome ID (biomeid_18)", + vegbioregion_long_name = "Bioregion ID (brgnid_18)", + vegtype_long_name = "Vegetation type code (mapcode18)", + date_generated = as.character(Sys.time()), + crs = as.character(crs(multiband)), + ancillary_variables = "lookup_table" ) - - multiband + + # Write to NetCDF with metadata + terra::writeCDF( + x = multiband, + filename = output_file, + overwrite = TRUE, + varnames = c("vegbiome", "vegbioregion", "vegtype"), + longname = c("Biome ID (biomeid_18)", "Bioregion ID (brgnid_18)", "Vegetation type code (mapcode18)"), + unit = c("dimensionless", "dimensionless", "dimensionless") + ) + + # Add metadata to the NetCDF file using ncdf4 + nc <- ncdf4::nc_open(output_file, write = TRUE) + for (key in names(metadata)) { + ncdf4::ncatt_put(nc, 0, key, metadata[[key]]) + } + ncdf4::nc_close(nc) + + return(output_file) } diff --git a/R/domain_rasterize.R b/R/domain_rasterize.R index 6d570f55..dae46168 100644 --- a/R/domain_rasterize.R +++ b/R/domain_rasterize.R @@ -35,6 +35,7 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file remnants_raster <- remnants %>% + st_as_sf() |> mutate(remnant=1) %>% vect() %>% rasterize(x = ., @@ -42,7 +43,7 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file field = "remnant", touches = T, cover = T)|> - terra::mask(domain_raster) + terra::mask(mask=domain_raster) remnants_distance <- remnants_raster |> terra::app(fun=function(x) ifelse(is.na(x),0,1)) |> @@ -95,7 +96,7 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file # Variable-specific attributes attr_map <- list( domain = list(long_name = "Domain mask (1 = in domain, NA = outside)", units = "dimensionless"), - pid = list(long_name = "Pixel ID for domain grid cells", units = "1"), + pid = list(long_name = "Pixel ID for domain grid cells", units = "dimensionless"), remnants = list(long_name = "Remnant vegetation indicator (1 = remnant, NA = not remnant)", units = "dimensionless"), remnants_distance = list(long_name = "Distance to nearest remnant vegetation", units = "kilometers") ) diff --git a/R/download_vegmap_release.R b/R/download_vegmap_release.R new file mode 100644 index 00000000..0ee2fa70 --- /dev/null +++ b/R/download_vegmap_release.R @@ -0,0 +1,31 @@ +#' Download vegetation map release and return shapefile path +#' +#' Downloads a zipped vegetation map from a GitHub release, unzips it +#' into a local directory, and returns the path to the `.shp` file +#' for use in targets. +#' +#' @param release_url character. URL to the GitHub release asset (zip file). +#' @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 and extracted. +#' +#' +#' @importFrom utils download.file unzip +#' @export +download_vegmap_release <- function(release_url, local_dir, shapefile_name) { + dir.create(local_dir, recursive = TRUE, showWarnings = FALSE) + shp_file <- file.path(local_dir, shapefile_name) + if (!file.exists(shp_file)) { + zip_file <- file.path(local_dir, "vegmap.zip") + message("Downloading vegmap from GitHub release...") + utils::download.file(release_url, zip_file, mode = "wb") + message("Unzipping vegmap...") + utils::unzip(zip_file, exdir = local_dir) + unlink(zip_file) + } + stringr::str_replace(shp_file, "NVM2024/","NVM2024/shapefile/") # fixes path issue +} diff --git a/_targets.R b/_targets.R index 523b337f..d64c7482 100644 --- a/_targets.R +++ b/_targets.R @@ -66,9 +66,14 @@ list( # #Prep needed files # start tar_target( - vegmap_shp, # 2018 National Vegetation Map http://bgis.sanbi.org/SpatialDataset/Detail/1674 - "data/manual_download/NVM2024/NVM2024Final_IEM5_12_07012025.shp", - format = "file" + vegmap_shp, + download_vegmap_release( + release_url = "https://github.com/AdamWilsonLab/emma_envdata/releases/download/vegmap2024/NVM2024Final_IEM5_12_07012025.zip", + local_dir = "data/manual_download/NVM2024", + shapefile_name = "NVM2024Final_IEM5_12_07012025.shp" + ), + format = "file", + cue = tar_cue(mode = "never") ), tar_target( @@ -119,7 +124,7 @@ list( # Vegetation map raster with metadata tar_terra_rast( - vegmap.nc, + vegmap_nc, data_vegmap(domain_raster = terra::rast(domain_nc), vegmap_shp), filetype = "netCDF" )#, From 2c8398b508d91bf6abc7243340733858fdcf3ee1 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Mon, 12 Jan 2026 16:26:01 -0500 Subject: [PATCH 43/58] Update vegmap shapefile download and metadata; add new functions and data formats --- .gitignore | 2 + R/domain_rasterize.R | 3 +- R/download_vegmap_release.R | 27 ++++++--- R/get_release_elevation_nasadem_appears.R | 70 ++++++++++++++++------- _targets.R | 4 +- _targets/meta/meta | 60 ++++++++++--------- 6 files changed, 109 insertions(+), 57 deletions(-) diff --git a/.gitignore b/.gitignore index 81a57d00..73349e3b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,8 @@ data/temp/ data/other_data/ data/raw_data/ data/manual_download/*.gpkg +data/manual_download/NVM* +data/raw* # Terra auxiliary files (from terra_preserve_metadata) *.tif.aux.xml diff --git a/R/domain_rasterize.R b/R/domain_rasterize.R index dae46168..c85e5a5a 100644 --- a/R/domain_rasterize.R +++ b/R/domain_rasterize.R @@ -74,7 +74,8 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file filename = out_file, varname = "domain", overwrite = TRUE, - gdal = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9", "SHUFFLE=YES") + gdal = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9", "SHUFFLE=YES"), + overwrite=TRUE ) terra::writeCDF(layers$pid, filename = out_file, varname = "pid", overwrite = FALSE, append = TRUE, gdal = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9", "SHUFFLE=YES")) diff --git a/R/download_vegmap_release.R b/R/download_vegmap_release.R index 0ee2fa70..1722becb 100644 --- a/R/download_vegmap_release.R +++ b/R/download_vegmap_release.R @@ -1,29 +1,38 @@ #' Download vegetation map release and return shapefile path #' -#' Downloads a zipped vegetation map from a GitHub release, unzips it -#' into a local directory, and returns the path to the `.shp` file +#' 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 release_url character. URL to the GitHub release asset (zip file). +#' @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 and extracted. +#' is performed. Otherwise, the zip file is downloaded via piggyback and extracted. #' #' -#' @importFrom utils download.file unzip +#' @importFrom piggyback pb_download +#' @importFrom utils unzip #' @export -download_vegmap_release <- function(release_url, local_dir, shapefile_name) { +download_vegmap_release <- function(repo, tag, file, local_dir, shapefile_name) { dir.create(local_dir, recursive = TRUE, showWarnings = FALSE) shp_file <- file.path(local_dir, shapefile_name) if (!file.exists(shp_file)) { - zip_file <- file.path(local_dir, "vegmap.zip") - message("Downloading vegmap from GitHub release...") - utils::download.file(release_url, zip_file, mode = "wb") + 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...") + zip_file <- file.path(local_dir, file) utils::unzip(zip_file, exdir = local_dir) unlink(zip_file) } diff --git a/R/get_release_elevation_nasadem_appears.R b/R/get_release_elevation_nasadem_appears.R index 4d37aae6..bb35dc21 100644 --- a/R/get_release_elevation_nasadem_appears.R +++ b/R/get_release_elevation_nasadem_appears.R @@ -45,41 +45,71 @@ get_release_elevation_nasadem_appears <- function( if (verbose) message("Submitting AppEEARS NASADEM request over domain polygon") - # Build AppEEARS request + # 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(start = "2000-02-11", end = "2000-02-11"), # NASADEM static date - layers = list( - list(product = "NASADEM_HGT.001", layer = "NASADEM_HGT") + 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" ), - output = list(format = "netcdf4", projection = "native"), geo = aoi_json ) ) + # Convert request to JSON string (rs_request/task$download expect JSON text) + req_json <- jsonlite::toJSON(req, auto_unbox = TRUE) + # Submit and poll for completion - task <- appeears::rs_request(request = req, user= Sys.getenv("EARTHDATA_USER")) - if (verbose) message("Submitted AppEEARS task: ", task$task_id) + if (verbose) message("Submitting AppEEARS task...") + task <- appeears::rs_request( + request = req_json, + user = Sys.getenv("EARTHDATA_USER"), + path = temp_directory, + transfer = FALSE, + verbose = verbose + ) + + if (verbose) message("Task submitted: ", task$get_task_id()) + # Poll for completion using task object methods + max_retries <- 60 + retry_count <- 0 + 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. Status: ", st$status) + retry_count <- retry_count + 1 + task$update_status(verbose = FALSE) + + if (task$is_success()) { + if (verbose) message("Task completed successfully") + break + } + + if (task$is_failed()) { + stop("AppEEARS task failed") } - Sys.sleep(30) - if (verbose) message("Waiting... status: ", st$status) + + if (retry_count >= max_retries) { + stop("Task polling timed out after ", max_retries * 10, " seconds") + } + + if (verbose) message("Task status: ", task$get_status(), " (", retry_count, "/", max_retries, ")") + Sys.sleep(10) } # Download results - 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) - } - + if (verbose) message("Downloading files for task: ", task$get_task_id()) + task$download(verbose = verbose) + # Load the NetCDF file nc_paths <- list.files(temp_directory, pattern = "\\.nc$", full.names = TRUE, recursive = TRUE) if (length(nc_paths) == 0) { @@ -87,7 +117,7 @@ get_release_elevation_nasadem_appears <- function( } if (verbose) message("Reading elevation data from: ", nc_paths[1]) - elev_raster <- terra::rast(nc_paths[1]) + elev_raster <- terra::rast(nc_paths[grepl(nc_paths, pattern = "SRTMGL3_NC.003_90m_aid0001.nc")]) # Resample to domain grid using bilinear interpolation if (verbose) message("Resampling elevation to domain grid") diff --git a/_targets.R b/_targets.R index d64c7482..082ff395 100644 --- a/_targets.R +++ b/_targets.R @@ -68,7 +68,9 @@ list( tar_target( vegmap_shp, download_vegmap_release( - release_url = "https://github.com/AdamWilsonLab/emma_envdata/releases/download/vegmap2024/NVM2024Final_IEM5_12_07012025.zip", + repo = "AdamWilsonLab/emma_envdata", + tag = "vegmap2024", + file = "NVM2024final_Shapefile.zip", local_dir = "data/manual_download/NVM2024", shapefile_name = "NVM2024Final_IEM5_12_07012025.shp" ), diff --git a/_targets/meta/meta b/_targets/meta/meta index a2627162..96c5f425 100644 --- a/_targets/meta/meta +++ b/_targets/meta/meta @@ -1,7 +1,6 @@ name|type|data|command|depend|seed|path|time|size|bytes|format|repository|iteration|parent|children|seconds|warnings|error correct_ndvi_dates_release_proj_and_extent|stem|49be87cd8aaf3e80|1d0f5f39ef47d1b6|edb3a13ae4cb1ccc|-1844360325||t20458.6135571947s|s63b|63|rds|local|vector|||17.619|| remove_ee_backup|stem||befe0ca90eb2c488|2c530c1562a7fbd1|-773029837||t20458.6135575072s||0|rds|local|vector|||0.003||could not find function 'clean_up' -vegmap_shp|stem|495c02a4c1083ae3|64fa0ae6793b59bf|2c530c1562a7fbd1|-979952299|data/manual_download/VEGMAP2018_AEA_16082019Final/NVM2018_AEA_V22_7_16082019_final.shp|t20445.6913461798s|s493121012b|493121012|file|local|vector|||0.026|| vegmap|stem|0c98d327f6beefbe|f82077cc150b71ed|774ecf7dbe3e5980|986433229||t20458.6208086331s|s141541376b|141541376|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||18.36|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)| 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.064|| country|stem|fb8900f4b7b88ca5|53feefadcddcbd52|80f7245c40a53951|-430139696||t20462.6945185888s|s4964352b|4964352|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||13.132|| @@ -10,37 +9,50 @@ process_release_biome_raster|function|a0b27b083f7ed85e domain_raster|stem|f326af31f3a5d493|ff3f8f4fb81299ee|f6d4e813438fd81c|1482803489||t20462.7181557878s|s202093691b|202093691|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IE5VTEwpLCAKICAgICAgICBsaXN0KCkpKQp9&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1520.736|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). [rast] unknown extent| vegmap_raster|stem||7c1fa6d4fe95368b|ea12d674ae33b1c9|1016620066||t20462.7183129309s||0|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IE5VTEwpLCAKICAgICAgICBsaXN0KCkpKQp9&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||13.393||crs not found: is it missing? climate_chelsa_release|stem|88f9252bc7d9ed1a|4c496a15fe2faf91|97208ffa76a10d39|-670781068||t20461.8983898142s||81|rds|local|vector|||7.083|Failed to create release: 'raw_static' already exists!|object 'domain' not found -country.gpkg|stem|c722efec868fe851|53feefadcddcbd52|80f7245c40a53951|728599321||t20462.7366079847s|s4964352b|4964352|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||12.191|| -domain.gpkg|stem|4b6f1df83658fdde|d071234244cc8a00|36f02d5ec48f881e|105859277||t20462.7434722827s|s3072000b|3072000|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||17.599|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)| domain.nc|stem|314f0006ad321020|f4caf66b195bedfe|7d2ec7c5e07cf5d8|797368847||t20462.7618461726s|s3623507b|3623507|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IGMoIkZPUk1BVD1OQzQiLCAKICAgICAgICAiQ09NUFJFU1M9REVGTEFURSIsICJaTEVWRUw9OSIpKSwgbGlzdCgpKSkKfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1585.126|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). [writeRaster] consider writeCDF to write ncdf files| vegmap.nc|stem||f1094a5facfce02e|98fce78e25b3b6cb|-1931934530||t20462.7644244077s||0|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IGMoIkZPUk1BVD1OQzQiLCAKICAgICAgICAiQ09NUFJFU1M9REVGTEFURSIsICJaTEVWRUw9OSIpKSwgbGlzdCgpKSkKfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||222.555|attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1)|[==] raster has no values +national_boundary|function|8e86fb14d36f5061 +get_domain|function|73c97bc96bfedda4 +domain_distance|function|939a115603a9b4df +domain_remnants|function|4c6497b244bdbc02 +domain_remnants_release|function|d06ba69c89670801 +domain_distance_release|function|c9d2a5f3c74dfc11 +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.074|| +domain.tif|stem|e51bb36f9f6f3a70|f4caf66b195bedfe|df22595d26cedbec|1539589734||t20462.8142474563s|s6091277b|6091277|format_custom&read=ewogICAgdG1wIDwtIHRlbXBkaXIoKQogICAgemlwOjp1bnppcCh6aXBmaWxlID0gcGF0aCwgZXhkaXIgPSB0bXApCiAgICB0ZXJyYTo6cmFzdChmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkpCn0&write=ewogICAgdG1wIDwtIHdpdGhyOjpsb2NhbF90ZW1wZGlyKCkKICAgIHJhc3Rlcl90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkKICAgIHppcF90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCAib2JqZWN0LnppcCIpCiAgICBkby5jYWxsKHRlcnJhOjp3cml0ZVJhc3RlciwgYyhsaXN0KHggPSBvYmplY3QsIGZpbGVuYW1lID0gcmFzdGVyX3RtcF9maWxlLCAKICAgICAgICBmaWxldHlwZSA9ICJHVGlmZiIsIG92ZXJ3cml0ZSA9IFRSVUUsIGdkYWwgPSBjKCJDT01QUkVTUz1ERUZMQVRFIiwgCiAgICAgICAgIlpMRVZFTD05IikpLCBsaXN0KCkpKQogICAgcmFzdGVyX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHRtcCwgZnVsbC5uYW1lcyA9IFRSVUUpCiAgICB6aXA6OnppcCh6aXBmaWxlID0gemlwX3RtcF9maWxlLCBmaWxlcyA9IHJhc3Rlcl9maWxlcywgY29tcHJlc3Npb25fbGV2ZWwgPSAxLCAKICAgICAgICBtb2RlID0gImNoZXJyeS1waWNrIiwgcm9vdCA9IHRtcCkKICAgIGZpbGUuY29weSh6aXBfdG1wX2ZpbGUsIHBhdGgpCn0&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1370.939|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1)| +vegmap.tif|stem||ba090534dd7ca5ef|9c77befa3fc97dcc|-1280618250||t20462.816821373s||0|format_custom&read=ewogICAgdG1wIDwtIHRlbXBkaXIoKQogICAgemlwOjp1bnppcCh6aXBmaWxlID0gcGF0aCwgZXhkaXIgPSB0bXApCiAgICB0ZXJyYTo6cmFzdChmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkpCn0&write=ewogICAgdG1wIDwtIHdpdGhyOjpsb2NhbF90ZW1wZGlyKCkKICAgIHJhc3Rlcl90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkKICAgIHppcF90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCAib2JqZWN0LnppcCIpCiAgICBkby5jYWxsKHRlcnJhOjp3cml0ZVJhc3RlciwgYyhsaXN0KHggPSBvYmplY3QsIGZpbGVuYW1lID0gcmFzdGVyX3RtcF9maWxlLCAKICAgICAgICBmaWxldHlwZSA9ICJHVGlmZiIsIG92ZXJ3cml0ZSA9IFRSVUUsIGdkYWwgPSBjKCJDT01QUkVTUz1ERUZMQVRFIiwgCiAgICAgICAgIlpMRVZFTD05IikpLCBsaXN0KCkpKQogICAgcmFzdGVyX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHRtcCwgZnVsbC5uYW1lcyA9IFRSVUUpCiAgICB6aXA6OnppcCh6aXBmaWxlID0gemlwX3RtcF9maWxlLCBmaWxlcyA9IHJhc3Rlcl9maWxlcywgY29tcHJlc3Npb25fbGV2ZWwgPSAxLCAKICAgICAgICBtb2RlID0gImNoZXJyeS1waWNrIiwgcm9vdCA9IHRtcCkKICAgIGZpbGUuY29weSh6aXBfdG1wX2ZpbGUsIHBhdGgpCn0&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||222.265|attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)|[==] raster has no values +domain.gpkg|stem|3752155dbbfebdfc|d071234244cc8a00|c3152e2a22ed6a1e|105859277||t20462.8197902732s|s3072000b|3072000|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||17.522|| +get_release_elevation_nasadem|function|0404b4ce37dd6a41 +vegmap_shp|stem|9cade294bcf5aff4|b0eab1feb27fee68|2c530c1562a7fbd1|-979952299|data/manual_download/NVM2024/NVM2024Final_IEM5_12_07012025.shp|t20116.581712963s|s499322168b|499322168|file|local|vector|||0.046|| +country.gpkg|stem|2582513b02199b9d|81ddbcfc163d4096|40e5cb748104ac36|728599321|data/raw/country.gpkg|t20465.7424674251s|s4964352b|4964352|file|local|vector|||13.63|| +country.parquet|stem|2f020da9d9337cd7|81ddbcfc163d4096|d69a2e915984e8ce|1129261391|data/raw/country.parquet|t20465.7465198048s|s4488713b|4488713|file|local|vector|||13.315|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.| +domain.parquet|stem|99d1cde1bbf915bc|7f3fdd56ef8d2af4|ce665ceba2e46c85|522092063|data/raw/domain.parquet|t20465.7480302693s|s1548371b|1548371|file|local|vector|||17.912|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.| +domain_bbox|stem|09b657536e3c59a9|91710e24cd731172|832da33b4d2d7b12|1880263597||t20465.7494766091s|s1960b|1960|rds|local|vector|||0.023|| domain_map|function|9b57e91e94d73101 -rstoken|object|8a5100a24851eef6 +rstoken|object|4bf0792e28803049 robust_pb_download_solo|function|d148e32c5f7beb8f fit_model|function|8f8e281853bbef05 process_dynamic_data_to_parquet|function|49f8abfce5758803 clean_data|function|860451632161bcc2 -national_boundary|function|8e86fb14d36f5061 -domain_rasterize|function|440cf8a14918d503 +domain_rasterize|function|e0740e5311ca7859 robust_download_file|function|2ea70b1df9a469fc verbose|object|988c41ba10911dc8 kr_pwd|object|b61b0b830c8b3de2 get_release_precipitation_chelsa|function|e5a54d4f8a475a6c summarize_posteriors|function|848f748de452ef0d robust_pb_upload|function|bf296132f5183235 -get_domain|function|73c97bc96bfedda4 -.Random.seed|object|1bb5f1a7b0bb6e39 +.Random.seed|object|805b536a7f5d5cd1 tag|object|64ff18d09ad298f3 earthdata_user|object|a72c4475a256a3c1 sys_info|object|ada53e2071fe586e max_layers|object|08d5f59e833de599 +get_country|function|b4bcab6cf1c0d400 existing_kr|object|1bb3bf184f7669e1 get_alos_data|function|75cf21dd60609648 process_fix_modis_projection|function|08e12464ac799094 group_data_function|function|3e4778f64d247976 data_vegmap|function|b1daf0507f348162 -domain_distance|function|939a115603a9b4df get_release_soil_gcfr|function|a0922c0000fe3eac +get_release_elevation_nasadem_appears|function|fe04e4111f3982dd get_release_ndvi_viirs_appeears|function|e0bb04ad860b66e9 release_data|function|2c9988c7000cc9cb spatial_outputs|function|d4fac95c20424f91 @@ -50,30 +62,28 @@ robust_max|function|6d27abe569a34028 get_release_landcover_za|function|9ece1e5f946d7a70 get_vegmap|function|8590caba91b9be39 get_release_fire_modis_appeears|function|9992a7da9cc6cf78 -domain_define|function|81c8649b7bee00f6 +domain_define|function|cb41ddab55d0ec99 kr_name|object|643fa3c4a8310651 temp_directory|object|40d122f36d50a344 -domain_remnants|function|4c6497b244bdbc02 earthdata_pass|object|b61b0b830c8b3de2 update_git|function|8d72fa6c21b94951 sleep_time|object|9f0cda529028d8d9 get_model_data|function|dc3148c05e8961ed get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 -get_release_elevation_nasadem|function|0404b4ce37dd6a41 +make_domain_bbox|function|b106dd9507ac5ef3 robust_min|function|21d2e9972a741573 robust_pb_download|function|4df763e84d88eae4 get_release_clouds_wilson|function|76923df0f19c017f +get_chelsa|function|f63060c4751e6183 get_release_climate_chelsa|function|f63060c4751e6183 get_release_alos|function|3d0bd84374208048 process_release_precipitation_chelsa|function|d0ff995578684615 -domain_remnants_release|function|d06ba69c89670801 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_alos|function|d1225f8b3a3fa4da -domain_distance_release|function|c9d2a5f3c74dfc11 process_release_soil_gcfr|function|51a95877cbbd87c2 process_release_protected_area_distance|function|4ded7cf04ce267a2 process_release_climate_chelsa|function|bbaf017bff9aa203 @@ -85,34 +95,34 @@ 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 -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.074|| -domain.tif|stem|e51bb36f9f6f3a70|f4caf66b195bedfe|df22595d26cedbec|1539589734||t20462.8142474563s|s6091277b|6091277|format_custom&read=ewogICAgdG1wIDwtIHRlbXBkaXIoKQogICAgemlwOjp1bnppcCh6aXBmaWxlID0gcGF0aCwgZXhkaXIgPSB0bXApCiAgICB0ZXJyYTo6cmFzdChmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkpCn0&write=ewogICAgdG1wIDwtIHdpdGhyOjpsb2NhbF90ZW1wZGlyKCkKICAgIHJhc3Rlcl90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkKICAgIHppcF90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCAib2JqZWN0LnppcCIpCiAgICBkby5jYWxsKHRlcnJhOjp3cml0ZVJhc3RlciwgYyhsaXN0KHggPSBvYmplY3QsIGZpbGVuYW1lID0gcmFzdGVyX3RtcF9maWxlLCAKICAgICAgICBmaWxldHlwZSA9ICJHVGlmZiIsIG92ZXJ3cml0ZSA9IFRSVUUsIGdkYWwgPSBjKCJDT01QUkVTUz1ERUZMQVRFIiwgCiAgICAgICAgIlpMRVZFTD05IikpLCBsaXN0KCkpKQogICAgcmFzdGVyX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHRtcCwgZnVsbC5uYW1lcyA9IFRSVUUpCiAgICB6aXA6OnppcCh6aXBmaWxlID0gemlwX3RtcF9maWxlLCBmaWxlcyA9IHJhc3Rlcl9maWxlcywgY29tcHJlc3Npb25fbGV2ZWwgPSAxLCAKICAgICAgICBtb2RlID0gImNoZXJyeS1waWNrIiwgcm9vdCA9IHRtcCkKICAgIGZpbGUuY29weSh6aXBfdG1wX2ZpbGUsIHBhdGgpCn0&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1370.939|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1)| -vegmap.tif|stem||ba090534dd7ca5ef|9c77befa3fc97dcc|-1280618250||t20462.816821373s||0|format_custom&read=ewogICAgdG1wIDwtIHRlbXBkaXIoKQogICAgemlwOjp1bnppcCh6aXBmaWxlID0gcGF0aCwgZXhkaXIgPSB0bXApCiAgICB0ZXJyYTo6cmFzdChmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkpCn0&write=ewogICAgdG1wIDwtIHdpdGhyOjpsb2NhbF90ZW1wZGlyKCkKICAgIHJhc3Rlcl90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkKICAgIHppcF90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCAib2JqZWN0LnppcCIpCiAgICBkby5jYWxsKHRlcnJhOjp3cml0ZVJhc3RlciwgYyhsaXN0KHggPSBvYmplY3QsIGZpbGVuYW1lID0gcmFzdGVyX3RtcF9maWxlLCAKICAgICAgICBmaWxldHlwZSA9ICJHVGlmZiIsIG92ZXJ3cml0ZSA9IFRSVUUsIGdkYWwgPSBjKCJDT01QUkVTUz1ERUZMQVRFIiwgCiAgICAgICAgIlpMRVZFTD05IikpLCBsaXN0KCkpKQogICAgcmFzdGVyX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHRtcCwgZnVsbC5uYW1lcyA9IFRSVUUpCiAgICB6aXA6OnppcCh6aXBmaWxlID0gemlwX3RtcF9maWxlLCBmaWxlcyA9IHJhc3Rlcl9maWxlcywgY29tcHJlc3Npb25fbGV2ZWwgPSAxLCAKICAgICAgICBtb2RlID0gImNoZXJyeS1waWNrIiwgcm9vdCA9IHRtcCkKICAgIGZpbGUuY29weSh6aXBfdG1wX2ZpbGUsIHBhdGgpCn0&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||222.265|attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)|[==] raster has no values +domain_nc|stem||b8acd697cd8f2d9d|ac638b4aeb166003|191087344||t20465.7648402129s||0|file|local|vector|||3549.024|attribute variables are assumed to be spatially constant throughout all geometries|[writeCDF] file exists, use 'overwrite=TRUE' to overwrite it domain_map|function|9b57e91e94d73101 -rstoken|object|8a5100a24851eef6 +rstoken|object|4bf0792e28803049 robust_pb_download_solo|function|d148e32c5f7beb8f fit_model|function|8f8e281853bbef05 process_dynamic_data_to_parquet|function|49f8abfce5758803 clean_data|function|860451632161bcc2 -domain_rasterize|function|440cf8a14918d503 +domain_rasterize|function|4ec214aea2a4465f robust_download_file|function|2ea70b1df9a469fc verbose|object|988c41ba10911dc8 kr_pwd|object|b61b0b830c8b3de2 get_release_precipitation_chelsa|function|e5a54d4f8a475a6c summarize_posteriors|function|848f748de452ef0d robust_pb_upload|function|bf296132f5183235 -.Random.seed|object|1533272c03bd0130 +.Random.seed|object|da4641d028eaef2b tag|object|64ff18d09ad298f3 earthdata_user|object|a72c4475a256a3c1 sys_info|object|ada53e2071fe586e max_layers|object|08d5f59e833de599 -get_country|function|8e86fb14d36f5061 +get_country|function|b4bcab6cf1c0d400 existing_kr|object|1bb3bf184f7669e1 get_alos_data|function|75cf21dd60609648 +download_vegmap_release|function|2838a077173b98de process_fix_modis_projection|function|08e12464ac799094 group_data_function|function|3e4778f64d247976 -data_vegmap|function|b1daf0507f348162 +data_vegmap|function|fd7316b05a56d633 get_release_soil_gcfr|function|a0922c0000fe3eac +get_release_elevation_nasadem_appears|function|d941577352cbced4 get_release_ndvi_viirs_appeears|function|e0bb04ad860b66e9 release_data|function|2c9988c7000cc9cb spatial_outputs|function|d4fac95c20424f91 @@ -122,7 +132,7 @@ robust_max|function|6d27abe569a34028 get_release_landcover_za|function|9ece1e5f946d7a70 get_vegmap|function|8590caba91b9be39 get_release_fire_modis_appeears|function|9992a7da9cc6cf78 -domain_define|function|81c8649b7bee00f6 +domain_define|function|cb41ddab55d0ec99 kr_name|object|643fa3c4a8310651 temp_directory|object|40d122f36d50a344 earthdata_pass|object|b61b0b830c8b3de2 @@ -130,7 +140,7 @@ update_git|function|8d72fa6c21b94951 sleep_time|object|9f0cda529028d8d9 get_model_data|function|dc3148c05e8961ed get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 -get_release_elevation_nasadem|function|0404b4ce37dd6a41 +make_domain_bbox|function|b106dd9507ac5ef3 robust_min|function|21d2e9972a741573 robust_pb_download|function|4df763e84d88eae4 get_release_clouds_wilson|function|76923df0f19c017f @@ -155,5 +165,3 @@ 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 -country.gpkg|stem|c986d4ad66c0a65e|81ddbcfc163d4096|b233eb6ed97aaec2|728599321||t20462.8195868714s|s4964352b|4964352|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||13.608|| -domain.gpkg|stem|3752155dbbfebdfc|d071234244cc8a00|c3152e2a22ed6a1e|105859277||t20462.8197902732s|s3072000b|3072000|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||17.522|| From ac34e7dd2eaa4d66976379e1d7a114a3e3dc16d5 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Mon, 12 Jan 2026 16:27:00 -0500 Subject: [PATCH 44/58] Update GitHub Actions workflow: add permissions for contents, pull requests, and issues --- .github/workflows/targets.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index 3f055743..12fd8394 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -46,6 +46,10 @@ jobs: targets: 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 @@ -88,8 +92,7 @@ jobs: run: | Rscript -e "targets::tar_make()" 2>&1 | tee targets-output.log || echo "tar_make failed, see log above" shell: bash - continue-on-error: true - + continue-on-error: true - name: Export final data products to releases if: github.ref == 'refs/heads/main' run: | From 0d52ce5a8e850b155218e4544a807ed5611ef72c Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Mon, 12 Jan 2026 16:37:08 -0500 Subject: [PATCH 45/58] Refactor vegetation map download function to check for shapefile in subdirectory and return correct path; update elevation resampling method to average. --- R/download_vegmap_release.R | 11 ++++++++--- R/get_release_elevation_nasadem_appears.R | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/R/download_vegmap_release.R b/R/download_vegmap_release.R index 1722becb..0bafa01e 100644 --- a/R/download_vegmap_release.R +++ b/R/download_vegmap_release.R @@ -21,8 +21,11 @@ #' @export download_vegmap_release <- function(repo, tag, file, local_dir, shapefile_name) { dir.create(local_dir, recursive = TRUE, showWarnings = FALSE) - shp_file <- file.path(local_dir, shapefile_name) - if (!file.exists(shp_file)) { + + # 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, @@ -36,5 +39,7 @@ download_vegmap_release <- function(repo, tag, file, local_dir, shapefile_name) utils::unzip(zip_file, exdir = local_dir) unlink(zip_file) } - stringr::str_replace(shp_file, "NVM2024/","NVM2024/shapefile/") # fixes path issue + + # Return the correct path (shapefile is in a subdirectory after extraction) + shp_file_correct } diff --git a/R/get_release_elevation_nasadem_appears.R b/R/get_release_elevation_nasadem_appears.R index bb35dc21..ba6492e3 100644 --- a/R/get_release_elevation_nasadem_appears.R +++ b/R/get_release_elevation_nasadem_appears.R @@ -121,7 +121,7 @@ get_release_elevation_nasadem_appears <- function( # Resample to domain grid using bilinear interpolation if (verbose) message("Resampling elevation to domain grid") - elev_resampled <- terra::resample(elev_raster, domain_raster, method = "bilinear") + elev_resampled <- terra::resample(elev_raster, domain_raster, method = "average") # Mask to domain (NA where domain is NA) elev_masked <- terra::mask(elev_resampled, domain_raster) From 03ce2bc7edccf2f91bb5b58e4831b60ad64c0fa0 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Mon, 12 Jan 2026 16:50:15 -0500 Subject: [PATCH 46/58] Add debug message to list files in local directory after downloading vegetation map --- R/download_vegmap_release.R | 1 + 1 file changed, 1 insertion(+) diff --git a/R/download_vegmap_release.R b/R/download_vegmap_release.R index 0bafa01e..a3648164 100644 --- a/R/download_vegmap_release.R +++ b/R/download_vegmap_release.R @@ -35,6 +35,7 @@ download_vegmap_release <- function(repo, tag, file, local_dir, shapefile_name) 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) From 69d9a228b2925806c036823407ccc5a514851c58 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Tue, 13 Jan 2026 10:50:06 -0500 Subject: [PATCH 47/58] Enhance domain rasterization function: add domain indicator, update remnants processing, and improve NetCDF variable definitions and metadata handling. --- R/domain_rasterize.R | 143 +++++++++++++++++++++++++++++++------------ 1 file changed, 103 insertions(+), 40 deletions(-) diff --git a/R/domain_rasterize.R b/R/domain_rasterize.R index c85e5a5a..dab5669e 100644 --- a/R/domain_rasterize.R +++ b/R/domain_rasterize.R @@ -19,8 +19,12 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file # rasterize domain domain_raster <- domain %>% st_as_sf() %>% + mutate(domain = 1) %>% st_rasterize(template = domain_template) %>% rast() + + # Ensure pixels outside domain are NA (not 0) + domain_raster[domain_raster == 0] <- NA ## Process remnants to add fields related to whether the cell is in a remnant and distance to remnant @@ -29,9 +33,9 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_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() + st_crop(st_as_sfc(st_bbox(domain))) #crop to domain box +# st_union() %>% +# st_make_valid() remnants_raster <- remnants %>% @@ -43,11 +47,13 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file field = "remnant", touches = T, cover = T)|> - terra::mask(mask=domain_raster) + 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::gridDist(target=1)/1000 + 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 @@ -66,47 +72,104 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file units(layers$domain) <- "dimensionless" units(layers$pid) <- "dimensionless" units(layers$remnants) <- "dimensionless" - units(layers$remnants_distance) <- "kilometers" - - # Write each variable separately to NetCDF with maximum compression - terra::writeCDF( - layers$domain, + 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 indicator (1 = 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 + nc <- ncdf4::nc_create( filename = out_file, - varname = "domain", - overwrite = TRUE, - gdal = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9", "SHUFFLE=YES"), - overwrite=TRUE + vars = list(var_domain, var_pid, var_remnants, var_dist), + force_v4 = TRUE ) - terra::writeCDF(layers$pid, filename = out_file, varname = "pid", overwrite = FALSE, append = TRUE, - gdal = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9", "SHUFFLE=YES")) - terra::writeCDF(layers$remnants, filename = out_file, varname = "remnants", overwrite = FALSE, append = TRUE, - gdal = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9", "SHUFFLE=YES")) - terra::writeCDF(layers$remnants_distance, filename = out_file, varname = "remnants_distance", overwrite = FALSE, append = TRUE, - gdal = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9", "SHUFFLE=YES")) - - # Add detailed CF-style metadata via ncdf4 - nc <- ncdf4::nc_open(out_file, write = TRUE) - on.exit(ncdf4::nc_close(nc), add = TRUE) - - # Global attributes + + # Convert rasters to matrices and replace NAs with fill values + domain_matrix <- as.matrix(layers$domain, wide = TRUE) + domain_matrix[is.na(domain_matrix)] <- -128 + + pid_matrix <- as.matrix(layers$pid, wide = TRUE) + pid_matrix[is.na(pid_matrix)] <- -2147483648 + + remnants_matrix <- as.matrix(layers$remnants, wide = TRUE) + remnants_matrix[is.na(remnants_matrix)] <- -128 + + dist_matrix <- 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, "crs", as.character(crs(domain_raster))) ncdf4::ncatt_put(nc, 0, "Conventions", "CF-1.8") - - # Variable-specific attributes - attr_map <- list( - domain = list(long_name = "Domain mask (1 = in domain, NA = outside)", units = "dimensionless"), - pid = list(long_name = "Pixel ID for domain grid cells", units = "dimensionless"), - remnants = list(long_name = "Remnant vegetation indicator (1 = remnant, NA = not remnant)", units = "dimensionless"), - remnants_distance = list(long_name = "Distance to nearest remnant vegetation", units = "kilometers") - ) - for (v in names(attr_map)) { - if (v %in% names(nc$var)) { - ncdf4::ncatt_put(nc, v, "long_name", attr_map[[v]]$long_name) - ncdf4::ncatt_put(nc, v, "units", attr_map[[v]]$units) - } - } + + # Add CRS variable for CF compliance + crs_var <- ncdf4::ncvar_def("crs", "", list(), prec = "integer") + nc <- ncdf4::ncvar_add(nc, crs_var) + ncdf4::ncatt_put(nc, "crs", "grid_mapping_name", "albers_conical_equal_area") + ncdf4::ncatt_put(nc, "crs", "spatial_ref", as.character(crs(domain_raster))) + + # 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 } \ No newline at end of file From a9c126459010a4c6e8bfc4d348027c8793870b63 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Tue, 13 Jan 2026 13:32:31 -0500 Subject: [PATCH 48/58] Update domain rasterization and targets: enhance remnant vegetation indicator description, add comprehensive CRS attributes, and implement run mode for GitHub Actions. --- R/domain_rasterize.R | 21 ++++++++++++++++++--- _targets.R | 29 ++++++++++++++++++++++------- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/R/domain_rasterize.R b/R/domain_rasterize.R index dab5669e..e98eaccc 100644 --- a/R/domain_rasterize.R +++ b/R/domain_rasterize.R @@ -108,7 +108,7 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file name = "remnants", units = "dimensionless", dim = list(dim_x, dim_y), - longname = "Remnant vegetation indicator (1 = remnant, NA = not remnant)", + longname = "Remnant vegetation proportion (100 = full remnant, 5 = 5% remnant, NA = not remnant)", missval = -128, prec = "byte", compression = 9 @@ -125,6 +125,8 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file ) # 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), @@ -156,11 +158,24 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file ncdf4::ncatt_put(nc, 0, "crs", as.character(crs(domain_raster))) ncdf4::ncatt_put(nc, 0, "Conventions", "CF-1.8") - # Add CRS variable for CF compliance + # Add complete CRS variable for CF compliance and GIS compatibility crs_var <- ncdf4::ncvar_def("crs", "", list(), prec = "integer") nc <- ncdf4::ncvar_add(nc, crs_var) + + # Get CRS details from terra + crs_wkt <- as.character(crs(domain_raster, proj = TRUE)) + crs_proj4 <- as.character(crs(domain_raster, proj = TRUE, describe = TRUE)$proj4) + + # Add comprehensive CRS attributes ncdf4::ncatt_put(nc, "crs", "grid_mapping_name", "albers_conical_equal_area") - ncdf4::ncatt_put(nc, "crs", "spatial_ref", as.character(crs(domain_raster))) + ncdf4::ncatt_put(nc, "crs", "crs_wkt", crs_wkt) + ncdf4::ncatt_put(nc, "crs", "spatial_ref", crs_wkt) + ncdf4::ncatt_put(nc, "crs", "proj4", crs_proj4) + + # 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") diff --git a/_targets.R b/_targets.R index 082ff395..12c22a1f 100644 --- a/_targets.R +++ b/_targets.R @@ -25,6 +25,14 @@ library(filelock)#,lib.loc=Sys.getenv("R_LIBS_USER")) message(paste("Set working directory to:", getwd())) } +# Determine run mode: "prime" (full processing on server) or "update" (incremental on GitHub Actions) + run_mode <- if (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() @@ -81,26 +89,30 @@ list( tar_target( remnants_shp, "data/manual_download/RLE_2021_Remnants/RLE_Terr_2021_June2021_Remnants_ddw.shp", - format="file" + format="file", + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") ), tar_target( capenature_fires_shp, "data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp", - format="file" + format="file", + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") ), tar_target( country.parquet, get_country(), - format = "file" + format = "file", + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") ), tar_target( domain.parquet, domain_define(vegmap = vegmap_shp, country = country.parquet), - format = "file" + format = "file", + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") ), # Stable bounding box for downloads (50km buffer around domain) @@ -121,14 +133,17 @@ list( out_file = "data/raw/domain.nc" ), format = "file", - cue = tar_cue(mode = "never") #slow - restrict to manual updates + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") + # tar_invalidate(domain_nc) # run this to force recompute + ), # Vegetation map raster with metadata - tar_terra_rast( + tar_target( vegmap_nc, data_vegmap(domain_raster = terra::rast(domain_nc), vegmap_shp), - filetype = "netCDF" + format = "file", + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") )#, # # # # Infrequent updates via releases From a124461a41ddb3d91429fb91b0b3200f5a4df6a5 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Wed, 14 Jan 2026 10:46:08 -0500 Subject: [PATCH 49/58] Enhance data processing functions: add output file parameter to data_vegmap, improve elevation retrieval with AppEEARS, and ensure directory structure for temporary files. --- R/data_vegmap.R | 166 +++++++++++++----- R/domain_define.R | 5 +- R/domain_rasterize.R | 42 +++-- ...tion_nasadem_appears.R => get_elevation.R} | 101 +++++++---- _targets.R | 48 ++--- 5 files changed, 247 insertions(+), 115 deletions(-) rename R/{get_release_elevation_nasadem_appears.R => get_elevation.R} (53%) diff --git a/R/data_vegmap.R b/R/data_vegmap.R index 6f2c71cf..f4028f9a 100644 --- a/R/data_vegmap.R +++ b/R/data_vegmap.R @@ -1,16 +1,27 @@ ## Process Vegmap to add field related to biome type -data_vegmap <- function(domain_raster, vegmap_shp, disagg_factor = 10) { +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_raster)) %>% - st_intersection(st_as_sfc(st_bbox(domain_raster)))|> #crop to domain - mutate(vegtype_id = as.numeric(factor(mapcode18))) #create numeric vegtype ID + 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(rast(domain_raster), disagg_factor) + template_fine <- disagg(domain, disagg_factor) rasterize_modal <- function(field_name) { r_fine <- terra::rasterize( @@ -19,19 +30,21 @@ data_vegmap <- function(domain_raster, vegmap_shp, disagg_factor = 10) { field = field_name, touches = TRUE ) - terra::aggregate(r_fine, disagg_factor, fun = "modal") + 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("biomeid_18") - bioregion_raster <- rasterize_modal("brgnid_18") - vegtype_raster <- rasterize_modal("vegtype_id") + 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_raster is NA) - domain_mask <- !is.na(rast(domain_raster)) + # 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") @@ -39,45 +52,116 @@ data_vegmap <- function(domain_raster, vegmap_shp, disagg_factor = 10) { # Lookup table for IDs -> names lookup_tbl <- vegmap_sf %>% - st_drop_geometry() %>% - dplyr::select(biomeid_18, brgnid_18, vegtype_id, mapcode18, name_18, biome_18, bioregion) %>% - dplyr::rename(vegbiome = biomeid_18, vegbioregion = brgnid_18, vegtype = vegtype_id) %>% + 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 - output_file <- "vegmap.nc" - - # Prepare metadata - metadata <- list( - title = "Vegetation Map - Biome, Bioregion, and Vegetation Type", - source = "South Africa National Vegetation Map 2024", - Conventions = "CF-1.8", - lookup_table_json = jsonlite::toJSON(lookup_tbl, dataframe = "rows", auto_unbox = TRUE), - vegbiome_long_name = "Biome ID (biomeid_18)", - vegbioregion_long_name = "Bioregion ID (brgnid_18)", - vegtype_long_name = "Vegetation type code (mapcode18)", - date_generated = as.character(Sys.time()), - crs = as.character(crs(multiband)), - ancillary_variables = "lookup_table" + # 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 ) - # Write to NetCDF with metadata - terra::writeCDF( - x = multiband, + # Create NetCDF file with all variables + unlink(output_file) + nc <- ncdf4::nc_create( filename = output_file, - overwrite = TRUE, - varnames = c("vegbiome", "vegbioregion", "vegtype"), - longname = c("Biome ID (biomeid_18)", "Bioregion ID (brgnid_18)", "Vegetation type code (mapcode18)"), - unit = c("dimensionless", "dimensionless", "dimensionless") + vars = list(var_biome, var_bioregion, var_vegtype), + force_v4 = TRUE ) - # Add metadata to the NetCDF file using ncdf4 - nc <- ncdf4::nc_open(output_file, write = TRUE) - for (key in names(metadata)) { - ncdf4::ncatt_put(nc, 0, key, metadata[[key]]) - } + # 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_define.R b/R/domain_define.R index 33234e52..93c5010d 100644 --- a/R/domain_define.R +++ b/R/domain_define.R @@ -29,9 +29,8 @@ vegmap_buffer = vegmap_union %>% smooth(method="ksmooth",smoothness=120) #%>% country= st_as_sf(country) %>% - st_transform(crs=st_crs(vegmap_buffer)) %>% - st_buffer(500) # small buffer to fix potential topology issues - + st_transform(crs=st_crs(vegmap_buffer)) + domain <- vegmap_buffer %>% st_intersection(st_transform(country,crs=st_crs(vegmap_union))) %>% #only keep land areas of buffer - no ocean diff --git a/R/domain_rasterize.R b/R/domain_rasterize.R index e98eaccc..842a4274 100644 --- a/R/domain_rasterize.R +++ b/R/domain_rasterize.R @@ -13,15 +13,19 @@ domain_rasterize <- function(domain, remnants_shp, dx = 250, dy = 250, out_file = "data/raw/domain.nc") { - # Generate raster version of domain - domain_template <- st_as_stars(st_bbox(domain), dx = dx, dy = dy) + # Generate raster template and rasterize domain with terra (touches = TRUE) + domain_template <- rast(st_as_stars(st_bbox(domain), dx = dx, dy = dy)) -# rasterize domain domain_raster <- domain %>% st_as_sf() %>% mutate(domain = 1) %>% - st_rasterize(template = domain_template) %>% - rast() + 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 @@ -134,16 +138,17 @@ unlink(out_file) ) # Convert rasters to matrices and replace NAs with fill values - domain_matrix <- as.matrix(layers$domain, wide = TRUE) + # 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 <- as.matrix(layers$pid, wide = TRUE) + pid_matrix <- t(as.matrix(layers$pid, wide = TRUE)) pid_matrix[is.na(pid_matrix)] <- -2147483648 - remnants_matrix <- as.matrix(layers$remnants, wide = TRUE) + remnants_matrix <- t(as.matrix(layers$remnants, wide = TRUE)) remnants_matrix[is.na(remnants_matrix)] <- -128 - dist_matrix <- as.matrix(layers$remnants_distance, wide = TRUE) + dist_matrix <- t(as.matrix(layers$remnants_distance, wide = TRUE)) dist_matrix[is.na(dist_matrix)] <- -2147483648 # Write data to variables @@ -155,27 +160,24 @@ unlink(out_file) # 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, "crs", as.character(crs(domain_raster))) ncdf4::ncatt_put(nc, 0, "Conventions", "CF-1.8") - # Add complete CRS variable for CF compliance and GIS compatibility + # 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 details from terra - crs_wkt <- as.character(crs(domain_raster, proj = TRUE)) - crs_proj4 <- as.character(crs(domain_raster, proj = TRUE, describe = TRUE)$proj4) + # Get CRS as WKT string (most reliable for terra) + crs_wkt <- as.character(crs(domain_raster)) - # Add comprehensive CRS attributes + # 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) - ncdf4::ncatt_put(nc, "crs", "proj4", crs_proj4) # 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) + ncdf4::ncatt_put(nc, "crs", "GeoTransform", geotransform) # Add grid_mapping attribute to all data variables ncdf4::ncatt_put(nc, "domain", "grid_mapping", "crs") @@ -187,4 +189,10 @@ unlink(out_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/get_release_elevation_nasadem_appears.R b/R/get_elevation.R similarity index 53% rename from R/get_release_elevation_nasadem_appears.R rename to R/get_elevation.R index ba6492e3..7bad089a 100644 --- a/R/get_release_elevation_nasadem_appears.R +++ b/R/get_elevation.R @@ -8,24 +8,17 @@ #' @param verbose Logical for progress messages #' @return SpatRaster with elevation resampled to domain, with metadata -get_release_elevation_nasadem_appears <- function( +get_elevation <- function( domain_vector, domain_raster, temp_directory = "data/temp/raw_data/elevation_nasadem/", + out_file = "data/raw/elevation_nasadem.nc", verbose = TRUE ) { - # Package checks - required_pkgs <- c("appeears", "terra", "sf", "lubridate", "jsonlite") - missing <- required_pkgs[!sapply(required_pkgs, requireNamespace, quietly = TRUE)] - if (length(missing)) { - stop("Required packages missing: ", paste(missing, collapse = ", ")) - } # Ensure clean temp directory - if (dir.exists(temp_directory)) { - unlink(temp_directory, recursive = TRUE, force = TRUE) - } + unlink(temp_directory, recursive = TRUE, force = TRUE) dir.create(temp_directory, recursive = TRUE, showWarnings = FALSE) # Clean terra temp @@ -34,16 +27,17 @@ get_release_elevation_nasadem_appears <- function( dir.create(terra_tmp, recursive = TRUE, showWarnings = FALSE) terraOptions(tempdir = terra_tmp, memfrac = 0.8) - # Convert domain vector to sf and reproject to WGS84 (required by AppEEARS) - domain_sf <- st_as_sf(domain_vector) - domain_wgs84 <- st_transform(domain_sf, crs = 4326) - - # Write to GeoJSON and read back as plain list (avoids geo_list serialization issues) - aoi_path <- file.path(temp_directory, "aoi.geojson") - suppressWarnings(sf::st_write(domain_wgs84, aoi_path, driver = "GeoJSON", delete_dsn = TRUE, quiet = TRUE)) - aoi_json <- jsonlite::read_json(aoi_path, simplifyVector = FALSE) + # 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() + +# if (!all(st_is_valid(st_as_sf(domain_sf)))) stop("Domain polygon still invalid after repair; inspect input geometry.") - if (verbose) message("Submitting AppEEARS NASADEM request over domain polygon") # Build AppEEARS request with proper structure req <- list( @@ -62,17 +56,14 @@ get_release_elevation_nasadem_appears <- function( format = list(type = "netcdf4"), projection = "native" ), - geo = aoi_json + geo = domain_sf ) ) - # Convert request to JSON string (rs_request/task$download expect JSON text) - req_json <- jsonlite::toJSON(req, auto_unbox = TRUE) - # Submit and poll for completion if (verbose) message("Submitting AppEEARS task...") task <- appeears::rs_request( - request = req_json, + request = req, user = Sys.getenv("EARTHDATA_USER"), path = temp_directory, transfer = FALSE, @@ -83,7 +74,7 @@ get_release_elevation_nasadem_appears <- function( # Poll for completion using task object methods max_retries <- 60 - retry_count <- 0 + retry_count <- 10 repeat { retry_count <- retry_count + 1 @@ -119,12 +110,16 @@ get_release_elevation_nasadem_appears <- function( 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")]) - # Resample to domain grid using bilinear interpolation - if (verbose) message("Resampling elevation to domain grid") - elev_resampled <- terra::resample(elev_raster, domain_raster, method = "average") + # 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 (bilinear) 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) - elev_masked <- terra::mask(elev_resampled, domain_raster) + 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" @@ -138,13 +133,57 @@ get_release_elevation_nasadem_appears <- function( "Conventions" = "CF-1.8" ) + # Write NetCDF with compression and CF metadata + dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) + out_file <- file.path(out_dir, "elevation_nasadem.nc") + 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 ready") - elev_masked + out_file } diff --git a/_targets.R b/_targets.R index 12c22a1f..e1978d3b 100644 --- a/_targets.R +++ b/_targets.R @@ -47,7 +47,12 @@ library(filelock)#,lib.loc=Sys.getenv("R_LIBS_USER")) packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", "appeears", "terra", "smoothr", "janitor", "sfarrow", "jsonlite")) - +# 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) + terraOptions(tempdir = "data/temp/terra", memfrac = 0.6) geotargets_option_set( gdal_raster_driver = "netCDF", @@ -56,12 +61,7 @@ geotargets_option_set( ) ## Authenticate with AppEEARS -source("R/appeears_auth.R") - -# Ensure output directories exist -dir.create("data/raw", recursive = TRUE, showWarnings = FALSE) -dir.create("data/temp", recursive = TRUE, showWarnings = FALSE) -dir.create("data/releases", recursive = TRUE, showWarnings = FALSE) +source("R/appeears_auth.R") # Ensure things are clean @@ -83,7 +83,7 @@ list( shapefile_name = "NVM2024Final_IEM5_12_07012025.shp" ), format = "file", - cue = tar_cue(mode = "never") + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") ), tar_target( @@ -141,10 +141,11 @@ list( # Vegetation map raster with metadata tar_target( vegmap_nc, - data_vegmap(domain_raster = terra::rast(domain_nc), vegmap_shp), + data_vegmap(domain_raster = domain_nc, + vegmap_shp = vegmap_shp, + out_file = "data/raw/vegmap.nc"), format = "file", - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") - )#, + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never")), # # # # Infrequent updates via releases @@ -180,12 +181,17 @@ list( # sleep_time = 180) # ), - # tar_target( - # elevation_nasadem_release, - # get_release_elevation_nasadem(temp_directory = "data/temp/raw_data/elevation_nasadem/", - # tag = "raw_static", - # domain) - # ) + tar_target( + elevation, + get_elevation( + domain_vector = sfarrow::st_read_parquet(domain.parquet), + domain_raster = domain_nc, + temp_directory = "data/temp/raw_data/elevation_nasadem/", + out_file = "data/raw/elevation_nasadem.nc" + ), + format="file", + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never"), + ) #, #Temporarily commented out, seems to be an issue with URL for landcover data at present @@ -227,7 +233,8 @@ list( # verbose = TRUE), # age = as.difftime(7, units = "days") # #age = as.difftime(1, units = "days") -# #age = as.difftime(0, units = "hours") +# #age = as.difftime(0, units = "hours"), +# cue = tar_cue(mode = if (run_mode == "update") "always" else "thorough") # ), # tar_age( @@ -507,8 +514,3 @@ list( ) - - - - -################################################################################ From 343513b043a91bce3198b4c3c4508415ce8a1b14 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Wed, 14 Jan 2026 16:01:24 -0500 Subject: [PATCH 50/58] Add functions for downloading national boundaries and managing GitHub releases; update .gitignore for new data directories --- .gitignore | 2 + R/{data_country.R => get_country.R} | 2 +- R/get_elevation.R | 13 +- R/tar_release_storage.R | 234 ++++++++++++++++++++++++++++ _targets.R | 79 ++++++---- 5 files changed, 288 insertions(+), 42 deletions(-) rename R/{data_country.R => get_country.R} (94%) create mode 100644 R/tar_release_storage.R diff --git a/.gitignore b/.gitignore index 73349e3b..317eeea2 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,8 @@ 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 diff --git a/R/data_country.R b/R/get_country.R similarity index 94% rename from R/data_country.R rename to R/get_country.R index bcd819ec..e738ec9a 100644 --- a/R/data_country.R +++ b/R/get_country.R @@ -23,7 +23,7 @@ get_country <- function(){ st_as_sf() # Write to GeoParquet - out_file <- "data/raw/country.parquet" + out_file <- "data/target_outputs/country.parquet" sfarrow::st_write_parquet(country, out_file) return(out_file) diff --git a/R/get_elevation.R b/R/get_elevation.R index 7bad089a..2fe3214f 100644 --- a/R/get_elevation.R +++ b/R/get_elevation.R @@ -74,7 +74,7 @@ get_elevation <- function( # Poll for completion using task object methods max_retries <- 60 - retry_count <- 10 + retry_count <- 0 repeat { retry_count <- retry_count + 1 @@ -94,7 +94,7 @@ get_elevation <- function( } if (verbose) message("Task status: ", task$get_status(), " (", retry_count, "/", max_retries, ")") - Sys.sleep(10) + Sys.sleep(60) } # Download results @@ -123,19 +123,18 @@ get_elevation <- function( # Set metadata names(elev_masked) <- "elevation" - units(elev_masked) <- "meters" metags(elev_masked) <- c( "elevation_long_name" = "NASADEM elevation above mean sea level", "elevation_source" = "NASADEM_HGT.001 via AppEEARS", + "units" = "meters", "date_generated" = as.character(Sys.time()), - "crs" = as.character(crs(elev_masked)), + "crs" = as.character(st_crs(elev_masked)), "Conventions" = "CF-1.8" ) - # Write NetCDF with compression and CF metadata - dir.create(out_dir, recursive = TRUE, showWarnings = FALSE) - out_file <- file.path(out_dir, "elevation_nasadem.nc") + # Write NetCDF with compression and CF metadata + dir.create(dirname(out_file), recursive = TRUE, showWarnings = FALSE) unlink(out_file) ext_vals <- ext(elev_masked) diff --git a/R/tar_release_storage.R b/R/tar_release_storage.R new file mode 100644 index 00000000..cb92e87d --- /dev/null +++ b/R/tar_release_storage.R @@ -0,0 +1,234 @@ +#' Create GitHub Releases repository for targets +#' @description Create a tar_repository_cas() object that stores targets +#' using GitHub releases as the backend, with local persistent caching. +#' @param repo Repository in "owner/repo" format +#' @param tag Release tag to store objects (e.g., "objects_v2024" or "objects_current") +#' @param format Serialization format: "qs" (fast, recommended), "rds", or "parquet" +#' @param cache_dir Persistent cache directory for downloaded files (default: "data/.tar_cache") +#' @return tar_repository_cas() object for use with tar_target(repository = ...) +#' @details +#' Use with tar_target(..., repository = tar_github_release_repo(...)) +#' +#' This implements the Content Addressable Storage (CAS) pattern where targets +#' are stored with serialized R objects, with GitHub releases as the backend +#' and local persistent caching for speed. +#' +#' Example: +#' ``` +#' gh_repo <- tar_github_release_repo( +#' repo = "AdamWilsonLab/emma_envdata", +#' tag = "objects_current", +#' format = "qs", +#' cache_dir = "data/.tar_cache" +#' ) +#' +#' tar_target( +#' my_object, +#' some_computation(), +#' repository = gh_repo, +#' cue = tar_cue(mode = "never") +#' ) +#' ``` +#' @export +tar_github_release_repo <- function( + repo, + tag, + format = "qs", + cache_dir = "data/.tar_cache" +) { + + stopifnot( + is.character(repo) && nchar(repo) > 0, + is.character(tag) && nchar(tag) > 0, + format %in% c("qs", "rds", "parquet") + ) + + # Create a tar_repository_cas() object with self-contained functions + # that read config from environment variables + tar_repository_cas( + upload = function(key, path) { + repo <- Sys.getenv("TAR_GH_RELEASE_REPO") + tag <- Sys.getenv("TAR_GH_RELEASE_TAG") + format <- Sys.getenv("TAR_GH_RELEASE_FORMAT") + + # Ensure release exists before uploading + release_exists <- FALSE + tryCatch({ + assets <- piggyback::pb_list(repo = repo, tag = tag) + release_exists <- TRUE + }, error = function(e) { + # pb_list throws error if release doesn't exist + release_exists <<- FALSE + }) + + if (!release_exists) { + message("[tar_github_release] Creating release: ", tag) + tryCatch({ + piggyback::pb_new_release(repo = repo, tag = tag) + message("[tar_github_release] Release created: ", tag) + }, error = function(e) { + if (!grepl("already exists", tolower(conditionMessage(e)))) { + stop("[tar_github_release] Failed to create release: ", conditionMessage(e)) + } + }) + } + + if (file.exists(path) && !dir.exists(path)) { + message("[tar_github_release] Uploading file: ", key) + tryCatch({ + piggyback::pb_upload( + file = path, + repo = repo, + tag = tag, + name = key, + overwrite = TRUE, + .token = NULL + ) + message("[tar_github_release] File uploaded: ", key) + }, error = function(e) { + stop("[tar_github_release] Failed to upload file: ", conditionMessage(e)) + }) + } else { + obj <- readRDS(path) + temp_file <- tempfile(fileext = paste0(".", format)) + on.exit(unlink(temp_file), add = TRUE) + + if (format == "qs") { + qs::qsave(obj, temp_file) + } else if (format == "rds") { + saveRDS(obj, temp_file) + } else if (format == "parquet") { + arrow::write_parquet(obj, temp_file) + } + + max_attempts <- 5 + for (attempt in 1:max_attempts) { + tryCatch({ + piggyback::pb_upload( + file = temp_file, + repo = repo, + tag = tag, + name = key, + overwrite = TRUE, + .token = NULL + ) + message("[tar_github_release] Object uploaded: ", key) + return(invisible()) + }, error = function(e) { + if (attempt < max_attempts) { + message("[tar_github_release] Upload attempt ", attempt, " failed: ", conditionMessage(e)) + Sys.sleep(2) + } else { + stop("[tar_github_release] Failed to upload after ", max_attempts, " attempts: ", conditionMessage(e)) + } + }) + } + } + }, + download = function(key, path) { + repo <- Sys.getenv("TAR_GH_RELEASE_REPO") + tag <- Sys.getenv("TAR_GH_RELEASE_TAG") + format <- Sys.getenv("TAR_GH_RELEASE_FORMAT") + cache_dir <- Sys.getenv("TAR_GH_RELEASE_CACHE_DIR") + + dir.create(cache_dir, recursive = TRUE, showWarnings = FALSE) + cached_file <- file.path(cache_dir, key) + + need_download <- TRUE + if (file.exists(cached_file)) { + tryCatch({ + remote_assets <- piggyback::pb_list(repo = repo, tag = tag) + remote_asset <- remote_assets[remote_assets$file_name == key, ] + + if (nrow(remote_asset) > 0) { + local_size <- file.size(cached_file) + remote_size <- remote_asset$size[1] + + if (local_size == remote_size) { + message("[tar_github_release] Cache valid (size match: ", local_size, " bytes)") + need_download <- FALSE + } + } + }, error = function(e) { + message("[tar_github_release] Could not verify cache: ", conditionMessage(e)) + }) + } + + if (need_download) { + max_attempts <- 5 + for (attempt in 1:max_attempts) { + tryCatch({ + piggyback::pb_download( + file = key, + repo = repo, + tag = tag, + dest = cache_dir, + overwrite = TRUE + ) + message("[tar_github_release] Downloaded: ", key) + break + }, error = function(e) { + if (attempt < max_attempts) { + message("[tar_github_release] Download attempt ", attempt, " failed: ", conditionMessage(e)) + Sys.sleep(2) + } else { + stop("[tar_github_release] Failed to download after ", max_attempts, " attempts: ", conditionMessage(e)) + } + }) + } + } + + if (!file.exists(cached_file)) { + stop("[tar_github_release] Failed to retrieve: ", key) + } + + file_exts <- c("parquet", "nc", "tif", "gpkg", "shp", "dbf", "prj", "shx") + is_spatial_file <- any(endsWith(tolower(key), paste0(".", file_exts))) + + if (is_spatial_file) { + file.copy(cached_file, path, overwrite = TRUE) + message("[tar_github_release] Retrieved file: ", key) + } else { + if (format == "qs") { + obj <- qs::qread(cached_file) + } else if (format == "rds") { + obj <- readRDS(cached_file) + } else if (format == "parquet") { + obj <- arrow::read_parquet(cached_file) + } + + saveRDS(obj, path) + message("[tar_github_release] Retrieved and deserialized: ", key) + } + invisible() + }, + exists = function(key) { + repo <- Sys.getenv("TAR_GH_RELEASE_REPO") + tag <- Sys.getenv("TAR_GH_RELEASE_TAG") + + tryCatch({ + assets <- piggyback::pb_list(repo = repo, tag = tag) + any(assets$file_name == key) + }, error = function(e) { + FALSE + }) + } + ) +} + +# Helper to set up tar_resources_repository_cas with environment variables +tar_github_release_resources <- function( + repo, + tag, + format = "qs", + cache_dir = "data/.tar_cache" +) { + tar_resources_repository_cas( + envvars = c( + TAR_GH_RELEASE_REPO = repo, + TAR_GH_RELEASE_TAG = tag, + TAR_GH_RELEASE_FORMAT = format, + TAR_GH_RELEASE_CACHE_DIR = cache_dir + ) + ) +} diff --git a/_targets.R b/_targets.R index e1978d3b..1f075439 100644 --- a/_targets.R +++ b/_targets.R @@ -37,32 +37,42 @@ library(filelock)#,lib.loc=Sys.getenv("R_LIBS_USER")) # source all files in R folder - lapply(list.files("R",pattern="[.]R",full.names = T), source) + lapply(list.files("R",pattern="[.]R",full.names = T), function(x) {print(x); source(x)}) message(paste("Objects:",ls(),collapse = "\n")) # To make sure all packages are loaded options(tidyverse.quiet = TRUE) - tar_option_set( - packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", - "appeears", "terra", "smoothr", "janitor", "sfarrow", "jsonlite")) - -# 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) - -terraOptions(tempdir = "data/temp/terra", memfrac = 0.6) -geotargets_option_set( - gdal_raster_driver = "netCDF", - gdal_raster_creation_options = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9"), - gdal_vector_driver = "GPKG" -) - -## Authenticate with AppEEARS -source("R/appeears_auth.R") - + # 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) + + # Set up GitHub release repository for storing targets + gh_repo <- tar_github_release_repo( + repo = "AdamWilsonLab/emma_envdata", + tag = "objects_current", + format = "qs", # targets with format='file' will be uploaded in their native format + cache_dir = "data/target_outputs/.tar_cache" + ) + + tar_option_set( + packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", + "appeears", "terra", "smoothr", "janitor", "sfarrow", "jsonlite", + "piggyback", "qs", "arrow") + ) + + terraOptions(tempdir = "data/temp/terra", memfrac = 0.6) + # geotargets_option_set( + # gdal_raster_driver = "netCDF", + # gdal_raster_creation_options = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9"), + # gdal_vector_driver = "GPKG" + # ) + + ## Authenticate with AppEEARS + # source("R/appeears_auth.R") # Ensure things are clean # unlink(file.path("data/temp/"), recursive = TRUE, force = TRUE) @@ -121,6 +131,7 @@ list( domain_bbox.parquet, make_domain_bbox(domain.parquet, buffer_m = 50000), format = "file", + repository = gh_repo, cue = tar_cue(mode = "never") # Never re-download RS data unless manually invalidated - changes in domain.parquet won't affect this. ), @@ -145,7 +156,7 @@ list( vegmap_shp = vegmap_shp, out_file = "data/raw/vegmap.nc"), format = "file", - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never")), + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never")) # # # # Infrequent updates via releases @@ -181,18 +192,18 @@ list( # sleep_time = 180) # ), - tar_target( - elevation, - get_elevation( - domain_vector = sfarrow::st_read_parquet(domain.parquet), - domain_raster = domain_nc, - temp_directory = "data/temp/raw_data/elevation_nasadem/", - out_file = "data/raw/elevation_nasadem.nc" - ), - format="file", - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never"), - ) -#, +# tar_target( +# elevation, +# get_elevation( +# domain_vector = sfarrow::st_read_parquet(domain.parquet), +# domain_raster = domain_nc, +# temp_directory = "data/temp/raw_data/elevation_nasadem/", +# out_file = "data/raw/elevation_nasadem.nc" +# ), +# format="file", +# cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never"), +# ) +# #, #Temporarily commented out, seems to be an issue with URL for landcover data at present # tar_target( From 2d7c42d469e479c3088eff35bc7941ebecdf1511 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Wed, 14 Jan 2026 20:57:14 -0500 Subject: [PATCH 51/58] Refactor code structure for improved readability and maintainability --- .github/workflows/targets.yaml | 5 +- _targets.R | 29 ++++++-- _targets/meta/meta | 128 +++++++++++---------------------- 3 files changed, 65 insertions(+), 97 deletions(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index 12fd8394..738f0f52 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -90,9 +90,8 @@ jobs: restore-keys: targets- - name: Run targets pipeline run: | - Rscript -e "targets::tar_make()" 2>&1 | tee targets-output.log || echo "tar_make failed, see log above" - shell: bash - continue-on-error: true + 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: | diff --git a/_targets.R b/_targets.R index 1f075439..f932cb98 100644 --- a/_targets.R +++ b/_targets.R @@ -2,6 +2,7 @@ message("Starting tar_make()") print("Starting tar_make() - print") library(targets) +library(qs) library(tarchetypes) library(geotargets) library(visNetwork) @@ -50,18 +51,34 @@ library(filelock)#,lib.loc=Sys.getenv("R_LIBS_USER")) dir.create("data/releases", recursive = TRUE, showWarnings = FALSE) dir.create("data/target_outputs", recursive = TRUE, showWarnings = FALSE) - # Set up GitHub release repository for storing targets - gh_repo <- tar_github_release_repo( + # GitHub release repository configuration + gh_repo_config <- list( repo = "AdamWilsonLab/emma_envdata", tag = "objects_current", - format = "qs", # targets with format='file' will be uploaded in their native format - cache_dir = "data/target_outputs/.tar_cache" + format = "qs", + cache_dir = "data/target_outputs/.tar_cache" + ) + + # Set up GitHub release repository for storing targets + gh_repo <- tar_github_release_repo( + repo = gh_repo_config$repo, + tag = gh_repo_config$tag, + format = gh_repo_config$format, + cache_dir = gh_repo_config$cache_dir ) tar_option_set( packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", "appeears", "terra", "smoothr", "janitor", "sfarrow", "jsonlite", - "piggyback", "qs", "arrow") + "piggyback", "qs", "arrow"), + resources = tar_resources( + repository_cas = tar_github_release_resources( + repo = gh_repo_config$repo, + tag = gh_repo_config$tag, + format = gh_repo_config$format, + cache_dir = gh_repo_config$cache_dir + ) + ) ) terraOptions(tempdir = "data/temp/terra", memfrac = 0.6) @@ -129,7 +146,7 @@ list( # Never re-downloads unless manually invalidated, even if analysis domain changes tar_target( domain_bbox.parquet, - make_domain_bbox(domain.parquet, buffer_m = 50000), + make_domain_bbox(domain.parquet, buffer_m = 50000, out_file = "data/target_outputs/domain_bbox.parquet"), format = "file", repository = gh_repo, cue = tar_cue(mode = "never") # Never re-download RS data unless manually invalidated - changes in domain.parquet won't affect this. diff --git a/_targets/meta/meta b/_targets/meta/meta index 96c5f425..c5f5d3c2 100644 --- a/_targets/meta/meta +++ b/_targets/meta/meta @@ -5,54 +5,73 @@ vegmap|stem|0c98d327f6beefbe|f82077cc150b71ed|774ecf7dbe3e5980|986433229||t20458 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.064|| country|stem|fb8900f4b7b88ca5|53feefadcddcbd52|80f7245c40a53951|-430139696||t20462.6945185888s|s4964352b|4964352|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||13.132|| domain|stem|e6d498ad1ef6d5de|3b892a93e2976da1|079d4f875c5b950e|-103757746||t20462.6947265009s|s3072000b|3072000|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||17.511|| -process_release_biome_raster|function|a0b27b083f7ed85e +process_release_biome_raster|function|a0b27b083f7ed85e||||||||||||||| domain_raster|stem|f326af31f3a5d493|ff3f8f4fb81299ee|f6d4e813438fd81c|1482803489||t20462.7181557878s|s202093691b|202093691|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IE5VTEwpLCAKICAgICAgICBsaXN0KCkpKQp9&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1520.736|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). [rast] unknown extent| vegmap_raster|stem||7c1fa6d4fe95368b|ea12d674ae33b1c9|1016620066||t20462.7183129309s||0|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IE5VTEwpLCAKICAgICAgICBsaXN0KCkpKQp9&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||13.393||crs not found: is it missing? climate_chelsa_release|stem|88f9252bc7d9ed1a|4c496a15fe2faf91|97208ffa76a10d39|-670781068||t20461.8983898142s||81|rds|local|vector|||7.083|Failed to create release: 'raw_static' already exists!|object 'domain' not found domain.nc|stem|314f0006ad321020|f4caf66b195bedfe|7d2ec7c5e07cf5d8|797368847||t20462.7618461726s|s3623507b|3623507|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IGMoIkZPUk1BVD1OQzQiLCAKICAgICAgICAiQ09NUFJFU1M9REVGTEFURSIsICJaTEVWRUw9OSIpKSwgbGlzdCgpKSkKfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1585.126|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). [writeRaster] consider writeCDF to write ncdf files| vegmap.nc|stem||f1094a5facfce02e|98fce78e25b3b6cb|-1931934530||t20462.7644244077s||0|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IGMoIkZPUk1BVD1OQzQiLCAKICAgICAgICAiQ09NUFJFU1M9REVGTEFURSIsICJaTEVWRUw9OSIpKSwgbGlzdCgpKSkKfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||222.555|attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1)|[==] raster has no values -national_boundary|function|8e86fb14d36f5061 -get_domain|function|73c97bc96bfedda4 -domain_distance|function|939a115603a9b4df -domain_remnants|function|4c6497b244bdbc02 -domain_remnants_release|function|d06ba69c89670801 -domain_distance_release|function|c9d2a5f3c74dfc11 +national_boundary|function|8e86fb14d36f5061||||||||||||||| +get_domain|function|73c97bc96bfedda4||||||||||||||| +domain_distance|function|939a115603a9b4df||||||||||||||| +domain_remnants|function|4c6497b244bdbc02||||||||||||||| +domain_remnants_release|function|d06ba69c89670801||||||||||||||| +domain_distance_release|function|c9d2a5f3c74dfc11||||||||||||||| 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.074|| domain.tif|stem|e51bb36f9f6f3a70|f4caf66b195bedfe|df22595d26cedbec|1539589734||t20462.8142474563s|s6091277b|6091277|format_custom&read=ewogICAgdG1wIDwtIHRlbXBkaXIoKQogICAgemlwOjp1bnppcCh6aXBmaWxlID0gcGF0aCwgZXhkaXIgPSB0bXApCiAgICB0ZXJyYTo6cmFzdChmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkpCn0&write=ewogICAgdG1wIDwtIHdpdGhyOjpsb2NhbF90ZW1wZGlyKCkKICAgIHJhc3Rlcl90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkKICAgIHppcF90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCAib2JqZWN0LnppcCIpCiAgICBkby5jYWxsKHRlcnJhOjp3cml0ZVJhc3RlciwgYyhsaXN0KHggPSBvYmplY3QsIGZpbGVuYW1lID0gcmFzdGVyX3RtcF9maWxlLCAKICAgICAgICBmaWxldHlwZSA9ICJHVGlmZiIsIG92ZXJ3cml0ZSA9IFRSVUUsIGdkYWwgPSBjKCJDT01QUkVTUz1ERUZMQVRFIiwgCiAgICAgICAgIlpMRVZFTD05IikpLCBsaXN0KCkpKQogICAgcmFzdGVyX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHRtcCwgZnVsbC5uYW1lcyA9IFRSVUUpCiAgICB6aXA6OnppcCh6aXBmaWxlID0gemlwX3RtcF9maWxlLCBmaWxlcyA9IHJhc3Rlcl9maWxlcywgY29tcHJlc3Npb25fbGV2ZWwgPSAxLCAKICAgICAgICBtb2RlID0gImNoZXJyeS1waWNrIiwgcm9vdCA9IHRtcCkKICAgIGZpbGUuY29weSh6aXBfdG1wX2ZpbGUsIHBhdGgpCn0&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1370.939|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1)| vegmap.tif|stem||ba090534dd7ca5ef|9c77befa3fc97dcc|-1280618250||t20462.816821373s||0|format_custom&read=ewogICAgdG1wIDwtIHRlbXBkaXIoKQogICAgemlwOjp1bnppcCh6aXBmaWxlID0gcGF0aCwgZXhkaXIgPSB0bXApCiAgICB0ZXJyYTo6cmFzdChmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkpCn0&write=ewogICAgdG1wIDwtIHdpdGhyOjpsb2NhbF90ZW1wZGlyKCkKICAgIHJhc3Rlcl90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkKICAgIHppcF90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCAib2JqZWN0LnppcCIpCiAgICBkby5jYWxsKHRlcnJhOjp3cml0ZVJhc3RlciwgYyhsaXN0KHggPSBvYmplY3QsIGZpbGVuYW1lID0gcmFzdGVyX3RtcF9maWxlLCAKICAgICAgICBmaWxldHlwZSA9ICJHVGlmZiIsIG92ZXJ3cml0ZSA9IFRSVUUsIGdkYWwgPSBjKCJDT01QUkVTUz1ERUZMQVRFIiwgCiAgICAgICAgIlpMRVZFTD05IikpLCBsaXN0KCkpKQogICAgcmFzdGVyX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHRtcCwgZnVsbC5uYW1lcyA9IFRSVUUpCiAgICB6aXA6OnppcCh6aXBmaWxlID0gemlwX3RtcF9maWxlLCBmaWxlcyA9IHJhc3Rlcl9maWxlcywgY29tcHJlc3Npb25fbGV2ZWwgPSAxLCAKICAgICAgICBtb2RlID0gImNoZXJyeS1waWNrIiwgcm9vdCA9IHRtcCkKICAgIGZpbGUuY29weSh6aXBfdG1wX2ZpbGUsIHBhdGgpCn0&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||222.265|attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)|[==] raster has no values domain.gpkg|stem|3752155dbbfebdfc|d071234244cc8a00|c3152e2a22ed6a1e|105859277||t20462.8197902732s|s3072000b|3072000|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||17.522|| -get_release_elevation_nasadem|function|0404b4ce37dd6a41 -vegmap_shp|stem|9cade294bcf5aff4|b0eab1feb27fee68|2c530c1562a7fbd1|-979952299|data/manual_download/NVM2024/NVM2024Final_IEM5_12_07012025.shp|t20116.581712963s|s499322168b|499322168|file|local|vector|||0.046|| +get_release_elevation_nasadem|function|0404b4ce37dd6a41||||||||||||||| country.gpkg|stem|2582513b02199b9d|81ddbcfc163d4096|40e5cb748104ac36|728599321|data/raw/country.gpkg|t20465.7424674251s|s4964352b|4964352|file|local|vector|||13.63|| -country.parquet|stem|2f020da9d9337cd7|81ddbcfc163d4096|d69a2e915984e8ce|1129261391|data/raw/country.parquet|t20465.7465198048s|s4488713b|4488713|file|local|vector|||13.315|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.| -domain.parquet|stem|99d1cde1bbf915bc|7f3fdd56ef8d2af4|ce665ceba2e46c85|522092063|data/raw/domain.parquet|t20465.7480302693s|s1548371b|1548371|file|local|vector|||17.912|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.| domain_bbox|stem|09b657536e3c59a9|91710e24cd731172|832da33b4d2d7b12|1880263597||t20465.7494766091s|s1960b|1960|rds|local|vector|||0.023|| +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.043|| +domain_nc|stem|96dc0114379d9051|b8acd697cd8f2d9d|44a1851f1c7c45da|191087344|data/raw/domain.nc|t20466.8819384602s|s8239559b|8239559|file|local|vector|||314.971|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| +vegmap_nc|stem|64e699364294e6c9|b5acbb48248b9d4e|498003e3b29b0906|573083685|data/raw/vegmap.nc|t20466.8844654185s|s1262002b|1262002|file|local|vector|||218.292|attribute variables are assumed to be spatially constant throughout all geometries| +get_release_elevation_nasadem_appears|function|2aa9c12e93873a06||||||||||||||| +elevation_nasadem_release|stem||844ad2839f008475|2c530c1562a7fbd1|-1675952279||t20466.886570181s||0|rds|local|vector|||0.049||could not find function 'get_release_elevation_nasadem' +elevation|stem||5fbbedebd1d63e4c|407f9094edd58a6c|223776802||t20466.8883945611s||0|file|local|vector|||2975.358||Task polling timed out after 600 seconds +.tar_release_upload_with_retry|function|fec3488334573a3c||||||||||||||| +rel_store|object|e6e2823525d141fc||||||||||||||| +rel_resources|object|5ee4b402b43d8c80||||||||||||||| +.tar_release_validate_file|function|e3d4de13c3c072ff||||||||||||||| +tar_release_resources|function|53ebe2d610ecbda8||||||||||||||| +.tar_release_download_with_retry|function|4330c4f0ead9e90e||||||||||||||| +tar_release_storage|function|ec8c17bd82f64ec2||||||||||||||| +domain.parquet|stem|c46b7f544a0c0629|7f3fdd56ef8d2af4|8fe712f7a50fc85a|522092063|data/raw/domain.parquet|t20467.8492217853s|s2564266b|2564266|file|local|vector|||22.597|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.| +.tar_github_release_exists|function|ca7fe334b03daa9f||||||||||||||| +.tar_github_release_upload|function|5737138f4a437610||||||||||||||| +.tar_github_release_download|function|fb6fac5d9f78a572||||||||||||||| +country.parquet|stem|2f020da9d9337cd7|81ddbcfc163d4096|e104ab210d1047f3|1129261391|data/target_outputs/country.parquet|t20467.8667292114s|s4488713b|4488713|file|local|vector|||12.091|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.| +run_mode|object|2a9122a6b200ac1c domain_map|function|9b57e91e94d73101 -rstoken|object|4bf0792e28803049 +rstoken|object|36a62e4262736b46 robust_pb_download_solo|function|d148e32c5f7beb8f fit_model|function|8f8e281853bbef05 process_dynamic_data_to_parquet|function|49f8abfce5758803 clean_data|function|860451632161bcc2 -domain_rasterize|function|e0740e5311ca7859 +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 robust_pb_upload|function|bf296132f5183235 -.Random.seed|object|805b536a7f5d5cd1 +.Random.seed|object|43fa95ff9e08ad2a tag|object|64ff18d09ad298f3 earthdata_user|object|a72c4475a256a3c1 sys_info|object|ada53e2071fe586e max_layers|object|08d5f59e833de599 -get_country|function|b4bcab6cf1c0d400 +get_country|function|bf54208b5dd9f5ca existing_kr|object|1bb3bf184f7669e1 get_alos_data|function|75cf21dd60609648 +tar_github_release_resources|function|5005c1e1d1f13042 +download_vegmap_release|function|0273ecf8e3505b66 process_fix_modis_projection|function|08e12464ac799094 group_data_function|function|3e4778f64d247976 -data_vegmap|function|b1daf0507f348162 +data_vegmap|function|3aea21ddb80cc68d +get_elevation|function|44cce564be9070e7 get_release_soil_gcfr|function|a0922c0000fe3eac -get_release_elevation_nasadem_appears|function|fe04e4111f3982dd get_release_ndvi_viirs_appeears|function|e0bb04ad860b66e9 release_data|function|2c9988c7000cc9cb spatial_outputs|function|d4fac95c20424f91 @@ -62,85 +81,17 @@ robust_max|function|6d27abe569a34028 get_release_landcover_za|function|9ece1e5f946d7a70 get_vegmap|function|8590caba91b9be39 get_release_fire_modis_appeears|function|9992a7da9cc6cf78 -domain_define|function|cb41ddab55d0ec99 +domain_define|function|6e7942fc59c20a13 kr_name|object|643fa3c4a8310651 temp_directory|object|40d122f36d50a344 +gh_repo|object|99ea6a765ca4c7d7 earthdata_pass|object|b61b0b830c8b3de2 -update_git|function|8d72fa6c21b94951 sleep_time|object|9f0cda529028d8d9 -get_model_data|function|dc3148c05e8961ed -get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 -make_domain_bbox|function|b106dd9507ac5ef3 -robust_min|function|21d2e9972a741573 -robust_pb_download|function|4df763e84d88eae4 -get_release_clouds_wilson|function|76923df0f19c017f -get_chelsa|function|f63060c4751e6183 -get_release_climate_chelsa|function|f63060c4751e6183 -get_release_alos|function|3d0bd84374208048 -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_alos|function|d1225f8b3a3fa4da -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||b8acd697cd8f2d9d|ac638b4aeb166003|191087344||t20465.7648402129s||0|file|local|vector|||3549.024|attribute variables are assumed to be spatially constant throughout all geometries|[writeCDF] file exists, use 'overwrite=TRUE' to overwrite it -domain_map|function|9b57e91e94d73101 -rstoken|object|4bf0792e28803049 -robust_pb_download_solo|function|d148e32c5f7beb8f -fit_model|function|8f8e281853bbef05 -process_dynamic_data_to_parquet|function|49f8abfce5758803 -clean_data|function|860451632161bcc2 -domain_rasterize|function|4ec214aea2a4465f -robust_download_file|function|2ea70b1df9a469fc -verbose|object|988c41ba10911dc8 -kr_pwd|object|b61b0b830c8b3de2 -get_release_precipitation_chelsa|function|e5a54d4f8a475a6c -summarize_posteriors|function|848f748de452ef0d -robust_pb_upload|function|bf296132f5183235 -.Random.seed|object|da4641d028eaef2b -tag|object|64ff18d09ad298f3 -earthdata_user|object|a72c4475a256a3c1 -sys_info|object|ada53e2071fe586e -max_layers|object|08d5f59e833de599 -get_country|function|b4bcab6cf1c0d400 -existing_kr|object|1bb3bf184f7669e1 -get_alos_data|function|75cf21dd60609648 -download_vegmap_release|function|2838a077173b98de -process_fix_modis_projection|function|08e12464ac799094 -group_data_function|function|3e4778f64d247976 -data_vegmap|function|fd7316b05a56d633 -get_release_soil_gcfr|function|a0922c0000fe3eac -get_release_elevation_nasadem_appears|function|d941577352cbced4 -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 -robust_max|function|6d27abe569a34028 -get_release_landcover_za|function|9ece1e5f946d7a70 -get_vegmap|function|8590caba91b9be39 -get_release_fire_modis_appeears|function|9992a7da9cc6cf78 -domain_define|function|cb41ddab55d0ec99 -kr_name|object|643fa3c4a8310651 -temp_directory|object|40d122f36d50a344 -earthdata_pass|object|b61b0b830c8b3de2 update_git|function|8d72fa6c21b94951 -sleep_time|object|9f0cda529028d8d9 get_model_data|function|dc3148c05e8961ed get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 make_domain_bbox|function|b106dd9507ac5ef3 +tar_github_release_repo|function|114735bd6395af43 robust_min|function|21d2e9972a741573 robust_pb_download|function|4df763e84d88eae4 get_release_clouds_wilson|function|76923df0f19c017f @@ -165,3 +116,4 @@ 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_bbox.parquet|stem|25cd0fd1894c1176|8ef5b89424c2d345|5554f6acc3530829|1651755667|data/raw/domain_bbox.parquet|t20467.8670711282s|s15057b|15057|file|repository_cas&upload=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICBpZiAoZmlsZS5leGlzdHMocGF0aCkgJiYgIWRpci5leGlzdHMocGF0aCkpIHsKICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBVcGxvYWRpbmcgZmlsZTogIiwga2V5KQogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl91cGxvYWQoZmlsZSA9IHBhdGgsIHJlcG8gPSByZXBvLCB0YWcgPSB0YWcsIAogICAgICAgICAgICAgICAgbmFtZSA9IGtleSwgb3ZlcndyaXRlID0gVFJVRSwgLnRva2VuID0gTlVMTCkKICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmlsZSB1cGxvYWRlZDogIiwga2V5KQogICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBzdG9wKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBGYWlsZWQgdG8gdXBsb2FkIGZpbGU6ICIsIAogICAgICAgICAgICAgICAgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICB9KQogICAgfQogICAgZWxzZSB7CiAgICAgICAgb2JqIDwtIHJlYWRSRFMocGF0aCkKICAgICAgICB0ZW1wX2ZpbGUgPC0gdGVtcGZpbGUoZmlsZWV4dCA9IHBhc3RlMCgiLiIsIGZvcm1hdCkpCiAgICAgICAgb24uZXhpdCh1bmxpbmsodGVtcF9maWxlKSwgYWRkID0gVFJVRSkKICAgICAgICBpZiAoZm9ybWF0ID09ICJxcyIpIHsKICAgICAgICAgICAgcXM6OnFzYXZlKG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInJkcyIpIHsKICAgICAgICAgICAgc2F2ZVJEUyhvYmosIHRlbXBfZmlsZSkKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZm9ybWF0ID09ICJwYXJxdWV0IikgewogICAgICAgICAgICBhcnJvdzo6d3JpdGVfcGFycXVldChvYmosIHRlbXBfZmlsZSkKICAgICAgICB9CiAgICAgICAgbWF4X2F0dGVtcHRzIDwtIDUKICAgICAgICBmb3IgKGF0dGVtcHQgaW4gMTptYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgdHJ5Q2F0Y2goewogICAgICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl91cGxvYWQoZmlsZSA9IHRlbXBfZmlsZSwgcmVwbyA9IHJlcG8sIAogICAgICAgICAgICAgICAgICB0YWcgPSB0YWcsIG5hbWUgPSBrZXksIG92ZXJ3cml0ZSA9IFRSVUUsIC50b2tlbiA9IE5VTEwpCiAgICAgICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBPYmplY3QgdXBsb2FkZWQ6ICIsIAogICAgICAgICAgICAgICAgICBrZXkpCiAgICAgICAgICAgICAgICByZXR1cm4oaW52aXNpYmxlKCkpCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gVXBsb2FkIGF0dGVtcHQgIiwgCiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCwgIiBmYWlsZWQ6ICIsIGNvbmRpdGlvbk1lc3NhZ2UoZSkpCiAgICAgICAgICAgICAgICAgIFN5cy5zbGVlcCgyKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgIHN0b3AoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZhaWxlZCB0byB1cGxvYWQgYWZ0ZXIgIiwgCiAgICAgICAgICAgICAgICAgICAgbWF4X2F0dGVtcHRzLCAiIGF0dGVtcHRzOiAiLCBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KQogICAgICAgIH0KICAgIH0KfQ&download=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICBjYWNoZV9kaXIgPC0gU3lzLmdldGVudigiVEFSX0dIX1JFTEVBU0VfQ0FDSEVfRElSIikKICAgIGRpci5jcmVhdGUoY2FjaGVfZGlyLCByZWN1cnNpdmUgPSBUUlVFLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKICAgIGNhY2hlZF9maWxlIDwtIGZpbGUucGF0aChjYWNoZV9kaXIsIGtleSkKICAgIG5lZWRfZG93bmxvYWQgPC0gVFJVRQogICAgaWYgKGZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcmVtb3RlX2Fzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIAogICAgICAgICAgICAgICAgdGFnID0gdGFnKQogICAgICAgICAgICByZW1vdGVfYXNzZXQgPC0gcmVtb3RlX2Fzc2V0c1tyZW1vdGVfYXNzZXRzJGZpbGVfbmFtZSA9PSAKICAgICAgICAgICAgICAgIGtleSwgXQogICAgICAgICAgICBpZiAobnJvdyhyZW1vdGVfYXNzZXQpID4gMCkgewogICAgICAgICAgICAgICAgbG9jYWxfc2l6ZSA8LSBmaWxlLnNpemUoY2FjaGVkX2ZpbGUpCiAgICAgICAgICAgICAgICByZW1vdGVfc2l6ZSA8LSByZW1vdGVfYXNzZXQkc2l6ZVsxXQogICAgICAgICAgICAgICAgaWYgKGxvY2FsX3NpemUgPT0gcmVtb3RlX3NpemUpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ2FjaGUgdmFsaWQgKHNpemUgbWF0Y2g6ICIsIAogICAgICAgICAgICAgICAgICAgIGxvY2FsX3NpemUsICIgYnl0ZXMpIikKICAgICAgICAgICAgICAgICAgbmVlZF9kb3dubG9hZCA8LSBGQUxTRQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIENvdWxkIG5vdCB2ZXJpZnkgY2FjaGU6ICIsIAogICAgICAgICAgICAgICAgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICB9KQogICAgfQogICAgaWYgKG5lZWRfZG93bmxvYWQpIHsKICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX2Rvd25sb2FkKGZpbGUgPSBrZXksIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBkZXN0ID0gY2FjaGVfZGlyLCBvdmVyd3JpdGUgPSBUUlVFKQogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIGRvd25sb2FkIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHN0b3AoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZhaWxlZCB0byByZXRyaWV2ZTogIiwga2V5KQogICAgfQogICAgZmlsZV9leHRzIDwtIGMoInBhcnF1ZXQiLCAibmMiLCAidGlmIiwgImdwa2ciLCAic2hwIiwgImRiZiIsIAogICAgICAgICJwcmoiLCAic2h4IikKICAgIGlzX3NwYXRpYWxfZmlsZSA8LSBhbnkoZW5kc1dpdGgodG9sb3dlcihrZXkpLCBwYXN0ZTAoIi4iLCAKICAgICAgICBmaWxlX2V4dHMpKSkKICAgIGlmIChpc19zcGF0aWFsX2ZpbGUpIHsKICAgICAgICBmaWxlLmNvcHkoY2FjaGVkX2ZpbGUsIHBhdGgsIG92ZXJ3cml0ZSA9IFRSVUUpCiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gUmV0cmlldmVkIGZpbGU6ICIsIGtleSkKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBvYmogPC0gcXM6OnFyZWFkKGNhY2hlZF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInJkcyIpIHsKICAgICAgICAgICAgb2JqIDwtIHJlYWRSRFMoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicGFycXVldCIpIHsKICAgICAgICAgICAgb2JqIDwtIGFycm93OjpyZWFkX3BhcnF1ZXQoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIHNhdmVSRFMob2JqLCBwYXRoKQogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFJldHJpZXZlZCBhbmQgZGVzZXJpYWxpemVkOiAiLCAKICAgICAgICAgICAga2V5KQogICAgfQogICAgaW52aXNpYmxlKCkKfQ&exists=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgdHJ5Q2F0Y2goewogICAgICAgIGFzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIHRhZyA9IHRhZykKICAgICAgICBhbnkoYXNzZXRzJGZpbGVfbmFtZSA9PSBrZXkpCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBGQUxTRQogICAgfSkKfQ&list=&consistent=RkFMU0U|vector|||||Error hashing output: timed out after retrying for 64.645 seconds. Path data/target_outputs/domain_bbox.parquet does not exist or has incorrect hash. File sync timed out. From fd0c800fb71d51f6951e2864907cb3db8b6eb986 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Wed, 14 Jan 2026 21:35:07 -0500 Subject: [PATCH 52/58] Enhance domain bounding box function and GitHub release handling: - Update output path for domain bounding box to "data/target_outputs/domain_bbox.parquet" and ensure directory creation. - Convert bounding box to a simple data frame with WKT geometry before writing as parquet. - Improve GitHub release upload process with credential handling and retry logic for uploads. - Adjust cue mode for domain bounding box task based on run mode. --- R/domain_bbox.R | 2 +- R/tar_release_storage.R | 65 ++++++++++++++++++++++++++++++----------- _targets.R | 4 ++- _targets/meta/meta | 10 +++---- 4 files changed, 57 insertions(+), 24 deletions(-) diff --git a/R/domain_bbox.R b/R/domain_bbox.R index 71f82d96..e901011f 100644 --- a/R/domain_bbox.R +++ b/R/domain_bbox.R @@ -7,7 +7,7 @@ #' @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/raw/domain_bbox.parquet") { +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) diff --git a/R/tar_release_storage.R b/R/tar_release_storage.R index cb92e87d..9dabd2d6 100644 --- a/R/tar_release_storage.R +++ b/R/tar_release_storage.R @@ -75,19 +75,44 @@ tar_github_release_repo <- function( if (file.exists(path) && !dir.exists(path)) { message("[tar_github_release] Uploading file: ", key) - tryCatch({ - piggyback::pb_upload( - file = path, - repo = repo, - tag = tag, - name = key, - overwrite = TRUE, - .token = NULL - ) - message("[tar_github_release] File uploaded: ", key) + + # Get credentials + creds <- tryCatch({ + gitcreds::gitcreds_get() }, error = function(e) { - stop("[tar_github_release] Failed to upload file: ", conditionMessage(e)) + message("[tar_github_release] No git credentials found, trying without token") + NULL }) + + token <- if (!is.null(creds)) creds$password else NULL + + max_attempts <- 3 + uploaded <- FALSE + + for (attempt in 1:max_attempts) { + tryCatch({ + piggyback::pb_upload( + file = path, + repo = repo, + tag = tag, + name = key, + overwrite = TRUE, + .token = token + ) + message("[tar_github_release] File uploaded successfully: ", key) + # Give GitHub time to process the file + Sys.sleep(1) + uploaded <- TRUE + return(invisible()) + }, error = function(e) { + message("[tar_github_release] Upload attempt ", attempt, " failed: ", conditionMessage(e)) + if (attempt < max_attempts) { + Sys.sleep(2) + } else { + stop("[tar_github_release] Failed to upload file after ", max_attempts, " attempts: ", conditionMessage(e)) + } + }) + } } else { obj <- readRDS(path) temp_file <- tempfile(fileext = paste0(".", format)) @@ -206,12 +231,18 @@ tar_github_release_repo <- function( repo <- Sys.getenv("TAR_GH_RELEASE_REPO") tag <- Sys.getenv("TAR_GH_RELEASE_TAG") - tryCatch({ - assets <- piggyback::pb_list(repo = repo, tag = tag) - any(assets$file_name == key) - }, error = function(e) { - FALSE - }) + # Retry a few times in case file was just uploaded + for (attempt in 1:3) { + tryCatch({ + assets <- piggyback::pb_list(repo = repo, tag = tag) + found <- any(assets$file_name == key) + if (found) return(TRUE) + if (attempt < 3) Sys.sleep(1) + }, error = function(e) { + if (attempt < 3) Sys.sleep(1) + }) + } + FALSE } ) } diff --git a/_targets.R b/_targets.R index f932cb98..d52922fb 100644 --- a/_targets.R +++ b/_targets.R @@ -10,6 +10,8 @@ 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) @@ -149,7 +151,7 @@ list( make_domain_bbox(domain.parquet, buffer_m = 50000, out_file = "data/target_outputs/domain_bbox.parquet"), format = "file", repository = gh_repo, - cue = tar_cue(mode = "never") # Never re-download RS data unless manually invalidated - changes in domain.parquet won't affect this. + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") ), # Domain raster with pixel IDs, remnants, and distance to remnants (NetCDF with CF-1.8 metadata) diff --git a/_targets/meta/meta b/_targets/meta/meta index c5f5d3c2..3ab02eed 100644 --- a/_targets/meta/meta +++ b/_targets/meta/meta @@ -57,7 +57,7 @@ kr_pwd|object|b61b0b830c8b3de2 get_release_precipitation_chelsa|function|e5a54d4f8a475a6c summarize_posteriors|function|848f748de452ef0d robust_pb_upload|function|bf296132f5183235 -.Random.seed|object|43fa95ff9e08ad2a +.Random.seed|object|0614c5b2f86fb10f tag|object|64ff18d09ad298f3 earthdata_user|object|a72c4475a256a3c1 sys_info|object|ada53e2071fe586e @@ -84,14 +84,14 @@ get_release_fire_modis_appeears|function|9992a7da9cc6cf78 domain_define|function|6e7942fc59c20a13 kr_name|object|643fa3c4a8310651 temp_directory|object|40d122f36d50a344 -gh_repo|object|99ea6a765ca4c7d7 +gh_repo|object|dbe88c1b061b73dc earthdata_pass|object|b61b0b830c8b3de2 sleep_time|object|9f0cda529028d8d9 update_git|function|8d72fa6c21b94951 get_model_data|function|dc3148c05e8961ed get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 -make_domain_bbox|function|b106dd9507ac5ef3 -tar_github_release_repo|function|114735bd6395af43 +make_domain_bbox|function|ab87f16359e01392 +tar_github_release_repo|function|f264edf951256e9b robust_min|function|21d2e9972a741573 robust_pb_download|function|4df763e84d88eae4 get_release_clouds_wilson|function|76923df0f19c017f @@ -116,4 +116,4 @@ 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_bbox.parquet|stem|25cd0fd1894c1176|8ef5b89424c2d345|5554f6acc3530829|1651755667|data/raw/domain_bbox.parquet|t20467.8670711282s|s15057b|15057|file|repository_cas&upload=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICBpZiAoZmlsZS5leGlzdHMocGF0aCkgJiYgIWRpci5leGlzdHMocGF0aCkpIHsKICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBVcGxvYWRpbmcgZmlsZTogIiwga2V5KQogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl91cGxvYWQoZmlsZSA9IHBhdGgsIHJlcG8gPSByZXBvLCB0YWcgPSB0YWcsIAogICAgICAgICAgICAgICAgbmFtZSA9IGtleSwgb3ZlcndyaXRlID0gVFJVRSwgLnRva2VuID0gTlVMTCkKICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmlsZSB1cGxvYWRlZDogIiwga2V5KQogICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBzdG9wKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBGYWlsZWQgdG8gdXBsb2FkIGZpbGU6ICIsIAogICAgICAgICAgICAgICAgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICB9KQogICAgfQogICAgZWxzZSB7CiAgICAgICAgb2JqIDwtIHJlYWRSRFMocGF0aCkKICAgICAgICB0ZW1wX2ZpbGUgPC0gdGVtcGZpbGUoZmlsZWV4dCA9IHBhc3RlMCgiLiIsIGZvcm1hdCkpCiAgICAgICAgb24uZXhpdCh1bmxpbmsodGVtcF9maWxlKSwgYWRkID0gVFJVRSkKICAgICAgICBpZiAoZm9ybWF0ID09ICJxcyIpIHsKICAgICAgICAgICAgcXM6OnFzYXZlKG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInJkcyIpIHsKICAgICAgICAgICAgc2F2ZVJEUyhvYmosIHRlbXBfZmlsZSkKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZm9ybWF0ID09ICJwYXJxdWV0IikgewogICAgICAgICAgICBhcnJvdzo6d3JpdGVfcGFycXVldChvYmosIHRlbXBfZmlsZSkKICAgICAgICB9CiAgICAgICAgbWF4X2F0dGVtcHRzIDwtIDUKICAgICAgICBmb3IgKGF0dGVtcHQgaW4gMTptYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgdHJ5Q2F0Y2goewogICAgICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl91cGxvYWQoZmlsZSA9IHRlbXBfZmlsZSwgcmVwbyA9IHJlcG8sIAogICAgICAgICAgICAgICAgICB0YWcgPSB0YWcsIG5hbWUgPSBrZXksIG92ZXJ3cml0ZSA9IFRSVUUsIC50b2tlbiA9IE5VTEwpCiAgICAgICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBPYmplY3QgdXBsb2FkZWQ6ICIsIAogICAgICAgICAgICAgICAgICBrZXkpCiAgICAgICAgICAgICAgICByZXR1cm4oaW52aXNpYmxlKCkpCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gVXBsb2FkIGF0dGVtcHQgIiwgCiAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdCwgIiBmYWlsZWQ6ICIsIGNvbmRpdGlvbk1lc3NhZ2UoZSkpCiAgICAgICAgICAgICAgICAgIFN5cy5zbGVlcCgyKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgIHN0b3AoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZhaWxlZCB0byB1cGxvYWQgYWZ0ZXIgIiwgCiAgICAgICAgICAgICAgICAgICAgbWF4X2F0dGVtcHRzLCAiIGF0dGVtcHRzOiAiLCBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KQogICAgICAgIH0KICAgIH0KfQ&download=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICBjYWNoZV9kaXIgPC0gU3lzLmdldGVudigiVEFSX0dIX1JFTEVBU0VfQ0FDSEVfRElSIikKICAgIGRpci5jcmVhdGUoY2FjaGVfZGlyLCByZWN1cnNpdmUgPSBUUlVFLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKICAgIGNhY2hlZF9maWxlIDwtIGZpbGUucGF0aChjYWNoZV9kaXIsIGtleSkKICAgIG5lZWRfZG93bmxvYWQgPC0gVFJVRQogICAgaWYgKGZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcmVtb3RlX2Fzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIAogICAgICAgICAgICAgICAgdGFnID0gdGFnKQogICAgICAgICAgICByZW1vdGVfYXNzZXQgPC0gcmVtb3RlX2Fzc2V0c1tyZW1vdGVfYXNzZXRzJGZpbGVfbmFtZSA9PSAKICAgICAgICAgICAgICAgIGtleSwgXQogICAgICAgICAgICBpZiAobnJvdyhyZW1vdGVfYXNzZXQpID4gMCkgewogICAgICAgICAgICAgICAgbG9jYWxfc2l6ZSA8LSBmaWxlLnNpemUoY2FjaGVkX2ZpbGUpCiAgICAgICAgICAgICAgICByZW1vdGVfc2l6ZSA8LSByZW1vdGVfYXNzZXQkc2l6ZVsxXQogICAgICAgICAgICAgICAgaWYgKGxvY2FsX3NpemUgPT0gcmVtb3RlX3NpemUpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ2FjaGUgdmFsaWQgKHNpemUgbWF0Y2g6ICIsIAogICAgICAgICAgICAgICAgICAgIGxvY2FsX3NpemUsICIgYnl0ZXMpIikKICAgICAgICAgICAgICAgICAgbmVlZF9kb3dubG9hZCA8LSBGQUxTRQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIENvdWxkIG5vdCB2ZXJpZnkgY2FjaGU6ICIsIAogICAgICAgICAgICAgICAgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICB9KQogICAgfQogICAgaWYgKG5lZWRfZG93bmxvYWQpIHsKICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX2Rvd25sb2FkKGZpbGUgPSBrZXksIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBkZXN0ID0gY2FjaGVfZGlyLCBvdmVyd3JpdGUgPSBUUlVFKQogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIGRvd25sb2FkIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHN0b3AoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZhaWxlZCB0byByZXRyaWV2ZTogIiwga2V5KQogICAgfQogICAgZmlsZV9leHRzIDwtIGMoInBhcnF1ZXQiLCAibmMiLCAidGlmIiwgImdwa2ciLCAic2hwIiwgImRiZiIsIAogICAgICAgICJwcmoiLCAic2h4IikKICAgIGlzX3NwYXRpYWxfZmlsZSA8LSBhbnkoZW5kc1dpdGgodG9sb3dlcihrZXkpLCBwYXN0ZTAoIi4iLCAKICAgICAgICBmaWxlX2V4dHMpKSkKICAgIGlmIChpc19zcGF0aWFsX2ZpbGUpIHsKICAgICAgICBmaWxlLmNvcHkoY2FjaGVkX2ZpbGUsIHBhdGgsIG92ZXJ3cml0ZSA9IFRSVUUpCiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gUmV0cmlldmVkIGZpbGU6ICIsIGtleSkKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBvYmogPC0gcXM6OnFyZWFkKGNhY2hlZF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInJkcyIpIHsKICAgICAgICAgICAgb2JqIDwtIHJlYWRSRFMoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicGFycXVldCIpIHsKICAgICAgICAgICAgb2JqIDwtIGFycm93OjpyZWFkX3BhcnF1ZXQoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIHNhdmVSRFMob2JqLCBwYXRoKQogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFJldHJpZXZlZCBhbmQgZGVzZXJpYWxpemVkOiAiLCAKICAgICAgICAgICAga2V5KQogICAgfQogICAgaW52aXNpYmxlKCkKfQ&exists=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgdHJ5Q2F0Y2goewogICAgICAgIGFzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIHRhZyA9IHRhZykKICAgICAgICBhbnkoYXNzZXRzJGZpbGVfbmFtZSA9PSBrZXkpCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICBGQUxTRQogICAgfSkKfQ&list=&consistent=RkFMU0U|vector|||||Error hashing output: timed out after retrying for 64.645 seconds. Path data/target_outputs/domain_bbox.parquet does not exist or has incorrect hash. File sync timed out. +domain_bbox.parquet|stem|e5b3381be6d92804|8ef5b89424c2d345|53a5940910611673|1651755667|data/target_outputs/domain_bbox.parquet|t20468.1054726828s|s11877b|11877|file|repository_cas&upload=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICByZWxlYXNlX2V4aXN0cyA8LSBGQUxTRQogICAgdHJ5Q2F0Y2goewogICAgICAgIGFzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIHRhZyA9IHRhZykKICAgICAgICByZWxlYXNlX2V4aXN0cyA8LSBUUlVFCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICByZWxlYXNlX2V4aXN0cyA8PC0gRkFMU0UKICAgIH0pCiAgICBpZiAoIXJlbGVhc2VfZXhpc3RzKSB7CiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ3JlYXRpbmcgcmVsZWFzZTogIiwgdGFnKQogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl9uZXdfcmVsZWFzZShyZXBvID0gcmVwbywgdGFnID0gdGFnKQogICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBSZWxlYXNlIGNyZWF0ZWQ6ICIsIAogICAgICAgICAgICAgICAgdGFnKQogICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoIWdyZXBsKCJhbHJlYWR5IGV4aXN0cyIsIHRvbG93ZXIoY29uZGl0aW9uTWVzc2FnZShlKSkpKSB7CiAgICAgICAgICAgICAgICBzdG9wKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBGYWlsZWQgdG8gY3JlYXRlIHJlbGVhc2U6ICIsIAogICAgICAgICAgICAgICAgICBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgIH0KICAgIGlmIChmaWxlLmV4aXN0cyhwYXRoKSAmJiAhZGlyLmV4aXN0cyhwYXRoKSkgewogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFVwbG9hZGluZyBmaWxlOiAiLCBrZXkpCiAgICAgICAgY3JlZHMgPC0gdHJ5Q2F0Y2goewogICAgICAgICAgICBnaXRjcmVkczo6Z2l0Y3JlZHNfZ2V0KCkKICAgICAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gTm8gZ2l0IGNyZWRlbnRpYWxzIGZvdW5kLCB0cnlpbmcgd2l0aG91dCB0b2tlbiIpCiAgICAgICAgICAgIE5VTEwKICAgICAgICB9KQogICAgICAgIHRva2VuIDwtIGlmICghaXMubnVsbChjcmVkcykpIAogICAgICAgICAgICBjcmVkcyRwYXNzd29yZAogICAgICAgIGVsc2UgTlVMTAogICAgICAgIG1heF9hdHRlbXB0cyA8LSAzCiAgICAgICAgdXBsb2FkZWQgPC0gRkFMU0UKICAgICAgICBmb3IgKGF0dGVtcHQgaW4gMTptYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgdHJ5Q2F0Y2goewogICAgICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl91cGxvYWQoZmlsZSA9IHBhdGgsIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBuYW1lID0ga2V5LCBvdmVyd3JpdGUgPSBUUlVFLCAudG9rZW4gPSB0b2tlbikKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZpbGUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5OiAiLCAKICAgICAgICAgICAgICAgICAga2V5KQogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDEpCiAgICAgICAgICAgICAgICB1cGxvYWRlZCA8LSBUUlVFCiAgICAgICAgICAgICAgICByZXR1cm4oaW52aXNpYmxlKCkpCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gVXBsb2FkIGF0dGVtcHQgIiwgCiAgICAgICAgICAgICAgICAgIGF0dGVtcHQsICIgZmFpbGVkOiAiLCBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIHVwbG9hZCBmaWxlIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBvYmogPC0gcmVhZFJEUyhwYXRoKQogICAgICAgIHRlbXBfZmlsZSA8LSB0ZW1wZmlsZShmaWxlZXh0ID0gcGFzdGUwKCIuIiwgZm9ybWF0KSkKICAgICAgICBvbi5leGl0KHVubGluayh0ZW1wX2ZpbGUpLCBhZGQgPSBUUlVFKQogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBxczo6cXNhdmUob2JqLCB0ZW1wX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicmRzIikgewogICAgICAgICAgICBzYXZlUkRTKG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInBhcnF1ZXQiKSB7CiAgICAgICAgICAgIGFycm93Ojp3cml0ZV9wYXJxdWV0KG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX3VwbG9hZChmaWxlID0gdGVtcF9maWxlLCByZXBvID0gcmVwbywgCiAgICAgICAgICAgICAgICAgIHRhZyA9IHRhZywgbmFtZSA9IGtleSwgb3ZlcndyaXRlID0gVFJVRSwgLnRva2VuID0gTlVMTCkKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIE9iamVjdCB1cGxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIHJldHVybihpbnZpc2libGUoKSkKICAgICAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heF9hdHRlbXB0cykgewogICAgICAgICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBVcGxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIHVwbG9hZCBhZnRlciAiLCAKICAgICAgICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHMsICIgYXR0ZW1wdHM6ICIsIGNvbmRpdGlvbk1lc3NhZ2UoZSkpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgfQp9&download=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICBjYWNoZV9kaXIgPC0gU3lzLmdldGVudigiVEFSX0dIX1JFTEVBU0VfQ0FDSEVfRElSIikKICAgIGRpci5jcmVhdGUoY2FjaGVfZGlyLCByZWN1cnNpdmUgPSBUUlVFLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKICAgIGNhY2hlZF9maWxlIDwtIGZpbGUucGF0aChjYWNoZV9kaXIsIGtleSkKICAgIG5lZWRfZG93bmxvYWQgPC0gVFJVRQogICAgaWYgKGZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcmVtb3RlX2Fzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIAogICAgICAgICAgICAgICAgdGFnID0gdGFnKQogICAgICAgICAgICByZW1vdGVfYXNzZXQgPC0gcmVtb3RlX2Fzc2V0c1tyZW1vdGVfYXNzZXRzJGZpbGVfbmFtZSA9PSAKICAgICAgICAgICAgICAgIGtleSwgXQogICAgICAgICAgICBpZiAobnJvdyhyZW1vdGVfYXNzZXQpID4gMCkgewogICAgICAgICAgICAgICAgbG9jYWxfc2l6ZSA8LSBmaWxlLnNpemUoY2FjaGVkX2ZpbGUpCiAgICAgICAgICAgICAgICByZW1vdGVfc2l6ZSA8LSByZW1vdGVfYXNzZXQkc2l6ZVsxXQogICAgICAgICAgICAgICAgaWYgKGxvY2FsX3NpemUgPT0gcmVtb3RlX3NpemUpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ2FjaGUgdmFsaWQgKHNpemUgbWF0Y2g6ICIsIAogICAgICAgICAgICAgICAgICAgIGxvY2FsX3NpemUsICIgYnl0ZXMpIikKICAgICAgICAgICAgICAgICAgbmVlZF9kb3dubG9hZCA8LSBGQUxTRQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIENvdWxkIG5vdCB2ZXJpZnkgY2FjaGU6ICIsIAogICAgICAgICAgICAgICAgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICB9KQogICAgfQogICAgaWYgKG5lZWRfZG93bmxvYWQpIHsKICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX2Rvd25sb2FkKGZpbGUgPSBrZXksIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBkZXN0ID0gY2FjaGVfZGlyLCBvdmVyd3JpdGUgPSBUUlVFKQogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIGRvd25sb2FkIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHN0b3AoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZhaWxlZCB0byByZXRyaWV2ZTogIiwga2V5KQogICAgfQogICAgZmlsZV9leHRzIDwtIGMoInBhcnF1ZXQiLCAibmMiLCAidGlmIiwgImdwa2ciLCAic2hwIiwgImRiZiIsIAogICAgICAgICJwcmoiLCAic2h4IikKICAgIGlzX3NwYXRpYWxfZmlsZSA8LSBhbnkoZW5kc1dpdGgodG9sb3dlcihrZXkpLCBwYXN0ZTAoIi4iLCAKICAgICAgICBmaWxlX2V4dHMpKSkKICAgIGlmIChpc19zcGF0aWFsX2ZpbGUpIHsKICAgICAgICBmaWxlLmNvcHkoY2FjaGVkX2ZpbGUsIHBhdGgsIG92ZXJ3cml0ZSA9IFRSVUUpCiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gUmV0cmlldmVkIGZpbGU6ICIsIGtleSkKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBvYmogPC0gcXM6OnFyZWFkKGNhY2hlZF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInJkcyIpIHsKICAgICAgICAgICAgb2JqIDwtIHJlYWRSRFMoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicGFycXVldCIpIHsKICAgICAgICAgICAgb2JqIDwtIGFycm93OjpyZWFkX3BhcnF1ZXQoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIHNhdmVSRFMob2JqLCBwYXRoKQogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFJldHJpZXZlZCBhbmQgZGVzZXJpYWxpemVkOiAiLCAKICAgICAgICAgICAga2V5KQogICAgfQogICAgaW52aXNpYmxlKCkKfQ&exists=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9yIChhdHRlbXB0IGluIDE6MykgewogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgYXNzZXRzIDwtIHBpZ2d5YmFjazo6cGJfbGlzdChyZXBvID0gcmVwbywgdGFnID0gdGFnKQogICAgICAgICAgICBmb3VuZCA8LSBhbnkoYXNzZXRzJGZpbGVfbmFtZSA9PSBrZXkpCiAgICAgICAgICAgIGlmIChmb3VuZCkgCiAgICAgICAgICAgICAgICByZXR1cm4oVFJVRSkKICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCAzKSAKICAgICAgICAgICAgICAgIFN5cy5zbGVlcCgxKQogICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IDMpIAogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDEpCiAgICAgICAgfSkKICAgIH0KICAgIEZBTFNFCn0&list=&consistent=RkFMU0U|vector|||0.065|| From f787953f0ccd323a4e1bf77246f1aa3eea382aa0 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Wed, 14 Jan 2026 21:37:53 -0500 Subject: [PATCH 53/58] Add logging for GITHUB_ACTIONS environment variable and improve run mode determination --- _targets.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/_targets.R b/_targets.R index d52922fb..89e4e077 100644 --- a/_targets.R +++ b/_targets.R @@ -29,7 +29,10 @@ library(sfarrow) } # Determine run mode: "prime" (full processing on server) or "update" (incremental on GitHub Actions) - run_mode <- if (Sys.getenv("GITHUB_ACTIONS") == "true") { + github_actions_env <- Sys.getenv("GITHUB_ACTIONS") + message(paste("GITHUB_ACTIONS env var:", github_actions_env, "| length:", nchar(github_actions_env))) + + run_mode <- if (tolower(github_actions_env) == "true") { "update" # Run incremental updates on GitHub Actions } else { "prime" # Default to prime meaning all targets are run From 68473b64a35fc1d0b1bc5710493948d3230f04be Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Wed, 14 Jan 2026 21:52:48 -0500 Subject: [PATCH 54/58] Refactor code structure for improved readability and maintainability --- .github/workflows/targets.yaml | 22 ++++----- R/domain_bbox.R | 20 +++++++- R/tar_release_storage.R | 19 +++++--- _targets.R | 26 +++++------ _targets/meta/meta | 83 ++++++++++++++++++++++++++++++++-- 5 files changed, 136 insertions(+), 34 deletions(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index 738f0f52..ade10048 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -129,17 +129,6 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Prepare failure artifact - if: failure() - run: rm -rf .git .github - - - name: Post failure artifact - if: failure() - uses: actions/upload-artifact@main - with: - name: ${{ runner.os }}-results - path: . - - name: Create review PR on failure if: failure() && github.event_name == 'push' env: @@ -188,6 +177,17 @@ jobs: --head "$BRANCH" \ --label "bug,auto-generated" + - name: Post failure artifact + if: failure() + uses: actions/upload-artifact@main + with: + 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: diff --git a/R/domain_bbox.R b/R/domain_bbox.R index e901011f..ff64d241 100644 --- a/R/domain_bbox.R +++ b/R/domain_bbox.R @@ -11,6 +11,24 @@ make_domain_bbox <- function(domain_parquet, buffer_m = 50000, out_file = "data/ 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) - sfarrow::st_write_parquet(bbox_sf, out_file) + + # 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/tar_release_storage.R b/R/tar_release_storage.R index 9dabd2d6..e6913a92 100644 --- a/R/tar_release_storage.R +++ b/R/tar_release_storage.R @@ -101,7 +101,7 @@ tar_github_release_repo <- function( ) message("[tar_github_release] File uploaded successfully: ", key) # Give GitHub time to process the file - Sys.sleep(1) + Sys.sleep(3) uploaded <- TRUE return(invisible()) }, error = function(e) { @@ -231,15 +231,22 @@ tar_github_release_repo <- function( repo <- Sys.getenv("TAR_GH_RELEASE_REPO") tag <- Sys.getenv("TAR_GH_RELEASE_TAG") - # Retry a few times in case file was just uploaded - for (attempt in 1:3) { + # Retry up to 10 times in case file was just uploaded + for (attempt in 1:10) { tryCatch({ assets <- piggyback::pb_list(repo = repo, tag = tag) found <- any(assets$file_name == key) - if (found) return(TRUE) - if (attempt < 3) Sys.sleep(1) + if (found) { + message("[tar_github_release] Confirmed exists: ", key, " (attempt ", attempt, ")") + return(TRUE) + } + if (attempt < 10) { + Sys.sleep(2) + } }, error = function(e) { - if (attempt < 3) Sys.sleep(1) + if (attempt < 10) { + Sys.sleep(2) + } }) } FALSE diff --git a/_targets.R b/_targets.R index 89e4e077..2d15f817 100644 --- a/_targets.R +++ b/_targets.R @@ -178,7 +178,7 @@ list( vegmap_shp = vegmap_shp, out_file = "data/raw/vegmap.nc"), format = "file", - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never")) + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never")), # # # # Infrequent updates via releases @@ -214,18 +214,18 @@ list( # sleep_time = 180) # ), -# tar_target( -# elevation, -# get_elevation( -# domain_vector = sfarrow::st_read_parquet(domain.parquet), -# domain_raster = domain_nc, -# temp_directory = "data/temp/raw_data/elevation_nasadem/", -# out_file = "data/raw/elevation_nasadem.nc" -# ), -# format="file", -# cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never"), -# ) -# #, + tar_target( + elevation, + get_elevation( + domain_vector = sfarrow::st_read_parquet(domain.parquet), + domain_raster = domain_nc, + temp_directory = "data/temp/raw_data/elevation_nasadem/", + out_file = "data/raw/elevation_nasadem.nc" + ), + format="file", + cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never"), + ) +#, #Temporarily commented out, seems to be an issue with URL for landcover data at present # tar_target( diff --git a/_targets/meta/meta b/_targets/meta/meta index 3ab02eed..455a8760 100644 --- a/_targets/meta/meta +++ b/_targets/meta/meta @@ -57,7 +57,8 @@ kr_pwd|object|b61b0b830c8b3de2 get_release_precipitation_chelsa|function|e5a54d4f8a475a6c summarize_posteriors|function|848f748de452ef0d robust_pb_upload|function|bf296132f5183235 -.Random.seed|object|0614c5b2f86fb10f +github_actions_env|object|2c530c1562a7fbd1 +.Random.seed|object|bb899618badafb4e tag|object|64ff18d09ad298f3 earthdata_user|object|a72c4475a256a3c1 sys_info|object|ada53e2071fe586e @@ -90,7 +91,7 @@ sleep_time|object|9f0cda529028d8d9 update_git|function|8d72fa6c21b94951 get_model_data|function|dc3148c05e8961ed get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 -make_domain_bbox|function|ab87f16359e01392 +make_domain_bbox|function|80239b842e709a51 tar_github_release_repo|function|f264edf951256e9b robust_min|function|21d2e9972a741573 robust_pb_download|function|4df763e84d88eae4 @@ -116,4 +117,80 @@ 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_bbox.parquet|stem|e5b3381be6d92804|8ef5b89424c2d345|53a5940910611673|1651755667|data/target_outputs/domain_bbox.parquet|t20468.1054726828s|s11877b|11877|file|repository_cas&upload=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICByZWxlYXNlX2V4aXN0cyA8LSBGQUxTRQogICAgdHJ5Q2F0Y2goewogICAgICAgIGFzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIHRhZyA9IHRhZykKICAgICAgICByZWxlYXNlX2V4aXN0cyA8LSBUUlVFCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICByZWxlYXNlX2V4aXN0cyA8PC0gRkFMU0UKICAgIH0pCiAgICBpZiAoIXJlbGVhc2VfZXhpc3RzKSB7CiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ3JlYXRpbmcgcmVsZWFzZTogIiwgdGFnKQogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl9uZXdfcmVsZWFzZShyZXBvID0gcmVwbywgdGFnID0gdGFnKQogICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBSZWxlYXNlIGNyZWF0ZWQ6ICIsIAogICAgICAgICAgICAgICAgdGFnKQogICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoIWdyZXBsKCJhbHJlYWR5IGV4aXN0cyIsIHRvbG93ZXIoY29uZGl0aW9uTWVzc2FnZShlKSkpKSB7CiAgICAgICAgICAgICAgICBzdG9wKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBGYWlsZWQgdG8gY3JlYXRlIHJlbGVhc2U6ICIsIAogICAgICAgICAgICAgICAgICBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgIH0KICAgIGlmIChmaWxlLmV4aXN0cyhwYXRoKSAmJiAhZGlyLmV4aXN0cyhwYXRoKSkgewogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFVwbG9hZGluZyBmaWxlOiAiLCBrZXkpCiAgICAgICAgY3JlZHMgPC0gdHJ5Q2F0Y2goewogICAgICAgICAgICBnaXRjcmVkczo6Z2l0Y3JlZHNfZ2V0KCkKICAgICAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gTm8gZ2l0IGNyZWRlbnRpYWxzIGZvdW5kLCB0cnlpbmcgd2l0aG91dCB0b2tlbiIpCiAgICAgICAgICAgIE5VTEwKICAgICAgICB9KQogICAgICAgIHRva2VuIDwtIGlmICghaXMubnVsbChjcmVkcykpIAogICAgICAgICAgICBjcmVkcyRwYXNzd29yZAogICAgICAgIGVsc2UgTlVMTAogICAgICAgIG1heF9hdHRlbXB0cyA8LSAzCiAgICAgICAgdXBsb2FkZWQgPC0gRkFMU0UKICAgICAgICBmb3IgKGF0dGVtcHQgaW4gMTptYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgdHJ5Q2F0Y2goewogICAgICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl91cGxvYWQoZmlsZSA9IHBhdGgsIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBuYW1lID0ga2V5LCBvdmVyd3JpdGUgPSBUUlVFLCAudG9rZW4gPSB0b2tlbikKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZpbGUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5OiAiLCAKICAgICAgICAgICAgICAgICAga2V5KQogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDEpCiAgICAgICAgICAgICAgICB1cGxvYWRlZCA8LSBUUlVFCiAgICAgICAgICAgICAgICByZXR1cm4oaW52aXNpYmxlKCkpCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gVXBsb2FkIGF0dGVtcHQgIiwgCiAgICAgICAgICAgICAgICAgIGF0dGVtcHQsICIgZmFpbGVkOiAiLCBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIHVwbG9hZCBmaWxlIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBvYmogPC0gcmVhZFJEUyhwYXRoKQogICAgICAgIHRlbXBfZmlsZSA8LSB0ZW1wZmlsZShmaWxlZXh0ID0gcGFzdGUwKCIuIiwgZm9ybWF0KSkKICAgICAgICBvbi5leGl0KHVubGluayh0ZW1wX2ZpbGUpLCBhZGQgPSBUUlVFKQogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBxczo6cXNhdmUob2JqLCB0ZW1wX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicmRzIikgewogICAgICAgICAgICBzYXZlUkRTKG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInBhcnF1ZXQiKSB7CiAgICAgICAgICAgIGFycm93Ojp3cml0ZV9wYXJxdWV0KG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX3VwbG9hZChmaWxlID0gdGVtcF9maWxlLCByZXBvID0gcmVwbywgCiAgICAgICAgICAgICAgICAgIHRhZyA9IHRhZywgbmFtZSA9IGtleSwgb3ZlcndyaXRlID0gVFJVRSwgLnRva2VuID0gTlVMTCkKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIE9iamVjdCB1cGxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIHJldHVybihpbnZpc2libGUoKSkKICAgICAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heF9hdHRlbXB0cykgewogICAgICAgICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBVcGxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIHVwbG9hZCBhZnRlciAiLCAKICAgICAgICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHMsICIgYXR0ZW1wdHM6ICIsIGNvbmRpdGlvbk1lc3NhZ2UoZSkpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgfQp9&download=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICBjYWNoZV9kaXIgPC0gU3lzLmdldGVudigiVEFSX0dIX1JFTEVBU0VfQ0FDSEVfRElSIikKICAgIGRpci5jcmVhdGUoY2FjaGVfZGlyLCByZWN1cnNpdmUgPSBUUlVFLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKICAgIGNhY2hlZF9maWxlIDwtIGZpbGUucGF0aChjYWNoZV9kaXIsIGtleSkKICAgIG5lZWRfZG93bmxvYWQgPC0gVFJVRQogICAgaWYgKGZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcmVtb3RlX2Fzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIAogICAgICAgICAgICAgICAgdGFnID0gdGFnKQogICAgICAgICAgICByZW1vdGVfYXNzZXQgPC0gcmVtb3RlX2Fzc2V0c1tyZW1vdGVfYXNzZXRzJGZpbGVfbmFtZSA9PSAKICAgICAgICAgICAgICAgIGtleSwgXQogICAgICAgICAgICBpZiAobnJvdyhyZW1vdGVfYXNzZXQpID4gMCkgewogICAgICAgICAgICAgICAgbG9jYWxfc2l6ZSA8LSBmaWxlLnNpemUoY2FjaGVkX2ZpbGUpCiAgICAgICAgICAgICAgICByZW1vdGVfc2l6ZSA8LSByZW1vdGVfYXNzZXQkc2l6ZVsxXQogICAgICAgICAgICAgICAgaWYgKGxvY2FsX3NpemUgPT0gcmVtb3RlX3NpemUpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ2FjaGUgdmFsaWQgKHNpemUgbWF0Y2g6ICIsIAogICAgICAgICAgICAgICAgICAgIGxvY2FsX3NpemUsICIgYnl0ZXMpIikKICAgICAgICAgICAgICAgICAgbmVlZF9kb3dubG9hZCA8LSBGQUxTRQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIENvdWxkIG5vdCB2ZXJpZnkgY2FjaGU6ICIsIAogICAgICAgICAgICAgICAgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICB9KQogICAgfQogICAgaWYgKG5lZWRfZG93bmxvYWQpIHsKICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX2Rvd25sb2FkKGZpbGUgPSBrZXksIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBkZXN0ID0gY2FjaGVfZGlyLCBvdmVyd3JpdGUgPSBUUlVFKQogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIGRvd25sb2FkIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHN0b3AoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZhaWxlZCB0byByZXRyaWV2ZTogIiwga2V5KQogICAgfQogICAgZmlsZV9leHRzIDwtIGMoInBhcnF1ZXQiLCAibmMiLCAidGlmIiwgImdwa2ciLCAic2hwIiwgImRiZiIsIAogICAgICAgICJwcmoiLCAic2h4IikKICAgIGlzX3NwYXRpYWxfZmlsZSA8LSBhbnkoZW5kc1dpdGgodG9sb3dlcihrZXkpLCBwYXN0ZTAoIi4iLCAKICAgICAgICBmaWxlX2V4dHMpKSkKICAgIGlmIChpc19zcGF0aWFsX2ZpbGUpIHsKICAgICAgICBmaWxlLmNvcHkoY2FjaGVkX2ZpbGUsIHBhdGgsIG92ZXJ3cml0ZSA9IFRSVUUpCiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gUmV0cmlldmVkIGZpbGU6ICIsIGtleSkKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBvYmogPC0gcXM6OnFyZWFkKGNhY2hlZF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInJkcyIpIHsKICAgICAgICAgICAgb2JqIDwtIHJlYWRSRFMoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicGFycXVldCIpIHsKICAgICAgICAgICAgb2JqIDwtIGFycm93OjpyZWFkX3BhcnF1ZXQoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIHNhdmVSRFMob2JqLCBwYXRoKQogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFJldHJpZXZlZCBhbmQgZGVzZXJpYWxpemVkOiAiLCAKICAgICAgICAgICAga2V5KQogICAgfQogICAgaW52aXNpYmxlKCkKfQ&exists=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9yIChhdHRlbXB0IGluIDE6MykgewogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgYXNzZXRzIDwtIHBpZ2d5YmFjazo6cGJfbGlzdChyZXBvID0gcmVwbywgdGFnID0gdGFnKQogICAgICAgICAgICBmb3VuZCA8LSBhbnkoYXNzZXRzJGZpbGVfbmFtZSA9PSBrZXkpCiAgICAgICAgICAgIGlmIChmb3VuZCkgCiAgICAgICAgICAgICAgICByZXR1cm4oVFJVRSkKICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCAzKSAKICAgICAgICAgICAgICAgIFN5cy5zbGVlcCgxKQogICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IDMpIAogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDEpCiAgICAgICAgfSkKICAgIH0KICAgIEZBTFNFCn0&list=&consistent=RkFMU0U|vector|||0.065|| +domain_bbox.parquet|stem|e5b3381be6d92804|8ef5b89424c2d345|3b603d46958c9c45|1651755667|data/target_outputs/domain_bbox.parquet|t20468.1054726828s|s15057b|11877|file|repository_cas&upload=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICByZWxlYXNlX2V4aXN0cyA8LSBGQUxTRQogICAgdHJ5Q2F0Y2goewogICAgICAgIGFzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIHRhZyA9IHRhZykKICAgICAgICByZWxlYXNlX2V4aXN0cyA8LSBUUlVFCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICByZWxlYXNlX2V4aXN0cyA8PC0gRkFMU0UKICAgIH0pCiAgICBpZiAoIXJlbGVhc2VfZXhpc3RzKSB7CiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ3JlYXRpbmcgcmVsZWFzZTogIiwgdGFnKQogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl9uZXdfcmVsZWFzZShyZXBvID0gcmVwbywgdGFnID0gdGFnKQogICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBSZWxlYXNlIGNyZWF0ZWQ6ICIsIAogICAgICAgICAgICAgICAgdGFnKQogICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoIWdyZXBsKCJhbHJlYWR5IGV4aXN0cyIsIHRvbG93ZXIoY29uZGl0aW9uTWVzc2FnZShlKSkpKSB7CiAgICAgICAgICAgICAgICBzdG9wKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBGYWlsZWQgdG8gY3JlYXRlIHJlbGVhc2U6ICIsIAogICAgICAgICAgICAgICAgICBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgIH0KICAgIGlmIChmaWxlLmV4aXN0cyhwYXRoKSAmJiAhZGlyLmV4aXN0cyhwYXRoKSkgewogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFVwbG9hZGluZyBmaWxlOiAiLCBrZXkpCiAgICAgICAgY3JlZHMgPC0gdHJ5Q2F0Y2goewogICAgICAgICAgICBnaXRjcmVkczo6Z2l0Y3JlZHNfZ2V0KCkKICAgICAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gTm8gZ2l0IGNyZWRlbnRpYWxzIGZvdW5kLCB0cnlpbmcgd2l0aG91dCB0b2tlbiIpCiAgICAgICAgICAgIE5VTEwKICAgICAgICB9KQogICAgICAgIHRva2VuIDwtIGlmICghaXMubnVsbChjcmVkcykpIAogICAgICAgICAgICBjcmVkcyRwYXNzd29yZAogICAgICAgIGVsc2UgTlVMTAogICAgICAgIG1heF9hdHRlbXB0cyA8LSAzCiAgICAgICAgdXBsb2FkZWQgPC0gRkFMU0UKICAgICAgICBmb3IgKGF0dGVtcHQgaW4gMTptYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgdHJ5Q2F0Y2goewogICAgICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl91cGxvYWQoZmlsZSA9IHBhdGgsIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBuYW1lID0ga2V5LCBvdmVyd3JpdGUgPSBUUlVFLCAudG9rZW4gPSB0b2tlbikKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZpbGUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5OiAiLCAKICAgICAgICAgICAgICAgICAga2V5KQogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDEpCiAgICAgICAgICAgICAgICB1cGxvYWRlZCA8LSBUUlVFCiAgICAgICAgICAgICAgICByZXR1cm4oaW52aXNpYmxlKCkpCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gVXBsb2FkIGF0dGVtcHQgIiwgCiAgICAgICAgICAgICAgICAgIGF0dGVtcHQsICIgZmFpbGVkOiAiLCBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIHVwbG9hZCBmaWxlIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBvYmogPC0gcmVhZFJEUyhwYXRoKQogICAgICAgIHRlbXBfZmlsZSA8LSB0ZW1wZmlsZShmaWxlZXh0ID0gcGFzdGUwKCIuIiwgZm9ybWF0KSkKICAgICAgICBvbi5leGl0KHVubGluayh0ZW1wX2ZpbGUpLCBhZGQgPSBUUlVFKQogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBxczo6cXNhdmUob2JqLCB0ZW1wX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicmRzIikgewogICAgICAgICAgICBzYXZlUkRTKG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInBhcnF1ZXQiKSB7CiAgICAgICAgICAgIGFycm93Ojp3cml0ZV9wYXJxdWV0KG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX3VwbG9hZChmaWxlID0gdGVtcF9maWxlLCByZXBvID0gcmVwbywgCiAgICAgICAgICAgICAgICAgIHRhZyA9IHRhZywgbmFtZSA9IGtleSwgb3ZlcndyaXRlID0gVFJVRSwgLnRva2VuID0gTlVMTCkKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIE9iamVjdCB1cGxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIHJldHVybihpbnZpc2libGUoKSkKICAgICAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heF9hdHRlbXB0cykgewogICAgICAgICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBVcGxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIHVwbG9hZCBhZnRlciAiLCAKICAgICAgICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHMsICIgYXR0ZW1wdHM6ICIsIGNvbmRpdGlvbk1lc3NhZ2UoZSkpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgfQp9&download=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICBjYWNoZV9kaXIgPC0gU3lzLmdldGVudigiVEFSX0dIX1JFTEVBU0VfQ0FDSEVfRElSIikKICAgIGRpci5jcmVhdGUoY2FjaGVfZGlyLCByZWN1cnNpdmUgPSBUUlVFLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKICAgIGNhY2hlZF9maWxlIDwtIGZpbGUucGF0aChjYWNoZV9kaXIsIGtleSkKICAgIG5lZWRfZG93bmxvYWQgPC0gVFJVRQogICAgaWYgKGZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcmVtb3RlX2Fzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIAogICAgICAgICAgICAgICAgdGFnID0gdGFnKQogICAgICAgICAgICByZW1vdGVfYXNzZXQgPC0gcmVtb3RlX2Fzc2V0c1tyZW1vdGVfYXNzZXRzJGZpbGVfbmFtZSA9PSAKICAgICAgICAgICAgICAgIGtleSwgXQogICAgICAgICAgICBpZiAobnJvdyhyZW1vdGVfYXNzZXQpID4gMCkgewogICAgICAgICAgICAgICAgbG9jYWxfc2l6ZSA8LSBmaWxlLnNpemUoY2FjaGVkX2ZpbGUpCiAgICAgICAgICAgICAgICByZW1vdGVfc2l6ZSA8LSByZW1vdGVfYXNzZXQkc2l6ZVsxXQogICAgICAgICAgICAgICAgaWYgKGxvY2FsX3NpemUgPT0gcmVtb3RlX3NpemUpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ2FjaGUgdmFsaWQgKHNpemUgbWF0Y2g6ICIsIAogICAgICAgICAgICAgICAgICAgIGxvY2FsX3NpemUsICIgYnl0ZXMpIikKICAgICAgICAgICAgICAgICAgbmVlZF9kb3dubG9hZCA8LSBGQUxTRQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIENvdWxkIG5vdCB2ZXJpZnkgY2FjaGU6ICIsIAogICAgICAgICAgICAgICAgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICB9KQogICAgfQogICAgaWYgKG5lZWRfZG93bmxvYWQpIHsKICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX2Rvd25sb2FkKGZpbGUgPSBrZXksIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBkZXN0ID0gY2FjaGVfZGlyLCBvdmVyd3JpdGUgPSBUUlVFKQogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIGRvd25sb2FkIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHN0b3AoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZhaWxlZCB0byByZXRyaWV2ZTogIiwga2V5KQogICAgfQogICAgZmlsZV9leHRzIDwtIGMoInBhcnF1ZXQiLCAibmMiLCAidGlmIiwgImdwa2ciLCAic2hwIiwgImRiZiIsIAogICAgICAgICJwcmoiLCAic2h4IikKICAgIGlzX3NwYXRpYWxfZmlsZSA8LSBhbnkoZW5kc1dpdGgodG9sb3dlcihrZXkpLCBwYXN0ZTAoIi4iLCAKICAgICAgICBmaWxlX2V4dHMpKSkKICAgIGlmIChpc19zcGF0aWFsX2ZpbGUpIHsKICAgICAgICBmaWxlLmNvcHkoY2FjaGVkX2ZpbGUsIHBhdGgsIG92ZXJ3cml0ZSA9IFRSVUUpCiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gUmV0cmlldmVkIGZpbGU6ICIsIGtleSkKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBvYmogPC0gcXM6OnFyZWFkKGNhY2hlZF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInJkcyIpIHsKICAgICAgICAgICAgb2JqIDwtIHJlYWRSRFMoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicGFycXVldCIpIHsKICAgICAgICAgICAgb2JqIDwtIGFycm93OjpyZWFkX3BhcnF1ZXQoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIHNhdmVSRFMob2JqLCBwYXRoKQogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFJldHJpZXZlZCBhbmQgZGVzZXJpYWxpemVkOiAiLCAKICAgICAgICAgICAga2V5KQogICAgfQogICAgaW52aXNpYmxlKCkKfQ&exists=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9yIChhdHRlbXB0IGluIDE6MykgewogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgYXNzZXRzIDwtIHBpZ2d5YmFjazo6cGJfbGlzdChyZXBvID0gcmVwbywgdGFnID0gdGFnKQogICAgICAgICAgICBmb3VuZCA8LSBhbnkoYXNzZXRzJGZpbGVfbmFtZSA9PSBrZXkpCiAgICAgICAgICAgIGlmIChmb3VuZCkgCiAgICAgICAgICAgICAgICByZXR1cm4oVFJVRSkKICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCAzKSAKICAgICAgICAgICAgICAgIFN5cy5zbGVlcCgxKQogICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IDMpIAogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDEpCiAgICAgICAgfSkKICAgIH0KICAgIEZBTFNFCn0&list=&consistent=RkFMU0U|vector|||||Error hashing output: timed out after retrying for 82.862 seconds. Path data/target_outputs/domain_bbox.parquet does not exist or has incorrect hash. File sync timed out. +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 +robust_pb_upload|function|bf296132f5183235 +github_actions_env|object|2c530c1562a7fbd1 +.Random.seed|object|e70e27c0086d8559 +tag|object|64ff18d09ad298f3 +earthdata_user|object|a72c4475a256a3c1 +sys_info|object|ada53e2071fe586e +max_layers|object|08d5f59e833de599 +get_country|function|bf54208b5dd9f5ca +existing_kr|object|1bb3bf184f7669e1 +get_alos_data|function|75cf21dd60609648 +tar_github_release_resources|function|5005c1e1d1f13042 +download_vegmap_release|function|0273ecf8e3505b66 +process_fix_modis_projection|function|08e12464ac799094 +group_data_function|function|3e4778f64d247976 +data_vegmap|function|3aea21ddb80cc68d +get_elevation|function|44cce564be9070e7 +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 +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 +gh_repo|object|dc84e030122d7d21 +earthdata_pass|object|b61b0b830c8b3de2 +sleep_time|object|9f0cda529028d8d9 +update_git|function|8d72fa6c21b94951 +get_model_data|function|dc3148c05e8961ed +get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 +make_domain_bbox|function|39ee8fcd6d65cd43 +tar_github_release_repo|function|d015c11962e2a87d +robust_min|function|21d2e9972a741573 +robust_pb_download|function|4df763e84d88eae4 +get_release_clouds_wilson|function|76923df0f19c017f +get_chelsa|function|f63060c4751e6183 +get_release_climate_chelsa|function|f63060c4751e6183 +get_release_alos|function|3d0bd84374208048 +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_alos|function|d1225f8b3a3fa4da +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_bbox.parquet|stem|25cd0fd1894c1176|8ef5b89424c2d345|fb33e4abae37e8ee|1651755667|data/target_outputs/domain_bbox.parquet|t20468.1191109291s|s15057b|15057|file|repository_cas&upload=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICByZWxlYXNlX2V4aXN0cyA8LSBGQUxTRQogICAgdHJ5Q2F0Y2goewogICAgICAgIGFzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIHRhZyA9IHRhZykKICAgICAgICByZWxlYXNlX2V4aXN0cyA8LSBUUlVFCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICByZWxlYXNlX2V4aXN0cyA8PC0gRkFMU0UKICAgIH0pCiAgICBpZiAoIXJlbGVhc2VfZXhpc3RzKSB7CiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ3JlYXRpbmcgcmVsZWFzZTogIiwgdGFnKQogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl9uZXdfcmVsZWFzZShyZXBvID0gcmVwbywgdGFnID0gdGFnKQogICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBSZWxlYXNlIGNyZWF0ZWQ6ICIsIAogICAgICAgICAgICAgICAgdGFnKQogICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoIWdyZXBsKCJhbHJlYWR5IGV4aXN0cyIsIHRvbG93ZXIoY29uZGl0aW9uTWVzc2FnZShlKSkpKSB7CiAgICAgICAgICAgICAgICBzdG9wKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBGYWlsZWQgdG8gY3JlYXRlIHJlbGVhc2U6ICIsIAogICAgICAgICAgICAgICAgICBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgIH0KICAgIGlmIChmaWxlLmV4aXN0cyhwYXRoKSAmJiAhZGlyLmV4aXN0cyhwYXRoKSkgewogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFVwbG9hZGluZyBmaWxlOiAiLCBrZXkpCiAgICAgICAgY3JlZHMgPC0gdHJ5Q2F0Y2goewogICAgICAgICAgICBnaXRjcmVkczo6Z2l0Y3JlZHNfZ2V0KCkKICAgICAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gTm8gZ2l0IGNyZWRlbnRpYWxzIGZvdW5kLCB0cnlpbmcgd2l0aG91dCB0b2tlbiIpCiAgICAgICAgICAgIE5VTEwKICAgICAgICB9KQogICAgICAgIHRva2VuIDwtIGlmICghaXMubnVsbChjcmVkcykpIAogICAgICAgICAgICBjcmVkcyRwYXNzd29yZAogICAgICAgIGVsc2UgTlVMTAogICAgICAgIG1heF9hdHRlbXB0cyA8LSAzCiAgICAgICAgdXBsb2FkZWQgPC0gRkFMU0UKICAgICAgICBmb3IgKGF0dGVtcHQgaW4gMTptYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgdHJ5Q2F0Y2goewogICAgICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl91cGxvYWQoZmlsZSA9IHBhdGgsIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBuYW1lID0ga2V5LCBvdmVyd3JpdGUgPSBUUlVFLCAudG9rZW4gPSB0b2tlbikKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZpbGUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5OiAiLCAKICAgICAgICAgICAgICAgICAga2V5KQogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDMpCiAgICAgICAgICAgICAgICB1cGxvYWRlZCA8LSBUUlVFCiAgICAgICAgICAgICAgICByZXR1cm4oaW52aXNpYmxlKCkpCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gVXBsb2FkIGF0dGVtcHQgIiwgCiAgICAgICAgICAgICAgICAgIGF0dGVtcHQsICIgZmFpbGVkOiAiLCBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIHVwbG9hZCBmaWxlIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBvYmogPC0gcmVhZFJEUyhwYXRoKQogICAgICAgIHRlbXBfZmlsZSA8LSB0ZW1wZmlsZShmaWxlZXh0ID0gcGFzdGUwKCIuIiwgZm9ybWF0KSkKICAgICAgICBvbi5leGl0KHVubGluayh0ZW1wX2ZpbGUpLCBhZGQgPSBUUlVFKQogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBxczo6cXNhdmUob2JqLCB0ZW1wX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicmRzIikgewogICAgICAgICAgICBzYXZlUkRTKG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInBhcnF1ZXQiKSB7CiAgICAgICAgICAgIGFycm93Ojp3cml0ZV9wYXJxdWV0KG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX3VwbG9hZChmaWxlID0gdGVtcF9maWxlLCByZXBvID0gcmVwbywgCiAgICAgICAgICAgICAgICAgIHRhZyA9IHRhZywgbmFtZSA9IGtleSwgb3ZlcndyaXRlID0gVFJVRSwgLnRva2VuID0gTlVMTCkKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIE9iamVjdCB1cGxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIHJldHVybihpbnZpc2libGUoKSkKICAgICAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heF9hdHRlbXB0cykgewogICAgICAgICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBVcGxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIHVwbG9hZCBhZnRlciAiLCAKICAgICAgICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHMsICIgYXR0ZW1wdHM6ICIsIGNvbmRpdGlvbk1lc3NhZ2UoZSkpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgfQp9&download=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICBjYWNoZV9kaXIgPC0gU3lzLmdldGVudigiVEFSX0dIX1JFTEVBU0VfQ0FDSEVfRElSIikKICAgIGRpci5jcmVhdGUoY2FjaGVfZGlyLCByZWN1cnNpdmUgPSBUUlVFLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKICAgIGNhY2hlZF9maWxlIDwtIGZpbGUucGF0aChjYWNoZV9kaXIsIGtleSkKICAgIG5lZWRfZG93bmxvYWQgPC0gVFJVRQogICAgaWYgKGZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcmVtb3RlX2Fzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIAogICAgICAgICAgICAgICAgdGFnID0gdGFnKQogICAgICAgICAgICByZW1vdGVfYXNzZXQgPC0gcmVtb3RlX2Fzc2V0c1tyZW1vdGVfYXNzZXRzJGZpbGVfbmFtZSA9PSAKICAgICAgICAgICAgICAgIGtleSwgXQogICAgICAgICAgICBpZiAobnJvdyhyZW1vdGVfYXNzZXQpID4gMCkgewogICAgICAgICAgICAgICAgbG9jYWxfc2l6ZSA8LSBmaWxlLnNpemUoY2FjaGVkX2ZpbGUpCiAgICAgICAgICAgICAgICByZW1vdGVfc2l6ZSA8LSByZW1vdGVfYXNzZXQkc2l6ZVsxXQogICAgICAgICAgICAgICAgaWYgKGxvY2FsX3NpemUgPT0gcmVtb3RlX3NpemUpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ2FjaGUgdmFsaWQgKHNpemUgbWF0Y2g6ICIsIAogICAgICAgICAgICAgICAgICAgIGxvY2FsX3NpemUsICIgYnl0ZXMpIikKICAgICAgICAgICAgICAgICAgbmVlZF9kb3dubG9hZCA8LSBGQUxTRQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIENvdWxkIG5vdCB2ZXJpZnkgY2FjaGU6ICIsIAogICAgICAgICAgICAgICAgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICB9KQogICAgfQogICAgaWYgKG5lZWRfZG93bmxvYWQpIHsKICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX2Rvd25sb2FkKGZpbGUgPSBrZXksIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBkZXN0ID0gY2FjaGVfZGlyLCBvdmVyd3JpdGUgPSBUUlVFKQogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIGRvd25sb2FkIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHN0b3AoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZhaWxlZCB0byByZXRyaWV2ZTogIiwga2V5KQogICAgfQogICAgZmlsZV9leHRzIDwtIGMoInBhcnF1ZXQiLCAibmMiLCAidGlmIiwgImdwa2ciLCAic2hwIiwgImRiZiIsIAogICAgICAgICJwcmoiLCAic2h4IikKICAgIGlzX3NwYXRpYWxfZmlsZSA8LSBhbnkoZW5kc1dpdGgodG9sb3dlcihrZXkpLCBwYXN0ZTAoIi4iLCAKICAgICAgICBmaWxlX2V4dHMpKSkKICAgIGlmIChpc19zcGF0aWFsX2ZpbGUpIHsKICAgICAgICBmaWxlLmNvcHkoY2FjaGVkX2ZpbGUsIHBhdGgsIG92ZXJ3cml0ZSA9IFRSVUUpCiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gUmV0cmlldmVkIGZpbGU6ICIsIGtleSkKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBvYmogPC0gcXM6OnFyZWFkKGNhY2hlZF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInJkcyIpIHsKICAgICAgICAgICAgb2JqIDwtIHJlYWRSRFMoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicGFycXVldCIpIHsKICAgICAgICAgICAgb2JqIDwtIGFycm93OjpyZWFkX3BhcnF1ZXQoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIHNhdmVSRFMob2JqLCBwYXRoKQogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFJldHJpZXZlZCBhbmQgZGVzZXJpYWxpemVkOiAiLCAKICAgICAgICAgICAga2V5KQogICAgfQogICAgaW52aXNpYmxlKCkKfQ&exists=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9yIChhdHRlbXB0IGluIDE6MTApIHsKICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgIGFzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIHRhZyA9IHRhZykKICAgICAgICAgICAgZm91bmQgPC0gYW55KGFzc2V0cyRmaWxlX25hbWUgPT0ga2V5KQogICAgICAgICAgICBpZiAoZm91bmQpIHsKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIENvbmZpcm1lZCBleGlzdHM6ICIsIAogICAgICAgICAgICAgICAgICBrZXksICIgKGF0dGVtcHQgIiwgYXR0ZW1wdCwgIikiKQogICAgICAgICAgICAgICAgcmV0dXJuKFRSVUUpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCAxMCkgewogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgIH0KICAgICAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCAxMCkgewogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgIH0KICAgICAgICB9KQogICAgfQogICAgRkFMU0UKfQ&list=&consistent=RkFMU0U|vector|||0.05|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.| From 3da0dd2dd1bc681edbf6a0f66d18bfc96198fa31 Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Wed, 14 Jan 2026 22:11:37 -0500 Subject: [PATCH 55/58] Add GitHub CLI installation step and simplify run mode determination --- .github/workflows/targets.yaml | 6 ++++++ _targets.R | 5 +---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index ade10048..387e9e9f 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -128,6 +128,12 @@ jobs: Updated: ${{ github.event.head_commit.timestamp }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Install GitHub CLI + if: failure() && github.event_name == 'push' + run: | + apt-get update + apt-get install -y gh - name: Create review PR on failure if: failure() && github.event_name == 'push' diff --git a/_targets.R b/_targets.R index 2d15f817..f0b65e35 100644 --- a/_targets.R +++ b/_targets.R @@ -29,10 +29,7 @@ library(sfarrow) } # Determine run mode: "prime" (full processing on server) or "update" (incremental on GitHub Actions) - github_actions_env <- Sys.getenv("GITHUB_ACTIONS") - message(paste("GITHUB_ACTIONS env var:", github_actions_env, "| length:", nchar(github_actions_env))) - - run_mode <- if (tolower(github_actions_env) == "true") { + 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 From 7d697493c1edb3c30670c312e37fc453287802ad Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Wed, 14 Jan 2026 22:22:50 -0500 Subject: [PATCH 56/58] Remove auto-generated label from PR closing message --- .github/workflows/targets.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index 387e9e9f..d6bdee8a 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -181,7 +181,7 @@ jobs: 3. Close this PR once resolved" \ --base main \ --head "$BRANCH" \ - --label "bug,auto-generated" + --label "bug" - name: Post failure artifact if: failure() From 9c79b798fd890af8cb7a5ab9a5945a2499dd53ae Mon Sep 17 00:00:00 2001 From: "Adam M. Wilson" <900623+adammwilson@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:37:08 -0500 Subject: [PATCH 57/58] Refactor code structure for improved readability and maintainability --- .github/workflows/targets.yaml | 6 + OBJECTS_RELEASE.md | 129 ++++++ R/generate_release_manifest.R | 47 ++ R/get_climate_chelsa.R | 139 ++++++ R/get_country.R | 2 +- R/get_elevation.R | 129 +++--- R/get_modis_vi.R | 262 +++++++++++ R/get_release_alos.R | 167 ------- R/get_release_climate_chelsa.R | 231 ++++------ R/get_release_ndvi_evi_modis_appeears.R | 211 --------- R/process_release_alos.R | 160 ------- R/tar_release_storage.R | 574 ++++++++++++++---------- _targets.R | 156 ++++--- _targets/meta/meta | 109 ++--- 14 files changed, 1228 insertions(+), 1094 deletions(-) create mode 100644 OBJECTS_RELEASE.md create mode 100644 R/generate_release_manifest.R create mode 100644 R/get_climate_chelsa.R create mode 100644 R/get_modis_vi.R delete mode 100644 R/get_release_alos.R delete mode 100644 R/get_release_ndvi_evi_modis_appeears.R delete mode 100644 R/process_release_alos.R diff --git a/.github/workflows/targets.yaml b/.github/workflows/targets.yaml index d6bdee8a..d793d7bb 100644 --- a/.github/workflows/targets.yaml +++ b/.github/workflows/targets.yaml @@ -182,6 +182,12 @@ jobs: --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() 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/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 index e738ec9a..fddefaa9 100644 --- a/R/get_country.R +++ b/R/get_country.R @@ -24,7 +24,7 @@ get_country <- function(){ # Write to GeoParquet out_file <- "data/target_outputs/country.parquet" - sfarrow::st_write_parquet(country, out_file) + suppressWarnings(sfarrow::st_write_parquet(country, out_file)) return(out_file) } diff --git a/R/get_elevation.R b/R/get_elevation.R index 2fe3214f..93b4fa2d 100644 --- a/R/get_elevation.R +++ b/R/get_elevation.R @@ -1,44 +1,25 @@ -#' @title Download NASADEM elevation via AppEEARS and resample to domain +#' @title Submit NASADEM elevation request via AppEEARS #' @description Submits an AppEEARS area request for NASADEM elevation data -#' over the provided domain polygon, downloads, and resamples to domain grid. +#' 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 domain_raster A SpatRaster (domain.tif) defining the output grid and mask -#' @param temp_directory Temporary working directory for downloads #' @param verbose Logical for progress messages -#' @return SpatRaster with elevation resampled to domain, with metadata +#' @return Character string with AppEEARS task ID -get_elevation <- function( +submit_elevation_task <- function( domain_vector, - domain_raster, - temp_directory = "data/temp/raw_data/elevation_nasadem/", - out_file = "data/raw/elevation_nasadem.nc", 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) - + # 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)%>% + st_transform(crs = 4326) %>% + geojsonsf::sf_geojson(simplify = FALSE) %>% jsonlite::fromJSON() -# if (!all(st_is_valid(st_as_sf(domain_sf)))) stop("Domain polygon still invalid after repair; inspect input geometry.") - - # Build AppEEARS request with proper structure req <- list( task_type = "area", @@ -60,46 +41,96 @@ get_elevation <- function( ) ) - # Submit and poll for completion - if (verbose) message("Submitting AppEEARS task...") + # Submit task + if (verbose) message("Submitting AppEEARS elevation task...") task <- appeears::rs_request( - request = req, + request = req, user = Sys.getenv("EARTHDATA_USER"), - path = temp_directory, transfer = FALSE, verbose = verbose ) - if (verbose) message("Task submitted: ", task$get_task_id()) + task_id <- task$get_task_id() + if (verbose) message("Task submitted with ID: ", task_id) + + task_id +} + - # Poll for completion using task object methods - max_retries <- 60 +#' @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 - task$update_status(verbose = FALSE) - if (task$is_success()) { + # 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$is_failed()) { - stop("AppEEARS task failed") + if (task_status %in% c("failed", "error")) { + stop("AppEEARS task ", task_id, " failed with status: ", task_status) } if (retry_count >= max_retries) { - stop("Task polling timed out after ", max_retries * 10, " seconds") + 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, ")") } - if (verbose) message("Task status: ", task$get_status(), " (", retry_count, "/", max_retries, ")") Sys.sleep(60) } - # Download results - if (verbose) message("Downloading files for task: ", task$get_task_id()) - task$download(verbose = verbose) + # 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) @@ -113,7 +144,7 @@ get_elevation <- function( # 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 (bilinear) and mask to domain + # 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") @@ -124,16 +155,7 @@ get_elevation <- function( # Set metadata names(elev_masked) <- "elevation" - metags(elev_masked) <- c( - "elevation_long_name" = "NASADEM elevation above mean sea level", - "elevation_source" = "NASADEM_HGT.001 via AppEEARS", - "units" = "meters", - "date_generated" = as.character(Sys.time()), - "crs" = as.character(st_crs(elev_masked)), - "Conventions" = "CF-1.8" - ) - - # Write NetCDF with compression and CF metadata + # Write NetCDF with compression and CF metadata dir.create(dirname(out_file), recursive = TRUE, showWarnings = FALSE) unlink(out_file) @@ -182,6 +204,7 @@ get_elevation <- function( 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 55c593c3..89b76c59 100644 --- a/R/get_release_climate_chelsa.R +++ b/R/get_release_climate_chelsa.R @@ -1,59 +1,38 @@ -#R script to download climate data (CHELSA) - -library(terra) -library(ncdf4) - +#' @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 -#' @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 +#' @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")}) - - #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 +#' @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) - # domain_extent <- - # domain %>% - # st_transform(crs("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0")@projargs)%>% - # extent() + # Adjust download timeout + if (getOption('timeout') < 1000) { + options(timeout = 1000) + } - domain_tf <- - domain %>% + # 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")) - - # 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) + 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( @@ -81,104 +60,80 @@ get_release_climate_chelsa <- function(temp_directory = "data/temp/raw_data/clim # Record download date download_date <- Sys.Date() + output_files <- character() - for(idx in 1:nrow(bio_metadata)){ + 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 + if (verbose) message("Processing ", i, " (", idx, "/", nrow(bio_metadata), ")") - rast_i <- terra::crop(x = rast_i, - y = ext(domain_tf)) + # 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 + ) - # mask - rast_i <- - terra::mask(rast_i, - mask = terra::vect(domain_tf)) + # 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(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) - + 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, 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) - - # 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()) + # 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_ndvi_evi_modis_appeears.R b/R/get_release_ndvi_evi_modis_appeears.R deleted file mode 100644 index d0c50022..00000000 --- a/R/get_release_ndvi_evi_modis_appeears.R +++ /dev/null @@ -1,211 +0,0 @@ -#' @title Download MODIS NDVI and EVI via AppEEARS and publish monthly NetCDF -#' @description Submits an AppEEARS area request for MOD13A1.061 NDVI, EVI, 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_evi_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. -get_release_ndvi_evi_modis_appeears <- function( - temp_directory = "data/temp/raw_data/ndvi_evi_modis/", - tag = "raw_ndvi_evi_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 = ", ")) - } - - 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 - 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 <- "2000-02-18" # MODIS Terra 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 NDVI+EVI 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 - 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 dynamically (include composite Day of Year for exact acquisition date) - ndvi_layer <- "500m_16_days_NDVI" - evi_layer <- "500m_16_days_EVI" - qa_layer <- "500m_16_days_VI_Quality" - doy_layer <- "Day_of_Year_1km" - - try({ - lyr <- appeears::rs_layers("MOD13A1.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] - 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(evi_cand)) evi_layer <- evi_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, ", ", evi_layer, ", ", qa_layer, ", ", doy_layer) - - # Build request payload - NDVI, EVI, and QA in one request - req <- list( - task_type = "area", - task_name = paste0("emma_ndvi_evi_", 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 = "MOD13A1.061", layer = ndvi_layer), - list(product = "MOD13A1.061", layer = evi_layer), - list(product = "MOD13A1.061", layer = qa_layer), - list(product = "MOD13A1.061", 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 into monthly files - 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_evi_MOD13A1_%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_evi_MOD13A1_%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 limit - 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/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/tar_release_storage.R b/R/tar_release_storage.R index e6913a92..903158b1 100644 --- a/R/tar_release_storage.R +++ b/R/tar_release_storage.R @@ -1,272 +1,392 @@ -#' Create GitHub Releases repository for targets -#' @description Create a tar_repository_cas() object that stores targets -#' using GitHub releases as the backend, with local persistent caching. -#' @param repo Repository in "owner/repo" format -#' @param tag Release tag to store objects (e.g., "objects_v2024" or "objects_current") -#' @param format Serialization format: "qs" (fast, recommended), "rds", or "parquet" -#' @param cache_dir Persistent cache directory for downloaded files (default: "data/.tar_cache") -#' @return tar_repository_cas() object for use with tar_target(repository = ...) -#' @details -#' Use with tar_target(..., repository = tar_github_release_repo(...)) -#' -#' This implements the Content Addressable Storage (CAS) pattern where targets -#' are stored with serialized R objects, with GitHub releases as the backend -#' and local persistent caching for speed. -#' -#' Example: -#' ``` -#' gh_repo <- tar_github_release_repo( -#' repo = "AdamWilsonLab/emma_envdata", -#' tag = "objects_current", -#' format = "qs", -#' cache_dir = "data/.tar_cache" -#' ) -#' -#' tar_target( -#' my_object, -#' some_computation(), -#' repository = gh_repo, -#' cue = tar_cue(mode = "never") -#' ) -#' ``` +#' 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_github_release_repo <- function( - repo, - tag, - format = "qs", - cache_dir = "data/.tar_cache" +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" - stopifnot( - is.character(repo) && nchar(repo) > 0, - is.character(tag) && nchar(tag) > 0, - format %in% c("qs", "rds", "parquet") - ) + if (!nzchar(repo) || !nzchar(tag)) { + stop("GitHub release configuration not set. Provide repo and tag parameters or set environment variables.") + } - # Create a tar_repository_cas() object with self-contained functions - # that read config from environment variables - tar_repository_cas( - upload = function(key, path) { - repo <- Sys.getenv("TAR_GH_RELEASE_REPO") - tag <- Sys.getenv("TAR_GH_RELEASE_TAG") - format <- Sys.getenv("TAR_GH_RELEASE_FORMAT") - - # Ensure release exists before uploading - release_exists <- FALSE - tryCatch({ - assets <- piggyback::pb_list(repo = repo, tag = tag) - release_exists <- TRUE - }, error = function(e) { - # pb_list throws error if release doesn't exist - release_exists <<- FALSE - }) - - if (!release_exists) { - message("[tar_github_release] Creating release: ", tag) + 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_new_release(repo = repo, tag = tag) - message("[tar_github_release] Release created: ", tag) + 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 (!grepl("already exists", tolower(conditionMessage(e)))) { - stop("[tar_github_release] Failed to create release: ", conditionMessage(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)) } }) } - - if (file.exists(path) && !dir.exists(path)) { - message("[tar_github_release] Uploading file: ", key) - - # Get credentials - creds <- tryCatch({ - gitcreds::gitcreds_get() - }, error = function(e) { - message("[tar_github_release] No git credentials found, trying without token") - NULL - }) + } 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 - token <- if (!is.null(creds)) creds$password else NULL + 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) - max_attempts <- 3 - uploaded <- FALSE + # 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) - for (attempt in 1:max_attempts) { - tryCatch({ - piggyback::pb_upload( - file = path, - repo = repo, - tag = tag, - name = key, - overwrite = TRUE, - .token = token - ) - message("[tar_github_release] File uploaded successfully: ", key) - # Give GitHub time to process the file - Sys.sleep(3) - uploaded <- TRUE - return(invisible()) - }, error = function(e) { - message("[tar_github_release] Upload attempt ", attempt, " failed: ", conditionMessage(e)) - if (attempt < max_attempts) { - Sys.sleep(2) - } else { - stop("[tar_github_release] Failed to upload file after ", max_attempts, " attempts: ", conditionMessage(e)) - } - }) - } + # 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 { - obj <- readRDS(path) - temp_file <- tempfile(fileext = paste0(".", format)) - on.exit(unlink(temp_file), add = TRUE) - - if (format == "qs") { - qs::qsave(obj, temp_file) - } else if (format == "rds") { - saveRDS(obj, temp_file) - } else if (format == "parquet") { - arrow::write_parquet(obj, temp_file) + # 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)) } - - max_attempts <- 5 - for (attempt in 1:max_attempts) { - tryCatch({ - piggyback::pb_upload( - file = temp_file, - repo = repo, - tag = tag, - name = key, - overwrite = TRUE, - .token = NULL - ) - message("[tar_github_release] Object uploaded: ", key) - return(invisible()) - }, error = function(e) { - if (attempt < max_attempts) { - message("[tar_github_release] Upload attempt ", attempt, " failed: ", conditionMessage(e)) - Sys.sleep(2) - } else { - stop("[tar_github_release] Failed to upload after ", max_attempts, " attempts: ", conditionMessage(e)) - } - }) + } + } + + # 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]) } } - }, - download = function(key, path) { - repo <- Sys.getenv("TAR_GH_RELEASE_REPO") - tag <- Sys.getenv("TAR_GH_RELEASE_TAG") - format <- Sys.getenv("TAR_GH_RELEASE_FORMAT") - cache_dir <- Sys.getenv("TAR_GH_RELEASE_CACHE_DIR") - dir.create(cache_dir, recursive = TRUE, showWarnings = FALSE) - cached_file <- file.path(cache_dir, key) + # 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) - need_download <- TRUE - if (file.exists(cached_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({ - remote_assets <- piggyback::pb_list(repo = repo, tag = tag) - remote_asset <- remote_assets[remote_assets$file_name == key, ] - - if (nrow(remote_asset) > 0) { - local_size <- file.size(cached_file) - remote_size <- remote_asset$size[1] - - if (local_size == remote_size) { - message("[tar_github_release] Cache valid (size match: ", local_size, " bytes)") - need_download <- FALSE - } + # 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) { - message("[tar_github_release] Could not verify cache: ", conditionMessage(e)) + if (verbose) message("[tar_github_release] Could not delete old asset: ", conditionMessage(e)) }) } - if (need_download) { - max_attempts <- 5 - for (attempt in 1:max_attempts) { - tryCatch({ - piggyback::pb_download( - file = key, - repo = repo, - tag = tag, - dest = cache_dir, - overwrite = TRUE - ) - message("[tar_github_release] Downloaded: ", key) - break - }, error = function(e) { - if (attempt < max_attempts) { - message("[tar_github_release] Download attempt ", attempt, " failed: ", conditionMessage(e)) - Sys.sleep(2) - } else { - stop("[tar_github_release] Failed to download after ", max_attempts, " attempts: ", 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 (!file.exists(cached_file)) { - stop("[tar_github_release] Failed to retrieve: ", key) + 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) } - file_exts <- c("parquet", "nc", "tif", "gpkg", "shp", "dbf", "prj", "shx") - is_spatial_file <- any(endsWith(tolower(key), paste0(".", file_exts))) - - if (is_spatial_file) { - file.copy(cached_file, path, overwrite = TRUE) - message("[tar_github_release] Retrieved file: ", key) - } else { - if (format == "qs") { - obj <- qs::qread(cached_file) - } else if (format == "rds") { - obj <- readRDS(cached_file) - } else if (format == "parquet") { - obj <- arrow::read_parquet(cached_file) - } - - saveRDS(obj, path) - message("[tar_github_release] Retrieved and deserialized: ", key) + # 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)) + }) } - invisible() - }, - exists = function(key) { - repo <- Sys.getenv("TAR_GH_RELEASE_REPO") - tag <- Sys.getenv("TAR_GH_RELEASE_TAG") - # Retry up to 10 times in case file was just uploaded - for (attempt in 1:10) { + max_attempts <- 3 + for (attempt in 1:max_attempts) { tryCatch({ - assets <- piggyback::pb_list(repo = repo, tag = tag) - found <- any(assets$file_name == key) - if (found) { - message("[tar_github_release] Confirmed exists: ", key, " (attempt ", attempt, ")") - return(TRUE) - } - if (attempt < 10) { - Sys.sleep(2) - } + 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 < 10) { + 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)) } }) } - FALSE } - ) + } + + if (verbose) message("[tar_github_release] Upload complete") + invisible(NULL) } -# Helper to set up tar_resources_repository_cas with environment variables -tar_github_release_resources <- function( +#' 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" ) { - tar_resources_repository_cas( - envvars = c( - TAR_GH_RELEASE_REPO = repo, - TAR_GH_RELEASE_TAG = tag, - TAR_GH_RELEASE_FORMAT = format, - TAR_GH_RELEASE_CACHE_DIR = cache_dir - ) - ) + stop("tar_github_release_repo() is deprecated. Use tar_upload_github_release() after tar_make() instead.") } + diff --git a/_targets.R b/_targets.R index f0b65e35..968a266b 100644 --- a/_targets.R +++ b/_targets.R @@ -2,7 +2,7 @@ message("Starting tar_make()") print("Starting tar_make() - print") library(targets) -library(qs) +suppressMessages(library(qs)) library(tarchetypes) library(geotargets) library(visNetwork) @@ -40,8 +40,8 @@ library(sfarrow) # source all files in R folder - lapply(list.files("R",pattern="[.]R",full.names = T), function(x) {print(x); source(x)}) - 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) @@ -53,45 +53,44 @@ library(sfarrow) dir.create("data/releases", recursive = TRUE, showWarnings = FALSE) dir.create("data/target_outputs", recursive = TRUE, showWarnings = FALSE) - # GitHub release repository configuration + # 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" + cache_dir = "data/target_outputs/.tar_cache" #this is local cache for speed ) - # Set up GitHub release repository for storing targets - gh_repo <- tar_github_release_repo( - repo = gh_repo_config$repo, - tag = gh_repo_config$tag, - format = gh_repo_config$format, - cache_dir = gh_repo_config$cache_dir + # 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)) + }) + } + tar_option_set( packages = c("tidyverse", "stringr","knitr","sf","stars","units","geotargets", "appeears", "terra", "smoothr", "janitor", "sfarrow", "jsonlite", "piggyback", "qs", "arrow"), - resources = tar_resources( - repository_cas = tar_github_release_resources( - repo = gh_repo_config$repo, - tag = gh_repo_config$tag, - format = gh_repo_config$format, - cache_dir = gh_repo_config$cache_dir - ) - ) + 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) - # geotargets_option_set( - # gdal_raster_driver = "netCDF", - # gdal_raster_creation_options = c("FORMAT=NC4", "COMPRESS=DEFLATE", "ZLEVEL=9"), - # gdal_vector_driver = "GPKG" - # ) - ## Authenticate with AppEEARS - # source("R/appeears_auth.R") +## Authenticate with AppEEARS +# source("R/appeears_auth.R") # Ensure things are clean # unlink(file.path("data/temp/"), recursive = TRUE, force = TRUE) @@ -100,8 +99,6 @@ library(sfarrow) list( - -# #Prep needed files # start tar_target( vegmap_shp, download_vegmap_release( @@ -112,36 +109,34 @@ list( shapefile_name = "NVM2024Final_IEM5_12_07012025.shp" ), format = "file", - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") + 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", - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") + repository = "local" ), tar_target( capenature_fires_shp, "data/manual_download/All_fires_23_24_gw/All_fires_23_24_gw.shp", format="file", - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") + repository = "local" ), tar_target( country.parquet, get_country(), - format = "file", - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") + format = "file" ), tar_target( domain.parquet, domain_define(vegmap = vegmap_shp, country = country.parquet), - format = "file", - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") + format = "file" ), # Stable bounding box for downloads (50km buffer around domain) @@ -150,32 +145,29 @@ list( domain_bbox.parquet, make_domain_bbox(domain.parquet, buffer_m = 50000, out_file = "data/target_outputs/domain_bbox.parquet"), format = "file", - repository = gh_repo, - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") + cue = tar_cue(mode = "never") ), - # Domain raster with pixel IDs, remnants, and distance to remnants (NetCDF with CF-1.8 metadata) + # 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/raw/domain.nc" + out_file = "data/target_outputs/domain.nc" ), - format = "file", - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never") - # tar_invalidate(domain_nc) # run this to force recompute + format = "file" + # tar_invalidate(domain_nc) # run this to force recompute, which will trigger redownloading all RS data from appeears ), - # Vegetation map raster with metadata + # Vegetation map raster tar_target( vegmap_nc, data_vegmap(domain_raster = domain_nc, vegmap_shp = vegmap_shp, - out_file = "data/raw/vegmap.nc"), - format = "file", - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never")), + out_file = "data/target_outputs/vegmap.nc"), + format = "file"), # # # # Infrequent updates via releases @@ -196,12 +188,13 @@ list( # ) #, - # tar_target( - # climate_chelsa_release, - # get_chelsa(temp_directory = "data/temp/raw_data/climate_chelsa/", - # tag = "raw_static", - # domain = domain) - # )#, + tar_target( + climate_chelsa, + get_climate_chelsa( + domain = sfarrow::st_read_parquet(domain.parquet), + verbose = TRUE), + format = "file" + ), # tar_terra_rast( # clouds_wilson_release, @@ -211,18 +204,36 @@ list( # 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_task_id, + submit_elevation_task( + domain_vector = sfarrow::st_read_parquet(domain.parquet), + verbose = TRUE + ) + ), + tar_target( elevation, - get_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/", - out_file = "data/raw/elevation_nasadem.nc" + verbose = TRUE ), - format="file", - cue = tar_cue(mode = if (run_mode == "prime") "thorough" else "never"), - ) -#, + 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( @@ -267,15 +278,26 @@ list( # cue = tar_cue(mode = if (run_mode == "update") "always" else "thorough") # ), -# tar_age( -# ndvi_modis_release, -# get_release_ndvi_modis_appeears(temp_directory = "data/temp/raw_data/ndvi_modis/", -# tag = "raw_ndvi_modis_nc", -# domain = domain, -# sleep_time = 5, -# verbose = TRUE), -# age = as.difftime(7, units = "days") -# ), + # 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( + modis_vi_task_id, + submit_modis_vi_task( + domain_vector = sfarrow::st_read_parquet(domain.parquet), + mode = run_mode + ) + ), + + tar_target( + 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 + ), + format = "file" + ) # tar_age( # ndvi_viirs_release, diff --git a/_targets/meta/meta b/_targets/meta/meta index 455a8760..77024ef3 100644 --- a/_targets/meta/meta +++ b/_targets/meta/meta @@ -1,47 +1,15 @@ name|type|data|command|depend|seed|path|time|size|bytes|format|repository|iteration|parent|children|seconds|warnings|error -correct_ndvi_dates_release_proj_and_extent|stem|49be87cd8aaf3e80|1d0f5f39ef47d1b6|edb3a13ae4cb1ccc|-1844360325||t20458.6135571947s|s63b|63|rds|local|vector|||17.619|| -remove_ee_backup|stem||befe0ca90eb2c488|2c530c1562a7fbd1|-773029837||t20458.6135575072s||0|rds|local|vector|||0.003||could not find function 'clean_up' -vegmap|stem|0c98d327f6beefbe|f82077cc150b71ed|774ecf7dbe3e5980|986433229||t20458.6208086331s|s141541376b|141541376|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||18.36|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)| -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.064|| -country|stem|fb8900f4b7b88ca5|53feefadcddcbd52|80f7245c40a53951|-430139696||t20462.6945185888s|s4964352b|4964352|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||13.132|| -domain|stem|e6d498ad1ef6d5de|3b892a93e2976da1|079d4f875c5b950e|-103757746||t20462.6947265009s|s3072000b|3072000|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||17.511|| -process_release_biome_raster|function|a0b27b083f7ed85e||||||||||||||| -domain_raster|stem|f326af31f3a5d493|ff3f8f4fb81299ee|f6d4e813438fd81c|1482803489||t20462.7181557878s|s202093691b|202093691|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IE5VTEwpLCAKICAgICAgICBsaXN0KCkpKQp9&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1520.736|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). [rast] unknown extent| -vegmap_raster|stem||7c1fa6d4fe95368b|ea12d674ae33b1c9|1016620066||t20462.7183129309s||0|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IE5VTEwpLCAKICAgICAgICBsaXN0KCkpKQp9&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||13.393||crs not found: is it missing? -climate_chelsa_release|stem|88f9252bc7d9ed1a|4c496a15fe2faf91|97208ffa76a10d39|-670781068||t20461.8983898142s||81|rds|local|vector|||7.083|Failed to create release: 'raw_static' already exists!|object 'domain' not found -domain.nc|stem|314f0006ad321020|f4caf66b195bedfe|7d2ec7c5e07cf5d8|797368847||t20462.7618461726s|s3623507b|3623507|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IGMoIkZPUk1BVD1OQzQiLCAKICAgICAgICAiQ09NUFJFU1M9REVGTEFURSIsICJaTEVWRUw9OSIpKSwgbGlzdCgpKSkKfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1585.126|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). [writeRaster] consider writeCDF to write ncdf files| -vegmap.nc|stem||f1094a5facfce02e|98fce78e25b3b6cb|-1931934530||t20462.7644244077s||0|format_custom&read=dGVycmE6OnJhc3QocGF0aCk&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVSYXN0ZXIsIGMobGlzdChvYmplY3QsIGZpbGVuYW1lID0gcGF0aCwgCiAgICAgICAgZmlsZXR5cGUgPSAibmV0Q0RGIiwgb3ZlcndyaXRlID0gVFJVRSwgZ2RhbCA9IGMoIkZPUk1BVD1OQzQiLCAKICAgICAgICAiQ09NUFJFU1M9REVGTEFURSIsICJaTEVWRUw9OSIpKSwgbGlzdCgpKSkKfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||222.555|attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1)|[==] raster has no values -national_boundary|function|8e86fb14d36f5061||||||||||||||| -get_domain|function|73c97bc96bfedda4||||||||||||||| -domain_distance|function|939a115603a9b4df||||||||||||||| -domain_remnants|function|4c6497b244bdbc02||||||||||||||| -domain_remnants_release|function|d06ba69c89670801||||||||||||||| -domain_distance_release|function|c9d2a5f3c74dfc11||||||||||||||| -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.074|| -domain.tif|stem|e51bb36f9f6f3a70|f4caf66b195bedfe|df22595d26cedbec|1539589734||t20462.8142474563s|s6091277b|6091277|format_custom&read=ewogICAgdG1wIDwtIHRlbXBkaXIoKQogICAgemlwOjp1bnppcCh6aXBmaWxlID0gcGF0aCwgZXhkaXIgPSB0bXApCiAgICB0ZXJyYTo6cmFzdChmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkpCn0&write=ewogICAgdG1wIDwtIHdpdGhyOjpsb2NhbF90ZW1wZGlyKCkKICAgIHJhc3Rlcl90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkKICAgIHppcF90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCAib2JqZWN0LnppcCIpCiAgICBkby5jYWxsKHRlcnJhOjp3cml0ZVJhc3RlciwgYyhsaXN0KHggPSBvYmplY3QsIGZpbGVuYW1lID0gcmFzdGVyX3RtcF9maWxlLCAKICAgICAgICBmaWxldHlwZSA9ICJHVGlmZiIsIG92ZXJ3cml0ZSA9IFRSVUUsIGdkYWwgPSBjKCJDT01QUkVTUz1ERUZMQVRFIiwgCiAgICAgICAgIlpMRVZFTD05IikpLCBsaXN0KCkpKQogICAgcmFzdGVyX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHRtcCwgZnVsbC5uYW1lcyA9IFRSVUUpCiAgICB6aXA6OnppcCh6aXBmaWxlID0gemlwX3RtcF9maWxlLCBmaWxlcyA9IHJhc3Rlcl9maWxlcywgY29tcHJlc3Npb25fbGV2ZWwgPSAxLCAKICAgICAgICBtb2RlID0gImNoZXJyeS1waWNrIiwgcm9vdCA9IHRtcCkKICAgIGZpbGUuY29weSh6aXBfdG1wX2ZpbGUsIHBhdGgpCn0&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||1370.939|PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_database: Cannot find proj.db (GDAL error 1)| -vegmap.tif|stem||ba090534dd7ca5ef|9c77befa3fc97dcc|-1280618250||t20462.816821373s||0|format_custom&read=ewogICAgdG1wIDwtIHRlbXBkaXIoKQogICAgemlwOjp1bnppcCh6aXBmaWxlID0gcGF0aCwgZXhkaXIgPSB0bXApCiAgICB0ZXJyYTo6cmFzdChmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkpCn0&write=ewogICAgdG1wIDwtIHdpdGhyOjpsb2NhbF90ZW1wZGlyKCkKICAgIHJhc3Rlcl90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCBiYXNlbmFtZShwYXRoKSkKICAgIHppcF90bXBfZmlsZSA8LSBmaWxlLnBhdGgodG1wLCAib2JqZWN0LnppcCIpCiAgICBkby5jYWxsKHRlcnJhOjp3cml0ZVJhc3RlciwgYyhsaXN0KHggPSBvYmplY3QsIGZpbGVuYW1lID0gcmFzdGVyX3RtcF9maWxlLCAKICAgICAgICBmaWxldHlwZSA9ICJHVGlmZiIsIG92ZXJ3cml0ZSA9IFRSVUUsIGdkYWwgPSBjKCJDT01QUkVTUz1ERUZMQVRFIiwgCiAgICAgICAgIlpMRVZFTD05IikpLCBsaXN0KCkpKQogICAgcmFzdGVyX2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IHRtcCwgZnVsbC5uYW1lcyA9IFRSVUUpCiAgICB6aXA6OnppcCh6aXBmaWxlID0gemlwX3RtcF9maWxlLCBmaWxlcyA9IHJhc3Rlcl9maWxlcywgY29tcHJlc3Npb25fbGV2ZWwgPSAxLCAKICAgICAgICBtb2RlID0gImNoZXJyeS1waWNrIiwgcm9vdCA9IHRtcCkKICAgIGZpbGUuY29weSh6aXBfdG1wX2ZpbGUsIHBhdGgpCn0&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||222.265|attribute variables are assumed to be spatially constant throughout all geometries. PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1). PROJ: proj_create_from_name: Cannot find proj.db (GDAL error 1)|[==] raster has no values -domain.gpkg|stem|3752155dbbfebdfc|d071234244cc8a00|c3152e2a22ed6a1e|105859277||t20462.8197902732s|s3072000b|3072000|format_custom&read=ewogICAgaWYgKCJHUEtHIiA9PSAiRVNSSSBTaGFwZWZpbGUiKSB7CiAgICAgICAgdGVycmE6OnZlY3QocGFzdGUwKCIvdnNpemlwL3siLCBwYXRoLCAifSIpKQogICAgfQogICAgZWxzZSB7CiAgICAgICAgdGVycmE6OnZlY3QocGF0aCkKICAgIH0KfQ&write=ewogICAgZG8uY2FsbCh0ZXJyYTo6d3JpdGVWZWN0b3IsIGMobGlzdCh4ID0gb2JqZWN0LCBmaWxlbmFtZSA9IGlmZWxzZSgiR1BLRyIgPT0gCiAgICAgICAgIkVTUkkgU2hhcGVmaWxlIiwgeWVzID0gcGFzdGUwKHBhdGgsICIuc2h6IiksIG5vID0gcGF0aCksIAogICAgICAgIGZpbGV0eXBlID0gIkdQS0ciLCBvdmVyd3JpdGUgPSBUUlVFLCBvcHRpb25zID0gIkVOQ09ESU5HPVVURi04IiksIAogICAgICAgIGxpc3QoKSkpCiAgICBpZiAoIkdQS0ciID09ICJFU1JJIFNoYXBlZmlsZSIpIHsKICAgICAgICBmaWxlLnJlbmFtZShwYXN0ZTAocGF0aCwgIi5zaHoiKSwgcGF0aCkKICAgIH0KfQ&marshal=dGVycmE6OndyYXAob2JqZWN0KQ&unmarshal=dGVycmE6OnVud3JhcChvYmplY3Qp&convert=©=&repository=|local|list|||17.522|| -get_release_elevation_nasadem|function|0404b4ce37dd6a41||||||||||||||| -country.gpkg|stem|2582513b02199b9d|81ddbcfc163d4096|40e5cb748104ac36|728599321|data/raw/country.gpkg|t20465.7424674251s|s4964352b|4964352|file|local|vector|||13.63|| -domain_bbox|stem|09b657536e3c59a9|91710e24cd731172|832da33b4d2d7b12|1880263597||t20465.7494766091s|s1960b|1960|rds|local|vector|||0.023|| -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.043|| -domain_nc|stem|96dc0114379d9051|b8acd697cd8f2d9d|44a1851f1c7c45da|191087344|data/raw/domain.nc|t20466.8819384602s|s8239559b|8239559|file|local|vector|||314.971|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| -vegmap_nc|stem|64e699364294e6c9|b5acbb48248b9d4e|498003e3b29b0906|573083685|data/raw/vegmap.nc|t20466.8844654185s|s1262002b|1262002|file|local|vector|||218.292|attribute variables are assumed to be spatially constant throughout all geometries| -get_release_elevation_nasadem_appears|function|2aa9c12e93873a06||||||||||||||| -elevation_nasadem_release|stem||844ad2839f008475|2c530c1562a7fbd1|-1675952279||t20466.886570181s||0|rds|local|vector|||0.049||could not find function 'get_release_elevation_nasadem' -elevation|stem||5fbbedebd1d63e4c|407f9094edd58a6c|223776802||t20466.8883945611s||0|file|local|vector|||2975.358||Task polling timed out after 600 seconds -.tar_release_upload_with_retry|function|fec3488334573a3c||||||||||||||| -rel_store|object|e6e2823525d141fc||||||||||||||| -rel_resources|object|5ee4b402b43d8c80||||||||||||||| -.tar_release_validate_file|function|e3d4de13c3c072ff||||||||||||||| -tar_release_resources|function|53ebe2d610ecbda8||||||||||||||| -.tar_release_download_with_retry|function|4330c4f0ead9e90e||||||||||||||| -tar_release_storage|function|ec8c17bd82f64ec2||||||||||||||| -domain.parquet|stem|c46b7f544a0c0629|7f3fdd56ef8d2af4|8fe712f7a50fc85a|522092063|data/raw/domain.parquet|t20467.8492217853s|s2564266b|2564266|file|local|vector|||22.597|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.| -.tar_github_release_exists|function|ca7fe334b03daa9f||||||||||||||| -.tar_github_release_upload|function|5737138f4a437610||||||||||||||| -.tar_github_release_download|function|fb6fac5d9f78a572||||||||||||||| -country.parquet|stem|2f020da9d9337cd7|81ddbcfc163d4096|e104ab210d1047f3|1129261391|data/target_outputs/country.parquet|t20467.8667292114s|s4488713b|4488713|file|local|vector|||12.091|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.| +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 @@ -56,28 +24,28 @@ 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 -github_actions_env|object|2c530c1562a7fbd1 -.Random.seed|object|bb899618badafb4e +.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|bf54208b5dd9f5ca +get_country|function|0fa48242b80aef5e existing_kr|object|1bb3bf184f7669e1 -get_alos_data|function|75cf21dd60609648 -tar_github_release_resources|function|5005c1e1d1f13042 +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_elevation|function|44cce564be9070e7 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 @@ -85,27 +53,26 @@ get_release_fire_modis_appeears|function|9992a7da9cc6cf78 domain_define|function|6e7942fc59c20a13 kr_name|object|643fa3c4a8310651 temp_directory|object|40d122f36d50a344 -gh_repo|object|dbe88c1b061b73dc +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 -get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 -make_domain_bbox|function|80239b842e709a51 -tar_github_release_repo|function|f264edf951256e9b +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_release_climate_chelsa|function|f63060c4751e6183 -get_release_alos|function|3d0bd84374208048 +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_alos|function|d1225f8b3a3fa4da process_release_soil_gcfr|function|51a95877cbbd87c2 process_release_protected_area_distance|function|4ded7cf04ce267a2 process_release_climate_chelsa|function|bbaf017bff9aa203 @@ -117,7 +84,10 @@ 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_bbox.parquet|stem|e5b3381be6d92804|8ef5b89424c2d345|3b603d46958c9c45|1651755667|data/target_outputs/domain_bbox.parquet|t20468.1054726828s|s15057b|11877|file|repository_cas&upload=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICByZWxlYXNlX2V4aXN0cyA8LSBGQUxTRQogICAgdHJ5Q2F0Y2goewogICAgICAgIGFzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIHRhZyA9IHRhZykKICAgICAgICByZWxlYXNlX2V4aXN0cyA8LSBUUlVFCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICByZWxlYXNlX2V4aXN0cyA8PC0gRkFMU0UKICAgIH0pCiAgICBpZiAoIXJlbGVhc2VfZXhpc3RzKSB7CiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ3JlYXRpbmcgcmVsZWFzZTogIiwgdGFnKQogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl9uZXdfcmVsZWFzZShyZXBvID0gcmVwbywgdGFnID0gdGFnKQogICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBSZWxlYXNlIGNyZWF0ZWQ6ICIsIAogICAgICAgICAgICAgICAgdGFnKQogICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoIWdyZXBsKCJhbHJlYWR5IGV4aXN0cyIsIHRvbG93ZXIoY29uZGl0aW9uTWVzc2FnZShlKSkpKSB7CiAgICAgICAgICAgICAgICBzdG9wKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBGYWlsZWQgdG8gY3JlYXRlIHJlbGVhc2U6ICIsIAogICAgICAgICAgICAgICAgICBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgIH0KICAgIGlmIChmaWxlLmV4aXN0cyhwYXRoKSAmJiAhZGlyLmV4aXN0cyhwYXRoKSkgewogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFVwbG9hZGluZyBmaWxlOiAiLCBrZXkpCiAgICAgICAgY3JlZHMgPC0gdHJ5Q2F0Y2goewogICAgICAgICAgICBnaXRjcmVkczo6Z2l0Y3JlZHNfZ2V0KCkKICAgICAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gTm8gZ2l0IGNyZWRlbnRpYWxzIGZvdW5kLCB0cnlpbmcgd2l0aG91dCB0b2tlbiIpCiAgICAgICAgICAgIE5VTEwKICAgICAgICB9KQogICAgICAgIHRva2VuIDwtIGlmICghaXMubnVsbChjcmVkcykpIAogICAgICAgICAgICBjcmVkcyRwYXNzd29yZAogICAgICAgIGVsc2UgTlVMTAogICAgICAgIG1heF9hdHRlbXB0cyA8LSAzCiAgICAgICAgdXBsb2FkZWQgPC0gRkFMU0UKICAgICAgICBmb3IgKGF0dGVtcHQgaW4gMTptYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgdHJ5Q2F0Y2goewogICAgICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl91cGxvYWQoZmlsZSA9IHBhdGgsIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBuYW1lID0ga2V5LCBvdmVyd3JpdGUgPSBUUlVFLCAudG9rZW4gPSB0b2tlbikKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZpbGUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5OiAiLCAKICAgICAgICAgICAgICAgICAga2V5KQogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDEpCiAgICAgICAgICAgICAgICB1cGxvYWRlZCA8LSBUUlVFCiAgICAgICAgICAgICAgICByZXR1cm4oaW52aXNpYmxlKCkpCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gVXBsb2FkIGF0dGVtcHQgIiwgCiAgICAgICAgICAgICAgICAgIGF0dGVtcHQsICIgZmFpbGVkOiAiLCBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIHVwbG9hZCBmaWxlIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBvYmogPC0gcmVhZFJEUyhwYXRoKQogICAgICAgIHRlbXBfZmlsZSA8LSB0ZW1wZmlsZShmaWxlZXh0ID0gcGFzdGUwKCIuIiwgZm9ybWF0KSkKICAgICAgICBvbi5leGl0KHVubGluayh0ZW1wX2ZpbGUpLCBhZGQgPSBUUlVFKQogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBxczo6cXNhdmUob2JqLCB0ZW1wX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicmRzIikgewogICAgICAgICAgICBzYXZlUkRTKG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInBhcnF1ZXQiKSB7CiAgICAgICAgICAgIGFycm93Ojp3cml0ZV9wYXJxdWV0KG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX3VwbG9hZChmaWxlID0gdGVtcF9maWxlLCByZXBvID0gcmVwbywgCiAgICAgICAgICAgICAgICAgIHRhZyA9IHRhZywgbmFtZSA9IGtleSwgb3ZlcndyaXRlID0gVFJVRSwgLnRva2VuID0gTlVMTCkKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIE9iamVjdCB1cGxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIHJldHVybihpbnZpc2libGUoKSkKICAgICAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heF9hdHRlbXB0cykgewogICAgICAgICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBVcGxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIHVwbG9hZCBhZnRlciAiLCAKICAgICAgICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHMsICIgYXR0ZW1wdHM6ICIsIGNvbmRpdGlvbk1lc3NhZ2UoZSkpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgfQp9&download=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICBjYWNoZV9kaXIgPC0gU3lzLmdldGVudigiVEFSX0dIX1JFTEVBU0VfQ0FDSEVfRElSIikKICAgIGRpci5jcmVhdGUoY2FjaGVfZGlyLCByZWN1cnNpdmUgPSBUUlVFLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKICAgIGNhY2hlZF9maWxlIDwtIGZpbGUucGF0aChjYWNoZV9kaXIsIGtleSkKICAgIG5lZWRfZG93bmxvYWQgPC0gVFJVRQogICAgaWYgKGZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcmVtb3RlX2Fzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIAogICAgICAgICAgICAgICAgdGFnID0gdGFnKQogICAgICAgICAgICByZW1vdGVfYXNzZXQgPC0gcmVtb3RlX2Fzc2V0c1tyZW1vdGVfYXNzZXRzJGZpbGVfbmFtZSA9PSAKICAgICAgICAgICAgICAgIGtleSwgXQogICAgICAgICAgICBpZiAobnJvdyhyZW1vdGVfYXNzZXQpID4gMCkgewogICAgICAgICAgICAgICAgbG9jYWxfc2l6ZSA8LSBmaWxlLnNpemUoY2FjaGVkX2ZpbGUpCiAgICAgICAgICAgICAgICByZW1vdGVfc2l6ZSA8LSByZW1vdGVfYXNzZXQkc2l6ZVsxXQogICAgICAgICAgICAgICAgaWYgKGxvY2FsX3NpemUgPT0gcmVtb3RlX3NpemUpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ2FjaGUgdmFsaWQgKHNpemUgbWF0Y2g6ICIsIAogICAgICAgICAgICAgICAgICAgIGxvY2FsX3NpemUsICIgYnl0ZXMpIikKICAgICAgICAgICAgICAgICAgbmVlZF9kb3dubG9hZCA8LSBGQUxTRQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIENvdWxkIG5vdCB2ZXJpZnkgY2FjaGU6ICIsIAogICAgICAgICAgICAgICAgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICB9KQogICAgfQogICAgaWYgKG5lZWRfZG93bmxvYWQpIHsKICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX2Rvd25sb2FkKGZpbGUgPSBrZXksIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBkZXN0ID0gY2FjaGVfZGlyLCBvdmVyd3JpdGUgPSBUUlVFKQogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIGRvd25sb2FkIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHN0b3AoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZhaWxlZCB0byByZXRyaWV2ZTogIiwga2V5KQogICAgfQogICAgZmlsZV9leHRzIDwtIGMoInBhcnF1ZXQiLCAibmMiLCAidGlmIiwgImdwa2ciLCAic2hwIiwgImRiZiIsIAogICAgICAgICJwcmoiLCAic2h4IikKICAgIGlzX3NwYXRpYWxfZmlsZSA8LSBhbnkoZW5kc1dpdGgodG9sb3dlcihrZXkpLCBwYXN0ZTAoIi4iLCAKICAgICAgICBmaWxlX2V4dHMpKSkKICAgIGlmIChpc19zcGF0aWFsX2ZpbGUpIHsKICAgICAgICBmaWxlLmNvcHkoY2FjaGVkX2ZpbGUsIHBhdGgsIG92ZXJ3cml0ZSA9IFRSVUUpCiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gUmV0cmlldmVkIGZpbGU6ICIsIGtleSkKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBvYmogPC0gcXM6OnFyZWFkKGNhY2hlZF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInJkcyIpIHsKICAgICAgICAgICAgb2JqIDwtIHJlYWRSRFMoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicGFycXVldCIpIHsKICAgICAgICAgICAgb2JqIDwtIGFycm93OjpyZWFkX3BhcnF1ZXQoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIHNhdmVSRFMob2JqLCBwYXRoKQogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFJldHJpZXZlZCBhbmQgZGVzZXJpYWxpemVkOiAiLCAKICAgICAgICAgICAga2V5KQogICAgfQogICAgaW52aXNpYmxlKCkKfQ&exists=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9yIChhdHRlbXB0IGluIDE6MykgewogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgYXNzZXRzIDwtIHBpZ2d5YmFjazo6cGJfbGlzdChyZXBvID0gcmVwbywgdGFnID0gdGFnKQogICAgICAgICAgICBmb3VuZCA8LSBhbnkoYXNzZXRzJGZpbGVfbmFtZSA9PSBrZXkpCiAgICAgICAgICAgIGlmIChmb3VuZCkgCiAgICAgICAgICAgICAgICByZXR1cm4oVFJVRSkKICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCAzKSAKICAgICAgICAgICAgICAgIFN5cy5zbGVlcCgxKQogICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IDMpIAogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDEpCiAgICAgICAgfSkKICAgIH0KICAgIEZBTFNFCn0&list=&consistent=RkFMU0U|vector|||||Error hashing output: timed out after retrying for 82.862 seconds. Path data/target_outputs/domain_bbox.parquet does not exist or has incorrect hash. File sync timed out. +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 @@ -132,28 +102,28 @@ 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 -github_actions_env|object|2c530c1562a7fbd1 -.Random.seed|object|e70e27c0086d8559 +.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|bf54208b5dd9f5ca +get_country|function|0fa48242b80aef5e existing_kr|object|1bb3bf184f7669e1 -get_alos_data|function|75cf21dd60609648 -tar_github_release_resources|function|5005c1e1d1f13042 +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_elevation|function|44cce564be9070e7 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 @@ -161,27 +131,26 @@ get_release_fire_modis_appeears|function|9992a7da9cc6cf78 domain_define|function|6e7942fc59c20a13 kr_name|object|643fa3c4a8310651 temp_directory|object|40d122f36d50a344 -gh_repo|object|dc84e030122d7d21 +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 -get_release_ndvi_evi_modis_appeears|function|e25766b94a258005 make_domain_bbox|function|39ee8fcd6d65cd43 -tar_github_release_repo|function|d015c11962e2a87d +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_release_climate_chelsa|function|f63060c4751e6183 -get_release_alos|function|3d0bd84374208048 +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_alos|function|d1225f8b3a3fa4da process_release_soil_gcfr|function|51a95877cbbd87c2 process_release_protected_area_distance|function|4ded7cf04ce267a2 process_release_climate_chelsa|function|bbaf017bff9aa203 @@ -193,4 +162,4 @@ 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_bbox.parquet|stem|25cd0fd1894c1176|8ef5b89424c2d345|fb33e4abae37e8ee|1651755667|data/target_outputs/domain_bbox.parquet|t20468.1191109291s|s15057b|15057|file|repository_cas&upload=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICByZWxlYXNlX2V4aXN0cyA8LSBGQUxTRQogICAgdHJ5Q2F0Y2goewogICAgICAgIGFzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIHRhZyA9IHRhZykKICAgICAgICByZWxlYXNlX2V4aXN0cyA8LSBUUlVFCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICByZWxlYXNlX2V4aXN0cyA8PC0gRkFMU0UKICAgIH0pCiAgICBpZiAoIXJlbGVhc2VfZXhpc3RzKSB7CiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ3JlYXRpbmcgcmVsZWFzZTogIiwgdGFnKQogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl9uZXdfcmVsZWFzZShyZXBvID0gcmVwbywgdGFnID0gdGFnKQogICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBSZWxlYXNlIGNyZWF0ZWQ6ICIsIAogICAgICAgICAgICAgICAgdGFnKQogICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoIWdyZXBsKCJhbHJlYWR5IGV4aXN0cyIsIHRvbG93ZXIoY29uZGl0aW9uTWVzc2FnZShlKSkpKSB7CiAgICAgICAgICAgICAgICBzdG9wKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBGYWlsZWQgdG8gY3JlYXRlIHJlbGVhc2U6ICIsIAogICAgICAgICAgICAgICAgICBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgIH0KICAgIGlmIChmaWxlLmV4aXN0cyhwYXRoKSAmJiAhZGlyLmV4aXN0cyhwYXRoKSkgewogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFVwbG9hZGluZyBmaWxlOiAiLCBrZXkpCiAgICAgICAgY3JlZHMgPC0gdHJ5Q2F0Y2goewogICAgICAgICAgICBnaXRjcmVkczo6Z2l0Y3JlZHNfZ2V0KCkKICAgICAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gTm8gZ2l0IGNyZWRlbnRpYWxzIGZvdW5kLCB0cnlpbmcgd2l0aG91dCB0b2tlbiIpCiAgICAgICAgICAgIE5VTEwKICAgICAgICB9KQogICAgICAgIHRva2VuIDwtIGlmICghaXMubnVsbChjcmVkcykpIAogICAgICAgICAgICBjcmVkcyRwYXNzd29yZAogICAgICAgIGVsc2UgTlVMTAogICAgICAgIG1heF9hdHRlbXB0cyA8LSAzCiAgICAgICAgdXBsb2FkZWQgPC0gRkFMU0UKICAgICAgICBmb3IgKGF0dGVtcHQgaW4gMTptYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgdHJ5Q2F0Y2goewogICAgICAgICAgICAgICAgcGlnZ3liYWNrOjpwYl91cGxvYWQoZmlsZSA9IHBhdGgsIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBuYW1lID0ga2V5LCBvdmVyd3JpdGUgPSBUUlVFLCAudG9rZW4gPSB0b2tlbikKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZpbGUgdXBsb2FkZWQgc3VjY2Vzc2Z1bGx5OiAiLCAKICAgICAgICAgICAgICAgICAga2V5KQogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDMpCiAgICAgICAgICAgICAgICB1cGxvYWRlZCA8LSBUUlVFCiAgICAgICAgICAgICAgICByZXR1cm4oaW52aXNpYmxlKCkpCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gVXBsb2FkIGF0dGVtcHQgIiwgCiAgICAgICAgICAgICAgICAgIGF0dGVtcHQsICIgZmFpbGVkOiAiLCBjb25kaXRpb25NZXNzYWdlKGUpKQogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIHVwbG9hZCBmaWxlIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBvYmogPC0gcmVhZFJEUyhwYXRoKQogICAgICAgIHRlbXBfZmlsZSA8LSB0ZW1wZmlsZShmaWxlZXh0ID0gcGFzdGUwKCIuIiwgZm9ybWF0KSkKICAgICAgICBvbi5leGl0KHVubGluayh0ZW1wX2ZpbGUpLCBhZGQgPSBUUlVFKQogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBxczo6cXNhdmUob2JqLCB0ZW1wX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicmRzIikgewogICAgICAgICAgICBzYXZlUkRTKG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInBhcnF1ZXQiKSB7CiAgICAgICAgICAgIGFycm93Ojp3cml0ZV9wYXJxdWV0KG9iaiwgdGVtcF9maWxlKQogICAgICAgIH0KICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX3VwbG9hZChmaWxlID0gdGVtcF9maWxlLCByZXBvID0gcmVwbywgCiAgICAgICAgICAgICAgICAgIHRhZyA9IHRhZywgbmFtZSA9IGtleSwgb3ZlcndyaXRlID0gVFJVRSwgLnRva2VuID0gTlVMTCkKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIE9iamVjdCB1cGxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIHJldHVybihpbnZpc2libGUoKSkKICAgICAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdCA8IG1heF9hdHRlbXB0cykgewogICAgICAgICAgICAgICAgICBtZXNzYWdlKCJbdGFyX2dpdGh1Yl9yZWxlYXNlXSBVcGxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIHVwbG9hZCBhZnRlciAiLCAKICAgICAgICAgICAgICAgICAgICBtYXhfYXR0ZW1wdHMsICIgYXR0ZW1wdHM6ICIsIGNvbmRpdGlvbk1lc3NhZ2UoZSkpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgfQogICAgfQp9&download=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9ybWF0IDwtIFN5cy5nZXRlbnYoIlRBUl9HSF9SRUxFQVNFX0ZPUk1BVCIpCiAgICBjYWNoZV9kaXIgPC0gU3lzLmdldGVudigiVEFSX0dIX1JFTEVBU0VfQ0FDSEVfRElSIikKICAgIGRpci5jcmVhdGUoY2FjaGVfZGlyLCByZWN1cnNpdmUgPSBUUlVFLCBzaG93V2FybmluZ3MgPSBGQUxTRSkKICAgIGNhY2hlZF9maWxlIDwtIGZpbGUucGF0aChjYWNoZV9kaXIsIGtleSkKICAgIG5lZWRfZG93bmxvYWQgPC0gVFJVRQogICAgaWYgKGZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHRyeUNhdGNoKHsKICAgICAgICAgICAgcmVtb3RlX2Fzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIAogICAgICAgICAgICAgICAgdGFnID0gdGFnKQogICAgICAgICAgICByZW1vdGVfYXNzZXQgPC0gcmVtb3RlX2Fzc2V0c1tyZW1vdGVfYXNzZXRzJGZpbGVfbmFtZSA9PSAKICAgICAgICAgICAgICAgIGtleSwgXQogICAgICAgICAgICBpZiAobnJvdyhyZW1vdGVfYXNzZXQpID4gMCkgewogICAgICAgICAgICAgICAgbG9jYWxfc2l6ZSA8LSBmaWxlLnNpemUoY2FjaGVkX2ZpbGUpCiAgICAgICAgICAgICAgICByZW1vdGVfc2l6ZSA8LSByZW1vdGVfYXNzZXQkc2l6ZVsxXQogICAgICAgICAgICAgICAgaWYgKGxvY2FsX3NpemUgPT0gcmVtb3RlX3NpemUpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gQ2FjaGUgdmFsaWQgKHNpemUgbWF0Y2g6ICIsIAogICAgICAgICAgICAgICAgICAgIGxvY2FsX3NpemUsICIgYnl0ZXMpIikKICAgICAgICAgICAgICAgICAgbmVlZF9kb3dubG9hZCA8LSBGQUxTRQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwgZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIENvdWxkIG5vdCB2ZXJpZnkgY2FjaGU6ICIsIAogICAgICAgICAgICAgICAgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICB9KQogICAgfQogICAgaWYgKG5lZWRfZG93bmxvYWQpIHsKICAgICAgICBtYXhfYXR0ZW1wdHMgPC0gNQogICAgICAgIGZvciAoYXR0ZW1wdCBpbiAxOm1heF9hdHRlbXB0cykgewogICAgICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgICAgICBwaWdneWJhY2s6OnBiX2Rvd25sb2FkKGZpbGUgPSBrZXksIHJlcG8gPSByZXBvLCAKICAgICAgICAgICAgICAgICAgdGFnID0gdGFnLCBkZXN0ID0gY2FjaGVfZGlyLCBvdmVyd3JpdGUgPSBUUlVFKQogICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWRlZDogIiwgCiAgICAgICAgICAgICAgICAgIGtleSkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHsKICAgICAgICAgICAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRG93bmxvYWQgYXR0ZW1wdCAiLCAKICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LCAiIGZhaWxlZDogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RvcCgiW3Rhcl9naXRodWJfcmVsZWFzZV0gRmFpbGVkIHRvIGRvd25sb2FkIGFmdGVyICIsIAogICAgICAgICAgICAgICAgICAgIG1heF9hdHRlbXB0cywgIiBhdHRlbXB0czogIiwgY29uZGl0aW9uTWVzc2FnZShlKSkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkKICAgICAgICB9CiAgICB9CiAgICBpZiAoIWZpbGUuZXhpc3RzKGNhY2hlZF9maWxlKSkgewogICAgICAgIHN0b3AoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIEZhaWxlZCB0byByZXRyaWV2ZTogIiwga2V5KQogICAgfQogICAgZmlsZV9leHRzIDwtIGMoInBhcnF1ZXQiLCAibmMiLCAidGlmIiwgImdwa2ciLCAic2hwIiwgImRiZiIsIAogICAgICAgICJwcmoiLCAic2h4IikKICAgIGlzX3NwYXRpYWxfZmlsZSA8LSBhbnkoZW5kc1dpdGgodG9sb3dlcihrZXkpLCBwYXN0ZTAoIi4iLCAKICAgICAgICBmaWxlX2V4dHMpKSkKICAgIGlmIChpc19zcGF0aWFsX2ZpbGUpIHsKICAgICAgICBmaWxlLmNvcHkoY2FjaGVkX2ZpbGUsIHBhdGgsIG92ZXJ3cml0ZSA9IFRSVUUpCiAgICAgICAgbWVzc2FnZSgiW3Rhcl9naXRodWJfcmVsZWFzZV0gUmV0cmlldmVkIGZpbGU6ICIsIGtleSkKICAgIH0KICAgIGVsc2UgewogICAgICAgIGlmIChmb3JtYXQgPT0gInFzIikgewogICAgICAgICAgICBvYmogPC0gcXM6OnFyZWFkKGNhY2hlZF9maWxlKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChmb3JtYXQgPT0gInJkcyIpIHsKICAgICAgICAgICAgb2JqIDwtIHJlYWRSRFMoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZvcm1hdCA9PSAicGFycXVldCIpIHsKICAgICAgICAgICAgb2JqIDwtIGFycm93OjpyZWFkX3BhcnF1ZXQoY2FjaGVkX2ZpbGUpCiAgICAgICAgfQogICAgICAgIHNhdmVSRFMob2JqLCBwYXRoKQogICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIFJldHJpZXZlZCBhbmQgZGVzZXJpYWxpemVkOiAiLCAKICAgICAgICAgICAga2V5KQogICAgfQogICAgaW52aXNpYmxlKCkKfQ&exists=ewogICAgcmVwbyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9SRVBPIikKICAgIHRhZyA8LSBTeXMuZ2V0ZW52KCJUQVJfR0hfUkVMRUFTRV9UQUciKQogICAgZm9yIChhdHRlbXB0IGluIDE6MTApIHsKICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICAgIGFzc2V0cyA8LSBwaWdneWJhY2s6OnBiX2xpc3QocmVwbyA9IHJlcG8sIHRhZyA9IHRhZykKICAgICAgICAgICAgZm91bmQgPC0gYW55KGFzc2V0cyRmaWxlX25hbWUgPT0ga2V5KQogICAgICAgICAgICBpZiAoZm91bmQpIHsKICAgICAgICAgICAgICAgIG1lc3NhZ2UoIlt0YXJfZ2l0aHViX3JlbGVhc2VdIENvbmZpcm1lZCBleGlzdHM6ICIsIAogICAgICAgICAgICAgICAgICBrZXksICIgKGF0dGVtcHQgIiwgYXR0ZW1wdCwgIikiKQogICAgICAgICAgICAgICAgcmV0dXJuKFRSVUUpCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCAxMCkgewogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgIH0KICAgICAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgaWYgKGF0dGVtcHQgPCAxMCkgewogICAgICAgICAgICAgICAgU3lzLnNsZWVwKDIpCiAgICAgICAgICAgIH0KICAgICAgICB9KQogICAgfQogICAgRkFMU0UKfQ&list=&consistent=RkFMU0U|vector|||0.05|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.| +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| From 9cf14389e9b8e1db6edfc1b9295b5362d1919589 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 16 Jan 2026 18:44:38 +0000 Subject: [PATCH 58/58] Add workflow failure log for review --- .../workflow-logs/failure-20260116-184436.log | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 .github/workflow-logs/failure-20260116-184436.log 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