Tools for interacting with acorg antigen, antisera and titration databases.
Project description
acorgdb
Python API to acorg databases.
Install
uv add acorgdb or pip install acorgdb.
Example usage
import acorgdb
# Here, the 'database' directory should contain antigens.json, sera.json and
# results.json from the relevant acorg database
db = acorgdb.Database.from_dir("/path/to/database")
# Access the antigens, sera and experiments associated with a database
# directory
db.antigens[25]
# You can also access specific antigens, sera and experiments via their ID:
antigen = db["09V8SO"]
# Access attributes of antigens, sera, and experiments:
antigen.isolation.cell
experiment = db["XDGN6Z"]
experiment.name
# Experiments have titers in long and wide format as pandas DataFrames:
db.experiments[0].titers_long
db["XDGN6Z"].titers_wide
Sequences
import acorgdb
db = acorgdb.Database.from_dir("/path/to/database")
This antigen doesn't have its own sequence:
ag = db["DHC1P8"]
print(ag)
Antigen:
id: DHC1P8
parent_id: IWY9GS
long: NODE2-PR8_A/WHOOPERSWAN/MONGOLIA/244/2005NA-HA-K140L/S155G/R189I
wildtype: false
alterations:
- gene: HA
substitutions:
- K140L
- S155G
- R189I
but its parent does:
print(ag.parent)
Antigen:
id: IWY9GS
parent_id: TRRDQG
long: NODE2
wildtype: false
alterations:
- gene: HA
substitutions:
- L71I
- I83A
- R140K
...
genes:
- gene: HA
sequence: DQICIGYHANNSTEQVDTIMEKNVTVTHAQDILEKTHNGKLCDLDGVKPLILRDCSVAGW...
The child antigen's sequence is constructed from the parent's sequence while incorporating the child's substitutions:
print(ag.sequence("HA"))
DQICIGYHANNSTEQVDTIMEKNVTVTHAQDILEKTHNGKLCDLDGVKPLILRDCSVAGW...
If an antigen's parent doesn't have it's own sequence then the parent's parent is checked etc... until an ancestor is found with a sequence. Substitutions then are incorporated at each generation until the sequence of interest is generated.
Sequences with substitutions already incorporated
Sometimes antigens list substitutions that are inconsistent with the parent sequences. For example, the substitution might be D1K but the sequence might start PMT... Here, site 1 does not have a D, so there is an inconsistency.
Often, mutants list their substitutions and have a sequence listed. In these cases if the amino acid gained in a substitution is consistent with sequence position, and this is true for all substitutions, then no error is raised. When this is checked, if even a single substitution has an amino acid that is gained that is inconsistent with the sequence, an error is raised. These tests capture this behaviour:
class TestAntigenSequence(unittest.TestCase):
...
def test_antigen_that_specifies_aa1s_present(self):
"""
Antigen lists substitutions and a sequence. All the substitutions and the amino
acids that are gained in these substitutions are already present in it's
sequence.
"""
ag = adb.Antigen(
{
"id": "CHILD8",
"genes": [{"gene": "HA", "sequence": "DQICIGYHANNSTEQVQTIME"}],
"alterations": [
{"gene": "HA", "substitutions": ["K1D", "T6G", "D21E"]}
],
}
)
self.assertEqual("DQICIGYHANNSTEQVQTIME", ag.sequence("HA"))
def test_antigen_specifies_inconsistent_substitution(self):
"""
Like above, but the sequence has an E at 21 and the substitution at site 21
gains a K. (Amino acids gained in other substitutions all match the sequence).
If not all substitution aa1s are consistent with the sequence, a ValueError
should be raised.
"""
ag = adb.Antigen(
{
"id": "CHILD8",
"genes": [{"gene": "HA", "sequence": "DQICIGYHANNSTEQVQTIME"}],
"alterations": [
{"gene": "HA", "substitutions": ["K1D", "T6G", "D21K"]}
],
}
)
msg = (
"CHILD8 sequence inconsistent with all amino acids gained in "
r"\['K1D', 'T6G', 'D21K'\] and sequence inconsistent with K1D"
)
with self.assertRaisesRegex(ValueError, msg):
ag.sequence("HA")
Building and uploading to PyPI
uv run python -m build
uv run python -m twine upload dist/*
Running tests
uv sync --group dev
uv run pytest
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file acorgdb-0.1.5.tar.gz.
File metadata
- Download URL: acorgdb-0.1.5.tar.gz
- Upload date:
- Size: 45.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98baf2c0ac53decbfa2a4a22617d2412abb8780a645f62ee96d757f38d03c6db
|
|
| MD5 |
6e6702c379b237f09c3effd2b0d4c8b7
|
|
| BLAKE2b-256 |
19870207f34dfbd3bcee567cbb1f3626a10cf119764b4f96bbc4c5a00bcde682
|
File details
Details for the file acorgdb-0.1.5-py3-none-any.whl.
File metadata
- Download URL: acorgdb-0.1.5-py3-none-any.whl
- Upload date:
- Size: 14.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
913fc3757e8589a155ab57ff4edcceb7ddd6174c5409b1581806e5b16a149aef
|
|
| MD5 |
0c1156705f41aebc9f73edba441fa70b
|
|
| BLAKE2b-256 |
6204b413846879ef9150468fc29ee6e9fbf91ee4a2c773711038d7f85ed5ed5d
|