Mercurial > repos > jjohnson > crest
view removeDupSV.pl @ 0:acc8d8bfeb9a
Uploaded
author | jjohnson |
---|---|
date | Wed, 08 Feb 2012 16:59:24 -0500 |
parents | |
children |
line wrap: on
line source
#!/nfs_exports/apps/64-bit/gnu-apps/perl5.8.9/bin/perl -w use strict; use Carp; use Getopt::Long; use English; use Pod::Usage; use Data::Dumper; use DBI; use DBD::mysql; my ( $help, $man, $version, $usage ); my ($in, $out); my $min_inv = 10000; my $min_total_sclip = 6; my $add_inv_back; my $width = 20; my $optionOK = GetOptions( 'i|in|input=s' => \$in, 'o|out|output=s' => \$out, 'min_inv_size=i' => \$min_inv, 'min_total_sclip=i' => \$min_total_sclip, 'add_inv_back!' => \$add_inv_back, 'width=i' => \$width, 'h|help|?' => \$help, 'man' => \$man, 'usage' => \$usage, 'v|version' => \$version, ); pod2usage(2) if($man); pod2usage( -verbose => 99, -sections => "USAGE|REQUIRED ARGUMENTS|OPTIONS" ) if($help or $usage); pod2usage( -verbose => 99, -sections => "VERSION") if($version); croak "Missing input file" if(!$in); open STDOUT, ">$out" if($out); open my $IN, "<$in" or croak "can't open $in: $OS_ERROR"; my @SV; my @discard_SV; while(my $line = <$IN>) { chomp $line; my ($chrA, $posA, $ortA, $countA, $chrB, $posB, $ortB, $countB, $type) = split /\t/, $line; next if( search_sv(\@SV, $chrA, $posA, $chrB, $posB, $type)); if(($type eq 'ITX' || $type eq 'INV') && (abs($posB - $posA) < $min_inv && ($countA + $countB) < $min_total_sclip)) { print STDERR "$line is removed due to possible circulization\n"; push @discard_SV, $line; next; } push @SV, [$chrA, $posA, $chrB, $posB, $type, $line]; } close $IN; foreach my $sv (@SV) { print STDOUT $sv->[5]; # if($sv->[4] eq 'DEL') { # my $tmp = get_gene_info($sv->[0], $sv->[1], $sv->[3]); # print STDOUT "\t", $tmp if($tmp); # } # else { # print STDOUT "\t", get_gene_info($sv->[0], $sv->[1], $sv->[1]); # print STDOUT "\t", get_gene_info($sv->[2], $sv->[3], $sv->[3]); # } print STDOUT "\n"; } if($add_inv_back) { foreach my $sv (@discard_SV) { my ($chrA, $posA, $ortA, $countA, $chrB, $posB, $ortB, $countB, $type) = split /\t/, $sv; next if(search_nearby_sv(\@SV, $chrA, $posA, $posB)); print STDOUT $sv; print "\n"; } } close STDOUT if($out); exit(0); sub search_nearby_sv { my($r_SV, $chrA, $posA, $posB) = @_; foreach my $sv (@{$r_SV}) { return 1 if($sv->[0] eq $chrA && abs($sv->[1] - $posA) < 10000); return 1 if($sv->[2] eq $chrA && abs($sv->[3] - $posA) < 10000); return 1 if($sv->[0] eq $chrA && abs($sv->[1] - $posB) < 10000); return 1 if($sv->[2] eq $chrA && abs($sv->[3] - $posB) < 10000); } return; } sub search_sv { my ($r_SV, $chrA, $posA, $chrB, $posB, $type) = @_; for(my $i = 0; $i < scalar @{$r_SV}; $i++) { my $sv = $r_SV->[$i]; if($type eq "INV" && $r_SV->[$i][4] eq "ITX" ) { if(( $sv->[0] eq $chrA && abs($sv->[1] - $posA) < 20 && $sv->[2] eq $chrB && abs($sv->[3] - $posB) < 20 )|| ( $sv->[0] eq $chrB && abs($sv->[1] - $posB) < 20 && $sv->[2] eq $chrA && abs($sv->[3] - $posA) < 20)) { delete $r_SV->[$i]; return; } } else { return 1 if( $sv->[0] eq $chrA && abs($sv->[1] - $posA) < $width && $sv->[2] eq $chrB && abs($sv->[3] - $posB) < $width && $sv->[4] eq $type); return 1 if( $sv->[0] eq $chrB && abs($sv->[1] - $posB) < $width && $sv->[2] eq $chrA && abs($sv->[3] - $posA) < $width && $sv->[4] eq $type); return 1 if( $sv->[0] eq $chrA && abs($sv->[1] - $posA) < $width && $sv->[2] eq $chrB && abs($sv->[3] - $posB) < $width && $sv->[4] eq $type && $type eq 'CTX'); return 1 if( $sv->[0] eq $chrB && abs($sv->[1]- $posB) < $width && $sv->[2] eq $chrA && abs($sv->[3] - $posA) < $width && $sv->[4] eq $type && $type eq 'CTX'); } } return; } =head1 NAME removeDupSV.pl - a program to remove duplicated SVs for CREST.pl =head1 VERSION This documentation refers to removeDupSV.pl version 0.0.1. =head1 USAGE The program need an input file generated by CREST.pl removeDupSV.pl -i tumor.predSV.txt -o tumor.predSV.txt.nodup =head1 REQUIRED ARGUMENTS To run the program, several parameter must specified. -i The input file generated by CREST.pl -o The output file =head1 OPTIONS The options that can be used for the program. --min_inv_size For ITX/INV, the minimum event size, default 10000 --min_total_sclip For ITX/INV with size smaller than min_inv_size, the min number of soft-clipped reads needed to keep it, default 6 --(no)add_inv_back Add ITX/INV back if there is another event nearby, default OFF. --width The max breakpoint distance such that it's considered as same breakpoint, default 20 -h, --help, -? Help information --man Man page. --usage Usage information. --version Software version. =head1 DESCRIPTION This is a simple program to remove duplicated SVs, also it remove small INV/ITX events since most of those are due to library preparation. =head1 BUGS AND LIMITATIONS There are no known bugs in this module, but the method is limitted to bam file that has soft-clipping cigar string generated.Please report problems to Jianmin Wang (Jianmin.Wang@stjude.org) Patches are welcome. =head1 AUTHOR Jianmin Wang (Jianmin.Wang@stjude.org) =head1 LICENCE AND COPYRIGHT Copyright (c) 2010 by St. Jude Children's Research Hospital. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.