diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml new file mode 100644 index 0000000..801ea4c --- /dev/null +++ b/.github/workflows/gh-pages.yml @@ -0,0 +1,62 @@ +name: deploy-site + +on: pull_request + +jobs: + deploy-docs: + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v3 + + # Install dependencies + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install conda environment + uses: mamba-org/setup-micromamba@v2 + with: + environment-file: environment.yml + environment-name: selection-atlas + cache-downloads: true + + # set up google cloud + - id: auth + name: Set up Google Cloud authentication + uses: google-github-actions/auth@v2 + with: + credentials_json: ${{ secrets.GOOGLE_CREDENTIALS }} + + - name: Set up Google Cloud SDK + uses: google-github-actions/setup-gcloud@v2 + with: + version: >= 363.0.0 + + - name: Check gcloud CLI + run: gcloud info + + - name: Download build from GCS + run: | + mkdir build + gsutil -m rsync -r gs://vo_selection_atlas_dev_us_central1/build/2024-08-21/ build/ + find build -type f -exec touch {} + + find build/notebooks -type f -exec touch {} + + find build/notebooks/cohort -type f -exec touch {} + + + - name: Build sel-atlas site + uses: snakemake/snakemake-github-action@v1 + with: + directory: '.' + snakefile: 'workflow/Snakefile-site-build' + args: '--cores 1 --conda-cleanup-pkgs cache' + stagein: '' # additional preliminary commands to run (can be multiline) + show-disk-usage-on-error: true + + # Push the book's HTML to github-pages + - name: GitHub Pages action + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: docs/_build/html diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml index 086a516..acaaf02 100644 --- a/.github/workflows/test-build.yml +++ b/.github/workflows/test-build.yml @@ -25,17 +25,22 @@ jobs: key: results_cache_20230512 - name: Install conda environment - uses: mamba-org/provision-with-micromamba@main + uses: mamba-org/setup-micromamba@v2 with: environment-file: environment.yml environment-name: selection-atlas cache-downloads: true - - name: Run snakemake workflow + - name: Run analysis snakemake workflow shell: bash -l {0} run: | - snakemake -c1 --configfile ci/config.yaml + snakemake -c1 --configfile ci/config.yaml --snakefile workflow/Snakefile-analysis + - name: Run site build snakemake workflow + shell: bash -l {0} + run: | + snakemake -c1 --configfile ci/config.yaml --snakefile workflow/Snakefile-site-build + - name: Save GCS cache uses: actions/cache/save@v3 if: always() diff --git a/.gitignore b/.gitignore index de473a0..171e6c7 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ docs/genome/*.ipynb docs/cohort/*.ipynb docs/_toc.yml log +selection-atlas.html # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/README.md b/README.md index 99c85d3..3e01b2c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # selection-atlas -Here be dragons. - Development docs: - [Implementation plan](https://docs.google.com/document/d/1VvVZqIQWP8a2zH_CqTgKOp7_KotiJX8bcQ-RWfxiEj8/edit?usp=sharing) @@ -17,14 +15,14 @@ The file `requirements.yml` has the dependencies required to build the site. To To create and activate an environment on your own computer: ``` -mamba env create --force --file environment.yml -mamba activate selection-atlas +mamba env create --file environment.yml +conda activate selection-atlas ``` To create and activate an environment on datalab-bespin: ``` -mamba env create --force --prefix=${HOME}/envs/selection-atlas --file environment.yml +mamba env create --prefix=${HOME}/envs/selection-atlas --file environment.yml conda activate ${HOME}/envs/selection-atlas ``` @@ -33,21 +31,65 @@ If you need to add or upgrade a package, edit `requirements.yml`. **Do not edit To upgrade `environment.yml`: ``` -mamba env create --force --file requirements.yml +mamba env create --file requirements.yml mamba env export -f environment.yml -n selection-atlas-requirements --override-channels --channel conda-forge --channel bioconda sed -i "s/selection-atlas-requirements/selection-atlas/" environment.yml ``` -## Running the workflow +## Authenticating with Google Cloud + +With the selection-atlas environment activated: + +``` +gcloud auth login +gcloud auth application-default login +``` + + +## Running the analysis workflow + +See the file `workflow/config.yaml` for workflow configuration. If running on your local system with GCS caching enabled, you'll need to run the build without any parallelisation: ``` -snakemake -c1 +snakemake -c1 --snakefile workflow/Snakefile-analysis ``` If running on Google Cloud and GCS caching is disabled, you can try running with parallelisation, e.g.: ``` -snakemake -c4 +snakemake -c4 --snakefile workflow/Snakefile-analysis +``` + + +## Saving/restoring a successful workflow run + +After a successful workflow run, copy the workflow outputs to GCS. This will allow you or other developers to continue working to improve the site based on these outputs, without having to do a complete workflow run themselves. + +With the selection-atlas environment activated, copy workflow outputs to GCS: + +``` +gsutil -m rsync -r build/ gs://vo_selection_atlas_dev_us_central1/build/2024-08-21/ +``` + +In the above command, "2024-08-21" is a build identifier. If you make any significant changes and rerun the workflow, use a new build identifier. + +To restore outputs from a previous workflow run to your local filesystem: + +``` +rm -r build/* +gsutil -m rsync -r gs://vo_selection_atlas_dev_us_central1/build/2024-08-21/ build/ +find build -type f -exec touch {} + +find build/notebooks -type f -exec touch {} + +find build/notebooks/cohort -type f -exec touch {} + + +``` + +## Running the site-build workflow + +See the file `workflow/config.yaml` for workflow configuration. + ``` +snakemake -c1 --snakefile workflow/Snakefile-site-build +``` \ No newline at end of file diff --git a/environment.yml b/environment.yml index f81acbd..619194a 100644 --- a/environment.yml +++ b/environment.yml @@ -5,556 +5,545 @@ channels: dependencies: - _libgcc_mutex=0.1=conda_forge - _openmp_mutex=4.5=2_gnu - - accessible-pygments=0.0.4=pyhd8ed1ab_0 - - aioeasywebdav=2.4.0=pyha770c72_0 - - aiohttp=3.7.4.post0=py310h6acc77f_1 - - alabaster=0.7.13=pyhd8ed1ab_0 - - alsa-lib=1.2.8=h166bdaf_0 - - amply=0.1.5=pyhd8ed1ab_0 - - ansiwrap=0.8.4=py_0 - - anyio=3.7.0=pyhd8ed1ab_1 + - accessible-pygments=0.0.5=pyhd8ed1ab_0 + - aiohttp=3.9.5=py311h459d7ec_0 + - aiosignal=1.3.1=pyhd8ed1ab_0 + - alabaster=0.7.16=pyhd8ed1ab_0 + - alsa-lib=1.2.12=h4ab18f5_0 + - amply=0.1.6=pyhd8ed1ab_0 + - ansicolors=1.1.8=pyhd8ed1ab_0 + - anyio=4.4.0=pyhd8ed1ab_0 - appdirs=1.4.4=pyh9f0ad1d_0 - - argcomplete=3.0.8=pyhd8ed1ab_0 - - argon2-cffi=21.3.0=pyhd8ed1ab_0 - - argon2-cffi-bindings=21.2.0=py310h5764c6d_3 + - apricot-select=0.6.1=pyhd8ed1ab_0 + - argon2-cffi=23.1.0=pyhd8ed1ab_0 + - argon2-cffi-bindings=21.2.0=py311h459d7ec_4 + - argparse-dataclass=2.0.0=pyhd8ed1ab_0 + - arrow=1.3.0=pyhd8ed1ab_0 - asciitree=0.3.3=py_2 - - asteval=0.9.29=pyhd8ed1ab_0 - - asttokens=2.2.1=pyhd8ed1ab_0 - - async-lru=2.0.2=pyhd8ed1ab_0 - - async-timeout=3.0.1=py_1000 + - asteval=1.0.2=pyhd8ed1ab_0 + - asttokens=2.4.1=pyhd8ed1ab_0 + - async-lru=2.0.4=pyhd8ed1ab_0 - attmap=0.13.2=pyhd8ed1ab_0 - - attr=2.5.1=h166bdaf_1 - - attrs=21.4.0=pyhd8ed1ab_0 - - aws-c-auth=0.6.27=he072965_1 - - aws-c-cal=0.5.26=hf677bf3_1 - - aws-c-common=0.8.19=hd590300_0 - - aws-c-compression=0.2.16=hbad4bc6_7 - - aws-c-event-stream=0.2.20=hb4b372c_7 - - aws-c-http=0.7.7=h2632f9a_4 - - aws-c-io=0.13.21=h9fef7b8_5 - - aws-c-mqtt=0.8.11=h2282364_1 - - aws-c-s3=0.3.0=hcb5a9b2_2 - - aws-c-sdkutils=0.1.9=hbad4bc6_2 - - aws-checksums=0.1.14=hbad4bc6_7 - - aws-crt-cpp=0.20.2=he0fdcb3_0 - - aws-sdk-cpp=1.10.57=h059227d_13 - - babel=2.12.1=pyhd8ed1ab_1 - - backcall=0.2.0=pyh9f0ad1d_0 - - backports=1.0=pyhd8ed1ab_3 - - backports.functools_lru_cache=1.6.4=pyhd8ed1ab_0 - - bcrypt=3.2.2=py310h5764c6d_1 - - beautifulsoup4=4.12.2=pyha770c72_0 - - biopython=1.81=py310h1fa729e_0 - - black=23.3.0=py310hff52083_1 - - bleach=6.0.0=pyhd8ed1ab_0 - - blinker=1.6.2=pyhd8ed1ab_0 - - blosc=1.21.4=h0f2a231_0 - - bokeh=3.1.1=pyhd8ed1ab_0 - - boltons=23.0.0=pyhd8ed1ab_0 - - boost-cpp=1.78.0=h6582d0a_3 - - boto=2.49.0=py_0 - - boto3=1.26.144=pyhd8ed1ab_0 - - botocore=1.29.145=pyhd8ed1ab_0 - - branca=0.6.0=pyhd8ed1ab_0 - - brotli=1.0.9=h166bdaf_8 - - brotli-bin=1.0.9=h166bdaf_8 - - brotlipy=0.7.0=py310h5764c6d_1005 - - bzip2=1.0.8=h7f98852_4 - - c-ares=1.19.1=hd590300_0 - - ca-certificates=2023.5.7=hbcca054_0 + - attrs=24.2.0=pyh71513ae_0 + - aws-c-auth=0.7.25=h15d0e8c_6 + - aws-c-cal=0.7.3=h8dac057_2 + - aws-c-common=0.9.27=h4bc722e_0 + - aws-c-compression=0.2.18=h038f3f9_10 + - aws-c-event-stream=0.4.3=h570d160_0 + - aws-c-http=0.8.7=ha1f794c_4 + - aws-c-io=0.14.18=hf5b9b93_6 + - aws-c-mqtt=0.10.4=hc14a930_17 + - aws-c-s3=0.6.4=h558cea2_8 + - aws-c-sdkutils=0.1.19=h038f3f9_2 + - aws-checksums=0.1.18=h038f3f9_10 + - aws-crt-cpp=0.27.5=h6e4e78f_8 + - aws-sdk-cpp=1.11.379=hce093eb_4 + - azure-core-cpp=1.13.0=h935415a_0 + - azure-identity-cpp=1.8.0=hd126650_2 + - azure-storage-blobs-cpp=12.12.0=hd2e3451_0 + - azure-storage-common-cpp=12.7.0=h10ac4d7_1 + - azure-storage-files-datalake-cpp=12.11.0=h325d260_1 + - babel=2.14.0=pyhd8ed1ab_0 + - beautifulsoup4=4.12.3=pyha770c72_0 + - biopython=1.84=py311h331c9d8_0 + - bleach=6.1.0=pyhd8ed1ab_0 + - blinker=1.8.2=pyhd8ed1ab_0 + - blosc=1.21.6=hef167b5_0 + - bokeh=3.5.1=pyhd8ed1ab_0 + - branca=0.7.2=pyhd8ed1ab_0 + - brotli=1.1.0=hd590300_1 + - brotli-bin=1.1.0=hd590300_1 + - brotli-python=1.1.0=py311hb755f60_1 + - bzip2=1.0.8=h4bc722e_7 + - c-ares=1.33.0=ha66036c_0 + - ca-certificates=2024.7.4=hbcca054_0 - cached-property=1.5.2=hd8ed1ab_1 - cached_property=1.5.2=pyha770c72_1 - - cachetools=5.3.0=pyhd8ed1ab_0 - - cairo=1.16.0=hbbf8b49_1016 - - certifi=2023.5.7=pyhd8ed1ab_0 - - cffi=1.15.1=py310h255011f_3 - - cfitsio=4.2.0=hd9d235c_0 - - chardet=4.0.0=py310hff52083_3 - - charset-normalizer=3.1.0=pyhd8ed1ab_0 - - click=8.1.3=unix_pyhd8ed1ab_2 - - click-plugins=1.1.1=py_0 - - cligj=0.7.2=pyhd8ed1ab_1 - - cloudpickle=2.2.1=pyhd8ed1ab_0 - - coin-or-cbc=2.10.10=h9002f0b_0 + - cachetools=5.5.0=pyhd8ed1ab_0 + - cairo=1.18.0=hebfffa5_3 + - certifi=2024.7.4=pyhd8ed1ab_0 + - cffi=1.17.0=py311ha8e6434_0 + - cfitsio=4.4.1=hf8ad068_0 + - charset-normalizer=3.3.2=pyhd8ed1ab_0 + - click=8.1.7=unix_pyh707e725_0 + - cloudpickle=3.0.0=pyhd8ed1ab_0 + - coin-or-cbc=2.10.11=h56f689f_0 - coin-or-cgl=0.60.7=h516709c_0 - coin-or-clp=1.17.8=h1ee7a9c_0 - - coin-or-osi=0.108.8=ha2443b9_0 - - coin-or-utils=2.11.9=hee58242_0 - - coincbc=2.10.10=0_metapackage + - coin-or-osi=0.108.11=h6e6398e_0 + - coin-or-utils=2.11.12=h00a8a60_0 + - coincbc=2.10.11=0_metapackage - colorama=0.4.6=pyhd8ed1ab_0 - - comm=0.1.3=pyhd8ed1ab_0 - - conda=23.3.1=py310hff52083_0 - - conda-package-handling=2.0.2=pyh38be061_0 - - conda-package-streaming=0.8.0=pyhd8ed1ab_0 - - configargparse=1.5.3=pyhd8ed1ab_0 + - comm=0.2.2=pyhd8ed1ab_0 + - conda-inject=1.3.2=pyhd8ed1ab_0 + - configargparse=1.7=pyhd8ed1ab_0 - connection_pool=0.0.3=pyhd3deb0d_0 - - contourpy=1.0.7=py310hdf3cbec_0 - - crcmod=1.7=py310h5764c6d_1009 - - cryptography=41.0.0=py310h75e40e8_0 - - curl=8.1.2=h409715c_0 - - cycler=0.11.0=pyhd8ed1ab_0 - - cytoolz=0.12.0=py310h5764c6d_1 - - dask=2023.5.1=pyhd8ed1ab_0 - - dask-core=2023.5.1=pyhd8ed1ab_0 + - contourpy=1.2.1=py311h9547e67_0 + - cryptography=43.0.0=py311hc6616f6_0 + - cycler=0.12.1=pyhd8ed1ab_0 + - cytoolz=0.12.3=py311h459d7ec_0 + - dask=2024.8.1=pyhd8ed1ab_0 + - dask-core=2024.8.1=pyhd8ed1ab_0 + - dask-expr=1.1.11=pyhd8ed1ab_0 - dataclasses=0.8=pyhc8e2a94_3 - - datrie=0.8.2=py310h5764c6d_6 + - datrie=0.8.2=py311h459d7ec_7 - dbus=1.13.6=h5008d03_3 - - debugpy=1.6.7=py310heca2aa9_0 + - debugpy=1.8.5=py311hf86e51f_0 - decorator=5.1.1=pyhd8ed1ab_0 - defusedxml=0.7.1=pyhd8ed1ab_0 - - distributed=2023.5.1=pyhd8ed1ab_0 - - docutils=0.17.1=py310hff52083_3 - - dpath=2.1.6=pyha770c72_0 - - dropbox=11.36.0=pyhd8ed1ab_0 + - dill=0.3.8=pyhd8ed1ab_0 + - distributed=2024.8.1=pyhd8ed1ab_0 + - docutils=0.20.1=py311h38be061_3 + - double-conversion=3.3.0=h59595ed_0 + - dpath=2.2.0=pyha770c72_0 + - eido=0.2.2=pyhd8ed1ab_0 - entrypoints=0.4=pyhd8ed1ab_0 - - exceptiongroup=1.1.1=pyhd8ed1ab_0 - - executing=1.2.0=pyhd8ed1ab_0 - - expat=2.5.0=hcb278e6_1 + - exceptiongroup=1.2.2=pyhd8ed1ab_0 + - executing=2.0.1=pyhd8ed1ab_0 + - expat=2.6.2=h59595ed_0 - fasteners=0.17.3=pyhd8ed1ab_0 - - filechunkio=1.8=py_2 - - filelock=3.12.0=pyhd8ed1ab_0 - - fiona=1.9.4=py310h111440e_0 - - flit-core=3.9.0=pyhd8ed1ab_0 - - fmt=9.1.0=h924138e_0 - - folium=0.14.0=pyhd8ed1ab_0 + - filelock=3.15.4=pyhd8ed1ab_0 + - fmt=11.0.2=h434a139_0 + - folium=0.17.0=pyhd8ed1ab_0 - font-ttf-dejavu-sans-mono=2.37=hab24e00_0 - font-ttf-inconsolata=3.000=h77eed37_0 - font-ttf-source-code-pro=2.038=h77eed37_0 - - font-ttf-ubuntu=0.83=hab24e00_0 + - font-ttf-ubuntu=0.83=h77eed37_2 - fontconfig=2.14.2=h14ed4e7_0 - fonts-conda-ecosystem=1=0 - fonts-conda-forge=1=0 - - fonttools=4.39.4=py310h2372a71_0 - - freetype=2.12.1=hca18f0e_1 - - freexl=1.0.6=h166bdaf_1 - - fsspec=2023.5.0=pyh1a96a4e_0 - - ftputil=5.0.4=pyhd8ed1ab_0 - - future=0.18.3=pyhd8ed1ab_0 - - gcs-oauth2-boto-plugin=3.0=pyhd8ed1ab_0 - - gcsfs=2023.5.0=pyhd8ed1ab_0 - - gdal=3.7.0=py310h52aca19_1 - - geopandas=0.13.0=pyhd8ed1ab_0 - - geopandas-base=0.13.0=pyha770c72_0 - - geos=3.11.2=hcb278e6_0 - - geotiff=1.7.1=h480ec47_8 - - gettext=0.21.1=h27087fc_0 + - fonttools=4.53.1=py311h61187de_0 + - fqdn=1.5.1=pyhd8ed1ab_0 + - freetype=2.12.1=h267a509_2 + - freexl=2.0.0=h743c826_0 + - frozenlist=1.4.1=py311h459d7ec_0 + - fsspec=2024.6.1=pyhff2d567_0 + - future=1.0.0=pyhd8ed1ab_0 + - gcsfs=2024.6.1=pyhd8ed1ab_0 + - gdal=3.9.2=py311hb17e472_0 + - geopandas=1.0.1=pyhd8ed1ab_0 + - geopandas-base=1.0.1=pyha770c72_0 + - geos=3.12.2=he02047a_1 + - geotiff=1.7.3=hf7fa9e8_2 - gflags=2.2.2=he1b5a44_1004 - - giflib=5.2.1=h0b41bf4_3 - - gitdb=4.0.10=pyhd8ed1ab_0 - - gitpython=3.1.31=pyhd8ed1ab_0 - - glib=2.76.3=hfc55251_0 - - glib-tools=2.76.3=hfc55251_0 - - glog=0.6.0=h6f12383_0 - - google-api-core=2.11.0=pyhd8ed1ab_0 - - google-api-python-client=2.88.0=pyhd8ed1ab_0 - - google-apitools=0.5.32=pyhd8ed1ab_0 - - google-auth=2.19.0=pyh1a96a4e_0 - - google-auth-httplib2=0.1.0=pyhd8ed1ab_1 - - google-auth-oauthlib=1.0.0=pyhd8ed1ab_0 - - google-cloud-core=2.3.2=pyhd8ed1ab_0 - - google-cloud-storage=2.9.0=pyh1a96a4e_0 - - google-crc32c=1.1.2=py310he8fe98e_4 - - google-reauth=0.1.1=pyhd3deb0d_0 - - google-resumable-media=2.5.0=pyhd8ed1ab_0 - - googleapis-common-protos=1.57.1=pyhd8ed1ab_0 - - graphite2=1.3.13=h58526e2_1001 - - greenlet=2.0.2=py310hc6cd4ac_1 - - grpcio=1.54.2=py310heca2aa9_2 - - gst-plugins-base=1.22.3=h938bd60_1 - - gstreamer=1.22.3=h977cf35_1 - - gsutil=5.24=pyhd8ed1ab_0 - - h5py=3.8.0=nompi_py310ha66b2ad_101 - - harfbuzz=7.3.0=hdb3a94d_0 - - hdf4=4.2.15=h501b40f_6 - - hdf5=1.14.0=nompi_hb72d44e_103 - - httplib2=0.20.4=pyhd8ed1ab_0 - - humanfriendly=10.0=py310hff52083_4 - - icu=72.1=hcb278e6_0 - - idna=3.4=pyhd8ed1ab_0 + - giflib=5.2.2=hd590300_0 + - gitdb=4.0.11=pyhd8ed1ab_0 + - gitpython=3.1.43=pyhd8ed1ab_0 + - glog=0.7.1=hbabe93e_0 + - gmp=6.3.0=hac33072_2 + - gmpy2=2.1.5=py311hc4f1f91_1 + - google-api-core=2.19.1=pyhd8ed1ab_0 + - google-auth=2.33.0=pyhff2d567_0 + - google-auth-oauthlib=1.2.1=pyhd8ed1ab_0 + - google-cloud-core=2.4.1=pyhd8ed1ab_0 + - google-cloud-sdk=489.0.0=py311h38be061_0 + - google-cloud-storage=2.18.2=pyhff2d567_0 + - google-crc32c=1.1.2=py311h9b08b9c_5 + - google-resumable-media=2.7.2=pyhd8ed1ab_1 + - googleapis-common-protos=1.63.2=pyhd8ed1ab_0 + - graphite2=1.3.13=h59595ed_1003 + - greenlet=3.0.3=py311hb755f60_0 + - grpcio=1.62.2=py311ha6695c7_0 + - h11=0.14.0=pyhd8ed1ab_0 + - h2=4.1.0=pyhd8ed1ab_0 + - h5py=3.11.0=nompi_py311h439e445_102 + - harfbuzz=9.0.0=hda332d3_1 + - hdf4=4.2.15=h2a13503_7 + - hdf5=1.14.3=nompi_hdf9ad27_105 + - hpack=4.0.0=pyh9f0ad1d_0 + - httpcore=1.0.5=pyhd8ed1ab_0 + - httpx=0.27.0=pyhd8ed1ab_0 + - humanfriendly=10.0=pyhd8ed1ab_6 + - hyperframe=6.0.1=pyhd8ed1ab_0 + - icu=75.1=he02047a_0 + - idna=3.7=pyhd8ed1ab_0 - imagesize=1.4.1=pyhd8ed1ab_0 - - importlib_metadata=6.6.0=hd8ed1ab_0 - - importlib_resources=5.12.0=pyhd8ed1ab_0 + - immutables=0.20=py311h459d7ec_1 + - importlib-metadata=8.4.0=pyha770c72_0 + - importlib_metadata=8.4.0=hd8ed1ab_0 + - importlib_resources=6.4.3=pyhd8ed1ab_0 - iniconfig=2.0.0=pyhd8ed1ab_0 - - ipykernel=6.23.1=pyh210e3f2_0 - - ipyleaflet=0.17.2=pyhd8ed1ab_0 - - ipython=8.13.2=pyh41d4057_0 - - ipywidgets=8.0.6=pyhd8ed1ab_0 + - ipykernel=6.29.5=pyh3099207_0 + - ipyleaflet=0.19.2=pyhd8ed1ab_0 + - ipython=8.26.0=pyh707e725_0 + - ipywidgets=8.1.3=pyhd8ed1ab_0 - iso3166=2.1.1=pyhd8ed1ab_0 - - jedi=0.18.2=pyhd8ed1ab_0 - - jinja2=3.1.2=pyhd8ed1ab_1 - - jmespath=1.0.1=pyhd8ed1ab_0 - - joblib=1.2.0=pyhd8ed1ab_0 - - json-c=0.16=hc379101_0 - - json5=0.9.5=pyh9f0ad1d_0 - - jsonpatch=1.32=pyhd8ed1ab_0 - - jsonpointer=2.0=py_0 - - jsonschema=4.17.3=pyhd8ed1ab_0 - - jupyter-book=0.15.1=pyhd8ed1ab_0 - - jupyter-cache=0.6.1=pyhd8ed1ab_0 - - jupyter-lsp=2.2.0=pyhd8ed1ab_0 - - jupyter_client=8.2.0=pyhd8ed1ab_0 - - jupyter_core=5.3.0=py310hff52083_0 - - jupyter_events=0.6.3=pyhd8ed1ab_0 - - jupyter_server=2.6.0=pyhd8ed1ab_0 - - jupyter_server_terminals=0.4.4=pyhd8ed1ab_1 - - jupyterlab=4.0.1=pyhd8ed1ab_0 - - jupyterlab_pygments=0.2.2=pyhd8ed1ab_0 - - jupyterlab_server=2.22.1=pyhd8ed1ab_0 - - jupyterlab_widgets=3.0.7=pyhd8ed1ab_1 - - kealib=1.5.1=h3845be2_3 + - isoduration=20.11.0=pyhd8ed1ab_0 + - jedi=0.19.1=pyhd8ed1ab_0 + - jinja2=3.1.4=pyhd8ed1ab_0 + - joblib=1.4.2=pyhd8ed1ab_0 + - json-c=0.17=h1220068_1 + - json5=0.9.25=pyhd8ed1ab_0 + - jsonpointer=3.0.0=py311h38be061_0 + - jsonschema=4.23.0=pyhd8ed1ab_0 + - jsonschema-specifications=2023.12.1=pyhd8ed1ab_0 + - jsonschema-with-format-nongpl=4.23.0=hd8ed1ab_0 + - jupyter-book=1.0.2=pyhd8ed1ab_0 + - jupyter-cache=1.0.0=pyhd8ed1ab_0 + - jupyter-lsp=2.2.5=pyhd8ed1ab_0 + - jupyter_client=8.6.2=pyhd8ed1ab_0 + - jupyter_core=5.7.2=py311h38be061_0 + - jupyter_events=0.10.0=pyhd8ed1ab_0 + - jupyter_leaflet=0.19.2=pyhd8ed1ab_0 + - jupyter_server=2.14.2=pyhd8ed1ab_0 + - jupyter_server_terminals=0.5.3=pyhd8ed1ab_0 + - jupyterlab=4.2.4=pyhd8ed1ab_0 + - jupyterlab_pygments=0.3.0=pyhd8ed1ab_1 + - jupyterlab_server=2.27.3=pyhd8ed1ab_0 + - jupyterlab_widgets=3.0.11=pyhd8ed1ab_0 + - kealib=1.5.3=hee9dde6_1 - keyutils=1.6.1=h166bdaf_0 - - kiwisolver=1.4.4=py310hbf28c38_1 - - krb5=1.20.1=h81ceb04_0 - - lame=3.100=h166bdaf_1003 + - kiwisolver=1.4.5=py311h9547e67_1 + - krb5=1.21.3=h659f571_0 - latexcodec=2.0.1=pyh9f0ad1d_0 - - lcms2=2.15=haa2dc70_1 - - ld_impl_linux-64=2.40=h41732ed_0 + - lcms2=2.16=hb7c19ff_0 + - ld_impl_linux-64=2.40=hf3520f5_7 - lerc=4.0.0=h27087fc_0 - - libabseil=20230125.2=cxx17_h59595ed_2 - - libaec=1.0.6=hcb278e6_1 - - libarchive=3.6.2=h039dbb9_1 - - libarrow=12.0.0=h96638e8_5_cpu - - libblas=3.9.0=16_linux64_openblas - - libbrotlicommon=1.0.9=h166bdaf_8 - - libbrotlidec=1.0.9=h166bdaf_8 - - libbrotlienc=1.0.9=h166bdaf_8 - - libcap=2.67=he9d0100_0 - - libcblas=3.9.0=16_linux64_openblas - - libclang=15.0.7=default_h7634d5b_2 - - libclang13=15.0.7=default_h9986a30_2 + - libabseil=20240116.2=cxx17_he02047a_1 + - libaec=1.1.3=h59595ed_0 + - libarchive=3.7.4=hfca40fe_0 + - libarrow=17.0.0=h8756180_8_cpu + - libarrow-acero=17.0.0=he02047a_8_cpu + - libarrow-dataset=17.0.0=he02047a_8_cpu + - libarrow-substrait=17.0.0=hc9a23c6_8_cpu + - libblas=3.9.0=23_linux64_openblas + - libbrotlicommon=1.1.0=hd590300_1 + - libbrotlidec=1.1.0=hd590300_1 + - libbrotlienc=1.1.0=hd590300_1 + - libcblas=3.9.0=23_linux64_openblas + - libclang-cpp18.1=18.1.8=default_hf981a13_2 + - libclang13=18.1.8=default_h9def88c_2 - libcrc32c=1.1.2=h9c3ff4c_0 - - libcups=2.3.3=h36d4200_3 - - libcurl=8.1.2=h409715c_0 - - libdeflate=1.18=h0b41bf4_0 + - libcups=2.3.3=h4637d8d_4 + - libcurl=8.9.1=hdb1bdb2_0 + - libdeflate=1.21=h4bc722e_0 + - libdrm=2.4.122=h4ab18f5_0 - libedit=3.1.20191231=he28a2e2_2 - - libev=4.33=h516909a_1 - - libevent=2.1.12=h3358134_0 - - libexpat=2.5.0=hcb278e6_1 + - libev=4.33=hd590300_2 + - libevent=2.1.12=hf998b51_1 + - libexpat=2.6.2=h59595ed_0 - libffi=3.4.2=h7f98852_5 - - libflac=1.4.2=h27087fc_0 - - libgcc-ng=12.2.0=h65d4601_19 - - libgcrypt=1.10.1=h166bdaf_0 - - libgdal=3.7.0=h9f4e061_1 - - libgfortran-ng=12.2.0=h69a702a_19 - - libgfortran5=12.2.0=h337968e_19 - - libglib=2.76.3=hebfc3b9_0 - - libgomp=12.2.0=h65d4601_19 - - libgoogle-cloud=2.10.1=hac9eb74_1 - - libgpg-error=1.46=h620e276_0 - - libgrpc=1.54.2=hb20ce57_2 - - libiconv=1.17=h166bdaf_0 - - libjpeg-turbo=2.1.5.1=h0b41bf4_0 - - libkml=1.3.0=h37653c0_1015 - - liblapack=3.9.0=16_linux64_openblas - - liblapacke=3.9.0=16_linux64_openblas - - libllvm14=14.0.6=hcd5def8_2 - - libllvm15=15.0.7=h5cf9203_2 - - libmamba=1.4.2=hcea66bb_0 - - libmambapy=1.4.2=py310h1428755_0 - - libnetcdf=4.9.2=nompi_h0f3d0bb_105 - - libnghttp2=1.52.0=h61bc06f_0 - - libnsl=2.0.0=h7f98852_0 - - libnuma=2.0.16=h0b41bf4_1 - - libogg=1.3.4=h7f98852_1 - - libopenblas=0.3.21=pthreads_h78a6416_3 - - libopus=1.3.1=h7f98852_1 - - libpng=1.6.39=h753d276_0 - - libpq=15.3=hbcd7760_1 - - libprotobuf=3.21.12=h3eb15da_0 - - librttopo=1.1.0=h0d5128d_13 - - libsndfile=1.2.0=hb75c966_0 + - libgcc-ng=14.1.0=h77fa898_0 + - libgdal=3.9.2=ha770c72_0 + - libgdal-core=3.9.2=hba09cee_0 + - libgdal-fits=3.9.2=hdd6600c_0 + - libgdal-grib=3.9.2=h5f34788_0 + - libgdal-hdf4=3.9.2=ha39a594_0 + - libgdal-hdf5=3.9.2=ha2ed5f0_0 + - libgdal-jp2openjpeg=3.9.2=h2ebfdf0_0 + - libgdal-kea=3.9.2=h2b45729_0 + - libgdal-netcdf=3.9.2=h94e7027_0 + - libgdal-pdf=3.9.2=h0fa2cb4_0 + - libgdal-pg=3.9.2=he047751_0 + - libgdal-postgisraster=3.9.2=he047751_0 + - libgdal-tiledb=3.9.2=h9d8aadb_0 + - libgdal-xls=3.9.2=h062f1c4_0 + - libgfortran-ng=14.1.0=h69a702a_0 + - libgfortran5=14.1.0=hc5f4f2c_0 + - libglib=2.80.3=h315aac3_2 + - libgomp=14.1.0=h77fa898_0 + - libgoogle-cloud=2.28.0=h26d7fe4_0 + - libgoogle-cloud-storage=2.28.0=ha262f82_0 + - libgrpc=1.62.2=h15f2491_0 + - libiconv=1.17=hd590300_2 + - libjpeg-turbo=3.0.0=hd590300_1 + - libkml=1.3.0=hbbc8833_1020 + - liblapack=3.9.0=23_linux64_openblas + - liblapacke=3.9.0=23_linux64_openblas + - libllvm14=14.0.6=hcd5def8_4 + - libllvm18=18.1.8=h8b73ec9_2 + - libnetcdf=4.9.2=nompi_h135f659_114 + - libnghttp2=1.58.0=h47da74e_1 + - libnsl=2.0.1=hd590300_0 + - libopenblas=0.3.27=pthreads_hac2b453_1 + - libparquet=17.0.0=haa1307c_8_cpu + - libpciaccess=0.18=hd590300_0 + - libpng=1.6.43=h2797004_0 + - libpq=16.4=h482b261_0 + - libprotobuf=4.25.3=h08a7969_0 + - libre2-11=2023.09.01=h5a48ba9_2 + - librttopo=1.1.0=hc670b87_16 - libsodium=1.0.18=h36c2ea0_1 - - libsolv=0.7.23=h3eb15da_0 - - libspatialindex=1.9.3=h9c3ff4c_4 - - libspatialite=5.0.1=hb46c372_26 - - libsqlite=3.42.0=h2797004_0 - - libssh2=1.10.0=hf14f497_3 - - libstdcxx-ng=12.2.0=h46fd767_19 - - libsystemd0=253=h8c4010b_1 - - libthrift=0.18.1=h8fd135c_1 - - libtiff=4.5.0=ha587672_6 + - libspatialite=5.1.0=h15fa968_9 + - libsqlite=3.46.0=hde9e2c9_0 + - libssh2=1.11.0=h0841786_0 + - libstdcxx-ng=14.1.0=hc0a3c3a_0 + - libthrift=0.20.0=hb90f79a_0 + - libtiff=4.6.0=h46a8edc_4 + - libtorch=2.3.1=cpu_generic_h970db74_0 - libutf8proc=2.8.0=h166bdaf_0 - libuuid=2.38.1=h0b41bf4_0 - - libvorbis=1.3.7=h9c3ff4c_0 - - libwebp-base=1.3.0=h0b41bf4_0 - - libxcb=1.15=h0b41bf4_0 - - libxkbcommon=1.5.0=h5d7e998_3 - - libxml2=2.11.4=h0d562d8_0 - - libzip=1.9.2=hc929e4a_1 - - libzlib=1.2.13=h166bdaf_4 - - linkify-it-py=2.0.0=pyhd8ed1ab_0 - - llvmlite=0.40.0=py310h1b8f574_0 - - lmfit=1.2.1=pyhd8ed1ab_0 + - libuv=1.48.0=hd590300_0 + - libwebp-base=1.4.0=hd590300_0 + - libxcb=1.16=hd590300_0 + - libxcrypt=4.4.36=hd590300_1 + - libxkbcommon=1.7.0=h2c5496b_1 + - libxml2=2.12.7=he7c6b58_4 + - libxslt=1.1.39=h76b75d6_0 + - libzip=1.10.1=h2629f0a_3 + - libzlib=1.3.1=h4ab18f5_1 + - linkify-it-py=2.0.3=pyhd8ed1ab_0 + - llvmlite=0.43.0=py311hbde99c3_0 + - lmfit=1.3.2=pyhd8ed1ab_0 - locket=1.0.0=pyhd8ed1ab_0 - logmuse=0.2.6=pyh8c360ce_0 - - lz4=4.3.2=py310h0cfdcf0_0 + - lz4=4.3.3=py311h38e4bf4_0 - lz4-c=1.9.4=hcb278e6_0 - - lzo=2.10=h516909a_1000 - - mamba=1.4.2=py310h51d5547_0 - - mapclassify=2.5.0=pyhd8ed1ab_1 - - markdown-it-py=2.2.0=pyhd8ed1ab_0 - - markupsafe=2.1.2=py310h1fa729e_0 - - matplotlib=3.7.1=py310hff52083_0 - - matplotlib-base=3.7.1=py310he60537e_0 - - matplotlib-inline=0.1.6=pyhd8ed1ab_0 - - mdit-py-plugins=0.3.5=pyhd8ed1ab_0 - - mdurl=0.1.0=pyhd8ed1ab_0 - - mistune=2.0.5=pyhd8ed1ab_0 - - monotonic=1.5=py_0 - - mpg123=1.31.3=hcb278e6_0 - - msgpack-python=1.0.5=py310hdf3cbec_0 - - multidict=6.0.4=py310h1fa729e_0 - - munch=3.0.0=pyhd8ed1ab_0 + - lzo=2.10=hd590300_1001 + - mapclassify=2.8.0=pyhd8ed1ab_0 + - markdown-it-py=3.0.0=pyhd8ed1ab_0 + - markupsafe=2.1.5=py311h459d7ec_0 + - matplotlib=3.9.2=py311h38be061_0 + - matplotlib-base=3.9.2=py311h74b4f7c_0 + - matplotlib-inline=0.1.7=pyhd8ed1ab_0 + - mdit-py-plugins=0.4.1=pyhd8ed1ab_0 + - mdurl=0.1.2=pyhd8ed1ab_0 + - minizip=4.0.7=h401b404_0 + - mistune=3.0.2=pyhd8ed1ab_0 + - mpc=1.3.1=hfe3b2da_0 + - mpfr=4.2.1=h38ae2d0_2 + - mpmath=1.3.0=pyhd8ed1ab_0 + - msgpack-python=1.0.8=py311h52f7536_0 + - multidict=6.0.5=py311h459d7ec_0 - munkres=1.1.4=pyh9f0ad1d_0 - - mypy_extensions=1.0.0=pyha770c72_0 - - mysql-common=8.0.32=hf1915f5_2 - - mysql-libs=8.0.32=hca2cd23_2 - - myst-nb=0.17.2=pyhd8ed1ab_0 - - myst-parser=0.18.1=pyhd8ed1ab_0 - - nbclient=0.7.4=pyhd8ed1ab_0 - - nbconvert-core=7.4.0=pyhd8ed1ab_0 - - nbformat=5.9.0=pyhd8ed1ab_0 - - ncurses=6.3=h27087fc_1 - - nest-asyncio=1.5.6=pyhd8ed1ab_0 - - networkx=3.1=pyhd8ed1ab_0 + - mysql-common=8.3.0=h70512c7_5 + - mysql-libs=8.3.0=ha479ceb_5 + - myst-nb=1.1.1=pyhd8ed1ab_0 + - myst-parser=2.0.0=pyhd8ed1ab_0 + - nbclient=0.10.0=pyhd8ed1ab_0 + - nbconvert-core=7.16.4=pyhd8ed1ab_1 + - nbformat=5.10.4=pyhd8ed1ab_0 + - ncurses=6.5=h59595ed_0 + - nest-asyncio=1.6.0=pyhd8ed1ab_0 + - networkx=3.3=pyhd8ed1ab_1 - nomkl=1.0=h5ca1d4c_0 - - notebook-shim=0.2.3=pyhd8ed1ab_0 + - nose=1.3.7=py_1006 + - notebook-shim=0.2.4=pyhd8ed1ab_0 - nspr=4.35=h27087fc_0 - - nss=3.89=he45b914_0 - - numba=0.57.0=py310h0f6aa51_1 - - numcodecs=0.11.0=py310heca2aa9_1 - - numexpr=2.8.4=py310h690d005_100 - - numpy=1.24.3=py310ha4c1d20_0 - - oauth2client=4.1.3=py_0 + - nss=3.103=h593d115_0 + - numba=0.60.0=py311h4bc866e_0 + - numcodecs=0.13.0=py311h044e617_0 + - numexpr=2.10.0=py311h8d05612_100 - oauthlib=3.2.2=pyhd8ed1ab_0 - - openjpeg=2.5.0=hfec8fc6_2 - - openssl=3.1.1=hd590300_1 - - orc=1.8.3=hfdbbad2_0 - - overrides=7.3.1=pyhd8ed1ab_0 - - packaging=23.1=pyhd8ed1ab_0 - - pandas=2.0.2=py310h7cbd5c2_0 + - openjpeg=2.5.2=h488ebb8_0 + - openssl=3.3.1=h4bc722e_2 + - orc=2.0.2=h669347b_0 + - overrides=7.7.0=pyhd8ed1ab_0 + - packaging=24.1=pyhd8ed1ab_0 + - pandas=2.2.2=py311h14de704_1 - pandocfilters=1.5.0=pyhd8ed1ab_0 - - papermill=2.3.4=pyhd8ed1ab_0 - - paramiko=3.2.0=pyhd8ed1ab_0 - - parso=0.8.3=pyhd8ed1ab_0 - - partd=1.4.0=pyhd8ed1ab_0 - - pathspec=0.11.1=pyhd8ed1ab_0 - - patsy=0.5.3=pyhd8ed1ab_0 - - pcre2=10.40=hc3806b6_0 - - peppy=0.35.5=pyhd8ed1ab_0 - - pexpect=4.8.0=pyh1a96a4e_2 + - papermill=2.6.0=pyhd8ed1ab_0 + - parso=0.8.4=pyhd8ed1ab_0 + - partd=1.4.2=pyhd8ed1ab_0 + - patsy=0.5.6=pyhd8ed1ab_0 + - pcre2=10.44=hba22ea6_2 + - peppy=0.40.5=pyhd8ed1ab_0 + - pexpect=4.9.0=pyhd8ed1ab_0 - pickleshare=0.7.5=py_1003 - - pillow=9.5.0=py310h582fbeb_1 - - pip=23.1.2=pyhd8ed1ab_0 - - pixman=0.40.0=h36c2ea0_0 - - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_0 - - plac=1.3.5=pyhd8ed1ab_0 - - platformdirs=3.5.1=pyhd8ed1ab_0 - - plotly=5.14.1=pyhd8ed1ab_0 - - pluggy=1.0.0=pyhd8ed1ab_5 - - ply=3.11=py_1 - - pomegranate=0.14.8=py310hc4a4660_0 - - pooch=1.7.0=pyha770c72_3 - - poppler=23.05.0=hd18248d_1 + - pillow=10.4.0=py311h82a398c_0 + - pip=24.2=pyhd8ed1ab_0 + - pixman=0.43.2=h59595ed_0 + - pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1 + - plac=1.4.3=pyhd8ed1ab_0 + - platformdirs=4.2.2=pyhd8ed1ab_0 + - plotly=5.23.0=pyhd8ed1ab_0 + - pluggy=1.5.0=pyhd8ed1ab_0 + - pomegranate=1.0.0=pyhd8ed1ab_1 + - poppler=24.08.0=hb0d391f_0 - poppler-data=0.4.12=hd8ed1ab_0 - - postgresql=15.3=hd458b1d_1 - - prettytable=3.7.0=pyhd8ed1ab_0 - - proj=9.2.0=h8ffa02c_0 - - prometheus_client=0.17.0=pyhd8ed1ab_0 - - prompt-toolkit=3.0.38=pyha770c72_0 - - prompt_toolkit=3.0.38=hd8ed1ab_0 - - protobuf=4.21.12=py310heca2aa9_0 - - psutil=5.9.5=py310h1fa729e_0 + - postgresql=16.4=ha8faf9a_0 + - proj=9.4.1=h54d7996_1 + - prometheus_client=0.20.0=pyhd8ed1ab_0 + - prompt-toolkit=3.0.47=pyha770c72_0 + - proto-plus=1.23.0=pyhd8ed1ab_0 + - protobuf=4.25.3=py311h7b78aeb_0 + - psutil=6.0.0=py311h331c9d8_0 - pthread-stubs=0.4=h36c2ea0_1001 - ptyprocess=0.7.0=pyhd3deb0d_0 - - pulp=2.7.0=py310hff52083_0 - - pulseaudio-client=16.1=hb77b528_4 - - pure_eval=0.2.2=pyhd8ed1ab_0 - - pyarrow=12.0.0=py310he6bfd7f_5_cpu - - pyasn1=0.4.8=py_0 - - pyasn1-modules=0.2.7=py_0 - - pybind11-abi=4=hd8ed1ab_3 + - pulp=2.8.0=py311h38be061_0 + - pure_eval=0.2.3=pyhd8ed1ab_0 + - pyarrow=17.0.0=py311hbd00459_1 + - pyarrow-core=17.0.0=py311h4510849_1_cpu + - pyarrow-hotfix=0.6=pyhd8ed1ab_0 + - pyasn1=0.6.0=pyhd8ed1ab_0 + - pyasn1-modules=0.4.0=pyhd8ed1ab_0 - pybtex=0.24.0=pyhd8ed1ab_2 - - pybtex-docutils=1.0.2=py310hff52083_2 - - pycosat=0.6.4=py310h5764c6d_1 - - pycparser=2.21=pyhd8ed1ab_0 - - pydata-sphinx-theme=0.13.3=pyhd8ed1ab_0 - - pygments=2.15.1=pyhd8ed1ab_0 - - pyjwt=2.7.0=pyhd8ed1ab_0 - - pynacl=1.5.0=py310h5764c6d_2 - - pyopenssl=23.2.0=pyhd8ed1ab_1 - - pyparsing=3.0.9=pyhd8ed1ab_0 - - pyproj=3.5.0=py310hb814896_1 + - pybtex-docutils=1.0.3=py311h38be061_1 + - pycparser=2.22=pyhd8ed1ab_0 + - pydata-sphinx-theme=0.15.4=pyhd8ed1ab_0 + - pygments=2.18.0=pyhd8ed1ab_0 + - pyjwt=2.9.0=pyhd8ed1ab_1 + - pyogrio=0.9.0=py311hfc743a8_0 + - pyopenssl=24.2.1=pyhd8ed1ab_2 + - pyparsing=3.1.2=pyhd8ed1ab_0 + - pyproj=3.6.1=py311ha1c4eca_8 - pyprojroot=0.3.0=pyhd8ed1ab_0 - - pyqt=5.15.7=py310hab646b1_3 - - pyqt5-sip=12.11.0=py310heca2aa9_3 - - pyrsistent=0.19.3=py310h1fa729e_0 - - pysftp=0.2.9=py_1 + - pyside6=6.7.2=py311hba19f1e_2 - pysocks=1.7.1=pyha2e5f31_6 - - pytest=7.3.1=pyhd8ed1ab_0 - - python=3.10.11=he550d4f_0_cpython - - python-dateutil=2.8.2=pyhd8ed1ab_0 - - python-fastjsonschema=2.17.1=pyhd8ed1ab_0 - - python-irodsclient=1.1.8=pyhd8ed1ab_0 + - pytest=8.3.2=pyhd8ed1ab_0 + - python=3.11.9=hb806964_0_cpython + - python-dateutil=2.9.0=pyhd8ed1ab_0 + - python-fastjsonschema=2.20.0=pyhd8ed1ab_0 - python-json-logger=2.0.7=pyhd8ed1ab_0 - - python-tzdata=2023.3=pyhd8ed1ab_0 - - python_abi=3.10=3_cp310 - - pytz=2023.3=pyhd8ed1ab_0 + - python-tzdata=2024.1=pyhd8ed1ab_0 + - python_abi=3.11=5_cp311 + - pytorch=2.3.1=cpu_generic_py311h8ca351a_0 + - pytz=2024.1=pyhd8ed1ab_0 - pyu2f=0.1.5=pyhd8ed1ab_0 - - pyyaml=6.0=py310h5764c6d_5 - - pyzmq=25.1.0=py310h5bbb5d0_0 - - qt-main=5.15.8=h01ceb2d_13 - - rdma-core=28.9=h59595ed_1 - - re2=2023.03.02=h8c504da_0 + - pyyaml=6.0.2=py311h61187de_0 + - pyzmq=26.1.1=py311h759c1eb_0 + - qhull=2020.2=h434a139_5 + - qt6-main=6.7.2=hb12f9c5_4 + - re2=2023.09.01=h7f4b329_2 - readline=8.2=h8228510_1 - - reproc=14.2.4=h0b41bf4_0 - - reproc-cpp=14.2.4=hcb278e6_0 - - requests=2.31.0=pyhd8ed1ab_0 - - requests-oauthlib=1.3.1=pyhd8ed1ab_0 + - referencing=0.35.1=pyhd8ed1ab_0 + - requests=2.32.3=pyhd8ed1ab_0 + - requests-oauthlib=2.0.0=pyhd8ed1ab_0 - reretry=0.11.8=pyhd8ed1ab_0 - - retry_decorator=1.1.1=pyh9f0ad1d_0 - rfc3339-validator=0.1.4=pyhd8ed1ab_0 - rfc3986-validator=0.1.1=pyh9f0ad1d_0 - - rich=13.4.1=pyhd8ed1ab_0 + - rich=13.7.1=pyhd8ed1ab_0 + - rpds-py=0.20.0=py311hb3a8bbb_0 - rsa=4.9=pyhd8ed1ab_0 - - rtree=1.0.1=py310hbdcdc62_1 - - ruamel.yaml=0.17.31=py310h2372a71_0 - - ruamel.yaml.clib=0.2.7=py310h1fa729e_1 - - s2n=1.3.44=h06160fa_0 - - s3transfer=0.6.1=pyhd8ed1ab_0 - - scikit-allel=1.3.5=py310hb5077e9_1 - - scikit-learn=1.2.2=py310hf7d194e_2 - - scipy=1.10.1=py310ha4c1d20_3 - - seaborn=0.12.2=hd8ed1ab_0 - - seaborn-base=0.12.2=pyhd8ed1ab_0 - - send2trash=1.8.2=pyh41d4057_0 - - setuptools=67.7.2=pyhd8ed1ab_0 - - setuptools-scm=7.1.0=pyhd8ed1ab_0 - - shapely=2.0.1=py310h056c13c_1 - - sip=6.7.9=py310hc6cd4ac_0 + - s2n=1.5.1=h3400bea_0 + - scikit-allel=1.3.8=py311h14de704_2 + - scikit-learn=1.5.1=py311hd632256_0 + - scipy=1.14.0=py311h0a5b728_2 + - seaborn=0.13.2=hd8ed1ab_2 + - seaborn-base=0.13.2=pyhd8ed1ab_2 + - send2trash=1.8.3=pyh0d859eb_0 + - setuptools=72.2.0=pyhd8ed1ab_0 + - setuptools-scm=8.1.0=pyhd8ed1ab_0 + - shapely=2.0.6=py311h5925939_0 - six=1.16.0=pyh6c4a22f_0 - - slacker=0.14.0=py_0 - - smart_open=6.3.0=pyhd8ed1ab_1 - - smmap=3.0.5=pyh44b312d_0 - - snakemake=7.26.0=hdfd78af_0 - - snakemake-minimal=7.26.0=pyhdfd78af_0 - - snappy=1.1.10=h9fff704_0 - - sniffio=1.3.0=pyhd8ed1ab_0 + - slack-sdk=3.31.0=pyha770c72_0 + - slack_sdk=3.31.0=hd8ed1ab_0 + - sleef=3.6.1=h3400bea_1 + - smart_open=7.0.4=pyhd8ed1ab_0 + - smmap=5.0.0=pyhd8ed1ab_0 + - snakemake=8.18.2=hdfd78af_0 + - snakemake-interface-common=1.17.3=pyhdfd78af_0 + - snakemake-interface-executor-plugins=9.2.0=pyhdfd78af_0 + - snakemake-interface-report-plugins=1.0.0=pyhdfd78af_0 + - snakemake-interface-storage-plugins=3.3.0=pyhdfd78af_0 + - snakemake-minimal=8.18.2=pyhdfd78af_0 + - snappy=1.2.1=ha2e4443_0 + - sniffio=1.3.1=pyhd8ed1ab_0 - snowballstemmer=2.2.0=pyhd8ed1ab_0 - - socksipy-branch=1.01=pyh9f0ad1d_0 - sortedcontainers=2.4.0=pyhd8ed1ab_0 - - soupsieve=2.3.2.post1=pyhd8ed1ab_0 - - sphinx=4.5.0=pyh6c4a22f_0 - - sphinx-book-theme=1.0.1=pyhd8ed1ab_0 + - soupsieve=2.5=pyhd8ed1ab_1 + - spdlog=1.14.1=hed91bc2_1 + - sphinx=7.4.7=pyhd8ed1ab_0 + - sphinx-book-theme=1.1.3=pyhd8ed1ab_0 - sphinx-comments=0.0.3=pyh9f0ad1d_0 - sphinx-copybutton=0.5.2=pyhd8ed1ab_0 - - sphinx-design=0.3.0=pyhd8ed1ab_0 - - sphinx-external-toc=0.3.1=pyhd8ed1ab_0 - - sphinx-jupyterbook-latex=0.5.2=pyhd8ed1ab_0 + - sphinx-design=0.6.1=pyhd8ed1ab_0 + - sphinx-external-toc=1.0.1=pyhd8ed1ab_0 + - sphinx-jupyterbook-latex=1.0.0=pyhd8ed1ab_0 - sphinx-multitoc-numbering=0.1.3=pyhd8ed1ab_0 - - sphinx-thebe=0.2.1=pyhd8ed1ab_0 + - sphinx-thebe=0.3.1=pyhd8ed1ab_0 - sphinx-togglebutton=0.3.2=pyhd8ed1ab_0 - - sphinxcontrib-applehelp=1.0.4=pyhd8ed1ab_0 - - sphinxcontrib-bibtex=2.5.0=pyhd8ed1ab_0 - - sphinxcontrib-devhelp=1.0.2=py_0 - - sphinxcontrib-htmlhelp=2.0.1=pyhd8ed1ab_0 - - sphinxcontrib-jsmath=1.0.1=py_0 - - sphinxcontrib-qthelp=1.0.3=py_0 - - sphinxcontrib-serializinghtml=1.1.5=pyhd8ed1ab_2 - - sqlalchemy=2.0.15=py310h2372a71_0 - - sqlite=3.42.0=h2c6b66d_0 + - sphinxcontrib-applehelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-bibtex=2.6.2=pyhd8ed1ab_0 + - sphinxcontrib-devhelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-htmlhelp=2.1.0=pyhd8ed1ab_0 + - sphinxcontrib-jsmath=1.0.1=pyhd8ed1ab_0 + - sphinxcontrib-qthelp=2.0.0=pyhd8ed1ab_0 + - sphinxcontrib-serializinghtml=1.1.10=pyhd8ed1ab_0 + - sqlalchemy=2.0.32=py311h61187de_0 + - sqlite=3.46.0=h6d4b2fc_0 - stack_data=0.6.2=pyhd8ed1ab_0 - - statsmodels=0.14.0=py310h278f3c1_1 - - stone=3.3.1=pyhd8ed1ab_0 + - statsmodels=0.14.2=py311h18e1886_0 - stopit=1.1.2=py_0 + - sympy=1.13.2=pypyh2585a3b_103 - tabulate=0.9.0=pyhd8ed1ab_1 - - tblib=1.7.0=pyhd8ed1ab_0 - - tenacity=8.2.2=pyhd8ed1ab_0 - - terminado=0.17.1=pyh41d4057_0 - - textwrap3=0.9.2=py_0 - - threadpoolctl=3.1.0=pyh8a188c0_0 - - throttler=1.2.1=pyhd8ed1ab_0 - - tiledb=2.13.2=hd532e3d_0 - - tinycss2=1.2.1=pyhd8ed1ab_0 - - tk=8.6.12=h27826a3_0 - - toml=0.10.2=pyhd8ed1ab_0 + - tblib=3.0.0=pyhd8ed1ab_0 + - tenacity=9.0.0=pyhd8ed1ab_0 + - terminado=0.18.1=pyh0d859eb_0 + - threadpoolctl=3.5.0=pyhc1e730c_0 + - throttler=1.2.2=pyhd8ed1ab_0 + - tiledb=2.25.0=h213c483_7 + - tinycss2=1.3.0=pyhd8ed1ab_0 + - tk=8.6.13=noxft_h4845f30_101 - tomli=2.0.1=pyhd8ed1ab_0 - - toolz=0.12.0=pyhd8ed1ab_0 + - toolz=0.12.1=pyhd8ed1ab_0 - toposort=1.10=pyhd8ed1ab_0 - - tornado=6.3.2=py310h2372a71_0 - - tqdm=4.65.0=pyhd8ed1ab_1 - - traitlets=5.9.0=pyhd8ed1ab_0 + - tornado=6.4.1=py311h331c9d8_0 + - tqdm=4.66.5=pyhd8ed1ab_0 + - traitlets=5.14.3=pyhd8ed1ab_0 - traittypes=0.2.1=pyh9f0ad1d_2 - - typing-extensions=4.6.2=hd8ed1ab_0 - - typing_extensions=4.6.2=pyha770c72_0 + - types-python-dateutil=2.9.0.20240821=pyhd8ed1ab_0 + - typing-extensions=4.12.2=hd8ed1ab_0 + - typing_extensions=4.12.2=pyha770c72_0 - typing_utils=0.1.0=pyhd8ed1ab_0 - - tzcode=2023c=h0b41bf4_0 - - tzdata=2023c=h71feb2d_0 - - ubiquerg=0.6.2=pyhd8ed1ab_0 - - uc-micro-py=1.0.1=pyhd8ed1ab_0 - - ucx=1.14.1=hf587318_2 - - uncertainties=3.1.7=pyhd8ed1ab_0 - - unicodedata2=15.0.0=py310h5764c6d_0 - - uritemplate=4.1.1=pyhd8ed1ab_0 - - urllib3=1.26.15=pyhd8ed1ab_0 + - tzcode=2024a=h3f72095_0 + - tzdata=2024a=h0c530f3_0 + - ubiquerg=0.8.0=pyhd8ed1ab_0 + - uc-micro-py=1.0.3=pyhd8ed1ab_0 + - uncertainties=3.2.2=pyhd8ed1ab_1 + - uri-template=1.3.0=pyhd8ed1ab_0 + - uriparser=0.9.8=hac33072_0 + - urllib3=2.2.2=pyhd8ed1ab_1 - veracitools=0.1.3=py_0 - - wcwidth=0.2.6=pyhd8ed1ab_0 - - webencodings=0.5.1=py_1 - - websocket-client=1.5.2=pyhd8ed1ab_0 - - wheel=0.40.0=pyhd8ed1ab_0 - - widgetsnbextension=4.0.7=pyhd8ed1ab_0 - - wrapt=1.15.0=py310h1fa729e_0 - - xarray=2023.5.0=pyhd8ed1ab_0 - - xcb-util=0.4.0=hd590300_1 - - xcb-util-image=0.4.0=h8ee46fc_1 - - xcb-util-keysyms=0.4.0=h8ee46fc_1 - - xcb-util-renderutil=0.3.9=hd590300_1 - - xcb-util-wm=0.4.1=h8ee46fc_1 - - xerces-c=3.2.4=h8d71039_2 - - xkeyboard-config=2.38=h0b41bf4_0 + - wayland=1.23.0=h5291e77_0 + - wcwidth=0.2.13=pyhd8ed1ab_0 + - webcolors=24.8.0=pyhd8ed1ab_0 + - webencodings=0.5.1=pyhd8ed1ab_2 + - websocket-client=1.8.0=pyhd8ed1ab_0 + - wheel=0.44.0=pyhd8ed1ab_0 + - widgetsnbextension=4.0.11=pyhd8ed1ab_0 + - wrapt=1.16.0=py311h459d7ec_0 + - xarray=2024.7.0=pyhd8ed1ab_0 + - xcb-util=0.4.1=hb711507_2 + - xcb-util-cursor=0.1.4=h4ab18f5_2 + - xcb-util-image=0.4.0=hb711507_2 + - xcb-util-keysyms=0.4.1=hb711507_0 + - xcb-util-renderutil=0.3.10=hb711507_0 + - xcb-util-wm=0.4.2=hb711507_0 + - xerces-c=3.2.5=h666cd97_1 + - xkeyboard-config=2.42=h4ab18f5_0 - xorg-kbproto=1.0.7=h7f98852_1002 - xorg-libice=1.1.1=hd590300_0 - xorg-libsm=1.2.4=h7391055_0 - - xorg-libx11=1.8.4=h8ee46fc_1 + - xorg-libx11=1.8.9=hb711507_1 - xorg-libxau=1.0.11=hd590300_0 - xorg-libxdmcp=1.1.3=h7f98852_0 - xorg-libxext=1.3.4=h0b41bf4_2 - - xorg-libxrender=0.9.10=h7f98852_1003 + - xorg-libxrender=0.9.11=hd590300_0 - xorg-renderproto=0.11.1=h7f98852_1002 - xorg-xextproto=7.3.0=h0b41bf4_1003 - - xorg-xf86vidmodeproto=2.3.1=h7f98852_1002 - xorg-xproto=7.0.31=h7f98852_1007 - - xyzservices=2023.5.0=pyhd8ed1ab_1 + - xyzservices=2024.6.0=pyhd8ed1ab_0 - xz=5.2.6=h166bdaf_0 - yaml=0.2.5=h7f98852_2 - - yaml-cpp=0.7.0=h27087fc_2 - - yarl=1.9.2=py310h2372a71_0 - - yte=1.5.1=pyha770c72_2 - - zarr=2.14.2=pyhd8ed1ab_0 - - zeromq=4.3.4=h9c3ff4c_1 + - yarl=1.9.4=py311h459d7ec_0 + - yte=1.5.4=pyha770c72_0 + - zarr=2.18.2=pyhd8ed1ab_0 + - zeromq=4.3.5=h75354e8_4 - zict=3.0.0=pyhd8ed1ab_0 - - zipp=3.15.0=pyhd8ed1ab_0 - - zlib=1.2.13=h166bdaf_4 - - zstandard=0.19.0=py310hdeb6495_1 - - zstd=1.5.2=h3eb15da_6 + - zipp=3.20.0=pyhd8ed1ab_0 + - zlib=1.3.1=h4ab18f5_1 + - zstandard=0.23.0=py311h5cd10c7_0 + - zstd=1.5.6=ha6fb4c9_0 - pip: - - ansi2html==1.8.0 - - dash==2.10.2 + - biotite==0.41.2 + - dash==2.17.1 - dash-core-components==2.0.0 - - dash-cytoscape==0.3.0 + - dash-cytoscape==1.0.2 - dash-html-components==2.0.0 - dash-table==5.0.0 - - flask==2.2.5 + - flask==3.0.3 - igv-notebook==0.5.2 - - importlib-metadata==4.13.0 - - ipinfo==4.4.2 - - itsdangerous==2.1.2 - - jupyter-dash==0.4.2 - - malariagen-data==7.10.0 - - numpydoc-decorator==2.1.0 - - orjson==3.9.0 - - protopunica==0.14.8 + - ipinfo==5.0.1 + - itsdangerous==2.2.0 + - malariagen-data==12.0.0 + - numpy==1.26.4 + - numpydoc-decorator==2.2.0 + - orjson==3.10.7 + - protopunica==0.14.8.post1 - retrying==1.3.4 - - typeguard==4.0.0 - - werkzeug==2.2.3 -prefix: /home/aliman/mambaforge/envs/selection-atlas + - termcolor==2.3.0 + - typeguard==4.3.0 + - werkzeug==3.0.3 + - yaspin==3.0.2 +prefix: /opt/conda/envs/selection-atlas diff --git a/requirements.yml b/requirements.yml index c069277..7cd48ed 100644 --- a/requirements.yml +++ b/requirements.yml @@ -3,7 +3,7 @@ channels: - conda-forge - bioconda dependencies: - - python=3.10 + - python=3.11 - numpy - snakemake - papermill @@ -15,11 +15,11 @@ dependencies: - fsspec - gcsfs - jupyterlab - - jupyter-book==0.15.1 + - jupyter-book - BioPython - - gsutil + - google-cloud-sdk - scikit-allel - - bokeh>=3.1 + - bokeh - statsmodels - ipyleaflet - tqdm @@ -34,4 +34,4 @@ dependencies: - pip - pip: - jsonschema>=3.1.0 - - malariagen_data>=7.10.0 + - malariagen_data diff --git a/workflow/Snakefile b/workflow/Snakefile-analysis similarity index 69% rename from workflow/Snakefile rename to workflow/Snakefile-analysis index 2bca9fc..be26cf7 100644 --- a/workflow/Snakefile +++ b/workflow/Snakefile-analysis @@ -10,12 +10,9 @@ chromosomes = config['contigs'] # include rule files include: "rules/common.smk" include: "rules/cohorts.smk" -include: "rules/site.smk" include: "rules/gwss.smk" include: "rules/utility.smk" rule all: input: - analyses = get_selection_atlas_outputs, - site = get_selection_atlas_site_pages, - build = "docs/_build/" + analyses = get_selection_atlas_outputs \ No newline at end of file diff --git a/workflow/Snakefile-site-build b/workflow/Snakefile-site-build new file mode 100644 index 0000000..5010cc3 --- /dev/null +++ b/workflow/Snakefile-site-build @@ -0,0 +1,41 @@ +import pandas as pd +import geopandas as gpd +import yaml + +# open configuration file +configfile: "workflow/config.yaml" +configpath = workflow.configfiles[0] +chromosomes = config['contigs'] + +# we dont use checkpoints in the site workflow, so need separate functions to the other workflow +def get_selection_atlas_site_pages(wildcards): + df = gpd.read_file("build/final_cohorts.geojson") + + wanted_outputs = [] + wanted_outputs.extend(["docs/home-page.ipynb"]) + wanted_outputs.extend( + expand("docs/country/{country}.ipynb", country=df['country_alpha2']) + ) + + wanted_outputs.extend( + expand("docs/genome/ag-{chrom}.ipynb", chrom=chromosomes) + ) + + wanted_outputs.extend( + expand("docs/cohort/{cohort}.ipynb", cohort=df['cohort_id'].unique()) + ) + return wanted_outputs + +def get_h12_signal_detection_csvs(wildcards): + df = pd.read_csv("build/final_cohorts.csv") + paths = expand("build/h12-signal-detection/{cohort}_{contig}.csv", cohort=df['cohort_id'], contig=chromosomes) + return paths + +# include rule files +include: "rules/site.smk" +include: "rules/utility.smk" + +rule all: + input: + site = get_selection_atlas_site_pages, + build = "docs/_build/" diff --git a/workflow/config.yaml b/workflow/config.yaml index 2bbfdb9..c0e3ca8 100644 --- a/workflow/config.yaml +++ b/workflow/config.yaml @@ -19,7 +19,7 @@ contigs: # Pin the cohorts analysis version in order to get reproducible # builds. -cohorts_analysis: "20230223" +cohorts_analysis: "20240717" # Select the contig to use for H12 window size calibration. h12_calibration_contig: "3L" diff --git a/workflow/notebooks/h12-signal-detection.ipynb b/workflow/notebooks/h12-signal-detection.ipynb index b67f755..23cdefd 100644 --- a/workflow/notebooks/h12-signal-detection.ipynb +++ b/workflow/notebooks/h12-signal-detection.ipynb @@ -239,7 +239,7 @@ "outputs": [], "source": [ "# load gwss data\n", - "ppos, h12 = ag3.h12_gwss(\n", + "ppos, h12, _ = ag3.h12_gwss(\n", " contig=contig, \n", " window_size=window_size, \n", " analysis=phasing_analysis, \n", diff --git a/workflow/rules/common.smk b/workflow/rules/common.smk index 124d58d..d8ed4a3 100644 --- a/workflow/rules/common.smk +++ b/workflow/rules/common.smk @@ -55,26 +55,6 @@ def get_selection_atlas_outputs(wildcards): return wanted_outputs -def get_selection_atlas_site_pages(wildcards): - - df = gpd.read_file(checkpoints.geolocate_cohorts.get().output.cohorts_geojson) - - wanted_outputs = [] - wanted_outputs.extend(["docs/home-page.ipynb"]) - wanted_outputs.extend( - expand("docs/country/{country}.ipynb", country=df['country_alpha2']) - ) - - wanted_outputs.extend( - expand("docs/genome/ag-{chrom}.ipynb", chrom=chromosomes) - ) - - wanted_outputs.extend( - expand("docs/cohort/{cohort}.ipynb", cohort=df['cohort_id'].unique()) - ) - return wanted_outputs - - def get_cohort_page_notebooks(wildcards): df = gpd.read_file(checkpoints.geolocate_cohorts.get().output.cohorts_geojson) diff --git a/workflow/rules/site.smk b/workflow/rules/site.smk index 29379ad..45dfc91 100644 --- a/workflow/rules/site.smk +++ b/workflow/rules/site.smk @@ -19,7 +19,7 @@ rule build_site: rule generate_toc: input: nb = f"{workflow.basedir}/notebooks/generate-toc.ipynb", - cohorts_geojson = rules.geolocate_cohorts.output.cohorts_geojson, + cohorts_geojson = "build/final_cohorts.geojson", config = configpath, output: nb = "build/notebooks/generate-toc.ipynb", @@ -37,7 +37,7 @@ rule home_page: input: nb = f"{workflow.basedir}/notebooks/home-page.ipynb", config = configpath, - cohorts_geojson = rules.geolocate_cohorts.output.cohorts_geojson, + cohorts_geojson = "build/final_cohorts.geojson", output: nb = "docs/home-page.ipynb" log: @@ -53,7 +53,7 @@ rule country_pages: input: nb = f"{workflow.basedir}/notebooks/country-page.ipynb", config = configpath, - cohorts_geojson = rules.geolocate_cohorts.output.cohorts_geojson, + cohorts_geojson = "build/final_cohorts.geojson", output: nb = "build/notebooks/country/{country}.ipynb" log: @@ -69,7 +69,7 @@ rule chromosome_pages: input: nb = f"{workflow.basedir}/notebooks/chromosome-page.ipynb", config = configpath, - cohorts_geojson = rules.geolocate_cohorts.output.cohorts_geojson, + cohorts_geojson = "build/final_cohorts.geojson", signals = get_h12_signal_detection_csvs, output: nb = "build/notebooks/genome/ag-{chrom}.ipynb" @@ -85,7 +85,7 @@ rule chromosome_pages: rule cohort_pages: input: nb = f"{workflow.basedir}/notebooks/cohort-page.ipynb", - cohorts_geojson = rules.geolocate_cohorts.output.cohorts_geojson, + cohorts_geojson = "build/final_cohorts.geojson", output_h12="build/notebooks/h12-gwss-{cohort}.ipynb", output_g123="build/notebooks/g123-gwss-{cohort}.ipynb", output_ihs="build/notebooks/ihs-gwss-{cohort}.ipynb",