Mercurial > repos > plus91-technologies-pvt-ltd > softsearch
diff 2.4/src/standalone_blat2.pl @ 13:e3609c8714fb draft
Uploaded
author | plus91-technologies-pvt-ltd |
---|---|
date | Fri, 30 May 2014 03:37:55 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2.4/src/standalone_blat2.pl Fri May 30 03:37:55 2014 -0400 @@ -0,0 +1,267 @@ +#!/usr/bin/perl -sw +use Getopt::Long; +sub usage(){ + print " + Usage: <VCF> -g <genome.2bit> -seq|s <seq.fa> -f genome.fa + -o out.vcf + -n contig.names + -dist how wide of a window to look for bp [50]\n + -v verbose option + Requires samtools,bedTools, and blat in your path\n; + "; + die; +} +#Initialize values +my ($blat,$genome,$tei_bed,$vntr_bed,$out_vcf,$contig_names,$contig,$fasta,$uninformative_contigs,$dist,$verbose,$bedTools,$samtools); +GetOptions ("genome|g=s" => \$genome, + "o|out:s" => \$out_vcf, + "names|n:s" => \$contig_names, + "seq|s=s" => \$contig, + "f|fasta:s" => \$fasta, + "b|bad:s" => \$uninformative_contigs, + "dist:s" => \$dist, + "v" => \$verbose + ); +#$genome="/data2/bsi/reference/db/hg19.2bit"" +#$blat="/projects/bsi/bictools/apps/alignment/blat/34/blat" ; +#TEI.bed=egrep "LINE|SINE|LTR" /data5/bsi/epibreast/m087494.couch/Reference_Data/Annotations/hg19.repeatMasker.bed >TEI.bed +#VNTR_BED=egrep "Satellite|Simple_repeat" /data5/bsi/epibreast/m087494.couch/Reference_Data/Annotations/hg19.repeatMasker.bed > VNTR.bed + + +$blat=`which blat`; +if (!$blat) {die "Your do not have BLAT in your path\n\n"} +$samtools=`which samtools`; +if (!$samtools) {die "Your do not have samtools in your path\n\n"} +$bedTools=`which sortBed`; +if (!$bedTools) {die "Your do not have bedTools in your path\n\n"} + + +if (!$dist) {$dist=50} +if (!$out_vcf) {$out_vcf="out.vcf"} +if (!$contig_names) {$contig_names="contig.names"} +if (!$uninformative_contigs) {$uninformative_contigs="uninformative.contigs"} + +if ((!$genome)||(!$contig)||(!$fasta)){&usage;die;} + + +open(VCF,"$ARGV[0]") or die "must specify VCF file\n\n"; +open(OUT_VCF,">",$out_vcf) or die "can't open the output VCF\n"; +open(CONTIG_LIST,">",$contig_names) or die "can't open the contig names\n"; +open(BAD_CONTIG_LIST,">",$uninformative_contigs) or die "can't open the contig names\n"; +#print "writing to CONTIG_LIST=$contig_names\n"; +while (<VCF>) { + if($_=~/^#/){ + if ($.==1) { + print OUT_VCF $_; + print OUT_VCF "##INFO=<ID=STRAND,Number=1,Type=String,Description=\"Strand to which assembled contig aligned\">\n"; + print OUT_VCF "##INFO=<ID=CONTIG,Number=1,Type=String,Description=\"Name of assembeled contig matching event\">\n"; + print OUT_VCF "##INFO=<ID=MECHANISM,Number=1,Type=String,Description=\"Proposed mechanism of how the event arose\">\n"; + print OUT_VCF "##INFO=<ID=INSLEN,Number=1,Type=Integer,Description=\"Length of insertion\">\n"; + print OUT_VCF "##INFO=<ID=HOM_LEN,Number=1,Type=Integer,Description=\"Length of microhomology\">\n"; + next; + } + else { + print OUT_VCF $_; + next; + } + }; + chomp; + + ##look for exact location of BP + @line=split("\t",$_); + my($left_chr,$start,$end); + + #Get left position + $left_chr=$line[0]; + $start=$line[1]-$dist; + $end=$line[1]+$dist; + + #Get right position + my ($mate_pos,@mate,$mate_chr,$mate_start,$mate_end); + $mate_pos=$line[4]; + $mate_pos=~s/[\[|\]|A-Z]//g; + #print "mate_pos=$mate_pos\n"; + @mate=split(/:/,$mate_pos); + $mate_chr=$mate[0]; $mate_pos=$mate[1]; + $mate_start=$mate_pos-$dist;$mate_end=$mate_pos+$dist; + #print "$left_chr:$start-$end\n$mate_chr:$mate_start-$mate_end\n"; + + #Run through blat + my ($result1,$result2); + my $target1=join("",$left_chr,":",$start,"-",$end); + my $target2=join("",$mate_chr,":",$mate_start,"-",$mate_end); + #print "target1=$target1\ttarget2=$target2\n";die; + $result1=get_result($target1); + $result2=get_result($target2); + + + my $NOV_INS=""; + #If there is a NOV_INS, then there shouldn't be any output, so trick the results + if ($_=~/EVENT=NOV_INS/) { + $mate_start=$start; + $NOV_INS="true"; + if (!$result1) {$result1=join("\t","0","0","0","0","0","0","0","0","+","UNKNOWN_NODE","0","0",$dist);} + if (!$result2) {$result2=join("\t","0","0","0","0","0","0","0","0","+","UNKNOWN_NODE","0","0",$dist);} + } + + #Skip over events that aren't supported + if ((!$result1)||(!$result2)){ + my @tmp1=split("\t",$result1); + my @tmp2=split("\t",$result2); + if ($tmp1[9]) {print BAD_CONTIG_LIST "$tmp1[9]\n"} + if ($tmp2[9]) {print BAD_CONTIG_LIST "$tmp2[9]\n" } + next; + } + #Parse blat results + my @result1=split("\t",$result1); + my @result2=split("\t",$result2); +if($result2[9] ne $result1[9]){print "$result2[9] != $result1[9]\n";next} + #print "@result1\n@result2\n";die; + my $pos1=$start+($result1[12]-$result1[11]); + my $pos2=$mate_start+($result2[12]-$result2[11]); + #print "$_\n$pos1\t$pos2\n"; + + ############################################################## + ### Build Classifier + + my ($QSTART1,$QEND1,$QSTART2,$QEND2,$len,$MECHANISM, $INSERTION, $DELETION, $bed_res1,$bed_res2); + $MECHANISM="UNKNOWN"; + $len="UNKNOWN"; + #Make sure the later event is second + if ($result1[11] < $result2[11]){ + $QSTART1=$result1[11]; + $QEND1=$result1[12]; + $QSTART2=$result2[11]; + $QEND2=$result2[12]; + } + else{ + $QSTART1=$result2[11]; + $QEND1=$result2[12]; + $QSTART2=$result1[11]; + $QEND2=$result1[12]; + } + #Now calculate the difference between $QEND1 and QSTART2 + if($verbose){print "QEND1=$QEND1\tQSTART2=$QSTART2\n";} + $len=$QEND1-$QSTART2; + #Check for TEI + if($_=~/MECHANISM=TEI/){$MECHANISM="TEI"} + elsif($_=~/MECHANISM=VNTR/){$MECHANISM="VNTR"} + else{ + if ($len==0) {$MECHANISM="NHEJ"} + else{ + if ($len>0){$INSERTION="true"} + if ($len<0){$DELETION="true"} + if ($INSERTION){ + if ($len>10) {$MECHANISM="FOSTES"} + else{$MECHANISM="NHEJ"} + } + elsif ($DELETION){ + if ($len>100) {$MECHANISM="NAHR"} + elsif ($len > 2){$MECHANISM="altEJ"} + else{$MECHANISM="NHEJ"} + } + } + } + + +#if ($verbose){print "@result1";print "@result2";} + + #print out VCF + ############################################################# + # create temporary variable name + ############################################################# + srand (time ^ $$ ^ unpack "%L*", `ps axww | gzip -f`); + my $random_name=join "", map { ("a".."z")[rand 26] } 1..8; + my $random_name2=join "", map { ("a".."z")[rand 26] } 1..8; + + #Get Ref Base + my ($ref_base,$alt_base,$tmp_mate_pos); + $ref_base=getBases($left_chr,$pos1,$fasta); + $alt_base=getBases($mate_chr,$pos2,$fasta);#print "ALT=$alt_base\n"; + #Substitute the new mate position and base + $tmp_mate_pos=$line[4]; + $tmp_mate_pos=~s/$mate_pos/$pos2/; + $tmp_mate_pos=~s/[A-Z]/$alt_base/; + #split apart the INFO field to adjust the ISIZE and MATEID + my $NEW_INFO=""; + my @INFO=split(/;/,$line[7]); + for (my $i=0;$i<@INFO;$i++){ + if ($INFO[$i] =~ /^ISIZE=/){ + my @tmp=split(/=/,$INFO[$i]); + $NEW_INFO.="ISIZE="; + my $new_ISZIE=$pos2-$pos1; + $NEW_INFO.=$new_ISZIE + } + elsif($INFO[$i] =~ /^MATE_ID=/){ + $NEW_INFO.=";MATE_ID=".$random_name2 . ";"; + } + else{ + $NEW_INFO.=$INFO[$i].";"; + } + } + #ADD in strand and name + $NEW_INFO.="STRAND=".$result1[8]; + $NEW_INFO.=";CONTIG=".$result1[9]; + if($MECHANISM!~/TEI|VNTR/){$NEW_INFO.=";MECHANISM=".$MECHANISM;} + $NEW_INFO.=";HOM_LEN=".$len; + #don't pring contig nage if its a novel insertion + if(!$NOV_INS){print CONTIG_LIST "$result1[9]\n";}#else{print "I'm not printing $result1[9]\n";} + print OUT_VCF "$left_chr\t$pos1\t$random_name\t$ref_base\t$tmp_mate_pos\t1000\tPASS\t$NEW_INFO\t$line[8]\t$line[9]\n"; + #Now go through and fill info in for mate + #Substitute the new mate position and base + $tmp_mate_pos=$line[4]; + $tmp_mate_pos=~s/$mate_pos/$pos1/; + $tmp_mate_pos=~s/[A-Z]/$ref_base/; + $tmp_mate_pos=~s/$mate_chr/$left_chr/; + $NEW_INFO=""; + @INFO=split(/;/,$line[7]); + for (my $i=0;$i<@INFO;$i++){ + if ($INFO[$i] =~ /^ISIZE=/){ + my @tmp=split(/=/,$INFO[$i]); + $NEW_INFO.="ISIZE="; + my $new_ISZIE=$pos2-$pos1; + $NEW_INFO.=$new_ISZIE + } + elsif($INFO[$i] =~ /^MATE_ID=/){ + $NEW_INFO.=";MATE_ID=".$random_name.";"; + } + else{ + $NEW_INFO.=$INFO[$i].";"; + } + } + #ADD in strand and name + $NEW_INFO.="STRAND=".$result2[8]; + $NEW_INFO.=";CONTIG=".$result2[9]; + if ($MECHANISM!~/TEI|VNTR/){$NEW_INFO.=";MECHANISM=".$MECHANISM;} + $NEW_INFO.=";HOM_LEN=".$len; + + #don't pring contig nage if its a novel insertion + if(!$NOV_INS){print CONTIG_LIST "$result2[9]\n";} #else{print "I'm not printing $result1[9]\n";} + print OUT_VCF "$mate_chr\t$pos2\t$random_name2\t$alt_base\t$tmp_mate_pos\t1000\tPASS\t$NEW_INFO\t$line[8]\t$line[9]\n"; + if ($verbose){print "$mate_chr\t$pos2\t$random_name2\t$alt_base\t$tmp_mate_pos\t1000\tPASS\t$NEW_INFO\t$line[8]\t$line[9]\n";} +} +close VCF; +close OUT_VCF; +close CONTIG_LIST; +close BAD_CONTIG_LIST; +sub get_result{ + my $target=($_[0]); +if($verbose){print "target=$target\n"}#;die; + my $cmd="blat $genome:$target $contig /dev/stdout -t=dna -q=dna -noHead|egrep -v \"Searched|Loaded\" |head -1"; + +if ($verbose){print "$cmd\n"} #print "$cmd\n";die; + my $result=`$cmd`; + next if (!$cmd); + return ($result); +} +sub getBases{ + my ($chr,$pos1,$fasta)=@_; + my @result=(); + if ($pos1 <0){print "$pos1 is not a valid position (likely caused by circular MT chromosome)\n";$result[1]="NA";}; + @result = `samtools faidx $fasta $chr:$pos1-$pos1`; + if(!$result[1]){$result[1]="NA"}; + chomp($result[1]); + return uc($result[1]); +} + +