1. use strict; 2. use SAPserver; 3. use Data::Dumper; 4. 5. my ($geneID,$max_distance); 6. my $usage = "usage: server_paper_example3 GeneID MaxDistance"; 7. ( 8. ($geneID = shift @ARGV) && 9. ($max_distance = shift @ARGV) 10. ) 11. || die $usage; 12. 13. my $sapObject = SAPserver->new(); 14. my $geneLocH = $sapObject->fid_locations(-ids => [$geneID]); 15. my $geneLoc = $geneLocH->{$geneID}->[0]; 16. if ($geneLoc =~ /^(\S+)_(\d+)([+-])(\d+)/) # retrieve an encoded location 17. { 18. my($contig,$beg,$strand,$length) = ($1,$2,$3,$4); 19. my ($left,$right); 20. if ($strand eq "+") 21. { 22. ($left,$right) = ($beg, $beg + ($length-1)); 23. } 24. else 25. { 26. ($left,$right) = ($beg, $beg - ($length-1)); 27. } 28. my $paddedLeft = ($left > $max_distance) ? $left - $max_distance : 1; 29. my $paddedRight = $right + $max_distance; 30. my $sz = ($paddedRight + 1) - $paddedLeft; 31. my $region = $contig . "_" . $paddedLeft . "+" . $sz; 32. my $genesInRegionH = $sapObject->genes_in_region(-locations => [$region], 33. -includeLocation => 1); 34. my $genesInRegion = $genesInRegionH->{$region}; 35. foreach my $geneID2 (keys(%$genesInRegion)) { 36. my $location = $genesInRegion->{$geneID2}; 37. $location =~ /^(\S+)_(\d+)([+-])(\d+)/; 38. print "$geneID2\t$1\t$2\t$3\t$4\n"; 39. } 40. }