initial commit
[jalview.git] / forester / ruby / evoruby / lib / evo / soft / tree_puzzle.rb
1 #
2 # = lib/soft/tree_puzzle - TreePuzzle  class
3 #
4 # Copyright::  Copyright (C) 2009 Christian M. Zmasek
5 # License::    GNU Lesser General Public License (LGPL)
6 #
7 # $Id: tree_puzzle.rb,v 1.5 2009/10/08 22:44:54 cmzmasek Exp $
8 #
9 # last modified: 2009/10/06
10
11 require 'lib/evo/soft/resource_locations'
12 require 'lib/evo/util/util'
13
14 module Evoruby
15
16     class TreePuzzle
17
18         VERBOSE = false
19         
20         OUTDIST = 'outdist'
21         OUTFILE = 'outfile'
22         VERSION = '5.2'
23         
24         def initialize
25             @tree_puzzle_home = Util.get_env_variable_value( ResourceLocations::TREEPUZZLE_HOME_ENV_VARIABLE )
26             Util.check_file_for_readability( @tree_puzzle_home )
27         end
28
29         def run( alignment_file, model, rate_heterogeneity, number_of_seqs )
30             Util.check_file_for_readability( alignment_file )
31
32             input = alignment_file
33             input << "\nk\nk"
34             if number_of_seqs <= 257
35                 input << "\nk"
36             end
37             input << determine_model_option( model )
38             input << determine_rate_heterogeneity_option( rate_heterogeneity )
39             input << "\ny\n"
40
41             if VERBOSE
42                 puts @tree_puzzle_home + " " + input
43             end
44             IO.popen( @tree_puzzle_home, 'r+' ) do |io|
45                 io.puts input
46                 io.close_write
47                 return io.read
48             end
49         end
50
51         private
52
53         # "Model of substitution" order for DQO TREE-PUZZLE 5.0:
54         # Auto
55         # m -> Dayhoff (Dayhoff et al. 1978)
56         # m -> JTT (Jones et al. 1992)
57         # m -> mtREV24 (Adachi-Hasegawa 1996)
58         # m -> BLOSUM62 (Henikoff-Henikoff 92)
59         # m -> VT (Mueller-Vingron 2000)
60         # m -> WAG (Whelan-Goldman 2000)
61         # m -> Auto
62         def determine_model_option( model )
63             cmd = nil
64             if ( model == :pam )
65                 cmd = "\nm"
66             elsif ( model == :jtt )
67                 cmd = "\nm\nm"
68             elsif ( model == :mtrev24 )
69                 cmd = "\nm\nm\nm"
70             elsif ( model == :blosum62 )
71                 cmd = "\nm\nm\nm\nm"
72             elsif ( model == :vt )
73                 cmd = "\nm\nm\nm\nm\nm"
74             elsif ( model == :wag )
75                 cmd = "\nm\nm\nm\nm\nm\nm"
76             elsif ( model == :auto )
77                 cmd = ""
78             else
79                 error_msg = "unknown model"
80                 raise ArgumentError, error_msg
81             end
82             cmd
83         end
84
85
86         # Model of rate heterogeneity:
87         #    "8 Gamma distributed rates"
88         #    "Two rates (1 invariable + 1 variable)"
89         #    "Mixed (1 invariable + 8 Gamma rates)"
90         #    otherwise: Uniform rate
91         def determine_rate_heterogeneity_option( rates )
92             opt = nil
93             if ( rates == :gamma8 )
94                 opt = "\nw"
95             elsif ( rates == :inv1_var1 )
96                 opt = "\nw\nw"
97             elsif ( rates == :inv1_gamma8 )
98                 opt = "\nw\nw\nw"
99             elsif ( rates == :uniform )
100                 opt = ""
101             else
102                 error_msg = "unknown rate heterogeneity option"
103                 raise ArgumentError, error_msg
104             end
105             return opt
106         end
107
108     end # class TreePuzzle
109
110 end # module Evoruby