From 79e1958ac617eb19640b8e617c2300aa0fdc8047 Mon Sep 17 00:00:00 2001 From: GaitlynMalone-NOAA <115589280+GaitlynMalone-NOAA@users.noreply.github.com> Date: Wed, 24 Sep 2025 09:48:23 -0400 Subject: [PATCH 1/3] Move previous closure script --- .../Closures/Closure_Reopening.R | 313 ------------------ 1 file changed, 313 deletions(-) delete mode 100644 ODM-MH-Analysis_ready/Closures/Closure_Reopening.R diff --git a/ODM-MH-Analysis_ready/Closures/Closure_Reopening.R b/ODM-MH-Analysis_ready/Closures/Closure_Reopening.R deleted file mode 100644 index b79c4c4..0000000 --- a/ODM-MH-Analysis_ready/Closures/Closure_Reopening.R +++ /dev/null @@ -1,313 +0,0 @@ -# MH Closure processing - -#Load packages #### -librarian::shelf(here, tidyverse, lubridate, dplyr, tidyr, neatRanges, splitstackshape) - -# Read in MH Data log #### -# mh_data_log <- readRDS(here("ODM-MH-Data_log", "data", "results", "MH_DL_2023Nov13.RDS")) -# -# # Select species and region #### -# spp <- 'PORGY, RED' -# region <- 'SOUTH ATLANTIC' - -# Seasonal Closures #### -# Filter dataset to seasonal closure regulations for the specified species and region -Seasonal_closures <- mh_spp_closure %>% - filter(MANAGEMENT_TYPE_USE == 'CLOSURE', MANAGEMENT_STATUS_USE == 'SEASONAL', NEVER_IMPLEMENTED == 0, REG_REMOVED == 0) - -# Create date_sequence to expand dates between EFFECTIVE_DATE and END_DATE2 -expand_seasonal <- Seasonal_closures %>% - mutate(date_sequence = map2(EFFECTIVE_DATE, END_DATE2, seq, by = "days")) %>% - unnest(date_sequence) - -# Add START_YEAR_expand and END_YEAR_expand to extract the year from the date_sequence field -expand_seasonal_year <- expand_seasonal %>% - #rowwise() %>% - mutate(START_YEAR_expand = year(date_sequence), - END_YEAR_expand = year(date_sequence)) - -# Create START_DATE_EXPAND and END_DATE_EXPAND using start/end day and month information and the expanded year -expand_seasonal_date <- expand_seasonal_year %>% - mutate(START_DATE_EXPAND = as.Date(paste(START_YEAR_expand, START_MONTH, START_DAY_USE, sep = "-")), - END_DATE_EXPAND = as.Date(paste(END_YEAR_expand, END_MONTH_USE, END_DAY_USE, sep = "-"))) - -# Remove records where date_sequence is prior to the START_DATE_EXPAND and date_sequence is after the END_DATE_EXPAND -remove_seasonal_date <- expand_seasonal_date %>% - filter(date_sequence >= START_DATE_EXPAND, - END_DATE_EXPAND >= date_sequence) - -# Create CLOSE_OPEN field to indicate that expanded records are related to Closures or Openings -add_closure_value_seasonal <- remove_seasonal_date %>% - mutate(CLOSE_OPEN = VALUE) - -# Monthly Closures #### -monthly_closures <- mh_spp_closure %>% - filter(MANAGEMENT_TYPE_USE == 'CLOSURE', MANAGEMENT_STATUS_USE == 'MONTHLY RECURRING', NEVER_IMPLEMENTED == 0, REG_REMOVED == 0) - -# Expand dates between EFFECTIVE_DATE and END_DATE2 -expand_monthly <- monthly_closures %>% - mutate(date_sequence = map2(EFFECTIVE_DATE, END_DATE2, seq, by = "days")) %>% - unnest(date_sequence) - -# Add START_YEAR_expand and END_YEAR_expand to extract the year from the date_sequence field -# Add START_MONTH_expand and END_MONTH_expand to extract the month from the date_sequence field -# Takes 20 mins to run!!!! -start <- Sys.time() -expand_monthly_year <- expand_monthly %>% - #rowwise() %>% - mutate(START_YEAR_expand = year(date_sequence), - END_YEAR_expand = year(date_sequence), - # case where the monthly recurring goes from the 15th to the 1st of the following month - START_MONTH_expand = case_when(END_DAY_USE < START_DAY_USE & day(date_sequence) < START_DAY_USE & month(date_sequence) != 1 ~ month(date_sequence) - 1, - END_DAY_USE < START_DAY_USE & day(date_sequence) < START_DAY_USE & month(date_sequence) == 1 ~ 12, - TRUE ~ month(date_sequence)), - END_MONTH_expand = case_when(END_DAY_USE < START_DAY_USE & day(date_sequence) < START_DAY_USE & month(date_sequence) != 1 ~ month(date_sequence), - END_DAY_USE < START_DAY_USE & day(date_sequence) >= START_DAY_USE & month(date_sequence) + 1 <= 12 ~ month(date_sequence) + 1, - END_DAY_USE < START_DAY_USE & day(date_sequence) >= START_DAY_USE & month(date_sequence) + 1 == 13 ~ 1, - TRUE ~ month(date_sequence))) %>% - # only include months within the start/end month range - # when monthly recurring, the start/end month range refers to the first and last month where the recurring closure applies - # i.e. start month = 2 and end month = 11 - # mean recurring closures start in Feb and end in Nov - # can't use END_MONTH_expand in filter for cases when the recurring closures spans 2 months (i.e. 15th -1st) - filter(START_MONTH_expand >= START_MONTH & - START_MONTH_expand <= END_MONTH) -Sys.time()-start - -# Create Expand_days to indicate the day of the week for the closure/reopening -expand_monthly_date <- expand_monthly_year %>% - mutate(START_DATE_EXPAND = as.Date(paste(START_YEAR_expand, START_MONTH_expand, START_DAY_USE, sep = "-")), - END_DATE_EXPAND = as.Date(paste(END_YEAR_expand, END_MONTH_expand, END_DAY_USE, sep = "-"))) - -# Remove records where date_sequence is prior to the START_DATE_EXPAND and date_sequence is after the END_DATE_EXPAND -remove_monthly_date <- expand_monthly_date %>% - filter(date_sequence >= START_DATE_EXPAND, - date_sequence <= END_DATE_EXPAND) - -# Create CLOSE_OPEN field to indicate that expanded records are related to Closures or Openings -add_closure_value_monthly <- remove_monthly_date %>% - mutate(CLOSE_OPEN = VALUE) - -# Weekly Closures #### -# Filter dataset to Weekly Recurring regulations -Weekly_closures <- mh_spp_closure %>% - filter(MANAGEMENT_TYPE_USE == 'CLOSURE', MANAGEMENT_STATUS_USE == 'WEEKLY RECURRING', NEVER_IMPLEMENTED == 0, REG_REMOVED == 0) - -# Expand dates between EFFECTIVE_DATE and END_DATE2 -expand_weekly <- Weekly_closures %>% - mutate(date_sequence = map2(EFFECTIVE_DATE, END_DATE2, seq, by = "days")) %>% - unnest(date_sequence) - -# Add START_YEAR_expand and END_YEAR_expand to extract the year from the date_sequence field -expand_weekly_year <- expand_weekly %>% - #rowwise() %>% - mutate(START_YEAR_expand = year(date_sequence), - END_YEAR_expand = year(date_sequence)) - -# Create Expand_day_of_week to indicate the day of the week for the closure/reopening -expand_weekly_day_of_week <- expand_weekly_year %>% - mutate(Expand_day_of_week = wday(date_sequence, label = TRUE)) - -# Create START_DAY_OF_WEEK_EXPAND and END_DAY_OF_WEEK_EXPAND to format the days of the week to align with Expand_day_of_week -expand_weekly_day_format <- expand_weekly_day_of_week %>% - mutate(START_DAY_OF_WEEK_EXPAND = case_when( - START_DAY_OF_WEEK_USE == "MONDAY" ~ "Mon", - START_DAY_OF_WEEK_USE == "TUESDAY" ~ "Tue", - START_DAY_OF_WEEK_USE == "WEDNESDAY" ~ "Wed", - START_DAY_OF_WEEK_USE == "THURSDAY" ~ "Thu", - START_DAY_OF_WEEK_USE == "FRIDAY" ~ "Fri", - START_DAY_OF_WEEK_USE == "SATURDAY" ~ "Sat", - START_DAY_OF_WEEK_USE == "SUNDAY" ~ "Sun", - TRUE ~ START_DAY_OF_WEEK_USE), - END_DAY_OF_WEEK_EXPAND = case_when( - END_DAY_OF_WEEK_USE == "MONDAY" ~ "Mon", - END_DAY_OF_WEEK_USE == "TUESDAY" ~ "Tue", - END_DAY_OF_WEEK_USE == "WEDNESDAY" ~ "Wed", - END_DAY_OF_WEEK_USE == "THURSDAY" ~ "Thu", - END_DAY_OF_WEEK_USE == "FRIDAY" ~ "Fri", - END_DAY_OF_WEEK_USE == "SATURDAY" ~ "Sat", - END_DAY_OF_WEEK_USE == "SUNDAY" ~ "Sun", - TRUE ~ END_DAY_OF_WEEK_USE)) - -# Keep any records where Expand_day_of_week is between START_DAY_OF_WEEK_EXPAND and END_DAY_OF_WEEK_EXPAND -expand_weekly_day_keep <- expand_weekly_day_format %>% - filter(Expand_day_of_week >= START_DAY_OF_WEEK_EXPAND | - Expand_day_of_week <= END_DAY_OF_WEEK_EXPAND) - -# Create CLOSE_OPEN field to indicate that expanded records are related to Closures or Openings -add_closure_value_weekly <- expand_weekly_day_keep %>% - mutate(CLOSE_OPEN = VALUE) - -# One Time Closures #### -# Filter dataset to One Time regulations -One_closures <- mh_spp_closure %>% - filter(MANAGEMENT_TYPE_USE == 'CLOSURE', MANAGEMENT_STATUS_USE == 'ONCE', NEVER_IMPLEMENTED == 0, REG_REMOVED == 0) - -# Expand dates between EFFECTIVE_DATE and END_DATE2 -expand_one <- One_closures %>% - filter(END_DATE2 >= START_DATE2) %>% - mutate(date_sequence = map2(START_DATE2, END_DATE2, seq, by = "1 day")) %>% - unnest(date_sequence) - -# Create CLOSE_OPEN field to indicate that expanded records are related to Closures or Openings -add_closure_value_one <- expand_one %>% - mutate(CLOSE_OPEN = VALUE) - -# Join in Wide Form -# First clean up duplicates -# Then limit variables and rename -# Then create final OPEN/CLOSED field based on all closure events -# Takes an 1.5 hours to run if use rowwise!!! -# Instead remove rowwise and pmax for faster runtime -Sys.time() -closure_all <- add_closure_value_one %>% - select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence, - CLUSTER, REGULATION_ID, FR_CITATION, CLOSE_OPEN) %>% - arrange(date_sequence, desc(FR_CITATION)) %>% - group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence) %>% - # Retain only most recent FR if there are 2 records with the same date_sequence - slice(1) %>% - rename(CLUSTER_one = "CLUSTER", - REGULATION_ID_one = "REGULATION_ID", - FR_CITATION_one = "FR_CITATION", - CLOSE_OPEN_one = "CLOSE_OPEN") %>% - full_join(add_closure_value_weekly %>% - select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence, - CLUSTER, REGULATION_ID, FR_CITATION, CLOSE_OPEN) %>% - arrange(date_sequence, desc(FR_CITATION)) %>% - group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence) %>% - # Retain only most recent FR if there are 2 records with the same date_sequence - slice(1) %>% - rename(CLUSTER_weekly = "CLUSTER", - REGULATION_ID_weekly = "REGULATION_ID", - FR_CITATION_weekly = "FR_CITATION", - CLOSE_OPEN_weekly = "CLOSE_OPEN"), - by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence)) %>% - full_join(add_closure_value_seasonal %>% - select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence, - CLUSTER, REGULATION_ID, FR_CITATION, CLOSE_OPEN) %>% - arrange(date_sequence, desc(FR_CITATION)) %>% - group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence) %>% - # Retain only most recent FR if there are 2 records with the same date_sequence - slice(1) %>% - rename(CLUSTER_seasonal = "CLUSTER", - REGULATION_ID_seasonal = "REGULATION_ID", - FR_CITATION_seasonal = "FR_CITATION", - CLOSE_OPEN_seasonal = "CLOSE_OPEN"), - by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence)) %>% - full_join(add_closure_value_monthly %>% - select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence, - CLUSTER, REGULATION_ID, FR_CITATION, CLOSE_OPEN) %>% - arrange(date_sequence, desc(FR_CITATION)) %>% - group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence) %>% - # Retain only most recent FR if there are 2 records with the same date_sequence - slice(1) %>% - rename(CLUSTER_monthly = "CLUSTER", - REGULATION_ID_monthly = "REGULATION_ID", - FR_CITATION_monthly = "FR_CITATION", - CLOSE_OPEN_monthly = "CLOSE_OPEN"), - by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence)) %>% - # create final OPEN_CLOSE field - ungroup() %>% - #rowwise() %>% - mutate(final_FR = pmax(FR_CITATION_one, FR_CITATION_seasonal, FR_CITATION_weekly, FR_CITATION_monthly, na.rm = T)) %>% - mutate(final_CLOSE_OPEN = case_when(final_FR == FR_CITATION_one ~ CLOSE_OPEN_one, - final_FR == FR_CITATION_weekly ~ CLOSE_OPEN_weekly, - final_FR == FR_CITATION_seasonal ~ CLOSE_OPEN_seasonal, - final_FR == FR_CITATION_monthly ~ CLOSE_OPEN_monthly)) -Sys.time() - -# Chck -chk <- closure_all %>% - mutate(YEAR = (year(date_sequence))) %>% - group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR, final_FR, final_CLOSE_OPEN) %>% - summarize(ndays = n()) - -######################################################### -# Join in Long Form -# Join Closure Types Together #### -# Combine closure data frames -Combined_closures <- bind_rows(add_closure_value_seasonal, add_closure_value_weekly, add_closure_value_one) - -# Sort the data frame by date_sequence -sort_closures <- Combined_closures %>% - arrange(date_sequence) - -# Create Multi_expand to indicate whether records have the same date_sequence -sort_closures_multi <- sort_closures %>% - group_by(date_sequence) %>% - mutate(Multi_expand = ifelse(n() > 1, 1, 0)) %>% - ungroup() - -# Keep information from newest FR -closures_remove_multi <- sort_closures_multi %>% - arrange(date_sequence, desc(FR_CITATION)) %>% - group_by(ZONE_USE, date_sequence) %>% - slice(1) %>% - ungroup() - -# Remove extra processing fields from dataset -closures_remove_fields <- closures_remove_multi %>% - select(-START_YEAR_expand, -END_YEAR_expand, -START_DATE_EXPAND, -END_DATE_EXPAND, - -START_DAY_OF_WEEK_EXPAND, -END_DAY_OF_WEEK_EXPAND, -Multi_expand) - -# Create EFFECTIVE_YEAR field to indicate the effective year of the closure -closures_effective_year <- closures_remove_fields %>% - mutate(EFFECTIVE_YEAR = year(date_sequence)) - -# Create EFFECTIVE_MONTH field to indicate the effective month of the closure -closures_effective_month <- closures_effective_year %>% - mutate(EFFECTIVE_MONTH = month(date_sequence)) - -# Create data frame with only REGION, ZONE_USE, date_sequence, CLOSE_OPEN, EFFECTIVE_YEAR, and EFFECTIVE_MONTH -select_closures <- closures_effective_month %>% - select(REGION, ZONE_USE, date_sequence, CLOSE_OPEN, EFFECTIVE_YEAR, EFFECTIVE_MONTH) - -# Fill in missing date_sequence dates -# Create a data frame with all dates for the specified EFFECTIVE_YEAR -all_dates <- select_closures %>% - group_by(REGION, ZONE_USE, EFFECTIVE_YEAR) %>% - summarize(start_date = as.Date(paste(EFFECTIVE_YEAR, "01-01", sep = "-")), - end_date = as.Date(paste(EFFECTIVE_YEAR, "12-31", sep = "-"))) %>% - rowwise() %>% - mutate(date_sequence = list(seq.Date(start_date, end_date, by = "1 day"))) %>% - ungroup() %>% - select(-start_date, -end_date) - -# Expand the date_sequence list into separate rows -# LOSE ZONES HERE!!! -all_dates_expand <- all_dates %>% - rowwise() %>% - mutate(date_sequence = list(unlist(date_sequence))) %>% - unnest(date_sequence) - -# Merge the expanded data frame with the original select_closures data frame -merged_dates <- all_dates %>% - left_join(select_closures, by = c("REGION", "ZONE_USE", "EFFECTIVE_YEAR", "date_sequence")) - -# Remove any duplicated dates -duplicated_data <- merged_dates %>% - group_by(REGION, ZONE_USE, date_sequence) %>% - summarize(CLOSE_OPEN = ifelse(all(is.na(CLOSE_OPEN)), "OPEN", first(na.omit(CLOSE_OPEN)))) %>% - ungroup() - -# Extract EFFECTIVE_YEAR from date_sequence -effective_year <- duplicated_data %>% - mutate(EFFECTIVE_YEAR1 = year(date_sequence)) - -# Extract EFFECTIVE_MONTH1 from date_sequence -effective_month <- effective_year %>% - mutate(EFFECTIVE_MONTH1 = month(date_sequence)) - -# Create MONTH_TOTAL field to indicate how many days the fishery was closed for each month -month_total <- effective_month %>% - group_by(REGION, ZONE_USE, EFFECTIVE_YEAR1, EFFECTIVE_MONTH1) %>% - summarise(MONTH_TOTAL = sum(CLOSE_OPEN == "CLOSE", na.rm = TRUE)) - -# Create SEASON field to indicate if the fishery is opened or closed for the EFFECTIVE_MONTH1 of the EFFECTIVE_YEAR1 -# The fishery is considered closed if more than 15 days within a month are closed -final_closure <- month_total %>% - group_by(EFFECTIVE_YEAR1, EFFECTIVE_MONTH1) %>% - mutate(SEASON = ifelse(MONTH_TOTAL > 15, "CLOSED", "OPEN")) %>% - slice(1) %>% - ungroup() From 110b635b304a2b709b78de65bd6c0331c430b585 Mon Sep 17 00:00:00 2001 From: GaitlynMalone-NOAA <115589280+GaitlynMalone-NOAA@users.noreply.github.com> Date: Wed, 24 Sep 2025 09:48:54 -0400 Subject: [PATCH 2/3] Update notes for closure script and tables script. Update file structure --- .../Closure_SNAPPER, RED2025Sep22.RDS | Bin 0 -> 1212 bytes .../Closure_SNAPPER, RED22025Sep22.RDS | Bin 0 -> 2173 bytes .../Closure_gmgraytrigger2025Feb05.RDS | Bin 0 -> 2957 bytes .../Closure_hogfishgulf2025May08.RDS | Bin 0 -> 1762 bytes .../Closure_hogfishgulf2025May29.RDS | Bin 0 -> 1728 bytes .../Closure_hogfishgulf22025May12.RDS | Bin 0 -> 3784 bytes ...Closure_hogfishsouthatlantic22025May12.RDS | Bin 0 -> 1864 bytes .../Closure_kingmackerelgulf2025May29.RDS | Bin 0 -> 1728 bytes .../Closure_kingmackerelgulf22025May29.RDS | Bin 0 -> 4701 bytes .../Closure_saredsnapper2025Jan27.RDS | Bin 0 -> 2141 bytes .../Closure_outputs/open_by_year2025May08.RDS | Bin 0 -> 1762 bytes .../Closures/Fishing_season.R | 121 -------------- .../Closures/Main_closure_prep.R | 155 ++++++++++-------- .../Closures/SATL_Red_Porgy_closure_example.R | 104 ------------ 14 files changed, 88 insertions(+), 292 deletions(-) create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_SNAPPER, RED2025Sep22.RDS create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_SNAPPER, RED22025Sep22.RDS create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_gmgraytrigger2025Feb05.RDS create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_hogfishgulf2025May08.RDS create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_hogfishgulf2025May29.RDS create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_hogfishgulf22025May12.RDS create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_hogfishsouthatlantic22025May12.RDS create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_kingmackerelgulf2025May29.RDS create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_kingmackerelgulf22025May29.RDS create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_saredsnapper2025Jan27.RDS create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_outputs/open_by_year2025May08.RDS delete mode 100644 ODM-MH-Analysis_ready/Closures/Fishing_season.R delete mode 100644 ODM-MH-Analysis_ready/Closures/SATL_Red_Porgy_closure_example.R diff --git a/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_SNAPPER, RED2025Sep22.RDS b/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_SNAPPER, RED2025Sep22.RDS new file mode 100644 index 0000000000000000000000000000000000000000..3170ffd6447d1ab980f103e8dcf9f75ff413c88b GIT binary patch literal 1212 zcmci2X)v1!0LF1kSFluPD7p-`rPLOkMn_zss4i(->#8eE*HLjNVOmE<>!>5Fm#qq^ zsZ@g)Eyas!i?pt&qeQ9_N9CwZlkPYo5n|2mm;JE&b$|2BJYW7sr78-4Q5KSXQuMFr z71<*10L{oeLzg==*1e|3j}n@1D~wm|yov05cs-Wc9Tw>2RyF)Xb!)NYOxjqU66Cl6 zEY-yV0#`K3uNXADdCKgo>zA$>uba<18Y+R6$*n2qa>Qu)Vbc4$(#H6UL}LBDvlKU5 zqDUK!U@E=PR)($#cFc*AGsKcuH@qomPcK6y+-9n_EC2&B`$+CW!0bhfOj2VLwlX2i zq+|0*Ev)qaAX5~r9un-V(dP@(m6Y!eMP1NS|JTbXTwLY5@*vKRiUqEZe9g7h{_AGq z-VaTqkiXkBA$Hp`YQpSG89;(w6%H3YP(ot1sKpO0=(Nx407Q$>WgOA6JC$7cPZ{TaYScLH>$p$Wm7HoSYQ2H{bl~UH-)z> z+1_1&km;?h4(b4V3VRqs$kVj}Oj`UX-lV<5`IUD|;2sY1C1$qTZZi5f<^j!s=g6<; zLHXMWrow{u9s<5-d~o1`sKbDMv;yw(1eD!foYeX(*-%IHTCow{>sq^ssd?)EBzs^0 z7M}b--*YdrJ=E$F9l4%8r`?X$9D%`LluvEy4n=&w{!1qXlg;yeI||h}_)JI^6R-KL zu5M-{p_7Mu`1oibf7^(g%-)x*!tR3mR1qv$19)CtBWVDGm=v`&`b026G@3iFRb1-FE&4Ru4Nj zdn#ZJ{;O3)KX#)$1+=d?F+{$*GKM_#+2i)9Y4YyND%QEF#m6HOzMwH9s80mVBbX~sXERs!&U$KNv8#}F?sKCYY zeoiyX@M;o1a);Y-Tu?S;?K0k1iGa3NA2BByxUjUtTp`xm6IwLl6x4VKs0E}54 z1q8#+mDj`&rtBw)m_&0F9$16?YO4kh@@%}#_XH1eU<;D;-O5>xWzUAJ4wd-T17g1VYwSkJ)g5ry5pqY;$g_f0`8HWK`RpaRnyKwg6hyGwuu-pb=Z2;l&Hwu3O2ikvB literal 0 HcmV?d00001 diff --git a/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_SNAPPER, RED22025Sep22.RDS b/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_SNAPPER, RED22025Sep22.RDS new file mode 100644 index 0000000000000000000000000000000000000000..ad7f4377df238c3fc18e3e5ef136d59b346f5cec GIT binary patch literal 2173 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 literal 0 HcmV?d00001 diff --git a/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_hogfishgulf2025May29.RDS b/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_hogfishgulf2025May29.RDS new file mode 100644 index 0000000000000000000000000000000000000000..e49b58b6647660a0c2fe6b8d0a424e79e412fa67 GIT binary patch literal 1728 zcmc&yc_0%C7_XP2sF)7Dr8%adB{{O1CM)IG(9p;nQRL3C7Luou=13^lP%m<9nR4V9 z)-hLuP7BOnV)!0n1)ANi69#|l&5&#AtXn#Hl(FW^1&oIh;T z{(s=>)H^F#TJk?y+~G&b-{*@+^t096wka0*`@fU@8Z%2z!uKb5-OqBsHz=Kv`wtnh zNGl7Pi627Ygo0fmDoamUG)0T)jUk`d+xFzlnNy}@inbw{jQ3RKJoSCYn!823zft|Z z0n$?I@jc8cg_U*n4N8IKGqB`!LC&sqz}6U(RL95?j}GpL(2EcPW!98&Tos?|-BZbI~Sp zpgT`kS+t`0+y-^>XLEGM=Wjo%e*iR%7nII?zZdKZi}H4JF>-?xq*`j1bnG)aaJ~3@ zxk^Fwpp`(ER6BFk*ln0qdcCh+cc+1NIN7z$>b3b>DZa55rocQ!%`Co07n1~y|B_mM zu8J9{g^b_!V_8qoqzWDsOh{hcfli$&#s;xhw~!? z>7EM4*B2{4_H2+<_}tpxmem0*$=(8WxBck3F#se$!OIrNdhDo zGjfm74d}G0*W_OymRZ^ZIQOntjBF?Nfg2(GI>uJ;GJpd31U?A>0_=zh0F(3@HGUzZ z6HK+JhXfxV!2;+htb2>4j5q*2ZLxs?0*f{I5F*|3Td88Li^d_15ZdKO`PJO_B9K6= zEZ~6pMk`sJ<+FX^L{WnT$KiMj2trW}H-lClh-LCGC4YOI$Kvr>WhTW7C4N!DH@sdt z2QTM4JUVaOGxTX@Vj2G{*E8x#vfvqliES3tM!4wea0!u7uKYSdGf!FE29}v7t*~9iB6yD*yFp_2 z^^+BR4!$q9W}-b}55A1c&fmjMJMcUK5f_EqTHI;M>fQ|5qONdhdJk+ zJvg5$^ed}zl6(~ol3MzDW~07UgUK@@eI>aKt1qpK1E#esxV4NWu^_Wlc5T&c6`egu z(q?lJ&OxnTa9sEcbp6nBe8)Ic3qcj+^j5uRlpEq-Gn^}m04^3u!^n5w{tmlKAwKQE zR}_j{*#S~y^{fy&H+G|wUVj!kj}nL0XGtRF$2jc`k@Hgn(-F@gicLq15KhjG;WSp+ eRf^-t+uo#JN;POKX`xgimS$#zbIg|4uK5#}vPXab literal 0 HcmV?d00001 diff --git a/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_hogfishgulf22025May12.RDS b/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_hogfishgulf22025May12.RDS new file mode 100644 index 0000000000000000000000000000000000000000..af55239f665cd3f96ba0040bd3aca8a6e0505d7f GIT binary patch literal 3784 zcmdUuc~Fzr7QowDrMQ%eC@N~ISRw^MR6tphDk4Tg5HKKn1rdU>6i8Sk$y1=nq9}_j zF>JC(g78=Zg%F|=il8JQgvk1#Y=MXoLV&E_v$oUsI`0o>-n@A;?>E1>bLO6V=bpK9 z4kYEP&pxtlp6q^g7k5Vo^wstKSaqudB_2;dD^<;o|K^O=0gW`?ggAMW%zdGsRP@Eh zy_0(r4j7#)M6VQ`%v^kIrRP9fOL3;eyLD~2dGp&aW*$qk(Bj)*Mvrq)LVQ5V_gVRa zLU*V+%LsQ>Sh-^QvJ;F2LkRxN@GuLy`CujQMU6hSGcY*sqH*_8&nuUW-g-25MQuR# z__$I1jF}i?_c}Y!4ZxbuvynY$Wt*5DRNZHw;R#>53eQ-)3I#4EdRBRQY}2m`d9gZ+ z9Akg!>Z_9aWcz=vk)N+e?4^ysrk3J@u(*KCn`bra$PVzCDx_ ze}_G)RAzO+m=TexW$-^DcyV+Nu*H^6&~KBwVovl%1_9k>MZ*^p^G9DdCvbJ%&l_+! zBa>4>h8eWDlRBiepC;&NeP@wvcCaEs@J@Zr`cGn3`Vf8Ee3)@)DGWF8yu2#rJpY1!t3BgXC~zZN|AM^S5DBzLUE4%!1k@0!i-Ii6^#ChHu)Z6^e_vF?@HA5^lA9yUh;l(x&Oc zPhQH`qges25=cha}f2?c$?vI-t_FH{jc+q%yFiwjpt@{%1N1m&WOY5 z?^n(?!sv*>w(WhqoUPZGCy^HSqEH{2pAv&kiaWv}53c>tVUbNJm35~rwZid+BrLwk zYTJ)KKB%hP_?4`GseizgS37MDTzh}T<`BL?e3}Imb^8$rMY771*Qa2=VmDz&>ROEnpxR=N_?0*MRBR9a%4Eu z>}XarTVtx*xlL%^LxPjogiE6=h({j|X*ms`>&FIY1Mo(Ef1qPk2F*()BG6b@_D zJMVtp9c}O8XKC$f?=aw0?=_GiFaihBsNSkPd!nK{t*1_jHk$R2xKY z`Q}p~PufkG_nDSg41=Gvp>mQom*w-2`bh3|qbY8!& z^^)5X&CH+F@T@-EuFlS!Q@;Ue4%G9n;0%t=>y>$48dC4uM#9x#vU6}1m|mA^edC~9 zOg5=uq+So{esL(P%-XxX_GNu_-m-C@b1sgC;pHr2`--bCH=$-Mt!4=ORIa#qcci*$ z9{Sn0g;opgApRY<>reV7#%YRGwSnN+MEN>z$x{rqn8&0_3+9gHhnNRt$`4H7FUzNE zriKkt+x=6+2o^+VeHbybgZX2oJlRoyK%Uq^XmOCF_()b`Iz%Zx3zSz;n55z02CCxL zqv90?bqIa~6`GHS8p%*J;+N!c`KEz>nAf941|*r_TOvV)?yeL}_Sam1Bnl=MAO(U+ z*7RVcdY$mR%%(?`9df{~dm{B7GtxH*QXqYp_R;Fi0{TG$;prUdofwKIRvLas-81d9 zJA`01DCU}Rq`Tn2ft4+;9O;X?{4FF-_PPE*_mv1_t>!KO$jRtapg*J6>dP%tjw9F)GZ_4x>Df=V%pCuh%Qupz+p(^!?_05Qh$!Y&Dp0p z`MzjDdX881%&1l$5uxk}u~q~259)e11z8cT5j#Ns z@K#eR19Lp&U3(6M1kLSY^`2=oML$+y>vx!JPP@K>38LsAtls(eyqTN3|#w=`T z(`ua52mgM}LgG+@R*a*($e!g7RMZN)%+RuT60AD&(0-{8iNB3;h8fYoAFw&)t-P?5 zHEi98@f_CdTph*&Z&!<0=Hj0s3Hy{)0HVbm63J(~n zR(YLGyv?FF3gkkb#4saD2*E1hT#3vKbXA8$SnX*s>Cb5}?BDl4@&Cqs) zc#92o>?A%EapvU2Mym z(sN0*HKX_jOtHkYeFJHs-q*1F(ROODS@_y{wtaNd{cNVOaB{>w<+{6WXJp?F!|L8j zQj5HI@c4DodQ0$tfAG1hVCvw=ycwbNwifwnO?pl=uk6~p(PJL3hw@cSTyAtTEJ-nX Xeq+%qLji+Iwf$!owktP&`Pn}J9)K#$ literal 0 HcmV?d00001 diff --git a/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_hogfishsouthatlantic22025May12.RDS b/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_hogfishsouthatlantic22025May12.RDS new file mode 100644 index 0000000000000000000000000000000000000000..26c9d03510fadab5e09dc6d68ffb3efa3e0a9687 GIT binary patch literal 1864 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 literal 0 HcmV?d00001 diff --git a/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_kingmackerelgulf22025May29.RDS b/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_kingmackerelgulf22025May29.RDS new file mode 100644 index 0000000000000000000000000000000000000000..2ef23283d1983339cd60a46e87899eb96a78f5d2 GIT binary patch literal 4701 zcmdUwSu`7JzsC3e+O0Kzt)YanTP;;ZTQ!q>YHH1jnrW&iikd}8wwhXs4u&d0sd=iZ zsYJFhr7B7Zf|N8uLJ~s|nU3AF&&4_GT%3#V=KR)wJ?mM|`&_;2{jXO(;oCqY zJoK1?45{DX!(HjU@=Q_ZPre(==d`YP5As{jwnnOkx&{ow?#TQj??JiFz|2q{BAZ{M zP+8;VB-_aUwFsw-YNcP?7C=@`VhVtX>g+SP7qY7$tG=VxE8!o&dgFQ00?4}UqE_1T zM(4KM6I0}N4Kzjm_zRG7)=Cr8=%9Jw?JY@3(nhBOfoj zm1B$ruNG~kYH#cdYocI{Rhi*Jo~6Y5PR%DapqGJ`?dQT_K=;wseaPDz&(E5si!0yy ze_?D?YDi!9x+@pLnGd10L>myvUs8!`74xCD@861z*fcY>x9zT<>DjKcU#U$t?f1a{ zUaI(IxT(FBj*7;)7oBPy{o@%cj$^jx-LB5YUm+=l!xWw9?qVqq%BJ@8oqx;pxa+Hx z-=lbSrupQd84P$?bhEe0z{+ za-MuG^JAcay)$#F`t+;^*w^%WY@b*$Jz2?MiQo38&6EX}sGj_9(a%%R+7dd-G1f1( z>|}1W$@z=+Pb?hEY;e`unaY8T(xbKpn*$MiklVahLt=mVpVC6sZL`HWagPt4FqaJ* z_@9Cv4(op4TibH}a%=n1#x<+EkXnL`)vL?kzGQx}$|skjBsHYr)@SoWf+M`s@B9@i z9-dAO=BV$d#JBl;$UpmcSJ8@a)lTw-{3c^N`h=p3BZENo~f?r-P(YepUFNa z_d;h>tk$vSR)s|_`C2usy5-ep){|~bMr^HPRT-ckMew#%(Zugen%$V@=rkbiEnUrE3vHMO7! zg%e>e8sJ%fzpJOKG$qx5|CL}6nf=fhM}kA<=eP+elZV*f%DeQL15hvGbGD4_%%vjL zBBdhrZjb#dOG?T7ON>6#zQMkVKKJC$$tWc&0rwP@6lrkPyWc%j+3D{rJB&K)J8pJ3 z&8V;|>H2*y==Mu{DIjs6BHLk!(1$unJ;_BF4LP}-yxPd;qt_@V2UpN3f9P;DM8ame zyOo#Bps0^rwZ)T( z_M7F6q`O!Du@Dw^C6E)-JPosJN~rJ(lgs||0;e+zU7oc#h(7yndVji(Cx+xre-sUD z5LKIYLwjB_`A$C0wm2Hiul@8y5K<%~&U5ANH=u(cCQAOI>GyJkib3)^ zcvc$wQ})kkI2wV|q)qCPwG1{3o~WxVd|xmg`wF@JLYNR1cM?@?{BhM`%E zwH0l4SibS5^l`wo`{SiXNqoY8n;}PS1KNuv-qo=rG}BN`XyiAe01*oZJ2iok`qEL6 zkwK#ZnVga2y7)Gx@gm*1+iAsvST3+wVdVPHob00&Tdt(fkG8&+dYs4^@h^reU2x_j z5{zo%cOhWAMv)OGqnk&GuS-2-a%}kyyQ`E(TWh897cb;uOyG(aN`yy9kG7bljzD?j zxeMAyiGoJ1fE<~ma0j~(5ewq>L^~fbCMn$A?qbPH?p?bc@f=*zEoS#l{uE8{+uo*u zRM(~EMsvq+{7;kXKD9)CGs--iis+%*nVl$(u20r?T+pQEF>ikG;>Zi|9bccJceUbkrDKVW_GrDAH>?>}V(p zOnX@!hJW_BqnLh%(cfr0qR?p(9b@=zuQj2ErlzlF9*W!5BY38f#r+3jA3#5sB4{B7 ztau!W2V``$-Wvys?)FS@^p^FI=@CIQ#q(-hzqI!4*+wV>fNrYclrGOQ)T`L?UV-C1 zuy>TPelo4iaH$(Aq1|ARZ@I_7_UUC%;{x_lPEhVcB4Mq|U6e?*vt#MUdt3mB(DsAy z$4zt2NXZa<5MdqQiAQSAw^6DKQ3(GKV01BLsY78qioL!qtt&Ui*#4O1DcaPIRZolB zWfaN8bh1Gwp8J2>o)3f&yL{?;YhXw*UnS6%!p{jBV1M*T7~KlmVfz3<22I07C0vTF z5bsA9U&%pjFA}7^{}e({WY$MwC?r4FfjOV|erS^VYwh$G#LNotde_hgmY3E>!odNV zquLiE48M~dAisWP!`PWWijxn!GnbZ&25%2N*!pBE1mF2}64*BWAzN5_-5G|aUEUy! zY!85B3_2I-NAh3o{yFrvmqP^0I&zcnTI|w;E0N_(X|VhIZ}3vwZ{dU(GJiiv7riRw ztRcq$IIq+NV4)tiB32LBTw^mVyk2~WP@Gh8xp=2fXSMV+C?ihJ#z*<7Iusl~ICx8n z_odevd6`=#KIE;pucH1G6-~!`UP{>n86F$t*-Cw(BNDCE^7?czz1cdk1xfM|c6&|| zr*!X=HbsspLA(yvWV8!hR1ay7$@n^(u(qa>vg|(sWQ=0Jl{5%Xs}n)XOqLkKp~=>Z z-FVPByPt1KMk{;rZWFh?M+oXxUGVlfUUm1V%(r1N=UP+?@*%Ipfz|nV)8!ny{uH2u zD_6xUJPc7m&Ej&|IMuxCgos-lATuPkn@=)NxH0OTWi*t>abbHME6EFi>&jv}L(BJ# zN4CeIfV5z~Y$1Tbfj?h1=QaThOH+b)fbbD_6Cd8-#G5cZ-cStBI(8eEM31x0i$6i) z?&WPs(+o6^8E9f#tHa3d57rZutYx8~-2nXRa=X>t<61?xUNa8)U!eWy$ysXyR_ zTdtB+TjYU!D-1=q?c1a}2qv$99+}eIL1I1k*QXdpSm;fbe-yIAQ3p?-O0Z!KgPG2I zNVF;d8kN8-8)u^taSt=4`pvy?o)o9^vkQxugh->#Z9G^UuUb zxX;$zEkx4Ww|8He&T2Mg-RGoJSik)+hyCYdzQS7un`wLEF(p(cIvy75)xs>6ObDAe zuwKBmLsu+aF3rx*Ew~SJIb<;9C4gNOCqy;$rAv!xFza8yVQ+d%$n9|NSoHS{iclV- z(gZ)H*a_r3N7Aybp}g=ni%)gw>Xiw0Si{I%JNUKkogko-ob1`J(HN-F*e|sghFINK5b3N9PHRtd&y$bbKa~|LJ9KiLf zenu_Rn{>Jj=ijsIM0kQ}yo!F_$kN7A9&uyoHeP{2Du| ze`Y&GN-1dZaE}5`>lri{*Gsq9t_^N#(60HR=1DZ>uZ-=_eDF%+i7kUAAi{;oVv1*eau}Q$b;fNghcy65TKN-t7aS+*lIF<6;q9XHi!qJ=XD1$M=hX z_f98t^G&;5O8dG9PY1oj-qn4&%k7@o6a&#yV{UWDwXdmZ$G+jpBUHbE&3SkI4Y(eJ zuQgondRR~CzFxi5{`0xe0=AiKo7tC1&}E%PNL-(s8P*NkXvo@UBv@9nnrXs5G*&|Z zjrAyi2A%xQMQO2rJ#8jG9+&WYD7{p~Ty$5LO9j_ulH}Uv_74qmk+?+ZOlz2;bfq@zP)Zf*LeGWNKC+70_TT>_muV3o3!J9^!SRps?IUMKG&^;xM;@lYooJ~# z3YhWC={^=^DDsi@WV&K9t^T^cXkA);U)nup*$`>+ePQfql%h z-rL)*f^x55FtTl4c92QG9&Iu+@YCWsmMM~=)vz#Le%oRERunarx=59YYl{Ny{1K6* z?~lt1oqwnMUB$mM_a#A4g+GDb3k{k-;;mBa@vs;h2N zUH8b@#!a}gSRF02;pn0OMB$#h!0f#A=y~Sy)`@%D08nlVWF9dhUI)T&PX)V2KWOml jc*AnX1^Yll_u9M)SB?~_;Nuuv-jT|x&Z0*rj{Nc;tM|*j literal 0 HcmV?d00001 diff --git a/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_saredsnapper2025Jan27.RDS b/ODM-MH-Analysis_ready/Closures/Closure_outputs/Closure_saredsnapper2025Jan27.RDS new file mode 100644 index 0000000000000000000000000000000000000000..9b3f953a5d1e22a9562f48c8cb797df53f905cd1 GIT binary patch literal 2141 zcmcJOdo&XcAI3wX6g8JzYP4KJ2vIVmRW7;Zn(JIbiiSnGO&4VdGhsx2SZ*7BuF+x& z&2`Fcgt^R&Foc+Fd;4|Xf8KN6_s{oxol6`1{HIVt%mHzc=zJABEx_5Te_d?$S#Ga;|FuGH&2{9`o=WI4pV2v-L5L%u6+; zUO@$)oXXCO#1=kfEb7Xkvg~vfSw#h$&cWfK+4B3fMq&jRuQD%ZO$Yver?k)3S`0c9 zN&yrxcVHv6COX~unDrU5FO*8rSv+VkR$IQ54B4PjEXq)fQ|vE7NIs$4d0T7m0gbHU8JCZ%I-|7_~E;1 zKNA&9k}>a36-xVEtxtYsc=TCzb+6xrHkjar@;MaRhK})C_I!btQG`Ph11{!oKjzmz zMCk4-78|s+eU=}2N9&1V6W7?ss}o6b(8eljUJRZF^OcO+LzXKtDx@y`Qwlwg@eZzX z;|3c(!#{=hs)K=&IgVo zdo&@b?dRQ}tC_*uiltL_j9hZh1>T$Xa2dA;jNrqPZlMxc+G}n1PB{GTE3DX_y*hK|<$#}rnfO}ea!y5!Dv-fPnr7K{MeOg- zO202ZY4JW|^T>c)0Oq{8^l3}fH>?g8mc~3)p)|QVaA2TKbjVL6W(s1R)__9H4Gj7W z^@BIzA_hwZtQJ|CJNN5@I<^$faK$hs3_AI}zTabM$wQ-xMIbF10(WJbVu>Hf=ZFb? zA~dN8FfGW)ot9Hc+i$i(XXV0ZdCQzHWa|~|gbd(Na$I>oD)MXVs&9()BM{Bn!Wp** zWMf{SSGSbMtIAx~_7KwZIw|{jc=rn)mAm}-5BNdk%#scmhP=)-X?4hNGv`r#PUdmW zUg~aIVj?DDUbYKU`mf5K?rU3WZ0j4urOu3aH*!edXPyWEA6bk*_AGbaEb=%Cqk)pp zg7J6~Oskio)(O*Hj0HY-IT`4r?816qC7mVv)ZairtY;U9F(6 zHwTGPZcZ5Q%549VNMnkG2Ek5#>9uA0d&ukPWd+Cufeg%9qPhKUpl0I;7YYIqada7K z6~f<9k6jJfVk1t_L&Bj}s6_U$C9YQ4s6aJmWiBaZL4E~9d|elh+vcoYwEMJ??R!O; zh@Q<5ONzlOs$UC9wz;eHb6smuyc;UsO?o{^0a4Wn#Em$##?J_mj=HJl*pQPoE#B-q z&0vPc{OQlCpY5J-NCQNuhd*YjeV!5qph*RQV+34D!!3;MMJdXIlO^e766;4a`Q3W4 zkgH-nu|+`b4kJGtZNCt$e(WezeMo0WSI3O+-G*P^r{JL4jpeA#IqzA+)w&fss&kaW zB82%cx`*ca>(NBhi%liwlwljKQZALip+_<g1~tes^Fv*8$0I3Q|etX_wVG8GbudBqw16>hXps7%lxnRRfGTd@iD%g=6c zb$@giK0s3yxxxV#och_$DrrBWi{lFuhO98+TZ_3gjvknce&D2{=Ofn9N`E zId`vWx5p-A6MMc0_#bz<+o{`YOa`es>$RVqC{rnxG^q#N@Pk!FmaKnCYa2T@LIJ`6 z#&+-^pIXUz>a(rN#j|(74+5JpXm}X75; WR8CPkcSAE*VmBu7C>` literal 0 HcmV?d00001 diff --git a/ODM-MH-Analysis_ready/Closures/Closure_outputs/open_by_year2025May08.RDS b/ODM-MH-Analysis_ready/Closures/Closure_outputs/open_by_year2025May08.RDS new file mode 100644 index 0000000000000000000000000000000000000000..fc7c30f1898b16d4914393349612e51bf32e6aa9 GIT binary patch literal 1762 zcmd6lXHXMp5QaGp1JaFv3=x8-p%+i2L*M{GN~FWlWF$faDTW{=G!;-IRjNpD2}M8z zK_dw#B2^NKi5v(>hXg{A8Xz3U=*;=^?$Df=OJ;-Yw7WJO)_SE98tZ+A0=kC@ zg8ss}0@^;NyE#ezSZ(77LC|$s5%<>p31)@QFNh6Cu9r<>#K0SX_PrrkZ4w z2)9?)a$s(@mOaX=OkJQMh_u>Ew*3~Amc<0`s$iQSra=2fx?h#QcWzTR1XdL^W&D|p;bp=?jRVG3oSsTo zb5t|6?}rTt2_LaBPPvaY&+>mbS~rqiSo}ADYU9Y41P?+}wwa#<&h+XCwwe~7v;|I} zS6IwxsbzN&XylIh)=vfYZusr#)txdGABs?Zzi48=sGo-kXz_;S?VzR#5j$!^Ud?8y zyjF_=1_&`rm$5Ehmopo^0E1b+E)@nH4U90rGDmB<=GC~~5N)BN!}iFCt{51xS)=Y; zpvHAKfcDa`=NXlnMOahsEgkBJ+Q4KyudVAIaGp=x|O zEbAg2g{CQ&Pfh%Q_^YjUm0G!+;zEn;3!dHSvbNZ7#j;I4%G3vq;HJpdEAawi#JSa8 z8P9OWDMsRm)6?On3Uscb4-&eotMn@)Cwnq0LxP|%0~7Y;Zoc>b5(kMAiHg|&vl>oHA-`| zLVpJE6vS=f`4eLss@osOHR_%bYm0_ISYm%O zV18x?fH*~lZ)#iw4m66HhzxJ?9=#X8q;s;lsEH(xGtW|T!v}4Zg$KSz2h>+GMCGeyEyAY&{$xg`a+eXemW%P$O+nP)MeAtm!h6c?AM zZBx6ZnFmdfv5Z%;tL7MY^9adR5N6zL@5AT4RRe-_p3H3v z!{8u9*;Pf1*`zj*Y!=}-ncBt!R5oo^KstGtdzg60)yempH%lR5lMjFam#;_iPnJF- zzk?oFH5$&hNGpJQI@anU4n-Z)qt56+P7(Ktl*eDRnQAf$8s^^Z>QKo&&k8P2rnh-x zP{27zer6~0v=Mbq@&%L==}MI*AKcPA*cU^5B**L|2eSHC4qTfu0efHFAuOrYtmuck zuHcQmS|d*F7Hf)nwBD1QdgxXNt0XEiA(VAdEYY~6|HeOLgpkPmI&%2EN7y6>0h4K= zT6l;Wln|yz8^0>|R3d+iLc$N|I*q^UnWeubeLy?$)~2jIRY7{7y0En)5#hHR&%**n z)dHJk99aMydZcDzaCn=>!V|*3l2AMvsO5TPkq10s%}h;ZAv%<~o@_$aOG^$2_zZ@o rwcpZI*TWN{rl>1n_J7_w5#a0VuP}ypvEJZVrTmc#Yhgj literal 0 HcmV?d00001 diff --git a/ODM-MH-Analysis_ready/Closures/Fishing_season.R b/ODM-MH-Analysis_ready/Closures/Fishing_season.R deleted file mode 100644 index 4bf03f3..0000000 --- a/ODM-MH-Analysis_ready/Closures/Fishing_season.R +++ /dev/null @@ -1,121 +0,0 @@ -# FISHING SEASON MH PROCESSING -### NOT DONE, STILL NEED SOME THOUGHT ### - -# Filter for only fishing season management type -# Include REG_REMOVED == 0 because this helps us in getting an end date for fishing years that end, but we do not want to keep the record that "turns off" the regulation -mh_fs <- mh_data_log %>% - filter(MANAGEMENT_TYPE_USE == 'FISHING SEASON', REG_REMOVED == 0) - -# Identify cases that have a split fishing season - yes, we have split fishing season -mh_fs_chk1 <- mh_fs %>% ungroup() %>% - group_by(FR_CITATION, FMP, REGION, COMMON_NAME_USE, SECTOR_USE, SUBSECTOR_USE, ZONE_USE, MANAGEMENT_STATUS_USE, EFFECTIVE_DATE) %>% - summarise(N_seasons = n()) -# Join to data -mh_fs2 <- mh_fs %>% - left_join(mh_fs_chk1, by = c("FR_CITATION", "REGION", "FMP", "EFFECTIVE_DATE", "SECTOR_USE", - "COMMON_NAME_USE", "ZONE_USE", "SUBSECTOR_USE", "MANAGEMENT_STATUS_USE")) -# Check date fields -chk_dates <- mh_fs2 %>% - select(REGULATION_ID, FR_CITATION, FMP, REGION, COMMON_NAME_USE, SECTOR_USE, SUBSECTOR_USE, ZONE_USE, MANAGEMENT_STATUS_USE, EFFECTIVE_DATE, - INEFFECTIVE_DATE, START_MONTH, START_DAY_USE, START_YEAR, START_DAY_OF_WEEK_USE, - END_MONTH_USE, END_DAY_USE, END_YEAR_USE, END_DAY_OF_WEEK_USE, - START_DATE2, END_DATE2) - -# Check other weekly recurring events -chk_weekly <- mh_data_log %>% filter(MANAGEMENT_STATUS_USE == 'WEEKLY RECURRING') -# Check REG ID 11548 -chk <- mh_data_log %>% filter(REGULATION_ID == 11548) %>% - select(REGULATION_ID, FR_CITATION, FMP, REGION, COMMON_NAME_USE, SECTOR_USE, SUBSECTOR_USE, ZONE_USE, MANAGEMENT_STATUS_USE, EFFECTIVE_DATE, - INEFFECTIVE_DATE, START_MONTH, START_DAY_USE, START_YEAR, START_DAY_OF_WEEK_USE, - END_MONTH_USE, END_DAY_USE, END_YEAR_USE, END_DAY_OF_WEEK_USE, - START_DATE2, END_DATE2, EFFECTIVE_DATE_FY_1, FY_1, EFFECTIVE_DATE_FY_2, FY_2, EFFECTIVE_DATE_FY_3, FY_3) - -# Check spiny lobster - had no fishing year because has fishing season? -# Include fishing season in "CLOSURE" story and process there -chk <- mh_data_log %>% - filter(COMMON_NAME_USE == 'LOBSTER, CARIBBEAN SPINY', is.na(FY_1), - MANAGEMENT_TYPE_USE == 'FISHING SEASON') %>% - select(CLUSTER, FR_CITATION, MANAGEMENT_TYPE_USE, MANAGEMENT_STATUS_USE, COMMON_NAME_USE, - FMP, REGION, SECTOR_USE, SUBSECTOR_USE, ZONE_USE, - EFFECTIVE_DATE, INEFFECTIVE_DATE, START_DATE2, END_DATE2, - START_MONTH, START_DAY_USE, START_DAY_OF_WEEK_USE, START_TIME_USE, START_YEAR, - END_MONTH_USE, END_DAY_USE, END_DAY_OF_WEEK_USE, END_TIME_USE, END_YEAR) %>% - arrange(REGION, SECTOR_USE, SUBSECTOR_USE, START_DATE2) - -# Check red snapper that has 2 fishing seasons -# Because these are multi-regs (same FR) the logic for start date2 and end date2 is not working -chk <- mh_data_log %>% - filter(COMMON_NAME_USE == 'SNAPPER, RED', REGION == 'GULF OF MEXICO', - MANAGEMENT_TYPE_USE == 'FISHING SEASON') %>% - select(CLUSTER, FR_CITATION, MANAGEMENT_TYPE_USE, MANAGEMENT_STATUS_USE, COMMON_NAME_USE, - FMP, REGION, SECTOR_USE, SUBSECTOR_USE, ZONE_USE, - EFFECTIVE_DATE, INEFFECTIVE_DATE, START_DATE2, END_DATE2, - START_MONTH, START_DAY_USE, START_DAY_OF_WEEK_USE, START_TIME_USE, START_YEAR, - END_MONTH_USE, END_DAY_USE, END_DAY_OF_WEEK_USE, END_TIME_USE, END_YEAR, - EFFECTIVE_DATE_FY_1, EFFECTIVE_DATE_FY_2, EFFECTIVE_DATE_FY_3, - FY_1, FY_2, FY_3) %>% - arrange(REGION, SECTOR_USE, SUBSECTOR_USE, START_DATE2) - -# Identify number of days within a fishing season -mh_fs_ck2 <- mh_fs2 %>% - # Create as date field to subtract (the year is not important here) - mutate(START_FS = case_when(!is.na(START_MONTH) & !is.na(START_DAY_USE) & is.na(START_YEAR) ~ as.Date(paste0("2023-", START_MONTH, "-", START_DAY_USE), "%Y-%m-%d"), - !is.na(START_MONTH) & !is.na(START_DAY_USE) & !is.na(START_YEAR) ~ as.Date(paste0(START_YEAR, "-", START_MONTH, "-", START_DAY_USE), "%Y-%m-%d")), - END_FS = case_when(!is.na(END_MONTH_USE) & !is.na(END_DAY_USE) & is.na(END_YEAR_USE) ~ as.Date(paste0("2023-", END_MONTH_USE, "-", END_DAY_USE), "%Y-%m-%d"), - !is.na(END_MONTH_USE) & !is.na(END_DAY_USE) & !is.na(END_YEAR_USE) ~ as.Date(paste0(END_YEAR_USE, "-", END_MONTH_USE, "-", END_DAY_USE), "%Y-%m-%d")), - DIFF = case_when(END_MONTH_USE >= START_MONTH ~ END_FS - START_FS, - END_MONTH_USE < START_MONTH ~ START_FS - END_FS)) %>% - filter(N_seasons == 1) - -# Check fishing season for specific areas -chk <- mh_fs_ck2 %>% group_by(SECTOR_USE, SUBSECTOR_USE, ZONE_USE) %>% summarize(n = n()) - -# Recode fishing season records as fishing year if 365 days -fs_to_fy <- mh_fs_ck2 %>% ungroup() %>% - filter(abs(DIFF) %in% c(364, 365, 1)) #%>% - #select(REGULATION_ID) %>% pull() - -# Check for cases where there is a single fishing season and its less than 365 days -# These are cases where the inverse is then considered a closure -fs_lt365 <- mh_fs_ck2 %>% - filter(abs(DIFF) < 365, !REGULATION_ID %in% fs_to_fy) %>% - select(CLUSTER, REGULATION_ID, FR_CITATION, FR_URL, - REGION, ZONE_USE, COMMON_NAME_USE, SECTOR_USE, SUBSECTOR_USE, - START_DATE2, END_DATE2, START_FS, END_FS, DIFF) %>% - distinct() - -# Fishing season more than 365 days -# Only one regulation - Gulf red drum and that is how the FR is worded -fs_gt365 <- mh_fs_ck2 %>% - filter(abs(DIFF) > 365, !REGULATION_ID %in% fs_to_fy) %>% - select(CLUSTER, REGULATION_ID, FR_CITATION, FR_URL, - REGION, ZONE_USE, COMMON_NAME_USE, SECTOR_USE, SUBSECTOR_USE, - START_DATE2, END_DATE2, START_FS, END_FS, DIFF) %>% - distinct() -chk <- mh_data_log %>% filter(REGULATION_ID == 3486) - -# Fishing season missing diff days -# Some just have start fishing season -# For the red snapper fishing season, that means it ends at the end of the fishing year -# Others don't have fishing year and are missing key date fields because they are certain days of the week -# All of those are rec Caribbean Spiny Lobster in the Gulf and SATL -fs_nodiff <- mh_fs_ck2 %>% - filter(is.na(DIFF)) %>% - select(CLUSTER, REGULATION_ID, FR_CITATION, FR_URL, - REGION, ZONE_USE, COMMON_NAME_USE, SECTOR_USE, SUBSECTOR_USE, - EFFECTIVE_DATE, INEFFECTIVE_DATE, START_DATE2, END_DATE2, - START_DAY, START_DAY_USE, START_MONTH, START_TIME_USE, START_YEAR, START_DAY_OF_WEEK_USE, START_FS, - END_DAY, END_DAY_USE, END_MONTH, END_MONTH_USE, END_TIME, END_TIME_USE, END_YEAR, END_YEAR_USE, END_DAY_OF_WEEK_USE, END_FS, DIFF, - EFFECTIVE_DATE_FY_1, EFFECTIVE_DATE_FY_2, EFFECTIVE_DATE_FY_3, - FY_1, FY_2, FY_3) %>% - distinct() - -# Remove these FRs since already added to fishing year -mh_fs3 <- mh_fs2 %>% - filter(!REGULATION_ID %in% fs_to_fy) - -# Filter for species of interest -fs_spp <- mh_fs3 %>% - filter(COMMON_NAME_USE == spp, REGION == region) - -# Format diff --git a/ODM-MH-Analysis_ready/Closures/Main_closure_prep.R b/ODM-MH-Analysis_ready/Closures/Main_closure_prep.R index aaf92ef..03490b4 100644 --- a/ODM-MH-Analysis_ready/Closures/Main_closure_prep.R +++ b/ODM-MH-Analysis_ready/Closures/Main_closure_prep.R @@ -1,20 +1,34 @@ -# Process all regulations related to closures +#### Closures #### +# Code creates a comprehensive, expanded time series of fishery status (OPEN/CLOSE) +# by incorporating all closure-related regulations. +# The first output from this code indicates the days open per year by fishery (commercial/recreational) +# The second output from this code displays the continuous OPEN/CLOSE periods with start/end dates # Load packages #### librarian::shelf(here, tidyverse, lubridate, dplyr, tidyr, neatRanges, splitstackshape) -# Read in MH Data Log -mh_data_log <- readRDS(here("ODM-MH-Data_log", "data", "results", "MH_DL_2025Mar28.RDS")) +# Read in MH Data Log #### +mh_data_log <- readRDS(here("ODM-MH-Data_log", "data", "results", "MH_DL_2025Sep10.RDS")) -# Select species and region +# Select species and region of interest for the closure time series #### spp <- 'SNAPPER, RED' -region <- 'GULF OF MEXICO' +region <- 'SOUTH ATLANTIC' -# Function to expand dates based on management status +# Function to expand dates based on management status #### +# Function expands records for a given MANAGEMENT_TYPE_USE into a daily date sequence with +# the status of the fishery (OPEN/CLOSED) indicated for each day based on the MANAGEMENT_STATUS_USE +# (ONCE/SEASONAL/RECURRING) of the applicable regulations source(here("ODM-MH-Analysis_ready", "Closures", "func_expand_status.R")) -# filter for species and region (all closure related records) -# Recode management types to have a value +# Filter and reclassify closure-related records #### +# Retain only species and region of interest and management types that impact the status of the fishery +# Provide management types that impact fishery status with a VALUE of OPEN or CLOSE +# FISHING SEASON/FISHING YEAR implies that the fishery is OPEN during the defined window +# PROHIBITED SALE AND PURCHASE +# - If FLAG = YES -> OPEN (sale is allowed) +# - If FLAG = NO -> CLOSE (sale is not allowed) +# PROHIBITED SPECIES implies the fishery is closed as species cannot be retained +# CLOSURE VALUE already indicates fishery status mh_spp_closure <- mh_data_log %>% filter(COMMON_NAME_USE == spp, REGION == region, @@ -28,39 +42,46 @@ mh_spp_closure <- mh_data_log %>% TRUE ~ VALUE)) %>% arrange(SECTOR_USE, START_DATE2) +# Check to see which MANAGEMENT_TYPE_USE are present after filtering unique(mh_spp_closure$MANAGEMENT_TYPE_USE) -# Fishing Year -chk <- filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "FISHING YEAR") +# Date expansion by MANAGEMENT_TYPE_USE #### +# Each section expands the raw rules for the applicable MANAGEMENT_TYPE_USE into a +# series by date with the associated status (OPEN/CLOSE) and START/END TIME + +# Fishing Year expansion +unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "FISHING YEAR"), MANAGEMENT_STATUS_USE)) spp_year <- expand_status(mh_spp_closure, "FISHING YEAR") -# Fishing Season - still needs some work if not entered consistently -chk <- filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "FISHING SEASON") +# Fishing Season expansion +# Portion may require some adjustment if fishing year has not been documented consistently in the raw data +unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "FISHING SEASON"), MANAGEMENT_STATUS_USE)) spp_season <- expand_status(mh_spp_closure, "FISHING SEASON") -# Closure +# Closure expansion unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "CLOSURE"), MANAGEMENT_STATUS_USE)) spp_closures <- expand_status(mh_spp_closure, "CLOSURE") -# Prohibited sale and purchase +# Prohibited Sale and Purchase expansion unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "PROHIBITED SALE AND PURCHASE"), MANAGEMENT_STATUS_USE)) spp_prohibited_sale <- expand_status(mh_spp_closure, "PROHIBITED SALE AND PURCHASE") -# Prohibited species +# Prohibited Species expansion unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "PROHIBITED SPECIES"), MANAGEMENT_STATUS_USE)) spp_prohibited_spp <- expand_status(mh_spp_closure, "PROHIBITED SPECIES") -# Combine all management types that refer to closures -# For now just comment out mtypes that do not apply +# Join all expanded series into one time series #### +# For days with multiple statuses based on multiple regulations, select the most recent FR Citation spp_closure_story <- spp_year %>% rename(FR_CITATION_year = "FR_CITATION", TIME_year = "TIME", VALUE_year = "VALUE") %>% select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_year, TIME_year, VALUE_year) %>% + # Comment out MANAGEMENT_TYPE_USE that do not apply to your filter criteria full_join(spp_season %>% - rename(FR_CITATION_season = "FR_CITATION", + rename(FR_CITATION_season = "FR_CITATION", TIME_season = "TIME", - VALUE_season = "VALUE") %>% + VALUE_season = "VALUE") %>% select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_season, TIME_season, VALUE_season), by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% full_join(spp_closures %>% @@ -69,57 +90,67 @@ spp_closure_story <- spp_year %>% VALUE_close = "VALUE") %>% select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_close, TIME_close, VALUE_close), by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% - # full_join(spp_prohibited_sale %>% - # rename(FR_CITATION_sale = "FR_CITATION", - # TIME_sale = "TIME", - # VALUE_sale = "VALUE") %>% - # select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_sale, VALUE_sale), - # by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% - # full_join(spp_prohibited_spp %>% - # rename(FR_CITATION_spp = "FR_CITATION", - # TIME_spp = "TIME", - # VALUE_spp = "VALUE") %>% - # select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_spp, VALUE_spp), - # by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% + full_join(spp_prohibited_sale %>% + rename(FR_CITATION_sale = "FR_CITATION", + TIME_sale = "TIME", + VALUE_sale = "VALUE") %>% + select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_sale, VALUE_sale), + by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% + full_join(spp_prohibited_spp %>% + rename(FR_CITATION_spp = "FR_CITATION", + TIME_spp = "TIME", + VALUE_spp = "VALUE") %>% + select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_spp, VALUE_spp), + by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% arrange(SECTOR_USE, SUBSECTOR_USE, ZONE_USE, date_sequence) %>% - # Select the most recent FR CITATION + # Select the most recent FR CITATION and retain its TIME/VALUE mutate(FR_CITATION = pmax(FR_CITATION_year, FR_CITATION_season, FR_CITATION_close, - # FR_CITATION_sale, - #FR_CITATION_spp, + FR_CITATION_sale, + FR_CITATION_spp, na.rm = T), TIME = case_when(FR_CITATION == FR_CITATION_close ~ TIME_close, - #FR_CITATION == FR_CITATION_sale ~ TIME_sale, - #FR_CITATION == FR_CITATION_spp ~ TIME_spp, - FR_CITATION == FR_CITATION_season ~ TIME_season, + FR_CITATION == FR_CITATION_sale ~ TIME_sale, + FR_CITATION == FR_CITATION_spp ~ TIME_spp, + FR_CITATION == FR_CITATION_season ~ TIME_season, FR_CITATION == FR_CITATION_year ~ TIME_year)) %>% - # Select the fishery status (open/closed) that applies to the most recent FR mutate(VALUE = case_when(FR_CITATION == FR_CITATION_close ~ VALUE_close, - #FR_CITATION == FR_CITATION_sale ~ VALUE_sale, - #FR_CITATION == FR_CITATION_spp ~ VALUE_spp, + FR_CITATION == FR_CITATION_sale ~ VALUE_sale, + FR_CITATION == FR_CITATION_spp ~ VALUE_spp, FR_CITATION == FR_CITATION_season ~ VALUE_season, FR_CITATION == FR_CITATION_year ~ VALUE_year)) %>% - select(-FR_CITATION_year, -TIME_year, -VALUE_year, -FR_CITATION_close, -TIME_close, -VALUE_close, -FR_CITATION_season, -TIME_season, -VALUE_season) %>% - # Create day_calc to indicate cases where the start/end time is midday - # midday start/end times should be counted toward both open and closed periods + # Remove management type-specific columns now that a single FR/TIME/VALUE has been selected for each day + select(-FR_CITATION_year, -TIME_year, -VALUE_year, -FR_CITATION_close, -TIME_close, -VALUE_close, -FR_CITATION_sale, -VALUE_sale, -TIME_sale, -FR_CITATION_season, -VALUE_season, -TIME_season) %>% + # How to handle half days + # Some FR notices take effect midday or later. To correctly count days for annual tallies, treat noon/6pm + # TIMEs as half-days) (0.5) + # This ensures that a midday start/end time contributes to both OPEN and CLOSED period calculations mutate(day_calc = case_when(TIME == "06:00:00 PM" ~ 0.5, TIME == "12:00:00 PM" ~ 0.5, TRUE ~ 1)) -# Summarize the open and closed periods for each year +# Summarize the open and closed periods for each year #### +# Fill in any mission VALUE as OPEN (assumes that any window without an applicable rule is open) summ_spp_closures <- spp_closure_story %>% mutate(YEAR = year(date_sequence), VALUE = as.character(VALUE), VALUE = if_else(is.na(VALUE), "OPEN", VALUE)) %>% filter(VALUE %in% c("OPEN", "CLOSE")) +# Create half-day complements #### +# When a day is counted as 0.5 under one status (OPEN/CLOSED), add a complementary 0.5 day to +# the opposite status so that the calendar day sums to 1 acorss OPEN/CLOSE summ_spp_closures2 <- summ_spp_closures %>% filter(day_calc == 0.5) %>% mutate(VALUE = if_else(VALUE == "OPEN", "CLOSE", "OPEN")) +# Combine whole-day and half-day rows for final daily time series spp_closure_combined <- bind_rows(summ_spp_closures, summ_spp_closures2) +# Collapse individual days into continuous periods within each year #### +# Group consecutive days with the same VALUE into periods and compute total days within the period (ndays) +# and list the start/end as the first/last days within the period spp_close_sum <- spp_closure_combined %>% group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR) %>% arrange(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, TIME) %>% @@ -134,25 +165,10 @@ spp_close_sum <- spp_closure_combined %>% arrange(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR, start) -# Summarize the open and closed periods for each year -#summ_spp_closures <- spp_closure_story %>% - # mutate(YEAR = year(date_sequence)) %>% - #group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR) %>% - #arrange(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, TIME) %>% - #mutate(change = VALUE != lag(VALUE, default = first(VALUE)) | - # YEAR != lag(YEAR, default = first(YEAR))) %>% - #mutate(group = cumsum(change)) %>% - #group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR, VALUE, group) %>% - #summarize(ndays = sum(day_calc, na.rm = TRUE), - # start = min(date_sequence), - # end = max(date_sequence), - # .groups = 'drop') %>% - #mutate(VALUE = case_when(is.na(VALUE) ~ "OPEN", - # TRUE ~ VALUE)) %>% - #arrange(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR) - -# Identify full range of years per group -all_years_by_group <- spp_close %>% +# Identify full range of years per group #### +# Determine the min/max year of regulations documented and expand to all years between so that even years with zero regulations +# are accounted for in the expansion +all_years_by_group <- spp_close_sum %>% distinct(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR, VALUE) %>% group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE) %>% summarize(min_year = min(YEAR), max_year = max(YEAR), .groups = "drop") %>% @@ -161,18 +177,23 @@ all_years_by_group <- spp_close %>% unnest(YEAR) %>% select(-min_year, -max_year) -# Summarize the number of days open per year -summ_days_open <- spp_close %>% +# Summarize the number of days open per year #### +# Collapse to annual totals of OPEN days per fishery grouping +summ_days_open <- spp_close_sum %>% filter(VALUE == "OPEN") %>% group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR) %>% summarize(Days_Open = sum(ndays), .groups = "drop") %>% arrange(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR) +# Ensure every year in the full span is represented +# Fill in missing years as zero open_by_year <- all_years_by_group %>% left_join(summ_days_open, by = c("FMP", "COMMON_NAME_USE", "REGION", "ZONE_USE", "SECTOR_USE", "SUBSECTOR_USE", "YEAR")) %>% mutate(Days_Open = replace_na(Days_Open, 0)) %>% arrange(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR) -# Save closure output as RDS file -saveRDS(open_by_year, here("ODM-MH-Analysis_ready", "Closures", "Closure_outputs", paste0('open_by_year', format(Sys.Date(), "%Y%b%d"), '.RDS'))) +# Save annual open days as RDS file +saveRDS(open_by_year, here("ODM-MH-Analysis_ready", "Closures", "Closure_outputs", paste0('Open_', spp, format(Sys.Date(), "%Y%b%d"), '.RDS'))) +# Save closure periods output as RDS file +saveRDS(spp_close_sum, here("ODM-MH-Analysis_ready", "Closures", "Closure_outputs", paste0('Close_', spp, format(Sys.Date(), "%Y%b%d"), '.RDS'))) diff --git a/ODM-MH-Analysis_ready/Closures/SATL_Red_Porgy_closure_example.R b/ODM-MH-Analysis_ready/Closures/SATL_Red_Porgy_closure_example.R deleted file mode 100644 index 2d7ec99..0000000 --- a/ODM-MH-Analysis_ready/Closures/SATL_Red_Porgy_closure_example.R +++ /dev/null @@ -1,104 +0,0 @@ -# Process all regulations related to closures - -# Load packages #### -#install.packages("librarian") -librarian::shelf(here, tidyverse, lubridate, openxlsx, neatRanges, splitstackshape) - -# Read in MH Data Log -mh_data_log <- readRDS(here("ODM-MH-Data_log", "data", "results", "MH_DL_2024Feb08.RDS")) - -# Select species and region -spp <- 'PORGY, RED' -region <- 'SOUTH ATLANTIC' - -# Function to expand dates based on management status -source(here("ODM-MH-Analysis_ready", "func_expand_status.R")) - -# filter for species and region (all closure related records) -# Recode management types to have a value -mh_spp_closure <- mh_data_log %>% - filter(COMMON_NAME_USE == spp & REGION == region & - (MANAGEMENT_TYPE_USE %in% c('CLOSURE', 'FISHING SEASON', 'FISHING YEAR', 'PROHIBITED SPECIES') | - # Flag == NO means fishery wide prohibited sale and purchase (ie closure) - MANAGEMENT_TYPE_USE == 'PROHIBITED SALE AND PURCHASE' & FLAG == 'NO')) %>% - mutate(VALUE = case_when(MANAGEMENT_TYPE_USE %in% c('FISHING SEASON', 'FISHING YEAR') ~ 'OPEN', - MANAGEMENT_TYPE_USE %in% c('PROHIBITED SALE AND PURCHASE', 'PROHIBITED SPECIES') ~ 'CLOSE', - TRUE ~ VALUE)) %>% - arrange(SECTOR_USE, START_DATE2) - -unique(mh_spp_closure$MANAGEMENT_TYPE_USE) - -# Fishing Year -unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "FISHING YEAR"), MANAGEMENT_STATUS_USE)) -spp_year <- expand_status(mh_spp_closure, "FISHING YEAR") - -# Fishing Season - still needs some work if not entered consistently -unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "FISHING SEASON"), MANAGEMENT_STATUS_USE)) -spp_season <- expand_status(mh_spp_closure, "FISHING SEASON") - -# Closure -unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "CLOSURE"), MANAGEMENT_STATUS_USE)) -spp_closures <- expand_status(mh_spp_closure, "CLOSURE") - -# Prohibited sale and purchase -unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "PROHIBITED SALE AND PURCHASE"), MANAGEMENT_STATUS_USE)) -spp_prohibited_sale <- expand_status(mh_spp_closure, "PROHIBITED SALE AND PURCHASE") - -# Prohibited species -unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "PROHIBITED SPECIES"), MANAGEMENT_STATUS_USE)) -spp_prohibited_spp <- expand_status(mh_spp_closure, "PROHIBITED SPECIES") - -# Combine all management types that refer to closures -spp_closure_story <- spp_year %>% - rename(FR_CITATION_year = "FR_CITATION", - VALUE_year = "VALUE") %>% - select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_year, VALUE_year) %>% - full_join(spp_season %>% - rename(FR_CITATION_season = "FR_CITATION", - VALUE_season = "VALUE") %>% - select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_season, VALUE_season), - by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% - full_join(spp_closures %>% - rename(FR_CITATION_close = "FR_CITATION", - VALUE_close = "VALUE") %>% - select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_close, VALUE_close), - by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% - full_join(spp_prohibited_sale %>% - rename(FR_CITATION_sale = "FR_CITATION", - VALUE_sale = "VALUE") %>% - select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_sale, VALUE_sale), - by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% - full_join(spp_prohibited_spp %>% - rename(FR_CITATION_spp = "FR_CITATION", - VALUE_spp = "VALUE") %>% - select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_spp, VALUE_spp), - by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% - arrange(SECTOR_USE, SUBSECTOR_USE, ZONE_USE, date_sequence) %>% - # Select the most recent FR CITATION - mutate(FR_CITATION = pmax(FR_CITATION_year, - FR_CITATION_season, - FR_CITATION_close, - FR_CITATION_sale, - FR_CITATION_spp, - na.rm = T)) %>% - # Select the fishery status (open/closed) that applies to the most recent FR - mutate(VALUE = case_when(FR_CITATION == FR_CITATION_close ~ VALUE_close, - FR_CITATION == FR_CITATION_sale ~ VALUE_sale, - FR_CITATION == FR_CITATION_spp ~ VALUE_spp, - FR_CITATION == FR_CITATION_season ~ VALUE_season, - FR_CITATION == FR_CITATION_year ~ VALUE_year)) - -summ_spp_closures <- spp_closure_story %>% - mutate(YEAR = year(date_sequence)) %>% - group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR, FR_CITATION, VALUE) %>% - summarize(ndays = n(), - start = min(date_sequence), - end = max(date_sequence)) %>% - arrange(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR, start) %>% - # Add back FR_URL for reference - left_join(distinct(select(filter(ungroup(mh_data_log), FMP == 'SNAPPER-GROUPER FISHERY OF THE SOUTH ATLANTIC REGION'), FR_CITATION, FR_URL)), - by = join_by(FR_CITATION)) - -# Save as Excel to compare to SEDAR MH file -write.xlsx(summ_spp_closures, "C:/Users/sarina.atkinson/Documents/Data/MH_closures/SA_RP_closures_08Feb24.xlsx") - From e961d40798cfed4dadd00b330b9304cdb7a40d9e Mon Sep 17 00:00:00 2001 From: GaitlynMalone-NOAA <115589280+GaitlynMalone-NOAA@users.noreply.github.com> Date: Wed, 24 Sep 2025 09:49:20 -0400 Subject: [PATCH 3/3] Move previous closures script --- .../Closure_tests/Closure_Reopening.R | 314 ++++++++++++++++++ .../Closures/Closure_tests/Fishing_season.R | 121 +++++++ .../SATL_Red_Porgy_closure_example.R | 104 ++++++ 3 files changed, 539 insertions(+) create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_tests/Closure_Reopening.R create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_tests/Fishing_season.R create mode 100644 ODM-MH-Analysis_ready/Closures/Closure_tests/SATL_Red_Porgy_closure_example.R diff --git a/ODM-MH-Analysis_ready/Closures/Closure_tests/Closure_Reopening.R b/ODM-MH-Analysis_ready/Closures/Closure_tests/Closure_Reopening.R new file mode 100644 index 0000000..a8e9579 --- /dev/null +++ b/ODM-MH-Analysis_ready/Closures/Closure_tests/Closure_Reopening.R @@ -0,0 +1,314 @@ +# MH Closure processing + +#Load packages #### +librarian::shelf(here, tidyverse, lubridate, dplyr, tidyr, neatRanges, splitstackshape) + +# Read in MH Data log #### + mh_data_log <- readRDS(here("ODM-MH-Data_log", "data", "results", "MH_DL_2024Jul12.RDS")) +# +# # Select species and region #### + spp <- 'SNAPPER, RED' + region <- 'GULF OF MEXICO' + +# Seasonal Closures #### +# Filter dataset to seasonal closure regulations for the specified species and region +Seasonal_closures <- mh_data_log %>% + filter(MANAGEMENT_TYPE_USE == 'CLOSURE', MANAGEMENT_STATUS_USE == 'SEASONAL', NEVER_IMPLEMENTED == 0, REG_REMOVED == 0) + +# Create date_sequence to expand dates between EFFECTIVE_DATE and END_DATE2 +expand_seasonal <- Seasonal_closures %>% + filter(EFFECTIVE_DATE <= END_DATE2) %>% + mutate(date_sequence = map2(EFFECTIVE_DATE, END_DATE2, seq, by = "days")) %>% + unnest(date_sequence) + +# Add START_YEAR_expand and END_YEAR_expand to extract the year from the date_sequence field +expand_seasonal_year <- expand_seasonal %>% + rowwise() %>% + mutate(START_YEAR_expand = year(date_sequence), + END_YEAR_expand = year(date_sequence)) + +# Create START_DATE_EXPAND and END_DATE_EXPAND using start/end day and month information and the expanded year +expand_seasonal_date <- expand_seasonal_year %>% + mutate(START_DATE_EXPAND = as.Date(paste(START_YEAR_expand, START_MONTH, START_DAY_USE, sep = "-")), + END_DATE_EXPAND = as.Date(paste(END_YEAR_expand, END_MONTH_USE, END_DAY_USE, sep = "-"))) + +# Remove records where date_sequence is prior to the START_DATE_EXPAND and date_sequence is after the END_DATE_EXPAND +remove_seasonal_date <- expand_seasonal_date %>% + filter(date_sequence >= START_DATE_EXPAND, + END_DATE_EXPAND >= date_sequence) + +# Create CLOSE_OPEN field to indicate that expanded records are related to Closures or Openings +add_closure_value_seasonal <- remove_seasonal_date %>% + mutate(CLOSE_OPEN = VALUE) + +# Monthly Closures #### +monthly_closures <- mh_spp_closure %>% + filter(MANAGEMENT_TYPE_USE == 'CLOSURE', MANAGEMENT_STATUS_USE == 'MONTHLY RECURRING', NEVER_IMPLEMENTED == 0, REG_REMOVED == 0) + +# Expand dates between EFFECTIVE_DATE and END_DATE2 +expand_monthly <- monthly_closures %>% + mutate(date_sequence = map2(EFFECTIVE_DATE, END_DATE2, seq, by = "days")) %>% + unnest(date_sequence) + +# Add START_YEAR_expand and END_YEAR_expand to extract the year from the date_sequence field +# Add START_MONTH_expand and END_MONTH_expand to extract the month from the date_sequence field +# Takes 20 mins to run!!!! +start <- Sys.time() +expand_monthly_year <- expand_monthly %>% + #rowwise() %>% + mutate(START_YEAR_expand = year(date_sequence), + END_YEAR_expand = year(date_sequence), + # case where the monthly recurring goes from the 15th to the 1st of the following month + START_MONTH_expand = case_when(END_DAY_USE < START_DAY_USE & day(date_sequence) < START_DAY_USE & month(date_sequence) != 1 ~ month(date_sequence) - 1, + END_DAY_USE < START_DAY_USE & day(date_sequence) < START_DAY_USE & month(date_sequence) == 1 ~ 12, + TRUE ~ month(date_sequence)), + END_MONTH_expand = case_when(END_DAY_USE < START_DAY_USE & day(date_sequence) < START_DAY_USE & month(date_sequence) != 1 ~ month(date_sequence), + END_DAY_USE < START_DAY_USE & day(date_sequence) >= START_DAY_USE & month(date_sequence) + 1 <= 12 ~ month(date_sequence) + 1, + END_DAY_USE < START_DAY_USE & day(date_sequence) >= START_DAY_USE & month(date_sequence) + 1 == 13 ~ 1, + TRUE ~ month(date_sequence))) %>% + # only include months within the start/end month range + # when monthly recurring, the start/end month range refers to the first and last month where the recurring closure applies + # i.e. start month = 2 and end month = 11 + # mean recurring closures start in Feb and end in Nov + # can't use END_MONTH_expand in filter for cases when the recurring closures spans 2 months (i.e. 15th -1st) + filter(START_MONTH_expand >= START_MONTH & + START_MONTH_expand <= END_MONTH) +Sys.time()-start + +# Create Expand_days to indicate the day of the week for the closure/reopening +expand_monthly_date <- expand_monthly_year %>% + mutate(START_DATE_EXPAND = as.Date(paste(START_YEAR_expand, START_MONTH_expand, START_DAY_USE, sep = "-")), + END_DATE_EXPAND = as.Date(paste(END_YEAR_expand, END_MONTH_expand, END_DAY_USE, sep = "-"))) + +# Remove records where date_sequence is prior to the START_DATE_EXPAND and date_sequence is after the END_DATE_EXPAND +remove_monthly_date <- expand_monthly_date %>% + filter(date_sequence >= START_DATE_EXPAND, + date_sequence <= END_DATE_EXPAND) + +# Create CLOSE_OPEN field to indicate that expanded records are related to Closures or Openings +add_closure_value_monthly <- remove_monthly_date %>% + mutate(CLOSE_OPEN = VALUE) + +# Weekly Closures #### +# Filter dataset to Weekly Recurring regulations +Weekly_closures <- mh_spp_closure %>% + filter(MANAGEMENT_TYPE_USE == 'CLOSURE', MANAGEMENT_STATUS_USE == 'WEEKLY RECURRING', NEVER_IMPLEMENTED == 0, REG_REMOVED == 0) + +# Expand dates between EFFECTIVE_DATE and END_DATE2 +expand_weekly <- Weekly_closures %>% + mutate(date_sequence = map2(EFFECTIVE_DATE, END_DATE2, seq, by = "days")) %>% + unnest(date_sequence) + +# Add START_YEAR_expand and END_YEAR_expand to extract the year from the date_sequence field +expand_weekly_year <- expand_weekly %>% + #rowwise() %>% + mutate(START_YEAR_expand = year(date_sequence), + END_YEAR_expand = year(date_sequence)) + +# Create Expand_day_of_week to indicate the day of the week for the closure/reopening +expand_weekly_day_of_week <- expand_weekly_year %>% + mutate(Expand_day_of_week = wday(date_sequence, label = TRUE)) + +# Create START_DAY_OF_WEEK_EXPAND and END_DAY_OF_WEEK_EXPAND to format the days of the week to align with Expand_day_of_week +expand_weekly_day_format <- expand_weekly_day_of_week %>% + mutate(START_DAY_OF_WEEK_EXPAND = case_when( + START_DAY_OF_WEEK_USE == "MONDAY" ~ "Mon", + START_DAY_OF_WEEK_USE == "TUESDAY" ~ "Tue", + START_DAY_OF_WEEK_USE == "WEDNESDAY" ~ "Wed", + START_DAY_OF_WEEK_USE == "THURSDAY" ~ "Thu", + START_DAY_OF_WEEK_USE == "FRIDAY" ~ "Fri", + START_DAY_OF_WEEK_USE == "SATURDAY" ~ "Sat", + START_DAY_OF_WEEK_USE == "SUNDAY" ~ "Sun", + TRUE ~ START_DAY_OF_WEEK_USE), + END_DAY_OF_WEEK_EXPAND = case_when( + END_DAY_OF_WEEK_USE == "MONDAY" ~ "Mon", + END_DAY_OF_WEEK_USE == "TUESDAY" ~ "Tue", + END_DAY_OF_WEEK_USE == "WEDNESDAY" ~ "Wed", + END_DAY_OF_WEEK_USE == "THURSDAY" ~ "Thu", + END_DAY_OF_WEEK_USE == "FRIDAY" ~ "Fri", + END_DAY_OF_WEEK_USE == "SATURDAY" ~ "Sat", + END_DAY_OF_WEEK_USE == "SUNDAY" ~ "Sun", + TRUE ~ END_DAY_OF_WEEK_USE)) + +# Keep any records where Expand_day_of_week is between START_DAY_OF_WEEK_EXPAND and END_DAY_OF_WEEK_EXPAND +expand_weekly_day_keep <- expand_weekly_day_format %>% + filter(Expand_day_of_week >= START_DAY_OF_WEEK_EXPAND | + Expand_day_of_week <= END_DAY_OF_WEEK_EXPAND) + +# Create CLOSE_OPEN field to indicate that expanded records are related to Closures or Openings +add_closure_value_weekly <- expand_weekly_day_keep %>% + mutate(CLOSE_OPEN = VALUE) + +# One Time Closures #### +# Filter dataset to One Time regulations +One_closures <- mh_spp_closure %>% + filter(MANAGEMENT_TYPE_USE == 'CLOSURE', MANAGEMENT_STATUS_USE == 'ONCE', NEVER_IMPLEMENTED == 0, REG_REMOVED == 0) + +# Expand dates between EFFECTIVE_DATE and END_DATE2 +expand_one <- One_closures %>% + filter(END_DATE2 >= START_DATE2) %>% + mutate(date_sequence = map2(START_DATE2, END_DATE2, seq, by = "1 day")) %>% + unnest(date_sequence) + +# Create CLOSE_OPEN field to indicate that expanded records are related to Closures or Openings +add_closure_value_one <- expand_one %>% + mutate(CLOSE_OPEN = VALUE) + +# Join in Wide Form +# First clean up duplicates +# Then limit variables and rename +# Then create final OPEN/CLOSED field based on all closure events +# Takes an 1.5 hours to run if use rowwise!!! +# Instead remove rowwise and pmax for faster runtime +Sys.time() +closure_all <- add_closure_value_one %>% + select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence, + CLUSTER, REGULATION_ID, FR_CITATION, CLOSE_OPEN) %>% + arrange(date_sequence, desc(FR_CITATION)) %>% + group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence) %>% + # Retain only most recent FR if there are 2 records with the same date_sequence + slice(1) %>% + rename(CLUSTER_one = "CLUSTER", + REGULATION_ID_one = "REGULATION_ID", + FR_CITATION_one = "FR_CITATION", + CLOSE_OPEN_one = "CLOSE_OPEN") %>% + full_join(add_closure_value_weekly %>% + select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence, + CLUSTER, REGULATION_ID, FR_CITATION, CLOSE_OPEN) %>% + arrange(date_sequence, desc(FR_CITATION)) %>% + group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence) %>% + # Retain only most recent FR if there are 2 records with the same date_sequence + slice(1) %>% + rename(CLUSTER_weekly = "CLUSTER", + REGULATION_ID_weekly = "REGULATION_ID", + FR_CITATION_weekly = "FR_CITATION", + CLOSE_OPEN_weekly = "CLOSE_OPEN"), + by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence)) %>% + full_join(add_closure_value_seasonal %>% + select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence, + CLUSTER, REGULATION_ID, FR_CITATION, CLOSE_OPEN) %>% + arrange(date_sequence, desc(FR_CITATION)) %>% + group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence) %>% + # Retain only most recent FR if there are 2 records with the same date_sequence + slice(1) %>% + rename(CLUSTER_seasonal = "CLUSTER", + REGULATION_ID_seasonal = "REGULATION_ID", + FR_CITATION_seasonal = "FR_CITATION", + CLOSE_OPEN_seasonal = "CLOSE_OPEN"), + by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence)) %>% + full_join(add_closure_value_monthly %>% + select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence, + CLUSTER, REGULATION_ID, FR_CITATION, CLOSE_OPEN) %>% + arrange(date_sequence, desc(FR_CITATION)) %>% + group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence) %>% + # Retain only most recent FR if there are 2 records with the same date_sequence + slice(1) %>% + rename(CLUSTER_monthly = "CLUSTER", + REGULATION_ID_monthly = "REGULATION_ID", + FR_CITATION_monthly = "FR_CITATION", + CLOSE_OPEN_monthly = "CLOSE_OPEN"), + by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, MANAGEMENT_TYPE_USE, date_sequence)) %>% + # create final OPEN_CLOSE field + ungroup() %>% + #rowwise() %>% + mutate(final_FR = pmax(FR_CITATION_one, FR_CITATION_seasonal, FR_CITATION_weekly, FR_CITATION_monthly, na.rm = T)) %>% + mutate(final_CLOSE_OPEN = case_when(final_FR == FR_CITATION_one ~ CLOSE_OPEN_one, + final_FR == FR_CITATION_weekly ~ CLOSE_OPEN_weekly, + final_FR == FR_CITATION_seasonal ~ CLOSE_OPEN_seasonal, + final_FR == FR_CITATION_monthly ~ CLOSE_OPEN_monthly)) +Sys.time() + +# Chck +chk <- closure_all %>% + mutate(YEAR = (year(date_sequence))) %>% + group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR, final_FR, final_CLOSE_OPEN) %>% + summarize(ndays = n()) + +######################################################### +# Join in Long Form +# Join Closure Types Together #### +# Combine closure data frames +Combined_closures <- bind_rows(add_closure_value_seasonal, add_closure_value_monthly, add_closure_value_one) + +# Sort the data frame by date_sequence +sort_closures <- Combined_closures %>% + arrange(date_sequence) + +# Create Multi_expand to indicate whether records have the same date_sequence +sort_closures_multi <- sort_closures %>% + group_by(date_sequence) %>% + mutate(Multi_expand = ifelse(n() > 1, 1, 0)) %>% + ungroup() + +# Keep information from newest FR +closures_remove_multi <- sort_closures_multi %>% + arrange(date_sequence, desc(FR_CITATION)) %>% + group_by(ZONE_USE, date_sequence) %>% + slice(1) %>% + ungroup() + +# Remove extra processing fields from dataset +closures_remove_fields <- closures_remove_multi %>% + select(-START_YEAR_expand, -END_YEAR_expand, -START_DATE_EXPAND, -END_DATE_EXPAND, + -START_DAY_OF_WEEK_EXPAND, -END_DAY_OF_WEEK_EXPAND, -Multi_expand) + +# Create EFFECTIVE_YEAR field to indicate the effective year of the closure +closures_effective_year <- closures_remove_multi %>% + mutate(EFFECTIVE_YEAR = year(date_sequence)) + +# Create EFFECTIVE_MONTH field to indicate the effective month of the closure +closures_effective_month <- closures_effective_year %>% + mutate(EFFECTIVE_MONTH = month(date_sequence)) + +# Create data frame with only REGION, ZONE_USE, date_sequence, CLOSE_OPEN, EFFECTIVE_YEAR, and EFFECTIVE_MONTH +select_closures <- closures_effective_month %>% + select(REGION, ZONE_USE, date_sequence, CLOSE_OPEN, EFFECTIVE_YEAR, EFFECTIVE_MONTH) + +# Fill in missing date_sequence dates +# Create a data frame with all dates for the specified EFFECTIVE_YEAR +all_dates <- select_closures %>% + group_by(REGION, ZONE_USE, EFFECTIVE_YEAR) %>% + summarize(start_date = as.Date(paste(EFFECTIVE_YEAR, "01-01", sep = "-")), + end_date = as.Date(paste(EFFECTIVE_YEAR, "12-31", sep = "-"))) %>% + rowwise() %>% + mutate(date_sequence = list(seq.Date(start_date, end_date, by = "1 day"))) %>% + ungroup() %>% + select(-start_date, -end_date) + +# Expand the date_sequence list into separate rows +# LOSE ZONES HERE!!! +all_dates_expand <- all_dates %>% + rowwise() %>% + mutate(date_sequence = list(unlist(date_sequence))) %>% + unnest(date_sequence) + +# Merge the expanded data frame with the original select_closures data frame +merged_dates <- all_dates %>% + left_join(select_closures, by = c("REGION", "ZONE_USE", "EFFECTIVE_YEAR", "date_sequence")) + +# Remove any duplicated dates +duplicated_data <- merged_dates %>% + group_by(REGION, ZONE_USE, date_sequence) %>% + summarize(CLOSE_OPEN = ifelse(all(is.na(CLOSE_OPEN)), "OPEN", first(na.omit(CLOSE_OPEN)))) %>% + ungroup() + +# Extract EFFECTIVE_YEAR from date_sequence +effective_year <- duplicated_data %>% + mutate(EFFECTIVE_YEAR1 = year(date_sequence)) + +# Extract EFFECTIVE_MONTH1 from date_sequence +effective_month <- effective_year %>% + mutate(EFFECTIVE_MONTH1 = month(date_sequence)) + +# Create MONTH_TOTAL field to indicate how many days the fishery was closed for each month +month_total <- effective_month %>% + group_by(REGION, ZONE_USE, EFFECTIVE_YEAR1, EFFECTIVE_MONTH1) %>% + summarise(MONTH_TOTAL = sum(CLOSE_OPEN == "CLOSE", na.rm = TRUE)) + +# Create SEASON field to indicate if the fishery is opened or closed for the EFFECTIVE_MONTH1 of the EFFECTIVE_YEAR1 +# The fishery is considered closed if more than 15 days within a month are closed +final_closure <- month_total %>% + group_by(EFFECTIVE_YEAR1, EFFECTIVE_MONTH1) %>% + mutate(SEASON = ifelse(MONTH_TOTAL > 15, "CLOSED", "OPEN")) %>% + slice(1) %>% + ungroup() diff --git a/ODM-MH-Analysis_ready/Closures/Closure_tests/Fishing_season.R b/ODM-MH-Analysis_ready/Closures/Closure_tests/Fishing_season.R new file mode 100644 index 0000000..4bf03f3 --- /dev/null +++ b/ODM-MH-Analysis_ready/Closures/Closure_tests/Fishing_season.R @@ -0,0 +1,121 @@ +# FISHING SEASON MH PROCESSING +### NOT DONE, STILL NEED SOME THOUGHT ### + +# Filter for only fishing season management type +# Include REG_REMOVED == 0 because this helps us in getting an end date for fishing years that end, but we do not want to keep the record that "turns off" the regulation +mh_fs <- mh_data_log %>% + filter(MANAGEMENT_TYPE_USE == 'FISHING SEASON', REG_REMOVED == 0) + +# Identify cases that have a split fishing season - yes, we have split fishing season +mh_fs_chk1 <- mh_fs %>% ungroup() %>% + group_by(FR_CITATION, FMP, REGION, COMMON_NAME_USE, SECTOR_USE, SUBSECTOR_USE, ZONE_USE, MANAGEMENT_STATUS_USE, EFFECTIVE_DATE) %>% + summarise(N_seasons = n()) +# Join to data +mh_fs2 <- mh_fs %>% + left_join(mh_fs_chk1, by = c("FR_CITATION", "REGION", "FMP", "EFFECTIVE_DATE", "SECTOR_USE", + "COMMON_NAME_USE", "ZONE_USE", "SUBSECTOR_USE", "MANAGEMENT_STATUS_USE")) +# Check date fields +chk_dates <- mh_fs2 %>% + select(REGULATION_ID, FR_CITATION, FMP, REGION, COMMON_NAME_USE, SECTOR_USE, SUBSECTOR_USE, ZONE_USE, MANAGEMENT_STATUS_USE, EFFECTIVE_DATE, + INEFFECTIVE_DATE, START_MONTH, START_DAY_USE, START_YEAR, START_DAY_OF_WEEK_USE, + END_MONTH_USE, END_DAY_USE, END_YEAR_USE, END_DAY_OF_WEEK_USE, + START_DATE2, END_DATE2) + +# Check other weekly recurring events +chk_weekly <- mh_data_log %>% filter(MANAGEMENT_STATUS_USE == 'WEEKLY RECURRING') +# Check REG ID 11548 +chk <- mh_data_log %>% filter(REGULATION_ID == 11548) %>% + select(REGULATION_ID, FR_CITATION, FMP, REGION, COMMON_NAME_USE, SECTOR_USE, SUBSECTOR_USE, ZONE_USE, MANAGEMENT_STATUS_USE, EFFECTIVE_DATE, + INEFFECTIVE_DATE, START_MONTH, START_DAY_USE, START_YEAR, START_DAY_OF_WEEK_USE, + END_MONTH_USE, END_DAY_USE, END_YEAR_USE, END_DAY_OF_WEEK_USE, + START_DATE2, END_DATE2, EFFECTIVE_DATE_FY_1, FY_1, EFFECTIVE_DATE_FY_2, FY_2, EFFECTIVE_DATE_FY_3, FY_3) + +# Check spiny lobster - had no fishing year because has fishing season? +# Include fishing season in "CLOSURE" story and process there +chk <- mh_data_log %>% + filter(COMMON_NAME_USE == 'LOBSTER, CARIBBEAN SPINY', is.na(FY_1), + MANAGEMENT_TYPE_USE == 'FISHING SEASON') %>% + select(CLUSTER, FR_CITATION, MANAGEMENT_TYPE_USE, MANAGEMENT_STATUS_USE, COMMON_NAME_USE, + FMP, REGION, SECTOR_USE, SUBSECTOR_USE, ZONE_USE, + EFFECTIVE_DATE, INEFFECTIVE_DATE, START_DATE2, END_DATE2, + START_MONTH, START_DAY_USE, START_DAY_OF_WEEK_USE, START_TIME_USE, START_YEAR, + END_MONTH_USE, END_DAY_USE, END_DAY_OF_WEEK_USE, END_TIME_USE, END_YEAR) %>% + arrange(REGION, SECTOR_USE, SUBSECTOR_USE, START_DATE2) + +# Check red snapper that has 2 fishing seasons +# Because these are multi-regs (same FR) the logic for start date2 and end date2 is not working +chk <- mh_data_log %>% + filter(COMMON_NAME_USE == 'SNAPPER, RED', REGION == 'GULF OF MEXICO', + MANAGEMENT_TYPE_USE == 'FISHING SEASON') %>% + select(CLUSTER, FR_CITATION, MANAGEMENT_TYPE_USE, MANAGEMENT_STATUS_USE, COMMON_NAME_USE, + FMP, REGION, SECTOR_USE, SUBSECTOR_USE, ZONE_USE, + EFFECTIVE_DATE, INEFFECTIVE_DATE, START_DATE2, END_DATE2, + START_MONTH, START_DAY_USE, START_DAY_OF_WEEK_USE, START_TIME_USE, START_YEAR, + END_MONTH_USE, END_DAY_USE, END_DAY_OF_WEEK_USE, END_TIME_USE, END_YEAR, + EFFECTIVE_DATE_FY_1, EFFECTIVE_DATE_FY_2, EFFECTIVE_DATE_FY_3, + FY_1, FY_2, FY_3) %>% + arrange(REGION, SECTOR_USE, SUBSECTOR_USE, START_DATE2) + +# Identify number of days within a fishing season +mh_fs_ck2 <- mh_fs2 %>% + # Create as date field to subtract (the year is not important here) + mutate(START_FS = case_when(!is.na(START_MONTH) & !is.na(START_DAY_USE) & is.na(START_YEAR) ~ as.Date(paste0("2023-", START_MONTH, "-", START_DAY_USE), "%Y-%m-%d"), + !is.na(START_MONTH) & !is.na(START_DAY_USE) & !is.na(START_YEAR) ~ as.Date(paste0(START_YEAR, "-", START_MONTH, "-", START_DAY_USE), "%Y-%m-%d")), + END_FS = case_when(!is.na(END_MONTH_USE) & !is.na(END_DAY_USE) & is.na(END_YEAR_USE) ~ as.Date(paste0("2023-", END_MONTH_USE, "-", END_DAY_USE), "%Y-%m-%d"), + !is.na(END_MONTH_USE) & !is.na(END_DAY_USE) & !is.na(END_YEAR_USE) ~ as.Date(paste0(END_YEAR_USE, "-", END_MONTH_USE, "-", END_DAY_USE), "%Y-%m-%d")), + DIFF = case_when(END_MONTH_USE >= START_MONTH ~ END_FS - START_FS, + END_MONTH_USE < START_MONTH ~ START_FS - END_FS)) %>% + filter(N_seasons == 1) + +# Check fishing season for specific areas +chk <- mh_fs_ck2 %>% group_by(SECTOR_USE, SUBSECTOR_USE, ZONE_USE) %>% summarize(n = n()) + +# Recode fishing season records as fishing year if 365 days +fs_to_fy <- mh_fs_ck2 %>% ungroup() %>% + filter(abs(DIFF) %in% c(364, 365, 1)) #%>% + #select(REGULATION_ID) %>% pull() + +# Check for cases where there is a single fishing season and its less than 365 days +# These are cases where the inverse is then considered a closure +fs_lt365 <- mh_fs_ck2 %>% + filter(abs(DIFF) < 365, !REGULATION_ID %in% fs_to_fy) %>% + select(CLUSTER, REGULATION_ID, FR_CITATION, FR_URL, + REGION, ZONE_USE, COMMON_NAME_USE, SECTOR_USE, SUBSECTOR_USE, + START_DATE2, END_DATE2, START_FS, END_FS, DIFF) %>% + distinct() + +# Fishing season more than 365 days +# Only one regulation - Gulf red drum and that is how the FR is worded +fs_gt365 <- mh_fs_ck2 %>% + filter(abs(DIFF) > 365, !REGULATION_ID %in% fs_to_fy) %>% + select(CLUSTER, REGULATION_ID, FR_CITATION, FR_URL, + REGION, ZONE_USE, COMMON_NAME_USE, SECTOR_USE, SUBSECTOR_USE, + START_DATE2, END_DATE2, START_FS, END_FS, DIFF) %>% + distinct() +chk <- mh_data_log %>% filter(REGULATION_ID == 3486) + +# Fishing season missing diff days +# Some just have start fishing season +# For the red snapper fishing season, that means it ends at the end of the fishing year +# Others don't have fishing year and are missing key date fields because they are certain days of the week +# All of those are rec Caribbean Spiny Lobster in the Gulf and SATL +fs_nodiff <- mh_fs_ck2 %>% + filter(is.na(DIFF)) %>% + select(CLUSTER, REGULATION_ID, FR_CITATION, FR_URL, + REGION, ZONE_USE, COMMON_NAME_USE, SECTOR_USE, SUBSECTOR_USE, + EFFECTIVE_DATE, INEFFECTIVE_DATE, START_DATE2, END_DATE2, + START_DAY, START_DAY_USE, START_MONTH, START_TIME_USE, START_YEAR, START_DAY_OF_WEEK_USE, START_FS, + END_DAY, END_DAY_USE, END_MONTH, END_MONTH_USE, END_TIME, END_TIME_USE, END_YEAR, END_YEAR_USE, END_DAY_OF_WEEK_USE, END_FS, DIFF, + EFFECTIVE_DATE_FY_1, EFFECTIVE_DATE_FY_2, EFFECTIVE_DATE_FY_3, + FY_1, FY_2, FY_3) %>% + distinct() + +# Remove these FRs since already added to fishing year +mh_fs3 <- mh_fs2 %>% + filter(!REGULATION_ID %in% fs_to_fy) + +# Filter for species of interest +fs_spp <- mh_fs3 %>% + filter(COMMON_NAME_USE == spp, REGION == region) + +# Format diff --git a/ODM-MH-Analysis_ready/Closures/Closure_tests/SATL_Red_Porgy_closure_example.R b/ODM-MH-Analysis_ready/Closures/Closure_tests/SATL_Red_Porgy_closure_example.R new file mode 100644 index 0000000..2d7ec99 --- /dev/null +++ b/ODM-MH-Analysis_ready/Closures/Closure_tests/SATL_Red_Porgy_closure_example.R @@ -0,0 +1,104 @@ +# Process all regulations related to closures + +# Load packages #### +#install.packages("librarian") +librarian::shelf(here, tidyverse, lubridate, openxlsx, neatRanges, splitstackshape) + +# Read in MH Data Log +mh_data_log <- readRDS(here("ODM-MH-Data_log", "data", "results", "MH_DL_2024Feb08.RDS")) + +# Select species and region +spp <- 'PORGY, RED' +region <- 'SOUTH ATLANTIC' + +# Function to expand dates based on management status +source(here("ODM-MH-Analysis_ready", "func_expand_status.R")) + +# filter for species and region (all closure related records) +# Recode management types to have a value +mh_spp_closure <- mh_data_log %>% + filter(COMMON_NAME_USE == spp & REGION == region & + (MANAGEMENT_TYPE_USE %in% c('CLOSURE', 'FISHING SEASON', 'FISHING YEAR', 'PROHIBITED SPECIES') | + # Flag == NO means fishery wide prohibited sale and purchase (ie closure) + MANAGEMENT_TYPE_USE == 'PROHIBITED SALE AND PURCHASE' & FLAG == 'NO')) %>% + mutate(VALUE = case_when(MANAGEMENT_TYPE_USE %in% c('FISHING SEASON', 'FISHING YEAR') ~ 'OPEN', + MANAGEMENT_TYPE_USE %in% c('PROHIBITED SALE AND PURCHASE', 'PROHIBITED SPECIES') ~ 'CLOSE', + TRUE ~ VALUE)) %>% + arrange(SECTOR_USE, START_DATE2) + +unique(mh_spp_closure$MANAGEMENT_TYPE_USE) + +# Fishing Year +unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "FISHING YEAR"), MANAGEMENT_STATUS_USE)) +spp_year <- expand_status(mh_spp_closure, "FISHING YEAR") + +# Fishing Season - still needs some work if not entered consistently +unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "FISHING SEASON"), MANAGEMENT_STATUS_USE)) +spp_season <- expand_status(mh_spp_closure, "FISHING SEASON") + +# Closure +unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "CLOSURE"), MANAGEMENT_STATUS_USE)) +spp_closures <- expand_status(mh_spp_closure, "CLOSURE") + +# Prohibited sale and purchase +unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "PROHIBITED SALE AND PURCHASE"), MANAGEMENT_STATUS_USE)) +spp_prohibited_sale <- expand_status(mh_spp_closure, "PROHIBITED SALE AND PURCHASE") + +# Prohibited species +unique(select(filter(mh_spp_closure, MANAGEMENT_TYPE_USE == "PROHIBITED SPECIES"), MANAGEMENT_STATUS_USE)) +spp_prohibited_spp <- expand_status(mh_spp_closure, "PROHIBITED SPECIES") + +# Combine all management types that refer to closures +spp_closure_story <- spp_year %>% + rename(FR_CITATION_year = "FR_CITATION", + VALUE_year = "VALUE") %>% + select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_year, VALUE_year) %>% + full_join(spp_season %>% + rename(FR_CITATION_season = "FR_CITATION", + VALUE_season = "VALUE") %>% + select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_season, VALUE_season), + by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% + full_join(spp_closures %>% + rename(FR_CITATION_close = "FR_CITATION", + VALUE_close = "VALUE") %>% + select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_close, VALUE_close), + by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% + full_join(spp_prohibited_sale %>% + rename(FR_CITATION_sale = "FR_CITATION", + VALUE_sale = "VALUE") %>% + select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_sale, VALUE_sale), + by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% + full_join(spp_prohibited_spp %>% + rename(FR_CITATION_spp = "FR_CITATION", + VALUE_spp = "VALUE") %>% + select(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence, FR_CITATION_spp, VALUE_spp), + by = join_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, date_sequence)) %>% + arrange(SECTOR_USE, SUBSECTOR_USE, ZONE_USE, date_sequence) %>% + # Select the most recent FR CITATION + mutate(FR_CITATION = pmax(FR_CITATION_year, + FR_CITATION_season, + FR_CITATION_close, + FR_CITATION_sale, + FR_CITATION_spp, + na.rm = T)) %>% + # Select the fishery status (open/closed) that applies to the most recent FR + mutate(VALUE = case_when(FR_CITATION == FR_CITATION_close ~ VALUE_close, + FR_CITATION == FR_CITATION_sale ~ VALUE_sale, + FR_CITATION == FR_CITATION_spp ~ VALUE_spp, + FR_CITATION == FR_CITATION_season ~ VALUE_season, + FR_CITATION == FR_CITATION_year ~ VALUE_year)) + +summ_spp_closures <- spp_closure_story %>% + mutate(YEAR = year(date_sequence)) %>% + group_by(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR, FR_CITATION, VALUE) %>% + summarize(ndays = n(), + start = min(date_sequence), + end = max(date_sequence)) %>% + arrange(FMP, COMMON_NAME_USE, REGION, ZONE_USE, SECTOR_USE, SUBSECTOR_USE, YEAR, start) %>% + # Add back FR_URL for reference + left_join(distinct(select(filter(ungroup(mh_data_log), FMP == 'SNAPPER-GROUPER FISHERY OF THE SOUTH ATLANTIC REGION'), FR_CITATION, FR_URL)), + by = join_by(FR_CITATION)) + +# Save as Excel to compare to SEDAR MH file +write.xlsx(summ_spp_closures, "C:/Users/sarina.atkinson/Documents/Data/MH_closures/SA_RP_closures_08Feb24.xlsx") +