Repository 'srnapipe'
hg clone https://toolshed.g2.bx.psu.edu/repos/brasset_jensen/srnapipe

Changeset 64:967512924317 (2019-01-28)
Previous changeset 63:11708af40030 (2019-01-24) Next changeset 65:0e9adbd82bb4 (2019-01-30)
Commit message:
planemo upload for repository https://github.com/GReD-Clermont/sRNAPipe/ commit 410509088292be0687b8da3ea3bb75e72866a87d
modified:
README.rst
bin/sRNAPipe.pl
sRNAPipe.xml
added:
lib/sRNAPipe.pm
lib/sRNAPipe/Rcall.pm
lib/sRNAPipe/align.pm
lib/sRNAPipe/css/bootstrap-responsive.css
lib/sRNAPipe/css/bootstrap-table.css
lib/sRNAPipe/css/bootstrap.css
lib/sRNAPipe/html.pm
lib/sRNAPipe/js/bootstrap-table.js
lib/sRNAPipe/js/bootstrap.min.js
lib/sRNAPipe/js/filter.js
lib/sRNAPipe/js/jquery.galleriffic.js
lib/sRNAPipe/js/jquery.js
lib/sRNAPipe/js/jquery.opacityrollover.js
lib/sRNAPipe/ppp.pm
lib/sRNAPipe/resize.pm
lib/sRNAPipe/subgroups.pm
removed:
bin/Rcall.pm
bin/align.pm
bin/css/bootstrap-responsive.css
bin/css/bootstrap-table.css
bin/css/bootstrap.css
bin/html.pm
bin/js/bootstrap-table.js
bin/js/bootstrap.min.js
bin/js/filter.js
bin/js/jquery.galleriffic.js
bin/js/jquery.js
bin/js/jquery.opacityrollover.js
bin/ppp.pm
bin/resize.pm
bin/subgroups.pm
b
diff -r 11708af40030 -r 967512924317 README.rst
--- a/README.rst Thu Jan 24 13:09:46 2019 -0500
+++ b/README.rst Mon Jan 28 11:57:15 2019 -0500
b
@@ -15,7 +15,7 @@
 Prerequisites
 =============
 
-1. Unix system with A Galaxy server (release july 2014 or later installed)
+1. Unix system with A Galaxy server (release 16.01 or later installed)
 
 2. Some tools are used by sRNAPipe and must be installed and added to the Path.
 
b
diff -r 11708af40030 -r 967512924317 bin/Rcall.pm
--- a/bin/Rcall.pm Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,136 +0,0 @@
-package Rcall;
-
-use strict;
-use warnings;
-use Statistics::R;
-
-use Exporter;
-our @ISA = qw(Exporter);
-our @EXPORT_OK = qw( &histogram &pie_chart &bg_to_png );
-
-sub histogram
-{
-    my ($size_hashR, $out_png, $size)    = @_;
-    my (@abs, @ord);
-    my $i = 0;
-    foreach my $k (sort {$a <=> $b} keys %{$size_hashR})
-    {
-        my $percentage = 0;
-        $percentage = $size_hashR->{$k} * 100 / $size if $size != 0;
-        $abs[$i] = $k ; $ord[$i] = $percentage; $i++;
-    }
-    my $abs = join (",", @abs );
-    my $ord = join (",", @ord );
-    if (scalar(@abs) != 0)
-    {
-
-        my $R = Statistics::R->new();
-        $R->startR;
-        $R->send(
-            qq`library(ggplot2)
-            percentage = c($ord)
-            size =c($abs)
-            min = min(size)
-            max = max(size)
-            dat = data.frame(size,percentage)
-            png(filename=\"$out_png\", width = 640, height = 640)
-            c = ggplot(dat,aes(size,percentage))
-            c + geom_bar(stat="identity") + scale_x_continuous(breaks=min:max)+theme( axis.text.x = element_text(angle=90, hjust=0.5, size=20), axis.text.y = element_text( size=20 ), axis.title.x = element_text( size=25, face="bold"), axis.title.y = element_text( size=25, face="bold") )
-            dev.off()`);
-        $R->stopR();
-
-    }
-}
-
-sub bg_to_png
-{
-    my ( $fai, $bgP, $bgM, $dir, $sb ) = @_;
-    my $R = Statistics::R->new();
-    $R->startR;
-    $R->send(
-    qq`library('Sushi')
-    fai =read.table("$fai")
-    if ( file.info("$bgP")\$size !=0 )
-    {
-        bgP = read.table("$bgP")
-    } else { bgP = data.frame(factor(),integer()) }
-
-    if ( file.info("$bgM")\$size !=0 )
-    {
-        bgM = read.table("$bgM")
-    } else { bgM = data.frame(factor(),integer()) }
-
-    f_both = function(chr,end) {
-        jpeg( paste0("$dir",as.character(chr),".png"), quality=100)
-        par(mfrow=c(2,1),mar=c(1,10,1,3))
-        plotBedgraph(bgP, chrom=chr,chromstart=0,chromend=end,transparency=.50,    color=SushiColors(2)(2)[1])
-        axis(side=2,las=2,tcl=.2)
-        mtext("Scaled Read Depth",side=2,line=4,cex=1,font=2)
-        plotBedgraph(bgM, chrom=chr,chromstart=0,chromend=end,transparency=.50, flip=TRUE, color=SushiColors(2)(2)[2])
-        labelgenome(chrom=chr,chromstart=0,chromend=end,side=3,n=3,scale="$sb", line=0,    chromline = 0.5,    scaleline = 0.5, scaleadjust =1.05, chromadjust = -0.4)
-        axis(side=2,las=2,tcl=.2,at=pretty(par("yaxp")[c(1,2)]),labels=-1*pretty(par("yaxp")[c(1,2)]))
-        mtext("Scaled Read Depth",side=2,line=4.5,cex=1,font=2)
-        dev.off()
-    }
-
-    f_plus = function(chr,end) {
-        jpeg( paste0("$dir",as.character(chr),".png"), quality=100)
-        plotBedgraph(bgP, chrom=chr,chromstart=0,chromend=end,transparency=.50,    color=SushiColors(2)(2)[1])
-        labelgenome(chrom=chr,chromstart=0,chromend=end,n=3,scale="$sb", line=0,    chromline = 0.5,    scaleline = 0.5, scaleadjust =1.05, chromadjust = -0.4)
-        axis(side=2,las=2,tcl=.2)
-        mtext("Scaled Read Depth",side=2,line=4,cex=1,font=2)
-        dev.off()
-    }
-
-    f_minus = function(chr,end) {
-        jpeg( paste0("$dir",as.character(chr),".png"), quality=100)
-        plotBedgraph(bgM, chrom=chr,chromstart=0,chromend=end,transparency=.50, flip=TRUE, color=SushiColors(2)(2)[2])
-        labelgenome(chrom=chr,chromstart=0,chromend=end,n=3,scale="$sb", line=0,    chromline = 0.5,    scaleline = 0.5, scaleadjust =1.05, chromadjust = -0.4)
-        axis(side=2,las=2,tcl=.2,at=pretty(par("yaxp")[c(1,2)]),labels=-1*pretty(par("yaxp")[c(1,2)]))
-        mtext("Scaled Read Depth",side=2,line=4.5,cex=1,font=2)
-        dev.off()
-    }
-
-    fai_b = fai[fai\$V1 %in% intersect(bgM\$V1,bgP\$V1), ]
-    mapply( f_both, fai_b\$V1, fai_b\$V2)
-
-    fai_p = fai[fai\$V1 %in% setdiff(bgP\$V1,bgM\$V1), ]
-    mapply( f_plus, fai_p\$V1, fai_p\$V2)
-
-    fai_m = fai[fai\$V1 %in% setdiff(bgM\$V1,bgP\$V1), ]
-    mapply( f_minus, fai_m\$V1, fai_m\$V2) `);
-
-    $R->stopR();
-}
-
-sub pie_chart
-{
-    my $dir = shift;
-    my $in = $dir.'repartition.txt';
-    my $out = $dir.'pie_chart.png';
-
-    my $R = Statistics::R->new();
-    $R->startR;
-    $R->send(
-    qq`
-    library(plotrix)
-    library(RColorBrewer)
-    R =read.table("$in",header=T)
-    values = round(R\$percentage)
-    keys = R\$type
-    lab = paste(values, "%", sep="")
-    png("$out")
-    colors <- brewer.pal(7,"Paired")
-    pie(values, col=colors, labels=lab, clockwise=TRUE)
-    legend("bottom", legend = keys, fill=colors, bty="n", ncol = 3)
-    par(mai = c(0,0,0,0))
-    layout(c(1,2),heights=c(0.3,1))
-    plot.new()
-    legend("bottom", legend = keys, fill=colors, bty="n",ncol = 3)
-    pie(values, col=colors, labels=lab, clockwise=TRUE)
-    dev.off()`
-    );
-    $R->stopR();
-}
-
-1;
b
diff -r 11708af40030 -r 967512924317 bin/align.pm
--- a/bin/align.pm Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,551 +0,0 @@\n-package align;\n-\n-use strict;\n-use warnings;\n-use File::Basename;\n-use String::Random;\n-\n-use FindBin;\n-use lib $FindBin::Bin;\n-use Rcall qw ( histogram );\n-\n-use Exporter;\n-our @ISA         = qw( Exporter );\n-our @EXPORT    = qw( &rpms_rpkm_te &BWA_call &to_build &get_unique &sam_sorted_bam &get_hash_alignment &sam_to_bam_bg &sam_count &sam_count_mis &rpms_rpkm &get_fastq_seq &extract_sam );\n-\n-sub to_build\n-{\n-    my ( $toBuildTabP, $log, $newdir ) = @_;\n-\n-    foreach my    $pairs ( @{ $toBuildTabP } )\n-    {\n-        if (    $pairs->[0] == 1 )\n-        {\n-            my $sym = $newdir.basename(${$pairs->[1]}).\'_symlink.fa\';\n-            symlink( ${$pairs->[1]}, $sym );\n-            ${$pairs->[1]} = $sym;\n-            build_index ( ${$pairs->[1]}, $log );\n-        }\n-    }\n-}\n-\n-sub build_index\n-{\n-    my $to_index = shift;\n-    my $log = shift;\n-    my $index_log = $to_index.\'_index.err\';\n-    `bwa index \'$to_index\' 2> \'$index_log\'`;\n-    print $log "Creating index for $to_index\\n";\n-}\n-\n-sub get_unique\n-{\n-    my ( $sam, $s_uni, $out_prefix, $col_prefix, $details, $report ) = @_;\n-\n-    my $fout = $col_prefix.\'_all_mappers.fastq\';\n-    my $funi = $col_prefix.\'_unique_mappers.fastq\';\n-    my $frej = $col_prefix.\'_unmapped.fastq\';\n-    \n-    my $repartition = $out_prefix.\'distribution.txt\';\n-    my $png_rep = $out_prefix.\'distribution.png\';\n-    my ( %duplicates, %genome_hits) ;\n-\n-    #alignement to the first reference\n-    my @return = sam_parse( $sam, $fout, $funi, $frej, $s_uni, \\%duplicates, \\%genome_hits, $report );\n-    my $ref_fai = $return[4];\n-    my $mappers =    $return[5];\n-    my $mappers_uni = $return[6];\n-    my $size_mappedHashR = $return[7];\n-\n-    if ( $details == 1 )\n-    {\n-        #print number of duplicates and hits number\n-        my ($pourcentage, $total) =(0,0);\n-\n-        $total += $_ foreach values %{$size_mappedHashR};\n-        open (my $rep, \'>\'.$repartition) || die "cannot create $repartition $!\\n";\n-        print $rep "size\\tnumber\\tpercentage\\n";\n-        foreach my $k (sort{$a cmp $b} keys (%{$size_mappedHashR}))\n-        {\n-            $pourcentage = 0;\n-            $pourcentage = $size_mappedHashR->{$k} / $total * 100 unless $total ==0;\n-\n-            print $rep "$k\\t$size_mappedHashR->{$k}\\t";\n-            printf $rep "%.2f\\n",$pourcentage;\n-        }\n-\n-        histogram($size_mappedHashR, $png_rep, $total);\n-\n-\n-        my $dup = $out_prefix.\'dup_mapnum.txt\';\n-        my $dup_u = $out_prefix .\'dup_unique.txt\';\n-        my $dup_r = $out_prefix .\'dup_nonmapp.txt\';\n-        open(my $tab,">".$dup) || die "cannot open output txt file\\n";\n-        open(my $tab_r,">".$dup_r) || die "cannot open output txt file\\n";\n-        open(my $tab_u,">".$dup_u) || die "cannot open output txt file\\n";\n-        print $tab "sequence\\tcount\\tmapnum\\n";\n-        print $tab_u "sequence\\tcount\\n";\n-        print $tab_r "sequence\\tcount\\n";\n-        foreach my $k (sort {$duplicates{$b} <=> $duplicates{$a}}keys %duplicates)\n-        {\n-            $duplicates{$k} = 0 unless exists($duplicates{$k});\n-            $genome_hits{$k} = 0 unless exists($genome_hits{$k});\n-            if ($genome_hits{$k} != 0) { print $tab $k."\\t".$duplicates{$k}."\\t".$genome_hits{$k}."\\n"; }\n-            else {print $tab_r $k."\\t".$duplicates{$k}."\\n";}\n-            if ($genome_hits{$k} == 1) { print $tab_u $k."\\t".$duplicates{$k}."\\n"; }\n-        }\n-    close $dup; close $dup_r; close $dup_u;\n-    }\n-    return ( $ref_fai, $mappers, $mappers_uni );\n-}\n-\n-sub sam_parse\n-{\n-    my ( $sam, $fastq_accepted, $fastq_accepted_unique, $fastq_rejected, $sam_unique, $duplicate_hashR, $best_hit_number_hashR, $report ) = @_ ;\n-    my ($reads, $mappers, $mappersUnique, @garbage, %size_num, %size_num_spe, %number, %numberSens, %numberReverse, %unique_number, %numberNM, %numberM, %size);\n-    $mappers = $mappersUnique = $reads = 0;\n-\n-    open my $fic, \'<\', $sam || die "cannot open $sam $!\\n";\n-    open my $accepted, \'>\', $fastq_'..b'> \'$samse_err\' > \'$sam\'\\n";\n-    `bwa aln -t $number_of_cpus -n $mismatches \'$index\' \'$fastq\' 2> \'$aln_err\' | bwa samse $index /dev/stdin \'$fastq\' 2> \'$samse_err\' > \'$sam\' `;\n-}\n-\n-sub rpms_rpkm\n-{\n-    my ( $counthashR, $sizehashR, $mapped, $out_file, $piRNA_number, $miRNA_number, $bonafide_number ) =@_;\n-    open(my $out, ">".$out_file) || die "cannot open normalized file $! \\n";\n-    print $out "ID\\treads counts\\tRPKM";\n-    print $out "\\tper million of piRNAs" if ($piRNA_number != 0);\n-    print $out "\\tper million of miRNAs" if ($miRNA_number != 0);\n-    print $out "\\tper million of bonafide reads" if ($bonafide_number != 0);\n-    print $out "\\n";\n-    foreach my $k    ( sort keys %{$counthashR} )\n-    {\n-        my ($rpkm, $pirna, $mirna, $bonafide) = (0,0,0,0);\n-        \n-        $rpkm = ( $counthashR->{$k} * 1000000000) / ( $sizehashR->{$k} * $mapped) if ( $sizehashR->{$k} * $mapped) != 0 ;\n-        print $out $k."\\t".$counthashR->{$k}."\\t"; printf $out "%.2f",$rpkm;\n-        \n-        if ($piRNA_number != 0 )\n-        {\n-            $pirna = ( $counthashR->{$k}    * 1000000) / $piRNA_number;\n-            printf $out "\\t%.2f",$pirna;\n-        }\n-        if ($miRNA_number != 0 )\n-        {\n-            $mirna = ( $counthashR->{$k}    * 1000000) / $miRNA_number;\n-            printf $out "\\t%.2f",$mirna;\n-        }\n-        if ($bonafide_number != 0 )\n-        {\n-            $bonafide = ( $counthashR->{$k}    * 1000000) / $bonafide_number;\n-            printf $out "\\t%.2f",$bonafide;\n-        }\n-        print $out "\\n";\n-     }\n-    close $out;\n-}\n-\n-sub extract_sam\n-{\n-    my ( $hashRef, $sam_in, $sam_out, $sam_uni_out, $fastq_out, $fastq_uni_out ) = @_;\n-    \n-    open my $s_in, \'<\', $sam_in || die "cannot open $sam_in file $!\\n";\n-\n-    open my $f_out, \'>\', $fastq_out || die "cannot create $fastq_out $!\\n";\n-    open my $f_uni_out, \'>\', $fastq_uni_out || die "cannot create $fastq_uni_out $!\\n";\n-    \n-    open my $s_out, \'>\', $sam_out || die "cannot create $sam_out file $!\\n" if defined ($hashRef);\n-    open my $s_uni_out, \'>\', $sam_uni_out || die "cannot create $sam_uni_out file $!\\n";\n-\n-    my $sequence = \'\';\n-    while(<$s_in>)\n-    {\n-        if ($_ =~ /^\\@[A-Za-z][A-Za-z](\\t[A-Za-z][A-Za-z0-9]:[ -~]+)+$/ || $_ =~ /^\\@CO\\t.*/ )\n-        {\n-            print $s_out $_ if defined ($hashRef);\n-            print $s_uni_out $_;\n-            next;\n-        }\n-        my @line = split (/\\t/,$_);\n-        $sequence = $line[0];\n-        if ( (! defined ($hashRef) )|| (    exists $hashRef->{$sequence}    &&    $hashRef->{$sequence} == 1 ) )\n-        {\n-            my $arn    =    $line[9];\n-            if ($line[1] & 16)\n-            {\n-                $arn =reverse($arn);\n-                $arn =~ tr/atgcuATGCU/tacgaTACGA/;\n-            }\n-\n-            if    ( ( $line[1] == 16 || $line[1] == 0 ) )\n-            {\n-                print $f_out "\\@".$line[0]."\\n".$arn."\\n+\\n".$line[10]."\\n" ;\n-                print $s_out $_ if defined ($hashRef);\n-                if ( $line[11] eq "XT:A:U" )\n-                {\n-                    print $f_uni_out "\\@".$line[0]."\\n".$arn."\\n+\\n".$line[10]."\\n" ;\n-                    print $s_uni_out $_ ;\n-                }\n-            }\n-        }\n-    }\n-    close $s_in; close $s_out if defined ($hashRef);\n-    close $s_uni_out; close $f_out; close $f_uni_out;\n-}\n-\n-sub get_fastq_seq\n-{\n-    my $fastq = shift;\n-    my %hash; my $cmp = 0;\n-\n-    open my $fic, \'<\', $fastq || die "cannot open input file $! \\n";\n-    while(<$fic>)\n-    {\n-        chomp $_;\n-        $cmp++;\n-        if ($cmp % 4 == 1)\n-        {\n-            die "file do not contain a @ at line $cmp\\n" unless ($_ =~ /^\\@/ );\n-            if ($_ =~ /^\\@(.*)\\s.*/) { $hash{$1} = 1;}\n-            elsif ($_ =~ /^\\@(.*)/) { $hash{$1} = 1;}\n-        }\n-        elsif ($cmp % 4 == 3 )\n-        {\n-            die "file do not contain a + at line $cmp\\n" unless $_ =~ /^\\+/;\n-        }\n-    }\n-    close $fic;\n-    return \\%hash;\n-}\n-\n-1;\n'
b
diff -r 11708af40030 -r 967512924317 bin/css/bootstrap-responsive.css
--- a/bin/css/bootstrap-responsive.css Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,1109 +0,0 @@\n-/*!\n- * Bootstrap Responsive v2.3.2\n- *\n- * Copyright 2012 Twitter, Inc\n- * Licensed under the Apache License v2.0\n- * http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Designed and built with all the love in the world @twitter by @mdo and @fat.\n- */\n-\n-.clearfix {\n-  *zoom: 1;\n-}\n-\n-.clearfix:before,\n-.clearfix:after {\n-  display: table;\n-  line-height: 0;\n-  content: "";\n-}\n-\n-.clearfix:after {\n-  clear: both;\n-}\n-\n-.hide-text {\n-  font: 0/0 a;\n-  color: transparent;\n-  text-shadow: none;\n-  background-color: transparent;\n-  border: 0;\n-}\n-\n-.input-block-level {\n-  display: block;\n-  width: 100%;\n-  min-height: 30px;\n-  -webkit-box-sizing: border-box;\n-     -moz-box-sizing: border-box;\n-          box-sizing: border-box;\n-}\n-\n-@-ms-viewport {\n-  width: device-width;\n-}\n-\n-.hidden {\n-  display: none;\n-  visibility: hidden;\n-}\n-\n-.visible-phone {\n-  display: none !important;\n-}\n-\n-.visible-tablet {\n-  display: none !important;\n-}\n-\n-.hidden-desktop {\n-  display: none !important;\n-}\n-\n-.visible-desktop {\n-  display: inherit !important;\n-}\n-\n-@media (min-width: 768px) and (max-width: 979px) {\n-  .hidden-desktop {\n-    display: inherit !important;\n-  }\n-  .visible-desktop {\n-    display: none !important ;\n-  }\n-  .visible-tablet {\n-    display: inherit !important;\n-  }\n-  .hidden-tablet {\n-    display: none !important;\n-  }\n-}\n-\n-@media (max-width: 767px) {\n-  .hidden-desktop {\n-    display: inherit !important;\n-  }\n-  .visible-desktop {\n-    display: none !important;\n-  }\n-  .visible-phone {\n-    display: inherit !important;\n-  }\n-  .hidden-phone {\n-    display: none !important;\n-  }\n-}\n-\n-.visible-print {\n-  display: none !important;\n-}\n-\n-@media print {\n-  .visible-print {\n-    display: inherit !important;\n-  }\n-  .hidden-print {\n-    display: none !important;\n-  }\n-}\n-\n-@media (min-width: 1200px) {\n-  .row {\n-    margin-left: -30px;\n-    *zoom: 1;\n-  }\n-  .row:before,\n-  .row:after {\n-    display: table;\n-    line-height: 0;\n-    content: "";\n-  }\n-  .row:after {\n-    clear: both;\n-  }\n-  [class*="span"] {\n-    float: left;\n-    min-height: 1px;\n-    margin-left: 30px;\n-  }\n-  .container,\n-  .navbar-static-top .container,\n-  .navbar-fixed-top .container,\n-  .navbar-fixed-bottom .container {\n-    width: 1170px;\n-  }\n-  .span12 {\n-    width: 1170px;\n-  }\n-  .span11 {\n-    width: 1070px;\n-  }\n-  .span10 {\n-    width: 970px;\n-  }\n-  .span9 {\n-    width: 870px;\n-  }\n-  .span8 {\n-    width: 770px;\n-  }\n-  .span7 {\n-    width: 670px;\n-  }\n-  .span6 {\n-    width: 570px;\n-  }\n-  .span5 {\n-    width: 470px;\n-  }\n-  .span4 {\n-    width: 370px;\n-  }\n-  .span3 {\n-    width: 270px;\n-  }\n-  .span2 {\n-    width: 170px;\n-  }\n-  .span1 {\n-    width: 70px;\n-  }\n-  .offset12 {\n-    margin-left: 1230px;\n-  }\n-  .offset11 {\n-    margin-left: 1130px;\n-  }\n-  .offset10 {\n-    margin-left: 1030px;\n-  }\n-  .offset9 {\n-    margin-left: 930px;\n-  }\n-  .offset8 {\n-    margin-left: 830px;\n-  }\n-  .offset7 {\n-    margin-left: 730px;\n-  }\n-  .offset6 {\n-    margin-left: 630px;\n-  }\n-  .offset5 {\n-    margin-left: 530px;\n-  }\n-  .offset4 {\n-    margin-left: 430px;\n-  }\n-  .offset3 {\n-    margin-left: 330px;\n-  }\n-  .offset2 {\n-    margin-left: 230px;\n-  }\n-  .offset1 {\n-    margin-left: 130px;\n-  }\n-  .row-fluid {\n-    width: 100%;\n-    *zoom: 1;\n-  }\n-  .row-fluid:before,\n-  .row-fluid:after {\n-    display: table;\n-    line-height: 0;\n-    content: "";\n-  }\n-  .row-fluid:after {\n-    clear: both;\n-  }\n-  .row-fluid [class*="span"] {\n-    display: block;\n-    float: left;\n-    width: 100%;\n-    min-height: 30px;\n-    margin-left: 2.564102564102564%;\n-    *margin-left: 2.5109110747408616%;\n-    -webkit-box-sizing: border-box;\n-       -moz-box-sizing: border-box;\n-            box-sizing: border-box;\n-  }\n-  .row-fluid [class*="span"]:first-child {\n-    margin-left: 0;\n-  }\n-  .row-fluid .controls-row [class*="span"] + [class*="span"] {\n-    margin-left: 2.564102564102564%;\n-  }\n-  .row-fluid .span12 {\n-    width: 100%;\n-    *width: 99.9468'..b'tic;\n-  }\n-}\n-\n-@media (max-width: 979px) {\n-  body {\n-    padding-top: 0;\n-  }\n-  .navbar-fixed-top,\n-  .navbar-fixed-bottom {\n-    position: static;\n-  }\n-  .navbar-fixed-top {\n-    margin-bottom: 20px;\n-  }\n-  .navbar-fixed-bottom {\n-    margin-top: 20px;\n-  }\n-  .navbar-fixed-top .navbar-inner,\n-  .navbar-fixed-bottom .navbar-inner {\n-    padding: 5px;\n-  }\n-  .navbar .container {\n-    width: auto;\n-    padding: 0;\n-  }\n-  .navbar .brand {\n-    padding-right: 10px;\n-    padding-left: 10px;\n-    margin: 0 0 0 -5px;\n-  }\n-  .nav-collapse {\n-    clear: both;\n-  }\n-  .nav-collapse .nav {\n-    float: none;\n-    margin: 0 0 10px;\n-  }\n-  .nav-collapse .nav > li {\n-    float: none;\n-  }\n-  .nav-collapse .nav > li > a {\n-    margin-bottom: 2px;\n-  }\n-  .nav-collapse .nav > .divider-vertical {\n-    display: none;\n-  }\n-  .nav-collapse .nav .nav-header {\n-    color: #777777;\n-    text-shadow: none;\n-  }\n-  .nav-collapse .nav > li > a,\n-  .nav-collapse .dropdown-menu a {\n-    padding: 9px 15px;\n-    font-weight: bold;\n-    color: #777777;\n-    -webkit-border-radius: 3px;\n-       -moz-border-radius: 3px;\n-            border-radius: 3px;\n-  }\n-  .nav-collapse .btn {\n-    padding: 4px 10px 4px;\n-    font-weight: normal;\n-    -webkit-border-radius: 4px;\n-       -moz-border-radius: 4px;\n-            border-radius: 4px;\n-  }\n-  .nav-collapse .dropdown-menu li + li a {\n-    margin-bottom: 2px;\n-  }\n-  .nav-collapse .nav > li > a:hover,\n-  .nav-collapse .nav > li > a:focus,\n-  .nav-collapse .dropdown-menu a:hover,\n-  .nav-collapse .dropdown-menu a:focus {\n-    background-color: #f2f2f2;\n-  }\n-  .navbar-inverse .nav-collapse .nav > li > a,\n-  .navbar-inverse .nav-collapse .dropdown-menu a {\n-    color: #999999;\n-  }\n-  .navbar-inverse .nav-collapse .nav > li > a:hover,\n-  .navbar-inverse .nav-collapse .nav > li > a:focus,\n-  .navbar-inverse .nav-collapse .dropdown-menu a:hover,\n-  .navbar-inverse .nav-collapse .dropdown-menu a:focus {\n-    background-color: #111111;\n-  }\n-  .nav-collapse.in .btn-group {\n-    padding: 0;\n-    margin-top: 5px;\n-  }\n-  .nav-collapse .dropdown-menu {\n-    position: static;\n-    top: auto;\n-    left: auto;\n-    display: none;\n-    float: none;\n-    max-width: none;\n-    padding: 0;\n-    margin: 0 15px;\n-    background-color: transparent;\n-    border: none;\n-    -webkit-border-radius: 0;\n-       -moz-border-radius: 0;\n-            border-radius: 0;\n-    -webkit-box-shadow: none;\n-       -moz-box-shadow: none;\n-            box-shadow: none;\n-  }\n-  .nav-collapse .open > .dropdown-menu {\n-    display: block;\n-  }\n-  .nav-collapse .dropdown-menu:before,\n-  .nav-collapse .dropdown-menu:after {\n-    display: none;\n-  }\n-  .nav-collapse .dropdown-menu .divider {\n-    display: none;\n-  }\n-  .nav-collapse .nav > li > .dropdown-menu:before,\n-  .nav-collapse .nav > li > .dropdown-menu:after {\n-    display: none;\n-  }\n-  .nav-collapse .navbar-form,\n-  .nav-collapse .navbar-search {\n-    float: none;\n-    padding: 10px 15px;\n-    margin: 10px 0;\n-    border-top: 1px solid #f2f2f2;\n-    border-bottom: 1px solid #f2f2f2;\n-    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n-       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n-            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n-  }\n-  .navbar-inverse .nav-collapse .navbar-form,\n-  .navbar-inverse .nav-collapse .navbar-search {\n-    border-top-color: #111111;\n-    border-bottom-color: #111111;\n-  }\n-  .navbar .nav-collapse .nav.pull-right {\n-    float: none;\n-    margin-left: 0;\n-  }\n-  .nav-collapse,\n-  .nav-collapse.collapse {\n-    height: 0;\n-    overflow: hidden;\n-  }\n-  .navbar .btn-navbar {\n-    display: block;\n-  }\n-  .navbar-static .navbar-inner {\n-    padding-right: 10px;\n-    padding-left: 10px;\n-  }\n-}\n-\n-@media (min-width: 980px) {\n-  .nav-collapse.collapse {\n-    height: auto !important;\n-    overflow: visible !important;\n-  }\n-}\n'
b
diff -r 11708af40030 -r 967512924317 bin/css/bootstrap-table.css
--- a/bin/css/bootstrap-table.css Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,313 +0,0 @@
-/**
- * @author zhixin wen <wenzhixin2010@gmail.com>
- * version: 1.11.1
- * https://github.com/wenzhixin/bootstrap-table/
- */
-
-.bootstrap-table .table {
-    margin-bottom: 0 !important;
-    border-bottom: 1px solid #dddddd;
-    border-collapse: collapse !important;
-    border-radius: 1px;
-}
-
-.bootstrap-table .table:not(.table-condensed),
-.bootstrap-table .table:not(.table-condensed) > tbody > tr > th,
-.bootstrap-table .table:not(.table-condensed) > tfoot > tr > th,
-.bootstrap-table .table:not(.table-condensed) > thead > tr > td,
-.bootstrap-table .table:not(.table-condensed) > tbody > tr > td,
-.bootstrap-table .table:not(.table-condensed) > tfoot > tr > td {
-    padding: 8px;
-}
-
-.bootstrap-table .table.table-no-bordered > thead > tr > th,
-.bootstrap-table .table.table-no-bordered > tbody > tr > td {
-    border-right: 2px solid transparent;
-}
-
-.bootstrap-table .table.table-no-bordered > tbody > tr > td:last-child {
-    border-right: none;
-}
-
-.fixed-table-container {
-    position: relative;
-    clear: both;
-    border: 1px solid #dddddd;
-    border-radius: 4px;
-    -webkit-border-radius: 4px;
-    -moz-border-radius: 4px;
-}
-
-.fixed-table-container.table-no-bordered {
-    border: 1px solid transparent;
-}
-
-.fixed-table-footer,
-.fixed-table-header {
-    overflow: hidden;
-}
-
-.fixed-table-footer {
-    border-top: 1px solid #dddddd;
-}
-
-.fixed-table-body {
-    overflow-x: auto;
-    overflow-y: auto;
-    height: 100%;
-}
-
-.fixed-table-container table {
-    width: 100%;
-}
-
-.fixed-table-container thead th {
-    height: 0;
-    padding: 0;
-    margin: 0;
-    border-left: 1px solid #dddddd;
-}
-
-.fixed-table-container thead th:focus {
-    outline: 0 solid transparent;
-}
-
-.fixed-table-container thead th:first-child {
-    border-left: none;
-    border-top-left-radius: 4px;
-    -webkit-border-top-left-radius: 4px;
-    -moz-border-radius-topleft: 4px;
-}
-
-.fixed-table-container thead th .th-inner,
-.fixed-table-container tbody td .th-inner {
-    padding: 8px;
-    line-height: 24px;
-    vertical-align: top;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-}
-
-.fixed-table-container thead th .sortable {
-    cursor: pointer;
-    background-position: right;
-    background-repeat: no-repeat;
-    padding-right: 30px;
-}
-
-.fixed-table-container thead th .both {
-    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC');
-}
-
-.fixed-table-container thead th .asc {
-    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==');
-}
-
-.fixed-table-container thead th .desc {
-    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= ');
-}
-
-.fixed-table-container th.detail {
-    width: 30px;
-}
-
-.fixed-table-container tbody td {
-    border-left: 1px solid #dddddd;
-}
-
-.fixed-table-container tbody tr:first-child td {
-    border-top: none;
-}
-
-.fixed-table-container tbody td:first-child {
-    border-left: none;
-}
-
-/* the same color with .active */
-.fixed-table-container tbody .selected td {
-    background-color: #f5f5f5;
-}
-
-.fixed-table-container .bs-checkbox {
-    text-align: center;
-}
-
-.fixed-table-container .bs-checkbox .th-inner {
-    padding: 8px 0;
-}
-
-.fixed-table-container input[type="radio"],
-.fixed-table-container input[type="checkbox"] {
-    margin: 0 auto !important;
-}
-
-.fixed-table-container .no-records-found {
-    text-align: center;
-}
-
-.fixed-table-pagination div.pagination,
-.fixed-table-pagination .pagination-detail {
-    margin-top: 10px;
-    margin-bottom: 10px;
-}
-
-.fixed-table-pagination div.pagination .pagination {
-    margin: 0;
-}
-
-.fixed-table-pagination .pagination a {
-    padding: 6px 12px;
-    line-height: 1.428571429;
-}
-
-.fixed-table-pagination .pagination-info {
-    line-height: 34px;
-    margin-right: 5px;
-}
-
-.fixed-table-pagination .btn-group {
-    position: relative;
-    display: inline-block;
-    vertical-align: middle;
-}
-
-.fixed-table-pagination .dropup .dropdown-menu {
-    margin-bottom: 0;
-}
-
-.fixed-table-pagination .page-list {
-    display: inline-block;
-}
-
-.fixed-table-toolbar .columns-left {
-    margin-right: 5px;
-}
-
-.fixed-table-toolbar .columns-right {
-    margin-left: 5px;
-}
-
-.fixed-table-toolbar .columns label {
-    display: block;
-    padding: 3px 20px;
-    clear: both;
-    font-weight: normal;
-    line-height: 1.428571429;
-}
-
-.fixed-table-toolbar .bs-bars,
-.fixed-table-toolbar .search,
-.fixed-table-toolbar .columns {
-    position: relative;
-    margin-top: 10px;
-    margin-bottom: 10px;
-    line-height: 34px;
-}
-
-.fixed-table-pagination li.disabled a {
-    pointer-events: none;
-    cursor: default;
-}
-
-.fixed-table-loading {
-    display: none;
-    position: absolute;
-    top: 42px;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    z-index: 99;
-    background-color: #fff;
-    text-align: center;
-}
-
-.fixed-table-body .card-view .title {
-    font-weight: bold;
-    display: inline-block;
-    min-width: 30%;
-    text-align: left !important;
-}
-
-/* support bootstrap 2 */
-.fixed-table-body thead th .th-inner {
-    box-sizing: border-box;
-}
-
-.table th, .table td {
-    vertical-align: middle;
-    box-sizing: border-box;
-}
-
-.fixed-table-toolbar .dropdown-menu {
-    text-align: left;
-    max-height: 300px;
-    overflow: auto;
-}
-
-.fixed-table-toolbar .btn-group > .btn-group {
-    display: inline-block;
-    margin-left: -1px !important;
-}
-
-.fixed-table-toolbar .btn-group > .btn-group > .btn {
-    border-radius: 0;
-}
-
-.fixed-table-toolbar .btn-group > .btn-group:first-child > .btn {
-    border-top-left-radius: 4px;
-    border-bottom-left-radius: 4px;
-}
-
-.fixed-table-toolbar .btn-group > .btn-group:last-child > .btn {
-    border-top-right-radius: 4px;
-    border-bottom-right-radius: 4px;
-}
-
-.bootstrap-table .table > thead > tr > th {
-    vertical-align: bottom;
-    border-bottom: 1px solid #ddd;
-}
-
-/* support bootstrap 3 */
-.bootstrap-table .table thead > tr > th {
-    padding: 0;
-    margin: 0;
-}
-
-.bootstrap-table .fixed-table-footer tbody > tr > td {
-    padding: 0 !important;
-}
-
-.bootstrap-table .fixed-table-footer .table {
-    border-bottom: none;
-    border-radius: 0;
-    padding: 0 !important;
-}
-
-.bootstrap-table .pull-right .dropdown-menu {
-    right: 0;
-    left: auto;
-}
-
-/* calculate scrollbar width */
-p.fixed-table-scroll-inner {
-    width: 100%;
-    height: 200px;
-}
-
-div.fixed-table-scroll-outer {
-    top: 0;
-    left: 0;
-    visibility: hidden;
-    width: 200px;
-    height: 150px;
-    overflow: hidden;
-}
-
-/* for get correct heights  */
-.fixed-table-toolbar:after, .fixed-table-pagination:after {
-    content: "";
-    display: block;
-    clear: both;
-}
b
diff -r 11708af40030 -r 967512924317 bin/css/bootstrap.css
--- a/bin/css/bootstrap.css Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,6167 +0,0 @@\n-/*!\n- * Bootstrap v2.3.2\n- *\n- * Copyright 2012 Twitter, Inc\n- * Licensed under the Apache License v2.0\n- * http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Designed and built with all the love in the world @twitter by @mdo and @fat.\n- */\n-\n-.clearfix {\n-  *zoom: 1;\n-}\n-\n-.clearfix:before,\n-.clearfix:after {\n-  display: table;\n-  line-height: 0;\n-  content: "";\n-}\n-\n-.clearfix:after {\n-  clear: both;\n-}\n-\n-.hide-text {\n-  font: 0/0 a;\n-  color: transparent;\n-  text-shadow: none;\n-  background-color: transparent;\n-  border: 0;\n-}\n-\n-.input-block-level {\n-  display: block;\n-  width: 100%;\n-  min-height: 30px;\n-  -webkit-box-sizing: border-box;\n-     -moz-box-sizing: border-box;\n-          box-sizing: border-box;\n-}\n-\n-article,\n-aside,\n-details,\n-figcaption,\n-figure,\n-footer,\n-header,\n-hgroup,\n-nav,\n-section {\n-  display: block;\n-}\n-\n-audio,\n-canvas,\n-video {\n-  display: inline-block;\n-  *display: inline;\n-  *zoom: 1;\n-}\n-\n-audio:not([controls]) {\n-  display: none;\n-}\n-\n-html {\n-  font-size: 100%;\n-  -webkit-text-size-adjust: 100%;\n-      -ms-text-size-adjust: 100%;\n-}\n-\n-a:focus {\n-  outline: thin dotted #333;\n-  outline: 5px auto -webkit-focus-ring-color;\n-  outline-offset: -2px;\n-}\n-\n-a:hover,\n-a:active {\n-  outline: 0;\n-}\n-\n-sub,\n-sup {\n-  position: relative;\n-  font-size: 75%;\n-  line-height: 0;\n-  vertical-align: baseline;\n-}\n-\n-sup {\n-  top: -0.5em;\n-}\n-\n-sub {\n-  bottom: -0.25em;\n-}\n-\n-img {\n-  width: auto\\9;\n-  height: auto;\n-  max-width: 100%;\n-  vertical-align: middle;\n-  border: 0;\n-  -ms-interpolation-mode: bicubic;\n-}\n-\n-#map_canvas img,\n-.google-maps img {\n-  max-width: none;\n-}\n-\n-button,\n-input,\n-select,\n-textarea {\n-  margin: 0;\n-  font-size: 100%;\n-  vertical-align: middle;\n-}\n-\n-button,\n-input {\n-  *overflow: visible;\n-  line-height: normal;\n-}\n-\n-button::-moz-focus-inner,\n-input::-moz-focus-inner {\n-  padding: 0;\n-  border: 0;\n-}\n-\n-button,\n-html input[type="button"],\n-input[type="reset"],\n-input[type="submit"] {\n-  cursor: pointer;\n-  -webkit-appearance: button;\n-}\n-\n-label,\n-select,\n-button,\n-input[type="button"],\n-input[type="reset"],\n-input[type="submit"],\n-input[type="radio"],\n-input[type="checkbox"] {\n-  cursor: pointer;\n-}\n-\n-input[type="search"] {\n-  -webkit-box-sizing: content-box;\n-     -moz-box-sizing: content-box;\n-          box-sizing: content-box;\n-  -webkit-appearance: textfield;\n-}\n-\n-input[type="search"]::-webkit-search-decoration,\n-input[type="search"]::-webkit-search-cancel-button {\n-  -webkit-appearance: none;\n-}\n-\n-textarea {\n-  overflow: auto;\n-  vertical-align: top;\n-}\n-\n-@media print {\n-  * {\n-    color: #000 !important;\n-    text-shadow: none !important;\n-    background: transparent !important;\n-    box-shadow: none !important;\n-  }\n-  a,\n-  a:visited {\n-    text-decoration: underline;\n-  }\n-  a[href]:after {\n-    content: " (" attr(href) ")";\n-  }\n-  abbr[title]:after {\n-    content: " (" attr(title) ")";\n-  }\n-  .ir a:after,\n-  a[href^="javascript:"]:after,\n-  a[href^="#"]:after {\n-    content: "";\n-  }\n-  pre,\n-  blockquote {\n-    border: 1px solid #999;\n-    page-break-inside: avoid;\n-  }\n-  thead {\n-    display: table-header-group;\n-  }\n-  tr,\n-  img {\n-    page-break-inside: avoid;\n-  }\n-  img {\n-    max-width: 100% !important;\n-  }\n-  @page  {\n-    margin: 0.5cm;\n-  }\n-  p,\n-  h2,\n-  h3 {\n-    orphans: 3;\n-    widows: 3;\n-  }\n-  h2,\n-  h3 {\n-    page-break-after: avoid;\n-  }\n-}\n-\n-body {\n-  margin: 0;\n-  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;\n-  font-size: 14px;\n-  line-height: 20px;\n-  color: #333333;\n-  background-color: #ffffff;\n-}\n-\n-a {\n-  color: #0088cc;\n-  text-decoration: none;\n-}\n-\n-a:hover,\n-a:focus {\n-  color: #005580;\n-  text-decoration: underline;\n-}\n-\n-.img-rounded {\n-  -webkit-border-radius: 6px;\n-     -moz-border-radius: 6px;\n-          border-radius: 6px;\n-}\n-\n-.img-polaroid {\n-  padding: 4px;\n-  background-color: #fff;\n-  border: 1px solid #ccc;\n-  border: 1px solid rgba(0, 0, 0, 0.2);\n-  -webkit-box-shadow: 0 1px 3'..b', 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n-}\n-\n-.accordion {\n-  margin-bottom: 20px;\n-}\n-\n-.accordion-group {\n-  margin-bottom: 2px;\n-  border: 1px solid #e5e5e5;\n-  -webkit-border-radius: 4px;\n-     -moz-border-radius: 4px;\n-          border-radius: 4px;\n-}\n-\n-.accordion-heading {\n-  border-bottom: 0;\n-}\n-\n-.accordion-heading .accordion-toggle {\n-  display: block;\n-  padding: 8px 15px;\n-}\n-\n-.accordion-toggle {\n-  cursor: pointer;\n-}\n-\n-.accordion-inner {\n-  padding: 9px 15px;\n-  border-top: 1px solid #e5e5e5;\n-}\n-\n-.carousel {\n-  position: relative;\n-  margin-bottom: 20px;\n-  line-height: 1;\n-}\n-\n-.carousel-inner {\n-  position: relative;\n-  width: 100%;\n-  overflow: hidden;\n-}\n-\n-.carousel-inner > .item {\n-  position: relative;\n-  display: none;\n-  -webkit-transition: 0.6s ease-in-out left;\n-     -moz-transition: 0.6s ease-in-out left;\n-       -o-transition: 0.6s ease-in-out left;\n-          transition: 0.6s ease-in-out left;\n-}\n-\n-.carousel-inner > .item > img,\n-.carousel-inner > .item > a > img {\n-  display: block;\n-  line-height: 1;\n-}\n-\n-.carousel-inner > .active,\n-.carousel-inner > .next,\n-.carousel-inner > .prev {\n-  display: block;\n-}\n-\n-.carousel-inner > .active {\n-  left: 0;\n-}\n-\n-.carousel-inner > .next,\n-.carousel-inner > .prev {\n-  position: absolute;\n-  top: 0;\n-  width: 100%;\n-}\n-\n-.carousel-inner > .next {\n-  left: 100%;\n-}\n-\n-.carousel-inner > .prev {\n-  left: -100%;\n-}\n-\n-.carousel-inner > .next.left,\n-.carousel-inner > .prev.right {\n-  left: 0;\n-}\n-\n-.carousel-inner > .active.left {\n-  left: -100%;\n-}\n-\n-.carousel-inner > .active.right {\n-  left: 100%;\n-}\n-\n-.carousel-control {\n-  position: absolute;\n-  top: 40%;\n-  left: 15px;\n-  width: 40px;\n-  height: 40px;\n-  margin-top: -20px;\n-  font-size: 60px;\n-  font-weight: 100;\n-  line-height: 30px;\n-  color: #ffffff;\n-  text-align: center;\n-  background: #222222;\n-  border: 3px solid #ffffff;\n-  -webkit-border-radius: 23px;\n-     -moz-border-radius: 23px;\n-          border-radius: 23px;\n-  opacity: 0.5;\n-  filter: alpha(opacity=50);\n-}\n-\n-.carousel-control.right {\n-  right: 15px;\n-  left: auto;\n-}\n-\n-.carousel-control:hover,\n-.carousel-control:focus {\n-  color: #ffffff;\n-  text-decoration: none;\n-  opacity: 0.9;\n-  filter: alpha(opacity=90);\n-}\n-\n-.carousel-indicators {\n-  position: absolute;\n-  top: 15px;\n-  right: 15px;\n-  z-index: 5;\n-  margin: 0;\n-  list-style: none;\n-}\n-\n-.carousel-indicators li {\n-  display: block;\n-  float: left;\n-  width: 10px;\n-  height: 10px;\n-  margin-left: 5px;\n-  text-indent: -999px;\n-  background-color: #ccc;\n-  background-color: rgba(255, 255, 255, 0.25);\n-  border-radius: 5px;\n-}\n-\n-.carousel-indicators .active {\n-  background-color: #fff;\n-}\n-\n-.carousel-caption {\n-  position: absolute;\n-  right: 0;\n-  bottom: 0;\n-  left: 0;\n-  padding: 15px;\n-  background: #333333;\n-  background: rgba(0, 0, 0, 0.75);\n-}\n-\n-.carousel-caption h4,\n-.carousel-caption p {\n-  line-height: 20px;\n-  color: #ffffff;\n-}\n-\n-.carousel-caption h4 {\n-  margin: 0 0 5px;\n-}\n-\n-.carousel-caption p {\n-  margin-bottom: 0;\n-}\n-\n-.hero-unit {\n-  padding: 60px;\n-  margin-bottom: 30px;\n-  font-size: 18px;\n-  font-weight: 200;\n-  line-height: 30px;\n-  color: inherit;\n-  background-color: #eeeeee;\n-  -webkit-border-radius: 6px;\n-     -moz-border-radius: 6px;\n-          border-radius: 6px;\n-}\n-\n-.hero-unit h1 {\n-  margin-bottom: 0;\n-  font-size: 60px;\n-  line-height: 1;\n-  letter-spacing: -1px;\n-  color: inherit;\n-}\n-\n-.hero-unit li {\n-  line-height: 30px;\n-}\n-\n-.pull-right {\n-  float: right;\n-}\n-\n-.pull-left {\n-  float: left;\n-}\n-\n-.hide {\n-  display: none;\n-}\n-\n-.show {\n-  display: block;\n-}\n-\n-.invisible {\n-  visibility: hidden;\n-}\n-\n-.affix {\n-  position: fixed;\n-}\n'
b
diff -r 11708af40030 -r 967512924317 bin/html.pm
--- a/bin/html.pm Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,910 +0,0 @@\n-package html;\n-\n-use strict;\n-use warnings;\n-use File::Basename;\n-\n-use Exporter;\n-our @ISA = qw( Exporter );\n-our @EXPORT_OK = qw( &main_page &details_pages &menu_page &ppp_page );\n-\n-sub main_page\n-{\n-  my ( $dir, $file, $list_mainTabP, $current, $ma, $ma_uni, $dir_root ) = @_;\n-  my ( $futHashP, $uniqueTabP, $randTabP, $pngTabP ) = get_genome ( $dir, $dir_root );\n-\n-  open my $h, \'>\', $file || die "cannot create $file $!\\n";\n-  header ( $h );\n-  navbar ( $h, $list_mainTabP, $current );\n-  print $h "<div class=\\"container\\"><p><a class=\\"btn\\" href=\\"$current-sub.html\\">View details &raquo;</a></p></div>\\n";\n-  futurette( $h, $current, $pngTabP, $futHashP );\n-  print  $h "<div class=\\"container\\"><h2>mappers #: $ma</h2><h2>unique mappers #: $ma_uni</h2> </div>\\n";\n-  carousel2( $h, $uniqueTabP, $randTabP, $dir_root );\n-  footer($h);\n-  close $h;\n-}\n-\n-sub menu_page\n-{\n-  my ( $dir, $file, $list_mainTabP, $current, $min, $max, $simin, $simax, $pimin, $pimax, $dir_root ) = @_;\n-  my $html_ref = $1 if $dir =~ /$dir_root(.*)/;\n-  open my $h, \'>\', $file || die "cannot create $file $!\\n";\n-  header($h);\n-  navbar ( $h, $list_mainTabP, $current );\n-  span( $h, $current, $min, $max, $simin, $simax, $pimin, $pimax );\n-  print $h "  <div class=\\"container\\"> <div class=\\"row text-center\\">  <img  src=\\"$html_ref/pie_chart.png\\"/><br />\\n";\n-  print $h "  <A HREF=\\"$html_ref/repartition.txt\\">text file</A><br/>\\n </div></div>";\n-  footer($h);\n-  close $h;\n-}\n-\n-sub details_pages\n-{\n-  my ( $dir_details, $prefix, $list_mainTabP, $current, $misTE, $dir_root, $ppp ) = @_;\n-  my ($Hex, $HTE, $HG, $NonUniTE, $NonUniG, $UniG ) = get_subgroups( $dir_details, $current, $misTE, $dir_root );\n-\n-  my $html_ref = $1.\'-PPP.html\' if $prefix =~ /$dir_root(.*)/;\n-  open my $h, \'>\',  $prefix.\'-TEs.html\' || die "cannot create  $prefix-TEs.html $!\\n";\n-  header($h);\n-  navbar ( $h, $list_mainTabP, $current );\n-  if ( $prefix =~ /piRNAs$/ && $ppp eq \'true\' )\n-  {\n-    print $h " <div class=\\"container\\">";\n-    print $h " <p><a class=\\"btn\\" href=\\"$html_ref\\">Ping Pong Partners</a></p>\\n";\n-    print $h "</div>";\n-  }\n-  fut($h,\'Transposable elements\',$HTE);\n-  carousel($h,$NonUniTE,$dir_root);\n-  footer($h);\n-  close $h;\n-\n-  open $h, \'>\',  $prefix.\'-genome.html\' || die "cannot create  $prefix-genome.html $!\\n";\n-  header($h);\n-  navbar ( $h, $list_mainTabP, $current );\n-  fut($h,\'Genome\',$HG);\n-  carousel2($h,$UniG, $NonUniG,$dir_root);\n-  footer($h);\n-  close $h;\n-\n-  open  $h, \'>\',  $prefix.\'-transcripts.html\' || die "cannot create  $prefix-transcripts.html $!\\n";\n-  header($h);\n-  navbar ( $h, $list_mainTabP, $current );\n-  fut($h,\'transcripts\',$Hex);\n-  footer($h);\n-  close $h;\n-}\n-\n-sub ppp_page\n-{\n-  my ( $dir, $file, $list_mainTabP, $current, $ppp, $dir_root ) = @_;\n-\n-  my $ppp_file = $ppp.\'ppp.txt\';\n-  open my $h, \'>\', $file || die "cannot create $file $!\\n";\n-  header($h);\n-  navbar ( $h, $list_mainTabP, $current );\n-  print $h \'<div class="container"> <table class="wb-tables table table-striped table-hover">\'."\\n";\n-  print $h \'<thead>\n-  <tr>\n-    <th data-sortable="true">ID</th>\n-    <th data-sortable="true">overlap sum</th>\n-    <th data-sortable="true">ten overlap sum</th>\n-    <th data-sortable="true">mean</th>\n-    <th data-sortable="true">standard deviation</th>\n-  \t<th data-sortable="true">z-score</th>\n-  \t<th data-sortable="true">p-value</th>\n-\t</tr>\n-  </thead>\n-  <tbody>\';\n-\n-  open my $f, \'<\', $ppp_file || die "cannot open $ppp_file  $!\\n";\n-  while ( <$f> )\n-  {\n-    chomp;\n-    print $h \'<tr>\';\n-    my ( $id, $sum, $ten, $mean, $sd, $zscore, $prob) = split /\\t/, $_;\n-    if( -d "$ppp/$id" )\n-    {\n-      my $sub_html = $ppp.$id.\'.html\';\n-      my $sub_html_ref = $1.$id if $ppp =~ /$dir_root(.*)/;\n-      print $h "<td> <a href=\\"$sub_html_ref.html\\">$id</a> </td>";\n-\n-      open my $sub, \'>\', $sub_html || die "cannot create $sub_html\\n";\n-      {\n-        header($sub);\n-        print $sub "\n-\t\t\t\t\t<div align=\\'..b'\n-  my ($dir, $name) = @_;\n-  my (@out,@group);\n-  my $group = "\'$dir\'".\'/\'."\'$name\'".\'-subgroups-bonafide_reads-TE-*distribution-*.png\';\n-  @group = glob $group;\n-  foreach (my $g =0; $g <= $#group; $g++)\n-  {\n-    if ($group[$g] =~ /.*($name-subgroups-bonafide_reads-TE-.*distribution-.*\\.png)/ )\n-    {\n-      my $tmp = $1;\n-      push @out, $1;\n-    }\n-  }\n-  return (\\@out);\n-}\n-\n-sub get_PPP\n-{\n-  my ($dir,$name) = @_;\n-  my (%distri,@group);\n-  my $group = "\'$dir\'".\'/\'."\'$name\'".\'-subgroups-bonafide_reads-TE-PPPartners-*\';\n-  @group = glob $group;\n-\n-  foreach (my $g =0; $g <= $#group; $g++)\n-  {\n-    if ($group[$g] =~ /.*($name-subgroups-bonafide_reads-TE-PPPartners-.*)/ )\n-    {\n-      my $tmp = $1;\n-      if ($tmp =~ /PPPartners-(.*?)-sens\\.txt$/)\n-      {\n-        $distri{$1} = [\'\',\'\',\'\',\'\',\'\',\'\'] unless exists $distri{$1};\n-        $distri{$1}->[0] = $tmp;\n-      }\n-      elsif ($tmp =~ /PPPartners-(.*?)-antisens\\.txt$/)\n-      {\n-        $distri{$1} = [\'\',\'\',\'\',\'\',\'\',\'\'] unless exists $distri{$1};\n-        $distri{$1}->[1] = $tmp;\n-      }\n-      elsif ($tmp =~ /PPPartners-(.*?)-sensPPP\\.txt$/)\n-      {\n-        $distri{$1} = [\'\',\'\',\'\',\'\',\'\',\'\'] unless exists $distri{$1};\n-        $distri{$1}->[2] = $tmp;\n-      }\n-      elsif ($tmp =~ /PPPartners-(.*?)-antisensPPP\\.txt$/)\n-      {\n-        $distri{$1} = [\'\',\'\',\'\',\'\',\'\',\'\'] unless exists $distri{$1};\n-        $distri{$1}->[3] = $tmp;\n-      }\n-      elsif ($tmp =~ /PPPartners-(.*?)-overlap_size\\.txt$/)\n-      {\n-        $distri{$1} = [\'\',\'\',\'\',\'\',\'\',\'\'] unless exists $distri{$1};\n-        $distri{$1}->[4] = $tmp;\n-      }\n-      elsif ($tmp =~ /PPPartners-(.*?)-histogram\\.png$/)\n-      {\n-        $distri{$1} = [\'\',\'\',\'\',\'\',\'\',\'\'] unless exists $distri{$1};\n-        $distri{$1}->[5] = $tmp;\n-      }\n-    }\n-  }\n-  return \\%distri;\n-}\n-\n-sub PPPrint\n-{\n-  my ($h, $hash) = @_;\n-  my $cmp = 0;\n-\n-  print $h "<div class=\\"container\\">\\n";\n-  print $h "<div class=\\"row text-center\\">";\n-  while ( my ($k,$v) = each %{$hash} )\n-  {\n-    print $h "</div><div class=\\"row text-center\\">" if $cmp != 0 && $cmp % 2 == 0;\n-    print $h "\n-    \n-    <div class=\\"span6\\">\n-    <h2>$k</h2>\n-    <p class=\\"featurette-p\\"> <img src=\\"$v->[5]\\"/></p>\n-    <p class=\\"featurette-p\\"><a href=\\"$v->[4]\\">ping pong signature</a></p>\n-    <p class=\\"featurette-p\\"><a href=\\"$v->[2]\\">sense reads with PPP</a></p>\n-    <p class=\\"featurette-p\\"><a href=\\"$v->[3]\\">reverse reads  with PPP</a></p>\n-    <p class=\\"featurette-p\\"><a href=\\"$v->[0]\\">sense reads without PPP</a></p>\n-    <p class=\\"featurette-p\\"><a href=\\"$v->[1]\\">reverse reads without PPP</a></p>\n-    </div>\n-    ";\n-    $cmp++;\n-  }\n-\n-  print $h "</div></div>";\n-}\n-\n-sub printDistri\n-{\n-  my ($h, $tab) = @_;\n-  my ($txt, $name);\n-  my $cmp = 0;\n-  print $h "<div class=\\"container\\">\\n";\n-  print $h "<div class=\\"row text-center\\">";\n-  foreach my $k (@{$tab})\n-  {\n-    if ($k =~ /(.*)-(.*)\\.png$/)\n-    {\n-      $txt = $1.\'-\'.$2.\'.txt\';\n-      $name = $2;\n-    }\n-    print $h "</div><div class=\\"row text-center\\">" if $cmp != 0 && $cmp % 2 == 0;\n-    print $h "\n-    \n-    <div class=\\"span6\\">\n-    <h2>$name</h2>\n-    <p> <img src=\\"$k\\"/></p>\n-    <p class=\\"featurette-p\\"><a href=\\"$txt\\">text file</a></p>\n-    </div>\n-    ";\n-    $cmp++;\n-  }\n-\n-  print $h "</div></div>";\n-}\n-\n-sub mapnum\n-{\n-  my $dupmapnum = shift;\n-  my $dupnum_genome = shift;\n-  open (my $dupTE, $dupmapnum) || die "cannot open ".$dupmapnum."\\n";\n-  my %dupnum_TE = ();\n-  my $header = <$dupTE>;\n-  while (<$dupTE>)\n-  {\n-    chomp $_;\n-    my @dupline = split /\\t/, $_;\n-    $dupnum_TE{$dupline[0]} = $dupline[2];\n-  }\n-  close $dupTE;\n-  open (my $du_TE, \'>\'.$dupmapnum) || die "cannot open to write ".$dupmapnum."\\n";\n-  print $du_TE "sequence\\tduplicate\\tgenome map num\\tmap num\\n";\n-  while (my ($k, $v) = each %dupnum_TE )\n-  {\n-    my $hashRef = ${$dupnum_genome}{$k};\n-    print $du_TE "$k\\t$hashRef->[0]\\t$hashRef->[1]\\t$v\\n";\n-  }\n-  close $du_TE;\n-}\n-\n-1;\n'
b
diff -r 11708af40030 -r 967512924317 bin/js/bootstrap-table.js
--- a/bin/js/bootstrap-table.js Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b"@@ -1,3094 +0,0 @@\n-/**\n- * @author zhixin wen <wenzhixin2010@gmail.com>\n- * version: 1.11.1\n- * https://github.com/wenzhixin/bootstrap-table/\n- */\n-\n-(function ($) {\n-    'use strict';\n-\n-    // TOOLS DEFINITION\n-    // ======================\n-\n-    var cachedWidth = null;\n-\n-    // it only does '%s', and return '' when arguments are undefined\n-    var sprintf = function (str) {\n-        var args = arguments,\n-            flag = true,\n-            i = 1;\n-\n-        str = str.replace(/%s/g, function () {\n-            var arg = args[i++];\n-\n-            if (typeof arg === 'undefined') {\n-                flag = false;\n-                return '';\n-            }\n-            return arg;\n-        });\n-        return flag ? str : '';\n-    };\n-\n-    var getPropertyFromOther = function (list, from, to, value) {\n-        var result = '';\n-        $.each(list, function (i, item) {\n-            if (item[from] === value) {\n-                result = item[to];\n-                return false;\n-            }\n-            return true;\n-        });\n-        return result;\n-    };\n-\n-    var getFieldIndex = function (columns, field) {\n-        var index = -1;\n-\n-        $.each(columns, function (i, column) {\n-            if (column.field === field) {\n-                index = i;\n-                return false;\n-            }\n-            return true;\n-        });\n-        return index;\n-    };\n-\n-    // http://jsfiddle.net/wenyi/47nz7ez9/3/\n-    var setFieldIndex = function (columns) {\n-        var i, j, k,\n-            totalCol = 0,\n-            flag = [];\n-\n-        for (i = 0; i < columns[0].length; i++) {\n-            totalCol += columns[0][i].colspan || 1;\n-        }\n-\n-        for (i = 0; i < columns.length; i++) {\n-            flag[i] = [];\n-            for (j = 0; j < totalCol; j++) {\n-                flag[i][j] = false;\n-            }\n-        }\n-\n-        for (i = 0; i < columns.length; i++) {\n-            for (j = 0; j < columns[i].length; j++) {\n-                var r = columns[i][j],\n-                    rowspan = r.rowspan || 1,\n-                    colspan = r.colspan || 1,\n-                    index = $.inArray(false, flag[i]);\n-\n-                if (colspan === 1) {\n-                    r.fieldIndex = index;\n-                    // when field is undefined, use index instead\n-                    if (typeof r.field === 'undefined') {\n-                        r.field = index;\n-                    }\n-                }\n-\n-                for (k = 0; k < rowspan; k++) {\n-                    flag[i + k][index] = true;\n-                }\n-                for (k = 0; k < colspan; k++) {\n-                    flag[i][index + k] = true;\n-                }\n-            }\n-        }\n-    };\n-\n-    var getScrollBarWidth = function () {\n-        if (cachedWidth === null) {\n-            var inner = $('<p/>').addClass('fixed-table-scroll-inner'),\n-                outer = $('<div/>').addClass('fixed-table-scroll-outer'),\n-                w1, w2;\n-\n-            outer.append(inner);\n-            $('body').append(outer);\n-\n-            w1 = inner[0].offsetWidth;\n-            outer.css('overflow', 'scroll');\n-            w2 = inner[0].offsetWidth;\n-\n-            if (w1 === w2) {\n-                w2 = outer[0].clientWidth;\n-            }\n-\n-            outer.remove();\n-            cachedWidth = w1 - w2;\n-        }\n-        return cachedWidth;\n-    };\n-\n-    var calculateObjectValue = function (self, name, args, defaultValue) {\n-        var func = name;\n-\n-        if (typeof name === 'string') {\n-            // support obj.func1.func2\n-            var names = name.split('.');\n-\n-            if (names.length > 1) {\n-                func = window;\n-                $.each(names, function (i, f) {\n-                    func = func[f];\n-                });\n-            } else {\n-                func = window[name];\n-            }\n-        }\n-        if (typeof func === 'object') {\n-            return func;\n-        }\n-        if (typeof func === 'function') {\n-"..b' i < trs.length; i++) {\n-                this.expandRow_(true, $(trs[i]).data("index"));\n-            }\n-        }\n-    };\n-\n-    BootstrapTable.prototype.collapseAllRows = function (isSubTable) {\n-        if (isSubTable) {\n-            this.expandRow_(false, 0);\n-        } else {\n-            var trs = this.$body.children();\n-            for (var i = 0; i < trs.length; i++) {\n-                this.expandRow_(false, $(trs[i]).data("index"));\n-            }\n-        }\n-    };\n-\n-    BootstrapTable.prototype.updateFormatText = function (name, text) {\n-        if (this.options[sprintf(\'format%s\', name)]) {\n-            if (typeof text === \'string\') {\n-                this.options[sprintf(\'format%s\', name)] = function () {\n-                    return text;\n-                };\n-            } else if (typeof text === \'function\') {\n-                this.options[sprintf(\'format%s\', name)] = text;\n-            }\n-        }\n-        this.initToolbar();\n-        this.initPagination();\n-        this.initBody();\n-    };\n-\n-    // BOOTSTRAP TABLE PLUGIN DEFINITION\n-    // =======================\n-\n-    var allowedMethods = [\n-        \'getOptions\',\n-        \'getSelections\', \'getAllSelections\', \'getData\',\n-        \'load\', \'append\', \'prepend\', \'remove\', \'removeAll\',\n-        \'insertRow\', \'updateRow\', \'updateCell\', \'updateByUniqueId\', \'removeByUniqueId\',\n-        \'getRowByUniqueId\', \'showRow\', \'hideRow\', \'getHiddenRows\',\n-        \'mergeCells\',\n-        \'checkAll\', \'uncheckAll\', \'checkInvert\',\n-        \'check\', \'uncheck\',\n-        \'checkBy\', \'uncheckBy\',\n-        \'refresh\',\n-        \'resetView\',\n-        \'resetWidth\',\n-        \'destroy\',\n-        \'showLoading\', \'hideLoading\',\n-        \'showColumn\', \'hideColumn\', \'getHiddenColumns\', \'getVisibleColumns\',\n-        \'showAllColumns\', \'hideAllColumns\',\n-        \'filterBy\',\n-        \'scrollTo\',\n-        \'getScrollPosition\',\n-        \'selectPage\', \'prevPage\', \'nextPage\',\n-        \'togglePagination\',\n-        \'toggleView\',\n-        \'refreshOptions\',\n-        \'resetSearch\',\n-        \'expandRow\', \'collapseRow\', \'expandAllRows\', \'collapseAllRows\',\n-        \'updateFormatText\'\n-    ];\n-\n-    $.fn.bootstrapTable = function (option) {\n-        var value,\n-            args = Array.prototype.slice.call(arguments, 1);\n-\n-        this.each(function () {\n-            var $this = $(this),\n-                data = $this.data(\'bootstrap.table\'),\n-                options = $.extend({}, BootstrapTable.DEFAULTS, $this.data(),\n-                    typeof option === \'object\' && option);\n-\n-            if (typeof option === \'string\') {\n-                if ($.inArray(option, allowedMethods) < 0) {\n-                    throw new Error("Unknown method: " + option);\n-                }\n-\n-                if (!data) {\n-                    return;\n-                }\n-\n-                value = data[option].apply(data, args);\n-\n-                if (option === \'destroy\') {\n-                    $this.removeData(\'bootstrap.table\');\n-                }\n-            }\n-\n-            if (!data) {\n-                $this.data(\'bootstrap.table\', (data = new BootstrapTable(this, options)));\n-            }\n-        });\n-\n-        return typeof value === \'undefined\' ? this : value;\n-    };\n-\n-    $.fn.bootstrapTable.Constructor = BootstrapTable;\n-    $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS;\n-    $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS;\n-    $.fn.bootstrapTable.locales = BootstrapTable.LOCALES;\n-    $.fn.bootstrapTable.methods = allowedMethods;\n-    $.fn.bootstrapTable.utils = {\n-        sprintf: sprintf,\n-        getFieldIndex: getFieldIndex,\n-        compareObjects: compareObjects,\n-        calculateObjectValue: calculateObjectValue,\n-        getItemField: getItemField,\n-        objectKeys: objectKeys,\n-        isIEBrowser: isIEBrowser\n-    };\n-\n-    // BOOTSTRAP TABLE INIT\n-    // =======================\n-\n-    $(function () {\n-        $(\'[data-toggle="table"]\').bootstrapTable();\n-    });\n-})(jQuery);\n'
b
diff -r 11708af40030 -r 967512924317 bin/js/bootstrap.min.js
--- a/bin/js/bootstrap.min.js Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,6 +0,0 @@\n-/**\n-* Bootstrap.js v2.3.2 by @fat & @mdo\n-* Copyright 2013 Twitter, Inc.\n-* http://www.apache.org/licenses/LICENSE-2.0.txt\n-*/\n-!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t=\'[data-dismiss="alert"]\',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest(\'[data-toggle="buttons-radio"]\');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicat'..b',next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:\'<ul class="typeahead dropdown-menu"></ul>\',item:\'<li><a href="#"></a></li>\',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",\'[data-provide="typeahead"]\',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e(\'[data-spy="affix"]\').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);\n\\ No newline at end of file\n'
b
diff -r 11708af40030 -r 967512924317 bin/js/filter.js
--- a/bin/js/filter.js Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,20 +0,0 @@
-function search(input) {
-  // Declare variables
-  var elt, filter, uls, li, a, i;
-  elt = input.parentElement;
-  filter = input.value.toUpperCase();
-  uls = elt.getElementsByClassName('thumbs');
-
-  // Loop through all list items, and hide those who don't match the search query
-  for (j = 0; j < uls.length; j++) {
-    li = uls[j].getElementsByTagName('li');
-    for (i = 0; i < li.length; i++) {
-      a = li[i].getElementsByTagName("a")[0];
-      if (a.innerHTML.toUpperCase().indexOf(filter) > -1) {
-        li[i].style.display = "";
-      } else {
-        li[i].style.display = "none";
-      }
-    }
-  }
-}
b
diff -r 11708af40030 -r 967512924317 bin/js/jquery.galleriffic.js
--- a/bin/js/jquery.galleriffic.js Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b"@@ -1,979 +0,0 @@\n-/**\r\n- * jQuery Galleriffic plugin\r\n- *\r\n- * Copyright (c) 2008 Trent Foley (http://trentacular.com)\r\n- * Licensed under the MIT License:\r\n- *   http://www.opensource.org/licenses/mit-license.php\r\n- *\r\n- * Much thanks to primary contributer Ponticlaro (http://www.ponticlaro.com)\r\n- */\r\n-;(function($) {\r\n-\t// Globally keep track of all images by their unique hash.  Each item is an image data object.\r\n-\tvar allImages = {};\r\n-\tvar imageCounter = 0;\r\n-\n-\t// Galleriffic static class\r\n-\t$.galleriffic = {\n-\t\tversion: '2.0.1',\n-\n-\t\t// Strips invalid characters and any leading # characters\n-\t\tnormalizeHash: function(hash) {\r\n-\t\t\treturn hash.replace(/^.*#/, '').replace(/\\?.*$/, '');\n-\t\t},\n-\n-\t\tgetImage: function(hash) {\n-\t\t\tif (!hash)\n-\t\t\t\treturn undefined;\n-\n-\t\t\thash = $.galleriffic.normalizeHash(hash);\r\n-\t\t\treturn allImages[hash];\n-\t\t},\n-\r\n-\t\t// Global function that looks up an image by its hash and displays the image.\n-\t\t// Returns false when an image is not found for the specified hash.\n-\t\t// @param {String} hash This is the unique hash value assigned to an image.\n-\t\tgotoImage: function(hash) {\r\n-\t\t\tvar imageData = $.galleriffic.getImage(hash);\r\n-\t\t\tif (!imageData)\n-\t\t\t\treturn false;\r\n-\n-\t\t\tvar gallery = imageData.gallery;\n-\t\t\tgallery.gotoImage(imageData);\n-\t\t\t\n-\t\t\treturn true;\r\n-\t\t},\n-\n-\t\t// Removes an image from its respective gallery by its hash.\n-\t\t// Returns false when an image is not found for the specified hash or the\n-\t\t// specified owner gallery does match the located images gallery.\n-\t\t// @param {String} hash This is the unique hash value assigned to an image.\n-\t\t// @param {Object} ownerGallery (Optional) When supplied, the located images\n-\t\t// gallery is verified to be the same as the specified owning gallery before\n-\t\t// performing the remove operation.\n-\t\tremoveImageByHash: function(hash, ownerGallery) {\n-\t\t\tvar imageData = $.galleriffic.getImage(hash);\n-\t\t\tif (!imageData)\n-\t\t\t\treturn false;\n-\n-\t\t\tvar gallery = imageData.gallery;\n-\t\t\tif (ownerGallery && ownerGallery != gallery)\n-\t\t\t\treturn false;\n-\n-\t\t\treturn gallery.removeImageByIndex(imageData.index);\n-\t\t}\r\n-\t};\n-\r\n-\tvar defaults = {\r\n-\t\tdelay:                     3000,\r\n-\t\tnumThumbs:                 20,\r\n-\t\tpreloadAhead:              40, // Set to -1 to preload all images\r\n-\t\tenableTopPager:            false,\r\n-\t\tenableBottomPager:         true,\r\n-\t\tmaxPagesToShow:            7,\r\n-\t\timageContainerSel:         '',\r\n-\t\tcaptionContainerSel:       '',\r\n-\t\tcontrolsContainerSel:      '',\r\n-\t\tloadingContainerSel:       '',\r\n-\t\trenderSSControls:          true,\r\n-\t\trenderNavControls:         true,\r\n-\t\tplayLinkText:              'Play',\r\n-\t\tpauseLinkText:             'Pause',\r\n-\t\tprevLinkText:              'Previous',\r\n-\t\tnextLinkText:              'Next',\r\n-\t\tnextPageLinkText:          'Next &rsaquo;',\r\n-\t\tprevPageLinkText:          '&lsaquo; Prev',\r\n-\t\tenableHistory:             false,\n-\t\tenableKeyboardNavigation:  true,\r\n-\t\tautoStart:                 false,\r\n-\t\tsyncTransitions:           false,\r\n-\t\tdefaultTransitionDuration: 1000,\r\n-\t\tonSlideChange:             undefined, // accepts a delegate like such: function(prevIndex, nextIndex) { ... }\r\n-\t\tonTransitionOut:           undefined, // accepts a delegate like such: function(slide, caption, isSync, callback) { ... }\r\n-\t\tonTransitionIn:            undefined, // accepts a delegate like such: function(slide, caption, isSync) { ... }\r\n-\t\tonPageTransitionOut:       undefined, // accepts a delegate like such: function(callback) { ... }\r\n-\t\tonPageTransitionIn:        undefined, // accepts a delegate like such: function() { ... }\n-\t\tonImageAdded:              undefined, // accepts a delegate like such: function(imageData, $li) { ... }\n-\t\tonImageRemoved:            undefined  // accepts a delegate like such: function(imageData, $li) { ... }\r\n-\t};\r\n-\n-\t// Primary Galleriffic initialization function that should be called on the thumbnail container.\r\n-\t$.fn.galleriffic = function(settings) {\r\n-\t\t//  Extend Gallery O"..b'display all thumbnails.\r\n-\t\t\tbuildPageLink: function(pager, pageNum, numPages) {\r\n-\t\t\t\tvar pageLabel = pageNum + 1;\r\n-\t\t\t\tvar currentPage = this.getCurrentPage();\r\n-\t\t\t\tif (pageNum == currentPage)\r\n-\t\t\t\t\tpager.append(\'<span class="current">\'+pageLabel+\'</span>\');\r\n-\t\t\t\telse if (pageNum < numPages) {\r\n-\t\t\t\t\tvar imageIndex = pageNum*this.numThumbs;\r\n-\t\t\t\t\tpager.append(\'<a rel="history" href="#\'+this.data[imageIndex].hash+\'" title="\'+pageLabel+\'">\'+pageLabel+\'</a>\');\r\n-\t\t\t\t}\n-\t\t\t\t\n-\t\t\t\treturn this;\r\n-\t\t\t}\r\n-\t\t});\r\n-\r\n-\t\t// Now initialize the gallery\r\n-\t\t$.extend(this, defaults, settings);\r\n-\t\t\r\n-\t\t// Verify the history plugin is available\r\n-\t\tif (this.enableHistory && !$.historyInit)\r\n-\t\t\tthis.enableHistory = false;\r\n-\t\t\r\n-\t\t// Select containers\r\n-\t\tif (this.imageContainerSel) this.$imageContainer = $(this.imageContainerSel);\r\n-\t\tif (this.captionContainerSel) this.$captionContainer = $(this.captionContainerSel);\r\n-\t\tif (this.loadingContainerSel) this.$loadingContainer = $(this.loadingContainerSel);\r\n-\n-\t\t// Initialize the thumbails\r\n-\t\tthis.initializeThumbs();\r\n-\t\t\r\n-\t\tif (this.maxPagesToShow < 3)\r\n-\t\t\tthis.maxPagesToShow = 3;\r\n-\r\n-\t\tthis.displayedPage = -1;\n-\t\tthis.currentImage = this.data[0];\r\n-\t\tvar gallery = this;\r\n-\r\n-\t\t// Hide the loadingContainer\r\n-\t\tif (this.$loadingContainer)\r\n-\t\t\tthis.$loadingContainer.hide();\r\n-\r\n-\t\t// Setup controls\r\n-\t\tif (this.controlsContainerSel) {\r\n-\t\t\tthis.$controlsContainer = $(this.controlsContainerSel).empty();\r\n-\t\t\t\r\n-\t\t\tif (this.renderSSControls) {\r\n-\t\t\t\tif (this.autoStart) {\r\n-\t\t\t\t\tthis.$controlsContainer\r\n-\t\t\t\t\t\t.append(\'<div class="ss-controls"><a href="#pause" class="pause" title="\'+this.pauseLinkText+\'">\'+this.pauseLinkText+\'</a></div>\');\r\n-\t\t\t\t} else {\r\n-\t\t\t\t\tthis.$controlsContainer\r\n-\t\t\t\t\t\t.append(\'<div class="ss-controls"><a href="#play" class="play" title="\'+this.playLinkText+\'">\'+this.playLinkText+\'</a></div>\');\r\n-\t\t\t\t}\r\n-\r\n-\t\t\t\tthis.$controlsContainer.find(\'div.ss-controls a\')\r\n-\t\t\t\t\t.click(function(e) {\r\n-\t\t\t\t\t\tgallery.toggleSlideshow();\r\n-\t\t\t\t\t\te.preventDefault();\r\n-\t\t\t\t\t\treturn false;\r\n-\t\t\t\t\t});\r\n-\t\t\t}\r\n-\t\t\r\n-\t\t\tif (this.renderNavControls) {\r\n-\t\t\t\tthis.$controlsContainer\r\n-\t\t\t\t\t.append(\'<div class="nav-controls"><a class="prev" rel="history" title="\'+this.prevLinkText+\'">\'+this.prevLinkText+\'</a><a class="next" rel="history" title="\'+this.nextLinkText+\'">\'+this.nextLinkText+\'</a></div>\')\r\n-\t\t\t\t\t.find(\'div.nav-controls a\')\r\n-\t\t\t\t\t.click(function(e) {\r\n-\t\t\t\t\t\tgallery.clickHandler(e, this);\r\n-\t\t\t\t\t});\r\n-\t\t\t}\r\n-\t\t}\r\n-\n-\t\tvar initFirstImage = !this.enableHistory || !location.hash;\n-\t\tif (this.enableHistory && location.hash) {\n-\t\t\tvar hash = $.galleriffic.normalizeHash(location.hash);\n-\t\t\tvar imageData = allImages[hash];\r\n-\t\t\tif (!imageData)\n-\t\t\t\tinitFirstImage = true;\n-\t\t}\n-\r\n-\t\t// Setup gallery to show the first image\n-\t\tif (initFirstImage)\r\n-\t\t\tthis.gotoIndex(0, false, true);\r\n-\n-\t\t// Setup Keyboard Navigation\n-\t\tif (this.enableKeyboardNavigation) {\n-\t\t\t$(document).keydown(function(e) {\n-\t\t\t\tvar key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;\n-\t\t\t\tswitch(key) {\n-\t\t\t\t\tcase 32: // space\n-\t\t\t\t\t\tgallery.next();\n-\t\t\t\t\t\te.preventDefault();\n-\t\t\t\t\t\tbreak;\n-\t\t\t\t\tcase 33: // Page Up\n-\t\t\t\t\t\tgallery.previousPage();\n-\t\t\t\t\t\te.preventDefault();\n-\t\t\t\t\t\tbreak;\n-\t\t\t\t\tcase 34: // Page Down\n-\t\t\t\t\t\tgallery.nextPage();\n-\t\t\t\t\t\te.preventDefault();\n-\t\t\t\t\t\tbreak;\n-\t\t\t\t\tcase 35: // End\n-\t\t\t\t\t\tgallery.gotoIndex(gallery.data.length-1);\n-\t\t\t\t\t\te.preventDefault();\n-\t\t\t\t\t\tbreak;\n-\t\t\t\t\tcase 36: // Home\n-\t\t\t\t\t\tgallery.gotoIndex(0);\n-\t\t\t\t\t\te.preventDefault();\n-\t\t\t\t\t\tbreak;\n-\t\t\t\t\tcase 37: // left arrow\n-\t\t\t\t\t\tgallery.previous();\n-\t\t\t\t\t\te.preventDefault();\n-\t\t\t\t\t\tbreak;\n-\t\t\t\t\tcase 39: // right arrow\n-\t\t\t\t\t\tgallery.next();\n-\t\t\t\t\t\te.preventDefault();\n-\t\t\t\t\t\tbreak;\n-\t\t\t\t}\n-\t\t\t});\n-\t\t}\n-\n-\t\t// Auto start the slideshow\r\n-\t\tif (this.autoStart)\r\n-\t\t\tthis.play();\r\n-\r\n-\t\t// Kickoff Image Preloader after 1 second\r\n-\t\tsetTimeout(function() { gallery.preloadInit(); }, 1000);\r\n-\r\n-\t\treturn this;\r\n-\t};\r\n-})(jQuery);\r\n'
b
diff -r 11708af40030 -r 967512924317 bin/js/jquery.js
--- a/bin/js/jquery.js Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,5 +0,0 @@\n-/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license\n-//@ sourceMappingURL=jquery.min.map\n-*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,w=/\\S+/g,T=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,N=/^(?:(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,C=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,k=/^[\\],:{}\\s]*$/,E=/(?:^|:|,)(?:\\s*\\[)+/g,S=/\\\\(?:["\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,A=/"[^"\\\\\\r\\n]*"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,j=/^-ms-/,D=/-([\\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))r'..b' ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);\n\\ No newline at end of file\n'
b
diff -r 11708af40030 -r 967512924317 bin/js/jquery.opacityrollover.js
--- a/bin/js/jquery.opacityrollover.js Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,42 +0,0 @@
-/**
- * jQuery Opacity Rollover plugin
- *
- * Copyright (c) 2009 Trent Foley (http://trentacular.com)
- * Licensed under the MIT License:
- *   http://www.opensource.org/licenses/mit-license.php
- */
-;(function($) {
- var defaults = {
- mouseOutOpacity:   0.67,
- mouseOverOpacity:  1.0,
- fadeSpeed:         'fast',
- exemptionSelector: '.selected'
- };
-
- $.fn.opacityrollover = function(settings) {
- // Initialize the effect
- $.extend(this, defaults, settings);
-
- var config = this;
-
- function fadeTo(element, opacity) {
- var $target = $(element);
-
- if (config.exemptionSelector)
- $target = $target.not(config.exemptionSelector);
-
- $target.fadeTo(config.fadeSpeed, opacity);
- }
-
- this.css('opacity', this.mouseOutOpacity)
- .hover(
- function () {
- fadeTo(this, config.mouseOverOpacity);
- },
- function () {
- fadeTo(this, config.mouseOutOpacity);
- });
-
- return this;
- };
-})(jQuery);
b
diff -r 11708af40030 -r 967512924317 bin/ppp.pm
--- a/bin/ppp.pm Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,230 +0,0 @@\n-package ppp;\n-\n-use strict;\n-use warnings;\n-use FindBin;\n-use lib $FindBin::Bin;\n-use Rcall qw ( histogram );\n-use Math::CDF;\n-\n-use Exporter;\n-our @ISA = qw( Exporter );\n-our @EXPORT_OK = qw( &ping_pong_partners );\n-\n-sub ping_pong_partners\n-{\n-    my ( $TE_fai, $sam, $dir, $max ) = @_;\n-    my ( $hashRef, $dupRef, $hasPpp ) = count_mapped ( $TE_fai, $sam );\n-    my ( %num_per_overlap_size, $overlap_number, $reverseR, $begRev, $endRev, $sensR, $begSens, $endSens, $snum, $rnum, $overlap );\n-    my ( $SP, $AP, $SN, $AN, $txt );\n-    my $flag = 0;\n-    my @distri_overlap = (); my @overlaps_names = ();\n-\n-    open my $ppp_f, \'>\', $dir."ppp.txt" || die "cannot create ppp.txt $!\\n";\n-    foreach my $k ( sort keys %{$hashRef} )\n-    {\n-        my $v = $hashRef->{$k};\n-        my $TE_dir = $dir.$k.\'/\';\n-\n-        %num_per_overlap_size = (); $overlap_number = 0;\n-        $flag = 0;\n-        for ( my $i = 0; $i <= $#{$v->[1]} ; $i++ )\n-        {\n-            $reverseR = ${$v->[1]}[$i] ;\n-            $begRev = $reverseR->[0];\n-            $endRev = $begRev + length($reverseR->[1]) - 1;\n-\n-            my $revR = reverse($reverseR->[1]);\n-            $revR =~ tr/atgcuATGCU/tacgaTACGA/;\n-\n-            for ( my $j = 0; $j <= $#{$v->[0]}; $j++ )\n-            {\n-                $sensR = ${$v->[0]}[$j];\n-                $begSens = $sensR->[0];\n-                $endSens = $begSens + length($sensR->[1]) - 1;\n-\n-                if ( $begSens <= $endRev && $endSens > $endRev )\n-                {\n-                    $flag = 1;\n-                    mkdir $TE_dir;\n-                    open    $txt, \'>\', $TE_dir.\'overlap_size.txt\' || die "cannot open repartition\\n";\n-\n-                    $overlap = $endRev - $begSens + 1;\n-                    $snum =    $dupRef->{$sensR->[0].$sensR->[1].$sensR->[2].$sensR->[3]};\n-                    $rnum = $dupRef->{$reverseR->[0].$reverseR->[1].$reverseR->[2].$reverseR->[3]};\n-\n-                    if ( $overlap == 10 )\n-                    {\n-                        $hasPpp->{ $sensR->[0].$sensR->[1].$sensR->[2].$sensR->[3] } = 1;\n-                        $hasPpp->{ $reverseR->[0].$reverseR->[1].$reverseR->[2].$reverseR->[3] } = 1;\n-                    }\n-                    next if $overlap > $max;\n-                    if ( $snum < $rnum )\n-                    {\n-                        $num_per_overlap_size{$overlap} += $snum;\n-                        $overlap_number += $snum;\n-                    }\n-                    else\n-                    {\n-                        $num_per_overlap_size{$overlap} += $rnum ;\n-                        $overlap_number += $rnum ;\n-                    }\n-                }\n-            }\n-        }\n-        if ( $max != 0 )\n-        {\n-            my @overlaps = ();\n-            push @overlaps_names, $k;\n-            for my $i (1..$max)\n-            {\n-                $num_per_overlap_size{$i} = 0 unless exists( $num_per_overlap_size{$i} );\n-                push @overlaps, $num_per_overlap_size{$i};\n-            }\n-            push @distri_overlap, \\@overlaps;\n-        }\n-\n-        if ( $flag == 1 )\n-        {\n-            open    $AP, \'>\', $TE_dir."antisensPPP.txt" || die "cannot create antisensPPP\\n";\n-            open    $AN, \'>\', $TE_dir."antisens.txt"    || die "cannot create antisens\\n";\n-            for ( my $i = 0; $i <= $#{$v->[1]} ; $i++ )\n-            {\n-                $reverseR = ${$v->[1]}[$i] ;\n-                my $revR = reverse($reverseR->[1]);\n-                $revR =~ tr/atgcuATGCU/tacgaTACGA/;\n-                $rnum = $dupRef->{$reverseR->[0].$reverseR->[1].$reverseR->[2].$reverseR->[3]};\n-                if ( $hasPpp->{ $reverseR->[0].$reverseR->[1].$reverseR->[2].$reverseR->[3] } == 1 )\n-                {\n-                    print $AP ">$reverseR->[0]|$reverseR->[2]|$reverseR->[3]|$rnum\\n$revR\\n";\n-                }\n-                else\n-                {\n-                    print $AN ">$reverseR->[0]|$reverseR->[2]|$reverseR->[3]|$r'..b' open    $SP, \'>\', $TE_dir."sensPPP.txt" || die "cannot create sensPPP\\n";\n-            open    $SN, \'>\', $TE_dir."sens.txt"    || die "cannot create sens\\n";\n-            for ( my $j = 0; $j <= $#{$v->[0]}; $j++ )\n-            {\n-                $sensR = ${$v->[0]}[$j];\n-                $snum =    $dupRef->{$sensR->[0].$sensR->[1].$sensR->[2].$sensR->[3]};\n-                if ( $hasPpp->{ $sensR->[0].$sensR->[1].$sensR->[2].$sensR->[3] } == 1 )\n-                {\n-                    print $SP ">$sensR->[0]|$sensR->[2]|$sensR->[3]|$snum\\n$sensR->[1]\\n";\n-                }\n-                else\n-                {\n-                    print $SN ">$sensR->[0]|$sensR->[2]|$sensR->[3]|$snum\\n$sensR->[1]\\n";\n-                }\n-            }\n-            close $SP; close $SN;\n-\n-            my $histo_png = $TE_dir.\'histogram.png\';\n-            histogram( \\%num_per_overlap_size, $histo_png, $overlap_number );\n-            print $txt "size\\tnumber\\tpercentage of the total overlap number\\n";\n-            foreach my $k ( sort {$a <=> $b} keys %num_per_overlap_size )\n-            {\n-                my $percentage = 0;\n-                $percentage = $num_per_overlap_size{$k} * 100 / $overlap_number unless $overlap_number == 0;\n-                print $txt "$k\\t$num_per_overlap_size{$k}\\t"; printf $txt "%.2f\\n",$percentage;\n-            }\n-            close $txt;\n-        }\n-    }\n-\n-    foreach my $tabP (    @distri_overlap )\n-    {\n-        my $sum = sum($tabP);\n-        my $ten = $tabP->[9];\n-        my $mean = mean($tabP);\n-        my $std = standard_deviation($tabP, $mean);\n-        my $zsc = z_significance($ten, $mean, $std);\n-        my $name = shift @overlaps_names;\n-        my $prob = \'NA\';\n-        $prob =    1 - &Math::CDF::pnorm( $zsc ) if $zsc ne \'NA\';\n-        print $ppp_f (join ("\\t", $name, $sum, $ten, $mean, $std, $zsc, $prob ),"\\n" );\n-    }\n-    close $ppp_f;\n-}\n-\n-sub count_mapped\n-{\n-    my ( $fai, $in_file ) = @_;\n-    my ( %mapped, %dup, %has_ppp );\n-\n-    open my $f, \'<\', $fai || die "cannot open $fai $! \\n";\n-    while(<$f>)\n-    {\n-        if ($_ =~ /(.*)\\t(\\d+)\\n/)\n-        {\n-            $mapped{$1} = [];\n-            $mapped{$1}->[0] = []; $mapped{$1}->[1] = [];\n-        }\n-    }\n-    close $f;\n-\n-    open my $infile, "samtools view \'$in_file\' |"|| die "cannot open input file $! \\n";\n-    while(<$infile>)\n-    {\n-        unless ($_ =~ /^\\@[A-Za-z][A-Za-z](\\t[A-Za-z][A-Za-z0-9]:[ -~]+)+$/ || $_ =~ /^\\@CO\\t.*/ )\n-        {\n-            my @line = split (/\\t/,$_);\n-            if ($line[1] == 0)\n-            {\n-                unless ( exists ($dup{$line[3].$line[9].$line[1].$line[2]}) )\n-                {\n-                    push @{$mapped{$line[2]}->[0]} , [$line[3], $line[9], $line[1],    $line[2]];\n-                    $has_ppp {$line[3].$line[9].$line[1].$line[2]} = 0;\n-                }\n-                $dup{$line[3].$line[9].$line[1].$line[2]}+=1;\n-            }\n-            elsif ($line[1] == 16)\n-            {\n-                unless ( exists ($dup{$line[3].$line[9].$line[1].$line[2]}) )\n-                {\n-                    push @{$mapped{$line[2]}->[1]} , [$line[3], $line[9], $line[1],    $line[2]];\n-                    $has_ppp{$line[3].$line[9].$line[1].$line[2]} = 0;\n-                }\n-                $dup{$line[3].$line[9].$line[1].$line[2]}+=1\n-            }\n-        }\n-    }\n-    close $infile;\n-    return (\\%mapped, \\%dup, \\%has_ppp );\n-}\n-\n-sub sum\n-{\n-    my $arrayref = shift;\n-    my $result = 0;\n-    foreach (@$arrayref) {$result += $_}\n-    return $result;\n-}\n-\n-sub mean\n-{\n-    my $arrayref = shift;\n-    my $result;\n-    foreach (@$arrayref) {$result += $_}\n-    return $result / scalar(@$arrayref);\n-}\n-\n-sub standard_deviation\n-{\n-    my ($arrayref, $mean) =    @_;\n-    return sqrt ( mean ( [map $_**2 , @$arrayref ]) - ($mean**2));\n-}\n-\n-sub z_significance\n-{\n-    my ($ten, $mean, $std) = @_;\n-    my $z = \'NA\';\n-    $z = (($ten - $mean) / $std) if $std != 0;\n-    return $z;\n-}\n-\n-1;\n-\n'
b
diff -r 11708af40030 -r 967512924317 bin/resize.pm
--- a/bin/resize.pm Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,101 +0,0 @@
-package resize;
-
-use strict;
-use warnings;
-
-use FindBin;
-use lib $FindBin::Bin;
-use Rcall qw ( histogram );
-
-use Exporter;
-our @ISA = qw( Exporter );
-our @EXPORT_OK = qw( &size_distribution );
-
-sub size_distribution
-{
-    my ( $fastq, $fastq_out, $dir, $min, $max ) = @_;
-
-    my ( %fragments_size, %duplicates ) ;
-    my $num = size($min, $max, $fastq, $fastq_out, \%fragments_size, \%duplicates);
-
-    my $png = $dir.'histogram.png';
-    histogram(\%fragments_size, $png, $num);
-    
-    my $size = $dir.'reads_size.txt';
-    
-
-    my $pourcentage;
-    open    my $o, '>', $size || die "cannot open $size $!\n";
-    print $o "size\tnumber\tpercentage\n";
-    foreach my    $k (sort { $a <=> $b } keys %fragments_size )
-    {
-        $pourcentage = $fragments_size{$k} / $num * 100;
-        
-        print $o "$k\t$fragments_size{$k}\t";
-        printf $o "%.2f\n",$pourcentage;
-    }
-    close $o;
-    
-    my $dup = $dir.'duplicates.txt' ;
-    open $o, '>', $dup || die "cannot open $size $!\n";
-    print $o "size\tnumber\n";
-    foreach my    $k (sort { $duplicates{$b} <=> $duplicates{$a} } keys %duplicates )
-    {
-        print $o "$k\t$duplicates{$k}\n";
-    }
-    close $o;
-}
-
-sub size
-{
-    my ($min, $max, $in_file, $out_file, $sizeHashR, $duplicateHashR) = @_;
-    my ($numreads, $size, $cmp, $ok, $line) = (0, 0, 0, 0);
-    my @fastq;
-    open (my $in, $in_file) || die "cannot open $in_file $!\n";
-    open (my $out, ">".$out_file)    || die "cannot create $out_file $!\n";
-    while(<$in>)
-    {
-        chomp $_;
-        $cmp++; $line++;
-        if ($cmp == 1)
-        {
-            die "file do not contain a @ at line $line\n" unless ($_ =~ /^\@/ );
-            $ok = 0; @fastq = ();
-            push(@fastq,$_);
-        }
-        elsif ($cmp == 2)
-        {
-            #die "unrecognized symbol at line $line\n" unless ($_ =~ /[atcgATCGnN]+/ || $_ =~ /^$/ );
-            push(@fastq,$_);
-            $size = length($_);
-            if ($size >= $min && $size <= $max)
-            {
-                $numreads++;
-                ${$sizeHashR}{$size}+=1;
-                ${$duplicateHashR}{$_}+=1 if (defined($duplicateHashR));
-                $ok = 1;
-            }
-        }
-        elsif ($cmp == 3 )
-        {
-            die "file do not contain a + at line $line\n" unless $_ =~ /^\+/;
-            push(@fastq,$_);
-        }
-        elsif ($cmp == 4 )
-        {
-            push(@fastq,$_);
-            $cmp = 0;
-            if ($ok == 1)
-            {
-                foreach my $t (@fastq)
-                {
-                    print $out $t."\n";
-                }
-            }
-        }
-    }
-    close $in; close $out;
-    return $numreads;
-}
-
-1;
b
diff -r 11708af40030 -r 967512924317 bin/sRNAPipe.pl
--- a/bin/sRNAPipe.pl Thu Jan 24 13:09:46 2019 -0500
+++ b/bin/sRNAPipe.pl Mon Jan 28 11:57:15 2019 -0500
[
@@ -1,20 +1,21 @@
-#!/usr/bin/perl
+#!/usr/bin/env perl
+package main;
 use strict;
 use warnings;
 use Getopt::Long;
 use Parallel::ForkManager;
 use File::Basename;
-use File::Copy::Recursive qw( dircopy );
+use File::Copy;
 use POSIX;
 use FindBin;
-use lib $FindBin::Bin;
-use resize qw ( size_distribution );
-use subgroups qw (subgroups );
-use ppp qw ( ping_pong_partners );
-use Rcall qw (pie_chart bg_to_png );
-use align qw ( to_build get_unique sam_count sam_count_mis sam_sorted_bam rpms_rpkm rpms_rpkm_te BWA_call get_fastq_seq extract_sam sam_to_bam_bg );
-use html qw ( main_page details_pages menu_page ppp_page );
-use File::Copy;
+use lib "$FindBin::Bin/../lib";
+use sRNAPipe;
+use sRNAPipe::resize qw ( size_distribution );
+use sRNAPipe::subgroups qw ( subgroups );
+use sRNAPipe::ppp qw ( ping_pong_partners );
+use sRNAPipe::Rcall qw (pie_chart bg_to_png );
+use sRNAPipe::align qw ( to_build get_unique sam_count sam_count_mis sam_sorted_bam rpms_rpkm rpms_rpkm_te BWA_call get_fastq_seq extract_sam sam_to_bam_bg );
+use sRNAPipe::html qw ( main_page details_pages menu_page ppp_page copy_css copy_js );
 
 if(@ARGV) {
     my ( @fastq, @fastq_n, $dir, $min, $max, $mis, $misTE, $help, $Pcheck, $mapnumf, $html_out);
@@ -62,8 +63,8 @@
     mkdir $dir; mkdir $fq_collection;
     $dir = $dir.'/' unless $dir =~ /\/$/;
     mkdir $dir.'/css';mkdir $dir.'/js';
-    dircopy( $FindBin::Bin.'/css', $dir.'/css' );
-    dircopy( $FindBin::Bin.'/js', $dir.'/js' );
+    copy_css( $dir );
+    copy_js( $dir );
     
     my $file = $dir.'report.txt';
     open my $report, '>', $file or die "Cannot open $file $!\n";
@@ -273,5 +274,34 @@
     print $report "Job done!\n";
     close $report;
 } else {
-    print "sRNAPipe v1.1\n";
+    print "sRNAPipe version $sRNAPipe::VERSION
+
+Usage:
+
+sRNAPipe --fastq <fastq file 1> --fastq_n <name 1> [--fastq <fastq file 2> --fastq_n <name 2> --fastq <fastq file 3> -- fastq_n <name 3> ...] --ref <reference genome> [--build_index] --transcripts <transcripts> [--build_transcripts] --TE <transposable elements> [--build_TE] --miRNAs <miRNAs> [--build_miRNAs] --snRNAs <snRNAs> [--build_snRNAs] --rRNAs <rRNAs> [--build_rRNAs] --tRNAs <tRNAs> [--buid_tRNAs] [options]
+
+Arguments:
+--fastq <fastq file>\t\tFastq file to process
+--fastq_n <name>\t\tName of the content to process
+--ref <reference>\t\tFasta file containing the reference genome
+--transcripts <transcripts>\tFasta file containing the transcripts
+--TE <TE>\t\t\tFasta file containing the transposable elements
+--miRNAs <miRNAs>\t\tFasta file containing the miRNAs
+--snRNAs <snRNAs>\t\tFasta file containing the snRNAs
+--rRNAs <rRNAs>\t\t\tFasta file containing the rRNAs
+--tRNAs <tRNAS>\t\t\tFasta file containing the tRNAs
+
+For any fasta file, if a bwa index is not provided, you should build it through the corresponding '--build_[element]' argument
+
+Options:
+--min <INT>\t\t\tMinimum read size (default: 18)
+--max <INT>\t\t\tMaximum read size (default: 29)
+--si_min <INT>\t\t\tLower bound of siRNA range (default: 21)
+--si_max <INT>\t\t\tHigher bound of siRNA range (default: 21)
+--pi_min <INT>\t\t\tLower bound of piRNA range (default: 23)
+--pi_max <INT>\t\t\tHigher bound of piRNA range (default: 29)
+--mis <INT>\t\t\tMaximal genome mismatches (default: 0)
+--misTE <INT>\t\t\tMaximal TE mismatches (default: 3)
+--PPPon <true|false>\t\tPing-pong partners (default: true)
+";
 }
b
diff -r 11708af40030 -r 967512924317 bin/subgroups.pm
--- a/bin/subgroups.pm Thu Jan 24 13:09:46 2019 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,174 +0,0 @@
-package subgroups;
-
-use strict;
-use warnings;
-use Exporter;
-our @ISA = qw( Exporter );
-our @EXPORT_OK = qw( &subgroups );
-
-use POSIX;
-use File::Copy;
-use FindBin;
-use lib $FindBin::Bin;
-use align qw ( get_hash_alignment );
-
-sub subgroups
-{
-    my ($fin, $dir, $mis, $mis_TE, $proc, $tRNAs, $rRNAs, $snRNAs, $miRNAs, $transcripts, $TE, $min_si, $max_si, $min_pi, $max_pi, $report ) = @_;
-    my (@files, $sum, $pie, $repar, %ismapped, %isjunk, %repartition, @junk_ref, @all_ref );
-
-    srand();
-    print $report "----------------------------\n";
-    print $report "Create subgroups:\nfastq_in: $fin\ndirectory_out: $dir\nmismatches: $mis\nmismatches TE: $mis_TE\n";
-
-    mkdir $dir;
-    $dir = $dir.'/' unless $dir =~ /(.*)\/$/;
-
-    my $accept_miRNas = $dir.'miRNAs.fastq';
-    my $reject_miRNAs = $dir.'miRNAs_rejected.fastq';
-    my $sam_miRNAs = $dir.'miRNAs.sam';
-    my @tmp = get_hash_alignment($miRNAs, $mis, 1, 1, $accept_miRNas, $reject_miRNAs, $fin, $proc, 'miRNAs',$sam_miRNAs, $report);
-    my $mi = $tmp[0]; my $sam = '';
-    $repartition{'miRNAs'} = $mi;
-
-
-    my $reject_rRNAs = $dir.'rRNAs_rejected.fastq';
-    if ( $rRNAs eq 'None')
-    {
-        move($reject_miRNAs,$reject_rRNAs);
-    }
-    else
-    {
-        $sam = new String::Random;
-        $sam = $sam->randpattern("CCcccccc");
-        @tmp = get_hash_alignment($rRNAs, $mis, 0, 1, 'NA', $reject_rRNAs, $reject_miRNAs, $proc, 'rRNAs', $sam, $report);
-        $repartition{'rRNAs'} = $tmp[0];
-        unlink $sam, $sam.'_aln.err', $sam.'_samse.err';
-    }
-
-    my $reject_tRNAs = $dir.'rRNAs_rejected.fastq';
-    if ( $rRNAs eq 'None')
-    {
-        move($reject_rRNAs,$reject_tRNAs);
-    }
-    else
-    {
-        $sam = new String::Random;
-        $sam = $sam->randpattern("CCcccccc");
-        @tmp = get_hash_alignment($tRNAs, $mis, 0, 1, 'NA', $reject_tRNAs, $reject_rRNAs, $proc, 'tRNAs', $sam, $report);
-        $repartition{'tRNAs'} = $tmp[0];
-        unlink $sam, $sam.'_aln.err', $sam.'_samse.err';
-    }
-
-
-    my $bonafide = $dir.'bonafide_reads.fastq';
-    if ( $rRNAs eq 'None')
-    {
-        move($reject_tRNAs,$bonafide);
-    }
-    else
-    {
-        $sam = new String::Random;
-        $sam = $sam->randpattern("CCcccccc");
-        @tmp = get_hash_alignment($snRNAs, $mis, 0, 1, 'NA', $bonafide, $reject_tRNAs, $proc, 'snRNAs', $sam, $report);
-        $repartition{'snRNAs'} = $tmp[0];
-
-        unlink $sam, $sam.'_aln.err', $sam.'_samse.err';
-    }
-    my $bo = $tmp[1];
-
-    my $sam_transcripts = $dir.'transcripts.sam';
-    my $reject_transcripts = $dir.'rejected_transcripts.fastq';
-    @tmp = get_hash_alignment($transcripts, $mis, 0, 1, 'NA', $reject_transcripts, $bonafide, $proc, 'transcripts', $sam_transcripts, $report, $dir.'transcripts.fai');
-    $repartition{'transcripts'} = $tmp[0];
-
-    
-    my $sam_TEs = $dir.'TEs.sam';
-    my $reject_TEs = $dir.'rejected.fastq';
-    @tmp = get_hash_alignment($TE, $mis_TE, 0, 1, 'NA', $reject_TEs, $reject_transcripts, $proc, 'TEs', $sam_TEs, $report, $dir.'TEs.fai' );
-    $repartition{'TEs'} = $tmp[0] ; $repartition{'others'} = $tmp[1];
-    unlink $sam, $sam.'_aln.err', $sam.'_samse.err';
-    unlink $reject_transcripts;
-    unlink $reject_rRNAs;
-    unlink $reject_miRNAs;
-    unlink $reject_tRNAs;
-
-    #create repartition
-    my $pi = fastqSubgroups($bonafide, $dir, $min_si, $max_si, $min_pi, $max_pi );
-
-    open (my $re, '>'.$dir.'repartition.txt') || die "cannot open $dir repartition.txt $!\n";
-    print $re "type\tnumber\tpercentage\n";
-    $sum += $_ foreach values %repartition;
-    foreach my $k    ( sort keys    %repartition )
-    {
-        my $prct = 0;
-        $prct = $repartition{$k} / $sum * 100 if $sum != 0;
-        print $re "$k\t$repartition{$k}\t"; printf $re "%.2f\n",$prct;
-    }
-    return ( $bo, $mi, $pi);
-}
-
-sub fastqSubgroups
-{
-    my ( $fastq, $output_directory, $min_si, $max_si, $min_pi, $max_pi ) = @_;
-    my $fastq_siRNA = $output_directory."siRNAs.fastq";
-    my $fastq_piRNA = $output_directory."piRNAs.fastq";
-
-    open my $fic, '<', $fastq || die "cannot open input file $! \n";
-    open my $si, '>', $fastq_siRNA || die "cannot open siRNA.fastq $! \n";
-    open my $pi, '>', $fastq_piRNA || die "cannot open piRNA.fastq $! \n";
-    
-    my ($length, $cmp, $type, $siRNA_number, $miRNA_h_number, $piRNA_number, $not_pi_number) = (0,0,0,0,0,0,0);
-    my (@fastq) =(); my $seq_name;
-    my $out;
-    while(<$fic>)
-    {
-        chomp $_;
-        $cmp++;
-        if ($cmp == 1)
-        {
-            die "file do not contain a @ at line $cmp\n" unless ($_ =~ /^\@/ );
-            $type = 0; @fastq = ();
-            if ($_ =~ /^\@(.*)\s.*/) { $seq_name = $1;}
-            elsif ($_ =~ /^\@(.*)/) {$seq_name = $1;}
-            push(@fastq,$_);
-        }
-        elsif ($cmp == 2)
-        {
-            #die "unrecognized symbol at line $cmp\n" unless $_ =~ /[atcgATCGnN]+/;
-            push(@fastq,$_);
-            $length = length($_);
-            $type = 0;
-            if ( $length >= $min_si    && $length <= $max_si )
-            {
-                 $type = 2;
-                 $siRNA_number++;
-            }
-            if ($length >= $min_pi    && $length <= $max_pi )
-            {
-                $type += 4;
-                $piRNA_number++;
-            }
-        }
-        elsif ($cmp == 3 )
-        {
-            die "file do not contain a + at line $cmp\n" unless $_ =~ /^\+/;
-            push(@fastq,$_);
-        }
-        elsif ($cmp == 4 )
-        {
-            push(@fastq,$_);
-            $cmp = 0;
-            if ($type != 0)
-            {
-                if ($type & 4 ) { foreach my $t (@fastq) { print $pi $t."\n";} }
-                if ($type & 2 ) { foreach my $t (@fastq) { print $si $t."\n";} }
-            }
-        }
-    }
-    close $fic;
-    close $si; close $pi;
-    return ($piRNA_number);
-}
-
-1;
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe.pm Mon Jan 28 11:57:15 2019 -0500
b
@@ -0,0 +1,5 @@
+package sRNAPipe;
+
+our $VERSION = '1.1';
+
+1;
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/Rcall.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/Rcall.pm Mon Jan 28 11:57:15 2019 -0500
[
@@ -0,0 +1,136 @@
+package sRNAPipe::Rcall;
+
+use strict;
+use warnings;
+use Statistics::R;
+
+use Exporter;
+our @ISA = qw(Exporter);
+our @EXPORT_OK = qw( &histogram &pie_chart &bg_to_png );
+
+sub histogram
+{
+    my ($size_hashR, $out_png, $size)    = @_;
+    my (@abs, @ord);
+    my $i = 0;
+    foreach my $k (sort {$a <=> $b} keys %{$size_hashR})
+    {
+        my $percentage = 0;
+        $percentage = $size_hashR->{$k} * 100 / $size if $size != 0;
+        $abs[$i] = $k ; $ord[$i] = $percentage; $i++;
+    }
+    my $abs = join (",", @abs );
+    my $ord = join (",", @ord );
+    if (scalar(@abs) != 0)
+    {
+
+        my $R = Statistics::R->new();
+        $R->startR;
+        $R->send(
+            qq`library(ggplot2)
+            percentage = c($ord)
+            size =c($abs)
+            min = min(size)
+            max = max(size)
+            dat = data.frame(size,percentage)
+            png(filename=\"$out_png\", width = 640, height = 640)
+            c = ggplot(dat,aes(size,percentage))
+            c + geom_bar(stat="identity") + scale_x_continuous(breaks=min:max)+theme( axis.text.x = element_text(angle=90, hjust=0.5, size=20), axis.text.y = element_text( size=20 ), axis.title.x = element_text( size=25, face="bold"), axis.title.y = element_text( size=25, face="bold") )
+            dev.off()`);
+        $R->stopR();
+
+    }
+}
+
+sub bg_to_png
+{
+    my ( $fai, $bgP, $bgM, $dir, $sb ) = @_;
+    my $R = Statistics::R->new();
+    $R->startR;
+    $R->send(
+    qq`library('Sushi')
+    fai =read.table("$fai")
+    if ( file.info("$bgP")\$size !=0 )
+    {
+        bgP = read.table("$bgP")
+    } else { bgP = data.frame(factor(),integer()) }
+
+    if ( file.info("$bgM")\$size !=0 )
+    {
+        bgM = read.table("$bgM")
+    } else { bgM = data.frame(factor(),integer()) }
+
+    f_both = function(chr,end) {
+        jpeg( paste0("$dir",as.character(chr),".png"), quality=100)
+        par(mfrow=c(2,1),mar=c(1,10,1,3))
+        plotBedgraph(bgP, chrom=chr,chromstart=0,chromend=end,transparency=.50,    color=SushiColors(2)(2)[1])
+        axis(side=2,las=2,tcl=.2)
+        mtext("Scaled Read Depth",side=2,line=4,cex=1,font=2)
+        plotBedgraph(bgM, chrom=chr,chromstart=0,chromend=end,transparency=.50, flip=TRUE, color=SushiColors(2)(2)[2])
+        labelgenome(chrom=chr,chromstart=0,chromend=end,side=3,n=3,scale="$sb", line=0,    chromline = 0.5,    scaleline = 0.5, scaleadjust =1.05, chromadjust = -0.4)
+        axis(side=2,las=2,tcl=.2,at=pretty(par("yaxp")[c(1,2)]),labels=-1*pretty(par("yaxp")[c(1,2)]))
+        mtext("Scaled Read Depth",side=2,line=4.5,cex=1,font=2)
+        dev.off()
+    }
+
+    f_plus = function(chr,end) {
+        jpeg( paste0("$dir",as.character(chr),".png"), quality=100)
+        plotBedgraph(bgP, chrom=chr,chromstart=0,chromend=end,transparency=.50,    color=SushiColors(2)(2)[1])
+        labelgenome(chrom=chr,chromstart=0,chromend=end,n=3,scale="$sb", line=0,    chromline = 0.5,    scaleline = 0.5, scaleadjust =1.05, chromadjust = -0.4)
+        axis(side=2,las=2,tcl=.2)
+        mtext("Scaled Read Depth",side=2,line=4,cex=1,font=2)
+        dev.off()
+    }
+
+    f_minus = function(chr,end) {
+        jpeg( paste0("$dir",as.character(chr),".png"), quality=100)
+        plotBedgraph(bgM, chrom=chr,chromstart=0,chromend=end,transparency=.50, flip=TRUE, color=SushiColors(2)(2)[2])
+        labelgenome(chrom=chr,chromstart=0,chromend=end,n=3,scale="$sb", line=0,    chromline = 0.5,    scaleline = 0.5, scaleadjust =1.05, chromadjust = -0.4)
+        axis(side=2,las=2,tcl=.2,at=pretty(par("yaxp")[c(1,2)]),labels=-1*pretty(par("yaxp")[c(1,2)]))
+        mtext("Scaled Read Depth",side=2,line=4.5,cex=1,font=2)
+        dev.off()
+    }
+
+    fai_b = fai[fai\$V1 %in% intersect(bgM\$V1,bgP\$V1), ]
+    mapply( f_both, fai_b\$V1, fai_b\$V2)
+
+    fai_p = fai[fai\$V1 %in% setdiff(bgP\$V1,bgM\$V1), ]
+    mapply( f_plus, fai_p\$V1, fai_p\$V2)
+
+    fai_m = fai[fai\$V1 %in% setdiff(bgM\$V1,bgP\$V1), ]
+    mapply( f_minus, fai_m\$V1, fai_m\$V2) `);
+
+    $R->stopR();
+}
+
+sub pie_chart
+{
+    my $dir = shift;
+    my $in = $dir.'repartition.txt';
+    my $out = $dir.'pie_chart.png';
+
+    my $R = Statistics::R->new();
+    $R->startR;
+    $R->send(
+    qq`
+    library(plotrix)
+    library(RColorBrewer)
+    R =read.table("$in",header=T)
+    values = round(R\$percentage)
+    keys = R\$type
+    lab = paste(values, "%", sep="")
+    png("$out")
+    colors <- brewer.pal(7,"Paired")
+    pie(values, col=colors, labels=lab, clockwise=TRUE)
+    legend("bottom", legend = keys, fill=colors, bty="n", ncol = 3)
+    par(mai = c(0,0,0,0))
+    layout(c(1,2),heights=c(0.3,1))
+    plot.new()
+    legend("bottom", legend = keys, fill=colors, bty="n",ncol = 3)
+    pie(values, col=colors, labels=lab, clockwise=TRUE)
+    dev.off()`
+    );
+    $R->stopR();
+}
+
+1;
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/align.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/align.pm Mon Jan 28 11:57:15 2019 -0500
[
b'@@ -0,0 +1,551 @@\n+package sRNAPipe::align;\n+\n+use strict;\n+use warnings;\n+use File::Basename;\n+use String::Random;\n+\n+use FindBin;\n+use lib "$FindBin::Bin/../lib";\n+use sRNAPipe::Rcall qw ( histogram );\n+\n+use Exporter;\n+our @ISA         = qw( Exporter );\n+our @EXPORT    = qw( &rpms_rpkm_te &BWA_call &to_build &get_unique &sam_sorted_bam &get_hash_alignment &sam_to_bam_bg &sam_count &sam_count_mis &rpms_rpkm &get_fastq_seq &extract_sam );\n+\n+sub to_build\n+{\n+    my ( $toBuildTabP, $log, $newdir ) = @_;\n+\n+    foreach my    $pairs ( @{ $toBuildTabP } )\n+    {\n+        if (    $pairs->[0] == 1 )\n+        {\n+            my $sym = $newdir.basename(${$pairs->[1]}).\'_symlink.fa\';\n+            symlink( ${$pairs->[1]}, $sym );\n+            ${$pairs->[1]} = $sym;\n+            build_index ( ${$pairs->[1]}, $log );\n+        }\n+    }\n+}\n+\n+sub build_index\n+{\n+    my $to_index = shift;\n+    my $log = shift;\n+    my $index_log = $to_index.\'_index.err\';\n+    `bwa index \'$to_index\' 2> \'$index_log\'`;\n+    print $log "Creating index for $to_index\\n";\n+}\n+\n+sub get_unique\n+{\n+    my ( $sam, $s_uni, $out_prefix, $col_prefix, $details, $report ) = @_;\n+\n+    my $fout = $col_prefix.\'_all_mappers.fastq\';\n+    my $funi = $col_prefix.\'_unique_mappers.fastq\';\n+    my $frej = $col_prefix.\'_unmapped.fastq\';\n+    \n+    my $repartition = $out_prefix.\'distribution.txt\';\n+    my $png_rep = $out_prefix.\'distribution.png\';\n+    my ( %duplicates, %genome_hits) ;\n+\n+    #alignement to the first reference\n+    my @return = sam_parse( $sam, $fout, $funi, $frej, $s_uni, \\%duplicates, \\%genome_hits, $report );\n+    my $ref_fai = $return[4];\n+    my $mappers =    $return[5];\n+    my $mappers_uni = $return[6];\n+    my $size_mappedHashR = $return[7];\n+\n+    if ( $details == 1 )\n+    {\n+        #print number of duplicates and hits number\n+        my ($pourcentage, $total) =(0,0);\n+\n+        $total += $_ foreach values %{$size_mappedHashR};\n+        open (my $rep, \'>\'.$repartition) || die "cannot create $repartition $!\\n";\n+        print $rep "size\\tnumber\\tpercentage\\n";\n+        foreach my $k (sort{$a cmp $b} keys (%{$size_mappedHashR}))\n+        {\n+            $pourcentage = 0;\n+            $pourcentage = $size_mappedHashR->{$k} / $total * 100 unless $total ==0;\n+\n+            print $rep "$k\\t$size_mappedHashR->{$k}\\t";\n+            printf $rep "%.2f\\n",$pourcentage;\n+        }\n+\n+        histogram($size_mappedHashR, $png_rep, $total);\n+\n+\n+        my $dup = $out_prefix.\'dup_mapnum.txt\';\n+        my $dup_u = $out_prefix .\'dup_unique.txt\';\n+        my $dup_r = $out_prefix .\'dup_nonmapp.txt\';\n+        open(my $tab,">".$dup) || die "cannot open output txt file\\n";\n+        open(my $tab_r,">".$dup_r) || die "cannot open output txt file\\n";\n+        open(my $tab_u,">".$dup_u) || die "cannot open output txt file\\n";\n+        print $tab "sequence\\tcount\\tmapnum\\n";\n+        print $tab_u "sequence\\tcount\\n";\n+        print $tab_r "sequence\\tcount\\n";\n+        foreach my $k (sort {$duplicates{$b} <=> $duplicates{$a}}keys %duplicates)\n+        {\n+            $duplicates{$k} = 0 unless exists($duplicates{$k});\n+            $genome_hits{$k} = 0 unless exists($genome_hits{$k});\n+            if ($genome_hits{$k} != 0) { print $tab $k."\\t".$duplicates{$k}."\\t".$genome_hits{$k}."\\n"; }\n+            else {print $tab_r $k."\\t".$duplicates{$k}."\\n";}\n+            if ($genome_hits{$k} == 1) { print $tab_u $k."\\t".$duplicates{$k}."\\n"; }\n+        }\n+    close $dup; close $dup_r; close $dup_u;\n+    }\n+    return ( $ref_fai, $mappers, $mappers_uni );\n+}\n+\n+sub sam_parse\n+{\n+    my ( $sam, $fastq_accepted, $fastq_accepted_unique, $fastq_rejected, $sam_unique, $duplicate_hashR, $best_hit_number_hashR, $report ) = @_ ;\n+    my ($reads, $mappers, $mappersUnique, @garbage, %size_num, %size_num_spe, %number, %numberSens, %numberReverse, %unique_number, %numberNM, %numberM, %size);\n+    $mappers = $mappersUnique = $reads = 0;\n+\n+    open my $fic, \'<\', $sam || die "cannot open $sam $!\\n";\n+    op'..b'> \'$samse_err\' > \'$sam\'\\n";\n+    `bwa aln -t $number_of_cpus -n $mismatches \'$index\' \'$fastq\' 2> \'$aln_err\' | bwa samse $index /dev/stdin \'$fastq\' 2> \'$samse_err\' > \'$sam\' `;\n+}\n+\n+sub rpms_rpkm\n+{\n+    my ( $counthashR, $sizehashR, $mapped, $out_file, $piRNA_number, $miRNA_number, $bonafide_number ) =@_;\n+    open(my $out, ">".$out_file) || die "cannot open normalized file $! \\n";\n+    print $out "ID\\treads counts\\tRPKM";\n+    print $out "\\tper million of piRNAs" if ($piRNA_number != 0);\n+    print $out "\\tper million of miRNAs" if ($miRNA_number != 0);\n+    print $out "\\tper million of bonafide reads" if ($bonafide_number != 0);\n+    print $out "\\n";\n+    foreach my $k    ( sort keys %{$counthashR} )\n+    {\n+        my ($rpkm, $pirna, $mirna, $bonafide) = (0,0,0,0);\n+        \n+        $rpkm = ( $counthashR->{$k} * 1000000000) / ( $sizehashR->{$k} * $mapped) if ( $sizehashR->{$k} * $mapped) != 0 ;\n+        print $out $k."\\t".$counthashR->{$k}."\\t"; printf $out "%.2f",$rpkm;\n+        \n+        if ($piRNA_number != 0 )\n+        {\n+            $pirna = ( $counthashR->{$k}    * 1000000) / $piRNA_number;\n+            printf $out "\\t%.2f",$pirna;\n+        }\n+        if ($miRNA_number != 0 )\n+        {\n+            $mirna = ( $counthashR->{$k}    * 1000000) / $miRNA_number;\n+            printf $out "\\t%.2f",$mirna;\n+        }\n+        if ($bonafide_number != 0 )\n+        {\n+            $bonafide = ( $counthashR->{$k}    * 1000000) / $bonafide_number;\n+            printf $out "\\t%.2f",$bonafide;\n+        }\n+        print $out "\\n";\n+     }\n+    close $out;\n+}\n+\n+sub extract_sam\n+{\n+    my ( $hashRef, $sam_in, $sam_out, $sam_uni_out, $fastq_out, $fastq_uni_out ) = @_;\n+    \n+    open my $s_in, \'<\', $sam_in || die "cannot open $sam_in file $!\\n";\n+\n+    open my $f_out, \'>\', $fastq_out || die "cannot create $fastq_out $!\\n";\n+    open my $f_uni_out, \'>\', $fastq_uni_out || die "cannot create $fastq_uni_out $!\\n";\n+    \n+    open my $s_out, \'>\', $sam_out || die "cannot create $sam_out file $!\\n" if defined ($hashRef);\n+    open my $s_uni_out, \'>\', $sam_uni_out || die "cannot create $sam_uni_out file $!\\n";\n+\n+    my $sequence = \'\';\n+    while(<$s_in>)\n+    {\n+        if ($_ =~ /^\\@[A-Za-z][A-Za-z](\\t[A-Za-z][A-Za-z0-9]:[ -~]+)+$/ || $_ =~ /^\\@CO\\t.*/ )\n+        {\n+            print $s_out $_ if defined ($hashRef);\n+            print $s_uni_out $_;\n+            next;\n+        }\n+        my @line = split (/\\t/,$_);\n+        $sequence = $line[0];\n+        if ( (! defined ($hashRef) )|| (    exists $hashRef->{$sequence}    &&    $hashRef->{$sequence} == 1 ) )\n+        {\n+            my $arn    =    $line[9];\n+            if ($line[1] & 16)\n+            {\n+                $arn =reverse($arn);\n+                $arn =~ tr/atgcuATGCU/tacgaTACGA/;\n+            }\n+\n+            if    ( ( $line[1] == 16 || $line[1] == 0 ) )\n+            {\n+                print $f_out "\\@".$line[0]."\\n".$arn."\\n+\\n".$line[10]."\\n" ;\n+                print $s_out $_ if defined ($hashRef);\n+                if ( $line[11] eq "XT:A:U" )\n+                {\n+                    print $f_uni_out "\\@".$line[0]."\\n".$arn."\\n+\\n".$line[10]."\\n" ;\n+                    print $s_uni_out $_ ;\n+                }\n+            }\n+        }\n+    }\n+    close $s_in; close $s_out if defined ($hashRef);\n+    close $s_uni_out; close $f_out; close $f_uni_out;\n+}\n+\n+sub get_fastq_seq\n+{\n+    my $fastq = shift;\n+    my %hash; my $cmp = 0;\n+\n+    open my $fic, \'<\', $fastq || die "cannot open input file $! \\n";\n+    while(<$fic>)\n+    {\n+        chomp $_;\n+        $cmp++;\n+        if ($cmp % 4 == 1)\n+        {\n+            die "file do not contain a @ at line $cmp\\n" unless ($_ =~ /^\\@/ );\n+            if ($_ =~ /^\\@(.*)\\s.*/) { $hash{$1} = 1;}\n+            elsif ($_ =~ /^\\@(.*)/) { $hash{$1} = 1;}\n+        }\n+        elsif ($cmp % 4 == 3 )\n+        {\n+            die "file do not contain a + at line $cmp\\n" unless $_ =~ /^\\+/;\n+        }\n+    }\n+    close $fic;\n+    return \\%hash;\n+}\n+\n+1;\n'
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/css/bootstrap-responsive.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/css/bootstrap-responsive.css Mon Jan 28 11:57:15 2019 -0500
[
b'@@ -0,0 +1,1109 @@\n+/*!\n+ * Bootstrap Responsive v2.3.2\n+ *\n+ * Copyright 2012 Twitter, Inc\n+ * Licensed under the Apache License v2.0\n+ * http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Designed and built with all the love in the world @twitter by @mdo and @fat.\n+ */\n+\n+.clearfix {\n+  *zoom: 1;\n+}\n+\n+.clearfix:before,\n+.clearfix:after {\n+  display: table;\n+  line-height: 0;\n+  content: "";\n+}\n+\n+.clearfix:after {\n+  clear: both;\n+}\n+\n+.hide-text {\n+  font: 0/0 a;\n+  color: transparent;\n+  text-shadow: none;\n+  background-color: transparent;\n+  border: 0;\n+}\n+\n+.input-block-level {\n+  display: block;\n+  width: 100%;\n+  min-height: 30px;\n+  -webkit-box-sizing: border-box;\n+     -moz-box-sizing: border-box;\n+          box-sizing: border-box;\n+}\n+\n+@-ms-viewport {\n+  width: device-width;\n+}\n+\n+.hidden {\n+  display: none;\n+  visibility: hidden;\n+}\n+\n+.visible-phone {\n+  display: none !important;\n+}\n+\n+.visible-tablet {\n+  display: none !important;\n+}\n+\n+.hidden-desktop {\n+  display: none !important;\n+}\n+\n+.visible-desktop {\n+  display: inherit !important;\n+}\n+\n+@media (min-width: 768px) and (max-width: 979px) {\n+  .hidden-desktop {\n+    display: inherit !important;\n+  }\n+  .visible-desktop {\n+    display: none !important ;\n+  }\n+  .visible-tablet {\n+    display: inherit !important;\n+  }\n+  .hidden-tablet {\n+    display: none !important;\n+  }\n+}\n+\n+@media (max-width: 767px) {\n+  .hidden-desktop {\n+    display: inherit !important;\n+  }\n+  .visible-desktop {\n+    display: none !important;\n+  }\n+  .visible-phone {\n+    display: inherit !important;\n+  }\n+  .hidden-phone {\n+    display: none !important;\n+  }\n+}\n+\n+.visible-print {\n+  display: none !important;\n+}\n+\n+@media print {\n+  .visible-print {\n+    display: inherit !important;\n+  }\n+  .hidden-print {\n+    display: none !important;\n+  }\n+}\n+\n+@media (min-width: 1200px) {\n+  .row {\n+    margin-left: -30px;\n+    *zoom: 1;\n+  }\n+  .row:before,\n+  .row:after {\n+    display: table;\n+    line-height: 0;\n+    content: "";\n+  }\n+  .row:after {\n+    clear: both;\n+  }\n+  [class*="span"] {\n+    float: left;\n+    min-height: 1px;\n+    margin-left: 30px;\n+  }\n+  .container,\n+  .navbar-static-top .container,\n+  .navbar-fixed-top .container,\n+  .navbar-fixed-bottom .container {\n+    width: 1170px;\n+  }\n+  .span12 {\n+    width: 1170px;\n+  }\n+  .span11 {\n+    width: 1070px;\n+  }\n+  .span10 {\n+    width: 970px;\n+  }\n+  .span9 {\n+    width: 870px;\n+  }\n+  .span8 {\n+    width: 770px;\n+  }\n+  .span7 {\n+    width: 670px;\n+  }\n+  .span6 {\n+    width: 570px;\n+  }\n+  .span5 {\n+    width: 470px;\n+  }\n+  .span4 {\n+    width: 370px;\n+  }\n+  .span3 {\n+    width: 270px;\n+  }\n+  .span2 {\n+    width: 170px;\n+  }\n+  .span1 {\n+    width: 70px;\n+  }\n+  .offset12 {\n+    margin-left: 1230px;\n+  }\n+  .offset11 {\n+    margin-left: 1130px;\n+  }\n+  .offset10 {\n+    margin-left: 1030px;\n+  }\n+  .offset9 {\n+    margin-left: 930px;\n+  }\n+  .offset8 {\n+    margin-left: 830px;\n+  }\n+  .offset7 {\n+    margin-left: 730px;\n+  }\n+  .offset6 {\n+    margin-left: 630px;\n+  }\n+  .offset5 {\n+    margin-left: 530px;\n+  }\n+  .offset4 {\n+    margin-left: 430px;\n+  }\n+  .offset3 {\n+    margin-left: 330px;\n+  }\n+  .offset2 {\n+    margin-left: 230px;\n+  }\n+  .offset1 {\n+    margin-left: 130px;\n+  }\n+  .row-fluid {\n+    width: 100%;\n+    *zoom: 1;\n+  }\n+  .row-fluid:before,\n+  .row-fluid:after {\n+    display: table;\n+    line-height: 0;\n+    content: "";\n+  }\n+  .row-fluid:after {\n+    clear: both;\n+  }\n+  .row-fluid [class*="span"] {\n+    display: block;\n+    float: left;\n+    width: 100%;\n+    min-height: 30px;\n+    margin-left: 2.564102564102564%;\n+    *margin-left: 2.5109110747408616%;\n+    -webkit-box-sizing: border-box;\n+       -moz-box-sizing: border-box;\n+            box-sizing: border-box;\n+  }\n+  .row-fluid [class*="span"]:first-child {\n+    margin-left: 0;\n+  }\n+  .row-fluid .controls-row [class*="span"] + [class*="span"] {\n+    margin-left: 2.564102564102564%;\n+  }\n+  .row-fluid .span12 {\n+    width: 100%;\n+    *width: 99.9468'..b'tic;\n+  }\n+}\n+\n+@media (max-width: 979px) {\n+  body {\n+    padding-top: 0;\n+  }\n+  .navbar-fixed-top,\n+  .navbar-fixed-bottom {\n+    position: static;\n+  }\n+  .navbar-fixed-top {\n+    margin-bottom: 20px;\n+  }\n+  .navbar-fixed-bottom {\n+    margin-top: 20px;\n+  }\n+  .navbar-fixed-top .navbar-inner,\n+  .navbar-fixed-bottom .navbar-inner {\n+    padding: 5px;\n+  }\n+  .navbar .container {\n+    width: auto;\n+    padding: 0;\n+  }\n+  .navbar .brand {\n+    padding-right: 10px;\n+    padding-left: 10px;\n+    margin: 0 0 0 -5px;\n+  }\n+  .nav-collapse {\n+    clear: both;\n+  }\n+  .nav-collapse .nav {\n+    float: none;\n+    margin: 0 0 10px;\n+  }\n+  .nav-collapse .nav > li {\n+    float: none;\n+  }\n+  .nav-collapse .nav > li > a {\n+    margin-bottom: 2px;\n+  }\n+  .nav-collapse .nav > .divider-vertical {\n+    display: none;\n+  }\n+  .nav-collapse .nav .nav-header {\n+    color: #777777;\n+    text-shadow: none;\n+  }\n+  .nav-collapse .nav > li > a,\n+  .nav-collapse .dropdown-menu a {\n+    padding: 9px 15px;\n+    font-weight: bold;\n+    color: #777777;\n+    -webkit-border-radius: 3px;\n+       -moz-border-radius: 3px;\n+            border-radius: 3px;\n+  }\n+  .nav-collapse .btn {\n+    padding: 4px 10px 4px;\n+    font-weight: normal;\n+    -webkit-border-radius: 4px;\n+       -moz-border-radius: 4px;\n+            border-radius: 4px;\n+  }\n+  .nav-collapse .dropdown-menu li + li a {\n+    margin-bottom: 2px;\n+  }\n+  .nav-collapse .nav > li > a:hover,\n+  .nav-collapse .nav > li > a:focus,\n+  .nav-collapse .dropdown-menu a:hover,\n+  .nav-collapse .dropdown-menu a:focus {\n+    background-color: #f2f2f2;\n+  }\n+  .navbar-inverse .nav-collapse .nav > li > a,\n+  .navbar-inverse .nav-collapse .dropdown-menu a {\n+    color: #999999;\n+  }\n+  .navbar-inverse .nav-collapse .nav > li > a:hover,\n+  .navbar-inverse .nav-collapse .nav > li > a:focus,\n+  .navbar-inverse .nav-collapse .dropdown-menu a:hover,\n+  .navbar-inverse .nav-collapse .dropdown-menu a:focus {\n+    background-color: #111111;\n+  }\n+  .nav-collapse.in .btn-group {\n+    padding: 0;\n+    margin-top: 5px;\n+  }\n+  .nav-collapse .dropdown-menu {\n+    position: static;\n+    top: auto;\n+    left: auto;\n+    display: none;\n+    float: none;\n+    max-width: none;\n+    padding: 0;\n+    margin: 0 15px;\n+    background-color: transparent;\n+    border: none;\n+    -webkit-border-radius: 0;\n+       -moz-border-radius: 0;\n+            border-radius: 0;\n+    -webkit-box-shadow: none;\n+       -moz-box-shadow: none;\n+            box-shadow: none;\n+  }\n+  .nav-collapse .open > .dropdown-menu {\n+    display: block;\n+  }\n+  .nav-collapse .dropdown-menu:before,\n+  .nav-collapse .dropdown-menu:after {\n+    display: none;\n+  }\n+  .nav-collapse .dropdown-menu .divider {\n+    display: none;\n+  }\n+  .nav-collapse .nav > li > .dropdown-menu:before,\n+  .nav-collapse .nav > li > .dropdown-menu:after {\n+    display: none;\n+  }\n+  .nav-collapse .navbar-form,\n+  .nav-collapse .navbar-search {\n+    float: none;\n+    padding: 10px 15px;\n+    margin: 10px 0;\n+    border-top: 1px solid #f2f2f2;\n+    border-bottom: 1px solid #f2f2f2;\n+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n+       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n+            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n+  }\n+  .navbar-inverse .nav-collapse .navbar-form,\n+  .navbar-inverse .nav-collapse .navbar-search {\n+    border-top-color: #111111;\n+    border-bottom-color: #111111;\n+  }\n+  .navbar .nav-collapse .nav.pull-right {\n+    float: none;\n+    margin-left: 0;\n+  }\n+  .nav-collapse,\n+  .nav-collapse.collapse {\n+    height: 0;\n+    overflow: hidden;\n+  }\n+  .navbar .btn-navbar {\n+    display: block;\n+  }\n+  .navbar-static .navbar-inner {\n+    padding-right: 10px;\n+    padding-left: 10px;\n+  }\n+}\n+\n+@media (min-width: 980px) {\n+  .nav-collapse.collapse {\n+    height: auto !important;\n+    overflow: visible !important;\n+  }\n+}\n'
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/css/bootstrap-table.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/css/bootstrap-table.css Mon Jan 28 11:57:15 2019 -0500
[
@@ -0,0 +1,313 @@
+/**
+ * @author zhixin wen <wenzhixin2010@gmail.com>
+ * version: 1.11.1
+ * https://github.com/wenzhixin/bootstrap-table/
+ */
+
+.bootstrap-table .table {
+    margin-bottom: 0 !important;
+    border-bottom: 1px solid #dddddd;
+    border-collapse: collapse !important;
+    border-radius: 1px;
+}
+
+.bootstrap-table .table:not(.table-condensed),
+.bootstrap-table .table:not(.table-condensed) > tbody > tr > th,
+.bootstrap-table .table:not(.table-condensed) > tfoot > tr > th,
+.bootstrap-table .table:not(.table-condensed) > thead > tr > td,
+.bootstrap-table .table:not(.table-condensed) > tbody > tr > td,
+.bootstrap-table .table:not(.table-condensed) > tfoot > tr > td {
+    padding: 8px;
+}
+
+.bootstrap-table .table.table-no-bordered > thead > tr > th,
+.bootstrap-table .table.table-no-bordered > tbody > tr > td {
+    border-right: 2px solid transparent;
+}
+
+.bootstrap-table .table.table-no-bordered > tbody > tr > td:last-child {
+    border-right: none;
+}
+
+.fixed-table-container {
+    position: relative;
+    clear: both;
+    border: 1px solid #dddddd;
+    border-radius: 4px;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+}
+
+.fixed-table-container.table-no-bordered {
+    border: 1px solid transparent;
+}
+
+.fixed-table-footer,
+.fixed-table-header {
+    overflow: hidden;
+}
+
+.fixed-table-footer {
+    border-top: 1px solid #dddddd;
+}
+
+.fixed-table-body {
+    overflow-x: auto;
+    overflow-y: auto;
+    height: 100%;
+}
+
+.fixed-table-container table {
+    width: 100%;
+}
+
+.fixed-table-container thead th {
+    height: 0;
+    padding: 0;
+    margin: 0;
+    border-left: 1px solid #dddddd;
+}
+
+.fixed-table-container thead th:focus {
+    outline: 0 solid transparent;
+}
+
+.fixed-table-container thead th:first-child {
+    border-left: none;
+    border-top-left-radius: 4px;
+    -webkit-border-top-left-radius: 4px;
+    -moz-border-radius-topleft: 4px;
+}
+
+.fixed-table-container thead th .th-inner,
+.fixed-table-container tbody td .th-inner {
+    padding: 8px;
+    line-height: 24px;
+    vertical-align: top;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.fixed-table-container thead th .sortable {
+    cursor: pointer;
+    background-position: right;
+    background-repeat: no-repeat;
+    padding-right: 30px;
+}
+
+.fixed-table-container thead th .both {
+    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC');
+}
+
+.fixed-table-container thead th .asc {
+    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==');
+}
+
+.fixed-table-container thead th .desc {
+    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= ');
+}
+
+.fixed-table-container th.detail {
+    width: 30px;
+}
+
+.fixed-table-container tbody td {
+    border-left: 1px solid #dddddd;
+}
+
+.fixed-table-container tbody tr:first-child td {
+    border-top: none;
+}
+
+.fixed-table-container tbody td:first-child {
+    border-left: none;
+}
+
+/* the same color with .active */
+.fixed-table-container tbody .selected td {
+    background-color: #f5f5f5;
+}
+
+.fixed-table-container .bs-checkbox {
+    text-align: center;
+}
+
+.fixed-table-container .bs-checkbox .th-inner {
+    padding: 8px 0;
+}
+
+.fixed-table-container input[type="radio"],
+.fixed-table-container input[type="checkbox"] {
+    margin: 0 auto !important;
+}
+
+.fixed-table-container .no-records-found {
+    text-align: center;
+}
+
+.fixed-table-pagination div.pagination,
+.fixed-table-pagination .pagination-detail {
+    margin-top: 10px;
+    margin-bottom: 10px;
+}
+
+.fixed-table-pagination div.pagination .pagination {
+    margin: 0;
+}
+
+.fixed-table-pagination .pagination a {
+    padding: 6px 12px;
+    line-height: 1.428571429;
+}
+
+.fixed-table-pagination .pagination-info {
+    line-height: 34px;
+    margin-right: 5px;
+}
+
+.fixed-table-pagination .btn-group {
+    position: relative;
+    display: inline-block;
+    vertical-align: middle;
+}
+
+.fixed-table-pagination .dropup .dropdown-menu {
+    margin-bottom: 0;
+}
+
+.fixed-table-pagination .page-list {
+    display: inline-block;
+}
+
+.fixed-table-toolbar .columns-left {
+    margin-right: 5px;
+}
+
+.fixed-table-toolbar .columns-right {
+    margin-left: 5px;
+}
+
+.fixed-table-toolbar .columns label {
+    display: block;
+    padding: 3px 20px;
+    clear: both;
+    font-weight: normal;
+    line-height: 1.428571429;
+}
+
+.fixed-table-toolbar .bs-bars,
+.fixed-table-toolbar .search,
+.fixed-table-toolbar .columns {
+    position: relative;
+    margin-top: 10px;
+    margin-bottom: 10px;
+    line-height: 34px;
+}
+
+.fixed-table-pagination li.disabled a {
+    pointer-events: none;
+    cursor: default;
+}
+
+.fixed-table-loading {
+    display: none;
+    position: absolute;
+    top: 42px;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 99;
+    background-color: #fff;
+    text-align: center;
+}
+
+.fixed-table-body .card-view .title {
+    font-weight: bold;
+    display: inline-block;
+    min-width: 30%;
+    text-align: left !important;
+}
+
+/* support bootstrap 2 */
+.fixed-table-body thead th .th-inner {
+    box-sizing: border-box;
+}
+
+.table th, .table td {
+    vertical-align: middle;
+    box-sizing: border-box;
+}
+
+.fixed-table-toolbar .dropdown-menu {
+    text-align: left;
+    max-height: 300px;
+    overflow: auto;
+}
+
+.fixed-table-toolbar .btn-group > .btn-group {
+    display: inline-block;
+    margin-left: -1px !important;
+}
+
+.fixed-table-toolbar .btn-group > .btn-group > .btn {
+    border-radius: 0;
+}
+
+.fixed-table-toolbar .btn-group > .btn-group:first-child > .btn {
+    border-top-left-radius: 4px;
+    border-bottom-left-radius: 4px;
+}
+
+.fixed-table-toolbar .btn-group > .btn-group:last-child > .btn {
+    border-top-right-radius: 4px;
+    border-bottom-right-radius: 4px;
+}
+
+.bootstrap-table .table > thead > tr > th {
+    vertical-align: bottom;
+    border-bottom: 1px solid #ddd;
+}
+
+/* support bootstrap 3 */
+.bootstrap-table .table thead > tr > th {
+    padding: 0;
+    margin: 0;
+}
+
+.bootstrap-table .fixed-table-footer tbody > tr > td {
+    padding: 0 !important;
+}
+
+.bootstrap-table .fixed-table-footer .table {
+    border-bottom: none;
+    border-radius: 0;
+    padding: 0 !important;
+}
+
+.bootstrap-table .pull-right .dropdown-menu {
+    right: 0;
+    left: auto;
+}
+
+/* calculate scrollbar width */
+p.fixed-table-scroll-inner {
+    width: 100%;
+    height: 200px;
+}
+
+div.fixed-table-scroll-outer {
+    top: 0;
+    left: 0;
+    visibility: hidden;
+    width: 200px;
+    height: 150px;
+    overflow: hidden;
+}
+
+/* for get correct heights  */
+.fixed-table-toolbar:after, .fixed-table-pagination:after {
+    content: "";
+    display: block;
+    clear: both;
+}
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/css/bootstrap.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/css/bootstrap.css Mon Jan 28 11:57:15 2019 -0500
[
b'@@ -0,0 +1,6167 @@\n+/*!\n+ * Bootstrap v2.3.2\n+ *\n+ * Copyright 2012 Twitter, Inc\n+ * Licensed under the Apache License v2.0\n+ * http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Designed and built with all the love in the world @twitter by @mdo and @fat.\n+ */\n+\n+.clearfix {\n+  *zoom: 1;\n+}\n+\n+.clearfix:before,\n+.clearfix:after {\n+  display: table;\n+  line-height: 0;\n+  content: "";\n+}\n+\n+.clearfix:after {\n+  clear: both;\n+}\n+\n+.hide-text {\n+  font: 0/0 a;\n+  color: transparent;\n+  text-shadow: none;\n+  background-color: transparent;\n+  border: 0;\n+}\n+\n+.input-block-level {\n+  display: block;\n+  width: 100%;\n+  min-height: 30px;\n+  -webkit-box-sizing: border-box;\n+     -moz-box-sizing: border-box;\n+          box-sizing: border-box;\n+}\n+\n+article,\n+aside,\n+details,\n+figcaption,\n+figure,\n+footer,\n+header,\n+hgroup,\n+nav,\n+section {\n+  display: block;\n+}\n+\n+audio,\n+canvas,\n+video {\n+  display: inline-block;\n+  *display: inline;\n+  *zoom: 1;\n+}\n+\n+audio:not([controls]) {\n+  display: none;\n+}\n+\n+html {\n+  font-size: 100%;\n+  -webkit-text-size-adjust: 100%;\n+      -ms-text-size-adjust: 100%;\n+}\n+\n+a:focus {\n+  outline: thin dotted #333;\n+  outline: 5px auto -webkit-focus-ring-color;\n+  outline-offset: -2px;\n+}\n+\n+a:hover,\n+a:active {\n+  outline: 0;\n+}\n+\n+sub,\n+sup {\n+  position: relative;\n+  font-size: 75%;\n+  line-height: 0;\n+  vertical-align: baseline;\n+}\n+\n+sup {\n+  top: -0.5em;\n+}\n+\n+sub {\n+  bottom: -0.25em;\n+}\n+\n+img {\n+  width: auto\\9;\n+  height: auto;\n+  max-width: 100%;\n+  vertical-align: middle;\n+  border: 0;\n+  -ms-interpolation-mode: bicubic;\n+}\n+\n+#map_canvas img,\n+.google-maps img {\n+  max-width: none;\n+}\n+\n+button,\n+input,\n+select,\n+textarea {\n+  margin: 0;\n+  font-size: 100%;\n+  vertical-align: middle;\n+}\n+\n+button,\n+input {\n+  *overflow: visible;\n+  line-height: normal;\n+}\n+\n+button::-moz-focus-inner,\n+input::-moz-focus-inner {\n+  padding: 0;\n+  border: 0;\n+}\n+\n+button,\n+html input[type="button"],\n+input[type="reset"],\n+input[type="submit"] {\n+  cursor: pointer;\n+  -webkit-appearance: button;\n+}\n+\n+label,\n+select,\n+button,\n+input[type="button"],\n+input[type="reset"],\n+input[type="submit"],\n+input[type="radio"],\n+input[type="checkbox"] {\n+  cursor: pointer;\n+}\n+\n+input[type="search"] {\n+  -webkit-box-sizing: content-box;\n+     -moz-box-sizing: content-box;\n+          box-sizing: content-box;\n+  -webkit-appearance: textfield;\n+}\n+\n+input[type="search"]::-webkit-search-decoration,\n+input[type="search"]::-webkit-search-cancel-button {\n+  -webkit-appearance: none;\n+}\n+\n+textarea {\n+  overflow: auto;\n+  vertical-align: top;\n+}\n+\n+@media print {\n+  * {\n+    color: #000 !important;\n+    text-shadow: none !important;\n+    background: transparent !important;\n+    box-shadow: none !important;\n+  }\n+  a,\n+  a:visited {\n+    text-decoration: underline;\n+  }\n+  a[href]:after {\n+    content: " (" attr(href) ")";\n+  }\n+  abbr[title]:after {\n+    content: " (" attr(title) ")";\n+  }\n+  .ir a:after,\n+  a[href^="javascript:"]:after,\n+  a[href^="#"]:after {\n+    content: "";\n+  }\n+  pre,\n+  blockquote {\n+    border: 1px solid #999;\n+    page-break-inside: avoid;\n+  }\n+  thead {\n+    display: table-header-group;\n+  }\n+  tr,\n+  img {\n+    page-break-inside: avoid;\n+  }\n+  img {\n+    max-width: 100% !important;\n+  }\n+  @page  {\n+    margin: 0.5cm;\n+  }\n+  p,\n+  h2,\n+  h3 {\n+    orphans: 3;\n+    widows: 3;\n+  }\n+  h2,\n+  h3 {\n+    page-break-after: avoid;\n+  }\n+}\n+\n+body {\n+  margin: 0;\n+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;\n+  font-size: 14px;\n+  line-height: 20px;\n+  color: #333333;\n+  background-color: #ffffff;\n+}\n+\n+a {\n+  color: #0088cc;\n+  text-decoration: none;\n+}\n+\n+a:hover,\n+a:focus {\n+  color: #005580;\n+  text-decoration: underline;\n+}\n+\n+.img-rounded {\n+  -webkit-border-radius: 6px;\n+     -moz-border-radius: 6px;\n+          border-radius: 6px;\n+}\n+\n+.img-polaroid {\n+  padding: 4px;\n+  background-color: #fff;\n+  border: 1px solid #ccc;\n+  border: 1px solid rgba(0, 0, 0, 0.2);\n+  -webkit-box-shadow: 0 1px 3'..b', 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n+}\n+\n+.accordion {\n+  margin-bottom: 20px;\n+}\n+\n+.accordion-group {\n+  margin-bottom: 2px;\n+  border: 1px solid #e5e5e5;\n+  -webkit-border-radius: 4px;\n+     -moz-border-radius: 4px;\n+          border-radius: 4px;\n+}\n+\n+.accordion-heading {\n+  border-bottom: 0;\n+}\n+\n+.accordion-heading .accordion-toggle {\n+  display: block;\n+  padding: 8px 15px;\n+}\n+\n+.accordion-toggle {\n+  cursor: pointer;\n+}\n+\n+.accordion-inner {\n+  padding: 9px 15px;\n+  border-top: 1px solid #e5e5e5;\n+}\n+\n+.carousel {\n+  position: relative;\n+  margin-bottom: 20px;\n+  line-height: 1;\n+}\n+\n+.carousel-inner {\n+  position: relative;\n+  width: 100%;\n+  overflow: hidden;\n+}\n+\n+.carousel-inner > .item {\n+  position: relative;\n+  display: none;\n+  -webkit-transition: 0.6s ease-in-out left;\n+     -moz-transition: 0.6s ease-in-out left;\n+       -o-transition: 0.6s ease-in-out left;\n+          transition: 0.6s ease-in-out left;\n+}\n+\n+.carousel-inner > .item > img,\n+.carousel-inner > .item > a > img {\n+  display: block;\n+  line-height: 1;\n+}\n+\n+.carousel-inner > .active,\n+.carousel-inner > .next,\n+.carousel-inner > .prev {\n+  display: block;\n+}\n+\n+.carousel-inner > .active {\n+  left: 0;\n+}\n+\n+.carousel-inner > .next,\n+.carousel-inner > .prev {\n+  position: absolute;\n+  top: 0;\n+  width: 100%;\n+}\n+\n+.carousel-inner > .next {\n+  left: 100%;\n+}\n+\n+.carousel-inner > .prev {\n+  left: -100%;\n+}\n+\n+.carousel-inner > .next.left,\n+.carousel-inner > .prev.right {\n+  left: 0;\n+}\n+\n+.carousel-inner > .active.left {\n+  left: -100%;\n+}\n+\n+.carousel-inner > .active.right {\n+  left: 100%;\n+}\n+\n+.carousel-control {\n+  position: absolute;\n+  top: 40%;\n+  left: 15px;\n+  width: 40px;\n+  height: 40px;\n+  margin-top: -20px;\n+  font-size: 60px;\n+  font-weight: 100;\n+  line-height: 30px;\n+  color: #ffffff;\n+  text-align: center;\n+  background: #222222;\n+  border: 3px solid #ffffff;\n+  -webkit-border-radius: 23px;\n+     -moz-border-radius: 23px;\n+          border-radius: 23px;\n+  opacity: 0.5;\n+  filter: alpha(opacity=50);\n+}\n+\n+.carousel-control.right {\n+  right: 15px;\n+  left: auto;\n+}\n+\n+.carousel-control:hover,\n+.carousel-control:focus {\n+  color: #ffffff;\n+  text-decoration: none;\n+  opacity: 0.9;\n+  filter: alpha(opacity=90);\n+}\n+\n+.carousel-indicators {\n+  position: absolute;\n+  top: 15px;\n+  right: 15px;\n+  z-index: 5;\n+  margin: 0;\n+  list-style: none;\n+}\n+\n+.carousel-indicators li {\n+  display: block;\n+  float: left;\n+  width: 10px;\n+  height: 10px;\n+  margin-left: 5px;\n+  text-indent: -999px;\n+  background-color: #ccc;\n+  background-color: rgba(255, 255, 255, 0.25);\n+  border-radius: 5px;\n+}\n+\n+.carousel-indicators .active {\n+  background-color: #fff;\n+}\n+\n+.carousel-caption {\n+  position: absolute;\n+  right: 0;\n+  bottom: 0;\n+  left: 0;\n+  padding: 15px;\n+  background: #333333;\n+  background: rgba(0, 0, 0, 0.75);\n+}\n+\n+.carousel-caption h4,\n+.carousel-caption p {\n+  line-height: 20px;\n+  color: #ffffff;\n+}\n+\n+.carousel-caption h4 {\n+  margin: 0 0 5px;\n+}\n+\n+.carousel-caption p {\n+  margin-bottom: 0;\n+}\n+\n+.hero-unit {\n+  padding: 60px;\n+  margin-bottom: 30px;\n+  font-size: 18px;\n+  font-weight: 200;\n+  line-height: 30px;\n+  color: inherit;\n+  background-color: #eeeeee;\n+  -webkit-border-radius: 6px;\n+     -moz-border-radius: 6px;\n+          border-radius: 6px;\n+}\n+\n+.hero-unit h1 {\n+  margin-bottom: 0;\n+  font-size: 60px;\n+  line-height: 1;\n+  letter-spacing: -1px;\n+  color: inherit;\n+}\n+\n+.hero-unit li {\n+  line-height: 30px;\n+}\n+\n+.pull-right {\n+  float: right;\n+}\n+\n+.pull-left {\n+  float: left;\n+}\n+\n+.hide {\n+  display: none;\n+}\n+\n+.show {\n+  display: block;\n+}\n+\n+.invisible {\n+  visibility: hidden;\n+}\n+\n+.affix {\n+  position: fixed;\n+}\n'
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/html.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/html.pm Mon Jan 28 11:57:15 2019 -0500
[
b'@@ -0,0 +1,926 @@\n+package sRNAPipe::html;\n+\n+use strict;\n+use warnings;\n+use File::Basename;\n+use File::Copy::Recursive qw( dircopy );\n+\n+use Exporter;\n+our @ISA = qw( Exporter );\n+our @EXPORT_OK = qw( &main_page &details_pages &menu_page &ppp_page &copy_css &copy_js );\n+\n+sub main_page\n+{\n+  my ( $dir, $file, $list_mainTabP, $current, $ma, $ma_uni, $dir_root ) = @_;\n+  my ( $futHashP, $uniqueTabP, $randTabP, $pngTabP ) = get_genome ( $dir, $dir_root );\n+\n+  open my $h, \'>\', $file || die "cannot create $file $!\\n";\n+  header ( $h );\n+  navbar ( $h, $list_mainTabP, $current );\n+  print $h "<div class=\\"container\\"><p><a class=\\"btn\\" href=\\"$current-sub.html\\">View details &raquo;</a></p></div>\\n";\n+  futurette( $h, $current, $pngTabP, $futHashP );\n+  print  $h "<div class=\\"container\\"><h2>mappers #: $ma</h2><h2>unique mappers #: $ma_uni</h2> </div>\\n";\n+  carousel2( $h, $uniqueTabP, $randTabP, $dir_root );\n+  footer($h);\n+  close $h;\n+}\n+\n+sub menu_page\n+{\n+  my ( $dir, $file, $list_mainTabP, $current, $min, $max, $simin, $simax, $pimin, $pimax, $dir_root ) = @_;\n+  my $html_ref = $1 if $dir =~ /$dir_root(.*)/;\n+  open my $h, \'>\', $file || die "cannot create $file $!\\n";\n+  header($h);\n+  navbar ( $h, $list_mainTabP, $current );\n+  span( $h, $current, $min, $max, $simin, $simax, $pimin, $pimax );\n+  print $h "  <div class=\\"container\\"> <div class=\\"row text-center\\">  <img  src=\\"$html_ref/pie_chart.png\\"/><br />\\n";\n+  print $h "  <A HREF=\\"$html_ref/repartition.txt\\">text file</A><br/>\\n </div></div>";\n+  footer($h);\n+  close $h;\n+}\n+\n+sub details_pages\n+{\n+  my ( $dir_details, $prefix, $list_mainTabP, $current, $misTE, $dir_root, $ppp ) = @_;\n+  my ($Hex, $HTE, $HG, $NonUniTE, $NonUniG, $UniG ) = get_subgroups( $dir_details, $current, $misTE, $dir_root );\n+\n+  my $html_ref = $1.\'-PPP.html\' if $prefix =~ /$dir_root(.*)/;\n+  open my $h, \'>\',  $prefix.\'-TEs.html\' || die "cannot create  $prefix-TEs.html $!\\n";\n+  header($h);\n+  navbar ( $h, $list_mainTabP, $current );\n+  if ( $prefix =~ /piRNAs$/ && $ppp eq \'true\' )\n+  {\n+    print $h " <div class=\\"container\\">";\n+    print $h " <p><a class=\\"btn\\" href=\\"$html_ref\\">Ping Pong Partners</a></p>\\n";\n+    print $h "</div>";\n+  }\n+  fut($h,\'Transposable elements\',$HTE);\n+  carousel($h,$NonUniTE,$dir_root);\n+  footer($h);\n+  close $h;\n+\n+  open $h, \'>\',  $prefix.\'-genome.html\' || die "cannot create  $prefix-genome.html $!\\n";\n+  header($h);\n+  navbar ( $h, $list_mainTabP, $current );\n+  fut($h,\'Genome\',$HG);\n+  carousel2($h,$UniG, $NonUniG,$dir_root);\n+  footer($h);\n+  close $h;\n+\n+  open  $h, \'>\',  $prefix.\'-transcripts.html\' || die "cannot create  $prefix-transcripts.html $!\\n";\n+  header($h);\n+  navbar ( $h, $list_mainTabP, $current );\n+  fut($h,\'transcripts\',$Hex);\n+  footer($h);\n+  close $h;\n+}\n+\n+sub ppp_page\n+{\n+  my ( $dir, $file, $list_mainTabP, $current, $ppp, $dir_root ) = @_;\n+\n+  my $ppp_file = $ppp.\'ppp.txt\';\n+  open my $h, \'>\', $file || die "cannot create $file $!\\n";\n+  header($h);\n+  navbar ( $h, $list_mainTabP, $current );\n+  print $h \'<div class="container"> <table class="wb-tables table table-striped table-hover">\'."\\n";\n+  print $h \'<thead>\n+  <tr>\n+    <th data-sortable="true">ID</th>\n+    <th data-sortable="true">overlap sum</th>\n+    <th data-sortable="true">ten overlap sum</th>\n+    <th data-sortable="true">mean</th>\n+    <th data-sortable="true">standard deviation</th>\n+  \t<th data-sortable="true">z-score</th>\n+  \t<th data-sortable="true">p-value</th>\n+\t</tr>\n+  </thead>\n+  <tbody>\';\n+\n+  open my $f, \'<\', $ppp_file || die "cannot open $ppp_file  $!\\n";\n+  while ( <$f> )\n+  {\n+    chomp;\n+    print $h \'<tr>\';\n+    my ( $id, $sum, $ten, $mean, $sd, $zscore, $prob) = split /\\t/, $_;\n+    if( -d "$ppp/$id" )\n+    {\n+      my $sub_html = $ppp.$id.\'.html\';\n+      my $sub_html_ref = $1.$id if $ppp =~ /$dir_root(.*)/;\n+      print $h "<td> <a href=\\"$sub_html_ref.html\\">$id</a> </td>";\n+\n+      open my $sub, \'>\', $sub_html || die "cannot create $sub_html\\n";\n+'..b'=~ /.*($name-subgroups-bonafide_reads-TE-.*distribution-.*\\.png)/ )\n+    {\n+      my $tmp = $1;\n+      push @out, $1;\n+    }\n+  }\n+  return (\\@out);\n+}\n+\n+sub get_PPP\n+{\n+  my ($dir,$name) = @_;\n+  my (%distri,@group);\n+  my $group = "\'$dir\'".\'/\'."\'$name\'".\'-subgroups-bonafide_reads-TE-PPPartners-*\';\n+  @group = glob $group;\n+\n+  foreach (my $g =0; $g <= $#group; $g++)\n+  {\n+    if ($group[$g] =~ /.*($name-subgroups-bonafide_reads-TE-PPPartners-.*)/ )\n+    {\n+      my $tmp = $1;\n+      if ($tmp =~ /PPPartners-(.*?)-sens\\.txt$/)\n+      {\n+        $distri{$1} = [\'\',\'\',\'\',\'\',\'\',\'\'] unless exists $distri{$1};\n+        $distri{$1}->[0] = $tmp;\n+      }\n+      elsif ($tmp =~ /PPPartners-(.*?)-antisens\\.txt$/)\n+      {\n+        $distri{$1} = [\'\',\'\',\'\',\'\',\'\',\'\'] unless exists $distri{$1};\n+        $distri{$1}->[1] = $tmp;\n+      }\n+      elsif ($tmp =~ /PPPartners-(.*?)-sensPPP\\.txt$/)\n+      {\n+        $distri{$1} = [\'\',\'\',\'\',\'\',\'\',\'\'] unless exists $distri{$1};\n+        $distri{$1}->[2] = $tmp;\n+      }\n+      elsif ($tmp =~ /PPPartners-(.*?)-antisensPPP\\.txt$/)\n+      {\n+        $distri{$1} = [\'\',\'\',\'\',\'\',\'\',\'\'] unless exists $distri{$1};\n+        $distri{$1}->[3] = $tmp;\n+      }\n+      elsif ($tmp =~ /PPPartners-(.*?)-overlap_size\\.txt$/)\n+      {\n+        $distri{$1} = [\'\',\'\',\'\',\'\',\'\',\'\'] unless exists $distri{$1};\n+        $distri{$1}->[4] = $tmp;\n+      }\n+      elsif ($tmp =~ /PPPartners-(.*?)-histogram\\.png$/)\n+      {\n+        $distri{$1} = [\'\',\'\',\'\',\'\',\'\',\'\'] unless exists $distri{$1};\n+        $distri{$1}->[5] = $tmp;\n+      }\n+    }\n+  }\n+  return \\%distri;\n+}\n+\n+sub PPPrint\n+{\n+  my ($h, $hash) = @_;\n+  my $cmp = 0;\n+\n+  print $h "<div class=\\"container\\">\\n";\n+  print $h "<div class=\\"row text-center\\">";\n+  while ( my ($k,$v) = each %{$hash} )\n+  {\n+    print $h "</div><div class=\\"row text-center\\">" if $cmp != 0 && $cmp % 2 == 0;\n+    print $h "\n+    \n+    <div class=\\"span6\\">\n+    <h2>$k</h2>\n+    <p class=\\"featurette-p\\"> <img src=\\"$v->[5]\\"/></p>\n+    <p class=\\"featurette-p\\"><a href=\\"$v->[4]\\">ping pong signature</a></p>\n+    <p class=\\"featurette-p\\"><a href=\\"$v->[2]\\">sense reads with PPP</a></p>\n+    <p class=\\"featurette-p\\"><a href=\\"$v->[3]\\">reverse reads  with PPP</a></p>\n+    <p class=\\"featurette-p\\"><a href=\\"$v->[0]\\">sense reads without PPP</a></p>\n+    <p class=\\"featurette-p\\"><a href=\\"$v->[1]\\">reverse reads without PPP</a></p>\n+    </div>\n+    ";\n+    $cmp++;\n+  }\n+\n+  print $h "</div></div>";\n+}\n+\n+sub printDistri\n+{\n+  my ($h, $tab) = @_;\n+  my ($txt, $name);\n+  my $cmp = 0;\n+  print $h "<div class=\\"container\\">\\n";\n+  print $h "<div class=\\"row text-center\\">";\n+  foreach my $k (@{$tab})\n+  {\n+    if ($k =~ /(.*)-(.*)\\.png$/)\n+    {\n+      $txt = $1.\'-\'.$2.\'.txt\';\n+      $name = $2;\n+    }\n+    print $h "</div><div class=\\"row text-center\\">" if $cmp != 0 && $cmp % 2 == 0;\n+    print $h "\n+    \n+    <div class=\\"span6\\">\n+    <h2>$name</h2>\n+    <p> <img src=\\"$k\\"/></p>\n+    <p class=\\"featurette-p\\"><a href=\\"$txt\\">text file</a></p>\n+    </div>\n+    ";\n+    $cmp++;\n+  }\n+\n+  print $h "</div></div>";\n+}\n+\n+sub mapnum\n+{\n+  my $dupmapnum = shift;\n+  my $dupnum_genome = shift;\n+  open (my $dupTE, $dupmapnum) || die "cannot open ".$dupmapnum."\\n";\n+  my %dupnum_TE = ();\n+  my $header = <$dupTE>;\n+  while (<$dupTE>)\n+  {\n+    chomp $_;\n+    my @dupline = split /\\t/, $_;\n+    $dupnum_TE{$dupline[0]} = $dupline[2];\n+  }\n+  close $dupTE;\n+  open (my $du_TE, \'>\'.$dupmapnum) || die "cannot open to write ".$dupmapnum."\\n";\n+  print $du_TE "sequence\\tduplicate\\tgenome map num\\tmap num\\n";\n+  while (my ($k, $v) = each %dupnum_TE )\n+  {\n+    my $hashRef = ${$dupnum_genome}{$k};\n+    print $du_TE "$k\\t$hashRef->[0]\\t$hashRef->[1]\\t$v\\n";\n+  }\n+  close $du_TE;\n+}\n+\n+sub copy_css\n+{\n+  my $dir = shift;\n+  my $path = dirname(__FILE__);\n+  dircopy( $path.\'/css\', $dir.\'/css\' );\n+}\n+\n+\n+sub copy_js\n+{\n+  my $dir = shift;\n+  my $path = dirname(__FILE__);\n+  dircopy( $path.\'/js\', $dir.\'/js\' );\n+}\n+\n+1;\n'
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/js/bootstrap-table.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/js/bootstrap-table.js Mon Jan 28 11:57:15 2019 -0500
[
b"@@ -0,0 +1,3094 @@\n+/**\n+ * @author zhixin wen <wenzhixin2010@gmail.com>\n+ * version: 1.11.1\n+ * https://github.com/wenzhixin/bootstrap-table/\n+ */\n+\n+(function ($) {\n+    'use strict';\n+\n+    // TOOLS DEFINITION\n+    // ======================\n+\n+    var cachedWidth = null;\n+\n+    // it only does '%s', and return '' when arguments are undefined\n+    var sprintf = function (str) {\n+        var args = arguments,\n+            flag = true,\n+            i = 1;\n+\n+        str = str.replace(/%s/g, function () {\n+            var arg = args[i++];\n+\n+            if (typeof arg === 'undefined') {\n+                flag = false;\n+                return '';\n+            }\n+            return arg;\n+        });\n+        return flag ? str : '';\n+    };\n+\n+    var getPropertyFromOther = function (list, from, to, value) {\n+        var result = '';\n+        $.each(list, function (i, item) {\n+            if (item[from] === value) {\n+                result = item[to];\n+                return false;\n+            }\n+            return true;\n+        });\n+        return result;\n+    };\n+\n+    var getFieldIndex = function (columns, field) {\n+        var index = -1;\n+\n+        $.each(columns, function (i, column) {\n+            if (column.field === field) {\n+                index = i;\n+                return false;\n+            }\n+            return true;\n+        });\n+        return index;\n+    };\n+\n+    // http://jsfiddle.net/wenyi/47nz7ez9/3/\n+    var setFieldIndex = function (columns) {\n+        var i, j, k,\n+            totalCol = 0,\n+            flag = [];\n+\n+        for (i = 0; i < columns[0].length; i++) {\n+            totalCol += columns[0][i].colspan || 1;\n+        }\n+\n+        for (i = 0; i < columns.length; i++) {\n+            flag[i] = [];\n+            for (j = 0; j < totalCol; j++) {\n+                flag[i][j] = false;\n+            }\n+        }\n+\n+        for (i = 0; i < columns.length; i++) {\n+            for (j = 0; j < columns[i].length; j++) {\n+                var r = columns[i][j],\n+                    rowspan = r.rowspan || 1,\n+                    colspan = r.colspan || 1,\n+                    index = $.inArray(false, flag[i]);\n+\n+                if (colspan === 1) {\n+                    r.fieldIndex = index;\n+                    // when field is undefined, use index instead\n+                    if (typeof r.field === 'undefined') {\n+                        r.field = index;\n+                    }\n+                }\n+\n+                for (k = 0; k < rowspan; k++) {\n+                    flag[i + k][index] = true;\n+                }\n+                for (k = 0; k < colspan; k++) {\n+                    flag[i][index + k] = true;\n+                }\n+            }\n+        }\n+    };\n+\n+    var getScrollBarWidth = function () {\n+        if (cachedWidth === null) {\n+            var inner = $('<p/>').addClass('fixed-table-scroll-inner'),\n+                outer = $('<div/>').addClass('fixed-table-scroll-outer'),\n+                w1, w2;\n+\n+            outer.append(inner);\n+            $('body').append(outer);\n+\n+            w1 = inner[0].offsetWidth;\n+            outer.css('overflow', 'scroll');\n+            w2 = inner[0].offsetWidth;\n+\n+            if (w1 === w2) {\n+                w2 = outer[0].clientWidth;\n+            }\n+\n+            outer.remove();\n+            cachedWidth = w1 - w2;\n+        }\n+        return cachedWidth;\n+    };\n+\n+    var calculateObjectValue = function (self, name, args, defaultValue) {\n+        var func = name;\n+\n+        if (typeof name === 'string') {\n+            // support obj.func1.func2\n+            var names = name.split('.');\n+\n+            if (names.length > 1) {\n+                func = window;\n+                $.each(names, function (i, f) {\n+                    func = func[f];\n+                });\n+            } else {\n+                func = window[name];\n+            }\n+        }\n+        if (typeof func === 'object') {\n+            return func;\n+        }\n+        if (typeof func === 'function') {\n+"..b' i < trs.length; i++) {\n+                this.expandRow_(true, $(trs[i]).data("index"));\n+            }\n+        }\n+    };\n+\n+    BootstrapTable.prototype.collapseAllRows = function (isSubTable) {\n+        if (isSubTable) {\n+            this.expandRow_(false, 0);\n+        } else {\n+            var trs = this.$body.children();\n+            for (var i = 0; i < trs.length; i++) {\n+                this.expandRow_(false, $(trs[i]).data("index"));\n+            }\n+        }\n+    };\n+\n+    BootstrapTable.prototype.updateFormatText = function (name, text) {\n+        if (this.options[sprintf(\'format%s\', name)]) {\n+            if (typeof text === \'string\') {\n+                this.options[sprintf(\'format%s\', name)] = function () {\n+                    return text;\n+                };\n+            } else if (typeof text === \'function\') {\n+                this.options[sprintf(\'format%s\', name)] = text;\n+            }\n+        }\n+        this.initToolbar();\n+        this.initPagination();\n+        this.initBody();\n+    };\n+\n+    // BOOTSTRAP TABLE PLUGIN DEFINITION\n+    // =======================\n+\n+    var allowedMethods = [\n+        \'getOptions\',\n+        \'getSelections\', \'getAllSelections\', \'getData\',\n+        \'load\', \'append\', \'prepend\', \'remove\', \'removeAll\',\n+        \'insertRow\', \'updateRow\', \'updateCell\', \'updateByUniqueId\', \'removeByUniqueId\',\n+        \'getRowByUniqueId\', \'showRow\', \'hideRow\', \'getHiddenRows\',\n+        \'mergeCells\',\n+        \'checkAll\', \'uncheckAll\', \'checkInvert\',\n+        \'check\', \'uncheck\',\n+        \'checkBy\', \'uncheckBy\',\n+        \'refresh\',\n+        \'resetView\',\n+        \'resetWidth\',\n+        \'destroy\',\n+        \'showLoading\', \'hideLoading\',\n+        \'showColumn\', \'hideColumn\', \'getHiddenColumns\', \'getVisibleColumns\',\n+        \'showAllColumns\', \'hideAllColumns\',\n+        \'filterBy\',\n+        \'scrollTo\',\n+        \'getScrollPosition\',\n+        \'selectPage\', \'prevPage\', \'nextPage\',\n+        \'togglePagination\',\n+        \'toggleView\',\n+        \'refreshOptions\',\n+        \'resetSearch\',\n+        \'expandRow\', \'collapseRow\', \'expandAllRows\', \'collapseAllRows\',\n+        \'updateFormatText\'\n+    ];\n+\n+    $.fn.bootstrapTable = function (option) {\n+        var value,\n+            args = Array.prototype.slice.call(arguments, 1);\n+\n+        this.each(function () {\n+            var $this = $(this),\n+                data = $this.data(\'bootstrap.table\'),\n+                options = $.extend({}, BootstrapTable.DEFAULTS, $this.data(),\n+                    typeof option === \'object\' && option);\n+\n+            if (typeof option === \'string\') {\n+                if ($.inArray(option, allowedMethods) < 0) {\n+                    throw new Error("Unknown method: " + option);\n+                }\n+\n+                if (!data) {\n+                    return;\n+                }\n+\n+                value = data[option].apply(data, args);\n+\n+                if (option === \'destroy\') {\n+                    $this.removeData(\'bootstrap.table\');\n+                }\n+            }\n+\n+            if (!data) {\n+                $this.data(\'bootstrap.table\', (data = new BootstrapTable(this, options)));\n+            }\n+        });\n+\n+        return typeof value === \'undefined\' ? this : value;\n+    };\n+\n+    $.fn.bootstrapTable.Constructor = BootstrapTable;\n+    $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS;\n+    $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS;\n+    $.fn.bootstrapTable.locales = BootstrapTable.LOCALES;\n+    $.fn.bootstrapTable.methods = allowedMethods;\n+    $.fn.bootstrapTable.utils = {\n+        sprintf: sprintf,\n+        getFieldIndex: getFieldIndex,\n+        compareObjects: compareObjects,\n+        calculateObjectValue: calculateObjectValue,\n+        getItemField: getItemField,\n+        objectKeys: objectKeys,\n+        isIEBrowser: isIEBrowser\n+    };\n+\n+    // BOOTSTRAP TABLE INIT\n+    // =======================\n+\n+    $(function () {\n+        $(\'[data-toggle="table"]\').bootstrapTable();\n+    });\n+})(jQuery);\n'
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/js/bootstrap.min.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/js/bootstrap.min.js Mon Jan 28 11:57:15 2019 -0500
[
b'@@ -0,0 +1,6 @@\n+/**\n+* Bootstrap.js v2.3.2 by @fat & @mdo\n+* Copyright 2013 Twitter, Inc.\n+* http://www.apache.org/licenses/LICENSE-2.0.txt\n+*/\n+!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t=\'[data-dismiss="alert"]\',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest(\'[data-toggle="buttons-radio"]\');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicat'..b',next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:\'<ul class="typeahead dropdown-menu"></ul>\',item:\'<li><a href="#"></a></li>\',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",\'[data-provide="typeahead"]\',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e(\'[data-spy="affix"]\').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);\n\\ No newline at end of file\n'
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/js/filter.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/js/filter.js Mon Jan 28 11:57:15 2019 -0500
[
@@ -0,0 +1,20 @@
+function search(input) {
+  // Declare variables
+  var elt, filter, uls, li, a, i;
+  elt = input.parentElement;
+  filter = input.value.toUpperCase();
+  uls = elt.getElementsByClassName('thumbs');
+
+  // Loop through all list items, and hide those who don't match the search query
+  for (j = 0; j < uls.length; j++) {
+    li = uls[j].getElementsByTagName('li');
+    for (i = 0; i < li.length; i++) {
+      a = li[i].getElementsByTagName("a")[0];
+      if (a.innerHTML.toUpperCase().indexOf(filter) > -1) {
+        li[i].style.display = "";
+      } else {
+        li[i].style.display = "none";
+      }
+    }
+  }
+}
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/js/jquery.galleriffic.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/js/jquery.galleriffic.js Mon Jan 28 11:57:15 2019 -0500
[
b"@@ -0,0 +1,979 @@\n+/**\r\n+ * jQuery Galleriffic plugin\r\n+ *\r\n+ * Copyright (c) 2008 Trent Foley (http://trentacular.com)\r\n+ * Licensed under the MIT License:\r\n+ *   http://www.opensource.org/licenses/mit-license.php\r\n+ *\r\n+ * Much thanks to primary contributer Ponticlaro (http://www.ponticlaro.com)\r\n+ */\r\n+;(function($) {\r\n+\t// Globally keep track of all images by their unique hash.  Each item is an image data object.\r\n+\tvar allImages = {};\r\n+\tvar imageCounter = 0;\r\n+\n+\t// Galleriffic static class\r\n+\t$.galleriffic = {\n+\t\tversion: '2.0.1',\n+\n+\t\t// Strips invalid characters and any leading # characters\n+\t\tnormalizeHash: function(hash) {\r\n+\t\t\treturn hash.replace(/^.*#/, '').replace(/\\?.*$/, '');\n+\t\t},\n+\n+\t\tgetImage: function(hash) {\n+\t\t\tif (!hash)\n+\t\t\t\treturn undefined;\n+\n+\t\t\thash = $.galleriffic.normalizeHash(hash);\r\n+\t\t\treturn allImages[hash];\n+\t\t},\n+\r\n+\t\t// Global function that looks up an image by its hash and displays the image.\n+\t\t// Returns false when an image is not found for the specified hash.\n+\t\t// @param {String} hash This is the unique hash value assigned to an image.\n+\t\tgotoImage: function(hash) {\r\n+\t\t\tvar imageData = $.galleriffic.getImage(hash);\r\n+\t\t\tif (!imageData)\n+\t\t\t\treturn false;\r\n+\n+\t\t\tvar gallery = imageData.gallery;\n+\t\t\tgallery.gotoImage(imageData);\n+\t\t\t\n+\t\t\treturn true;\r\n+\t\t},\n+\n+\t\t// Removes an image from its respective gallery by its hash.\n+\t\t// Returns false when an image is not found for the specified hash or the\n+\t\t// specified owner gallery does match the located images gallery.\n+\t\t// @param {String} hash This is the unique hash value assigned to an image.\n+\t\t// @param {Object} ownerGallery (Optional) When supplied, the located images\n+\t\t// gallery is verified to be the same as the specified owning gallery before\n+\t\t// performing the remove operation.\n+\t\tremoveImageByHash: function(hash, ownerGallery) {\n+\t\t\tvar imageData = $.galleriffic.getImage(hash);\n+\t\t\tif (!imageData)\n+\t\t\t\treturn false;\n+\n+\t\t\tvar gallery = imageData.gallery;\n+\t\t\tif (ownerGallery && ownerGallery != gallery)\n+\t\t\t\treturn false;\n+\n+\t\t\treturn gallery.removeImageByIndex(imageData.index);\n+\t\t}\r\n+\t};\n+\r\n+\tvar defaults = {\r\n+\t\tdelay:                     3000,\r\n+\t\tnumThumbs:                 20,\r\n+\t\tpreloadAhead:              40, // Set to -1 to preload all images\r\n+\t\tenableTopPager:            false,\r\n+\t\tenableBottomPager:         true,\r\n+\t\tmaxPagesToShow:            7,\r\n+\t\timageContainerSel:         '',\r\n+\t\tcaptionContainerSel:       '',\r\n+\t\tcontrolsContainerSel:      '',\r\n+\t\tloadingContainerSel:       '',\r\n+\t\trenderSSControls:          true,\r\n+\t\trenderNavControls:         true,\r\n+\t\tplayLinkText:              'Play',\r\n+\t\tpauseLinkText:             'Pause',\r\n+\t\tprevLinkText:              'Previous',\r\n+\t\tnextLinkText:              'Next',\r\n+\t\tnextPageLinkText:          'Next &rsaquo;',\r\n+\t\tprevPageLinkText:          '&lsaquo; Prev',\r\n+\t\tenableHistory:             false,\n+\t\tenableKeyboardNavigation:  true,\r\n+\t\tautoStart:                 false,\r\n+\t\tsyncTransitions:           false,\r\n+\t\tdefaultTransitionDuration: 1000,\r\n+\t\tonSlideChange:             undefined, // accepts a delegate like such: function(prevIndex, nextIndex) { ... }\r\n+\t\tonTransitionOut:           undefined, // accepts a delegate like such: function(slide, caption, isSync, callback) { ... }\r\n+\t\tonTransitionIn:            undefined, // accepts a delegate like such: function(slide, caption, isSync) { ... }\r\n+\t\tonPageTransitionOut:       undefined, // accepts a delegate like such: function(callback) { ... }\r\n+\t\tonPageTransitionIn:        undefined, // accepts a delegate like such: function() { ... }\n+\t\tonImageAdded:              undefined, // accepts a delegate like such: function(imageData, $li) { ... }\n+\t\tonImageRemoved:            undefined  // accepts a delegate like such: function(imageData, $li) { ... }\r\n+\t};\r\n+\n+\t// Primary Galleriffic initialization function that should be called on the thumbnail container.\r\n+\t$.fn.galleriffic = function(settings) {\r\n+\t\t//  Extend Gallery O"..b'display all thumbnails.\r\n+\t\t\tbuildPageLink: function(pager, pageNum, numPages) {\r\n+\t\t\t\tvar pageLabel = pageNum + 1;\r\n+\t\t\t\tvar currentPage = this.getCurrentPage();\r\n+\t\t\t\tif (pageNum == currentPage)\r\n+\t\t\t\t\tpager.append(\'<span class="current">\'+pageLabel+\'</span>\');\r\n+\t\t\t\telse if (pageNum < numPages) {\r\n+\t\t\t\t\tvar imageIndex = pageNum*this.numThumbs;\r\n+\t\t\t\t\tpager.append(\'<a rel="history" href="#\'+this.data[imageIndex].hash+\'" title="\'+pageLabel+\'">\'+pageLabel+\'</a>\');\r\n+\t\t\t\t}\n+\t\t\t\t\n+\t\t\t\treturn this;\r\n+\t\t\t}\r\n+\t\t});\r\n+\r\n+\t\t// Now initialize the gallery\r\n+\t\t$.extend(this, defaults, settings);\r\n+\t\t\r\n+\t\t// Verify the history plugin is available\r\n+\t\tif (this.enableHistory && !$.historyInit)\r\n+\t\t\tthis.enableHistory = false;\r\n+\t\t\r\n+\t\t// Select containers\r\n+\t\tif (this.imageContainerSel) this.$imageContainer = $(this.imageContainerSel);\r\n+\t\tif (this.captionContainerSel) this.$captionContainer = $(this.captionContainerSel);\r\n+\t\tif (this.loadingContainerSel) this.$loadingContainer = $(this.loadingContainerSel);\r\n+\n+\t\t// Initialize the thumbails\r\n+\t\tthis.initializeThumbs();\r\n+\t\t\r\n+\t\tif (this.maxPagesToShow < 3)\r\n+\t\t\tthis.maxPagesToShow = 3;\r\n+\r\n+\t\tthis.displayedPage = -1;\n+\t\tthis.currentImage = this.data[0];\r\n+\t\tvar gallery = this;\r\n+\r\n+\t\t// Hide the loadingContainer\r\n+\t\tif (this.$loadingContainer)\r\n+\t\t\tthis.$loadingContainer.hide();\r\n+\r\n+\t\t// Setup controls\r\n+\t\tif (this.controlsContainerSel) {\r\n+\t\t\tthis.$controlsContainer = $(this.controlsContainerSel).empty();\r\n+\t\t\t\r\n+\t\t\tif (this.renderSSControls) {\r\n+\t\t\t\tif (this.autoStart) {\r\n+\t\t\t\t\tthis.$controlsContainer\r\n+\t\t\t\t\t\t.append(\'<div class="ss-controls"><a href="#pause" class="pause" title="\'+this.pauseLinkText+\'">\'+this.pauseLinkText+\'</a></div>\');\r\n+\t\t\t\t} else {\r\n+\t\t\t\t\tthis.$controlsContainer\r\n+\t\t\t\t\t\t.append(\'<div class="ss-controls"><a href="#play" class="play" title="\'+this.playLinkText+\'">\'+this.playLinkText+\'</a></div>\');\r\n+\t\t\t\t}\r\n+\r\n+\t\t\t\tthis.$controlsContainer.find(\'div.ss-controls a\')\r\n+\t\t\t\t\t.click(function(e) {\r\n+\t\t\t\t\t\tgallery.toggleSlideshow();\r\n+\t\t\t\t\t\te.preventDefault();\r\n+\t\t\t\t\t\treturn false;\r\n+\t\t\t\t\t});\r\n+\t\t\t}\r\n+\t\t\r\n+\t\t\tif (this.renderNavControls) {\r\n+\t\t\t\tthis.$controlsContainer\r\n+\t\t\t\t\t.append(\'<div class="nav-controls"><a class="prev" rel="history" title="\'+this.prevLinkText+\'">\'+this.prevLinkText+\'</a><a class="next" rel="history" title="\'+this.nextLinkText+\'">\'+this.nextLinkText+\'</a></div>\')\r\n+\t\t\t\t\t.find(\'div.nav-controls a\')\r\n+\t\t\t\t\t.click(function(e) {\r\n+\t\t\t\t\t\tgallery.clickHandler(e, this);\r\n+\t\t\t\t\t});\r\n+\t\t\t}\r\n+\t\t}\r\n+\n+\t\tvar initFirstImage = !this.enableHistory || !location.hash;\n+\t\tif (this.enableHistory && location.hash) {\n+\t\t\tvar hash = $.galleriffic.normalizeHash(location.hash);\n+\t\t\tvar imageData = allImages[hash];\r\n+\t\t\tif (!imageData)\n+\t\t\t\tinitFirstImage = true;\n+\t\t}\n+\r\n+\t\t// Setup gallery to show the first image\n+\t\tif (initFirstImage)\r\n+\t\t\tthis.gotoIndex(0, false, true);\r\n+\n+\t\t// Setup Keyboard Navigation\n+\t\tif (this.enableKeyboardNavigation) {\n+\t\t\t$(document).keydown(function(e) {\n+\t\t\t\tvar key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;\n+\t\t\t\tswitch(key) {\n+\t\t\t\t\tcase 32: // space\n+\t\t\t\t\t\tgallery.next();\n+\t\t\t\t\t\te.preventDefault();\n+\t\t\t\t\t\tbreak;\n+\t\t\t\t\tcase 33: // Page Up\n+\t\t\t\t\t\tgallery.previousPage();\n+\t\t\t\t\t\te.preventDefault();\n+\t\t\t\t\t\tbreak;\n+\t\t\t\t\tcase 34: // Page Down\n+\t\t\t\t\t\tgallery.nextPage();\n+\t\t\t\t\t\te.preventDefault();\n+\t\t\t\t\t\tbreak;\n+\t\t\t\t\tcase 35: // End\n+\t\t\t\t\t\tgallery.gotoIndex(gallery.data.length-1);\n+\t\t\t\t\t\te.preventDefault();\n+\t\t\t\t\t\tbreak;\n+\t\t\t\t\tcase 36: // Home\n+\t\t\t\t\t\tgallery.gotoIndex(0);\n+\t\t\t\t\t\te.preventDefault();\n+\t\t\t\t\t\tbreak;\n+\t\t\t\t\tcase 37: // left arrow\n+\t\t\t\t\t\tgallery.previous();\n+\t\t\t\t\t\te.preventDefault();\n+\t\t\t\t\t\tbreak;\n+\t\t\t\t\tcase 39: // right arrow\n+\t\t\t\t\t\tgallery.next();\n+\t\t\t\t\t\te.preventDefault();\n+\t\t\t\t\t\tbreak;\n+\t\t\t\t}\n+\t\t\t});\n+\t\t}\n+\n+\t\t// Auto start the slideshow\r\n+\t\tif (this.autoStart)\r\n+\t\t\tthis.play();\r\n+\r\n+\t\t// Kickoff Image Preloader after 1 second\r\n+\t\tsetTimeout(function() { gallery.preloadInit(); }, 1000);\r\n+\r\n+\t\treturn this;\r\n+\t};\r\n+})(jQuery);\r\n'
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/js/jquery.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/js/jquery.js Mon Jan 28 11:57:15 2019 -0500
[
b'@@ -0,0 +1,5 @@\n+/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license\n+//@ sourceMappingURL=jquery.min.map\n+*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,w=/\\S+/g,T=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,N=/^(?:(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,C=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,k=/^[\\],:{}\\s]*$/,E=/(?:^|:|,)(?:\\s*\\[)+/g,S=/\\\\(?:["\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,A=/"[^"\\\\\\r\\n]*"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,j=/^-ms-/,D=/-([\\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))r'..b' ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);\n\\ No newline at end of file\n'
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/js/jquery.opacityrollover.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/js/jquery.opacityrollover.js Mon Jan 28 11:57:15 2019 -0500
b
@@ -0,0 +1,42 @@
+/**
+ * jQuery Opacity Rollover plugin
+ *
+ * Copyright (c) 2009 Trent Foley (http://trentacular.com)
+ * Licensed under the MIT License:
+ *   http://www.opensource.org/licenses/mit-license.php
+ */
+;(function($) {
+ var defaults = {
+ mouseOutOpacity:   0.67,
+ mouseOverOpacity:  1.0,
+ fadeSpeed:         'fast',
+ exemptionSelector: '.selected'
+ };
+
+ $.fn.opacityrollover = function(settings) {
+ // Initialize the effect
+ $.extend(this, defaults, settings);
+
+ var config = this;
+
+ function fadeTo(element, opacity) {
+ var $target = $(element);
+
+ if (config.exemptionSelector)
+ $target = $target.not(config.exemptionSelector);
+
+ $target.fadeTo(config.fadeSpeed, opacity);
+ }
+
+ this.css('opacity', this.mouseOutOpacity)
+ .hover(
+ function () {
+ fadeTo(this, config.mouseOverOpacity);
+ },
+ function () {
+ fadeTo(this, config.mouseOutOpacity);
+ });
+
+ return this;
+ };
+})(jQuery);
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/ppp.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/ppp.pm Mon Jan 28 11:57:15 2019 -0500
[
b'@@ -0,0 +1,230 @@\n+package sRNAPipe::ppp;\n+\n+use strict;\n+use warnings;\n+use FindBin;\n+use lib "$FindBin::Bin/../lib";\n+use sRNAPipe::Rcall qw ( histogram );\n+use Math::CDF;\n+\n+use Exporter;\n+our @ISA = qw( Exporter );\n+our @EXPORT_OK = qw( &ping_pong_partners );\n+\n+sub ping_pong_partners\n+{\n+    my ( $TE_fai, $sam, $dir, $max ) = @_;\n+    my ( $hashRef, $dupRef, $hasPpp ) = count_mapped ( $TE_fai, $sam );\n+    my ( %num_per_overlap_size, $overlap_number, $reverseR, $begRev, $endRev, $sensR, $begSens, $endSens, $snum, $rnum, $overlap );\n+    my ( $SP, $AP, $SN, $AN, $txt );\n+    my $flag = 0;\n+    my @distri_overlap = (); my @overlaps_names = ();\n+\n+    open my $ppp_f, \'>\', $dir."ppp.txt" || die "cannot create ppp.txt $!\\n";\n+    foreach my $k ( sort keys %{$hashRef} )\n+    {\n+        my $v = $hashRef->{$k};\n+        my $TE_dir = $dir.$k.\'/\';\n+\n+        %num_per_overlap_size = (); $overlap_number = 0;\n+        $flag = 0;\n+        for ( my $i = 0; $i <= $#{$v->[1]} ; $i++ )\n+        {\n+            $reverseR = ${$v->[1]}[$i] ;\n+            $begRev = $reverseR->[0];\n+            $endRev = $begRev + length($reverseR->[1]) - 1;\n+\n+            my $revR = reverse($reverseR->[1]);\n+            $revR =~ tr/atgcuATGCU/tacgaTACGA/;\n+\n+            for ( my $j = 0; $j <= $#{$v->[0]}; $j++ )\n+            {\n+                $sensR = ${$v->[0]}[$j];\n+                $begSens = $sensR->[0];\n+                $endSens = $begSens + length($sensR->[1]) - 1;\n+\n+                if ( $begSens <= $endRev && $endSens > $endRev )\n+                {\n+                    $flag = 1;\n+                    mkdir $TE_dir;\n+                    open    $txt, \'>\', $TE_dir.\'overlap_size.txt\' || die "cannot open repartition\\n";\n+\n+                    $overlap = $endRev - $begSens + 1;\n+                    $snum =    $dupRef->{$sensR->[0].$sensR->[1].$sensR->[2].$sensR->[3]};\n+                    $rnum = $dupRef->{$reverseR->[0].$reverseR->[1].$reverseR->[2].$reverseR->[3]};\n+\n+                    if ( $overlap == 10 )\n+                    {\n+                        $hasPpp->{ $sensR->[0].$sensR->[1].$sensR->[2].$sensR->[3] } = 1;\n+                        $hasPpp->{ $reverseR->[0].$reverseR->[1].$reverseR->[2].$reverseR->[3] } = 1;\n+                    }\n+                    next if $overlap > $max;\n+                    if ( $snum < $rnum )\n+                    {\n+                        $num_per_overlap_size{$overlap} += $snum;\n+                        $overlap_number += $snum;\n+                    }\n+                    else\n+                    {\n+                        $num_per_overlap_size{$overlap} += $rnum ;\n+                        $overlap_number += $rnum ;\n+                    }\n+                }\n+            }\n+        }\n+        if ( $max != 0 )\n+        {\n+            my @overlaps = ();\n+            push @overlaps_names, $k;\n+            for my $i (1..$max)\n+            {\n+                $num_per_overlap_size{$i} = 0 unless exists( $num_per_overlap_size{$i} );\n+                push @overlaps, $num_per_overlap_size{$i};\n+            }\n+            push @distri_overlap, \\@overlaps;\n+        }\n+\n+        if ( $flag == 1 )\n+        {\n+            open    $AP, \'>\', $TE_dir."antisensPPP.txt" || die "cannot create antisensPPP\\n";\n+            open    $AN, \'>\', $TE_dir."antisens.txt"    || die "cannot create antisens\\n";\n+            for ( my $i = 0; $i <= $#{$v->[1]} ; $i++ )\n+            {\n+                $reverseR = ${$v->[1]}[$i] ;\n+                my $revR = reverse($reverseR->[1]);\n+                $revR =~ tr/atgcuATGCU/tacgaTACGA/;\n+                $rnum = $dupRef->{$reverseR->[0].$reverseR->[1].$reverseR->[2].$reverseR->[3]};\n+                if ( $hasPpp->{ $reverseR->[0].$reverseR->[1].$reverseR->[2].$reverseR->[3] } == 1 )\n+                {\n+                    print $AP ">$reverseR->[0]|$reverseR->[2]|$reverseR->[3]|$rnum\\n$revR\\n";\n+                }\n+                else\n+                {\n+                    print $AN ">$reverseR->[0]|$re'..b' open    $SP, \'>\', $TE_dir."sensPPP.txt" || die "cannot create sensPPP\\n";\n+            open    $SN, \'>\', $TE_dir."sens.txt"    || die "cannot create sens\\n";\n+            for ( my $j = 0; $j <= $#{$v->[0]}; $j++ )\n+            {\n+                $sensR = ${$v->[0]}[$j];\n+                $snum =    $dupRef->{$sensR->[0].$sensR->[1].$sensR->[2].$sensR->[3]};\n+                if ( $hasPpp->{ $sensR->[0].$sensR->[1].$sensR->[2].$sensR->[3] } == 1 )\n+                {\n+                    print $SP ">$sensR->[0]|$sensR->[2]|$sensR->[3]|$snum\\n$sensR->[1]\\n";\n+                }\n+                else\n+                {\n+                    print $SN ">$sensR->[0]|$sensR->[2]|$sensR->[3]|$snum\\n$sensR->[1]\\n";\n+                }\n+            }\n+            close $SP; close $SN;\n+\n+            my $histo_png = $TE_dir.\'histogram.png\';\n+            histogram( \\%num_per_overlap_size, $histo_png, $overlap_number );\n+            print $txt "size\\tnumber\\tpercentage of the total overlap number\\n";\n+            foreach my $k ( sort {$a <=> $b} keys %num_per_overlap_size )\n+            {\n+                my $percentage = 0;\n+                $percentage = $num_per_overlap_size{$k} * 100 / $overlap_number unless $overlap_number == 0;\n+                print $txt "$k\\t$num_per_overlap_size{$k}\\t"; printf $txt "%.2f\\n",$percentage;\n+            }\n+            close $txt;\n+        }\n+    }\n+\n+    foreach my $tabP (    @distri_overlap )\n+    {\n+        my $sum = sum($tabP);\n+        my $ten = $tabP->[9];\n+        my $mean = mean($tabP);\n+        my $std = standard_deviation($tabP, $mean);\n+        my $zsc = z_significance($ten, $mean, $std);\n+        my $name = shift @overlaps_names;\n+        my $prob = \'NA\';\n+        $prob =    1 - &Math::CDF::pnorm( $zsc ) if $zsc ne \'NA\';\n+        print $ppp_f (join ("\\t", $name, $sum, $ten, $mean, $std, $zsc, $prob ),"\\n" );\n+    }\n+    close $ppp_f;\n+}\n+\n+sub count_mapped\n+{\n+    my ( $fai, $in_file ) = @_;\n+    my ( %mapped, %dup, %has_ppp );\n+\n+    open my $f, \'<\', $fai || die "cannot open $fai $! \\n";\n+    while(<$f>)\n+    {\n+        if ($_ =~ /(.*)\\t(\\d+)\\n/)\n+        {\n+            $mapped{$1} = [];\n+            $mapped{$1}->[0] = []; $mapped{$1}->[1] = [];\n+        }\n+    }\n+    close $f;\n+\n+    open my $infile, "samtools view \'$in_file\' |"|| die "cannot open input file $! \\n";\n+    while(<$infile>)\n+    {\n+        unless ($_ =~ /^\\@[A-Za-z][A-Za-z](\\t[A-Za-z][A-Za-z0-9]:[ -~]+)+$/ || $_ =~ /^\\@CO\\t.*/ )\n+        {\n+            my @line = split (/\\t/,$_);\n+            if ($line[1] == 0)\n+            {\n+                unless ( exists ($dup{$line[3].$line[9].$line[1].$line[2]}) )\n+                {\n+                    push @{$mapped{$line[2]}->[0]} , [$line[3], $line[9], $line[1],    $line[2]];\n+                    $has_ppp {$line[3].$line[9].$line[1].$line[2]} = 0;\n+                }\n+                $dup{$line[3].$line[9].$line[1].$line[2]}+=1;\n+            }\n+            elsif ($line[1] == 16)\n+            {\n+                unless ( exists ($dup{$line[3].$line[9].$line[1].$line[2]}) )\n+                {\n+                    push @{$mapped{$line[2]}->[1]} , [$line[3], $line[9], $line[1],    $line[2]];\n+                    $has_ppp{$line[3].$line[9].$line[1].$line[2]} = 0;\n+                }\n+                $dup{$line[3].$line[9].$line[1].$line[2]}+=1\n+            }\n+        }\n+    }\n+    close $infile;\n+    return (\\%mapped, \\%dup, \\%has_ppp );\n+}\n+\n+sub sum\n+{\n+    my $arrayref = shift;\n+    my $result = 0;\n+    foreach (@$arrayref) {$result += $_}\n+    return $result;\n+}\n+\n+sub mean\n+{\n+    my $arrayref = shift;\n+    my $result;\n+    foreach (@$arrayref) {$result += $_}\n+    return $result / scalar(@$arrayref);\n+}\n+\n+sub standard_deviation\n+{\n+    my ($arrayref, $mean) =    @_;\n+    return sqrt ( mean ( [map $_**2 , @$arrayref ]) - ($mean**2));\n+}\n+\n+sub z_significance\n+{\n+    my ($ten, $mean, $std) = @_;\n+    my $z = \'NA\';\n+    $z = (($ten - $mean) / $std) if $std != 0;\n+    return $z;\n+}\n+\n+1;\n+\n'
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/resize.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/resize.pm Mon Jan 28 11:57:15 2019 -0500
[
@@ -0,0 +1,101 @@
+package sRNAPipe::resize;
+
+use strict;
+use warnings;
+
+use FindBin;
+use lib "$FindBin::Bin/../lib";
+use sRNAPipe::Rcall qw ( histogram );
+
+use Exporter;
+our @ISA = qw( Exporter );
+our @EXPORT_OK = qw( &size_distribution );
+
+sub size_distribution
+{
+    my ( $fastq, $fastq_out, $dir, $min, $max ) = @_;
+
+    my ( %fragments_size, %duplicates ) ;
+    my $num = size($min, $max, $fastq, $fastq_out, \%fragments_size, \%duplicates);
+
+    my $png = $dir.'histogram.png';
+    histogram(\%fragments_size, $png, $num);
+    
+    my $size = $dir.'reads_size.txt';
+    
+
+    my $pourcentage;
+    open    my $o, '>', $size || die "cannot open $size $!\n";
+    print $o "size\tnumber\tpercentage\n";
+    foreach my    $k (sort { $a <=> $b } keys %fragments_size )
+    {
+        $pourcentage = $fragments_size{$k} / $num * 100;
+        
+        print $o "$k\t$fragments_size{$k}\t";
+        printf $o "%.2f\n",$pourcentage;
+    }
+    close $o;
+    
+    my $dup = $dir.'duplicates.txt' ;
+    open $o, '>', $dup || die "cannot open $size $!\n";
+    print $o "size\tnumber\n";
+    foreach my    $k (sort { $duplicates{$b} <=> $duplicates{$a} } keys %duplicates )
+    {
+        print $o "$k\t$duplicates{$k}\n";
+    }
+    close $o;
+}
+
+sub size
+{
+    my ($min, $max, $in_file, $out_file, $sizeHashR, $duplicateHashR) = @_;
+    my ($numreads, $size, $cmp, $ok, $line) = (0, 0, 0, 0);
+    my @fastq;
+    open (my $in, $in_file) || die "cannot open $in_file $!\n";
+    open (my $out, ">".$out_file)    || die "cannot create $out_file $!\n";
+    while(<$in>)
+    {
+        chomp $_;
+        $cmp++; $line++;
+        if ($cmp == 1)
+        {
+            die "file do not contain a @ at line $line\n" unless ($_ =~ /^\@/ );
+            $ok = 0; @fastq = ();
+            push(@fastq,$_);
+        }
+        elsif ($cmp == 2)
+        {
+            #die "unrecognized symbol at line $line\n" unless ($_ =~ /[atcgATCGnN]+/ || $_ =~ /^$/ );
+            push(@fastq,$_);
+            $size = length($_);
+            if ($size >= $min && $size <= $max)
+            {
+                $numreads++;
+                ${$sizeHashR}{$size}+=1;
+                ${$duplicateHashR}{$_}+=1 if (defined($duplicateHashR));
+                $ok = 1;
+            }
+        }
+        elsif ($cmp == 3 )
+        {
+            die "file do not contain a + at line $line\n" unless $_ =~ /^\+/;
+            push(@fastq,$_);
+        }
+        elsif ($cmp == 4 )
+        {
+            push(@fastq,$_);
+            $cmp = 0;
+            if ($ok == 1)
+            {
+                foreach my $t (@fastq)
+                {
+                    print $out $t."\n";
+                }
+            }
+        }
+    }
+    close $in; close $out;
+    return $numreads;
+}
+
+1;
b
diff -r 11708af40030 -r 967512924317 lib/sRNAPipe/subgroups.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/sRNAPipe/subgroups.pm Mon Jan 28 11:57:15 2019 -0500
[
@@ -0,0 +1,174 @@
+package sRNAPipe::subgroups;
+
+use strict;
+use warnings;
+use Exporter;
+our @ISA = qw( Exporter );
+our @EXPORT_OK = qw( &subgroups );
+
+use POSIX;
+use File::Copy;
+use FindBin;
+use lib "$FindBin::Bin/../lib";
+use sRNAPipe::align qw ( get_hash_alignment );
+
+sub subgroups
+{
+    my ($fin, $dir, $mis, $mis_TE, $proc, $tRNAs, $rRNAs, $snRNAs, $miRNAs, $transcripts, $TE, $min_si, $max_si, $min_pi, $max_pi, $report ) = @_;
+    my (@files, $sum, $pie, $repar, %ismapped, %isjunk, %repartition, @junk_ref, @all_ref );
+
+    srand();
+    print $report "----------------------------\n";
+    print $report "Create subgroups:\nfastq_in: $fin\ndirectory_out: $dir\nmismatches: $mis\nmismatches TE: $mis_TE\n";
+
+    mkdir $dir;
+    $dir = $dir.'/' unless $dir =~ /(.*)\/$/;
+
+    my $accept_miRNas = $dir.'miRNAs.fastq';
+    my $reject_miRNAs = $dir.'miRNAs_rejected.fastq';
+    my $sam_miRNAs = $dir.'miRNAs.sam';
+    my @tmp = get_hash_alignment($miRNAs, $mis, 1, 1, $accept_miRNas, $reject_miRNAs, $fin, $proc, 'miRNAs',$sam_miRNAs, $report);
+    my $mi = $tmp[0]; my $sam = '';
+    $repartition{'miRNAs'} = $mi;
+
+
+    my $reject_rRNAs = $dir.'rRNAs_rejected.fastq';
+    if ( $rRNAs eq 'None')
+    {
+        move($reject_miRNAs,$reject_rRNAs);
+    }
+    else
+    {
+        $sam = new String::Random;
+        $sam = $sam->randpattern("CCcccccc");
+        @tmp = get_hash_alignment($rRNAs, $mis, 0, 1, 'NA', $reject_rRNAs, $reject_miRNAs, $proc, 'rRNAs', $sam, $report);
+        $repartition{'rRNAs'} = $tmp[0];
+        unlink $sam, $sam.'_aln.err', $sam.'_samse.err';
+    }
+
+    my $reject_tRNAs = $dir.'rRNAs_rejected.fastq';
+    if ( $rRNAs eq 'None')
+    {
+        move($reject_rRNAs,$reject_tRNAs);
+    }
+    else
+    {
+        $sam = new String::Random;
+        $sam = $sam->randpattern("CCcccccc");
+        @tmp = get_hash_alignment($tRNAs, $mis, 0, 1, 'NA', $reject_tRNAs, $reject_rRNAs, $proc, 'tRNAs', $sam, $report);
+        $repartition{'tRNAs'} = $tmp[0];
+        unlink $sam, $sam.'_aln.err', $sam.'_samse.err';
+    }
+
+
+    my $bonafide = $dir.'bonafide_reads.fastq';
+    if ( $rRNAs eq 'None')
+    {
+        move($reject_tRNAs,$bonafide);
+    }
+    else
+    {
+        $sam = new String::Random;
+        $sam = $sam->randpattern("CCcccccc");
+        @tmp = get_hash_alignment($snRNAs, $mis, 0, 1, 'NA', $bonafide, $reject_tRNAs, $proc, 'snRNAs', $sam, $report);
+        $repartition{'snRNAs'} = $tmp[0];
+
+        unlink $sam, $sam.'_aln.err', $sam.'_samse.err';
+    }
+    my $bo = $tmp[1];
+
+    my $sam_transcripts = $dir.'transcripts.sam';
+    my $reject_transcripts = $dir.'rejected_transcripts.fastq';
+    @tmp = get_hash_alignment($transcripts, $mis, 0, 1, 'NA', $reject_transcripts, $bonafide, $proc, 'transcripts', $sam_transcripts, $report, $dir.'transcripts.fai');
+    $repartition{'transcripts'} = $tmp[0];
+
+    
+    my $sam_TEs = $dir.'TEs.sam';
+    my $reject_TEs = $dir.'rejected.fastq';
+    @tmp = get_hash_alignment($TE, $mis_TE, 0, 1, 'NA', $reject_TEs, $reject_transcripts, $proc, 'TEs', $sam_TEs, $report, $dir.'TEs.fai' );
+    $repartition{'TEs'} = $tmp[0] ; $repartition{'others'} = $tmp[1];
+    unlink $sam, $sam.'_aln.err', $sam.'_samse.err';
+    unlink $reject_transcripts;
+    unlink $reject_rRNAs;
+    unlink $reject_miRNAs;
+    unlink $reject_tRNAs;
+
+    #create repartition
+    my $pi = fastqSubgroups($bonafide, $dir, $min_si, $max_si, $min_pi, $max_pi );
+
+    open (my $re, '>'.$dir.'repartition.txt') || die "cannot open $dir repartition.txt $!\n";
+    print $re "type\tnumber\tpercentage\n";
+    $sum += $_ foreach values %repartition;
+    foreach my $k    ( sort keys    %repartition )
+    {
+        my $prct = 0;
+        $prct = $repartition{$k} / $sum * 100 if $sum != 0;
+        print $re "$k\t$repartition{$k}\t"; printf $re "%.2f\n",$prct;
+    }
+    return ( $bo, $mi, $pi);
+}
+
+sub fastqSubgroups
+{
+    my ( $fastq, $output_directory, $min_si, $max_si, $min_pi, $max_pi ) = @_;
+    my $fastq_siRNA = $output_directory."siRNAs.fastq";
+    my $fastq_piRNA = $output_directory."piRNAs.fastq";
+
+    open my $fic, '<', $fastq || die "cannot open input file $! \n";
+    open my $si, '>', $fastq_siRNA || die "cannot open siRNA.fastq $! \n";
+    open my $pi, '>', $fastq_piRNA || die "cannot open piRNA.fastq $! \n";
+    
+    my ($length, $cmp, $type, $siRNA_number, $miRNA_h_number, $piRNA_number, $not_pi_number) = (0,0,0,0,0,0,0);
+    my (@fastq) =(); my $seq_name;
+    my $out;
+    while(<$fic>)
+    {
+        chomp $_;
+        $cmp++;
+        if ($cmp == 1)
+        {
+            die "file do not contain a @ at line $cmp\n" unless ($_ =~ /^\@/ );
+            $type = 0; @fastq = ();
+            if ($_ =~ /^\@(.*)\s.*/) { $seq_name = $1;}
+            elsif ($_ =~ /^\@(.*)/) {$seq_name = $1;}
+            push(@fastq,$_);
+        }
+        elsif ($cmp == 2)
+        {
+            #die "unrecognized symbol at line $cmp\n" unless $_ =~ /[atcgATCGnN]+/;
+            push(@fastq,$_);
+            $length = length($_);
+            $type = 0;
+            if ( $length >= $min_si    && $length <= $max_si )
+            {
+                 $type = 2;
+                 $siRNA_number++;
+            }
+            if ($length >= $min_pi    && $length <= $max_pi )
+            {
+                $type += 4;
+                $piRNA_number++;
+            }
+        }
+        elsif ($cmp == 3 )
+        {
+            die "file do not contain a + at line $cmp\n" unless $_ =~ /^\+/;
+            push(@fastq,$_);
+        }
+        elsif ($cmp == 4 )
+        {
+            push(@fastq,$_);
+            $cmp = 0;
+            if ($type != 0)
+            {
+                if ($type & 4 ) { foreach my $t (@fastq) { print $pi $t."\n";} }
+                if ($type & 2 ) { foreach my $t (@fastq) { print $si $t."\n";} }
+            }
+        }
+    }
+    close $fic;
+    close $si; close $pi;
+    return ($piRNA_number);
+}
+
+1;
b
diff -r 11708af40030 -r 967512924317 sRNAPipe.xml
--- a/sRNAPipe.xml Thu Jan 24 13:09:46 2019 -0500
+++ b/sRNAPipe.xml Mon Jan 28 11:57:15 2019 -0500
[
@@ -36,7 +36,7 @@
         <requirement type="package" version="1.1_2">r-rcolorbrewer</requirement>
         <requirement type="package" version="2.2.1">r-ggplot2</requirement>
     </requirements>
-    <version_command>perl '$__tool_directory__/bin/sRNAPipe.pl'</version_command>
+    <version_command>perl '$__tool_directory__/bin/sRNAPipe.pl' | grep 'version' | grep "version" | cut -d ' ' -f 3</version_command>
     <command detect_errors="aggressive"><![CDATA[
         perl '$__tool_directory__/bin/sRNAPipe.pl'