#! /usr/bin/env ruby

#version 2, 2009/01/24


if ARGV.length == 1
	scale = 1.0
elsif ARGV.length == 2
	scale = ARGV.shift.to_f
else
	STDERR.puts "USAGE: newick2mafft.rb scale input_tree > output"
	exit
end

if scale <= 0.0 then
	STDERR.puts "Inappropriate scale, #{scale.to_s}"
	exit
end

STDERR.puts "scale = " + scale.to_s

infp = File.open( ARGV.shift, "r" )

tree = ""
while line = infp.gets
	tree += line.strip
	break if tree =~ /;$/
end
infp.close


#tree = tree.gsub( /_.*?:/, ":" ).gsub(/[0-9]\.[0-9]*e-[0-9][0-9]/, "0").gsub(/\[.*?\]/,"").gsub(/ /, "").gsub(/:\-[0-9\.]+/, ":0.0" )
tree = tree.gsub( /_.*?:/, ":" ).gsub(/[0-9]\.[0-9]*e-[0-9][0-9]/, "0").gsub(/\[.*?\]/,"").gsub(/ /, "")


STDERR.puts "Initial tree = " +  tree

def resolve( tree )


while 1
#	p tree
	tree.sub!( /\,([0-9]+):(\-?[0-9\.]+)\,([0-9]+):(\-?[0-9\.]+)/, ",XXX" )
	hit1 = $1
	hit2 = $2
	hit3 = $3
	hit4 = $4

#	p hit1
#	p hit2
#	p hit3
#	p hit4

#	puts "introduce XXX"
#	p tree

	break unless tree.index(/XXX/)

	poshit = tree.index(/XXX/)
#	puts "poshit=" + poshit.to_s

	i = poshit
	height = 0
	while i >= 0
		break if height == 0 && tree[i..i] == '('
		if tree[i..i] == ')' then
			height += 1
		elsif tree[i..i] == '(' then
			height -= 1
		end
		i -= 1
	end

	poskakko = i
#	puts "poskakko = " + poskakko.to_s
	zenhan = tree[0..poskakko]
	zenhan = "" if poskakko == -1
#	puts "zenhan = " + zenhan

	treelen = tree.length
	tree = zenhan + "(" + tree[poskakko+1..treelen]
#	puts "add ("
#	p tree
	tree.sub!( /XXX/, "#{hit1}:#{hit2}):0,#{hit3}:#{hit4}" )

#	p tree
end


return tree

end

memi = [-1,-1]
leni = [-1,-1]

while tree.index( /\(/ ) 

	tree = resolve( tree )

	tree.sub!( /\(([0-9]+):(\-?[0-9\.]+),([0-9]+):(\-?[0-9\.]+)\)/, "XXX" )
	memi[0] = $1.to_i
	leni[0] = $2.to_f * scale
	memi[1] = $3.to_i
	leni[1] = $4.to_f * scale

	if leni[0] > 10 || leni[1] > 10 then
		STDERR.puts ""
		STDERR.puts "Please check the scale of branch length!"
		STDERR.puts "The unit of branch lengths must be 'substitution/site'"
		STDERR.puts "If the unit is 'substition' in your tree, please"
		STDERR.puts "use the scale argument,"
		STDERR.puts "% newick2mafft scale in > out"
		STDERR.puts "where scale = 1/(alignment length)"
		STDERR.puts ""
		exit 1
	end

#	STDERR.puts "subtree = " + $&

	if memi[1] < memi[0] then
		memi.reverse!
		leni.reverse!
	end

	tree.sub!( /XXX/, memi[0].to_s )

	STDERR.puts "Tree = " + tree

	printf( "%5d %5d %10.5f %10.5f\n", memi[0], memi[1], leni[0], leni[1] )

end
