finishm 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +19 -19
- data/VERSION +1 -1
- data/finishm.gemspec +631 -0
- data/lib/assembly/graph_generator.rb +0 -1
- data/lib/assembly/probed_graph.rb +0 -1
- metadata +99 -96
- data/bin/assembly_visualiser +0 -106
- data/bin/check_primer_combinations.rb +0 -73
- data/bin/contig_joiner.rb +0 -244
- data/bin/contigs_against_assembly.rb +0 -153
- data/bin/finishm_assembler +0 -55
- data/bin/finishm_gap_closer.rb +0 -241
- data/bin/kmer_abundance_file_tool.rb +0 -49
- data/bin/kmer_pattern_to_assembly.rb +0 -377
- data/bin/kmer_profile_finder.rb +0 -92
- data/bin/kmers_count_parse.d +0 -52
- data/bin/kmers_count_tabulate.d +0 -123
- data/bin/kmers_count_tabulate.rb +0 -84
- data/bin/pcr_result_parser.rb +0 -108
- data/bin/primer_finder.rb +0 -119
- data/bin/read_selection_by_kmer.d +0 -174
- data/bin/scaffold_by_pattern.rb +0 -119
- data/bin/scaffold_connection_possibilities_to_knowns.rb +0 -193
- data/bin/scaffold_end_coverages.rb +0 -69
- data/bin/trail_validator.rb +0 -84
data/bin/kmer_profile_finder.rb
DELETED
@@ -1,92 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'optparse'
|
4
|
-
require 'bio-logger'
|
5
|
-
require 'csv'
|
6
|
-
|
7
|
-
SCRIPT_NAME = File.basename(__FILE__); LOG_NAME = SCRIPT_NAME.gsub('.rb','')
|
8
|
-
|
9
|
-
# Parse command line options into the options hash
|
10
|
-
options = {
|
11
|
-
:logger => 'stderr',
|
12
|
-
:log_level => 'info',
|
13
|
-
}
|
14
|
-
o = OptionParser.new do |opts|
|
15
|
-
opts.banner = "
|
16
|
-
Usage: #{SCRIPT_NAME} <kmer_multiple_abundance_file>
|
17
|
-
|
18
|
-
Given an input kmer then abundances space separated file, and a threshold, print out how many kmers are unique to different subsets of columns\n\n"
|
19
|
-
|
20
|
-
opts.on("--upper-threshold ARG", "kmer frequency cutoff to saying 'present' [required]") do |arg|
|
21
|
-
options[:upper_threshold] = arg.to_i
|
22
|
-
end
|
23
|
-
opts.on("--lower-threshold ARG", "kmer frequency cutoff to saying 'not present' [required]") do |arg|
|
24
|
-
options[:lower_threshold] = arg.to_i
|
25
|
-
end
|
26
|
-
|
27
|
-
# logger options
|
28
|
-
opts.separator "\nVerbosity:\n\n"
|
29
|
-
opts.on("-q", "--quiet", "Run quietly, set logging to ERROR level [default INFO]") {options[:log_level] = 'error'}
|
30
|
-
opts.on("--logger filename",String,"Log to file [default #{options[:logger]}]") { |name| options[:logger] = name}
|
31
|
-
opts.on("--trace options",String,"Set log level [default INFO]. e.g. '--trace debug' to set logging level to DEBUG"){|s| options[:log_level] = s}
|
32
|
-
end; o.parse!
|
33
|
-
if ARGV.length != 1 or options[:upper_threshold].nil? or options[:lower_threshold].nil?
|
34
|
-
$stderr.puts o
|
35
|
-
exit 1
|
36
|
-
end
|
37
|
-
# Setup logging
|
38
|
-
Bio::Log::CLI.logger(options[:logger]); Bio::Log::CLI.trace(options[:log_level]); log = Bio::Log::LoggerPlus.new(LOG_NAME); Bio::Log::CLI.configure(LOG_NAME)
|
39
|
-
|
40
|
-
encoded_counts = {}
|
41
|
-
max_i = 0
|
42
|
-
|
43
|
-
input_file = nil
|
44
|
-
if ARGV[0] == '-'
|
45
|
-
input_file = $stdin
|
46
|
-
else
|
47
|
-
input_file = File.open ARGV[0]
|
48
|
-
end
|
49
|
-
csv = CSV.new(input_file, :col_sep => ' ')
|
50
|
-
|
51
|
-
csv.each do |row|
|
52
|
-
kmer = row[0]
|
53
|
-
counts = row[1...row.length].collect{|s| s.to_i}
|
54
|
-
index = 0
|
55
|
-
counts.each_with_index do |count, i|
|
56
|
-
max_i = i if i > max_i
|
57
|
-
|
58
|
-
if count > options[:upper_threshold]
|
59
|
-
increment = (1<<i)
|
60
|
-
index += increment
|
61
|
-
log.debug "Found a passable for #{options[:threshold]} in index #{i} for #{counts}, count is now #{index}" if log.debug?
|
62
|
-
elsif count < options[:lower_threshold]
|
63
|
-
# do nothing
|
64
|
-
else
|
65
|
-
# coverage was in no man's land between thresholds.
|
66
|
-
# Ignore this kmer as noise.
|
67
|
-
break
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
if index != 0
|
72
|
-
encoded_counts[index] ||= 0
|
73
|
-
encoded_counts[index] += 1
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
(0..encoded_counts.keys.max).each do |i|
|
78
|
-
total = encoded_counts[i]
|
79
|
-
unless total.nil?
|
80
|
-
unencoded = i.to_s(2)
|
81
|
-
|
82
|
-
while unencoded.length <= max_i
|
83
|
-
unencoded = '0'+unencoded
|
84
|
-
end
|
85
|
-
|
86
|
-
puts [
|
87
|
-
i,
|
88
|
-
total,
|
89
|
-
unencoded,
|
90
|
-
].join "\t"
|
91
|
-
end
|
92
|
-
end
|
data/bin/kmers_count_parse.d
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
#!/usr/bin/env rdmd
|
2
|
-
|
3
|
-
import std.stdio;
|
4
|
-
import std.csv;
|
5
|
-
import std.typecons;
|
6
|
-
import std.getopt;
|
7
|
-
import std.algorithm;
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
void main(string[] args)
|
12
|
-
{
|
13
|
-
bool usePercentages = false;
|
14
|
-
int minCount = 1;
|
15
|
-
string trace = "info";
|
16
|
-
getopt(args,
|
17
|
-
"percentage", &usePercentages,
|
18
|
-
"min-count", &minCount,
|
19
|
-
"trace", &trace
|
20
|
-
);
|
21
|
-
|
22
|
-
auto kmersFile = File(args[1]);
|
23
|
-
|
24
|
-
int lineCount = 0;
|
25
|
-
foreach (line; kmersFile.byLine()) {
|
26
|
-
lineCount += 1;
|
27
|
-
if (lineCount % (1024*1024) == 0){
|
28
|
-
stderr.writeln("Parsed ",lineCount, " lines");
|
29
|
-
}
|
30
|
-
auto reader = csvReader!(Tuple!(string,
|
31
|
-
int, int, int, int, int,
|
32
|
-
int, int, int, int, int,
|
33
|
-
int, int, int, int, int,
|
34
|
-
int, int, int, int, int,
|
35
|
-
int, int, int, int, int,
|
36
|
-
int, int, int, int, int,
|
37
|
-
int, int))(line, ' ');
|
38
|
-
foreach (record; reader) {
|
39
|
-
/*writeln(record[0]);
|
40
|
-
writeln(record[1]);
|
41
|
-
writeln(record[1..32]);*/
|
42
|
-
int[] range = [1,2,3,4];
|
43
|
-
int sum = 0;
|
44
|
-
foreach(T; record[1..32]){
|
45
|
-
sum += T;
|
46
|
-
}
|
47
|
-
if (sum >= minCount){
|
48
|
-
writeln(line);
|
49
|
-
}
|
50
|
-
}
|
51
|
-
}
|
52
|
-
}
|
data/bin/kmers_count_tabulate.d
DELETED
@@ -1,123 +0,0 @@
|
|
1
|
-
#!/usr/bin/env rdmd
|
2
|
-
|
3
|
-
import std.stdio;
|
4
|
-
import std.conv;
|
5
|
-
import std.string;
|
6
|
-
import std.regex;
|
7
|
-
import std.getopt;
|
8
|
-
|
9
|
-
void main(string[] args){
|
10
|
-
bool usePercentages = false;
|
11
|
-
int minCount = 1;
|
12
|
-
string trace = "info";
|
13
|
-
getopt(args,
|
14
|
-
"percentage", &usePercentages,
|
15
|
-
"min-count", &minCount,
|
16
|
-
"trace", &trace
|
17
|
-
);
|
18
|
-
|
19
|
-
//Create an array of open file handles, one for each argument given
|
20
|
-
auto filenames = args[1 .. $];
|
21
|
-
int[] totalCounts = new int[filenames.length];
|
22
|
-
int kmerLength = 0;
|
23
|
-
|
24
|
-
foreach(i, file; filenames){
|
25
|
-
int count = 0;
|
26
|
-
auto f = File(file);
|
27
|
-
char[] line;
|
28
|
-
while (f.readln(line)){
|
29
|
-
//foreach(line; f.byLine()){
|
30
|
-
if (kmerLength==0){
|
31
|
-
kmerLength = 101;//to!int(indexOf(line, " "));
|
32
|
-
stderr.writeln("Detected kmer length of ",kmerLength);
|
33
|
-
}
|
34
|
-
int thisCount = to!int(line[kmerLength+1 .. $-1]);
|
35
|
-
//int thisCount = to!int(line[kmerLength+1 .. $]);
|
36
|
-
count += thisCount;
|
37
|
-
//if (count > 4000002){break;}
|
38
|
-
}
|
39
|
-
totalCounts[i] = count;
|
40
|
-
}
|
41
|
-
stderr.writeln("Finished ccounting total kmers, totals were: ",totalCounts);
|
42
|
-
|
43
|
-
if(false){
|
44
|
-
bool allFinished = false;
|
45
|
-
bool[] finished = new bool[filenames.length];
|
46
|
-
foreach (f; finished){f=false;}
|
47
|
-
|
48
|
-
File[] files = new File[filenames.length];
|
49
|
-
foreach(i; 0 .. files.length){
|
50
|
-
files[i] = File(filenames[i]);
|
51
|
-
}
|
52
|
-
|
53
|
-
struct KmerCount {
|
54
|
-
char[101] kmer;
|
55
|
-
int count;
|
56
|
-
}
|
57
|
-
KmerCount[] currentRows = new KmerCount[files.length];
|
58
|
-
char[] lineBuffer;
|
59
|
-
foreach (i; 0..currentRows.length){
|
60
|
-
//read in the line to teh buffer, so memory is not reallocated
|
61
|
-
files[i].readln(lineBuffer);
|
62
|
-
currentRows[i].kmer = chomp(files[i].readln(currentRows[i].kmer))[0..kmerLength];
|
63
|
-
currentRows[i].count = to!int(line[kmerLength+1..$]);
|
64
|
-
}
|
65
|
-
|
66
|
-
//write headers
|
67
|
-
enum ctr = ctRegex!(".*/(.+)");
|
68
|
-
foreach(f; filenames){
|
69
|
-
write("\t",match(f, ctr).captures[1]);
|
70
|
-
}
|
71
|
-
writeln();
|
72
|
-
|
73
|
-
string[] toPrint = new string[filenames.length+1];
|
74
|
-
int kmersCounted = 0;
|
75
|
-
while (!allFinished){
|
76
|
-
kmersCounted += 1;
|
77
|
-
if (kmersCounted % (1024*1024) == 0){stderr.writeln("Processed ",kmersCounted," kmers.");}
|
78
|
-
//Find the lowest kmer
|
79
|
-
string lowestKmer = null;
|
80
|
-
foreach (kc; currentRows){
|
81
|
-
if (lowestKmer == null || kc.kmer < lowestKmer){
|
82
|
-
lowestKmer = kc.kmer;
|
83
|
-
}
|
84
|
-
}
|
85
|
-
|
86
|
-
//Go through each file, printing the number of this kmer found
|
87
|
-
int totalObservations = 0;
|
88
|
-
toPrint[0] = lowestKmer;
|
89
|
-
foreach (i, kc; currentRows){
|
90
|
-
if (kc.kmer == lowestKmer){
|
91
|
-
totalObservations += kc.count;
|
92
|
-
if (usePercentages){
|
93
|
-
toPrint[i+1] = to!string(to!float(kc.count)/totalCounts[i]);
|
94
|
-
} else {
|
95
|
-
toPrint[i+1] = to!string(kc.count);
|
96
|
-
}
|
97
|
-
|
98
|
-
// Read a new line in, check if this file is finished
|
99
|
-
auto line = files[i].readln;
|
100
|
-
if (line == null){
|
101
|
-
finished[i] = true;
|
102
|
-
allFinished = true; //guilty until proven innocent
|
103
|
-
foreach(f; finished){
|
104
|
-
if (!f){
|
105
|
-
allFinished = false;
|
106
|
-
}
|
107
|
-
}
|
108
|
-
currentRows[i].kmer = null;
|
109
|
-
currentRows[i].count = -1;
|
110
|
-
} else {
|
111
|
-
//Regular line to be read in
|
112
|
-
currentRows[i].kmer = line[0..kmerLength];
|
113
|
-
currentRows[i].count = to!int(line[kmerLength+1..$-1]);
|
114
|
-
}
|
115
|
-
} else {
|
116
|
-
toPrint[i+1] = "0";
|
117
|
-
}
|
118
|
-
}
|
119
|
-
if (totalObservations >= minCount){
|
120
|
-
writeln(join(toPrint, "\t"));
|
121
|
-
}
|
122
|
-
}
|
123
|
-
}}
|
data/bin/kmers_count_tabulate.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'optparse'
|
4
|
-
require 'bio-logger'
|
5
|
-
require 'csv'
|
6
|
-
require 'progressbar'
|
7
|
-
require 'tempfile'
|
8
|
-
require 'systemu'
|
9
|
-
|
10
|
-
SCRIPT_NAME = File.basename(__FILE__); LOG_NAME = SCRIPT_NAME.gsub('.rb','')
|
11
|
-
|
12
|
-
# Parse command line options into the options hash
|
13
|
-
options = {
|
14
|
-
:logger => 'stderr',
|
15
|
-
:log_level => 'info',
|
16
|
-
:min_count => 1,
|
17
|
-
}
|
18
|
-
o = OptionParser.new do |opts|
|
19
|
-
opts.banner = "
|
20
|
-
Usage: #{SCRIPT_NAME} <kmers_count_output1> [<kmers_count_output2> ..]
|
21
|
-
|
22
|
-
Take a list of files output from libngs' kmers_count tool, after being run through gnu sort.
|
23
|
-
|
24
|
-
Create a table, where the columns are each file, the rows are each kmer, and
|
25
|
-
the cells are the percent of that file's kmer actually is that kmer.\n\n"
|
26
|
-
|
27
|
-
|
28
|
-
opts.on("--output-file FILENAME", "Output file path [required]") do |arg|
|
29
|
-
options[:output_file] = arg
|
30
|
-
end
|
31
|
-
|
32
|
-
opts.on("--percentage", "description [default: #{options[:eg]}]") do
|
33
|
-
raise "not yet implemented"
|
34
|
-
options[:percentage_outputs] = true
|
35
|
-
end
|
36
|
-
opts.on("--min-count COUNT", "require at least this many kmers to be output into the output file [default: #{options[:min_count]}]") do |arg|
|
37
|
-
raise "not yet implemented"
|
38
|
-
options[:min_count] = arg.to_i
|
39
|
-
end
|
40
|
-
|
41
|
-
# logger options
|
42
|
-
opts.separator "\nVerbosity:\n\n"
|
43
|
-
opts.on("-q", "--quiet", "Run quietly, set logging to ERROR level [default INFO]") {options[:log_level] = 'error'}
|
44
|
-
opts.on("--logger filename",String,"Log to file [default #{options[:logger]}]") { |name| options[:logger] = name}
|
45
|
-
opts.on("--trace options",String,"Set log level [default INFO]. e.g. '--trace debug' to set logging level to DEBUG"){|s| options[:log_level] = s}
|
46
|
-
end; o.parse!
|
47
|
-
if ARGV.length == 0 or options[:output_file].nil?
|
48
|
-
$stderr.puts o
|
49
|
-
exit 1
|
50
|
-
end
|
51
|
-
# Setup logging
|
52
|
-
Bio::Log::CLI.logger(options[:logger]); Bio::Log::CLI.trace(options[:log_level]); log = Bio::Log::LoggerPlus.new(LOG_NAME); Bio::Log::CLI.configure(LOG_NAME)
|
53
|
-
|
54
|
-
filenames = ARGV
|
55
|
-
raise "I need more than 1 file" unless filenames.length > 1
|
56
|
-
log.info "Joining these files: #{filenames.inspect}"
|
57
|
-
|
58
|
-
# run gnu join on each file
|
59
|
-
current_build_file = filenames[0] #Build off the current build file first, then a tempfile subsequently
|
60
|
-
|
61
|
-
Tempfile.open('kmers_join1') do |tempfile1|
|
62
|
-
Tempfile.open('kmers_join2') do |tempfile2|
|
63
|
-
filenames.each_with_index do |file, i|
|
64
|
-
next if i==0
|
65
|
-
|
66
|
-
first_file_output_fields = (2..(i+1)).to_a.collect{|n| "1.#{n.to_s}"}.join(',')
|
67
|
-
cmd = "join -a1 -a2 -e 0 -o0,#{first_file_output_fields},2.2 #{current_build_file.inspect} #{file} >#{tempfile2.path}"
|
68
|
-
log.info "At #{Time.now}, running #{cmd}.."
|
69
|
-
status, stdout, stderr = systemu cmd
|
70
|
-
raise stderr unless stderr == ''
|
71
|
-
raise 'exitstatus bad1!' unless status.exitstatus == 0
|
72
|
-
status, stdout, stderr = systemu "mv #{tempfile2.path} #{tempfile1.path}"
|
73
|
-
raise stderr unless stderr == ''
|
74
|
-
raise 'exitstatus bad2!' unless status.exitstatus == 0
|
75
|
-
current_build_file = tempfile1.path
|
76
|
-
end
|
77
|
-
status, stdout, stderr = systemu "mv #{current_build_file} #{options[:output_file]}"
|
78
|
-
raise stderr unless stderr == ''
|
79
|
-
raise 'exitstatus bad3!' unless status.exitstatus == 0
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
|
-
|
data/bin/pcr_result_parser.rb
DELETED
@@ -1,108 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'optparse'
|
4
|
-
require 'bio-logger'
|
5
|
-
require 'csv'
|
6
|
-
|
7
|
-
SCRIPT_NAME = File.basename(__FILE__); LOG_NAME = SCRIPT_NAME.gsub('.rb','')
|
8
|
-
|
9
|
-
# Parse command line options into the options hash
|
10
|
-
options = {
|
11
|
-
:logger => 'stderr',
|
12
|
-
:log_level => 'info',
|
13
|
-
}
|
14
|
-
o = OptionParser.new do |opts|
|
15
|
-
opts.banner = "
|
16
|
-
Usage: #{SCRIPT_NAME} <arguments>
|
17
|
-
|
18
|
-
Takes a list of PCR primers that were put in several lanes (not all primers in all lanes), and a list of bands that were found, and decipher which bands are the result of which primer pairs, as best as possible\n\n"
|
19
|
-
|
20
|
-
opts.on("--bands-file FILE", "tsv file, with the band names as the first column, and the lane numbers that they appear in as the second column (comma separated) [required]") do |arg|
|
21
|
-
options[:bands_file] = arg
|
22
|
-
end
|
23
|
-
opts.on("--primers-file FILE", "tsv file, with the lane names as the first column, and the set of primers numbers that are in each lane as the second column (comma separated) [required]") do |arg|
|
24
|
-
options[:primers_file] = arg
|
25
|
-
end
|
26
|
-
|
27
|
-
# logger options
|
28
|
-
opts.separator "\nVerbosity:\n\n"
|
29
|
-
opts.on("-q", "--quiet", "Run quietly, set logging to ERROR level [default INFO]") {options[:log_level] = 'error'}
|
30
|
-
opts.on("--logger filename",String,"Log to file [default #{options[:logger]}]") { |name| options[:logger] = name}
|
31
|
-
opts.on("--trace options",String,"Set log level [default INFO]. e.g. '--trace debug' to set logging level to DEBUG"){|s| options[:log_level] = s}
|
32
|
-
end; o.parse!
|
33
|
-
if ARGV.length != 0 or options[:bands_file].nil? or options[:primers_file].nil?
|
34
|
-
$stderr.puts o
|
35
|
-
exit 1
|
36
|
-
end
|
37
|
-
# Setup logging
|
38
|
-
Bio::Log::CLI.logger(options[:logger]); Bio::Log::CLI.trace(options[:log_level]); log = Bio::Log::LoggerPlus.new(LOG_NAME); Bio::Log::CLI.configure(LOG_NAME)
|
39
|
-
|
40
|
-
|
41
|
-
# Read in the bands
|
42
|
-
bands_to_lanes = {}
|
43
|
-
CSV.foreach(options[:bands_file], :col_sep => "\t") do |row|
|
44
|
-
raise "Malformed bands file in this line: #{row.inspect}" unless row.length == 2
|
45
|
-
|
46
|
-
band_name = row[0]
|
47
|
-
raise "Two bands were labeled the same way, as #{band_name.inspect}" if bands_to_lanes.key?(band_name)
|
48
|
-
|
49
|
-
lanes_of_this_band = row[1].split(/[,\s]/).collect{|c| c.strip}
|
50
|
-
bands_to_lanes[band_name] = lanes_of_this_band
|
51
|
-
end
|
52
|
-
log.info "Parsed in #{bands_to_lanes.length} bands, found #{bands_to_lanes.collect{|k,v| v.length}.join(',')} lanes each, respectively"
|
53
|
-
|
54
|
-
# Read in the primer sets
|
55
|
-
lanes_to_primers = {}
|
56
|
-
CSV.foreach(options[:primers_file], :col_sep => "\t") do |row|
|
57
|
-
raise "Malformed primers file in this line: #{row.inspect}" unless row.length == 2
|
58
|
-
|
59
|
-
lane_name = row[0]
|
60
|
-
raise "Two lanes were labeled the same way, as #{lane_name.inspect}" if lanes_to_primers.key?(lane_name)
|
61
|
-
|
62
|
-
primers_of_this_band = row[1].split(/[,\s]/).collect{|c| c.strip}
|
63
|
-
lanes_to_primers[lane_name] = primers_of_this_band
|
64
|
-
end
|
65
|
-
log.info "Parsed in #{lanes_to_primers.length} lanes, with #{lanes_to_primers.collect{|k,v| v.length}.join(',')} primers each, respectively"
|
66
|
-
|
67
|
-
|
68
|
-
# Go through each pairing of primers. Which primer sets explain each band?
|
69
|
-
all_primers = lanes_to_primers.values.flatten.sort.uniq
|
70
|
-
lanes = lanes_to_primers.keys
|
71
|
-
bands = bands_to_lanes.keys
|
72
|
-
|
73
|
-
bands_to_explaining_primer_pairs = {}
|
74
|
-
|
75
|
-
bands.each do |band|
|
76
|
-
log.debug "Going after band #{band}"
|
77
|
-
all_primers.combination(2) do |array|
|
78
|
-
|
79
|
-
primer1 = array.sort[0]
|
80
|
-
primer2 = array.sort[1]
|
81
|
-
log.debug "Testing primers #{primer1}/#{primer2} agreement with band #{band}"
|
82
|
-
|
83
|
-
band_agrees_with_this_primer_pair = true
|
84
|
-
lanes.each do |lane|
|
85
|
-
band_is_in_this_lane = bands_to_lanes[band].include?(lane)
|
86
|
-
primers_here = lanes_to_primers[lane]
|
87
|
-
if band_is_in_this_lane and (!primers_here.include?(primer1) or !primers_here.include?(primer2))
|
88
|
-
log.debug "primer pair #{primer1}/#{primer2} fails for band #{band} because band was present but at least one primer wasn't, in lane #{lane}"
|
89
|
-
band_agrees_with_this_primer_pair = false
|
90
|
-
end
|
91
|
-
if !band_is_in_this_lane and (primers_here.include?(primer1) and primers_here.include?(primer2))
|
92
|
-
log.debug "primer pair #{primer1}/#{primer2} fails for band #{band} because band was not present but both primers were, in lane #{lane}"
|
93
|
-
band_agrees_with_this_primer_pair = false
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
if band_agrees_with_this_primer_pair
|
98
|
-
log.debug "Found a suitable pair of primers for band #{band}: #{primer1}/#{primer2}"
|
99
|
-
bands_to_explaining_primer_pairs[band] ||= []
|
100
|
-
bands_to_explaining_primer_pairs[band].push array
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
puts [
|
105
|
-
band,
|
106
|
-
bands_to_explaining_primer_pairs[band].nil? ? 'none' : bands_to_explaining_primer_pairs[band].collect{|a| "(#{a.join(',')})"}.join(', ')
|
107
|
-
].join("\t")
|
108
|
-
end
|