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

Changeset 1:1df6aaac800e (2017-12-13)
Previous changeset 0:e4e71401c577 (2017-12-13) Next changeset 2:8c972f64a040 (2017-12-19)
Commit message:
Deleted selected files
added:
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/jquery.galleriffic.js
bin/js/jquery.js
bin/js/jquery.opacityrollover.js
bin/ppp.pm
bin/resize.pm
bin/sRNAPipe.pl
bin/subgroups.pm
test-data/TE-file-small.fa
test-data/dmel-all-rRNA-r6.03.fasta
test-data/dmel-all-sn-snoRNA-r6.03.fasta
test-data/dmel-all-tRNA-r6.03.fasta
test-data/genome-small.fa
test-data/mirbase-21-dme-hairpins-16jul2015.fa
test-data/reads-sample-small.fastq
test-data/transcripts-file-small.fa
tool-data/bwa_index.loc.sample
b
diff -r e4e71401c577 -r 1df6aaac800e bin/Rcall.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/Rcall.pm Wed Dec 13 10:40:50 2017 -0500
[
@@ -0,0 +1,136 @@
+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 = 800, height = 480)
+      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 e4e71401c577 -r 1df6aaac800e bin/align.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/align.pm Wed Dec 13 10:40:50 2017 -0500
[
b'@@ -0,0 +1,457 @@\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( &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+\tmy $to_index = shift;\n+\tmy $log = shift;\n+\tmy $index_log = $to_index.\'_index.err\';\n+\t`bwa index $to_index 2> $index_log`;\n+\tprint $log "Creating index for $to_index\\n";\n+}\n+\n+sub get_unique\n+{\n+\tmy ( $sam, $s_uni, $out_prefix, $col_prefix, $details, $report ) = @_;\n+\n+\tmy $fout = $col_prefix.\'_all_mappers.fastq\'; \n+\tmy $funi = $col_prefix.\'_unique_mappers.fastq\';\n+\tmy $frej = $col_prefix.\'_unmapped.fastq\';\n+\t\n+  my $repartition = $out_prefix.\'distribution.txt\';\n+\tmy $png_rep = $out_prefix.\'distribution.png\';\n+\tmy ( %duplicates, %genome_hits) ;\n+\n+\t#alignement to the first reference\n+\tmy @return = sam_parse( $sam, $fout, $funi, $frej, $s_uni, \\%duplicates, \\%genome_hits, $report );\n+\tmy $ref_fai = $return[4];\n+\tmy $mappers =  $return[5];\n+\tmy $mappers_uni = $return[6];\n+\tmy $size_mappedHashR = $return[7];\n+\n+\tif ( $details == 1 )\n+\t{\n+\t\t#print number of duplicates and hits number\n+\t\tmy ($pourcentage, $total) =(0,0);\n+\n+\t\t$total += $_ foreach values %{$size_mappedHashR};\n+\t\topen (my $rep, \'>\'.$repartition) || die "cannot create $repartition $!\\n";\n+\t\tprint $rep "size\\tnumber\\tpercentage\\n";\n+\t\tforeach my $k (sort{$a cmp $b} keys (%{$size_mappedHashR}))\n+\t\t{\n+\t\t\t$pourcentage = 0;\n+\t\t\t$pourcentage = $size_mappedHashR->{$k} / $total * 100 unless $total ==0;\n+\n+\t\t\tprint $rep "$k\\t$size_mappedHashR->{$k}\\t";\n+\t\t\tprintf $rep "%.2f\\n",$pourcentage;\n+\t\t}\n+\n+\t\thistogram($size_mappedHashR, $png_rep, $total);\n+\n+\n+\t\tmy $dup = $out_prefix.\'dup_mapnum.txt\';\n+\t\tmy $dup_u = $out_prefix .\'dup_unique.txt\';\n+\t\tmy $dup_r = $out_prefix .\'dup_nonmapp.txt\';\n+\t\topen(my $tab,">".$dup) || die "cannot open output txt file\\n";\n+\t\topen(my $tab_r,">".$dup_r) || die "cannot open output txt file\\n";\n+\t\topen(my $tab_u,">".$dup_u) || die "cannot open output txt file\\n";\n+\t\tprint $tab "sequence\\tcount\\tmapnum\\n";\n+\t\tprint $tab_u "sequence\\tcount\\n";\n+\t\tprint $tab_r "sequence\\tcount\\n";\n+\t\tforeach my $k (sort {$duplicates{$b} <=> $duplicates{$a}}keys %duplicates)\n+\t\t{\n+\t\t\t$duplicates{$k} = 0 unless exists($duplicates{$k});\n+\t\t\t$genome_hits{$k} = 0 unless exists($genome_hits{$k});\n+\t\t\tif ($genome_hits{$k} != 0) { print $tab $k."\\t".$duplicates{$k}."\\t".$genome_hits{$k}."\\n"; }\n+\t\t\telse {print $tab_r $k."\\t".$duplicates{$k}."\\n";}\n+\t\t\tif ($genome_hits{$k} == 1) { print $tab_u $k."\\t".$duplicates{$k}."\\n"; }\n+\t\t}\n+\tclose $dup; close $dup_r; close $dup_u;\n+\t}\n+\treturn ( $ref_fai, $mappers, $mappers_uni );\n+}\n+\n+sub sam_parse\n+{\n+\tmy ( $sam, $fastq_accepted, $fastq_accepted_unique, $fastq_rejected, $sam_unique, $duplicate_hashR, $best_hit_number_hashR, $report ) = @_ ;\n+\tmy ($reads, $mappers, $mappersUnique, @garbage, %size_num, %size_num_spe, %number, %numberSens, %numberReverse, %unique_number, %numberNM, %numberM, %size);\n+\t$mappers = $mappersUnique = $reads = 0;\n+\n+\topen my $fic, \'<\', $sam || die "cannot open $sam $!\\n";\n+\topen my $accepted, \'>\', $fastq_accepted || die "cannot create $fastq_accepted $! \\n";\n+\topen my $unique, \'>\', $fastq_accepted_unique || die "cannot create $fastq_accepted_unique $! \\n";\n+\topen my $rejected, \'>\', $fastq_rejected || die "cannot create $fastq_rejected $! \\n";\n+\topen my $sam_uni, \'>\', $sam_unique || die "cannot create $sam_unique $! \\n";\n+\tmy $sequence = \'\';\n+\twhile(<$fic>)'..b'  -O BAM --threads $number_of_cpus  /dev/stdin  2> $sort_err  > $bam_sorted`;\n+}\n+\n+sub BWA_call\n+{\n+\tmy ( $index, $fastq, $sam, $mismatches, $number_of_cpus, $report ) = @_;\n+\tmy ( $aln_err, $samse_err, $seq_num ) = ( $sam.\'_aln.err\', $sam.\'_samse.err\', 0 );\n+\tprint $report "-----------------------------\\n";\n+\tprint $report "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+\t`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+ \t}\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+\topen 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+\t\t\t{\n+      \tprint $f_out "\\@".$line[0]."\\n".$arn."\\n+\\n".$line[10]."\\n" ;\n+      \tprint $s_out $_ if defined ($hashRef);\n+      \tif ( $line[11] eq "XT:A:U" )\n+      \t{\n+      \t\tprint $f_uni_out "\\@".$line[0]."\\n".$arn."\\n+\\n".$line[10]."\\n" ;\n+      \t\tprint $s_uni_out $_ ;\n+      \t}\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 e4e71401c577 -r 1df6aaac800e bin/css/bootstrap-responsive.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/css/bootstrap-responsive.css Wed Dec 13 10:40:50 2017 -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 e4e71401c577 -r 1df6aaac800e bin/css/bootstrap-table.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/css/bootstrap-table.css Wed Dec 13 10:40:50 2017 -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 e4e71401c577 -r 1df6aaac800e bin/css/bootstrap.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/css/bootstrap.css Wed Dec 13 10:40:50 2017 -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 e4e71401c577 -r 1df6aaac800e bin/html.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/html.pm Wed Dec 13 10:40:50 2017 -0500
[
b'@@ -0,0 +1,907 @@\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+\tmy ( $dir, $file, $list_mainTabP, $current, $ma, $ma_uni, $dir_root ) = @_;\n+\tmy ( $futHashP, $uniqueTabP, $randTabP, $pngTabP ) = get_genome ( $dir, $dir_root );\n+\n+\topen my $h, \'>\', $file || die "cannot create $file $!\\n";\n+\theader ( $h );\n+\tnavbar ( $h, $list_mainTabP, $current );\n+\tprint $h "<div class=\\"container\\"><p><a class=\\"btn\\" href=\\"$current-sub.html\\">View details &raquo;</a></p></div>\\n";\n+\tfuturette( $h, $current, $pngTabP, $futHashP );\n+\tprint  $h "<div class=\\"container\\"><h2>mappers #: $ma</h2><h2>unique mappers #: $ma_uni</h2> </div>\\n";\n+\tcarousel2( $h, $uniqueTabP, $randTabP, $dir_root );\n+\tfooter($h);\n+\tclose $h;\n+}\n+\n+sub menu_page\n+{\n+\tmy ( $dir, $file, $list_mainTabP, $current, $min, $max, $simin, $simax, $pimin, $pimax, $dir_root ) = @_;\n+  my $html_ref = $1 if $dir =~ /$dir_root(.*)/;\n+\topen 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+\tmy ( $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+  \tprint $h " <div class=\\"container\\">";\n+  \tprint $h " <p><a class=\\"btn\\" href=\\"$html_ref\\">Ping Pong Partners</a></p>\\n";\n+  \tprint $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+\tmy ( $dir, $file, $list_mainTabP, $current, $ppp, $dir_root ) = @_;\n+\n+\tmy $ppp_file = $ppp.\'ppp.txt\';\n+\topen my $h, \'>\', $file || die "cannot create $file $!\\n";\n+\theader($h);\n+ \tnavbar ( $h, $list_mainTabP, $current );\n+ \tprint $h \'<div class="container"> <table class="wb-tables table table-striped table-hover">\'."\\n";\n+ \tprint $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+ \topen my $f, \'<\', $ppp_file || die "cannot open $ppp_file  $!\\n";\n+ \twhile ( <$f> )\n+ \t{\n+ \t\tchomp;\n+ \t\tprint $h \'<tr>\';\n+ \t\tmy ( $id, $sum, $ten, $mean, $sd, $zscore, $prob) = split /\\t/, $_;\n+ \t\tif( -d "$ppp/$id" ) \n+ \t\t{\n+ \t\t\tmy $sub_html = $ppp.$id.\'.html\';\n+      my $sub_html_ref = $1.$id if $ppp =~ /$dir_root(.*)/;\n+ \t\t\tprint $h "<td> <a href=\\"$sub_html_ref.html\\">$id</a> </td>";\n+\n+ \t\t\topen my $sub, \'>\', $sub_html || die "cannot create $sub_html\\n";\n+ \t\t\t{\n+ \t\t\t\theader($sub);\n+ \t\t\t\tprint $sub "\n+\t\t\t\t\t<div align=\\"center\\">\n+\t\t\t\t\t<h2>$id</h2>\n+\t\t\t\t\t<p>'..b'stri_TE\n+{\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]\\">sens 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]\\">sens 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 e4e71401c577 -r 1df6aaac800e bin/js/bootstrap-table.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/js/bootstrap-table.js Wed Dec 13 10:40:50 2017 -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 e4e71401c577 -r 1df6aaac800e bin/js/bootstrap.min.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/js/bootstrap.min.js Wed Dec 13 10:40:50 2017 -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 e4e71401c577 -r 1df6aaac800e bin/js/jquery.galleriffic.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/js/jquery.galleriffic.js Wed Dec 13 10:40:50 2017 -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 e4e71401c577 -r 1df6aaac800e bin/js/jquery.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/js/jquery.js Wed Dec 13 10:40:50 2017 -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 e4e71401c577 -r 1df6aaac800e bin/js/jquery.opacityrollover.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/js/jquery.opacityrollover.js Wed Dec 13 10:40:50 2017 -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 e4e71401c577 -r 1df6aaac800e bin/ppp.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/ppp.pm Wed Dec 13 10:40:50 2017 -0500
[
@@ -0,0 +1,230 @@
+package ppp;
+
+use strict;
+use warnings;
+use FindBin;
+use lib $FindBin::Bin;
+use Rcall qw ( histogram );
+use Math::CDF;
+
+use Exporter;
+our @ISA = qw( Exporter );
+our @EXPORT_OK = qw( &ping_pong_partners );
+
+sub ping_pong_partners
+{
+  my ( $TE_fai, $sam, $dir, $max ) = @_;
+  my ( $hashRef, $dupRef, $hasPpp ) = count_mapped ( $TE_fai, $sam );
+  my ( %num_per_overlap_size, $overlap_number, $reverseR, $begRev, $endRev, $sensR, $begSens, $endSens, $snum, $rnum, $overlap );
+  my ( $SP, $AP, $SN, $AN, $txt );
+  my $flag = 0;
+  my @distri_overlap = (); my @overlaps_names = ();
+
+  open my $ppp_f, '>', $dir."ppp.txt" || die "cannot create ppp.txt $!\n";
+  foreach my $k ( sort keys %{$hashRef} )
+  {
+    my $v = $hashRef->{$k};
+    my $TE_dir = $dir.$k.'/';
+
+    %num_per_overlap_size = (); $overlap_number = 0;
+    $flag = 0;
+    for ( my $i = 0; $i <= $#{$v->[1]} ; $i++ )
+    {
+      $reverseR = ${$v->[1]}[$i] ;
+      $begRev = $reverseR->[0];
+      $endRev = $begRev + length($reverseR->[1]) - 1;
+
+      my $revR = reverse($reverseR->[1]);
+      $revR =~ tr/atgcuATGCU/tacgaTACGA/;
+
+      for ( my $j = 0; $j <= $#{$v->[0]}; $j++ )
+      {
+        $sensR = ${$v->[0]}[$j];
+        $begSens = $sensR->[0];
+        $endSens = $begSens + length($sensR->[1]) - 1;
+
+        if ( $begSens <= $endRev && $endSens > $endRev )
+        {
+          $flag = 1;
+          mkdir $TE_dir;
+          open  $txt, '>', $TE_dir.'overlap_size.txt' || die "cannot open repartition\n";
+
+          $overlap = $endRev - $begSens + 1;
+          $snum =  $dupRef->{$sensR->[0].$sensR->[1].$sensR->[2].$sensR->[3]};
+          $rnum = $dupRef->{$reverseR->[0].$reverseR->[1].$reverseR->[2].$reverseR->[3]};
+
+          if ( $overlap == 10 )
+          {
+            $hasPpp->{ $sensR->[0].$sensR->[1].$sensR->[2].$sensR->[3] } = 1;
+            $hasPpp->{ $reverseR->[0].$reverseR->[1].$reverseR->[2].$reverseR->[3] } = 1;
+          }
+          next if $overlap > $max;
+          if ( $snum < $rnum )
+          {
+            $num_per_overlap_size{$overlap} += $snum;
+            $overlap_number += $snum;
+          }
+          else
+          {
+            $num_per_overlap_size{$overlap} += $rnum ;
+            $overlap_number += $rnum ;
+          }
+        }
+      }
+    }
+    if ( $max != 0 )
+    {
+      my @overlaps = ();
+      push @overlaps_names, $k;
+      for my $i (1..$max)
+      {
+        $num_per_overlap_size{$i} = 0 unless exists( $num_per_overlap_size{$i} );
+        push @overlaps, $num_per_overlap_size{$i};
+      }
+      push @distri_overlap, \@overlaps;
+    }
+
+    if ( $flag == 1 )
+    {
+      open  $AP, '>', $TE_dir."antisensPPP.txt" || die "cannot create antisensPPP\n";
+      open  $AN, '>', $TE_dir."antisens.txt"  || die "cannot create antisens\n";
+      for ( my $i = 0; $i <= $#{$v->[1]} ; $i++ )
+      {
+        $reverseR = ${$v->[1]}[$i] ;
+        my $revR = reverse($reverseR->[1]);
+        $revR =~ tr/atgcuATGCU/tacgaTACGA/;
+        $rnum = $dupRef->{$reverseR->[0].$reverseR->[1].$reverseR->[2].$reverseR->[3]};
+        if ( $hasPpp->{ $reverseR->[0].$reverseR->[1].$reverseR->[2].$reverseR->[3] } == 1 )
+        {
+          print $AP ">$reverseR->[0]|$reverseR->[2]|$reverseR->[3]|$rnum\n$revR\n";
+        }
+        else
+        {
+          print $AN ">$reverseR->[0]|$reverseR->[2]|$reverseR->[3]|$rnum\n$revR\n";
+        }
+      }
+      close $AP; close $AN;
+
+      open  $SP, '>', $TE_dir."sensPPP.txt" || die "cannot create sensPPP\n";
+      open  $SN, '>', $TE_dir."sens.txt"  || die "cannot create sens\n";
+      for ( my $j = 0; $j <= $#{$v->[0]}; $j++ )
+      {
+        $sensR = ${$v->[0]}[$j];
+        $snum =  $dupRef->{$sensR->[0].$sensR->[1].$sensR->[2].$sensR->[3]};
+        if ( $hasPpp->{ $sensR->[0].$sensR->[1].$sensR->[2].$sensR->[3] } == 1 )
+        {
+          print $SP ">$sensR->[0]|$sensR->[2]|$sensR->[3]|$snum\n$sensR->[1]\n";
+        }
+        else
+        {
+          print $SN ">$sensR->[0]|$sensR->[2]|$sensR->[3]|$snum\n$sensR->[1]\n";
+        }
+      }
+      close $SP; close $SN;
+
+      my $histo_png = $TE_dir.'histogram.png';
+      histogram( \%num_per_overlap_size, $histo_png, $overlap_number );
+      print $txt "size\tnumber\tpercentage of the total overlap number\n";
+      foreach my $k ( sort {$a <=> $b} keys %num_per_overlap_size )
+      {
+        my $percentage = 0;
+        $percentage = $num_per_overlap_size{$k} * 100 / $overlap_number unless $overlap_number == 0;
+        print $txt "$k\t$num_per_overlap_size{$k}\t"; printf $txt "%.2f\n",$percentage;
+      }
+      close $txt;
+    }
+  }
+
+  foreach my $tabP (  @distri_overlap )
+  {
+    my $sum = sum($tabP);
+    my $ten = $tabP->[9];
+    my $mean = mean($tabP);
+    my $std = standard_deviation($tabP, $mean);
+    my $zsc = z_significance($ten, $mean, $std);
+    my $name = shift @overlaps_names;
+    my $prob = 'NA';
+    $prob =  1 - &Math::CDF::pnorm( $zsc ) if $zsc ne 'NA';
+    print $ppp_f (join ("\t", $name, $sum, $ten, $mean, $std, $zsc, $prob ),"\n" );
+  }
+  close $ppp_f;
+}
+
+sub count_mapped
+{
+  my ( $fai, $in_file ) = @_;
+  my ( %mapped, %dup, %has_ppp );
+
+  open my $f, '<', $fai || die "cannot open $fai $! \n";
+  while(<$f>)
+  {
+    if ($_ =~ /(.*)\t(\d+)\n/)
+    {
+      $mapped{$1} = [];
+      $mapped{$1}->[0] = []; $mapped{$1}->[1] = [];
+    }
+  }
+  close $f;
+
+  open my $infile, "samtools view  $in_file |"|| die "cannot open input file $! \n";
+  while(<$infile>)
+  {
+    unless ($_ =~ /^\@[A-Za-z][A-Za-z](\t[A-Za-z][A-Za-z0-9]:[ -~]+)+$/ || $_ =~ /^\@CO\t.*/ )
+    {
+      my @line = split (/\t/,$_);
+      if ($line[1] == 0)
+      {
+        unless ( exists ($dup{$line[3].$line[9].$line[1].$line[2]}) )
+        {
+          push @{$mapped{$line[2]}->[0]} , [$line[3], $line[9], $line[1],  $line[2]];
+          $has_ppp {$line[3].$line[9].$line[1].$line[2]} = 0;
+        }
+        $dup{$line[3].$line[9].$line[1].$line[2]}+=1;
+      }
+      elsif ($line[1] == 16)
+      {
+        unless ( exists ($dup{$line[3].$line[9].$line[1].$line[2]}) )
+        {
+          push @{$mapped{$line[2]}->[1]} , [$line[3], $line[9], $line[1],  $line[2]];
+          $has_ppp{$line[3].$line[9].$line[1].$line[2]} = 0;
+        }
+        $dup{$line[3].$line[9].$line[1].$line[2]}+=1
+      }
+    }
+  }
+  close $infile;
+  return (\%mapped, \%dup, \%has_ppp );
+}
+
+sub sum
+{
+  my $arrayref = shift;
+  my $result = 0;
+  foreach (@$arrayref) {$result += $_}
+  return $result;
+}
+
+sub mean
+{
+  my $arrayref = shift;
+  my $result;
+  foreach (@$arrayref) {$result += $_}
+  return $result / scalar(@$arrayref);
+}
+
+sub standard_deviation
+{
+  my ($arrayref, $mean) =  @_;
+  return sqrt ( mean ( [map $_**2 , @$arrayref ]) - ($mean**2));
+}
+
+sub z_significance
+{
+  my ($ten, $mean, $std) = @_;
+  my $z = 'NA';
+  $z = (($ten - $mean) / $std) if $std != 0;
+  return $z;
+}
+
+1;
+
b
diff -r e4e71401c577 -r 1df6aaac800e bin/resize.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/resize.pm Wed Dec 13 10:40:50 2017 -0500
[
@@ -0,0 +1,101 @@
+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 e4e71401c577 -r 1df6aaac800e bin/sRNAPipe.pl
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/sRNAPipe.pl Wed Dec 13 10:40:50 2017 -0500
[
b'@@ -0,0 +1,268 @@\n+#!/usr/bin/perl\n+use strict;\n+use warnings;\n+use Getopt::Long;\n+use Parallel::ForkManager;\n+use File::Basename;\n+use File::Copy::Recursive qw( dircopy );\n+use POSIX;\n+use FindBin;\n+use lib $FindBin::Bin;\n+use resize qw ( size_distribution );\n+use subgroups qw (subgroups );\n+use ppp qw ( ping_pong_partners );\n+use Rcall qw (pie_chart bg_to_png );\n+use align qw ( to_build get_unique sam_count sam_count_mis sam_sorted_bam rpms_rpkm BWA_call get_fastq_seq extract_sam sam_to_bam_bg );\n+use html qw ( main_page details_pages menu_page ppp_page );\n+use File::Copy;\n+\n+my ( @fastq, @fastq_n, $dir, $min, $max, $mis, $misTE, $help, $Pcheck, $mapnumf, $html_out);\n+my ( $ref, $tRNAs, $rRNAs, $snRNAs, $miRNAs, $transcripts, $TE );\n+my ( $si_min, $si_max, $pi_min, $pi_max );\n+my ( $build_index, $build_tRNAs, $build_rRNAs, $build_snRNAs, $build_miRNAs, $build_transcripts, $build_TE );\n+my $max_procs = 8;\n+\n+( $build_index, $build_tRNAs, $build_rRNAs, $build_snRNAs, $build_miRNAs, $build_transcripts, $build_TE ) = (0,0,0,0,0,0,0);\n+( $min, $max, $mis, $misTE, $si_min, $si_max, $pi_min, $pi_max, $dir ) = ( 18, 29, 0, 3, 21, 21, 23, 29 );\n+$Pcheck =\'true\';\n+\n+GetOptions (\n+\t"fastq=s" => \\@fastq,\n+\t"fastq_n=s" => \\@fastq_n,\n+\t"dir=s" => \\$dir,\n+\t"min:i" => \\$min,\n+\t"max:i" => \\$max,\n+\t"si_min:i" => \\$si_min,\n+\t"si_max:i" => \\$si_max,\n+\t"pi_min:i" => \\$pi_min,\n+\t"pi_max:i" => \\$pi_max,\n+\t"mis:i" => \\$mis,\n+\t"misTE:i" => \\$misTE,\n+\t"html:s" => \\$html_out,\n+\t"PPPon:s" => \\$Pcheck,\n+\t"help"   =>  \\$help,\n+\t"ref:s" => \\$ref,\n+\t"tRNAs:s" => \\$tRNAs,\n+\t"rRNAs:s" => \\$rRNAs,\n+\t"snRNAs:s" => \\$snRNAs,\n+\t"miRNAs:s" => \\$miRNAs,\n+\t"transcripts:s" => \\$transcripts,\n+\t"TE:s" => \\$TE,\n+\t"build_index" => \\$build_index,\n+\t"build_tRNAs" => \\$build_tRNAs,\n+\t"build_snRNAs" => \\$build_snRNAs,\n+\t"build_miRNAs" => \\$build_miRNAs,\n+\t"build_transcripts" => \\$build_transcripts,\n+\t"build_rRNAs" => \\$build_rRNAs,\n+\t"build_TE" => \\$build_TE\n+);\n+\n+my $fq_collection = \'fastq_dir/\';\n+mkdir $dir; mkdir $fq_collection;\n+$dir = $dir.\'/\' unless $dir =~ /\\/$/;\n+mkdir $dir.\'/css\';mkdir $dir.\'/js\';\n+dircopy( $FindBin::Bin.\'/css\', $dir.\'/css\' );\n+dircopy( $FindBin::Bin.\'/js\', $dir.\'/js\' );\n+\n+my $file = $dir.\'report.txt\';\n+open my $report, \'>\', $file or die "Cannot open $file $!\\n";\n+\n+my @toBuild = ( [$build_index, \\$ref],  [$build_tRNAs, \\$tRNAs], [$build_rRNAs, \\$rRNAs], [$build_snRNAs, \\$snRNAs], [$build_miRNAs, \\$miRNAs], [$build_transcripts, \\$transcripts], [$build_TE, \\$TE] );\n+to_build ( \\@toBuild, $report, $dir );\n+\n+my $proc_child = ceil($max_procs / scalar(@fastq));\n+my $proc_grand_child = ceil($proc_child/4);\n+my $pm = Parallel::ForkManager->new($max_procs);\n+my $pm2 = Parallel::ForkManager->new($proc_grand_child);\n+\n+$pm->run_on_finish( sub {\n+\tmy ($pid, $exit_code, $ident) = @_;\n+\tprint $report "Fastq fork $ident just finished ".\n+\t"with PID $pid and exit code: $exit_code\\n";\n+\tdie "Something went wrong!\\n" if $exit_code != 0;\n+\t});\n+$pm->run_on_start( sub {\n+\tmy ($pid,$ident)=@_;\n+\tprint $report "Fastq fork : $ident started, pid: $pid\\n";\n+\t});\n+$pm2->run_on_finish( sub {\n+\tmy ($pid, $exit_code, $ident) = @_;\n+\tprint $report "** Subgroup fork $ident just finished ".\n+\t"with PID $pid and exit code: $exit_code\\n";\n+\tdie "Something went wrong!\\n" if $exit_code != 0;\n+\t});\n+$pm2->run_on_start( sub {\n+\tmy ($pid,$ident)=@_;\n+\tprint $report "** Subgroup fork $ident started, pid: $pid\\n";\n+\t});\n+\n+\n+foreach my $child ( 0 .. $#fastq )\n+{\n+\tmy @suffix = (\'.fastq\', \'.fastq.gz,\', \'.fq\', \'.fq.gz\', \'ref\', \'.dat\', \'.fa\',\'.fas\',\'.fasta\', \'.txt\');\n+\tmy ( $name, $path, $suffix ) = fileparse( $fastq[$child], @suffix );\n+\tmy ( $ref_name, $ref_path, $ref_suffix ) = fileparse( $ref, @suffix );\n+\tmy ( $TE_name, $TE_path, $TE_suffix ) = fileparse( $TE, @suffix );\n+\tmy ( $ex_name, $ex_path, $ex_suffix ) = fileparse( $transcripts, @suffix );\n+\n+\t$pm->start($fastq[$child]) and next;\n+\n+\tmy $dir_fq = $dir.$fastq_n[$child].\'/\';\n+\tmkdir $dir_fq;\n+\n+\tmy $gen_dir = $dir_fq.\'genome/'..b'ni_TEs_fastq, $type_uni_TEs_fastq );\n+\t\t\textract_sam ( undef, $type_sam_transcripts, $type_sam_transcripts, $type_sam_uni_transcripts, $type_transcripts_fastq, $type_uni_transcripts_fastq );\n+\t\t\textract_sam ( undef, $type_sam_genome, $type_sam_genome, $type_sam_uni_genome, $type_genome_fastq, $type_uni_genome_fastq );\n+\t\t}\n+\t\telse\n+\t\t{\n+\t\t\textract_sam ( $type_sequence_hashP, $sam_TEs, $type_sam_TEs, $type_sam_uni_TEs, $type_TEs_fastq, $type_uni_TEs_fastq );\n+\t\t\textract_sam ( $type_sequence_hashP, $sam_transcripts, $type_sam_transcripts, $type_sam_uni_transcripts, $type_transcripts_fastq, $type_uni_transcripts_fastq );\n+\t\t\textract_sam ( $type_sequence_hashP, $sam_genome, $type_sam_genome, $type_sam_uni_genome, $type_genome_fastq, $type_uni_genome_fastq );\n+\t\t}\n+\n+\t\tmy $ex_count_file =  $type_dir.$type_prefix.\'transcripts_reads_counts.txt\';\n+\t\tmy ( $ex_count, $ex_ref_size ) =  sam_count ( $type_sam_transcripts );\n+\t\trpms_rpkm( $ex_count, $ex_ref_size, $ma, $ex_count_file, $pi, $mi, $bo );\n+\n+\t\tmy ( $TEs_count, $TEs_ref_size, $TEs_count_NoM, $TEs_count_M ) = sam_count_mis ( $type_sam_TEs );\n+\t\tmy $TEs_count_file = $type_dir.$type_prefix.\'TEs_reads_counts.txt\';\n+\t\tmy $TEs_count_file_M = $type_dir.$type_prefix.\'TEs_reads_counts_mismatches.txt\';\n+\t\tmy $TEs_count_file_noM = $type_dir.$type_prefix.\'TEs_reads_counts_nomismatches.txt\';\n+\t\trpms_rpkm( $TEs_count, $TEs_ref_size, $ma, $TEs_count_file, $pi, $mi, $bo );\n+\t\trpms_rpkm( $TEs_count_NoM, $TEs_ref_size, $ma, $TEs_count_file_noM, $pi, $mi, $bo );\n+\t\trpms_rpkm( $TEs_count_M, $TEs_ref_size, $ma, $TEs_count_file_M, $pi, $mi, $bo );\n+\n+\t\tsam_to_bam_bg ( $type_sam_TEs, $scale, $grand_child );\n+\t\tsam_sorted_bam ( $type_sam_transcripts, $grand_child ); sam_sorted_bam ( $type_sam_uni_transcripts, $grand_child ); \n+\t\tsam_sorted_bam ( $type_sam_uni_TEs, $grand_child ); \n+\n+\t\tmy $Gviz_TEs =  $type_dir.\'Gviz_TEs/\';\n+\t\tmkdir $Gviz_TEs;\n+\t\tbg_to_png ( $group_dir.\'TEs.fai\', $type_dir.$type_prefix.\'TEs_plus.bedgraph\', $type_dir.$type_prefix.\'TEs_minus.bedgraph\', $Gviz_TEs, \'Kb\' );\n+\n+\t\tmy $Gviz_genome=  $type_dir.\'Gviz_genome/\';\n+\t\tmy $Gviz_genome_rand = $Gviz_genome.\'rand/\';\n+\t\tmy $Gviz_genome_uni = $Gviz_genome.\'unique/\';\n+\t\tmkdir $Gviz_genome; mkdir $Gviz_genome_uni; mkdir $Gviz_genome_rand;\n+\n+\t\tsam_to_bam_bg ( $type_sam_genome, $scale, $grand_child );\n+\t\tsam_to_bam_bg ( $type_sam_uni_genome, $scale, $grand_child );\n+\n+\t\tbg_to_png ( $fai_file, $type_dir.$type_prefix.\'genome_unique_plus.bedgraph\', $type_dir.$type_prefix.\'genome_unique_minus.bedgraph\', $Gviz_genome_uni, \'Mb\' );\n+\t\tbg_to_png ( $fai_file, $type_dir.$type_prefix.\'genome_plus.bedgraph\', $type_dir.$type_prefix.\'genome_minus.bedgraph\', $Gviz_genome_rand, \'Mb\' );\n+\n+\t\t#HTML Details\n+\t\tmy $prefix_details_pages = $dir.$fastq_n[$child].\'-\'.$types_names[$grand_child];\n+\t\tdetails_pages ( $type_dir, $prefix_details_pages, \\@fastq_n, $fastq_n[$child], $misTE, $dir, $Pcheck );\n+\n+\t\t$pm2->finish();\n+\t}\n+\t$pm2->wait_all_children;\n+\n+\tif ( $Pcheck eq \'true\' )\n+\t{\n+\t\tmy $ppp = $group_dir.\'PPPartners/\'; mkdir $ppp;\n+\t\tprint $report "ping_pong_partners $group_dir/piRNAs/TEs.sam $ppp\\n";\n+\t\tping_pong_partners ( $group_dir.\'TEs.fai\', $group_dir.\'piRNAs/piRNAs-TEs_sorted.bam\', $ppp, $pi_min );\n+\t\tmy $ppp_page = $dir.$fastq_n[$child].\'-piRNAs-PPP.html\';\n+\t\tppp_page ( $group_dir, $ppp_page, \\@fastq_n, $fastq_n[$child], $ppp, $dir );\n+\t}\n+\n+\t#HTML Main Webpage\n+\tmy $index_page = $dir.$fastq_n[$child].\'.html\';\n+\tmain_page ( $gen_dir, $index_page, \\@fastq_n, $fastq_n[$child], $ma, $ma_uni, $dir );\n+  copy ($index_page, $html_out) if $child == 0;\n+\t#HTML Menu\n+\tmy $menu_page = $dir.$fastq_n[$child].\'-sub.html\';\n+\tmenu_page ( $group_dir, $menu_page, \\@fastq_n, $fastq_n[$child], $min, $max, $si_min, $si_max, $pi_min, $pi_max, $dir );\n+\tunlink glob "$group_dir*.sam"; unlink glob "$group_dir*.fastq";\n+\t$pm->finish(); # pass an exit code to finish\n+}\n+$pm->wait_all_children;\n+unlink glob $dir."dataset_*symlink.fa*"; \n+print $report "Job done!\\n";\n+close $report;\n'
b
diff -r e4e71401c577 -r 1df6aaac800e bin/subgroups.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/subgroups.pm Wed Dec 13 10:40:50 2017 -0500
[
@@ -0,0 +1,149 @@
+package subgroups;
+
+use strict;
+use warnings;
+use Exporter;
+our @ISA = qw( Exporter );
+our @EXPORT_OK = qw( &subgroups );
+
+use POSIX;
+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];
+ $repartition{'miRNAs'} = $mi;
+
+ my $sam = new String::Random;
+ $sam = $sam->randpattern("CCcccccc");
+ my $reject_rRNAs = $dir.'rRNAs_rejected.fastq';
+ @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';
+
+ $sam = new String::Random;
+ $sam = $sam->randpattern("CCcccccc");
+ my $reject_tRNAs = $dir.'tRNAs_rejected.fastq';
+ @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';
+
+ $sam = new String::Random;
+ $sam = $sam->randpattern("CCcccccc");
+ my $bonafide = $dir.'bonafide_reads.fastq';
+ @tmp = get_hash_alignment($snRNAs, $mis, 0, 1, 'NA', $bonafide, $reject_tRNAs, $proc, 'snRNAs', $sam, $report);
+ $repartition{'snRNAs'} = $tmp[0];
+ my $bo = $tmp[1];
+ unlink $sam, $sam.'_aln.err', $sam.'_samse.err';
+
+ 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 e4e71401c577 -r 1df6aaac800e test-data/TE-file-small.fa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/TE-file-small.fa Wed Dec 13 10:40:50 2017 -0500
b
b'@@ -0,0 +1,34 @@\n+>BATUMI_I\tBEL\tDrosophila melanogaster\n+ttttggtccttcgagccggatcacctggattttcaagtttgtccaccagcgaacaaattataagataagtacgaaatttccattccttttaattgccggtctgcagcaaaaggttcgaaaatccaatttcgttcaatttgctgtaagatttattgtcaaatctaacggatttctccgacaaaaggcaattaaagaaaagtacttatccaatctcacgggcgccgcatattactcgccgttctccgttctcctttcaccctcattcgtgaaaatttctaaagtccaaatgggcgaatatatttaaatattaatccagtgcgataatgcaaaattccaaatgtgaaaaagtgaataatttgtgccaagttcagtgaaactttctaagtccaaagctctgccaaaattggcaaaaattctgttctcgtttcactgtgtcaaagcgaagccaaacttcttttcgcaacacatttttgctttaactccgcagtccacttaataccatttgctttgctatcgaagaataccacaacgaaacaaacaacaccataccctctggccattcaaataacatattaattaacatttccgcagttccatatctcttacatcaacatatacctactccatactcttgcatatattcacatcttacacaatatatcctcaccatatattacatatattacatcaacatataatatccacatatattaccgacatacattgcgcatattatcagcattcctttaacgtataccaaagtttaaattcgatcccgtcggcaaatccaaccacaaataaaatttattccaagtgccgacgcggaaaggcgttttcttttccatcaattttttccgtaaatttccaaattaatttccgagcaataaattaaaagcggttttttctttttttttaacaaataacttattgttgaaaacatttattaaattattaaaaattatataaataatacgaccgccaaatacaagtcgttcacccgacaaatattttttcctgtattgcttggatattaatttgtgtttgttttagaagtacttacaacgcggagaaaagactccaaatccaccattccattttctccgtttccagttataaacaaaaaaataaataaaattttcttccttctaataaacattttattttaccgtgttcacattccaagtgttccaaccgtaaataaggtggacctaattaccataaatcacaggtcatttatacaattcgctgttcactccgagtcacctgtccaattagtctaaactacggcgtttccacttcgcaaattcaacaccactttctcacccattacatcctatacggtccttttccgctgctttataccgttcacggcaggaagcttaaatttattaagtggaatctgtctactttttcaaaagtgtgaccgggctccaaaaacgcttcccttccatttcgtatttcttcgattatgcccatcggggacgataagaagaaattgtccgctgacaaacccaggtctattttttcaccacaagggcccaagagtccaagaatcccaagcatttcggtgaaaacgcctgcgcagatttccgacgactgtgccactccatccaaagccacagtacagcgcacagctaaaaatatggctgcttccgatctagcgctagccaaattcatttcggtttctgacgctcaagcgaatttgaggctcagatcaacactccggaatccgcagctccaaccgtcacgatgcttagcgtccgtcgcgaccaagtccgaagcctatgggacaaggttgaaaagaattcgacctctgctcagagtgccttgtgtcagcaggcgagcggcagcaagcggcatgcctattctcagggctagttacagttattgctattcagtctatgaaaggtgtgttgcccagctcgttgataaaatcgagcaggggcacttctcagtccatcccaagcgaacgctgcggcccaggcctacatttcctctggctgtcggttgcctccatgcgatacaggagttttcgcaggtgactatcttcgctggccgctttccggatcttttacacgccatttatattaataatccacggctgactccgttcgaaaagttattccacttaaatgccaaaacaagtggcgacgcgcatgccatagtttcgatttcgcctctcaccaaacgagggttttcctctgcgtgggaaaacctaatagagcgtttcgaaaataaacgattgttggtaaacagtcaattgaaaatactgtttaatgtgcagtcgataccacaggaatctggggcggccttgaaggtaatgcaaagtactgttcaaggttgcttgactgccttagaactgtcaggcatcaacactgagaactgggactgcctgctggaatatctgtgttcatccaagctcccgaagataactctctccttatgggagcagtctctacataagaaagccgacatcccgacatggggagaactgaacaccttcctcacagaacgtcatcgaaccctagaggccatcgatgatgtgagaccgtccgtaccaagtcagtcgcactccaaagcgatgaactcaagtgggccctctagagatggcaagctggcgtccgacttgtgcaacaaggaaaaccatcctgtccgtgtatgtcgcgttttctccaaatggtcggttgacgaccggtcagcctacattaaacggaagcagttatgcttaaactactttgcaaagggacatcagcttcgtgagtgcaaagatcgacaaagttttacttggtggccggcatcacacgttgttgcaccgaaacaacctcttttccagcaattcaagcccttcaaatcctgcaagcccaatttccgctactcaggccaatttcgttccaaacgagcaagccggtgttcaaaattattttgccacggctcaagagctatccttcttggcagtgccataatcaatagttcccatcttggcactaactttaaggcacgcgccctgatcgactccggatcagaggcgacattcataaccgagccactgttcaatctaattagattgccattccaggtggttcaagcccaagtctcgggcttaaaccaaacagtagctgctcagttcaagaacgctgcagtttcaccatccgatctccgactaggccgcgttgcagttggagacgacggcctatgtcctccctcaactagccggaaatctgccttcctacccaattccgcaaaatttcttcgggatcttcccgattttccactggcggatccaaaattctatgagagcgccccaatagatgtacttatccggagcccacatcctgcttcggtgcttctgagtggagcaaaaaccaacatctgtggctctctcttggggcaagagaccattttccgctgggtactaactgggccagtgtcagcctcagcccaaagcaggattcctctttttcgacacagatctcccacgcgtacgataattcactggacaaactcctcacaaaatttggggaggtggaggatataccaacaaagttgcaaaagaatccgattccatgtgcgagaacgggttggtaaatgcttacgacgacaccagtgcggcaaatatgtcgttactctgccttttcgcgacccagaacatatcggttgcgggctagggcattctaggtcttgggcgttggctcagttcttgaagaatgagcagcgtctaaaaaaagatgaggccttgaaagcgagatacgattcggtgatccaggaatatctcgacttaaagcacatgcgacaagttctgcctacccatgattgcaacgcctattatatgccacatcacgccgtcttaaaaccggagagtgtaactactaaactccgtgtagtattcaatgcctccagcccttcatcgaatggtaccagtttaaatgatatccttcatgctgg'..b'ggaagtttataagagactttgcacgaataacgaagcccatgactaaacaattgaaagggaaaagacaagttactacagacaaagactttgtagacgcattcgaacagtgcaaaactcttctgtccaatgacccaatactcatacacccagacttcgaaaaaccattcattcttactacggatgctagtaacttcgcgttaggagccgtactatctcaaggctccttacaaaacgatagacctgtatgttttgccagcaggaccctctccgacaccgaagtcaactattcaaccatagaaaaagaaatgttggcaataatatgggcagtaaaatacttcagaccatatatttatggcgtaaaatttactattgttacagatcacaagccactaatatggcttatgaatttcaaagaacccaactcaaaaataattcgttggagactccaactcatggaatacaattttgaaataattcacaagaaaggttcacaaaatgtaattgcagacgccttaagtagagcggacccaaatttaaactacaacgaaacactgactgttaagccttgccccacatccgaaaaacctattaacgaatttaacacgcaactcatactagaaatagatacaaatacgtcttaccaaactacaacaccatttaaacaaaagattaggaaaaaatattcacagccttgcttcgatttcgataatattgttaaaatcttgaaaggaaccctaaaacctaacaggatttgcgcattcttggcggacgataataattccgcattaatcgaaaaagcattctcaacgtattttgcacataaaaaacactttaaaattatcagatgcaaatcacttctccacgaaatcgtaggaaaccccgaacaaaacaaattcattcaggaatatcacactaacagcaaccacagaggcatagacgaaacattccttcacctcaaacgagaaacctacttccccaatatgaaaaacaaaatctctgaattaattaggaattgcgaaacctgtctaaaactcaaatacgacaggcaaccacaaaatatagtatttgaaaccccagaaaccccatcgaaacccctcgacataatacacatagacatctatactattaacaataattttaacctgacaatcatagacaaattctcaaaattcgcagctgtctaccccatcccaaatagaaacggcatcaattgcatcaaagcaatcaaaaattttttcagtcaattcggactacccaaaaaactaatacacgaccaaggagtagaattttgcaacgacatatttcgaaagttttgctctcaatataatatacttctccatgtcacatccttccagcaatcttcaagtaattctccagtagaacgtttacactcctctttgacagagatttacagaataatactagacacacggaaaaaacacaaattacctacagaccacgaagaaataatgtcagaaactgtaataacatataacaacgcaatccactccaccaccaaacacaccccttttgaactttttaatggtaggacccatttattcgagaaaacaataatacccaataatgagcatgactatttaaataaactaaatacgttccaagacaaactatactccgaaataaaagaaaaattgtccacaaacacccaacaaaggatagaaaagctaaacacaagcagagtagaaccaacaacagtacaacctaacagcacaattttcagaaaagaaaacaggagaaataaattaacaccacggttttccttacacagaacagcaaaagacaaaggaaaaactctagtaaccacaagaaatcaaaaaatccacaaatcaaaaattaggaaaatatccaaacctccaaatgacttaagcctttccacctgcattccagatcttgccatggggcataccaatctatcttcatccacaacttcaatagcaccaacctcctagcaaaagtgccggtagggaaaacactcgtgataggaaactataaaaaaattagccacataatcgatctgtccgaatacaccaactgtattgaaaaattataccacaccatcgataccctaagacaagatgaaacactcaccgattctatatcaatactaaatgctaaactggcccaaactcaaagtaaaatagacgcactaacacccttttcacgccacaaaagaggtcttattaacgggttaggtagtttagtcaaagtcgtcaccggcaacatggacgccaatgatgcaaagaatatagaaacagaaattaaccacttaaaaagccagtccaccactatctcagataacttcgaaatacagaactcgttcaatgatgaagttcaactacggttcaaaaacttaacaagacacattaacaatgaacagaatttgattaaaaacttcttcgaaaacactcaaaatacaatttacacaaaaatatacaacaacgaagaagaaataaagaaactacaatatataaataggcttaactacaatatagatttattagttagccacctaagcgacattatagaaagtacactgcttgccaaaattaatgttatcccaaaactcatcttagacaagacagaaataaccaaaatcaaacaaatttttaaaacacaaaactacacaataaaatccgagcaacacatttataacctcttaaaaatgaacgcactcaattaccaaaacaaaataatttttagtatcaaaattcctatttttttaagttgtaactacgaaatggcaagattaattccacttccaataaattccacacaatttgtaatagcacctaagtacttaatatataataacaaaagtaacagcatgttttcaactatgtataaatgtcctgtaatagaagaacaattcgtctgcgaaatcgactccatcaataatcttaaaaataatacttgcctgggacaccttatccaaaataagaccagctactgcgacataaaggaaacgggactcacgactgatgtgttcgaaccggaaaaaggcttcatacttgtatttaacgggaacaacctcccaatcatctcctccaaccagaccataactagtatcaatggatcagctataataaagtataacaattgcacattaaaaatcaatgaaataaactacgacaacagggcggtatcaacagaagagcaccccgacttcttcctaccaccaatgcggaaactaataaaaaatgccactatcaacatactcaccttggaaagacttcacctggatacactcacaacatccaataagctactggtcgtcgccgcaggaaactctcgacactcgacaaccttgtatatcctcttcaccgtatccctagtcgccgtaatactcacctggacacttcgaagggacacccacatcttccataccgggcccgaccacattcttccaatcgtcgctccaccaattcctccgtctatggccttcgctccaaactggggggggagg\n+>ZAM_LTR\tGypsy\tDrosophila melanogaster\n+agttaccgacccatcggtaccatacaccacccctccctctaagccaccacgcctacacaagtagaagacatcgaaccgggaagctttgcgatacaaagttgcagcataaacatcaacaacgggtcagacgccgacatccgcccaaaatgctgacaccacatccttttcgctcagacagaacaacgcatacaattccatatacatacgtataaacatactcatactttctgctgtgtcagatactttatttctaagaactttaacattgtaatacatacacacatattcactgttagcccatttaagacgaagaataaagacgaccacagtcgagtgcaagcagcaaacacttgtagacgtacataatctccgatcaaaattctcccaagacgaccgtggctacgttctggacccgcataactcctctatctttctgagtgataatacctccgcaagactccccggaggtaac\n'
b
diff -r e4e71401c577 -r 1df6aaac800e test-data/dmel-all-rRNA-r6.03.fasta
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/dmel-all-rRNA-r6.03.fasta Wed Dec 13 10:40:50 2017 -0500
b
b'@@ -0,0 +1,294 @@\n+>FBtr0086345 type=rRNA; loc=2R:complement(19766144..19766278); ID=FBtr0086345; name=5SrRNA:CR33353-RA; dbxref=FlyBase:FBtr0086345,FlyBase_Annotation_IDs:CR33353-RA,REFSEQ:NR_001892; score=0; score_text=Weakly Supported; MD5=9162f14f3b33b2210e2100cada0b7f92; length=135; parent=FBgn0053353; release=r6.03; species=Dmel; \n+GCCAACGACCATACCACGCTGAATACATCGGTTCTCGTCCGATCACCGAAATTAAGCAGCGTCGGGCGCGGTTAGTACTTAGATGAGGGACCGCTTGGGAACACCGCGTGTTGTTGGCCTCGTCCACAACTTTTT\n+>FBtr0086346 type=rRNA; loc=2R:complement(19765775..19765909); ID=FBtr0086346; name=5SrRNA:CR33354-RA; dbxref=FlyBase:FBtr0086346,FlyBase_Annotation_IDs:CR33354-RA,REFSEQ:NR_001891; score=0; score_text=Weakly Supported; MD5=9162f14f3b33b2210e2100cada0b7f92; length=135; parent=FBgn0053354; release=r6.03; species=Dmel; \n+GCCAACGACCATACCACGCTGAATACATCGGTTCTCGTCCGATCACCGAAATTAAGCAGCGTCGGGCGCGGTTAGTACTTAGATGAGGGACCGCTTGGGAACACCGCGTGTTGTTGGCCTCGTCCACAACTTTTT\n+>FBtr0086347 type=rRNA; loc=2R:complement(19765409..19765543); ID=FBtr0086347; name=5SrRNA:CR33355-RA; dbxref=FlyBase:FBtr0086347,FlyBase_Annotation_IDs:CR33355-RA,REFSEQ:NR_001890; score=0; score_text=Weakly Supported; MD5=9162f14f3b33b2210e2100cada0b7f92; length=135; parent=FBgn0053355; release=r6.03; species=Dmel; \n+GCCAACGACCATACCACGCTGAATACATCGGTTCTCGTCCGATCACCGAAATTAAGCAGCGTCGGGCGCGGTTAGTACTTAGATGAGGGACCGCTTGGGAACACCGCGTGTTGTTGGCCTCGTCCACAACTTTTT\n+>FBtr0086349 type=rRNA; loc=2R:complement(19764648..19764782); ID=FBtr0086349; name=5SrRNA:CR33357-RA; dbxref=FlyBase:FBtr0086349,FlyBase_Annotation_IDs:CR33357-RA,REFSEQ:NR_001888; score=0; score_text=Weakly Supported; MD5=dacf3866c94cfe27156e359c01e8f212; length=135; parent=FBgn0053357; release=r6.03; species=Dmel; \n+GCCAACGACCATACCACGCTGAATACATCGGTTCTCGTCCGATCACCGAAATTAAGCAGCGTCGGGCGCGGTTAGTACTTAGATGGGGGACCGCTTGGGAACACCGCGTGTTGTTGGCCTCGTCCACAACTTTTT\n+>FBtr0086350 type=rRNA; loc=2R:complement(19764289..19764423); ID=FBtr0086350; name=5SrRNA:CR33358-RA; dbxref=FlyBase:FBtr0086350,FlyBase_Annotation_IDs:CR33358-RA,REFSEQ:NR_001887; score=0; score_text=Weakly Supported; MD5=dacf3866c94cfe27156e359c01e8f212; length=135; parent=FBgn0053358; release=r6.03; species=Dmel; \n+GCCAACGACCATACCACGCTGAATACATCGGTTCTCGTCCGATCACCGAAATTAAGCAGCGTCGGGCGCGGTTAGTACTTAGATGGGGGACCGCTTGGGAACACCGCGTGTTGTTGGCCTCGTCCACAACTTTTT\n+>FBtr0086351 type=rRNA; loc=2R:complement(19763913..19764047); ID=FBtr0086351; name=5SrRNA:CR33359-RA; dbxref=FlyBase:FBtr0086351,FlyBase_Annotation_IDs:CR33359-RA,REFSEQ:NR_001886; score=0; score_text=Weakly Supported; MD5=dacf3866c94cfe27156e359c01e8f212; length=135; parent=FBgn0053359; release=r6.03; species=Dmel; \n+GCCAACGACCATACCACGCTGAATACATCGGTTCTCGTCCGATCACCGAAATTAAGCAGCGTCGGGCGCGGTTAGTACTTAGATGGGGGACCGCTTGGGAACACCGCGTGTTGTTGGCCTCGTCCACAACTTTTT\n+>FBtr0086352 type=rRNA; loc=2R:complement(19763544..19763678); ID=FBtr0086352; name=5SrRNA:CR33360-RA; dbxref=FlyBase:FBtr0086352,FlyBase_Annotation_IDs:CR33360-RA,REFSEQ:NR_001885; score=0; score_text=Weakly Supported; MD5=dacf3866c94cfe27156e359c01e8f212; length=135; parent=FBgn0053360; release=r6.03; species=Dmel; \n+GCCAACGACCATACCACGCTGAATACATCGGTTCTCGTCCGATCACCGAAATTAAGCAGCGTCGGGCGCGGTTAGTACTTAGATGGGGGACCGCTTGGGAACACCGCGTGTTGTTGGCCTCGTCCACAACTTTTT\n+>FBtr0086353 type=rRNA; loc=2R:complement(19763175..19763309); ID=FBtr0086353; name=5SrRNA:CR33361-RA; dbxref=FlyBase:FBtr0086353,FlyBase_Annotation_IDs:CR33361-RA,REFSEQ:NR_001884; score=0; score_text=Weakly Supported; MD5=9162f14f3b33b2210e2100cada0b7f92; length=135; parent=FBgn0053361; release=r6.03; species=Dmel; \n+GCCAACGACCATACCACGCTGAATACATCGGTTCTCGTCCGATCACCGAAATTAAGCAGCGTCGGGCGCGGTTAGTACTTAGATGAGGGACCGCTTGGGAACACCGCGTGTTGTTGGCCTCGTCCACAACTTTTT\n+>FBtr0086354 type=rRNA; loc=2R:complement(19762802..19762936); ID=FBtr0086354; name=5SrRNA:CR33362-RA; dbxref=FlyBase:FBtr0086354,FlyBase_Annotation_IDs:CR33362-RA,REFSEQ:NR_001883; score=0; score_text=Weakly Supported; MD5=dacf3866c94cfe27156e359c01e8f212; length=135; parent=FBgn0053362; release=r6.03; species=Dme'..b'AATTATCATTGATTTTTGTGTTTATTATATGCACTTGTATGATTAACAATGCGAAAGATTCAGGATACCTTCGGGACCCGTCTTGAAACACGGACCAAGGAGTCTAACATATGTGCAAGTTATTGGGATATAAACCTAATAGCGTAATTAACTTGACTAATAATGGGATTAGTTTTTTAGCTATTTATAGCTAATTAACACAATCCCGGGGCGTTCTATATAGTTATGTATAATGTATATTTATATTATTTATGCCTCTAACTGGAACGTACCTTGAGCATATATGCTGTGACCCGAAAGATGGTGAACTATACTTGATCAGGTTGAAGTCAGGGGAAACCCTGATGGAAGACCGAAACAGTTCTGACGTGCAAATCGATTGTCAGAATTGAGTATAGGGGCGAAAGACCAATCGAACCATCTAGTAGCTGGTTCCTTCCGAAGTTTCCCTCAGGATAGCTGGTGCATTTTAATATTATATAAAATAATCTTATCTGGTAAAGCGAATGATTAGAGGCCTTAGGGTCGAAACGATCTTAACCTATTCTCAAACTTTAAATGGGTAAGAACCTTAACTTTCTTGATATGAAGTTCAAGGTTATGATATAATGTGCCCAGTGGGCCACTTTTGGTAAGCAGAACTGGCGCTGTGGGATGAACCAAACGTAATGTTACGGTGCCCAAATTAACAACTCATGCAGATACCATGAAAGGCGTTGGTTGCTTAAAACAGCAGGACGGTGATCATGGAAGTCGAAATCCGCTAAGGAGTGTGTAACAACTCACCTGCCGAAGCAACTAGCCCTTAAAATGGATGGCGCTTAAGTTGTATACCTATACATTACCGCTAAAGTAGATGATTTATATTACTTGTGATATAAATTTTGAAACTTTAGTGAGTAGGAAGGTACAATGGTATGCGTAGAAGTGTTTGGCGTAAGCCTGCATGGAGCTGCCATTGGTACAGATCTTGGTGGTAGTAGCAAATAATCGAATGAGACCTTGGAGGACTGAAGTGGAGAAGGGTTTCGTGTGAACAGTGGTTGATCACGAGTTAGTCGGTCCTAAGTTCAAGGCGAAAGCCGAAAATTTTCAAGTAAAACAAAAATGCCTAACTATATAAACAAAGCGAATTATAATACACTTGAATAATTTTGAACGAAAGGGAATACGGTTCCAATTCCGTAACCTGTTGAGTATCCGTTTGTTATTAAATATGGGCCTCGTGCTCATCCTGGCAACAGGAACGACCATAAAGAAGCCGTCGAGAGATATCGGAAGAGTTTTCTTTTCTGTTTTATAGCCGTACTACCATGGAAGTCTTTCGCAGAGAGATATGGTAGATGGGCTAGAAGAGCATGACATATACTGTTGTGTCGATATTTTCTCCTCGGACCTTGAAAATTTATGGTGGGGACACGCAAACTTCTCAACAGGCCGTACCAATATCCGCAGCTGGTCTCCAAGGTGAAGAGTCTCTAGTCGATAGAATAATGTAGGTAAGGGAAGTCGGCAAATTAGATCCGTAACTTCGGGATAAGGATTGGCTCTGAAGATTGAGATAGTCGGGCTTGATTGGGAAACAATAACATGGTTTATGTGCTCGTTCTGGGTAAATAGAGTTTCTAGCATTTATGTTAGTTACTTGTTCCCCGGATAGTTTAGTTACGTAGCCAATTGTGGAACTTTCTTGCTAAAATTTTTAAGAATACTATTTGGGTTAAACCAATTAGTTCTTATTAATTATAACGATTATCAATTAACAATCAATTCAGAACTGGCACGGACTTGGGGAATCCGACTGTCTAATTAAAACAAAGCATTGTGATGGCCCTAGCGGGTGTTGACACAATGTGATTTCTGCCCAGTGCTCTGAATGTCAAAGTGAAGAAATTCAAGTAAGCGCGGGTCAACGGCGGGAGTAACTATGACTCTCTTAAGGTAGCCAAATGCCTCGTCATCTAATTAGTGACGCGCATGAATGGATTAACGAGATTCCTACTTGTCCCTATCTACTATCTAGCGAAACCACAGCCAAGGGAACGGGCTTGGAATAATTAGCGGGGAAAGAAGACCCTTTTGAGCTTGACTCTAATCTGGCAGTGTAAGGAGACATAAGAGGTGTAGAATAAGTGGGAGATATTAGACCTCGGTTTGGTATCGTCAATGAAATACCACTACTCTTATTGTTTCCTTACTTACTTGATTAAATGGAACGTGTATCATTTCCTAGCCATTATACGGATATATTTATTATATCTTATGGTATTGGGTTTTGATGCAAGCTTCTTGATCAAAGTATCACGAGTTTGTTATATAATCGCAAACAAATTCTTTAATAAAACGATGCATTTATGTATTTTTGATTTGAAAATTTGGTATAACTCCAATTACTCAGGTATGATCCAATTCAAGGACATTGCCAGGTAGGGAGTTTGACTGGGGCGGTACATCTCTCAAATAATAACGGAGGTGTCCCAAGGCCAGCTCAGTGCGGACAGAAACCACACATAGAGCAAAAGGGCAAATGCTGACTTGATCTCGGTGTTCAGTACACACAGGGACAGCAAAAGCTCGGCCTATCGATCCTTTTGGTTTAAAGAGTTTTTAACAAGAGGTGTCAGAAAAGTTACCATAGGGATAACTGGCTTGTGGCGGCCAAGCGTTCATAGCGACGTCGCTTTTTGATCCTTCGATGTCGGCTCTTCCTATCATTGTGAAGCAAAATTCACCAAGCGTTGGATTGTTCACCCATGCAAGGGAACGTGAGCTGGGTTTAGACCGTCGTGAGACAGGTTAGTTTTACCCTACTAATGACAAAACGTTGTTGCGACAGCATTCCTGCGTAGTACGAGAGGAACCGCAGGTACGGACCAATGGCACAATACTTGTTCGAGCGAACAGTGGTATGACGCTACGTCCGTTGGATTATGCCTGAACGCCTCTAAGGTCGTATCCGTGCTGGACTGCAATGATAAATAAGGGGCAATTTGCATTGTATGGCTTCTAAACCATTTAAAGTTTATAATTTACTTTATAAACGACAATGGATGTGATGCCAATGTAATTTGTAACATAGTAAATTGGGAGGATCTTCGATCACCTGATGCCGCGCTAGTTACATATAAAAGCATTATTTAATACAATGACAAAGCCTAGAATCAATTGTAAACGACTTTTGTAACAGGCAAGGTGTTGTAAGTGGTTGAGCAGCTGCCATACTGCGATCCACTGAAGCTTATCCTTTGCTTGATGATTCGA\n+>FBtr0346887 type=rRNA; loc=rDNA:46205..46327; ID=FBtr0346887; name=5.8SrRNA:CR45852-RA; dbxref=FlyBase:FBtr0346887,FlyBase_Annotation_IDs:CR45852-RA; score=1; score_text=Weakly Supported; MD5=7f8e1dfdda0f9ae351c9e28c52e54e21; length=123; parent=FBgn0267512; release=r6.03; species=Dmel; \n+AACTCTAAGCGGTGGATCACTCGGCTCATGGGTCGATGAAGAACGCAGCAAACTGTGCGTCATCGTGTGAACTGCAGGACACATGAACATCGACATTTTGAACGCATATCGCAGTCCATGCTG\n+>FBtr0346898 type=rRNA; loc=X:23291700..23291729; ID=FBtr0346898; name=2SrRNA:CR45864-RA; dbxref=FlyBase:FBtr0346898,FlyBase_Annotation_IDs:CR45864-RA; score=1; score_text=Weakly Supported; MD5=79181b9131521cbf99fa2d8f99e7b410; length=30; parent=FBgn0267524; release=r6.03; species=Dmel; \n+TGCTTGGACTACATATGGTTGAGGGTTGTA\n'
b
diff -r e4e71401c577 -r 1df6aaac800e test-data/dmel-all-sn-snoRNA-r6.03.fasta
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/dmel-all-sn-snoRNA-r6.03.fasta Wed Dec 13 10:40:50 2017 -0500
b
b'@@ -0,0 +1,638 @@\n+>FBtr0081560 type=snoRNA; loc=3R:complement(7472907..7473222); ID=FBtr0081560; name=scaRNA:MeU5-C46-RA; dbxref=FlyBase:FBtr0081560,FlyBase_Annotation_IDs:CR32863-RA,REFSEQ:NR_001999; score=0; score_text=Weakly Supported; MD5=001dca55ff90bbedfc8b9a3593a2c84c; length=316; parent=FBgn0043853; release=r6.03; species=Dmel; \n+TGCCCATGATGAAATATTCGACATCGGAGTTTGCGCATTGGCGACAAGACCTAAGGCTCAGACTCTAGCAAATCTAGTTTCATCCGTTGTAATCTTTGCTGCTGCACTCCAGAATTTGCAGTGGCCGTAAGGCCAGCGGGACACCAACAGCCAGGGATCAAGACTATTATCTGTCATTGAGTCCTAGACAGATAGTTTAGTCTCTGGTTTACAGAACACCCAAATGGAAATGAAACACGCGCTTTTGTCGACCCAGGAGCCAGTTAGGTCTAAGCTGTTTGTCATGGTGACGACGTCTTTAGTAATCTGAGCGCAA\n+>FBtr0070292 type=snoRNA; loc=X:complement(1482492..1482590); ID=FBtr0070292; name=snoRNA:M-RA; dbxref=FlyBase:FBtr0070292,FlyBase_Annotation_IDs:CR32807-RA,REFSEQ:NR_002093; score=0; score_text=Weakly Supported; MD5=81314d41b5db15222ab4c0daca9e3a65; length=99; parent=FBgn0044508; release=r6.03; species=Dmel; \n+AATTCAATGATTTCAACTTCACTGCTGACCAGCCACGCCTCAACGCCTCGGAGTGTTTGCCCCCAGTCTCTGATAGATACACCATATTCTAATACACAC\n+>FBtr0076635 type=snoRNA; loc=3L:8601948..8602031; ID=FBtr0076635; name=snoRNA:U49:66Db-RA; dbxref=FlyBase:FBtr0076635,FlyBase_Annotation_IDs:CR32910-RA,REFSEQ:NR_001955; score=0; score_text=Weakly Supported; MD5=b2175b964d1d7e4cbe00bd8e55b73ca8; length=84; parent=FBgn0060291; release=r6.03; species=Dmel; \n+CTGCACATGATGATAATTGAAAGTTCTTGATAGGAATTGCCGGCTGACACATATATGAAGCTAATTCTAGTTTATCTGATTACA\n+>FBtr0076634 type=snoRNA; loc=3L:8601473..8601552; ID=FBtr0076634; name=snoRNA:U49:66Da-RA; dbxref=FlyBase:FBtr0076634,FlyBase_Annotation_IDs:CR32911-RA,REFSEQ:NR_001954; score=0; score_text=Weakly Supported; MD5=9f94db9a46640f6af279661b83c98768; length=80; parent=FBgn0060292; release=r6.03; species=Dmel; \n+TGCACATGATGATAATTTGTCTTCTTGATAGGAAGTGCCAACTGACACATAAATGAAGCTAGTTTAACCCTCTGAAAGCA\n+>FBtr0086857 type=snoRNA; loc=2R:17702873..17702949; ID=FBtr0086857; name=snoRNA:snR38:54Ec-RA; dbxref=FlyBase:FBtr0086857,FlyBase_Annotation_IDs:CR32901-RA,REFSEQ:NR_001769; score=1; score_text=Weakly Supported; MD5=b4b17beebede66cbd74a108e03863fa7; length=77; parent=FBgn0063373; release=r6.03; species=Dmel; \n+ATGATGTGATGAACACCTTATTTAAGCCAAACAGTTATCCCTGTCATAAGAATAATTGATGATATATTCAGCTGACA\n+>FBtr0086852 type=snoRNA; loc=2R:17701689..17701764; ID=FBtr0086852; name=snoRNA:snR38:54Eb-RA; dbxref=FlyBase:FBtr0086852,FlyBase_Annotation_IDs:CR32896-RA,REFSEQ:NR_001764; score=0; score_text=Weakly Supported; MD5=8d40774ceb21d85153c649f6fc4db139; length=76; parent=FBgn0063374; release=r6.03; species=Dmel; \n+CCTTTGTGATGAGCATCCTTTTAAAGCCAAACAGTTATCCCTGTCATAAGAATAATTGATGATACAATAATCTGAC\n+>FBtr0086851 type=snoRNA; loc=2R:17701447..17701523; ID=FBtr0086851; name=snoRNA:Me28S-G3277a-RA; dbxref=FlyBase:FBtr0086851,FlyBase_Annotation_IDs:CR32893-RA,REFSEQ:NR_001763; score=0; score_text=Weakly Supported; MD5=600b5d664ea787a79c37dee706e5f5c3; length=77; parent=FBgn0063375; release=r6.03; species=Dmel; \n+GGGCAATGATGAACACTTTATTTAAGCCAAACAGTTATCCCTGTCATAAGAATAATTGATGATAAAAGTTGCTGATT\n+>FBtr0086848 type=snoRNA; loc=2R:17700741..17700813; ID=FBtr0086848; name=snoRNA:U76:54Eb-RA; dbxref=FlyBase:FBtr0086848,FlyBase_Annotation_IDs:CR32891-RA,REFSEQ:NR_001760; score=0; score_text=Weakly Supported; MD5=f3741fc5731e0cc5330b00315b4c69eb; length=73; parent=FBgn0063376; release=r6.03; species=Dmel; \n+TGAAAATGATGATTAATTATTATTTGCTACTCTTGAAGAGCTTTGATGAATACTTACACCTTAGAAACTGAGT\n+>FBtr0086845 type=snoRNA; loc=2R:17699932..17700004; ID=FBtr0086845; name=snoRNA:Me28S-A1666a-RA; dbxref=FlyBase:FBtr0086845,FlyBase_Annotation_IDs:CR32889-RA,REFSEQ:NR_001757; score=1; score_text=Weakly Supported; MD5=31c77ac9f94d8024de98d0866f13ded1; length=73; parent=FBgn0063377; release=r6.03; species=Dmel; \n+TGTAAATGATGATTTATTATTATTTGCTACTCTTGAAGGTCATTGATGAATACTTTCACCTTAAAACCTGATG\n+>FBtr0086855 type=snoRNA; loc=2R:17702411..17702477; ID=FBtr0086855; name=snoRNA:U31:54Ed-RA; dbxref=FlyBase:FBtr0086855,FlyBase_Annotation_IDs:CR32899-RA,REFSEQ:NR_001767; score=1; score'..b'1f5; length=192; parent=FBgn0041720; release=r6.03; species=Dmel; \n+ATCGCTTCTCGGCCTTATGGCTAAGATCAAAGTGTAGTATCTGTTCTTATCAGCTTAACATCTGATAGTTCCTCCATTGGAGGACAACAAATGTTAAACTGATTTTTGGAATCAGACGGAGTGCTAGGAGCTTGCTCCACCTCTGTCGCGGGTTGGCCCGGTATTGCAGTACCGCCGGGATTTCGGCCCAAC\n+>FBtr0075315 type=snRNA; loc=3L:16653769..16654006; ID=FBtr0075315; name=snRNA:U12:73B-RA; dbxref=FlyBase:FBtr0075315,FlyBase_Annotation_IDs:CR32162-RA,REFSEQ:NR_001972; score=0; score_text=Weakly Supported; MD5=d1d774f1395d1eac2663f02d5417bf80; length=238; parent=FBgn0041721; release=r6.03; species=Dmel; \n+GTGCCTCAAACTAATGAGTAAGGAAAACCAATCAGCCTTGCTAATCGCTTGGCAGTATTGGCTTCTAGGCAGGGGGGCGTGTCCCGCGCCCCTTGAAGCTCAAATTTTTGCAAGGGCACAGGTCGTCCCCTCCTCCTCCGCGTGGGTGGCGTTCGGCCGAGCGAACCGGCGCCTACTTTGCGTCCGGCTAGCGAGGATCTCTGGGTGCCATCCCACGGCTGGGTGTTGCGATCTGCCC\n+>FBtr0081294 type=snRNA; loc=2L:19816414..19816540; ID=FBtr0081294; name=snRNA:U5:38ABb-RA; dbxref=FlyBase:FBtr0081294,FlyBase_Annotation_IDs:CR32880-RA,REFSEQ:NR_001674; score=0; score_text=Weakly Supported; MD5=a01600165b1bf498f3106a7b1d3e6994; length=127; parent=FBgn0043021; release=r6.03; species=Dmel; \n+ACTCTGGTTTCTCTTCAATTGTCGAATAAATCTTTCGCCTTTTACTAAAGATTTCCGTGGAGAGGAACACTCTAATGAGTCTAAACACAATTTTTATTGAGGCCTGATAACTTATGCTATCGGGCCA\n+>FBtr0081315 type=snRNA; loc=2L:complement(19811948..19812074); ID=FBtr0081315; name=snRNA:U5:38ABa-RA; dbxref=FlyBase:FBtr0081315,FlyBase_Annotation_IDs:CR32881-RA,REFSEQ:NR_001671; score=0; score_text=Weakly Supported; MD5=668f472d3ac9ab7cff94b99e52c1cd78; length=127; parent=FBgn0043022; release=r6.03; species=Dmel; \n+TACTCTGGTTTCTCTTCAATTGTCGAATAAATCTTTCGCCTTTTACTAAAGATTTCCGTGGAGAGGAACACTCTAATGAGTCTAAACTCAATTTTTGTATGACCTGGCTAAATATTTAGTTGGGCCA\n+>FBtr0100848 type=snRNA; loc=3L:3593823..3593893; ID=FBtr0100848; name=snRNA:U7-RA; dbxref=FlyBase_Annotation_IDs:CR33504-RA,FlyBase:FBtr0100848,REFSEQ:NR_002270; score=0; score_text=Weakly Supported; MD5=deb394a435f81cd75ed6b95c5a32647e; length=71; parent=FBgn0053504; release=r6.03; species=Dmel; \n+ATTGAAAATTTTTATTCTCTTTGAAATTTGTCTTGGTGGGACCCTTTGTCTAGGCATTGAGTGTTCCCGTT\n+>FBtr0091929 type=snRNA; loc=3R:complement(7474553..7474996); ID=FBtr0091929; name=snRNA:7SK-RA; dbxref=FlyBase:FBtr0091929,FlyBase_Annotation_IDs:CR33925-RA,REFSEQ:NR_002493,REFSEQ:NR_002493,REFSEQ:NR_002493; score=0; score_text=Weakly Supported; MD5=7cfa92ec944a572fe4ebf5510d257106; length=444; parent=FBgn0065099; release=r6.03; species=Dmel; \n+GGAAGTGTATTCTGTGATTGTTCTGTACATTGATCGATATTCAGGTAACTGCATCTGCTTATCAGATCTGTTCAGAGCCGACCCTCCGTCACACCTTTGTGTTTCCCAGTAATTCTGCCTGGCGTTGCCGTGGCTCCTCGTTCGGATCGGCTTTCCGCTGCCTTCCACTGGATGACGACGGGTTATCCGGCGGTCGACGCACGGTCATGCACCCCCGATCCGTCGCCCCCACCACCCCGCGGATTCTGGTCTCGACCGGAAGCCGTATTGGGCGGGGACGGGCGGCGGTCCGGTGCTGAAGCCGGCGACAGTTGCCCGAGTCAGCCACTTTCAAAATTTGTTGGTTAAGTAACTTAGTAGCTTAGCTTCGGATTTTCGTAACAAATTTGCTGTTCAGAACACTTCCATGTACGCGGCATTGCCGAGCAATTTGCCCATTCTTTT\n+>FBtr0111039 type=snRNA; loc=3L:complement(3893056..3893330); ID=FBtr0111039; name=snRNA:U11-RA; dbxref=FlyBase:FBtr0091696,FlyBase:FBtr0111039,FlyBase_Annotation_IDs:CR34151-RA,FlyBase_Annotation_IDs:CR33708-RA,REFSEQ:NR_003121; score=1; score_text=Weakly Supported; MD5=614c010295f08932d4b6d778d2e59eab; length=275; parent=FBgn0083987; release=r6.03; species=Dmel; \n+AAAAAGGGTGCTCGTCCTGGCACGTTTCCGATCACGAAACTCAAGTGCGGACGCATTGCGCCGCAGGAGCGTCTCCTTCGCTCCGCCCCTGGACTTCTCCGGGGATAGGCGGGGGCGAGCGTTCCATTGCCGCCTTCGACGCCTCCTTGCGCGCCCAGTGGGGTATGGCTTTGCATATCCAGTGCGTAATTTTTGTATTTGGGGCCGCGGCTGCACATTGTGGATTGCTCGGGGATTCCCGGATCTCCCTGCGTGCCAGTGCGCTGCGCCCCGCC\n+>FBtr0306791 type=snRNA; loc=3R:complement(5195004..5195163); ID=FBtr0306791; name=snRNA:U4atac:82E-RA; dbxref=REFSEQ:NR_048324,FlyBase:FBtr0306791,FlyBase_Annotation_IDs:CR43269-RA; score=0; score_text=Weakly Supported; MD5=e1ae4c911a264f805369d33185bc3304; length=160; parent=FBgn0263018; release=r6.03; species=Dmel; \n+ACCTTCCTTGTCTTGGGGAGCAGAAATGTTCAATGAACGTCTAGTGAGGACATTGCTGCTGACACCAATGATGACACCCCCGCTCGCCGATCGTTCGCGATTGGAGTTCGGAATTTTTGGACCAGGCTCCTTTACTTTACAGGGAGCCGCCTCTTGAATG\n'
b
diff -r e4e71401c577 -r 1df6aaac800e test-data/dmel-all-tRNA-r6.03.fasta
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/dmel-all-tRNA-r6.03.fasta Wed Dec 13 10:40:50 2017 -0500
b
b'@@ -0,0 +1,671 @@\n+>FBtr0086234 type=tRNA; loc=2R:20657891..20657962; ID=FBtr0086234; name=tRNA:CR30155-RA; dbxref=FlyBase:FBtr0086234,FlyBase_Annotation_IDs:CR30155-RA; score=0; score_text=Weakly Supported; MD5=243cf738b4d1a6d2ea2ee34d091c0d0a; length=72; parent=FBgn0050155; release=r6.03; species=Dmel; \n+GACTCCGTGGCGCAACGGTAGCGCGTCTGACTCCAGATCAGAAGGTTGCGTGTTCAAATCACGTCGGGGTCA\n+>FBtr0072445 type=tRNA; loc=2R:25076005..25076076; ID=FBtr0072445; name=tRNA:CR30198-RA; dbxref=FlyBase:FBtr0072445,FlyBase_Annotation_IDs:CR30198-RA; score=0; score_text=Weakly Supported; MD5=0402c54abcbe0755c6f346504ea6eadc; length=72; parent=FBgn0050198; release=r6.03; species=Dmel; \n+GGGGACGTAGCTCAGTGGTAGAGCGCTCGCTTCGCATGTGAGAAGTCCCGGGTTCAAACCCCGGCGTCTCCA\n+>FBtr0072446 type=tRNA; loc=2R:25076765..25076836; ID=FBtr0072446; name=tRNA:CR30199-RA; dbxref=FlyBase:FBtr0072446,FlyBase_Annotation_IDs:CR30199-RA; score=0; score_text=Weakly Supported; MD5=0402c54abcbe0755c6f346504ea6eadc; length=72; parent=FBgn0050199; release=r6.03; species=Dmel; \n+GGGGACGTAGCTCAGTGGTAGAGCGCTCGCTTCGCATGTGAGAAGTCCCGGGTTCAAACCCCGGCGTCTCCA\n+>FBtr0072447 type=tRNA; loc=2R:25077048..25077119; ID=FBtr0072447; name=tRNA:CR30200-RA; dbxref=FlyBase:FBtr0072447,FlyBase_Annotation_IDs:CR30200-RA; score=0; score_text=Weakly Supported; MD5=0402c54abcbe0755c6f346504ea6eadc; length=72; parent=FBgn0050200; release=r6.03; species=Dmel; \n+GGGGACGTAGCTCAGTGGTAGAGCGCTCGCTTCGCATGTGAGAAGTCCCGGGTTCAAACCCCGGCGTCTCCA\n+>FBtr0071983 type=tRNA; loc=2R:complement(23072019..23072100); ID=FBtr0071983; name=tRNA:CR30201-RA; dbxref=FlyBase:FBtr0071983,FlyBase_Annotation_IDs:CR30201-RA; score=0; score_text=Weakly Supported; MD5=b1d29cdc3617f5d88834dfcf6cb94669; length=82; parent=FBgn0050201; release=r6.03; species=Dmel; \n+GCTGCGGTGTCCGAGTGGTTAAGGAGATGGACTTGAAATCCATTGGGTTCTACCCGCACAGGTTCAAGTCCTGTCCGCA\n+GCG\n+>FBtr0071962 type=tRNA; loc=2R:23072581..23072662; ID=FBtr0071962; name=tRNA:CR30202-RA; dbxref=FlyBase:FBtr0071962,FlyBase_Annotation_IDs:CR30202-RA; score=0; score_text=Weakly Supported; MD5=79b58dd799cb26435c738e215a4d9d46; length=82; parent=FBgn0050202; release=r6.03; species=Dmel; \n+GTTGCGGTGTCCGAGTGGTTAAGGAGATGGACTTGAAATCCATTGGGTTCTACCCGCGCAGGTTCGAATCCTGTCCGCA\n+GCG\n+>FBtr0071631 type=tRNA; loc=2R:complement(21161063..21161134); ID=FBtr0071631; name=tRNA:CR30206-RA; dbxref=FlyBase:FBtr0071631,FlyBase_Annotation_IDs:CR30206-RA; score=0; score_text=Weakly Supported; MD5=9ff9c8260337fb111671830edb8e3824; length=72; parent=FBgn0050206; release=r6.03; species=Dmel; \n+GACTCCGTGGCGCAACGGTAGCGCGTCCGACTCCAGATCGGAAGGTTGCGTGTTCAAATCACGTCGGGGTCA\n+>FBtr0071574 type=tRNA; loc=2R:21161526..21161597; ID=FBtr0071574; name=tRNA:CR30208-RA; dbxref=FlyBase:FBtr0071574,FlyBase_Annotation_IDs:CR30208-RA; score=0; score_text=Weakly Supported; MD5=9ff9c8260337fb111671830edb8e3824; length=72; parent=FBgn0050208; release=r6.03; species=Dmel; \n+GACTCCGTGGCGCAACGGTAGCGCGTCCGACTCCAGATCGGAAGGTTGCGTGTTCAAATCACGTCGGGGTCA\n+>FBtr0071626 type=tRNA; loc=2R:complement(21182678..21182749); ID=FBtr0071626; name=tRNA:CR30209-RA; dbxref=FlyBase:FBtr0071626,FlyBase_Annotation_IDs:CR30209-RA; score=0; score_text=Weakly Supported; MD5=9ff9c8260337fb111671830edb8e3824; length=72; parent=FBgn0050209; release=r6.03; species=Dmel; \n+GACTCCGTGGCGCAACGGTAGCGCGTCCGACTCCAGATCGGAAGGTTGCGTGTTCAAATCACGTCGGGGTCA\n+>FBtr0086247 type=tRNA; loc=2R:complement(20658104..20658175); ID=FBtr0086247; name=tRNA:CR30211-RA; dbxref=FlyBase:FBtr0086247,FlyBase_Annotation_IDs:CR30211-RA; score=0; score_text=Weakly Supported; MD5=243cf738b4d1a6d2ea2ee34d091c0d0a; length=72; parent=FBgn0050211; release=r6.03; species=Dmel; \n+GACTCCGTGGCGCAACGGTAGCGCGTCTGACTCCAGATCAGAAGGTTGCGTGTTCAAATCACGTCGGGGTCA\n+>FBtr0086326 type=tRNA; loc=2R:complement(20000296..20000368); ID=FBtr0086326; name=tRNA:CR30212-RA; dbxref=FlyBase:FBtr0086326,FlyBase_Annotation_IDs:CR30212-RA; score=0; score_text=Weakly Supported; MD5=0567b432dd5034bd45ae2ceabd04c98a; length=73; parent=FBgn0050212; release='..b'Btr0070604; name=tRNA:P:3E-RA; dbxref=FlyBase:FBtr0070604,FlyBase_Annotation_IDs:CR32784-RA; score=0; score_text=Weakly Supported; MD5=6422ca8821a00d410403891c4f001230; length=72; parent=FBgn0025118; release=r6.03; species=Dmel; \n+GGCTCGTTGGTCTAGGGGTATGATTTTCGCTTCGGGTGCGAGAGGTCCCGGGTTCAATTCCCGGACGAGCCC\n+>FBtr0081622 type=tRNA; loc=3R:6819894..6819966; ID=FBtr0081622; name=tRNA:K5:84ABd-RA; dbxref=FlyBase:FBtr0081622,FlyBase_Annotation_IDs:CR31490-RA; score=0; score_text=Weakly Supported; MD5=4195a41533aa06bd1237285868c628ad; length=73; parent=FBgn0026162; release=r6.03; species=Dmel; \n+GCCCGGATAGCTCAGTCGGTAGAGCATTGGACTTTTAATCCAAGGGTCCAGGGTTCAAGTCCCTGTTCGGGCG\n+>FBtr0081661 type=tRNA; loc=3R:complement(6821068..6821140); ID=FBtr0081661; name=tRNA:K5:84ABc-RA; dbxref=FlyBase:FBtr0081661,FlyBase_Annotation_IDs:CR31487-RA; score=0; score_text=Weakly Supported; MD5=4195a41533aa06bd1237285868c628ad; length=73; parent=FBgn0026163; release=r6.03; species=Dmel; \n+GCCCGGATAGCTCAGTCGGTAGAGCATTGGACTTTTAATCCAAGGGTCCAGGGTTCAAGTCCCTGTTCGGGCG\n+>FBtr0081623 type=tRNA; loc=3R:6821789..6821861; ID=FBtr0081623; name=tRNA:K5:84ABb-RA; dbxref=FlyBase:FBtr0081623,FlyBase_Annotation_IDs:CR31489-RA; score=0; score_text=Weakly Supported; MD5=4195a41533aa06bd1237285868c628ad; length=73; parent=FBgn0026164; release=r6.03; species=Dmel; \n+GCCCGGATAGCTCAGTCGGTAGAGCATTGGACTTTTAATCCAAGGGTCCAGGGTTCAAGTCCCTGTTCGGGCG\n+>FBtr0080644 type=tRNA; loc=2L:14495878..14495949; ID=FBtr0080644; name=tRNA:P:35Bd-RA; dbxref=FlyBase:FBtr0080644,FlyBase_Annotation_IDs:CR31985-RA; score=0; score_text=Weakly Supported; MD5=c3cf92f97e1293f17ef34dd4a33c2dd2; length=72; parent=FBgn0028882; release=r6.03; species=Dmel; \n+GGCTCGTTGGTCTAGGGGTATGATTTCCGCTTAGGGTGCGGGAGGTCCCGGGTTCAAATCCCGGACGAGCCC\n+>FBtr0080717 type=tRNA; loc=2L:complement(15132306..15132389); ID=FBtr0080717; name=tRNA:L:35C-RA; dbxref=FlyBase:FBtr0080717,FlyBase_Annotation_IDs:CR31831-RA; score=1; score_text=Weakly Supported; MD5=250f163ecd83070ef11ff4724f417121; length=84; parent=FBgn0028889; release=r6.03; species=Dmel; \n+GCCAGGTTGGCCGAGCGGTCTAAGGCGCCAGATTTAAGCTCTGGTTCTCGAGAGAGAGCGTGGGTTCGAGTCCCACACC\n+TGGCA\n+>FBtr0080609 type=tRNA; loc=2L:complement(14010565..14010636); ID=FBtr0080609; name=tRNA:Q:34E-RA; dbxref=FlyBase:FBtr0080609,FlyBase_Annotation_IDs:CR31838-RA; score=0; score_text=Weakly Supported; MD5=ed31990a1414708ea663c4eb1a47f303; length=72; parent=FBgn0028909; release=r6.03; species=Dmel; \n+GGTTCTATGGTGTAATGGTTAGCACTTTGGACTCTGAATCCAGCGATCCGAGTTCAAATCTCGGTAGAACCT\n+>FBtr0080647 type=tRNA; loc=2L:14599674..14599745; ID=FBtr0080647; name=tRNA:P:35Bc-RA; dbxref=FlyBase:FBtr0080647,FlyBase_Annotation_IDs:CR31984-RA; score=0; score_text=Weakly Supported; MD5=c3cf92f97e1293f17ef34dd4a33c2dd2; length=72; parent=FBgn0028910; release=r6.03; species=Dmel; \n+GGCTCGTTGGTCTAGGGGTATGATTTCCGCTTAGGGTGCGGGAGGTCCCGGGTTCAAATCCCGGACGAGCCC\n+>FBtr0080660 type=tRNA; loc=2L:complement(14599396..14599467); ID=FBtr0080660; name=tRNA:P:35Bb-RA; dbxref=FlyBase:FBtr0080660,FlyBase_Annotation_IDs:CR31979-RA; score=0; score_text=Weakly Supported; MD5=c3cf92f97e1293f17ef34dd4a33c2dd2; length=72; parent=FBgn0028911; release=r6.03; species=Dmel; \n+GGCTCGTTGGTCTAGGGGTATGATTTCCGCTTAGGGTGCGGGAGGTCCCGGGTTCAAATCCCGGACGAGCCC\n+>FBtr0080646 type=tRNA; loc=2L:14598859..14598930; ID=FBtr0080646; name=tRNA:P:35Ba-RA; dbxref=FlyBase:FBtr0080646,FlyBase_Annotation_IDs:CR31983-RA; score=0; score_text=Weakly Supported; MD5=c3cf92f97e1293f17ef34dd4a33c2dd2; length=72; parent=FBgn0028912; release=r6.03; species=Dmel; \n+GGCTCGTTGGTCTAGGGGTATGATTTCCGCTTAGGGTGCGGGAGGTCCCGGGTTCAAATCCCGGACGAGCCC\n+>FBtr0086526 type=tRNA; loc=2R:19414598..19414679; ID=FBtr0086526; name=tRNA:S4:56D-RA; dbxref=FlyBase:FBtr0086526,FlyBase_Annotation_IDs:CR30224-RA; score=0; score_text=Weakly Supported; MD5=bda31e491947aa0e742dec30594b08f0; length=82; parent=FBgn0028981; release=r6.03; species=Dmel; \n+GCAGTCGTGGCCGAGTGGTTAAGGCGTCTGACTCGAAATCAGATTCCCTCTGGGAGCGTAGGTTCGAATCCTACCGGCT\n+GCG\n'
b
diff -r e4e71401c577 -r 1df6aaac800e test-data/genome-small.fa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/genome-small.fa Wed Dec 13 10:40:50 2017 -0500
b
b'@@ -0,0 +1,13 @@\n+>chrom_1 2R_6242001-6272000_and_2R_6490001-6550000\n+TCAGTTTGGTCAGTCAAGTGCGTTTTGCTAGGCGTGGAGTAAGATGAACGCGAACAGAAACTTTTGAATTTTGAAGTAAAATTTAAATTTAAGTGAAAGGTTCGAAGTAATTGTTAATTGAAAAATAAATCAAATGCAGTTTAGCCTGATCTGAGGAAAGAAAGAACGAGTGCTAAGCTCAATGAACTTTCACTCTCCGCTCTCTCCCTATACATCGCGCTTCCAGCGAGAAATCTCTGCTGATCGTTCTCATTTCCACGTTCGCTTGGCGTTTTGATCAGTTTCGAATTTGACTTATAGCGACGCTGGTCGGAGCTCTCTCGGCAAACAAAAACCGTGACAAGCAAAGATTTGAGCAAAGATTTGCCCAGAAGGGGTCTTGCTCGACACCAATAATAAAAATGCCGCGATAGAAGTGTGTGTGCCATTGACCAACATTTTAATATTTTTAAATTGTTTCTTGTGTGCTCACGAAACGTGTTCATGTGGCGCCTCAATTGATTTGATCTTATTTCACCAATTATCAAAGTGTTAAGTCTGCCATACGAAAGCATTTAAATGAAGTAATACATATGTATAAATGTACATATATACACTTAACCCACTGCTGAGGTCTCCAGCTTTCAGTGCCAGTTTGGAGTCCACGACGGAGAAGTTAAGCCACAACTTCTGGCATCAGATTAAGAGCTAAACCTATTTCAGCAGTAGCCGCAAGCATGTGAGTGCTTTAAATTCATAAAAACACATTAAAGTGCGTATTTTTAACTTTATTTAAATTGATAAATTTTATACCATTGATTGATTTATTTTATACCAATATTTATAAAATAGTTGGCCTGCTTTGGAAAAAAGAAGATGGATAAAAGTTGCACAAATAAAATGTGTGAAACGTGGTAAAAACTTGTGAATTTTGTGTCCAAAAATGGTTTAACATATATTATTACAATATCATTTAAACAAATTGTGGGTTCAGGCAGTTTAAAATTTCAATATATGGCAAAAGGCAAGTTAAAATTTTTCCCCAAATCATCAGACACAAGGACACTAAAATAAGTTTTTACTTTAGAAGTCACCCAGAACCATGTGCTGGAAAATGTTCTCCAACGAAGCTTCGGATTTTAATAATCATTAGGTACCAGTTGCTAATCAATTTTAGATTAAATATGCTTTTAGATAAGGATGTTGTCAGGTGATATTATGGATACGTATGAACATATGTTGCTACTTATTCTTGTTTAGTCCCACATCCCTAGATCAGTTAAAGGGTATACTAGATTCTTTTAAAAGTATCCAACATGTAAAACAAAGTCTTTTCGACCAAGGAAAGTATATAAATTCTTGATCAAGATTATTAATTGAGTCGATTATGTCCGTTCGTATATCCATTTGAACTTCGGGATCTCTGTACCTATAAAGGATTCAGCATACAGATCCTAAAGACTTTCCACACGTATGCTTATTTCCAAACGTAGCCACACCCAATGTAACGTCGACACACTGCAAACCATTTTTGGCCCTGATTTTAATTTCTTGGAATATGAACCTCTAAACCAATACTCTGTCTTTAATGACAGGAGCGGATTATAGAAGCACATTTCTTATCTTATCACTATTTATGTATATTTCACAAGTGTGACCAAGCTAATAGTGATATTAGTAAAATCTAATAGGCAACGCATAGACCTAAAGAATTAGAATGTGGTTTCCCACAACGATCAAAAAAAAAAATATTAAAACATTTTCAAAAGGTGTGTCAGTTTTGGGCGGTTGTGGGCGTGCCTCTAGAATCGTTTTATCTAATCTCAACTCTCTAGCTATAATGGTTCCTGAGATGGTGGTGTTCATACGGACAGACTGACATGGCCAGATCAACTCGGCTATTGGTTCTGATCAAGAATATATATACTTTATAATAATAAATAAATAATATACTTTATATGGTCGAAAACGTTTTGTCTGTTACATACTTTTTAACGAATCTAGTATACCCTTTTACTCTACGAGTAACGGGTACAACAAAAATGCTATATTCGACTTATGTTCTGACAGTCAGATACCCGTTACTCAGTTAGTGGAAATGGTGAATTGATTGAGAAAATATTTAAACAAATTTGAAAGTATGGGCGTGGCAAAAAGTTTTTTGGTAAATCGATAAAAATTTACAAGTGTAATAAAAATATAAAAAAAAATTTGAAAACATTTTTTAAAAGTGCAAGGATGTGCAAGTTTTAGGCGGCTATAGGCATTAGGGGGGCTTGGCAACTTTCTATCTGTTATATTTTGGAAGTGACAAACAGGTTCTTTTTTCGTCTTGGGCAACTATTATAATATATTATATTATATACTAAATAACAAGTTTACAAAGAATTCACTACACTAGTAATAAAAGCTATCACTACTTCAAAGTTAGCAGACCCAATACGAAATTCAATGACCAAATAGAAGTCAGCACCAAAACTTAATTACTTAAAAATTTCTTTGAGTGACAGAAGGAAAACTTATATTAGGACAGTATATTTCTTAGATTAGATTTATGGAAGATAACAATGTACTAATTTCTGAATTGTTTAAATAATATCGAACGAGTCAACTACCTTATCCAAACCGCTACCGGAGCACTATCCCTTCGAAAGCTTAGTCTCATTTCTCAACAGCTAACTATAATTTGAAAATATTTAGAATAAAGTTATTGTTCGATAGGCTCATGTTTTTTTTGGGATGAAAGGGGATTTTTATTAAATGTCCGAAAATAATTTTTCGTCACTAAAGTTTGGTATGGTATTTGGCATGATGCGATCGTCAAATGTTTTTACCGAGTCACTAACTTGGACATAGTCTCTAAAACATACTTTTGATTTTATTTTTACTTAGTTCCGAACTAGGGGTCAATAATTTAAGTTATTGAAATTCAGTTGCCCCGCGTGGGACAATCTAATCGAATGCTAATTGTAATTCGGTTATTTATCCTGCGCACTTCATTGGGGTCGTACAAATAATGAGTTCTGATTACAGCGATTGTGCCCAAGTCTAGTGTTGCCGATAAGATAGCCGCAATAGATACTAAGCAGAGCTACATGCACACCCAAAGTGCCGTTGTGACTCATCGACTCCTCGACCATTGTTGCGGGTCCGACAATAGGCCTGTACTCGATCAGCGATTTTTAAAAGGTGTGTGAACCGCGCAGAAAGCTTTGGAAAGCTTGTAGAGTTTGTGCCAATGCCTCGGCAGAGAACTTGTTCTTATGGATTGTGGCTGACCTTGCCGTAGAAGCCCATTATGTTTTTATTTGCATAATACCTTAGAACAGTCGAAGGGTTTTCGGGCTATCGCATTTCAATATCTTGGAGATTATGAAAAGCTTTGCCAGCTGTTTTGAAGTTCGCAGCTGTGCTCTGGAAAACTCCCTCTCCATTACCAACTTGCGGCATTGACGCTCTCGCCGTAACCGTTACCCGTTAACCGTTTTGAGCTCGGCGACCTAAGCTTTTGGCTGCGTCGCGAGGTTTAGTTAATATTATTAACCGGAGTGACGGCCAAGTTGTCGCAACGTTTCTCGTGGATCGCAGATCGTGGCGGTAAGGCGAGCTTTTTGCCGGGGGCTCAAAGTGTGAGTGTGAGGTGTCTTCAGTTTGGTTTTTTTCACATAGCGTGGCATTACTCTCTTTGACGAATTCAATGCGACGTCGCGCTTTTTTCGGTTCTGCAACTTCCGTTAGTCGGTGGCTCGAAAAGTAAACAAAGTGCTGCATATCGCATGCAAACGTGACAATCTTTCAGACGCACTCCAACTTGATAACTTGATAAGCATCTGTGAGATGCAAAGATACAAGTTATAAAGCACCATCTCGCGAAGCCATGTAGCCGAGTGAAAAAAGTAAAATATGCGAAAGCAGAAAAACAAAAAATTTGTGCGTGTGTTAGTTGGCCA'..b'ATTACCTTATACGTATAAATTTTATCATTCAATTCCGAAAGCATTTTGGGCGAAAATAAAGTACTTACTTTTAGGGCGAAAAATAAGTAAGTTGCCATTAAATGGAATATTTTTTTGTTACGATGATTAGTCATTTATAATAAAAATTTAAAATATGGGCAATTTGGTCCCCTAATCAACATGCACATATGTACATACATATATTTACATTTTCCCAAATGTGTCTGTAATTTTTTTTTTAGTATGGAAACGCAGACAGTAGGAAAAACGTAGCCAACAAAAAAGGCAAAAAATGCGTTTGCCGCAGACACAAATTATCGATCCGAACATTACACAAACACGCACACGGACAGAATTAAGCAGCACCGCAAAGTAAAACACTTGGGTAAACCCCCAAAAATGGTTGGAGCTGAGTGGGGGTGGCAAGGGCACTTTTTTTTGTTGCGGCAACTTCTTTAAGTTGTTCTTGATAAAAAAGTCATGACCTAACACAATATGTCCGTAAATAAGCCTGTGTAACAAAATAAGGCCATTGGCCCTGAAATGTACCTGATATATTGTTTTTTGTTAGTATTTAGAGGTGTTAGAAAAGATGAAGGTATTTGCTTAAAAATTGTGATTAATCTCAATCCCTTACATTTTTTAAAATAATAATCACAAAGCTTCGTTTCGCGTTGAAACTGAATTTTTTGCAATTCAACCCTTCCCACTTATTATAGTTTTCGTTCTGTTCTCACTAGCAAATGTTCTCACTCCAGTTTCTCTCGCCTCTCCCTCTTTATATTTGTTGTTACGGCCTGGTAAACCAACTGACCGTGTGGCCTAATGGATAAGGCGTCGGACTTCGGATCCGAAGATTGCAGGTTCGAGTCCTGTCACGGTCGACCGTTCTATGCTTTTTTTTAATATTCATATTTTTCCTTGAGCTATGAATATTACAGCTTTCATTAATTGGCCAAGTCAATTGCTGAAAAAAATATTTATTAGTTCTTTAAGGAACTAGAAGCTTAAATAGTGTATTGGGCTTGCGTAAGGACAAGTAGCAGTCGTGGCCGAGTGGTTAAGGCGTCTGACTCGAAATCAGATTCCCTCTGGGAGCGTAGGTTCGAATCCTACCGGCTGCGAATGAGAATGTATATTTTATTTCATATGTTTTTATTTTCTGAAATTAAATAAAAACGTTCTGCATAGCAAAACAAATGAGTGCTAGGTGTTTAAAAATACATTATTTTATTGCCATACGGAATTATCCTATTTAACGATCAATTTATATTTATAAGGTAGAGAATTAACCTTTTTTTTAATTGTCTTATAGAATTATCCTATTTAACGATCAAACTATATTTAAAAGTATAAAAAATAGTAGGAAACGTAGGAAATTAACCTTTGGCCCTGTAATATGCATAAACTCCGGAAGATTGTTGGGATTTGATCAAAAATAAGCAGTCGTGGCCGAGTGGTTAAGGCGTCTGACTCGAAATCAGATTCCCTCTGGGAGCGTAGGTTCGAATCCTACCGGCTGCGGAAGGGTAGTCCTATATTTTTTATGTTTTAATTTTTAAAAGGAGCATTCTTTCAGTTTTGAATATGTTTATTATATTACACACTGTGCCTTTGTTTGGCAATTACTTTCTGTCTAATGAATTTCTTAATTCAATTATAATCCGCATTTTGATCATATTTCGTATTCAAGGAACCACATCTCTAATTTTTTTACCTTGCCTATTTGTCTCGCATTGTGTAGCCCAAACACAACAACACCACCCACCAGACACGCACAAAATTATTTACATTTGCTGCTGACGAGTTCGTTGAACCTTTGATAACCTTTTTGGTCTGCTCCTCGGCAATTTTATTTCTCTATATACTAAATTTTTCGGCTGTCTTTCCTTTACTTTCGTTTTGCTCTTCCGTCTGTGGGCGTATATCGCCGTCCACAAAAAGCCTCAAAATGTCTTTGGTCCTTTTGCACCATTGACGTTGTTGTTTCCGCAGGTCCGAGCCCGCAGGAATCTTTGATAAAGATCTTTATATTATCAATGTCTAAGTATAGATAAAATGAATAAATAATTATGAAATAAGAATGTAAATACAATTTTCAATCAATCGTTTTAAGCAAGGTTCATTTGCAATATTATAAACTATGATAGACCGTTTTGTATCATTGATCTTGGGAATTTGGGACGCCGGTTGCGTAACTGACCGTGTGGCCCAATGGATAAGGCGTCGGACTTCGGATCCGAAGATTGCAGGTTCGAGTCCTGTCACGGTCGAAGCTCAGGCTATATTTTTTTAAATTATATTTTGTTCGTCCTAGAATATATTAATATGGGAGATTCCCTAGCCCAACCCAAACACACCAACACCACCCACCAGACACGTACAAAATTATTTACATTTGCTGCTGACGAGTTCGTTGAACCTTTGATAACCTTTTTGGTCTGCTCCTCGGCAATTTTATTTCTCTATATACTAAATTTTTCGTCTTTCTTTCCTTTACTTTCGTTTTGCTCTTTCGTCTGTGGGCGTATATCGCCGTCCACAAAAAGCCTCAAAATGTCTTTGGTCCTTTTGCACCATTGACGTTGTTGTTTCCGCAGGTCAGAGCCCGCAGGAATCTTTGATAATGATCTTTCTATTATTAATGTCTAAGTATAGATAAAATGAATAAATAATTATGAAAAAAGAATGTAAATACAATTTTCAATCAATCGTTTTAAGCAAGGTTCATTTGCAATATTATAAACTATAATAGACCGTTTTGTATCATTGATCTTGGGAATTTGGGACGCCGGTTGCGTAACTGACCGTGTGGCCCAATGGATAAGGCGTCGGACTTCGGATCCGAAGATTGCAGGTTCGAGTCCTGTCACGGTCGAAGCTCAGGCTACATTTTTTTTAAATTATATTTTGTTCGTCCTAGAATATATTAATATGGGAGATTCCCTAGCCCAACCCATTTGTGTAACCTGAGAAATTGGGAATTTGGGACGGCGGTTGCGTAACTGACCGTGTGGCCCAATGGATAAGGCGTCGGACTTCGGATCCGAAGATTGCAGGTTCGAGTCCTGTCACGGTCGAAGCTCAGGCTATATTTTTTTTAAATTATATTTTGTTCGTCCTAGAATATATTTATATGGGAGATTCCCTAGCCCAACCCATTTGTGTAACCTGAGAAATTGGGAATTTGGGACGGGGGTTACGTAACCGACCGTGTGGCCCAATGGATAAGGCGTCGGACTTCGGATCCGAAGATTGCAGGTTCGAGTCCTGTCACGGTCGTACCTCAGTATTTAATTTTTTTTGAACTTATTTTTCGTTCGTCCTATAATATATTAATATGGGAGATTCCCTAGCCCCACTCATTTGTGTAACCTGAGTGCGGTAAGCAGCAATCGTAACCAATTGGCATACCGAATTGAAAGATTTATTGGACTTTTACATGGGTCGTCCATGGACGAATCAACATGTGGCTGCCACCGCAAGAAGCCCAACTTTGTTCGTTGGCTCTTGCTGCCTGGGCTTGCACTGAAACAAATCTCTTTAACGTCAGCAAAAAATAAAAAGATATTTTTTCTAAAGTATGTATTGTCGTACATTTGGTTTATAATTTTAATATTTAGCGTATCAATTAAATCAATGTGTCTATGTGTCCGATACTTTCGTGTATTTTGTTATGTTTCTGTGTATCTGCTGGTGTCGTTGCTGCAATTGTTGCTAGCTTGAATAGCTATATATTTTTTATTCTCTTTTGTCAGCAAGCAGACTGAGGAGCAAGTTTTAAGCAACAAGAACGACACGCGGAGGAACAAGCTGGTCTACAAAGTGGAGGACGAGGCTGCAATTTATGTGGAGGTCCGGCTGTCCACAGTCCGCGGTCCAAAAGAGATCCGAGGGCCCACAGAGTCGGCTTAGCATAATAAACGTCAGAATTAATTGGATTTTAATTGTCTGTTAAGCGCTGAAATTAAGTGCAGCAAAACTAGATTGTCGGCCAG\n'
b
diff -r e4e71401c577 -r 1df6aaac800e test-data/mirbase-21-dme-hairpins-16jul2015.fa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/mirbase-21-dme-hairpins-16jul2015.fa Wed Dec 13 10:40:50 2017 -0500
b
b'@@ -0,0 +1,512 @@\n+>dme-mir-1_MI0000116 Drosophila melanogaster miR-1 stem-loop\n+TTCAGCCTTTGAGAGTTCCATGCTTCCTTGCATTCAATAGTTATATTCAAGCATATGGAATGTAAAGAAGTATGGAGCGAAATCTGGCGAG\n+>dme-mir-2a-1_MI0000117 Drosophila melanogaster miR-2a-1 stem-loop\n+GCTGGGCTCTCAAAGTGGTTGTGAAATGCATTTCCGCTTTGCGCGGCATATCACAGCCAGCTTTGATGAGCTTAGC\n+>dme-mir-2a-2_MI0000118 Drosophila melanogaster miR-2a-2 stem-loop\n+ATCTAAGCCTCATCAAGTGGTTGTGATATGGATACCCAACGCATATCACAGCCAGCTTTGATGAGCTAGGAT\n+>dme-mir-2b-1_MI0000119 Drosophila melanogaster miR-2b-1 stem-loop\n+CTTCAACTGTCTTCAAAGTGGCAGTGACATGTTGTCAACAATATTCATATCACAGCCAGCTTTGAGGAGCGTTGCGG\n+>dme-mir-2b-2_MI0000120 Drosophila melanogaster miR-2b-2 stem-loop\n+TTGTGTCATTCTTCAAAGTGGTTGTGAAATGTTTGCCTTTTTATGCCTATTCATATCACAGCCAGCTTTGAGGAGCGACGCGA\n+>dme-mir-3_MI0000121 Drosophila melanogaster miR-3 stem-loop\n+GATCCTGGGATGCATCTTGTGCAGTTATGTTTCAATCTCACATCACTGGGCAAAGTGTGTCTCAAGATC\n+>dme-mir-4_MI0000122 Drosophila melanogaster miR-4 stem-loop\n+TTGCAATTAGTTTCTTTGGTCGTCCAGCCTTAGGTGATTTTTCCGGTCATAAAGCTAGACAACCATTGAAGTTCGTTGTGG\n+>dme-mir-5_MI0000123 Drosophila melanogaster miR-5 stem-loop\n+GCTAAAAGGAACGATCGTTGTGATATGAGTTGTTTCCTAACATATCACAGTGATTTTCCTTTATAACGC\n+>dme-mir-6-1_MI0000124 Drosophila melanogaster miR-6-1 stem-loop\n+TTTAATGTAGAGGGAATAGTTGCTGTGCTGTAAGTTAATATACCATATCTATATCACAGTGGCTGTTCTTTTTGTACCTAAA\n+>dme-mir-6-2_MI0000125 Drosophila melanogaster miR-6-2 stem-loop\n+TAACCCAAGGGAACTTCTGCTGCTGATATATTATTGAAAAACTACTATATCACAGTGGCTGTTCTTTTTGGTTG\n+>dme-mir-6-3_MI0000126 Drosophila melanogaster miR-6-3 stem-loop\n+CAAAAAGAAGGGAACGGTTGCTGATGATGTAGTTTGAAACTCTCACAATTTATATCACAGTGGCTGTTCTTTTTTGTTTG\n+>dme-mir-7_MI0000127 Drosophila melanogaster miR-7 stem-loop\n+GAGTGCATTCCGTATGGAAGACTAGTGATTTTGTTGTTTGGTCTTTGGTAATAACAATAAATCCCTTGTCTTCTTACGGCGTGCATTT\n+>dme-mir-8_MI0000128 Drosophila melanogaster miR-8 stem-loop\n+AAGGACATCTGTTCACATCTTACCGGGCAGCATTAGATCCTTTTTATAACTCTAATACTGTCAGGTAAAGATGTCGTCCGTGTCCTT\n+>dme-mir-9a_MI0000129 Drosophila melanogaster miR-9a stem-loop\n+GCTATGTTGTCTTTGGTTATCTAGCTGTATGAGTGATAAATAACGTCATAAAGCTAGCTTACCGAAGTTAATATTAGC\n+>dme-mir-10_MI0000130 Drosophila melanogaster miR-10 stem-loop\n+CCACGTCTACCCTGTAGATCCGAATTTGTTTTATACTAGCTTTAAGGACAAATTCGGTTCTAGAGAGGTTTGTGTGG\n+>dme-mir-11_MI0000131 Drosophila melanogaster miR-11 stem-loop\n+GCACTTGTCAAGAACTTTCTCTGTGACCCGCGTGTACTTAAAAGCCGCATCACAGTCTGAGTTCTTGCTGAGTGC\n+>dme-mir-12_MI0000132 Drosophila melanogaster miR-12 stem-loop\n+TACGGTTGAGTATTACATCAGGTACTGGTGTGCCTTAAATCCAACAACCAGTACTTATGTCATACTACGCCGTG\n+>dme-mir-13a_MI0000133 Drosophila melanogaster miR-13a stem-loop\n+TACGTAACTCCTCAAAGGGTTGTGAAATGTCGACTATTATCTACTCATATCACAGCCATTTTGATGAGTTTCGTG\n+>dme-mir-13b-1_MI0000134 Drosophila melanogaster miR-13b-1 stem-loop\n+CCATGTCGTTAAAATGTTTGTGAACTTATGTATTCACAATCATATCACAGCCATTTTGACGAGTTTGG\n+>dme-mir-13b-2_MI0000135 Drosophila melanogaster miR-13b-2 stem-loop\n+TATTAACGCGTCAAAATGACTGTGAGCTATGTGGATTTGACTTCATATCACAGCCATTTTGACGAGTTTG\n+>dme-mir-14_MI0000136 Drosophila melanogaster miR-14 stem-loop\n+TGTGGGAGCGAGACGGGGACTCACTGTGCTTATTAAATAGTCAGTCTTTTTCTCTCTCCTATA\n+>dme-mir-263a_MI0000343 Drosophila melanogaster miR-263a stem-loop\n+TAGATCTCGGCACAGTTAATGGCACTGGAAGAATTCACGGGGTAATTTTTATACAACCCGTGATCTCTTAGTGGCATCTATGGTGCGAGAATAA\n+>dme-mir-184_MI0000354 Drosophila melanogaster miR-184 stem-loop\n+GGTTGGCCGGTGCATTCGTACCCTTATCATTCTCTCGCCCCGTGTGCACTTAAAGACAACTGGACGGAGAACTGATAAGGGCTCGTATCACCAATTCATC\n+>dme-mir-274_MI0000355 Drosophila melanogaster miR-274 stem-loop\n+TCCTGTGTTGCAGTTTCGTTTTGTGACCGACACTAACGGGTAATTGTTTGGCCGCCAGGATTACTCGTTTTTGCGATCACAAATTATGAAATTGCAGCAA\n+>dme-mir-275_MI0000356 Drosophila melanogaster miR-275 stem-loop\n+TGTAAAGTCTCCTACCTTGCGCGCTAATCAGTGACCGGGGCTGGTTTTTTATATACAGTCAGGTACCTGAAGTAGCGCGCGTGGTGGCAGACATATAT\n+>dme-mir-92a_MI0000357 Drosophila melanogaster miR-92a stem-loop\n+AATATGAATTTCCCGTAGGACGGGAAGGTGTCAACGTTTTGCATTTCGAATAAACATTGCACTTGTCCCGGCCTATGGGCGGTTTGTAATAAACA\n+>dme-mir-219_MI0000358 Drosophila melanogaster miR-219 stem-loop\n+TAATTCGATTTTTAGCTATGATTGTCCAAACGCAATTCTTGTTGATATTCAATATTCAAGGGTTGC'..b'TATATCTAGGCCAAATATATATACTTGTTCTATGTATTAGTTATTTGCAAAGGAATACATGTGCCTGTATATATATTCGGTAAAATCACATCTTTGAATT\n+>dme-mir-4980_MI0017766 Drosophila melanogaster miR-4980 stem-loop\n+GAAGAGGCTGAGAGCGGGAAAGTGAGAAGTAGAGAGCGCAGATAGGGAGTGGGAGCTTATACCGTTATAAAGCCAACTTCCGTTCTGCGTTTCGTTCCAACCCCCCACCTCTCTTTCCCTCT\n+>dme-mir-4981_MI0017767 Drosophila melanogaster miR-4981 stem-loop\n+TGGCCACGTGCCCGCAAGACGCCTTCGGCCGGCGCAAAGTTTCAATTTGATATTCCTTGGCCGGTCGAGCAGCGTCTTGGGGTTGTTCGTGGATT\n+>dme-mir-4982_MI0017768 Drosophila melanogaster miR-4982 stem-loop\n+CCAACTTTGCTGGCATTCGGTGGCCAATAATGCAATTGCATGTCCTTGTTGCTGTTGCAATGTTGCAGCTGGAATTGCAATTGCATTTCTAGTTGCCGCTGCTGCTGCTCGAGTGGCAA\n+>dme-mir-4983_MI0017769 Drosophila melanogaster miR-4983 stem-loop\n+GGCTGGCTGTCTTGACCCACTTGCTCGTTTGCATTTCTGAAAAATGTATACGCAAAAACCAAAATCAGAAATTCTTTTGAGCAAGTGTGTCATGAAATTGCCATTCGT\n+>dme-mir-4984_MI0017770 Drosophila melanogaster miR-4984 stem-loop\n+CTTCGCTCGAGGTGTGAAAACCTTTTGGCCAGCGAATACGCCTCGGATCCAATCACGTTTCAAGATCGAGGTGAATTCTTTGACGTATTCGCTGGCCAAATGACACGTTCGCCATGTTTTGCG\n+>dme-mir-4985_MI0017771 Drosophila melanogaster miR-4985 stem-loop\n+TTGGGGGCGCTGCACTGGCATTGAAAAGTGAATTACATTGATCGTGACATGGGAATGGAAAATGTCGCCGAGCCATGTAAATCGTTTGGCCTACCCGTCTA\n+>dme-mir-4986_MI0017772 Drosophila melanogaster miR-4986 stem-loop\n+TTCTGCCGCTTTTGCTGTGGCTTCTCTGCATGGGATTCCCCATTCTGCATGGCGCCGATCTCTGCCAGCCCATCGGATGGCGGAACTTCCAGTGCAGCGAGGTCGCTTCTCTGCAGGATCTG\n+>dme-mir-4987_MI0017773 Drosophila melanogaster miR-4987 stem-loop\n+GCGGTGCCGTTGATGATGACACAGCGCGCTTGCAACAGCGTGCGGCACGATTCTCACAGCAGGGCTCCAGCTCGGCCAAAAAATCGGTCGTCGCCATTGCAAGCTCACCGTTTGGTCTCACCACGGCCAAGA\n+>dme-mir-9369_MI0028918 Drosophila melanogaster miR-9369 stem-loop\n+AGCGAGAGGGTATTATGTATTCATATTTGTAATATCATGATACATATTCTCCTTTCGCTCTA\n+>dme-mir-9370_MI0028919 Drosophila melanogaster miR-9370 stem-loop\n+TTTGGGTTGCCGGTACCGGGTGGTTTCCCCGATATCCACGACCCATACCA\n+>dme-mir-9371_MI0028920 Drosophila melanogaster miR-9371 stem-loop\n+AAATCACTTTGCTTGGAATTCACATTGATGTACGTAAGAATTCATCACGAAGTGGTTTCTG\n+>dme-mir-9372_MI0028921 Drosophila melanogaster miR-9372 stem-loop\n+TAAAAGCACATTTCGCCAGCACGTGTACTTTCCACCTCGTCTGTGATTTTGGTTTTTAACG\n+>dme-mir-9373_MI0028922 Drosophila melanogaster miR-9373 stem-loop\n+AGTTTGTGAGGAGCGTTCGGCGGATACACATCGCACCCATCGCTCTTGGCCAGCTCGTC\n+>dme-mir-9374_MI0028923 Drosophila melanogaster miR-9374 stem-loop\n+CGTGCAATAATTTCCTCGATTGGCATCAAGTGGCTTCCAGTCGGGTACATATTGCACAAGA\n+>dme-mir-9375_MI0028924 Drosophila melanogaster miR-9375 stem-loop\n+CCGAGTATATGGAATTTCTGTTTTGCCTAGTATGAACCGAAACTCGATATAATTCAGAA\n+>dme-mir-9376_MI0028925 Drosophila melanogaster miR-9376 stem-loop\n+ATAGCCAGCATGGCCAAAGCGCTGTGCTTAAGTGGTCCAAGCGACCGAAAGCACTTTGACCATGCGGTGGTGGCCA\n+>dme-mir-9377_MI0028926 Drosophila melanogaster miR-9377 stem-loop\n+CGCTCTTTCTCTCTATCTGGCCTGGCCTGGCTTGATGGGGAGAAGGAGAGGG\n+>dme-mir-9378_MI0028927 Drosophila melanogaster miR-9378 stem-loop\n+AGTGGAGTGAGACCTCGAGTTCGGGCAAATCTGATAGCCGAACGGGAGTTTCCTCCATTGGG\n+>dme-mir-9379_MI0028928 Drosophila melanogaster miR-9379 stem-loop\n+CGCATGTCAGGTGGTAATCCATTAGTATAAACATGGTATGGCCACTTGACAGTCGGC\n+>dme-mir-9380_MI0028929 Drosophila melanogaster miR-9380 stem-loop\n+GCTCCTGCTGCATCTGTTGGCGATAGCGCTCGTCACTCTTGGCCGTGTACTCCGCCTCCAACAGATCCAGCAGCAGA\n+>dme-mir-9381_MI0028930 Drosophila melanogaster miR-9381 stem-loop\n+GCCAGGGAAGGGTCGAGTGCGGATCCCTTGCCCCAGCGGCTATTCGCCTGCGCACTCGGTCCATCCCTGGCTCA\n+>dme-mir-9382_MI0028931 Drosophila melanogaster miR-9382 stem-loop\n+ATCACAGTGTGGCTGAGGGATTCCACTTTCCTTATAACTTTTGCCGATCCCCGGCGCCACTGTGATCGT\n+>dme-mir-9383_MI0028932 Drosophila melanogaster miR-9383 stem-loop\n+GGGTGCAGATCAAGTGCGAGCTGCGCATTCTCTCGCAGTTCGCCTTCAATCTGAACCCCGA\n+>dme-mir-9384_MI0028933 Drosophila melanogaster miR-9384 stem-loop\n+AGGCATAATTCAACTCACACGTCTACAGGTACATATGTGTGTGTTCGGTTATGTACTTTG\n+>dme-mir-9385_MI0028934 Drosophila melanogaster miR-9385 stem-loop\n+ACAGTGTATGCAAATGATGAATGTGCCATATCAGAAACTATTCCTCATTGCTATACCTGTGGT\n+>dme-mir-9388_MI0028938 Drosophila melanogaster miR-9388 stem-loop\n+CAAGTATTTTGGTACGTATGTATGTATGTACATACATGTGTATATGGTACATTCATGTAGTACATACATACATATGTATGCAAGTACGTACG\n'
b
diff -r e4e71401c577 -r 1df6aaac800e test-data/reads-sample-small.fastq
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/reads-sample-small.fastq Wed Dec 13 10:40:50 2017 -0500
b
b'@@ -0,0 +1,182280 @@\n+@HWI-ST132:678:C1LFKACXX:6:1103:5043:24327\n+TCTGTCGTGCATTGTCGG\n++\n+IHFC<HHHHHDFFFFCCB\n+@HWI-ST132:678:C1LFKACXX:6:1101:19372:1918\n+AGAATTGTGACCTGAATC\n++\n+BCCFFFFDFFHHHFHIJJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:18439:2762\n+CGCGCGCTACACTGACGG\n++\n+@@@D?DD@FFFDDEEFGI\n+@HWI-ST132:678:C1LFKACXX:6:1101:10715:4477\n+TAACTGAGTACCTGGCTC\n++\n+:??DDD2222ADDE<CGG\n+@HWI-ST132:678:C1LFKACXX:6:1101:20172:4409\n+TTCTACAGTCCGACGATC\n++\n+=@BF:====DFFHBGGIJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:11143:4891\n+TTCGAGACAGTAACCACA\n++\n+=@@D;D?D>C<DFIIHGG\n+@HWI-ST132:678:C1LFKACXX:6:1101:9335:5110\n+AAGTAACGAAAGGATTAC\n++\n+:?@B4=2=CFHHHJIJJJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:16012:5749\n+AGATTTACAATTTTGGGC\n++\n+BC@DFFFFHDFFHJIJJJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:4811:6756\n+TGTACTACTCTACTTGTT\n++\n+CCCFFFADHHHHHJJCGI\n+@HWI-ST132:678:C1LFKACXX:6:1101:7299:9245\n+CATTGGAACTAAATGACC\n++\n+=BBDA4=BFHHHHJIIHJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:13600:10898\n+ATCCCGGACGAGCCCCCA\n++\n+@CCFFFFFHHH@FHIJJI\n+@HWI-ST132:678:C1LFKACXX:6:1101:9047:12024\n+ACGACAACCGTCATCCCG\n++\n+@CCFFFFFHHHHFJJIJI\n+@HWI-ST132:678:C1LFKACXX:6:1101:7548:13223\n+ATAGACCTGACAGCGTGC\n++\n+?@@FDDFFH:ADAFHCGI\n+@HWI-ST132:678:C1LFKACXX:6:1101:7552:14739\n+GGAGGAAGTAGCTTTTTT\n++\n+BBBDDDFFH2AADFHIJI\n+@HWI-ST132:678:C1LFKACXX:6:1101:19574:14871\n+TTCCCCGTCGGGGAGCCA\n++\n+BBBFFFFDF?FHF:??FH\n+@HWI-ST132:678:C1LFKACXX:6:1101:9689:16020\n+TGCTGGTCGACTATACTC\n++\n+B?@DAAADFFHHHJJ@FG\n+@HWI-ST132:678:C1LFKACXX:6:1101:10332:16559\n+GCCCGGCTAGCTCAACCC\n++\n+=B@FA=@DHFHHHIJIIJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:16598:17271\n+TCCACCACGTTCCCGTGG\n++\n+BBBFFF:AA<CFHIHCGH\n+@HWI-ST132:678:C1LFKACXX:6:1101:16473:17908\n+TTCTACAGTCCGACGATC\n++\n+BBBFFF>AADHFHGHHHI\n+@HWI-ST132:678:C1LFKACXX:6:1101:17076:19365\n+TCCCCGGCATCTCCACCA\n++\n+CC@FFFFFHHHHHJIJJJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:2970:20077\n+TCCCGGATGGAACCACCA\n++\n+B@BFDBAD@DFHHHHIJI\n+@HWI-ST132:678:C1LFKACXX:6:1101:19292:22029\n+TACAGAGGGCTGCGAGAC\n++\n+CCCFFFFFHHHHG@FDHH\n+@HWI-ST132:678:C1LFKACXX:6:1101:7403:22551\n+GCAGTCGTGGCCGCGCGG\n++\n+@@@DDDDDHDHHF12?FH\n+@HWI-ST132:678:C1LFKACXX:6:1101:6550:24420\n+TCTTTGGTATTCTCGCTG\n++\n+@@@DDDDAFHHHF<+AEG\n+@HWI-ST132:678:C1LFKACXX:6:1101:15312:25043\n+ATGACACCGTTGGAAGAA\n++\n+@BCFFFFFHHHHFGHEEF\n+@HWI-ST132:678:C1LFKACXX:6:1101:10841:25468\n+TCTTTGGTATTCTCGCTG\n++\n+BCCFFFFBFHHHHEIJJJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:6460:26533\n+TCCCGGGTTTCGGCACCA\n++\n+CCCFFFFDHHH<DGHIJJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:8169:26973\n+ATCCTGGTCACGGCACCA\n++\n+@CCFFFFEHBH@FHIJJJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:17561:28189\n+TCCCGGATGGAACCACCA\n++\n+BBCFFFDD?FDFHJIJJJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:11670:30039\n+TTCTACAGTCCGACGATC\n++\n+CCCFFFFFHHHHGJJIIJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:5395:30961\n+TACGGACCAATGGCAAAA\n++\n+@B@FDDDDH=FHDHIGIG\n+@HWI-ST132:678:C1LFKACXX:6:1101:8747:33935\n+CGCATGAATGGATTAAAA\n++\n+@@@DDF<DHH>FHGGBHG\n+@HWI-ST132:678:C1LFKACXX:6:1101:9941:34387\n+ATCCCATCCTCGTCGCCA\n++\n+BCBDFFFFHHHHHH@FHI\n+@HWI-ST132:678:C1LFKACXX:6:1101:14543:34442\n+TCCACCACGTTCCCGTGG\n++\n+@C@FFFADFFHGHJJEHI\n+@HWI-ST132:678:C1LFKACXX:6:1101:5887:34986\n+AAACTTTCAACAACGGAT\n++\n+@@@DFFFFH<FHHIICGI\n+@HWI-ST132:678:C1LFKACXX:6:1101:9891:35111\n+AAGAGTCTTGTCTGGTAC\n++\n+BCCFFBDFHHHHHJFHHI\n+@HWI-ST132:678:C1LFKACXX:6:1101:10051:35463\n+TCTTGATCGAAGCCCCGG\n++\n+B@BFFFFFHFFHGJJJJJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:4680:35647\n+CGGGATGTAGCGCAGCTT\n++\n+BB@FADFDFHGFHEIIJJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:14569:35583\n+AAGATAGAGTAGTTTTTT\n++\n+BBCDFFFFHCHHHHIJJJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:13960:37817\n+AAAGTTCGGAAAACTGGC\n++\n+@CCFDFDFHHHHHBGFGI\n+@HWI-ST132:678:C1LFKACXX:6:1101:16007:38099\n+GATGACTGGGGTGAAGTC\n++\n+B@BDDFFFHG?CFBGIEG\n+@HWI-ST132:678:C1LFKACXX:6:1101:8213:39438\n+TAATGATTCCTGTACTGA\n++\n+BBBFFFFFHHHHFHIJIJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:15318:43042\n+CCGCTGCTGATCACACTG\n++\n+CCCFFFFFHDHHHJJJJJ\n+@HWI-ST132:678:C1LFKACXX:6:1101:16708:44453\n+TGCTAGAGGGTCTCGGTA\n++\n+?BBF;A=DFH<DHIE<<C\n+@HWI-ST132:678:C1LFKACXX:6:1101:8544:45645\n+TGCGGCTGGATCACCTCC\n++\n+@CCFFFFF:FHHHIJJJI\n+@HWI-ST132:678:C1LFKACXX:6:1101:16382:46217\n+AT'..b'276\n+GATCCCAGATCCGCTGTGTTT\n++\n+CCCFFFFFHHHHHIJFGHHIJ\n+@HWI-ST132:678:C1LFKACXX:6:1213:14045:90482\n+ATACTAGATTCGTTGAAAAGT\n++\n+@@@F7DDDFA<CC?;FAEBH?\n+@HWI-ST132:678:C1LFKACXX:6:1302:4633:32096\n+TGTTGCGGCAACTTCTTTAAGTTG\n++\n+CCCFFFFFHHHHHJJJJJJJJHIJ\n+@HWI-ST132:678:C1LFKACXX:6:2107:6041:64276\n+TGGCCTAATGGATAAGGCGTCGGACT\n++\n+@CCFFFDFHHHHHIJJJJ<FHIJJJJ\n+@HWI-ST132:678:C1LFKACXX:6:1112:9014:81599\n+TTCGGATCCGAAGATTGCAGG\n++\n+@CCFFDFFHGGGGDCEGIJJJ\n+@HWI-ST132:678:C1LFKACXX:6:2105:11875:25254\n+CGAAGATTGCAGGTTCGAGTC\n++\n+CC@FFFFFHHHFCAFHIJ+AH\n+@HWI-ST132:678:C1LFKACXX:6:2101:16974:2305\n+ACCGTTCTATGCTTTTTTTT\n++\n+:BBDDDDFHH<2<CFHIIJJ\n+@HWI-ST132:678:C1LFKACXX:6:1313:11404:80054\n+ACCGTTCTATGCTTTTTTTTA\n++\n+@@CFBDFF?FHHGIIIIGIIC\n+@HWI-ST132:678:C1LFKACXX:6:1116:12125:58757\n+AAGTAGCAGTCGTGGCCGAGTG\n++\n+??+4=B?DDHHF<EGHGGGIDG\n+@HWI-ST132:678:C1LFKACXX:6:1205:9493:45438\n+GCAGTCGTGGCCGAGTGG\n++\n+BCCFDFFFHHHHHIDCFH\n+@HWI-ST132:678:C1LFKACXX:6:1207:2720:86231\n+GCAGTCGTGGCCGAGTGG\n++\n+@@@FFFFDHHHGFIG2AF\n+@HWI-ST132:678:C1LFKACXX:6:1214:18091:41339\n+GCAGTCGTGGCCGAGTGGTTAAGG\n++\n+?@:4ABDDHHFHFDGCGDFHFGIG\n+@HWI-ST132:678:C1LFKACXX:6:1309:18921:24185\n+GCAGTCGTGGCCGAGTGGTTAAGG\n++\n+@CCFDFFFHHHHHI@ACGFHIIIJ\n+@HWI-ST132:678:C1LFKACXX:6:1106:1391:88663\n+GCAGTCGTGGCCGAGTGGTTAAGGC\n++\n+@@@FDEDDAFHHHJH+AFFHIJEHG\n+@HWI-ST132:678:C1LFKACXX:6:1310:15410:68712\n+GCAGTCGTGGCCGAGTGGTTAAGGC\n++\n+@@@DDFFFHHHHH?EEGHIJHIEEH\n+@HWI-ST132:678:C1LFKACXX:6:1202:15769:84946\n+AGCGTAGGTTCGAATCCT\n++\n+?@@D=ADDHHFDHFGGIG\n+@HWI-ST132:678:C1LFKACXX:6:2105:13686:25294\n+AGCGTAGGTTCGAATCCT\n++\n+BCCFFFFFFHHDDHHIJJ\n+@HWI-ST132:678:C1LFKACXX:6:1106:17247:63193\n+AATCCTACCGGCTGCGAATGA\n++\n+@BBFFDEFHFHHHFFFFHGHJ\n+@HWI-ST132:678:C1LFKACXX:6:1107:17291:97995\n+ATCCTACCGGCTGCGAATGA\n++\n+@CCFFFFFDFFHHJGEHGBG\n+@HWI-ST132:678:C1LFKACXX:6:2105:5531:13237\n+ACCGGCTGCGAATGAGAA\n++\n+B@BFFFFFGHDFCFHEGI\n+@HWI-ST132:678:C1LFKACXX:6:1111:11783:45506\n+ACCGGCTGCGAATGAGAATGT\n++\n+???DFFFFFHF:CCCGHHBG<\n+@HWI-ST132:678:C1LFKACXX:6:2105:11033:71535\n+CGGCTGCGAATGAGAATGTATATTT\n++\n+?BBDFFFF@<@ACAAEHHHGGIJJI\n+@HWI-ST132:678:C1LFKACXX:6:2103:20548:80488\n+AATGAGAATGTATATTTT\n++\n+BCBDDFFFHHFHHJJJJJ\n+@HWI-ST132:678:C1LFKACXX:6:1213:10954:88904\n+GCAGTCGTGGCCGAGTGG\n++\n+B@CFFFFFFHGFHGIFHI\n+@HWI-ST132:678:C1LFKACXX:6:1301:8478:85932\n+GCAGTCGTGGCCGAGTGG\n++\n+@CCFDFFDFHHHHGHAFG\n+@HWI-ST132:678:C1LFKACXX:6:2101:5467:98324\n+GCAGTCGTGGCCGAGTGG\n++\n+@@CFFDFFHHGHH>GAGH\n+@HWI-ST132:678:C1LFKACXX:6:2107:20194:63182\n+GCAGTCGTGGCCGAGTGG\n++\n+BCCFFFFFHGHHHBH<EH\n+@HWI-ST132:678:C1LFKACXX:6:1116:13015:74545\n+GCAGTCGTGGCCGAGTGGTTAAGGC\n++\n+B@:BDDFDFHFFFBG2CDHGGGFHI\n+@HWI-ST132:678:C1LFKACXX:6:1209:1463:48119\n+GCAGTCGTGGCCGAGTGGTTAAGGC\n++\n+BCCFDFDDHHHHHJJFHIIJJJIJJ\n+@HWI-ST132:678:C1LFKACXX:6:1313:4928:7411\n+GCAGTCGTGGCCGAGTGGTTAAGGC\n++\n+@C@FFDFFHHFHHJJAEGGHGIIJI\n+@HWI-ST132:678:C1LFKACXX:6:1113:20573:45425\n+AGTCGTGGCCGAGTGGTTAAGGC\n++\n+CCCFFFFFFHHHH?EHHHIIJJJ\n+@HWI-ST132:678:C1LFKACXX:6:2109:6492:70002\n+GTCGTGGCCGAGTGGTTAAGGC\n++\n+CCCFFFFFGHG@2<EAFHGGJI\n+@HWI-ST132:678:C1LFKACXX:6:1104:13333:89311\n+TTAAGGCGTCTGACTCGAAATCAGA\n++\n+CCCFFFFFHHHHHIIJJGGIJJJJJ\n+@HWI-ST132:678:C1LFKACXX:6:1306:7606:88539\n+TGACTCGAAATCAGATTCCCTCTG\n++\n+CCCFFFFFHHHHHJJJIJGIJJJJ\n+@HWI-ST132:678:C1LFKACXX:6:2108:19159:27727\n+ATATAGCCTGAGCTTCGACC\n++\n+JJJJJIHF?HHHFDFFFCCC\n+@HWI-ST132:678:C1LFKACXX:6:1211:6213:41030\n+TCGGATCCGAAGATTGCAGG\n++\n+@@CFFFFFDHHGHEHEFFHI\n+@HWI-ST132:678:C1LFKACXX:6:1203:8956:45599\n+AGATTGCAGGTTCGAGTCCT\n++\n+@@@DFFFFHHFHH<A<AEHH\n+@HWI-ST132:678:C1LFKACXX:6:1303:5477:98042\n+GTAACTGACCGTGTGGCCCAATGGA\n++\n+??@DFFFFGHDHGG?GGIEH3<FGH\n+@HWI-ST132:678:C1LFKACXX:6:1315:9507:45115\n+AAGATTGCAGGTTCGAGTC\n++\n+@@@:BDDDAFHHFIIGHFA\n+@HWI-ST132:678:C1LFKACXX:6:1306:9972:7484\n+AAGATTGCAGGTTCGAGTCCT\n++\n+@@CFFFFAFFHHHG@GEBGHH\n+@HWI-ST132:678:C1LFKACXX:6:1303:16006:44426\n+AGATTGCAGGTTCGAGTCCT\n++\n+@@@FFFFFDHDFHCE<AEHI\n+@HWI-ST132:678:C1LFKACXX:6:1214:13442:64117\n+AATGGATAAGGCGTCGGA\n++\n+818A:3ADHHFBFC1@FB\n+@HWI-ST132:678:C1LFKACXX:6:1214:1663:16969\n+ATTGCAGGTTCGAGTCCTG\n++\n+@@@FDFFFCFFHHIGHIIJ\n'
b
diff -r e4e71401c577 -r 1df6aaac800e test-data/transcripts-file-small.fa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/transcripts-file-small.fa Wed Dec 13 10:40:50 2017 -0500
b
b'@@ -0,0 +1,26 @@\n+>FBtr0078666 type=mRNA; loc=3R:complement(join(5822026..5824307,5824361..5824504)); ID=FBtr0078666; name=CG2023-RA; dbxref=FlyBase:FBtr0078666,FlyBase_Annotation_IDs:CG2023-RA,REFSEQ:NM_141338,REFSEQ:NM_141338,REFSEQ:NM_141338; score=11; score_text=Strongly Supported; MD5=d3ca07b9149e74faf0d15d708cb012db; length=2426; parent=FBgn0037383; release=r6.16; species=Dmel; \n+GTTAAATGCACGTCACCAAAGCAGAATAATAGAATATTTTCGAAACAAAACAAAGTTGGAGACATGGACAAGGATGCGTTTACATTACAGGCCATACGGCAGGACCTTATCGATAACAATCTGCAGGCTAAGGCAATAATACACGACATCCTGAACAGCCGCACCTCCATCGCCGAACTCGAGGAGCTGAACGAAGCGGGCCGCTCCAAACTGTCTGCTATCCGCAAAAGCATCGAGCGGCTGGACGACTGGGCGCGGGACACGGCAGACTCTGCGCTGGCCAATGAAGTGGACGACCACCGTGATCAGTTCTCCAAAACGCTGCAGGCGTTCCGAAAAGCAAACGTGTCCACGATGCTGGAGATCGAGAAGGCCAATCGGGAGGAGTTAATGGCCATTACCGGCGAGAGTGAGCTACGCCAACGAACCACAACACGGGCGCGGCACAACCAGGGCAGTCTGGTTTCGCAGGAGAACGACGTGACCGAGAAGATGCTGGCTATATCGCGGCACCTCTCGGAGACCACCCAGAAGAGCGCCATCACCCTGGAAACGCTCGTGGCCTCGTCGCAAAATGTGGAGGCCACCAGCGACGAACTGCACCACACGGCCGGCAGCATTAGCATGTCCGGCAAGCTGCTCAAAAAGTACGGACGACGCGAGTGCACTGACAAAATGCTGCTCTTCTTCGCCTTCTCCTTGTTCCTCGCCTGTGTCTTTTACATCGTCCAAAAGCGACTCTTCTAAGACTCCACAAATGGACAAAACCCGTTCCCAAAATAGCTTAAGGTTGTCGCTTCTGTTGTCTAGGTATAGCTAGATTAAGCTTAGCACATGACCATACCTTGTAAGCACAGCTCCTATATTTATATTATTTAGTGATTTGCCTAAGTTGTAAACGTGGTACAGCCAAAGACCCTAGAATAACAAGATGCGTAACGCCATACGATTTTTTGGCACACGATTTTTTGGCCGTGGCTCTAGAGGTGGCTCCAGGCTCTCTCGAATTTTTGTTAGAGAGCGAGAGAGCGAAGAGCGCTACAGCGAACAGCTCTTTTCAACGCACAAAGTGATAGCAGACATCTGTATGTGTGCACACGTATTCACATGCATTGTAAATTTGACAAAATATGCCCTTCACCTTAGAAGTTCTTTGGCTTTAAATCTATATTATTTTTTATCAATTGGCACCATGCGAAAAATTCTTGTTTTGCATTGCCTTAACGTTATTATTATTTGAAAATAGATTAGAAATAGTCAAATCTATGTACATATTATCACAAAAATAAATTTCAAAAATGAATTTATATAAGAATATTTGTCATTAGAGTATTCATCTTGCGGCGTGTGAAAAATTAATAAGGCAATGATTGTTGAGTGCTTGTGTCCGCACTTCGTGCCTCAAGATATGAACAAAGCAAAGACACTAGAATAATTCTATTGTCTTTGATATTACTTTTGCAATTTAATTTAATTGCATATTTAATTATTTAGTATATTTATTAAATCATTTGACTTAATATGATGTAACATTAACATTAAAAGTGTTTCAAAAAAAATATTTCGGTTTTAAAAAATTGTCAGATGAGAGACAAATTAGAATTAAACATAAATACAAATGTGTAAACGGTAGCTAATTCGAGCGGCGATTTTAACAAAGAAATTTAAAAAAGCTTTAAAATTATAATAGCCAGGGCGCGAATTTTTAAAAATTTTTTATTTTATCATATTGCTAGGAAATTGGCAAAAACTACCCTAATATGTACCATGTAAATTCGTTTCTTCGATCAGAATTGATTTCGGCCCGAAAATCGTCTTCTAGCACAACACGCACACTTATACGCGTTCTCGTCTCTTGTTTTTACTCACACAAGCAAGCAAATTATATTTTTAGATTTCTTACGCTCTAAGCGGGAGTGAGCGGAAAGAGAGTAATTTTGGCCGTCACCAAAAAAGTGGCTGCATAGTGCCAAACCAATGTATGGCCGTTACGCATCTTGTTATTCTAGTGTCTTTGGTACAGCCTAGTATAGTATGGTAAATGCAATTTATTTTTATTTAGAATATATGAGTGTTGTATATGTAGATAAAAATGTTAAGCAAGTTAGTAAGGGCACCTAGGCACTCCTCCGGGGTTTGTGAATCCGTTGGTGTTGACCAACCTGCAGATGTCCTTGTATGACCGCGCCGATTTTGCAGGCCTTTCTGGCTGTGGCTGGGAATAACCTCTGTTGTAATAGTCAGGATAGAACTGGAACCAAGAAGGCCTGTGGTAGTTGTAGTCGGGAAAAAATTCTTTAAGCACAGAGCTGCTGCAGAATCTGCTTAGCCCCAGAATCCACAGCAGAATGTATATAATCGACTTGCGCATGGCCACTTCGCCTGAGCTTAAGATTTGGAATAAAGCCGTACCCGATTCTCATTGT\n+>FBtr0345575 type=mRNA; loc=2R:complement(join(8564187..8564768,8564826..8567202)); ID=FBtr0345575; name=Cyp6a14-RE; dbxref=FlyBase:FBtr0345575,FlyBase_Annotation_IDs:CG8687-RE,REFSEQ:NM_001299270; score=11; score_text=Strongly Supported; MD5=8174de0eb4bb4210648ec87219a6a80c; length=2959; parent=FBgn0033302; release=r6.16; species=Dmel; \n+AGTTGTCCCTAAACGCTGATTCAGTGAAGTCGTTTACGCGATAAGTTTACTGTGTGAAAAAGAAATAAAAGTTTCGTCAGCCTTTAGGTGGAATTCCCTCTATTGGTTGTCCGAAATCGGCAACATACATTTGTTTAACACCAACATTTGTCTTTGCTTTACCAAATAAATGATGTTTGAGGTGCCGTTACTCATTGACAGCAATATAGAACTTGGTACTACCAAAGACACTAGAATAACAAGATGCGTAACGGCCATACATTGGTTTGGCACTATGCAGCCACTTTTTTGGTGACGGCCAAAATTGCTCTCTTTCCGCTCGCTCACGCGCCCTTCTTATTATAATTTTAAAGCTGTTTAAATTTGTTTGTTAAAATCGCCGCTCGAATTATCTACCGTTTACACATTTATATTTATGTTTAATTCTAATTTGTCTCTCATCTGACAATTTTTTAAAAGCGAAATAATTTTTTTGAAACACTTTTAATGTTAATGTTACATCATATTAGGTCAAATGATTTAATAAATATACTAAATAATTAAATATGATAACTGTTTATTGCAAAAGTAATATCAAAGACACTAGAATTATTCTAGTGTCTTTGCTTTGTTCATATCTTGAGGCACGAAATGCGGACACAAGCACTCAACAATCATTGCCTTATTAATTTTTCACACGCCGCAAGATGAATACTCTAATGACAAATATTCTTATATAAAGTCATTTTTGAAATTGATTTTTGTGATAATATGTACATAGATTTGGCTTTTTCTAATCTATTTTCAAATAATAATAACGTTAAGGCAATGTAAAACAAGAATTTTTCGCATGGTGCCAATT'..b'CACCAAATGATATGTAATTAAAATTAAATAAATATCTAAACACATATTGTGAATGACGACTAATCTTGCAAACGACATTACATACTTTATGTAGGGCGAATTCTGGTTGATTTTTACAATCGACCACTTGACGAGCAGTTAAGCCAGTTCTTTTTTTTTTGTTTAAAACAATACGTATTTTATTTTTACAAGACATTCCCTAACTAGGTTAGGGTTCCCATTTAAAGGTATTTCCTTACTCGCTTACAATTGAATCCCGAAATGGATTCAATGTACTATTTATCTAATATCACCTCATGGCATCTAAGGAATTTAAGGGATCTTTGAACTAACACCTACATATTTGTGTATTGTATTCAAATATATTGTGTATCTGTCTGGTAAAGTGTTAACTTAACTTTGTAAATACTATGCGGTTTACTTTAAAGACAAATCAAAGGCGATAGTGTGCGAAAGCAAAAGGAAACAATTAAATACGAGTATAATAAATATTTTTTTCAAAT\n+>FBtr0310270 type=mRNA; loc=X:join(15024436..15024954,15030586..15030847,15030911..15031068,15031178..15031467,15031543..15032573,15033606..15034414); ID=FBtr0310270; name=be-RF; dbxref=FlyBase:FBtr0310270,FlyBase_Annotation_IDs:CG32594-RF,REFSEQ:NM_001258745,REFSEQ:NM_001258745; score=15; score_text=Strongly Supported; MD5=5539c8fae56fdff6eb554e4ed9309709; length=3069; parent=FBgn0052594; release=r6.16; species=Dmel; \n+TTAGAGCTAAACGAACTGCCATCCGGTAAACACGTCTCACAACGTTATTTGTGTTGAATATATATATATTTTTTTGTTGTGGCTCTTTTTTTTTAATTTCTGCGGCCCCTAAAGTTCGACGATCGTGAGAAGGGAAAAAGAGTGTGAAGTGACCTAAGCGGTTTTGAAATATCTATCTTGGCAAAACGAAAACAAATTTGTTAAAGCACATATAAACAAAAACAAAATAACAAAAATAAAAGTGAAGCAAAGGTGAAGAAGACCAGAATGAATTCGCGACGGATTGCTCTGGTCCTCCTAATCGGCATAATCGTTTCGTTTTCTGGCCATGATGCACTAACCTATCCGGAGCGCTTCGATCGCCTGCCCACTTGGGGTGGTCATTCCCAAATTGGTGGGCCGCTGCTGGATACCGCCCACCGGGAGAATCGTGAGAAAAGGGAGAATAGGGTGGACCTGTGCCGGCACTGTTTCTGCATTCATCTCAAGGCAATCTGTGATTACAAGCTTAACAAAACGCTCCCGAACGAATTTAACGATAAACTATTGGTGCCGCTGAACATCAAATATATTGAGGTGCGACTGACTGTTGGCACCCAGTTCGTGATGTACGAGAACTTCTTCCAGGACAACCAGGTGAACTACTTTGGTGTAATCGGAGTGGGGAAAGATGACCAGGTGGAAATAACCAGCAATGCATTTAGCCACAACAAAGGCGGTTTTCCCAACATCGAAATACGAAATGTATTGCGAGTTTTTCTGCGTGAGAAATTCCTGACCGGTGCGGACTACAAGCTGCTGGTGGAGGATGTTACTCAGCTGTCCGTATTCTCCAATGCCCTTCAGATGACTAATCTAGACTGTTCTCTCAAGCGGATCAAGGAGCTGAATCTGATGAAGAACGCTTTCAATCCTGGGGTTGCCAAATATGGAATAAATCTCCGCATCGAGGATTCGAACATCAATCAGCTGGGTATATTCGGCGTGTCCATGGGCAAGGTGAGCCTGTTGCGCTGCCACATCGACATGATCATGAGCAACGCCTTTGACGTTACCAGCATCAAGGAGCTGATTATCGAGGGCTGCAATATCGAGGTGATCGAGAGCCAGGCGCTAACCAACAAATTGCATAGCGATAAGGTGGCCATCGTGGATACGGTGATCGGTACGATTGAGGGTCAGGCGATCAGTCAGAGCGGTATAACTACCATGATTATGTTTGGAAATACAATTACAAAAATACGTTCGAATGCCATTCAAATTGTTGCCGTTAGTCTGTTCATACGCAACAATTCAATGAGCCATGTGGAGCCCAATTGGTTGAGTGTCAGCCAGGCCGATCAAGTGGAGATTGCGAATAATCGCTTCGAGGACTACGGACGCTGTGAACTGAACATTGGCTCCTCGAACTGCAGTTTTCGCAACAATATACTGCAGAATCCGCAATCGGGTAGCCTCAATTTTACATGTCGCGTCCACCAGGTGCGCGTGGGCACCGAGTGCTCGTGCAACAAGTCCTGGCTATCGGAGCTAACCGATCATGATCTGGAATCGGAAATCATGTGTCAGGTGGCAAAGCGTGATGCCAACTGCTTTAATGCCACCAATACGGATGTCCGCCGGTATGTCAACGAGGCATGTGGCAGCAATGTGACCCGCTACTGTATGGGTGGCCAGTGGGTGACCAAGGCGGTCAGTGATCATTCTAGCGACTCCAGCAAATTGACCATCGGAATGATAGCCCTTGAGATTGTGATTTTAACACTCTTGCTTGTTGCGATTGTCTGTGTGTTGGCCAAAAACTGTGGCAGTGGAAGCTGCGCTCCTGCCGGTGGCCAGTCCACTGATAATTGCCTAATCGAGGAGGACATTCGCAACTCACTGCGCCAGCTCGCACTGCACAGCGAGAGCAATAAGACACGCAAGGCTATACTGAAGCTGATCAATGGTCATTTGAGCAAGGGGGAGTGCAACGATCGGATACTCTTTATAGTGGACAACATGCCGCAAAATCAGGCGATCGAAAGCCTGCTGTTTAGGCACATATCGCAGAGTCACATGGAGCCCAGTGATAGTGAGGCATATGCCAGCACCGCCTTAACAGCCAATGCAACAGCACCACCACTGCCGCCCAGTACCGATTCCAGTGAGCCCATCTACCAAGAGCTCGACCAGCAACGACTGATCATCGACGACAAGTACTCATTGCCGCTGAATTCCGACGAGGATCCGCCGTACTCGGAGCCGTCCAATATGATGAATACGAACGACATGCCACCGGCATATCAATATGCCACACCGATGCGCATCCTGCCATGCCACCAGATGCAGCATCAGCAGCCGTCGACGACGGCCAATTATGCCATCCCCGTTTGGAGGTCCACTCCAAGTGCCACGCCCACTAGCCGCCCACCCTCGGGCTCACAGGAGGGGTCGGCCACCGCCACAGCGCCCAGAGCTGTCAAGGATTTGCGGCAGGCTCTGCAGAACTCCCCACAGTTCCATCCCAACCAGCTGACCTCAACGCGCAACCAAAGACAAATCCTGCAGATTCTGCCGCCGCTTCAGCCGCCGCCGTACACTCAGAGGTCACAGGTCAGGGGTCAGCGGAGGCGCAGCTTCGAGTGCCTCGATGGCGCCGCCAGCTTGGCGGCCATGGAGCACATGGACTCCGGCTCGGATCACTCTGGCGGCAGTGATGTGACCGTCCAAATTGCTGATGTGATCGACTACGCGGATGCCTAAAAGTATGCAGAGCACTCAAATATATACTATACTATATATATATAGTACAGGTATATAGTAACATAATATGCTTCTCATATTACGTTTACATACTTACACTAATTGTACATACAATCTTGCACATGCATAAACACATGAAACCAGTTTACATTTTTACTTACACTTAAGCGCATAATTTGTTGTGCATCCATACCGTTATTTTTCCGTTTTTTTTTGTACACATATACTGATTAGACATTCCCGTTTCTCGCGACTCACTTCGAGCCGATCAAAAACTCTGTACAGTCAGTCTTAAGCCGACAACGAAGAAATAAAGATCTAAAC\n'
b
diff -r e4e71401c577 -r 1df6aaac800e tool-data/bwa_index.loc.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool-data/bwa_index.loc.sample Wed Dec 13 10:40:50 2017 -0500
b
@@ -0,0 +1,14 @@
+#-rw-r--r--  1 james    universe 830134 2005-09-13 10:12 phiX.fa.amb
+#-rw-r--r--  1 james    universe 527388 2005-09-13 10:12 phiX.fa.ann
+#-rw-r--r--  1 james    universe 269808 2005-09-13 10:12 phiX.fa.bwt
+#...etc...
+#
+#Your bwa_index.loc file should include an entry per line for each
+#index set you have stored. The "file" in the path does not actually
+#exist, but it is the prefix for the actual index files.  For example:
+#
+#phiX174                                phiX    phiX174                 /depot/data2/galaxy/phiX/base/phiX.fa
+#hg18canon                              hg18    hg18 Canonical  /depot/data2/galaxy/hg18/base/hg18canon.fa
+#hg18full                               hg18    hg18 Full               /depot/data2/galaxy/hg18/base/hg18full.fa
+#/orig/path/hg19.fa             hg19    hg19                    /depot/data2/galaxy/hg19/base/hg19.fa
+#...etc...
\ No newline at end of file