]> git.donarmstrong.com Git - biopieces.git/commitdiff
fixed popen3 issue in align.rb
authormartinahansen <martinahansen@74ccb610-7750-0410-82ae-013aeee3265d>
Sun, 22 Jan 2012 19:18:56 +0000 (19:18 +0000)
committermartinahansen <martinahansen@74ccb610-7750-0410-82ae-013aeee3265d>
Sun, 22 Jan 2012 19:18:56 +0000 (19:18 +0000)
git-svn-id: http://biopieces.googlecode.com/svn/trunk@1730 74ccb610-7750-0410-82ae-013aeee3265d

code_ruby/lib/maasha/align.rb

index 16e0d636e2092a086ef24553d23aafa5e4ca568e..411e4593b0900e6eec60240c069d6bb59fc25bc6 100755 (executable)
@@ -23,7 +23,7 @@
 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
 require 'pp'
-require 'tempfile'
+require 'open3'
 require 'narray'
 require 'maasha/fasta'
 
@@ -79,37 +79,40 @@ ROW_T = 1
 ROW_C = 2
 ROW_G = 3
 
+class Fasta
+  def initialize(io)
+    @io = io
+  end
+
+  def close
+    @io.close
+  end
+end
+
 # Class for aligning sequences.
 class Align
   # Class method to align sequences in a list of Seq objects and
   # return these as a new list of Seq objects.
   def self.muscle(entries, verbose = false)
-    file_in  = Tempfile.new("input")
-    file_out = Tempfile.new("output")
     result   = []
     index    = {}
 
-    Fasta.open(file_in, "w") do |ios|
+    Open3.popen3("muscle", "-quiet") do |stdin, stdout, stderr|
       entries.each do |entry|
         raise AlignError, "Duplicate sequence name: #{entry.seq_name}" if index.has_key? entry.seq_name
 
         index[entry.seq_name] = entry
 
-        ios.puts entry.to_fasta
+        stdin.puts entry.to_fasta
       end
-    end
 
-    if verbose
-      cmd = "muscle < #{file_in.path} > #{file_out.path}"
-    else
-      cmd = "muscle -quiet < #{file_in.path} > #{file_out.path}"
-    end
+      stdin.close
+
+      stderr.each_line { |line| $stderr.puts line } if verbose
 
-    system(cmd)
-    raise AlignError, "command failed: #{cmd}" unless $?.success?
+      aligned_entries = Fasta.new(stdout)
 
-    Fasta.open(file_out, "r") do |ios|
-      ios.each do |fa_entry|
+      aligned_entries.each do |fa_entry|
         fq_entry = index[fa_entry.seq_name]
 
         fa_entry.seq.scan(/-+/) do |m|