Raw content of EnsEMBL::Ensembl::Document::HTML::AssemblyTable
package EnsEMBL::Ensembl::Document::HTML::AssemblyTable;
use strict;
use warnings;
use EnsEMBL::Web::RegObj;
use EnsEMBL::Web::Data::Release;
use EnsEMBL::Web::Data::Species;
use EnsEMBL::Web::Data::ReleaseSpecies;
sub render {
my ($class, $request) = @_;
my $SD = $ENSEMBL_WEB_REGISTRY->species_defs;
my $this_release = $SD->ENSEMBL_VERSION;
my $archives = $SD->ENSEMBL_ARCHIVES;
my $first_archive = [sort keys %$archives]->[0];
## get assembly info for each species
my @species = EnsEMBL::Web::Data::Species->find_all;
my @releases = EnsEMBL::Web::Data::Release->search({ release_id => { '>=' => $first_archive } }, { order_by => 'release_id desc' });
my @release_species = EnsEMBL::Web::Data::ReleaseSpecies->search({ release_id => { '>=' => $first_archive } });
## Split the table in two so it isn't too wide
my $release_break = int(($this_release - $first_archive)/2);
my $split_releases = [ [ splice (@releases, 0, $release_break) ], \@releases ];
my $release_to_species = {};
$release_to_species->{$_->species_id}{$_->release_id} = $_ for (@release_species);
my $html = render_assembly_table($split_releases->[0], \@species, $release_to_species);
$html .= "
";
$html .= render_assembly_table($split_releases->[1], \@species, $release_to_species);
return $html;
}
sub render_assembly_table {
my ($releases, $species, $release_species) = @_;
my $header = '
Species |
';
my $body = "";
my ($date, $version, $order, $species_name, $row, $rs, $cells, $assembly_name, $current_name, $class);
my $c = { -1 => 'bg4', 1 => 'bg2', x => 1 }; # CSS class flip-flop for tds
my $style = sprintf( ' style="width:%0.3f%%"', 80 / @$releases );
foreach my $rel (@$releases) {
$date = $rel->online eq 'Y' ? qq{} . $rel->shorter_date . "" : $rel->shorter_date;
$header .= "$date v".$rel->id." | ";
}
$header .= "
\n";
(my $short_header = $header) =~ s/
.+?<\/th>//g; # Like the header, but without release numbers
my @rows = ();
foreach my $s (sort { $a->{'name'} cmp $b->{'name'} } @$species) {
($species_name = $s->name) =~ s/_/ /g;
$cells = {};
$assembly_name = "";
$current_name = "";
$order = 1;
$c->{'x'} = 1; # Reset the flip-flop
$row = "" . ( $s->online eq 'Y' ? qq{$species_name} : "$species_name" ) . " | ";
foreach my $r (@$releases) {
$rs = $release_species->{$s->id}->{$r->id};
$assembly_name = $rs ? $rs->assembly_name : "";
$order++ if ($current_name ne $assembly_name);
$cells->{$order} ||= { name => $assembly_name, count => 0 };
$cells->{$order}->{'count'}++;
$current_name = $assembly_name;
}
# Don't print empty row
next if !$cells->{$order}->{'name'} && $cells->{$order}->{'count'} == scalar @$releases;
foreach my $td (sort keys %$cells) {
$class = $cells->{$td}->{'name'} ? $c->{$c->{'x'}*=-1} : "";
$row .= qq{$cells->{$td}->{'name'} | };
}
$row .= "
\n";
push (@rows, $row);
}
my $species_total = scalar @rows;
my $divisor = int($species_total / 15) + 1;
my $breakpoint = $species_total % $divisor ? int($species_total / $divisor) + 1 : $species_total / $divisor;
my $j = 0;
# Insert the short header every [$breakpoint] rows ($j keeps track of the added rows)
for (my $i = $breakpoint; $i < scalar @rows; $i += $breakpoint) {
splice (@rows, $i+$j++, 0, $short_header);
}
$body = join ('', @rows);
$body .= $short_header if $species_total % $divisor;
return qq{\n};
}
1;