# Supplementary Information - Online Resource 8
# The script used to calculate foraging range areas and create the foraging 
# range maps found in Fig 4. and ESM_1

# Visitation rate, but not foraging range, responds to brood size 
# manipulation in an aerial insectivore 

# Sage A. Madden, Molly T. McDermott, Rebecca J. Safran

# Journal: Behavioral Ecology and Sociobiology

# Affiliations:
# SAM, MTM, RJS: Department of Ecology and Evolutionary Biology, 
# University of Colorado Boulder, Boulder, CO, USA

# SAM: Department of Evolution and Ecology, 
# University of California Davis, Davis, CA, USA


# To whom correspondence should be addressed: Sage A. Madden, University of California Davis, Department of Evolution and Ecology, One Shields Avenue, 2320 Storer Hall, Davis, CA 95616 
# Email: saamadden@ucdavis.edu	
# Phone: 1+(720)-879-4053


###### Barn swallow BSM paper visualizations
###### Created: Fall 2020
###### Last modified: July 24, 2022

# This script contains the code necessary to calculate the foraging
# range areas described in the paper named above and to create
# the visualizations of foraging range areas found in the paper (figure 4)
# and supplementary information (figures S1 and S2)

# Load libraries
library(dplyr)
library(tidyr)
library(sp)
library(rgdal)
library(adehabitatHR)
library(ggsn)
library(ggspatial)
library(ggmap)
library(ggplot2)
library(ggpubr)

# Read in data
GPS_joined <- read.csv("ESM_5.csv")

# Remove Hoops 16 (Male tagged instead of female)
GPS_joined <- filter(GPS_joined, band != "2850-57510")


## Foraging range size calculations
# We need to calculate foraging range areas for before and after the manipulation
# (two ranges) rather than for each day because there are not enough fix points
# to create daily ranges for each bird

# Create a column for before vs. after manipulation
for(i in 1:length(GPS_joined$band)){
  if(GPS_joined$chick_age[i] == 7 | GPS_joined$chick_age[i] == 8){
    GPS_joined$treatment[i] <- "PM"
  } 
  else if(GPS_joined$bsm[i] == "E"){
    GPS_joined$treatment[i] <- "E"
  } 
  else{
    GPS_joined$treatment[i] <- "R"
  }
}

GPS_joined$treatment <- factor(GPS_joined$treatment, levels = c("PM", "E", "R"))

# Create an ID for each bird before and after manipulation (two IDs per bird)
GPS_joined$band_time <- paste(GPS_joined$band, format(GPS_joined$treatment), 
                               sep = "_")

# Select only relevant columns
GPS_joined <- dplyr::select(GPS_joined, band_time, site, nest, gps_date, 
                             Latitude, Longitude, bsm)

# Remove rows with NAs because otherwise the MCP function won't work
GPS_joined <- GPS_joined[!is.na(GPS_joined$Latitude) & 
                             !is.na(GPS_joined$Longitude),]

# Filter to create separate data frames for enlarged and reduced -- this is 
# so I can plot them separately
reduced <- filter(GPS_joined, bsm == "R")
enlarged <- filter(GPS_joined, bsm == "E")

# Create a dataframe with info for only one site (used for plotting)
GPS_joinedF <- filter(GPS_joined, site == "Folsom" | site == "Mapleton")

# Create separate data frames for enlarged and reduced 
GPS_joinedFE <- filter(GPS_joinedF, bsm == "E")
GPS_joinedFR <- filter(GPS_joinedF, bsm == "R")

# Only include ID and coordinates (MCP can't take any other info)
GPS_joined <- dplyr::select(GPS_joined, band_time, Latitude, Longitude)

GPS_joinedF <- dplyr::select(GPS_joinedF, band_time, Latitude, Longitude)
GPS_joinedFE <- dplyr::select(GPS_joinedFE, band_time, Latitude, Longitude)
GPS_joinedFR <- dplyr::select(GPS_joinedFR, band_time, Latitude, Longitude)

reduced <- dplyr::select(reduced, band_time, Latitude, Longitude)
enlarged <- dplyr::select(enlarged, band_time, Latitude, Longitude)


##### Folsom only map (only one study site) #####

# Create spatial points data frame by defining coordinates
GPS_joinedF <- data.frame(GPS_joinedF)
GPS_joinedFE <- data.frame(GPS_joinedFE)
GPS_joinedFR <- data.frame(GPS_joinedFR)

# Indicate which columns give my coordinates
coordinates(GPS_joinedF) <- c("Longitude", "Latitude")
coordinates(GPS_joinedFE) <- c("Longitude", "Latitude")
coordinates(GPS_joinedFR) <- c("Longitude", "Latitude")

# Indicate what format the coordinates are in
proj4string(GPS_joinedF) <- CRS("+init=epsg:4326 +proj=longlat +ellps=WGS84
+datum=WGS84")
proj4string(GPS_joinedFE) <- CRS("+init=epsg:4326 +proj=longlat +ellps=WGS84
+datum=WGS84")
proj4string(GPS_joinedFR) <- CRS("+init=epsg:4326 +proj=longlat +ellps=WGS84
+datum=WGS84")

# Transform to easting and northing coordinates
gpsENF <- spTransform(GPS_joinedF, CRS("+init=epsg:32613 +proj=utm +zone=13 +units=m ellps=WGS84"))
gpsENFE <- spTransform(GPS_joinedFE, CRS("+init=epsg:32613 +proj=utm +zone=13 +units=m ellps=WGS84"))
gpsENFR <- spTransform(GPS_joinedFR, CRS("+init=epsg:32613 +proj=utm +zone=13 +units=m ellps=WGS84"))

# Calculate MCPs for each ID (each bird)

# Percent defines what percentage of points you want to keep; unout defines what
# units you want the output to be in. I've selected meters squared
GPS_joinedMCPsF <- mcp(GPS_joinedF, percent = 100) 
GPS_joinedMCPsFE <- mcp(GPS_joinedFE, percent = 100) 
GPS_joinedMCPsFR <- mcp(GPS_joinedFR, percent = 100) 

gpsMCPsF <- mcp(gpsENF, percent = 100, unout = "m2")
gpsMCPsFE <- mcp(gpsENFE, percent = 100, unout = "m2")
gpsMCPsFR <- mcp(gpsENFR, percent = 100, unout = "m2")

# Create dataframe with ID and 100% foraging range areas
forranges100F <- cbind(gpsMCPsF$id, gpsMCPsF$area)
colnames(forranges100F) <- c("band_time", "foraging_area100_BC")
forranges100F <- data.frame(forranges100F)

forranges100FE <- cbind(gpsMCPsFE$id, gpsMCPsFE$area)
colnames(forranges100FE) <- c("band_time", "foraging_area100_BC")
forranges100FE <- data.frame(forranges100FE)

forranges100FE <- cbind(gpsMCPsFE$id, gpsMCPsFE$area)
colnames(forranges100FE) <- c("band_time", "foraging_area100_BC")
forranges100F <- data.frame(forranges100FE)

# Stamen map as base for plotting foraging ranges, including
# coordinates appropriate for foraging ranges of this one study site
mybasemapF <- get_stamenmap(bbox = c(left = min(GPS_joinedF@coords[,1])-0.005, 
                                     bottom = min(GPS_joinedF@coords[,2])-0.005, 
                                     right = max(GPS_joinedF@coords[,1])+0.005, 
                                     top = max(GPS_joinedF@coords[,2])+0.005), 
                            zoom = 14, color = "bw")

# Turn the spatial data frame of points into just an R data frame for 
# plotting in ggmap
GPS_joineddfF <- data.frame(GPS_joinedF@coords, 
                            id = GPS_joinedF@data$band_time)
GPS_joineddfFE <- data.frame(GPS_joinedFE@coords, 
                             id = GPS_joinedFE@data$band_time)
GPS_joineddfFR <- data.frame(GPS_joinedFR@coords, 
                             id = GPS_joinedFR@data$band_time)


# Create the map with foraging range polygons
GPS_joineddfF$id2 <- GPS_joineddfF$id
GPS_joineddfFE$id2 <- GPS_joineddfFE$id
GPS_joineddfFR$id2 <- GPS_joineddfFR$id

GPS_joineddfF <- separate(GPS_joineddfF, col = id2, into = c("band", "time"),
                          sep = "_")
GPS_joineddfF$time <- factor(GPS_joineddfF$time, levels = c("PM", "E ", "R "))

GPS_joineddfFE <- separate(GPS_joineddfFE, col = id2, into = c("band", "time"),
                           sep = "_")
GPS_joineddfFE$time <- factor(GPS_joineddfFE$time, levels = c("PM", "E "))

GPS_joineddfFR <- separate(GPS_joineddfFR, col = id2, into = c("band", "time"),
                           sep = "_")
GPS_joineddfFR$time <- factor(GPS_joineddfFR$time, levels = c("PM", "R "))
str(GPS_joinedMCPsF)

GPStestF <- fortify(GPS_joinedMCPsF)
GPStestF$id2 <- GPStestF$id
GPStestF <- separate(GPStestF, col = id2, into = c("band", "time"),
                     sep = "_")
GPStestF$time <- factor(GPStestF$time, levels = c("PM", "E ", "R "))

GPStestFE <- fortify(GPS_joinedMCPsFE)
GPStestFE$id2 <- GPStestFE$id
GPStestFE <- separate(GPStestFE, col = id2, into = c("band", "time"),
                      sep = "_")
GPStestFE$time <- factor(GPStestFE$time, levels = c("PM", "E "))

GPStestFR <- fortify(GPS_joinedMCPsFR)
GPStestFR$id2 <- GPStestFR$id
GPStestFR <- separate(GPStestFR, col = id2, into = c("band", "time"),
                      sep = "_")
GPStestFR$time <- factor(GPStestFR$time, levels = c("PM", "R "))


mymap.FE <- ggmap(mybasemapF) + 
  geom_polygon(data = GPStestFE,  
               # Polygon layer needs to be "fortified" to add geometry to the dataframe
               aes(long, lat, color = band, linetype = time),
               alpha = 0, size = 1, fill = "white") +
  geom_point(data = GPS_joineddfFE, 
             aes(x = Longitude, y = Latitude, color = band, shape = time), size = 1.5) +
  scalebar(x.min = -105.15, x.max = -105.18,
           y.min = 40.015, y.max = 40.03,
           dist = 1, dist_unit = "km",
           transform = TRUE, model = "WGS84", 
           st.dist = 0.15, height = 0.1, st.size = 4) +
  scale_shape_manual(values = c(16, 17)) +
  scale_color_manual(values = c("#3CBB75FF", "#287D8EFF", "#453781FF")) + 
  scale_linetype_manual(values = c("solid", "twodash")) +
  labs(x = "Longitude", y = "Latitude", color = "Band", shape = "Time", linetype = "Time") +
  theme(axis.text = element_text(size = 11), axis.title = element_text(size = 11), 
        legend.text = element_text(size = 11), legend.title = element_text(size = 11),
        legend.key.width = unit(1.5, "cm")) + 
  guides(color = guide_legend(order = 1),
         shape = guide_legend(order = 2), 
         linetype = guide_legend(order = 2))
mymap.FE

mymap.FR <- ggmap(mybasemapF) + 
  geom_polygon(data = GPStestFR,  
               # Polygon layer needs to be "fortified" to add geometry to the dataframe
               aes(long, lat, color = band, linetype = time),
               alpha = 0, size = 1, fill = "black") +
  geom_point(data = GPS_joineddfFR, 
             aes(x = Longitude, y = Latitude, color = band, shape = time), size = 1.5) +
  scalebar(x.min = -105.15, x.max = -105.18,
           y.min = 40.015, y.max = 40.03,
           dist = 1, dist_unit = "km",
           transform = TRUE, model = "WGS84", 
           st.dist = 0.15, height = 0.1, st.size = 4) +
  scale_shape_manual(values = c(16, 17)) +
  scale_color_manual(values = c("#1F968BFF", "#39568CFF", "#440154FF")) + 
  scale_linetype_manual(values = c("solid", "twodash" )) +
  labs(x = "Longitude", y = "Latitude", color = "Band", shape = "Time", 
       linetype = "Time") +
  theme(axis.text = element_text(size = 11), axis.title = element_text(size = 11), 
        legend.text = element_text(size = 11), legend.title = element_text(size = 11), 
        legend.key.width = unit(1.5, "cm")) + 
  guides(color = guide_legend(order = 1),
         shape = guide_legend(order = 2), 
         linetype = guide_legend(order = 2))
mymap.FR


combined_folsom <- ggarrange(mymap.FE, mymap.FR, ncol = 1, nrow = 2, labels = c("a", "b"),
          legend = "right", vjust = 1, font.label = list(size = 11))

ggsave(filename = "BES_folsom_ranges.png", plot = combined_folsom, 
       width = 174, height = 174, units = "mm", dpi = 1200)


##### All enlarged and reduced birds (all study sites) #####

# Create spatial points data frame by defining coordinates)
enlarged <- data.frame(enlarged)
reduced <- data.frame(reduced)
GPS_joined <- data.frame(GPS_joined)
# Indicate which columns give my coordinates
coordinates(enlarged) <- c("Longitude", "Latitude")
coordinates(reduced) <- c("Longitude", "Latitude")
coordinates(GPS_joined) <- c("Longitude", "Latitude")
# Indicate what format the coordinates are in
proj4string(enlarged) <- CRS("+init=epsg:4326 +proj=longlat +ellps=WGS84
+datum=WGS84")
proj4string(reduced) <- CRS("+init=epsg:4326 +proj=longlat +ellps=WGS84
+datum=WGS84")
proj4string(GPS_joined) <- CRS("+init=epsg:4326 +proj=longlat +ellps=WGS84
+datum=WGS84")
# Transform to easting and northing coordinates
gpsENE <- spTransform(enlarged, CRS("+init=epsg:32613 +proj=utm +zone=13 +units=m ellps=WGS84"))
gpsENR <- spTransform(reduced, CRS("+init=epsg:32613 +proj=utm +zone=13 +units=m ellps=WGS84"))
gpsENA <- spTransform(reduced, CRS("+init=epsg:32613 +proj=utm +zone=13 +units=m ellps=WGS84"))

# Calculate MCPs for each ID (each bird)
# Percent defines what percentage of points you want to keep; unout defines what
# units you want the output to be in. I've selected meters squared
GPS_joinedMCPsE <- mcp(enlarged, percent = 100) 
GPS_joinedMCPsR <- mcp(reduced, percent = 100) 
GPS_joinedMCPsA <- mcp(GPS_joined, percent = 100) 

gpsMCPsE <- mcp(gpsENE, percent = 100, unout = "m2")
gpsMCPsR <- mcp(gpsENR, percent = 100, unout = "m2")
gpsMCPsA <- mcp(gpsENA, percent = 100, unout = "m2")



forranges100E <- cbind(gpsMCPsE$id, gpsMCPsE$area)
colnames(forranges100E) <- c("band_time", "foraging_area100_BC")
forranges100E <- data.frame(forranges100E)

forranges100R <- cbind(gpsMCPsR$id, gpsMCPsR$area)
colnames(forranges100R) <- c("band_time", "foraging_area100_BC")
forranges100R <- data.frame(forranges100R)

forranges100A <- cbind(gpsMCPsA$id, gpsMCPsA$area)
colnames(forranges100A) <- c("band_time", "foraging_area100_BC")
forranges100A <- data.frame(forranges100A)


# Stamen map, this time with coordinates encompassing foraging ranges
# at all sites
mybasemapAll <- get_stamenmap(bbox = c(left = min(GPS_joined@coords[,1])-0.005, 
                                     bottom = min(GPS_joined@coords[,2])-0.005, 
                                     right = max(GPS_joined@coords[,1])+0.005, 
                                     top = max(GPS_joined@coords[,2])+0.005), 
                            zoom = 14, color = "bw")

# Turn the spatial data frame of points into just an R data frame for plotting in ggmap
GPS_joineddfE <- data.frame(enlarged@coords, 
                             id = enlarged@data$band_time)
GPS_joineddfR <- data.frame(reduced@coords, 
                             id = reduced@data$band_time)


# Create the map with foraging range polygons
GPS_joineddfE$id2 <- GPS_joineddfE$id
GPS_joineddfR$id2 <- GPS_joineddfR$id

GPS_joineddfE <- separate(GPS_joineddfE, col = id2, into = c("band", "time"),
                           sep = "_")
GPS_joineddfE$time <- factor(GPS_joineddfE$time, levels = c("PM", "E "))
GPS_joineddfR <- separate(GPS_joineddfR, col = id2, into = c("band", "time"),
                           sep = "_")
GPS_joineddfR$time <- factor(GPS_joineddfR$time, levels = c("PM", "R "))

GPStestE <- fortify(GPS_joinedMCPsE)
GPStestE$id2 <- GPStestE$id
GPStestE <- separate(GPStestE, col = id2, into = c("band", "time"),
                      sep = "_")
GPStestE$time <- factor(GPStestE$time, levels = c("PM", "E "))
GPStestR <- fortify(GPS_joinedMCPsR)
GPStestR$id2 <- GPStestR$id
GPStestR <- separate(GPStestR, col = id2, into = c("band", "time"),
                      sep = "_")
GPStestR$time <- factor(GPStestR$time, levels = c("PM", "R "))


mymap.E <- ggmap(mybasemapAll) + 
  geom_polygon(data = GPStestE,  
               # Polygon layer needs to be "fortified" to add geometry to the dataframe
               aes(long, lat, color = band, linetype = time),
               alpha = 0, size = 1, fill = "white") +
  geom_point(data = GPS_joineddfE, 
             aes(x = Longitude, y = Latitude, color = band, shape = time), size = 1.5) +
  scalebar(x.min = -105.15, x.max = -105.18,
           y.min = 40.015, y.max = 40.03,
           dist = 1, dist_unit = "km",
           transform = TRUE, model = "WGS84",
           st.dist = 0.15, height = 0.1, st.size = 4) +
  scale_shape_manual(values = c(16, 17)) +
  scale_color_manual(values = c("#440154FF", "#B8DE29FF", "#29AF7FFF", "#482677FF", 
                                "#287D8EFF", "#95D840FF", "#1F968BFF", "#33638DFF", 
                                "#55C667FF", "#404788FF")) + 
  scale_linetype_manual(values = c("solid", "twodash")) +
  labs(x = "Longitude", y = "Latitude", color = "Band", shape = "Time", linetype = "Time") +
  theme(axis.text = element_text(size = 11), axis.title = element_text(size = 11), 
        legend.text = element_text(size = 11), legend.title = element_text(size = 11),
        legend.key.width = unit(1.5, "cm")) + 
  guides(color = guide_legend(order = 1),
         shape = guide_legend(order = 2), 
         linetype = guide_legend(order = 2))
mymap.E

ggsave(filename = "BES_all-enlarged_ranges.tiff", plot = mymap.E, 
       width = 174, height = 130, units = "mm", dpi = 600)

mymap.R <- ggmap(mybasemapAll) + 
  geom_polygon(data = GPStestR,  
               # Polygon layer needs to be "fortified" to add geometry to the dataframe
               aes(long, lat, color = band, linetype = time),
               alpha = 0, size = 1, fill = "black") +
  geom_point(data = GPS_joineddfR, 
             aes(x = Longitude, y = Latitude, color = band, shape = time), size = 1.5) +
  scalebar(x.min = -105.15, x.max = -105.18,
           y.min = 40.015, y.max = 40.03,
           dist = 1, dist_unit = "km",
           transform = TRUE, model = "WGS84",
           st.dist = 0.15, height = 0.1, st.size = 4) +
  scale_shape_manual(values = c(16, 17)) +
  scale_color_manual(values = c("#440154FF", "#B8DE29FF", "#29AF7FFF", "#482677FF", 
                                "#287D8EFF", "#95D840FF", "#1F968BFF", "#33638DFF", 
                                "#55C667FF", "#404788FF")) + 
  scale_linetype_manual(values = c("solid", "twodash" )) +
  labs(x = "Longitude", y = "Latitude", color = "Band", shape = "Time", 
       linetype = "Time") +
  theme(axis.text = element_text(size = 11), axis.title = element_text(size = 11), 
        legend.text = element_text(size = 11), legend.title = element_text(size = 11), 
        legend.key.width = unit(1.5, "cm")) + 
  guides(color = guide_legend(order = 1),
         shape = guide_legend(order = 2), 
         linetype = guide_legend(order = 2))
mymap.R

ggsave(filename = "BES_all-reduced_ranges.png", plot = mymap.R, 
       width = 174, height = 130, units = "mm", dpi = 1200)

allsites_combined <- ggarrange(mymap.E, mymap.R, ncol = 1, nrow = 2, labels = c("A", "B"),
          legend = "right", vjust = 2)



