#!/usr/bin/perl # tdovermodel.perl # input gff sorted by location with largest span above; need <10b slop for that? # use: cat gnomon.genes gleanr.genes | sort -k1,1 -k4,4n -k5,5nr -k2,2 | perl tdovermodel.pl my %predna=(); # overGnomonGleanr(); overallmodels(); END{ my @k=sort keys %od; my $p; if(scalar %predna) { print "pred key: "; map{ $p=$predna{$_}||$_; print "$_=$p, "; }@k; print"\n\n"; } print "Overextended tandem models: "; map{ $p=$predna{$_}||$_; print "\t$p=",$od{$_} }@k; print"\n"; print " Inside tandem models: "; map{ $p=$predna{$_}||$_; print "\t$p=",$dp{$_} }@k; print"\n"; } #........ sub overGnomonGleanr { while(<>){ # gff in sorted by location chomp; my($tr,$ts,$tt,$tb,$te,$tp,$to)=split; my($gr)=m/ID=(\D+)/; # fixme: for all predictors; find largest group of inside/tandem genes from tandem regions # need really dmel.aa blastp scores $gr=($gr=~/NCBI/)?"NCBI":"GLNR"; my $og=($gr=~/NCBI/)?"GLNR":"NCBI"; $tb = int($tb/10); $te = int($te/10); # for slop # _overlap not good enough; need _insideof if( _inside([$tr,$tb,$te],$lg{$og}) and _inside($lg{$gr},$lg{$og}) ) { $od{$og}++; $dp{$gr}+=2; print "O1-$og:",$lg{$og}->[3],"\n"; print "D1-$gr:",$lg{$gr}->[3],"\n"; print "D2-$gr:$_\n\n"; } $lg{$gr}=[$tr,$tb,$te,$_]; } } sub overallmodels { my $grnum=0; while(<>){ # gff in sorted by location chomp; my($tr,$ts,$tt,$tb,$te,$tp,$to)=split; my($gr)=m/ID=(\D+)/; # fixme: for all predictors; find largest group of inside/tandem genes from tandem regions # need really dmel.aa blastp scores unless( $grid= $preds{$gr} ) { $grid= $preds{$gr}= ++$grnum; $predna{$grid}= $gr; } $gr= $grid; # my $og=($gr=~/NCBI/)?"GLNR":"NCBI"; #$tb = int($tb/10); $te = int($te/10); # for slop $tb = int($tb/4); $te = int($te/4); # for slop foreach my $og (1 .. $grnum) { next if ($og == $grid); if( _inside([$tr,$tb,$te], $lg{$og}) and _inside( $lg{$gr}, $lg{$og}) ) { $od{$og}++; $dp{$gr} += 2; print "O-$og:",$lg{$og}->[3],"\n"; print "D-$gr:",$lg{$gr}->[3],"\n"; print "D-$gr:$_\n\n"; } } $lg{$gr}=[$tr,$tb,$te,$_]; } } sub _overlap { my($a,$b)=@_; return ($a and $b and $a->[0] eq $b->[0] and $a->[1] < $b->[2] and $a->[2] > $b->[1]) ? 1 : 0; } sub _inside { # a is inside b (touching one/both ends, with <10b slop? my($a,$b)=@_; return ($a and $b and $a->[0] eq $b->[0] and $a->[1] >= $b->[1] and $a->[1] < $b->[2] and $a->[2] <= $b->[2] and $a->[2] > $b->[1]) ? 1 : 0; }