';
#input info
if(exists $data->{numseqs}) {
$html .= '';
$html .= '
Input file(s): | '.($data->{filename1} ? &convertIntToString($data->{filename1}) : '-').($data->{filename2} ? ' and '.&convertIntToString($data->{filename2}) : '').' |
Input format(s): | '.($data->{format1} ? uc($data->{format1}) : '-').($data->{format2} ? ' and '.uc($data->{format2}) : '').' |
';
if(exists $data->{pairedend} && $data->{pairedend}) {
my $singletons1 = ($data->{numseqs}||0)-($data->{pairs}||0);
my $singletons2 = ($data->{numseqs2}||0)-($data->{pairs}||0);
$html .= '# Sequences (file 1): | '.&addCommas($data->{numseqs}||'-').' |
Total bases (file 1): | '.&addCommas($data->{numbases}||'-').' |
# Sequences (file 2): | '.&addCommas($data->{numseqs2}||'-').' |
Total bases (file 2): | '.&addCommas($data->{numbases2}||'-').' |
# Pairs: | '.&addCommas($data->{pairs}||'-').($data->{pairs} ? ' ('.sprintf("%.2f",(100*(2*$data->{pairs})/(($data->{numseqs}||0)+($data->{numseqs2}||0)))).'% of sequences)' : '').' |
# Singletons (file 1): | '.&addCommas($singletons1).($singletons1 ? ' ('.sprintf("%.2f",(100*$singletons1/$data->{numseqs})).'%)' : '').' |
# Singletons (file 2): | '.&addCommas($singletons2).($singletons2 ? ' ('.sprintf("%.2f",(100*$singletons2/$data->{numseqs2})).'%)' : '').' |
';
} else {
$html .= '# Sequences: | '.&addCommas($data->{numseqs}||'-').' |
Total bases: | '.&addCommas($data->{numbases}||'-').' |
';
}
$html .= '
';
}
#length plot
if(exists $data->{counts}->{length} && keys %{$data->{counts}->{length}}) {
$html .= '';
if(exists $data->{pairedend} && $data->{pairedend}) {
$html .= '
File 1 Mean sequence length: | '.(exists $data->{stats}->{length}->{mean} ? sprintf("%.2f",$data->{stats}->{length}->{mean}) : '-').' ± '.(exists $data->{stats}->{length}->{std} ? sprintf("%.2f",$data->{stats}->{length}->{std}) : '-').' bp |
Minimum length: | '.(exists $data->{stats}->{length}->{min} ? &addCommas($data->{stats}->{length}->{min}) : '-').' bp |
Maximum length: | '.(exists $data->{stats}->{length}->{max} ? &addCommas($data->{stats}->{length}->{max}) : '-').' bp |
Length range: | '.(exists $data->{stats}->{length}->{range} ? &addCommas($data->{stats}->{length}->{range}) : '-').' bp |
Mode length: | '.(exists $data->{stats}->{length}->{mode} ? &addCommas($data->{stats}->{length}->{mode}) : '-').' bp with '.(exists $data->{stats}->{length}->{modeval} ? &addCommas($data->{stats}->{length}->{modeval}) : '-').' sequences |
';
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{counts}->{length},1),$data->{stats}->{length},'Length Distribution','Read Length in bp','# Sequences','',0,' bp');
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= &insert_image($png);
$html .= '
';
$html .= '
File 2 Mean sequence length: | '.(exists $data->{stats2}->{length}->{mean} ? sprintf("%.2f",$data->{stats2}->{length}->{mean}) : '-').' ± '.(exists $data->{stats2}->{length}->{std} ? sprintf("%.2f",$data->{stats2}->{length}->{std}) : '-').' bp |
Minimum length: | '.(exists $data->{stats2}->{length}->{min} ? &addCommas($data->{stats2}->{length}->{min}) : '-').' bp |
Maximum length: | '.(exists $data->{stats2}->{length}->{max} ? &addCommas($data->{stats2}->{length}->{max}) : '-').' bp |
Length range: | '.(exists $data->{stats2}->{length}->{range} ? &addCommas($data->{stats2}->{length}->{range}) : '-').' bp |
Mode length: | '.(exists $data->{stats2}->{length}->{mode} ? &addCommas($data->{stats2}->{length}->{mode}) : '-').' bp with '.(exists $data->{stats2}->{length}->{modeval} ? &addCommas($data->{stats2}->{length}->{modeval}) : '-').' sequences |
';
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{counts2}->{length},1),$data->{stats2}->{length},'Length Distribution','Read Length in bp','# Sequences','',0,' bp');
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= &insert_image($png);
$html .= '
';
} else {
$html .= '
Mean sequence length: | '.(exists $data->{stats}->{length}->{mean} ? sprintf("%.2f",$data->{stats}->{length}->{mean}) : '-').' ± '.(exists $data->{stats}->{length}->{std} ? sprintf("%.2f",$data->{stats}->{length}->{std}) : '-').' bp |
Minimum length: | '.(exists $data->{stats}->{length}->{min} ? &addCommas($data->{stats}->{length}->{min}) : '-').' bp |
Maximum length: | '.(exists $data->{stats}->{length}->{max} ? &addCommas($data->{stats}->{length}->{max}) : '-').' bp |
Length range: | '.(exists $data->{stats}->{length}->{range} ? &addCommas($data->{stats}->{length}->{range}) : '-').' bp |
Mode length: | '.(exists $data->{stats}->{length}->{mode} ? &addCommas($data->{stats}->{length}->{mode}) : '-').' bp with '.(exists $data->{stats}->{length}->{modeval} ? &addCommas($data->{stats}->{length}->{modeval}) : '-').' sequences |
';
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{counts}->{length},1),$data->{stats}->{length},'Length Distribution','Read Length in bp','# Sequences','',0,' bp');
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= &insert_image($png);
$html .= '
';
}
$html .= '
';
}
#GC content
if(exists $data->{counts}->{gc} && keys %{$data->{counts}->{gc}}) {
$html .= '';
if(exists $data->{pairedend} && $data->{pairedend}) {
$html .= '
File 1Mean GC content: | '.(exists $data->{stats}->{gc}->{mean} ? sprintf("%.2f",$data->{stats}->{gc}->{mean}) : '-').' ± '.(exists $data->{stats}->{gc}->{std} ? sprintf("%.2f",$data->{stats}->{gc}->{std}) : '-').' % |
Minimum GC content: | '.(exists $data->{stats}->{gc}->{min} ? $data->{stats}->{gc}->{min} : '-').' % |
Maximum GC content: | '.(exists $data->{stats}->{gc}->{max} ? $data->{stats}->{gc}->{max} : '-').' % |
GC content range: | '.(exists $data->{stats}->{gc}->{range} ? $data->{stats}->{gc}->{range} : '-').' % |
Mode GC content: | '.(exists $data->{stats}->{gc}->{mode} ? $data->{stats}->{gc}->{mode} : '-').' % with '.(exists $data->{stats}->{gc}->{modeval} ? &addCommas($data->{stats}->{gc}->{modeval}) : '-').' sequences |
';
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{counts}->{gc},0),$data->{stats}->{gc},'GC Content Distribution','GC Content (0-100%)','Number of Sequences','',1);
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= &insert_image($png);
$html .= '
';
$html .= '
File 2Mean GC content: | '.(exists $data->{stats2}->{gc}->{mean} ? sprintf("%.2f",$data->{stats2}->{gc}->{mean}) : '-').' ± '.(exists $data->{stats2}->{gc}->{std} ? sprintf("%.2f",$data->{stats2}->{gc}->{std}) : '-').' % |
Minimum GC content: | '.(exists $data->{stats2}->{gc}->{min} ? $data->{stats2}->{gc}->{min} : '-').' % |
Maximum GC content: | '.(exists $data->{stats2}->{gc}->{max} ? $data->{stats2}->{gc}->{max} : '-').' % |
GC content range: | '.(exists $data->{stats2}->{gc}->{range} ? $data->{stats2}->{gc}->{range} : '-').' % |
Mode GC content: | '.(exists $data->{stats2}->{gc}->{mode} ? $data->{stats2}->{gc}->{mode} : '-').' % with '.(exists $data->{stats2}->{gc}->{modeval} ? &addCommas($data->{stats2}->{gc}->{modeval}) : '-').' sequences |
';
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{counts2}->{gc},0),$data->{stats2}->{gc},'GC Content Distribution','GC Content (0-100%)','Number of Sequences','',1);
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= &insert_image($png);
$html .= '
';
} else {
$html .= '
Mean GC content: | '.(exists $data->{stats}->{gc}->{mean} ? sprintf("%.2f",$data->{stats}->{gc}->{mean}) : '-').' ± '.(exists $data->{stats}->{gc}->{std} ? sprintf("%.2f",$data->{stats}->{gc}->{std}) : '-').' % |
Minimum GC content: | '.(exists $data->{stats}->{gc}->{min} ? $data->{stats}->{gc}->{min} : '-').' % |
Maximum GC content: | '.(exists $data->{stats}->{gc}->{max} ? $data->{stats}->{gc}->{max} : '-').' % |
GC content range: | '.(exists $data->{stats}->{gc}->{range} ? $data->{stats}->{gc}->{range} : '-').' % |
Mode GC content: | '.(exists $data->{stats}->{gc}->{mode} ? $data->{stats}->{gc}->{mode} : '-').' % with '.(exists $data->{stats}->{gc}->{modeval} ? &addCommas($data->{stats}->{gc}->{modeval}) : '-').' sequences |
';
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{counts}->{gc},0),$data->{stats}->{gc},'GC Content Distribution','GC Content (0-100%)','Number of Sequences','',1);
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= &insert_image($png);
$html .= '
';
}
$html .= '
';
}
#Base quality
if(exists $data->{quals} || exists $data->{qualsmean} || exists $data->{qualsbin}) {
$html .= '
';
if(exists $data->{pairedend} && $data->{pairedend}) {
$html .= 'File 1
';
}
}
if(exists $data->{quals} && keys %{$data->{quals}}) {
$surface = &createBoxPlot(&convertToBoxValues($data->{quals},4),'Base Quality Distribution','Read position in %','Quality score','');
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= &insert_image($png);
}
if(exists $data->{qualsbin} && keys %{$data->{qualsbin}}) {
$surface = &createBoxPlot(&convertToBoxValues($data->{qualsbin},4),'Base Quality Distribution','Read position in bp','Quality score','',0,'bp',$data->{binval});
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
' if(exists $data->{quals});
$html .= &insert_image($png);
}
if(exists $data->{qualsmean} && keys %{$data->{qualsmean}}) {
$surface = &createBarPlot(&convertToBarValues($data->{qualsmean},5,1),'Sequence Quality Distribution','Mean of quality scores per sequence','Number of sequences','',0);
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
' if(exists $data->{qualsbin});
$html .= &insert_image($png);
}
if(exists $data->{pairedend} && $data->{pairedend}) {
if(exists $data->{quals} || exists $data->{qualsmean} || exists $data->{qualsbin}) {
$html .= '
File 2
';
}
if(exists $data->{quals2} && keys %{$data->{quals2}}) {
$surface = &createBoxPlot(&convertToBoxValues($data->{quals2},4),'Base Quality Distribution','Read position in %','Quality score','');
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= &insert_image($png);
}
if(exists $data->{qualsbin2} && keys %{$data->{qualsbin2}}) {
$surface = &createBoxPlot(&convertToBoxValues($data->{qualsbin2},4),'Base Quality Distribution','Read position in bp','Quality score','',0,'bp',$data->{binval});
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
' if(exists $data->{quals2});
$html .= &insert_image($png);
}
if(exists $data->{qualsmean2} && keys %{$data->{qualsmean2}}) {
$surface = &createBarPlot(&convertToBarValues($data->{qualsmean2},5,1),'Sequence Quality Distribution','Mean of quality scores per sequence','Number of sequences','',0);
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
' if(exists $data->{qualsbin2});
$html .= &insert_image($png);
}
}
if(exists $data->{quals} || exists $data->{qualsmean} || exists $data->{qualsbin}) {
$html .= '
';
}
#Ns
if((exists $data->{counts}->{ns} && keys %{$data->{counts}->{ns}}) || (exists $data->{counts2} && exists $data->{counts2}->{ns} && keys %{$data->{counts2}->{ns}})) {
$html .= '
';
if(exists $data->{pairedend} && $data->{pairedend}) {
$html .= '
File 1';
}
}
if(exists $data->{counts}->{ns} && keys %{$data->{counts}->{ns}}) {
my $nscount = 0;
foreach my $n (values %{$data->{counts}->{ns}}) {
$nscount += $n;
}
$html .= '
Sequences with N: | '.($nscount ? &addCommas($nscount).' ('.sprintf("%.2f",100/$data->{numseqs}*$nscount).' %)' : 0).' |
Max percentage of Ns per sequence: | '.(exists $data->{stats}->{ns}->{max} ? $data->{stats}->{ns}->{max} : 0).' % |
';
if($nscount) {
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{counts}->{ns},1),undef,'Percentage of N\'s (> 0%)','Percentage of N\'s per Read (1-100%)','# Sequences','',0);
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
'.&insert_image($png);
}
}
if(exists $data->{pairedend} && $data->{pairedend} && exists $data->{counts2}->{ns} && keys %{$data->{counts2}->{ns}}) {
$html .= '
File 2';
my $nscount = 0;
foreach my $n (values %{$data->{counts2}->{ns}}) {
$nscount += $n;
}
$html .= '
Sequences with N: | '.($nscount ? &addCommas($nscount).' ('.sprintf("%.2f",100/$data->{numseqs2}*$nscount).' %)' : 0).' |
Max percentage of Ns per sequence: | '.(exists $data->{stats2}->{ns}->{max} ? $data->{stats2}->{ns}->{max} : 0).' % |
';
if($nscount) {
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{counts2}->{ns},1),undef,'Percentage of N\'s (> 0%)','Percentage of N\'s per Read (1-100%)','# Sequences','',0);
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
'.&insert_image($png);
}
}
if((exists $data->{counts}->{ns} && keys %{$data->{counts}->{ns}}) || (exists $data->{counts2} && exists $data->{counts2}->{ns} && keys %{$data->{counts2}->{ns}})) {
$html .= '
';
}
#tails
if(exists $data->{tail} || exists $data->{tail2}) {
$html .= '
';
}
if(exists $data->{tail}) {
my $tail5count = 0;
foreach my $n (values %{$data->{counts}->{tail5}}) {
$tail5count += $n;
}
my $tail3count = 0;
foreach my $n (values %{$data->{counts}->{tail3}}) {
$tail3count += $n;
}
if(exists $data->{pairedend} && $data->{pairedend}) {
$html .= '
File 1';
}
$html .= '
| 5\'-end | 3\'-end |
Sequences with tail: | '.($tail5count ? &addCommas($tail5count).' ('.sprintf("%.2f",100/$data->{numseqs}*$tail5count).' %)' : 0).' | '.($tail3count ? &addCommas($tail3count).' ('.sprintf("%.2f",100/$data->{numseqs}*$tail3count).' %)' : 0).' |
Maximum tail length: | '.(exists $data->{stats}->{tail5}->{max} ? $data->{stats}->{tail5}->{max} : 0).' | '.(exists $data->{stats}->{tail3}->{max} ? $data->{stats}->{tail3}->{max} : 0).' |
';
if($tail5count) {
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{counts}->{tail5},1),undef,'Poly-A/T Tail Distribution (> 4bp)','5\' Tail Length in bp','# Sequences','',0,' bp');
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
'.&insert_image($png);
if($tail3count) {
$html .= '
';
}
}
if($tail3count) {
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{counts}->{tail3},1),undef,'Poly-A/T Tail Distribution (> 4bp)','3\' Tail Length in bp','# Sequences','',0,' bp');
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
'.&insert_image($png);
}
}
if(exists $data->{pairedend} && $data->{pairedend} && exists $data->{tail2}) {
my $tail5count = 0;
foreach my $n (values %{$data->{counts2}->{tail5}}) {
$tail5count += $n;
}
my $tail3count = 0;
foreach my $n (values %{$data->{counts2}->{tail3}}) {
$tail3count += $n;
}
$html .= '
File 2';
$html .= '
| 5\'-end | 3\'-end |
Sequences with tail: | '.($tail5count ? &addCommas($tail5count).' ('.sprintf("%.2f",100/$data->{numseqs2}*$tail5count).' %)' : 0).' | '.($tail3count ? &addCommas($tail3count).' ('.sprintf("%.2f",100/$data->{numseqs2}*$tail3count).' %)' : 0).' |
Maximum tail length: | '.(exists $data->{stats2}->{tail5}->{max} ? $data->{stats2}->{tail5}->{max} : 0).' | '.(exists $data->{stats2}->{tail3}->{max} ? $data->{stats2}->{tail3}->{max} : 0).' |
';
if($tail5count) {
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{counts2}->{tail5},1),undef,'Poly-A/T Tail Distribution (> 4bp)','5\' Tail Length in bp','# Sequences','',0,' bp');
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
'.&insert_image($png);
if($tail3count) {
$html .= '
';
}
}
if($tail3count) {
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{counts2}->{tail3},1),undef,'Poly-A/T Tail Distribution (> 4bp)','3\' Tail Length in bp','# Sequences','',0,' bp');
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
'.&insert_image($png);
}
}
if(exists $data->{tail} || exists $data->{tail2}) {
$html .= '
';
}
#tag sequence check
if(exists $data->{freqs} || exists $data->{freqs2}) {
$html .= '
';
}
if(exists $data->{freqs}) {
my $tagmidseq;
if(exists $data->{tagmidseq}) {
$tagmidseq = $data->{tagmidseq};
$tagmidseq =~ s/\,/\
/g;
}
if(exists $data->{pairedend} && $data->{pairedend}) {
$html .= '
File 1';
}
$html .= '
| 5\'-end | 3\'-end |
Probability of tag sequence: | '.(exists $data->{tagprob}->{5} ? $data->{tagprob}->{5}.' %' : '-').' | '.(exists $data->{tagprob}->{3} ? $data->{tagprob}->{3}.' %' : '-').' |
GSMIDs or RLMIDs: | '.(exists $data->{tagmidnum} ? ($data->{tagmidnum} == 0 ? 'none' : ($tagmidseq ? $tagmidseq : $data->{tagmidnum})) : '-').' | |
';
$html .= '
'.&insert_image($FREQCHART_L,undef,undef,1).' | ';
foreach my $pos (sort {$a <=> $b} keys %{$data->{freqs}->{5}}) {
$html .= '';
foreach my $base (qw(A C G T N)) {
if($data->{freqs}->{5}->{$pos}->{$base}) {
$html .= &insert_image($BASE64_BASES->{$base},$data->{freqs}->{5}->{$pos}->{$base},14,1).' ';
#' ';
}
}
$html .= &insert_image($MMCHART_B2,6,16,1).' | ';
}
$html .= ' ... | ';
foreach my $pos (sort {$a <=> $b} keys %{$data->{freqs}->{3}}) {
$html .= '';
foreach my $base (qw(A C G T N)) {
if($data->{freqs}->{3}->{$pos}->{$base}) {
$html .= &insert_image($BASE64_BASES->{$base},$data->{freqs}->{3}->{$pos}->{$base},14,1).' ';
}
}
$html .= &insert_image($MMCHART_B2,6,16,1).' | ';
}
$html .= '
';
$html .= ' | ';
foreach my $num (1,0,0,0,5,0,0,0,0,10,0,0,0,0,15,0,0,0,0,20,0,20,0,0,0,0,15,0,0,0,0,10,0,0,0,0,5,0,0,0,1) {
$html .= ''.($num ? $num : '').' | ';
}
$html .= '
| Position from Sequence Ends |
';
$html .= '
';
}
if(exists $data->{pairedend} && $data->{pairedend} && exists $data->{freqs2}) {
$html .= '
File 2';
$html .= '
| 5\'-end | 3\'-end |
Probability of tag sequence: | '.(exists $data->{tagprob2}->{5} ? $data->{tagprob2}->{5}.' %' : '-').' | '.(exists $data->{tagprob2}->{3} ? $data->{tagprob2}->{3}.' %' : '-').' |
';
$html .= '
'.&insert_image($FREQCHART_L,undef,undef,1).' | ';
foreach my $pos (sort {$a <=> $b} keys %{$data->{freqs2}->{5}}) {
$html .= '';
foreach my $base (qw(A C G T N)) {
if($data->{freqs2}->{5}->{$pos}->{$base}) {
$html .= &insert_image($BASE64_BASES->{$base},$data->{freqs2}->{5}->{$pos}->{$base},14,1).' ';
#' ';
}
}
$html .= &insert_image($MMCHART_B2,6,16,1).' | ';
}
$html .= ' ... | ';
foreach my $pos (sort {$a <=> $b} keys %{$data->{freqs2}->{3}}) {
$html .= '';
foreach my $base (qw(A C G T N)) {
if($data->{freqs2}->{3}->{$pos}->{$base}) {
$html .= &insert_image($BASE64_BASES->{$base},$data->{freqs2}->{3}->{$pos}->{$base},14,1).' ';
}
}
$html .= &insert_image($MMCHART_B2,6,16,1).' | ';
}
$html .= '
';
$html .= ' | ';
foreach my $num (1,0,0,0,5,0,0,0,0,10,0,0,0,0,15,0,0,0,0,20,0,20,0,0,0,0,15,0,0,0,0,10,0,0,0,0,5,0,0,0,1) {
$html .= ''.($num ? $num : '').' | ';
}
$html .= '
| Position from Sequence Ends |
';
$html .= '
';
}
if(exists $data->{freqs} || exists $data->{freqs2}) {
$html .= '
';
}
#Sequence duplicates
if(exists $data->{dubslength} || exists $data->{dubscounts}) {
$html .= '';
}
my %dubs;
if(exists $data->{dubscounts} && keys %{$data->{dubscounts}}) {
my $exactonly = $data->{exactonly}||0;
foreach my $n (keys %{$data->{dubscounts}}) {
foreach my $s (keys %{$data->{dubscounts}->{$n}}) {
$dubs{$s}->{count} += $data->{dubscounts}->{$n}->{$s} * $n;
$dubs{$s}->{max} = $n unless(exists $dubs{$s}->{max} && $dubs{$s}->{max} > $n);
$dubs{all} += $data->{dubscounts}->{$n}->{$s} * $n;
}
}
$html .= '
| # Sequences | Max duplicates |
Exact duplicates: | '.(exists $dubs{0}->{count} ? &addCommas($dubs{0}->{count}).' ('.sprintf("%.2f",100/$data->{numseqs}*$dubs{0}->{count}).' %)' : 0).' | '.($dubs{0}->{max}||0).' |
Exact duplicates with reverse complements: | '.(exists $dubs{3}->{count} ? &addCommas($dubs{3}->{count}).' ('.sprintf("%.2f",100/$data->{numseqs}*$dubs{3}->{count}).' %)' : 0).' | '.($dubs{3}->{max}||0).' |
';
unless($exactonly) {
$html .= '5\' duplicates | '.(exists $dubs{1}->{count} ? &addCommas($dubs{1}->{count}).' ('.sprintf("%.2f",100/$data->{numseqs}*$dubs{1}->{count}).' %)' : 0).' | '.($dubs{1}->{max}||0).' |
3\' duplicates | '.(exists $dubs{2}->{count} ? &addCommas($dubs{2}->{count}).' ('.sprintf("%.2f",100/$data->{numseqs}*$dubs{2}->{count}).' %)' : 0).' | '.($dubs{2}->{max}||0).' |
5\'/3\' duplicates with reverse complements | '.(exists $dubs{4}->{count} ? &addCommas($dubs{4}->{count}).' ('.sprintf("%.2f",100/$data->{numseqs}*$dubs{4}->{count}).' %)' : 0).' | '.($dubs{4}->{max}||0).' |
';
}
$html .= 'Total: | '.(exists $dubs{all} ? &addCommas($dubs{all}).' ('.sprintf("%.2f",100/$data->{numseqs}*$dubs{all}).' %)' : 0).' | - |
';
}
if(exists $dubs{all} && $dubs{all}) {
if(exists $data->{dubslength} && keys %{$data->{dubslength}}) {
$surface = &createStackBarPlot(&convertOdToStackBinMatrix($data->{dubslength},5,1),'Sequence duplication level','Read Length in bp','Number of duplicates','',0,' bp');
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
'.&insert_image($png);
}
if(exists $data->{dubscounts} && keys %{$data->{dubscounts}}) {
$surface = &createStackBarPlot(&convertOdToStackBinMatrix($data->{dubscounts},5,1,100),'Sequence duplication level','Number of duplicates','Number of sequences','',0);
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
' if(exists $data->{dubslength});
$html .= &insert_image($png);
my %dubsmax;
my $count = 1;
foreach my $n (sort {$b <=> $a} keys %{$data->{dubscounts}}) {
foreach my $s (keys %{$data->{dubscounts}->{$n}}) {
foreach my $i (1..$data->{dubscounts}->{$n}->{$s}) {
$dubsmax{$count++}->{$s} = $n;
last unless($count <= 100);
}
last unless($count <= 100);
}
last unless($count <= 100);
}
$surface = &createStackBarPlot(&convertOdToStackBinMatrix(\%dubsmax,5,1,100),'Sequence duplication level','Sequence','Number of duplicates','',0);
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
' if(exists $data->{dubslength});
$html .= &insert_image($png);
}
}
if(exists $data->{dubslength} || exists $data->{dubscounts}) {
$html .= '
';
}
#Sequence complexity
if(exists $data->{compldust} || exists $data->{complentropy}) {
$html .= '';
if(exists $data->{complvals}) {
my $complseq;
foreach my $d (keys %{$data->{complvals}}) {
foreach my $m ('minseq','maxseq') {
$complseq = $data->{complvals}->{$d}->{$m};
$complseq = substr($complseq,0,797).'...' if(length($complseq) > 800);
$complseq =~ s/(.{60})/$1\
/g;
$data->{complvals}->{$d}->{$m} = $complseq;
}
}
}
$html .= '
| Value | Sequence |
Minimum DUST score: | '.(exists $data->{complvals}->{dust}->{minval} ? $data->{complvals}->{dust}->{minval} : '-').' | '.(exists $data->{complvals}->{dust}->{minseq} ? $data->{complvals}->{dust}->{minseq} : '').' |
Maximum DUST score: | '.(exists $data->{complvals}->{dust}->{maxval} ? $data->{complvals}->{dust}->{maxval} : '').' | '.(exists $data->{complvals}->{dust}->{maxseq} ? $data->{complvals}->{dust}->{maxseq} : '').' |
Minimum Entropy value: | '.(exists $data->{complvals}->{entropy}->{minval} ? $data->{complvals}->{entropy}->{minval} : '').' | '.(exists $data->{complvals}->{entropy}->{minseq} ? $data->{complvals}->{entropy}->{minseq} : '').' |
Maximum Entropy value: | '.(exists $data->{complvals}->{entropy}->{maxval} ? $data->{complvals}->{entropy}->{maxval} : '').' | '.(exists $data->{complvals}->{entropy}->{maxseq} ? $data->{complvals}->{entropy}->{maxseq} : '').' |
';
}
if(exists $data->{compldust}) {
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{compldust},0),undef,'Sequence complexity distribution','Mean sequence complexity (DUST scores)','Number of sequences','',1);
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= &insert_image($png);
}
if(exists $data->{complentropy}) {
$surface = &createAnnotBarPlot(&convertOdToBinMatrix($data->{complentropy},0),undef,'Sequence complexity distribution','Mean sequence complexity (Entropy values)','Number of sequences','',1);
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= '
' if(exists $data->{compldust});
$html .= &insert_image($png);
}
if(exists $data->{compldust} || exists $data->{complentropy}) {
$html .= '
';
}
#Dinucleotide odd ratio PCA - microbial/viral
if(exists $data->{dinucodds} && keys %{$data->{dinucodds}}) {
$html .= '';
$html .= '
| ';
foreach my $d (map {join("/",(m/../g ))} sort keys %{$data->{dinucodds}}) {
$html .= ''.$d.' | ';
}
$html .= '
Odds ratio | ';
foreach my $d (map {sprintf("%.4f",$data->{dinucodds}->{$_})} sort keys %{$data->{dinucodds}}) {
$html .= ''.$d.' | ';
}
$html .= '
';
my @new = map {$data->{dinucodds}->{$_}} sort keys %{$data->{dinucodds}};
$surface = &createOddsRatioPlot($data->{dinucodds},'Odds ratios','Dinucleotide','Odds ratio','');
$png = '';
$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
$html .= &insert_image($png);
#$surface = &createPCAPlot(&convertToPCAValues(\@new,'m'),'PCA','1st Principal Component Score','2nd Principal Component Score','');
#$png = '';
#$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
#$html .= '
';
#$html .= &insert_image($png);
#$surface = &createPCAPlot(&convertToPCAValues(\@new,'v'),'PCA','1st Principal Component Score','2nd Principal Component Score','');
#$png = '';
#$surface->write_to_png_stream(sub { my ($closure, $data) = @_; $png .= $data; });
#$html .= '
';
#$html .= &insert_image($png);
$html .= '
';
}
$html .= '
';
$html .= &footer();
#write html to file
$file = &getFileName('.html');
open(FH, ">$file") or &printError("Can't open file ".$file.": $!");
print FH $html;
close(FH);
&printLog("Done with HTML data");
}
sub insert_image {
my ($data, $height, $width, $noencode) = @_;
my $content .= '