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)))
}

Settings

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

Download existing barcodes

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

Filtering

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')

Barcoded primers

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)

Hairpin and dimer filtering

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

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]

Dimers

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:

  1. Identify the matrix cell with the lowest dG
  2. decide whether to remove the forward or reverse primer: remove the one that results in a higher overall improvement (if removed). For this, we calculate the mean of all dG values < -1 in the remaining matrix (strongly negative values indicate potential oligo interactions). We remove the primer that leads to a higher 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 to file

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)

Combinations

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)