Mercurial > repos > yufei-luo > s_mart
diff SMART/bacteriaRegulatoryRegion_Detection/splitTranscriptGff.pl @ 31:0ab839023fe4
Uploaded
author | m-zytnicki |
---|---|
date | Tue, 30 Apr 2013 14:33:21 -0400 |
parents | 94ab73e8a190 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SMART/bacteriaRegulatoryRegion_Detection/splitTranscriptGff.pl Tue Apr 30 14:33:21 2013 -0400 @@ -0,0 +1,189 @@ +#!/usr/bin/perl -w +### +# Main : defining utr and intergenic operonic intervalles from a transcripts file following a referencies file +# +# Input : 2 gff files to intersect, transcript queries vs referencies +# +# Output : resulting gff file printing to standard output +# +###------------------------------------------------------ +use vars qw($USAGE); +use strict; + +=head1 NAME + +splitTranscriptGff.pl - compare 2 input gff files and define utr and intergenic operonic intervalles by couple of overlapping elements + +=head1 SYNOPSIS + +% intervallsExtractorGff.pl -i referencies.gff -j transcriptQueries.gff -s strand [-h] + +=head1 DESCRIPTION +This script will intersect 2 gff files and compute distance between 2 successives lines. Take care both of sorting by positions the input files and of that referencies are included in transcriptQueries. + + -i|--input1 fileName gff input file name: included elements + -j|--input2 fileName gff input file name: extended elements + [-s|--strand] [s|d] s for single strand (colinear) or d for double strands (antisense) [default d] + [-h|--help] help mode then die + +=head1 USECASE +Define many fragments for each extended element (transcript): UTR5, gene, UTR3, "inOperon" for intergenomic region between 2 genes +intervallsExtractorGff.pl -i CDSannotations.gff -j RNAseqTranscripts.gff > UTRsGenesOperonsLists.gff; + +=head1 KWON BUGS +No disjonction of overlapping elements of the included elements (-i file). +In usecase, overlapping genes are fused in one long gene. + +=head1 AUTHOR +Claire Toffano-Nioche - sep.11 + +=cut +#----------------------- +sub feedPositionTab { my ($val, $pF, $pB, @info) = @_ ; + #print "feedPositionTab::$#info, ", ($#info+1)/4," \n"; + for (my $i=0 ; $i <= $#info ; $i+=4) { # for each extended element + #print "....$info[$i+2]\n"; + if ($info[$i+3] =~ /\+/) { + for (my $c = $info[$i+1] ; $c <= $info[$i+2] ; $c++) { @$pF[$c]=$val } ; # sequence Forward + } else { + for (my $c = $info[$i+1] ; $c <= $info[$i+2] ; $c++) { @$pB[$c]=$val } ; # sequence Backward + } + } + #print "feedPos...:: ", join(".", @$pF[0..100]), "\n"; + #print "feedPos...:: ", join(".", @$pB[0..100]), "\n"; +} +#----------------------- +sub recupInfo { my ($pInfo, @lines) = @_ ; + for (my $i=0 ; $i <= ($#lines+1)*4-1 ; $i+=4) { + my @line = split("\t",$lines[$i/4]); + push(@$pInfo, $line[0], $line[3], $line[4], $line[6]) ; # 0=nom, 3=debut, 4=fin, 6=sens + } + #print "recupInfo::fin=", ($#lines+1)*4, "\n" ; +} +#----------------------- +sub tagName { my ($seqN, $posB, $posE, $strand) = @_ ; + my $tagN=$seqN.$strand.$posB."..".$posE; + #print "tagName:",join("_",@_)," et tagName:$tagN\n"; +return $tagN; +} +#----------------------- +sub transitionAnalysis { +my ($pos, $seq, $s, $pdebAmont, $pfinAmont, $pdebIn, $pfinIn, $pdebAval, $pfinAval, $ptag) = @_ ; + my $enCours = 0 ; my $precedant = 0 ; + $enCours = @$ptag[$pos] ; + $precedant = ($s =~ /\+/?@$ptag[$pos-1]:@$ptag[$pos+1]) ; + if ($enCours ne $precedant) { + #print "transi...:: $s, $pos, $precedant, $enCours\n"; + #print "transition::$$pdebAmont, $$pfinAmont, $$pdebIn, $$pfinIn, $$pdebAval, $$pfinAval\n"; + SWITCH: for ($precedant.$enCours) { + /01/ && do { $$pdebAmont = $pos ; last SWITCH ;}; + /02/ && do { $$pdebIn = $pos ; last SWITCH ;}; + /10/ && do { $$pfinAval = ($s =~/\+/?$pos-1:$pos+1) ; + if (($s =~ /\+/)and ($$pdebAval!=$$pfinAval)) { + printf "%s\tsplit\tutr3\t%s\t%s\t.\t%s\t.\tName=%s;\n", + $seq, $$pdebAval, $$pfinAval, $s, &tagName($seq, $$pdebAval, $$pfinAval, $s) ; + #if ($$pdebAval==$$pfinAval) { print "transition 10 +\n"}; + } elsif ($$pfinAval!=$$pdebAval) { + printf "%s\tsplit\tutr3\t%s\t%s\t.\t%s\t.\tName=%s;\n", + $seq, $$pfinAval, $$pdebAval, $s, &tagName($seq, $$pfinAval, $$pdebAval, $s) ; + #if ($$pfinAval==$$pdebAval){ print "transition 10 -\n"}; + } + $$pdebAval = 0 ; $$pfinAval = 0 ; + last SWITCH ; + }; + /12/ && do { $$pdebIn = $pos ; $$pfinAmont=($s =~/\+/?$pos-1:$pos+1) ; + my $type="utr5"; + if ($$pdebAmont == 0) { # in case of interOperon : utr5-CDS-interOperon-CDS-utr3 + $$pdebAmont=($s =~/\+/?$$pfinIn+1:$$pfinIn-1) ; + $type="inOperon" ; + } + if (($s =~ /\+/) and ($$pdebAmont!=$$pfinAmont)) { + printf "%s\tsplit\t%s\t%s\t%s\t.\t%s\t.\tName=%s;\n", + $seq, $type, $$pdebAmont, $$pfinAmont, $s, &tagName($seq, $$pdebAmont, $$pfinAmont, $s) ; + # if ($$pdebAmont==$$pfinAmont) { print "transition 12 +\n"}; + } elsif ($$pfinAmont!=$$pdebAmont) { + printf "%s\tsplit\t%s\t%s\t%s\t.\t%s\t.\tName=%s;\n", + $seq, $type, $$pfinAmont, $$pdebAmont, $s, &tagName($seq, $$pfinAmont, $$pdebAmont, $s) ; + #if ($$pfinAmont==$$pdebAmont) { print "transition 12 -\n"} ; + } + $$pdebAmont = 0 ; $$pfinAmont = 0 ; + last SWITCH ; + }; + /20/ && do { $$pfinIn=($s =~/\+/?$pos-1:$pos+1) ; + if (($s =~ /\+/) and ($$pdebIn!=$$pfinIn)) { + printf "%s\tsplit\tgene\t%s\t%s\t.\t%s\t.\tName=%s;\n", + $seq, $$pdebIn, $$pfinIn, $s, &tagName($seq, $$pdebIn, $$pfinIn, $s) ; + } elsif ($$pfinIn!=$$pdebIn) { + printf "%s\tsplit\tgene\t%s\t%s\t.\t%s\t.\tName=%s;\n", + $seq, $$pfinIn, $$pdebIn, $s, &tagName($seq, $$pfinIn, $$pdebIn, $s) ; + } + $$pdebIn = 0 ; $$pfinIn = 0 ; + last SWITCH ; + }; + /21/ && do { $$pdebAval=$pos ; $$pfinIn=($s =~/\+/?$pos-1:$pos+1) ; + if (($s =~ /\+/) and ($$pdebIn!=$$pfinIn)) { + printf "%s\tsplit\tgene\t%s\t%s\t.\t%s\t.\tName=%s;\n", + $seq, $$pdebIn, $$pfinIn, $s, &tagName($seq, $$pdebIn, $$pfinIn, $s) ; + } elsif ($$pfinIn!=$$pdebIn) { + printf "%s\tsplit\tgene\t%s\t%s\t.\t%s\t.\tName=%s;\n", + $seq, $$pfinIn, $$pdebIn, $s, &tagName($seq, $$pfinIn, $$pdebIn, $s) ; + } + #$$pdebIn = 0 ; $$pfinIn = 0 ; + last SWITCH ; + }; + } + } + } +#----------------------- +my ($fileNameI, $fileNameE, $strand) = ("", "", 0) ; +# command line check +foreach my $num (0 .. $#ARGV) { + SWITCH: for ($ARGV[$num]) { + /--input1|-i/ && do { + $fileNameI=$ARGV[$num+1]; + open ( fichierGffI, "< $fileNameI" ) or die "Can't open gff file: \"$fileNameI\"\n" ; + last }; + /--input2|-j/ && do { + $fileNameE=$ARGV[$num+1]; + open ( fichierGffE, "< $fileNameE" ) or die "Can't open gff file: \"$fileNameE\"\n" ; + last }; + /--strand|-s/ && do { + if ($ARGV[$num+1] eq "s") { $strand=1}; + last }; + /--help|-h/ && do { exec("pod2text $0\n") ; die }; + } +} +# memory declarations: +my @infoI ; my @infoE ; +my $seqName ; +my @tagF ; my @tagB ; # Forward and Backward sequence +# data retrieval: +my @linesI = <fichierGffI> ; my @linesE = <fichierGffE> ; +close fichierGffI ; close fichierGffE ; + #print "gff files read ; number of lines : $#lines1 + $#lines2\n"; + # positions management +&recupInfo(\@infoI, @linesI) ; +&recupInfo(\@infoE, @linesE) ; +# treatement: +# transform gff lines into chromosomal position tags : 0 for nothing, 1 resp. 2 for extended resp. included elements +if (($#infoI) and ($#infoE)) { + $seqName=$infoI[0] ; + #print "fin : $infoE[$#infoE-1]\n"; + for (my $i=0 ; $i <= $infoE[$#infoE-1] ; $i++) { $tagF[$i] = 0 ; $tagB[$i] = 0 ; } ; # "O" tag in all chr. positions + #print "seqName : $seqName\n" ; + &feedPositionTab(1, \@tagF, \@tagB, @infoE) ; # "1" tag for all extended elements + &feedPositionTab(2, \@tagF, \@tagB, @infoI) ; # "2" tag for all included elements + #print join("", @tagF), "\n"; + #print join("", @tagB), "\n"; + # transition management: + my ($beginUpstream, $endUpstream, $beginIncluded, $endIncluded, $beginDownstream, $endDownstream) + = (0, 0, 0, 0, 0, 0) ; + for (my $i=1 ; $i <= $#tagF-1 ; $i+=1) { + &transitionAnalysis($i, $seqName, "+", \$beginUpstream, \$endUpstream, \$beginIncluded, \$endIncluded, \$beginDownstream, \$endDownstream, \@tagF) ; + } + ($beginUpstream, $endUpstream, $beginIncluded, $endIncluded, $beginDownstream, $endDownstream) = ($infoE[$#infoE-1], $infoE[$#infoE-1], $infoE[$#infoE-1], $infoE[$#infoE-1], $infoE[$#infoE-1], $infoE[$#infoE-1]) ; + for (my $i=$#tagB-1 ; $i >= 1 ; $i-=1) { + &transitionAnalysis($i, $seqName, "-", \$beginUpstream, \$endUpstream, \$beginIncluded, \$endIncluded, \$beginDownstream, \$endDownstream, \@tagB) ; + } +} +exit(0) ;