Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
18d4312
fix: serve the 2026-09 release from R2 without a release-number prefix
tjduigna Sep 30, 2026
b975dd3
fix: accept any YYYY-MM release stamp on R2 and drop legacy 2024-06/v2
tjduigna Sep 30, 2026
9fe285d
ci: drop Docker and run tests directly on the runner
tjduigna Sep 30, 2026
df4c714
build: cap pandas below 3 until string/NA dtype changes are handled
tjduigna Oct 1, 2026
4f55068
fix: support pandas 3 string dtypes instead of capping pandas
tjduigna Oct 1, 2026
8344e7c
build: install everything from pyproject.toml with uv; drop requireme…
tjduigna Oct 1, 2026
14bde64
Merge remote-tracking branch 'origin/drop-docker' into release-date-p…
tjduigna Oct 1, 2026
2bc833d
fix: fetch protein score shards for lazy ligand similarity reconstruc…
tjduigna Oct 1, 2026
a3cc887
docs: execute all example notebooks against the 2026-09 release
tjduigna Oct 1, 2026
fcb9a01
fix: don't CIGAR-decode custom alignments that already carry residue …
tjduigna Oct 1, 2026
f67b308
ci: print notebook tracebacks when the docs build fails
tjduigna Oct 1, 2026
e0a3aae
build: stop committing uv.lock; resolve from pyproject.toml in CI
tjduigna Oct 2, 2026
ee23388
Merge remote-tracking branch 'origin/drop-docker' into release-date-p…
tjduigna Oct 2, 2026
8996f82
ci: install docs builds without uv.lock
tjduigna Oct 2, 2026
e2f654b
build: move the release version script to the repo root
tjduigna Oct 2, 2026
355e52b
Merge remote-tracking branch 'origin/drop-docker' into release-date-p…
tjduigna Oct 2, 2026
bfb2eae
Fix overlapping assembly copies and interface clustering
Ninjani Oct 2, 2026
4024193
Fix weekly release repair and update planning
Ninjani Oct 2, 2026
d0da6e3
Add monomer search and precomputed protein similarities
Ninjani Oct 2, 2026
08eab08
Separate public release artifacts from working ingest
Ninjani Oct 2, 2026
0e940ec
Fix release packaging and weekly update edge cases
Ninjani Oct 2, 2026
7cc72ee
Fix duplicate sequence ID columns in custom chain scores
Ninjani Oct 3, 2026
b0b087e
Merge remote-tracking branch 'origin/fix/major-refactor-bugs' into re…
tjduigna Oct 4, 2026
31b6dd2
fix: skip empty monomer search databases and narrow monomer batch index
tjduigna Oct 4, 2026
d689da8
fix: skip empty monomer sub-databases after chain selection
tjduigna Oct 4, 2026
1cd10a3
docs: describe the flat YYYY-MM release layout served from R2
tjduigna Oct 4, 2026
b37a5f9
fix: handle in-place release updates and empty monomer universes
tjduigna Oct 4, 2026
79f3883
docs: refresh R2 manifest facts and published cover families
tjduigna Oct 4, 2026
3473710
fix: serve releases directly from the Cameo file server
tjduigna Oct 8, 2026
facb939
update docs
Ninjani Oct 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions .github/workflows/docs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,17 @@ jobs:
cache-downloads: true
cache-environment: true
post-cleanup: all
- name: Setup uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
- name: Install plinder
shell: bash -el {0}
run: UV_PROJECT_ENVIRONMENT="$CONDA_PREFIX" uv sync --inexact --extra docs
- name: Build docs
shell: bash -el {0}
id: build
run: |
which python
python -m pip install six
python -m pip install '.[docs,loader]'
sphinx-build docs build/docs
run: sphinx-build docs build/docs
- name: Upload build artifact
uses: actions/upload-pages-artifact@v3
with:
Expand Down
54 changes: 25 additions & 29 deletions .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ name: Package
permissions:
contents: write
id-token: write
packages: write
on:
push:
branches:
Expand All @@ -14,51 +13,48 @@ jobs:
name: Package
if: ${{ ! contains(toJSON(github.event.commits.*.message), '[skip ci]') }}
runs-on: ubuntu-latest
defaults:
run:
shell: bash -l {0}
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup python
uses: actions/setup-python@v5
- name: Setup micromamba
uses: mamba-org/setup-micromamba@v1
with:
python-version: "3.12"
- name: Configure docker
run: echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.repository_owner }} --password-stdin
- name: Install build and tag requirements
run: python -m pip install build semver
environment-file: environment.yml
create-args: python=3.12
init-shell: bash
cache-downloads: true
cache-environment: true
post-cleanup: all
- name: Setup uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
- name: Install plinder
run: UV_PROJECT_ENVIRONMENT="$CONDA_PREFIX" uv sync --inexact
- name: Get version bump
id: get-tag
run: echo "bump=$(python flows/docker.py bump)" >> $GITHUB_OUTPUT
- name: Pull, build, tag, bump base image
if: steps.get-tag.outputs.bump != ''
run: python flows/docker.py pull --build --promote
- name: Build image
run: echo "bump=$(python version.py)" >> $GITHUB_OUTPUT
- name: Run tests
if: steps.get-tag.outputs.bump != ''
run: python flows/docker.py build
- name: Run tests against new image and save images
env:
PLINDER_OFFLINE: "true"
run: python -m pytest -n auto -v
- name: Tag release
if: steps.get-tag.outputs.bump != ''
run: |
python flows/docker.py test --push
if ! test -f reports/.coverage; then
echo "Missing test coverage reports (reports/.coverage). Not all tests have passed?"
exit 1
else
echo "Test coverage report found!"
fi
run: git tag ${{ steps.get-tag.outputs.bump }}
- name: Build distribution
run: python -m build
run: uv build
- name: Publish package distributions to PyPI
if: steps.get-tag.outputs.bump != ''
uses: pypa/gh-action-pypi-publish@release/v1
- name: Save git tag
if: steps.get-tag.outputs.bump != ''
run: git push origin ${{ steps.get-tag.outputs.bump }}
- name: Copy and surgery coverage
if: steps.get-tag.outputs.bump != ''
run: |
cp reports/.coverage .
sqlite3 .coverage "update file set path='src/' || substr(path, 40);"
- name: Post coverage comment
if: steps.get-tag.outputs.bump != ''
uses: py-cov-action/python-coverage-comment-action@v3
Expand Down
70 changes: 30 additions & 40 deletions .github/workflows/pr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ name: CI Workflow
permissions:
contents: write
id-token: write
packages: read
pull-requests: write

concurrency:
Expand Down Expand Up @@ -37,53 +36,37 @@ jobs:
tox-${{ runner.os }}-3.12-

test:
name: Build and test docker image
name: Test
runs-on: ubuntu-latest
defaults:
run:
shell: bash -l {0}
steps:
- name: Checkout repo
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- name: Configure docker
run: echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.repository_owner }} --password-stdin
- name: Get changed source files
id: changed-src
uses: tj-actions/changed-files@v41
- name: Setup micromamba
uses: mamba-org/setup-micromamba@v1
with:
files: src/**
- name: Get changed base image files
if: steps.changed-src.outputs.any_changed == 'true'
id: changed-base
uses: tj-actions/changed-files@v41
environment-file: environment.yml
create-args: python=3.12
init-shell: bash
cache-downloads: true
cache-environment: true
post-cleanup: all
- name: Setup uv
uses: astral-sh/setup-uv@v6
with:
files: dockerfiles/base/*
- name: Pull base image and build
if: steps.changed-src.outputs.any_changed == 'true' && steps.changed-base.outputs.any_changed == 'true'
run: python flows/docker.py pull --build
- name: Pull base image
if: steps.changed-src.outputs.any_changed == 'true' && steps.changed-base.outputs.any_changed != 'true'
run: python flows/docker.py pull
- name: Build image
if: steps.changed-base.outputs.any_changed == 'true' || steps.changed-src.outputs.any_changed == 'true'
run: python flows/docker.py build
- name: Run test image
if: steps.changed-base.outputs.any_changed == 'true' || steps.changed-src.outputs.any_changed == 'true'
run: |
python flows/docker.py test
if ! test -f reports/.coverage; then
echo "Missing test coverage reports (reports/.coverage). Not all tests have passed?"
exit 1
else
echo "Test coverage report found!"
fi
- name: Copy and surgery coverage
if: steps.changed-base.outputs.any_changed == 'true' || steps.changed-src.outputs.any_changed == 'true'
run: |
cp reports/.coverage .
sqlite3 .coverage "update file set path='src/' || substr(path, 40);"
enable-cache: true
- name: Install plinder
run: UV_PROJECT_ENVIRONMENT="$CONDA_PREFIX" uv sync --inexact
- name: Run tests
env:
PLINDER_OFFLINE: "true"
run: python -m pytest -n auto -v
- name: Post coverage comment
if: steps.changed-src.outputs.any_changed == 'true'
uses: py-cov-action/python-coverage-comment-action@v3
with:
GITHUB_TOKEN: ${{ github.token }}
Expand All @@ -106,7 +89,14 @@ jobs:
cache-downloads: true
cache-environment: true
post-cleanup: all
- name: Install Python requirements
run: pip install six ".[docs,loader]"
- name: Setup uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
- name: Install plinder
run: UV_PROJECT_ENVIRONMENT="$CONDA_PREFIX" uv sync --inexact --extra docs
- name: Build the documentation
run: sphinx-build --fail-on-warning docs build/docs
- name: Show notebook errors
if: failure()
run: cat build/docs/reports/examples/*.err.log 2>/dev/null || true
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -195,3 +195,6 @@ tmp_foldseek
tmp_mmseqs
artifacts
logs/

# uv lockfile: not committed; CI resolves the latest versions allowed by pyproject.toml
uv.lock
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.12
20 changes: 10 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,9 @@ More details about the competition and other helpful practical tips can be found

## 🔢 Plinder versions

We version the `plinder` dataset with two controls:

- `PLINDER_RELEASE`: the month stamp of the last RCSB sync
- `PLINDER_RELEASE_NUMBER`: numbered release within that ingest month
We version the `plinder` dataset by the month stamp (`YYYY-MM`) of the RCSB
sync it was built from, set with `PLINDER_RELEASE`. The current release,
`2026-09`, is the default.

We version the `plinder` application using an automated semantic
versioning scheme based on the `git` commit history.
Expand All @@ -57,7 +56,7 @@ with the dataset.
#### Changelog:

- WIP (Current — unreleased):
- **Public downloads on Cloudflare R2**: `2024-06/v2` now downloads from `https://plinderdata.org` instead of GCS; `PLINDER_MIRROR_URL` selects another HTTP mirror. Downloads stream to disk and verify size and MD5 before atomic replacement, interrupted transfers retry from the start, and cached files with the expected size are reused (force a refresh to repair same-size local corruption). Google storage dependencies are now optional: install `plinder[data]` for the GCS data-generation utilities.
- **Public downloads from Cameo**: releases download directly from `https://cameo3d.org/plinder/PLINDER-<YYYY-MM>/` (currently `2026-09`); `PLINDER_MIRROR_URL` selects another HTTP file server with the same directory layout. Downloads stream to disk, validate HTTP Content-Length, and replace cached files atomically. Interrupted transfers retry from the start. Cached files are reused when their size and Last-Modified time match the server, so data hotfixes are fetched on the next access. Google storage dependencies are optional: install `plinder[data]` for the GCS data-generation utilities.
- **Major backend refactor**: replaced OST, gemmi, plip, openbabel with biotite + peppr for data generation; removed 6 dependencies from ingest pipeline
- **Nucleic acid support**: DNA/RNA chains now correctly included as receptor neighbors, mainchain/sidechain detection works for both protein and nucleic acids ([#61](https://github.com/plinder-org/plinder/issues/61))
- **Custom CIF support**: new `Entry.from_custom_cif_file` for structure-prediction outputs (Boltz, AlphaFold3, Chai-1) that ship CIFs without `_chem_comp_bond` ([#117](https://github.com/plinder-org/plinder/issues/117)). Bond orders come from `ligand_smiles_dict` via positional atom-order match (the convention these tools follow); element/count mismatches raise with the offending position, `force_substructure_match=True` opts into substructure matching when atom order isn't preserved. User SMILES win over CCD for both `smiles` and `resolved_stereo_matches_template` — closes a silent gap where biotite's `LIG` placeholder would pass any 3D conformer. Input CIFs are never mutated; optional `save_fixed_cif` persists the enriched copy.
Expand Down Expand Up @@ -108,7 +107,7 @@ Moreover, as we enticipate this resource to be used for benchmarking a wide rang
The *PLINDER* dataset is provided in two ways:

- You can either use the files from the dataset directly using your preferred tooling
by downloading the data from `https://plinderdata.org` (Cloudflare R2),
by downloading the data from the [Cameo file server](https://cameo3d.org/plinder/PLINDER-2026-09/),
- or you can utilize the dedicated `plinder` Python package for interfacing the data.


Expand All @@ -118,14 +117,15 @@ After installing the package, download the index tables and cluster assignments
for a release with:

```console
$ plinder_download --release 2024-06 --release-number v2
$ plinder_download --release 2026-09
```

The command offers the larger ligand, alignment, score, export, and search
database groups separately, and dataset APIs also download required files
lazily. No Google Cloud credentials or SDK are needed: `2024-06/v2` downloads
from `https://plinderdata.org`; `PLINDER_MIRROR_URL` can select another HTTP
mirror. Other release versions are unavailable through the public downloader.
lazily. No Google Cloud credentials or SDK are needed: releases download
from `https://cameo3d.org/plinder/PLINDER-2026-09/`; `PLINDER_MIRROR_URL`
can select another HTTP file-server root containing `PLINDER-<YYYY-MM>/`
directories. The legacy `2024-06/v2` layout requires an earlier `plinder` version.
For details on the release paths, see [Documentation](https://plinder-org.github.io/plinder/tutorial/dataset.html).

## Installing the Python package
Expand Down
30 changes: 0 additions & 30 deletions docker-compose.yml

This file was deleted.

70 changes: 0 additions & 70 deletions dockerfiles/base/Dockerfile

This file was deleted.

17 changes: 0 additions & 17 deletions dockerfiles/base/env.yml

This file was deleted.

Loading
Loading