From 52678a68af6407082e48baed3240591bd5906cfc Mon Sep 17 00:00:00 2001
From: Christopher JF Cameron
Date: Sat, 30 Sep 2023 15:44:51 -0400
Subject: [PATCH 1/9] squashing colab int commits
---
README.md | 26 +-
conda-build/meta.yaml | 9 +-
docs/conf.py | 4 +-
docs/environment.yml | 6 +-
repic_colab.ipynb | 726 ++++++++++++++++++++++++++++++++++++++++++
5 files changed, 760 insertions(+), 11 deletions(-)
create mode 100644 repic_colab.ipynb
diff --git a/README.md b/README.md
index 01d64b2..e93129a 100644
--- a/README.md
+++ b/README.md
@@ -119,18 +119,33 @@ A REPIC Docker image is published on both [DockerHub](https://hub.docker.com/r/c
2. [Install and set up NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) for building and running GPU-accelerated containers
3. Pull REPIC Docker image and convert to Singularity image format (SIF) (requires >8 Gb of memory and ~40 mins for conversion):
```
-apptainer pull docker://cjfcameron/repic:main
+apptainer pull docker://cjfcameron/repic
```
If SIF file creation is taking a long time, increase the ```mksquashfs mem``` parameter in the Apptainer config file (apptainer.conf). See [here](https://apptainer.org/docs/admin/1.0/configfiles.html) for more information.
4. Run container with GPU acceleration (example [iter_pick.py](https://github.com/ccameron/REPIC/blob/main/repic/commands/iter_pick.py) command shown below):
```
-apptainer run --nv --bind /REPIC/examples:/examples repic_main.sif repic iter_pick /examples/10057/iter_config.json 4 100
+apptainer run --nv --bind /REPIC/examples:/examples repic_latest.sif repic iter_pick /examples/10057/iter_config.json 4 100
```
+**Run using Scipion plugin
**
+:warning: **WARNING**: Scipion plugin currently only contains REPIC one-shot mode
+
REPIC is available as a [Scipion](https://scipion.i2pc.es/) plugin: [https://github.com/scipion-em/scipion-em-repic](https://github.com/scipion-em/scipion-em-repic)
See [here](https://scipion-em.github.io/docs/release-3.0.0/docs/scipion-modes/how-to-install.html#installing-other-plugins) for information about installing plugins for Scipion.
@@ -188,7 +203,7 @@ repic iter_config examples/10057/ 176 224 /gmodel_phosnet_202005_N63_
A configuration file ``` iter_config.json ``` will be created in the current working directory.
-3. Pick particles by iterative ensemble learning using a Python script wrapper [iter_pick.py](https://github.com/ccameron/REPIC/blob/main/repic/commands/iter_pick.py) of [run.sh](https://github.com/ccameron/REPIC/blob/main/repic/iterative_particle_picking/run.sh) (expected run time: 20-30 min/iteration):
+3. Pick particles by iterative ensemble learning using [iter_pick.py](https://github.com/ccameron/REPIC/blob/main/repic/commands/iter_pick.py), a wrapper of [run.sh](https://github.com/ccameron/REPIC/blob/main/repic/iterative_particle_picking/run.sh) (expected run time: 20-30 min/iteration):
```
repic iter_pick ./iter_config.json 4 100
@@ -273,7 +288,7 @@ done
` /relion/CtfFind/job00[0-9]/* ` should list all CTFFIND4 output files in RELION's ` CtfFind/ `.
-2. Iteratively pick particles using a Python script wrapper [iter_pick.py](https://github.com/ccameron/REPIC/blob/main/repic/commands/iter_pick.py) of [run.sh](https://github.com/ccameron/REPIC/blob/main/repic/iterative_particle_picking/run.sh):
+2. Iteratively pick particles using [iter_pick.py](https://github.com/ccameron/REPIC/blob/main/repic/commands/iter_pick.py), a wrapper of [run.sh](https://github.com/ccameron/REPIC/blob/main/repic/iterative_particle_picking/run.sh):
```
usage: repic iter_pick [-h] [--semi_auto] [--score] [--out_file_path OUT_FILE_PATH] config_file num_iter train_size
@@ -308,6 +323,9 @@ For other concerns, please email [Christopher JF Cameron](mailto:christopher.cam
## Releases
+### new
+ - Google Colab integrated
+
### v0.2.1
- Scipion plugin created
- Docker/Singularity/Apptainer integrated
diff --git a/conda-build/meta.yaml b/conda-build/meta.yaml
index 3dbbca6..9b539b4 100644
--- a/conda-build/meta.yaml
+++ b/conda-build/meta.yaml
@@ -6,15 +6,14 @@ package:
source:
url: https://github.com/ccameron/REPIC/archive/v{{ version }}.zip
- sha256: 1c6a1701ecc58e4732d82a3b8ef20b473974e662e40a4c42944482aeae325c0f
+ sha256: fd77f660bf6e1fe10138c145d2aa67b69fd4ff30f249047ee49460a185407633
requirements:
host:
- python >=3.8.16
- pip
-
run:
- - python
+ - python >=3.8.16
- matplotlib-base >=3.2.2
- mrcfile >=1.4.3
- networkx >=2.8.4
@@ -29,6 +28,8 @@ build:
entry_points:
- repic = repic.main:main
script: {{ PYTHON }} -m pip install . --ignore-installed --no-deps -vv
+ run_exports:
+ - {{ pin_subpackage('repic', max_pin="x") }}
test:
commands:
@@ -39,7 +40,7 @@ about:
license: BSD-3-Clause
license_family: BSD
license_file: LICENSE
- summary: REPIC - an ensemble learning approach for cryo-EM particle picking.
+ summary: REPIC - an ensemble learning approach to cryo-EM particle picking.
description: REliable PIcking by Consensus (REPIC) is an ensemble learning approach to cryogenic-electron microscopy (cryo-EM) particle picking. It identifies particles common to multiple picked particle sets (i.e., consensus particles) using graph theory and integer linear programming (ILP). Picked particle sets may be found by a human specialist (manual), template matching, mathematical function (e.g., RELION's Laplacian-of-Gaussian auto-picking), or machine-learning method. REPIC expects particle sets to be in BOX file format (*.box) where each particle has coordinates, a detection box size (in pixels), and (optional) a score [0-1].
dev_url: https://github.com/ccameron/REPIC
doc_url: https://repic.readthedocs.io/en/latest/
diff --git a/docs/conf.py b/docs/conf.py
index 788cdcc..6335f6b 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -67,10 +67,12 @@ def get_version():
extensions = [
'autoapi.extension',
- 'sphinx.ext.napoleon'
+ 'sphinx.ext.napoleon',
+ 'sphinx_search.extension'
]
autoapi_dirs = ['../repic']
autoapi_type = "python"
+autoapi_ignore = ['../repic/__init__.py']
templates_path = ['_templates']
exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
diff --git a/docs/environment.yml b/docs/environment.yml
index 553526e..4107fd7 100644
--- a/docs/environment.yml
+++ b/docs/environment.yml
@@ -4,10 +4,12 @@ channels:
- conda-forge
- defaults
dependencies:
- - python=3.8
+ - python
+ - pip
+ - astroid==2.15.8 # https://github.com/readthedocs/sphinx-autoapi/issues/407
- repic
- pandoc
- - sphinx==6.2.1
+ - sphinx
- sphinx_rtd_theme
- sphinx-autoapi
- pip:
diff --git a/repic_colab.ipynb b/repic_colab.ipynb
new file mode 100644
index 0000000..80dcb4b
--- /dev/null
+++ b/repic_colab.ipynb
@@ -0,0 +1,726 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "XU1nb7Qa-Y5s"
+ },
+ "source": [
+ "\n",
+ "\n",
+ "## Welcome to the official REPIC Jupyter Notebook for Google Colab!\n",
+ "\n",
+ "REliable PIcking by Consensus (REPIC) is an ensemble learning approach to cryogenic-electron microscopy (cryo-EM) particle picking. It identifies particles common to multiple picked particle sets (i.e., consensus particles) using graph theory and integer linear programming.\n",
+ "\n",
+ "Development: https://github.com/ccameron/REPIC\n",
+ "\n",
+ "Documentation: https://repic.readthedocs.io/en/latest/\n",
+ "\n",
+ "\n",
+ "Below are the steps required to install and run both the one-shot and iterative modes of REPIC. Note — GPUs are recommended for the iterative mode (Runtime > Change runtime type > GPU)\n",
+ "\n",
+ "\n",
+ "If you encounter any issues with this notebook, please raise an issue in the REPIC GitHub repo: https://github.com/ccameron/REPIC/issues\n",
+ "\n",
+ "Author: Christopher JF Cameron (2023)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "T9fR5eWuEukn"
+ },
+ "source": [
+ "### Step 1 — check availability of ```conda``` command"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "1. Check the availability of the ```conda``` command"
+ ],
+ "metadata": {
+ "id": "wGrJRzHOXV9h"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "32bKA92WGzVB"
+ },
+ "outputs": [],
+ "source": [
+ "! conda --version"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "pp88FSKJx57U"
+ },
+ "source": [
+ "If Conda is available, the output will be (may be a different version): ```conda 23.1.0 ```\n",
+ "\n",
+ "\n",
+ "If the output says ```conda: command not found```, install Conda via [condalab](https://github.com/conda-incubator/condacolab) using pip: https://pypi.org/project/condacolab/"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "OGM8LhdwBzha"
+ },
+ "outputs": [],
+ "source": [
+ "! pip install -q condacolab\n",
+ "import condacolab\n",
+ "condacolab.install()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "zbn7scSq2J0Z"
+ },
+ "source": [
+ "After installation, Colab will raise a warning that the kernel has crashed (e.g., \"Your session crashed for an unknown reason.\"). This crash is expected and a result of the ```Restarting kernel...``` condalab step.\n",
+ "\n",
+ "2. Update the Conda base environment"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "eQwg-4rI2Lwa"
+ },
+ "outputs": [],
+ "source": [
+ "! conda update -n base -c conda-forge conda"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "4YnZioehsqVm"
+ },
+ "source": [
+ "### Step 2 — install particle picking algorithms"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "1. Install Mamba package manager: https://github.com/mamba-org/mamba"
+ ],
+ "metadata": {
+ "id": "hhOskLGxU_LT"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "PfSR9nVlsv1x"
+ },
+ "outputs": [],
+ "source": [
+ "! conda install -c conda-forge mamba -y"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "a8GJ5ozA3Fjj"
+ },
+ "source": [
+ "2. Get CUDA version of GPU using NVIDIA system manager interface (exp v12.0): https://developer.nvidia.com/nvidia-system-management-interface"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "rYSjQ1XHtOlN"
+ },
+ "outputs": [],
+ "source": [
+ "! nvidia-smi"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "iLgIXM3K3pkH"
+ },
+ "source": [
+ "3. Get version of installed CUDA toolkit (exp v11.8)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "PLV-cmEX2wIy"
+ },
+ "outputs": [],
+ "source": [
+ "! nvcc --version"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "lWo6sm2ytXwr"
+ },
+ "source": [
+ "_(Optional)_ Update the following install instructions for particle picking algorithms (Steps 4-11) below to reflect the available CUDA versions\n",
+ "\n",
+ "**SPHIRE-crYOLO install**\n",
+ "\n",
+ "4. Install SPHIRE-crYOLO: https://cryolo.readthedocs.io/en/stable/"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "Kid4JYd8tZoF"
+ },
+ "outputs": [],
+ "source": [
+ "! mamba create -n cryolo -c conda-forge -c anaconda pyqt=5 python=3.7 cudatoolkit=10.0.130 cudnn=7.6.5 numpy=1.18.5 libtiff wxPython=4.1.1 adwaita-icon-theme -y\n",
+ "! source activate cryolo && pip install 'cryolo[gpu]'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "5. Download pre-trained crYOLO LOWPASS model"
+ ],
+ "metadata": {
+ "id": "PhPnf9dmIrz4"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "vEGY8V6kvL7l"
+ },
+ "outputs": [],
+ "source": [
+ "! wget ftp://ftp.gwdg.de/pub/misc/sphire/crYOLO-GENERAL-MODELS/gmodel_phosnet_202005_N63_c17.h5"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Zz_Go0O4wHLh"
+ },
+ "source": [
+ "**Topaz install**\n",
+ "6. Install Topaz: https://topaz-em.readthedocs.io/en/latest/?badge=latest"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "aKNx4P6ZwLf3"
+ },
+ "outputs": [],
+ "source": [
+ "! mamba create -n topaz -c tbepler -c nvidia -c pytorch pytorch torchvision torchaudio pytorch-cuda=11.8 topaz=0.2.5"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "FlcvP5DRyVKc"
+ },
+ "source": [
+ "**REPIC install**\n",
+ "7. Install REPIC"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "! mamba install -c bioconda repic -y"
+ ],
+ "metadata": {
+ "id": "5vliH-nvP8U2"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "8. Install Linux basic calculator (bc) package: https://linux.die.net/man/1/bc"
+ ],
+ "metadata": {
+ "id": "Pde-ahNZdATb"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "! apt-get install bc"
+ ],
+ "metadata": {
+ "id": "_z8yIMSMb4nr"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "**DeepPicker install**\n",
+ "9. Clone DeepPicker GitHub repository"
+ ],
+ "metadata": {
+ "id": "SYanXcvhQT93"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "! git clone https://github.com/nejyeah/DeepPicker-python.git"
+ ],
+ "metadata": {
+ "id": "p5MIguDOQS03"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "10. Apply REPIC patch to DeepPicker Python scripts"
+ ],
+ "metadata": {
+ "id": "hK6RhotWQ4oN"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "! cp $(pip show repic | grep -in \"Location\" | cut -f2 -d ' ')/../../../docs/patches/deeppicker/*.py DeepPicker-python/"
+ ],
+ "metadata": {
+ "id": "nfFH2QR2Q_HG"
+ },
+ "execution_count": 17,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "11. Create DeepPicker Conda environment"
+ ],
+ "metadata": {
+ "id": "gdaQWl0eRMEB"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "! mamba create -n deep -c anaconda -c conda-forge -c pytorch python=3.7 tensorflow-gpu=2.4.1 cudatoolkit=10.1.243 cudnn=7.6.5 scipy matplotlib scikit-image mrcfile pytorch torchvision"
+ ],
+ "metadata": {
+ "id": "vRkOYkN4ROr3"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "**Cleanup**\n",
+ "\n",
+ "12. Check that Conda environments can be found (cryolo, deep, topaz)"
+ ],
+ "metadata": {
+ "id": "8rc0qlcSUqRH"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "! conda env list"
+ ],
+ "metadata": {
+ "id": "MaytIvvlUufU"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "13. Clean up installation files"
+ ],
+ "metadata": {
+ "id": "RKR_GupWRfDa"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "! conda clean --all -y\n",
+ "! mamba clean --all -y"
+ ],
+ "metadata": {
+ "id": "KpaBw8y0Sm02"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "JawwDI-OFSC_"
+ },
+ "source": [
+ "### Step 3 — run one-shot REPIC on example data _(optional)_"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "-_b7a6NvFZi3"
+ },
+ "source": [
+ "1. Clone the REPIC GitHub repo and obtain example data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "SodLgQG8Fqwv"
+ },
+ "outputs": [],
+ "source": [
+ "! git clone https://github.com/ccameron/REPIC"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "EZcATLbkF7Fu"
+ },
+ "source": [
+ "2. Calculate particle overlap and enumerate cliques using [get_cliques](https://github.com/ccameron/REPIC/blob/main/repic/commands/get_cliques.py).py (expected run time: <1 min)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "TzZavdHeGRyr"
+ },
+ "outputs": [],
+ "source": [
+ "! repic get_cliques /content/REPIC/examples/10017/ /content/REPIC/examples/10017/clique_files/ 180"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Ub3K1h6rG7tM"
+ },
+ "source": [
+ "3. Find optimal cliques and create consensus particle files using [run_ilp.py](https://github.com/ccameron/REPIC/blob/main/repic/commands/run_ilp.py) (expected run time: <1 min)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "o0aGn5NwHVi1"
+ },
+ "outputs": [],
+ "source": [
+ "! repic run_ilp /content/REPIC/examples/10017/clique_files/ 180"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "X68pqVI6Hlqw"
+ },
+ "source": [
+ "A consensus particle coordinate file (in BOX format) for each micrograph will be produced in ```/content/REPIC/examples/10017/clique_files/```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "### Step 4 — run iterative REPIC on example data _(optional)_"
+ ],
+ "metadata": {
+ "id": "-c66wgxGVysJ"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "1. Download example data"
+ ],
+ "metadata": {
+ "id": "FHIYnBe-V5kp"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "! bash $(pip show repic | grep -in \"Location\" | cut -f2 -d ' ')/repic/iterative_particle_picking/get_examples.sh /content/REPIC/examples/10057/data/ &> aws_download.log"
+ ],
+ "metadata": {
+ "id": "_iv2gzKBW9sO"
+ },
+ "execution_count": 34,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "2. Create a configuration file for iterative ensemble particle picking using [iter_config.py](https://github.com/ccameron/REPIC/blob/main/repic/commands/iter_config.py) (expected run time: <1 min)"
+ ],
+ "metadata": {
+ "id": "STcRVFE-XwwY"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "! repic iter_config /content/REPIC/examples/10057/ 176 224 /content/gmodel_phosnet_202005_N63_c17.h5 /content/DeepPicker-python 4 22"
+ ],
+ "metadata": {
+ "id": "YnApxf-LXhiO"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "3. Pick particles by iterative ensemble learning using [iter_pick.py](https://github.com/ccameron/REPIC/blob/main/repic/commands/iter_pick.py), a wrapper of [run.sh](https://github.com/ccameron/REPIC/blob/main/repic/iterative_particle_picking/run.sh) (expected run time: 20-30 min/iteration):"
+ ],
+ "metadata": {
+ "id": "vFZkBWgeX9Tb"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "! repic iter_pick /content/iter_config.json 4 100"
+ ],
+ "metadata": {
+ "id": "zvLfFeO5YHTo"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "The final set of consensus particles for the testing set will be found in: ```/content/REPIC/examples/10057/iterative_particle_picking/round_4/train_100/clique_files/test/*.box```"
+ ],
+ "metadata": {
+ "id": "G-eth_OR0wEV"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "jiYc217QJgaZ"
+ },
+ "source": [
+ "### Step 5 — run REPIC on your data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "XLX_XSDYJlov"
+ },
+ "source": [
+ "**REPIC overview**\n",
+ "\n",
+ "REPIC can be run in one of two modes:\n",
+ "\n",
+ "1. One shot — find consensus particles from the output of multiple particle picking algroithms\n",
+ "2. Iterative — _ab-initio_ train an ensemble of particle picking algorithms using either one-shot REPIC output or manually picked particles\n",
+ "\n",
+ "One-shot REPIC expects particle coordinate files (in BOX format) to be stored in separate subfolders for each particle picking algorithm:\n",
+ "\n",
+ "```console\n",
+ "folder/\n",
+ " | particle_picking_algorithm_1/\n",
+ " | mrc001.box\n",
+ " | mrc002.box\n",
+ " ⋮\n",
+ " | mrc999.box\n",
+ " | particle_picking_algorithm_2/\n",
+ " | mrc001.box\n",
+ " | mrc002.box\n",
+ " ⋮\n",
+ " | mrc999.box\n",
+ " ⋮\n",
+ " | particle_picking_algorithm_n/\n",
+ " | mrc001.box\n",
+ " | mrc002.box\n",
+ " ⋮\n",
+ " | mrc999.box\n",
+ "```\n",
+ "\n",
+ "Iterative REPIC expects micrograph (MRC) and particle coordinate (if using manually picked particles) files to be found in a singular folder:\n",
+ "```console\n",
+ "folder/\n",
+ " | mrc001.mrc\n",
+ " | mrc001.box\n",
+ " | mrc002.mrc\n",
+ " | mrc002.box\n",
+ " ⋮\n",
+ " | mrc999.mrc\n",
+ " | mrc999.box\n",
+ "```\n",
+ "\n",
+ "REPIC will create training and validation subsets from files in ```folder/``` before performing _ab-initio_ model training.\n",
+ "\n",
+ "**Uploading data to Google Colab - zipped folder**\n",
+ "\n",
+ "1. Upload a zipped folder of picked particles:\n",
+ " \n",
+ " Click folder icon in left panel of Colab (\"Files\") > Upload to session storage\n",
+ "\n",
+ "2. Unzip folder:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "thh5FNOIL3_h"
+ },
+ "outputs": [],
+ "source": [
+ "! unzip .zip"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "3. Example command — calculate the particle overlap and enumerate cliques using [get_cliques.py](https://github.com/ccameron/REPIC/blob/main/repic/commands/get_cliques.py):"
+ ],
+ "metadata": {
+ "id": "v6f8hCpJAGno"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "! repic get_cliques /clique_files/ "
+ ],
+ "metadata": {
+ "id": "NgPPfcNtAXR9"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "n-ILyrpJPFxL"
+ },
+ "source": [
+ "Replace `````` with the expected detection box size (in pixels).\n",
+ "\n",
+ "**Uploading data to Google Colab - Google Drive**\n",
+ "\n",
+ "1. Upload your data to Google Drive and mount it:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "source": [
+ "# Load the Drive helper and mount\n",
+ "from google.colab import drive\n",
+ "drive.mount('/content/drive')"
+ ],
+ "metadata": {
+ "id": "uwLV9vHM2Ua2"
+ },
+ "execution_count": null,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "2. Example command — calculate the particle overlap and enumerate cliques using [get_cliques.py](https://github.com/ccameron/REPIC/blob/main/repic/commands/get_cliques.py):"
+ ],
+ "metadata": {
+ "id": "Vr0aZ15L_1cQ"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "V-oqRWnhPMHt"
+ },
+ "outputs": [],
+ "source": [
+ "! repic get_cliques /content/drive/MyDrive/ /content/drive/MyDrive//clique_files/ "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "For more information about REPIC commands see Steps 3 and 4 above or https://repic.readthedocs.io/en/latest/\n",
+ "\n",
+ "**Downloading REPIC results**\n",
+ "\n",
+ "Folders containing REPIC output can be downloaded using the following:"
+ ],
+ "metadata": {
+ "id": "aR-beAn22D1Z"
+ }
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "Ku1pXQpuQKyy"
+ },
+ "outputs": [],
+ "source": [
+ "! zip -r repic_out.zip /\n",
+ "from google.colab import files\n",
+ "files.download(\"repic_out.zip\")"
+ ]
+ }
+ ],
+ "metadata": {
+ "accelerator": "GPU",
+ "colab": {
+ "provenance": []
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "name": "python3"
+ },
+ "language_info": {
+ "name": "python"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
From 5ef8848c3a83112f126c54223a82ebfe53bc1b9e Mon Sep 17 00:00:00 2001
From: ccameron
Date: Wed, 13 Dec 2023 12:58:51 -0500
Subject: [PATCH 2/9] squashing colab int commits
---
README.md | 2 +-
repic/commands/get_cliques.py | 18 +++++++++++++++---
repic/commands/run_ilp.py | 9 ++++++---
3 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index e93129a..f8c9d02 100644
--- a/README.md
+++ b/README.md
@@ -91,7 +91,7 @@ conda activate repic
```
6. Install REPIC using [pip](https://en.wikipedia.org/wiki/Pip_(package_manager)):
```
-pip install .
+python -m pip install .
```
7. [Obtain a Gurobi license](https://www.gurobi.com/academia/academic-program-and-licenses/) and set Gurobi key:
```
diff --git a/repic/commands/get_cliques.py b/repic/commands/get_cliques.py
index 0dfabbe..5cd348d 100644
--- a/repic/commands/get_cliques.py
+++ b/repic/commands/get_cliques.py
@@ -175,12 +175,12 @@ def main(args):
del i, method
except (UnboundLocalError, IndexError) as e:
# create empty BOX file if particle bounding boxes are not picked by all methods
- print("Skipping micrograph - not all methods have picked particles...")
+ print("Skipping micrograph - not all methods have picked particles")
out_file = os.path.join(args.out_dir, ''.join(
[basename[1:-1], ".box"]))
with open(out_file, 'wt') as o:
pass
- return
+ continue
print("Calculating Jaccard indices ... ")
# build k-d tree from x, y, and z coordinates with method key values
@@ -254,6 +254,7 @@ def main(args):
# retain row / col indices for sparse matrix
cols.extend([j] * k)
rows.extend([v.index(val) for val in clique])
+ del j, clique, subgraph
assert (len(cliques) == len(
w)), "Error - concensus coordinates and ILP weight vector are not equal lengths"
assert (len(w) == len(confidence)
@@ -263,7 +264,18 @@ def main(args):
assert (len(cliques) * k == len(cols)
), "Error - consensus coordinates or ILP sparse matrix indices (rows / cols) missing"
A = coo_matrix(([1] * len(cols), (rows, cols)), shape=(len(v), n))
- del n, v, rows, cols, j, clique, subgraph
+ del n, v, rows, cols
+
+ if len(cliques) == 0:
+ # no cliques found
+ print("Skipping micrograph - no cliques found")
+ # write empty BOX file
+ out_file = os.path.join(args.out_dir, ''.join(
+ [basename[1:-1], ".box"]))
+ with open(out_file, 'w') as o:
+ pass
+ del out_file, o
+ continue
# write structures to storage for ILP optimization
# add multi-out header
diff --git a/repic/commands/run_ilp.py b/repic/commands/run_ilp.py
index 50eb78f..b0ebbe2 100644
--- a/repic/commands/run_ilp.py
+++ b/repic/commands/run_ilp.py
@@ -156,6 +156,7 @@ def main(args):
# SciPY only optimizes minimization problems
w *= -1
+ print(w)
# restrict clique selection to integers
integrality = np.ones_like(w)
@@ -243,9 +244,11 @@ def main(args):
weights += confidences
# plot consensus particle weights
- print("\nPlotting consensus particle weights ... ")
- plot_particle_weights(args, weights, num_mrc, os.path.dirname(matrix_file))
-
+ try:
+ print("\nPlotting consensus particle weights ... ")
+ plot_particle_weights(args, weights, num_mrc, os.path.dirname(matrix_file))
+ except UnboundLocalError:
+ print("Warning - no ILP matrix files found")
if __name__ == '__main__':
parser = argparse.ArgumentParser()
From 503f43206d8fc284f0bd00327d238cc689ed6289 Mon Sep 17 00:00:00 2001
From: ccameron <30734249+ccameron@users.noreply.github.com>
Date: Tue, 16 Jan 2024 13:38:00 -0500
Subject: [PATCH 3/9] Update environment.yml
---
docs/environment.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/environment.yml b/docs/environment.yml
index 4107fd7..b64b348 100644
--- a/docs/environment.yml
+++ b/docs/environment.yml
@@ -13,5 +13,5 @@ dependencies:
- sphinx_rtd_theme
- sphinx-autoapi
- pip:
- - readthedocs-sphinx-search
+ - readthedocs-sphinx-search>=0.3.2
prefix: /Users/ccameron/miniconda3/envs/repic
From 8aa35519d7c56b998fa62ef11b52ab99f79be1d3 Mon Sep 17 00:00:00 2001
From: Christopher JF Cameron
Date: Wed, 7 Feb 2024 11:45:04 -0500
Subject: [PATCH 4/9] squashing resub commits
---
README.md | 11 +-
repic/commands/iter_config.py | 19 +-
repic/commands/iter_pick.py | 14 +
repic/iterative_particle_picking/run.sh | 27 +-
supp_data_files/supplemental_data_file_2.ods | Bin 8553 -> 0 bytes
supp_data_files/supplemental_data_file_2.txt | 375 +++++++++++++++++++
supp_data_files/supplemental_data_file_3.ods | Bin 8801 -> 0 bytes
supp_data_files/supplemental_data_file_3.txt | 220 +++++++++++
supp_data_files/supplemental_data_file_4.ods | Bin 0 -> 9455 bytes
supp_data_files/supplemental_data_file_5.ods | Bin 0 -> 9741 bytes
10 files changed, 649 insertions(+), 17 deletions(-)
delete mode 100644 supp_data_files/supplemental_data_file_2.ods
create mode 100644 supp_data_files/supplemental_data_file_2.txt
delete mode 100644 supp_data_files/supplemental_data_file_3.ods
create mode 100644 supp_data_files/supplemental_data_file_3.txt
create mode 100644 supp_data_files/supplemental_data_file_4.ods
create mode 100644 supp_data_files/supplemental_data_file_5.ods
diff --git a/README.md b/README.md
index f8c9d02..dd05ddc 100644
--- a/README.md
+++ b/README.md
@@ -250,7 +250,8 @@ optional arguments:
1. Create a configuration file for iterative ensemble particle picking using [iter_config.py](https://github.com/ccameron/REPIC/blob/main/repic/commands/iter_config.py):
```
-usage: repic iter_config [-h] [--cryolo_env CRYOLO_ENV] [--deep_env DEEP_ENV] [--topaz_env TOPAZ_ENV] [--out_file_path OUT_FILE_PATH]
+usage: repic iter_config [-h] [--cryolo_env CRYOLO_ENV] [--deep_env DEEP_ENV] [--deep_model DEEP_MODEL] [--topaz_env TOPAZ_ENV]
+ [--topaz_model TOPAZ_MODEL] [--out_file_path OUT_FILE_PATH]
data_dir box_size exp_particles cryolo_model deep_dir topaz_scale topaz_rad
positional arguments:
@@ -267,8 +268,12 @@ optional arguments:
--cryolo_env CRYOLO_ENV
Conda environment name or prefix for SPHIRE-crYOLO installation (default:cryolo)
--deep_env DEEP_ENV Conda environment name or prefix for DeepPicker installation (default:deep)
+ --deep_model DEEP_MODEL
+ path to pre-trained DeepPicker model (default:out-of-the-box model)
--topaz_env TOPAZ_ENV
Conda environment name or prefix for Topaz installation (default:topaz)
+ --topaz_model TOPAZ_MODEL
+ path to pre-trained Topaz model (default:out-of-the-box model)
--out_file_path OUT_FILE_PATH
path for created config file (default:./iter_config.json)
```
@@ -290,7 +295,7 @@ done
2. Iteratively pick particles using [iter_pick.py](https://github.com/ccameron/REPIC/blob/main/repic/commands/iter_pick.py), a wrapper of [run.sh](https://github.com/ccameron/REPIC/blob/main/repic/iterative_particle_picking/run.sh):
```
-usage: repic iter_pick [-h] [--semi_auto] [--score] [--out_file_path OUT_FILE_PATH] config_file num_iter train_size
+usage: repic iter_pick [-h] [--semi_auto] [--sample_prob SAMPLE_PROB] [--score] [--out_file_path OUT_FILE_PATH] config_file num_iter train_size
positional arguments:
config_file path to REPIC config file
@@ -300,6 +305,8 @@ positional arguments:
optional arguments:
-h, --help show this help message and exit
--semi_auto initialize training labels with known particles (semi-automatic)
+ --sample_prob SAMPLE_PROB
+ sampling probability of initial training labels for 'semi_auto' (default:1.)
--score evaluate picked particle sets
--out_file_path OUT_FILE_PATH
path for picking log file (default:/iter_pick.log)
diff --git a/repic/commands/iter_config.py b/repic/commands/iter_config.py
index 1c49a94..0f30be5 100644
--- a/repic/commands/iter_config.py
+++ b/repic/commands/iter_config.py
@@ -48,14 +48,15 @@ def add_arguments(parser):
None
"""
parser.add_argument(
- "data_dir", help="path to directory containing training data")
+ "data_dir", type=str, help="path to directory containing training data")
parser.add_argument("box_size", type=int,
help="particle bounding box size (in int[pixels])")
parser.add_argument("exp_particles", type=int,
help="number of expected particles (int)")
parser.add_argument(
- "cryolo_model", help="path to LOWPASS SPHIRE-crYOLO model")
- parser.add_argument("deep_dir", help="path to DeepPicker scripts")
+ "cryolo_model", type=str, help="path to LOWPASS SPHIRE-crYOLO model")
+ parser.add_argument("deep_dir", type=str,
+ help="path to DeepPicker scripts")
parser.add_argument("topaz_scale", type=int,
help="Topaz scale value (int)")
parser.add_argument("topaz_rad", type=int,
@@ -64,8 +65,12 @@ def add_arguments(parser):
help=f"Conda environment name or prefix for SPHIRE-crYOLO installation (default:{env_dict['cryolo']})")
parser.add_argument("--deep_env", type=str, default=env_dict['deep'],
help=f"Conda environment name or prefix for DeepPicker installation (default:{env_dict['deep']})")
+ parser.add_argument(
+ "--deep_model", help="path to pre-trained DeepPicker model (default:out-of-the-box model)")
parser.add_argument("--topaz_env", type=str, default=env_dict['topaz'],
help=f"Conda environment name or prefix for Topaz installation (default:{env_dict['topaz']})")
+ parser.add_argument(
+ "--topaz_model", help="path to pre-trained Topaz model (default:out-of-the-box model)")
parser.add_argument("--out_file_path", type=str, default="iter_config.json",
help="path for created config file (default:./iter_config.json)")
@@ -105,6 +110,14 @@ def main(args):
0), f"Error - Conda environment(s) not found: {', '.join(envs)}"
del envs, stdout
+ # check if optional models provided and are valid
+ if not args.deep_model is None:
+ assert (os.path.exists(os.path.dirname(args.deep_model))
+ ), f"Error - provided DeepPicker model not found: {args.deep_model}"
+ if not args.topaz_model is None:
+ assert (os.path.exists(args.topaz_model)
+ ), f"Error - provided Topaz model not found: {args.topaz_model}"
+
# write JSON file of iter_pick parameters
print(f"Writing config file to {args.out_file_path}")
params_dict = vars(copy.deepcopy(args))
diff --git a/repic/commands/iter_pick.py b/repic/commands/iter_pick.py
index 1f663bc..a90f771 100644
--- a/repic/commands/iter_pick.py
+++ b/repic/commands/iter_pick.py
@@ -29,6 +29,8 @@ def add_arguments(parser):
help="training subset percentage (int)")
parser.add_argument("--semi_auto", action="store_true",
help="initialize training labels with known particles (semi-automatic)")
+ parser.add_argument("--sample_prob", type=float, default=1.,
+ help=f"sampling probability of initial training labels for 'semi_auto' (default:1.)")
parser.add_argument("--score", action="store_true",
help="evaluate picked particle sets")
parser.add_argument("--out_file_path", type=str,
@@ -42,6 +44,14 @@ def main(args):
Args:
args (obj): argparse command line argument object
"""
+ # validate command line arguments
+ assert (os.path.exists(args.config_file)
+ ), f"Error - provided config file not found: {args.config_file}"
+ assert (isinstance(args.num_iter, int)
+ ), f"Error - num_iter should be an integer. Found {args.num_iter}"
+ assert (0. <= args.sample_prob <= 1.
+ ), f"Error - sample_prob should be a float within [0, 1]. Found: {args.sample_prob}"
+
# load JSON config file
with open(args.config_file, 'rt') as f:
params_dict = json.load(f)
@@ -61,12 +71,16 @@ def main(args):
str(params_dict["exp_particles"]),
''.join(["train_", str(args.train_size)]),
"semi" if args.semi_auto else "auto",
+ str(args.sample_prob),
'1' if args.score else '0',
params_dict["cryolo_env"],
params_dict["cryolo_model"],
params_dict["deep_env"],
params_dict["deep_dir"],
+ params_dict["deep_model"] if not params_dict["deep_model"] is None else os.path.join(
+ params_dict["deep_env"], "trained_model", "model_demo_type3"),
params_dict["topaz_env"],
+ str(params_dict["topaz_model"]),
str(params_dict["topaz_scale"]),
str(params_dict["topaz_rad"]),
]
diff --git a/repic/iterative_particle_picking/run.sh b/repic/iterative_particle_picking/run.sh
index 6b4b165..5f474e6 100644
--- a/repic/iterative_particle_picking/run.sh
+++ b/repic/iterative_particle_picking/run.sh
@@ -21,17 +21,20 @@ export REPIC_NUM_PARTICLES=${4}
LABEL=${5}
export REPIC_TRAIN_MRC=${IN_DIR}/iterative_particle_picking/train/${LABEL}
if [ "auto" = ${6} ]; then USE_MANUAL_LABELS=false; else USE_MANUAL_LABELS=true;fi
-if [[ "${7}" == 1 ]]; then GET_SCORE=true; else GET_SCORE=false; fi
+export SAMPLE_PROB=${7}
+if [[ "${8}" == 1 ]]; then GET_SCORE=true; else GET_SCORE=false; fi
export REPIC_VAL_MRC=${IN_DIR}/iterative_particle_picking/val/
export REPIC_TEST_MRC=${IN_DIR}/iterative_particle_picking/test
REPIC_COORD=${IN_DIR}/iterative_particle_picking
-export CRYOLO_ENV=${8}
-export CRYOLO_MODEL=${9}
-export DEEP_ENV=${10}
-export DEEP_DIR=${11}
-export TOPAZ_ENV=${12}
-export TOPAZ_SCALE=${13}
-export TOPAZ_PARTICLE_RAD=${14}
+export CRYOLO_ENV=${9}
+export CRYOLO_MODEL=${10}
+export DEEP_ENV=${11}
+export DEEP_DIR=${12}
+export DEEP_MODEL=${13}
+export TOPAZ_ENV=${14}
+if [ "None" = ${15} ]; then :; else export TOPAZ_MODEL=${15}; fi
+export TOPAZ_SCALE=${16}
+export TOPAZ_PARTICLE_RAD=${17}
# CrYOLO filtered micrograph directory
export CRYOLO_FILTERED_DIR=${IN_DIR}/iterative_particle_picking/cryolo_filtered_tmp
@@ -60,11 +63,11 @@ mkdir -p ${SUB_DIR}
if ! ${USE_MANUAL_LABELS}; then
##
- # step 2 - apply general models to train and test sets
+ # step 2 - apply pre-trained models to train and test sets
##
echo -e """\n--- Identifying particles in '${LABEL}' ---
- Applying general models to train, val, and test micrographs ...
+ Applying pre-trained models to train, val, and test micrographs ...
--- Round: 0 ---
\tSPHIRE-crYOLO ... "
# SPHIRE-crYOLO
@@ -187,7 +190,7 @@ else
while [ $(cat ${REPIC_OUT_DIR}/*.box | wc -l) -le 4 ]; do # ensure there are enough examples sampled
for file in ${REPIC_TRAIN_MRC}/*.box; do
base=$(basename ${file})
- cat ${file} | awk 'BEGIN {srand()} !/^$/ { if (rand() <= 0.01) print $0}' > ${REPIC_OUT_DIR}/${base}
+ cat ${file} | awk -v prob=${SAMPLE_PROB} 'BEGIN {srand()} !/^$/ { if (rand() <= prob) print $0}' > ${REPIC_OUT_DIR}/${base}
perl -i -pe 's/(\d*\.\d*)/int($1+0.5)/ge' ${REPIC_OUT_DIR}/${base}
done
done
@@ -199,7 +202,7 @@ else
while [ $(cat ${REPIC_OUT_DIR}/*.box | wc -l) -le 4 ]; do
for file in ${REPIC_VAL_MRC}/*.box; do
base=$(basename ${file})
- cat ${file} | awk 'BEGIN {srand()} !/^$/ { if (rand() <= 0.01) print $0}' > ${REPIC_OUT_DIR}/${base}
+ cat ${file} | awk -v prob=${SAMPLE_PROB} 'BEGIN {srand()} !/^$/ { if (rand() <= prob) print $0}' > ${REPIC_OUT_DIR}/${base}
perl -i -pe 's/(\d*\.\d*)/int($1+0.5)/ge' ${REPIC_OUT_DIR}/${base}
done
done
diff --git a/supp_data_files/supplemental_data_file_2.ods b/supp_data_files/supplemental_data_file_2.ods
deleted file mode 100644
index dcb1830b136ac4465ae51afb53248086bfef0423..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 8553
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
TzjOxx#OFouX>-g3e@FiV@wVwU
diff --git a/supp_data_files/supplemental_data_file_2.txt b/supp_data_files/supplemental_data_file_2.txt
new file mode 100644
index 0000000..c680c7c
--- /dev/null
+++ b/supp_data_files/supplemental_data_file_2.txt
@@ -0,0 +1,375 @@
+stack_101016-2_0007_2x_SumCorr_DW.box
+stack_101016-2_0018_2x_SumCorr_DW.box
+stack_101016-2_0021_2x_SumCorr_DW.box
+stack_101016-2_0024_2x_SumCorr_DW.box
+stack_101016-2_0031_2x_SumCorr_DW.box
+stack_101016-2_0045_2x_SumCorr_DW.box
+stack_101016-2_0048_2x_SumCorr_DW.box
+stack_101016-2_0050_2x_SumCorr_DW.box
+stack_101016-2_0052_2x_SumCorr_DW.box
+stack_101016-2_0067_2x_SumCorr_DW.box
+stack_101016-2_0069_2x_SumCorr_DW.box
+stack_101016-2_0070_2x_SumCorr_DW.box
+stack_101016-2_0078_2x_SumCorr_DW.box
+stack_101016-2_0100_2x_SumCorr_DW.box
+stack_101016-2_0101_2x_SumCorr_DW.box
+stack_101016-2_0107_2x_SumCorr_DW.box
+stack_101016-2_0109_2x_SumCorr_DW.box
+stack_101016-2_0111_2x_SumCorr_DW.box
+stack_101016-2_0124_2x_SumCorr_DW.box
+stack_101016-2_0136_2x_SumCorr_DW.box
+stack_101016-2_0138_2x_SumCorr_DW.box
+stack_101016-2_0139_2x_SumCorr_DW.box
+stack_101016-2_0140_2x_SumCorr_DW.box
+stack_101016-2_0159_2x_SumCorr_DW.box
+stack_101016-2_0163_2x_SumCorr_DW.box
+stack_101016-2_0174_2x_SumCorr_DW.box
+stack_101016-2_0186_2x_SumCorr_DW.box
+stack_101016-2_0189_2x_SumCorr_DW.box
+stack_101016-2_0191_2x_SumCorr_DW.box
+stack_101016-2_0193_2x_SumCorr_DW.box
+stack_101016-2_0194_2x_SumCorr_DW.box
+stack_101016-2_0199_2x_SumCorr_DW.box
+stack_101016-2_0200_2x_SumCorr_DW.box
+stack_101016-2_0212_2x_SumCorr_DW.box
+stack_101016-2_0216_2x_SumCorr_DW.box
+stack_101016-2_0221_2x_SumCorr_DW.box
+stack_101016-2_0227_2x_SumCorr_DW.box
+stack_101016-2_0230_2x_SumCorr_DW.box
+stack_101016-2_0233_2x_SumCorr_DW.box
+stack_101016-2_0243_2x_SumCorr_DW.box
+stack_101016-2_0246_2x_SumCorr_DW.box
+stack_101016-2_0250_2x_SumCorr_DW.box
+stack_101016-2_0251_2x_SumCorr_DW.box
+stack_101016-2_0254_2x_SumCorr_DW.box
+stack_101016-2_0255_2x_SumCorr_DW.box
+stack_101016-2_0261_2x_SumCorr_DW.box
+stack_101016-2_0265_2x_SumCorr_DW.box
+stack_101016-2_0276_2x_SumCorr_DW.box
+stack_101016-2_0277_2x_SumCorr_DW.box
+stack_101016-2_0279_2x_SumCorr_DW.box
+stack_101016-2_0289_2x_SumCorr_DW.box
+stack_101016-2_0294_2x_SumCorr_DW.box
+stack_101016-2_0298_2x_SumCorr_DW.box
+stack_101016-2_0299_2x_SumCorr_DW.box
+stack_101016-2_0307_2x_SumCorr_DW.box
+stack_101016-2_0312_2x_SumCorr_DW.box
+stack_101016-2_0315_2x_SumCorr_DW.box
+stack_101016-2_0317_2x_SumCorr_DW.box
+stack_101016-2_0318_2x_SumCorr_DW.box
+stack_101016-2_0325_2x_SumCorr_DW.box
+stack_101016-2_0328_2x_SumCorr_DW.box
+stack_101016-2_0329_2x_SumCorr_DW.box
+stack_101016-2_0332_2x_SumCorr_DW.box
+stack_101016-2_0334_2x_SumCorr_DW.box
+stack_101016-2_0339_2x_SumCorr_DW.box
+stack_101016-2_0340_2x_SumCorr_DW.box
+stack_101016-2_0352_2x_SumCorr_DW.box
+stack_101016-2_0365_2x_SumCorr_DW.box
+stack_101016-2_0368_2x_SumCorr_DW.box
+stack_101016-2_0369_2x_SumCorr_DW.box
+stack_101016-2_0372_2x_SumCorr_DW.box
+stack_101016-2_0373_2x_SumCorr_DW.box
+stack_101016-2_0375_2x_SumCorr_DW.box
+stack_101016-2_0396_2x_SumCorr_DW.box
+stack_101016-2_0399_2x_SumCorr_DW.box
+stack_101016-2_0401_2x_SumCorr_DW.box
+stack_101016-2_0403_2x_SumCorr_DW.box
+stack_101016-2_0407_2x_SumCorr_DW.box
+stack_101016-2_0408_2x_SumCorr_DW.box
+stack_101016-2_0411_2x_SumCorr_DW.box
+stack_101016-2_0413_2x_SumCorr_DW.box
+stack_101016-2_0418_2x_SumCorr_DW.box
+stack_101016-2_0429_2x_SumCorr_DW.box
+stack_101016-2_0436_2x_SumCorr_DW.box
+stack_101016-2_0450_2x_SumCorr_DW.box
+stack_101016-2_0451_2x_SumCorr_DW.box
+stack_101016-2_0452_2x_SumCorr_DW.box
+stack_101016-2_0453_2x_SumCorr_DW.box
+stack_101016-2_0458_2x_SumCorr_DW.box
+stack_101016-2_0460_2x_SumCorr_DW.box
+stack_101016-2_0465_2x_SumCorr_DW.box
+stack_101016-2_0466_2x_SumCorr_DW.box
+stack_101016-2_0472_2x_SumCorr_DW.box
+stack_101016-2_0476_2x_SumCorr_DW.box
+stack_101016-2_0480_2x_SumCorr_DW.box
+stack_101016-2_0482_2x_SumCorr_DW.box
+stack_101016-2_0498_2x_SumCorr_DW.box
+stack_101016-2_0500_2x_SumCorr_DW.box
+stack_101016-2_0509_2x_SumCorr_DW.box
+stack_101016-2_0519_2x_SumCorr_DW.box
+stack_101016-2_0520_2x_SumCorr_DW.box
+stack_101016-2_0527_2x_SumCorr_DW.box
+stack_101016-2_0537_2x_SumCorr_DW.box
+stack_101016-2_0542_2x_SumCorr_DW.box
+stack_101016-2_0544_2x_SumCorr_DW.box
+stack_101016-2_0546_2x_SumCorr_DW.box
+stack_101016-2_0563_2x_SumCorr_DW.box
+stack_101016-2_0567_2x_SumCorr_DW.box
+stack_101016-2_0568_2x_SumCorr_DW.box
+stack_101016-2_0574_2x_SumCorr_DW.box
+stack_101016-2_0577_2x_SumCorr_DW.box
+stack_101016-2_0580_2x_SumCorr_DW.box
+stack_101016-2_0587_2x_SumCorr_DW.box
+stack_101016-2_0590_2x_SumCorr_DW.box
+stack_101016-2_0595_2x_SumCorr_DW.box
+stack_101016-2_0598_2x_SumCorr_DW.box
+stack_101016-2_0605_2x_SumCorr_DW.box
+stack_101016-2_0613_2x_SumCorr_DW.box
+stack_101016-2_0624_2x_SumCorr_DW.box
+stack_101016-2_0626_2x_SumCorr_DW.box
+stack_101016-2_0633_2x_SumCorr_DW.box
+stack_101016-2_0645_2x_SumCorr_DW.box
+stack_101016-2_0652_2x_SumCorr_DW.box
+stack_101016-2_0658_2x_SumCorr_DW.box
+stack_101016-2_0667_2x_SumCorr_DW.box
+stack_101016-2_0668_2x_SumCorr_DW.box
+stack_101016-2_0675_2x_SumCorr_DW.box
+stack_101016-2_0676_2x_SumCorr_DW.box
+stack_101016-2_0682_2x_SumCorr_DW.box
+stack_101016-2_0683_2x_SumCorr_DW.box
+stack_101016-2_0686_2x_SumCorr_DW.box
+stack_101016-2_0687_2x_SumCorr_DW.box
+stack_101016-2_0689_2x_SumCorr_DW.box
+stack_101016-2_0693_2x_SumCorr_DW.box
+stack_101016-2_0695_2x_SumCorr_DW.box
+stack_101016-2_0704_2x_SumCorr_DW.box
+stack_101016-2_0712_2x_SumCorr_DW.box
+stack_101016-2_0713_2x_SumCorr_DW.box
+stack_101016-2_0714_2x_SumCorr_DW.box
+stack_101016-2_0719_2x_SumCorr_DW.box
+stack_101016-2_0724_2x_SumCorr_DW.box
+stack_101016-2_0733_2x_SumCorr_DW.box
+stack_101016-2_0753_2x_SumCorr_DW.box
+stack_101016-2_0758_2x_SumCorr_DW.box
+stack_101016-2_0762_2x_SumCorr_DW.box
+stack_101016-2_0763_2x_SumCorr_DW.box
+stack_101016-2_0776_2x_SumCorr_DW.box
+stack_101016-2_0782_2x_SumCorr_DW.box
+stack_101016-2_0787_2x_SumCorr_DW.box
+stack_101016-2_0798_2x_SumCorr_DW.box
+stack_101016-2_0802_2x_SumCorr_DW.box
+stack_101016-2_0804_2x_SumCorr_DW.box
+stack_101016-2_0812_2x_SumCorr_DW.box
+stack_101016-2_0814_2x_SumCorr_DW.box
+stack_101016-2_0819_2x_SumCorr_DW.box
+stack_101016-2_0829_2x_SumCorr_DW.box
+stack_101016-2_0830_2x_SumCorr_DW.box
+stack_101016-2_0833_2x_SumCorr_DW.box
+stack_101016-2_0838_2x_SumCorr_DW.box
+stack_101016-2_0839_2x_SumCorr_DW.box
+stack_101016-2_0843_2x_SumCorr_DW.box
+stack_101016-2_0844_2x_SumCorr_DW.box
+stack_101016-2_0850_2x_SumCorr_DW.box
+stack_101016-2_0860_2x_SumCorr_DW.box
+stack_101016-2_0867_2x_SumCorr_DW.box
+stack_101016-2_0868_2x_SumCorr_DW.box
+stack_101016-2_0874_2x_SumCorr_DW.box
+stack_101016-2_0887_2x_SumCorr_DW.box
+stack_101016-2_0892_2x_SumCorr_DW.box
+stack_101016-2_0895_2x_SumCorr_DW.box
+stack_101016-2_0897_2x_SumCorr_DW.box
+stack_101016-2_0900_2x_SumCorr_DW.box
+stack_101016-2_0906_2x_SumCorr_DW.box
+stack_101016-2_0908_2x_SumCorr_DW.box
+stack_101016-2_0918_2x_SumCorr_DW.box
+stack_101016-2_0920_2x_SumCorr_DW.box
+stack_101016-2_0924_2x_SumCorr_DW.box
+stack_101016-2_0931_2x_SumCorr_DW.box
+stack_101016-2_0933_2x_SumCorr_DW.box
+stack_101016-2_0940_2x_SumCorr_DW.box
+stack_101016-2_0945_2x_SumCorr_DW.box
+stack_101016-2_0947_2x_SumCorr_DW.box
+stack_101016-2_0952_2x_SumCorr_DW.box
+stack_101016-2_0953_2x_SumCorr_DW.box
+stack_101016-2_0961_2x_SumCorr_DW.box
+stack_101016-2_0965_2x_SumCorr_DW.box
+stack_101016-2_0968_2x_SumCorr_DW.box
+stack_101016-2_0969_2x_SumCorr_DW.box
+stack_101016-2_0971_2x_SumCorr_DW.box
+stack_101016-2_0973_2x_SumCorr_DW.box
+stack_101016-2_0974_2x_SumCorr_DW.box
+stack_101016-2_0978_2x_SumCorr_DW.box
+stack_101016-2_0985_2x_SumCorr_DW.box
+stack_101016-2_0994_2x_SumCorr_DW.box
+stack_101016-2_0997_2x_SumCorr_DW.box
+stack_101016-2_0998_2x_SumCorr_DW.box
+stack_101016-2_1008_2x_SumCorr_DW.box
+stack_101016-2_1009_2x_SumCorr_DW.box
+stack_101016-2_1017_2x_SumCorr_DW.box
+stack_101016-2_1019_2x_SumCorr_DW.box
+stack_101016-2_1022_2x_SumCorr_DW.box
+stack_101016-2_1023_2x_SumCorr_DW.box
+stack_101016-2_1043_2x_SumCorr_DW.box
+stack_101016-2_1044_2x_SumCorr_DW.box
+stack_101016-2_1049_2x_SumCorr_DW.box
+stack_101016-2_1054_2x_SumCorr_DW.box
+stack_101016-2_1064_2x_SumCorr_DW.box
+stack_101016-2_1068_2x_SumCorr_DW.box
+stack_101016-2_1069_2x_SumCorr_DW.box
+stack_101016-2_1073_2x_SumCorr_DW.box
+stack_101016-2_1080_2x_SumCorr_DW.box
+stack_101016-2_1081_2x_SumCorr_DW.box
+stack_101016-2_1082_2x_SumCorr_DW.box
+stack_101016-2_1087_2x_SumCorr_DW.box
+stack_101016-2_1093_2x_SumCorr_DW.box
+stack_101016-2_1094_2x_SumCorr_DW.box
+stack_101016-2_1097_2x_SumCorr_DW.box
+stack_101016-2_1099_2x_SumCorr_DW.box
+stack_101016-2_1104_2x_SumCorr_DW.box
+stack_101016-2_1112_2x_SumCorr_DW.box
+stack_101016-2_1122_2x_SumCorr_DW.box
+stack_101016-2_1128_2x_SumCorr_DW.box
+stack_101016-2_1129_2x_SumCorr_DW.box
+stack_101016-2_1131_2x_SumCorr_DW.box
+stack_101016-2_1133_2x_SumCorr_DW.box
+stack_101016-2_1136_2x_SumCorr_DW.box
+stack_101016-2_1139_2x_SumCorr_DW.box
+stack_101016-2_1145_2x_SumCorr_DW.box
+stack_101016-2_1155_2x_SumCorr_DW.box
+stack_101016-2_1163_2x_SumCorr_DW.box
+stack_101016-2_1166_2x_SumCorr_DW.box
+stack_101016-2_1171_2x_SumCorr_DW.box
+stack_101016-2_1181_2x_SumCorr_DW.box
+stack_101016-2_1184_2x_SumCorr_DW.box
+stack_101016-2_1189_2x_SumCorr_DW.box
+stack_101016-2_1194_2x_SumCorr_DW.box
+stack_101016-2_1196_2x_SumCorr_DW.box
+stack_101016-2_1197_2x_SumCorr_DW.box
+stack_101016-2_1198_2x_SumCorr_DW.box
+stack_101016-2_1217_2x_SumCorr_DW.box
+stack_101016-2_1225_2x_SumCorr_DW.box
+stack_101016-2_1227_2x_SumCorr_DW.box
+stack_101016-2_1228_2x_SumCorr_DW.box
+stack_101016-2_1231_2x_SumCorr_DW.box
+stack_101016-2_1246_2x_SumCorr_DW.box
+stack_101016-2_1248_2x_SumCorr_DW.box
+stack_101016-2_1252_2x_SumCorr_DW.box
+stack_101016-2_1257_2x_SumCorr_DW.box
+stack_101016-2_1262_2x_SumCorr_DW.box
+stack_101016-2_1271_2x_SumCorr_DW.box
+stack_101016-2_1272_2x_SumCorr_DW.box
+stack_101016-2_1275_2x_SumCorr_DW.box
+stack_101016-2_1280_2x_SumCorr_DW.box
+stack_101016-2_1282_2x_SumCorr_DW.box
+stack_101016-2_1283_2x_SumCorr_DW.box
+stack_101016-2_1288_2x_SumCorr_DW.box
+stack_101016-2_1291_2x_SumCorr_DW.box
+stack_101016-2_1296_2x_SumCorr_DW.box
+stack_101016-2_1309_2x_SumCorr_DW.box
+stack_101016-2_1316_2x_SumCorr_DW.box
+stack_101016-2_1322_2x_SumCorr_DW.box
+stack_101016-2_1323_2x_SumCorr_DW.box
+stack_101016-2_1324_2x_SumCorr_DW.box
+stack_101016-2_1327_2x_SumCorr_DW.box
+stack_101016-2_1332_2x_SumCorr_DW.box
+stack_101016-2_1337_2x_SumCorr_DW.box
+stack_101016-2_1344_2x_SumCorr_DW.box
+stack_101016-2_1346_2x_SumCorr_DW.box
+stack_101016-2_1347_2x_SumCorr_DW.box
+stack_101016-2_1348_2x_SumCorr_DW.box
+stack_101016-2_1360_2x_SumCorr_DW.box
+stack_101016-2_1364_2x_SumCorr_DW.box
+stack_101016-2_1366_2x_SumCorr_DW.box
+stack_101016-2_1367_2x_SumCorr_DW.box
+stack_101016-2_1374_2x_SumCorr_DW.box
+stack_101016-2_1389_2x_SumCorr_DW.box
+stack_101016-2_1397_2x_SumCorr_DW.box
+stack_101016-2_1399_2x_SumCorr_DW.box
+stack_101016-2_1402_2x_SumCorr_DW.box
+stack_101016-2_1404_2x_SumCorr_DW.box
+stack_101016-2_1408_2x_SumCorr_DW.box
+stack_101016-2_1410_2x_SumCorr_DW.box
+stack_101016-2_1416_2x_SumCorr_DW.box
+stack_101016-2_1426_2x_SumCorr_DW.box
+stack_101016-2_1433_2x_SumCorr_DW.box
+stack_101016-2_1440_2x_SumCorr_DW.box
+stack_101016-2_1443_2x_SumCorr_DW.box
+stack_101016-2_1444_2x_SumCorr_DW.box
+stack_101016-2_1446_2x_SumCorr_DW.box
+stack_101016-2_1448_2x_SumCorr_DW.box
+stack_101016-2_1449_2x_SumCorr_DW.box
+stack_101016-2_1473_2x_SumCorr_DW.box
+stack_101016-2_1480_2x_SumCorr_DW.box
+stack_101016-2_1490_2x_SumCorr_DW.box
+stack_101016-2_1491_2x_SumCorr_DW.box
+stack_101016-2_1497_2x_SumCorr_DW.box
+stack_101016-2_1501_2x_SumCorr_DW.box
+stack_101016-2_1502_2x_SumCorr_DW.box
+stack_101016-2_1503_2x_SumCorr_DW.box
+stack_101016-2_1506_2x_SumCorr_DW.box
+stack_101016-2_1507_2x_SumCorr_DW.box
+stack_101016-2_1510_2x_SumCorr_DW.box
+stack_101016-2_1513_2x_SumCorr_DW.box
+stack_101016-2_1517_2x_SumCorr_DW.box
+stack_101016-2_1518_2x_SumCorr_DW.box
+stack_101016-2_1525_2x_SumCorr_DW.box
+stack_101016-2_1526_2x_SumCorr_DW.box
+stack_101016-2_1527_2x_SumCorr_DW.box
+stack_101016-2_1531_2x_SumCorr_DW.box
+stack_101016-2_1543_2x_SumCorr_DW.box
+stack_101016-2_1546_2x_SumCorr_DW.box
+stack_101016-2_1561_2x_SumCorr_DW.box
+stack_101016-2_1562_2x_SumCorr_DW.box
+stack_101016-2_1564_2x_SumCorr_DW.box
+stack_101016-2_1565_2x_SumCorr_DW.box
+stack_101016-2_1568_2x_SumCorr_DW.box
+stack_101016-2_1570_2x_SumCorr_DW.box
+stack_101016-2_1579_2x_SumCorr_DW.box
+stack_101016-2_1581_2x_SumCorr_DW.box
+stack_101016-2_1582_2x_SumCorr_DW.box
+stack_101016-2_1588_2x_SumCorr_DW.box
+stack_101016-2_1601_2x_SumCorr_DW.box
+stack_101016-2_1610_2x_SumCorr_DW.box
+stack_101016-2_1618_2x_SumCorr_DW.box
+stack_101016-2_1619_2x_SumCorr_DW.box
+stack_101016-2_1625_2x_SumCorr_DW.box
+stack_101016-2_1634_2x_SumCorr_DW.box
+stack_101016-2_1638_2x_SumCorr_DW.box
+stack_101016-2_1639_2x_SumCorr_DW.box
+stack_101016-2_1641_2x_SumCorr_DW.box
+stack_101016-2_1643_2x_SumCorr_DW.box
+stack_101016-2_1650_2x_SumCorr_DW.box
+stack_101016-2_1662_2x_SumCorr_DW.box
+stack_101016-2_1670_2x_SumCorr_DW.box
+stack_101016-2_1676_2x_SumCorr_DW.box
+stack_101016-2_1683_2x_SumCorr_DW.box
+stack_101016-2_1703_2x_SumCorr_DW.box
+stack_101016-2_1706_2x_SumCorr_DW.box
+stack_101016-2_1713_2x_SumCorr_DW.box
+stack_101016-2_1715_2x_SumCorr_DW.box
+stack_101016-2_1718_2x_SumCorr_DW.box
+stack_101016-2_1720_2x_SumCorr_DW.box
+stack_101016-2_1724_2x_SumCorr_DW.box
+stack_101016-2_1728_2x_SumCorr_DW.box
+stack_101016-2_1730_2x_SumCorr_DW.box
+stack_101016-2_1737_2x_SumCorr_DW.box
+stack_101016-2_1739_2x_SumCorr_DW.box
+stack_101016-2_1764_2x_SumCorr_DW.box
+stack_101016-2_1765_2x_SumCorr_DW.box
+stack_101016-2_1766_2x_SumCorr_DW.box
+stack_101016-2_1767_2x_SumCorr_DW.box
+stack_101016-2_1772_2x_SumCorr_DW.box
+stack_101016-2_1773_2x_SumCorr_DW.box
+stack_101016-2_1774_2x_SumCorr_DW.box
+stack_101016-2_1776_2x_SumCorr_DW.box
+stack_101016-2_1782_2x_SumCorr_DW.box
+stack_101016-2_1783_2x_SumCorr_DW.box
+stack_101016-2_1788_2x_SumCorr_DW.box
+stack_101016-2_1792_2x_SumCorr_DW.box
+stack_101016-2_1796_2x_SumCorr_DW.box
+stack_101016-2_1797_2x_SumCorr_DW.box
+stack_101016-2_1811_2x_SumCorr_DW.box
+stack_101016-2_1812_2x_SumCorr_DW.box
+stack_101016-2_1817_2x_SumCorr_DW.box
+stack_101016-2_1818_2x_SumCorr_DW.box
+stack_101016-2_1828_2x_SumCorr_DW.box
+stack_101016-2_1829_2x_SumCorr_DW.box
+stack_101016-2_1830_2x_SumCorr_DW.box
+stack_101016-2_1838_2x_SumCorr_DW.box
+stack_101016-2_1841_2x_SumCorr_DW.box
+stack_101016-2_1845_2x_SumCorr_DW.box
+stack_101016-2_1847_2x_SumCorr_DW.box
+stack_101016-2_1848_2x_SumCorr_DW.box
+stack_101016-2_1863_2x_SumCorr_DW.box
+stack_101016-2_1873_2x_SumCorr_DW.box
diff --git a/supp_data_files/supplemental_data_file_3.ods b/supp_data_files/supplemental_data_file_3.ods
deleted file mode 100644
index 97cd680058c5ab62add910f4c13bba643957ea44..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 8801
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