annotate SNV/SNVMix2_source/SNVMix2-v0.12.1-rc1/samtools-0.1.6/misc/soap2sam.pl @ 0:74f5ea818cea

Uploaded
author ryanmorin
date Wed, 12 Oct 2011 19:50:38 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
1 #!/usr/bin/perl -w
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
2
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
3 # Contact: lh3
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
4 # Version: 0.1.1
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
5
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
6 use strict;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
7 use warnings;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
8 use Getopt::Std;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
9
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
10 &soap2sam;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
11 exit;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
12
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
13 sub mating {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
14 my ($s1, $s2) = @_;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
15 my $isize = 0;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
16 if ($s1->[2] ne '*' && $s1->[2] eq $s2->[2]) { # then calculate $isize
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
17 my $x1 = ($s1->[1] & 0x10)? $s1->[3] + length($s1->[9]) : $s1->[3];
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
18 my $x2 = ($s2->[1] & 0x10)? $s2->[3] + length($s2->[9]) : $s2->[3];
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
19 $isize = $x2 - $x1;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
20 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
21 # update mate coordinate
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
22 if ($s2->[2] ne '*') {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
23 @$s1[6..8] = (($s2->[2] eq $s1->[2])? "=" : $s2->[2], $s2->[3], $isize);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
24 $s1->[1] |= 0x20 if ($s2->[1] & 0x10);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
25 } else {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
26 $s1->[1] |= 0x8;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
27 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
28 if ($s1->[2] ne '*') {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
29 @$s2[6..8] = (($s1->[2] eq $s2->[2])? "=" : $s1->[2], $s1->[3], -$isize);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
30 $s2->[1] |= 0x20 if ($s1->[1] & 0x10);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
31 } else {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
32 $s2->[1] |= 0x8;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
33 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
34 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
35
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
36 sub soap2sam {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
37 my %opts = ();
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
38 getopts("p", \%opts);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
39 die("Usage: soap2sam.pl [-p] <aln.soap>\n") if (@ARGV == 0 && -t STDIN);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
40 my $is_paired = defined($opts{p});
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
41 # core loop
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
42 my @s1 = ();
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
43 my @s2 = ();
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
44 my ($s_last, $s_curr) = (\@s1, \@s2);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
45 while (<>) {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
46 s/[\177-\377]|[\000-\010]|[\012-\040]//g;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
47 next if (&soap2sam_aux($_, $s_curr, $is_paired) < 0);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
48 if (@$s_last != 0 && $s_last->[0] eq $s_curr->[0]) {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
49 &mating($s_last, $s_curr);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
50 print join("\t", @$s_last), "\n";
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
51 print join("\t", @$s_curr), "\n";
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
52 @$s_last = (); @$s_curr = ();
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
53 } else {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
54 print join("\t", @$s_last), "\n" if (@$s_last != 0);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
55 my $s = $s_last; $s_last = $s_curr; $s_curr = $s;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
56 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
57 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
58 print join("\t", @$s_last), "\n" if (@$s_last != 0);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
59 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
60
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
61 sub soap2sam_aux {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
62 my ($line, $s, $is_paired) = @_;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
63 chomp($line);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
64 my @t = split(/\s+/, $line);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
65 return -1 if (@t < 9 || $line =~ /^\s/ || !$t[0]);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
66 @$s = ();
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
67 # fix SOAP-2.1.x bugs
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
68 @t = @t[0..2,4..$#t] unless ($t[3] =~ /^\d+$/);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
69 # read name
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
70 $s->[0] = $t[0];
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
71 $s->[0] =~ s/\/[12]$//g;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
72 # initial flag (will be updated later)
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
73 $s->[1] = 0;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
74 $s->[1] |= 1 | 1<<($t[4] eq 'a'? 6 : 7);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
75 $s->[1] |= 2 if ($is_paired);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
76 # read & quality
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
77 $s->[9] = $t[1];
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
78 $s->[10] = (length($t[2]) > length($t[1]))? substr($t[2], 0, length($t[1])) : $t[2];
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
79 # cigar
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
80 $s->[5] = length($s->[9]) . "M";
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
81 # coor
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
82 $s->[2] = $t[7]; $s->[3] = $t[8];
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
83 $s->[1] |= 0x10 if ($t[6] eq '-');
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
84 # mapQ
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
85 $s->[4] = $t[3] == 1? 30 : 0;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
86 # mate coordinate
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
87 $s->[6] = '*'; $s->[7] = $s->[8] = 0;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
88 # aux
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
89 push(@$s, "NM:i:$t[9]");
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
90 my $md = '';
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
91 if ($t[9]) {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
92 my @x;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
93 for (10 .. $#t) {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
94 push(@x, sprintf("%.3d,$1", $2)) if ($t[$_] =~ /^([ACGT])->(\d+)/i);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
95 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
96 @x = sort(@x);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
97 my $a = 0;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
98 for (@x) {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
99 my ($y, $z) = split(",");
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
100 $md .= (int($y)-$a) . $z;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
101 $a += $y - $a + 1;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
102 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
103 $md .= length($t[1]) - $a;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
104 } else {
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
105 $md = length($t[1]);
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
106 }
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
107 push(@$s, "MD:Z:$md");
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
108 return 0;
74f5ea818cea Uploaded
ryanmorin
parents:
diff changeset
109 }