#!/bin/env perl # DO NOT EDIT the /cluster/bin/scripts copy of this file -- # edit ~/kent/src/hg/utils/automation/blastz-normalizeLav instead. # $Id: blastz-normalizeLav,v 1.1 2006/10/09 20:44:33 angie Exp $ my $from0 = 0; my $from1 = 0; my $to0 = 0; my $to1 = 0; my $len0 = 1; my $len1 = 1; my $isrc = 0; my @line = (); sub get { return ($#line < 0) ? scalar(<>) : pop @line; } sub unget { my $a = shift; push(@line,$a) if $a; } sub max { $_[0] > $_[1] ? $_[0] : $_[1]; } sub get_next { my $s; while (($s = get) && ($s =~ /^\s*$/)) { } return $s; } sub do_copy { my $s = shift; print $s if $s; while (($s = get) && ($s !~ /^\}/)) { print "$s"; } print $s if $s; } sub do_finish { my $s = shift; print $s if $s; return if $s =~ /^}/; do_copy ""; } sub do_s { my $s = shift; my $n; print $s; my $s1 = get_next; $s1 =~ /^\s*("[^"]*")\s+(\d+)\s+(\d+)(.*)$/ or die; $from0 = $2; $to0 = $3; $n = max($3, $len0); print " $1 1 $n $4\n"; my $s2 = get_next; $s2 =~ /^\s*("[^"]*")\s+(\d+)\s+(\d+)(.*)$/ or die; $from1 = $2; $to1 = $3; $n = max($3, $len1); print " $1 1 $n $4\n"; $isrc = scalar($1 =~ /-"$/); do_finish ""; } # # abs: 1....from....to....len1 # rel: .....1.......n......... # # n == (to-from+1) # rev(x) == n-x+1 # abs(x) == from+x-1 # # abs(rev(x)) == from+(to-from+1-x+1)-1 == to-x+1 # Rev(abs(rev(x))) == len1-(to-x+1)+1 == len1-to+x # sub S0 { $_[0] + $from0 - 1; } sub S1 { $_[0] + $from1 - 1; } sub R1 { ($to1-$from1+1) - $_[0] + 1; } sub M1 { my $x = $_[0]; if ($len1 == 0) {return $x;} else {return $isrc ? $len1-$to1+$x : $from1+$x-1;} } sub do_a { my $s = shift; print $s; $s = get_next; print $s; $s = get_next; $s =~ /^\s*b\s+(\d+)\s+(\d+)/ or die; printf " b %d %d\n", S0($1), M1($2); $s = get_next; $s =~ /^\s*e\s+(\d+)\s+(\d+)/ or die; printf " e %d %d\n", S0($1), M1($2); while ($s = get_next) { last unless $s =~ /^\s*l\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/; printf " l %d %d %d %d %g\n", S0($1), M1($2), S0($3), M1($4), $5; } do_finish $s; } sub do_m { my $s = shift; print $s; while ($s = get_next) { if ($s =~ /^\s*n/) { print $s; } elsif ($s =~ /^\s*x\s+(\d+)\s+(\d+)/) { printf " x %d %d\n", $1+$from0-1, $2+$from0-1; } else { last; } } do_finish $s; } # main $len0 = shift or die; $len1 = shift; my $s = <>; die "not lav" unless $s eq "#:lav\n"; print $s; print "d {\n"; print " normalize-lav $len0 $len1\n"; print "}\n"; while ($s = get_next) { if ($s =~ /^\s*#/) { print $s; } elsif ($s =~ /^s/) { do_s $s; } elsif ($s =~ /^a/) { do_a $s; } elsif ($s =~ /^m/) { do_m $s; } else { do_copy $s; } }