';
+
+ #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 .= '