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

Changeset 1:91e856e5ec7a (2020-07-22)
Previous changeset 0:2f6dcda6e74e (2017-02-27)
Commit message:
"planemo upload for repository https://github.com/ImmPortDB/immport-galaxy-tools/tree/master/flowtools/generate_mfi commit a1f464ea7fe4a5d1b71664ef924544010036522a"
added:
generateMFI.py
generateMFI.xml
test-data/gmfi.flowmfi
test-data/input.flowclr
test-data/mdfi.flowmfi
test-data/mfi.flowmfi
removed:
generate_mfi/flowstatlib.py
generate_mfi/generateMFI.py
generate_mfi/generateMFI.xml
generate_mfi/test-data/gmfi.flowmfi
generate_mfi/test-data/input.flowclr
generate_mfi/test-data/mdfi.flowmfi
generate_mfi/test-data/mfi.flowmfi
b
diff -r 2f6dcda6e74e -r 91e856e5ec7a generateMFI.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/generateMFI.py Wed Jul 22 15:41:56 2020 -0400
b
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+######################################################################
+#                  Copyright (c) 2016 Northrop Grumman.
+#                          All rights reserved.
+######################################################################
+import sys
+from argparse import ArgumentParser
+import pandas as pd
+from scipy.stats import gmean
+
+
+def generate_MFI(input_file_name, output_file_name, mfi_calc):
+    flock_df = pd.read_table(input_file_name)
+    if mfi_calc == "mfi":
+        MFIs = flock_df.groupby('Population').mean().round(decimals=2)
+    elif mfi_calc == "gmfi":
+        MFIs = flock_df.groupby('Population').agg(lambda x: gmean(list(x))).round(decimals=2)
+    else:
+        MFIs = flock_df.groupby('Population').median().round(decimals=2)
+
+    with open(output_file_name, "w") as outf:
+        MFIs.to_csv(outf, sep="\t", float_format='%.0f')
+    return
+
+
+if __name__ == "__main__":
+    parser = ArgumentParser(
+             prog="removeColumns",
+             description="Generate MFI from Flow Result file.")
+
+    parser.add_argument(
+            '-i',
+            dest="input_file",
+            required=True,
+            help="File location for the Flow Result file.")
+
+    parser.add_argument(
+            '-M',
+            dest="mfi_calc",
+            required=True,
+            help="what to calculate for centroids.")
+
+    parser.add_argument(
+            '-o',
+            dest="output_file",
+            required=True,
+            help="File location for the MFI output file.")
+
+    args = parser.parse_args()
+    generate_MFI(args.input_file, args.output_file, args.mfi_calc)
b
diff -r 2f6dcda6e74e -r 91e856e5ec7a generateMFI.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/generateMFI.xml Wed Jul 22 15:41:56 2020 -0400
[
@@ -0,0 +1,69 @@
+<tool id="generate_mfi" name="Generate the centroids" version="1.0+galaxy0" profile="18.01">
+  <description>from a flow result file</description>
+  <requirements>
+    <requirement type="package" version="1.0.5">pandas</requirement>
+    <requirement type="package" version="1.5.1">scipy</requirement>
+  </requirements>
+  <stdio>
+    <exit_code range="1:" />
+  </stdio>
+  <command><![CDATA[
+      python '$__tool_directory__/generateMFI.py' -i '${input}' -o '${output}' -M '${mfi}'
+  ]]>
+  </command>
+  <inputs>
+    <param format="flowclr" name="input" type="data" label="Flow Text file"/>
+    <param name="mfi" type="select" label="Calculate centroids using:">
+      <option value="mfi" selected="true">Mean Fluorescence Intensity</option>
+      <option value="mdfi">Median Fluorescence Intensity</option>
+      <option value="gmfi">Geometric Mean Fluorescence Intensity</option>
+    </param>
+  </inputs>
+  <outputs>
+    <data format="flowmfi" name="output" label="${mfi} centroids from ${input.name}"/>
+  </outputs>
+  <tests>
+    <test>
+      <param name="input" value="input.flowclr"/>
+      <param name="mfi" value="mfi"/>
+      <output name="output" file="mfi.flowmfi"/>
+    </test>
+    <test>
+      <param name="input" value="input.flowclr"/>
+      <param name="mfi" value="mdfi"/>
+      <output name="output" file="mdfi.flowmfi"/>
+    </test>
+    <test>
+      <param name="input" value="input.flowclr"/>
+      <param name="mfi" value="gmfi"/>
+      <output name="output" file="gmfi.flowmfi"/>
+    </test>
+  </tests>
+  <help><![CDATA[
+   This tool generates the Mean, Median or Geometric Mean Fluorescence Intensity of clustered flow files.
+.. class:: infomark
+Tip: This tool can be used to generate the centroids table required by the visualization tool multiple samples mapping result.
+-----
+**Input file**
+This tool reads in a tab-separated file containing markers fluorescence intensities for each event as well as population or cluster attribution, for instance text output from a FLOCK or FlowSOM run.
+**Output file**
+The output is a table containing the mean, median or geometric mean fluorescent intensity values of each marker within each population or cluster defined in the input file.
+-----
+**Example**
+*Input*::
+   Marker1 Marker2 Marker3 ... Population
+   34      45      12      ... 1
+   13      65      10      ... 5
+   19      62      98      ... 2
+   32      46      10      ... 1
+   ...     ...     ...     ... ...
+*Output*::
+   Population Marker1 Marker2 Marker3 ...
+   1          38      49      10      ...
+   2          21      63      100     ...
+   3          31      52      45      ...
+   4          11      78      25      ...
+   ...        ...     ...     ...     ...
+  ]]>
+  </help>
+</tool>
b
diff -r 2f6dcda6e74e -r 91e856e5ec7a generate_mfi/flowstatlib.py
--- a/generate_mfi/flowstatlib.py Mon Feb 27 13:00:34 2017 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,100 +0,0 @@
-######################################################################
-#                  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 2f6dcda6e74e -r 91e856e5ec7a generate_mfi/generateMFI.py
--- a/generate_mfi/generateMFI.py Mon Feb 27 13:00:34 2017 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,52 +0,0 @@
-#!/usr/bin/env python
-######################################################################
-#                  Copyright (c) 2016 Northrop Grumman.
-#                          All rights reserved.
-######################################################################
-from __future__ import print_function
-import sys
-from argparse import ArgumentParser
-import pandas as pd
-from scipy.stats import gmean
-
-
-def generate_MFI(input_file_name, output_file_name, mfi_calc):
-    flock_df = pd.read_table(input_file_name)
-    if mfi_calc == "mfi":
-        MFIs = flock_df.groupby('Population').mean().round(decimals=2)
-    elif mfi_calc == "gmfi":
-        MFIs = flock_df.groupby('Population').agg(lambda x: gmean(list(x))).round(decimals=2)
-    else:
-        MFIs = flock_df.groupby('Population').median().round(decimals=2)
-
-    with open(output_file_name, "w") as outf:
-        MFIs.to_csv(outf, sep="\t", float_format='%.0f')
-    return
-
-
-if __name__ == "__main__":
-    parser = ArgumentParser(
-             prog="removeColumns",
-             description="Generate MFI from Flow Result file.")
-
-    parser.add_argument(
-            '-i',
-            dest="input_file",
-            required=True,
-            help="File location for the Flow Result file.")
-
-    parser.add_argument(
-            '-M',
-            dest="mfi_calc",
-            required=True,
-            help="what to calculate for centroids.")
-
-    parser.add_argument(
-            '-o',
-            dest="output_file",
-            required=True,
-            help="File location for the MFI output file.")
-
-    args = parser.parse_args()
-    generate_MFI(args.input_file, args.output_file, args.mfi_calc)
-    sys.exit(0)
b
diff -r 2f6dcda6e74e -r 91e856e5ec7a generate_mfi/generateMFI.xml
--- a/generate_mfi/generateMFI.xml Mon Feb 27 13:00:34 2017 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
[
@@ -1,77 +0,0 @@
-<tool id="generate_mfi" name="Generate the centroids" version="1.0">
-  <description>from a flow result file</description>
-  <requirements>
-    <requirement type="package" version="0.17.1">pandas</requirement>
-    <requirement type="package" version="1.10.2">numpy</requirement>
-    <requirement type="package" version="0.16.0">scipy</requirement>
-  </requirements>
-  <stdio>
-       <exit_code range="1:" />
-  </stdio>
-  <command><![CDATA[
-    python $__tool_directory__/generateMFI.py -i "${input}" -o "${output}" -M "${mfi}"
-  ]]>
-  </command>
-  <inputs>
-    <param format="flowclr" name="input" type="data" label="Flow Text file"/>
-    <param name="mfi" type="select" label="Calculate centroids using:">
-      <option value="mfi" selected="true">Mean Fluorescence Intensity</option>
-      <option value="mdfi">Median Fluorescence Intensity</option>
-      <option value="gmfi">Geometric Mean Fluorescence Intensity</option>
-    </param>
-  </inputs>
-  <outputs>
-    <data format="flowmfi" name="output" label="${mfi} centroids from ${input.name}"/>
-  </outputs>
-  <tests>
-    <test>
-      <param name="input" value="input.flowclr"/>
-      <param name="mfi" value="mfi"/>
-      <output name="output" file="mfi.flowmfi"/>
-    </test>
-    <test>
-      <param name="input" value="input.flowclr"/>
-      <param name="mfi" value="mdfi"/>
-      <output name="output" file="mdfi.flowmfi"/>
-    </test>
-    <test>
-      <param name="input" value="input.flowclr"/>
-      <param name="mfi" value="gmfi"/>
-      <output name="output" file="gmfi.flowmfi"/>
-    </test>
-  </tests>
-  <help><![CDATA[
-   This tool generates the Mean, Median or Geometric Mean Fluorescence Intensity of a FLOCK output file.
-
------
-
-**Input file**
-
-This tool reads in a FLOCK output file.
-
-**Output file**
-
-The output is a table containing the mean, median or geometric mean fluorescent intensity values of each marker within each population defined by FLOCK.
-
------
-
-**Example**
-
-*Input*::
-
-   Marker1 Marker2 Marker3 Population
-   34      45      12      1
-   13      65      10      5
-   19      62      98      2
-   32      46      10      1
-
-*Output*::
-
-   Population Marker1 Marker2 Marker3
-   1          38      49      10
-   2          21      63      100
-   3          31      52      45
-   4          11      78      25
-  ]]>
-  </help>
-</tool>
b
diff -r 2f6dcda6e74e -r 91e856e5ec7a generate_mfi/test-data/gmfi.flowmfi
--- a/generate_mfi/test-data/gmfi.flowmfi Mon Feb 27 13:00:34 2017 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,31 +0,0 @@
-Population FSC SSC CD4 CCR3 CD8 CCR7
-1 354 113 515 0 0 109
-2 329 145 0 0 0 0
-3 351 163 0 144 0 0
-4 415 342 0 389 0 0
-5 370 120 523 224 0 126
-6 368 145 0 0 617 261
-7 356 114 511 115 0 111
-8 372 188 0 0 0 213
-9 358 117 516 173 0 0
-10 382 152 0 149 618 270
-11 365 145 0 0 580 0
-12 411 138 524 203 0 278
-13 371 121 519 145 0 195
-14 384 177 0 0 328 0
-15 353 114 512 0 0 0
-16 366 118 513 0 0 186
-17 407 140 528 0 0 298
-18 670 442 373 0 0 252
-19 611 985 0 254 0 255
-20 618 983 0 253 219 178
-21 743 1014 0 271 251 259
-22 652 984 0 241 218 0
-23 531 884 341 481 0 409
-24 764 1011 174 264 238 159
-25 963 945 315 319 289 326
-26 646 377 374 0 0 0
-27 609 961 0 0 0 226
-28 574 927 0 0 0 123
-29 976 1008 429 515 397 452
-30 699 813 522 828 546 573
b
diff -r 2f6dcda6e74e -r 91e856e5ec7a generate_mfi/test-data/input.flowclr
--- a/generate_mfi/test-data/input.flowclr Mon Feb 27 13:00:34 2017 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
b'@@ -1,20000 +0,0 @@\n-FSC\tSSC\tCD4\tCCR3\tCD8\tCCR7\tPopulation\n-328\t122\t547\t94\t85\t93\t7\n-581\t1023\t143\t235\t270\t106\t22\n-427\t172\t140\t200\t631\t300\t10\n-363\t92\t526\t0\t140\t5\t15\n-416\t113\t485\t22\t157\t226\t16\n-317\t100\t488\t165\t83\t39\t9\n-636\t436\t439\t143\t81\t217\t18\n-262\t49\t395\t0\t42\t171\t16\n-332\t147\t534\t241\t142\t43\t9\n-567\t454\t305\t30\t168\t236\t18\n-333\t138\t104\t0\t612\t225\t6\n-359\t100\t530\t132\t63\t100\t7\n-298\t85\t480\t253\t0\t171\t5\n-392\t123\t90\t176\t623\t182\t11\n-303\t112\t0\t115\t84\t64\t3\n-591\t948\t188\t176\t247\t130\t28\n-687\t535\t422\t301\t156\t230\t18\n-372\t151\t524\t182\t16\t273\t12\n-420\t180\t555\t88\t0\t119\t7\n-401\t182\t104\t76\t103\t138\t2\n-571\t1023\t364\t461\t377\t463\t23\n-398\t169\t92\t126\t668\t312\t10\n-378\t152\t552\t114\t125\t92\t7\n-352\t108\t528\t174\t47\t28\t9\n-714\t391\t449\t0\t210\t257\t18\n-524\t497\t106\t106\t180\t244\t8\n-563\t1023\t366\t471\t397\t460\t23\n-407\t93\t80\t145\t579\t306\t10\n-358\t129\t73\t257\t604\t268\t10\n-1023\t1023\t479\t406\t385\t351\t25\n-1023\t1023\t455\t536\t472\t508\t29\n-474\t172\t563\t0\t160\t111\t1\n-577\t1023\t164\t302\t258\t219\t19\n-348\t73\t521\t212\t0\t142\t5\n-294\t79\t470\t43\t112\t293\t17\n-369\t197\t0\t197\t185\t124\t3\n-389\t121\t71\t179\t637\t297\t10\n-589\t895\t180\t184\t246\t239\t27\n-432\t883\t8\t220\t177\t128\t28\n-601\t1004\t162\t221\t231\t128\t28\n-353\t137\t539\t196\t123\t63\t9\n-357\t127\t40\t203\t520\t174\t11\n-326\t128\t483\t194\t67\t34\t9\n-286\t74\t27\t78\t546\t266\t6\n-394\t158\t130\t82\t596\t314\t6\n-389\t224\t100\t113\t236\t104\t14\n-294\t77\t479\t270\t0\t47\t9\n-556\t946\t156\t211\t299\t177\t20\n-363\t117\t539\t199\t132\t62\t9\n-769\t1023\t189\t288\t291\t28\t22\n-558\t334\t325\t185\t186\t227\t18\n-760\t1023\t181\t271\t239\t258\t21\n-421\t243\t113\t90\t215\t181\t8\n-513\t283\t263\t241\t126\t124\t26\n-686\t935\t227\t267\t223\t109\t22\n-418\t137\t104\t127\t649\t260\t10\n-322\t115\t527\t0\t75\t70\t15\n-563\t1023\t165\t177\t212\t224\t27\n-620\t1023\t238\t267\t176\t206\t20\n-766\t1023\t347\t411\t384\t191\t24\n-378\t159\t41\t186\t637\t245\t10\n-598\t1023\t402\t490\t417\t399\t23\n-349\t142\t0\t191\t643\t286\t10\n-373\t102\t544\t147\t0\t215\t13\n-404\t138\t559\t267\t236\t133\t5\n-277\t47\t486\t242\t61\t120\t5\n-375\t113\t542\t122\t113\t23\t9\n-695\t849\t168\t230\t238\t209\t20\n-466\t185\t569\t184\t112\t238\t12\n-393\t114\t581\t131\t0\t118\t7\n-574\t1023\t127\t275\t245\t207\t20\n-618\t1023\t129\t271\t228\t230\t19\n-605\t1006\t213\t204\t220\t220\t27\n-495\t605\t83\t155\t167\t225\t27\n-716\t807\t131\t269\t126\t129\t24\n-607\t1023\t147\t294\t253\t219\t19\n-392\t236\t484\t237\t29\t106\t5\n-551\t910\t379\t822\t363\t417\t30\n-383\t153\t0\t0\t643\t286\t6\n-1023\t1023\t465\t336\t347\t366\t25\n-316\t233\t31\t209\t140\t307\t8\n-681\t1023\t284\t324\t280\t220\t21\n-418\t143\t553\t171\t98\t195\t13\n-361\t87\t26\t0\t618\t307\t6\n-419\t177\t91\t153\t277\t199\t8\n-598\t984\t87\t260\t246\t263\t19\n-634\t1023\t88\t158\t178\t156\t28\n-595\t1023\t154\t238\t284\t247\t19\n-388\t203\t544\t0\t149\t126\t1\n-354\t159\t504\t210\t0\t152\t5\n-294\t76\t141\t0\t29\t255\t8\n-328\t99\t468\t177\t171\t44\t9\n-283\t128\t463\t112\t0\t126\t7\n-673\t1023\t156\t262\t211\t40\t22\n-409\t115\t515\t217\t52\t193\t13\n-321\t102\t514\t0\t62\t135\t1\n-279\t83\t435\t174\t0\t267\t12\n-565\t1017\t67\t233\t210\t238\t19\n-339\t123\t538\t60\t99\t73\t15\n-343\t148\t44\t134\t615\t235\t10\n-390\t130\t86\t82\t635\t220\t11\n-283\t52\t423\t52\t63\t69\t15\n-548\t843\t101\t49\t239\t133\t28\n-1023\t1023\t307\t345\t357\t285\t25\n-580\t1019\t105\t263\t222\t286\t19\n-597\t1023\t234\t215\t225\t89\t22\n-441\t159\t546\t269\t33\t164\t5\n-330\t101\t531\t0\t59\t14\t15\n-373\t170\t53\t131\t84\t0\t3\n-338\t117\t261\t0\t80\t68\t2\n-398\t155\t144\t123\t616\t223\t10\n-615\t460\t273\t253\t171\t14\t26\n-773\t583\t406\t246\t187\t289\t18\n-369\t121\t556\t167\t0\t175\t13\n-379\t104\t505\t0\t0\t215\t16\n-369\t111\t68\t142\t299\t190\t8\n-358\t102\t552\t190\t18\t169\t13\n-448\t167\t99\t0\t0\t18\t2\n-594\t270\t154\t167\t707\t397\t10\n-501\t193\t147\t0\t39\t199\t8\n-726\t980\t187\t195\t221\t192\t24\n-373\t140\t554\t20\t0\t43\t15\n-423\t152\t116\t0\t591\t142\t11\n-338\t129\t36\t0\t597\t202\t6\n-371\t104\t568\t49\t139\t130\t1\n-353\t112\t550\t48\t0\t95\t1\n-351\t118\t498\t251\t44\t206\t5\n-788\t1023\t124\t266\t221\t278\t21\n-346\t138\t510\t206\t0\t128\t5\n-304\t90\t467\t74\t0\t194\t16\n-655\t530\t275\t285\t246\t309\t18\n-356\t116\t539\t79\t0\t96\t7\n-356\t138\t67\t0\t645\t250\t6\n-656\t1023\t200\t274\t318\t286\t21\n-817\t1023\t155\t266\t240\t173\t24\n-370\t80\t74\t196\t532\t246\t10\n-350\t128\t540\t0\t146\t77\t1\n-691\t1023\t0\t283\t190\t277\t19\n-631\t302\t459\t156\t164\t229\t18\n-645\t285\t388\t205\t187\t196\t18\n-389\t185\t160\t28\t664\t319\t6\n-413\t152\t22\t0\t645\t66\t11\n-464\t230\t97\t170\t164\t109\t3\n-328\t93\t0\t0\t436\t206\t6\n-956\t391\t578\t205\t288\t255\t18\n-335\t141\t520\t103\t21\t155\t7\n-588\t1009\t177\t271\t237\t206\t20\n-427\t132\t549\t1\t68\t270\t17\n-779\t1023\t121\t267\t274\t283\t21\n-'..b'\t154\t4\n-584\t1023\t116\t219\t126\t250\t19\n-351\t125\t540\t214\t0\t196\t13\n-318\t181\t76\t82\t52\t26\t3\n-327\t114\t510\t220\t0\t57\t9\n-945\t1023\t234\t319\t308\t197\t24\n-412\t133\t564\t199\t100\t165\t5\n-436\t259\t502\t164\t64\t155\t13\n-815\t1023\t120\t292\t223\t136\t24\n-810\t1023\t258\t296\t283\t224\t21\n-420\t91\t525\t1\t0\t22\t15\n-443\t198\t555\t129\t156\t245\t13\n-369\t121\t541\t40\t114\t110\t1\n-494\t295\t147\t150\t128\t103\t3\n-637\t1012\t183\t266\t267\t83\t22\n-375\t164\t106\t166\t642\t239\t10\n-394\t199\t75\t76\t597\t272\t6\n-665\t1023\t195\t223\t251\t195\t20\n-362\t107\t551\t10\t0\t0\t15\n-704\t1023\t206\t175\t191\t267\t27\n-338\t97\t464\t139\t106\t176\t13\n-325\t90\t521\t17\t0\t69\t15\n-379\t212\t526\t140\t85\t191\t13\n-424\t163\t565\t27\t190\t98\t1\n-376\t126\t99\t56\t622\t238\t6\n-398\t190\t124\t150\t628\t269\t10\n-349\t113\t80\t76\t648\t202\t11\n-647\t1019\t154\t245\t221\t240\t19\n-791\t1023\t146\t161\t183\t137\t24\n-363\t169\t548\t129\t91\t252\t13\n-433\t248\t99\t159\t152\t225\t8\n-346\t115\t516\t155\t0\t132\t7\n-758\t1023\t195\t258\t269\t230\t21\n-330\t158\t64\t0\t56\t234\t8\n-374\t119\t548\t146\t0\t22\t9\n-362\t211\t550\t232\t0\t214\t13\n-687\t1023\t194\t282\t197\t115\t22\n-489\t209\t0\t144\t262\t43\t14\n-594\t1023\t343\t500\t375\t406\t23\n-329\t130\t535\t11\t49\t98\t1\n-829\t1023\t186\t238\t227\t176\t24\n-326\t178\t44\t182\t621\t203\t10\n-609\t1023\t99\t225\t206\t183\t20\n-315\t104\t505\t88\t0\t118\t7\n-380\t185\t112\t2\t632\t253\t6\n-709\t491\t332\t198\t232\t159\t26\n-422\t138\t564\t187\t0\t263\t12\n-359\t168\t516\t4\t84\t135\t1\n-766\t1023\t167\t226\t215\t223\t21\n-693\t1023\t201\t291\t238\t121\t24\n-373\t127\t462\t124\t87\t57\t9\n-590\t965\t152\t114\t195\t265\t27\n-582\t375\t413\t171\t121\t232\t18\n-606\t1023\t179\t213\t201\t226\t19\n-358\t96\t63\t164\t593\t283\t10\n-380\t112\t562\t102\t142\t0\t15\n-382\t90\t521\t73\t121\t110\t7\n-351\t95\t540\t0\t178\t127\t1\n-541\t1023\t321\t447\t380\t428\t23\n-331\t176\t497\t172\t0\t141\t5\n-682\t1023\t175\t327\t242\t228\t21\n-378\t114\t532\t148\t0\t135\t7\n-334\t113\t511\t200\t46\t211\t13\n-362\t84\t526\t102\t0\t185\t13\n-791\t1023\t197\t279\t314\t236\t21\n-356\t126\t529\t0\t43\t138\t1\n-696\t1023\t130\t274\t235\t332\t21\n-722\t1023\t190\t260\t250\t237\t21\n-376\t94\t544\t104\t0\t99\t7\n-415\t147\t525\t0\t189\t102\t1\n-641\t950\t91\t250\t244\t212\t20\n-387\t124\t538\t23\t139\t4\t15\n-458\t103\t513\t0\t0\t106\t1\n-414\t126\t86\t95\t567\t171\t11\n-559\t919\t160\t218\t138\t193\t20\n-572\t895\t156\t49\t236\t47\t28\n-381\t111\t510\t93\t0\t95\t7\n-299\t143\t11\t0\t95\t58\t2\n-585\t1023\t197\t221\t216\t193\t20\n-638\t1023\t225\t254\t180\t157\t20\n-369\t162\t540\t81\t0\t56\t15\n-599\t915\t77\t255\t248\t124\t20\n-686\t1023\t89\t257\t217\t232\t19\n-578\t1023\t83\t207\t216\t126\t28\n-364\t120\t503\t0\t153\t225\t16\n-600\t1018\t153\t222\t275\t38\t22\n-383\t192\t101\t229\t624\t224\t10\n-383\t130\t532\t0\t67\t107\t1\n-328\t146\t23\t138\t0\t116\t3\n-272\t75\t99\t154\t220\t133\t3\n-323\t171\t96\t61\t146\t0\t3\n-337\t81\t506\t10\t0\t150\t1\n-290\t151\t0\t0\t106\t159\t2\n-661\t1023\t213\t292\t238\t295\t21\n-590\t1023\t216\t252\t264\t276\t19\n-512\t263\t118\t0\t213\t348\t8\n-315\t126\t502\t269\t48\t98\t5\n-276\t85\t479\t104\t40\t102\t7\n-378\t81\t548\t167\t0\t58\t9\n-387\t154\t0\t190\t656\t362\t10\n-602\t1023\t143\t256\t247\t38\t22\n-341\t142\t530\t7\t89\t46\t15\n-691\t1023\t141\t212\t189\t204\t20\n-576\t1006\t135\t209\t251\t216\t27\n-567\t849\t120\t157\t87\t213\t27\n-705\t1023\t189\t282\t279\t330\t21\n-985\t1023\t421\t292\t257\t220\t25\n-651\t1023\t181\t285\t202\t201\t20\n-693\t1023\t213\t300\t221\t225\t21\n-408\t113\t545\t183\t210\t104\t5\n-418\t143\t545\t0\t82\t126\t1\n-384\t112\t522\t111\t76\t109\t7\n-275\t48\t394\t0\t131\t0\t15\n-359\t113\t42\t80\t600\t163\t11\n-357\t169\t154\t138\t649\t283\t10\n-400\t224\t108\t227\t31\t107\t3\n-346\t88\t82\t84\t196\t98\t14\n-323\t124\t534\t0\t186\t183\t16\n-374\t103\t541\t142\t101\t52\t9\n-380\t105\t508\t170\t126\t313\t12\n-353\t196\t117\t115\t0\t164\t8\n-359\t113\t511\t259\t0\t141\t5\n-377\t137\t558\t11\t0\t14\t15\n-623\t423\t459\t227\t147\t40\t26\n-389\t149\t96\t50\t640\t263\t6\n-543\t1023\t144\t249\t187\t104\t28\n-691\t982\t85\t264\t194\t206\t20\n-627\t1023\t157\t238\t216\t193\t20\n-577\t1023\t165\t258\t299\t198\t20\n-402\t131\t569\t0\t124\t0\t15\n-337\t91\t506\t231\t0\t49\t9\n-636\t870\t91\t227\t96\t172\t20\n-356\t125\t58\t0\t621\t308\t6\n-390\t190\t46\t88\t665\t313\t10\n-351\t68\t529\t86\t0\t56\t15\n-623\t475\t365\t79\t157\t281\t18\n-335\t74\t512\t209\t49\t270\t12\n-496\t194\t105\t202\t427\t25\t14\n-614\t1023\t178\t280\t196\t117\t22\n-381\t84\t545\t101\t0\t140\t7\n-289\t93\t425\t0\t28\t68\t15\n-385\t240\t52\t168\t638\t277\t10\n-322\t162\t103\t0\t52\t61\t2\n-343\t126\t488\t99\t187\t276\t17\n-362\t197\t105\t68\t0\t2\t3\n-378\t99\t527\t0\t0\t116\t1\n-347\t107\t522\t0\t0\t200\t16\n-468\t198\t137\t99\t341\t111\t14\n-572\t967\t57\t255\t159\t220\t19\n-608\t1023\t115\t247\t174\t266\t19\n-637\t1023\t203\t289\t255\t175\t20\n-649\t902\t155\t165\t213\t262\t27\n-322\t148\t0\t187\t87\t115\t3\n'
b
diff -r 2f6dcda6e74e -r 91e856e5ec7a generate_mfi/test-data/mdfi.flowmfi
--- a/generate_mfi/test-data/mdfi.flowmfi Mon Feb 27 13:00:34 2017 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,31 +0,0 @@
-Population FSC SSC CD4 CCR3 CD8 CCR7
-1 355 113 525 0 42 110
-2 322 148 61 0 64 109
-3 352 166 69 148 76 82
-4 420 318 132 377 150 188
-5 368 119 528 222 24 131
-6 370 148 70 13 626 262
-7 358 115 522 117 38 115
-8 373 186 100 129 116 209
-9 360 117 525 176 28 40
-10 382 153 78 148 627 272
-11 367 146 67 99 594 172
-12 410 132 532 208 58 273
-13 369 120 526 146 42 194
-14 382 184 92 97 324 104
-15 353 114 525 7 44 37
-16 364 118 522 0 58 185
-17 409 138 533 31 82 289
-18 674 457 401 206 188 250
-19 619 1023 155 254 228 253
-20 626 1023 153 253 227 183
-21 735 1023 191 275 259 257
-22 652 1023 158 247 228 74
-23 541 1023 348 475 363 422
-24 753 1023 181 272 247 166
-25 1002 1023 296 326 298 329
-26 643 388 398 190 179 130
-27 607 1018 146 166 218 225
-28 581 968 130 182 216 133
-29 1023 1023 438 507 400 459
-30 762 1023 510 822 528 566
b
diff -r 2f6dcda6e74e -r 91e856e5ec7a generate_mfi/test-data/mfi.flowmfi
--- a/generate_mfi/test-data/mfi.flowmfi Mon Feb 27 13:00:34 2017 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
b
@@ -1,31 +0,0 @@
-Population FSC SSC CD4 CCR3 CD8 CCR7
-1 357 117 517 12 57 111
-2 333 152 69 20 69 106
-3 355 174 76 152 79 77
-4 421 381 147 402 140 186
-5 372 124 524 227 51 131
-6 370 150 75 26 618 264
-7 358 118 513 119 57 114
-8 378 207 99 127 120 218
-9 360 121 518 179 51 38
-10 384 158 83 154 620 272
-11 367 152 70 98 583 164
-12 414 146 527 208 71 282
-13 374 126 520 150 57 196
-14 387 184 91 96 338 101
-15 355 118 515 27 58 34
-16 369 124 516 20 70 188
-17 411 147 530 41 86 301
-18 675 453 385 196 184 256
-19 613 988 153 256 222 257
-20 620 986 151 255 224 180
-21 745 1015 190 274 255 261
-22 655 987 153 244 224 70
-23 540 926 347 485 363 413
-24 766 1012 181 267 243 163
-25 966 965 328 323 295 331
-26 650 392 384 179 171 121
-27 612 965 145 152 213 228
-28 578 934 128 172 209 129
-29 979 1010 437 523 406 456
-30 749 858 535 834 564 580
b
diff -r 2f6dcda6e74e -r 91e856e5ec7a test-data/gmfi.flowmfi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/gmfi.flowmfi Wed Jul 22 15:41:56 2020 -0400
b
@@ -0,0 +1,31 @@
+Population FSC SSC CD4 CCR3 CD8 CCR7
+1 354 113 515 0 0 109
+2 329 145 0 0 0 0
+3 351 163 0 144 0 0
+4 415 342 0 389 0 0
+5 370 120 523 224 0 126
+6 368 145 0 0 617 261
+7 356 114 511 115 0 111
+8 372 188 0 0 0 213
+9 358 117 516 173 0 0
+10 382 152 0 149 618 270
+11 365 145 0 0 580 0
+12 411 138 524 203 0 278
+13 371 121 519 145 0 195
+14 384 177 0 0 328 0
+15 353 114 512 0 0 0
+16 366 118 513 0 0 186
+17 407 140 528 0 0 298
+18 670 442 373 0 0 252
+19 611 985 0 254 0 255
+20 618 983 0 253 219 178
+21 743 1014 0 271 251 259
+22 652 984 0 241 218 0
+23 531 884 341 481 0 409
+24 764 1011 174 264 238 159
+25 963 945 315 319 289 326
+26 646 377 374 0 0 0
+27 609 961 0 0 0 226
+28 574 927 0 0 0 123
+29 976 1008 429 515 397 452
+30 699 813 522 828 546 573
b
diff -r 2f6dcda6e74e -r 91e856e5ec7a test-data/input.flowclr
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/input.flowclr Wed Jul 22 15:41:56 2020 -0400
b
b'@@ -0,0 +1,20000 @@\n+FSC\tSSC\tCD4\tCCR3\tCD8\tCCR7\tPopulation\n+328\t122\t547\t94\t85\t93\t7\n+581\t1023\t143\t235\t270\t106\t22\n+427\t172\t140\t200\t631\t300\t10\n+363\t92\t526\t0\t140\t5\t15\n+416\t113\t485\t22\t157\t226\t16\n+317\t100\t488\t165\t83\t39\t9\n+636\t436\t439\t143\t81\t217\t18\n+262\t49\t395\t0\t42\t171\t16\n+332\t147\t534\t241\t142\t43\t9\n+567\t454\t305\t30\t168\t236\t18\n+333\t138\t104\t0\t612\t225\t6\n+359\t100\t530\t132\t63\t100\t7\n+298\t85\t480\t253\t0\t171\t5\n+392\t123\t90\t176\t623\t182\t11\n+303\t112\t0\t115\t84\t64\t3\n+591\t948\t188\t176\t247\t130\t28\n+687\t535\t422\t301\t156\t230\t18\n+372\t151\t524\t182\t16\t273\t12\n+420\t180\t555\t88\t0\t119\t7\n+401\t182\t104\t76\t103\t138\t2\n+571\t1023\t364\t461\t377\t463\t23\n+398\t169\t92\t126\t668\t312\t10\n+378\t152\t552\t114\t125\t92\t7\n+352\t108\t528\t174\t47\t28\t9\n+714\t391\t449\t0\t210\t257\t18\n+524\t497\t106\t106\t180\t244\t8\n+563\t1023\t366\t471\t397\t460\t23\n+407\t93\t80\t145\t579\t306\t10\n+358\t129\t73\t257\t604\t268\t10\n+1023\t1023\t479\t406\t385\t351\t25\n+1023\t1023\t455\t536\t472\t508\t29\n+474\t172\t563\t0\t160\t111\t1\n+577\t1023\t164\t302\t258\t219\t19\n+348\t73\t521\t212\t0\t142\t5\n+294\t79\t470\t43\t112\t293\t17\n+369\t197\t0\t197\t185\t124\t3\n+389\t121\t71\t179\t637\t297\t10\n+589\t895\t180\t184\t246\t239\t27\n+432\t883\t8\t220\t177\t128\t28\n+601\t1004\t162\t221\t231\t128\t28\n+353\t137\t539\t196\t123\t63\t9\n+357\t127\t40\t203\t520\t174\t11\n+326\t128\t483\t194\t67\t34\t9\n+286\t74\t27\t78\t546\t266\t6\n+394\t158\t130\t82\t596\t314\t6\n+389\t224\t100\t113\t236\t104\t14\n+294\t77\t479\t270\t0\t47\t9\n+556\t946\t156\t211\t299\t177\t20\n+363\t117\t539\t199\t132\t62\t9\n+769\t1023\t189\t288\t291\t28\t22\n+558\t334\t325\t185\t186\t227\t18\n+760\t1023\t181\t271\t239\t258\t21\n+421\t243\t113\t90\t215\t181\t8\n+513\t283\t263\t241\t126\t124\t26\n+686\t935\t227\t267\t223\t109\t22\n+418\t137\t104\t127\t649\t260\t10\n+322\t115\t527\t0\t75\t70\t15\n+563\t1023\t165\t177\t212\t224\t27\n+620\t1023\t238\t267\t176\t206\t20\n+766\t1023\t347\t411\t384\t191\t24\n+378\t159\t41\t186\t637\t245\t10\n+598\t1023\t402\t490\t417\t399\t23\n+349\t142\t0\t191\t643\t286\t10\n+373\t102\t544\t147\t0\t215\t13\n+404\t138\t559\t267\t236\t133\t5\n+277\t47\t486\t242\t61\t120\t5\n+375\t113\t542\t122\t113\t23\t9\n+695\t849\t168\t230\t238\t209\t20\n+466\t185\t569\t184\t112\t238\t12\n+393\t114\t581\t131\t0\t118\t7\n+574\t1023\t127\t275\t245\t207\t20\n+618\t1023\t129\t271\t228\t230\t19\n+605\t1006\t213\t204\t220\t220\t27\n+495\t605\t83\t155\t167\t225\t27\n+716\t807\t131\t269\t126\t129\t24\n+607\t1023\t147\t294\t253\t219\t19\n+392\t236\t484\t237\t29\t106\t5\n+551\t910\t379\t822\t363\t417\t30\n+383\t153\t0\t0\t643\t286\t6\n+1023\t1023\t465\t336\t347\t366\t25\n+316\t233\t31\t209\t140\t307\t8\n+681\t1023\t284\t324\t280\t220\t21\n+418\t143\t553\t171\t98\t195\t13\n+361\t87\t26\t0\t618\t307\t6\n+419\t177\t91\t153\t277\t199\t8\n+598\t984\t87\t260\t246\t263\t19\n+634\t1023\t88\t158\t178\t156\t28\n+595\t1023\t154\t238\t284\t247\t19\n+388\t203\t544\t0\t149\t126\t1\n+354\t159\t504\t210\t0\t152\t5\n+294\t76\t141\t0\t29\t255\t8\n+328\t99\t468\t177\t171\t44\t9\n+283\t128\t463\t112\t0\t126\t7\n+673\t1023\t156\t262\t211\t40\t22\n+409\t115\t515\t217\t52\t193\t13\n+321\t102\t514\t0\t62\t135\t1\n+279\t83\t435\t174\t0\t267\t12\n+565\t1017\t67\t233\t210\t238\t19\n+339\t123\t538\t60\t99\t73\t15\n+343\t148\t44\t134\t615\t235\t10\n+390\t130\t86\t82\t635\t220\t11\n+283\t52\t423\t52\t63\t69\t15\n+548\t843\t101\t49\t239\t133\t28\n+1023\t1023\t307\t345\t357\t285\t25\n+580\t1019\t105\t263\t222\t286\t19\n+597\t1023\t234\t215\t225\t89\t22\n+441\t159\t546\t269\t33\t164\t5\n+330\t101\t531\t0\t59\t14\t15\n+373\t170\t53\t131\t84\t0\t3\n+338\t117\t261\t0\t80\t68\t2\n+398\t155\t144\t123\t616\t223\t10\n+615\t460\t273\t253\t171\t14\t26\n+773\t583\t406\t246\t187\t289\t18\n+369\t121\t556\t167\t0\t175\t13\n+379\t104\t505\t0\t0\t215\t16\n+369\t111\t68\t142\t299\t190\t8\n+358\t102\t552\t190\t18\t169\t13\n+448\t167\t99\t0\t0\t18\t2\n+594\t270\t154\t167\t707\t397\t10\n+501\t193\t147\t0\t39\t199\t8\n+726\t980\t187\t195\t221\t192\t24\n+373\t140\t554\t20\t0\t43\t15\n+423\t152\t116\t0\t591\t142\t11\n+338\t129\t36\t0\t597\t202\t6\n+371\t104\t568\t49\t139\t130\t1\n+353\t112\t550\t48\t0\t95\t1\n+351\t118\t498\t251\t44\t206\t5\n+788\t1023\t124\t266\t221\t278\t21\n+346\t138\t510\t206\t0\t128\t5\n+304\t90\t467\t74\t0\t194\t16\n+655\t530\t275\t285\t246\t309\t18\n+356\t116\t539\t79\t0\t96\t7\n+356\t138\t67\t0\t645\t250\t6\n+656\t1023\t200\t274\t318\t286\t21\n+817\t1023\t155\t266\t240\t173\t24\n+370\t80\t74\t196\t532\t246\t10\n+350\t128\t540\t0\t146\t77\t1\n+691\t1023\t0\t283\t190\t277\t19\n+631\t302\t459\t156\t164\t229\t18\n+645\t285\t388\t205\t187\t196\t18\n+389\t185\t160\t28\t664\t319\t6\n+413\t152\t22\t0\t645\t66\t11\n+464\t230\t97\t170\t164\t109\t3\n+328\t93\t0\t0\t436\t206\t6\n+956\t391\t578\t205\t288\t255\t18\n+335\t141\t520\t103\t21\t155\t7\n+588\t1009\t177\t271\t237\t206\t20\n+427\t132\t549\t1\t68\t270\t17\n+779\t1023\t121\t267\t274\t283\t21\n+'..b'\t154\t4\n+584\t1023\t116\t219\t126\t250\t19\n+351\t125\t540\t214\t0\t196\t13\n+318\t181\t76\t82\t52\t26\t3\n+327\t114\t510\t220\t0\t57\t9\n+945\t1023\t234\t319\t308\t197\t24\n+412\t133\t564\t199\t100\t165\t5\n+436\t259\t502\t164\t64\t155\t13\n+815\t1023\t120\t292\t223\t136\t24\n+810\t1023\t258\t296\t283\t224\t21\n+420\t91\t525\t1\t0\t22\t15\n+443\t198\t555\t129\t156\t245\t13\n+369\t121\t541\t40\t114\t110\t1\n+494\t295\t147\t150\t128\t103\t3\n+637\t1012\t183\t266\t267\t83\t22\n+375\t164\t106\t166\t642\t239\t10\n+394\t199\t75\t76\t597\t272\t6\n+665\t1023\t195\t223\t251\t195\t20\n+362\t107\t551\t10\t0\t0\t15\n+704\t1023\t206\t175\t191\t267\t27\n+338\t97\t464\t139\t106\t176\t13\n+325\t90\t521\t17\t0\t69\t15\n+379\t212\t526\t140\t85\t191\t13\n+424\t163\t565\t27\t190\t98\t1\n+376\t126\t99\t56\t622\t238\t6\n+398\t190\t124\t150\t628\t269\t10\n+349\t113\t80\t76\t648\t202\t11\n+647\t1019\t154\t245\t221\t240\t19\n+791\t1023\t146\t161\t183\t137\t24\n+363\t169\t548\t129\t91\t252\t13\n+433\t248\t99\t159\t152\t225\t8\n+346\t115\t516\t155\t0\t132\t7\n+758\t1023\t195\t258\t269\t230\t21\n+330\t158\t64\t0\t56\t234\t8\n+374\t119\t548\t146\t0\t22\t9\n+362\t211\t550\t232\t0\t214\t13\n+687\t1023\t194\t282\t197\t115\t22\n+489\t209\t0\t144\t262\t43\t14\n+594\t1023\t343\t500\t375\t406\t23\n+329\t130\t535\t11\t49\t98\t1\n+829\t1023\t186\t238\t227\t176\t24\n+326\t178\t44\t182\t621\t203\t10\n+609\t1023\t99\t225\t206\t183\t20\n+315\t104\t505\t88\t0\t118\t7\n+380\t185\t112\t2\t632\t253\t6\n+709\t491\t332\t198\t232\t159\t26\n+422\t138\t564\t187\t0\t263\t12\n+359\t168\t516\t4\t84\t135\t1\n+766\t1023\t167\t226\t215\t223\t21\n+693\t1023\t201\t291\t238\t121\t24\n+373\t127\t462\t124\t87\t57\t9\n+590\t965\t152\t114\t195\t265\t27\n+582\t375\t413\t171\t121\t232\t18\n+606\t1023\t179\t213\t201\t226\t19\n+358\t96\t63\t164\t593\t283\t10\n+380\t112\t562\t102\t142\t0\t15\n+382\t90\t521\t73\t121\t110\t7\n+351\t95\t540\t0\t178\t127\t1\n+541\t1023\t321\t447\t380\t428\t23\n+331\t176\t497\t172\t0\t141\t5\n+682\t1023\t175\t327\t242\t228\t21\n+378\t114\t532\t148\t0\t135\t7\n+334\t113\t511\t200\t46\t211\t13\n+362\t84\t526\t102\t0\t185\t13\n+791\t1023\t197\t279\t314\t236\t21\n+356\t126\t529\t0\t43\t138\t1\n+696\t1023\t130\t274\t235\t332\t21\n+722\t1023\t190\t260\t250\t237\t21\n+376\t94\t544\t104\t0\t99\t7\n+415\t147\t525\t0\t189\t102\t1\n+641\t950\t91\t250\t244\t212\t20\n+387\t124\t538\t23\t139\t4\t15\n+458\t103\t513\t0\t0\t106\t1\n+414\t126\t86\t95\t567\t171\t11\n+559\t919\t160\t218\t138\t193\t20\n+572\t895\t156\t49\t236\t47\t28\n+381\t111\t510\t93\t0\t95\t7\n+299\t143\t11\t0\t95\t58\t2\n+585\t1023\t197\t221\t216\t193\t20\n+638\t1023\t225\t254\t180\t157\t20\n+369\t162\t540\t81\t0\t56\t15\n+599\t915\t77\t255\t248\t124\t20\n+686\t1023\t89\t257\t217\t232\t19\n+578\t1023\t83\t207\t216\t126\t28\n+364\t120\t503\t0\t153\t225\t16\n+600\t1018\t153\t222\t275\t38\t22\n+383\t192\t101\t229\t624\t224\t10\n+383\t130\t532\t0\t67\t107\t1\n+328\t146\t23\t138\t0\t116\t3\n+272\t75\t99\t154\t220\t133\t3\n+323\t171\t96\t61\t146\t0\t3\n+337\t81\t506\t10\t0\t150\t1\n+290\t151\t0\t0\t106\t159\t2\n+661\t1023\t213\t292\t238\t295\t21\n+590\t1023\t216\t252\t264\t276\t19\n+512\t263\t118\t0\t213\t348\t8\n+315\t126\t502\t269\t48\t98\t5\n+276\t85\t479\t104\t40\t102\t7\n+378\t81\t548\t167\t0\t58\t9\n+387\t154\t0\t190\t656\t362\t10\n+602\t1023\t143\t256\t247\t38\t22\n+341\t142\t530\t7\t89\t46\t15\n+691\t1023\t141\t212\t189\t204\t20\n+576\t1006\t135\t209\t251\t216\t27\n+567\t849\t120\t157\t87\t213\t27\n+705\t1023\t189\t282\t279\t330\t21\n+985\t1023\t421\t292\t257\t220\t25\n+651\t1023\t181\t285\t202\t201\t20\n+693\t1023\t213\t300\t221\t225\t21\n+408\t113\t545\t183\t210\t104\t5\n+418\t143\t545\t0\t82\t126\t1\n+384\t112\t522\t111\t76\t109\t7\n+275\t48\t394\t0\t131\t0\t15\n+359\t113\t42\t80\t600\t163\t11\n+357\t169\t154\t138\t649\t283\t10\n+400\t224\t108\t227\t31\t107\t3\n+346\t88\t82\t84\t196\t98\t14\n+323\t124\t534\t0\t186\t183\t16\n+374\t103\t541\t142\t101\t52\t9\n+380\t105\t508\t170\t126\t313\t12\n+353\t196\t117\t115\t0\t164\t8\n+359\t113\t511\t259\t0\t141\t5\n+377\t137\t558\t11\t0\t14\t15\n+623\t423\t459\t227\t147\t40\t26\n+389\t149\t96\t50\t640\t263\t6\n+543\t1023\t144\t249\t187\t104\t28\n+691\t982\t85\t264\t194\t206\t20\n+627\t1023\t157\t238\t216\t193\t20\n+577\t1023\t165\t258\t299\t198\t20\n+402\t131\t569\t0\t124\t0\t15\n+337\t91\t506\t231\t0\t49\t9\n+636\t870\t91\t227\t96\t172\t20\n+356\t125\t58\t0\t621\t308\t6\n+390\t190\t46\t88\t665\t313\t10\n+351\t68\t529\t86\t0\t56\t15\n+623\t475\t365\t79\t157\t281\t18\n+335\t74\t512\t209\t49\t270\t12\n+496\t194\t105\t202\t427\t25\t14\n+614\t1023\t178\t280\t196\t117\t22\n+381\t84\t545\t101\t0\t140\t7\n+289\t93\t425\t0\t28\t68\t15\n+385\t240\t52\t168\t638\t277\t10\n+322\t162\t103\t0\t52\t61\t2\n+343\t126\t488\t99\t187\t276\t17\n+362\t197\t105\t68\t0\t2\t3\n+378\t99\t527\t0\t0\t116\t1\n+347\t107\t522\t0\t0\t200\t16\n+468\t198\t137\t99\t341\t111\t14\n+572\t967\t57\t255\t159\t220\t19\n+608\t1023\t115\t247\t174\t266\t19\n+637\t1023\t203\t289\t255\t175\t20\n+649\t902\t155\t165\t213\t262\t27\n+322\t148\t0\t187\t87\t115\t3\n'
b
diff -r 2f6dcda6e74e -r 91e856e5ec7a test-data/mdfi.flowmfi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/mdfi.flowmfi Wed Jul 22 15:41:56 2020 -0400
b
@@ -0,0 +1,31 @@
+Population FSC SSC CD4 CCR3 CD8 CCR7
+1 355 113 525 0 42 110
+2 322 148 61 0 64 109
+3 352 166 69 148 76 82
+4 420 318 132 377 150 188
+5 368 119 528 222 24 131
+6 370 148 70 13 626 262
+7 358 115 522 117 38 115
+8 373 186 100 129 116 209
+9 360 117 525 176 28 40
+10 382 153 78 148 627 272
+11 367 146 67 99 594 172
+12 410 132 532 208 58 273
+13 369 120 526 146 42 194
+14 382 184 92 97 324 104
+15 353 114 525 7 44 37
+16 364 118 522 0 58 185
+17 409 138 533 31 82 289
+18 674 457 401 206 188 250
+19 619 1023 155 254 228 253
+20 626 1023 153 253 227 183
+21 735 1023 191 275 259 257
+22 652 1023 158 247 228 74
+23 541 1023 348 475 363 422
+24 753 1023 181 272 247 166
+25 1002 1023 296 326 298 329
+26 643 388 398 190 179 130
+27 607 1018 146 166 218 225
+28 581 968 130 182 216 133
+29 1023 1023 438 507 400 459
+30 762 1023 510 822 528 566
b
diff -r 2f6dcda6e74e -r 91e856e5ec7a test-data/mfi.flowmfi
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/mfi.flowmfi Wed Jul 22 15:41:56 2020 -0400
b
@@ -0,0 +1,31 @@
+Population FSC SSC CD4 CCR3 CD8 CCR7
+1 357 117 517 12 57 111
+2 333 152 69 20 69 106
+3 355 174 76 152 79 77
+4 421 381 147 402 140 186
+5 372 124 524 227 51 131
+6 370 150 75 26 618 264
+7 358 118 513 119 57 114
+8 378 207 99 127 120 218
+9 360 121 518 179 51 38
+10 384 158 83 154 620 272
+11 367 152 70 98 583 164
+12 414 146 527 208 71 282
+13 374 126 520 150 57 196
+14 387 184 91 96 338 101
+15 355 118 515 27 58 34
+16 369 124 516 20 70 188
+17 411 147 530 41 86 301
+18 675 453 385 196 184 256
+19 613 988 153 256 222 257
+20 620 986 151 255 224 180
+21 745 1015 190 274 255 261
+22 655 987 153 244 224 70
+23 540 926 347 485 363 413
+24 766 1012 181 267 243 163
+25 966 965 328 323 295 331
+26 650 392 384 179 171 121
+27 612 965 145 152 213 228
+28 578 934 128 172 209 129
+29 979 1010 437 523 406 456
+30 749 858 535 834 564 580