Repository 'flowai'
hg clone https://toolshed.g2.bx.psu.edu/repos/immport-devteam/flowai

Changeset 1:34397a84faf1 (2020-06-23)
Previous changeset 0:60aa5e56531a (2017-02-27) Next changeset 2:fab7c5deeb65 (2023-09-26)
Commit message:
"planemo upload for repository https://github.com/ImmPortDB/immport-galaxy-tools/tree/master/flowtools/flowai commit 83ef47729f2d2cdae84171761a6795df9fb63389"
added:
FCSflowAI.R
FCSflowAI.xml
static/images/flowtools/autoflowrate.png
static/images/flowtools/autosignal.png
static/images/flowtools/margins.png
test-data/input.fcs
test-data/nooutliers/QCreport_nooutliers.html
test-data/nooutliers/hqdata_nooutliers.fcs
test-data/std/QCreport.html
test-data/std/alldata.fcs
test-data/std/hqdata.fcs
test-data/std/lqdata.fcs
test-data/withsfsc/QCreport_sfsc.html
test-data/withsfsc/hqdata_sfsc.fcs
removed:
flowai/FCSflowAI.R
flowai/FCSflowAI.xml
flowai/static/images/flowtools/autoflowrate.png
flowai/static/images/flowtools/autosignal.png
flowai/static/images/flowtools/margins.png
flowai/test-data/input.fcs
flowai/test-data/nooutliers/QCreport_nooutliers.html
flowai/test-data/nooutliers/hqdata_nooutliers.fcs
flowai/test-data/std/QCreport.html
flowai/test-data/std/alldata.fcs
flowai/test-data/std/hqdata.fcs
flowai/test-data/std/lqdata.fcs
flowai/test-data/withsfsc/QCreport_sfsc.html
flowai/test-data/withsfsc/hqdata_sfsc.fcs
b
diff -r 60aa5e56531a -r 34397a84faf1 FCSflowAI.R
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/FCSflowAI.R Tue Jun 23 18:34:02 2020 -0400
[
@@ -0,0 +1,38 @@
+#!/usr/bin/env Rscript
+#
+# Authors: Gianni Monaco
+#
+# Reference: flowAI: automatic and interactive anomaly discerning
+#            tools for flow cytometry data.
+#            Gianni Monaco, Hao Chen, Michael Poidinger, Jinmiao Chen,
+#            Joao Pedro de Magalhaes and Anis Larbi
+#            Bioinformatics (2016)
+#            doi: 10.1093/bioinformatics/btw191
+#
+
+library(flowAI)
+library(methods)
+
+# parse arguments
+
+args <- commandArgs(trailingOnly = TRUE)
+
+remFS <- if(args[4]) c("FSC", "SSC") else NULL
+
+flow_auto_qc(
+    fcsfiles = args[1],
+    remove_from = args[2],
+    alphaFR = as.numeric(args[3]),
+    ChRemoveFS = remFS,
+    outlierFS = args[5],
+    pen_valueFS = as.numeric(args[6]),
+    sideFM = args[7],
+    fcs_QC = ifelse(args[9] == "None", FALSE, "_QC"),
+    fcs_highQ = ifelse(args[10] == "None", FALSE, "_highQ"),
+    fcs_lowQ = ifelse(args[11] == "None", FALSE, "_lowQ"),
+    folder_results = FALSE)
+
+try(file.rename(dir(".", pattern = ".*_QC.html"), args[8]), silent =TRUE)
+try(file.rename(dir(".", pattern = ".*_QC.fcs"), args[9]), silent =TRUE)
+try(file.rename(dir(".", pattern = ".*_highQ.fcs"), args[10]), silent =TRUE)
+try(file.rename(dir(".", pattern = ".*_lowQ.fcs"), args[11]), silent =TRUE)
b
diff -r 60aa5e56531a -r 34397a84faf1 FCSflowAI.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/FCSflowAI.xml Tue Jun 23 18:34:02 2020 -0400
[
b'@@ -0,0 +1,177 @@\n+<tool id="flowAI" name="flowAI" version="1.0+galaxy0">\n+  <description> automatic quality control</description>\n+  <requirements>\n+    <requirement type="package" version="1.42.0">bioconductor-flowcore</requirement>\n+    <requirement type="package" version="1.2.9">bioconductor-flowai</requirement>\n+  </requirements>\n+  <stdio>\n+    <exit_code range="2:" level="fatal" description="See stderr for more details." />\n+  </stdio>\n+  <command><![CDATA[\n+      Rscript $__tool_directory__/FCSflowAI.R \'${input}\' \'${remove}\' $alphaFR $chremFS $outFS $penFS \'${sideFM}\' \'${full_rep}\' $highfcs $lowfcs $qcfcs\n+  ]]>\n+  </command>\n+  <inputs>\n+    <param format="fcs" name="input" type="data" label="FCS file"/>\n+    <param name="remove" type="select" label="Remove low quality cells from:">\n+      <option value="all">Flow rate, Signal acquisition and Dynamic range</option>\n+      <option value="FR_FS">Flow rate and Signal acquisition</option>\n+      <option value="FR_FM">Flow rate and Dynamic range</option>\n+      <option value="FS_FM">Signal acquisition and Dynamic range</option>\n+      <option value="FR">Flow rate</option>\n+      <option value="FS">Signal acquisition</option>\n+      <option value="FM">Dynamic range</option>\n+    </param>\n+    <param name="alphaFR" type="float" label="Significance threshold for flow rate check:" value="0.01"/>\n+    <param name="chremFS" type="boolean" checked="true" truevalue="TRUE" falsevalue="FALSE" label="Do you want to exclude the FSC and SSC parameters from the signal acquisition check?" help="The FSC and SSC parameters will not be taken into account for analysis but will not be removed."/>\n+    <param name="outFS" type="boolean" checked="false" truevalue="TRUE" falsevalue="FALSE" label="Do you want to remove outliers before the signal acquisition check?"/>\n+    <param name="penFS" type="integer" label="Stringency of signal acquisition check (higher tolerance with higher values):" value="200"/>\n+    <param name="sideFM" type="select" label="Include in dynamic range check:">\n+      <option value="both">Both limits</option>\n+      <option value="upper">Upper limit only</option>\n+      <option value="lower">Lower limit only</option>\n+    </param>\n+    <param name="highQ_FCS" type="boolean" checked="true" truevalue="TRUE" falsevalue="FALSE" label="Create FCS file with only high quality events?"/>\n+    <param name="lowQ_FCS" type="boolean" checked="false" truevalue="TRUE" falsevalue="FALSE" label="Create FCS file with only low quality events?"/>\n+    <param name="QC_FCS" type="boolean" checked="false" truevalue="TRUE" falsevalue="FALSE" label="Create FCS file with an additional parameter where low quality events have values higher than 10,000?"/>\n+  </inputs>\n+  <outputs>\n+    <data format="html" name="full_rep" label="QC of ${input.name}">\n+    </data>\n+    <data format="fcs" name="highfcs" label="High quality events only from ${input.name}">\n+      <filter>(highQ_FCS)</filter>\n+    </data>\n+    <data format="fcs" name="lowfcs" label="Low quality events only from ${input.name}">\n+      <filter>(lowQ_FCS)</filter>\n+    </data>\n+    <data format="fcs" name="qcfcs" label="All events (low quality event marked up) from ${input.name}">\n+      <filter>(QC_FCS)</filter>\n+    </data>\n+  </outputs>\n+  <tests>\n+    <test>\n+      <param name="input" value="input.fcs"/>\n+      <param name="remove" value="all"/>\n+      <param name="alphaFR" value="0.01"/>\n+      <param name="chremFS" value="TRUE"/>\n+      <param name="outFS" value="FALSE"/>\n+      <param name="penFS" value="200"/>\n+      <param name="sideFM" value="both"/>\n+      <param name="highQ_FCS" value="TRUE"/>\n+      <param name="lowQ_FCS" value="FALSE"/>\n+      <param name="QC_FCS" value="FALSE"/>\n+      <output name="full_rep" file="std/QCreport.html" compare="sim_size"/>\n+      <output name="highfcs" file="std/hqdata.fcs" compare="sim_size"/>\n+    </test>\n+    <test>\n+      <param name="input" value="input.fcs"/>\n+      <param name="remove" v'..b'="std/alldata.fcs" compare="sim_size"/>\n+    </test>\n+    <test>\n+      <param name="input" value="input.fcs"/>\n+      <param name="remove" value="all"/>\n+      <param name="alphaFR" value="0.01"/>\n+      <param name="chremFS" value="TRUE"/>\n+      <param name="outFS" value="TRUE"/>\n+      <param name="penFS" value="200"/>\n+      <param name="sideFM" value="both"/>\n+      <param name="highQ_FCS" value="TRUE"/>\n+      <param name="lowQ_FCS" value="FALSE"/>\n+      <param name="QC_FCS" value="FALSE"/>\n+      <output name="full_rep" file="nooutliers/QCreport_nooutliers.html" compare="sim_size"/>\n+      <output name="highfcs" file="nooutliers/hqdata_nooutliers.fcs" compare="sim_size"/>\n+    </test>\n+    <test>\n+      <param name="input" value="input.fcs"/>\n+      <param name="remove" value="all"/>\n+      <param name="alphaFR" value="0.01"/>\n+      <param name="chremFS" value="FALSE"/>\n+      <param name="outFS" value="FALSE"/>\n+      <param name="penFS" value="200"/>\n+      <param name="sideFM" value="both"/>\n+      <param name="highQ_FCS" value="TRUE"/>\n+      <param name="lowQ_FCS" value="FALSE"/>\n+      <param name="QC_FCS" value="FALSE"/>\n+      <output name="full_rep" file="withsfsc/QCreport_sfsc.html" compare="sim_size"/>\n+      <output name="highfcs" file="withsfsc/hqdata_sfsc.fcs" compare="sim_size"/>\n+    </test>\n+  </tests>\n+  <help><![CDATA[\n+   This tool automatically performs quality control of flow cytometry data.\n+\n+-----\n+\n+**Input files**\n+\n+  \xe2\x80\xa2 One or more FCS files.\n+\n+**Output files**\n+\n+  \xe2\x80\xa2 full HTML report\n+  \xe2\x80\xa2 new FCS file containing only high quality events (default)\n+  \xe2\x80\xa2 new FCS file containing only low quality events (optional)\n+  \xe2\x80\xa2 original FCS file containing an additional parameter where the low quality events have a value higher than 10,000 (optional)\n+\n+\n+The files generated will be FCS 3.0.\n+\n+----\n+\n+Description of the approach\n+\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\n+This tool identifies anomalies from three fundamental properties of flow cytometry data:\n+\n+  - *Flow rate*. Surges and substantial shifts of the rate of the cells passing through the capillary tube are detected.\n+\n+  - *Signal acquisition*. Instability in the signal acquired for each channel are detected. In most cases it corresponds to flow rate surges and shifts.\n+\n+  - *Dynamic range*. Values recorded in the upper limit (margin events) and negative outliers are removed.\n+\n+.. class:: infomark\n+\n+An HTML report with informative plots is generated. Users are advised to review the report and also::\n+\n+  1. Eventually adjust the quality control parameters\n+  2. Discard the entire FCS file because of an unacceptable number of anomalies\n+  3. Program a flow cytometry maintenance because of recurrent issues\n+\n+\n+Parameters\n+\'\'\'\'\'\'\'\'\'\'\n+Default settings work well in the majority of cases. Setting customization may be needed to address properties of unique datasets. For example, high-dimensional FCS files may perform best with more tolerant setttings for signal acquisition checks.\n+\n+Example\n+\'\'\'\'\'\'\'\n+This section provides an example of a flowAI quality control html report with plots:\n+\n+\n+Flow rate check: anomalies are flagged with a green circle. In this instance a surge was detected and discarded as well as a shift from the median value later in the experiment.\n+\n+.. image:: ./static/images/flowtools/autoflowrate.png\n+\n+Signal acquistion check: Orange background (or yellow depending on the user\'s computer) highlights the stable region. Signal acquistion shifts are identified on a per channel basis and the largest region containing no anomalies is retained.\n+\n+.. image:: ./static/images/flowtools/autosignal.png\n+\n+Dynamic range check: red and blue lines reflect the detected number of events over time. The x-axis corresponds to that of the signal acquisition plot.\n+\n+.. image:: ./static/images/flowtools/margins.png\n+\n+ ]]>\n+  </help>\n+  <citations>\n+    <citation type="doi">10.1093/bioinformatics/btw191</citation>\n+  </citations>\n+</tool>\n'
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/FCSflowAI.R
--- a/flowai/FCSflowAI.R Mon Feb 27 12:55:30 2017 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,41 +0,0 @@
-#
-#
-# Authors: Gianni Monaco
-# 
-# Reference: flowAI: automatic and interactive anomaly discerning 
-#            tools for flow cytometry data.
-#            Gianni Monaco, Hao Chen, Michael Poidinger, Jinmiao Chen, 
-#            Joao Pedro de Magalhaes and Anis Larbi
-#            Bioinformatics (2016)
-#            doi: 10.1093/bioinformatics/btw191
-#
-
-library(flowAI)
-library(methods)
-
-# parse arguments
-
-args <- commandArgs(trailingOnly = TRUE)
-
-remFS <- if(args[5]) c("FSC", "SSC") else NULL
-
-flow_auto_qc(
-    fcsfiles = args[2], 
-    remove_from = args[3], 
-    alphaFR = as.numeric(args[4]), 
-    ChRemoveFS = remFS, 
-    outlierFS = args[6], 
-    pen_valueFS = as.numeric(args[7]), 
-    sideFM = args[8], 
-    fcs_QC = ifelse(args[10] == "None", FALSE, "_QC"),
-    fcs_highQ = ifelse(args[11] == "None", FALSE, "_highQ"), 
-    fcs_lowQ = ifelse(args[12] == "None", FALSE, "_lowQ"), 
-    folder_results = FALSE)
-
-try(file.rename(dir(".", pattern = ".*_QC.html"), args[9]), silent =TRUE)
-try(file.rename(dir(".", pattern = ".*_QC.fcs"), args[10]), silent =TRUE)
-try(file.rename(dir(".", pattern = ".*_highQ.fcs"), args[11]), silent =TRUE)
-try(file.rename(dir(".", pattern = ".*_lowQ.fcs"), args[12]), silent =TRUE)
-
-
-
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/FCSflowAI.xml
--- a/flowai/FCSflowAI.xml Mon Feb 27 12:55:30 2017 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,178 +0,0 @@\n-<tool id="flowAI" name="flowAI" version="1.0">\n-  <description> automatic quality control </description>\n-  <requirements>\n-    <requirement type="package" version="3.3.0">r</requirement>\n-    <requirement type="package" version="1.38.2">bioconductor-flowcore</requirement>\n-    <requirement type="package" version="1.2.9">bioconductor-flowai</requirement>\n-  </requirements>\n-  <stdio>\n-    <exit_code range="2:" level="fatal" description="See stderr for more details." />\n-  </stdio>\n-  <command><![CDATA[\n-      Rscript --slave --vanilla $GALAXY_ROOT_DIR/tools/flowtools/FCSflowAI.R --args "${input}" "${remove}" $alphaFR $chremFS $outFS $penFS "${sideFM}" "${full_rep}" $highfcs $lowfcs $qcfcs\n-  ]]>\n-  </command>\n-  <inputs>\n-    <param format="fcs" name="input" type="data" label="FCS file"/>\n-    <param name="remove" type="select" label="Remove low quality cells from:">\n-      <option value="all">Flow rate, Signal acquisition and Dynamic range</option>\n-      <option value="FR_FS">Flow rate and Signal acquisition</option>\n-      <option value="FR_FM">Flow rate and Dynamic range</option>\n-      <option value="FS_FM">Signal acquisition and Dynamic range</option>\n-      <option value="FR">Flow rate</option>\n-      <option value="FS">Signal acquisition</option>\n-      <option value="FM">Dynamic range</option>\n-    </param>\n-    <param name="alphaFR" type="float" label="Significance threshold for flow rate check:" value="0.01"/>\n-    <param name="chremFS" type="boolean" checked="true" truevalue="TRUE" falsevalue="FALSE" label="Do you want to exclude the FSC and SSC parameters from the signal acquisition check?" help="The FSC and SSC parameters will not be taken into account for analysis but will not be removed."/>\n-    <param name="outFS" type="boolean" checked="false" truevalue="TRUE" falsevalue="FALSE" label="Do you want to remove outliers before the signal acquisition check?"/>\n-    <param name="penFS" type="integer" label="Stringency of signal acquisition check (higher tolerance with higher values):" value="200"/>\n-    <param name="sideFM" type="select" label="Include in dynamic range check:">\n-      <option value="both">Both limits</option>\n-      <option value="upper">Upper limit only</option>\n-      <option value="lower">Lower limit only</option>\n-    </param>\n-    <param name="highQ_FCS" type="boolean" checked="true" truevalue="TRUE" falsevalue="FALSE" label="Create FCS file with only high quality events?"/>\n-    <param name="lowQ_FCS" type="boolean" checked="false" truevalue="TRUE" falsevalue="FALSE" label="Create FCS file with only low quality events?"/>\n-    <param name="QC_FCS" type="boolean" checked="false" truevalue="TRUE" falsevalue="FALSE" label="Create FCS file with an additional parameter where low quality events have values higher than 10,000?"/>\n-  </inputs>\n-  <outputs>\n-    <data format="html" name="full_rep" label="QC of ${input.name}">\n-    </data>\n-    <data format="fcs" name="highfcs" label="High quality events only from ${input.name}">\n-      <filter>(highQ_FCS)</filter>\n-    </data>\n-    <data format="fcs" name="lowfcs" label="Low quality events only from ${input.name}">\n-      <filter>(lowQ_FCS)</filter>\n-    </data>\n-    <data format="fcs" name="qcfcs" label="All events (low quality event marked up) from ${input.name}">\n-      <filter>(QC_FCS)</filter>\n-    </data>\n-  </outputs>\n-  <tests>\n-    <test>\n-      <param name="input" value="input.fcs"/>\n-      <param name="remove" value="all"/>\n-      <param name="alphaFR" value="0.01"/>\n-      <param name="chremFS" value="TRUE"/>\n-      <param name="outFS" value="FALSE"/>\n-      <param name="penFS" value="200"/>\n-      <param name="sideFM" value="both"/>\n-      <param name="highQ_FCS" value="TRUE"/>\n-      <param name="lowQ_FCS" value="FALSE"/>\n-      <param name="QC_FCS" value="FALSE"/>\n-      <output name="full_rep" file="std/QCreport.html" lines_diff="2"/>\n-      <output name="highfcs" file="std/hqdata.fcs" compare="sim_size"/>\n-    </te'..b'sim_size"/>\n-      <output name="qcfcs" file="std/alldata.fcs" compare="sim_size"/>\n-    </test>\n-    <test>\n-      <param name="input" value="input.fcs"/>\n-      <param name="remove" value="all"/>\n-      <param name="alphaFR" value="0.01"/>\n-      <param name="chremFS" value="TRUE"/>\n-      <param name="outFS" value="TRUE"/>\n-      <param name="penFS" value="200"/>\n-      <param name="sideFM" value="both"/>\n-      <param name="highQ_FCS" value="TRUE"/>\n-      <param name="lowQ_FCS" value="FALSE"/>\n-      <param name="QC_FCS" value="FALSE"/>\n-      <output name="full_rep" file="nooutliers/QCreport_nooutliers.html" lines_diff="2"/>\n-      <output name="highfcs" file="nooutliers/hqdata_nooutliers.fcs" compare="sim_size"/>\n-    </test>\n-    <test>\n-      <param name="input" value="input.fcs"/>\n-      <param name="remove" value="all"/>\n-      <param name="alphaFR" value="0.01"/>\n-      <param name="chremFS" value="FALSE"/>\n-      <param name="outFS" value="FALSE"/>\n-      <param name="penFS" value="200"/>\n-      <param name="sideFM" value="both"/>\n-      <param name="highQ_FCS" value="TRUE"/>\n-      <param name="lowQ_FCS" value="FALSE"/>\n-      <param name="QC_FCS" value="FALSE"/>\n-      <output name="full_rep" file="withsfsc/QCreport_sfsc.html" lines_diff="2"/>\n-      <output name="highfcs" file="withsfsc/hqdata_sfsc.fcs" compare="sim_size"/>\n-    </test>\n-  </tests>\n-  <help><![CDATA[\n-   This tool automatically performs quality control of flow cytometry data.\n-\n------\n-\n-**Input files**\n-\n-  \xe2\x80\xa2 One or more FCS files.\n-\n-**Output files**\n-\n-  \xe2\x80\xa2 full HTML report\n-  \xe2\x80\xa2 new FCS file containing only high quality events (default)\n-  \xe2\x80\xa2 new FCS file containing only low quality events (optional)\n-  \xe2\x80\xa2 original FCS file containing an additional parameter where the low quality events have a value higher than 10,000 (optional)\n-\n-\n-The files generated will be FCS 3.0.\n-\n-----\n-\n-Description of the approach\n-\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\n-This tool identifies anomalies from three fundamental properties of flow cytometry data:\n-\n-  - *Flow rate*. Surges and substantial shifts of the rate of the cells passing through the capillary tube are detected.\n-\n-  - *Signal acquisition*. Instability in the signal acquired for each channel are detected. In most cases it corresponds to flow rate surges and shifts.\n-\n-  - *Dynamic range*. Values recorded in the upper limit (margin events) and negative outliers are removed.\n-\n-.. class:: infomark\n-\n-An HTML report with informative plots is generated. Users are advised to review the report and also::\n-\n-  1. Eventually adjust the quality control parameters\n-  2. Discard the entire FCS file because of an unacceptable number of anomalies\n-  3. Program a flow cytometry maintenance because of recurrent issues\n-\n-\n-Parameters\n-\'\'\'\'\'\'\'\'\'\'\n-Default settings work well in the majority of cases. Setting customization may be needed to address properties of unique datasets. For example, high-dimensional FCS files may perform best with more tolerant setttings for signal acquisition checks.\n-\n-Example\n-\'\'\'\'\'\'\'\n-This section provides an example of a flowAI quality control html report with plots:\n-\n-\n-Flow rate check: anomalies are flagged with a green circle. In this instance a surge was detected and discarded as well as a shift from the median value later in the experiment.\n-\n-.. image:: static/images/autoflowrate.png\n-\n-Signal acquistion check: Orange background (or yellow depending on the user\'s computer) highlights the stable region. Signal acquistion shifts are identified on a per channel basis and the largest region containing no anomalies is retained.\n-\n-.. image:: static/images/autosignal.png\n-\n-Dynamic range check: red and blue lines reflect the detected number of events over time. The x-axis corresponds to that of the signal acquisition plot.\n-\n-.. image:: static/images/margins.png\n-\n- ]]>\n-  </help>\n-  <citations>\n-    <citation type="doi">10.1093/bioinformatics/btw191</citation>\n-  </citations>\n-</tool>\n'
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/static/images/flowtools/autoflowrate.png
b
Binary file flowai/static/images/flowtools/autoflowrate.png has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/static/images/flowtools/autosignal.png
b
Binary file flowai/static/images/flowtools/autosignal.png has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/static/images/flowtools/margins.png
b
Binary file flowai/static/images/flowtools/margins.png has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/test-data/input.fcs
b
Binary file flowai/test-data/input.fcs has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/test-data/nooutliers/QCreport_nooutliers.html
--- a/flowai/test-data/nooutliers/QCreport_nooutliers.html Mon Feb 27 12:55:30 2017 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,240 +0,0 @@\n-<!DOCTYPE html>\n-<html>\n-<head>\n-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>\n-\n-<title>FCS file information</title>\n-\n-<script type="text/javascript">\n-window.onload = function() {\n-  var imgs = document.getElementsByTagName(\'img\'), i, img;\n-  for (i = 0; i < imgs.length; i++) {\n-    img = imgs[i];\n-    // center an image if it is the only element of its parent\n-    if (img.parentElement.childElementCount === 1)\n-      img.parentElement.style.textAlign = \'center\';\n-  }\n-};\n-</script>\n-\n-\n-\n-\n-\n-<style type="text/css">\n-body, td {\n-   font-family: sans-serif;\n-   background-color: white;\n-   font-size: 13px;\n-}\n-\n-body {\n-  max-width: 800px;\n-  margin: auto;\n-  padding: 1em;\n-  line-height: 20px;\n-}\n-\n-tt, code, pre {\n-   font-family: \'DejaVu Sans Mono\', \'Droid Sans Mono\', \'Lucida Console\', Consolas, Monaco, monospace;\n-}\n-\n-h1 {\n-   font-size:2.2em;\n-}\n-\n-h2 {\n-   font-size:1.8em;\n-}\n-\n-h3 {\n-   font-size:1.4em;\n-}\n-\n-h4 {\n-   font-size:1.0em;\n-}\n-\n-h5 {\n-   font-size:0.9em;\n-}\n-\n-h6 {\n-   font-size:0.8em;\n-}\n-\n-a:visited {\n-   color: rgb(50%, 0%, 50%);\n-}\n-\n-pre, img {\n-  max-width: 100%;\n-}\n-pre {\n-  overflow-x: auto;\n-}\n-pre code {\n-   display: block; padding: 0.5em;\n-}\n-\n-code {\n-  font-size: 92%;\n-  border: 1px solid #ccc;\n-}\n-\n-code[class] {\n-  background-color: #F8F8F8;\n-}\n-\n-table, td, th {\n-  border: none;\n-}\n-\n-blockquote {\n-   color:#666666;\n-   margin:0;\n-   padding-left: 1em;\n-   border-left: 0.5em #EEE solid;\n-}\n-\n-hr {\n-   height: 0px;\n-   border-bottom: none;\n-   border-top-width: thin;\n-   border-top-style: dotted;\n-   border-top-color: #999999;\n-}\n-\n-@media print {\n-   * {\n-      background: transparent !important;\n-      color: black !important;\n-      filter:none !important;\n-      -ms-filter: none !important;\n-   }\n-\n-   body {\n-      font-size:12pt;\n-      max-width:100%;\n-   }\n-\n-   a, a:visited {\n-      text-decoration: underline;\n-   }\n-\n-   hr {\n-      visibility: hidden;\n-      page-break-before: always;\n-   }\n-\n-   pre, blockquote {\n-      padding-right: 1em;\n-      page-break-inside: avoid;\n-   }\n-\n-   tr, img {\n-      page-break-inside: avoid;\n-   }\n-\n-   img {\n-      max-width: 100% !important;\n-   }\n-\n-   @page :left {\n-      margin: 15mm 20mm 15mm 10mm;\n-   }\n-\n-   @page :right {\n-      margin: 15mm 10mm 15mm 20mm;\n-   }\n-\n-   p, h2, h3 {\n-      orphans: 3; widows: 3;\n-   }\n-\n-   h2, h3 {\n-      page-break-after: avoid;\n-   }\n-}\n-</style>\n-\n-\n-\n-</head>\n-\n-<body>\n-<h2>FCS file information</h2>\n-\n-<blockquote>\n-<p>Input file name: dataset_934<br/>\n-Number of events: 20000</p>\n-</blockquote>\n-\n-<h2>Quality control analysis</h2>\n-\n-<h3>Summary</h3>\n-\n-<blockquote>\n-<p>The anomalies were removed from:  Flow Rate, Flow Signal and Flow Margin<br/>\n-Anomalies detected in total: <strong>25.11</strong> %<br/>\n-Number of high quality events: 14978  </p>\n-</blockquote>\n-\n-<h3>Flow rate check</h3>\n-\n-<blockquote>\n-<p><strong>0</strong> % anomalies detected in the flow rate check.</p>\n-</blockquote>\n-\n-<p>It was not possible to analyze the flow rate since the time channel is missing. </p>\n-\n-<h3>Signals acquisition check</h3>\n-\n-<blockquote>\n-<p><strong>0</strong> % anomalies detected in the signal aquisition check. </p>\n-</blockquote>\n-\n-<p>Outliers were removed before the changepoint analysis.0% of anomalies were detected as outliers and 0 of anomalies were detected in the changepoint analysis. </p>\n-\n-<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABXgAAAHgCAIAAACQE5JdAAAACXBIWXMAAB7CAAAewgFu0HU+AAAgAElEQVR4nOy9e5QjZZ3//36eqkpSne5Od/reE4EdYbg4HIHBFRhvKF5QERRFzoGZFRDX488bHjjrlzkisCoXXfHuKrrrwhyXRY+IIIoKCpwBhosgAoM63NOX9CWddLpTSaqe5/n9UUl1Op1OJ91JJz18XmfOnHSlUvnkU/XcPs/nwpRSIAiCIAiCIAiCIAiCqAe82QIQBEEQBEEQBEEQBHHgQIYGgiAIgiAIgiAIgiDqBhkaCIIgCIIgCIIgCIKoG2RoIAiCIAiCIAiCIAiibpChgSAIgiAIgiAIgiCIukGGBoIgCIIgCIIgCIIg6gYZGgiCIAiCIAiCIAiCqBtkaCAIgiAIgiAIgiAIom6QoYEgCIIgCIIgCIIgiLpBhgaCIAiCIAiCIAiCIOoGGRoIgiAIgiAIgiAIgqgbZGggCIIgCIIgCIIgCKJukKGBIAiCIAiCIAiCII'..b'gI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAIHONGTMmq3DZ2dm1a9fu1KnTD3/4w7lz5x7wFbp27RpNLoVqBw4cGL3Xgw8+WPD6jh07ivhT5ObmNmnSpFevXvfff/+CBQtKoU4AACghAncAACirEonEhg0bZs+e/fjjj7dv3/6ee+5JJBLpLuqQ7dmzZ+nSpVOmTLnrrruOP/74m2++efPmzekuCgAAUlEh3QUAAAAHV6tWrY4dOxa8kkgk1q1bt3LlyjVr1kRf3nfffbm5uXfffXeaaiyWk08+uUKF//4zJPrMYMmSJevXrw8h7N279ze/+c2UKVPeeuutOnXqpK9MAABIhcAdAADKgC5duvzzn//c/3oikZg8efLw4cNnzpwZQrjvvvuGDBnSrFmz5IRrrrmmb9++pVfowYwbN65WrVr7XMzPz582bdqvfvWr//3f/w0hTJs2rV+/fhMnTszJyUlHjQAAkCJHygAAQBmWlZXVu3fvcePGHXXUUSGE3bt3v/TSSwUn3HjjjT//+c9//vOfp6nAYsnOzj7xxBNfeuml5557Ljs7O4Tw3nvv/fa3v013XQAAcGgE7gAAUOY1bNiwX79+0XjOnDkpvMKCBQv+9Kc/Pfjgg88888zkyZN37doVa4HFdeWVVyaPxBk5cuSOHTvSUgYAAKRG4A4AAOVBq1atosE+z03t1atXVlZWVlZWwYsDBw7MysqqX79+CGH16tUXXHBBy5Ytv/e97915553XXHNN796927Zt+/rrr5da8QXdcccdDRs2DCGsXbt27NixaakBAABSI3AHAIDy4LPPPosGzZs3L/6qFStWdOvW7Y033gghFDwwfeHChQMGDBg/fny8RRZHpUqVLr/88micrtAfAABSI3AHAIAyb+XKlePGjYvGl112WTFX7d27d/DgwYsXL77wwgsnTZq0adOmTZs2vfbaa9EzVxOJxNChQ0uq4iIln/I6derUtBQAAACpEbgDAEDZ9v777/fr12/VqlUhhFtuueX4448v5sI1a9ZMmDDhlltueeWVV3r16lWlSpXq1av379//rbfeqly5cghhwYIFa9asKcHSC9GxY8dosHjx4g0bNpR+AQAAkJoK6S4AAAA4uBkzZvTp06fglUQisX79+hUrVqxcuTKEkJOT86Mf/ej+++8/pJdt0KDByJEjs7O/sRGnRYsWZ511VnScy/z584844ojDLv/Q1KlTp1KlStETU9euXVurVq1SLgAAAFIjcAcAgDJg/fr177zzThETevTocdVVV+0TnR/UjTfeGG1m38dxxx0XDfLz8w/pBeNSs2bNKHBfv359WgoAAIAUOFIGAADKgylTprRt2/a22247pIi8ffv2B7xeoUKmbM3JyspKdwkAAFBcAncAACgDzjzzzMSBbN26ddasWSNGjMjNzc3Pz//lL385bNiw4r9s9HzUDLRp06ZoULt27fRWAgAAxSdwBwCAMqxKlSodO3a8995733jjjejK6NGjZ8+eXczl1atXL7HSUrd+/frt27dH47p166a3GAAAKD6BOwAAlAdnnXXWhRdeGI2ff/759BZzmGbNmhUNmjZtWrNmzfQWAwAAxSdwBwCAcqJnz57RYNGiRemt5DC99dZb0aB79+7prQQAAA6JwB0AAMqJ5PkwmzdvTm8lh2Pnzp3JHfr9+/dPbzEAAHBIBO4AAFBOJE9iadKkSXorORwPPvjg8uXLQwh169a95JJL0l0OAAAcAoE7AACUB1988UVyY3ifPn3SW0zKxowZ87Of/Swa33333RUrVkxvPQAAcEgE7gAAUOa99957ffv23b59ewihUaNGF198cborOjSJRGLmzJlDhgy54oor8vPzQwi9evX6wQ9+kO66AADg0FRIdwEAAMDBzZgx44D71rdt27Zw4cKvv/46+jIrK+sPf/hDpUqVSre6Q3DhhRfm5uYmv0wkEps2bVq8ePHq1auTF0888cTXX389JycnHQUCAEDqBO4AAFAGrF+//p133il6TpUqVZ577rlzzjmndEpKzcSJE4u4m5OT84Mf/OC+++5LPgAWAADKEIE7AACUbTVr1mzWrFnfvn1/+MMfNmjQYJ+711xzzf5b4wcNGtSuXbsQQq1atQ74mn369Im2yR999NElUPI3VKhQoV69esccc8y555773e9+97jjjivpdwQAgBKSlUgk0l0DAABQHkyePHnp0qUhhA4dOrRp0ybd5QAAQGkTuAMAAAAAQAyy010AAAAAAACUBwJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIwf8HUOoHNKnhlKkAAAAASUVORK5CYII=" title="plot of chunk unnamed-chunk-11" alt="plot of chunk unnamed-chunk-11" width="750px" style="display: block; margin: auto;" /></p>\n-\n-<p>The plot shows where the anomalies occured the most. The x-axis scale is complementary to the one of the signal acquisition plot. </p>\n-\n-<h5>More info on the anomalies detected in the dynamic range check:</h5>\n-\n-<p>for each channel, The table shows the number of events that did not pass the dynamic range check:</p>\n-\n-<pre><code>##              lower_range upper_range\n-## FSC-H                  0         217\n-## SSC-H                  0        4990\n-## FL1-H                  0           0\n-## FL2-H                  0           0\n-## FL3-H                  0           0\n-## FL4-H                  0           0\n-## total_SUM              0        5207\n-## total_UNIQUE           0        5022\n-</code></pre>\n-\n-</body>\n-\n-</html>\n'
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/test-data/nooutliers/hqdata_nooutliers.fcs
b
Binary file flowai/test-data/nooutliers/hqdata_nooutliers.fcs has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/test-data/std/QCreport.html
--- a/flowai/test-data/std/QCreport.html Mon Feb 27 12:55:30 2017 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,238 +0,0 @@\n-<!DOCTYPE html>\n-<html>\n-<head>\n-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>\n-\n-<title>FCS file information</title>\n-\n-<script type="text/javascript">\n-window.onload = function() {\n-  var imgs = document.getElementsByTagName(\'img\'), i, img;\n-  for (i = 0; i < imgs.length; i++) {\n-    img = imgs[i];\n-    // center an image if it is the only element of its parent\n-    if (img.parentElement.childElementCount === 1)\n-      img.parentElement.style.textAlign = \'center\';\n-  }\n-};\n-</script>\n-\n-\n-\n-\n-\n-<style type="text/css">\n-body, td {\n-   font-family: sans-serif;\n-   background-color: white;\n-   font-size: 13px;\n-}\n-\n-body {\n-  max-width: 800px;\n-  margin: auto;\n-  padding: 1em;\n-  line-height: 20px;\n-}\n-\n-tt, code, pre {\n-   font-family: \'DejaVu Sans Mono\', \'Droid Sans Mono\', \'Lucida Console\', Consolas, Monaco, monospace;\n-}\n-\n-h1 {\n-   font-size:2.2em;\n-}\n-\n-h2 {\n-   font-size:1.8em;\n-}\n-\n-h3 {\n-   font-size:1.4em;\n-}\n-\n-h4 {\n-   font-size:1.0em;\n-}\n-\n-h5 {\n-   font-size:0.9em;\n-}\n-\n-h6 {\n-   font-size:0.8em;\n-}\n-\n-a:visited {\n-   color: rgb(50%, 0%, 50%);\n-}\n-\n-pre, img {\n-  max-width: 100%;\n-}\n-pre {\n-  overflow-x: auto;\n-}\n-pre code {\n-   display: block; padding: 0.5em;\n-}\n-\n-code {\n-  font-size: 92%;\n-  border: 1px solid #ccc;\n-}\n-\n-code[class] {\n-  background-color: #F8F8F8;\n-}\n-\n-table, td, th {\n-  border: none;\n-}\n-\n-blockquote {\n-   color:#666666;\n-   margin:0;\n-   padding-left: 1em;\n-   border-left: 0.5em #EEE solid;\n-}\n-\n-hr {\n-   height: 0px;\n-   border-bottom: none;\n-   border-top-width: thin;\n-   border-top-style: dotted;\n-   border-top-color: #999999;\n-}\n-\n-@media print {\n-   * {\n-      background: transparent !important;\n-      color: black !important;\n-      filter:none !important;\n-      -ms-filter: none !important;\n-   }\n-\n-   body {\n-      font-size:12pt;\n-      max-width:100%;\n-   }\n-\n-   a, a:visited {\n-      text-decoration: underline;\n-   }\n-\n-   hr {\n-      visibility: hidden;\n-      page-break-before: always;\n-   }\n-\n-   pre, blockquote {\n-      padding-right: 1em;\n-      page-break-inside: avoid;\n-   }\n-\n-   tr, img {\n-      page-break-inside: avoid;\n-   }\n-\n-   img {\n-      max-width: 100% !important;\n-   }\n-\n-   @page :left {\n-      margin: 15mm 20mm 15mm 10mm;\n-   }\n-\n-   @page :right {\n-      margin: 15mm 10mm 15mm 20mm;\n-   }\n-\n-   p, h2, h3 {\n-      orphans: 3; widows: 3;\n-   }\n-\n-   h2, h3 {\n-      page-break-after: avoid;\n-   }\n-}\n-</style>\n-\n-\n-\n-</head>\n-\n-<body>\n-<h2>FCS file information</h2>\n-\n-<blockquote>\n-<p>Input file name: dataset_934<br/>\n-Number of events: 20000</p>\n-</blockquote>\n-\n-<h2>Quality control analysis</h2>\n-\n-<h3>Summary</h3>\n-\n-<blockquote>\n-<p>The anomalies were removed from:  Flow Rate, Flow Signal and Flow Margin<br/>\n-Anomalies detected in total: <strong>25.11</strong> %<br/>\n-Number of high quality events: 14978  </p>\n-</blockquote>\n-\n-<h3>Flow rate check</h3>\n-\n-<blockquote>\n-<p><strong>0</strong> % anomalies detected in the flow rate check.</p>\n-</blockquote>\n-\n-<p>It was not possible to analyze the flow rate since the time channel is missing. </p>\n-\n-<h3>Signals acquisition check</h3>\n-\n-<blockquote>\n-<p><strong>0</strong> % anomalies detected in the signal aquisition check. </p>\n-</blockquote>\n-\n-<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABXgAAAHgCAIAAACQE5JdAAAACXBIWXMAAB7CAAAewgFu0HU+AAAgAElEQVR4nOy9e5QjZZ3//36eqkpSne5Od/reE4EdYbg4HIHBFRhvKF5QERRFzoGZFRDX488bHjjrlzkisCoXXfHuKrrrwhyXRY+IIIoKCpwBhosgAoM63NOX9CWddLpTSaqe5/n9UUl1Op1OJ91JJz18XmfOnHSlUvnkU/XcPs/nwpRSIAiCIAiCIAiCIAiCqAe82QIQBEEQBEEQBEEQBHHgQIYGgiAIgiAIgiAIgiDqBhkaCIIgCIIgCIIgCIKoG2RoIAiCIAiCIAiCIAiibpChgSAIgiAIgiAIgiCIukGGBoIgCIIgCIIgCIIg6gYZGgiCIAiCIAiCIAiCqBtkaCAIgiAIgiAIgiAIom6QoYEgCIIgCIIgCIIgiLpBhgaCIAiCIAiCIAiCIOoGGRoIgiAIgiAIgiAIgqgbZGggCIIgCIIgCIIgCKJukKGBIAiCIAiCIAiCIIi6QYYGgiAIgiAIgiAIgiDqBhkaCIIgCIIgCIIgCIKoG3qzBdh4jIyMjI+PN+vbbdvWNI3zVrQQKaW814yxJkpSgVwup+s6KXDV5HI5wzBaUzxS4BppfQUqpWzbJgWuGlLgGnEV6PP5mi1IeUiBa6T1FSildByHFLhqpJRCCMM'..b'gI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAIHONGTMmq3DZ2dm1a9fu1KnTD3/4w7lz5x7wFbp27RpNLoVqBw4cGL3Xgw8+WPD6jh07ivhT5ObmNmnSpFevXvfff/+CBQtKoU4AACghAncAACirEonEhg0bZs+e/fjjj7dv3/6ee+5JJBLpLuqQ7dmzZ+nSpVOmTLnrrruOP/74m2++efPmzekuCgAAUlEh3QUAAAAHV6tWrY4dOxa8kkgk1q1bt3LlyjVr1kRf3nfffbm5uXfffXeaaiyWk08+uUKF//4zJPrMYMmSJevXrw8h7N279ze/+c2UKVPeeuutOnXqpK9MAABIhcAdAADKgC5duvzzn//c/3oikZg8efLw4cNnzpwZQrjvvvuGDBnSrFmz5IRrrrmmb9++pVfowYwbN65WrVr7XMzPz582bdqvfvWr//3f/w0hTJs2rV+/fhMnTszJyUlHjQAAkCJHygAAQBmWlZXVu3fvcePGHXXUUSGE3bt3v/TSSwUn3HjjjT//+c9//vOfp6nAYsnOzj7xxBNfeuml5557Ljs7O4Tw3nvv/fa3v013XQAAcGgE7gAAUOY1bNiwX79+0XjOnDkpvMKCBQv+9Kc/Pfjgg88888zkyZN37doVa4HFdeWVVyaPxBk5cuSOHTvSUgYAAKRG4A4AAOVBq1atosE+z03t1atXVlZWVlZWwYsDBw7MysqqX79+CGH16tUXXHBBy5Ytv/e97915553XXHNN796927Zt+/rrr5da8QXdcccdDRs2DCGsXbt27NixaakBAABSI3AHAIDy4LPPPosGzZs3L/6qFStWdOvW7Y033gghFDwwfeHChQMGDBg/fny8RRZHpUqVLr/88micrtAfAABSI3AHAIAyb+XKlePGjYvGl112WTFX7d27d/DgwYsXL77wwgsnTZq0adOmTZs2vfbaa9EzVxOJxNChQ0uq4iIln/I6derUtBQAAACpEbgDAEDZ9v777/fr12/VqlUhhFtuueX4448v5sI1a9ZMmDDhlltueeWVV3r16lWlSpXq1av379//rbfeqly5cghhwYIFa9asKcHSC9GxY8dosHjx4g0bNpR+AQAAkJoK6S4AAAA4uBkzZvTp06fglUQisX79+hUrVqxcuTKEkJOT86Mf/ej+++8/pJdt0KDByJEjs7O/sRGnRYsWZ511VnScy/z584844ojDLv/Q1KlTp1KlStETU9euXVurVq1SLgAAAFIjcAcAgDJg/fr177zzThETevTocdVVV+0TnR/UjTfeGG1m38dxxx0XDfLz8w/pBeNSs2bNKHBfv359WgoAAIAUOFIGAADKgylTprRt2/a22247pIi8ffv2B7xeoUKmbM3JyspKdwkAAFBcAncAACgDzjzzzMSBbN26ddasWSNGjMjNzc3Pz//lL385bNiw4r9s9HzUDLRp06ZoULt27fRWAgAAxSdwBwCAMqxKlSodO3a8995733jjjejK6NGjZ8+eXczl1atXL7HSUrd+/frt27dH47p166a3GAAAKD6BOwAAlAdnnXXWhRdeGI2ff/759BZzmGbNmhUNmjZtWrNmzfQWAwAAxSdwBwCAcqJnz57RYNGiRemt5DC99dZb0aB79+7prQQAAA6JwB0AAMqJ5PkwmzdvTm8lh2Pnzp3JHfr9+/dPbzEAAHBIBO4AAFBOJE9iadKkSXorORwPPvjg8uXLQwh169a95JJL0l0OAAAcAoE7AACUB1988UVyY3ifPn3SW0zKxowZ87Of/Swa33333RUrVkxvPQAAcEgE7gAAUOa99957ffv23b59ewihUaNGF198cborOjSJRGLmzJlDhgy54oor8vPzQwi9evX6wQ9+kO66AADg0FRIdwEAAMDBzZgx44D71rdt27Zw4cKvv/46+jIrK+sPf/hDpUqVSre6Q3DhhRfm5uYmv0wkEps2bVq8ePHq1auTF0888cTXX389JycnHQUCAEDqBO4AAFAGrF+//p133il6TpUqVZ577rlzzjmndEpKzcSJE4u4m5OT84Mf/OC+++5LPgAWAADKEIE7AACUbTVr1mzWrFnfvn1/+MMfNmjQYJ+711xzzf5b4wcNGtSuXbsQQq1atQ74mn369Im2yR999NElUPI3VKhQoV69esccc8y555773e9+97jjjivpdwQAgBKSlUgk0l0DAABQHkyePHnp0qUhhA4dOrRp0ybd5QAAQGkTuAMAAAAAQAyy010AAAAAAACUBwJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIwf8HUOoHNKnhlKkAAAAASUVORK5CYII=" title="plot of chunk unnamed-chunk-11" alt="plot of chunk unnamed-chunk-11" width="750px" style="display: block; margin: auto;" /></p>\n-\n-<p>The plot shows where the anomalies occured the most. The x-axis scale is complementary to the one of the signal acquisition plot. </p>\n-\n-<h5>More info on the anomalies detected in the dynamic range check:</h5>\n-\n-<p>for each channel, The table shows the number of events that did not pass the dynamic range check:</p>\n-\n-<pre><code>##              lower_range upper_range\n-## FSC-H                  0         217\n-## SSC-H                  0        4990\n-## FL1-H                  0           0\n-## FL2-H                  0           0\n-## FL3-H                  0           0\n-## FL4-H                  0           0\n-## total_SUM              0        5207\n-## total_UNIQUE           0        5022\n-</code></pre>\n-\n-</body>\n-\n-</html>\n'
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/test-data/std/alldata.fcs
b
Binary file flowai/test-data/std/alldata.fcs has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/test-data/std/hqdata.fcs
b
Binary file flowai/test-data/std/hqdata.fcs has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/test-data/std/lqdata.fcs
b
Binary file flowai/test-data/std/lqdata.fcs has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/test-data/withsfsc/QCreport_sfsc.html
--- a/flowai/test-data/withsfsc/QCreport_sfsc.html Mon Feb 27 12:55:30 2017 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
b'@@ -1,236 +0,0 @@\n-<!DOCTYPE html>\n-<html>\n-<head>\n-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>\n-\n-<title>FCS file information</title>\n-\n-<script type="text/javascript">\n-window.onload = function() {\n-  var imgs = document.getElementsByTagName(\'img\'), i, img;\n-  for (i = 0; i < imgs.length; i++) {\n-    img = imgs[i];\n-    // center an image if it is the only element of its parent\n-    if (img.parentElement.childElementCount === 1)\n-      img.parentElement.style.textAlign = \'center\';\n-  }\n-};\n-</script>\n-\n-\n-\n-\n-\n-<style type="text/css">\n-body, td {\n-   font-family: sans-serif;\n-   background-color: white;\n-   font-size: 13px;\n-}\n-\n-body {\n-  max-width: 800px;\n-  margin: auto;\n-  padding: 1em;\n-  line-height: 20px;\n-}\n-\n-tt, code, pre {\n-   font-family: \'DejaVu Sans Mono\', \'Droid Sans Mono\', \'Lucida Console\', Consolas, Monaco, monospace;\n-}\n-\n-h1 {\n-   font-size:2.2em;\n-}\n-\n-h2 {\n-   font-size:1.8em;\n-}\n-\n-h3 {\n-   font-size:1.4em;\n-}\n-\n-h4 {\n-   font-size:1.0em;\n-}\n-\n-h5 {\n-   font-size:0.9em;\n-}\n-\n-h6 {\n-   font-size:0.8em;\n-}\n-\n-a:visited {\n-   color: rgb(50%, 0%, 50%);\n-}\n-\n-pre, img {\n-  max-width: 100%;\n-}\n-pre {\n-  overflow-x: auto;\n-}\n-pre code {\n-   display: block; padding: 0.5em;\n-}\n-\n-code {\n-  font-size: 92%;\n-  border: 1px solid #ccc;\n-}\n-\n-code[class] {\n-  background-color: #F8F8F8;\n-}\n-\n-table, td, th {\n-  border: none;\n-}\n-\n-blockquote {\n-   color:#666666;\n-   margin:0;\n-   padding-left: 1em;\n-   border-left: 0.5em #EEE solid;\n-}\n-\n-hr {\n-   height: 0px;\n-   border-bottom: none;\n-   border-top-width: thin;\n-   border-top-style: dotted;\n-   border-top-color: #999999;\n-}\n-\n-@media print {\n-   * {\n-      background: transparent !important;\n-      color: black !important;\n-      filter:none !important;\n-      -ms-filter: none !important;\n-   }\n-\n-   body {\n-      font-size:12pt;\n-      max-width:100%;\n-   }\n-\n-   a, a:visited {\n-      text-decoration: underline;\n-   }\n-\n-   hr {\n-      visibility: hidden;\n-      page-break-before: always;\n-   }\n-\n-   pre, blockquote {\n-      padding-right: 1em;\n-      page-break-inside: avoid;\n-   }\n-\n-   tr, img {\n-      page-break-inside: avoid;\n-   }\n-\n-   img {\n-      max-width: 100% !important;\n-   }\n-\n-   @page :left {\n-      margin: 15mm 20mm 15mm 10mm;\n-   }\n-\n-   @page :right {\n-      margin: 15mm 10mm 15mm 20mm;\n-   }\n-\n-   p, h2, h3 {\n-      orphans: 3; widows: 3;\n-   }\n-\n-   h2, h3 {\n-      page-break-after: avoid;\n-   }\n-}\n-</style>\n-\n-\n-\n-</head>\n-\n-<body>\n-<h2>FCS file information</h2>\n-\n-<blockquote>\n-<p>Input file name: dataset_934<br/>\n-Number of events: 20000</p>\n-</blockquote>\n-\n-<h2>Quality control analysis</h2>\n-\n-<h3>Summary</h3>\n-\n-<blockquote>\n-<p>The anomalies were removed from:  Flow Rate, Flow Signal and Flow Margin<br/>\n-Anomalies detected in total: <strong>25.11</strong> %<br/>\n-Number of high quality events: 14978  </p>\n-</blockquote>\n-\n-<h3>Flow rate check</h3>\n-\n-<blockquote>\n-<p><strong>0</strong> % anomalies detected in the flow rate check.</p>\n-</blockquote>\n-\n-<p>It was not possible to analyze the flow rate since the time channel is missing. </p>\n-\n-<h3>Signals acquisition check</h3>\n-\n-<blockquote>\n-<p><strong>0</strong> % anomalies detected in the signal aquisition check. </p>\n-</blockquote>\n-\n-<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABXgAAAHgCAIAAACQE5JdAAAACXBIWXMAAB7CAAAewgFu0HU+AAAgAElEQVR4nOy9e5QjZZ3//36eqkpSne5Od/reE4EdYbg4HIHBFRhvKF5QERRFzoGZFRDX488bHjjrlzkisCoXXfHuKrrrwhyXRY+IIIoKCpwBhosgAoM63NOX9CWddLpTSaqe5/n9UUl1Op1OJ91JJz18XmfOnHSlUvnkU/XcPs/nwpRSIAiCIAiCIAiCIAiCqAe82QIQBEEQBEEQBEEQBHHgQIYGgiAIgiAIgiAIgiDqBhkaCIIgCIIgCIIgCIKoG2RoIAiCIAiCIAiCIAiibpChgSAIgiAIgiAIgiCIukGGBoIgCIIgCIIgCIIg6gYZGgiCIAiCIAiCIAiCqBtkaCAIgiAIgiAIgiAIom6QoYEgCIIgCIIgCIIgiLpBhgaCIAiCIAiCIAiCIOoGGRoIgiAIgiAIgiAIgqgbZGggCIIgCIIgCIIgCKJukKGBIAiCIAiCIAiCIIi6QYYGgiAIgiAIgiAIgiDqBhkaCIIgCIIgCIIgCIKoG3qzBdh4jIyMjI+PN+vbbdvWNI3zVrQQKaW814yxJkpSgVwup+s6KXDV5HI5wzBaUzxS4BppfQUqpWzbJgWuGlLgGnEV6PP5mi1IeUiBa6T1FSildByHFLhqpJRCCMM'..b'gI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAIHONGTMmq3DZ2dm1a9fu1KnTD3/4w7lz5x7wFbp27RpNLoVqBw4cGL3Xgw8+WPD6jh07ivhT5ObmNmnSpFevXvfff/+CBQtKoU4AACghAncAACirEonEhg0bZs+e/fjjj7dv3/6ee+5JJBLpLuqQ7dmzZ+nSpVOmTLnrrruOP/74m2++efPmzekuCgAAUlEh3QUAAAAHV6tWrY4dOxa8kkgk1q1bt3LlyjVr1kRf3nfffbm5uXfffXeaaiyWk08+uUKF//4zJPrMYMmSJevXrw8h7N279ze/+c2UKVPeeuutOnXqpK9MAABIhcAdAADKgC5duvzzn//c/3oikZg8efLw4cNnzpwZQrjvvvuGDBnSrFmz5IRrrrmmb9++pVfowYwbN65WrVr7XMzPz582bdqvfvWr//3f/w0hTJs2rV+/fhMnTszJyUlHjQAAkCJHygAAQBmWlZXVu3fvcePGHXXUUSGE3bt3v/TSSwUn3HjjjT//+c9//vOfp6nAYsnOzj7xxBNfeuml5557Ljs7O4Tw3nvv/fa3v013XQAAcGgE7gAAUOY1bNiwX79+0XjOnDkpvMKCBQv+9Kc/Pfjgg88888zkyZN37doVa4HFdeWVVyaPxBk5cuSOHTvSUgYAAKRG4A4AAOVBq1atosE+z03t1atXVlZWVlZWwYsDBw7MysqqX79+CGH16tUXXHBBy5Ytv/e97915553XXHNN796927Zt+/rrr5da8QXdcccdDRs2DCGsXbt27NixaakBAABSI3AHAIDy4LPPPosGzZs3L/6qFStWdOvW7Y033gghFDwwfeHChQMGDBg/fny8RRZHpUqVLr/88micrtAfAABSI3AHAIAyb+XKlePGjYvGl112WTFX7d27d/DgwYsXL77wwgsnTZq0adOmTZs2vfbaa9EzVxOJxNChQ0uq4iIln/I6derUtBQAAACpEbgDAEDZ9v777/fr12/VqlUhhFtuueX4448v5sI1a9ZMmDDhlltueeWVV3r16lWlSpXq1av379//rbfeqly5cghhwYIFa9asKcHSC9GxY8dosHjx4g0bNpR+AQAAkJoK6S4AAAA4uBkzZvTp06fglUQisX79+hUrVqxcuTKEkJOT86Mf/ej+++8/pJdt0KDByJEjs7O/sRGnRYsWZ511VnScy/z584844ojDLv/Q1KlTp1KlStETU9euXVurVq1SLgAAAFIjcAcAgDJg/fr177zzThETevTocdVVV+0TnR/UjTfeGG1m38dxxx0XDfLz8w/pBeNSs2bNKHBfv359WgoAAIAUOFIGAADKgylTprRt2/a22247pIi8ffv2B7xeoUKmbM3JyspKdwkAAFBcAncAACgDzjzzzMSBbN26ddasWSNGjMjNzc3Pz//lL385bNiw4r9s9HzUDLRp06ZoULt27fRWAgAAxSdwBwCAMqxKlSodO3a8995733jjjejK6NGjZ8+eXczl1atXL7HSUrd+/frt27dH47p166a3GAAAKD6BOwAAlAdnnXXWhRdeGI2ff/759BZzmGbNmhUNmjZtWrNmzfQWAwAAxSdwBwCAcqJnz57RYNGiRemt5DC99dZb0aB79+7prQQAAA6JwB0AAMqJ5PkwmzdvTm8lh2Pnzp3JHfr9+/dPbzEAAHBIBO4AAFBOJE9iadKkSXorORwPPvjg8uXLQwh169a95JJL0l0OAAAcAoE7AACUB1988UVyY3ifPn3SW0zKxowZ87Of/Swa33333RUrVkxvPQAAcEgE7gAAUOa99957ffv23b59ewihUaNGF198cborOjSJRGLmzJlDhgy54oor8vPzQwi9evX6wQ9+kO66AADg0FRIdwEAAMDBzZgx44D71rdt27Zw4cKvv/46+jIrK+sPf/hDpUqVSre6Q3DhhRfm5uYmv0wkEps2bVq8ePHq1auTF0888cTXX389JycnHQUCAEDqBO4AAFAGrF+//p133il6TpUqVZ577rlzzjmndEpKzcSJE4u4m5OT84Mf/OC+++5LPgAWAADKEIE7AACUbTVr1mzWrFnfvn1/+MMfNmjQYJ+711xzzf5b4wcNGtSuXbsQQq1atQ74mn369Im2yR999NElUPI3VKhQoV69esccc8y555773e9+97jjjivpdwQAgBKSlUgk0l0DAABQHkyePHnp0qUhhA4dOrRp0ybd5QAAQGkTuAMAAAAAQAyy010AAAAAAACUBwJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIwf8HUOoHNKnhlKkAAAAASUVORK5CYII=" title="plot of chunk unnamed-chunk-11" alt="plot of chunk unnamed-chunk-11" width="750px" style="display: block; margin: auto;" /></p>\n-\n-<p>The plot shows where the anomalies occured the most. The x-axis scale is complementary to the one of the signal acquisition plot. </p>\n-\n-<h5>More info on the anomalies detected in the dynamic range check:</h5>\n-\n-<p>for each channel, The table shows the number of events that did not pass the dynamic range check:</p>\n-\n-<pre><code>##              lower_range upper_range\n-## FSC-H                  0         217\n-## SSC-H                  0        4990\n-## FL1-H                  0           0\n-## FL2-H                  0           0\n-## FL3-H                  0           0\n-## FL4-H                  0           0\n-## total_SUM              0        5207\n-## total_UNIQUE           0        5022\n-</code></pre>\n-\n-</body>\n-\n-</html>\n'
b
diff -r 60aa5e56531a -r 34397a84faf1 flowai/test-data/withsfsc/hqdata_sfsc.fcs
b
Binary file flowai/test-data/withsfsc/hqdata_sfsc.fcs has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 static/images/flowtools/autoflowrate.png
b
Binary file static/images/flowtools/autoflowrate.png has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 static/images/flowtools/autosignal.png
b
Binary file static/images/flowtools/autosignal.png has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 static/images/flowtools/margins.png
b
Binary file static/images/flowtools/margins.png has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 test-data/input.fcs
b
Binary file test-data/input.fcs has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 test-data/nooutliers/QCreport_nooutliers.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/nooutliers/QCreport_nooutliers.html Tue Jun 23 18:34:02 2020 -0400
[
b'@@ -0,0 +1,240 @@\n+<!DOCTYPE html>\n+<html>\n+<head>\n+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>\n+\n+<title>FCS file information</title>\n+\n+<script type="text/javascript">\n+window.onload = function() {\n+  var imgs = document.getElementsByTagName(\'img\'), i, img;\n+  for (i = 0; i < imgs.length; i++) {\n+    img = imgs[i];\n+    // center an image if it is the only element of its parent\n+    if (img.parentElement.childElementCount === 1)\n+      img.parentElement.style.textAlign = \'center\';\n+  }\n+};\n+</script>\n+\n+\n+\n+\n+\n+<style type="text/css">\n+body, td {\n+   font-family: sans-serif;\n+   background-color: white;\n+   font-size: 13px;\n+}\n+\n+body {\n+  max-width: 800px;\n+  margin: auto;\n+  padding: 1em;\n+  line-height: 20px;\n+}\n+\n+tt, code, pre {\n+   font-family: \'DejaVu Sans Mono\', \'Droid Sans Mono\', \'Lucida Console\', Consolas, Monaco, monospace;\n+}\n+\n+h1 {\n+   font-size:2.2em;\n+}\n+\n+h2 {\n+   font-size:1.8em;\n+}\n+\n+h3 {\n+   font-size:1.4em;\n+}\n+\n+h4 {\n+   font-size:1.0em;\n+}\n+\n+h5 {\n+   font-size:0.9em;\n+}\n+\n+h6 {\n+   font-size:0.8em;\n+}\n+\n+a:visited {\n+   color: rgb(50%, 0%, 50%);\n+}\n+\n+pre, img {\n+  max-width: 100%;\n+}\n+pre {\n+  overflow-x: auto;\n+}\n+pre code {\n+   display: block; padding: 0.5em;\n+}\n+\n+code {\n+  font-size: 92%;\n+  border: 1px solid #ccc;\n+}\n+\n+code[class] {\n+  background-color: #F8F8F8;\n+}\n+\n+table, td, th {\n+  border: none;\n+}\n+\n+blockquote {\n+   color:#666666;\n+   margin:0;\n+   padding-left: 1em;\n+   border-left: 0.5em #EEE solid;\n+}\n+\n+hr {\n+   height: 0px;\n+   border-bottom: none;\n+   border-top-width: thin;\n+   border-top-style: dotted;\n+   border-top-color: #999999;\n+}\n+\n+@media print {\n+   * {\n+      background: transparent !important;\n+      color: black !important;\n+      filter:none !important;\n+      -ms-filter: none !important;\n+   }\n+\n+   body {\n+      font-size:12pt;\n+      max-width:100%;\n+   }\n+\n+   a, a:visited {\n+      text-decoration: underline;\n+   }\n+\n+   hr {\n+      visibility: hidden;\n+      page-break-before: always;\n+   }\n+\n+   pre, blockquote {\n+      padding-right: 1em;\n+      page-break-inside: avoid;\n+   }\n+\n+   tr, img {\n+      page-break-inside: avoid;\n+   }\n+\n+   img {\n+      max-width: 100% !important;\n+   }\n+\n+   @page :left {\n+      margin: 15mm 20mm 15mm 10mm;\n+   }\n+\n+   @page :right {\n+      margin: 15mm 10mm 15mm 20mm;\n+   }\n+\n+   p, h2, h3 {\n+      orphans: 3; widows: 3;\n+   }\n+\n+   h2, h3 {\n+      page-break-after: avoid;\n+   }\n+}\n+</style>\n+\n+\n+\n+</head>\n+\n+<body>\n+<h2>FCS file information</h2>\n+\n+<blockquote>\n+<p>Input file name: dataset_934<br/>\n+Number of events: 20000</p>\n+</blockquote>\n+\n+<h2>Quality control analysis</h2>\n+\n+<h3>Summary</h3>\n+\n+<blockquote>\n+<p>The anomalies were removed from:  Flow Rate, Flow Signal and Flow Margin<br/>\n+Anomalies detected in total: <strong>25.11</strong> %<br/>\n+Number of high quality events: 14978  </p>\n+</blockquote>\n+\n+<h3>Flow rate check</h3>\n+\n+<blockquote>\n+<p><strong>0</strong> % anomalies detected in the flow rate check.</p>\n+</blockquote>\n+\n+<p>It was not possible to analyze the flow rate since the time channel is missing. </p>\n+\n+<h3>Signals acquisition check</h3>\n+\n+<blockquote>\n+<p><strong>0</strong> % anomalies detected in the signal aquisition check. </p>\n+</blockquote>\n+\n+<p>Outliers were removed before the changepoint analysis.0% of anomalies were detected as outliers and 0 of anomalies were detected in the changepoint analysis. </p>\n+\n+<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABXgAAAHgCAIAAACQE5JdAAAACXBIWXMAAB7CAAAewgFu0HU+AAAgAElEQVR4nOy9e5QjZZ3//36eqkpSne5Od/reE4EdYbg4HIHBFRhvKF5QERRFzoGZFRDX488bHjjrlzkisCoXXfHuKrrrwhyXRY+IIIoKCpwBhosgAoM63NOX9CWddLpTSaqe5/n9UUl1Op1OJ91JJz18XmfOnHSlUvnkU/XcPs/nwpRSIAiCIAiCIAiCIAiCqAe82QIQBEEQBEEQBEEQBHHgQIYGgiAIgiAIgiAIgiDqBhkaCIIgCIIgCIIgCIKoG2RoIAiCIAiCIAiCIAiibpChgSAIgiAIgiAIgiCIukGGBoIgCIIgCIIgCIIg6gYZGgiCIAiCIAiCIAiCqBtkaCAIgiAIgiAIgiAIom6QoYEgCIIgCIIgCIIgiLpBhgaCIAiCIAiCIAiCIOoGGRoIgiAIgiAIgiAIgqgbZGggCIIgCIIgCIIgCKJukKGBIAiCIAiCIAiCII'..b'gI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAIHONGTMmq3DZ2dm1a9fu1KnTD3/4w7lz5x7wFbp27RpNLoVqBw4cGL3Xgw8+WPD6jh07ivhT5ObmNmnSpFevXvfff/+CBQtKoU4AACghAncAACirEonEhg0bZs+e/fjjj7dv3/6ee+5JJBLpLuqQ7dmzZ+nSpVOmTLnrrruOP/74m2++efPmzekuCgAAUlEh3QUAAAAHV6tWrY4dOxa8kkgk1q1bt3LlyjVr1kRf3nfffbm5uXfffXeaaiyWk08+uUKF//4zJPrMYMmSJevXrw8h7N279ze/+c2UKVPeeuutOnXqpK9MAABIhcAdAADKgC5duvzzn//c/3oikZg8efLw4cNnzpwZQrjvvvuGDBnSrFmz5IRrrrmmb9++pVfowYwbN65WrVr7XMzPz582bdqvfvWr//3f/w0hTJs2rV+/fhMnTszJyUlHjQAAkCJHygAAQBmWlZXVu3fvcePGHXXUUSGE3bt3v/TSSwUn3HjjjT//+c9//vOfp6nAYsnOzj7xxBNfeuml5557Ljs7O4Tw3nvv/fa3v013XQAAcGgE7gAAUOY1bNiwX79+0XjOnDkpvMKCBQv+9Kc/Pfjgg88888zkyZN37doVa4HFdeWVVyaPxBk5cuSOHTvSUgYAAKRG4A4AAOVBq1atosE+z03t1atXVlZWVlZWwYsDBw7MysqqX79+CGH16tUXXHBBy5Ytv/e97915553XXHNN796927Zt+/rrr5da8QXdcccdDRs2DCGsXbt27NixaakBAABSI3AHAIDy4LPPPosGzZs3L/6qFStWdOvW7Y033gghFDwwfeHChQMGDBg/fny8RRZHpUqVLr/88micrtAfAABSI3AHAIAyb+XKlePGjYvGl112WTFX7d27d/DgwYsXL77wwgsnTZq0adOmTZs2vfbaa9EzVxOJxNChQ0uq4iIln/I6derUtBQAAACpEbgDAEDZ9v777/fr12/VqlUhhFtuueX4448v5sI1a9ZMmDDhlltueeWVV3r16lWlSpXq1av379//rbfeqly5cghhwYIFa9asKcHSC9GxY8dosHjx4g0bNpR+AQAAkJoK6S4AAAA4uBkzZvTp06fglUQisX79+hUrVqxcuTKEkJOT86Mf/ej+++8/pJdt0KDByJEjs7O/sRGnRYsWZ511VnScy/z584844ojDLv/Q1KlTp1KlStETU9euXVurVq1SLgAAAFIjcAcAgDJg/fr177zzThETevTocdVVV+0TnR/UjTfeGG1m38dxxx0XDfLz8w/pBeNSs2bNKHBfv359WgoAAIAUOFIGAADKgylTprRt2/a22247pIi8ffv2B7xeoUKmbM3JyspKdwkAAFBcAncAACgDzjzzzMSBbN26ddasWSNGjMjNzc3Pz//lL385bNiw4r9s9HzUDLRp06ZoULt27fRWAgAAxSdwBwCAMqxKlSodO3a8995733jjjejK6NGjZ8+eXczl1atXL7HSUrd+/frt27dH47p166a3GAAAKD6BOwAAlAdnnXXWhRdeGI2ff/759BZzmGbNmhUNmjZtWrNmzfQWAwAAxSdwBwCAcqJnz57RYNGiRemt5DC99dZb0aB79+7prQQAAA6JwB0AAMqJ5PkwmzdvTm8lh2Pnzp3JHfr9+/dPbzEAAHBIBO4AAFBOJE9iadKkSXorORwPPvjg8uXLQwh169a95JJL0l0OAAAcAoE7AACUB1988UVyY3ifPn3SW0zKxowZ87Of/Swa33333RUrVkxvPQAAcEgE7gAAUOa99957ffv23b59ewihUaNGF198cborOjSJRGLmzJlDhgy54oor8vPzQwi9evX6wQ9+kO66AADg0FRIdwEAAMDBzZgx44D71rdt27Zw4cKvv/46+jIrK+sPf/hDpUqVSre6Q3DhhRfm5uYmv0wkEps2bVq8ePHq1auTF0888cTXX389JycnHQUCAEDqBO4AAFAGrF+//p133il6TpUqVZ577rlzzjmndEpKzcSJE4u4m5OT84Mf/OC+++5LPgAWAADKEIE7AACUbTVr1mzWrFnfvn1/+MMfNmjQYJ+711xzzf5b4wcNGtSuXbsQQq1atQ74mn369Im2yR999NElUPI3VKhQoV69esccc8y555773e9+97jjjivpdwQAgBKSlUgk0l0DAABQHkyePHnp0qUhhA4dOrRp0ybd5QAAQGkTuAMAAAAAQAyy010AAAAAAACUBwJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIwf8HUOoHNKnhlKkAAAAASUVORK5CYII=" title="plot of chunk unnamed-chunk-11" alt="plot of chunk unnamed-chunk-11" width="750px" style="display: block; margin: auto;" /></p>\n+\n+<p>The plot shows where the anomalies occured the most. The x-axis scale is complementary to the one of the signal acquisition plot. </p>\n+\n+<h5>More info on the anomalies detected in the dynamic range check:</h5>\n+\n+<p>for each channel, The table shows the number of events that did not pass the dynamic range check:</p>\n+\n+<pre><code>##              lower_range upper_range\n+## FSC-H                  0         217\n+## SSC-H                  0        4990\n+## FL1-H                  0           0\n+## FL2-H                  0           0\n+## FL3-H                  0           0\n+## FL4-H                  0           0\n+## total_SUM              0        5207\n+## total_UNIQUE           0        5022\n+</code></pre>\n+\n+</body>\n+\n+</html>\n'
b
diff -r 60aa5e56531a -r 34397a84faf1 test-data/nooutliers/hqdata_nooutliers.fcs
b
Binary file test-data/nooutliers/hqdata_nooutliers.fcs has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 test-data/std/QCreport.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/std/QCreport.html Tue Jun 23 18:34:02 2020 -0400
[
b'@@ -0,0 +1,238 @@\n+<!DOCTYPE html>\n+<html>\n+<head>\n+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>\n+\n+<title>FCS file information</title>\n+\n+<script type="text/javascript">\n+window.onload = function() {\n+  var imgs = document.getElementsByTagName(\'img\'), i, img;\n+  for (i = 0; i < imgs.length; i++) {\n+    img = imgs[i];\n+    // center an image if it is the only element of its parent\n+    if (img.parentElement.childElementCount === 1)\n+      img.parentElement.style.textAlign = \'center\';\n+  }\n+};\n+</script>\n+\n+\n+\n+\n+\n+<style type="text/css">\n+body, td {\n+   font-family: sans-serif;\n+   background-color: white;\n+   font-size: 13px;\n+}\n+\n+body {\n+  max-width: 800px;\n+  margin: auto;\n+  padding: 1em;\n+  line-height: 20px;\n+}\n+\n+tt, code, pre {\n+   font-family: \'DejaVu Sans Mono\', \'Droid Sans Mono\', \'Lucida Console\', Consolas, Monaco, monospace;\n+}\n+\n+h1 {\n+   font-size:2.2em;\n+}\n+\n+h2 {\n+   font-size:1.8em;\n+}\n+\n+h3 {\n+   font-size:1.4em;\n+}\n+\n+h4 {\n+   font-size:1.0em;\n+}\n+\n+h5 {\n+   font-size:0.9em;\n+}\n+\n+h6 {\n+   font-size:0.8em;\n+}\n+\n+a:visited {\n+   color: rgb(50%, 0%, 50%);\n+}\n+\n+pre, img {\n+  max-width: 100%;\n+}\n+pre {\n+  overflow-x: auto;\n+}\n+pre code {\n+   display: block; padding: 0.5em;\n+}\n+\n+code {\n+  font-size: 92%;\n+  border: 1px solid #ccc;\n+}\n+\n+code[class] {\n+  background-color: #F8F8F8;\n+}\n+\n+table, td, th {\n+  border: none;\n+}\n+\n+blockquote {\n+   color:#666666;\n+   margin:0;\n+   padding-left: 1em;\n+   border-left: 0.5em #EEE solid;\n+}\n+\n+hr {\n+   height: 0px;\n+   border-bottom: none;\n+   border-top-width: thin;\n+   border-top-style: dotted;\n+   border-top-color: #999999;\n+}\n+\n+@media print {\n+   * {\n+      background: transparent !important;\n+      color: black !important;\n+      filter:none !important;\n+      -ms-filter: none !important;\n+   }\n+\n+   body {\n+      font-size:12pt;\n+      max-width:100%;\n+   }\n+\n+   a, a:visited {\n+      text-decoration: underline;\n+   }\n+\n+   hr {\n+      visibility: hidden;\n+      page-break-before: always;\n+   }\n+\n+   pre, blockquote {\n+      padding-right: 1em;\n+      page-break-inside: avoid;\n+   }\n+\n+   tr, img {\n+      page-break-inside: avoid;\n+   }\n+\n+   img {\n+      max-width: 100% !important;\n+   }\n+\n+   @page :left {\n+      margin: 15mm 20mm 15mm 10mm;\n+   }\n+\n+   @page :right {\n+      margin: 15mm 10mm 15mm 20mm;\n+   }\n+\n+   p, h2, h3 {\n+      orphans: 3; widows: 3;\n+   }\n+\n+   h2, h3 {\n+      page-break-after: avoid;\n+   }\n+}\n+</style>\n+\n+\n+\n+</head>\n+\n+<body>\n+<h2>FCS file information</h2>\n+\n+<blockquote>\n+<p>Input file name: dataset_934<br/>\n+Number of events: 20000</p>\n+</blockquote>\n+\n+<h2>Quality control analysis</h2>\n+\n+<h3>Summary</h3>\n+\n+<blockquote>\n+<p>The anomalies were removed from:  Flow Rate, Flow Signal and Flow Margin<br/>\n+Anomalies detected in total: <strong>25.11</strong> %<br/>\n+Number of high quality events: 14978  </p>\n+</blockquote>\n+\n+<h3>Flow rate check</h3>\n+\n+<blockquote>\n+<p><strong>0</strong> % anomalies detected in the flow rate check.</p>\n+</blockquote>\n+\n+<p>It was not possible to analyze the flow rate since the time channel is missing. </p>\n+\n+<h3>Signals acquisition check</h3>\n+\n+<blockquote>\n+<p><strong>0</strong> % anomalies detected in the signal aquisition check. </p>\n+</blockquote>\n+\n+<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABXgAAAHgCAIAAACQE5JdAAAACXBIWXMAAB7CAAAewgFu0HU+AAAgAElEQVR4nOy9e5QjZZ3//36eqkpSne5Od/reE4EdYbg4HIHBFRhvKF5QERRFzoGZFRDX488bHjjrlzkisCoXXfHuKrrrwhyXRY+IIIoKCpwBhosgAoM63NOX9CWddLpTSaqe5/n9UUl1Op1OJ91JJz18XmfOnHSlUvnkU/XcPs/nwpRSIAiCIAiCIAiCIAiCqAe82QIQBEEQBEEQBEEQBHHgQIYGgiAIgiAIgiAIgiDqBhkaCIIgCIIgCIIgCIKoG2RoIAiCIAiCIAiCIAiibpChgSAIgiAIgiAIgiCIukGGBoIgCIIgCIIgCIIg6gYZGgiCIAiCIAiCIAiCqBtkaCAIgiAIgiAIgiAIom6QoYEgCIIgCIIgCIIgiLpBhgaCIAiCIAiCIAiCIOoGGRoIgiAIgiAIgiAIgqgbZGggCIIgCIIgCIIgCKJukKGBIAiCIAiCIAiCIIi6QYYGgiAIgiAIgiAIgiDqBhkaCIIgCIIgCIIgCIKoG3qzBdh4jIyMjI+PN+vbbdvWNI3zVrQQKaW814yxJkpSgVwup+s6KXDV5HI5wzBaUzxS4BppfQUqpWzbJgWuGlLgGnEV6PP5mi1IeUiBa6T1FSildByHFLhqpJRCCMM'..b'gI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAIHONGTMmq3DZ2dm1a9fu1KnTD3/4w7lz5x7wFbp27RpNLoVqBw4cGL3Xgw8+WPD6jh07ivhT5ObmNmnSpFevXvfff/+CBQtKoU4AACghAncAACirEonEhg0bZs+e/fjjj7dv3/6ee+5JJBLpLuqQ7dmzZ+nSpVOmTLnrrruOP/74m2++efPmzekuCgAAUlEh3QUAAAAHV6tWrY4dOxa8kkgk1q1bt3LlyjVr1kRf3nfffbm5uXfffXeaaiyWk08+uUKF//4zJPrMYMmSJevXrw8h7N279ze/+c2UKVPeeuutOnXqpK9MAABIhcAdAADKgC5duvzzn//c/3oikZg8efLw4cNnzpwZQrjvvvuGDBnSrFmz5IRrrrmmb9++pVfowYwbN65WrVr7XMzPz582bdqvfvWr//3f/w0hTJs2rV+/fhMnTszJyUlHjQAAkCJHygAAQBmWlZXVu3fvcePGHXXUUSGE3bt3v/TSSwUn3HjjjT//+c9//vOfp6nAYsnOzj7xxBNfeuml5557Ljs7O4Tw3nvv/fa3v013XQAAcGgE7gAAUOY1bNiwX79+0XjOnDkpvMKCBQv+9Kc/Pfjgg88888zkyZN37doVa4HFdeWVVyaPxBk5cuSOHTvSUgYAAKRG4A4AAOVBq1atosE+z03t1atXVlZWVlZWwYsDBw7MysqqX79+CGH16tUXXHBBy5Ytv/e97915553XXHNN796927Zt+/rrr5da8QXdcccdDRs2DCGsXbt27NixaakBAABSI3AHAIDy4LPPPosGzZs3L/6qFStWdOvW7Y033gghFDwwfeHChQMGDBg/fny8RRZHpUqVLr/88micrtAfAABSI3AHAIAyb+XKlePGjYvGl112WTFX7d27d/DgwYsXL77wwgsnTZq0adOmTZs2vfbaa9EzVxOJxNChQ0uq4iIln/I6derUtBQAAACpEbgDAEDZ9v777/fr12/VqlUhhFtuueX4448v5sI1a9ZMmDDhlltueeWVV3r16lWlSpXq1av379//rbfeqly5cghhwYIFa9asKcHSC9GxY8dosHjx4g0bNpR+AQAAkJoK6S4AAAA4uBkzZvTp06fglUQisX79+hUrVqxcuTKEkJOT86Mf/ej+++8/pJdt0KDByJEjs7O/sRGnRYsWZ511VnScy/z584844ojDLv/Q1KlTp1KlStETU9euXVurVq1SLgAAAFIjcAcAgDJg/fr177zzThETevTocdVVV+0TnR/UjTfeGG1m38dxxx0XDfLz8w/pBeNSs2bNKHBfv359WgoAAIAUOFIGAADKgylTprRt2/a22247pIi8ffv2B7xeoUKmbM3JyspKdwkAAFBcAncAACgDzjzzzMSBbN26ddasWSNGjMjNzc3Pz//lL385bNiw4r9s9HzUDLRp06ZoULt27fRWAgAAxSdwBwCAMqxKlSodO3a8995733jjjejK6NGjZ8+eXczl1atXL7HSUrd+/frt27dH47p166a3GAAAKD6BOwAAlAdnnXXWhRdeGI2ff/759BZzmGbNmhUNmjZtWrNmzfQWAwAAxSdwBwCAcqJnz57RYNGiRemt5DC99dZb0aB79+7prQQAAA6JwB0AAMqJ5PkwmzdvTm8lh2Pnzp3JHfr9+/dPbzEAAHBIBO4AAFBOJE9iadKkSXorORwPPvjg8uXLQwh169a95JJL0l0OAAAcAoE7AACUB1988UVyY3ifPn3SW0zKxowZ87Of/Swa33333RUrVkxvPQAAcEgE7gAAUOa99957ffv23b59ewihUaNGF198cborOjSJRGLmzJlDhgy54oor8vPzQwi9evX6wQ9+kO66AADg0FRIdwEAAMDBzZgx44D71rdt27Zw4cKvv/46+jIrK+sPf/hDpUqVSre6Q3DhhRfm5uYmv0wkEps2bVq8ePHq1auTF0888cTXX389JycnHQUCAEDqBO4AAFAGrF+//p133il6TpUqVZ577rlzzjmndEpKzcSJE4u4m5OT84Mf/OC+++5LPgAWAADKEIE7AACUbTVr1mzWrFnfvn1/+MMfNmjQYJ+711xzzf5b4wcNGtSuXbsQQq1atQ74mn369Im2yR999NElUPI3VKhQoV69esccc8y555773e9+97jjjivpdwQAgBKSlUgk0l0DAABQHkyePHnp0qUhhA4dOrRp0ybd5QAAQGkTuAMAAAAAQAyy010AAAAAAACUBwJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIwf8HUOoHNKnhlKkAAAAASUVORK5CYII=" title="plot of chunk unnamed-chunk-11" alt="plot of chunk unnamed-chunk-11" width="750px" style="display: block; margin: auto;" /></p>\n+\n+<p>The plot shows where the anomalies occured the most. The x-axis scale is complementary to the one of the signal acquisition plot. </p>\n+\n+<h5>More info on the anomalies detected in the dynamic range check:</h5>\n+\n+<p>for each channel, The table shows the number of events that did not pass the dynamic range check:</p>\n+\n+<pre><code>##              lower_range upper_range\n+## FSC-H                  0         217\n+## SSC-H                  0        4990\n+## FL1-H                  0           0\n+## FL2-H                  0           0\n+## FL3-H                  0           0\n+## FL4-H                  0           0\n+## total_SUM              0        5207\n+## total_UNIQUE           0        5022\n+</code></pre>\n+\n+</body>\n+\n+</html>\n'
b
diff -r 60aa5e56531a -r 34397a84faf1 test-data/std/alldata.fcs
b
Binary file test-data/std/alldata.fcs has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 test-data/std/hqdata.fcs
b
Binary file test-data/std/hqdata.fcs has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 test-data/std/lqdata.fcs
b
Binary file test-data/std/lqdata.fcs has changed
b
diff -r 60aa5e56531a -r 34397a84faf1 test-data/withsfsc/QCreport_sfsc.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/withsfsc/QCreport_sfsc.html Tue Jun 23 18:34:02 2020 -0400
[
b'@@ -0,0 +1,236 @@\n+<!DOCTYPE html>\n+<html>\n+<head>\n+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>\n+\n+<title>FCS file information</title>\n+\n+<script type="text/javascript">\n+window.onload = function() {\n+  var imgs = document.getElementsByTagName(\'img\'), i, img;\n+  for (i = 0; i < imgs.length; i++) {\n+    img = imgs[i];\n+    // center an image if it is the only element of its parent\n+    if (img.parentElement.childElementCount === 1)\n+      img.parentElement.style.textAlign = \'center\';\n+  }\n+};\n+</script>\n+\n+\n+\n+\n+\n+<style type="text/css">\n+body, td {\n+   font-family: sans-serif;\n+   background-color: white;\n+   font-size: 13px;\n+}\n+\n+body {\n+  max-width: 800px;\n+  margin: auto;\n+  padding: 1em;\n+  line-height: 20px;\n+}\n+\n+tt, code, pre {\n+   font-family: \'DejaVu Sans Mono\', \'Droid Sans Mono\', \'Lucida Console\', Consolas, Monaco, monospace;\n+}\n+\n+h1 {\n+   font-size:2.2em;\n+}\n+\n+h2 {\n+   font-size:1.8em;\n+}\n+\n+h3 {\n+   font-size:1.4em;\n+}\n+\n+h4 {\n+   font-size:1.0em;\n+}\n+\n+h5 {\n+   font-size:0.9em;\n+}\n+\n+h6 {\n+   font-size:0.8em;\n+}\n+\n+a:visited {\n+   color: rgb(50%, 0%, 50%);\n+}\n+\n+pre, img {\n+  max-width: 100%;\n+}\n+pre {\n+  overflow-x: auto;\n+}\n+pre code {\n+   display: block; padding: 0.5em;\n+}\n+\n+code {\n+  font-size: 92%;\n+  border: 1px solid #ccc;\n+}\n+\n+code[class] {\n+  background-color: #F8F8F8;\n+}\n+\n+table, td, th {\n+  border: none;\n+}\n+\n+blockquote {\n+   color:#666666;\n+   margin:0;\n+   padding-left: 1em;\n+   border-left: 0.5em #EEE solid;\n+}\n+\n+hr {\n+   height: 0px;\n+   border-bottom: none;\n+   border-top-width: thin;\n+   border-top-style: dotted;\n+   border-top-color: #999999;\n+}\n+\n+@media print {\n+   * {\n+      background: transparent !important;\n+      color: black !important;\n+      filter:none !important;\n+      -ms-filter: none !important;\n+   }\n+\n+   body {\n+      font-size:12pt;\n+      max-width:100%;\n+   }\n+\n+   a, a:visited {\n+      text-decoration: underline;\n+   }\n+\n+   hr {\n+      visibility: hidden;\n+      page-break-before: always;\n+   }\n+\n+   pre, blockquote {\n+      padding-right: 1em;\n+      page-break-inside: avoid;\n+   }\n+\n+   tr, img {\n+      page-break-inside: avoid;\n+   }\n+\n+   img {\n+      max-width: 100% !important;\n+   }\n+\n+   @page :left {\n+      margin: 15mm 20mm 15mm 10mm;\n+   }\n+\n+   @page :right {\n+      margin: 15mm 10mm 15mm 20mm;\n+   }\n+\n+   p, h2, h3 {\n+      orphans: 3; widows: 3;\n+   }\n+\n+   h2, h3 {\n+      page-break-after: avoid;\n+   }\n+}\n+</style>\n+\n+\n+\n+</head>\n+\n+<body>\n+<h2>FCS file information</h2>\n+\n+<blockquote>\n+<p>Input file name: dataset_934<br/>\n+Number of events: 20000</p>\n+</blockquote>\n+\n+<h2>Quality control analysis</h2>\n+\n+<h3>Summary</h3>\n+\n+<blockquote>\n+<p>The anomalies were removed from:  Flow Rate, Flow Signal and Flow Margin<br/>\n+Anomalies detected in total: <strong>25.11</strong> %<br/>\n+Number of high quality events: 14978  </p>\n+</blockquote>\n+\n+<h3>Flow rate check</h3>\n+\n+<blockquote>\n+<p><strong>0</strong> % anomalies detected in the flow rate check.</p>\n+</blockquote>\n+\n+<p>It was not possible to analyze the flow rate since the time channel is missing. </p>\n+\n+<h3>Signals acquisition check</h3>\n+\n+<blockquote>\n+<p><strong>0</strong> % anomalies detected in the signal aquisition check. </p>\n+</blockquote>\n+\n+<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABXgAAAHgCAIAAACQE5JdAAAACXBIWXMAAB7CAAAewgFu0HU+AAAgAElEQVR4nOy9e5QjZZ3//36eqkpSne5Od/reE4EdYbg4HIHBFRhvKF5QERRFzoGZFRDX488bHjjrlzkisCoXXfHuKrrrwhyXRY+IIIoKCpwBhosgAoM63NOX9CWddLpTSaqe5/n9UUl1Op1OJ91JJz18XmfOnHSlUvnkU/XcPs/nwpRSIAiCIAiCIAiCIAiCqAe82QIQBEEQBEEQBEEQBHHgQIYGgiAIgiAIgiAIgiDqBhkaCIIgCIIgCIIgCIKoG2RoIAiCIAiCIAiCIAiibpChgSAIgiAIgiAIgiCIukGGBoIgCIIgCIIgCIIg6gYZGgiCIAiCIAiCIAiCqBtkaCAIgiAIgiAIgiAIom6QoYEgCIIgCIIgCIIgiLpBhgaCIAiCIAiCIAiCIOoGGRoIgiAIgiAIgiAIgqgbZGggCIIgCIIgCIIgCKJukKGBIAiCIAiCIAiCIIi6QYYGgiAIgiAIgiAIgiDqBhkaCIIgCIIgCIIgCIKoG3qzBdh4jIyMjI+PN+vbbdvWNI3zVrQQKaW814yxJkpSgVwup+s6KXDV5HI5wzBaUzxS4BppfQUqpWzbJgWuGlLgGnEV6PP5mi1IeUiBa6T1FSildByHFLhqpJRCCMM'..b'gI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAIHONGTMmq3DZ2dm1a9fu1KnTD3/4w7lz5x7wFbp27RpNLoVqBw4cGL3Xgw8+WPD6jh07ivhT5ObmNmnSpFevXvfff/+CBQtKoU4AACghAncAACirEonEhg0bZs+e/fjjj7dv3/6ee+5JJBLpLuqQ7dmzZ+nSpVOmTLnrrruOP/74m2++efPmzekuCgAAUlEh3QUAAAAHV6tWrY4dOxa8kkgk1q1bt3LlyjVr1kRf3nfffbm5uXfffXeaaiyWk08+uUKF//4zJPrMYMmSJevXrw8h7N279ze/+c2UKVPeeuutOnXqpK9MAABIhcAdAADKgC5duvzzn//c/3oikZg8efLw4cNnzpwZQrjvvvuGDBnSrFmz5IRrrrmmb9++pVfowYwbN65WrVr7XMzPz582bdqvfvWr//3f/w0hTJs2rV+/fhMnTszJyUlHjQAAkCJHygAAQBmWlZXVu3fvcePGHXXUUSGE3bt3v/TSSwUn3HjjjT//+c9//vOfp6nAYsnOzj7xxBNfeuml5557Ljs7O4Tw3nvv/fa3v013XQAAcGgE7gAAUOY1bNiwX79+0XjOnDkpvMKCBQv+9Kc/Pfjgg88888zkyZN37doVa4HFdeWVVyaPxBk5cuSOHTvSUgYAAKRG4A4AAOVBq1atosE+z03t1atXVlZWVlZWwYsDBw7MysqqX79+CGH16tUXXHBBy5Ytv/e97915553XXHNN796927Zt+/rrr5da8QXdcccdDRs2DCGsXbt27NixaakBAABSI3AHAIDy4LPPPosGzZs3L/6qFStWdOvW7Y033gghFDwwfeHChQMGDBg/fny8RRZHpUqVLr/88micrtAfAABSI3AHAIAyb+XKlePGjYvGl112WTFX7d27d/DgwYsXL77wwgsnTZq0adOmTZs2vfbaa9EzVxOJxNChQ0uq4iIln/I6derUtBQAAACpEbgDAEDZ9v777/fr12/VqlUhhFtuueX4448v5sI1a9ZMmDDhlltueeWVV3r16lWlSpXq1av379//rbfeqly5cghhwYIFa9asKcHSC9GxY8dosHjx4g0bNpR+AQAAkJoK6S4AAAA4uBkzZvTp06fglUQisX79+hUrVqxcuTKEkJOT86Mf/ej+++8/pJdt0KDByJEjs7O/sRGnRYsWZ511VnScy/z584844ojDLv/Q1KlTp1KlStETU9euXVurVq1SLgAAAFIjcAcAgDJg/fr177zzThETevTocdVVV+0TnR/UjTfeGG1m38dxxx0XDfLz8w/pBeNSs2bNKHBfv359WgoAAIAUOFIGAADKgylTprRt2/a22247pIi8ffv2B7xeoUKmbM3JyspKdwkAAFBcAncAACgDzjzzzMSBbN26ddasWSNGjMjNzc3Pz//lL385bNiw4r9s9HzUDLRp06ZoULt27fRWAgAAxSdwBwCAMqxKlSodO3a8995733jjjejK6NGjZ8+eXczl1atXL7HSUrd+/frt27dH47p166a3GAAAKD6BOwAAlAdnnXXWhRdeGI2ff/759BZzmGbNmhUNmjZtWrNmzfQWAwAAxSdwBwCAcqJnz57RYNGiRemt5DC99dZb0aB79+7prQQAAA6JwB0AAMqJ5PkwmzdvTm8lh2Pnzp3JHfr9+/dPbzEAAHBIBO4AAFBOJE9iadKkSXorORwPPvjg8uXLQwh169a95JJL0l0OAAAcAoE7AACUB1988UVyY3ifPn3SW0zKxowZ87Of/Swa33333RUrVkxvPQAAcEgE7gAAUOa99957ffv23b59ewihUaNGF198cborOjSJRGLmzJlDhgy54oor8vPzQwi9evX6wQ9+kO66AADg0FRIdwEAAMDBzZgx44D71rdt27Zw4cKvv/46+jIrK+sPf/hDpUqVSre6Q3DhhRfm5uYmv0wkEps2bVq8ePHq1auTF0888cTXX389JycnHQUCAEDqBO4AAFAGrF+//p133il6TpUqVZ577rlzzjmndEpKzcSJE4u4m5OT84Mf/OC+++5LPgAWAADKEIE7AACUbTVr1mzWrFnfvn1/+MMfNmjQYJ+711xzzf5b4wcNGtSuXbsQQq1atQ74mn369Im2yR999NElUPI3VKhQoV69esccc8y555773e9+97jjjivpdwQAgBKSlUgk0l0DAABQHkyePHnp0qUhhA4dOrRp0ybd5QAAQGkTuAMAAAAAQAyy010AAAAAAACUBwJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIgcAdAAAAAABiIHAHAAAAAIAYCNwBAAAAACAGAncAAAAAAIiBwB0AAAAAAGIgcAcAAAAAgBgI3AEAAAAAIAYCdwAAAAAAiIHAHQAAAAAAYiBwBwAAAACAGAjcAQAAAAAgBgJ3AAAAAACIwf8HUOoHNKnhlKkAAAAASUVORK5CYII=" title="plot of chunk unnamed-chunk-11" alt="plot of chunk unnamed-chunk-11" width="750px" style="display: block; margin: auto;" /></p>\n+\n+<p>The plot shows where the anomalies occured the most. The x-axis scale is complementary to the one of the signal acquisition plot. </p>\n+\n+<h5>More info on the anomalies detected in the dynamic range check:</h5>\n+\n+<p>for each channel, The table shows the number of events that did not pass the dynamic range check:</p>\n+\n+<pre><code>##              lower_range upper_range\n+## FSC-H                  0         217\n+## SSC-H                  0        4990\n+## FL1-H                  0           0\n+## FL2-H                  0           0\n+## FL3-H                  0           0\n+## FL4-H                  0           0\n+## total_SUM              0        5207\n+## total_UNIQUE           0        5022\n+</code></pre>\n+\n+</body>\n+\n+</html>\n'
b
diff -r 60aa5e56531a -r 34397a84faf1 test-data/withsfsc/hqdata_sfsc.fcs
b
Binary file test-data/withsfsc/hqdata_sfsc.fcs has changed