From d3b7732a1d03d3ed8aa7748cffed4caf334f43f4 Mon Sep 17 00:00:00 2001
From: micbl <56760928+micbl@users.noreply.github.com>
Date: Mon, 20 Jun 2022 20:43:59 +0200
Subject: [PATCH] v0.3.1 some changes

 - added handling of ripser command line options
 - added a few examples
 - expanded README
---
 README.md                                | 202 ++++++--
 examples/{min_test.dist => diamond.dist} |   0
 examples/diamond.fltr                    |   4 +
 examples/extract_annotation_from_ids.py  |   8 -
 examples/min_test.fltr                   |   4 -
 examples/test.fltr                       | 612 +++++++++++------------
 examples/test.ids                        | 307 ------------
 examples/test2.dist                      |  10 -
 examples/test2.fltr                      |  11 -
 go.mod                                   |   3 +
 murit.go => main.go                      | 162 ++++--
 11 files changed, 609 insertions(+), 714 deletions(-)
 rename examples/{min_test.dist => diamond.dist} (100%)
 create mode 100644 examples/diamond.fltr
 delete mode 100644 examples/extract_annotation_from_ids.py
 delete mode 100644 examples/min_test.fltr
 delete mode 100644 examples/test.ids
 delete mode 100644 examples/test2.dist
 delete mode 100644 examples/test2.fltr
 create mode 100644 go.mod
 rename murit.go => main.go (62%)

diff --git a/README.md b/README.md
index 1b66419..93af01f 100644
--- a/README.md
+++ b/README.md
@@ -1,56 +1,182 @@
 # MuRiT
-Copyright © 2022 Michael Bleher, ...
+Copyright © 2022 Michael Bleher
 
 ## Description
-MuRiT is a standalone program that determines a Vietoris-Rips transformation for multifiltered flag complex.
-It's relevance stems from the fact that it can be used as a Ripser add-on to calculate persistent homology of the flag complex along any totally ordered subfiltration.
+`MuRiT` is a standalone program that provides Vietoris-Rips transformations for multifiltered flag complexes.
 
-The main features of MuRiT
+It is build with the main goal of providing a `Ripser` add-on to calculate persistent homology of flag complexes along any totally ordered subfiltration of interest.
+Thus, `MuRiT` allows an easy exploration of multi-persistence properties for filtered metric spaces, e.g. timeseries data.
 
-- fully parallelized and memory-efficient
+
+The main features of `MuRiT` are
+
+- easy exploration of multi-persistence for filtered metric spaces
+- optimized for use as `Ripser` add-on (integrated call to local instance of `Ripser`)
+- fully parallelized and memory-efficient creation of the distance matrix of a Vietoris-Rips transformation
 - standalone exectubales for all major platforms
 - open source go code
-- optimized for use as Ripser add-on, integrated call to local instance of Ripser  
 
-Input formats currently supported by MuRiT
 
-- comma-separated edge annotation file & subfiltration
-- comma-separated lower-triangular distance matrix, point annotation file, & subfiltration
+## Setup
+### Installation
+We provide executables for major platforms and architectures as releases, no installation is required for those.
+Just download the executable that fits your setup.
+
+If your platform and architecture is not provided, please see below.
+
+### Build and Modify
+`MuRiT` is written in go, so it can be easily modified and run directly from source.
+For this you only need [a recent go installation](https://go.dev/) and a copy of this repository.
+
+To run `MuRiT` from source use
+```
+go run main.go [--options]
+```
+
+For help in building your own executables, [see here](https://go.dev/doc/tutorial/compile-install).
+
+### Contribute
+We envision a broad interaction with the research community.
+If you have a special use-case for `MuRiT` that isn't covered by the current implementation or have an idea for additional features, get in touch or submit your pull requests.
 
-## Releases
-latest: v0.4
 
-## Build or Modify
-MuRiT is written in go, so it can be run directly from source if you have installed go.
-This is the best way to go about modifying it to your own needs.
+## Using `MuRiT`
+`MuRiT` expects as input
 
-If you want to build your own executables, see here.
+- a comma-separated lower-triangular distance matrix,
+- a pointwise annotation file,
+- and a one-dimensional subfiltration $(VR_0, i_0, j_0, ...)-- ... --(VR_n, i_n, j_n, ...)$.
 
-## Options
-MuRiT offers several run-time options.
+It's output is
+
+- either the distance matrix of a Vietoris-Rips Transformation of the flag complex
+- or the persistent homology of the flag complex along the chosen subfiltration.
+
+A call to `MuRiT` looks as follows
 
 ```
--debug
-      show messages for debugging purposes?
--dist_file string
-      distance file name
--fltr_file string
-      filtration file name. Each row gives filtration value of corresponding data point.
-       Format i,j,k,... (interpreted with lexicraphical order)
--help
-      Get help message
--ripser
-      run ripser?
--save_aux
-      save auxiliary metric?
--sub_fltr string
-      sub-filtration along which to compute 1d persistence.
-       Format: [VR_0, i_0, j_0, k_0,...]-- ... --(VR_n, i_n, j_n, k_n,...)
--threads string
-      number of threads
--verbose
-      show status messages?
+murit --dist [filename] --pt_fltr [filename] --sub_fltr (VR_0, i_0, j_0, ...)-- ... --(VR_n, i_n, j_n, ...) [--options]
 ```
 
+*Note: MuRiT relies on the standard partial order on $\mathbb{R}^n$ for some $n$. Make sure you have translated*
+
+### List of Command Line Arguments
+
+##### `--dist`
+
+file name of lower-triangular distance matrix.
+
+
+##### `--pt_fltr`
+
+file name of pointwise filtration annotation.
+
+  file content: on row 'i' a comma-separated list of minimal filtration values for data point 'i'.
+  example file:
+
+
+    (0,0,1)     // minimum of point 1
+    (1,1,1)     // minimum of point 2
+    ...
+
+##### `--sub_fltr`
+
+  command line input of sub-filtration along which to compute 1d persistence.
+
+  example:
+    (VR_0, i_0, j_0, k_0,...)-- ... --(VR_n, i_n, j_n, k_n,...)
+
+##### `--threads`
+number of threads (default: runtime.NumCPU())
+##### `--verbose`
+Show status messages (default: false)
+##### `--help`
+Show help message
+##### `--ripser`
+run ripser on auxiliary distance matrix (default: false).
+Requires a local ripser installation in PATH
+
+Further Ripser options
+- `--dim` compute persistent homology up to dimension k (default: 1).
+- `--threshold` compute persistent homology up to threshold t (in auxiliary distance matrix, default: enclosing radius).
+- `--modulus` compute homology with coefficients in the prime field Z/pZ (default: 2).
+- `--ratio` only show persistence pairs with death/birth ratio > r
+
+
+## Example
+
+_The distance matrix and filtration file for the following example is provided in `examples/diamonds.*`_
+
+Consider the metric space of a diamond consisting of four points with side length $1$ and diagonal length $2$.
+Assume that for each point there is additional information about time $t$ at which the point entered the data set (say in seconds), and some threshold height $h$ above which it could be observed.
+
+The following list of filtration tuples $(t, h)$ for each of the four points is provided in `examples/diamonds.fltr`.
+```
+(0,0)
+(1.2,0)
+(1.6,1)
+(3.1,1)
+```
+This means that the first point was observed from the beginning and already at lowest height, while the second point only appears after 1.2 seconds and also at lowest height, et cetera.
+
+Running `MuRiT` on this data produces the distance matrix of a Vietoris-Rips transformation
+```
+$ murit --dist examples/diamond.dist --pt_fltr examples/diamond.fltr --verbose
+Read pointwise annotation file
+Build subfiltration
+[[0 0 0] [1 0 0] [1 1.2 0] [1 1.6 1] [1 2 1]]
+Build auxiliary Distance Matrix
+3
+4,5
+5,5,5
+```
+_Note: If no subfiltration is specified, `MuRiT` will build some auxiliary initial subfiltration from information in the filtration annotation. We made use of this behaviour in this example._
+
+If we add the `--ripser` flag, the distance matrix is automatically handed over to `Ripser` to calculate persistent homology along the one-dimensional subfiltration.
+```
+$ murit --dist examples/diamond.dist --pt_fltr examples/diamond.fltr --verbose --ripser
+Read pointwise annotation file
+Build subfiltration
+[[0 0 0] [1 0 0] [1 1.2 0] [1 1.6 1] [1 2 1]]
+Build auxiliary Distance Matrix
+---
+Run Ripser
+value range: [3,5]
+distance matrix with 4 points, using threshold at enclosing radius 5
+persistent homology intervals in dim 1:
+
+```
+Note that we do not find non-trivial homology in this example.
+This makes sense, because the last point enters the filtration only at the last step in the one-dimensional subfiltration.
+Only from that point on we might expect to see the cycle around the diamond.
+
+Adding two further filtration steps $[2,2,1]--[2.1,2,1]$ at higher Vietoris-Rips parameters to the automatically generated subfiltration, we get:
+```
+$ murit --dist examples/diamond.dist --pt_fltr examples/diamond.fltr --verbose --ripser --sub_fltr [0,0,0]--[1,0,0]--[1,1,0]--[1,2,0]--[1,2,1]--[2,2,1]--[2.1,2,1]
+Read pointwise annotation file
+Read subfiltration
+[[0 0 0] [1 0 0] [1 1 0] [1 2 0] [1 2 1] [2 2 1] [2.1 2 1]]
+Build auxiliary Distance Matrix
+---
+Run Ripser
+value range: [4,6]
+distance matrix with 4 points, using threshold at enclosing radius 6
+persistent homology intervals in dim 1:
+ [ [1 2 1] , [2 2 1] ):
+{[0,2] (5), [1,3] (5), [2,3] (5), [0,1] (4)}
+{[0,2] (5), [1,3] (5), [2,3] (5), [0,1] (4)}
+```
+Indeed we find that there is a homology class in dimension one, which is born at filtration value $[1,2,1]$, i.e. once the fourth point has been observed.
+The homology class dies at filtration value $[2,2,1]$, which is when the diagonals are added to the Vietoris-Rips complex.
+
+
+_Note: By using the `--ripser` flag, the result is automatically converted back to the subfiltration values._
+
+
 ## Citing
-TBA
+
+Maximilian Neumann, Michael Bleher, Lukas Hahn, Samuel Braun,
+Holger Obermaier, Mehmet Soysal, René Caspart, and Andreas Ott (2022).
+"MuRiT: efficient computation of the multiparameter
+persistent homology of multifltered fag complexes via
+Vietoris-Rips transformations". *(to appear)*
diff --git a/examples/min_test.dist b/examples/diamond.dist
similarity index 100%
rename from examples/min_test.dist
rename to examples/diamond.dist
diff --git a/examples/diamond.fltr b/examples/diamond.fltr
new file mode 100644
index 0000000..9b8e2ca
--- /dev/null
+++ b/examples/diamond.fltr
@@ -0,0 +1,4 @@
+(0,0)
+(1.2,0)
+(1.6,1)
+(2,1)
diff --git a/examples/extract_annotation_from_ids.py b/examples/extract_annotation_from_ids.py
deleted file mode 100644
index 0903f47..0000000
--- a/examples/extract_annotation_from_ids.py
+++ /dev/null
@@ -1,8 +0,0 @@
-import datetime
-
-with open('test.ids') as f:
-    lines = f.readlines()
-    for row in lines:
-        date = row.split('|')[2]
-        filtrationstep = (datetime.datetime.strptime(date, "%Y-%m-%d")-datetime.datetime(2019,12,30)).days
-        print(filtrationstep)
diff --git a/examples/min_test.fltr b/examples/min_test.fltr
deleted file mode 100644
index 04a7561..0000000
--- a/examples/min_test.fltr
+++ /dev/null
@@ -1,4 +0,0 @@
-0
-1.4
-1.1
-1.3
diff --git a/examples/test.fltr b/examples/test.fltr
index b8ba7fc..a8c8428 100644
--- a/examples/test.fltr
+++ b/examples/test.fltr
@@ -1,307 +1,307 @@
 0
-609
-609
-609
-609
-609
-609
-609
-609
-609
-609
-609
-609
-609
-609
-609
-609
-609
-609
-610
-610
-610
-610
-610
-610
-610
-610
-610
-610
-610
-610
-610
-610
-611
-611
-611
-611
-611
-611
-611
-611
-611
-611
-611
-611
-611
-611
-611
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-612
-613
-613
-613
-613
-613
-613
-613
-613
-613
-613
-613
-613
-613
-613
-613
-613
-613
-613
-614
-614
-614
-614
-614
-615
-615
-615
-615
-615
-615
-615
-615
-615
-615
-615
-616
-616
-616
-616
-616
-616
-616
-616
-616
-616
-616
-616
-616
-616
-616
-616
-617
-617
-617
-617
-617
-617
-617
-617
-617
-617
-617
-617
-617
-617
-617
-617
-617
-617
-618
-618
-618
-618
-618
-618
-618
-618
-618
-618
-618
-618
-619
-619
-619
-619
-619
-619
-619
-619
-619
-619
-619
-619
-619
-619
-620
-620
-620
-620
-620
-620
-620
-620
-620
-620
-621
-621
-621
-621
-621
-621
-621
-621
-621
-622
-622
-622
-622
-622
-622
-622
-623
-623
-623
-623
-623
-623
-623
-623
-623
-623
-623
-623
-624
-624
-624
-624
-624
-624
-624
-625
-625
-625
-625
-625
-625
-626
-626
-626
-626
-626
-626
-626
-626
-626
-626
-626
-627
-627
-627
-627
-627
-627
-627
-627
-627
-627
-628
-628
-628
-628
-629
-630
-630
-630
-630
-631
-631
-631
-631
-631
-631
-631
-631
-632
-632
-632
-632
-632
-632
-632
-632
-632
-633
-633
-633
-633
-633
-633
-633
-633
-633
-633
-633
-634
-634
-634
-634
-634
-634
-635
-635
-635
-636
-636
-636
-637
-637
-637
-637
-637
-637
-638
-638
-638
-638
-638
-638
-638
-638
-639
-639
-639
-639
-639
-640
-640
+2
+5
+5
+5
+5
+7
+8
+9
+9
+9
+9
+9
+9
+9
+9
+9
+9
+9
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+11
+11
+11
+11
+11
+11
+11
+11
+11
+11
+11
+11
+11
+11
+11
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+12
+13
+13
+13
+13
+13
+13
+13
+13
+13
+13
+13
+13
+13
+13
+13
+13
+13
+13
+14
+14
+14
+14
+14
+15
+15
+15
+15
+15
+15
+15
+15
+15
+15
+15
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+1
+17
+17
+17
+17
+17
+17
+17
+17
+17
+17
+17
+17
+17
+17
+17
+17
+17
+17
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+18
+19
+19
+19
+19
+19
+19
+19
+19
+19
+19
+19
+19
+19
+19
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+21
+21
+21
+21
+21
+21
+21
+21
+21
+22
+22
+22
+22
+22
+22
+22
+23
+23
+23
+23
+23
+23
+23
+23
+23
+23
+23
+23
+24
+24
+24
+24
+24
+24
+24
+25
+25
+25
+25
+25
+25
+2
+2
+2
+2
+2
+2
+2
+2
+2
+2
+2
+27
+27
+27
+27
+27
+27
+27
+27
+27
+27
+28
+28
+28
+28
+29
+30
+30
+30
+30
+31
+31
+31
+31
+31
+31
+31
+31
+32
+32
+32
+32
+32
+32
+32
+32
+32
+33
+33
+33
+33
+33
+33
+33
+33
+33
+33
+33
+34
+34
+34
+34
+34
+34
+35
+35
+35
+3
+3
+3
+37
+37
+37
+37
+37
+37
+38
+38
+38
+38
+38
+38
+38
+38
+39
+39
+39
+39
+39
+40
+40
diff --git a/examples/test.ids b/examples/test.ids
deleted file mode 100644
index 11e1d26..0000000
--- a/examples/test.ids
+++ /dev/null
@@ -1,307 +0,0 @@
-hCoV-19/Wuhan/WIV04/2019|EPI_ISL_402124|2019-12-30|China
-hCoV-19/Japan/PG-115886/2021|EPI_ISL_4648951|2021-08-30|Asia
-hCoV-19/Netherlands/FL-RIVM-57082/2021|EPI_ISL_4399740|2021-08-30|Europe
-hCoV-19/Italy/VEN-UniVR-197/2021|EPI_ISL_4816926|2021-08-30|Europe
-hCoV-19/Netherlands/ZH-RIVM-57522/2021|EPI_ISL_4401345|2021-08-30|Europe
-hCoV-19/Switzerland/BE-SRO-500002_7751/2021|EPI_ISL_4412975|2021-08-30|Europe
-hCoV-19/England/PLYM-1D23A18/2021|EPI_ISL_4016887|2021-08-30|Europe
-hCoV-19/England/PLYM-1D103C8/2021|EPI_ISL_4014320|2021-08-30|Europe
-hCoV-19/Switzerland/BE-SRO-500002_7960/2021|EPI_ISL_4412990|2021-08-30|Europe
-hCoV-19/England/MILK-1D12FC2/2021|EPI_ISL_3991957|2021-08-30|Europe
-hCoV-19/USA/LA-EVTL5004/2021|EPI_ISL_4254086|2021-08-30|NorthAmerica
-hCoV-19/Canada/BC-BCCDC-187939/2021|EPI_ISL_4828331|2021-08-30|NorthAmerica
-hCoV-19/USA/CA-CDC-LC0269480/2021|EPI_ISL_4538420|2021-08-30|NorthAmerica
-hCoV-19/USA/FL-CDC-LC0241103/2021|EPI_ISL_4333000|2021-08-30|NorthAmerica
-hCoV-19/USA/FL-CDC-LC0242673/2021|EPI_ISL_4334182|2021-08-30|NorthAmerica
-hCoV-19/USA/KY-CDC-LC0253965/2021|EPI_ISL_4477466|2021-08-30|NorthAmerica
-hCoV-19/USA/SD-CDC-4281291-001/2021|EPI_ISL_4702512|2021-08-30|NorthAmerica
-hCoV-19/USA/AZ-CDC-LC0275898/2021|EPI_ISL_4809091|2021-08-30|NorthAmerica
-hCoV-19/USA/SC-CDC-LC0243499/2021|EPI_ISL_4334270|2021-08-30|NorthAmerica
-hCoV-19/England/ALDP-1D3606B/2021|EPI_ISL_4011577|2021-08-31|Europe
-hCoV-19/England/MILK-1D290C5/2021|EPI_ISL_4017674|2021-08-31|Europe
-hCoV-19/England/PLYM-1D39B58/2021|EPI_ISL_4013753|2021-08-31|Europe
-hCoV-19/Scotland/QEUH-1D3AF88/2021|EPI_ISL_4069091|2021-08-31|Europe
-hCoV-19/England/ALDP-1D2A1B2/2021|EPI_ISL_4017209|2021-08-31|Europe
-hCoV-19/Netherlands/GL-RIVM-57828/2021|EPI_ISL_4402036|2021-08-31|Europe
-hCoV-19/USA/AR-CDC-QDX28318731/2021|EPI_ISL_4248902|2021-08-31|NorthAmerica
-hCoV-19/USA/KY-CDC-LC0269161/2021|EPI_ISL_4538554|2021-08-31|NorthAmerica
-hCoV-19/USA/VA-CDC-LC0243216/2021|EPI_ISL_4334508|2021-08-31|NorthAmerica
-hCoV-19/USA/FL-CDC-ASC210097695/2021|EPI_ISL_4377982|2021-08-31|NorthAmerica
-hCoV-19/USA/AZ-CDC-ASC210126005/2021|EPI_ISL_4382075|2021-08-31|NorthAmerica
-hCoV-19/USA/TN-CDC-ASC210124951/2021|EPI_ISL_4391889|2021-08-31|NorthAmerica
-hCoV-19/USA/TX-CDC-ASC210125201/2021|EPI_ISL_4386148|2021-08-31|NorthAmerica
-hCoV-19/USA/TN-CDC-ASC210180157/2021|EPI_ISL_4540243|2021-08-31|NorthAmerica
-hCoV-19/Germany/RP-RKI-I-224236/2021|EPI_ISL_4043601|2021-09-01|Europe
-hCoV-19/England/ALDP-1D525D3/2021|EPI_ISL_4086360|2021-09-01|Europe
-hCoV-19/Wales/PHWC-PDIN63/2021|EPI_ISL_4532679|2021-09-01|Europe
-hCoV-19/Germany/BW-RKI-I-224644/2021|EPI_ISL_4043999|2021-09-01|Europe
-hCoV-19/Germany/HH-RKI-I-224748/2021|EPI_ISL_4044101|2021-09-01|Europe
-hCoV-19/USA/IN-CDC-QDX28468679/2021|EPI_ISL_4466715|2021-09-01|NorthAmerica
-hCoV-19/USA/MA-CDCBI-CRSP_A6QBCKAI3EQMYPFX/2021|EPI_ISL_4094015|2021-09-01|NorthAmerica
-hCoV-19/USA/PA-CDC-LC0269259/2021|EPI_ISL_4538743|2021-09-01|NorthAmerica
-hCoV-19/USA/GA-CDC-LC0255759/2021|EPI_ISL_4479367|2021-09-01|NorthAmerica
-hCoV-19/USA/AZ-CDC-LC0284231/2021|EPI_ISL_4809753|2021-09-01|NorthAmerica
-hCoV-19/USA/TX-CDC-ASC210181269/2021|EPI_ISL_4554814|2021-09-01|NorthAmerica
-hCoV-19/USA/WY-WYPHL-21070026/2021|EPI_ISL_4198525|2021-09-01|NorthAmerica
-hCoV-19/USA/GA-CDC-LC0262766/2021|EPI_ISL_4478581|2021-09-01|NorthAmerica
-hCoV-19/Mexico/NLE_InDRE_FB38718_S7105/2021|EPI_ISL_4603065|2021-09-01|NorthAmerica
-hCoV-19/USA/NY-MEDDAC_FD_081/2021|EPI_ISL_4926483|2021-09-01|NorthAmerica
-hCoV-19/England/QEUH-1D62D14/2021|EPI_ISL_4045707|2021-09-02|Europe
-hCoV-19/Denmark/DCGC-168848/2021|EPI_ISL_4008418|2021-09-02|Europe
-hCoV-19/England/MILK-1D544F2/2021|EPI_ISL_4046649|2021-09-02|Europe
-hCoV-19/Denmark/DCGC-168792/2021|EPI_ISL_4008277|2021-09-02|Europe
-hCoV-19/Germany/BY-RKI-I-228790/2021|EPI_ISL_4223811|2021-09-02|Europe
-hCoV-19/Germany/BY-RKI-I-229100/2021|EPI_ISL_4224112|2021-09-02|Europe
-hCoV-19/England/BRBR-1D666E8/2021|EPI_ISL_4088634|2021-09-02|Europe
-hCoV-19/England/LSPA-1D8FE2D/2021|EPI_ISL_4087697|2021-09-02|Europe
-hCoV-19/Norway/OUS-13657/2021|EPI_ISL_4472222|2021-09-02|Europe
-hCoV-19/Scotland/QEUH-1D58E87/2021|EPI_ISL_4066469|2021-09-02|Europe
-hCoV-19/Wales/PHWC-PDXHOE/2021|EPI_ISL_4319036|2021-09-02|Europe
-hCoV-19/Ireland/D-NVRL-S21IRL00235614/2021|EPI_ISL_4780534|2021-09-02|Europe
-hCoV-19/England/MILK-1DA6224/2021|EPI_ISL_4099552|2021-09-02|Europe
-hCoV-19/Norway/19034/2021|EPI_ISL_4398264|2021-09-02|Europe
-hCoV-19/Germany/BW-RKI-I-224770/2021|EPI_ISL_4044122|2021-09-02|Europe
-hCoV-19/USA/MD-CDC-LC0245488/2021|EPI_ISL_4337071|2021-09-02|NorthAmerica
-hCoV-19/USA/NC-CDC-LC0254969/2021|EPI_ISL_4481830|2021-09-02|NorthAmerica
-hCoV-19/USA/FL-BPHL-7808/2021|EPI_ISL_4549668|2021-09-02|NorthAmerica
-hCoV-19/USA/NY-PRL-2021_0905_00A10/2021|EPI_ISL_4106614|2021-09-02|NorthAmerica
-hCoV-19/USA/MO-CDC-ASC210100019/2021|EPI_ISL_4379581|2021-09-02|NorthAmerica
-hCoV-19/USA/IA-CDC-ASC210101643/2021|EPI_ISL_4390749|2021-09-02|NorthAmerica
-hCoV-19/USA/TN-CDC-LC0256175/2021|EPI_ISL_4482077|2021-09-02|NorthAmerica
-hCoV-19/USA/OK-CDC-ASC210100395/2021|EPI_ISL_4494781|2021-09-02|NorthAmerica
-hCoV-19/Malaysia/C19UMB270/2021|EPI_ISL_4731229|2021-09-03|Asia
-hCoV-19/Norway/OUS-13766/2021|EPI_ISL_4472292|2021-09-03|Europe
-hCoV-19/Spain/CL-COV13896/2021|EPI_ISL_4506409|2021-09-03|Europe
-hCoV-19/Turkey/HSGM-E2884/2021|EPI_ISL_4265284|2021-09-03|Europe
-hCoV-19/Wales/PHWC-PDQ6KI/2021|EPI_ISL_4314011|2021-09-03|Europe
-hCoV-19/England/NEWC-1D941B3/2021|EPI_ISL_4101116|2021-09-03|Europe
-hCoV-19/England/PLYM-1D6B355/2021|EPI_ISL_4068598|2021-09-03|Europe
-hCoV-19/Turkey/HSGM-E2610/2021|EPI_ISL_4090510|2021-09-03|Europe
-hCoV-19/Scotland/QEUH-1D78531/2021|EPI_ISL_4146838|2021-09-03|Europe
-hCoV-19/Germany/NW-RKI-I-229526/2021|EPI_ISL_4224515|2021-09-03|Europe
-hCoV-19/England/HSLL-1D7F5FE/2021|EPI_ISL_4086673|2021-09-03|Europe
-hCoV-19/USA/FL-CDC-LC0254257/2021|EPI_ISL_4482546|2021-09-03|NorthAmerica
-hCoV-19/USA/VT-CDCBI-CRSP_A7PUB2RDXFJJJZWT/2021|EPI_ISL_4096215|2021-09-03|NorthAmerica
-hCoV-19/USA/MA-CDCBI-CRSP_3WDFXJLTJPJDWBFH/2021|EPI_ISL_4093808|2021-09-03|NorthAmerica
-hCoV-19/Canada/AB-ABPHL-32176/2021|EPI_ISL_4560722|2021-09-03|NorthAmerica
-hCoV-19/USA/MN-CDC-ASC210104212/2021|EPI_ISL_4376358|2021-09-03|NorthAmerica
-hCoV-19/USA/MA-CDCBI-CRSP_JZWDSIV4GZOEDBU6/2021|EPI_ISL_4094926|2021-09-03|NorthAmerica
-hCoV-19/USA/IN-CDC-LC0279400/2021|EPI_ISL_4811081|2021-09-03|NorthAmerica
-hCoV-19/England/ALDP-1D9B84E/2021|EPI_ISL_4098584|2021-09-04|Europe
-hCoV-19/Germany/NW-RKI-I-228723/2021|EPI_ISL_4223749|2021-09-04|Europe
-hCoV-19/USA/CO-CDPHE-2101765862/2021|EPI_ISL_4927401|2021-09-04|NorthAmerica
-hCoV-19/USA/CA-CDC-QDX28426842/2021|EPI_ISL_4466281|2021-09-04|NorthAmerica
-hCoV-19/Brazil/SP-SEQ01942/2021|EPI_ISL_4273414|2021-09-04|SouthAmerica
-hCoV-19/England/MILK-1DA48AC/2021|EPI_ISL_4099203|2021-09-05|Europe
-hCoV-19/USA/WI-CDC-ASC210128863/2021|EPI_ISL_4909537|2021-09-05|NorthAmerica
-hCoV-19/USA/NY-CDC-LC0256499/2021|EPI_ISL_4483785|2021-09-05|NorthAmerica
-hCoV-19/Canada/AB-ABPHL-31984/2021|EPI_ISL_4560513|2021-09-05|NorthAmerica
-hCoV-19/USA/TN-CDC-ASC210130035/2021|EPI_ISL_4915264|2021-09-05|NorthAmerica
-hCoV-19/USA/MI-CDC-ASC210130738/2021|EPI_ISL_4535394|2021-09-05|NorthAmerica
-hCoV-19/USA/TN-CDC-ASC210125359/2021|EPI_ISL_4391155|2021-09-05|NorthAmerica
-hCoV-19/USA/TX-CDC-QDX28468164/2021|EPI_ISL_4466900|2021-09-05|NorthAmerica
-hCoV-19/USA/MA-CDCBI-CRSP_K54SB5UPYVPVAAGK/2021|EPI_ISL_4286072|2021-09-05|NorthAmerica
-hCoV-19/USA/MA-CDCBI-CRSP_MM6Y64OTDQN3HBHD/2021|EPI_ISL_4286229|2021-09-05|NorthAmerica
-hCoV-19/USA/MA-CDCBI-CRSP_J2GBQONSSICIOWCR/2021|EPI_ISL_4285982|2021-09-05|NorthAmerica
-hCoV-19/Germany/BW-RKI-I-238567/2021|EPI_ISL_4231959|2021-09-06|Europe
-hCoV-19/Germany/BE-RKI-I-239922/2021|EPI_ISL_4437777|2021-09-06|Europe
-hCoV-19/England/NEWC-1DB137E/2021|EPI_ISL_4144932|2021-09-06|Europe
-hCoV-19/England/MILK-1DBCDEE/2021|EPI_ISL_4144553|2021-09-06|Europe
-hCoV-19/Germany/NI-RKI-I-230885/2021|EPI_ISL_4225770|2021-09-06|Europe
-hCoV-19/Norway/OUS-13829/2021|EPI_ISL_4472313|2021-09-06|Europe
-hCoV-19/England/ALDP-1DC5553/2021|EPI_ISL_4190442|2021-09-06|Europe
-hCoV-19/England/MILK-1DCC282/2021|EPI_ISL_4192354|2021-09-06|Europe
-hCoV-19/England/ALDP-1DC1821/2021|EPI_ISL_4144486|2021-09-06|Europe
-hCoV-19/England/NEWC-1DB75BE/2021|EPI_ISL_4144617|2021-09-06|Europe
-hCoV-19/England/ALDP-1DD8520/2021|EPI_ISL_4189280|2021-09-06|Europe
-hCoV-19/Germany/NI-RKI-I-244007/2021|EPI_ISL_4440881|2021-09-06|Europe
-hCoV-19/USA/WA-UW-21090625745/2021|EPI_ISL_4569037|2021-09-06|NorthAmerica
-hCoV-19/USA/DC-DFS-PHL-01611/2021|EPI_ISL_4643831|2021-09-06|NorthAmerica
-hCoV-19/Canada/BC-BCCDC-190975/2021|EPI_ISL_4838942|2021-09-06|NorthAmerica
-hCoV-19/USA/FL-CDC-QDX28549868/2021|EPI_ISL_4458579|2021-09-06|NorthAmerica
-hCoV-19/Germany/SN-RKI-I-243960/2021|EPI_ISL_4440836|2021-09-07|Europe
-hCoV-19/France/PDL-IPP26641/2021|EPI_ISL_4461806|2021-09-07|Europe
-hCoV-19/Sweden/10116774/2021|EPI_ISL_4335926|2021-09-07|Europe
-hCoV-19/England/MILK-1DCFFF1/2021|EPI_ISL_4191345|2021-09-07|Europe
-hCoV-19/France/ARA-HCL021162207201/2021|EPI_ISL_4605633|2021-09-07|Europe
-hCoV-19/Wales/PHWC-PDZONY/2021|EPI_ISL_4803154|2021-09-07|Europe
-hCoV-19/England/ALDP-1E2C173/2021|EPI_ISL_4287760|2021-09-07|Europe
-hCoV-19/USA/TN-CDC-ASC210132084/2021|EPI_ISL_4911678|2021-09-07|NorthAmerica
-hCoV-19/USA/LA-CDC-LC0264854/2021|EPI_ISL_4485374|2021-09-07|NorthAmerica
-hCoV-19/USA/FL-CDC-ASC210136678/2021|EPI_ISL_4916381|2021-09-07|NorthAmerica
-hCoV-19/USA/MA-CDCBI-CRSP_2GYCCBDY62TCF2ZD/2021|EPI_ISL_4285078|2021-09-07|NorthAmerica
-hCoV-19/Canada/AB-ABPHL-33297/2021|EPI_ISL_4561949|2021-09-07|NorthAmerica
-hCoV-19/USA/UT-UPHL-210914424377/2021|EPI_ISL_4204771|2021-09-07|NorthAmerica
-hCoV-19/USA/KS-CDC-ASC210132997/2021|EPI_ISL_4540451|2021-09-07|NorthAmerica
-hCoV-19/USA/FL-CDC-ASC210134895/2021|EPI_ISL_4495959|2021-09-07|NorthAmerica
-hCoV-19/USA/TX-CDC-ASC210131155/2021|EPI_ISL_4387976|2021-09-07|NorthAmerica
-hCoV-19/USA/OH-CDC-ASC210135668/2021|EPI_ISL_4912890|2021-09-07|NorthAmerica
-hCoV-19/USA/VA-CDC-LC0266781/2021|EPI_ISL_4537060|2021-09-07|NorthAmerica
-hCoV-19/Germany/BY-RKI-I-271873/2021|EPI_ISL_4937672|2021-09-08|Europe
-hCoV-19/Germany/NW-RKI-I-235748/2021|EPI_ISL_4229283|2021-09-08|Europe
-hCoV-19/England/NORT-YYRJUE/2021|EPI_ISL_4528794|2021-09-08|Europe
-hCoV-19/England/MILK-1DE9164/2021|EPI_ISL_4213894|2021-09-08|Europe
-hCoV-19/Germany/NW-RKI-I-237292/2021|EPI_ISL_4230759|2021-09-08|Europe
-hCoV-19/Denmark/DCGC-173556/2021|EPI_ISL_4447912|2021-09-08|Europe
-hCoV-19/USA/TN-CDC-ASC210135951/2021|EPI_ISL_4911351|2021-09-08|NorthAmerica
-hCoV-19/Canada/BC-BCCDC-197401/2021|EPI_ISL_4846515|2021-09-08|NorthAmerica
-hCoV-19/USA/AL-CDC-LC0272071/2021|EPI_ISL_4813581|2021-09-08|NorthAmerica
-hCoV-19/USA/WA-CDC-LC0273756/2021|EPI_ISL_4813559|2021-09-08|NorthAmerica
-hCoV-19/USA/GA-CDC-LC0274531/2021|EPI_ISL_4813800|2021-09-08|NorthAmerica
-hCoV-19/USA/FL-CDC-LC0264483/2021|EPI_ISL_4486965|2021-09-08|NorthAmerica
-hCoV-19/Cambodia/772656/2021|EPI_ISL_4259943|2021-09-09|Asia
-hCoV-19/Denmark/DCGC-171422/2021|EPI_ISL_4200308|2021-09-09|Europe
-hCoV-19/England/MILK-1DEF7E4/2021|EPI_ISL_4214901|2021-09-09|Europe
-hCoV-19/England/MILK-1DFE64F/2021|EPI_ISL_4249512|2021-09-09|Europe
-hCoV-19/Ireland/D-NVRL-M37IRL75279/2021|EPI_ISL_4782245|2021-09-09|Europe
-hCoV-19/Ireland/G-NVRL-G21IRL83198/2021|EPI_ISL_4505164|2021-09-09|Europe
-hCoV-19/Germany/NW-RKI-I-244008/2021|EPI_ISL_4440882|2021-09-09|Europe
-hCoV-19/England/MILK-1E430B5/2021|EPI_ISL_4527018|2021-09-09|Europe
-hCoV-19/USA/ND-NDDH-4422/2021|EPI_ISL_4822585|2021-09-09|NorthAmerica
-hCoV-19/USA/AL-CDC-LC0272515/2021|EPI_ISL_4814431|2021-09-09|NorthAmerica
-hCoV-19/USA/MS-SRL_330739650/2021|EPI_ISL_4928104|2021-09-09|NorthAmerica
-hCoV-19/USA/AZ-CDC-ASC210080626/2021|EPI_ISL_4916776|2021-09-09|NorthAmerica
-hCoV-19/USA/MO-CDC-QDX28740620/2021|EPI_ISL_4825617|2021-09-09|NorthAmerica
-hCoV-19/USA/ND-NDDH-4428/2021|EPI_ISL_4822601|2021-09-09|NorthAmerica
-hCoV-19/England/ALDP-1E2CC09/2021|EPI_ISL_4290325|2021-09-10|Europe
-hCoV-19/Sweden/20746846P/2021|EPI_ISL_4337630|2021-09-10|Europe
-hCoV-19/Turkey/HSGM-E6257/2021|EPI_ISL_4892515|2021-09-10|Europe
-hCoV-19/Germany/BY-RKI-I-246485/2021|EPI_ISL_4442913|2021-09-10|Europe
-hCoV-19/England/ALDP-1E2D8F5/2021|EPI_ISL_4287661|2021-09-10|Europe
-hCoV-19/England/ALDP-1E4D15E/2021|EPI_ISL_4323949|2021-09-10|Europe
-hCoV-19/England/ALDP-1E2757C/2021|EPI_ISL_4263331|2021-09-10|Europe
-hCoV-19/Scotland/QEUH-1E15CF4/2021|EPI_ISL_4265778|2021-09-10|Europe
-hCoV-19/Turkey/HSGM-E6456/2021|EPI_ISL_4892307|2021-09-10|Europe
-hCoV-19/Switzerland/GE-HUG-35375640/2021|EPI_ISL_4508114|2021-09-10|Europe
-hCoV-19/Norway/21534/2021|EPI_ISL_4876173|2021-09-11|Europe
-hCoV-19/England/MILK-1E13B71/2021|EPI_ISL_4355173|2021-09-11|Europe
-hCoV-19/Switzerland/SO-ETHZ-34074060/2021|EPI_ISL_4907650|2021-09-11|Europe
-hCoV-19/England/ALDP-1E4E4FA/2021|EPI_ISL_4323820|2021-09-11|Europe
-hCoV-19/Ireland/DL-NVRL-M37IRL88258/2021|EPI_ISL_4548164|2021-09-11|Europe
-hCoV-19/England/ALDP-1E3EA64/2021|EPI_ISL_4325802|2021-09-11|Europe
-hCoV-19/England/NEWC-1E251E3/2021|EPI_ISL_4291038|2021-09-11|Europe
-hCoV-19/USA/NJ-CDC-QDX28696787/2021|EPI_ISL_4566463|2021-09-11|NorthAmerica
-hCoV-19/USA/CT-CDC-LC0272714/2021|EPI_ISL_4815684|2021-09-11|NorthAmerica
-hCoV-19/Switzerland/LU-UHB-43062408/2021|EPI_ISL_4571417|2021-09-12|Europe
-hCoV-19/Wales/PHWC-PD3O6D/2021|EPI_ISL_4788500|2021-09-12|Europe
-hCoV-19/Switzerland/VD-CHUV-GEN7091/2021|EPI_ISL_4632132|2021-09-12|Europe
-hCoV-19/Wales/PHWC-PD4KYR/2021|EPI_ISL_4791947|2021-09-12|Europe
-hCoV-19/England/HSLL-1E5C453/2021|EPI_ISL_4323705|2021-09-12|Europe
-hCoV-19/Netherlands/FL-RIVM-60727/2021|EPI_ISL_4840906|2021-09-12|Europe
-hCoV-19/Ireland/G-NVRL-M37IRL91413/2021|EPI_ISL_4783211|2021-09-12|Europe
-hCoV-19/Belgium/ULG-20357/2021|EPI_ISL_4740572|2021-09-13|Europe
-hCoV-19/Germany/BY-RKI-I-249233/2021|EPI_ISL_4445966|2021-09-13|Europe
-hCoV-19/Germany/SH-RKI-I-261716/2021|EPI_ISL_4618979|2021-09-13|Europe
-hCoV-19/Wales/PHWC-PD3GOJ/2021|EPI_ISL_4787533|2021-09-13|Europe
-hCoV-19/Sweden/20758898P/2021|EPI_ISL_4864998|2021-09-13|Europe
-hCoV-19/USA/IL-CDC-LC0281666/2021|EPI_ISL_4816105|2021-09-13|NorthAmerica
-hCoV-19/USA/UT-UPHL-210928918510/9/13/21|EPI_ISL_4891125|2021-09-13|NorthAmerica
-hCoV-19/USA/MA-CDCBI-CRSP_RYM2CO6DYJ7TYPFF/2021|EPI_ISL_4488486|2021-09-13|NorthAmerica
-hCoV-19/USA/CT-JAX-11556846/2021|EPI_ISL_4417548|2021-09-13|NorthAmerica
-hCoV-19/USA/GA-CDC-LC0272118/2021|EPI_ISL_4816588|2021-09-13|NorthAmerica
-hCoV-19/USA/MA-CDCBI-CRSP_FPQAM7MWH2DBP4FU/2021|EPI_ISL_4487377|2021-09-13|NorthAmerica
-hCoV-19/USA/PA-Jefferson_20210914_20_35/2021|EPI_ISL_4730946|2021-09-13|NorthAmerica
-hCoV-19/England/MILK-1E6D45F/2021|EPI_ISL_4322338|2021-09-14|Europe
-hCoV-19/Scotland/QEUH-1E64C6F/2021|EPI_ISL_4408239|2021-09-14|Europe
-hCoV-19/England/NEWC-1E6C56C/2021|EPI_ISL_4352715|2021-09-14|Europe
-hCoV-19/England/PLYM-1E74394/2021|EPI_ISL_4353084|2021-09-14|Europe
-hCoV-19/Ireland/DL-NVRL-M38IRL16595/2021|EPI_ISL_4781999|2021-09-14|Europe
-hCoV-19/USA/AZ-ASU15127/2021|EPI_ISL_4469363|2021-09-14|NorthAmerica
-hCoV-19/USA/DC-CDC-LC0278290/2021|EPI_ISL_4818686|2021-09-14|NorthAmerica
-hCoV-19/Germany/BY-RKI-I-251474/2021|EPI_ISL_4608820|2021-09-15|Europe
-hCoV-19/England/ALDP-1E84EBE/2021|EPI_ISL_4349363|2021-09-15|Europe
-hCoV-19/Wales/PHWC-PD45C5/2021|EPI_ISL_4790195|2021-09-15|Europe
-hCoV-19/England/QEUH-1E96314/2021|EPI_ISL_4349778|2021-09-15|Europe
-hCoV-19/Scotland/QEUH-1E7FEB6/2021|EPI_ISL_4406315|2021-09-15|Europe
-hCoV-19/Italy/SIC-CQRC-2450878-2043/2021|EPI_ISL_4628130|2021-09-15|Europe
-hCoV-19/Sweden/20771824P/2021|EPI_ISL_4866635|2021-09-16|Europe
-hCoV-19/Netherlands/NB-PAMM-I16-0498/2021|EPI_ISL_4558553|2021-09-16|Europe
-hCoV-19/Scotland/QEUH-1E9FB13/2021|EPI_ISL_4404849|2021-09-16|Europe
-hCoV-19/Germany/SH-RKI-I-260460/2021|EPI_ISL_4616734|2021-09-16|Europe
-hCoV-19/England/ALDP-1EAE829/2021|EPI_ISL_4477472|2021-09-16|Europe
-hCoV-19/England/ALDP-1EC042D/2021|EPI_ISL_4478909|2021-09-16|Europe
-hCoV-19/England/QEUH-1EC7A06/2021|EPI_ISL_4501459|2021-09-16|Europe
-hCoV-19/England/MILK-1E95078/2021|EPI_ISL_4349909|2021-09-16|Europe
-hCoV-19/USA/MA-CDCBI-CRSP_36QMM736QPOP42O5/2021|EPI_ISL_4516379|2021-09-16|NorthAmerica
-hCoV-19/USA/CT-Yale-10539/2021|EPI_ISL_4950070|2021-09-16|NorthAmerica
-hCoV-19/USA/MA-CDCBI-CRSP_3IYREWWSILDT26TX/2021|EPI_ISL_4516397|2021-09-16|NorthAmerica
-hCoV-19/Germany/NW-RKI-I-256355/2021|EPI_ISL_4613107|2021-09-17|Europe
-hCoV-19/England/BRBR-1EBBE72/2021|EPI_ISL_4477457|2021-09-17|Europe
-hCoV-19/England/MILK-1EB7CA9/2021|EPI_ISL_4451171|2021-09-17|Europe
-hCoV-19/England/MILK-1EAB4CE/2021|EPI_ISL_4452505|2021-09-17|Europe
-hCoV-19/Norway/20863/2021|EPI_ISL_4740044|2021-09-17|Europe
-hCoV-19/England/ALDP-1EF06F1/2021|EPI_ISL_4521498|2021-09-17|Europe
-hCoV-19/England/MILK-1EA923F/2021|EPI_ISL_4452552|2021-09-17|Europe
-hCoV-19/USA/WY-WYPHL-21081574/2021|EPI_ISL_4956161|2021-09-17|NorthAmerica
-hCoV-19/USA/CA-ASU15542/2021|EPI_ISL_4513288|2021-09-17|NorthAmerica
-hCoV-19/USA/ND-CDC-IBX173181893552/2021|EPI_ISL_4808599|2021-09-17|NorthAmerica
-hCoV-19/England/ALDP-1EEDDB6/2021|EPI_ISL_4523553|2021-09-18|Europe
-hCoV-19/England/QEUH-1ED3A34/2021|EPI_ISL_4502984|2021-09-18|Europe
-hCoV-19/England/BRBR-1EBE3AD/2021|EPI_ISL_4478975|2021-09-18|Europe
-hCoV-19/England/BRBR-1EC84BC/2021|EPI_ISL_4502268|2021-09-18|Europe
-hCoV-19/England/BRBR-1EFA888/2021|EPI_ISL_4527571|2021-09-19|Europe
-hCoV-19/Portugal/PT17699/2021|EPI_ISL_4796498|2021-09-20|Europe
-hCoV-19/Belgium/UZA-UA-CV2214234457/2021|EPI_ISL_4576797|2021-09-20|Europe
-hCoV-19/USA/MA-CDCBI-CRSP_VIIDWSH7X7WA77KA/2021|EPI_ISL_4628608|2021-09-20|NorthAmerica
-hCoV-19/USA/MA-CDCBI-CRSP_KYQO5LPDGIM2T2QO/2021|EPI_ISL_4628386|2021-09-20|NorthAmerica
-hCoV-19/Germany/NW-RKI-I-259784/2021|EPI_ISL_4615820|2021-09-21|Europe
-hCoV-19/Portugal/PT17720/2021|EPI_ISL_4796567|2021-09-21|Europe
-hCoV-19/England/NEWC-1F04F85/2021|EPI_ISL_4588812|2021-09-21|Europe
-hCoV-19/England/ALDP-1F24AE8/2021|EPI_ISL_4590914|2021-09-21|Europe
-hCoV-19/England/MILK-1F294F4/2021|EPI_ISL_4594463|2021-09-21|Europe
-hCoV-19/Scotland/NEWC-1F0CE35/2021|EPI_ISL_4736469|2021-09-21|Europe
-hCoV-19/Sweden/20794827P/2021|EPI_ISL_4856528|2021-09-21|Europe
-hCoV-19/USA/WY-WYPHL-21083651/2021|EPI_ISL_4920028|2021-09-21|NorthAmerica
-hCoV-19/England/BRBR-1F20F0B/2021|EPI_ISL_4590041|2021-09-22|Europe
-hCoV-19/England/ALDP-1F27BF1/2021|EPI_ISL_4594271|2021-09-22|Europe
-hCoV-19/England/QEUH-1F2E2B9/2021|EPI_ISL_4579669|2021-09-22|Europe
-hCoV-19/Denmark/DCGC-176646/2021|EPI_ISL_4643294|2021-09-22|Europe
-hCoV-19/England/PLYM-1F2E92D/2021|EPI_ISL_4752231|2021-09-22|Europe
-hCoV-19/Germany/BY-RKI-I-263980/2021|EPI_ISL_4928780|2021-09-22|Europe
-hCoV-19/Wales/PHWC-PDHG9F/2021|EPI_ISL_4799709|2021-09-22|Europe
-hCoV-19/England/MILK-1F4063D/2021|EPI_ISL_4585555|2021-09-22|Europe
-hCoV-19/USA/MD-MDH-4982/2021|EPI_ISL_4929668|2021-09-22|NorthAmerica
-hCoV-19/England/ALDP-1F51156/2021|EPI_ISL_4680040|2021-09-23|Europe
-hCoV-19/England/ALDP-1F61117/2021|EPI_ISL_4669731|2021-09-23|Europe
-hCoV-19/England/NEWC-1F5C4BC/2021|EPI_ISL_4674244|2021-09-23|Europe
-hCoV-19/Scotland/QEUH-1F5E71B/2021|EPI_ISL_4671168|2021-09-23|Europe
-hCoV-19/England/ALDP-1F60FA5/2021|EPI_ISL_4669537|2021-09-23|Europe
-hCoV-19/England/ALDP-1F5BF70/2021|EPI_ISL_4672563|2021-09-23|Europe
-hCoV-19/England/ALDP-1F516B1/2021|EPI_ISL_4680042|2021-09-23|Europe
-hCoV-19/USA/MA-NEIDL-01421/2021|EPI_ISL_4882391|2021-09-23|NorthAmerica
-hCoV-19/USA/NY-PRL-2021_0924_00B24/2021|EPI_ISL_4760629|2021-09-23|NorthAmerica
-hCoV-19/USA/MN-CDC-IBX603674338139/2021|EPI_ISL_4823314|2021-09-23|NorthAmerica
-hCoV-19/USA/MA-CDCBI-CRSP_5LNICT3DP57TEPMW/2021|EPI_ISL_4728991|2021-09-23|NorthAmerica
-hCoV-19/Germany/TH-RKI-I-267789/2021|EPI_ISL_4933973|2021-09-24|Europe
-hCoV-19/England/ALDP-1F631E8/2021|EPI_ISL_4735401|2021-09-24|Europe
-hCoV-19/England/MILK-1F576BB/2021|EPI_ISL_4672420|2021-09-24|Europe
-hCoV-19/England/MILK-1F70D7B/2021|EPI_ISL_4735190|2021-09-24|Europe
-hCoV-19/England/BRBR-1F5AADA/2021|EPI_ISL_4619702|2021-09-24|Europe
-hCoV-19/Germany/BW-RKI-I-265541/2021|EPI_ISL_4931206|2021-09-24|Europe
-hCoV-19/England/ALDP-1F87281/2021|EPI_ISL_4751133|2021-09-25|Europe
-hCoV-19/Germany/BW-RKI-I-265494/2021|EPI_ISL_4931157|2021-09-25|Europe
-hCoV-19/USA/VT-CDCBI-CRSP_COC5K6W5KBYXIOI4/2021|EPI_ISL_4759074|2021-09-25|NorthAmerica
-hCoV-19/England/PLYM-1F8855A/2021|EPI_ISL_4754746|2021-09-26|Europe
-hCoV-19/England/ALDP-1FA4AC2/2021|EPI_ISL_4750891|2021-09-26|Europe
-hCoV-19/England/PLYM-1F8AE11/2021|EPI_ISL_4753420|2021-09-26|Europe
-hCoV-19/Singapore/6194/2021|EPI_ISL_4762355|2021-09-27|Asia
-hCoV-19/England/MILK-1F9598B/2021|EPI_ISL_4755722|2021-09-27|Europe
-hCoV-19/England/MILK-1FA3735/2021|EPI_ISL_4873868|2021-09-27|Europe
-hCoV-19/England/ALDP-1FA825D/2021|EPI_ISL_4764025|2021-09-27|Europe
-hCoV-19/England/HSLL-1FB5EFF/2021|EPI_ISL_4871932|2021-09-27|Europe
-hCoV-19/England/MILK-1FB1136/2021|EPI_ISL_4764942|2021-09-27|Europe
-hCoV-19/Belgium/UZA-UA-CV1012754061/2021|EPI_ISL_4820504|2021-09-28|Europe
-hCoV-19/England/ALDP-1FD6696/2021|EPI_ISL_4899763|2021-09-28|Europe
-hCoV-19/England/NEWC-1FC66E4/2021|EPI_ISL_4867007|2021-09-28|Europe
-hCoV-19/England/MILK-1FBCFD7/2021|EPI_ISL_4864510|2021-09-28|Europe
-hCoV-19/England/PLYM-1FCE50D/2021|EPI_ISL_4851788|2021-09-28|Europe
-hCoV-19/England/MILK-1FACD2B/2021|EPI_ISL_4765965|2021-09-28|Europe
-hCoV-19/England/MILK-1FB2302/2021|EPI_ISL_4870857|2021-09-28|Europe
-hCoV-19/Scotland/QEUH-1FC7DC0/2021|EPI_ISL_4900895|2021-09-28|Europe
-hCoV-19/England/PLYM-1FE8057/2021|EPI_ISL_4893981|2021-09-29|Europe
-hCoV-19/Germany/NW-RKI-I-271223/2021|EPI_ISL_4937039|2021-09-29|Europe
-hCoV-19/England/NEWC-1FC15A0/2021|EPI_ISL_4855577|2021-09-29|Europe
-hCoV-19/England/NEWC-1FC0AEE/2021|EPI_ISL_4863564|2021-09-29|Europe
-hCoV-19/USA/CA-SLOPH-C211001-30/2021|EPI_ISL_4910410|2021-09-29|NorthAmerica
-hCoV-19/Germany/NW-RKI-I-272254/2021|EPI_ISL_4938046|2021-09-30|Europe
-hCoV-19/Denmark/DCGC-179236/2021|EPI_ISL_4942912|2021-09-30|Europe
diff --git a/examples/test2.dist b/examples/test2.dist
deleted file mode 100644
index 387e751..0000000
--- a/examples/test2.dist
+++ /dev/null
@@ -1,10 +0,0 @@
-4
-7,5
-6,4,5
-5,3,4,3
-7,5,6,5,4
-5,3,6,5,4,6
-5,3,2,3,2,4,4
-5,3,4,3,2,4,4,2
-5,3,4,3,2,4,4,2,2
-4,2,5,4,3,5,3,3,3,3
diff --git a/examples/test2.fltr b/examples/test2.fltr
deleted file mode 100644
index f46345b..0000000
--- a/examples/test2.fltr
+++ /dev/null
@@ -1,11 +0,0 @@
-0
-100
-200
-200
-200
-300
-300
-400
-500
-600
-600
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..b751982
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,3 @@
+module murit
+
+go 1.18
diff --git a/murit.go b/main.go
similarity index 62%
rename from murit.go
rename to main.go
index 0bb1e69..cca47fc 100644
--- a/murit.go
+++ b/main.go
@@ -16,6 +16,9 @@ import (
   "time"
 )
 
+
+// define two kinds of structs for handling input of parallelized workers
+
 type workload struct {
   i    int
   text string
@@ -27,7 +30,7 @@ type args struct{
 }
 
 
-// lexicographical comparisons of lists (of integers)
+// implementation of standard partial order on R^n
 func leq(poset_element1 []float64, poset_element2 []float64) bool {
 	var L int
 	if len(poset_element1) <= len(poset_element2) {
@@ -35,14 +38,15 @@ func leq(poset_element1 []float64, poset_element2 []float64) bool {
 	} else {
 		L = len(poset_element2)
 	}
-	for a:= 0; a<L; a++ {
-		if (poset_element1[a] > poset_element2[a]) {
+	for i:= 0; i<L; i++ {
+		if (poset_element1[i] > poset_element2[i]) {
 			return false
 		}
 	}
 	return true
 }
 
+// implementation of equality check on R^n
 func equal(poset_element1 []float64, poset_element2 []float64) bool {
 	var L int
 	if len(poset_element1) <= len(poset_element2) {
@@ -50,8 +54,8 @@ func equal(poset_element1 []float64, poset_element2 []float64) bool {
 	} else {
 		L = len(poset_element2)
 	}
-	for a:= 0; a<L; a++ {
-		if (poset_element1[a] != poset_element2[a]) {
+	for i:= 0; i<L; i++ {
+		if (poset_element1[i] != poset_element2[i]) {
 			return false
 		}
 	}
@@ -59,6 +63,8 @@ func equal(poset_element1 []float64, poset_element2 []float64) bool {
 }
 
 
+
+//
 // Reader function
 func reader(in *os.File, out []chan workload) {
   var in_scanner *bufio.Scanner
@@ -116,7 +122,7 @@ func worker(in chan workload, out chan string, b args) {
       fltr_point_j := append([]float64{distance}, b.fltr_list[j]...)
       for k, x := range b.sub_fltr {
         if leq(fltr_point_i, x) && leq(fltr_point_j, x) {
-          modified_distance = k
+          modified_distance = k+1 // adjusting from zero- to one-indexing to get a well-behaved semi distance matrix
           break
         }
       }
@@ -174,31 +180,96 @@ func hash(s string) string {
 
 
 
+
+
+
+
+
+//-------------------------------------------------------------------------
+//----------------         main        ------------------------------------
+//-------------------------------------------------------------------------
 func main() {
 	var dist_file_name string
 	var fltr_file_name string
-	var threads string
 	var sub_fltr_input string
-  var aux_file_name string
+	var threads string
 
-	var ripser bool
 	var verbose bool
 	var help bool
 
-	// Parse command line options
-	flag.StringVar(&dist_file_name, "dist_file", "", "distance file name")
-	flag.StringVar(&fltr_file_name, "fltr_file", "", "filtration file name. Each row gives filtration value of corresponding data point.\n Format i,j,k,... (interpreted with lexicraphical order)")
-	flag.StringVar(&threads, "threads", "", "number of threads")
-	flag.StringVar(&sub_fltr_input, "sub_fltr", "", "sub-filtration along which to compute 1d persistence.\n Format: [VR_0, i_0, j_0, k_0,...]-- ... --(VR_n, i_n, j_n, k_n,...)")
+	var ripser bool
+	var ripser_dim string
+	var ripser_threshold string
+	var ripser_modulus string
+	var ripser_ratio string
+
+	var aux_file_name string
+	var aux_description string
+
+
+	//
+	// Command Line Options
+	//
+
+	flag.StringVar(&dist_file_name, "dist", "", "file name of lower-triangular distance matrix.")
+
+	aux_description=`file name of pointwise filtration annotation.
+
+  file content:
+    on row 'i' a comma-separated list of minimal filtration values for data point 'i'.
+    standard partial order on R^n.
+  example:
+    (0,0,1)	// minimum of point 1
+    (1,1,1)	// minimum of point 2
+    ...
+`
+	flag.StringVar(&fltr_file_name, "pt_fltr", "", aux_description)
+
+	aux_description=`command line input of sub-filtration along which to compute 1d persistence.
+
+  example:
+    (VR_0, i_0, j_0, k_0,...)-- ... --(VR_n, i_n, j_n, k_n,...)
+`
+	flag.StringVar(&sub_fltr_input, "sub_fltr", "", aux_description)
+
+	flag.StringVar(&threads, "threads", "", "number of threads (default: runtime.NumCPU())")
+	flag.BoolVar(&verbose, "verbose", false, "Show status messages (default: false)")
+	flag.BoolVar(&help, "help", false, "Show this help message")
+	flag.BoolVar(&ripser, "ripser", false, "run ripser on auxiliary distance matrix (default: false)\n  Requires local ripser installation in PATH ")
+	flag.StringVar(&ripser_dim, "dim", "1", "compute persistent homology up to dimension k (default: 1).")
+	flag.StringVar(&ripser_threshold, "threshold", "", "compute persistent homology up to threshold t (in auxiliary distance matrix, default: enclosing radius).")
+	flag.StringVar(&ripser_modulus, "modulus", "", "compute homology with coefficients in the prime field Z/pZ (default: 2).")
+	flag.StringVar(&ripser_ratio, "ratio", "", "only show persistence pairs with death/birth ratio > r")
+
+
+	// define custom flag.Usage() to be printed upon -help call.
+	flag.Usage = func() {
+			flagSet := flag.CommandLine
+			aux_description = `Usage:
+murit --dist <filename> --pt_fltr <filename> --sub_fltr (VR_0, i_0, j_0, ...)-- ... --(VR_n, i_n, j_n, ...) [--options]
+`
+			fmt.Printf(aux_description)
+			fmt.Printf("\nCommand Line Arguments\n")
+			arguments := []string{"dist", "pt_fltr", "sub_fltr", "threads", "verbose", "help", "ripser"}
+			for _, name := range arguments {
+					flag := flagSet.Lookup(name)
+					fmt.Printf("-%s\n", flag.Name)
+					fmt.Printf("  %s\n", flag.Usage)
+			}
+			ripser_arguments := []string{"dim", "threshold", "modulus", "ratio"}
+			for _, name := range ripser_arguments {
+					flag := flagSet.Lookup(name)
+					fmt.Printf("	-%s\n", flag.Name)
+					fmt.Printf("	  %s\n", flag.Usage)
+			}
+	}
 
-	flag.BoolVar(&ripser, "ripser", false, "run ripser?")
-	flag.BoolVar(&verbose, "verbose", false, "show status messages?")
-	flag.BoolVar(&help, "help", false, "Get help message")
+	// Parse
 	flag.Parse()
 
 	// print help message
 	if help {
-		flag.PrintDefaults()
+		flag.Usage()
 		return
 	}
 
@@ -211,9 +282,8 @@ func main() {
 	}
 
 
-	if verbose {fmt.Println("---")}
 	// Read filtration file
-	if verbose {fmt.Println("Read point annotation file")}
+	if verbose {fmt.Println("Read pointwise annotation file")}
 	fltr_file, err := os.Open(fltr_file_name)
 	if err != nil {
 		log.Fatalf("Failed to open file '%s': %v", fltr_file_name, err)
@@ -224,6 +294,7 @@ func main() {
 	for fltr_scanner.Scan() {
 		var row []float64
 			for _, v := range strings.Split(fltr_scanner.Text(),",") {
+				v = strings.Trim(v, " ()")
 				s, err := strconv.ParseFloat(v,64)
 				if err != nil {
 					log.Fatalf("Filtration parse error: %v", err)
@@ -237,10 +308,10 @@ func main() {
 
 
   // Read sub filtration from command line OR create default sub filtration
-	if verbose {fmt.Println("Read subfiltration")}
 	var sub_fltr [][]float64
 	if sub_fltr_input != "" {
 		// Parse sub filtration from command line input
+		if verbose {fmt.Println("Read subfiltration")}
 		for _, p := range strings.Split(sub_fltr_input,"--"){
 			var point []float64
 			for _, q := range strings.Split(strings.Trim(p, " []"),","){
@@ -258,10 +329,9 @@ func main() {
 				log.Fatalf("Invalid sub-filtration: sub_fltr[%v] = %v !<= %v = sub_fltr[%v]", i, sub_fltr[i], sub_fltr[j], j)
 			}
 		}
-    // Set filename of auxiliary distance matrix in dependence of sub_fltr
-    aux_file_name = filepath.Dir(dist_file_name)+"/"+hash(sub_fltr_input)+".aux"
 	} else {
 		// Extract a valid sub filtration from the filtration file (traverse through list once and successively add larger elements)
+		if verbose {fmt.Println("Build subfiltration")}
 		sub_fltr = append(sub_fltr, append([]float64{0}, fltr_list[0]...))
 		for _, x := range fltr_list {
 			x = append([]float64{1}, x...)
@@ -269,15 +339,20 @@ func main() {
 				sub_fltr = append(sub_fltr, x)
 			}
 		}
-    aux_file_name = filepath.Dir(dist_file_name)+"/"+strconv.FormatInt(time.Now().UTC().UnixNano(), 10)+".aux"
 	}
 
 
   if verbose {fmt.Println(sub_fltr)}
 
+	//
+  // Prepare Input and Communication Channels
+	//
 
-  //// Prepare input and communication channels
-	if verbose {fmt.Println("Building auxiliary Distance Matrix")}
+	if verbose {fmt.Println("Build auxiliary Distance Matrix")}
+	// For future development:
+	// Set filename of auxiliary distance matrix in dependence of sub_fltr
+	// aux_file_name = filepath.Dir(dist_file_name)+"/"+hash(sub_fltr_input)+".aux"
+	aux_file_name = filepath.Dir(dist_file_name)+"/"+strconv.FormatInt(time.Now().UTC().UnixNano(), 10)+".aux"
 
   // Concatenate background information from above for workers
   b := args{sub_fltr, fltr_list}
@@ -287,7 +362,7 @@ func main() {
   if err != nil {
     log.Fatalf("Failed to open file '%s': %v", dist_file_name, err)
   }
-  defer in_file.Close()   // defer closing of in_file (MB: defers until main is closed, I think)
+  defer in_file.Close()   // defer closing of in_file until main() is closed
 
   // Initialize communication channels
   var numThreads int
@@ -321,7 +396,9 @@ func main() {
   }
 
 
-  //// Parallel execution
+	//
+  // Parallel Execution
+	//
 
 	// Start reader
 	go reader(in_file, toWorker)
@@ -335,17 +412,40 @@ func main() {
 	writer(toWriter, out_writer)
 
 
-	//// Run ripser on auxiliary distance matrix and translate result
+
+	//
+	// Calculate Persistent Homology with Ripser
+	//
+
+	// Run ripser on auxiliary distance matrix
   var ripser_output []byte
 	if ripser {
 		if verbose {fmt.Println("---")}
 		if verbose {fmt.Println("Run Ripser")}
-    ripser_cmd := exec.Command("ripser", "--format", "lower-distance", aux_file_name)
+
+		ripser_arguments := []string{"--format", "lower-distance"}
+		if ripser_dim != ""{
+			ripser_arguments = append(ripser_arguments, "--dim", ripser_dim)
+		}
+		if ripser_threshold != ""{
+			ripser_arguments = append(ripser_arguments, "--threshold", ripser_threshold)
+		}
+		if ripser_modulus != ""{
+			ripser_arguments = append(ripser_arguments, "--modulus", ripser_modulus)
+		}
+		if ripser_ratio != ""{
+			ripser_arguments = append(ripser_arguments, "--ratio", ripser_ratio)
+		}
+		ripser_arguments = append(ripser_arguments, aux_file_name)
+
+    ripser_cmd := exec.Command("ripser", ripser_arguments...)
+
     var err error
 		ripser_output, err = ripser_cmd.CombinedOutput()
 		if err != nil {
 			log.Fatalf("Failed to run command: %v\nCommand output: %s", err, string(ripser_output))
 		}
+
 	}
 
   err = os.Remove(aux_file_name)
@@ -374,12 +474,14 @@ func main() {
         if err != nil {
     			log.Fatalf("parsing error: %v", err)
     		}
+				//adjust from one- to zero-indexing
         birth = birth-1
 
         death, err := strconv.Atoi(x[1])
         if err != nil {
     			log.Fatalf("parsing error: %v", err)
     		}
+				//adjust from one- to zero-indexing
         death = death-1
 
         fmt.Println(" [", sub_fltr[birth], ",", sub_fltr[death], "):")