3 Methods

Workflows for the project have been classified into planning, fish passage assessments, habitat confirmation assessments, reporting and mapping. All components leveraged R, SQL or Python programming languages to facilitate workflow tracking, collaboration, transparency and continually improving research. Project workflows utilized local and remote postgreSQL databases as well as a “snapshot” of select datasets contained within a local sqlite database. A data and script repository to facilitate this reporting is located on Github.

source('R/packages.R')
source('R/tables.R')
# or the development version
# devtools::install_github("rstudio/bookdown")

3.1 Planning

Priorities for site assessment locations were provided by Canadian Wildlife Federation with some additional sites selected by field crews based on planning activities reported in 2021 (Irvine 2021), background literature review (Irvine 2016; VAST Resource Solutions Inc. 2013; Grainger 2011), fisheries information, PSCIS, bcfishpass (Norris [2020] 2021) outputs and field reconnaissance.


3.1.1 Habitat Modelling

bcfishpass is an open-source code repository that models aquatic connectivity based on a suite of hard coded (maximum stream slope downstream, PSCIS barrier information, dam locations and user defined parameters (gradient/width/discharge). Details of the general methodology can be found here and will be updated over time as the tools evolve. Once a development environment is properly setup, the software builds a local postgresql database through the utilization of other open-source tools such as bcdata (Norris [2016] 2021), bcfishobs (Norris [2018] 2021), and fwapg (Norris [2019] 2021) to provide connectivity models developed from analysis of the BC Freshwater Atlas, road layers, fisheries information, stream discharge estimates, measured/modeled estimates of channel width and numerous other standardized datasets downloaded directly from the BC Data Catalogue application programming interface using bcdata.


bcfishpass calculates the average gradient of BC Freshwater Atlas stream network lines at minimum 100m long intervals starting from the downstream end of the streamline segment and working upstream. The network lines are broken into max gradient categories with new segments created when the average slope of the stream line segment exceeds user provided thresholds. For this project, the user provided gradient thresholds used to delineate “potentially accessible habitat” were based on general stream morphology types (Table 3.1) and estimated max gradients that westslope cutthrout trout (22%) are likely to be capable of ascending. bcfishpass identifes natural barriers (ex. steep gradients for extended distances) and hydroelectric dams to classifying the accessibility upstream by fish (Norris [2020] 2021). On potentially accessible streams, scripts identify known barriers (ex. waterfalls >5m high) and additional anthropogenic features which are primarily road/railway stream crossings (i.e. culverts) that are potentially barriers. To prioritize these features for assessment or remediation, scripts report on how much modelled potentially accessible aquatic habitat the barriers may obstruct. The gradient based model can be refined with known fish observations as well as estimates of stream discharge and channel width to provide an indication of the quantity and quality of habitat potentially gained should fish passage be restored.

#to quantify upstream habitat potentially available for salmonids and facilitate stream line symbology based on stream morphology.
# while high gradient sections typically  present  upstream  migration  barriers  and  less  available  habitat.  Additionally, the size of the stream (indicated by channel width) is an important determinant for habitat suitability for different species as well as specific life stages of those species. 

# `bcfishpass` was used to categorize and sum potentially accessible stream segments in the study area watersheds within gradient and width categories for each stream segment. 
# (0 - 3%, 3 - 5%, 5 - 8%, 8 - 15%, 15 - 20%) with these outputs further amalgamated to summarize and symbolize potential upstream habitat in three categories: riffle/cascade (0 - 5%), step-pool (5 - 15%) and step-pool very steep (15-20%) (Table \@ref(tab:tablethreshaverage)).  


#threshold and average gradient table
table_thresh_average <- tibble::tibble(`Gradient` = c('0 - 3% and 3 - 5%', '5 - 8%', '8 - 15%', '15 - 22%', '>22%'),
                                       `Channel Type` = c('Riffle and cascade pool', 'Step pool', 'Step pool - very steep', 'Step pool - extremely steep', 'Non WCT habitat'))

table_thresh_average %>% 
    my_kable(caption_text = 'Stream gradient categories (threshold and average) and associated channel type.')
Table 3.1: Stream gradient categories (threshold and average) and associated channel type.
Gradient Channel Type
0 - 3% and 3 - 5% Riffle and cascade pool
5 - 8% Step pool
8 - 15% Step pool - very steep
15 - 22% Step pool - extremely steep
>22% Non WCT habitat


bcfishpass and associated tools have been designed to be flexible in analysis, accepting user defined gradient, channel width and stream discharge categories (MoE 2020e). Although currently in draft form, and subject to development revisions, Canadian Wildlife Federation assigned gradient and discharge thresholds for habitat with the highest intrinsic value for westslope cutthrout trout have been estimated and applied to model habitat upstream of stream crossing locations with thresholds estimated based on a literature review and professional opinion (Table 3.2). Results from modelling are presented for habitat confirmation sites in appendices using output parameters present in Table 3.3.


#`r if(identical(gitbook_on, FALSE)){knitr::asis_output("<br><br><br>")}`
# with references provided in Table \@ref(tab:tab-fish-spawning-rearing-references). 
# bcfishpass_spawn_rear_model imported in tables.R
bcfishpass_spawn_rear_model %>% 
  mutate(Species = fishbc::fbc_common_name(species_code), 
         spawn_gradient_max = round(spawn_gradient_max * 100 ,1),
         rear_gradient_max = round(rear_gradient_max * 100 ,1)) %>%
  select(Species, 
         `Spawning Gradient  Max (%)`= spawn_gradient_max,
         `Spawning Width Min (m)` = spawn_channel_width_min,
         # `Spawning Width Max (m)` = spawn_channel_width_max,
         `Spawning MAD Min (m3/s)` = spawn_mad_min,
         `Spawning MAD Max (m3/s)` = spawn_mad_max,
         `Rearing Gradient Max (%)` = rear_gradient_max,
         `Rearing MAD Min (m3/s)` = rear_mad_min,
         `Rearing MAD Max (m3/s)` = rear_mad_max) %>% 
         # `Rearing Wetland Multiplier` = rear_wetland_multiplier,
         # `Rearing Lake Multiplier` = rear_lake_multiplier) %>% 
  t() %>% 
  as_tibble(rownames = "row_names") %>% 
  janitor::row_to_names(row_number = 1) %>% 
  # rename(Variable = Species) %>% 
  select(Species, all_of(contains('Cutthroat'))) %>% 
  set_names(c('Variable', 'Value')) %>% 
  filter(!Variable %ilike% 'Width') %>% 
  my_kable(caption_text = 'Stream gradient and channel width thresholds used to model potentially highest value westslope cutthrout trout habitat.')
Table 3.2: Stream gradient and channel width thresholds used to model potentially highest value westslope cutthrout trout habitat.
Variable Value
Spawning Gradient Max (%) 5
Spawning MAD Min (m3/s) 0.050
Spawning MAD Max (m3/s) 76.00
Rearing Gradient Max (%) 7.0
Rearing MAD Min (m3/s) 0.02
Rearing MAD Max (m3/s) 30


xref_bcfishpass_names %>% 
  filter(id_side == 1) %>% 
  arrange(id_join) %>%  
  select(Attribute = report, Definition = column_comment) %>% 
  my_kable(caption_text = 'bcfishpass outputs and associated definitions')
Table 3.3: bcfishpass outputs and associated definitions
Attribute Definition
WCT Spawning (km) Length of stream upstream of point modelled as potential Westslope Cutthroat spawning habitat
WCT Rearing (km) Length of stream upstream of point modelled as potential Westslope Cutthroat rearing habitat
WCT Stream (km) Westslope Cuthroat Trout model, total length of streams and rivers potentially accessible upstream of point (does not include network connectors in lakes etc)
WCT Network (km) Westslope Cuthroat Trout model, total length of stream network potentially accessible upstream of point
WCT Lake Reservoir (ha) Westslope Cuthroat Trout model, total area lakes and reservoirs potentially accessible upstream of point
WCT Wetland (ha) Westslope Cuthroat Trout model, total area wetlands potentially accessible upstream of point
WCT Slopeclass03 Waterbodies (km) Westslope Cutthroat Trout model, length of stream connectors (in waterbodies) potentially accessible upstream of point with slope 0-3%
WCT Slopeclass03 (km) Westslope Cutthroat Trout model, length of stream potentially accessible upstream of point with slope 0-3%
WCT Slopeclass05 (km) Westslope Cutthroat Trout model, length of stream potentially accessible upstream of point with slope 3-5%
WCT Slopeclass08 (km) Westslope Cutthroat Trout model, length of stream potentially accessible upstream of point with slope 5-8%
WCT Slopeclass15 (km) Westslope Cutthroat Trout model, length of stream potentially accessible upstream of point with slope 8-15%
WCT Slopeclass22 (km) Westslope Cutthroat Trout model, length of stream potentially accessible upstream of point with slope 15-22%
# bcfishpass_spawn_rear_model_references <- readr::read_csv(file = 'data/width_modelling/model_spawning_rearing_habitat.csv')
bcfishpass_spawn_rear_model_references <- readr::read_csv(file = 'data/model_spawning_rearing_habitat_ref.csv') %>% 
  select(species_code, contains('ref'), -contains(c('multiplier','mad')))
  
bcfishpass_spawn_rear_model_references %>% 
  mutate(Species = fishbc::fbc_common_name(species_code)) %>% 
  select(Species, 
         `Spawning Gradient  Max (%)`= spawn_gradient_max_ref,
         `Spawning Width Min (m)` = spawn_channel_width_min_ref,
         # `Spawning Width Max (m)` = spawn_channel_width_max_ref,
         # `Spawning MAD Min (m3/s)` = spawn_mad_min,
         # `Spawning MAD Max (m3/s)` = spawn_mad_max,
         `Rearing Gradient Max (%)` = rear_gradient_max_ref) %>% 
         # `Rearing Wetland Multiplier` = rear_wetland_multiplier,
         # `Rearing Lake Multiplier` = rear_lake_multiplier) %>% 
         # `Rearing MAD Min (m3/s)` = rear_mad_min,
         # `Rearing MAD Max (m3/s)` = rear_mad_max) %>% 
  t() %>% 
  as_tibble(rownames = "row_names") %>% 
  janitor::row_to_names(row_number = 1) %>% 
  rename(Variable = Species) %>% 
  my_kable(caption_text = 'References for stream gradient and channel width thresholds used to model potentially highest value fish habitat. Preliminary and subject to revisions.')


3.2 Fish Passage Assessments

In the field, crossings prioritized for follow-up were first assessed for fish passage following the procedures outlined in “Field Assessment for Determining Fish Passage Status of Closed Bottomed Structures” (MoE 2011a). Crossings surveyed included closed bottom structures (CBS), open bottom structures (OBS) and crossings considered “other” (i.e. fords). Photos were taken at surveyed crossings and when possible included images of the road, crossing inlet, crossing outlet, crossing barrel, channel downstream and channel upstream of the crossing and any other relevant features. The following information was recorded for all surveyed crossings: date of inspection, crossing reference, crew member initials, Universal Transverse Mercator (UTM) coordinates, stream name, road name and kilometer, road tenure information, crossing type, crossing subtype, culvert diameter or span for OBS, culvert length or width for OBS. A more detailed “full assessment” was completed for all closed bottom structures and included the following parameters: presence/absence of continuous culvert embedment (yes/no), average depth of embedment, whether or not the culvert bed resembled the native stream bed, presence of and percentage backwatering, fill depth, outlet drop, outlet pool depth, inlet drop, culvert slope, average downstream channel width, stream slope, presence/absence of beaver activity, presence/absence of fish at time of survey, type of valley fill, and a habitat value rating. Habitat value ratings were based on channel morphology, flow characteristics (perennial, intermittent, ephemeral), fish migration patterns, the presence/absence of deep pools, un-embedded boulders, substrate, woody debris, undercut banks, aquatic vegetation and overhanging riparian vegetation (Table 3.4). For crossings determined to be potential barriers or barriers based on the data (see Barrier Scoring), a culvert fix and recommended diameter/span was proposed.


tab_habvalue %>% 
  knitr::kable(caption = 'Habitat value criteria (Fish Passage Technical Working Group, 2011).', booktabs = T) %>% 
    kableExtra::column_spec(column = 1, width_min = '1.5in') %>% 
    kableExtra::kable_styling(c("condensed"), full_width = T, font_size = font_set) 
Table 3.4: Habitat value criteria (Fish Passage Technical Working Group, 2011).
Habitat Value Fish Habitat Criteria
High The presence of high value spawning or rearing habitat (e.g., locations with abundance of suitably sized gravels, deep pools, undercut banks, or stable debris) which are critical to the fish population.
Medium Important migration corridor. Presence of suitable spawning habitat. Habitat with moderate rearing potential for the fish species present.
Low No suitable spawning habitat, and habitat with low rearing potential (e.g., locations without deep pools, undercut banks, or stable debris, and with little or no suitably sized spawning gravels for the fish species present).


3.2.1 Barrier Scoring

Fish passage potential was determined for each stream crossing identified as a closed bottom structure as per MoE (2011a). The combined scores from five criteria: depth and degree to which the structure is embedded, outlet drop, stream width ratio, culvert slope, and culvert length were used to screen whether each culvert was a likely barrier to some fish species and life stages (Table 3.5, Table 3.6. These criteria were developed based on data obtained from various studies and reflect an estimation for the passage of a juvenile salmon or small resident rainbow trout (Clarkin et al. 2005 ; Bell 1991; Thompson 2013).


tab <- as_tibble(t(tab_barrier_scoring)) %>% 
  mutate(V4 = names(tab_barrier_scoring)) %>% 
  select(V4, everything()) %>% 
  janitor::row_to_names(1) %>%  ##turn the table sideways
  mutate(Risk = case_when(Risk == 'Value' ~ '  Value',
                          T ~ Risk))

tab %>% 
  my_kable(caption_text = 'Fish Barrier Risk Assessment (MoE 2011).')
Table 3.5: Fish Barrier Risk Assessment (MoE 2011).
Risk LOW MOD HIGH
Embedded >30cm or >20% of diameter and continuous <30cm or 20% of diameter but continuous No embedment or discontinuous
Value 0 5 10
Outlet Drop (cm) <15 15-30 >30
Value 0 5 10
SWR <1.0 1.0-1.3 >1.3
Value 0 3 6
Slope (%) <1 1-3 >3
Value 0 5 10
Length (m) <15 15-30 >30
Value 0 3 6


tab_barrier_result %>% 
  my_kable(caption_text = 'Fish Barrier Scoring Results (MoE 2011).') 
Table 3.6: Fish Barrier Scoring Results (MoE 2011).
Cumlative Score Result
0-14 passable
15-19 potential barrier
>20 barrier


3.2.2 Cost Benefit Analysis

A cost benefit analysis was conducted for each crossing determined to be a barrier based on an estimate of cost associated with remediation or replacement of the crossing with a structure that facilitates fish passage and estimates of the linear length and area of potential habitat that would be made available by remediation of fish passage at the site (habitat gain index).


3.2.2.1 Habitat Gain Index

The habitat gain index is the quantity of modeled habitat upstream of the subject crossing and represents an estimate of habitat gained with remediation of fish passage at the crossing. For this project, a gradient threshold between accessible and non-accessible habitat was set at 20% (for a minimum length of 100m) to represent the maximum gradient of which the strongest swimmers of westslope cutthrout trout are likely to be able to migrate upstream.


For reporting of Phase 1 - fish passage assessments within the body of this report (Table 3.5), a “total” value of habitat <20% output from bcfishpass was used to estimate the amount of habitat upstream of each crossing less than 20% gradient before a falls of height >5m - as recorded in MoE (2020c) or documented in other bcfishpass online documentation. To generate areas of habitat upstream, the estimated linear length was multiplied by the downstream channel width measured as part of the fish passage assessment protocol. Although these estimates are not generally conservative, have low accuracy and do not account for upstream stream crossing structures they do allow a rough screening to help facilitate the decision making process for selecting the best candidates for follow up with more detailed Phase 2 assessments.


For Phase 2 - habitat confirmation sites, conservative estimates of the linear quantity of habitat suitable for rearing and spawning of westslope cutthrout trout to be potentially gained by fish passage restoration, mainstem and large tributary streams (>1st order streams) segments upstream of each crossing with freshwater atlas stream layer gradients <8% and modelled at >2m wide (likely of highest value for rearing and spawning westslope cutthrout trout), below natural/manmade barriers and downstream of documented culvert barriers were measured by hand with the measure tool within QGIS (QGIS Development Team 2009). To generate estimates of the area of habitat upstream of these sites, the length of habitat was multiplied by the upstream average channel width that was measured in the field.


Potential options to remediate fish passage were selected from MoE (2011a) and included:

  • Removal (RM) - Complete removal of the structure and deactivation of the road.
  • Open Bottom Structure (OBS) - Replacement of the culvert with a bridge or other open bottom structure. For this project we considered bridges as the only viable option for OBS type based on consultation with FLNR road crossing engineering experts.
  • Streambed Simulation (SS) - Replacement of the structure with a streambed simulation design culvert. Often achieved by embedding the culvert by 40% or more. Based on consultation with FLNR engineering experts, we considered crossings on streams with a channel width of <2m and a stream gradient of <8% as candidates for replacement with streambed simulations.
  • Additional Substrate Material (EM) - Add additional substrate to the culvert and/or downstream weir to embed culvert and reduce overall velocity/turbulence. This option was considered only when outlet drop = 0, culvert slope <1.0% and stream width ratio < 1.0.
  • Backwater (BW) - Backwatering of the structure to reduce velocity and turbulence. This option was considered only when outlet drop < 0.3m, culvert slope <2.0%, stream width ratio < 1.2 and stream profiling indicates it would be effective.


Cost estimates for structure replacement with bridges and embedded culverts were generated based on the channel width, slope of the culvert, depth of fill, road class and road surface type. Road details were sourced from FLNRORD (2020c) and FLNRORD (2020a) through bcfishpass. Interviews with Phil MacDonald, Engineering Specialist FLNR - Kootenay, Steve Page, Area Engineer - FLNR - Northern Engineering Group and Matt Hawkins - MoTi - Design Supervisor for Highway Design and Survey - Nelson, David Maloney - FLNR - Fish Passage Technical Working Group were utilized to help refine estimates.


Base costs for installation of bridges on forest service roads and permit roads with surfaces specified in provincial GIS road layers as rough and loose was roughly estimated at $20,000/linear m and assumed that the road could be closed during construction. For streams with channel widths <2m, embedded culverts were reported as an effective solution with total installation costs roughly estimated at $40k/crossing so as to take into account the rising costs of materials and labour since the original estimate of $25k/crossing was communicated in early 2021 (pers. comm. Phil MacDonald, Steve Page). For larger streams (>6m), estimates of bridge span width increased proportionally to the size of the stream (ex. for an 8m wide stream a 14m wide span was estimated vs. the 12m wide span estimated for a 6m wide stream). For crossings with large amounts of fill (>3m), the replacement bridge span was increased by an additional 3m for each 1m of fill >3m to account for cutslopes to the stream at a 1.5:1 ratio. To account for road type, a multiplier table was also generated to estimate incremental cost increases with dollar amounts estimated for structure replacement on paved surfaces, railways and arterial/highways up to 30 times more than forest service roads due to expenses associated with design/engineering requirements, traffic control and paving. The cost multiplier table (Table 3.7) should be considered very approximate with refinement recommended for future projects.


# print_tab_cost_mult(caption_text = 'Cost multiplier table based on road class and surface type.')
tab_cost_rd_mult_report %>%
  my_kable(caption_text = 'Cost multiplier table based on road class and surface type.')
Table 3.7: Cost multiplier table based on road class and surface type.
Class Surface Class Multiplier Surface Multiplier Bridge $K/10m Streambed Simulation $K
Forest Service Road Loose 1 1 200 40
Recreation Loose 1 1 200 40
Resource Rough 1 1 200 40
Resource Loose 1 1 200 40
Road Permit Loose 1 1 200 40
Unclassified Rough 1 1 200 40
Unclassified Loose 1 1 200 40
Resource Paved 1 2 400 80
Unclassified Overgrown 1 2 400 80
Unclassified Paved 1 2 400 80
Unclassified Unknown 1 2 400 80
Local Paved 4 2 1600 320
Arterial Paved 15 2 6000 1200
Highway Paved 15 2 6000 1200
Rail Rail 15 2 6000 1200


3.3 Habitat Confirmation Assessments

Following fish passage assessments, habitat confirmations were completed in accordance with procedures outlined in the document “A Checklist for Fish Habitat Confirmation Prior to the Rehabilitation of a Stream Crossing” (Fish Passage Technical Working Group 2011). The main objective of the field surveys was to document upstream habitat quantity and quality as well as to determine if any other obstructions exist above or below the crossing. Habitat value was assessed based on channel morphology, flow characteristics (perennial, intermittent, ephemeral), the presence/absence of deep pools, un-embedded boulders, substrate, woody debris, undercut banks, aquatic vegetation and overhanging riparian vegetation. Criteria used to rank habitat value was based on guidelines in Fish Passage Technical Working Group (2011) (Table 3.4).


During habitat confirmations, to standardize data collected and facilitate submission of the data to provincial databases, information was collated on “Site Cards”. Habitat characteristics recorded included channel widths, wetted widths, residual pool depths, gradients, bankfull depths, stage, temperature, conductivity, pH, cover by type, substrate and channel morphology (among others). When possible, the crew surveyed downstream of the crossing to the point where fish presence had been previously confirmed and upstream to a minimum distance of 600m. Any potential obstacles to fish passage were inventoried with photos, physical descriptions and locations recorded on site cards. Surveyed routes were recorded with time-signatures on handheld GPS units.


3.4 Reporting

Reporting was generated with bookdown (Xie 2016) from Rmarkdown (Allaire et al. 2022) with primarily R (R Core Team 2020) and SQL scripts. In addition to numerous spatial layers sourced through the BC Data Catalogue then stored and queried in local postgresql and sqlite databases. Raw data inputs for this project included:

3.5 Mapping

Mapping was completed by Hillcrest Geographics. pdf maps were generated using QGIS with data supplied via a postgreSQL database. A QGIS layer file defining and symbolizing all layers required for general fish passage mapping has been developed and at the time of reporting was kept under version control within bcfishpass.