App-Fasops
view release on metacpan or search on metacpan
lib/App/Fasops/Command/xlsx.pm view on Meta::CPAN
my $format_of = create_formats($workbook);
my $max_name_length = 1;
my $content = ''; # content of one block
while (1) {
last if $in_fh->eof and $content eq '';
my $line = '';
if ( !$in_fh->eof ) {
$line = $in_fh->getline;
}
next if substr( $line, 0, 1 ) eq "#";
if ( ( $line eq '' or $line =~ /^\s+$/ ) and $content ne '' ) {
my $info_of = App::Fasops::Common::parse_block( $content, 1 );
$content = '';
my @full_names;
my $seq_refs = [];
for my $key ( keys %{$info_of} ) {
push @full_names, $key;
push @{$seq_refs}, $info_of->{$key}{seq};
}
if ( $opt->{length} ) {
next if length $info_of->{ $full_names[0] }{seq} < $opt->{length};
}
print "Section [$opt->{section}]\n";
$max_name_length = List::Util::max( $max_name_length, map {length} @full_names );
# including indels and snps
my $vars = get_vars( $seq_refs, $opt );
$opt->{section} = paint_vars( $worksheet, $format_of, $opt, $vars, \@full_names );
}
else {
$content .= $line;
}
}
$in_fh->close;
# format column
$worksheet->set_column( 0, 0, $max_name_length + 1 );
$worksheet->set_column( 1, $opt->{wrap} + 3, 1.6 );
return;
}
# Excel formats
sub create_formats {
#@type Excel::Writer::XLSX
my $workbook = shift;
my $format_of = {};
# species name
$format_of->{name} = $workbook->add_format(
font => 'Courier New',
size => 10,
);
# variation position
$format_of->{pos} = $workbook->add_format(
font => 'Courier New',
size => 8,
align => 'center',
valign => 'vcenter',
rotation => 90,
);
$format_of->{snp} = {};
$format_of->{indel} = {};
# background
my $bg_of = {};
# 15
my @colors = (
22, # Gray-25%, silver
43, # Light Yellow 0b001
42, # Light Green 0b010
27, # Lite Turquoise
44, # Pale Blue 0b100
46, # Lavender
47, # Tan
24, # Periwinkle
49, # Aqua
51, # Gold
45, # Rose
52, # Light Orange
26, # Ivory
29, # Coral
31, # Ice Blue
# 30, # Ocean Blue
# 41, # Light Turquoise, again
# 48, # Light Blue
# 50, # Lime
# 54, # Blue-Gray
# 62, # Indigo
);
for my $i ( 0 .. $#colors ) {
$bg_of->{$i}{bg_color} = $colors[$i];
}
$bg_of->{unknown}{bg_color} = 9; # White
# snp base
my $snp_fg_of = {
'A' => { color => 58, }, # Dark Green
'C' => { color => 18, }, # Dark Blue
'G' => { color => 28, }, # Dark Purple
'T' => { color => 16, }, # Dark Red
'N' => { color => 8, }, # Black
'-' => { color => 8, }, # Black
};
for my $fg ( keys %{$snp_fg_of} ) {
for my $bg ( keys %{$bg_of} ) {
$format_of->{snp}{"$fg$bg"} = $workbook->add_format(
font => 'Courier New',
size => 10,
align => 'center',
valign => 'vcenter',
%{ $snp_fg_of->{$fg} },
%{ $bg_of->{$bg} },
);
}
}
$format_of->{snp}{'-'} = $workbook->add_format(
font => 'Courier New',
size => 10,
align => 'center',
valign => 'vcenter',
);
for my $bg ( keys %{$bg_of} ) {
$format_of->{indel}->{$bg} = $workbook->add_format(
font => 'Courier New',
size => 10,
bold => 1,
align => 'center',
valign => 'vcenter',
%{ $bg_of->{$bg} },
);
}
return $format_of;
}
# store all variations
sub get_vars {
my $seq_refs = shift;
my $opt = shift;
# outgroup
my $out_seq;
if ( $opt->{outgroup} ) {
$out_seq = pop @{$seq_refs};
}
my $seq_count = scalar @{$seq_refs};
if ( $seq_count < 2 ) {
Carp::confess "Too few sequences [$seq_count]\n";
}
my $indel_sites = App::Fasops::Common::get_indels($seq_refs);
if ( $opt->{outgroup} ) {
App::Fasops::Common::polarize_indel( $indel_sites, $out_seq );
}
my $snp_sites = App::Fasops::Common::get_snps($seq_refs);
if ( $opt->{outgroup} ) {
App::Fasops::Common::polarize_snp( $snp_sites, $out_seq );
}
my %variations;
for my $site ( @{$indel_sites} ) {
if ( $opt->{nocomplex} and $site->{indel_freq} == -1 ) {
next;
}
if ( $opt->{nosingle} and $site->{indel_freq} <= 1 ) {
next;
}
if ( $opt->{noindel} ) {
next;
}
if ( defined $opt->{min} and $site->{indel_freq} / $seq_count < $opt->{min} ) {
next;
}
if ( defined $opt->{max} and $site->{indel_freq} / $seq_count > $opt->{max} ) {
next;
}
$site->{var_type} = 'indel';
$variations{ $site->{indel_start} } = $site;
( run in 1.111 second using v1.01-cache-2.11-cpan-ceb78f64989 )