Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/EnsEMBL/Utils/ScriptUtils.pm @ 0:1f6dce3d34e0
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 02:01:53 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/EnsEMBL/Utils/ScriptUtils.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,265 @@ +=head1 LICENSE + + Copyright (c) 1999-2012 The European Bioinformatics Institute and + Genome Research Limited. All rights reserved. + + This software is distributed under a modified Apache license. + For license details, please see + + http://www.ensembl.org/info/about/code_licence.html + +=head1 CONTACT + + Please email comments or questions to the public Ensembl + developers list at <dev@ensembl.org>. + + Questions may also be sent to the Ensembl help desk at + <helpdesk@ensembl.org>. + +=cut + +=head1 NAME + +Bio::EnsEMBL::Utils::ScriptUtils; + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +=head1 METHODS + +=cut + +package Bio::EnsEMBL::Utils::ScriptUtils; + +use strict; +use warnings; +no warnings 'uninitialized'; + +use Exporter; +our @ISA = qw(Exporter); + +our @EXPORT_OK = qw( + user_proceed + commify + sort_chromosomes + parse_bytes + directory_hash + path_append + dynamic_use + inject +); + + +=head2 user_proceed + + Arg[1] : (optional) String $text - notification text to present to user + Example : # run a code snipped conditionally + if ($support->user_proceed("Run the next code snipped?")) { + # run some code + } + + # exit if requested by user + exit unless ($support->user_proceed("Want to continue?")); + Description : If running interactively, the user is asked if he wants to + perform a script action. If he doesn't, this section is skipped + and the script proceeds with the code. When running + non-interactively, the section is run by default. + Return type : TRUE to proceed, FALSE to skip. + Exceptions : none + Caller : general + +=cut + +sub user_proceed { + my ($text, $interactive, $default) = @_; + + unless (defined($default)) { + die("Need a default answer for non-interactive runs."); + } + + my $input; + + if ($interactive) { + print "$text\n" if $text; + print "[y/N] "; + + $input = lc(<>); + chomp $input; + } else { + $input = $default; + } + + if ($input eq 'y') { + return(1); + } else { + print "Skipping.\n" if ($interactive); + return(0); + } +} + + +=head2 sort_chromosomes + + Arg[1] : (optional) Hashref $chr_hashref - Hashref with chr_name as keys + Example : my $chr = { '6-COX' => 1, '1' => 1, 'X' => 1 }; + my @sorted = $support->sort_chromosomes($chr); + Description : Sorts chromosomes in an intuitive way (numerically, then + alphabetically). If no chromosome hashref is passed, it's + retrieve by calling $self->get_chrlength() + Return type : List - sorted chromosome names + Exceptions : thrown if no hashref is provided + Caller : general + +=cut + +sub sort_chromosomes { + my @chromosomes = @_; + + return (sort _by_chr_num @chromosomes); +} + + +=head2 _by_chr_num + + Example : my @sorted = sort _by_chr_num qw(X, 6-COX, 14, 7); + Description : Subroutine to use in sort for sorting chromosomes. Sorts + numerically, then alphabetically + Return type : values to be used by sort + Exceptions : none + Caller : internal ($self->sort_chromosomes) + +=cut + +sub _by_chr_num { + my @awords = split /-/, $a; + my @bwords = split /-/, $b; + + my $anum = $awords[0]; + my $bnum = $bwords[0]; + + if ($anum !~ /^[0-9]*$/) { + if ($bnum !~ /^[0-9]*$/) { + return $anum cmp $bnum; + } else { + return 1; + } + } + if ($bnum !~ /^[0-9]*$/) { + return -1; + } + + if ($anum <=> $bnum) { + return $anum <=> $bnum; + } else { + if ($#awords == 0) { + return -1; + } elsif ($#bwords == 0) { + return 1; + } else { + return $awords[1] cmp $bwords[1]; + } + } +} + + +=head2 commify + + Arg[1] : Int $num - a number to commify + Example : print "An easy to read number: ".$self->commify(100000000); + # will print 100,000,000 + Description : put commas into a number to make it easier to read + Return type : a string representing the commified number + Exceptions : none + Caller : general + Status : stable + +=cut + +sub commify { + my $num = shift; + + $num = reverse($num); + $num =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g; + + return scalar reverse $num; +} + + +sub parse_bytes { + my $bytes = shift; + + my @suffixes = qw(bytes kb Mb Gb Tb); + + my $length = length($bytes); + my $order = int(($length-1)/3); + + my $parsed = sprintf('%.1f', $bytes/10**(3*$order)); + + return "$parsed ".$suffixes[$order]; +} + + +sub directory_hash { + my $filename = shift; + + my (@md5) = md5_hex($filename) =~ /\G(..)/g; + return join('/', @md5[0..2]); +} + + +sub path_append { + my $path1 = shift; + my $path2 = shift; + + # default to current directory + $path1 = '.' unless (defined($path1)); + + my $return_path = "$path1/$path2"; + + unless (-d $return_path) { + system("mkdir -p $return_path") == 0 or + die("Unable to create directory $return_path: $!\n"); + } + + return $return_path; +} + + +=head2 inject + + Arg [1] : String $classname - The name of the class to require/import + Example : $self->inject('Bio::EnsEMBL::DBSQL::DBAdaptor'); + Description: Requires and imports the methods for the classname provided, + checks the symbol table so that it doesnot re-require modules + that have already been required. + Returntype : true on success + Exceptions : Warns to standard error if module fails to compile + Caller : internal + +=cut + +sub inject { + my $classname = shift; + my ($parent_namespace, $module) = $classname =~/^(.*::)(.*)$/ ? + ($1,$2) : ('::', $classname); + no strict 'refs'; + + # return if module has already been imported + return 1 if $parent_namespace->{$module.'::'}; + + eval "require $classname"; + die("Failed to require $classname: $@") if ($@); + + $classname->import(); + + return 1; +} + + +sub dynamic_use { + return inject(@_); +} + +1; +