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

Changeset 0:8283ff163ba6 (2017-02-27)
Next changeset 1:b5453d07f740 (2020-07-29)
Commit message:
Uploaded
added:
flow_overview/color_palette.py
flow_overview/flowstatlib.py
flow_overview/genFlowOverview.py
flow_overview/genFlowOverview.xml
flow_overview/getOntology.R
flow_overview/static/flowtools/css/flowCL.css
flow_overview/static/flowtools/css/parallelCoordinates.css
flow_overview/static/flowtools/js/boxplotsFlow.js
flow_overview/static/flowtools/js/color_palette.js
flow_overview/static/flowtools/js/overview.js
flow_overview/static/flowtools/js/parallelCoordinates.js
flow_overview/static/flowtools/js/profileCLs.js
flow_overview/static/flowtools/js/scatter2D.js
flow_overview/static/flowtools/js/scatter3D.js
flow_overview/static/flowtools/js/scatterMFI.js
flow_overview/static/images/flowtools/bpflock.png
flow_overview/static/images/flowtools/edit_summary.png
flow_overview/static/images/flowtools/overview.png
flow_overview/static/images/flowtools/pcflock.png
flow_overview/static/images/flowtools/profileCL_go.png
flow_overview/static/images/flowtools/scatter2D.png
flow_overview/static/images/flowtools/scatter3D.png
flow_overview/static/images/flowtools/summary.png
flow_overview/templates/genOverview.template
flow_overview/templates/genOverviewCL.template
flow_overview/test-data/input.flowclr
flow_overview/test-data/out1/boxplotData.json
flow_overview/test-data/out1/flow.mfi
flow_overview/test-data/out1/flow.mfi_pop
flow_overview/test-data/out1/flow.overview
flow_overview/test-data/out1/flow.sample
flow_overview/test-data/out1/m0_m0_90X90.png
flow_overview/test-data/out1/m0_m1_90X90.png
flow_overview/test-data/out1/m1_m0_90X90.png
flow_overview/test-data/out1/m1_m1_90X90.png
flow_overview/test-data/out1/out.html
flow_overview/test-data/out2/CLprofiles.txt
flow_overview/test-data/out2/boxplotData.json
flow_overview/test-data/out2/flow.mfi
flow_overview/test-data/out2/flow.mfi_pop
flow_overview/test-data/out2/flow.overview
flow_overview/test-data/out2/flow.sample
flow_overview/test-data/out2/flowcl_pop01.pdf
flow_overview/test-data/out2/flowcl_pop01.txt
flow_overview/test-data/out2/flowcl_pop04.pdf
flow_overview/test-data/out2/flowcl_pop04.txt
flow_overview/test-data/out2/flowcl_pop07.pdf
flow_overview/test-data/out2/flowcl_pop07.txt
flow_overview/test-data/out2/flowcl_pop13.pdf
flow_overview/test-data/out2/flowcl_pop13.txt
flow_overview/test-data/out2/flowcl_pop14.pdf
flow_overview/test-data/out2/flowcl_pop14.txt
flow_overview/test-data/out2/flowcl_pop15.pdf
flow_overview/test-data/out2/flowcl_pop15.txt
flow_overview/test-data/out2/flowcl_pop19.pdf
flow_overview/test-data/out2/flowcl_pop19.txt
flow_overview/test-data/out2/flowcl_pop20.pdf
flow_overview/test-data/out2/flowcl_pop20.txt
flow_overview/test-data/out2/flowcl_pop23.pdf
flow_overview/test-data/out2/flowcl_pop23.txt
flow_overview/test-data/out2/m0_m0_90X90.png
flow_overview/test-data/out2/m0_m1_90X90.png
flow_overview/test-data/out2/m1_m0_90X90.png
flow_overview/test-data/out2/m1_m1_90X90.png
flow_overview/test-data/out2/out.html
flow_overview/test-data/out2/scores.txt
flow_overview/test-data/profile.flowscore
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/color_palette.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/color_palette.py Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,48 @@
+######################################################################
+#                  Copyright (c) 2016 Northrop Grumman.
+#                          All rights reserved.
+######################################################################
+
+color_palette = [
+    '#000000',  # Black 0
+    '#FF0000',  # Red 1
+    '#FFFF00',  # Yellow 2
+    '#008000',  # Dark Green 3
+    '#0000FF',   # Blue 4
+    '#FFA500',  # Orange 5
+    '#8A2BE2',  # BlueViolet 6
+    '#808000',  # Olive 7
+    '#00FFFF',  # Cyan 8
+    '#FF00FF',  # Magenta 9
+    '#00FF00',  # Green 10
+    '#000080',  # Navy Blue 11
+    '#F08080',  # Light Coral 12
+    '#800080',  # Purple 13
+    '#F0E68C',  # Khaki 14
+    '#8FBC8F',  # Dark Sea Green 15
+    '#2F4F4F',  # Dark Slate Grey 16
+    '#008080',  # Teal 17
+    '#9932CC',  # Dark Orchid 18
+    '#FF7F50',  # Coral 19
+    '#FFD700',  # Gold 20
+    '#008B8B',  # Cyan 4 21
+    '#800000',  # Maroon 22
+    '#5F9EA0',  # Cadet Blue 23
+    '#FFC0CB',  # Pink 24
+    '#545454',  # Grey 25
+    '#7FFFD4',  # Aquamarine 26
+    '#ADD8E6',  # Light Blue 27
+    '#DB7093',  # Medium Violet Red 28
+    '#CD853F',  # Tan 3 29
+    '#4169E1',  # Royal Blue 30
+    '#708090',  # Slate Grey 31
+    '#4682B4',  # Steel Blue 32
+    '#D8BFD8',  # Thistle 33
+    '#F5DEB3',  # Wheat 34
+    '#9ACD32',  # Yellow Green 35
+    '#BDB76B',  # Dark Khaki 36
+    '#8B008B',  # Magenta 4 37
+    '#556B2F',  # Dark Olive Green 38
+    '#00CED1',  # Dark Turquoise 39
+    '#FF1493'   # Deep Pink
+]
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/flowstatlib.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/flowstatlib.py Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,100 @@
+######################################################################
+#                  Copyright (c) 2016 Northrop Grumman.
+#                          All rights reserved.
+######################################################################
+from __future__ import print_function
+import sys
+import pandas as pd
+from scipy.stats import gmean
+from argparse import ArgumentParser
+
+
+def gen_overview_stats(file_name):
+    flow_stats = {}
+    fcs = pd.read_table(file_name)
+    (events, columns) = fcs.shape
+    flow_stats['fcs'] = fcs
+    flow_stats['events'] = events
+    flow_stats['columns'] = columns - 1
+    flow_stats['data'] = fcs.iloc[:, :-1]
+    flow_stats['population'] = fcs.iloc[:, -1:].iloc[:, 0]
+    flow_stats['population_freq'] = flow_stats['population'].value_counts()
+    flow_stats['population_sample'] = (flow_stats['population_freq'] * (20000/float(events))).round(decimals=0)
+    flow_stats['population_freq_sort'] = flow_stats['population_freq'].sort_index()
+    flow_stats['population_per'] = (flow_stats['population'].value_counts(normalize=True) * 100).round(decimals=2)
+    flow_stats['population_per_sort'] = flow_stats['population_per'].sort_index()
+    flow_stats['population_all'] = pd.concat([flow_stats['population_freq_sort'], flow_stats['population_per_sort']], axis=1)
+    flow_stats['population_all'].columns = ['Count', 'Percentage']
+    flow_stats['min'] = flow_stats['data'].values.min()
+    flow_stats['max'] = flow_stats['data'].values.max()
+    flow_stats['markers'] = list(flow_stats['data'].columns)
+    flow_stats['mfi'] = fcs.groupby('Population').mean().round(decimals=2)
+    flow_stats['mfi_pop'] = pd.merge(flow_stats['mfi'], flow_stats['population_all'], left_index=True, right_index=True)
+    flow_stats['mfi_pop']['Population'] = flow_stats['mfi_pop'].index
+    flow_stats['gmfi'] = fcs.groupby('Population').agg(lambda x: gmean(list(x))).round(decimals=2)
+    flow_stats['gmfi_pop'] = pd.merge(flow_stats['gmfi'], flow_stats['population_all'], left_index=True, right_index=True)
+    flow_stats['gmfi_pop']['Population'] = flow_stats['gmfi_pop'].index
+    flow_stats['mdfi'] = fcs.groupby('Population').median().round(decimals=2)
+    flow_stats['mdfi_pop'] = pd.merge(flow_stats['mdfi'], flow_stats['population_all'], left_index=True, right_index=True)
+    flow_stats['mdfi_pop']['Population'] = flow_stats['mdfi_pop'].index
+
+    #
+    # If the number of events is less than 20000, then return
+    # the complete data set,
+    # Otherwise sample the data to only return 20000 events.
+    if events <= 20000:
+        flow_stats['sample'] = fcs
+    else:
+        fcs_np = fcs.values
+        sample_data = []
+        pop_found = {}
+        for i in range(0, events):
+            population_number = fcs_np[i][columns-1]
+            if population_number in pop_found:
+                if pop_found[population_number] < flow_stats['population_sample'][population_number]:
+                    pop_found[population_number] += 1
+                    sample_data.append(fcs_np[i])
+            else:
+                pop_found[population_number] = 1
+                sample_data.append(fcs_np[i])
+        flow_stats['sample'] = pd.DataFrame(sample_data)
+        flow_stats['sample'].columns = fcs.columns
+
+    flow_stats['sample_data'] = flow_stats['sample'].iloc[:, :-1]
+    flow_stats['sample_population'] = flow_stats['sample'].iloc[:, -1:].iloc[:, 0]
+
+    return flow_stats
+
+
+if __name__ == '__main__':
+    parser = ArgumentParser(
+             prog="flowstats",
+             description="Gets statistics on FLOCK run")
+
+    parser.add_argument(
+            '-i',
+            dest="input_file",
+            required=True,
+            help="File locations for flow clr file.")
+
+    parser.add_argument(
+            '-o',
+            dest="out_file",
+            required=True,
+            help="Path to the directory for the output file.")
+    args = parser.parse_args()
+
+    flow_stats = gen_overview_stats(args.input_file)
+    with open(args.out_file, "w") as outf:
+        outf.write("Events: ", flow_stats['events'])
+        outf.write("Min: ", flow_stats['min'])
+        outf.write("Max: ", flow_stats['max'])
+        outf.write("Columns: ", flow_stats['columns'])
+        outf.write("Markers: ", flow_stats['markers'])
+        outf.write("Population: ", flow_stats['population'])
+        outf.write("Population Freq: ", flow_stats['population_freq'])
+        outf.write("Population Sample: ", flow_stats['population_sample'])
+        outf.write("Population Per: ", flow_stats['population_per'])
+        outf.write("Sample Data contains ", len(flow_stats['sample']), " events")
+        outf.write("MIF_POP ", flow_stats['mfi_pop'])
+    sys.exit(0)
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/genFlowOverview.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/genFlowOverview.py Mon Feb 27 12:54:37 2017 -0500
[
b'@@ -0,0 +1,330 @@\n+#!/usr/bin/env python\n+######################################################################\n+#                  Copyright (c) 2016 Northrop Grumman.\n+#                          All rights reserved.\n+######################################################################\n+from __future__ import print_function\n+import sys\n+import os\n+import pandas as pd\n+import logging\n+import fileinput\n+\n+from argparse import ArgumentParser\n+from jinja2 import Environment, FileSystemLoader\n+from collections import defaultdict\n+\n+from color_palette import color_palette\n+from flowstatlib import gen_overview_stats\n+import matplotlib as mpl\n+mpl.use(\'Agg\')\n+import matplotlib.pyplot as plt\n+\n+\n+profile_key = {\n+    "1": "-",\n+    "2": "lo",\n+    "3": "+",\n+    "4": "hi"\n+}\n+\n+\n+# flow CL functions\n+def run_flowCL(phenotype, output_txt, output_pdf, tool):\n+    run_command = " ". join(["Rscript --slave --vanilla", tool, "--args",\n+                             output_txt, phenotype])\n+    os.system(run_command)\n+\n+    get_graph = " ".join(["mv flowCL_results/*.pdf", output_pdf])\n+    os.system(get_graph)\n+    return\n+\n+\n+def generate_flowCL_query(list_markers, list_types):\n+    if (len(list_markers) != len(list_types)):\n+        return("pb with headers")\n+    query = []\n+    # go through both lists, remove fsc/ssc\n+    for i in range(1, len(list_markers)):\n+        if not list_markers[i].startswith("FSC") and not list_markers[i].startswith("SSC"):\n+            query.append(list_markers[i].upper())\n+            query.append(profile_key[list_types[i]])\n+    # return concatenated string\n+    return("".join(query))\n+\n+\n+def translate_profiles(input_file, tool_dir, html_dir):\n+    tool = "/".join([tool_dir, "getOntology.R"])\n+    html_table = "".join([html_dir, "/CLprofiles.txt"])\n+    score_table = "".join(["cp ", input_file, " ", html_dir, "/scores.txt"])\n+    os.system(score_table)\n+\n+    # read profile\n+    with open(input_file, "r") as flock_profiles, open(html_table, "w") as out:\n+        headers = flock_profiles.readline()\n+        headers = headers.strip()\n+        markers = headers.split("\\t")[:-2]\n+        counter = 0\n+\n+        out.write("Population\\tFlowCL Query\\tNb Results\\tLink to PDF\\t")\n+        out.write("Top Result Label\\tTop Result Score\\tTop Result CL\\n")\n+        queries = {}\n+        # create marker query for each population\n+        for lines in flock_profiles:\n+            lines = lines.strip("\\n")\n+            pop_profile = lines.split("\\t")[:-2]\n+            flowcl_query = generate_flowCL_query(markers, pop_profile)\n+            counter += 1\n+            nb_results = "0"\n+            top_label = "no_match"\n+            top_score = "NA"\n+            top_CL = "NA"\n+            pdf_link = "NA"\n+\n+            # check if query was run before\n+            if flowcl_query not in queries:\n+                # create filenames for results & graphs\n+                txt = "".join(["flowcl_pop", str(counter).zfill(2), ".txt"])\n+                text_result = "/".join([html_dir, txt])\n+                graph = "".join(["flowcl_pop", str(counter).zfill(2), ".pdf"])\n+                graph_output = "/".join([html_dir, graph])\n+                # run flowCL for each marker profile\n+                run_flowCL(flowcl_query, text_result, graph_output, tool)\n+\n+                # test that text file exists if not results are all NAs:\n+                if os.path.isfile(text_result):\n+                    with open(text_result, "r") as res:\n+                        for line in res:\n+                            if line.startswith("Score"):\n+                                data = line.split(") ")\n+                                top_score = data[2][:-2]\n+                                tot_results = len(data) - 2\n+                                nb_results = str(tot_results)\n+                                if tot_results == 5:\n+                                    if len(data[6].split("+")) > 1:\n+                                        nb_res'..b'"w") as flow_mfi_file:\n+        flow_stats[args.mfi_calc].to_csv(flow_mfi_file, sep="\\t", float_format=\'%.0f\')\n+\n+    mpop = "_".join([args.mfi_calc, "pop"])\n+    flow_mfi_pop_file_name = args.output_directory + "/flow.mfi_pop"\n+    with open(flow_mfi_pop_file_name, "w") as flow_mfi_pop_file:\n+        flow_stats[mpop].to_csv(flow_mfi_pop_file, sep="\\t", index=False, float_format="%.2f")\n+\n+    # box plot data\n+    boxplot_data = args.output_directory + "/boxplotData.json"\n+    resampled = get_boxplot_stats(args.input_file, flow_mfi_file_name, boxplot_data)\n+\n+    # Generate the Images  -- eventually we should change that over to D3\n+    fcm = flow_stats[\'sample_data\'].values\n+    colors = []\n+    for i, j in enumerate(flow_stats[\'sample_population\']):\n+        colors.append(color_palette[j])\n+\n+    for i in range(flow_stats[\'columns\']):\n+        for j in range(flow_stats[\'columns\']):\n+            file_name = "m" + str(i) + "_m" + str(j)\n+            ax = plt.subplot(1, 1, 1)\n+            plt.subplots_adjust(left=0.0, bottom=0.0, right=1.0, top=1.0, wspace=0.0, hspace=0.0)\n+            plt.scatter(fcm[:, i], fcm[:, j], s=1, c=colors, edgecolors=\'none\')\n+            plt.axis([0, 1024, 0, 1024])\n+            plt.xticks([])\n+            plt.yticks([])\n+            F = plt.gcf()\n+            F.set_size_inches(1, 1)\n+            F.set_dpi(90)\n+            png_file = file_name + "_90X90.png"\n+            F.savefig(args.output_directory + "/" + png_file)\n+            plt.clf()\n+\n+    flow_overview_file_name = args.output_directory + "/flow.overview"\n+    with open(flow_overview_file_name, "w") as flow_overview_file:\n+        flow_overview_file.write("<table>\\n")\n+        flow_overview_file.write("<tr><td>&nbsp;</td>\\n")\n+        for i in range(flow_stats[\'columns\']):\n+            flow_overview_file.write("<td>" + flow_stats[\'markers\'][i] + "</td>\\n")\n+\n+        for i in range(flow_stats[\'columns\']):\n+            flow_overview_file.write("<tr>\\n")\n+            flow_overview_file.write("<td>" + flow_stats[\'markers\'][i] + "</td>\\n")\n+            for j in range(flow_stats[\'columns\']):\n+                file_name = "m" + str(j) + "_m" + str(i)\n+                image_file = file_name + "_90X90.png"\n+                flow_overview_file.write(\'<td><img src="\' + image_file + \'"/></td>\')\n+            flow_overview_file.write("</tr>\\n")\n+\n+        flow_overview_file.write("</table>\\n</body>\\n<html>\\n")\n+\n+    if resampled:\n+        to_find = \'<div id="outlierWarning" style="display:none;">\'\n+        to_replace = \'<div id="outlierWarning">\'\n+        ## yay python 2.7\n+        ro = fileinput.input(args.output_file, inplace=True, backup=".bak")\n+        for roline in ro:\n+            print(roline.replace(to_find, to_replace), end=\'\')\n+        ro.close()\n+\n+\n+if __name__ == "__main__":\n+    parser = ArgumentParser(\n+             prog="genOverview",\n+             description="Generate an overview plot of Flow results.")\n+\n+    parser.add_argument(\n+            \'-i\',\n+            dest="input_file",\n+            required=True,\n+            help="File location for the Flow Text file.")\n+\n+    parser.add_argument(\n+            \'-o\',\n+            dest="output_file",\n+            required=True,\n+            help="File location for the HTML output file.")\n+\n+    parser.add_argument(\n+            \'-d\',\n+            dest="output_directory",\n+            required=True,\n+            help="Directory location for the Flow Plot.")\n+\n+    parser.add_argument(\n+            \'-M\',\n+            dest="mfi_calc",\n+            required=True,\n+            help="what to calculate for centroids.")\n+\n+    parser.add_argument(\n+            \'-p\',\n+            dest="scores",\n+            help="File location for FLOCK population scores.")\n+\n+    parser.add_argument(\n+            \'-t\',\n+            dest="tool_directory",\n+            required=True,\n+            help="Location of the Tool Directory.")\n+\n+    args = parser.parse_args()\n+\n+    gen_flow_overview(args)\n+    sys.exit(0)\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/genFlowOverview.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/genFlowOverview.xml Mon Feb 27 12:54:37 2017 -0500
[
b'@@ -0,0 +1,191 @@\n+<tool id="gen_flow_overview" name="Generate overview information" version="1.0">\n+  <description>of FLOCK flow analysis</description>\n+  <requirements>\n+    <requirement type="package" version="1.5.0">matplotlib</requirement>\n+    <requirement type="package" version="1.10.2">numpy</requirement>\n+    <requirement type="package" version="0.16.0">scipy</requirement>\n+    <requirement type="package" version="0.17.1">pandas</requirement>\n+    <requirement type="package" version="2.8">jinja2</requirement>\n+    <requirement type="package" version="3.3.0">r</requirement>\n+    <requirement type="package" version="1.11.2">bioconductor-flowcl</requirement>\n+  </requirements>\n+  <stdio>\n+    <exit_code range="2" level="fatal" description="There was a problem running flowCL. You might want to check your marker names - See stderr for more details." />\n+    <exit_code range="3:" level="fatal" description="See stderr for more details." />\n+  </stdio>\n+  <command><![CDATA[\n+   #if $ontology.runcl == "no"\n+    python $__tool_directory__/genFlowOverview.py -i "${input}" -o "${html_file}" -M "${mfi}" -d "${html_file.files_path}" -t $__tool_directory__\n+   #else\n+    python $__tool_directory__/genFlowOverview.py -i "${input}" -o "${html_file}" -M "${mfi}" -d "${html_file.files_path}" -t $__tool_directory__ -p "${scores}"\n+   #end if\n+  ]]>\n+  </command>\n+  <inputs>\n+    <param format="flowclr" name="input" type="data" label="Flow Result File"/>\n+    <param name="mfi" type="select" label="Calculate centroids using:">\n+      <option value="mfi" selected="true">Mean Fluorescence Intensity</option>\n+      <option value="mdfi">Median Fluorescence Intensity</option>\n+      <option value="gmfi">Geometric Mean Fluorescence Intensity</option>\n+    </param>\n+    <conditional name="ontology">\n+      <param name="runcl" type="select" label="Associate FLOCK population score profiles with Cell Ontology?" help="using FlowCL">\n+        <option value="no">No, thank you</option>\n+        <option value="yes">Yes, pretty please, even though it will take 10 more minutes to run</option>\n+      </param>\n+      <when value="yes">\n+        <param format="flowscore" name="scores" type="data" label="Population score profiles from FLOCK"/>\n+      </when>\n+    </conditional>\n+  </inputs>\n+  <outputs>\n+    <data format="html" name="html_file" label="Overview of ${input.name}">\n+    </data>\n+  </outputs>\n+  <tests>\n+    <test>\n+      <param name="input" value="input.flowclr"/>\n+      <param name="mfi" value="mfi"/>\n+      <param name="runcl" value="no"/>\n+      <output name="output_file" file="out1/out.html">\n+        <extra_files type="file" name="flow.mfi" value="out1/flow.mfi"/>\n+        <extra_files type="file" name="flow.mfi_pop" value="out1/flow.mfi_pop"/>\n+        <extra_files type="file" name="flow.overview" value="out1/flow.overview"/>\n+        <extra_files type="file" name="flow.sample" value="out1/flow.sample"/>\n+        <extra_files type="file" name="boxplot.json" value="out1/boxplotData.json"/>\n+        <extra_files type="file" name="m0_m0_90X90.png" value="out1/m0_m0_90X90.png" compare="contains"/>\n+        <extra_files type="file" name="m0_m1_90X90.png" value="out1/m0_m1_90X90.png" compare="contains"/>\n+        <extra_files type="file" name="m1_m0_90X90.png" value="out1/m1_m0_90X90.png" compare="contains"/>\n+        <extra_files type="file" name="m1_m1_90X90.png" value="out1/m1_m1_90X90.png" compare="contains"/>\n+      </output>\n+    </test>\n+    <test>\n+      <param name="input" value="input.flowclr"/>\n+      <param name="mfi" value="mfi"/>\n+      <param name="runcl" value="yes"/>\n+      <param name="scores" value="profile.flowscore"/>\n+      <output name="output_file" file="out2/out.html">\n+        <extra_files type="file" name="boxplot.json" value="out2/boxplotData.json"/>\n+        <extra_files type="file" name="CLprofiles.txt" value="out2/CLprofiles.txt"/>\n+        <extra_files type="file" name="flow.mfi" value="out2/flow.mfi"/>\n+        <'..b'/tests>\n+  <help><![CDATA[\n+   This tool generates an overview of the flow analysis results.\n+\n+-----\n+\n+**Input**\n+\n+Tool input is a tab-separated file containing markers fluorescence intensities for each event as well as population and is generated as part of FLOCK or CrossSample output.  If the option is selected, flowCL is used to associate populations defined by FLOCK to a Cell Ontology term.\n+\n+.. class:: infomark\n+\n+Tip: Marker names need to be in the Cell Ontology for flowCL to run.\n+\n+**Output**\n+\n+The output is a page with multiple tabs that allows visualization of the data.\n+\n+.. class: warningmark\n+\n+The FLOCK output is proportionally downsampled to 20K events for the visualization.\n+\n+.. class:: warningmark\n+\n+*The output of this tool is interactive. However, comments or any other modifications made are not saved when exiting the view.*\n+\n+-----\n+\n+**Example**\n+\n+*Input* - fluorescence intensities per marker and population ID per event::\n+\n+   Marker1 Marker2 Marker3 Population\n+   33      47      11      1\n+   31      64      11      6\n+   21      62      99      2\n+   14      34      60      7\n+\n+*Output*\n+\n+Summary of the data:\n+\n+The comment field of this table is editable, and can be used to name the populations. The edited values are used to populate the legends of the other graphs. The columns are re-orderable. The \'col visibility\' button allows to choose which columns to display. \'CSV\', \'PDF\' and \'Copy\' respectively allow to download a comma-separated values file, a pdf version or to copy to your clipboard in a tab-separated format the current view of the table.\n+\n+.. image:: static/images/flowtools/summary.png\n+\n+.. image:: static/images/flowtools/edit_summary.png\n+\n+\n+Scatterplots overview:\n+\n+.. image:: static/images/flowtools/overview.png\n+\n+\n+2D Scatterplot:\n+\n+The user can choose which populations and markers to display. The Plotly toolbar allows more control over the display of the graph. There is an option to save the plot as a png file.\n+\n+.. image:: static/images/flowtools/scatter2D.png\n+\n+\n+3D Scatterplot:\n+\n+The user can choose which populations and markers to display. The Plotly toolbar allows more control over the display of the graph. There is an option to save the plot as a png file.\n+\n+.. image:: static/images/flowtools/scatter3D.png\n+\n+\n+Parallel Coordinates:\n+\n+The user can reorder the markers, and choose which populations to display either by selecting them in the legends via checkboxes or by selecting them on the graph. Data selected for display is shown in the table below the graph. Mousing over a line in that table highlights the corresponding line on the graph. The \'col visibility\' button allows to choose which columns to display. \'CSV\', \'PDF\' and \'Copy\' respectively allow to download a comma-separated values file, a pdf version or to copy to your clipboard in a tab-separated format the current view of the table.\n+\n+.. image:: static/images/flowtools/pcflock.png\n+\n+\n+Summary Statistics Boxplots:\n+\n+The user can choose whether to group the boxplots per marker or per population. By default, the values displayed are the 25th, median and 75th percentiles. The whiskers represent 1.5 times the interquartile range. The MFI or the values can be displayed by checking the corresponding checkboxes. The number of markers that can be plotted simultaneously is limited to 5. The number of outliers per data point is limited to 100. If there are more than 100 outliers, they are downsampled randomly to a 100 and a warning message is displayed.\n+\n+.. image:: static/images/flowtools/bpflock.png\n+\n+\n+If the ontology option was selected, the following tab is displayed.\n+The CL terms hyperlink to their representation in the Immport Cell Ontology browser. The full flowCL run summary is accessible by clicking on the phenotype.\n+\n+.. image:: static/images/flowtools/profileCL_go.png\n+\n+  ]]>\n+  </help>\n+  <citations>\n+    <citation type="doi">10.1093/bioinformatics/btu807</citation>\n+  </citations>\n+</tool>\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/getOntology.R
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/getOntology.R Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,28 @@
+# Cell Ontology Module for Galaxy
+# FlowCL
+######################################################################
+#                  Copyright (c) 2016 Northrop Grumman.
+#                          All rights reserved.
+######################################################################
+# 
+# Version 1
+# Cristel Thomas
+#
+#
+
+library(flowCL)
+library(base)
+
+getOntology <- function(output_file, markers) {
+  res <- flowCL(markers, ResetArch = TRUE)
+  if (length(res) == 6) {
+    report <- capture.output(res$Table)
+    sink(output_file)
+    cat(report, sep = "\n")
+    sink()
+  }
+}
+
+args <- commandArgs(trailingOnly = TRUE)
+markers <- paste(args[3:length(args)], collapse="")
+getOntology(args[2], markers)
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/flowtools/css/flowCL.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/static/flowtools/css/flowCL.css Mon Feb 27 12:54:37 2017 -0500
b
@@ -0,0 +1,43 @@
+/*
+** DataTables config
+*/
+div.dt-buttons {
+    float: right;
+}
+
+th {
+    font-size:16px;
+    text-align: left;
+}
+
+body td {
+    max-width: 50px;
+    font-size: 14px;
+    overflow: hidden;
+    text-overflow: ellipsis; 
+}
+
+.cltable thead {
+    display:none;
+}
+
+.cltable td {
+    max-width: 40px;
+    word-break: break-all;
+    word-wrap: break-word;
+}
+
+.firstcol {
+    width: 160px;
+}
+
+.smallcols {
+    width: 100px;
+}
+
+div.dataTables_wrapper {
+    width: 95%;
+    margin: 0 auto;
+}
+
+
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/flowtools/css/parallelCoordinates.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/static/flowtools/css/parallelCoordinates.css Mon Feb 27 12:54:37 2017 -0500
b
@@ -0,0 +1,170 @@
+/*Chart*/
+.chartDiv {
+    margin-top: 10px;
+    margin-bottom: 10px;
+    margin-left: 10px;
+    margin-right: 10px;
+    background-color: #ffffff;
+}
+/*This for stacked / bar plot*/
+.optionButtons{
+    padding-bottom: 8px;
+}
+.igbtn {
+    border-radius: 4px;
+    color: white;
+    background-color: #0E3163;
+    border:1px;
+    font-size: 14px;
+    font-weight: bold;
+    border-color: #0E3163;
+    padding: 6px 12px;
+    background: -webkit-linear-gradient(#0E3163, #3e6db0);
+    background: -o-linear-gradient(#0E3163, #3e6db0);
+    background: -moz-linear-gradient(#0E3163, #3e6db0);
+    background: linear-gradient(#0E3163, #3e6db0);
+}
+ #togglePlot {
+    display: block;
+    margin-left: auto;
+    margin-right: auto;
+    height: 60px;
+    width: 90px;
+    padding: 4px 8px 8px 4px;
+}
+/*DataTables config*/
+div.dt-buttons {
+    float: right;
+}
+th {
+    background-color:#3965A4;
+    color:#fff;
+    border-radius: 2px;
+    padding:6px 12px;
+    font-size:14px;
+    text-align: center;
+}
+.igtable th {
+  background: -webkit-linear-gradient(#0E3163, #3e6db0);
+  background: -o-linear-gradient(#0E3163, #3e6db0);
+  background: -moz-linear-gradient(#0E3163, #3e6db0);
+  background: linear-gradient(#0E3163, #3e6db0)
+}
+body td {
+    max-width: 50px;
+    font-size: 14px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+.pctable td {
+    max-width: 100px;
+}
+.dtable td {
+    max-width: 50px;
+    word-break: break-all;
+    word-wrap: break-word;
+}
+.popt thead {
+    display:none;
+}
+.popt td {
+    max-width: 40px;
+    word-break: break-all;
+    word-wrap: break-word;
+}
+div.dataTables_wrapper {
+    width: 95%;
+    margin: 0 auto;
+}
+/*Opacity widget*/
+.widget {
+  margin-top: 4px;
+  padding: 4px 4px 8px 4px;
+  margin-bottom: 10px
+  height: 36px;
+  line-height: 12px;
+  font-size: 12px;
+  text-align: center;
+ // float: right;
+}
+/*This section for coordinates plot*/
+.table th {
+    text-align: center;
+    padding: 10px;
+}
+.table {
+    width:100%;
+    border:0px solid;
+    border-collapse:collapse;
+    text-align:center;
+    font-size: 14px;
+}
+svg {
+  font: 10px sans-serif;
+}
+.background path {
+  fill: none;
+  stroke: #F0F0F0;
+  shape-rendering: crispEdges;
+}
+.foreground path {
+  fill: none;
+  stroke-opacity: .8;
+}
+.brush .extent {
+  fill-opacity: .3;
+  stroke: #fff;
+  shape-rendering: crispEdges;
+}
+.axis line,
+.axis path {
+  fill: none;
+  stroke: #000;
+  stroke-width: 2;
+  shape-rendering: crispEdges;
+}
+.axis text {
+  text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, 0 -1px 0 #fff, -1px 0 0 #fff;
+}
+.xlabel {
+  font-size: 14px;
+  fill: #808080;
+}
+.ylabel {
+  font-size: 16px;
+  fill: #808080;
+}
+/*This section for boxplots*/
+.box {
+  font: 10px sans-serif;
+}
+.box line,
+.box rect,
+.box circle {
+   fill: red;
+  stroke: #000;
+  stroke-width: 1px;
+}
+.box .center {
+  stroke-dasharray: 3,3;
+}
+.box .outlier {
+  fill: none;
+  stroke: #000;
+}
+.axisbp path,
+.axisbp line {
+  stroke-width: 1px;
+  fill:
+}
+.y.axisbp path {
+  stroke-width: 2;
+  stroke: #000;
+  fill: none;
+}
+.x.axisbp path {
+  fill: none;
+  stroke: #C8C8C8;
+  stroke-width: 0px;
+  shape-rendering: crispEdges;
+}
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/flowtools/js/boxplotsFlow.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/static/flowtools/js/boxplotsFlow.js Mon Feb 27 12:54:37 2017 -0500
[
b'@@ -0,0 +1,724 @@\n+// Copyright (c) 2016 Northrop Grumman.\n+// All rights reserved.\n+var updateBPmfi = function(plotconfig){\n+  plotconfig.selectedPopulations = [];\n+  $(plotconfig.popSelectj).each(function() {\n+    if (this.checked) {\n+      plotconfig.selectedPopulations.push(parseInt(this.value));\n+    }\n+  });\n+  // Update selected markers?\n+  plotconfig.selectedMarkers = [];\n+  $(plotconfig.mrkrSelectj).each(function() {\n+    if (this.checked) {\n+      plotconfig.selectedMarkers.push(parseInt(this.value));\n+    }\n+  });\n+  // update plot\n+  updateBoxplotMFI(plotconfig);\n+};\n+\n+var displayPopulationLegend = function(plotconfig) {\n+  $(plotconfig.table).empty();\n+  plotconfig.allPopulations.map(function(value,index) {\n+    $(plotconfig.table).append(\'<tr><td align="center">\'\n+        + \'<input type="checkbox" checked class=\' + plotconfig.popSelect\n+        + \' value=\' + value + \'/></td><td title="\' + newNames[value] + \'">\'\n+        + newNames[value] + \'</td><td><span style="background-color:\'\n+        + color_palette[0][value][0] + \'">&nbsp;&nbsp;&nbsp;</span></td></tr>\');\n+  });\n+\n+  $(plotconfig.popSelectAll).click(function() {\n+    var checkAll = $(plotconfig.popSelectAll).prop(\'checked\');\n+    if (checkAll) {\n+      $(plotconfig.popSelectj).prop("checked", true);\n+    } else {\n+      $(plotconfig.popSelectj).prop("checked", false);\n+    }\n+    updateBPmfi(plotconfig);\n+  });\n+\n+  $(plotconfig.popSelectj).click(function() {\n+    if ($(plotconfig.popSelectj).length == $(plotconfig.popSelectCheck).length) {\n+      $(plotconfig.popSelectAll).prop("checked",true);\n+    } else {\n+      $(plotconfig.popSelectAll).prop("checked",false);\n+    }\n+    updateBPmfi(plotconfig);\n+  });\n+\n+  $(plotconfig.popSelectj).each(function() {\n+    var selectedpopn = parseInt(this.value);\n+    if ($.inArray(selectedpopn,plotconfig.selectedPopulations) > -1) {\n+      this.checked = true;\n+    } else {\n+      this.checked = false;\n+    }\n+  });\n+};\n+\n+var displayToolbar = function(plotconfig){\n+  $(plotconfig.displaybutton).on("click",function() {\n+    $(plotconfig.popSelectAll).prop("checked",true);\n+    $(plotconfig.popSelectj).prop("checked", true);\n+    $(plotconfig.mrkrSelectj).prop("checked", true);\n+    $(plotconfig.mrkrSelectAll).prop("checked",true);\n+    $(plotconfig.displayMFI).prop("checked", false);\n+    $(plotconfig.displayvalues).prop("checked", false);\n+    updateBPmfi(plotconfig);\n+  });\n+\n+  $(plotconfig.toggledisplayj).on("click",function() {\n+    var text = document.getElementById(plotconfig.toggledisplay).firstChild;\n+    text.data = text.data == "View per marker" ? "View per population" : "View per marker";\n+    plotconfig.view = plotconfig.view == "p" ? "m" : "p";\n+    updateBPmfi(plotconfig);\n+  });\n+\n+  $(plotconfig.displayMFI).on("click", function(){\n+    updateBPmfi(plotconfig);\n+  });\n+\n+  $(plotconfig.displayvalues).on("click", function(){\n+    updateBPmfi(plotconfig);\n+  });\n+\n+  displayPlot(plotconfig);\n+};\n+\n+var displayPlot = function(plotconfig) {\n+  var h = $(window).height() - 200,\n+      nbPop = Object.keys(plotconfig.csdata.mfi[plotconfig.mrkrNames[0]]).length + 2;\n+\n+  $(plotconfig.plotdivj).empty();\n+  $(plotconfig.plotdivj).height(h);\n+\n+  // Get Markers too\n+  for (var i = 0, nbMarkers = plotconfig.mrkrNames.length; i < nbMarkers; i++){\n+    plotconfig.allMarkers.push(i);\n+    plotconfig.selectedMarkers.push(i);\n+  }\n+  for (var i = 2; i < nbPop; i++) {\n+    plotconfig.allPopulations.push(i - 1);\n+    plotconfig.selectedPopulations.push(i - 1);\n+  }\n+\n+  $(window).on(\'resize\',function() {\n+    waitForFinalEvent(function() {\n+      updateBoxplotMFI(plotconfig);\n+    }, 500, "resizePlot");\n+  });\n+\n+  displayPopulationLegend(plotconfig);\n+  displayMarkerTable(plotconfig);\n+  updateBoxplotMFI(plotconfig);\n+};\n+\n+var displayMarkerTable = function(plotconfig){\n+  var nbm = plotconfig.mrkrNames.length + 1;\n+  $(plotconfig.mtable).empty();\n+  plotconfig.allMarkers.map(function(v) {\n+    $(plotconfig.mtable).app'..b'onfig[2],\n+                        pop = data.config[1],\n+                        mrkr = data.config[0];\n+                    var color = color_palette[0][pop][1] + (mrkr + 1 )/ nbm + \')\';\n+                    return color; })\n+            .style("stroke", function(d) { return color_palette[0][data.config[1]][3]; })\n+          .transition()\n+            .duration(duration)\n+            .attr("cy", function(i) { return x1(d[i]); })\n+            .style("opacity", 1);\n+\n+        outlier.transition()\n+            .duration(duration)\n+            .attr("cy", function(i) { return x1(d[i]); })\n+            .style("opacity", 1);\n+\n+        outlier.exit().transition()\n+            .duration(duration)\n+            .attr("cy", function(i) { return x1(d[i]); })\n+            .style("opacity", 1e-6)\n+            .remove();\n+\n+          // Compute the tick format.\n+        var format = tickFormat || x1.tickFormat(8);\n+          // Update box ticks.\n+        var boxTick = g.selectAll("text.box")\n+            .data(quartileData);\n+\n+        if(showLabels == true) {\n+          boxTick.enter().append("text")\n+              .attr("class", "box")\n+              .attr("dy", ".3em")\n+              .attr("dx", function(d, i) { return i & 1 ? 6 : -6 })\n+              .attr("x", function(d, i) { return i & 1 ?  + width : 0 })\n+              .attr("y", x0)\n+              .attr("text-anchor", function(d, i) { return i & 1 ? "start" : "end"; })\n+              .text(format)\n+            .transition()\n+              .duration(duration)\n+              .attr("y", x1);\n+        }\n+\n+        boxTick.transition()\n+            .duration(duration)\n+            .text(format)\n+            .attr("y", x1);\n+\n+        // Update whisker ticks. These are handled separately from the box\n+        // ticks because they may or may not exist, and we want don\'t want\n+        // to join box ticks pre-transition with whisker ticks post-.\n+        var whiskerTick = g.selectAll("text.whisker")\n+            .data(whiskerData || []);\n+        if(showLabels == true) {\n+          whiskerTick.enter().append("text")\n+              .attr("class", "whisker")\n+              .attr("dy", ".3em")\n+              .attr("dx", 6)\n+              .attr("x", width)\n+              .attr("y", x0)\n+              .text(format)\n+              .style("opacity", 1e-6)\n+              .style("stroke", function(d) { return color_palette[0][data.config[1]][3]; })\n+            .transition()\n+              .duration(duration)\n+              .attr("y", x1)\n+              .style("opacity", 1);\n+        }\n+        whiskerTick.transition()\n+            .duration(duration)\n+            .text(format)\n+            .attr("y", x1)\n+            .style("opacity", 1);\n+\n+        whiskerTick.exit().transition()\n+            .duration(duration)\n+            .attr("y", x1)\n+            .style("opacity", 1e-6)\n+            .remove();\n+      });\n+      d3.timer.flush();\n+    }\n+\n+    box.width = function(x) {\n+      if (!arguments.length) return width;\n+      width = x;\n+      return box;\n+    };\n+    box.height = function(x) {\n+      if (!arguments.length) return height;\n+      height = x;\n+      return box;\n+    };\n+    box.tickFormat = function(x) {\n+      if (!arguments.length) return tickFormat;\n+      tickFormat = x;\n+      return box;\n+    };\n+    box.duration = function(x) {\n+      if (!arguments.length) return duration;\n+      duration = x;\n+      return box;\n+    };\n+    box.domain = function(x) {\n+      if (!arguments.length) return domain;\n+      domain = x == null ? x : d3.functor(x);\n+      return box;\n+    };\n+    box.value = function(x) {\n+      if (!arguments.length) return value;\n+      value = x;\n+      return box;\n+    };\n+    box.showLabels = function(x) {\n+      if (!arguments.length) return showLabels;\n+      showLabels = x;\n+      return box;\n+    };\n+    box.showMFI = function(x) {\n+      if (!arguments.length) return showMFI;\n+      showMFI = x;\n+      return box;\n+    };\n+    return box;\n+  };\n+})();\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/flowtools/js/color_palette.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/static/flowtools/js/color_palette.js Mon Feb 27 12:54:37 2017 -0500
[
b"@@ -0,0 +1,226 @@\n+// Copyright (c) 2016 Northrop Grumman.\n+// All rights reserved.\n+\n+/* Palettes for graphics.\n+* 0 -> Liz's palette (original ImmPort color scheme for graphics)\n+* 1 -> Cris's palette (diverging)\n+* 2 -> Christmas (diverging)\n+* 3 -> not Christmas (sequential color blind friendly)\n+* 4 -> Rainbow (sequential)\n+* arrays are color HEX, color RGB (for transparency effect), contrasting color, darker shade for borders\n+*/\n+var color_palette = [[\n+  ['#000000','rgba(0,0,0,','rgba(52,17,81,1)','#111111'],\n+\t['#FF0000','rgba(255,0,0,','rgba(52,17,81,1)','#D21111'],\n+\t['#FFFF00','rgba(255,255,0,','rgba(52,17,81,1)','#FFC900'],\n+\t['#008000','rgba(0,128,0,','rgba(52,17,81,1)','#016D01'],\n+\t['#0000FF','rgba(0,0,255,','rgba(255,0,0,1)','#2121A0'],\n+\t['#FFA500','rgba(255,165,0,','rgba(52,17,81,1)','#DE991B'],\n+\t['#8A2BE2','rgba(138,43,226,','rgba(52,17,81,1)','#6A0EBF'],\n+\t['#808000','rgba(128,128,0,','rgba(52,17,81,1)','#66660A'],\n+\t['#00FFFF','rgba(0,255,255,','rgba(52,17,81,1)','#1DCBCB'],\n+\t['#FF00FF','rgba(255,0,255,','rgba(52,17,81,1)','#A009A0'],\n+\t['#00FF00','rgba(0,255,0,','rgba(52,17,81,1)','#20AB20'],\n+\t['#000080','rgba(0,0,128,','rgba(255,0,0,1)','#13135B'],\n+\t['#F08080','rgba(240,128,128,','rgba(52,17,81,1)','#922626'],\n+\t['#800080','rgba(128,0,128,','rgba(255,0,0,1)','#580B58'],\n+\t['#F0E68C','rgba(240,230,140,','rgba(52,17,81,1)','#F0C08C'],\n+\t['#8FBC8F','rgba(143,188,143,','rgba(52,17,81,1)','#668166'],\n+\t['#2F4F4F','rgba(47,79,79,','rgba(52,17,81,1)','#0E3636'],\n+\t['#008080','rgba(0,128,128,','rgba(52,17,81,1)','#095454'],\n+\t['#9932CC','rgba(153,50,204,','rgba(52,17,81,1)','#78289F'],\n+\t['#FF7F50','rgba(255,127,80,','rgba(52,17,81,1)','#B0431A'],\n+\t['#FFD700','rgba(255,215,0,','rgba(52,17,81,1)','#FFB900'],\n+\t['#008B8B','rgba(0,139,139,','rgba(52,17,81,1)','#097171'],\n+\t['#800000','rgba(128,0,0,','rgba(255,0,0,1)','#500303'],\n+\t['#5F9EA0','rgba(95,158,160,','rgba(52,17,81,1)','#366668'],\n+\t['#FFC0CB','rgba(255,192,203,','rgba(52,17,81,1)','#FC869B'],\n+\t['#545454','rgba(84,84,84,','rgba(255,0,0,1)','#342C2C'],\n+\t['#7FFFD4','rgba(127,255,212,','rgba(255,0,0,1)','#8CCAB5'],\n+\t['#ADD8E6','rgba(173,216,230,','rgba(52,17,81,1)','#77C6DF'],\n+\t['#DB7093','rgba(219,112,147,','rgba(52,17,81,1)','#B24B6D'],\n+\t['#CD853F','rgba(205,133,63,','rgba(52,17,81,1)','#BA6D22'],\n+\t['#4169E1','rgba(65,105,225,','rgba(52,17,81,1)','#1840B8'],\n+\t['#708090','rgba(112,128,144,','rgba(52,17,81,1)','#465A6D'],\n+\t['#4682B4','rgba(70,130,180,','rgba(52,17,81,1)','#1F5785'],\n+\t['#D8BFD8','rgba(216,191,216,','rgba(52,17,81,1)','#B679B6'],\n+\t['#F5DEB3','rgba(245,222,179,','rgba(52,17,81,1)','#E9AB3F'],\n+\t['#9ACD32','rgba(154,205,50,','rgba(52,17,81,1)','#6E971B'],\n+\t['#BDB76B','rgba(189,183,107,','rgba(52,17,81,1)','#938E49'],\n+\t['#8B008B','rgba(139,0,139,','rgba(255,0,0,1)','#590A59'],\n+\t['#556B2F','rgba(85,107,47,','rgba(52,17,81,1)','#3A4D19'],\n+\t['#00CED1','rgba(0,206,209,','rgba(52,17,81,1)','#1BA0A2'],\n+\t['#FF1493','rgba(255,20,147,','rgba(52,17,81,1)','#A40F5F']\n+],[\n+\t//cris\n+  ['#000000','rgba(0,0,0,','rgba(52,17,81,1)','#111111'],\n+\t['#5B1A48','rgba(91,26,72,','rgba(255,0,0,1)','#922B74'],\n+\t['#1ED992','rgba(30,217,146,','rgba(52,17,81,1)','#108A5B'],\n+\t['#FFE4FF','rgba(255,228,255,','rgba(52,17,81,1)','#FF9AFF'],\n+\t['#3B2000','rgba(59,32,0,','rgba(255,0,0,1)','#8C4D02'],\n+\t['#BDF765','rgba(189,247,101,','rgba(52,17,81,1)','#83b438'],\n+\t['#C6DCFD','rgba(198,220,253,','rgba(52,17,81,1)','#70A9FE'],\n+\t['#542788','rgba(84,39,136,','rgba(255,0,0,1)','#8055B2'],\n+\t['#FB8072','rgba(251,128,114,','rgba(52,17,81,1)','#D55446'],\n+\t['#F2E0B8','rgba(242,224,184,','rgba(52,17,81,1)','#F9C146'],\n+\t['#0A684C','rgba(10,104,76,','rgba(52,17,81,1)','#27B88D'],\n+\t['#FD8ADC','rgba(253,138,220,','rgba(52,17,81,1)','#CB3AA2'],\n+\t['#CDFAFF','rgba(205,250,255,','rgba(52,17,81,1)','#66EDFC'],\n+\t['#0C1657','rgba(12,22,87,','rgba(255,0,0,1)','#3243B6'],\n+\t['#FFDE69','rgba(255,222,105,','rgba(52,17,81,1)','#CFAD34'],\n+\t['#BEBADA','rgba(190,186,218,','rgb"..b",1)','#28785D'],\n+\t['#6DB388','rgba(109,179,136,','rgba(52,17,81,1)','#348252'],\n+\t['#76B67D','rgba(118,182,125,','rgba(52,17,81,1)','#388340'],\n+\t['#7FB972','rgba(127,185,114,','rgba(52,17,81,1)','#448635'],\n+\t['#88BB69','rgba(136,187,105,','rgba(52,17,81,1)','#518730'],\n+\t['#92BD60','rgba(146,189,96,','rgba(52,17,81,1)','#62902D'],\n+\t['#9CBE59','rgba(156,190,89,','rgba(52,17,81,1)','#6D9028'],\n+\t['#A7BE53','rgba(167,190,83,','rgba(52,17,81,1)','#70871D'],\n+\t['#B1BE49','rgba(177,190,78,','rgba(52,17,81,1)','#7C8919'],\n+\t['#BABC49','rgba(186,188,73,','rgba(52,17,81,1)','#87891B'],\n+\t['#C3BA45','rgba(195,186,69,','rgba(52,17,81,1)','#928917'],\n+\t['#CCB742','rgba(204,183,66,','rgba(52,17,81,1)','#AC9516'],\n+\t['#D3B33F','rgba(211,179,63,','rgba(52,17,81,1)','#A78713'],\n+\t['#DAAD3C','rgba(218,173,60,','rgba(52,17,81,1)','#AB7E0D'],\n+\t['#DFA539','rgba(223,165,57,','rgba(52,17,81,1)','#B17609'],\n+\t['#E39C37','rgba(227,156,55,','rgba(52,17,81,1)','#BB730D'],\n+\t['#E59134','rgba(229,145,52,','rgba(52,17,81,1)','#B16006'],\n+\t['#E78432','rgba(231,132,50,','rgba(52,17,81,1)','#B45404'],\n+\t['#E7752F','rgba(231,117,47,','rgba(52,17,81,1)','#763703'],\n+\t['#E6652D','rgba(230,101,45,','rgba(52,17,81,1)','#AD3906'],\n+\t['#E4542A','rgba(228,84,42,','rgba(52,17,81,1)','#AE2A04'],\n+\t['#E14326','rgba(225,67,38,','rgba(52,17,81,1)','#AD1E04'],\n+\t['#DD3123','rgba(221,49,35,','rgba(52,17,81,1)','#A11105'],\n+\t['#D92120','rgba(217,33,32,','rgba(52,17,81,1)','#8A0201']\n+],[\n+// Rainbow\n+  ['#000000','rgba(0,0,0,','rgba(52,17,81,1)','#111111'],\n+\t['#FF0000','rgba(255,0,0,','rgba(52,17,81,1)','#C30707'],\n+\t['#FF2600','rgba(255,38,0,','rgba(52,17,81,1)','#BA250B'],\n+\t['#FF4D00','rgba(255,77,0,','rgba(52,17,81,1)','#BD3A02'],\n+\t['#FF7300','rgba(255,115,0,','rgba(52,17,81,1)','#C15B06'],\n+\t['#FF9900','rgba(255,153,0,','rgba(52,17,81,1)','#BF7504'],\n+\t['#FFBF00','rgba(255,191,0,','rgba(52,17,81,1)','#C49405'],\n+\t['#FFE500','rgba(255,229,0,','rgba(52,17,81,1)','#BEAB01'],\n+\t['#F2FF00','rgba(242,255,0,','rgba(52,17,81,1)','#B3BD03'],\n+\t['#CCFF00','rgba(204,255,0,','rgba(52,17,81,1)','#93B607'],\n+\t['#A6FF00','rgba(166,255,0,','rgba(52,17,81,1)','#7BBB05'],\n+\t['#80FF00','rgba(128,255,0,','rgba(52,17,81,1)','#59AC05'],\n+\t['#59FF00','rgba(89,255,0,','rgba(52,17,81,1)','#3DAD01'],\n+\t['#33FF00','rgba(51,255,0,','rgba(52,17,81,1)','#24B001'],\n+\t['#0DFF00','rgba(13,255,0,','rgba(52,17,81,1)','#0CAA03'],\n+\t['#00FF1A','rgba(0,255,26,','rgba(52,17,81,1)','#03AC14'],\n+\t['#00FF40','rgba(0,255,64,','rgba(52,17,81,1)','#02AB2C'],\n+\t['#00FF66','rgba(0,255,102,','rgba(52,17,81,1)','#01AD46'],\n+\t['#00FF8C','rgba(0,255,140,','rgba(52,17,81,1)','#06B466'],\n+\t['#00FFB3','rgba(0,255,179,','rgba(52,17,81,1)','#01AB79'],\n+\t['#00FFD9','rgba(0,255,217,','rgba(52,17,81,1)','#02B399'],\n+\t['#00FFFF','rgba(0,255,255,','rgba(52,17,81,1)','#04AEAE'],\n+\t['#00D9FF','rgba(0,217,255,','rgba(52,17,81,1)','#0496B0'],\n+\t['#00B2FF','rgba(0,178,255,','rgba(52,17,81,1)','#0272A3'],\n+\t['#008CFF','rgba(0,140,255,','rgba(255,0,0,1)','#00569D'],\n+\t['#0068FF','rgba(0,102,255,','rgba(255,0,0,1)','#044AAE'],\n+\t['#0040FF','rgba(0,64,255,','rgba(255,0,0,1)','#032894'],\n+\t['#0019FF','rgba(0,25,255,','rgba(255,0,0,1)','#01109C'],\n+\t['#0D00FF','rgba(13,0,255,','rgba(255,0,0,1)','#0B03A7'],\n+\t['#3300FF','rgba(51,0,255,','rgba(255,0,0,1)','#2403A7'],\n+\t['#5900FF','rgba(89,0,255,','rgba(255,0,0,1)','#3E04AA'],\n+\t['#8000FF','rgba(128,0,255,','rgba(255,0,0,1)','#5302A4'],\n+\t['#A600FF','rgba(166,0,255,','rgba(255,0,0,1)','#6F03A9'],\n+\t['#CC00FF','rgba(204,0,255,','rgba(255,0,0,1)','#8A04AC'],\n+\t['#F200FF','rgba(242,0,255,','rgba(52,17,81,1)','#9D03A5'],\n+\t['#FF00E5','rgba(255,0,229,','rgba(52,17,81,1)','#B607A4'],\n+\t['#FF00BF','rgba(255,0,191,','rgba(52,17,81,1)','#B40588'],\n+\t['#FF0099','rgba(255,0,153,','rgba(52,17,81,1)','#B4016D'],\n+\t['#FF0073','rgba(255,0,115,','rgba(52,17,81,1)','#A9024D'],\n+\t['#FF004C','rgba(255,0,76,','rgba(52,17,81,1)','#A90335'],\n+\t['#FF0026','rgba(255,0,38,','rgba(52,17,81,1)','#A6051D']\n+]];\n"
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/flowtools/js/overview.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/static/flowtools/js/overview.js Mon Feb 27 12:54:37 2017 -0500
[
b'@@ -0,0 +1,325 @@\n+// Copyright (c) 2016 Northrop Grumman.\n+// All rights reserved.\n+\n+var scatterData2D = {};\n+var scatterData3D = {};\n+var scatterData3DMFI = {};\n+var scatterDataMFI = {};\n+var tableContent;\n+var newNames ={};\n+var configbp = {};\n+var bpurl = "./boxplotData.json";\n+\n+var waitForFinalEvent = (function () {\n+  var timers = {};\n+  return function (callback, ms, uniqueId) {\n+    if (!uniqueId) {\n+      uniqueId = "Don\'t call this twice without a uniqueId";\n+    }\n+    if (timers[uniqueId]) {\n+      clearTimeout (timers[uniqueId]);\n+    }\n+    timers[uniqueId] = setTimeout(callback, ms);\n+  };\n+})();\n+\n+var updateOverviewPlotDisplay = function(data) {\n+  $(\'#overviewPlotDiv\').empty();\n+  $(\'#overviewPlotDiv\').html(data);\n+};\n+\n+var displayMFI = function() {\n+  var url = "flow.mfi_pop";\n+  d3.text(url, function(error, data){\n+    var mfiHdgs = [],\n+        pp = [],\n+        mfiTableData = [],\n+        mfiTableHeadings = [],\n+        mfiTargets = [],\n+        mfiTableHTML = \'<table id="mfitable" class="dtable display compact" cellspacing="0" width="100%"/>\',\n+        popcol = 1,\n+        mfiEditorData =[];\n+\n+    if (error){\n+      alert("Problem retrieving data");\n+      return;\n+    }\n+    mfiHdgs = data.split("\\n")[0].split("\\t");\n+    pp = mfiHdgs.pop();\n+    mfiHdgs.unshift(pp);\n+    mfiHdgs.unshift("Comment");\n+    data = d3.tsv.parse(data);\n+    function handleSubmit(method, url, d, successCallBack, errorCallBack) {\n+      var output = {data : mfiTableData};\n+      successCallBack(output);\n+    }\n+\n+    $(\'#mfiDiv\').empty();\n+    mfiTableData = $.extend(true,[],data);\n+    mfiTableData.forEach(function(d){\n+      d.Comment = d.Population;\n+      newNames[parseInt(d.Population)] = d.Comment;\n+    });\n+    //var mfiData = mfiTableData.filter(function(d){return d});\n+    tableContent = $.extend(true, [], mfiTableData);\n+    mfiHdgs.forEach(function(d,i) {\n+      mfiTableHeadings.push({"data": d, "title": d});\n+      mfiEditorData.push({"label" : d, "name" : d});\n+    });\n+\n+    for (var i = 2, j = mfiHdgs.length - 2; i<j; i++){\n+      mfiTargets.push(i);\n+    }\n+\n+    $(\'#mfiDiv\').html(mfiTableHTML);\n+    var editor = new $.fn.dataTable.Editor({\n+        ajax: handleSubmit,\n+        table: \'#mfitable\',\n+        fields: mfiEditorData,\n+        idSrc: \'Population\'\n+    });\n+    $(\'#mfitable\').on(\'click\', \'tbody td:first-child\', function (e) {\n+      editor.bubble(this);\n+    });\n+    var mfiTable = $(\'#mfitable\').DataTable({\n+        columns: mfiTableHeadings,\n+        data: mfiTableData,\n+        order: [[ popcol, "asc" ]],\n+        pageLength: 25,\n+        dom: \'<"top"Bi>t<"bottom"lp><"clear">\',\n+        columnDefs: [{\n+            targets: mfiTargets,\n+            className: "dt-body-right",\n+            render: function(data, type, row){\n+              return parseFloat(data).toFixed(2);\n+            }\n+          }, {\n+            targets: [mfiHdgs.length - 2],\n+            className: "dt-body-right"\n+          }, {\n+            targets: [mfiHdgs.length-1],\n+            className: "dt-body-right",\n+            render: function(data, type, row){\n+                    return parseFloat(data).toFixed(2) + \'%\';\n+            }\n+          }\n+        ],\n+        buttons: [\n+            \'copy\', \'pdfHtml5\',\'csvHtml5\', \'colvis\'\n+        ],\n+        colReorder: {fixedColumnsLeft:1},\n+        select: true\n+    });\n+    editor.on(\'preSubmit\', function(e, object, action){\n+      var data = object.data;\n+      var key = Object.keys(data)[0];\n+      var count = object.data[key][\'Comment\'];\n+      mfiTableData.forEach(function(d) {\n+        if (d.Population === key) {\n+          d.Comment = count;\n+          newNames[parseInt(d.Population)] = count;\n+        }\n+      });\n+      tableContent = $.extend(true, [], mfiTableData);\n+    });\n+  });\n+};\n+\n+var displayOverviewPlot = function() {\n+  var url = "flow.overview";\n+  $.ajax({\n+    url: url,\n+    dataType: "text",\n+    success: function(data) {\n+      updateOverviewPlotDispla'..b'l: mfi_url,\n+        dataType: "text",\n+        success: function(mfi_text) {\n+          scatterData3DMFI = new processMFI(mfi_text);\n+          scatterData3D = new processData(text);\n+          displayScatterToolbar3D();\n+          displayScatterPopulation3D();\n+          processScatterData3D();\n+          processScatterData3DMFI();\n+          displayScatterPlot3D();\n+          $(window).on(\'resize\',function() {\n+            waitForFinalEvent(function() {\n+              processScatterData3D();\n+              displayScatterPlot3D();\n+            }, 500, "resize3D");\n+          });\n+        }\n+      });\n+    }\n+  });\n+};\n+\n+var displayMFIBoxplot = function() {\n+  $.ajax({\n+    url: bpurl,\n+    dataType: "json",\n+    success: function(data) {\n+      configbp = {\n+        displaybutton : \'#updateDisplaybp\',\n+        toggledisplayj : \'#changeDisplay\',\n+        toggledisplay : \'changeDisplay\',\n+        popSelectj : \'.popSelectbp\',\n+        plotdivj : \'#plotDivbp\',\n+        csdata : data,\n+        plotdiv : \'plotDivbp\',\n+        type : \'boxplot\',\n+        table : \'#popTablebp tbody\',\n+        popSelect : \'popSelectbp\',\n+        allMarkers : [],\n+        selectedMarkers: [],\n+        allPopulations : [],\n+        selectedPopulations : [],\n+        popSelectAll : \'#popSelectAllbp\',\n+        popSelectCheck: \'.popSelectbp:checked\',\n+        mrkrSelectAll : \'#mrkrSelectAll\',\n+        mrkrSelectCheck: \'.mrkrSelect:checked\',\n+        mrkrSelect : \'mrkrSelect\',\n+        mtable : \'#mrkrTable tbody\',\n+        mrkrSelectj: \'.mrkrSelect\',\n+        displayvalues: \'#displayLabels\',\n+        displayMFI: \'#displayMFI\',\n+        view: \'p\',\n+        mrkrNames :  Object.keys(data.mfi)\n+      };\n+      displayToolbar(configbp);\n+    }\n+  });\n+};\n+\n+function processData(text) {\n+  var data = d3.tsv.parseRows(text).map(function(row) {\n+    return row.map(function(value) {\n+      if (isNaN(value)) {\n+        return value;\n+      }\n+      return +value;\n+    });\n+  });\n+\n+  this.columnHeadings = data.shift();\n+  this.columnHeadings.pop();\n+  var popCol = data[0].length - 1;\n+  var p = data.map(function(value,index) {\n+    return parseInt(value[popCol]);\n+  });\n+\n+  var populations = {};\n+  for (var i = 0; i < p.length; i++) {\n+    if (populations[p[i]] === undefined) {\n+      populations[p[i]] = 1;\n+    } else {\n+      populations[p[i]] = populations[p[i]] + 1;\n+    }\n+  }\n+\n+  this.popCol = popCol;\n+  this.populations = d3.set(p).values();\n+  this.populations = this.populations.map(function(value,index) {\n+    return parseInt(value);\n+  });\n+  this.selectedPopulations = this.populations;\n+  this.percent = this.populations.map(function(value,index) {\n+    return Math.floor(populations[value] * 10000.0 / data.length) / 100.0;\n+  });\n+\n+  this.data = data;\n+  this.m1 = 0;\n+  this.m2 = 1;\n+  this.m3 = 2;\n+  this.view = 1;\n+};\n+\n+function processMFI(text) {\n+  data = d3.tsv.parseRows(text).map(function(row) {\n+    return row.map(function(value) {\n+      if (isNaN(value)) {\n+        return value;\n+      }\n+      return +value;\n+    });\n+  });\n+\n+  // Get the Headings Row, then remove the Count, Percentage and\n+  // Population headings\n+  this.columnHeadings = data.shift();\n+  this.columnHeadings.pop();\n+  this.columnHeadings.pop();\n+  this.columnHeadings.pop();\n+\n+  var popCol = data[0].length -1;\n+  var pop = data.map(function(value,index) {\n+    return parseInt(value[popCol]);\n+  });\n+\n+  var perCol = data[0].length -2;\n+  var per = data.map(function(value,index) {\n+    return parseFloat(value[perCol]);\n+  });\n+\n+  var countCol = data[0].length -3;\n+  var count = data.map(function(value,index) {\n+    return parseInt(value[countCol]);\n+  });\n+\n+  this.popCol = popCol;\n+  this.populations = pop;\n+  this.selectedPopulations = pop;\n+  this.percent = per;\n+  this.counts = count;\n+\n+  var l = data[0].length;\n+  this.data = data.map(function(row) {\n+    return row.splice(0,countCol);\n+  });\n+  this.poplist = pop;\n+  this.m1 = 0;\n+  this.m2 = 1;\n+  this.m3 = 2;\n+};\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/flowtools/js/parallelCoordinates.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/static/flowtools/js/parallelCoordinates.js Mon Feb 27 12:54:37 2017 -0500
[
b'@@ -0,0 +1,455 @@\n+// Copyright (c) 2016 Northrop Grumman.\n+// All rights reserved.\n+/*\n+ * Initialize variables for parallelCoordinates display\n+*/\n+var pCoordApp = pCoordApp || {};\n+pCoordApp.allPopulations = [];\n+pCoordApp.selectedPopulations = [];\n+pCoordApp.origData;\n+pCoordApp.flowData;\n+pCoordApp.headers = [];\n+pCoordApp.foreground;\n+pCoordApp.background;\n+pCoordApp.populations = [];\n+pCoordApp.allLines;\n+pCoordApp.lines = [];\n+pCoordApp.selectedLines = [];\n+\n+var displayAll = function() {\n+  displayParallelPlot();\n+}\n+/*\n+ * Display the Population Legend\n+*/\n+var displayPopTable = function() {\n+  $(\'#popTable tbody\').empty();\n+  pCoordApp.origData.map(function(d,index) {\n+    $(\'#popTable tbody\')\n+        .append(\'<tr><td align="center"><input type="checkbox" \'\n+            + \'id="pop\' + d.Population + \'" \'\n+            + \'checked class="popSelect" value=\' + index + \'/></td>\'\n+            + \'<td title="\' + newNames[d.Population] + \'">\'\n+            + newNames[d.Population]\n+            + \'</td><td><span style="background-color:\'\n+            + color_palette[0][index + 1][0]\n+            + \'">&nbsp;&nbsp;&nbsp;</span></td>\'\n+            + \'<td>\' + d.Percentage + \'</td></tr>\');\n+  });\n+\n+  $(\'#popSelectAll\').click(function() {\n+    var checkAll = $("#popSelectAll").prop(\'checked\');\n+    if (checkAll) {\n+      $(".popSelect").prop("checked", true);\n+      for (var i = 0; i < pCoordApp.allLines; i ++){\n+        pCoordApp.selectedLines.push(i);\n+        pCoordApp.lines.push(i);\n+      }\n+    } else {\n+      $(".popSelect").prop("checked", false);\n+      pCoordApp.selectedLines = [];\n+      pCoordApp.lines = [];\n+    }\n+\n+    pCoordApp.selectedPopulations = [];\n+    $(\'.popSelect\').each(function() {\n+      if (this.checked) {\n+        pCoordApp.selectedPopulations.push(parseInt(this.value));\n+      }\n+    });\n+    displayTableGrid();\n+    if (checkAll) {\n+      displayParallelPlot();\n+    } else {\n+      updateParallelForeground();\n+    }\n+  });\n+\n+  $(\'.popSelect\').click(function() {\n+    if ($(\'.popSelect\').length == $(".popSelect:checked").length) {\n+        $(\'#popSelectAll\').prop("checked",true);\n+    } else {\n+        $(\'#popSelectAll\').prop("checked",false);\n+    }\n+\n+    pCoordApp.selectedPopulations = [];\n+    $(\'.popSelect\').each(function() {\n+      if (this.checked) {\n+        pCoordApp.selectedPopulations.push(parseInt(this.value));\n+      }\n+    });\n+\n+    pCoordApp.selectedLines = [];\n+    pCoordApp.lines = [];\n+\n+    pCoordApp.origData.forEach(function(d,idx){\n+      if ($.inArray(pCoordApp.populations.indexOf(d.Population), pCoordApp.selectedPopulations) > -1) {\n+        pCoordApp.selectedLines.push(idx);\n+        pCoordApp.lines.push(idx);\n+      }\n+    });\n+\n+    displayTableGrid();\n+    updateParallelForeground();\n+  });\n+  updatePopTable();\n+};\n+\n+var updatePopTable = function() {\n+  $(\'.popSelect\').each(function() {\n+    var pop = parseInt(this.value),\n+        selectedPops = pCoordApp.origData.map(function(d){\n+      if ($.inArray(d.idx, pCoordApp.selectedLines) > -1){\n+        return pCoordApp.populations.indexOf(d.Population);\n+      }\n+    });\n+    if ($.inArray(pop,selectedPops) > -1) {\n+      this.checked = true;\n+    } else {\n+      this.checked = false;\n+    }\n+  });\n+};\n+\n+/*\n+ * Display the table under the graph\n+*/\n+var displayTableGrid = function() {\n+  var updatedData = [],\n+      displayData = [],\n+      colNames = [],\n+      pctargets = [],\n+      colTable = [],\n+      tableHTML = [],\n+      textCol = [],\n+      colOrder = [],\n+      targetCol = 0;\n+\n+  $("#tableDiv").empty();\n+  updatedData = $.extend(true, [], tableContent);\n+  updatedData.forEach(function(d, idx){d.idx = idx});\n+  displayData = updatedData.filter(function(d, index) {\n+    if ($.inArray(index,pCoordApp.selectedLines) > -1) {\n+      return d;\n+    }\n+  });\n+\n+  targetCol = pCoordApp.headers.length - 2;\n+  pCoordApp.headers.forEach(function(d,i){\n+    colTable.push("<th>" + d + "</th>");\n+    colNames.push({"data":d});\n+ '..b'rag()\n+      .origin(function(d) { return {x: x(d)}; })\n+      .on("dragstart", function(d) {\n+        dragging[d] = x(d);\n+        pCoordApp.background.attr("visibility", "hidden");\n+      })\n+      .on("drag", function(d) {\n+        dragging[d] = Math.min(width, Math.max(0, d3.event.x));\n+        pCoordApp.foreground.attr("d", path);\n+        dimensions.sort(function(a, b) {\n+          return position(a) - position(b);\n+        });\n+        x.domain(dimensions);\n+        g.attr("transform", function(d) {\n+          return "translate(" + position(d) + ")";\n+        });\n+      })\n+      .on("dragend", function(d) {\n+        delete dragging[d];\n+        transition(d3.select(this))\n+            .attr("transform", "translate(" + x(d) + ")");\n+        transition(pCoordApp.foreground)\n+            .attr("d", path);\n+        pCoordApp.background.attr("d", path)\n+          .transition()\n+            .delay(500)\n+            .duration(0)\n+            .attr("visibility", null);\n+    }));\n+\n+  // Add an axis and title.\n+  g.append("g")\n+      .attr("class", "axis")\n+      .each(function(d) {\n+        d3.select(this).call(axis.scale(y[d]));\n+      });\n+  g.append("g")\n+      .attr("class", "xlabel")\n+    .append("text")\n+      .style("text-anchor", "middle")\n+      .attr("y", -9)\n+      .text(function(d) { return d; });\n+\n+  // Add and store a brush for each axis.\n+  g.append("g")\n+      .attr("class", "brush")\n+      .each(function(d) { d3.select(this).call(y[d].brush = d3.svg.brush().y(y[d]).on("brush", brush)); })\n+    .selectAll("rect")\n+      .attr("x", -8)\n+      .attr("width", 16);\n+\n+  // Control line opacity.\n+  $(\'#pcline_opacity\').on(\'change\', (function() {\n+    var val = $(this).val();\n+    $(\'#plotDiv .foreground path\').css(\'stroke-opacity\', val.toString());\n+    $(\'#pcopacity\').html((Math.round(val*10000)/100) + "%");\n+  }));\n+};\n+\n+var updateParallelForeground = function() {\n+  pCoordApp.foreground[0].map(function(d) {\n+    var ln = parseInt(d[\'__data__\'][\'idx\']);\n+    if ($.inArray(ln, pCoordApp.selectedLines) < 0){\n+      d.style.display = "none";\n+    } else {\n+      d.style.display = null;\n+    }\n+  });\n+};\n+\n+/*\n+ * Retrieve the data, then call display functions\n+*/\n+var displayParallelCoordinates = function() {\n+  pCoordApp.origData = $.extend(true,[], tableContent);\n+  pCoordApp.headers = Object.keys(pCoordApp.origData[0]);\n+  pCoordApp.origData.forEach(function(d,idx) {\n+    d.idx = idx;\n+    pCoordApp.selectedLines.push(idx);\n+    pCoordApp.lines.push(idx);\n+    if (!pCoordApp.populations.includes(d.Population)){\n+      pCoordApp.populations.push(d.Population);\n+    }\n+  });\n+  /*\n+   * For the plot use only the MFI information\n+   * for each populations. Store in flowData\n+  */\n+  pCoordApp.flowData = $.extend(true,[],tableContent);\n+  pCoordApp.flowData.forEach(function(d, idx) {\n+    delete d[\'Population\'];\n+    delete d[\'Count\'];\n+    delete d[\'Percentage\'];\n+    delete d.Comment;\n+    pCoordApp.allPopulations.push(idx);\n+    pCoordApp.selectedPopulations.push(idx);\n+    pCoordApp.selectedLines.push(idx);\n+    pCoordApp.lines.push(idx);\n+  });\n+\n+  pCoordApp.allLines = pCoordApp.flowData.length;\n+  displayPopTable();\n+  displayTableGrid();\n+  displayParallelPlot();\n+\n+  $("#resetPCoordDisplay").on("click",function() {\n+    for (var i = 0; i < pCoordApp.allLines; i++) {\n+      pCoordApp.allPopulations.push(i);\n+      pCoordApp.selectedPopulations.push(i);\n+      pCoordApp.selectedLines.push(i);\n+      pCoordApp.lines.push(i);\n+    }\n+    $("#popSelectAll").prop(\'checked\',true);\n+    $(".popSelect").prop("checked",true);\n+\n+    var opcty = ".8";\n+    $(\'#plotDiv .foreground path\').css(\'stroke-opacity\', opcty);\n+    $(\'#pcopacity\').html("80%");\n+    $(\'#pcline_opacity\').val(0.8);\n+\n+    displayPopTable();\n+    displayTableGrid();\n+    displayParallelPlot();\n+  });\n+\n+  $(window).on(\'resize\',function() {\n+    waitForFinalEvent(function() {\n+      displayAll();\n+    }, 500, "resizeParallelCoordinates");\n+  });\n+}\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/flowtools/js/profileCLs.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/static/flowtools/js/profileCLs.js Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,85 @@
+// Copyright (c) 2016 Northrop Grumman.
+// All rights reserved.
+
+var cl_table = './CLprofiles.txt';
+var scores_table = './scores.txt';
+
+var displayCLTable = function(){
+  d3.text(cl_table, function(error, data){
+    var clHdgs = [],
+        clHTML = '<table id="cltable" class="display compact" cellspacing="0" width="100%"/>',
+        clTableData = [],
+        clHeadings = [];
+
+    if (error){
+      alert("Problem retrieving data");
+      return;
+    }
+    clHdgs = data.split("\n")[0].split("\t");
+    data = d3.tsv.parse(data);
+    clTableData = $.extend(true, [], data);
+
+    clHdgs.forEach(function(d,i){
+      clHeadings.push({"data" : d, "title" : d});
+    });
+
+    $('#clprofiles').html(clHTML);
+    var clTable = $('#cltable').DataTable({
+      columns: clHeadings,
+      dom: '<"top"Bi>t<"bottom"lp><"clear">',
+      pageLength: 25,
+      order: [[ 0, "asc" ]],
+      data: clTableData,
+      buttons: [
+        'copy', 'pdfHtml5','csvHtml5'
+      ],
+      columnDefs: [
+        {
+          targets: [0,2,3],
+          className: "smallcols"
+        },
+        {
+          targets: 4,
+          className: "dt-body-left"
+        },
+        {
+          targets: [5,6],
+          className: "firstcol"
+      }]
+    });
+  });
+};
+
+var displayScoresTable = function(){
+  d3.text(scores_table, function(error, data){
+    var scoreHTML = '<table id="scoretable" class="display compact" cellspacing="0" width="100%"/>',
+        scoreHdgs = [],
+        scoreTableData = [],
+        scoreHeadings = [];
+    if (error){
+      alert("Problem retrieving data");
+      return;
+    }
+    scoreHdgs = data.split("\n")[0].split("\t");
+    data = d3.tsv.parse(data);
+
+    $('#scores').html(scoreHTML);
+
+    scoreTableData = $.extend(true, [], data);
+
+    scoreHdgs.forEach(function(d,i){
+      scoreHeadings.push({"data" : d, "title" : d});
+    });
+
+    var scoreTable = $('#scoretable').DataTable({
+      columns: scoreHeadings,
+      pageLength: 25,
+      order: [[ 0, "asc" ]],
+      dom: '<"top"Bi>t<"bottom"lp><"clear">',
+      data: scoreTableData,
+      buttons: [
+        'copy', 'pdfHtml5','csvHtml5'
+      ],
+    });
+  });
+};
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/flowtools/js/scatter2D.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/static/flowtools/js/scatter2D.js Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,208 @@
+// Copyright (c) 2016 Northrop Grumman.
+// All rights reserved.
+
+var updateScatter2D = function(){
+  scatterData2D['selectedPopulations'] = [];
+  scatterDataMFI['selectedPopulations'] = [];
+  $('.pop2D').each(function() {
+    if (this.checked) {
+      scatterData2D['selectedPopulations'].push(parseInt(this.value));
+      scatterDataMFI['selectedPopulations'].push(parseInt(this.value));
+    }
+  });
+  processScatterData2D();
+  processScatterDataMFI2D();
+  displayScatterPlot2D();
+};
+
+var processScatterData2D = function() {
+  var xData = [],
+      yData = [],
+      popData = [],
+      col1 = [],
+      col2 = [],
+      pop = [],
+      min = Number.MAX_VALUE,
+      max = Number.MIN_VALUE;
+
+  min = d3.min(scatterData2D['data'], function(array) {
+    return d3.min(array);
+  });
+  max = d3.max(scatterData2D['data'], function(array) {
+    return d3.max(array);
+  });
+  scatterData2D['min'] = 0;
+  scatterData2D['max'] = max;
+
+  col1 = scatterData2D['data'].map(function(value,index) {
+    return value[scatterData2D['m1']];
+  });
+  col2 = scatterData2D['data'].map(function(value,index) {
+    return value[scatterData2D['m2']];
+  });
+  pop = scatterData2D['data'].map(function(value,index) {
+    return value[scatterData2D['popCol']];
+  });
+
+  for (var i = 0, j = col1.length; i < j; i++) {
+    if (scatterData2D['selectedPopulations'].indexOf(pop[i]) >= 0) {
+      xData.push(col1[i]);
+      yData.push(col2[i]);
+      popData.push(pop[i]);
+    }
+  }
+
+  scatterData2D['popColors'] = popData.map(function(value,index) {
+      return color_palette[0][value][0];
+  });
+  scatterData2D['xData'] = xData;
+  scatterData2D['yData'] = yData;
+  scatterData2D['popData'] = popData;
+  return scatterData2D;
+};
+
+var displayScatterToolbar2D = function() {
+  $("#xAxisMarker2D").select2();
+  $("#yAxisMarker2D").select2();
+  $("#view2D").select2();
+
+  scatterData2D['columnHeadings'].map(function(value,index) {
+    $('#xAxisMarker2D')
+        .append($("<option></option>")
+        .attr("value",index)
+        .text(value));
+
+    $('#yAxisMarker2D')
+        .append($("<option></option>")
+        .attr("value",index)
+        .text(value));
+  });
+
+  $('#xAxisMarker2D').select2("val",0);
+  $('#yAxisMarker2D').select2("val",1);
+
+  $("#xAxisMarker2D").on("change",function(e) {
+    var m1 = $("#xAxisMarker2D").select2("val");
+    scatterData2D['m1'] = m1;
+    scatterDataMFI['m1'] = m1;
+    updateScatter2D();
+  });
+  $("#yAxisMarker2D").on("change",function(e) {
+    var m2 = $("#yAxisMarker2D").select2("val");
+    scatterData2D['m2'] = m2;
+    scatterDataMFI['m2'] = m2;
+    updateScatter2D();
+  });
+  $("#view2D").on("change",function(e) {
+    var view = $("#view2D").select2("val");
+    scatterData2D['view'] = view;
+    updateScatter2D();
+  });
+
+  $("#updateDisplay2D").on("click",function() {
+    $(".pop2D").prop("checked", true);
+    $("#selectall2D").prop('checked', true);
+    updateScatter2D();
+  });
+};
+
+var displayScatterPopulation2D = function() {
+  $('#populationTable2D tbody').empty();
+  scatterData2D['populations'].map(function(value,index) {
+    $('#populationTable2D tbody')
+        .append('<tr><td align="center">'
+            + '<input type="checkbox" checked class="pop2D" value='
+            + value + '/></td><td title="' + newNames[value]
+            + '">' + newNames[value] + '</td>'
+            + '<td><span style="background-color:'
+            + color_palette[0][value][0] + '">&nbsp;&nbsp;&nbsp</span></td>'
+            + '<td>' + scatterData2D['percent'][value - 1] + '</td></tr>');
+  });
+
+  $('#selectall2D').click(function() {
+    var checkAll = $("#selectall2D").prop('checked');
+    if (checkAll) {
+      $(".pop2D").prop("checked", true);
+    } else {
+      $(".pop2D").prop("checked", false);
+    }
+    updateScatter2D();
+  });
+
+  $('.pop2D').click(function() {
+    if ($('.pop2D').length == $(".pop2D:checked").length) {
+      $('#selectall2D').prop("checked",true);
+    } else {
+      $('#selectall2D').prop("checked",false);
+    }
+    updateScatter2D();
+  });
+
+  $('.pop2D').each(function() {
+    var selectedpop2D = parseInt(this.value);
+    if ($.inArray(selectedpop2D,scatterData2D['selectedPopulations']) > -1) {
+      this.checked = true;
+    } else {
+      this.checked = false;
+    }
+  });
+};
+
+var displayScatterPlot2D = function() {
+  var h = $(window).height() - 200,
+      w = $("#scatterPlotDiv2D").width(),
+      xtitle = scatterData2D['columnHeadings'][scatterData2D['m1']],
+      ytitle = scatterData2D['columnHeadings'][scatterData2D['m2']],
+      view = scatterData2D['view'],
+      layout = {},
+      traces = [];
+
+  $("#scatterPlotDiv2D").empty();
+  $("#scatterPlotDiv2D").height(h);
+  if ( view == 1 || view == 2) {
+    var trace1 = {
+        x: scatterData2D['xData'],
+        y: scatterData2D['yData'],
+        mode: 'markers',
+        opacity: .75,
+        hoverinfo: 'none',
+        marker: {
+          size: 2,
+          color: scatterData2D['popColors']
+        },
+        type: 'scatter'
+    };
+    traces.push(trace1);
+  }
+  if ( view == 1 || view == 3) {
+    var trace2 = {
+        x: scatterDataMFI['xData'],
+        y: scatterDataMFI['yData'],
+        mode: 'markers',
+        opacity: 1.0,
+        hoverinfo: "x+y",
+        marker: {
+          symbol: 128,
+          size: 8,
+          color: scatterDataMFI['popColors']
+        },
+        type: 'scatter'
+    };
+    traces.push(trace2);
+  }
+
+  layout = {
+      title: '',
+      showlegend: false,
+      xaxis: {
+          range: [0,scatterData2D['max']],
+          title: xtitle
+      },
+      yaxis: {
+          range: [0,scatterData2D['max']],
+          title: ytitle
+      }
+  };
+
+  Plotly.newPlot('scatterPlotDiv2D', traces, layout);
+};
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/flowtools/js/scatter3D.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/static/flowtools/js/scatter3D.js Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,267 @@
+// Copyright (c) 2016 Northrop Grumman.
+// All rights reserved.
+
+var updateScatter3D = function(){
+  scatterData3D['selectedPopulations'] = [];
+  scatterData3DMFI['selectedPopulations'] = [];
+  $('.pop3D').each(function() {
+    if (this.checked) {
+      scatterData3D['selectedPopulations'].push(parseInt(this.value));
+      scatterData3DMFI['selectedPopulations'].push(parseInt(this.value));
+    }
+  });
+  processScatterData3D();
+  processScatterData3DMFI();
+  displayScatterPlot3D();
+};
+
+var processScatterData3D = function() {
+  var xData = [],
+      yData = [],
+      zData = [],
+      popData = [],
+      pop = [],
+      col1 = [],
+      col2 = [],
+      col3 = [],
+      min = Number.MAX_VALUE,
+      max = Number.MIN_VALUE;
+
+  min = d3.min(scatterData3D['data'], function(array) {
+    return d3.min(array);
+  });
+  max = d3.max(scatterData3D['data'], function(array) {
+    return d3.max(array);
+  });
+  scatterData3D['min'] = 0;
+  scatterData3D['max'] = max;
+
+  col1 = scatterData3D['data'].map(function(value,index) {
+    return value[scatterData3D['m1']];
+  });
+  col2 = scatterData3D['data'].map(function(value,index) {
+    return value[scatterData3D['m2']];
+  });
+  col3 = scatterData3D['data'].map(function(value,index) {
+    return value[scatterData3D['m3']];
+  });
+  pop = scatterData3D['data'].map(function(value,index) {
+    return value[scatterData3D['popCol']];
+  });
+
+  for (var i = 0, j = col1.length; i < j; i++) {
+    if (scatterData3D['selectedPopulations'].indexOf(pop[i]) >= 0) {
+      xData.push(col1[i]);
+      yData.push(col2[i]);
+      zData.push(col3[i]);
+      popData.push(pop[i]);
+    }
+  }
+
+  scatterData3D['popColors'] = popData.map(function(value,index) {
+    return color_palette[0][value][0];
+  });
+  scatterData3D['xData'] = xData;
+  scatterData3D['yData'] = yData;
+  scatterData3D['zData'] = zData;
+  scatterData3D['popData'] = popData;
+  return scatterData3D;
+};
+
+var displayScatterToolbar3D = function() {
+  $("#xAxisMarker3D").select2();
+  $("#yAxisMarker3D").select2();
+  $("#zAxisMarker3D").select2();
+  $("#view3D").select2();
+
+  scatterData3D['columnHeadings'].map(function(value,index) {
+    $('#xAxisMarker3D')
+        .append($("<option></option>")
+        .attr("value",index)
+        .text(value));
+
+    $('#yAxisMarker3D')
+        .append($("<option></option>")
+        .attr("value",index)
+        .text(value));
+
+    $('#zAxisMarker3D')
+        .append($("<option></option>")
+        .attr("value",index)
+        .text(value));
+  });
+
+  $('#xAxisMarker3D').select2("val",0);
+  $('#yAxisMarker3D').select2("val",1);
+  $('#zAxisMarker3D').select2("val",2);
+
+  $("#xAxisMarker3D").on("change",function(e) {
+    var m1 = $("#xAxisMarker3D").select2("val");
+    scatterData3D['m1'] = m1;
+    scatterData3DMFI['m1'] = m1;
+    updateScatter3D();
+  });
+  $("#yAxisMarker3D").on("change",function(e) {
+    var m2 = $("#yAxisMarker3D").select2("val");
+    scatterData3D['m2'] = m2;
+    scatterData3DMFI['m2'] = m2;
+    updateScatter3D();
+  });
+  $("#zAxisMarker3D").on("change",function(e) {
+    var m3 = $("#zAxisMarker3D").select2("val");
+    scatterData3D['m3'] = m3;
+    scatterData3DMFI['m3'] = m3;
+    updateScatter3D();
+  });
+
+  $("#view3D").on("change",function(e) {
+    var view = $("#view3D").select2("val");
+    scatterData3D['view'] = view;
+    updateScatter3D();
+  });
+
+  $("#updateDisplay3D").on("click",function() {
+    $(".pop3D").prop("checked", true);
+    $("#selectall3D").prop('checked', true);
+    updateScatter3D();
+  });
+};
+
+var displayScatterPopulation3D = function() {
+  $("#populationTable3D tbody").empty();
+  scatterData3D['populations'].map(function(value) {
+    $('#populationTable3D tbody')
+        .append('<tr><td align="center">'
+                + '<input type="checkbox" checked class="pop3D" value='
+                + value + '/></td><td title="'+ newNames[value]
+                + '">'+ newNames[value] + '</td>'
+                + '<td><span style="background-color:'
+                + color_palette[0][value][0] + '">&nbsp;&nbsp;&nbsp</span></td>'
+                + '<td>' + scatterData3D['percent'][value - 1] + '</td></tr>');
+  });
+
+  $('#selectall3D').click(function() {
+    var checkAll = $("#selectall3D").prop('checked');
+    if (checkAll) {
+      $(".pop3D").prop("checked", true);
+    } else {
+      $(".pop3D").prop("checked", false);
+    }
+    updateScatter3D();
+  });
+  $('.pop3D').click(function() {
+    if ($('.pop3D').length == $(".pop3D:checked").length) {
+      $('#selectall3D').prop("checked",true);
+    } else {
+      $('#selectall3D').prop("checked",false);
+    }
+    updateScatter3D();
+  });
+
+  $('.pop3D').each(function() {
+    var selectedpop3D = parseInt(this.value);
+    if ($.inArray(selectedpop3D,scatterData3D['selectedPopulations']) > -1) {
+      this.checked = true;
+    } else {
+      this.checked = false;
+    }
+  });
+};
+
+var displayScatterPlot3D = function() {
+  var h = $(window).height() - 200,
+      w = $("#scatterPlotDiv3D").width(),
+      xtitle = scatterData3D['columnHeadings'][scatterData3D['m1']],
+      ytitle = scatterData3D['columnHeadings'][scatterData3D['m2']],
+      ztitle = scatterData3D['columnHeadings'][scatterData3D['m3']],
+      view = scatterData3D['view'],
+      traces = [],
+      layout = {};
+
+  $("#scatterPlotDiv3D").empty();
+  $("#scatterPlotDiv3D").height(h);
+
+  if ( view == 1 || view == 2 ) {
+    var trace1 = {
+        x: scatterData3D['xData'],
+        y: scatterData3D['yData'],
+        z: scatterData3D['zData'],
+        mode: 'markers',
+        opacity: .75,
+        hoverinfo: "none",
+        marker: {
+          size: 2,
+          color: scatterData3D['popColors']
+        },
+        type: 'scatter3d'
+    };
+    traces.push(trace1);
+  };
+
+  if ( view == 1 || view == 3) {
+    var trace2 = {
+        x: scatterData3DMFI['xData'],
+        y: scatterData3DMFI['yData'],
+        z: scatterData3DMFI['zData'],
+        mode: 'markers',
+        opacity: 1.0,
+        hoverinfo: "x+y+z",
+        marker: {
+          symbol: "circle-open",
+          size: 8,
+          color: scatterData3DMFI['popColors']
+        },
+        type: 'scatter3d'
+    };
+    traces.push(trace2);
+  }
+
+  layout = {
+      title: '',
+      showlegend: false,
+      scene: {
+        aspectratio: {
+          x: 1,
+          y: 1,
+          z: 1
+        },
+        camera: {
+          center: {
+            x: 0,
+            y: 0,
+            z: 0
+          },
+          eye: {
+            x: 1.25,
+            y: 1.25,
+            z: 1.25
+          },
+          up: {
+            x: 0,
+            y: 0,
+            z: 1
+          }
+        },
+        xaxis: {
+          type: 'linear',
+          title: xtitle,
+          range: [0, scatterData3D['max']],
+          zeroline: false
+        },
+        yaxis: {
+          type: 'linear',
+          title: ytitle,
+          range: [0, scatterData3D['max']],
+          zeroline: false
+        },
+        zaxis: {
+          type: 'linear',
+          title: ztitle,
+          range: [0, scatterData3D['max']],
+          zeroline: false
+        }
+      }
+  };
+
+  Plotly.newPlot('scatterPlotDiv3D', traces, layout);
+};
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/flowtools/js/scatterMFI.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/static/flowtools/js/scatterMFI.js Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,83 @@
+// Copyright (c) 2016 Northrop Grumman.
+// All rights reserved.
+
+var processScatterDataMFI2D = function() {
+  var xData = [],
+      yData = [],
+      popData = [],
+      col1 = [],
+      col2 = [],
+      pop = scatterDataMFI['poplist'];
+
+  col1 = scatterDataMFI['data'].map(function(value,index) {
+    return value[scatterDataMFI['m1']];
+  });
+  col2 = scatterDataMFI['data'].map(function(value,index) {
+    return value[scatterDataMFI['m2']];
+  });
+  for (var i = 0, j=col1.length; i < j; i++) {
+    if (scatterDataMFI['selectedPopulations'].indexOf(pop[i]) >= 0) {
+      xData.push(col1[i]);
+      yData.push(col2[i]);
+      popData.push(pop[i]);
+    }
+  }
+  scatterDataMFI['popColors'] = popData.map(function(value,index) {
+    return color_palette[0][value][0];
+  });
+  scatterDataMFI['xData'] = xData;
+  scatterDataMFI['yData'] = yData;
+  scatterDataMFI['popData'] = popData;
+  return scatterDataMFI;
+};
+
+var processScatterData3DMFI = function() {
+  var xData = [],
+      yData = [],
+      zData = [],
+      col1 = [],
+      col2 = [],
+      col3 = [],
+      pop = [],
+      min = Number.MAX_VALUE,
+      max = Number.MIN_VALUE,
+      popData = [];
+
+  min = d3.min(scatterData3DMFI['data'], function(array) {
+    return d3.min(array);
+  });
+  max = d3.max(scatterData3DMFI['data'], function(array) {
+    return d3.max(array);
+  });
+  scatterData3DMFI['min'] = 0;
+  scatterData3DMFI['max'] = max;
+
+  col1 = scatterData3DMFI['data'].map(function(value,index) {
+    return value[scatterData3DMFI['m1']];
+  });
+  col2 = scatterData3DMFI['data'].map(function(value,index) {
+    return value[scatterData3DMFI['m2']];
+  });
+  col3 = scatterData3DMFI['data'].map(function(value,index) {
+    return value[scatterData3DMFI['m3']];
+  });
+  pop = scatterData3DMFI['poplist'];
+
+  for (var i = 0, j = col1.length; i < j; i++) {
+    if (scatterData3DMFI['selectedPopulations'].indexOf(pop[i]) >= 0) {
+      xData.push(col1[i]);
+      yData.push(col2[i]);
+      zData.push(col3[i]);
+      popData.push(pop[i]);
+    }
+  }
+
+  scatterData3DMFI['popColors'] = popData.map(function(value,index) {
+    return color_palette[0][value][0];
+  });
+  scatterData3DMFI['xData'] = xData;
+  scatterData3DMFI['yData'] = yData;
+  scatterData3DMFI['zData'] = zData;
+  scatterData3DMFI['popData'] = popData;
+  return scatterData3DMFI;
+};
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/images/flowtools/bpflock.png
b
Binary file flow_overview/static/images/flowtools/bpflock.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/images/flowtools/edit_summary.png
b
Binary file flow_overview/static/images/flowtools/edit_summary.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/images/flowtools/overview.png
b
Binary file flow_overview/static/images/flowtools/overview.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/images/flowtools/pcflock.png
b
Binary file flow_overview/static/images/flowtools/pcflock.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/images/flowtools/profileCL_go.png
b
Binary file flow_overview/static/images/flowtools/profileCL_go.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/images/flowtools/scatter2D.png
b
Binary file flow_overview/static/images/flowtools/scatter2D.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/images/flowtools/scatter3D.png
b
Binary file flow_overview/static/images/flowtools/scatter3D.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/static/images/flowtools/summary.png
b
Binary file flow_overview/static/images/flowtools/summary.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/templates/genOverview.template
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/templates/genOverview.template Mon Feb 27 12:54:37 2017 -0500
[
b'@@ -0,0 +1,281 @@\n+<html>\n+<head>\n+<title>Flow Overview</title>\n+<link rel="stylesheet" href="/static/flowtools/bootstrap/css/bootstrap.css"/>\n+<link rel="stylesheet" href="/static/flowtools/select2/select2.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/css/parallelCoordinates.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/datatables.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/Buttons-1.1.2/css/buttons.dataTables.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/Select-1.1.2/css/select.dataTables.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/Editor-1.5.6/css/editor.dataTables.min.css"/>\n+<script src="/static/flowtools/jquery-1.11.3.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/bootstrap/js/bootstrap.js" type="text/javascript"></script>\n+<script src="/static/flowtools/select2/select2.full.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/d3/d3.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/plotly-latest.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/datatables/datatables.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/datatables/Editor-1.5.6/js/dataTables.editor.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/color_palette.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/overview.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/scatter2D.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/scatter3D.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/scatterMFI.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/parallelCoordinates.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/boxplotsFlow.js" type="text/javascript"></script>\n+\n+<style>\n+#input{font-family:Calibri,Arial}\n+table.dataTable tbody td.dt-body-right {\n+    text-align: right;\n+}\n+#div{padding:5px;width:150px;height:100px;text-align:center}\n+table{width:100%;border:0px solid;border-collapse:collapse;text-align:center;}\n+th{background-color:#3e6db0;color:#fff;padding:5px}\n+\n+</style>\n+</head>\n+\n+<body>\n+<div class="container-fluid">\n+<div class="row" style="padding-bottom:10px;min-height:500px;">\n+    <div  class="col-md-12">\n+            <ul class="nav nav-tabs tabs-main">\n+                <li class="homeTab active" data-value="mfi"><a href="#mfi" data-toggle="tab">MFI/Pop</a></li>\n+                <li class="homeTab" data-value="overviewPlot"><a href="#overviewPlot" data-toggle="tab">Overview Plot</a></li>\n+                <li class="homeTab" data-value="scatter2D"><a href="#scatter2D" data-toggle="tab">Scatter 2D</a></li>\n+                <li class="homeTab" data-value="scatter3D"><a href="#scatter3D" data-toggle="tab">Scatter 3D</a></li>\n+                <li class="homeTab" data-value="parallelCoordinates"><a href="#parallelCoordinates" data-toggle="tab">Parallel Coordinates</a></li>\n+                <li class="homeTab" data-value="stats"><a href="#boxplots" data-toggle="tab">Summary Statistics Boxplots</a></li>\n+            </ul>\n+\n+            <div class="tab-content">\n+                <div class="tab-pane active" id="mfi" style="min-height:500px;">\n+                    <div id="mfiDiv"></div>\n+                </div>\n+\n+                <div class="tab-pane" id="overviewPlot" style="min-height:500px;">\n+                    <div id="overviewPlotDiv">Overview</div>\n+                </div>\n+\n+                <div class="tab-pane" id="scatter2D" style="min-height:500px;">\n+                    <div id="toolbarDiv2D" class="col-md-12 chartDiv">\n+                    X Axis: <select id="xAxisMarker2D" style="width:150px;">\n+                            </select>\n+                    Y Axis: <select id="yAxisMarker2D" style="width:150px;">\n+                            </select>\n+               '..b'id="changeDisplay" class="igbtn">View per marker</button><br><br>\n+                          <div id="markerWarning" style="display:none;">\n+                            <div class="alert alert-info alert-dismissible fade in" role="alert">\n+                              <button type="button" class="close" data-dismiss="alert" aria-label="Close">\n+                                <span aria-hidden="true">&times;</span></button>\n+                                  Only 5 markers can be displayed at most.\n+                            </div>\n+                          </div>\n+                          <div id="outlierWarning" style="display:none;">\n+                            <div class="alert alert-info alert-dismissible fade in" role="alert">\n+                              <button type="button" class="close" data-dismiss="alert" aria-label="Close">\n+                                <span aria-hidden="true">&times;</span></button>\n+                                  The number of outliers is too large to display. Representation shows randomly downsampled outliers.\n+                            </div>\n+                          </div>\n+                        </div>\n+\n+                        <div id="plotDivbp" class="col-md-8" style="height:100%;"></div>\n+\n+                        <div id="popDivbp" class="col-md-2" style="height:100%;">\n+                            <button id="updateDisplaybp" class="igbtn">Reset Display</button>\n+                            <table id="popTablebp" class="table table-condensed table-bordered igtable">\n+                                <thead>\n+                                    <tr>\n+                                        <th><input type="checkbox" checked id="popSelectAllbp"/></th>\n+                                        <th>Pop. Names</th>\n+                                        <th>Color</th>\n+                                     </tr>\n+                                </thead>\n+                                <tbody>\n+                                </tbody>\n+                            </table>\n+                        </div>\n+                    </div>\n+                </div>\n+            </div>\n+        </div>\n+    </div>\n+</div>\n+\n+<script>\n+var mfiLoaded = false;\n+var populationLoaded = false;\n+var overviewPlotLoaded = false;\n+var scatter2DLoaded = false;\n+var scatter3DLoaded = false;\n+var parallelCoordinatesLoaded = false;\n+var bpLoaded = false;\n+\n+$().ready(function() {\n+    $(document).on(\'shown.bs.tab\',\'a[data-toggle="tab"]\', function(e) {\n+      var tab = e.target.getAttribute("href");\n+      if (tab == \'#mfi\') {\n+        if (mfiLoaded) {\n+            return true;\n+        }\n+        mfiLoaded = true;\n+        displayMFI();\n+      }\n+      if (tab == \'#overviewPlot\') {\n+        if (overviewPlotLoaded) {\n+            return true;\n+        }\n+        overviewPlotLoaded = true;\n+        displayOverviewPlot();\n+      }\n+      if (tab == \'#scatter2D\') {\n+        if (scatter2DLoaded) {\n+            displayScatterPopulation2D();\n+            return true;\n+        }\n+        scatter2DLoaded = true;\n+        displayScatter2D();\n+      }\n+      if (tab == \'#scatter3D\') {\n+        if (scatter3DLoaded) {\n+            displayScatterPopulation3D();\n+            return true;\n+        }\n+        scatter3DLoaded = true;\n+        displayScatter3D();\n+      }\n+      if (tab == \'#parallelCoordinates\') {\n+        if (parallelCoordinatesLoaded) {\n+            displayPopTable();\n+            displayTableGrid();\n+            return true;\n+        }\n+        parallelCoordinatesLoaded = true;\n+        displayParallelCoordinates();\n+      }\n+      if (tab == \'#boxplots\') {\n+        if (bpLoaded) {\n+            displayPopulationLegend(configbp);\n+            displayMarkerTable(configbp);\n+            updateBoxplot(configbp);\n+            return true;\n+        }\n+        bpLoaded = true;\n+        displayMFIBoxplot();\n+      }\n+    });\n+\n+    mfiLoaded = true;\n+    displayMFI();\n+});\n+</script>\n+</body>\n+</html>\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/templates/genOverviewCL.template
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/templates/genOverviewCL.template Mon Feb 27 12:54:37 2017 -0500
[
b'@@ -0,0 +1,299 @@\n+<html>\n+<head>\n+<title>Flow Overview</title>\n+<link rel="stylesheet" href="/static/flowtools/bootstrap/css/bootstrap.css"/>\n+<link rel="stylesheet" href="/static/flowtools/select2/select2.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/css/parallelCoordinates.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/datatables.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/css/flowCL.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/Buttons-1.1.2/css/buttons.dataTables.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/Select-1.1.2/css/select.dataTables.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/Editor-1.5.6/css/editor.dataTables.min.css"/>\n+<script src="/static/flowtools/jquery-1.11.3.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/bootstrap/js/bootstrap.js" type="text/javascript"></script>\n+<script src="/static/flowtools/select2/select2.full.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/d3/d3.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/plotly-latest.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/datatables/datatables.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/datatables/Editor-1.5.6/js/dataTables.editor.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/color_palette.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/overview.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/scatter2D.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/scatter3D.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/scatterMFI.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/parallelCoordinates.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/profileCLs.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/boxplotsFlow.js" type="text/javascript"></script>\n+\n+<style>\n+#input{font-family:Calibri,Arial}\n+table.dataTable tbody td.dt-body-right {\n+    text-align: right;\n+}\n+#div{padding:5px;width:150px;height:100px;text-align:center}\n+table{width:100%;border:0px solid;border-collapse:collapse;text-align:center;}\n+th{background-color:#3e6db0;color:#fff;padding:5px}\n+\n+</style>\n+</head>\n+\n+<body>\n+<div class="container-fluid">\n+    <div class="row" style="padding-bottom:10px;min-height:500px;">\n+        <div  class="col-md-12">\n+            <ul class="nav nav-tabs tabs-main">\n+                <li class="homeTab active" data-value="mfi"><a href="#mfi" data-toggle="tab">MFI/Pop</a></li>\n+                <li class="homeTab" data-value="overviewPlot"><a href="#overviewPlot" data-toggle="tab">Overview Plot</a></li>\n+                <li class="homeTab" data-value="scatter2D"><a href="#scatter2D" data-toggle="tab">Scatter 2D</a></li>\n+                <li class="homeTab" data-value="scatter3D"><a href="#scatter3D" data-toggle="tab">Scatter 3D</a></li>\n+                <li class="homeTab" data-value="parallelCoordinates"><a href="#parallelCoordinates" data-toggle="tab">Parallel Coordinates</a></li>\n+                <li class="homeTab" data-value="stats"><a href="#boxplots" data-toggle="tab">Summary Statistics Boxplots</a></li>\n+                <li class="homeTab" data-value="clprofiles"><a href="#clprofiles" data-toggle="tab">Populations Cell Ontologies</a></li>\n+            </ul>\n+\n+            <div class="tab-content">\n+                <div class="tab-pane active" id="mfi" style="min-height:500px;">\n+                    <div id="mfiDiv"></div>\n+                </div>\n+\n+                <div class="tab-pane" id="overviewPlot" style="min-height:500px;">\n+                    <div id="overviewPlotDiv">Overview</div>\n+                </div>\n+\n+                <div class="tab-pane" id="scatter2D" style="min-height:500px;">\n+                    <div i'..b'    Only 5 markers can be displayed at most.\n+                            </div>\n+                          </div>\n+                          <div id="outlierWarning" style="display:none;">\n+                            <div class="alert alert-info alert-dismissible fade in" role="alert">\n+                              <button type="button" class="close" data-dismiss="alert" aria-label="Close">\n+                                <span aria-hidden="true">&times;</span></button>\n+                                  The number of outliers is too large to display. Representation shows randomly downsampled outliers.\n+                            </div>\n+                          </div>\n+                        </div>\n+\n+                        <div id="plotDivbp" class="col-md-8" style="height:100%;"></div>\n+\n+                        <div id="popDivbp" class="col-md-2" style="height:100%;">\n+                            &nbsp;&nbsp;<button id="updateDisplaybp" class="igbtn">Reset Display</button>\n+                            <table id="popTablebp" class="table table-condensed table-bordered igtable">\n+                                <thead>\n+                                    <tr>\n+                                        <th><input type="checkbox" checked id="popSelectAllbp"/></th>\n+                                        <th>Pop. Names</th>\n+                                        <th>Color</th>\n+                                     </tr>\n+                                </thead>\n+                                <tbody>\n+                                </tbody>\n+                            </table>\n+                        </div>\n+                    </div>\n+                </div>\n+\n+                <div class="tab-pane" id="clprofiles" style="min-height:500px;">\n+                    <div class="row">\n+                        <div id="clprof"/>\n+                    </div>\n+                </div>\n+                </div>\n+            </div>\n+  \t    </div>\n+    </div>\n+</div>\n+\n+<script>\n+var mfiLoaded = false;\n+var populationLoaded = false;\n+var overviewPlotLoaded = false;\n+var scatter2DLoaded = false;\n+var scatter3DLoaded = false;\n+var parallelCoordinatesLoaded = false;\n+var clprofilesLoaded = false;\n+var bpLoaded = false;\n+\n+$().ready(function() {\n+    $(document).on(\'shown.bs.tab\',\'a[data-toggle="tab"]\', function(e) {\n+      var tab = e.target.getAttribute("href");\n+      if (tab == \'#mfi\') {\n+        if (mfiLoaded) {\n+            return true;\n+        }\n+        mfiLoaded = true;\n+        displayMFI();\n+      }\n+      if (tab == \'#overviewPlot\') {\n+        if (overviewPlotLoaded) {\n+            return true;\n+        }\n+        overviewPlotLoaded = true;\n+        displayOverviewPlot();\n+      }\n+      if (tab == \'#scatter2D\') {\n+        if (scatter2DLoaded) {\n+            displayScatterPopulation2D();\n+            return true;\n+        }\n+        scatter2DLoaded = true;\n+        displayScatter2D();\n+      }\n+      if (tab == \'#scatter3D\') {\n+        if (scatter3DLoaded) {\n+            displayScatterPopulation3D();\n+            return true;\n+        }\n+        scatter3DLoaded = true;\n+        displayScatter3D();\n+      }\n+      if (tab == \'#parallelCoordinates\') {\n+        if (parallelCoordinatesLoaded) {\n+            displayPopTable();\n+            displayTableGrid();\n+            return true;\n+        }\n+        parallelCoordinatesLoaded = true;\n+        displayParallelCoordinates();\n+      }\n+      if (tab == \'#boxplots\') {\n+        if (bpLoaded) {\n+            displayPopulationLegend(configbp);\n+            displayMarkerTable(configbp);\n+            updateBoxplot(configbp);\n+            return true;\n+        }\n+        bpLoaded = true;\n+        displayMFIBoxplot();\n+      }\n+      if (tab == \'#clprofiles\') {\n+        if (clprofilesLoaded) {\n+            return true;\n+        }\n+        clprofilesLoaded = true;\n+        displayCLTable();\n+      }\n+    });\n+\n+    mfiLoaded = true;\n+    displayMFI();\n+});\n+</script>\n+</body>\n+</html>\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/input.flowclr
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/input.flowclr Mon Feb 27 12:54:37 2017 -0500
b
b'@@ -0,0 +1,59998 @@\n+CD4\tCCR7\tPopulation\n+392\t178\t24\n+560\t9\t10\n+345\t166\t15\n+180\t225\t21\n+123\t280\t25\n+555\t186\t1\n+521\t217\t1\n+98\t47\t6\n+182\t117\t12\n+251\t179\t26\n+160\t0\t6\n+85\t127\t6\n+0\t62\t5\n+146\t7\t6\n+446\t0\t10\n+556\t139\t18\n+138\t201\t21\n+556\t0\t10\n+96\t166\t6\n+141\t0\t5\n+525\t239\t18\n+64\t90\t6\n+551\t202\t18\n+507\t171\t1\n+106\t118\t6\n+14\t181\t6\n+181\t124\t6\n+467\t137\t1\n+200\t285\t25\n+143\t239\t21\n+506\t128\t1\n+496\t67\t10\n+157\t257\t25\n+57\t73\t5\n+511\t133\t18\n+519\t276\t1\n+160\t265\t25\n+170\t104\t12\n+470\t127\t1\n+214\t300\t25\n+535\t0\t2\n+78\t0\t6\n+135\t0\t5\n+70\t230\t21\n+32\t0\t6\n+205\t296\t25\n+28\t145\t6\n+520\t145\t1\n+533\t39\t10\n+0\t0\t5\n+495\t0\t2\n+497\t185\t18\n+147\t347\t21\n+87\t0\t6\n+30\t0\t6\n+543\t0\t10\n+92\t139\t5\n+0\t0\t6\n+567\t221\t18\n+151\t276\t21\n+518\t141\t18\n+213\t197\t22\n+549\t61\t2\n+562\t207\t18\n+5\t28\t5\n+63\t79\t6\n+120\t80\t21\n+21\t133\t5\n+141\t326\t25\n+180\t271\t21\n+114\t155\t21\n+216\t262\t25\n+0\t36\t5\n+459\t35\t2\n+85\t45\t6\n+534\t136\t1\n+24\t0\t5\n+227\t330\t25\n+554\t136\t1\n+127\t164\t21\n+201\t210\t25\n+429\t148\t18\n+160\t125\t21\n+153\t47\t5\n+76\t145\t6\n+545\t57\t10\n+134\t233\t21\n+481\t141\t1\n+516\t168\t1\n+174\t231\t21\n+470\t158\t1\n+128\t121\t12\n+467\t147\t1\n+133\t200\t12\n+318\t0\t15\n+181\t273\t25\n+526\t254\t1\n+223\t121\t15\n+121\t124\t21\n+57\t171\t6\n+164\t302\t21\n+382\t286\t22\n+71\t237\t21\n+500\t137\t1\n+501\t0\t2\n+519\t190\t18\n+488\t165\t1\n+523\t42\t2\n+475\t86\t2\n+538\t0\t2\n+26\t22\t6\n+157\t174\t21\n+548\t21\t10\n+203\t234\t25\n+161\t283\t25\n+60\t127\t6\n+522\t0\t2\n+69\t235\t21\n+63\t142\t6\n+171\t277\t25\n+177\t252\t21\n+138\t0\t5\n+73\t226\t21\n+529\t194\t1\n+99\t0\t6\n+0\t192\t5\n+145\t243\t21\n+579\t0\t2\n+555\t216\t1\n+525\t132\t18\n+213\t204\t21\n+202\t253\t25\n+53\t0\t6\n+0\t77\t6\n+58\t247\t21\n+546\t0\t10\n+144\t286\t25\n+84\t0\t5\n+101\t120\t5\n+564\t148\t18\n+498\t0\t10\n+576\t280\t1\n+217\t280\t21\n+0\t16\t5\n+111\t135\t6\n+514\t13\t2\n+287\t135\t15\n+330\t440\t23\n+398\t471\t23\n+567\t109\t1\n+0\t242\t6\n+215\t178\t21\n+586\t0\t2\n+56\t261\t21\n+93\t233\t25\n+128\t140\t12\n+550\t129\t1\n+105\t0\t5\n+493\t138\t18\n+112\t88\t12\n+518\t178\t18\n+510\t220\t1\n+491\t0\t10\n+552\t117\t3\n+459\t156\t22\n+87\t87\t6\n+55\t135\t6\n+148\t117\t6\n+174\t237\t25\n+237\t264\t25\n+169\t195\t12\n+119\t204\t25\n+43\t0\t6\n+558\t190\t1\n+581\t66\t2\n+180\t265\t25\n+118\t199\t21\n+155\t229\t21\n+494\t0\t2\n+400\t236\t22\n+264\t150\t21\n+37\t0\t6\n+538\t79\t10\n+226\t218\t25\n+538\t90\t2\n+544\t146\t1\n+330\t451\t17\n+547\t108\t1\n+166\t236\t21\n+126\t0\t6\n+519\t107\t10\n+520\t0\t2\n+81\t82\t5\n+222\t231\t25\n+495\t45\t2\n+277\t300\t25\n+554\t224\t18\n+558\t144\t1\n+112\t134\t6\n+512\t206\t1\n+407\t178\t24\n+516\t166\t18\n+283\t377\t16\n+528\t147\t1\n+501\t24\t2\n+140\t113\t6\n+555\t0\t2\n+470\t0\t2\n+46\t37\t6\n+562\t222\t18\n+7\t18\t6\n+24\t102\t6\n+227\t331\t25\n+155\t74\t5\n+538\t0\t10\n+542\t177\t1\n+12\t160\t6\n+180\t305\t21\n+0\t149\t6\n+541\t10\t10\n+120\t227\t21\n+504\t81\t2\n+535\t196\t18\n+536\t243\t18\n+503\t45\t2\n+112\t205\t12\n+212\t203\t12\n+542\t174\t18\n+287\t237\t24\n+75\t98\t6\n+161\t247\t21\n+167\t301\t25\n+164\t531\t9\n+524\t58\t2\n+564\t267\t1\n+500\t81\t2\n+538\t187\t1\n+555\t129\t18\n+61\t39\t6\n+524\t136\t1\n+492\t144\t18\n+105\t263\t21\n+539\t287\t1\n+538\t0\t10\n+135\t174\t21\n+527\t170\t1\n+529\t86\t10\n+196\t278\t25\n+201\t295\t25\n+232\t258\t21\n+165\t3\t6\n+173\t154\t21\n+588\t148\t1\n+79\t263\t21\n+501\t70\t10\n+132\t184\t21\n+518\t173\t18\n+486\t0\t10\n+460\t0\t2\n+535\t216\t18\n+197\t303\t25\n+158\t180\t21\n+159\t117\t21\n+541\t158\t1\n+552\t217\t18\n+0\t88\t5\n+164\t272\t21\n+286\t12\t15\n+578\t0\t2\n+538\t0\t2\n+13\t0\t6\n+91\t75\t6\n+78\t212\t21\n+532\t190\t1\n+62\t0\t6\n+540\t173\t18\n+511\t190\t18\n+551\t44\t10\n+420\t152\t22\n+226\t306\t25\n+88\t119\t4\n+180\t258\t21\n+79\t305\t21\n+84\t0\t6\n+493\t0\t10\n+78\t156\t6\n+162\t210\t25\n+155\t0\t6\n+512\t275\t18\n+33\t195\t21\n+549\t46\t2\n+74\t280\t21\n+13\t126\t6\n+467\t263\t18\n+424\t254\t24\n+188\t308\t25\n+19\t167\t6\n+185\t189\t25\n+188\t267\t25\n+18\t80\t6\n+132\t265\t21\n+441\t143\t1\n+153\t255\t7\n+526\t105\t2\n+72\t109\t6\n+524\t213\t1\n+511\t226\t1\n+31\t0\t5\n+0\t36\t5\n+496\t0\t2\n+134\t245\t21\n+532\t141\t18\n+83\t230\t12\n+505\t26\t2\n+550\t204\t18\n+244\t348\t25\n+36\t0\t6\n+0\t81\t6\n+540\t7\t2\n+522\t152\t1\n+111\t158\t6\n+450\t116\t1\n+545\t0\t2\n+214\t230\t25\n+538\t0\t10\n+538\t44\t2\n+16\t0\t6\n+0\t14\t5\n+137\t227\t21\n+480\t165\t18\n+528\t188\t1\n+112\t169\t21\n+492\t8\t2\n+495\t0\t2\n+157\t205\t25\n+508\t0\t10\n+495\t136\t1\n+12\t240\t21\n+525\t108\t1\n+593\t20\t2\n+485\t0\t2\n+196\t167\t21\n+488\t169\t18\n+107\t277\t21\n+139\t265\t21\n+77\t200\t21\n+565\t136\t1\n+185\t263\t21\n+51\t0\t5\n+281\t349\t26\n+520\t0\t10\n+557\t160\t18\n+537\t0\t2\n+109\t255\t21\n+501\t0\t10\n+497\t22\t2\n+128\t261\t25\n+558\t10\t10\n+548\t0\t2\n+570\t76\t10\n+390\t296\t22\n+0\t0\t5\n+122\t51\t5\n+508\t145\t18\n+114\t258\t21\n+552\t201\t18\n+145\t0\t6\n+36\t262\t21\n+192\t291'..b'7\n+81\t420\t7\n+248\t374\t23\n+116\t303\t25\n+170\t280\t21\n+385\t152\t24\n+556\t523\t14\n+148\t290\t21\n+109\t190\t12\n+44\t418\t7\n+108\t428\t20\n+183\t282\t25\n+445\t358\t26\n+477\t0\t10\n+156\t498\t20\n+109\t430\t20\n+131\t221\t12\n+82\t346\t7\n+387\t260\t24\n+34\t56\t5\n+452\t0\t2\n+499\t474\t14\n+99\t277\t25\n+139\t243\t25\n+365\t453\t23\n+60\t435\t7\n+130\t77\t6\n+509\t294\t1\n+89\t159\t25\n+120\t176\t21\n+510\t83\t2\n+97\t345\t7\n+102\t486\t20\n+561\t139\t18\n+72\t502\t20\n+71\t631\t16\n+11\t279\t7\n+20\t280\t21\n+76\t448\t20\n+163\t323\t25\n+513\t341\t1\n+165\t201\t21\n+104\t466\t20\n+318\t268\t22\n+525\t581\t14\n+184\t438\t20\n+115\t251\t25\n+377\t308\t24\n+549\t174\t1\n+294\t443\t26\n+32\t281\t21\n+161\t264\t21\n+471\t0\t10\n+36\t0\t5\n+145\t291\t25\n+456\t181\t1\n+421\t522\t14\n+356\t455\t23\n+270\t272\t15\n+523\t230\t18\n+550\t0\t2\n+547\t156\t1\n+185\t273\t21\n+512\t144\t1\n+320\t177\t15\n+586\t722\t17\n+523\t0\t2\n+161\t212\t21\n+383\t232\t22\n+491\t161\t1\n+545\t80\t10\n+515\t278\t18\n+365\t449\t23\n+0\t530\t20\n+74\t342\t7\n+0\t65\t5\n+558\t0\t2\n+532\t170\t18\n+55\t0\t5\n+124\t244\t12\n+492\t0\t2\n+496\t456\t14\n+542\t1\t2\n+336\t467\t23\n+177\t274\t25\n+350\t249\t24\n+530\t0\t10\n+576\t639\t17\n+26\t389\t7\n+523\t186\t1\n+166\t256\t25\n+537\t125\t1\n+16\t373\t7\n+370\t461\t23\n+248\t342\t26\n+102\t71\t5\n+540\t180\t18\n+97\t229\t12\n+168\t294\t25\n+545\t70\t10\n+130\t322\t21\n+498\t560\t14\n+1\t412\t7\n+558\t174\t18\n+551\t155\t1\n+123\t269\t21\n+0\t619\t20\n+171\t323\t25\n+513\t297\t1\n+180\t610\t16\n+532\t4\t10\n+74\t279\t7\n+86\t505\t20\n+123\t500\t20\n+73\t92\t5\n+0\t272\t7\n+533\t448\t14\n+0\t35\t5\n+65\t183\t6\n+319\t91\t15\n+313\t388\t25\n+522\t0\t10\n+50\t342\t12\n+72\t447\t20\n+203\t320\t25\n+516\t180\t18\n+70\t293\t7\n+75\t662\t20\n+90\t0\t5\n+341\t150\t15\n+78\t550\t20\n+91\t548\t20\n+203\t299\t21\n+557\t44\t10\n+543\t57\t10\n+526\t158\t1\n+96\t135\t21\n+510\t91\t10\n+44\t0\t5\n+146\t674\t16\n+501\t21\t10\n+102\t195\t21\n+40\t99\t5\n+543\t519\t14\n+510\t546\t14\n+122\t229\t21\n+559\t660\t14\n+545\t651\t17\n+482\t127\t1\n+331\t129\t15\n+537\t267\t1\n+507\t0\t10\n+260\t253\t21\n+0\t23\t6\n+162\t250\t25\n+52\t644\t20\n+403\t661\t13\n+523\t55\t2\n+517\t21\t10\n+513\t603\t14\n+213\t263\t25\n+234\t301\t12\n+165\t451\t20\n+63\t545\t20\n+534\t99\t2\n+197\t332\t26\n+119\t238\t21\n+121\t302\t7\n+287\t560\t26\n+207\t265\t25\n+266\t296\t25\n+278\t288\t25\n+381\t285\t24\n+513\t234\t18\n+176\t117\t6\n+585\t648\t17\n+499\t135\t18\n+493\t0\t2\n+90\t138\t12\n+555\t140\t1\n+182\t294\t25\n+130\t266\t21\n+527\t0\t10\n+208\t258\t25\n+522\t643\t14\n+126\t219\t21\n+487\t169\t1\n+524\t0\t10\n+144\t250\t21\n+486\t574\t14\n+531\t0\t10\n+129\t324\t25\n+202\t288\t21\n+531\t186\t18\n+537\t265\t1\n+144\t274\t12\n+9\t220\t12\n+529\t123\t1\n+101\t276\t21\n+227\t99\t21\n+203\t281\t25\n+48\t491\t20\n+129\t324\t21\n+161\t310\t25\n+520\t160\t1\n+92\t234\t12\n+54\t240\t21\n+154\t248\t21\n+358\t289\t18\n+121\t454\t20\n+212\t166\t21\n+458\t0\t2\n+0\t90\t5\n+411\t133\t24\n+256\t430\t16\n+489\t574\t14\n+249\t216\t25\n+231\t304\t25\n+155\t275\t25\n+170\t261\t21\n+210\t251\t25\n+78\t426\t20\n+0\t555\t16\n+0\t556\t20\n+513\t636\t14\n+217\t284\t25\n+169\t284\t21\n+509\t0\t10\n+558\t200\t1\n+180\t66\t6\n+487\t207\t18\n+168\t238\t21\n+505\t344\t1\n+39\t0\t5\n+206\t283\t21\n+524\t495\t14\n+123\t717\t20\n+572\t48\t2\n+178\t218\t12\n+482\t322\t26\n+551\t11\t10\n+502\t194\t1\n+196\t309\t25\n+547\t265\t18\n+42\t442\t20\n+106\t620\t16\n+130\t548\t20\n+566\t275\t18\n+523\t0\t2\n+398\t521\t14\n+93\t317\t25\n+554\t87\t10\n+174\t282\t25\n+77\t99\t5\n+136\t483\t20\n+138\t315\t25\n+168\t289\t25\n+42\t89\t6\n+219\t280\t25\n+549\t59\t10\n+97\t142\t25\n+0\t502\t20\n+149\t626\t20\n+180\t282\t25\n+0\t449\t20\n+541\t0\t10\n+528\t0\t2\n+26\t332\t7\n+81\t460\t20\n+134\t268\t25\n+431\t413\t14\n+129\t436\t20\n+345\t440\t26\n+573\t0\t10\n+154\t309\t25\n+419\t447\t13\n+564\t547\t14\n+16\t266\t7\n+262\t325\t26\n+169\t235\t25\n+42\t121\t5\n+204\t293\t25\n+302\t360\t26\n+112\t348\t12\n+534\t0\t2\n+0\t235\t12\n+517\t82\t10\n+69\t162\t21\n+83\t493\t20\n+73\t239\t21\n+488\t167\t1\n+341\t417\t26\n+163\t251\t21\n+0\t0\t6\n+549\t4\t10\n+202\t338\t25\n+546\t232\t18\n+39\t483\t16\n+183\t284\t25\n+0\t49\t5\n+232\t304\t25\n+195\t220\t25\n+0\t313\t7\n+522\t446\t14\n+231\t499\t24\n+185\t158\t21\n+146\t268\t21\n+127\t446\t20\n+103\t200\t21\n+120\t326\t7\n+560\t941\t19\n+124\t245\t21\n+112\t537\t16\n+121\t577\t20\n+173\t209\t21\n+417\t275\t22\n+25\t467\t20\n+475\t194\t1\n+144\t238\t12\n+128\t249\t21\n+81\t248\t7\n+145\t241\t21\n+216\t247\t25\n+465\t3\t10\n+389\t445\t23\n+569\t50\t2\n+160\t239\t25\n+519\t149\t1\n+552\t496\t14\n+129\t131\t6\n+439\t0\t10\n+195\t44\t21\n+568\t647\t14\n+342\t638\t23\n+145\t229\t21\n+348\t422\t23\n+406\t271\t24\n+548\t203\t1\n+102\t319\t12\n+333\t0\t15\n+510\t77\t2\n+544\t190\t18\n+54\t239\t7\n+431\t508\t26\n+543\t582\t14\n+74\t259\t21\n+143\t286\t21\n+467\t305\t26\n+504\t178\t1\n+0\t154\t5\n+169\t312\t25\n+185\t203\t21\n+521\t15\t2\n+553\t220\t18\n+44\t467\t20\n+470\t183\t1\n+58\t265\t25\n+523\t287\t18\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out1/boxplotData.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out1/boxplotData.json Mon Feb 27 12:54:37 2017 -0500
[
b'@@ -0,0 +1,1 @@\n+{"lower": {"CCR7":{"1":38.5,"2":-109.5,"3":-183.0,"4":-117.0,"5":-175.5,"6":-157.5,"7":68.5,"8":73.0,"9":140.375,"10":-94.5,"11":-128.0,"12":27.5,"13":137.875,"14":344.5,"15":-182.5,"16":264.5,"17":405.125,"18":40.5,"19":207.5,"20":254.0,"21":97.0,"22":11.5,"23":370.375,"24":21.5,"25":172.5,"26":201.375},"CD4":{"1":444.5,"2":443.5,"3":435.25,"4":-102.5,"5":-106.5,"6":-76.0,"7":-68.5,"8":449.5,"9":-68.0,"10":444.5,"11":-65.5,"12":-25.25,"13":415.0,"14":433.5,"15":195.75,"16":-57.375,"17":377.5,"18":447.0,"19":237.0,"20":-68.0,"21":24.5,"22":252.5,"23":272.5,"24":276.375,"25":72.5,"26":-10.5}}, "mfi": {"CCR7":{"1":188,"2":37,"3":69,"4":141,"5":68,"6":90,"7":318,"8":258,"9":420,"10":31,"11":111,"12":213,"13":424,"14":566,"15":84,"16":510,"17":598,"18":199,"19":629,"20":534,"21":224,"22":204,"23":476,"24":204,"25":269,"26":343},"CD4":{"1":520,"2":523,"3":512,"4":84,"5":56,"6":75,"7":83,"8":517,"9":138,"10":521,"11":85,"12":119,"13":516,"14":526,"15":322,"16":104,"17":509,"18":524,"19":490,"20":82,"21":145,"22":389,"23":366,"24":392,"25":182,"26":325}}, "outliers": {"CCR7":{"1":[340,373,371,379,355,373,331,340,346,334,348,334,346,341,358,356,370,338,359,336,354,333,353,342,367,345,341,338,341,344],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[525,460,426,426,512,579,504,554,437,647,463,499,492,520,505,441,468,430,515,563,436,430,459,577,450,458,474,449,444,513,477,501,444,438,431,441,577,486,447,497,599,443,439,426,474,448,438,508,444,437,521,432,516,428,443,511,530,541,469,507,432,452,454,427,488,436,507],"9":[711,706,725,761,693,768,676,699,817,855,679,714,771,780,825,829],"10":[],"11":[],"12":[0,13,0,26,399],"13":[750,120,727,753,711,735,724,711,735,714,710,768,780],"14":[],"15":[],"16":[743,815,836,817,784,822,741,761,850,771,817,772,750],"17":[851,797,897,867,823,811,893,786,393,811,398],"18":[365,351,372,351,378,372,367,353,361,355,365,371,384,377,349,388,367,380,401,378,379,371,371,375,358,355],"19":[],"20":[],"21":[49,61,22,0,53,73,71,364,37,91,88,0,87,87,62,35,0,34,39,93,88,90,58,39,56,362,0,85,96,393,0,87,0,81,49,15,89,71,32,0,1,29,40,30,90,71,80,40,35,0,2,49,51,76,0,362,51,6,83,69,80,83,0,66,35,60,0,94,72,85,370,74,0,62,45,84,72,25,0,88,68,65,10,90,77,92,71,89,70,41,54,67,0,62,74,83,58,86,77,74],"22":[7,0,0,0,0,422,0,0,5,6,0,0,0,0,0,0,0,0,0,412,0,0,0,0,0,0,0,0,0,1,0,0,0,6,0,0,0,0,0,0,0,0,0,430,446,0,0,421],"23":[368,685,615,588,747,874,798,677,635,637,578,849,856,725,952,647,822,578,738,250,677,615,742,615,603,256,236,574,657,675,661,584,299,327,638,340,599,271,321,332,332,607,355,570,607,572,328,589,584,311,312,700,590,659,613,361,356,253,292,347,707,654,360,771,684,342,640,608,837,920,579,907,835,569,594,667,800,597,786,731,595,890,800,637,692,727,643,685,358,710,587,609,978,750,335,753,638],"24":[0,0,0,5,0,0,0,15,0,6,0,4,0,0,7,0,4,0,0,18,0,4,0,0,0,0,0,0,21,0,0,0,407,0,4,0,494,0,2,19,7,496,0,468,0,0,499],"25":[395,378,140,152,424,487,423,169,142,129,162,119,166,139,162,150,404,158,163,162,117,161,165,168,159,101,170,448,159,158,161,139,131,402,82,98,98,401,456,388,155,400,163,158,157,416,394,165,167,172,156,166,407,418,134,168,149,397,430,151,150,160,114,143,385,169,156,381,128,164,159,141,428,169,145,96,165,401,171,165,164,114,154,397,147,114,412,107,469,168,417,161,168,160,169,147,117,169,166,148],"26":[179,138,193,500,496,475,478,521,164,479,478,183,560,483,503,485,479,160,513,175,482,523,199,184,189,512,535,499,603,161,482,515,521,526,546,482,531,506,543,507,479,495,617,526,482,501,622,479,478,492,489,484,534,495,492,476,560,487,560,508]},"CD4":{"1":[609,371,433,393,359,430,409,393,425,368,398,381,421,398,413,444,383,405,432,423,361,443,441,405,323,404,429,415,430,350,405,414,421,440,434,361,434,332,440,410,418,397,421,441,349,441,416,406,441,377,369,417,379,399,413,380,439,357,406,384,338,421,354,423,439,437,419,343,440,371,403,444,348,444,354,427,427,443,389,393,439,355,443,436,350,438,626,441,434,439,413,439,418,354,442,304,367,408,433,382],"2":[428,409,398,414,392,439,416,613,422,437,442,420,'..b'0,385,430,384,443,418,414,337,320,446,358],"19":[764,768,775,235,216,208,210,1023,193],"20":[304,302,313,363,346,261,305,249,299,235,260],"21":[299,1,0,22,10,290,0,329,0,24,14,7,279,0,11,15,17,394,357,19,21,12,0,8,0,0,7,0,280,23,18,0,13,10,301,0,0,305,276,0,0,0,8,21,24,293,10,0,13,21,8,282,7,8,0,357,8,23,17,24,6,24,17,9,24,335,0,0,11,281,0,7,0,12,23,0,283,0,10,0,0,20,6,346,22,24,18,0,12,273,0,10,274,282,322,0,12,307,12,271],"22":[213,83,561,93,204,194,247,588,242,136,113,219,228,170,215,177,579,163,136,220,197,573,252,235,578,95,623,246,177,251,209,633,203,161,550,185,250,579,89,169,139,214,240,151,246,126,178,97,241,250,150,244,190,576,221,226,243,205,214,223,176,188,242,229,191,134,540,249,237,242,171,195,178,169,214,223,208],"23":[248,503,179,240,259,505,536,269,499,517,196,628,270,268,231,494,575,548,529,211,505,580,505,181,262,229,211,517,525,216,189,512,196,492,267,178,189,591,238,499,225,252,494,493,260,484,548,540,249,239,177,205,465,224,536,479,231,697,465,255,237,180,262,269,488,521,187,249,549,272,216,538,248],"24":[528,115,273,573,262,220,90,215,271,195,215,200,247,569,585,181,528,226,234,517,554,269,263,611,263,519,110,247,252,255,547,546,271,269,574,262,213,578,232,203,258,264,174,537,611,559,260,253,255,267,274,253,186,206,618,162,248,271,578,251,181,273,236,521,245,179,618,231],"25":[48,65,69,68,72,27,68,67,52,67,3,372,321,327,71,311,50,320,38,56,39,46,356,332,313,47,58,61,294,56,297,66,406,0,65,320,357,67,297,335,40,64,344,332,63,309,318,341,50,28,53,296,307,0,65,41,44,43,36,65,71,6,401,330,0,293,71,293,44,35,59,304,37,305,72,69,45,72,68,56,66,48,298,321,0,38,72,63,29,62,38,25,302,294,32,0,39,303,347,69],"26":[]}}, "q1": {"CCR7":{"1":148.0,"2":0.0,"3":0.0,"4":75.0,"5":0.0,"6":24.0,"7":256.0,"8":205.0,"9":339.5,"10":0.0,"11":49.0,"12":164.0,"13":352.0,"14":514.0,"15":8.0,"16":443.0,"17":547.25,"18":156.0,"19":515.0,"20":464.0,"21":196.0,"22":160.0,"23":442.0,"24":164.0,"25":246.0,"26":303.75},"CD4":{"1":503.0,"2":505.0,"3":494.5,"4":31.0,"5":12.0,"6":35.0,"7":44.0,"8":502.0,"9":79.0,"10":503.0,"11":47.0,"12":80.5,"13":493.0,"14":504.0,"15":291.0,"16":60.0,"17":484.0,"18":507.0,"19":426.0,"20":43.0,"21":116.0,"22":359.0,"23":343.0,"24":366.0,"25":155.0,"26":246.0}}, "q2": {"CCR7":{"1":182.0,"2":21.0,"3":68.0,"4":147.0,"5":61.0,"6":95.0,"7":323.0,"8":244.0,"9":404.5,"10":11.0,"11":114.0,"12":210.0,"13":426.0,"14":580.5,"15":88.0,"16":502.0,"17":603.0,"18":193.0,"19":593.0,"20":515.0,"21":234.0,"22":215.0,"23":465.0,"24":217.0,"25":272.0,"26":334.0},"CD4":{"1":524.0,"2":526.0,"3":516.0,"4":77.0,"5":52.0,"6":72.0,"7":85.0,"8":520.0,"9":125.5,"10":524.0,"11":86.0,"12":115.0,"13":521.0,"14":530.0,"15":324.0,"16":101.5,"17":529.5,"18":528.0,"19":480.0,"20":84.0,"21":147.0,"22":398.0,"23":365.0,"24":400.0,"25":184.0,"26":296.0}}, "q3": {"CCR7":{"1":221.0,"2":73.0,"3":122.0,"4":203.0,"5":117.0,"6":145.0,"7":381.0,"8":293.0,"9":472.25,"10":63.0,"11":167.0,"12":255.0,"13":494.75,"14":627.0,"15":135.0,"16":562.0,"17":642.0,"18":233.0,"19":720.0,"20":604.0,"21":262.0,"22":259.0,"23":489.75,"24":259.0,"25":295.0,"26":372.0},"CD4":{"1":542.0,"2":546.0,"3":534.0,"4":120.0,"5":91.0,"6":109.0,"7":119.0,"8":537.0,"9":177.0,"10":542.0,"11":122.0,"12":151.0,"13":545.0,"14":551.0,"15":354.5,"16":138.25,"17":555.0,"18":547.0,"19":552.0,"20":117.0,"21":177.0,"22":430.0,"23":390.0,"24":425.75,"25":210.0,"26":417.0}}, "upper": {"CCR7":{"1":330.5,"2":182.5,"3":305.0,"4":395.0,"5":292.5,"6":326.5,"7":568.5,"8":425.0,"9":671.375,"10":157.5,"11":344.0,"12":391.5,"13":708.875,"14":796.5,"15":325.5,"16":740.5,"17":784.125,"18":348.5,"19":1027.5,"20":814.0,"21":361.0,"22":407.5,"23":561.375,"24":401.5,"25":368.5,"26":474.375},"CD4":{"1":600.5,"2":607.5,"3":593.25,"4":253.5,"5":209.5,"6":220.0,"7":231.5,"8":589.5,"9":324.0,"10":600.5,"11":234.5,"12":256.75,"13":623.0,"14":621.5,"15":449.75,"16":255.625,"17":661.5,"18":607.0,"19":741.0,"20":228.0,"21":268.5,"22":536.5,"23":460.5,"24":515.375,"25":292.5,"26":673.5}}}\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out1/flow.mfi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out1/flow.mfi Mon Feb 27 12:54:37 2017 -0500
b
@@ -0,0 +1,27 @@
+Population CD4 CCR7
+1 520 188
+2 523 37
+3 512 69
+4 84 141
+5 56 68
+6 75 90
+7 83 318
+8 517 258
+9 138 420
+10 521 31
+11 85 111
+12 119 213
+13 516 424
+14 526 566
+15 322 84
+16 104 510
+17 509 598
+18 524 199
+19 490 629
+20 82 534
+21 145 224
+22 389 204
+23 366 476
+24 392 204
+25 182 269
+26 325 343
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out1/flow.mfi_pop
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out1/flow.mfi_pop Mon Feb 27 12:54:37 2017 -0500
b
@@ -0,0 +1,27 @@
+CD4 CCR7 Count Percentage Population
+519.72 187.88 3842 6.40 1
+522.94 37.10 2765 4.61 2
+512.11 68.72 2163 3.61 3
+83.54 141.19 1207 2.01 4
+55.56 67.51 2332 3.89 5
+75.33 90.47 3969 6.62 6
+82.72 318.03 1809 3.02 7
+517.07 257.64 2260 3.77 8
+138.25 419.51 342 0.57 9
+520.67 31.29 3497 5.83 10
+85.41 110.92 1903 3.17 11
+119.09 212.60 1599 2.67 12
+515.81 423.78 2238 3.73 13
+525.80 565.61 930 1.55 14
+322.30 84.31 555 0.93 15
+103.98 509.50 872 1.45 16
+509.05 597.98 362 0.60 17
+524.02 198.53 2601 4.34 18
+489.73 629.26 341 0.57 19
+81.83 534.25 1750 2.92 20
+144.71 224.04 9174 15.29 21
+388.94 203.73 1401 2.34 22
+365.75 476.01 1058 1.76 23
+392.21 204.17 1166 1.94 24
+181.69 268.60 8725 14.54 25
+325.42 342.86 1136 1.89 26
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out1/flow.overview
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out1/flow.overview Mon Feb 27 12:54:37 2017 -0500
b
@@ -0,0 +1,13 @@
+<table>
+<tr><td>&nbsp;</td>
+<td>CD4</td>
+<td>CCR7</td>
+<tr>
+<td>CD4</td>
+<td><img src="m0_m0_90X90.png"/></td><td><img src="m1_m0_90X90.png"/></td></tr>
+<tr>
+<td>CCR7</td>
+<td><img src="m0_m1_90X90.png"/></td><td><img src="m1_m1_90X90.png"/></td></tr>
+</table>
+</body>
+<html>
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out1/flow.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out1/flow.sample Mon Feb 27 12:54:37 2017 -0500
b
b'@@ -0,0 +1,20001 @@\n+CD4\tCCR7\tPopulation\n+392\t178\t24\n+560\t9\t10\n+345\t166\t15\n+180\t225\t21\n+123\t280\t25\n+555\t186\t1\n+521\t217\t1\n+98\t47\t6\n+182\t117\t12\n+251\t179\t26\n+160\t0\t6\n+85\t127\t6\n+0\t62\t5\n+146\t7\t6\n+446\t0\t10\n+556\t139\t18\n+138\t201\t21\n+556\t0\t10\n+96\t166\t6\n+141\t0\t5\n+525\t239\t18\n+64\t90\t6\n+551\t202\t18\n+507\t171\t1\n+106\t118\t6\n+14\t181\t6\n+181\t124\t6\n+467\t137\t1\n+200\t285\t25\n+143\t239\t21\n+506\t128\t1\n+496\t67\t10\n+157\t257\t25\n+57\t73\t5\n+511\t133\t18\n+519\t276\t1\n+160\t265\t25\n+170\t104\t12\n+470\t127\t1\n+214\t300\t25\n+535\t0\t2\n+78\t0\t6\n+135\t0\t5\n+70\t230\t21\n+32\t0\t6\n+205\t296\t25\n+28\t145\t6\n+520\t145\t1\n+533\t39\t10\n+0\t0\t5\n+495\t0\t2\n+497\t185\t18\n+147\t347\t21\n+87\t0\t6\n+30\t0\t6\n+543\t0\t10\n+92\t139\t5\n+0\t0\t6\n+567\t221\t18\n+151\t276\t21\n+518\t141\t18\n+213\t197\t22\n+549\t61\t2\n+562\t207\t18\n+5\t28\t5\n+63\t79\t6\n+120\t80\t21\n+21\t133\t5\n+141\t326\t25\n+180\t271\t21\n+114\t155\t21\n+216\t262\t25\n+0\t36\t5\n+459\t35\t2\n+85\t45\t6\n+534\t136\t1\n+24\t0\t5\n+227\t330\t25\n+554\t136\t1\n+127\t164\t21\n+201\t210\t25\n+429\t148\t18\n+160\t125\t21\n+153\t47\t5\n+76\t145\t6\n+545\t57\t10\n+134\t233\t21\n+481\t141\t1\n+516\t168\t1\n+174\t231\t21\n+470\t158\t1\n+128\t121\t12\n+467\t147\t1\n+133\t200\t12\n+318\t0\t15\n+181\t273\t25\n+526\t254\t1\n+223\t121\t15\n+121\t124\t21\n+57\t171\t6\n+164\t302\t21\n+382\t286\t22\n+71\t237\t21\n+500\t137\t1\n+501\t0\t2\n+519\t190\t18\n+488\t165\t1\n+523\t42\t2\n+475\t86\t2\n+538\t0\t2\n+26\t22\t6\n+157\t174\t21\n+548\t21\t10\n+203\t234\t25\n+161\t283\t25\n+60\t127\t6\n+522\t0\t2\n+69\t235\t21\n+63\t142\t6\n+171\t277\t25\n+177\t252\t21\n+138\t0\t5\n+73\t226\t21\n+529\t194\t1\n+99\t0\t6\n+0\t192\t5\n+145\t243\t21\n+579\t0\t2\n+555\t216\t1\n+525\t132\t18\n+213\t204\t21\n+202\t253\t25\n+53\t0\t6\n+0\t77\t6\n+58\t247\t21\n+546\t0\t10\n+144\t286\t25\n+84\t0\t5\n+101\t120\t5\n+564\t148\t18\n+498\t0\t10\n+576\t280\t1\n+217\t280\t21\n+0\t16\t5\n+111\t135\t6\n+514\t13\t2\n+287\t135\t15\n+330\t440\t23\n+398\t471\t23\n+567\t109\t1\n+0\t242\t6\n+215\t178\t21\n+586\t0\t2\n+56\t261\t21\n+93\t233\t25\n+128\t140\t12\n+550\t129\t1\n+105\t0\t5\n+493\t138\t18\n+112\t88\t12\n+518\t178\t18\n+510\t220\t1\n+491\t0\t10\n+552\t117\t3\n+459\t156\t22\n+87\t87\t6\n+55\t135\t6\n+148\t117\t6\n+174\t237\t25\n+237\t264\t25\n+169\t195\t12\n+119\t204\t25\n+43\t0\t6\n+558\t190\t1\n+581\t66\t2\n+180\t265\t25\n+118\t199\t21\n+155\t229\t21\n+494\t0\t2\n+400\t236\t22\n+264\t150\t21\n+37\t0\t6\n+538\t79\t10\n+226\t218\t25\n+538\t90\t2\n+544\t146\t1\n+330\t451\t17\n+547\t108\t1\n+166\t236\t21\n+126\t0\t6\n+519\t107\t10\n+520\t0\t2\n+81\t82\t5\n+222\t231\t25\n+495\t45\t2\n+277\t300\t25\n+554\t224\t18\n+558\t144\t1\n+112\t134\t6\n+512\t206\t1\n+407\t178\t24\n+516\t166\t18\n+283\t377\t16\n+528\t147\t1\n+501\t24\t2\n+140\t113\t6\n+555\t0\t2\n+470\t0\t2\n+46\t37\t6\n+562\t222\t18\n+7\t18\t6\n+24\t102\t6\n+227\t331\t25\n+155\t74\t5\n+538\t0\t10\n+542\t177\t1\n+12\t160\t6\n+180\t305\t21\n+0\t149\t6\n+541\t10\t10\n+120\t227\t21\n+504\t81\t2\n+535\t196\t18\n+536\t243\t18\n+503\t45\t2\n+112\t205\t12\n+212\t203\t12\n+542\t174\t18\n+287\t237\t24\n+75\t98\t6\n+161\t247\t21\n+167\t301\t25\n+164\t531\t9\n+524\t58\t2\n+564\t267\t1\n+500\t81\t2\n+538\t187\t1\n+555\t129\t18\n+61\t39\t6\n+524\t136\t1\n+492\t144\t18\n+105\t263\t21\n+539\t287\t1\n+538\t0\t10\n+135\t174\t21\n+527\t170\t1\n+529\t86\t10\n+196\t278\t25\n+201\t295\t25\n+232\t258\t21\n+165\t3\t6\n+173\t154\t21\n+588\t148\t1\n+79\t263\t21\n+501\t70\t10\n+132\t184\t21\n+518\t173\t18\n+486\t0\t10\n+460\t0\t2\n+535\t216\t18\n+197\t303\t25\n+158\t180\t21\n+159\t117\t21\n+541\t158\t1\n+552\t217\t18\n+0\t88\t5\n+164\t272\t21\n+286\t12\t15\n+578\t0\t2\n+538\t0\t2\n+13\t0\t6\n+91\t75\t6\n+78\t212\t21\n+532\t190\t1\n+62\t0\t6\n+540\t173\t18\n+511\t190\t18\n+551\t44\t10\n+420\t152\t22\n+226\t306\t25\n+88\t119\t4\n+180\t258\t21\n+79\t305\t21\n+84\t0\t6\n+493\t0\t10\n+78\t156\t6\n+162\t210\t25\n+155\t0\t6\n+512\t275\t18\n+33\t195\t21\n+549\t46\t2\n+74\t280\t21\n+13\t126\t6\n+467\t263\t18\n+424\t254\t24\n+188\t308\t25\n+19\t167\t6\n+185\t189\t25\n+188\t267\t25\n+18\t80\t6\n+132\t265\t21\n+441\t143\t1\n+153\t255\t7\n+526\t105\t2\n+72\t109\t6\n+524\t213\t1\n+511\t226\t1\n+31\t0\t5\n+0\t36\t5\n+496\t0\t2\n+134\t245\t21\n+532\t141\t18\n+83\t230\t12\n+505\t26\t2\n+550\t204\t18\n+244\t348\t25\n+36\t0\t6\n+0\t81\t6\n+540\t7\t2\n+522\t152\t1\n+111\t158\t6\n+450\t116\t1\n+545\t0\t2\n+214\t230\t25\n+538\t0\t10\n+538\t44\t2\n+16\t0\t6\n+0\t14\t5\n+137\t227\t21\n+480\t165\t18\n+528\t188\t1\n+112\t169\t21\n+492\t8\t2\n+495\t0\t2\n+157\t205\t25\n+508\t0\t10\n+495\t136\t1\n+12\t240\t21\n+525\t108\t1\n+593\t20\t2\n+485\t0\t2\n+196\t167\t21\n+488\t169\t18\n+107\t277\t21\n+139\t265\t21\n+77\t200\t21\n+565\t136\t1\n+185\t263\t21\n+51\t0\t5\n+281\t349\t26\n+520\t0\t10\n+557\t160\t18\n+537\t0\t2\n+109\t255\t21\n+501\t0\t10\n+497\t22\t2\n+128\t261\t25\n+558\t10\t10\n+548\t0\t2\n+570\t76\t10\n+390\t296\t22\n+0\t0\t5\n+122\t51\t5\n+508\t145\t18\n+114\t258\t21\n+552\t201\t18\n+145\t0\t6\n+36\t262\t21\n+192\t291'..b'\n+487\t608\t17\n+67\t615\t20\n+129\t640\t20\n+533\t602\t17\n+555\t574\t14\n+46\t635\t20\n+566\t720\t14\n+42\t481\t20\n+0\t490\t20\n+0\t488\t20\n+540\t612\t17\n+84\t527\t20\n+132\t434\t20\n+573\t687\t17\n+532\t587\t17\n+0\t431\t20\n+125\t664\t20\n+528\t634\t14\n+552\t614\t17\n+556\t604\t14\n+549\t472\t14\n+584\t461\t14\n+492\t483\t14\n+551\t531\t14\n+533\t692\t14\n+552\t605\t17\n+487\t516\t14\n+502\t617\t14\n+56\t529\t20\n+577\t489\t14\n+106\t629\t20\n+101\t619\t20\n+140\t453\t20\n+530\t528\t14\n+477\t467\t14\n+128\t499\t20\n+97\t531\t20\n+536\t485\t14\n+143\t644\t20\n+0\t587\t20\n+569\t659\t17\n+26\t539\t20\n+569\t631\t17\n+574\t597\t17\n+151\t475\t20\n+0\t713\t20\n+150\t459\t20\n+533\t626\t14\n+147\t641\t20\n+473\t583\t14\n+562\t667\t14\n+80\t474\t20\n+78\t432\t20\n+502\t587\t17\n+0\t529\t20\n+0\t613\t20\n+78\t446\t20\n+117\t414\t20\n+73\t575\t20\n+392\t645\t17\n+132\t445\t20\n+500\t594\t14\n+533\t531\t14\n+48\t665\t20\n+153\t617\t20\n+95\t456\t20\n+528\t456\t14\n+53\t456\t20\n+76\t498\t20\n+501\t487\t17\n+103\t485\t20\n+501\t614\t17\n+505\t600\t17\n+520\t602\t14\n+82\t472\t20\n+99\t470\t20\n+561\t435\t14\n+71\t475\t20\n+552\t559\t17\n+560\t408\t14\n+503\t595\t14\n+484\t557\t14\n+71\t496\t20\n+49\t521\t20\n+505\t647\t14\n+88\t589\t20\n+531\t477\t14\n+624\t620\t14\n+540\t580\t17\n+97\t595\t20\n+78\t552\t20\n+136\t479\t20\n+507\t377\t14\n+126\t566\t20\n+97\t512\t20\n+0\t595\t20\n+485\t517\t14\n+424\t422\t17\n+487\t591\t14\n+43\t476\t20\n+58\t453\t20\n+444\t615\t17\n+48\t669\t20\n+508\t633\t14\n+91\t472\t20\n+567\t650\t14\n+129\t507\t20\n+69\t537\t20\n+569\t395\t14\n+4\t568\t20\n+11\t585\t20\n+0\t426\t20\n+574\t561\t14\n+527\t601\t17\n+98\t590\t20\n+528\t456\t14\n+563\t600\t17\n+67\t464\t20\n+75\t599\t20\n+148\t559\t20\n+19\t523\t20\n+558\t636\t14\n+0\t515\t20\n+97\t431\t20\n+509\t626\t14\n+85\t475\t20\n+139\t592\t20\n+541\t706\t17\n+0\t438\t20\n+0\t503\t20\n+96\t612\t20\n+96\t426\t20\n+155\t678\t20\n+116\t475\t20\n+39\t455\t20\n+69\t447\t20\n+91\t476\t20\n+575\t641\t14\n+127\t465\t20\n+6\t438\t20\n+94\t471\t20\n+525\t653\t17\n+100\t602\t20\n+113\t621\t20\n+165\t514\t20\n+14\t575\t20\n+577\t535\t14\n+566\t441\t14\n+148\t583\t20\n+114\t441\t20\n+57\t506\t20\n+580\t565\t14\n+60\t565\t20\n+99\t466\t20\n+70\t446\t20\n+474\t580\t17\n+545\t546\t14\n+73\t435\t20\n+16\t431\t20\n+24\t486\t20\n+1\t634\t20\n+180\t590\t20\n+60\t422\t20\n+609\t636\t14\n+515\t455\t14\n+114\t570\t20\n+110\t503\t20\n+0\t599\t20\n+43\t589\t20\n+550\t622\t14\n+494\t451\t14\n+108\t508\t20\n+576\t673\t14\n+28\t541\t20\n+0\t456\t20\n+572\t580\t14\n+0\t459\t20\n+0\t471\t20\n+299\t521\t17\n+71\t635\t20\n+83\t648\t20\n+479\t692\t17\n+108\t438\t20\n+85\t550\t20\n+140\t739\t20\n+191\t543\t20\n+123\t477\t20\n+66\t679\t20\n+24\t520\t20\n+67\t653\t20\n+83\t560\t20\n+545\t680\t17\n+500\t488\t14\n+576\t423\t14\n+70\t471\t20\n+35\t681\t20\n+540\t607\t14\n+575\t602\t14\n+6\t519\t20\n+514\t462\t17\n+106\t631\t20\n+76\t639\t20\n+562\t625\t14\n+111\t627\t20\n+517\t538\t14\n+0\t502\t20\n+149\t468\t20\n+560\t537\t14\n+497\t541\t14\n+83\t514\t20\n+86\t524\t20\n+556\t611\t14\n+545\t698\t14\n+100\t658\t20\n+90\t587\t20\n+560\t631\t14\n+575\t628\t14\n+0\t507\t20\n+117\t499\t20\n+120\t693\t20\n+568\t539\t14\n+111\t451\t20\n+525\t514\t14\n+522\t511\t14\n+20\t587\t20\n+98\t500\t20\n+141\t463\t20\n+527\t522\t14\n+41\t424\t20\n+494\t595\t14\n+87\t495\t20\n+18\t477\t20\n+531\t443\t14\n+98\t571\t20\n+542\t568\t14\n+106\t445\t20\n+0\t436\t20\n+547\t658\t14\n+0\t545\t20\n+470\t455\t14\n+562\t632\t14\n+550\t498\t14\n+128\t600\t20\n+72\t586\t20\n+78\t552\t20\n+122\t498\t20\n+75\t663\t20\n+457\t416\t14\n+99\t484\t20\n+168\t470\t20\n+495\t408\t14\n+109\t473\t20\n+92\t583\t20\n+99\t481\t20\n+530\t540\t14\n+0\t514\t20\n+58\t634\t20\n+153\t528\t20\n+570\t468\t14\n+452\t433\t14\n+141\t432\t20\n+479\t517\t14\n+20\t438\t20\n+116\t449\t20\n+451\t493\t14\n+79\t483\t20\n+0\t448\t20\n+440\t598\t14\n+0\t498\t20\n+13\t499\t20\n+568\t646\t14\n+68\t616\t20\n+31\t646\t20\n+511\t617\t14\n+511\t645\t14\n+54\t591\t20\n+82\t503\t20\n+66\t703\t20\n+82\t573\t20\n+453\t418\t14\n+56\t505\t20\n+19\t578\t20\n+8\t610\t20\n+549\t681\t14\n+572\t637\t14\n+96\t483\t20\n+0\t674\t20\n+78\t545\t20\n+97\t677\t20\n+503\t625\t14\n+466\t509\t14\n+491\t601\t14\n+501\t501\t14\n+21\t570\t20\n+36\t585\t20\n+493\t576\t14\n+503\t426\t14\n+122\t569\t20\n+528\t566\t14\n+83\t640\t20\n+129\t432\t20\n+478\t413\t14\n+163\t423\t20\n+0\t636\t20\n+565\t599\t14\n+540\t659\t14\n+0\t582\t20\n+40\t643\t20\n+0\t447\t20\n+61\t549\t20\n+584\t609\t14\n+542\t425\t14\n+38\t425\t20\n+498\t408\t14\n+0\t615\t20\n+83\t452\t20\n+508\t623\t14\n+80\t516\t20\n+92\t464\t20\n+346\t632\t20\n+9\t623\t20\n+123\t502\t20\n+133\t538\t20\n+525\t436\t14\n+33\t536\t20\n+524\t608\t14\n+0\t529\t20\n+0\t705\t20\n+87\t620\t20\n+87\t424\t20\n+17\t506\t20\n+549\t537\t14\n+79\t445\t20\n+89\t499\t20\n+0\t575\t20\n+124\t598\t20\n+78\t455\t20\n+101\t485\t20\n+139\t494\t20\n+113\t502\t20\n+103\t622\t20\n+49\t458\t20\n+61\t551\t20\n+0\t576\t20\n+123\t643\t20\n+105\t550\t20\n+86\t534\t20\n+69\t454\t20\n+74\t735\t20\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out1/m0_m0_90X90.png
b
Binary file flow_overview/test-data/out1/m0_m0_90X90.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out1/m0_m1_90X90.png
b
Binary file flow_overview/test-data/out1/m0_m1_90X90.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out1/m1_m0_90X90.png
b
Binary file flow_overview/test-data/out1/m1_m0_90X90.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out1/m1_m1_90X90.png
b
Binary file flow_overview/test-data/out1/m1_m1_90X90.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out1/out.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out1/out.html Mon Feb 27 12:54:37 2017 -0500
[
b'@@ -0,0 +1,281 @@\n+<html>\n+<head>\n+<title>Flow Overview</title>\n+<link rel="stylesheet" href="/static/flowtools/bootstrap/css/bootstrap.css"/>\n+<link rel="stylesheet" href="/static/flowtools/select2/select2.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/css/parallelCoordinates.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/datatables.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/Buttons-1.1.2/css/buttons.dataTables.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/Select-1.1.2/css/select.dataTables.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/Editor-1.5.6/css/editor.dataTables.min.css"/>\n+<script src="/static/flowtools/jquery-1.11.3.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/bootstrap/js/bootstrap.js" type="text/javascript"></script>\n+<script src="/static/flowtools/select2/select2.full.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/d3/d3.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/plotly-latest.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/datatables/datatables.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/datatables/Editor-1.5.6/js/dataTables.editor.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/color_palette.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/overview.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/scatter2D.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/scatter3D.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/scatterMFI.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/parallelCoordinates.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/boxplotsFlow.js" type="text/javascript"></script>\n+\n+<style>\n+#input{font-family:Calibri,Arial}\n+table.dataTable tbody td.dt-body-right {\n+    text-align: right;\n+}\n+#div{padding:5px;width:150px;height:100px;text-align:center}\n+table{width:100%;border:0px solid;border-collapse:collapse;text-align:center;}\n+th{background-color:#3e6db0;color:#fff;padding:5px}\n+\n+</style>\n+</head>\n+\n+<body>\n+<div class="container-fluid">\n+<div class="row" style="padding-bottom:10px;min-height:500px;">\n+    <div  class="col-md-12">\n+            <ul class="nav nav-tabs tabs-main">\n+                <li class="homeTab active" data-value="mfi"><a href="#mfi" data-toggle="tab">MFI/Pop</a></li>\n+                <li class="homeTab" data-value="overviewPlot"><a href="#overviewPlot" data-toggle="tab">Overview Plot</a></li>\n+                <li class="homeTab" data-value="scatter2D"><a href="#scatter2D" data-toggle="tab">Scatter 2D</a></li>\n+                <li class="homeTab" data-value="scatter3D"><a href="#scatter3D" data-toggle="tab">Scatter 3D</a></li>\n+                <li class="homeTab" data-value="parallelCoordinates"><a href="#parallelCoordinates" data-toggle="tab">Parallel Coordinates</a></li>\n+                <li class="homeTab" data-value="stats"><a href="#boxplots" data-toggle="tab">Summary Statistics Boxplots</a></li>\n+            </ul>\n+\n+            <div class="tab-content">\n+                <div class="tab-pane active" id="mfi" style="min-height:500px;">\n+                    <div id="mfiDiv"></div>\n+                </div>\n+\n+                <div class="tab-pane" id="overviewPlot" style="min-height:500px;">\n+                    <div id="overviewPlotDiv">Overview</div>\n+                </div>\n+\n+                <div class="tab-pane" id="scatter2D" style="min-height:500px;">\n+                    <div id="toolbarDiv2D" class="col-md-12 chartDiv">\n+                    X Axis: <select id="xAxisMarker2D" style="width:150px;">\n+                            </select>\n+                    Y Axis: <select id="yAxisMarker2D" style="width:150px;">\n+                            </select>\n+               '..b'              <button id="changeDisplay" class="igbtn">View per marker</button><br><br>\n+                          <div id="markerWarning" style="display:none;">\n+                            <div class="alert alert-info alert-dismissible fade in" role="alert">\n+                              <button type="button" class="close" data-dismiss="alert" aria-label="Close">\n+                                <span aria-hidden="true">&times;</span></button>\n+                                  Only 5 markers can be displayed at most.\n+                            </div>\n+                          </div>\n+                          <div id="outlierWarning">\n+                            <div class="alert alert-info alert-dismissible fade in" role="alert">\n+                              <button type="button" class="close" data-dismiss="alert" aria-label="Close">\n+                                <span aria-hidden="true">&times;</span></button>\n+                                  The number of outliers is too large to display. Representation shows randomly downsampled outliers.\n+                            </div>\n+                          </div>\n+                        </div>\n+\n+                        <div id="plotDivbp" class="col-md-8" style="height:100%;"></div>\n+\n+                        <div id="popDivbp" class="col-md-2" style="height:100%;">\n+                            <button id="updateDisplaybp" class="igbtn">Reset Display</button>\n+                            <table id="popTablebp" class="table table-condensed table-bordered igtable">\n+                                <thead>\n+                                    <tr>\n+                                        <th><input type="checkbox" checked id="popSelectAllbp"/></th>\n+                                        <th>Pop. Names</th>\n+                                        <th>Color</th>\n+                                     </tr>\n+                                </thead>\n+                                <tbody>\n+                                </tbody>\n+                            </table>\n+                        </div>\n+                    </div>\n+                </div>\n+            </div>\n+        </div>\n+    </div>\n+</div>\n+\n+<script>\n+var mfiLoaded = false;\n+var populationLoaded = false;\n+var overviewPlotLoaded = false;\n+var scatter2DLoaded = false;\n+var scatter3DLoaded = false;\n+var parallelCoordinatesLoaded = false;\n+var bpLoaded = false;\n+\n+$().ready(function() {\n+    $(document).on(\'shown.bs.tab\',\'a[data-toggle="tab"]\', function(e) {\n+      var tab = e.target.getAttribute("href");\n+      if (tab == \'#mfi\') {\n+        if (mfiLoaded) {\n+            return true;\n+        }\n+        mfiLoaded = true;\n+        displayMFI();\n+      }\n+      if (tab == \'#overviewPlot\') {\n+        if (overviewPlotLoaded) {\n+            return true;\n+        }\n+        overviewPlotLoaded = true;\n+        displayOverviewPlot();\n+      }\n+      if (tab == \'#scatter2D\') {\n+        if (scatter2DLoaded) {\n+            displayScatterPopulation2D();\n+            return true;\n+        }\n+        scatter2DLoaded = true;\n+        displayScatter2D();\n+      }\n+      if (tab == \'#scatter3D\') {\n+        if (scatter3DLoaded) {\n+            displayScatterPopulation3D();\n+            return true;\n+        }\n+        scatter3DLoaded = true;\n+        displayScatter3D();\n+      }\n+      if (tab == \'#parallelCoordinates\') {\n+        if (parallelCoordinatesLoaded) {\n+            displayPopTable();\n+            displayTableGrid();\n+            return true;\n+        }\n+        parallelCoordinatesLoaded = true;\n+        displayParallelCoordinates();\n+      }\n+      if (tab == \'#boxplots\') {\n+        if (bpLoaded) {\n+            displayPopulationLegend(configbp);\n+            displayMarkerTable(configbp);\n+            updateBoxplot(configbp);\n+            return true;\n+        }\n+        bpLoaded = true;\n+        displayMFIBoxplot();\n+      }\n+    });\n+\n+    mfiLoaded = true;\n+    displayMFI();\n+});\n+</script>\n+</body>\n+</html>\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/CLprofiles.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/CLprofiles.txt Mon Feb 27 12:54:37 2017 -0500
b
@@ -0,0 +1,27 @@
+Population FlowCL Query Nb Results Link to PDF Top Result Label Top Result Score Top Result CL
+1 <a href="flowcl_pop01.txt" target="_blank">CD4+CCR7-</a> 3 <a href="flowcl_pop01.pdf" target="_blank">PDF</a> effector CD4-positive, alpha-beta T cell 0.333 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001044" target="_blank">CL_0001044</a>
+2 <a href="flowcl_pop01.txt" target="_blank">CD4+CCR7-</a> 3 <a href="flowcl_pop01.pdf" target="_blank">PDF</a> effector CD4-positive, alpha-beta T cell 0.333 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001044" target="_blank">CL_0001044</a>
+3 <a href="flowcl_pop01.txt" target="_blank">CD4+CCR7-</a> 3 <a href="flowcl_pop01.pdf" target="_blank">PDF</a> effector CD4-positive, alpha-beta T cell 0.333 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001044" target="_blank">CL_0001044</a>
+4 <a href="flowcl_pop04.txt" target="_blank">CD4-CCR7-</a> 5 <a href="flowcl_pop04.pdf" target="_blank">PDF</a> effector CD8-positive, alpha-beta T cell 0.333 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001050" target="_blank">CL_0001050</a>
+5 <a href="flowcl_pop04.txt" target="_blank">CD4-CCR7-</a> 5 <a href="flowcl_pop04.pdf" target="_blank">PDF</a> effector CD8-positive, alpha-beta T cell 0.333 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001050" target="_blank">CL_0001050</a>
+6 <a href="flowcl_pop04.txt" target="_blank">CD4-CCR7-</a> 5 <a href="flowcl_pop04.pdf" target="_blank">PDF</a> effector CD8-positive, alpha-beta T cell 0.333 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001050" target="_blank">CL_0001050</a>
+7 <a href="flowcl_pop07.txt" target="_blank">CD4-CCR7lo</a> 5+ <a href="flowcl_pop07.pdf" target="_blank">PDF</a> long term hematopoietic stem cell -0.043 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0002034" target="_blank">CL_0002034</a>
+8 <a href="flowcl_pop01.txt" target="_blank">CD4+CCR7-</a> 3 <a href="flowcl_pop01.pdf" target="_blank">PDF</a> effector CD4-positive, alpha-beta T cell 0.333 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001044" target="_blank">CL_0001044</a>
+9 <a href="flowcl_pop07.txt" target="_blank">CD4-CCR7lo</a> 5+ <a href="flowcl_pop07.pdf" target="_blank">PDF</a> long term hematopoietic stem cell -0.043 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0002034" target="_blank">CL_0002034</a>
+10 <a href="flowcl_pop01.txt" target="_blank">CD4+CCR7-</a> 3 <a href="flowcl_pop01.pdf" target="_blank">PDF</a> effector CD4-positive, alpha-beta T cell 0.333 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001044" target="_blank">CL_0001044</a>
+11 <a href="flowcl_pop04.txt" target="_blank">CD4-CCR7-</a> 5 <a href="flowcl_pop04.pdf" target="_blank">PDF</a> effector CD8-positive, alpha-beta T cell 0.333 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001050" target="_blank">CL_0001050</a>
+12 <a href="flowcl_pop04.txt" target="_blank">CD4-CCR7-</a> 5 <a href="flowcl_pop04.pdf" target="_blank">PDF</a> effector CD8-positive, alpha-beta T cell 0.333 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001050" target="_blank">CL_0001050</a>
+13 <a href="flowcl_pop13.txt" target="_blank">CD4+CCR7lo</a> 5+ <a href="flowcl_pop13.pdf" target="_blank">PDF</a> mature CD8_alpha-negative CD11b-positive dendritic cell 2)"        -0.071 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001003" target="_blank">CL_0001003</a>
+14 <a href="flowcl_pop14.txt" target="_blank">CD4+CCR7+</a> 4 <a href="flowcl_pop14.pdf" target="_blank">PDF</a> naive thymus-derived CD4-positive, alpha-beta T cell 0.2 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0000895" target="_blank">CL_0000895</a>
+15 <a href="flowcl_pop15.txt" target="_blank">CD4loCCR7-</a> 5 <a href="flowcl_pop15.pdf" target="_blank">PDF</a> effector memory CD4-positive, alpha-beta T cell -0.091 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0000905" target="_blank">CL_0000905</a>
+16 <a href="flowcl_pop07.txt" target="_blank">CD4-CCR7lo</a> 5+ <a href="flowcl_pop07.pdf" target="_blank">PDF</a> long term hematopoietic stem cell -0.043 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0002034" target="_blank">CL_0002034</a>
+17 <a href="flowcl_pop14.txt" target="_blank">CD4+CCR7+</a> 4 <a href="flowcl_pop14.pdf" target="_blank">PDF</a> naive thymus-derived CD4-positive, alpha-beta T cell 0.2 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0000895" target="_blank">CL_0000895</a>
+18 <a href="flowcl_pop01.txt" target="_blank">CD4+CCR7-</a> 3 <a href="flowcl_pop01.pdf" target="_blank">PDF</a> effector CD4-positive, alpha-beta T cell 0.333 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001044" target="_blank">CL_0001044</a>
+19 <a href="flowcl_pop19.txt" target="_blank">CD4loCCR7+</a> 5+ <a href="flowcl_pop19.pdf" target="_blank">PDF</a> naive CCR4-positive regulatory T cell -0.083 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001045" target="_blank">CL_0001045</a>
+20 <a href="flowcl_pop20.txt" target="_blank">CD4-CCR7+</a> 2 <a href="flowcl_pop20.pdf" target="_blank">PDF</a> naive thymus-derived CD8-positive, alpha-beta T cell 0.2 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0000900" target="_blank">CL_0000900</a>
+21 <a href="flowcl_pop04.txt" target="_blank">CD4-CCR7-</a> 5 <a href="flowcl_pop04.pdf" target="_blank">PDF</a> effector CD8-positive, alpha-beta T cell 0.333 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0001050" target="_blank">CL_0001050</a>
+22 <a href="flowcl_pop15.txt" target="_blank">CD4loCCR7-</a> 5 <a href="flowcl_pop15.pdf" target="_blank">PDF</a> effector memory CD4-positive, alpha-beta T cell -0.091 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0000905" target="_blank">CL_0000905</a>
+23 <a href="flowcl_pop23.txt" target="_blank">CD4loCCR7lo</a> 2 <a href="flowcl_pop23.pdf" target="_blank">PDF</a> immature NK T cell stage I -0.167 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0002039" target="_blank">CL_0002039</a>
+24 <a href="flowcl_pop15.txt" target="_blank">CD4loCCR7-</a> 5 <a href="flowcl_pop15.pdf" target="_blank">PDF</a> effector memory CD4-positive, alpha-beta T cell -0.091 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0000905" target="_blank">CL_0000905</a>
+25 <a href="flowcl_pop07.txt" target="_blank">CD4-CCR7lo</a> 5+ <a href="flowcl_pop07.pdf" target="_blank">PDF</a> long term hematopoietic stem cell -0.043 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0002034" target="_blank">CL_0002034</a>
+26 <a href="flowcl_pop23.txt" target="_blank">CD4loCCR7lo</a> 2 <a href="flowcl_pop23.pdf" target="_blank">PDF</a> immature NK T cell stage I -0.167 <a href="http://www.immport-labs.org/immport-ontology/public/home/home/CL:0002039" target="_blank">CL_0002039</a>
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/boxplotData.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/boxplotData.json Mon Feb 27 12:54:37 2017 -0500
[
b'@@ -0,0 +1,1 @@\n+{"lower": {"CCR7":{"1":38.5,"2":-109.5,"3":-183.0,"4":-117.0,"5":-175.5,"6":-157.5,"7":68.5,"8":73.0,"9":140.375,"10":-94.5,"11":-128.0,"12":27.5,"13":137.875,"14":344.5,"15":-182.5,"16":264.5,"17":405.125,"18":40.5,"19":207.5,"20":254.0,"21":97.0,"22":11.5,"23":370.375,"24":21.5,"25":172.5,"26":201.375},"CD4":{"1":444.5,"2":443.5,"3":435.25,"4":-102.5,"5":-106.5,"6":-76.0,"7":-68.5,"8":449.5,"9":-68.0,"10":444.5,"11":-65.5,"12":-25.25,"13":415.0,"14":433.5,"15":195.75,"16":-57.375,"17":377.5,"18":447.0,"19":237.0,"20":-68.0,"21":24.5,"22":252.5,"23":272.5,"24":276.375,"25":72.5,"26":-10.5}}, "mfi": {"CCR7":{"1":188,"2":37,"3":69,"4":141,"5":68,"6":90,"7":318,"8":258,"9":420,"10":31,"11":111,"12":213,"13":424,"14":566,"15":84,"16":510,"17":598,"18":199,"19":629,"20":534,"21":224,"22":204,"23":476,"24":204,"25":269,"26":343},"CD4":{"1":520,"2":523,"3":512,"4":84,"5":56,"6":75,"7":83,"8":517,"9":138,"10":521,"11":85,"12":119,"13":516,"14":526,"15":322,"16":104,"17":509,"18":524,"19":490,"20":82,"21":145,"22":389,"23":366,"24":392,"25":182,"26":325}}, "outliers": {"CCR7":{"1":[340,373,371,379,355,373,331,340,346,334,348,334,346,341,358,356,370,338,359,336,354,333,353,342,367,345,341,338,341,344],"2":[],"3":[],"4":[],"5":[],"6":[],"7":[],"8":[525,460,426,426,512,579,504,554,437,647,463,499,492,520,505,441,468,430,515,563,436,430,459,577,450,458,474,449,444,513,477,501,444,438,431,441,577,486,447,497,599,443,439,426,474,448,438,508,444,437,521,432,516,428,443,511,530,541,469,507,432,452,454,427,488,436,507],"9":[711,706,725,761,693,768,676,699,817,855,679,714,771,780,825,829],"10":[],"11":[],"12":[0,13,0,26,399],"13":[750,120,727,753,711,735,724,711,735,714,710,768,780],"14":[],"15":[],"16":[743,815,836,817,784,822,741,761,850,771,817,772,750],"17":[851,797,897,867,823,811,893,786,393,811,398],"18":[365,351,372,351,378,372,367,353,361,355,365,371,384,377,349,388,367,380,401,378,379,371,371,375,358,355],"19":[],"20":[],"21":[28,83,74,22,26,67,49,82,90,0,0,56,15,85,80,32,87,19,61,35,96,16,70,90,81,66,59,74,54,87,63,77,94,36,96,73,81,53,32,20,32,81,51,54,51,1,69,94,72,77,31,91,71,70,35,0,89,67,0,70,79,77,43,93,0,0,381,12,61,0,62,76,372,70,92,95,92,93,56,74,82,67,66,53,77,71,0,49,71,96,93,0,88,61,64,96,78,74,34,91],"22":[7,0,0,0,0,422,0,0,5,6,0,0,0,0,0,0,0,0,0,412,0,0,0,0,0,0,0,0,0,1,0,0,0,6,0,0,0,0,0,0,0,0,0,430,446,0,0,421],"23":[368,685,615,588,747,874,798,677,635,637,578,849,856,725,952,647,822,578,738,250,677,615,742,615,603,256,236,574,657,675,661,584,299,327,638,340,599,271,321,332,332,607,355,570,607,572,328,589,584,311,312,700,590,659,613,361,356,253,292,347,707,654,360,771,684,342,640,608,837,920,579,907,835,569,594,667,800,597,786,731,595,890,800,637,692,727,643,685,358,710,587,609,978,750,335,753,638],"24":[0,0,0,5,0,0,0,15,0,6,0,4,0,0,7,0,4,0,0,18,0,4,0,0,0,0,0,0,21,0,0,0,407,0,4,0,494,0,2,19,7,496,0,468,0,0,499],"25":[170,450,171,150,161,469,158,168,163,151,117,142,98,395,371,156,84,160,430,171,156,156,169,166,141,114,170,161,430,137,170,145,373,423,114,158,6,134,166,400,146,148,67,397,453,448,101,159,412,147,149,171,162,157,155,159,164,126,167,479,131,150,99,142,126,167,379,139,167,428,438,445,107,169,164,158,463,101,155,96,375,424,98,131,397,123,373,152,157,131,372,131,407,169,169,171,129,169,404,377],"26":[179,138,193,500,496,475,478,521,164,479,478,183,560,483,503,485,479,160,513,175,482,523,199,184,189,512,535,499,603,161,482,515,521,526,546,482,531,506,543,507,479,495,617,526,482,501,622,479,478,492,489,484,534,495,492,476,560,487,560,508]},"CD4":{"1":[423,415,350,432,355,405,439,427,349,408,350,439,416,332,410,377,626,436,393,417,371,421,419,434,439,381,440,348,361,444,393,354,418,379,389,361,421,439,359,413,433,418,444,368,338,354,383,323,397,404,441,425,357,406,354,429,434,427,382,430,414,338,384,442,430,413,367,413,398,441,403,437,441,440,409,434,377,440,421,371,380,441,393,398,405,443,405,441,343,443,444,399,406,433,609,439,443,438,369,423],"2":[428,409,398,414,392,439,416,613,422,437,442,420,'..b'3,418,414,337,320,446,358],"19":[764,768,775,235,216,208,210,1023,193],"20":[304,302,313,363,346,261,305,249,299,235,260],"21":[271,11,22,278,10,0,300,0,280,275,287,276,328,23,269,363,0,13,10,282,0,22,6,0,311,12,0,11,3,12,306,0,0,0,0,12,290,0,21,0,21,11,23,293,0,0,6,324,24,0,24,357,10,273,0,7,0,18,12,20,18,0,8,8,10,357,281,0,24,20,0,0,0,8,274,1,323,307,0,394,18,277,280,299,0,0,0,0,0,17,10,0,21,283,5,10,24,0,269,0],"22":[213,83,561,93,204,194,247,588,242,136,113,219,228,170,215,177,579,163,136,220,197,573,252,235,578,95,623,246,177,251,209,633,203,161,550,185,250,579,89,169,139,214,240,151,246,126,178,97,241,250,150,244,190,576,221,226,243,205,214,223,176,188,242,229,191,134,540,249,237,242,171,195,178,169,214,223,208],"23":[248,503,179,240,259,505,536,269,499,517,196,628,270,268,231,494,575,548,529,211,505,580,505,181,262,229,211,517,525,216,189,512,196,492,267,178,189,591,238,499,225,252,494,493,260,484,548,540,249,239,177,205,465,224,536,479,231,697,465,255,237,180,262,269,488,521,187,249,549,272,216,538,248],"24":[528,115,273,573,262,220,90,215,271,195,215,200,247,569,585,181,528,226,234,517,554,269,263,611,263,519,110,247,252,255,547,546,271,269,574,262,213,578,232,203,258,264,174,537,611,559,260,253,255,267,274,253,186,206,618,162,248,271,578,251,181,273,236,521,245,179,618,231],"25":[69,293,298,387,52,3,68,18,320,0,65,71,18,66,296,43,39,62,44,41,68,71,305,318,59,301,69,47,40,72,313,483,23,63,35,56,387,36,55,45,52,304,382,357,327,43,53,307,61,315,67,316,31,63,293,406,332,39,341,293,72,296,335,39,24,311,318,357,34,68,317,65,41,11,390,47,307,53,330,71,48,65,372,293,58,50,347,309,65,308,298,66,64,61,294,30,37,0,35,299],"26":[]}}, "q1": {"CCR7":{"1":148.0,"2":0.0,"3":0.0,"4":75.0,"5":0.0,"6":24.0,"7":256.0,"8":205.0,"9":339.5,"10":0.0,"11":49.0,"12":164.0,"13":352.0,"14":514.0,"15":8.0,"16":443.0,"17":547.25,"18":156.0,"19":515.0,"20":464.0,"21":196.0,"22":160.0,"23":442.0,"24":164.0,"25":246.0,"26":303.75},"CD4":{"1":503.0,"2":505.0,"3":494.5,"4":31.0,"5":12.0,"6":35.0,"7":44.0,"8":502.0,"9":79.0,"10":503.0,"11":47.0,"12":80.5,"13":493.0,"14":504.0,"15":291.0,"16":60.0,"17":484.0,"18":507.0,"19":426.0,"20":43.0,"21":116.0,"22":359.0,"23":343.0,"24":366.0,"25":155.0,"26":246.0}}, "q2": {"CCR7":{"1":182.0,"2":21.0,"3":68.0,"4":147.0,"5":61.0,"6":95.0,"7":323.0,"8":244.0,"9":404.5,"10":11.0,"11":114.0,"12":210.0,"13":426.0,"14":580.5,"15":88.0,"16":502.0,"17":603.0,"18":193.0,"19":593.0,"20":515.0,"21":234.0,"22":215.0,"23":465.0,"24":217.0,"25":272.0,"26":334.0},"CD4":{"1":524.0,"2":526.0,"3":516.0,"4":77.0,"5":52.0,"6":72.0,"7":85.0,"8":520.0,"9":125.5,"10":524.0,"11":86.0,"12":115.0,"13":521.0,"14":530.0,"15":324.0,"16":101.5,"17":529.5,"18":528.0,"19":480.0,"20":84.0,"21":147.0,"22":398.0,"23":365.0,"24":400.0,"25":184.0,"26":296.0}}, "q3": {"CCR7":{"1":221.0,"2":73.0,"3":122.0,"4":203.0,"5":117.0,"6":145.0,"7":381.0,"8":293.0,"9":472.25,"10":63.0,"11":167.0,"12":255.0,"13":494.75,"14":627.0,"15":135.0,"16":562.0,"17":642.0,"18":233.0,"19":720.0,"20":604.0,"21":262.0,"22":259.0,"23":489.75,"24":259.0,"25":295.0,"26":372.0},"CD4":{"1":542.0,"2":546.0,"3":534.0,"4":120.0,"5":91.0,"6":109.0,"7":119.0,"8":537.0,"9":177.0,"10":542.0,"11":122.0,"12":151.0,"13":545.0,"14":551.0,"15":354.5,"16":138.25,"17":555.0,"18":547.0,"19":552.0,"20":117.0,"21":177.0,"22":430.0,"23":390.0,"24":425.75,"25":210.0,"26":417.0}}, "upper": {"CCR7":{"1":330.5,"2":182.5,"3":305.0,"4":395.0,"5":292.5,"6":326.5,"7":568.5,"8":425.0,"9":671.375,"10":157.5,"11":344.0,"12":391.5,"13":708.875,"14":796.5,"15":325.5,"16":740.5,"17":784.125,"18":348.5,"19":1027.5,"20":814.0,"21":361.0,"22":407.5,"23":561.375,"24":401.5,"25":368.5,"26":474.375},"CD4":{"1":600.5,"2":607.5,"3":593.25,"4":253.5,"5":209.5,"6":220.0,"7":231.5,"8":589.5,"9":324.0,"10":600.5,"11":234.5,"12":256.75,"13":623.0,"14":621.5,"15":449.75,"16":255.625,"17":661.5,"18":607.0,"19":741.0,"20":228.0,"21":268.5,"22":536.5,"23":460.5,"24":515.375,"25":292.5,"26":673.5}}}\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flow.mfi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flow.mfi Mon Feb 27 12:54:37 2017 -0500
b
@@ -0,0 +1,27 @@
+Population CD4 CCR7
+1 520 188
+2 523 37
+3 512 69
+4 84 141
+5 56 68
+6 75 90
+7 83 318
+8 517 258
+9 138 420
+10 521 31
+11 85 111
+12 119 213
+13 516 424
+14 526 566
+15 322 84
+16 104 510
+17 509 598
+18 524 199
+19 490 629
+20 82 534
+21 145 224
+22 389 204
+23 366 476
+24 392 204
+25 182 269
+26 325 343
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flow.mfi_pop
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flow.mfi_pop Mon Feb 27 12:54:37 2017 -0500
b
@@ -0,0 +1,27 @@
+CD4 CCR7 Count Percentage Population
+519.72 187.88 3842 6.40 1
+522.94 37.10 2765 4.61 2
+512.11 68.72 2163 3.61 3
+83.54 141.19 1207 2.01 4
+55.56 67.51 2332 3.89 5
+75.33 90.47 3969 6.62 6
+82.72 318.03 1809 3.02 7
+517.07 257.64 2260 3.77 8
+138.25 419.51 342 0.57 9
+520.67 31.29 3497 5.83 10
+85.41 110.92 1903 3.17 11
+119.09 212.60 1599 2.67 12
+515.81 423.78 2238 3.73 13
+525.80 565.61 930 1.55 14
+322.30 84.31 555 0.93 15
+103.98 509.50 872 1.45 16
+509.05 597.98 362 0.60 17
+524.02 198.53 2601 4.34 18
+489.73 629.26 341 0.57 19
+81.83 534.25 1750 2.92 20
+144.71 224.04 9174 15.29 21
+388.94 203.73 1401 2.34 22
+365.75 476.01 1058 1.76 23
+392.21 204.17 1166 1.94 24
+181.69 268.60 8725 14.54 25
+325.42 342.86 1136 1.89 26
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flow.overview
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flow.overview Mon Feb 27 12:54:37 2017 -0500
b
@@ -0,0 +1,13 @@
+<table>
+<tr><td>&nbsp;</td>
+<td>CD4</td>
+<td>CCR7</td>
+<tr>
+<td>CD4</td>
+<td><img src="m0_m0_90X90.png"/></td><td><img src="m1_m0_90X90.png"/></td></tr>
+<tr>
+<td>CCR7</td>
+<td><img src="m0_m1_90X90.png"/></td><td><img src="m1_m1_90X90.png"/></td></tr>
+</table>
+</body>
+<html>
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flow.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flow.sample Mon Feb 27 12:54:37 2017 -0500
b
b'@@ -0,0 +1,20001 @@\n+CD4\tCCR7\tPopulation\n+392\t178\t24\n+560\t9\t10\n+345\t166\t15\n+180\t225\t21\n+123\t280\t25\n+555\t186\t1\n+521\t217\t1\n+98\t47\t6\n+182\t117\t12\n+251\t179\t26\n+160\t0\t6\n+85\t127\t6\n+0\t62\t5\n+146\t7\t6\n+446\t0\t10\n+556\t139\t18\n+138\t201\t21\n+556\t0\t10\n+96\t166\t6\n+141\t0\t5\n+525\t239\t18\n+64\t90\t6\n+551\t202\t18\n+507\t171\t1\n+106\t118\t6\n+14\t181\t6\n+181\t124\t6\n+467\t137\t1\n+200\t285\t25\n+143\t239\t21\n+506\t128\t1\n+496\t67\t10\n+157\t257\t25\n+57\t73\t5\n+511\t133\t18\n+519\t276\t1\n+160\t265\t25\n+170\t104\t12\n+470\t127\t1\n+214\t300\t25\n+535\t0\t2\n+78\t0\t6\n+135\t0\t5\n+70\t230\t21\n+32\t0\t6\n+205\t296\t25\n+28\t145\t6\n+520\t145\t1\n+533\t39\t10\n+0\t0\t5\n+495\t0\t2\n+497\t185\t18\n+147\t347\t21\n+87\t0\t6\n+30\t0\t6\n+543\t0\t10\n+92\t139\t5\n+0\t0\t6\n+567\t221\t18\n+151\t276\t21\n+518\t141\t18\n+213\t197\t22\n+549\t61\t2\n+562\t207\t18\n+5\t28\t5\n+63\t79\t6\n+120\t80\t21\n+21\t133\t5\n+141\t326\t25\n+180\t271\t21\n+114\t155\t21\n+216\t262\t25\n+0\t36\t5\n+459\t35\t2\n+85\t45\t6\n+534\t136\t1\n+24\t0\t5\n+227\t330\t25\n+554\t136\t1\n+127\t164\t21\n+201\t210\t25\n+429\t148\t18\n+160\t125\t21\n+153\t47\t5\n+76\t145\t6\n+545\t57\t10\n+134\t233\t21\n+481\t141\t1\n+516\t168\t1\n+174\t231\t21\n+470\t158\t1\n+128\t121\t12\n+467\t147\t1\n+133\t200\t12\n+318\t0\t15\n+181\t273\t25\n+526\t254\t1\n+223\t121\t15\n+121\t124\t21\n+57\t171\t6\n+164\t302\t21\n+382\t286\t22\n+71\t237\t21\n+500\t137\t1\n+501\t0\t2\n+519\t190\t18\n+488\t165\t1\n+523\t42\t2\n+475\t86\t2\n+538\t0\t2\n+26\t22\t6\n+157\t174\t21\n+548\t21\t10\n+203\t234\t25\n+161\t283\t25\n+60\t127\t6\n+522\t0\t2\n+69\t235\t21\n+63\t142\t6\n+171\t277\t25\n+177\t252\t21\n+138\t0\t5\n+73\t226\t21\n+529\t194\t1\n+99\t0\t6\n+0\t192\t5\n+145\t243\t21\n+579\t0\t2\n+555\t216\t1\n+525\t132\t18\n+213\t204\t21\n+202\t253\t25\n+53\t0\t6\n+0\t77\t6\n+58\t247\t21\n+546\t0\t10\n+144\t286\t25\n+84\t0\t5\n+101\t120\t5\n+564\t148\t18\n+498\t0\t10\n+576\t280\t1\n+217\t280\t21\n+0\t16\t5\n+111\t135\t6\n+514\t13\t2\n+287\t135\t15\n+330\t440\t23\n+398\t471\t23\n+567\t109\t1\n+0\t242\t6\n+215\t178\t21\n+586\t0\t2\n+56\t261\t21\n+93\t233\t25\n+128\t140\t12\n+550\t129\t1\n+105\t0\t5\n+493\t138\t18\n+112\t88\t12\n+518\t178\t18\n+510\t220\t1\n+491\t0\t10\n+552\t117\t3\n+459\t156\t22\n+87\t87\t6\n+55\t135\t6\n+148\t117\t6\n+174\t237\t25\n+237\t264\t25\n+169\t195\t12\n+119\t204\t25\n+43\t0\t6\n+558\t190\t1\n+581\t66\t2\n+180\t265\t25\n+118\t199\t21\n+155\t229\t21\n+494\t0\t2\n+400\t236\t22\n+264\t150\t21\n+37\t0\t6\n+538\t79\t10\n+226\t218\t25\n+538\t90\t2\n+544\t146\t1\n+330\t451\t17\n+547\t108\t1\n+166\t236\t21\n+126\t0\t6\n+519\t107\t10\n+520\t0\t2\n+81\t82\t5\n+222\t231\t25\n+495\t45\t2\n+277\t300\t25\n+554\t224\t18\n+558\t144\t1\n+112\t134\t6\n+512\t206\t1\n+407\t178\t24\n+516\t166\t18\n+283\t377\t16\n+528\t147\t1\n+501\t24\t2\n+140\t113\t6\n+555\t0\t2\n+470\t0\t2\n+46\t37\t6\n+562\t222\t18\n+7\t18\t6\n+24\t102\t6\n+227\t331\t25\n+155\t74\t5\n+538\t0\t10\n+542\t177\t1\n+12\t160\t6\n+180\t305\t21\n+0\t149\t6\n+541\t10\t10\n+120\t227\t21\n+504\t81\t2\n+535\t196\t18\n+536\t243\t18\n+503\t45\t2\n+112\t205\t12\n+212\t203\t12\n+542\t174\t18\n+287\t237\t24\n+75\t98\t6\n+161\t247\t21\n+167\t301\t25\n+164\t531\t9\n+524\t58\t2\n+564\t267\t1\n+500\t81\t2\n+538\t187\t1\n+555\t129\t18\n+61\t39\t6\n+524\t136\t1\n+492\t144\t18\n+105\t263\t21\n+539\t287\t1\n+538\t0\t10\n+135\t174\t21\n+527\t170\t1\n+529\t86\t10\n+196\t278\t25\n+201\t295\t25\n+232\t258\t21\n+165\t3\t6\n+173\t154\t21\n+588\t148\t1\n+79\t263\t21\n+501\t70\t10\n+132\t184\t21\n+518\t173\t18\n+486\t0\t10\n+460\t0\t2\n+535\t216\t18\n+197\t303\t25\n+158\t180\t21\n+159\t117\t21\n+541\t158\t1\n+552\t217\t18\n+0\t88\t5\n+164\t272\t21\n+286\t12\t15\n+578\t0\t2\n+538\t0\t2\n+13\t0\t6\n+91\t75\t6\n+78\t212\t21\n+532\t190\t1\n+62\t0\t6\n+540\t173\t18\n+511\t190\t18\n+551\t44\t10\n+420\t152\t22\n+226\t306\t25\n+88\t119\t4\n+180\t258\t21\n+79\t305\t21\n+84\t0\t6\n+493\t0\t10\n+78\t156\t6\n+162\t210\t25\n+155\t0\t6\n+512\t275\t18\n+33\t195\t21\n+549\t46\t2\n+74\t280\t21\n+13\t126\t6\n+467\t263\t18\n+424\t254\t24\n+188\t308\t25\n+19\t167\t6\n+185\t189\t25\n+188\t267\t25\n+18\t80\t6\n+132\t265\t21\n+441\t143\t1\n+153\t255\t7\n+526\t105\t2\n+72\t109\t6\n+524\t213\t1\n+511\t226\t1\n+31\t0\t5\n+0\t36\t5\n+496\t0\t2\n+134\t245\t21\n+532\t141\t18\n+83\t230\t12\n+505\t26\t2\n+550\t204\t18\n+244\t348\t25\n+36\t0\t6\n+0\t81\t6\n+540\t7\t2\n+522\t152\t1\n+111\t158\t6\n+450\t116\t1\n+545\t0\t2\n+214\t230\t25\n+538\t0\t10\n+538\t44\t2\n+16\t0\t6\n+0\t14\t5\n+137\t227\t21\n+480\t165\t18\n+528\t188\t1\n+112\t169\t21\n+492\t8\t2\n+495\t0\t2\n+157\t205\t25\n+508\t0\t10\n+495\t136\t1\n+12\t240\t21\n+525\t108\t1\n+593\t20\t2\n+485\t0\t2\n+196\t167\t21\n+488\t169\t18\n+107\t277\t21\n+139\t265\t21\n+77\t200\t21\n+565\t136\t1\n+185\t263\t21\n+51\t0\t5\n+281\t349\t26\n+520\t0\t10\n+557\t160\t18\n+537\t0\t2\n+109\t255\t21\n+501\t0\t10\n+497\t22\t2\n+128\t261\t25\n+558\t10\t10\n+548\t0\t2\n+570\t76\t10\n+390\t296\t22\n+0\t0\t5\n+122\t51\t5\n+508\t145\t18\n+114\t258\t21\n+552\t201\t18\n+145\t0\t6\n+36\t262\t21\n+192\t291'..b'\n+487\t608\t17\n+67\t615\t20\n+129\t640\t20\n+533\t602\t17\n+555\t574\t14\n+46\t635\t20\n+566\t720\t14\n+42\t481\t20\n+0\t490\t20\n+0\t488\t20\n+540\t612\t17\n+84\t527\t20\n+132\t434\t20\n+573\t687\t17\n+532\t587\t17\n+0\t431\t20\n+125\t664\t20\n+528\t634\t14\n+552\t614\t17\n+556\t604\t14\n+549\t472\t14\n+584\t461\t14\n+492\t483\t14\n+551\t531\t14\n+533\t692\t14\n+552\t605\t17\n+487\t516\t14\n+502\t617\t14\n+56\t529\t20\n+577\t489\t14\n+106\t629\t20\n+101\t619\t20\n+140\t453\t20\n+530\t528\t14\n+477\t467\t14\n+128\t499\t20\n+97\t531\t20\n+536\t485\t14\n+143\t644\t20\n+0\t587\t20\n+569\t659\t17\n+26\t539\t20\n+569\t631\t17\n+574\t597\t17\n+151\t475\t20\n+0\t713\t20\n+150\t459\t20\n+533\t626\t14\n+147\t641\t20\n+473\t583\t14\n+562\t667\t14\n+80\t474\t20\n+78\t432\t20\n+502\t587\t17\n+0\t529\t20\n+0\t613\t20\n+78\t446\t20\n+117\t414\t20\n+73\t575\t20\n+392\t645\t17\n+132\t445\t20\n+500\t594\t14\n+533\t531\t14\n+48\t665\t20\n+153\t617\t20\n+95\t456\t20\n+528\t456\t14\n+53\t456\t20\n+76\t498\t20\n+501\t487\t17\n+103\t485\t20\n+501\t614\t17\n+505\t600\t17\n+520\t602\t14\n+82\t472\t20\n+99\t470\t20\n+561\t435\t14\n+71\t475\t20\n+552\t559\t17\n+560\t408\t14\n+503\t595\t14\n+484\t557\t14\n+71\t496\t20\n+49\t521\t20\n+505\t647\t14\n+88\t589\t20\n+531\t477\t14\n+624\t620\t14\n+540\t580\t17\n+97\t595\t20\n+78\t552\t20\n+136\t479\t20\n+507\t377\t14\n+126\t566\t20\n+97\t512\t20\n+0\t595\t20\n+485\t517\t14\n+424\t422\t17\n+487\t591\t14\n+43\t476\t20\n+58\t453\t20\n+444\t615\t17\n+48\t669\t20\n+508\t633\t14\n+91\t472\t20\n+567\t650\t14\n+129\t507\t20\n+69\t537\t20\n+569\t395\t14\n+4\t568\t20\n+11\t585\t20\n+0\t426\t20\n+574\t561\t14\n+527\t601\t17\n+98\t590\t20\n+528\t456\t14\n+563\t600\t17\n+67\t464\t20\n+75\t599\t20\n+148\t559\t20\n+19\t523\t20\n+558\t636\t14\n+0\t515\t20\n+97\t431\t20\n+509\t626\t14\n+85\t475\t20\n+139\t592\t20\n+541\t706\t17\n+0\t438\t20\n+0\t503\t20\n+96\t612\t20\n+96\t426\t20\n+155\t678\t20\n+116\t475\t20\n+39\t455\t20\n+69\t447\t20\n+91\t476\t20\n+575\t641\t14\n+127\t465\t20\n+6\t438\t20\n+94\t471\t20\n+525\t653\t17\n+100\t602\t20\n+113\t621\t20\n+165\t514\t20\n+14\t575\t20\n+577\t535\t14\n+566\t441\t14\n+148\t583\t20\n+114\t441\t20\n+57\t506\t20\n+580\t565\t14\n+60\t565\t20\n+99\t466\t20\n+70\t446\t20\n+474\t580\t17\n+545\t546\t14\n+73\t435\t20\n+16\t431\t20\n+24\t486\t20\n+1\t634\t20\n+180\t590\t20\n+60\t422\t20\n+609\t636\t14\n+515\t455\t14\n+114\t570\t20\n+110\t503\t20\n+0\t599\t20\n+43\t589\t20\n+550\t622\t14\n+494\t451\t14\n+108\t508\t20\n+576\t673\t14\n+28\t541\t20\n+0\t456\t20\n+572\t580\t14\n+0\t459\t20\n+0\t471\t20\n+299\t521\t17\n+71\t635\t20\n+83\t648\t20\n+479\t692\t17\n+108\t438\t20\n+85\t550\t20\n+140\t739\t20\n+191\t543\t20\n+123\t477\t20\n+66\t679\t20\n+24\t520\t20\n+67\t653\t20\n+83\t560\t20\n+545\t680\t17\n+500\t488\t14\n+576\t423\t14\n+70\t471\t20\n+35\t681\t20\n+540\t607\t14\n+575\t602\t14\n+6\t519\t20\n+514\t462\t17\n+106\t631\t20\n+76\t639\t20\n+562\t625\t14\n+111\t627\t20\n+517\t538\t14\n+0\t502\t20\n+149\t468\t20\n+560\t537\t14\n+497\t541\t14\n+83\t514\t20\n+86\t524\t20\n+556\t611\t14\n+545\t698\t14\n+100\t658\t20\n+90\t587\t20\n+560\t631\t14\n+575\t628\t14\n+0\t507\t20\n+117\t499\t20\n+120\t693\t20\n+568\t539\t14\n+111\t451\t20\n+525\t514\t14\n+522\t511\t14\n+20\t587\t20\n+98\t500\t20\n+141\t463\t20\n+527\t522\t14\n+41\t424\t20\n+494\t595\t14\n+87\t495\t20\n+18\t477\t20\n+531\t443\t14\n+98\t571\t20\n+542\t568\t14\n+106\t445\t20\n+0\t436\t20\n+547\t658\t14\n+0\t545\t20\n+470\t455\t14\n+562\t632\t14\n+550\t498\t14\n+128\t600\t20\n+72\t586\t20\n+78\t552\t20\n+122\t498\t20\n+75\t663\t20\n+457\t416\t14\n+99\t484\t20\n+168\t470\t20\n+495\t408\t14\n+109\t473\t20\n+92\t583\t20\n+99\t481\t20\n+530\t540\t14\n+0\t514\t20\n+58\t634\t20\n+153\t528\t20\n+570\t468\t14\n+452\t433\t14\n+141\t432\t20\n+479\t517\t14\n+20\t438\t20\n+116\t449\t20\n+451\t493\t14\n+79\t483\t20\n+0\t448\t20\n+440\t598\t14\n+0\t498\t20\n+13\t499\t20\n+568\t646\t14\n+68\t616\t20\n+31\t646\t20\n+511\t617\t14\n+511\t645\t14\n+54\t591\t20\n+82\t503\t20\n+66\t703\t20\n+82\t573\t20\n+453\t418\t14\n+56\t505\t20\n+19\t578\t20\n+8\t610\t20\n+549\t681\t14\n+572\t637\t14\n+96\t483\t20\n+0\t674\t20\n+78\t545\t20\n+97\t677\t20\n+503\t625\t14\n+466\t509\t14\n+491\t601\t14\n+501\t501\t14\n+21\t570\t20\n+36\t585\t20\n+493\t576\t14\n+503\t426\t14\n+122\t569\t20\n+528\t566\t14\n+83\t640\t20\n+129\t432\t20\n+478\t413\t14\n+163\t423\t20\n+0\t636\t20\n+565\t599\t14\n+540\t659\t14\n+0\t582\t20\n+40\t643\t20\n+0\t447\t20\n+61\t549\t20\n+584\t609\t14\n+542\t425\t14\n+38\t425\t20\n+498\t408\t14\n+0\t615\t20\n+83\t452\t20\n+508\t623\t14\n+80\t516\t20\n+92\t464\t20\n+346\t632\t20\n+9\t623\t20\n+123\t502\t20\n+133\t538\t20\n+525\t436\t14\n+33\t536\t20\n+524\t608\t14\n+0\t529\t20\n+0\t705\t20\n+87\t620\t20\n+87\t424\t20\n+17\t506\t20\n+549\t537\t14\n+79\t445\t20\n+89\t499\t20\n+0\t575\t20\n+124\t598\t20\n+78\t455\t20\n+101\t485\t20\n+139\t494\t20\n+113\t502\t20\n+103\t622\t20\n+49\t458\t20\n+61\t551\t20\n+0\t576\t20\n+123\t643\t20\n+105\t550\t20\n+86\t534\t20\n+69\t454\t20\n+74\t735\t20\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop01.pdf
b
Binary file flow_overview/test-data/out2/flowcl_pop01.pdf has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop01.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flowcl_pop01.txt Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,26 @@
+                      [,1]                                                                   
+Short marker names    "CD4+CCR7-"                                                            
+Ontology marker names "CD4 molecule, C-C chemokine receptor type 7"                          
+Experiment markers    "CD4,CCR7"                                                             
+Ontology exper. names "CD4 molecule, C-C chemokine receptor type 7"                          
+Successful Match?     "No"                                                                   
+Marker ID             "1) PR_000001004, PR_000001203 2) PR_000001004, PR_000001203 3)"       
+                      "PR_000001004, PR_000001203"                                           
+Marker Label          "1) CD4 molecule, C-C chemokine receptor type 7 2) CD4 molecule, C-C"  
+                      "chemokine receptor type 7 3) CD4 molecule, C-C chemokine receptor"    
+                      "type 7"                                                               
+Marker Key            "1) { } CCR7-, CD4+ ( ) [ T cell receptor co-receptor CD8-, alpha-beta"
+                      "T cell receptor complex+, receptor-type tyrosine-protein phosphatase" 
+                      "C isoform CD45RA+, CD3+ ] 2) { } CCR7-, CD4+ ( ) [ T cell receptor"   
+                      "co-receptor CD8-, alpha-beta T cell receptor complex+, C-X-C"         
+                      "chemokine receptor type 5+, inducible T-cell costimulator+,"          
+                      "programmed cell death protein 1+, CD3+ ] 3) { } CCR7-, CD4+ ( ) [ T"  
+                      "cell receptor co-receptor CD8-, interleukin-2 receptor subunit"       
+                      "alpha-, receptor-type tyrosine-protein phosphatase C isoform CD45RA-,"
+                      "alpha-beta T cell receptor complex+, receptor-type tyrosine-protein"  
+                      "phosphatase C isoform CD45RO+, interleukin-7 receptor subunit alpha+,"
+                      "CD3+, CD44 moleculehi, interleukin-2 receptor subunit betahi ]"       
+Score (Out of 1)      "1) 0.333 2) 0.25 3) 0.182"                                            
+Cell ID               "1) CL_0001044 2) CL_0002038 3) CL_0000905"                            
+Cell Label            "1) effector CD4-positive, alpha-beta T cell 2) T follicular helper"   
+                      "cell 3) effector memory CD4-positive, alpha-beta T cell"              
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop04.pdf
b
Binary file flow_overview/test-data/out2/flowcl_pop04.pdf has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop04.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flowcl_pop04.txt Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,40 @@
+                      [,1]                                                                   
+Short marker names    "CD4-CCR7-"                                                            
+Ontology marker names "CD4 molecule, C-C chemokine receptor type 7"                          
+Experiment markers    "CD4,CCR7"                                                             
+Ontology exper. names "CD4 molecule, C-C chemokine receptor type 7"                          
+Successful Match?     "No"                                                                   
+Marker ID             "1) PR_000001004, PR_000001203 2) PR_000001004, PR_000001203 3)"       
+                      "PR_000001004, PR_000001203 4) PR_000001004, PR_000001203 5)"          
+                      "PR_000001004, PR_000001203"                                           
+Marker Label          "1) CD4 molecule, C-C chemokine receptor type 7 2) CD4 molecule, C-C"  
+                      "chemokine receptor type 7 3) CD4 molecule, C-C chemokine receptor"    
+                      "type 7 4) CD4 molecule, C-C chemokine receptor type 7 5) CD4"         
+                      "molecule, C-C chemokine receptor type 7"                              
+Marker Key            "1) { } CD4-, CCR7- ( ) [ T cell receptor co-receptor CD8+, alpha-beta"
+                      "T cell receptor complex+, receptor-type tyrosine-protein phosphatase" 
+                      "C isoform CD45RA+, CD3+ ] 2) { } CD4-, CCR7- ( ) [ receptor-type"     
+                      "tyrosine-protein phosphatase C isoform CD45RO-, T cell receptor"      
+                      "co-receptor CD8+, alpha-beta T cell receptor complex+, receptor-type" 
+                      "tyrosine-protein phosphatase C isoform CD45RA+, CD3+ ] 3) { } CD4-,"  
+                      "CCR7- ( ) [ L-selectin-, interleukin-7 receptor subunit alpha-, T"    
+                      "cell receptor co-receptor CD8+, alpha-beta T cell receptor complex+," 
+                      "CD69 molecule+, interleukin-2 receptor subunit alpha+, CD3+ ] 4) { }" 
+                      "CD4-, CCR7- ( ) [ interleukin-2 receptor subunit alpha-,"             
+                      "receptor-type tyrosine-protein phosphatase C isoform CD45RA-, T cell" 
+                      "receptor co-receptor CD8+, alpha-beta T cell receptor complex+,"      
+                      "receptor-type tyrosine-protein phosphatase C isoform CD45RO+,"        
+                      "interleukin-7 receptor subunit alpha+, CD3+, CD44 moleculehi,"        
+                      "interleukin-2 receptor subunit betahi ] 5) { } CD4-, CCR7- ( ) ["     
+                      "L-selectin-, interleukin-7 receptor subunit alpha-, T cell receptor"  
+                      "co-receptor CD8+, alpha-beta T cell receptor complex+, CD69"          
+                      "molecule+, interleukin-2 receptor subunit alpha+, ADP-ribosyl cyclase"
+                      "1+, MHC class II histocompatibility antigen alpha chain HLA-DRA+,"    
+                      "CD3+ ]"                                                               
+Score (Out of 1)      "1) 0.333 2) 0.286 3) 0.222 4) 0.182 5) 0.182"                         
+Cell ID               "1) CL_0001050 2) CL_0001062 3) CL_0000906 4) CL_0000913 5) CL_0001049"
+Cell Label            "1) effector CD8-positive, alpha-beta T cell 2) effector memory"       
+                      "CD8-positive, alpha-beta T cell, terminally differentiated 3)"        
+                      "activated CD8-positive, alpha-beta T cell 4) effector memory"         
+                      "CD8-positive, alpha-beta T cell 5) activated CD8-positive, alpha-beta"
+                      "T cell, human"                                                        
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop07.pdf
b
Binary file flow_overview/test-data/out2/flowcl_pop07.pdf has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop07.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flowcl_pop07.txt Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,66 @@
+                      [,1]                                                                   
+Short marker names    "CD4-CCR7lo"                                                           
+Ontology marker names "CD4 molecule, C-C chemokine receptor type 7"                          
+Experiment markers    "CD4,CCR7"                                                             
+Ontology exper. names "CD4 molecule, C-C chemokine receptor type 7"                          
+Successful Match?     "No"                                                                   
+Marker ID             "1) PR_000001004 2) PR_000001004 3) PR_000001004 4) PR_000001004 5)"   
+                      "PR_000001004 + more"                                                  
+Marker Label          "1) CD4 molecule 2) CD4 molecule 3) CD4 molecule 4) CD4 molecule 5)"   
+                      "CD4 molecule + more"                                                  
+Marker Key            "1) { CCR7lo } CD4- ( ) [ CD19 molecule-, integrin alpha-M-, CD3-,"    
+                      "neural cell adhesion molecule 1-, CD2 molecule-, T-cell surface"      
+                      "glycoprotein CD8 alpha chain-, membrane-spanning 4-domains subfamily" 
+                      "A member 1-, T-cell surface glycoprotein CD5-, CD14 molecule-,"       
+                      "lymphocyte antigen 6G-, lymphocyte antigen 76-, receptor-type"        
+                      "tyrosine-protein phosphatase C isoform CD45R-, CD48 molecule-,"       
+                      "interleukin-7 receptor subunit alpha-, natural killer cell receptor"  
+                      "2B4-, killer cell lectin-like receptor subfamily B member 1C-, CD34"  
+                      "molecule-, receptor-type tyrosine-protein kinase FLT3-, SLAM family"  
+                      "member 1+, mast/stem cell growth factor receptor+, lymphocyte antigen"
+                      "6A-2/6E-1+, Thy-1 membrane glycoproteinlo ] 2) { CCR7lo } CD4- ( ) [" 
+                      "CD19 molecule-, integrin alpha-M-, CD3-, neural cell adhesion"        
+                      "molecule 1-, CD2 molecule-, T-cell surface glycoprotein CD8 alpha"    
+                      "chain-, membrane-spanning 4-domains subfamily A member 1-, T-cell"    
+                      "surface glycoprotein CD5-, CD14 molecule-, lymphocyte antigen 6G-,"   
+                      "lymphocyte antigen 76-, receptor-type tyrosine-protein phosphatase C" 
+                      "isoform CD45R-, CD48 molecule-, interleukin-7 receptor subunit"       
+                      "alpha-, natural killer cell receptor 2B4-, killer cell lectin-like"   
+                      "receptor subfamily B member 1C-, receptor-type tyrosine-protein"      
+                      "kinase FLT3-, SLAM family member 1+, mast/stem cell growth factor"    
+                      "receptor+, lymphocyte antigen 6A-2/6E-1+, CD34 molecule+ ] 3) {"      
+                      "CCR7lo } CD4- ( ) [ CD19 molecule-, integrin alpha-M-, CD3-, neural"  
+                      "cell adhesion molecule 1-, CD2 molecule-, T-cell surface glycoprotein"
+                      "CD8 alpha chain-, membrane-spanning 4-domains subfamily A member 1-," 
+                      "T-cell surface glycoprotein CD5-, CD14 molecule-, CD27 molecule-,"    
+                      "lymphocyte antigen 6G-, lymphocyte antigen 6A-2/6E-1-, lymphocyte"    
+                      "antigen 6C2-, lymphocyte antigen 76-, CD9 molecule+, transmembrane"   
+                      "emp24 domain-containing protein 1+, receptor-type tyrosine-protein"   
+                      "phosphatase C+, mast/stem cell growth factor receptorlo, integrin"    
+                      "beta-7hi, high affinity immunoglobulin epsilon receptor subunit"      
+                      "alphalo ] 4) { CCR7lo } CD4- ( ) [ CD19 molecule-, integrin alpha-M-,"
+                      "CD3-, neural cell adhesion molecule 1-, CD2 molecule-, T-cell surface"
+                      "glycoprotein CD8 alpha chain-, membrane-spanning 4-domains subfamily" 
+                      "A member 1-, T-cell surface glycoprotein CD5-, CD14 molecule-,"       
+                      "lymphocyte antigen 6G-, lymphocyte antigen 76-, CX3C chemokine"       
+                      "receptor 1-, Thy-1 membrane glycoprotein-, interleukin-7 receptor"    
+                      "subunit alpha-, lymphocyte antigen 6A-2/6E-1-, interleukin-3 receptor"
+                      "class 2 alpha chain+, CD34 molecule+, mast/stem cell growth factor"   
+                      "receptor+, Fc-gamma receptor III complexhi, low affinity"             
+                      "immunoglobulin gamma Fc region receptor IIhi ] 5) { CCR7lo } CD4- ( )"
+                      "[ CD19 molecule-, integrin alpha-M-, CD3-, neural cell adhesion"      
+                      "molecule 1-, CD2 molecule-, T-cell surface glycoprotein CD8 alpha"    
+                      "chain-, membrane-spanning 4-domains subfamily A member 1-, T-cell"    
+                      "surface glycoprotein CD5-, CD14 molecule-, lymphocyte antigen 6G-,"   
+                      "lymphocyte antigen 76-, receptor-type tyrosine-protein phosphatase C" 
+                      "isoform CD45R-, CD48 molecule-, interleukin-7 receptor subunit"       
+                      "alpha-, natural killer cell receptor 2B4-, killer cell lectin-like"   
+                      "receptor subfamily B member 1C-, SLAM family member 1+, mast/stem"    
+                      "cell growth factor receptor+, lymphocyte antigen 6A-2/6E-1+ ] + more" 
+Score (Out of 1)      "1) -0.043 2) -0.045 3) -0.048 4) -0.048 5) -0.05 + more"              
+Cell ID               "1) CL_0002034 2) CL_0002033 3) CL_0002029 4) CL_0002002 5) CL_0001008"
+                      "+ more"                                                               
+Cell Label            "1) long term hematopoietic stem cell 2) short term hematopoietic stem"
+                      "cell 3) Fc-epsilon RIalpha-low mast cell progenitor 4) Kit-positive"  
+                      "granulocyte monocyte progenitor 5) Kit and Sca1-positive"             
+                      "hematopoietic stem cell + more"                                       
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop13.pdf
b
Binary file flow_overview/test-data/out2/flowcl_pop13.pdf has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop13.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flowcl_pop13.txt Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,45 @@
+                      [,1]                                                                   
+Short marker names    "CD4+CCR7lo"                                                           
+Ontology marker names "CD4 molecule, C-C chemokine receptor type 7"                          
+Experiment markers    "CD4,CCR7"                                                             
+Ontology exper. names "CD4 molecule, C-C chemokine receptor type 7"                          
+Successful Match?     "No"                                                                   
+Marker ID             "1) PR_000001004 2) PR_000001004 3) PR_000001004 4) PR_000001004 5)"   
+                      "PR_000001004 + more"                                                  
+Marker Label          "1) CD4 molecule 2) CD4 molecule 3) CD4 molecule 4) CD4 molecule 5)"   
+                      "CD4 molecule + more"                                                  
+Marker Key            "1) { CCR7lo } CD4+ ( ) [ CD19 molecule-, CD34 molecule-, CD34"        
+                      "molecule-, neural cell adhesion molecule 1-, membrane-spanning"       
+                      "4-domains subfamily A member 1-, lymphocyte antigen 75-, T-cell"      
+                      "surface glycoprotein CD8 alpha chain-, CD83 molecule+, integrin"      
+                      "alpha-M+, MHC class II protein complexhi, CD86 moleculehi, CD80"      
+                      "moleculehi, integrin alpha-Xhi ] 2) { CCR7lo } CD4+ ( ) [ CD19"       
+                      "molecule-, CD34 molecule-, CD34 molecule-, neural cell adhesion"      
+                      "molecule 1-, membrane-spanning 4-domains subfamily A member 1-,"      
+                      "lymphocyte antigen 75-, T-cell surface glycoprotein CD8 alpha chain-,"
+                      "integrin alpha-M+, MHC class II protein complexlo, CD86 moleculelo,"  
+                      "CD80 moleculelo, integrin alpha-Xhi ] 3) { CCR7lo } CD4+ ( CCR7+ ) [" 
+                      "T cell receptor co-receptor CD8-, receptor-type tyrosine-protein"     
+                      "phosphatase C isoform CD45RO-, alpha-beta T cell receptor complex+,"  
+                      "interleukin-2 receptor subunit alpha+, receptor-type tyrosine-protein"
+                      "phosphatase C isoform CD45RA+, interleukin-7 receptor subunit"        
+                      "alphalo, C-C chemokine receptor type 4+, CD3+, CD44 moleculelo,"      
+                      "L-selectinhi ] 4) { CCR7lo } CD4+ ( CCR7+ ) [ T cell receptor"        
+                      "co-receptor CD8-, interleukin-2 receptor subunit alpha-,"             
+                      "receptor-type tyrosine-protein phosphatase C isoform CD45RA-,"        
+                      "alpha-beta T cell receptor complex+, receptor-type tyrosine-protein"  
+                      "phosphatase C isoform CD45RO+, interleukin-7 receptor subunit alpha+,"
+                      "CD3+, CD44 moleculehi, interleukin-2 receptor subunit betahi ] 5) {"  
+                      "CCR7lo } CD4+ ( ) [ CD19 molecule-, CD34 molecule-, CD34 molecule-,"  
+                      "neural cell adhesion molecule 1-, membrane-spanning 4-domains"        
+                      "subfamily A member 1-, integrin alpha-M-, T-cell surface glycoprotein"
+                      "CD8 alpha chain-, receptor-type tyrosine-protein phosphatase C"       
+                      "isoform CD45R+, lymphocyte antigen 6G+, integrin alpha-Xlo ] + more"  
+Score (Out of 1)      "1) -0.071 2) -0.077 3) -0.083 4) -0.091 5) -0.091 + more"             
+Cell ID               "1) CL_0001003 2) CL_0000997 3) CL_0001045 4) CL_0000904 5) CL_0002455"
+                      "+ more"                                                               
+Cell Label            "1) mature CD8_alpha-negative CD11b-positive dendritic cell 2)"        
+                      "immature CD8_alpha-negative CD11b-positive dendritic cell 3) naive"   
+                      "CCR4-positive regulatory T cell 4) central memory CD4-positive,"      
+                      "alpha-beta T cell 5) CD8_alpha-negative plasmactyoid dendritic cell +"
+                      "more"                                                                 
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop14.pdf
b
Binary file flow_overview/test-data/out2/flowcl_pop14.pdf has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop14.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flowcl_pop14.txt Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,36 @@
+                      [,1]                                                                   
+Short marker names    "CD4+CCR7+"                                                            
+Ontology marker names "CD4 molecule, C-C chemokine receptor type 7"                          
+Experiment markers    "CD4,CCR7"                                                             
+Ontology exper. names "CD4 molecule, C-C chemokine receptor type 7"                          
+Successful Match?     "No"                                                                   
+Marker ID             "1) PR_000001004, PR_000001203 2) PR_000001004, PR_000001203 3)"       
+                      "PR_000001004, PR_000001203 4) PR_000001004, PR_000001203"             
+Marker Label          "1) CD4 molecule, C-C chemokine receptor type 7 2) CD4 molecule, C-C"  
+                      "chemokine receptor type 7 3) CD4 molecule, C-C chemokine receptor"    
+                      "type 7 4) CD4 molecule, C-C chemokine receptor type 7"                
+Marker Key            "1) { } CD4+, CCR7+ ( ) [ T cell receptor co-receptor CD8-,"           
+                      "interleukin-2 receptor subunit alpha-, alpha-beta T cell receptor"    
+                      "complex+, receptor-type tyrosine-protein phosphatase C isoform"       
+                      "CD45RA+, interleukin-7 receptor subunit alpha+, CD3+, CD44"           
+                      "moleculelo, L-selectinhi ] 2) { } CD4+, CCR7+ ( ) [ T cell receptor"  
+                      "co-receptor CD8-, alpha-beta T cell receptor complex+, interleukin-2" 
+                      "receptor subunit alpha+, receptor-type tyrosine-protein phosphatase C"
+                      "isoform CD45RA+, interleukin-7 receptor subunit alphalo, CD3+, CD44"  
+                      "moleculelo, L-selectinhi ] 3) { } CD4+, CCR7+ ( ) [ T cell receptor"  
+                      "co-receptor CD8-, interleukin-2 receptor subunit alpha-,"             
+                      "receptor-type tyrosine-protein phosphatase C isoform CD45RA-,"        
+                      "alpha-beta T cell receptor complex+, receptor-type tyrosine-protein"  
+                      "phosphatase C isoform CD45RO+, interleukin-7 receptor subunit alpha+,"
+                      "CD3+, CD44 moleculehi, interleukin-2 receptor subunit betahi ] 4) { }"
+                      "CD4+, CCR7+ ( ) [ T cell receptor co-receptor CD8-, receptor-type"    
+                      "tyrosine-protein phosphatase C isoform CD45RO-, alpha-beta T cell"    
+                      "receptor complex+, interleukin-2 receptor subunit alpha+,"            
+                      "receptor-type tyrosine-protein phosphatase C isoform CD45RA+,"        
+                      "interleukin-7 receptor subunit alphalo, C-C chemokine receptor type"  
+                      "4+, CD3+, CD44 moleculelo, L-selectinhi ]"                            
+Score (Out of 1)      "1) 0.2 2) 0.2 3) 0.182 4) 0.167"                                      
+Cell ID               "1) CL_0000895 2) CL_0002677 3) CL_0000904 4) CL_0001045"              
+Cell Label            "1) naive thymus-derived CD4-positive, alpha-beta T cell 2) naive"     
+                      "regulatory T cell 3) central memory CD4-positive, alpha-beta T cell"  
+                      "4) naive CCR4-positive regulatory T cell"                             
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop15.pdf
b
Binary file flow_overview/test-data/out2/flowcl_pop15.pdf has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop15.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flowcl_pop15.txt Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,34 @@
+                      [,1]                                                                   
+Short marker names    "CD4loCCR7-"                                                           
+Ontology marker names "CD4 molecule, C-C chemokine receptor type 7"                          
+Experiment markers    "CD4,CCR7"                                                             
+Ontology exper. names "CD4 molecule, C-C chemokine receptor type 7"                          
+Successful Match?     "No"                                                                   
+Marker ID             "1) PR_000001203 2) PR_000001203 3) PR_000001203 4) PR_000001004 5)"   
+                      "PR_000001004"                                                         
+Marker Label          "1) C-C chemokine receptor type 7 2) C-C chemokine receptor type 7 3)" 
+                      "C-C chemokine receptor type 7 4) CD4 molecule 5) CD4 molecule"        
+Marker Key            "1) { CD4lo } CCR7- ( receptor-type tyrosine-protein phosphatase C"    
+                      "isoform CD45RA- ) [ T cell receptor co-receptor CD8-, interleukin-2"  
+                      "receptor subunit alpha-, receptor-type tyrosine-protein phosphatase C"
+                      "isoform CD45RA-, alpha-beta T cell receptor complex+, receptor-type"  
+                      "tyrosine-protein phosphatase C isoform CD45RO+, interleukin-7"        
+                      "receptor subunit alpha+, CD3+, CD44 moleculehi, interleukin-2"        
+                      "receptor subunit betahi ] 2) { CD4lo } CCR7- ( CD4+ ) [ T cell"       
+                      "receptor co-receptor CD8-, alpha-beta T cell receptor complex+, C-X-C"
+                      "chemokine receptor type 5+, inducible T-cell costimulator+,"          
+                      "programmed cell death protein 1+, CD3+ ] 3) { CD4lo } CCR7- ("        
+                      "receptor-type tyrosine-protein phosphatase C isoform CD45RA+ ) [ T"   
+                      "cell receptor co-receptor CD8-, alpha-beta T cell receptor complex+," 
+                      "receptor-type tyrosine-protein phosphatase C isoform CD45RA+, CD3+ ]" 
+                      "4) { CCR7- } CD4lo ( ) [ CD44 molecule-, KLRB1-like protein-,"        
+                      "alpha-beta T cell receptor complex+, T cell receptor co-receptor"     
+                      "CD8lo, signal transducer CD24hi ] 5) { CCR7- } CD4lo ( ) [ alpha-beta"
+                      "T cell receptor complexhi, T cell receptor co-receptor CD8+, CD69"    
+                      "molecule+ ]"                                                          
+Score (Out of 1)      "1) -0.091 2) -0.125 3) -0.167 4) -0.167 5) -0.25"                     
+Cell ID               "1) CL_0000905 2) CL_0002038 3) CL_0001044 4) CL_0002039 5) CL_0002430"
+Cell Label            "1) effector memory CD4-positive, alpha-beta T cell 2) T follicular"   
+                      "helper cell 3) effector CD4-positive, alpha-beta T cell 4) immature"  
+                      "NK T cell stage I 5) CD4-intermediate, CD8-positive double-positive"  
+                      "thymocyte"                                                            
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop19.pdf
b
Binary file flow_overview/test-data/out2/flowcl_pop19.pdf has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop19.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flowcl_pop19.txt Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,43 @@
+                      [,1]                                                                   
+Short marker names    "CD4loCCR7+"                                                           
+Ontology marker names "CD4 molecule, C-C chemokine receptor type 7"                          
+Experiment markers    "CD4,CCR7"                                                             
+Ontology exper. names "CD4 molecule, C-C chemokine receptor type 7"                          
+Successful Match?     "No"                                                                   
+Marker ID             "1) PR_000001203 2) PR_000001203 3) PR_000001203 4) PR_000001203 5)"   
+                      "PR_000001203 + more"                                                  
+Marker Label          "1) C-C chemokine receptor type 7 2) C-C chemokine receptor type 7 3)" 
+                      "C-C chemokine receptor type 7 4) C-C chemokine receptor type 7 5) C-C"
+                      "chemokine receptor type 7 + more"                                     
+Marker Key            "1) { CD4lo } CCR7+ ( receptor-type tyrosine-protein phosphatase C"    
+                      "isoform CD45RO- ) [ T cell receptor co-receptor CD8-, receptor-type"  
+                      "tyrosine-protein phosphatase C isoform CD45RO-, alpha-beta T cell"    
+                      "receptor complex+, interleukin-2 receptor subunit alpha+,"            
+                      "receptor-type tyrosine-protein phosphatase C isoform CD45RA+,"        
+                      "interleukin-7 receptor subunit alphalo, C-C chemokine receptor type"  
+                      "4+, CD3+, CD44 moleculelo, L-selectinhi ] 2) { CD4lo } CCR7+ ("       
+                      "receptor-type tyrosine-protein phosphatase C isoform CD45RA- ) [ T"   
+                      "cell receptor co-receptor CD8-, interleukin-2 receptor subunit"       
+                      "alpha-, receptor-type tyrosine-protein phosphatase C isoform CD45RA-,"
+                      "alpha-beta T cell receptor complex+, receptor-type tyrosine-protein"  
+                      "phosphatase C isoform CD45RO+, interleukin-7 receptor subunit alpha+,"
+                      "CD3+, CD44 moleculehi, interleukin-2 receptor subunit betahi ] 3) {"  
+                      "CD4lo } CCR7+ ( receptor-type tyrosine-protein phosphatase C isoform" 
+                      "CD45RA+ ) [ T cell receptor co-receptor CD8-, interleukin-2 receptor" 
+                      "subunit alpha-, alpha-beta T cell receptor complex+, receptor-type"   
+                      "tyrosine-protein phosphatase C isoform CD45RA+, interleukin-7"        
+                      "receptor subunit alpha+, CD3+, CD44 moleculelo, L-selectinhi ] 4) {"  
+                      "CD4lo } CCR7+ ( receptor-type tyrosine-protein phosphatase C isoform" 
+                      "CD45RA+ ) [ T cell receptor co-receptor CD8-, alpha-beta T cell"      
+                      "receptor complex+, interleukin-2 receptor subunit alpha+,"            
+                      "receptor-type tyrosine-protein phosphatase C isoform CD45RA+,"        
+                      "interleukin-7 receptor subunit alphalo, CD3+, CD44 moleculelo,"       
+                      "L-selectinhi ] 5) { CD4lo } CCR7+ ( ) [ receptor-type"                
+                      "tyrosine-protein phosphatase C isoform CD45RA+, interleukin-7"        
+                      "receptor subunit alpha+, CD3+, CD44 moleculelo, L-selectinhi ] + more"
+Score (Out of 1)      "1) -0.083 2) -0.091 3) -0.1 4) -0.1 5) -0.167 + more"                 
+Cell ID               "1) CL_0001045 2) CL_0000904 3) CL_0000895 4) CL_0002677 5) CL_0000898"
+                      "+ more"                                                               
+Cell Label            "1) naive CCR4-positive regulatory T cell 2) central memory"           
+                      "CD4-positive, alpha-beta T cell 3) naive thymus-derived CD4-positive,"
+                      "alpha-beta T cell 4) naive regulatory T cell 5) naive T cell + more"  
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop20.pdf
b
Binary file flow_overview/test-data/out2/flowcl_pop20.pdf has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop20.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flowcl_pop20.txt Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,23 @@
+                      [,1]                                                                   
+Short marker names    "CD4-CCR7+"                                                            
+Ontology marker names "CD4 molecule, C-C chemokine receptor type 7"                          
+Experiment markers    "CD4,CCR7"                                                             
+Ontology exper. names "CD4 molecule, C-C chemokine receptor type 7"                          
+Successful Match?     "No"                                                                   
+Marker ID             "1) PR_000001203, PR_000001004 2) PR_000001203, PR_000001004"          
+Marker Label          "1) C-C chemokine receptor type 7, CD4 molecule 2) C-C chemokine"      
+                      "receptor type 7, CD4 molecule"                                        
+Marker Key            "1) { } CD4-, CCR7+ ( ) [ interleukin-2 receptor subunit alpha-, T"    
+                      "cell receptor co-receptor CD8+, alpha-beta T cell receptor complex+," 
+                      "receptor-type tyrosine-protein phosphatase C isoform CD45RA+,"        
+                      "interleukin-7 receptor subunit alpha+, CD3+, CD44 moleculelo,"        
+                      "L-selectinhi ] 2) { } CD4-, CCR7+ ( ) [ receptor-type"                
+                      "tyrosine-protein phosphatase C isoform CD45RA-, interleukin-2"        
+                      "receptor subunit alpha-, T cell receptor co-receptor CD8+, alpha-beta"
+                      "T cell receptor complex+, receptor-type tyrosine-protein phosphatase" 
+                      "C isoform CD45RO+, interleukin-7 receptor subunit alpha+, CD3+, CD44" 
+                      "moleculehi, interleukin-2 receptor subunit betahi ]"                  
+Score (Out of 1)      "1) 0.2 2) 0.182"                                                      
+Cell ID               "1) CL_0000900 2) CL_0000907"                                          
+Cell Label            "1) naive thymus-derived CD8-positive, alpha-beta T cell 2) central"   
+                      "memory CD8-positive, alpha-beta T cell"                               
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop23.pdf
b
Binary file flow_overview/test-data/out2/flowcl_pop23.pdf has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/flowcl_pop23.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/flowcl_pop23.txt Mon Feb 27 12:54:37 2017 -0500
[
@@ -0,0 +1,17 @@
+                      [,1]                                                               
+Short marker names    "CD4loCCR7lo"                                                      
+Ontology marker names "CD4 molecule, C-C chemokine receptor type 7"                      
+Experiment markers    "CD4,CCR7"                                                         
+Ontology exper. names "CD4 molecule, C-C chemokine receptor type 7"                      
+Successful Match?     "No"                                                               
+Marker ID             "1) PR_000001004 2) PR_000001004"                                  
+Marker Label          "1) CD4 molecule 2) CD4 molecule"                                  
+Marker Key            "1) { CCR7lo } CD4lo ( ) [ CD44 molecule-, KLRB1-like protein-,"   
+                      "alpha-beta T cell receptor complex+, T cell receptor co-receptor" 
+                      "CD8lo, signal transducer CD24hi ] 2) { CCR7lo } CD4lo ( ) ["      
+                      "alpha-beta T cell receptor complexhi, T cell receptor co-receptor"
+                      "CD8+, CD69 molecule+ ]"                                           
+Score (Out of 1)      "1) -0.167 2) -0.25"                                               
+Cell ID               "1) CL_0002039 2) CL_0002430"                                      
+Cell Label            "1) immature NK T cell stage I 2) CD4-intermediate, CD8-positive"  
+                      "double-positive thymocyte"                                        
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/m0_m0_90X90.png
b
Binary file flow_overview/test-data/out2/m0_m0_90X90.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/m0_m1_90X90.png
b
Binary file flow_overview/test-data/out2/m0_m1_90X90.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/m1_m0_90X90.png
b
Binary file flow_overview/test-data/out2/m1_m0_90X90.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/m1_m1_90X90.png
b
Binary file flow_overview/test-data/out2/m1_m1_90X90.png has changed
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/out.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/out.html Mon Feb 27 12:54:37 2017 -0500
[
b'@@ -0,0 +1,300 @@\n+<html>\n+<head>\n+<title>Flow Overview</title>\n+<link rel="stylesheet" href="/static/flowtools/bootstrap/css/bootstrap.css"/>\n+<link rel="stylesheet" href="/static/flowtools/select2/select2.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/css/parallelCoordinates.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/datatables.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/css/flowCL.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/Buttons-1.1.2/css/buttons.dataTables.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/Select-1.1.2/css/select.dataTables.min.css"/>\n+<link rel="stylesheet" href="/static/flowtools/datatables/Editor-1.5.6/css/editor.dataTables.min.css"/>\n+<script src="/static/flowtools/jquery-1.11.3.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/bootstrap/js/bootstrap.js" type="text/javascript"></script>\n+<script src="/static/flowtools/select2/select2.full.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/d3/d3.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/plotly-latest.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/datatables/datatables.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/datatables/Editor-1.5.6/js/dataTables.editor.min.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/color_palette.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/overview.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/scatter2D.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/scatter3D.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/scatterMFI.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/parallelCoordinates.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/profileCLs.js" type="text/javascript"></script>\n+<script src="/static/flowtools/js/boxplotsFlow.js" type="text/javascript"></script>\n+\n+<style>\n+#input{font-family:Calibri,Arial}\n+table.dataTable tbody td.dt-body-right {\n+    text-align: right;\n+}\n+#div{padding:5px;width:150px;height:100px;text-align:center}\n+table{width:100%;border:0px solid;border-collapse:collapse;text-align:center;}\n+th{background-color:#3e6db0;color:#fff;padding:5px}\n+\n+</style>\n+</head>\n+\n+<body>\n+<div class="container-fluid">\n+    <div class="row" style="padding-bottom:10px;min-height:500px;">\n+        <div  class="col-md-12">\n+            <ul class="nav nav-tabs tabs-main">\n+                <li class="homeTab active" data-value="mfi"><a href="#mfi" data-toggle="tab">MFI/Pop</a></li>\n+                <li class="homeTab" data-value="overviewPlot"><a href="#overviewPlot" data-toggle="tab">Overview Plot</a></li>\n+                <li class="homeTab" data-value="scatter2D"><a href="#scatter2D" data-toggle="tab">Scatter 2D</a></li>\n+                <li class="homeTab" data-value="scatter3D"><a href="#scatter3D" data-toggle="tab">Scatter 3D</a></li>\n+                <li class="homeTab" data-value="parallelCoordinates"><a href="#parallelCoordinates" data-toggle="tab">Parallel Coordinates</a></li>\n+                <li class="homeTab" data-value="stats"><a href="#boxplots" data-toggle="tab">Summary Statistics Boxplots</a></li>\n+                <li class="homeTab" data-value="clprofiles"><a href="#clprofiles" data-toggle="tab">Populations Cell Ontologies</a></li>\n+            </ul>\n+\n+            <div class="tab-content">\n+                <div class="tab-pane active" id="mfi" style="min-height:500px;">\n+                    <div id="mfiDiv"></div>\n+                </div>\n+\n+                <div class="tab-pane" id="overviewPlot" style="min-height:500px;">\n+                    <div id="overviewPlotDiv">Overview</div>\n+                </div>\n+\n+                <div class="tab-pane" id="scatter2D" style="min-height:500px;">\n+                    <div i'..b'\n+                                  Only 5 markers can be displayed at most.\n+                            </div>\n+                          </div>\n+                          <div id="outlierWarning">\n+                            <div class="alert alert-info alert-dismissible fade in" role="alert">\n+                              <button type="button" class="close" data-dismiss="alert" aria-label="Close">\n+                                <span aria-hidden="true">&times;</span></button>\n+                                  The number of outliers is too large to display. Representation shows randomly downsampled outliers.\n+                            </div>\n+                          </div>\n+                        </div>\n+\n+                        <div id="plotDivbp" class="col-md-8" style="height:100%;"></div>\n+\n+                        <div id="popDivbp" class="col-md-2" style="height:100%;">\n+                            <button id="updateDisplaybp" class="igbtn">Reset Display</button>\n+                            <table id="popTablebp" class="table table-condensed table-bordered igtable">\n+                                <thead>\n+                                    <tr>\n+                                        <th><input type="checkbox" checked id="popSelectAllbp"/></th>\n+                                        <th>Pop. Names</th>\n+                                        <th>Color</th>\n+                                     </tr>\n+                                </thead>\n+                                <tbody>\n+                                </tbody>\n+                            </table>\n+                        </div>\n+                    </div>\n+                </div>\n+\n+                <div class="tab-pane" id="clprofiles" style="min-height:500px;">\n+                    <div class="row">\n+                        <div id="clprof"/>\n+                    </div>\n+                </div>\n+                </div>\n+            </div>\n+  \t    </div>\n+    </div>\n+</div>\n+\n+\n+<script>\n+var mfiLoaded = false;\n+var populationLoaded = false;\n+var overviewPlotLoaded = false;\n+var scatter2DLoaded = false;\n+var scatter3DLoaded = false;\n+var parallelCoordinatesLoaded = false;\n+var clprofilesLoaded = false;\n+var bpLoaded = false;\n+\n+$().ready(function() {\n+    $(document).on(\'shown.bs.tab\',\'a[data-toggle="tab"]\', function(e) {\n+      var tab = e.target.getAttribute("href");\n+      if (tab == \'#mfi\') {\n+        if (mfiLoaded) {\n+            return true;\n+        }\n+        mfiLoaded = true;\n+        displayMFI();\n+      }\n+      if (tab == \'#overviewPlot\') {\n+        if (overviewPlotLoaded) {\n+            return true;\n+        }\n+        overviewPlotLoaded = true;\n+        displayOverviewPlot();\n+      }\n+      if (tab == \'#scatter2D\') {\n+        if (scatter2DLoaded) {\n+            displayScatterPopulation2D();\n+            return true;\n+        }\n+        scatter2DLoaded = true;\n+        displayScatter2D();\n+      }\n+      if (tab == \'#scatter3D\') {\n+        if (scatter3DLoaded) {\n+            displayScatterPopulation3D();\n+            return true;\n+        }\n+        scatter3DLoaded = true;\n+        displayScatter3D();\n+      }\n+      if (tab == \'#parallelCoordinates\') {\n+        if (parallelCoordinatesLoaded) {\n+            displayPopTable();\n+            displayTableGrid();\n+            return true;\n+        }\n+        parallelCoordinatesLoaded = true;\n+        displayParallelCoordinates();\n+      }\n+      if (tab == \'#boxplots\') {\n+        if (bpLoaded) {\n+            displayPopulationLegend(configbp);\n+            displayMarkerTable(configbp);\n+            updateBoxplot(configbp);\n+            return true;\n+        }\n+        bpLoaded = true;\n+        displayMFIBoxplot();\n+      }\n+      if (tab == \'#clprofiles\') {\n+        if (clprofilesLoaded) {\n+            return true;\n+        }\n+        clprofilesLoaded = true;\n+        displayCLTable();\n+      }\n+    });\n+\n+    mfiLoaded = true;\n+    displayMFI();\n+});\n+</script>\n+</body>\n+</html>\n'
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/out2/scores.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/out2/scores.txt Mon Feb 27 12:54:37 2017 -0500
b
@@ -0,0 +1,27 @@
+Population_ID CD4 CCR7 Count Percentage
+1 3 1 1000 5
+2 3 1 1000 5
+3 3 1 1000 5
+4 1 1 1000 5
+5 1 1 1000 5
+6 1 1 1000 5
+7 1 2 1000 5
+8 3 1 1000 5
+9 1 2 1000 5
+10 3 1 1000 5
+11 1 1 1000 5
+12 1 1 1000 5
+13 3 2 1000 5
+14 3 3 1000 5
+15 2 1 1000 5
+16 1 2 1000 5
+17 3 3 1000 5
+18 3 1 1000 5
+19 2 3 1000 5
+20 1 3 1000 5
+21 1 1 1000 5
+22 2 1 1000 5
+23 2 2 1000 5
+24 2 1 1000 5
+25 1 2 1000 5
+26 2 2 1000 5
b
diff -r 000000000000 -r 8283ff163ba6 flow_overview/test-data/profile.flowscore
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/flow_overview/test-data/profile.flowscore Mon Feb 27 12:54:37 2017 -0500
b
@@ -0,0 +1,27 @@
+Population_ID CD4 CCR7 Count Percentage
+1 3 1 1000 5
+2 3 1 1000 5
+3 3 1 1000 5
+4 1 1 1000 5
+5 1 1 1000 5
+6 1 1 1000 5
+7 1 2 1000 5
+8 3 1 1000 5
+9 1 2 1000 5
+10 3 1 1000 5
+11 1 1 1000 5
+12 1 1 1000 5
+13 3 2 1000 5
+14 3 3 1000 5
+15 2 1 1000 5
+16 1 2 1000 5
+17 3 3 1000 5
+18 3 1 1000 5
+19 2 3 1000 5
+20 1 3 1000 5
+21 1 1 1000 5
+22 2 1 1000 5
+23 2 2 1000 5
+24 2 1 1000 5
+25 1 2 1000 5
+26 2 2 1000 5