From 8f5a9b673980baa6d8c6344cccdb6345c13473ce Mon Sep 17 00:00:00 2001
From: Steve Trevanion <st3@sanger.ac.uk>
Date: Mon, 20 Apr 2009 13:42:16 +0000
Subject: [PATCH] merge from 49-dev

---
 .../Bio/EnsEMBL/Utils/ConversionSupport.pm    | 317 +++++++++++-------
 1 file changed, 199 insertions(+), 118 deletions(-)

diff --git a/modules/Bio/EnsEMBL/Utils/ConversionSupport.pm b/modules/Bio/EnsEMBL/Utils/ConversionSupport.pm
index 8a95b35361..491b848abe 100644
--- a/modules/Bio/EnsEMBL/Utils/ConversionSupport.pm
+++ b/modules/Bio/EnsEMBL/Utils/ConversionSupport.pm
@@ -245,8 +245,10 @@ sub get_common_params {
 
 =head2 get_loutre_params
 
-  Example     : my @allowed_params = $self->get_loutre_params, 'extra_param';
-  Description : Returns a list of commonly used parameters in for working with a loutre db
+  Arg         : (optional) return a list to parse or not
+  Example     : $support->parse_extra_options($support->get_loutre_params('parse'))
+  Description : Returns a list of commonly used loutre db parameters - parse option is
+                simply used to distinguish between reporting and parsing parameters
   Return type : Array - list of common parameters
   Exceptions  : none
   Caller      : general
@@ -254,13 +256,25 @@ sub get_common_params {
 =cut
 
 sub get_loutre_params {
-  return qw(
-	    loutrehost
-	    loutreport
-	    loutreuser
-	    loutrepass
-	    loutredbname
-	  );
+  my ($self,$p) = @_;
+  if ($p) {
+    return qw(
+	      loutrehost=s
+	      loutreport=s
+	      loutreuser=s
+	      loutrepass=s
+	      loutredbname=s
+	    );
+  }
+  else {
+    return qw(
+	      loutrehost
+	      loutreport
+	      loutreuser
+	      loutrepass
+	      loutredbname
+	    );
+  }
 }
 
 =head2 remove_vega_params
@@ -300,9 +314,9 @@ sub confirm_params {
   print "Running script with these parameters:\n\n";
   print $self->list_all_params;
 
-  if ($self->param('host') eq 'web-4-11') {
+  if ($self->param('host') eq 'ensdb-1-10') {
     # ask user if he wants to proceed
-    exit unless $self->user_proceed("**************\n\n You're working on web-4-11! Is that correct and you want to continue ?\n\n**************");
+    exit unless $self->user_proceed("**************\n\n You're working on ensdb-1-10! Is that correct and you want to continue ?\n\n**************");
   }
   else {
     # ask user if he wants to proceed
@@ -369,7 +383,6 @@ sub create_commandline_options {
     if ($settings->{'allowed_params'}) {
         # exclude params explicitly stated
         my %exclude = map { $_ => 1 } @{ $settings->{'exclude'} || [] };
-        
         foreach my $param ($self->allowed_params) {
             unless ($exclude{$param}) {
                 my ($first, @rest) = $self->param($param);
@@ -394,7 +407,6 @@ sub create_commandline_options {
     foreach my $param (keys %param_hash) {
         $options_string .= sprintf("--%s %s ", $param, $param_hash{$param});
     }
-    
     return $options_string;
 }
 
@@ -696,8 +708,17 @@ sub get_database {
             -dbname => $self->param("${prefix}dbname"),
             -group  => $database,
     );
-
-    # explicitely set the dnadb to itself - by default the Registry assumes
+	#can use this approach to get dna from another db
+#	my $dna_db = $adaptors{$database}->new(
+#			-host => 'otterlive',
+#            -port => '3301',
+#			-user => $self->param("${prefix}user"),
+#			-pass => $self->param("${prefix}pass"),
+#            -dbname => 'loutre_human',
+#		);
+#	$dba->dnadb($dna_db);
+
+    # otherwise explicitely set the dnadb to itself - by default the Registry assumes
     # a group 'core' for this now
     $dba->dnadb($dba);
 
@@ -935,26 +956,25 @@ sub get_chrlength {
 =cut
 
 sub get_ensembl_chr_mapping {
-    my ($self, $dba, $version) = @_;
-    $dba ||= $self->dba;
-    throw("get_ensembl_chr_mapping should be passed a Bio::EnsEMBL::DBSQL::DBAdaptor\n") unless ($dba->isa('Bio::EnsEMBL::DBSQL::DBAdaptor'));
-
-    my $sa = $dba->get_SliceAdaptor;
-    my @chromosomes = map { $_->seq_region_name } 
-                            @{ $sa->fetch_all('chromosome', $version) };
-
-    my %chrs;
-    foreach my $chr (@chromosomes) {
-        my $sr = $sa->fetch_by_region('chromosome', $chr, undef, undef, undef, $version);
-        my ($ensembl_name_attr) = @{ $sr->get_all_Attributes('ensembl_name') };
-        if ($ensembl_name_attr) {
-            $chrs{$chr} = $ensembl_name_attr->value;
-        } else {
-            $chrs{$chr} = $chr;
-        }
+  my ($self, $dba, $version) = @_;
+  $dba ||= $self->dba;
+  throw("get_ensembl_chr_mapping should be passed a Bio::EnsEMBL::DBSQL::DBAdaptor\n") unless ($dba->isa('Bio::EnsEMBL::DBSQL::DBAdaptor'));
+
+  my $sa = $dba->get_SliceAdaptor;
+  my @chromosomes = map { $_->seq_region_name } 
+    @{ $sa->fetch_all('chromosome', $version) };
+
+  my %chrs;
+  foreach my $chr (@chromosomes) {
+    my $sr = $sa->fetch_by_region('chromosome', $chr, undef, undef, undef, $version);
+    my ($ensembl_name_attr) = @{ $sr->get_all_Attributes('ensembl_name') };
+    if ($ensembl_name_attr) {
+      $chrs{$chr} = $ensembl_name_attr->value;
+    } else {
+      $chrs{$chr} = $chr;
     }
-
-    return \%chrs;
+  }
+  return \%chrs;
 }
 
 =head2 get_taxonomy_id
@@ -1193,7 +1213,7 @@ sub log {
 
   Arg[1]      : String $txt - the warning text to log
   Arg[2]      : Int $indent - indentation level for log message
-  Arg[2]      : Bool - add a line break before warning if true
+  Arg[3]      : Bool - add a line break before warning if true
   Example     : my $log = $support->log_filehandle;
                 $support->log_warning('Log foo.\n', 1);
   Description : Logs a message via $self->log and increases the warning counter.
@@ -1445,6 +1465,26 @@ sub date {
     return strftime "%Y-%m-%d %T", localtime;
 }
 
+=head2 format_time
+
+  Example     : print $support->format_time($gene->modifed_date) . "\n";
+  Description : Prints timestamps from the database
+  Return type : String - nicely formatted time stamp
+  Exceptions  : none
+  Caller      : general
+
+=cut
+
+
+sub date_format { 
+  my( $self, $time, $format ) = @_;
+  my( $d,$m,$y) = (localtime($time))[3,4,5];
+  my %S = ('d'=>sprintf('%02d',$d),'m'=>sprintf('%02d',$m+1),'y'=>$y+1900);
+  (my $res = $format ) =~s/%(\w)/$S{$1}/ge;
+  return $res;
+}
+
+
 =head2 mem
 
   Example     : print "Memory usage: " . $support->mem . "\n";
@@ -1491,8 +1531,8 @@ sub commify {
   Arg[2]      : B::E::AttributeAdaptor
   Arg[3]      : string $coord_system_name (optional) - 'chromosome' by default
   Arg[4]      : string $coord_system_version (optional) - 'otter' by default
-  Example     : $chroms = $support->fetch_non_hidden_slice($sa);
-  Description : retrieve all slices from a loutra database that don't have a hidden attribute
+  Example     : $chroms = $support->fetch_non_hidden_slice($sa,$aa);
+  Description : retrieve all slices from a loutre database that don't have a hidden attribute
   Return type : arrayref
   Caller      : general
   Status      : stable
@@ -1500,31 +1540,72 @@ sub commify {
 =cut
 
 sub fetch_non_hidden_slices {
-	my $self = shift;
-	my $aa   = shift or throw("You must supply an attribute adaptor");
-	my $sa   = shift or throw("You must supply a slice adaptor");
-	my $cs   = shift || 'chromosome';
-	my $cv   = shift || 'Otter';
-	my $visible_chroms;
-	foreach my $chrom ( @{$sa->fetch_all($cs,$cv)} ) {
-		my $chrom_name = $chrom->name;
-		my $attribs = $aa->fetch_all_by_Slice($chrom,'hidden');
-		if ( scalar(@$attribs) > 1 ) {
-			$self->log_warning("More than one hidden attribute for chromosome $chrom_name\n");
-		}
-		elsif ($attribs->[0]->value == 0) {				
-			push @$visible_chroms, $chrom;
-		}
-		elsif ($attribs->[0]->value == 1) {	
-			$self->log_verbose("chromosome $chrom_name is hidden\n");	
-		}
-		else {
-			$self->log_warning("No hidden attribute for chromosome $chrom_name\n");
-		}
-	}
-	return $visible_chroms;
+  my $self = shift;
+  my $aa   = shift or throw("You must supply an attribute adaptor");
+  my $sa   = shift or throw("You must supply a slice adaptor");
+  my $cs   = shift || 'chromosome';
+  my $cv   = shift || 'Otter';
+  my $visible_chroms;
+  foreach my $chrom ( @{$sa->fetch_all($cs,$cv)} ) {
+    my $chrom_name = $chrom->name;
+    my $attribs = $aa->fetch_all_by_Slice($chrom,'hidden');
+    if ( scalar(@$attribs) > 1 ) {
+      $self->log_warning("More than one hidden attribute for chromosome $chrom_name\n");
+    }
+    elsif ($attribs->[0]->value == 0) {				
+      push @$visible_chroms, $chrom;
+    }
+    elsif ($attribs->[0]->value == 1) {	
+      $self->log_verbose("chromosome $chrom_name is hidden\n");	
+    }
+    else {
+      $self->log_warning("No hidden attribute for chromosome $chrom_name\n");
+    }
+  }
+  return $visible_chroms;
+}
+
+=head2 get_non_hidden_slice_names
+
+  Arg[1]      : B::E::SliceAdaptor
+  Arg[2]      : B::E::AttributeAdaptor
+  Arg[3]      : string $coord_system_name (optional) - 'chromosome' by default
+  Arg[4]      : string $coord_system_version (optional) - 'otter' by default
+  Example     : $chrom_names = $support->get_non_hidden_slice_names($sa,$aa);
+  Description : retrieve names of all slices from a loutre database that don't have a hidden attribute
+  Return type : arrayref of names of all non-hidden slices
+  Caller      : general
+  Status      : stable
+
+=cut
+
+sub get_non_hidden_slice_names {
+  my $self = shift;
+  my $aa   = shift or throw("You must supply an attribute adaptor");
+  my $sa   = shift or throw("You must supply a slice adaptor");
+  my $cs   = shift || 'chromosome';
+  my $cv   = shift || 'Otter';
+  my $visible_chrom_names;
+  foreach my $chrom ( @{$sa->fetch_all($cs,$cv)} ) {
+    my $chrom_name = $chrom->seq_region_name;
+    my $attribs = $aa->fetch_all_by_Slice($chrom,'hidden');
+    if ( scalar(@$attribs) > 1 ) {
+      $self->log_warning("More than one hidden attribute for chromosome $chrom_name\n");
+    }
+    elsif ($attribs->[0]->value == 0) {				
+      push @$visible_chrom_names, $chrom_name;
+    }
+    elsif ($attribs->[0]->value == 1) {	
+      $self->log_verbose("chromosome $chrom_name is hidden\n");	
+    }
+    else {
+      $self->log_warning("No hidden attribute for chromosome $chrom_name\n");
+    }
+  }
+  return $visible_chrom_names;
 }
 
+
 =head2 get_wanted_chromosomes
 
   Arg[1]      : B::E::U::ConversionSupport
@@ -1532,47 +1613,47 @@ sub fetch_non_hidden_slices {
   Arg[3]      : B::E::AttributeAdaptor
   Arg[4]      : string $coord_system_name (optional) - 'chromosome' by default
   Arg[5]      : string $coord_system_version (optional) - 'otter' by default
-  Example     : @chr_names = &Slice::get_wanted_chromosomes($support,$laa,$lsa);
+  Example     : $chr_names = $support->get_wanted_chromosomes($laa,$lsa);
   Description : retrieve names of slices from a lutra database that are ready for dumping to Vega.
                 Deals with list of names to ignore (ignore_chr = LIST)
-  Return type : arrayref
+  Return type : arrayref of slices
   Caller      : general
   Status      : stable
 
 =cut
 
 sub get_wanted_chromosomes {
-	my $self = shift;
-	my $aa   = shift or throw("You must supply an attribute adaptor");
-	my $sa   = shift or throw("You must supply a slice adaptor");
-	my $cs   = shift || 'chromosome';
-	my $cv   = shift || 'Otter';
-	my $export_mode = $self->param('release_type');
-	my $release = $self->param('vega_release');
-	my $names;
-	my $chroms  = $self->fetch_non_hidden_slices($aa,$sa,$cs,$cv);
+  my $self = shift;
+  my $aa   = shift or throw("You must supply an attribute adaptor");
+  my $sa   = shift or throw("You must supply a slice adaptor");
+  my $cs   = shift || 'chromosome';
+  my $cv   = shift || 'Otter';
+  my $export_mode = $self->param('release_type');
+  my $release = $self->param('vega_release');
+  my $names;
+  my $chroms  = $self->fetch_non_hidden_slices($aa,$sa,$cs,$cv);
  CHROM:
-	foreach my $chrom (@$chroms) {
-		my $attribs = $aa->fetch_all_by_Slice($chrom);
-		my $vals = $self->get_attrib_values($attribs,'vega_export_mod');
-		if (scalar(@$vals > 1)) {
-			$self->log_warning ("Multiple attribs for \'vega_export_mod\', please fix before continuing");
-			exit;
-		}
-		next CHROM if (! grep { $_ eq $export_mode} @$vals);
-		$vals =  $self->get_attrib_values($attribs,'vega_release',$release);	
-		if (scalar(@$vals > 1)) {
-			$self->log_warning ("Multiple attribs for \'vega_release\' value = $release , please fix before continuing");
-			exit;
-		}
-		next CHROM if (! grep { $_ eq $release} @$vals);
-		my $name = $chrom->seq_region_name;
-		if (my @ignored = $self->param('ignore_chr')) {
-			next CHROM if (grep {$_ eq $name} @ignored);
-		}
-		push @{$names}, $name;
-	}
-	return $names;
+  foreach my $chrom (@$chroms) {
+    my $attribs = $aa->fetch_all_by_Slice($chrom);
+    my $vals = $self->get_attrib_values($attribs,'vega_export_mod');
+    if (scalar(@$vals > 1)) {
+      $self->log_warning ("Multiple attribs for \'vega_export_mod\', please fix before continuing");
+      exit;
+    }
+    next CHROM if (! grep { $_ eq $export_mode} @$vals);
+    $vals =  $self->get_attrib_values($attribs,'vega_release',$release);	
+    if (scalar(@$vals > 1)) {
+      $self->log_warning ("Multiple attribs for \'vega_release\' value = $release , please fix before continuing");
+      exit;
+    }
+    next CHROM if (! grep { $_ eq $release} @$vals);
+    my $name = $chrom->seq_region_name;
+    if (my @ignored = $self->param('ignore_chr')) {
+      next CHROM if (grep {$_ eq $name} @ignored);
+    }
+    push @{$names}, $name;
+  }
+  return $names;
 }
 
 
@@ -1596,33 +1677,33 @@ sub get_wanted_chromosomes {
 =cut
 
 sub get_attrib_values {
-	my $self    = shift;
-	my $attribs = shift;
-	my $code    = shift;
-	my $value   = shift;
-	if (my @atts = grep {$_->code eq $code } @$attribs) {
-		my $r = [];
-		if ($value) {
-			if (my @values = grep {$_->value eq $value} @atts) {
-				foreach (@values) {
-					push @$r, $_->value;
-				}
-				return $r;
-			}
-			else {
-				return [];
-			}
-		}
-		else {
-			foreach (@atts) {
-				push @$r, $_->value;
-			}
-			return $r;
-		}
-	}
-	else {
-		return [];
+  my $self    = shift;
+  my $attribs = shift;
+  my $code    = shift;
+  my $value   = shift;
+  if (my @atts = grep {$_->code eq $code } @$attribs) {
+    my $r = [];
+    if ($value) {
+      if (my @values = grep {$_->value eq $value} @atts) {
+	foreach (@values) {
+	  push @$r, $_->value;
 	}
+	return $r;
+      }
+      else {
+	return [];
+      }
+    }
+    else {
+      foreach (@atts) {
+	push @$r, $_->value;
+      }
+      return $r;
+    }
+  }
+  else {
+    return [];
+  }
 }
 
 =head2 fix_attrib_value
-- 
GitLab