Furlan et al. A Framework for Estimating eDNA Sensitivity
Supporting Information
Appendix S1. Marker development and eDNA laboratory methods
Marker development for eDNA detection
DNA was extracted from tissue samples of the Oriental weatherloach (Misgurnus anguillicaudatus) using the Isolate II Genomic DNA Kit (Bioline Australia), and a region of the 12S rRNA gene approximately 390 bp in length was PCR amplified between vertebrate universal PCR primers MT 1091L (5’-CAAACTGGGATTAGATACCCCACTAT-3’) and MT 1478H (5’-TGACTGCAGAGGGTGACGGGCGGTGTGT-3’) (Fuller et al. 1998). PCR of DNA from tissue samples was performed in an EppendorfMastercycler (Eppendorf, Hamburg, Germany) using 2.5 µL of DNA, 1X PCR buffer (5-Prime), 2.0mMdNTP, 0.5 units Taq polymerase (5-Prime), 0.4 µM forward primer and 0.4 µM reverse primer (total volume 25 µL). PCR cycling conditions consisted of an initial denaturation step at 94˚C (2 min) followed by 40 cycles of 94˚C (30 s), primer annealing at 55˚C (1 min) and extension at 72˚C (30 s), with a final extension at 72˚C (10 min). PCR products were sent to Macrogen Inc. (Seoul, Korea) for forward and reverse sequencing on an AB 3730xl DNA Analyzer using primers MT 1091L and MT 1478H.
Sequence reads obtained from M. anguillicaudatus tissue samples were imported into BioEdit(Hall 1999) and compared to all available 12S rRNA sequences of M. anguillicaudatusavailable on NCBI’sGenBank, all fish species from the Murray-Darling River Basin (an area encompassing >1 million km2 of southeastern Australia including all of the Australian Capital Territory; Hardy et al. 2011) and any additional closely related species that could potentially co-occur in Australia. Sequences were aligned using the clustal w algorithm. Species-specific qPCR primers and probes were designed to maximise the number of base pair mismatches between the target species and all other species that could potentially co-occur in Australia.Secondary structure was checked on Beacon DesignerTM (PremierBiosoft) and found to have ΔG within the tolerable range for all dimers. The primer/probe assaywas further tested for specificity by pairwise alignment against the nucleotide collection database on BLASTn(Altschul et al. 1990).
Estimating marker specificity, efficiency and LOD
Real-time PCRs (qPCRs) were performed to test the specificity of the primer/probe assay. qPCRs were carried out on known tissue samples (Table S2) in 20 µl reactions consisting of 10 µl TaqMan® Environmental Master Mix 2.0 (Applied Biosystems®), 1X qPCR marker assay mix, 1X TaqMan® Exogenous Internal Positive Control (IPC) Mix (Applied Biosystems®), 1X IPC DNA, 2 µl of DNA and made up to 20 µl with DNase/RNase free water (Bioline, MA USA). Thermal cycling was conducted on a ViiaTM 7 Real-Time PCR System (Applied Biosystems®, Vic., Australia) with cycling conditions set at 50°C (2min), 95°C (10 min), followed by 55 cycles of 95°C (15 s), 60°C (30 s).
Synthetic oligonucleotides of the target sequence were designed with a modification to include a single Uracil residue mid-sequence (Table S1), allowing the oligonucleotide to be inactivated by Uracil-DNA Glycosylase to prevent carry-over contamination. Oligonucleotides were diluted by a factor of 10 into solutions containing between 1,000,000 and 0.01 single-stranded copies/µL. PCR replicates were performed using 2µL of each template to obtain concentrations corresponding to double-stranded DNA. Calibration curves were generated from eleven replicate PCRs of known oligonucleotide concentrations between 1,000,000 and 100 copies/µL. Oligonucleotides were further diluted to 50, 40, 30, 20, 10 and 1 copies/µL to test the LOD of the assay. Synthetic oligonucleotides were amplified using qPCR in 20 µl reactions as detailed above.
Environmental DNA laboratory methods
Water samples were filtered in the laboratory through 1.2 µm pores on 47 mm glass fiber filters (MS® GC 50, MicroScience) using a magnetic filter funnel (Pall Australia Pty Ltd) and Geopump Series II peristaltic pump (Geotech, Colorado, USA). The filter paper was rolled using sterile forceps, placed in a 5 mL tube and stored at -20°C. Between samples, magnetic filter funnels and forceps were sterilised in 10% bleach solution and thoroughly rinsed in UV-sterilised water.
To confirm amplification of the target species, forty-five percent of all positively amplified PCR products were purified using the MinElute PCR Purification Kit (Qiagen Pty Ltd, Vic., Australia) and sequenced on an AB 3730xl DNA Analyzer (at the ACRFBiomolecular Resource Facility, The John Curtin School of Medical Research, Australian National University).
References
Altschul SF, Gish W, Miller W, Myers EW, Lipman DJ (1990) Basic local alignment search tool. Journal of Molecular Biology215, 403-410.
Fuller S, Baverstock P, King D (1998) Biogeographic origins of goannas (Varanidae): a molecular perspective. Molecular Phylogenetics and Evolution9, 294-307.
Hall TA (1999) BioEdit: a user-friendly biological sequence alignment editor and analysis, Department of Microbiology. North Carolina State University.
Hardy CM, Adams M, Jerry DR, et al. (2011) DNA barcoding to support conservation: species identification, genetic structure and biogeography of fishes in the Murray-Darling River Basin, Australia. Marine and Freshwater Research62, 887-901.
Furlan et al. A Framework for Estimating eDNA Sensitivity
Appendix S2. Data and R code for drawing Figures 2-6
library(R2jags)
load.module("glm")
library(mcmcplots)
library(dplyr)
library(ggplot2)
library(reshape2)
library(grid)
################################################################################
# Run the dilution assay model to get a value for phi
# Dilution assay data:
# expected number of molecules in dilution assay
n_mol <- c(1000000, 100000, 10000, 1000, 100, 10, 1, 0.1, 0.01)
# number of PCR reps run per dilution assay
n_pcr_reps <- c(5, 6, 11, 11, 11, 11, 11, 11, 11)
# number of positive amplifications from the PCR reps
n_pos <- c(5, 6, 11, 11, 11, 7, 3, 0, 0)
N <- length(n_mol)
# put into a dataframe for use in ggplot
dd <- data.frame(n_mol = n_mol, n_pcr_reps = n_pcr_reps, n_pos = n_pos)
dd$av_prob <- dd$n_pos / dd$n_pcr_reps
dd
################################################################################
# Assay dilution JAGS model
mod.assay <- "model
{
for(i in 1:N) {
n_pos[i] ~ dbin(mu[i], n_pcr_reps[i])
mu[i] <- 1 - (1 - p[i]) ^ n[i]
n[i] ~ dpois(n_mol[i])
logit(p[i]) <- lp
}
lp ~ dnorm(0, 0.00001)
logit(p_out) <- lp
}"
################################################################################
# Run the model
write(mod.assay, "model.txt")
out.assay <- jags(model = "model.txt",
data = list(N=N, n_mol = n_mol, n_pos = n_pos,
n_pcr_reps = n_pcr_reps),
inits = function() list(lp = rnorm(1)),
param = c("lp", "p_out"),
n.chains = 3,
n.iter =20000,
n.burnin = 10000)
################################################################################
# Print and plot results
all.sum <- out.assay$BUGSoutput$summary
all.sum[, c(1,2,3,7,8)]
# extract value for p and its standard deviation
p.mean <- all.sum[3, 1]
p.se <- all.sum[3, 2]
# extract value for logit p and its standard deviation
logit.p.mean <- all.sum[2, 1]
logit.p.se <- all.sum[2, 2]
# data to draw curve
lxx <- seq(round(log(min(dd$n_mol))) , round(log(max(dd$n_mol))), 0.1)
xx <- exp(lxx)
crve <- data.frame(y = (1 - (1 - p.mean) ^ xx), x = xx)
# Draw Figure 1
p1 <- ggplot(dd, aes(y = av_prob, x = n_mol)) +
geom_point(size = 5) +
scale_x_log10() +
xlab("\nExpected number of molecules in PCR replicate") +
ylab("Proportion of successful amplifications\n") +
geom_line(data = crve, aes(y = y, x = x), lwd = 1) +
theme_classic(18)
## inset the posterior distribution of p
p.out <- data.frame(p.post = out.assay$BUGSoutput$sims.matrix[, 3])
vp <- viewport(width = 0.4, height = 0.4, x = 0.75, y = 0.4)
p2 <- ggplot(p.out, aes(x = p.post)) +
# geom_histogram(aes(y = ..density..), binwidth = 0.01, fill = "grey") +
geom_density(fill = "grey") +
xlab(expression(italic(phi))) + ylab("Density") +
theme_classic(14)
print(p1)
print(p2, vp = vp)
################################################################################
################################################################################
# Survey data
y <- c(0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0,
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0)
y <- matrix(y, ncol = 6)
creek_name <- rep(rep(c("Ginninderra", "Tuggeranong", "Queanbeyan"),
each = 12), 2)
season_name <- rep(c("autumn", "spring"), each = 36)
# put in a data frame for use in ggplot
dat <- data.frame(creek = creek_name, sample = rep(1:12, 6),
season = season_name, y = y)
names(dat)[4:9] <- paste("pcr_rep_", 1:6, sep = "")
dat
creek <- as.numeric(factor(creek_name))
season <- as.numeric(factor(season_name))
N_creek <- max(creek)
N_season <- max(season)
N_samples <- nrow(y)
N_pcr_reps <- ncol(y)
sample_vol <- 2
pcr_dilution <- 0.02
## data for calculating sensitivity at different concentrations
log_conc <- seq(-3, 3, 0.01)
conc <- 10^(log_conc)
N_conc <- length(conc)
################################################################################
## Concentration JAGS model
mod <- "model {
# y is binary taking values 1 (the jkth PCR replicate amplified)
# or 0 (the jkth PCR replicate failed to amplify)
# loop through the samples & PCR reps
for(j in 1:N_samples) {
n_mol_sample[j] ~ dnegbin(prob_nb[j], r)
prob_nb[j] <- r / (r + mu[j])
mu[j] <- concentration[creek[j], season[j]] * sample_vol
for(k in 1:N_pcr_reps) {
n_mol_pcr[j, k] ~ dpois(n_mol_sample[j] * pcr_dilution)
y[j, k] ~ dbern(1 - (1 - p[j, k]) ^ n_mol_pcr[j, k])
logit(p[j, k]) <- lp
}
}
# prior probability of p from the assay dilution - on logit scale
p.prec <- 1 / logit.p.se^2
lp ~ dnorm(logit.p.mean, p.prec)
logit(p_out) <- lp
# wide uniform prior for r, the negative binomial dispersion parameter
r ~ dunif(0, 500)
# independent non-informative priors for each creek by season
for(i in 1:N_creek) {
for(j in 1:N_season) {
log(concentration[i, j]) <- lc[i, j]
lc[i, j] ~ dnorm(mean.c, tau.c)
}
}
mean.c ~ dnorm(0, 0.00001)
tau.c <- sigma.c ^ -2
sigma.c ~ dunif(0, 100)
# calculate sensitivity at different concentrations given 12 samples per site
# and 6 PCR replicates per sample
for(i in 1:N_conc) {
theta[i] <- 1 - (r / (r + conc[i] * sample_vol)) ^ r
eta[i] <- 1 - (r / (r + conc[i] * sample_vol * pcr_dilution * p_out)) ^ r
sens[i] <- 1 - ((1 - theta[i]) + theta[i] * (1 - eta[i]) ^ 6) ^ 12
}
}"
################################################################################
write(mod, "model.txt")
# Run the model in JAGS with three chains
mod1 <- jags(model = "model.txt",
data = list(y = y, season = season, creek = creek,
N_samples = N_samples, N_pcr_reps = N_pcr_reps,
N_season = N_season, N_creek = N_creek,
logit.p.mean = logit.p.mean, logit.p.se = logit.p.se,
pcr_dilution = pcr_dilution, sample_vol = sample_vol,
N_conc = N_conc, conc = conc),
inits = function() list(n_mol_pcr = y),
param = c("concentration", "p_out", "r", "sens", "theta", "eta",
"mean.c", "sigma.c"),
n.chains = 3,
n.iter =20000,
n.burnin = 10000)
################################################################################
# Print and plot results
out <- as.mcmc(mod1)
mcmcplot(out, parms=c("concentration", "p_out", "r"))
mod1.sum <- mod1$BUGSoutput$summary
# function to extract variables from model summary
ext <- function(x, mod) {
a <- mod[substr(rownames(mod),1,nchar(x))==x, , drop=F]
return(data.frame(mean=a[ , 5], lcl=a[ , 3], ucl=a[ , 7], lcl50=a[ , 4],
ucl50=a[ , 6]))
}
# extract estimated concentration for each stream by season
conc1 <- data.frame(ext("concentration", mod1.sum))
conc1$creek <- rep(levels(dat$creek), 2)
conc1$season <- rep(levels(dat$season), each = 3)
conc1$parm <- "concentration"
conc1
# define breaks for plotting
brk = 10**(-10:10)
# Draw Figure 2
ggplot(conc1, aes(y = mean, x = creek)) +
geom_point(size = 4) +
facet_wrap(~ season) +
geom_errorbar(aes(ymin = lcl, ymax = ucl), width = 0) +
geom_errorbar(aes(ymin = lcl50, ymax = ucl50), lwd=2, width = 0) +
scale_y_log10(breaks = brk, labels = brk) +
ylab("\nConcentration (molecules / litre)") + xlab(" ") +
theme_bw(18) +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank())
################################################################################
### Sensitivity
# extract sensitivity results from summary
sens.out <- as.data.frame(ext("sens", mod1.sum))
sens.out$conc <- conc
sens.mean <- sens.out$conc[which(sens.out$mean >= 0.95)[1]]
sens.ucl <- sens.out$conc[which(sens.out$lcl >= 0.95)[1]]
sens.lcl <- sens.out$conc[which(sens.out$ucl >= 0.95)[1]]
# Draw Figure 3
ggplot(sens.out, aes(y = mean, x = conc)) +
geom_line(lwd = 1.2) +
geom_hline(yintercept = 0.95, lty=2, size = 1) +
geom_segment(aes(y = 0.95, yend = 0, x = sens.mean, xend = sens.mean),
lwd = 1) +
xlab("\nConcentration (molecules / litre)") +
ylab("Probability of detection\n") +
coord_cartesian(xlim = c(0, 15)) +
theme_bw(18) +
theme(panel.border = element_blank()) +
theme(axis.line = element_line(color = 'black', size = 1)) +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank())
################################################################################
## At what concentration do you get 95% sensitivity for different Ns and Na?
# extract data from summary for theta, eta and r
theta <- ext("theta", mod1.sum)[, 1]
eta <- ext("eta", mod1.sum)[, 1]
r <- ext("r", mod1.sum)[, 1]
# construct a matrix representing different values of Na and Ns
# and calculate sensitivity for each combination of these using theta and eta
sens.mat <- array(dim = c(length(conc), 25, 10))
for(Na in 1:10) {
for(Ns in 1:25) {
sens.mat[, Ns, Na] <- 1 - ((1 - theta) + theta * (1 - eta) ^ Na) ^ Ns
}
}
## for each Ns and Na what is the concentration at which sensitiviey = 0.95?
sens.all <- matrix(nrow = 25, ncol = 10)
for(i in 1:10) {
sens.all[, i] <- apply(sens.mat[, , i], 2,
function(x) conc[which(x >= 0.95)[1]])
}
# put into a dataframe for plotting and convert from wide to long format
sens.all <- data.frame(sens.all)
names(sens.all) <- paste("a", 1:10, sep="")
sens.all$n_samp <- 1:25
sens.all <- melt(sens.all, id.vars = c("n_samp"))
sens.all$n_aliq <- rep(1:10, each = 25)
sens.all <- arrange(sens.all, n_samp, n_aliq)
# Draw Figure 4
ggplot(sens.all, aes(y = value, x = n_samp, group = variable)) +
geom_line(size = 1) +
scale_y_log10() +
geom_segment(aes(y = 10.4, yend = 0, x = 12, xend = 12), lty = 3, lwd = 1) +
geom_segment(aes(y = 10.4, yend = 10.4, x = 12, xend = 0),
lty = 3, lwd = 1) +
ylab("\nConcentration (molecules / litre)") +
xlab("\nNumber of samples") +
geom_text(data = NULL, y = 1.48, x = 25.5, label = "1") +
geom_text(data = NULL, y = 0.77, x = 25.5, label = "5") +
geom_text(data = NULL, y = 0.51, x = 25.5, label = "10") +
theme_bw(18) +
theme(panel.border = element_blank()) +
theme(axis.line = element_line(color = 'black', size = 1))
################################################################################
## Sensitivity in relation to r calculation
# extract mean value for p
m.p <- ext("p_out", mod1.sum)[1, 1]
# set up a matrix with different concentration and r combinations
# with r = 100000 being sufficiently large to be random (Poisson) dispersion
conc <- seq(0, 30, 0.01)
m.r <- c(0.1, 0.31, 1, 100000)
out <- matrix(nrow = length(conc), ncol = length(m.r))
# compute sensitivity for each combination
for(i in 1:length(conc)) {
for(j in 1:length(m.r)) {
m.eta <- 1 - (m.r[j] / (m.r[j] + conc[i] * sample_vol *
pcr_dilution * m.p)) ^ m.r[j]
m.theta <- 1 - (m.r[j] / (m.r[j] + conc[i] * sample_vol)) ^ m.r[j]
m.sens <- 1 - ((1 - m.theta) + m.theta * (1 - m.eta) ^ 6) ^ 12
out[i, j] <- m.sens
}
}
# put into a dataframe for plotting and convert from wide to long format
out <- data.frame(out)
names(out) <- m.r
mout <- melt(out)
mout$conc <- rep(conc, length(m.r))
# concentrations at which they achieve 95% sensitivity
sens <- group_by(mout, variable) %>%
summarise(conc = min(conc[value >= 0.95]))
# Draw Figure 5
ggplot(mout, aes(y = value, x = conc, group = variable)) +
geom_line(size = 1) +
geom_hline(yintercept = 0.95, lty=2, size = 1) +
geom_segment(data = sens, aes(y = 0.95, yend = 0, x = conc, xend = conc),
lty = 3, lwd = 1) +
xlab("\nConcentration (molecules / litre)") +
ylab("Probability of detection\n") +
geom_text(data = NULL, y = 0.3, x = 3.7, label = "0.1") +
geom_text(data = NULL, y = 0.6, x = 4.7, label = "0.31") +
geom_text(data = NULL, y = 0.75, x = 4, label = "1") +
geom_text(data = NULL, y = 0.85, x = 1.5, label = "Random") +
theme_bw(18) +
theme(panel.border = element_blank()) +
theme(axis.line = element_line(color = 'black', size = 1)) +
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank()
Furlan et al. A Framework for Estimating eDNA Sensitivity
Table S1. Details of primers and hydrolysis probe designed to amplify a short fragment of the 12S mitochondrial DNA region forthe Oriental weatherloach, Misgurnus anguillicaudatus. The synthetic oligonucleotide generated with a modified Uracil residue (U, underlined) is also given
Target species / Label / Sequence (5'-3') / Fragment length (bp)Misgurnus anguillicaudatus / M.ang_12S_F / GTAGCGAACGAAGTGGGAAGA
M.ang_12S_R / AAATCCTCCTTCGAGCACTAAGTTT
M.ang_12S_probe / ATGGGCTACATTTTCT
M.ang_12S_synth_oligo / GTAGCGAACGAAGTGGGAAGAAATGGGCTACATTTTCTAGTATCACAACAGGCAUCATGAACAATAATAAACTTAGTGCTCGAAGGAGGATTT / 93
Furlan et al. A Framework for Estimating eDNA Sensitivity
Table S2.Specificity of Misgurnus anguillicaudatus species-specific marker tested on tissue samples derived from species listed. Amplification success or failure is indicated
Species Tested / DNA Amplification Success / 12S rRNA Genbank Accession NumberMisgurnus anguillicaudatus – Ginninderra Ck, ACT. / Yes / KJ774847
Misgurnus anguillicaudatus – Murrumbidgee R., ACT. / Yes / FJ710961
Cyprinus carpio / No / FJ710924
Carassius carassius / No / HQ615467
Salmotrutta / No / FJ710985
Rutilusrutilus / No / FJ710983
Tincatinca / No / FJ710992
Pseudomugilmellis / No / KJ774902
Table S3. PCR amplification efficiencies for Misgurnus anguillicaudatus species-specific marker calculated from calibration curves using synthetic oligonucleotides
Target species / r2 / Slope / y-intercept / Efficiency % / LOD (copies/µL)Misgurnus anguillicaudatus / 0.998 / -3.505 / 44.251 / 92.9 / 30
LOD: Limit of Detection
Furlan et al. A Framework for Estimating eDNA Sensitivity
Table S4. Number of environmental DNA water samples (and associated PCR replicates) producing a positive detection result for the Oriental weatherloach, Misgurnusanguillicaudatus, in autumn and spring at three field sites
Positive detectionLocation / Autumn / Spring
Ginninderra Creek / 2 (1,2) / 3 (1, 1, 5)
Tuggeranong Creek / 1 (2) / 10 (6, 6, 6, 4, 1, 6, 6, 4, 6, 6)
Queanbeyan River / 3 (1,1,1) / 10 (6, 6, 6, 6, 6, 6, 6, 6, 6, 6)
Figure S1. Environmental DNA sampling site locations within the A.C.T., Australia. Black dots indicate sampling sites along waterways with known presence ofMisgurnus anguillicaudatus. GC: Ginninderra Creek, QR: Queanbeyan River, TC: Tuggeranong Creek.