knitr::knit_hooks$set(plot = function(x, options) paste("\n", knitr::hook_plot_tex(x, options), "\n"))
hamming = function(x) {
x = lapply(x, utf8ToInt)
sapply(x, function(b1) sapply(x, function(b2) sum(b1 != b2)))
}
Number of required rows/columns that form the unique barcode combinations with dual indexing (rows * columns), rows usually in multiples of 8 and columns in multiples of 12 to form a matrix of plates.
required.fwd = 5 * 8
required.rev = 3 * 12
n_samples = required.fwd * required.rev
This gives 1440 barcode combinations (assuming rows = fwd, cols = rev: 5 x 3 = 15 plates).
Minimum distance between barcodes (see Filtering)
# set as high as possible, but not as high that there are too
# little candidates for dimer/hairpin filtering
min_dist = 4
We use indexes from Hawkins et al. (2018) (see GitHub repo https://github.com/finkelsteinlab/freebarcodes). If looking at all possible barcodes that could arise from mutations, at least 1 difference is guaranteed, allowing for error correction. This is lower than the edit distance as barcodes are truncated on insertions, or downstream bases are included in case of deletions, which makes the situation more complicated, and the edit distance is not sufficient as a measure (not to speak of Hamming distance).
The file naming: barcodes9-1.txt means 9bp barcodes with
a minimum guaranteed distance of 1bp (assuming all possible sequencing
errors that could occur, not just substitutions). For other
possibilities see https://github.com/finkelsteinlab/freebarcodes/tree/master/barcodes
bc_file = 'barcodes9-1.txt'
path = paste0('https://raw.githubusercontent.com/finkelsteinlab/freebarcodes/refs/heads/master/barcodes/', bc_file)
# path = 'freebarcodes-master/barcodes/barcodes9-1.txt'
bc = read.delim(path, header=F)[[1]]
names(bc) = sprintf("bc%03d", 1:length(bc))
bc.len = nchar(unname(bc[1]))
bc.len
## [1] 9
length(bc)
## [1] 554
A first check of the edit distance
d = adist(bc)
hist(d[lower.tri(d)], breaks='FD', main='Edit distance of unfiltered barcodes')
DNABarcodes::analyse.barcodes(bc)
## Description hamming seqlev levenshtein
## 1 Mean Distance 6.738316 4.627121 5.789373
## 2 Median Distance 7.000000 5.000000 6.000000
## 3 Minimum Distance 3.000000 3.000000 3.000000
## 4 Maximum Distance 9.000000 9.000000 9.000000
## 5 Guaranteed Error Correction 1.000000 1.000000 1.000000
## 6 Guaranteed Error Detection 2.000000 2.000000 2.000000
Now see if the DNABarcodes package is happy with these barcodes (they
have their own filtering). We limit to those with at least a Hamming
distance of 4 (min_dist setting), since substitutions are
still the most frequent type of error even with Nanopore. The GC
content, etc. however seems fine.
library(DNABarcodes)
## Lade nötiges Paket: Matrix
## Lade nötiges Paket: parallel
analyse.barcodes(bc)
## Description hamming seqlev levenshtein
## 1 Mean Distance 6.738316 4.627121 5.789373
## 2 Median Distance 7.000000 5.000000 6.000000
## 3 Minimum Distance 3.000000 3.000000 3.000000
## 4 Maximum Distance 9.000000 9.000000 9.000000
## 5 Guaranteed Error Correction 1.000000 1.000000 1.000000
## 6 Guaranteed Error Detection 2.000000 2.000000 2.000000
bc.filt = create.dnabarcodes(bc.len, dist=min_dist, pool=bc, metric="hamming", heuristic="conway", cores=1)
## 1) Creating pool ... of size 554
## 2) Conway closing... done
names(bc.filt) = names(bc[match(bc.filt, bc)])
bc.filt = bc.filt[order(names(bc.filt))]
length(bc.filt)
## [1] 177
r = length(bc.filt) / max(required.fwd, required.rev)
stopifnot(r >= 1.2)
if (r < 1.5) {
warning('Consider lowering min_dist there is less than 1.5x the required number of barcodes available for selection')
}
analyse.barcodes(bc.filt)
## Description hamming seqlev levenshtein
## 1 Mean Distance 6.753916 4.607987 5.781651
## 2 Median Distance 7.000000 5.000000 6.000000
## 3 Minimum Distance 4.000000 3.000000 3.000000
## 4 Maximum Distance 9.000000 8.000000 9.000000
## 5 Guaranteed Error Correction 1.000000 1.000000 1.000000
## 6 Guaranteed Error Detection 3.000000 2.000000 2.000000
We have 177 barcodes available after filtering.
Check the hamming distance, which is at least 4 as we wanted it to be.
d = hamming(bc.filt)
hist(d[lower.tri(d)], breaks='FD', main='Hamming distance of filtered barcodes')
Check the edit distance, even if it is not the best measure, since fewer mutations (Subst/In/Del) can be required to obtain the same barcode (see linked paper and ?create.dnabarcodes). It can go down to <4 in few cases.
d = adist(bc.filt)
hist(d[lower.tri(d)], breaks='FD', main='Edit distance of filtered barcodes')
The barcode is simply inserted before the primer without any padding nucleotides.
fwd_name = 'ITS5'
fwd_seq = 'GGAAGTAAAAGTCGTAACAAGG'
rev_name = 'ITS4'
rev_seq = 'TCCTCCGCTTATTGATATGC'
fwd.bc = paste0(bc.filt, fwd_seq)
rev.bc = paste0(bc.filt, rev_seq)
Dimer (min. hybridization energy) and hairpin (min. folding energy) calculation functions using OligoarrayAux similarly as does DECIPHER in findPrimers. See also the documentation. The programs return Gibbs free energy, where more negative numbers mean stronger binding.
dimer = function(seq1, seq2, temp=55, Na=50, Mg=3) {
args = c('-n', 'DNA', '-t', temp, '-T', temp, '-N', Na/1000, '-M', Mg/1000, '-E', '-q')
as.numeric(system2('hybrid-min', c(args, seq1, seq2), stdout=T))
}
hairpin = function(seq, temp=55, Na=50, Mg=3) {
args = c('-n', 'DNA', '-t', temp, '-T', temp, '-N', Na/1000, '-M', Mg/1000, '-E', '-q')
as.numeric(system2('hybrid-ss-min', c(args, seq), stdout=T))
}
Hairpins are mostly not bad, except for few, which we remove.
dg.hairpin.f = sapply(fwd.bc, hairpin)
dg.hairpin.r = sapply(rev.bc, hairpin)
# check
summary(dg.hairpin.f)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -1.021 0.558 1.210 1.047 1.719 1.719
hist(dg.hairpin.f, breaks='FD')
summary(dg.hairpin.r)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -2.059 0.715 1.312 1.145 1.795 2.229
hist(dg.hairpin.r, breaks='FD')
Checking the worst oligo with https://eu.idtdna.com/calc/analyzer, the Tm of some barcode-primer hairpins is > 60°C, even >70°C. We remove everything below a certain (subjective) dG threshold.
fwd.bc = fwd.bc[dg.hairpin.f >= -.5]
rev.bc = rev.bc[dg.hairpin.r >= -.5]
For dimers, we do an all-to-all comparison to catch any problems that could arise in any of the combinations. Both homodimers and hetero-dimers should be found.
dg.dimer = dg.dimer.orig = sapply(rev.bc, function(r) sapply(fwd.bc, function(f) dimer(f, r)))
image(dg.dimer)
The distance matrix shows that some barcoded forward and reverse primers interact with only single other fusion primers, while others interact with all oligos on the opposite side (bright horizontal or vertical lines). This interaction must involve the internal primer sequence of one of them (not just the barcode-primer combination), as Gibbs free energy is consistently low for all comparisons.
Worst interactions are:
list_bad = function(d, n) {
d[lower.tri(d, T)] = NA
low.dg = head(sort(d), n)
# https://stackoverflow.com/questions/67143525/how-to-find-n-lowest-values-in-a-matrix-with-their-respective-rows-columns-indic
i = which(apply(d, 2, function(x) x %in% low.dg), arr.ind=T)
data.frame(fwd=rownames(d)[i[,1]], rev=colnames(d)[i[,2]], dG=d[i])
}
list_bad(dg.dimer.orig, 4)
## fwd rev dG
## 1 TAACGCGGAGGAAGTAAAAGTCGTAACAAGG TACTACACGTCCTCCGCTTATTGATATGC -6.867
## 2 TAACGCGGAGGAAGTAAAAGTCGTAACAAGG TCCAGGTCTTCCTCCGCTTATTGATATGC -7.516
## 3 TAACGCGGAGGAAGTAAAAGTCGTAACAAGG TCGAGTGATTCCTCCGCTTATTGATATGC -6.818
## 4 GCTAATCGCGGAAGTAAAAGTCGTAACAAGG TTCCGCGATTCCTCCGCTTATTGATATGC -7.284
## 5 TAACGCGGAGGAAGTAAAAGTCGTAACAAGG TTCCGCGATTCCTCCGCTTATTGATATGC -6.818
We iteratively exclude the oligos with the strongest interactions using the following steps:
mean(dG[dG < -1]). If we cannot remove one of the
primers because we would end up with too few remaining, we remove the
other one.We repeat steps 1-2 until we reach the required forward and reverse primer numbers
dg.dimer = dg.dimer.orig
score = function(x, threshold=-1) {
x = x[x < threshold]
mean(x)
# weighted.mean(x, -x)
}
while (T) {
# 1. identify strongest interaction
i = which(dg.dimer == min(dg.dimer), arr.ind=T)[1,]
# 2. test which primer should be removed
df = score(dg.dimer[-i[1],])
dr = score(dg.dimer[,-i[2]])
if (df >= dr & nrow(dg.dimer) > required.fwd) {
cat("Removing fwd:", rownames(dg.dimer)[i[1]], "\n")
dg.dimer = dg.dimer[-i[1],]
} else if (ncol(dg.dimer) > required.rev) {
cat("Removing rev:", colnames(dg.dimer)[i[2]], "\n")
dg.dimer = dg.dimer[,-i[2]]
} else {
break
}
# image(dg.dimer)
cat(sprintf("dG min = %s, fwd: %d, rev: %d\n",
paste(format(head(sort(dg.dimer[lower.tri(dg.dimer, T)]), 4), digits=4), collapse=', '),
nrow(dg.dimer), ncol(dg.dimer)))
}
## Removing fwd: TAACGCGGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -7.912, -7.840, -6.862, -6.790, fwd: 170, rev: 167
## Removing fwd: ACAAGTGGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -6.862, -6.790, -6.375, -6.148, fwd: 169, rev: 167
## Removing fwd: GCTAATCGCGGAAGTAAAAGTCGTAACAAGG
## dG min = -6.862, -6.790, -6.375, -6.148, fwd: 168, rev: 167
## Removing fwd: TGGAGAGGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -6.375, -6.148, -6.076, -6.043, fwd: 167, rev: 167
## Removing fwd: CTAGAACGCGGAAGTAAAAGTCGTAACAAGG
## dG min = -6.375, -6.148, -6.076, -6.043, fwd: 166, rev: 167
## Removing rev: CTGTCCGATTCCTCCGCTTATTGATATGC
## dG min = -6.148, -6.076, -6.043, -5.955, fwd: 166, rev: 166
## Removing rev: AAGCCAACTTCCTCCGCTTATTGATATGC
## dG min = -6.076, -6.043, -5.883, -5.519, fwd: 166, rev: 165
## Removing rev: AACGTCACTTCCTCCGCTTATTGATATGC
## dG min = -6.043, -5.519, -5.421, -5.421, fwd: 166, rev: 164
## Removing fwd: TGATGGTTCGGAAGTAAAAGTCGTAACAAGG
## dG min = -5.519, -5.421, -5.421, -5.323, fwd: 165, rev: 164
## Removing rev: CCTCTACGATCCTCCGCTTATTGATATGC
## dG min = -5.519, -5.421, -5.421, -5.323, fwd: 165, rev: 163
## Removing fwd: GATTGGTGCGGAAGTAAAAGTCGTAACAAGG
## dG min = -5.421, -5.421, -5.323, -5.297, fwd: 164, rev: 163
## Removing fwd: AGGTTCGACGGAAGTAAAAGTCGTAACAAGG
## dG min = -5.421, -5.421, -5.323, -5.297, fwd: 163, rev: 163
## Removing fwd: AGAGGAGTTGGAAGTAAAAGTCGTAACAAGG
## dG min = -5.421, -5.421, -5.323, -5.297, fwd: 162, rev: 163
## Removing fwd: AACACAAGCGGAAGTAAAAGTCGTAACAAGG
## dG min = -5.323, -5.297, -4.954, -4.954, fwd: 161, rev: 163
## Removing fwd: CACGAGATCGGAAGTAAAAGTCGTAACAAGG
## dG min = -5.323, -5.297, -4.954, -4.954, fwd: 160, rev: 163
## Removing rev: ACCGGATGTTCCTCCGCTTATTGATATGC
## dG min = -5.297, -4.954, -4.954, -4.914, fwd: 160, rev: 162
## Removing fwd: ATTCGGTTCGGAAGTAAAAGTCGTAACAAGG
## dG min = -5.297, -4.954, -4.954, -4.914, fwd: 159, rev: 162
## Removing rev: AAGCTGCGATCCTCCGCTTATTGATATGC
## dG min = -4.954, -4.954, -4.914, -4.877, fwd: 159, rev: 161
## Removing rev: TTCCGCGATTCCTCCGCTTATTGATATGC
## dG min = -4.954, -4.954, -4.914, -4.877, fwd: 159, rev: 160
## Removing rev: GGTCCGTAATCCTCCGCTTATTGATATGC
## dG min = -4.954, -4.954, -4.914, -4.877, fwd: 159, rev: 159
## Removing fwd: CTGTAAGGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.914, -4.877, -4.877, -4.877, fwd: 158, rev: 159
## Removing fwd: AATGCAGTCGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.914, -4.877, -4.877, -4.877, fwd: 157, rev: 159
## Removing rev: ATTCACGAGTCCTCCGCTTATTGATATGC
## dG min = -4.877, -4.877, -4.877, -4.877, fwd: 157, rev: 158
## Removing fwd: GAACATAGCGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.789, -4.789, -4.776, -4.776, fwd: 156, rev: 158
## Removing fwd: AAGCTGCGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.789, -4.789, -4.776, -4.776, fwd: 155, rev: 158
## Removing rev: ACCTGGAACTCCTCCGCTTATTGATATGC
## dG min = -4.776, -4.776, -4.692, -4.692, fwd: 155, rev: 157
## Removing fwd: TCTAGCGTAGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.675, -4.559, -4.517, -4.502, fwd: 154, rev: 157
## Removing fwd: GCTATGTCCGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.675, -4.559, -4.517, -4.502, fwd: 153, rev: 157
## Removing fwd: TGATGCGAGGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.559, -4.502, -4.469, -4.411, fwd: 152, rev: 157
## Removing fwd: AACAACGGTGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.559, -4.502, -4.469, -4.411, fwd: 151, rev: 157
## Removing rev: TGTGTGGAGTCCTCCGCTTATTGATATGC
## dG min = -4.559, -4.502, -4.469, -4.411, fwd: 151, rev: 156
## Removing rev: AACGGTGAATCCTCCGCTTATTGATATGC
## dG min = -4.502, -4.469, -4.411, -4.405, fwd: 151, rev: 155
## Removing rev: CACCGATTGTCCTCCGCTTATTGATATGC
## dG min = -4.502, -4.469, -4.411, -4.405, fwd: 151, rev: 154
## Removing rev: TGATGCGAGTCCTCCGCTTATTGATATGC
## dG min = -4.502, -4.469, -4.411, -4.405, fwd: 151, rev: 153
## Removing fwd: CCGGAGAATGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.469, -4.411, -4.405, -4.386, fwd: 150, rev: 153
## Removing fwd: ACCTGGAACGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.469, -4.411, -4.405, -4.386, fwd: 149, rev: 153
## Removing rev: TCCTATTGCTCCTCCGCTTATTGATATGC
## dG min = -4.469, -4.411, -4.405, -4.386, fwd: 149, rev: 152
## Removing rev: AGGTTCGACTCCTCCGCTTATTGATATGC
## dG min = -4.411, -4.405, -4.386, -4.386, fwd: 149, rev: 151
## Removing rev: TCCAGGTCTTCCTCCGCTTATTGATATGC
## dG min = -4.411, -4.405, -4.386, -4.386, fwd: 149, rev: 150
## Removing fwd: TACAGGAGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.405, -4.386, -4.386, -4.348, fwd: 148, rev: 150
## Removing rev: GGACCTGTTTCCTCCGCTTATTGATATGC
## dG min = -4.386, -4.386, -4.348, -4.288, fwd: 148, rev: 149
## Removing fwd: AGGTAGCTCGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.386, -4.348, -4.288, -4.269, fwd: 147, rev: 149
## Removing fwd: AGCTACCAAGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.348, -4.288, -4.269, -4.269, fwd: 146, rev: 149
## Removing fwd: ATAGGAAGGGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.348, -4.288, -4.269, -4.269, fwd: 145, rev: 149
## Removing fwd: CATCAGCGTGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.348, -4.288, -4.269, -4.269, fwd: 144, rev: 149
## Removing rev: TCTTCCACCTCCTCCGCTTATTGATATGC
## dG min = -4.288, -4.269, -4.269, -4.269, fwd: 144, rev: 148
## Removing rev: TCGGACATCTCCTCCGCTTATTGATATGC
## dG min = -4.288, -4.269, -4.269, -4.269, fwd: 144, rev: 147
## Removing rev: CCACCTTACTCCTCCGCTTATTGATATGC
## dG min = -4.269, -4.269, -4.269, -4.269, fwd: 144, rev: 146
## Removing fwd: CAGCGGTATGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.230, -4.224, -4.198, -4.189, fwd: 143, rev: 146
## Removing fwd: AGAGAGAACGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.230, -4.224, -4.198, -4.189, fwd: 142, rev: 146
## Removing fwd: AGAACGTGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.230, -4.224, -4.198, -4.189, fwd: 141, rev: 146
## Removing fwd: TGTCGGAACGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.224, -4.198, -4.189, -4.123, fwd: 140, rev: 146
## Removing rev: ACGTATCGGTCCTCCGCTTATTGATATGC
## dG min = -4.198, -4.189, -4.123, -4.106, fwd: 140, rev: 145
## Removing fwd: ACTGAGCGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.198, -4.189, -4.123, -4.106, fwd: 139, rev: 145
## Removing rev: ACTTGTTCCTCCTCCGCTTATTGATATGC
## dG min = -4.189, -4.123, -4.106, -4.081, fwd: 139, rev: 144
## Removing fwd: GAGGAATCGGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.123, -4.106, -4.081, -4.080, fwd: 138, rev: 144
## Removing fwd: ACCGGATGTGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.123, -4.106, -4.081, -4.080, fwd: 137, rev: 144
## Removing fwd: CCACCTTACGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.123, -4.106, -4.081, -4.080, fwd: 136, rev: 144
## Removing fwd: GTCCAATGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.106, -4.081, -4.080, -4.066, fwd: 135, rev: 144
## Removing fwd: TCCTATTGCGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.081, -4.066, -4.055, -4.026, fwd: 134, rev: 144
## Removing rev: AGAACGTGATCCTCCGCTTATTGATATGC
## dG min = -4.066, -4.055, -4.026, -3.965, fwd: 134, rev: 143
## Removing fwd: TGTGTGGAGGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.055, -4.026, -3.965, -3.965, fwd: 133, rev: 143
## Removing fwd: AACGGTGAAGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.055, -4.026, -3.965, -3.965, fwd: 132, rev: 143
## Removing fwd: ATCACTGCAGGAAGTAAAAGTCGTAACAAGG
## dG min = -4.026, -3.965, -3.965, -3.947, fwd: 131, rev: 143
## Removing fwd: TTGCGTCTCGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.965, -3.965, -3.947, -3.935, fwd: 130, rev: 143
## Removing fwd: GTACCACTCGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.965, -3.965, -3.947, -3.935, fwd: 129, rev: 143
## Removing fwd: TATGACGCAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.965, -3.965, -3.947, -3.935, fwd: 128, rev: 143
## Removing fwd: AAGACGGAAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.965, -3.965, -3.947, -3.935, fwd: 127, rev: 143
## Removing fwd: ACAACAGACGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.965, -3.965, -3.947, -3.935, fwd: 126, rev: 143
## Removing fwd: GACCTAGACGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.965, -3.947, -3.935, -3.931, fwd: 125, rev: 143
## Removing fwd: GGATAAGACGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.947, -3.935, -3.931, -3.927, fwd: 124, rev: 143
## Removing fwd: CCTAAGACAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.947, -3.935, -3.931, -3.927, fwd: 123, rev: 143
## Removing fwd: TACTACACGGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.935, -3.931, -3.927, -3.881, fwd: 122, rev: 143
## Removing fwd: CAATGTGACGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.931, -3.927, -3.881, -3.876, fwd: 121, rev: 143
## Removing rev: ATACCGTCGTCCTCCGCTTATTGATATGC
## dG min = -3.927, -3.881, -3.876, -3.850, fwd: 121, rev: 142
## Removing fwd: GTACGAGAAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.881, -3.876, -3.850, -3.849, fwd: 120, rev: 142
## Removing fwd: CAGTGCATTGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.881, -3.876, -3.850, -3.809, fwd: 119, rev: 142
## Removing fwd: GGAAGAAGTGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.881, -3.876, -3.850, -3.809, fwd: 118, rev: 142
## Removing rev: GAATCAGCATCCTCCGCTTATTGATATGC
## dG min = -3.881, -3.876, -3.850, -3.809, fwd: 118, rev: 141
## Removing fwd: GAGGTGACAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.881, -3.876, -3.850, -3.809, fwd: 117, rev: 141
## Removing fwd: GTCACGATCGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.881, -3.876, -3.850, -3.809, fwd: 116, rev: 141
## Removing fwd: TAGCCGATCGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.881, -3.876, -3.850, -3.809, fwd: 115, rev: 141
## Removing fwd: AGTGTAACCGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.876, -3.850, -3.809, -3.767, fwd: 114, rev: 141
## Removing rev: AGCTTACGGTCCTCCGCTTATTGATATGC
## dG min = -3.850, -3.767, -3.758, -3.753, fwd: 114, rev: 140
## Removing fwd: ATGCTCAGTGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.850, -3.767, -3.758, -3.753, fwd: 113, rev: 140
## Removing fwd: GGTGTCAGTGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.850, -3.767, -3.758, -3.753, fwd: 112, rev: 140
## Removing rev: AGGTAGCTCTCCTCCGCTTATTGATATGC
## dG min = -3.767, -3.758, -3.753, -3.740, fwd: 112, rev: 139
## Removing fwd: AGATGCACCGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.767, -3.758, -3.753, -3.740, fwd: 111, rev: 139
## Removing rev: CGCTTCGTTTCCTCCGCTTATTGATATGC
## dG min = -3.767, -3.758, -3.753, -3.740, fwd: 111, rev: 138
## Removing rev: GATACTTCGTCCTCCGCTTATTGATATGC
## dG min = -3.767, -3.758, -3.753, -3.740, fwd: 111, rev: 137
## Removing fwd: AGCATCATCGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.767, -3.758, -3.753, -3.740, fwd: 110, rev: 137
## Removing fwd: TCGGACATCGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.767, -3.758, -3.753, -3.740, fwd: 109, rev: 137
## Removing rev: ACTCTTGCATCCTCCGCTTATTGATATGC
## dG min = -3.758, -3.753, -3.740, -3.738, fwd: 109, rev: 136
## Removing fwd: CAAGGAACAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.753, -3.740, -3.738, -3.698, fwd: 108, rev: 136
## Removing fwd: TTGCGAACAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.740, -3.698, -3.694, -3.690, fwd: 107, rev: 136
## Removing fwd: ACGCAATCCGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.740, -3.698, -3.694, -3.690, fwd: 106, rev: 136
## Removing rev: CTTGACGTTTCCTCCGCTTATTGATATGC
## dG min = -3.740, -3.698, -3.694, -3.690, fwd: 106, rev: 135
## Removing rev: CCTCTCTTCTCCTCCGCTTATTGATATGC
## dG min = -3.698, -3.694, -3.690, -3.664, fwd: 106, rev: 134
## Removing rev: CGTACCTCATCCTCCGCTTATTGATATGC
## dG min = -3.698, -3.694, -3.690, -3.664, fwd: 106, rev: 133
## Removing rev: CGGATTACGTCCTCCGCTTATTGATATGC
## dG min = -3.694, -3.690, -3.664, -3.664, fwd: 106, rev: 132
## Removing rev: CGCAATGAATCCTCCGCTTATTGATATGC
## dG min = -3.690, -3.664, -3.664, -3.653, fwd: 106, rev: 131
## Removing rev: GACGAACAATCCTCCGCTTATTGATATGC
## dG min = -3.664, -3.664, -3.653, -3.653, fwd: 106, rev: 130
## Removing rev: GTTCGTCCTTCCTCCGCTTATTGATATGC
## dG min = -3.664, -3.664, -3.653, -3.653, fwd: 106, rev: 129
## Removing rev: CTAACGAAGTCCTCCGCTTATTGATATGC
## dG min = -3.664, -3.664, -3.653, -3.653, fwd: 106, rev: 128
## Removing fwd: GGAACTAACGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.664, -3.653, -3.627, -3.593, fwd: 105, rev: 128
## Removing fwd: CGAGCACAAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.664, -3.653, -3.627, -3.593, fwd: 104, rev: 128
## Removing fwd: GTCGTCAACGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.577, -3.568, -3.567, -3.540, fwd: 103, rev: 128
## Removing rev: TGACAACGATCCTCCGCTTATTGATATGC
## dG min = -3.577, -3.568, -3.567, -3.540, fwd: 103, rev: 127
## Removing fwd: AGCTTACGGGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.568, -3.567, -3.540, -3.537, fwd: 102, rev: 127
## Removing rev: TTGCGTCTCTCCTCCGCTTATTGATATGC
## dG min = -3.568, -3.567, -3.540, -3.537, fwd: 102, rev: 126
## Removing fwd: AAGAAGACGGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.568, -3.567, -3.540, -3.537, fwd: 101, rev: 126
## Removing rev: CCTTGCCATTCCTCCGCTTATTGATATGC
## dG min = -3.567, -3.540, -3.537, -3.502, fwd: 101, rev: 125
## Removing rev: CACGAGATCTCCTCCGCTTATTGATATGC
## dG min = -3.537, -3.502, -3.490, -3.452, fwd: 101, rev: 124
## Removing fwd: TGCGCTACAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.502, -3.490, -3.452, -3.380, fwd: 100, rev: 124
## Removing rev: GACAGCTTATCCTCCGCTTATTGATATGC
## dG min = -3.502, -3.490, -3.452, -3.380, fwd: 100, rev: 123
## Removing fwd: CTTACTCGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.502, -3.490, -3.452, -3.380, fwd: 99, rev: 123
## Removing rev: AAGAAGACGTCCTCCGCTTATTGATATGC
## dG min = -3.502, -3.490, -3.452, -3.380, fwd: 99, rev: 122
## Removing rev: ATTCGGTTCTCCTCCGCTTATTGATATGC
## dG min = -3.502, -3.490, -3.452, -3.380, fwd: 99, rev: 121
## Removing fwd: CGCAATGAAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.490, -3.452, -3.380, -3.366, fwd: 98, rev: 121
## Removing rev: GAATCTCGGTCCTCCGCTTATTGATATGC
## dG min = -3.490, -3.452, -3.380, -3.366, fwd: 98, rev: 120
## Removing rev: GGTCAAGCATCCTCCGCTTATTGATATGC
## dG min = -3.490, -3.452, -3.380, -3.366, fwd: 98, rev: 119
## Removing rev: CTTACTCGATCCTCCGCTTATTGATATGC
## dG min = -3.452, -3.380, -3.366, -3.366, fwd: 98, rev: 118
## Removing fwd: CTCGCAATAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.452, -3.380, -3.366, -3.366, fwd: 97, rev: 118
## Removing fwd: ATCGCCTTCGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.452, -3.380, -3.366, -3.366, fwd: 96, rev: 118
## Removing rev: ACAACAGACTCCTCCGCTTATTGATATGC
## dG min = -3.380, -3.366, -3.366, -3.366, fwd: 96, rev: 117
## Removing fwd: ACGACCATAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.380, -3.366, -3.366, -3.366, fwd: 95, rev: 117
## Removing fwd: TCGCTCCTAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.380, -3.366, -3.366, -3.366, fwd: 94, rev: 117
## Removing fwd: GCGATTGTAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.380, -3.366, -3.366, -3.366, fwd: 93, rev: 117
## Removing rev: AGCATCATCTCCTCCGCTTATTGATATGC
## dG min = -3.366, -3.366, -3.366, -3.346, fwd: 93, rev: 116
## Removing rev: GCCTCATATTCCTCCGCTTATTGATATGC
## dG min = -3.366, -3.366, -3.366, -3.346, fwd: 93, rev: 115
## Removing rev: CGAGATGCTTCCTCCGCTTATTGATATGC
## dG min = -3.366, -3.366, -3.346, -3.342, fwd: 93, rev: 114
## Removing rev: GATAGAGCTTCCTCCGCTTATTGATATGC
## dG min = -3.346, -3.342, -3.338, -3.330, fwd: 93, rev: 113
## Removing rev: GACCTAGACTCCTCCGCTTATTGATATGC
## dG min = -3.346, -3.342, -3.338, -3.330, fwd: 93, rev: 112
## Removing rev: TCCTGACCATCCTCCGCTTATTGATATGC
## dG min = -3.346, -3.342, -3.338, -3.330, fwd: 93, rev: 111
## Removing rev: ACCATTAGGTCCTCCGCTTATTGATATGC
## dG min = -3.342, -3.338, -3.330, -3.312, fwd: 93, rev: 110
## Removing fwd: AGTAGACCAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.338, -3.330, -3.312, -3.304, fwd: 92, rev: 110
## Removing fwd: CCTCTCTTCGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.338, -3.330, -3.312, -3.304, fwd: 91, rev: 110
## Removing fwd: CCGCAGTTAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.330, -3.312, -3.304, -3.282, fwd: 90, rev: 110
## Removing rev: TTGCGAACATCCTCCGCTTATTGATATGC
## dG min = -3.330, -3.312, -3.304, -3.282, fwd: 90, rev: 109
## Removing fwd: TCCTGACCAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.312, -3.282, -3.271, -3.268, fwd: 89, rev: 109
## Removing fwd: GACAGCTTAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.282, -3.268, -3.228, -3.224, fwd: 88, rev: 109
## Removing fwd: AACCATCCAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.268, -3.228, -3.224, -3.217, fwd: 87, rev: 109
## Removing rev: CCAATAGCATCCTCCGCTTATTGATATGC
## dG min = -3.282, -3.268, -3.228, -3.224, fwd: 87, rev: 108
## Removing fwd: GCATGGAGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.268, -3.224, -3.217, -3.209, fwd: 86, rev: 108
## Removing fwd: AGCCGTAGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.268, -3.224, -3.217, -3.209, fwd: 85, rev: 108
## Removing fwd: CCGTTCAGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.268, -3.224, -3.217, -3.209, fwd: 84, rev: 108
## Removing fwd: GTGAACAGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.268, -3.224, -3.217, -3.209, fwd: 83, rev: 108
## Removing fwd: TCTCGAAGGGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.268, -3.224, -3.217, -3.209, fwd: 82, rev: 108
## Removing fwd: GCGAACTCTGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.224, -3.217, -3.209, -3.207, fwd: 81, rev: 108
## Removing rev: CGAGCACAATCCTCCGCTTATTGATATGC
## dG min = -3.224, -3.217, -3.209, -3.207, fwd: 81, rev: 107
## Removing rev: GCATGGAGATCCTCCGCTTATTGATATGC
## dG min = -3.224, -3.217, -3.209, -3.207, fwd: 81, rev: 106
## Removing fwd: GGTGACTTAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.217, -3.209, -3.207, -3.167, fwd: 80, rev: 106
## Removing rev: ACGACCATATCCTCCGCTTATTGATATGC
## dG min = -3.209, -3.207, -3.167, -3.153, fwd: 80, rev: 105
## Removing rev: CGGTACTAGTCCTCCGCTTATTGATATGC
## dG min = -3.209, -3.207, -3.167, -3.153, fwd: 80, rev: 104
## Removing fwd: TTCCGCGATGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.207, -3.167, -3.153, -3.131, fwd: 79, rev: 104
## Removing rev: AGTAGACCATCCTCCGCTTATTGATATGC
## dG min = -3.167, -3.153, -3.131, -3.126, fwd: 79, rev: 103
## Removing rev: CCGTGATACTCCTCCGCTTATTGATATGC
## dG min = -3.167, -3.153, -3.131, -3.126, fwd: 79, rev: 102
## Removing rev: AACCATCCATCCTCCGCTTATTGATATGC
## dG min = -3.153, -3.131, -3.126, -3.107, fwd: 79, rev: 101
## Removing fwd: CGGATTACGGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.131, -3.126, -3.107, -3.103, fwd: 78, rev: 101
## Removing fwd: CCTCTACGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.131, -3.126, -3.107, -3.103, fwd: 77, rev: 101
## Removing rev: TCTCGAAGGTCCTCCGCTTATTGATATGC
## dG min = -3.131, -3.126, -3.107, -3.103, fwd: 77, rev: 100
## Removing fwd: TCCAAGCAGGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.126, -3.107, -3.103, -3.058, fwd: 76, rev: 100
## Removing rev: AGATGCACCTCCTCCGCTTATTGATATGC
## dG min = -3.107, -3.103, -3.058, -3.019, fwd: 76, rev: 99
## Removing fwd: TGACAACGAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.103, -3.058, -3.019, -2.994, fwd: 75, rev: 99
## Removing rev: AGTGCCGAATCCTCCGCTTATTGATATGC
## dG min = -3.058, -3.019, -2.994, -2.971, fwd: 75, rev: 98
## Removing rev: TACTACACGTCCTCCGCTTATTGATATGC
## dG min = -3.058, -3.019, -2.994, -2.971, fwd: 75, rev: 97
## Removing rev: TATGACGCATCCTCCGCTTATTGATATGC
## dG min = -3.058, -3.019, -2.994, -2.971, fwd: 75, rev: 96
## Removing rev: CATTCCAAGTCCTCCGCTTATTGATATGC
## dG min = -3.058, -3.019, -2.994, -2.994, fwd: 75, rev: 95
## Removing rev: GCGAACTCTTCCTCCGCTTATTGATATGC
## dG min = -3.058, -3.019, -2.971, -2.935, fwd: 75, rev: 94
## Removing rev: AGTGTAACCTCCTCCGCTTATTGATATGC
## dG min = -3.019, -2.971, -2.935, -2.927, fwd: 75, rev: 93
## Removing fwd: ACGTATCGGGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.019, -2.971, -2.935, -2.927, fwd: 74, rev: 93
## Removing rev: TAGCCGATCTCCTCCGCTTATTGATATGC
## dG min = -3.019, -2.971, -2.935, -2.927, fwd: 74, rev: 92
## Removing rev: GCGATTGTATCCTCCGCTTATTGATATGC
## dG min = -3.019, -2.971, -2.935, -2.927, fwd: 74, rev: 91
## Removing fwd: CGTACCTCAGGAAGTAAAAGTCGTAACAAGG
## dG min = -3.019, -2.971, -2.935, -2.927, fwd: 73, rev: 91
## Removing rev: AACACAAGCTCCTCCGCTTATTGATATGC
## dG min = -2.971, -2.935, -2.927, -2.913, fwd: 73, rev: 90
## Removing fwd: CTCCTCCAAGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.971, -2.935, -2.927, -2.913, fwd: 72, rev: 90
## Removing rev: TACGAGCCTTCCTCCGCTTATTGATATGC
## dG min = -2.971, -2.935, -2.927, -2.913, fwd: 72, rev: 89
## Removing fwd: CTGAGACTAGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.935, -2.927, -2.913, -2.897, fwd: 71, rev: 89
## Removing rev: GCACGTAATTCCTCCGCTTATTGATATGC
## dG min = -2.935, -2.927, -2.913, -2.897, fwd: 71, rev: 88
## Removing rev: TGGAGAGGATCCTCCGCTTATTGATATGC
## dG min = -2.935, -2.927, -2.913, -2.897, fwd: 71, rev: 87
## Removing rev: ATCACTGCATCCTCCGCTTATTGATATGC
## dG min = -2.935, -2.927, -2.897, -2.819, fwd: 71, rev: 86
## Removing rev: TTCCATAGGTCCTCCGCTTATTGATATGC
## dG min = -2.935, -2.927, -2.897, -2.819, fwd: 71, rev: 85
## Removing rev: ACTCCACATTCCTCCGCTTATTGATATGC
## dG min = -2.927, -2.897, -2.819, -2.793, fwd: 71, rev: 84
## Removing fwd: GACTGAAGGGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.819, -2.793, -2.740, -2.734, fwd: 70, rev: 84
## Removing fwd: TCTTCCACCGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.819, -2.793, -2.740, -2.734, fwd: 69, rev: 84
## Removing fwd: ACTCTTGCAGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.819, -2.793, -2.740, -2.734, fwd: 68, rev: 84
## Removing rev: GAACATAGCTCCTCCGCTTATTGATATGC
## dG min = -2.793, -2.740, -2.734, -2.707, fwd: 68, rev: 83
## Removing rev: CTGAGACTATCCTCCGCTTATTGATATGC
## dG min = -2.793, -2.740, -2.734, -2.707, fwd: 68, rev: 82
## Removing fwd: AGTTCTAGGGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.740, -2.734, -2.707, -2.707, fwd: 67, rev: 82
## Removing rev: TACAGGAGATCCTCCGCTTATTGATATGC
## dG min = -2.740, -2.734, -2.707, -2.707, fwd: 67, rev: 81
## Removing rev: CTTAGAGAGTCCTCCGCTTATTGATATGC
## dG min = -2.740, -2.734, -2.707, -2.707, fwd: 67, rev: 80
## Removing rev: GGATAAGACTCCTCCGCTTATTGATATGC
## dG min = -2.740, -2.734, -2.707, -2.707, fwd: 67, rev: 79
## Removing rev: AGAGGAGTTTCCTCCGCTTATTGATATGC
## dG min = -2.740, -2.734, -2.707, -2.707, fwd: 67, rev: 78
## Removing rev: TCCAAGCAGTCCTCCGCTTATTGATATGC
## dG min = -2.740, -2.734, -2.707, -2.707, fwd: 67, rev: 77
## Removing rev: CGCCATCTTTCCTCCGCTTATTGATATGC
## dG min = -2.734, -2.707, -2.707, -2.683, fwd: 67, rev: 76
## Removing rev: AGCTACCAATCCTCCGCTTATTGATATGC
## dG min = -2.707, -2.707, -2.683, -2.682, fwd: 67, rev: 75
## Removing fwd: ACCATTAGGGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.707, -2.707, -2.683, -2.682, fwd: 66, rev: 75
## Removing rev: CAATGTGACTCCTCCGCTTATTGATATGC
## dG min = -2.707, -2.707, -2.683, -2.682, fwd: 66, rev: 74
## Removing rev: TGCGCTACATCCTCCGCTTATTGATATGC
## dG min = -2.707, -2.707, -2.683, -2.682, fwd: 66, rev: 73
## Removing fwd: TAGGTTAGGGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.707, -2.683, -2.682, -2.668, fwd: 65, rev: 73
## Removing fwd: TTCCATAGGGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.683, -2.682, -2.668, -2.658, fwd: 64, rev: 73
## Removing rev: GTCGTCAACTCCTCCGCTTATTGATATGC
## dG min = -2.683, -2.682, -2.668, -2.658, fwd: 64, rev: 72
## Removing fwd: CCGAACCAAGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.683, -2.682, -2.668, -2.658, fwd: 63, rev: 72
## Removing fwd: TCGTCTGCAGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.668, -2.658, -2.623, -2.567, fwd: 62, rev: 72
## Removing rev: TCGTCTGCATCCTCCGCTTATTGATATGC
## dG min = -2.668, -2.658, -2.623, -2.567, fwd: 62, rev: 71
## Removing fwd: GAATCTCGGGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.668, -2.658, -2.623, -2.567, fwd: 61, rev: 71
## Removing rev: GTGTGTACCTCCTCCGCTTATTGATATGC
## dG min = -2.668, -2.658, -2.623, -2.567, fwd: 61, rev: 70
## Removing rev: CGATAGCCATCCTCCGCTTATTGATATGC
## dG min = -2.658, -2.623, -2.567, -2.523, fwd: 61, rev: 69
## Removing rev: ACACTCTAGTCCTCCGCTTATTGATATGC
## dG min = -2.623, -2.567, -2.523, -2.480, fwd: 61, rev: 68
## Removing rev: GACTGAAGGTCCTCCGCTTATTGATATGC
## dG min = -2.623, -2.567, -2.523, -2.480, fwd: 61, rev: 67
## Removing rev: TCGAGTGATTCCTCCGCTTATTGATATGC
## dG min = -2.623, -2.567, -2.523, -2.480, fwd: 61, rev: 66
## Removing rev: ATCGCAGAGTCCTCCGCTTATTGATATGC
## dG min = -2.623, -2.567, -2.523, -2.480, fwd: 61, rev: 65
## Removing rev: AATAGCTGGTCCTCCGCTTATTGATATGC
## dG min = -2.567, -2.523, -2.480, -2.480, fwd: 61, rev: 64
## Removing rev: GTCCAATGATCCTCCGCTTATTGATATGC
## dG min = -2.567, -2.523, -2.480, -2.480, fwd: 61, rev: 63
## Removing fwd: CAGCAAGTCGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.567, -2.523, -2.480, -2.480, fwd: 60, rev: 63
## Removing fwd: TCGTTAGTCGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.523, -2.480, -2.480, -2.480, fwd: 59, rev: 63
## Removing fwd: CTAACGAAGGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.523, -2.480, -2.480, -2.480, fwd: 58, rev: 63
## Removing rev: CCGAACCAATCCTCCGCTTATTGATATGC
## dG min = -2.523, -2.407, -2.404, -2.375, fwd: 58, rev: 62
## Removing rev: CAGCAAGTCTCCTCCGCTTATTGATATGC
## dG min = -2.407, -2.404, -2.375, -2.368, fwd: 58, rev: 61
## Removing rev: CAGGTAGAGTCCTCCGCTTATTGATATGC
## dG min = -2.407, -2.404, -2.377, -2.375, fwd: 58, rev: 60
## Removing fwd: ACTTGTTCCGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.407, -2.404, -2.375, -2.368, fwd: 57, rev: 60
## Removing fwd: AATAGCTGGGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.407, -2.404, -2.375, -2.368, fwd: 56, rev: 60
## Removing rev: GTCACGATCTCCTCCGCTTATTGATATGC
## dG min = -2.407, -2.404, -2.375, -2.368, fwd: 56, rev: 59
## Removing rev: CAAGGAACATCCTCCGCTTATTGATATGC
## dG min = -2.407, -2.404, -2.375, -2.368, fwd: 56, rev: 58
## Removing rev: CAGCCTCAATCCTCCGCTTATTGATATGC
## dG min = -2.407, -2.404, -2.377, -2.375, fwd: 56, rev: 57
## Removing fwd: ACATTGCCGGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.407, -2.404, -2.375, -2.368, fwd: 55, rev: 57
## Removing rev: ACAGATGAGTCCTCCGCTTATTGATATGC
## dG min = -2.404, -2.377, -2.375, -2.368, fwd: 55, rev: 56
## Removing fwd: GGTCAAGCAGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.375, -2.368, -2.368, -2.366, fwd: 54, rev: 56
## Removing rev: AGAGAGAACTCCTCCGCTTATTGATATGC
## dG min = -2.375, -2.368, -2.368, -2.366, fwd: 54, rev: 55
## Removing rev: GATGTACTGTCCTCCGCTTATTGATATGC
## dG min = -2.375, -2.368, -2.368, -2.366, fwd: 54, rev: 54
## Removing fwd: CCAATAGCAGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.368, -2.368, -2.366, -2.366, fwd: 53, rev: 54
## Removing fwd: GAATCAGCAGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.368, -2.368, -2.366, -2.366, fwd: 52, rev: 54
## Removing fwd: CAGCCTCAAGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.368, -2.366, -2.355, -2.328, fwd: 51, rev: 54
## Removing fwd: GACGAACAAGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.355, -2.309, -2.302, -2.296, fwd: 50, rev: 54
## Removing rev: GTACGAGAATCCTCCGCTTATTGATATGC
## dG min = -2.355, -2.309, -2.302, -2.296, fwd: 50, rev: 53
## Removing rev: CTAGAACGCTCCTCCGCTTATTGATATGC
## dG min = -2.309, -2.302, -2.296, -2.269, fwd: 50, rev: 52
## Removing fwd: TACGAGCCTGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.302, -2.296, -2.269, -2.256, fwd: 49, rev: 52
## Removing rev: GAGGAATCGTCCTCCGCTTATTGATATGC
## dG min = -2.302, -2.296, -2.256, -2.203, fwd: 49, rev: 51
## Removing rev: GATGGTAAGTCCTCCGCTTATTGATATGC
## dG min = -2.302, -2.296, -2.256, -2.203, fwd: 49, rev: 50
## Removing rev: GTACCACTCTCCTCCGCTTATTGATATGC
## dG min = -2.296, -2.256, -2.203, -2.195, fwd: 49, rev: 49
## Removing fwd: CGATAGCCAGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.256, -2.203, -2.195, -2.194, fwd: 48, rev: 49
## Removing rev: CTCCTCCAATCCTCCGCTTATTGATATGC
## dG min = -2.256, -2.203, -2.195, -2.194, fwd: 48, rev: 48
## Removing rev: CAGTGCATTTCCTCCGCTTATTGATATGC
## dG min = -2.203, -2.195, -2.194, -2.190, fwd: 48, rev: 47
## Removing rev: TACGCATGGTCCTCCGCTTATTGATATGC
## dG min = -2.203, -2.195, -2.194, -2.190, fwd: 48, rev: 46
## Removing rev: CCGCAGTTATCCTCCGCTTATTGATATGC
## dG min = -2.203, -2.195, -2.194, -2.190, fwd: 48, rev: 45
## Removing fwd: ATTCACGAGGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.203, -2.195, -2.194, -2.190, fwd: 47, rev: 45
## Removing fwd: TTAGCAGCCGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.195, -2.194, -2.190, -2.179, fwd: 46, rev: 45
## Removing fwd: GAAGTCGTAGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.194, -2.190, -2.179, -2.168, fwd: 45, rev: 45
## Removing fwd: GTGTGTACCGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.190, -2.179, -2.168, -2.154, fwd: 44, rev: 45
## Removing fwd: GATAGAGCTGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.179, -2.168, -2.154, -2.154, fwd: 43, rev: 45
## Removing rev: TTAGCAGCCTCCTCCGCTTATTGATATGC
## dG min = -2.179, -2.168, -2.154, -2.154, fwd: 43, rev: 44
## Removing rev: ATGCTCAGTTCCTCCGCTTATTGATATGC
## dG min = -2.168, -2.154, -2.154, -2.154, fwd: 43, rev: 43
## Removing rev: ATGTGCAAGTCCTCCGCTTATTGATATGC
## dG min = -2.154, -2.154, -2.154, -2.154, fwd: 43, rev: 42
## Removing fwd: AAGCCAACTGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.154, -2.154, -2.154, -2.154, fwd: 42, rev: 42
## Removing rev: GAGGTGACATCCTCCGCTTATTGATATGC
## dG min = -2.154, -2.154, -2.154, -2.154, fwd: 42, rev: 41
## Removing fwd: CATGTTGCCGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.154, -2.154, -2.154, -2.154, fwd: 41, rev: 41
## Removing fwd: TGAAGTGCCGGAAGTAAAAGTCGTAACAAGG
## dG min = -2.125, -2.123, -2.083, -2.015, fwd: 40, rev: 41
## Removing rev: GGATTCATGTCCTCCGCTTATTGATATGC
## dG min = -2.125, -2.123, -2.083, -2.015, fwd: 40, rev: 40
## Removing rev: CTGTAAGGATCCTCCGCTTATTGATATGC
## dG min = -2.125, -2.123, -2.083, -1.996, fwd: 40, rev: 39
## Removing rev: TCCACAATGTCCTCCGCTTATTGATATGC
## dG min = -2.123, -2.083, -1.996, -1.954, fwd: 40, rev: 38
## Removing rev: AATGCAGTCTCCTCCGCTTATTGATATGC
## dG min = -2.083, -2.001, -1.996, -1.954, fwd: 40, rev: 37
## Removing rev: ATCGCCTTCTCCTCCGCTTATTGATATGC
## dG min = -2.001, -1.996, -1.954, -1.909, fwd: 40, rev: 36
image(dg.dimer)
The remaining primer combinations:
sel.fwd.bc = rownames(dg.dimer)
sel.rev.bc = colnames(dg.dimer)
# assign names
names(sel.fwd.bc) = names(bc[match(substr(sel.fwd.bc, 1, bc.len), bc)])
names(sel.rev.bc) = names(bc[match(substr(sel.rev.bc, 1, bc.len), bc)])
# dg.dimer2 = sapply(sel.rev.bc, function(r) sapply(sel.fwd.bc, function(f) dimer(f, r)))
# stopifnot(dg.dimer == dg.dimer2)
Worst interactions in the remaining set are (check e.g. in Oligo Analyzer):
list_bad(dg.dimer, 6)
## fwd rev dG
## 1 CACCGATTGGGAAGTAAAAGTCGTAACAAGG GCTAATCGCTCCTCCGCTTATTGATATGC -1.959
## 2 CAAGTCTGGGGAAGTAAAAGTCGTAACAAGG GGTGACTTATCCTCCGCTTATTGATATGC -1.946
## 3 CTGTCCGATGGAAGTAAAAGTCGTAACAAGG GTGAACAGATCCTCCGCTTATTGATATGC -2.055
## 4 ACACTCTAGGGAAGTAAAAGTCGTAACAAGG TGAAGTGCCTCCTCCGCTTATTGATATGC -1.997
## 5 CGCCATCTTGGAAGTAAAAGTCGTAACAAGG TGATGGTTCTCCTCCGCTTATTGATATGC -2.004
## 6 ACTCCACATGGAAGTAAAAGTCGTAACAAGG TTAAGGTGGTCCTCCGCTTATTGATATGC -2.001
Write for ordering
f = sel.fwd.bc
names(f) = paste(fwd_name, names(f), sep='_')
r = sel.rev.bc
names(r) = paste(rev_name, names(r), sep='_')
all.bc = c(f, r)
d = data.frame(id=names(all.bc), seq=unname(all.bc))
write.table(d, 'primers.tsv', sep='\t', row.names=F, col.names=F, quote=F)
f.batch = ceiling(seq_along(sel.fwd.bc)/8) - 1
f.coord = strsplit(intToUtf8(65 + seq(0, length(sel.fwd.bc) - 1) %% 8), '')[[1]]
names(f.batch) = names(f.coord) = names(sel.fwd.bc)
r.batch = ceiling(seq_along(sel.rev.bc)/12) - 1
r.coord = sprintf("%02d", 1 + seq(0, length(sel.rev.bc) - 1) %% 12)
names(r.batch) = names(r.coord) = names(sel.rev.bc)
comb = expand.grid(fwd=names(sel.fwd.bc), rev=names(sel.rev.bc))
comb$fwd_barcode = substr(sel.fwd.bc[comb$fwd], 1, bc.len)
comb$rev_barcode = substr(sel.rev.bc[comb$rev], 1, bc.len)
comb$fwd_rev = paste(comb$fwd, comb$rev, sep='_')
comb = cbind(
plate = 1 + (max(f.batch) + 1) * r.batch[comb$rev] + f.batch[comb$fwd],
well = paste0(f.coord[comb$fwd], r.coord[comb$rev]),
comb
)
comb = comb[order(comb$plate),]
comb = cbind(sample = 1:nrow(comb), comb)
# no combination should be repeated
stopifnot(comb[c('fwd_barcode', 'rev_barcode')] == unique(comb[c('fwd_barcode', 'rev_barcode')]))
write.table(comb, 'combinations.tsv', sep='\t', row.names=T, col.names=NA, quote=F)
Write in plate format
p = matrix(NA, nrow=length(sel.fwd.bc), ncol=length(sel.rev.bc),
dimnames=list(names(sel.fwd.bc), names(sel.rev.bc)))
for (fwd in rownames(p)) {
row = p[fwd, ]
sel = match(paste(fwd, names(row), sep='_'), comb$fwd_rev)
p[fwd, ] = with(comb, sprintf("%d %s (%d)", sample, well, plate))[sel]
}
write.table(p, 'plates.tsv', sep='\t', row.names=T, col.names=NA, quote=F)