structural-biology.com

PANTS: Mines metagenomes for uncharacterised PETase and MHETase candidates, ranked by catalytic triad and oxyanion hole

4EB0 · Crystal structure of Leaf-branch compost bacterial cutinase homolog · X-ray · 1.50 Γ… · Open the four lenses →

PANTS

Find PET-degrading enzymes that work at 37 Β°C in serum, not at 70 Β°C in a reactor.

python flask sqlite esm2 status DOI data author

🌐 Apppants.mdeller.comβœ‰οΈ Contactmarc@marcdeller.comπŸ™ GitHubbellcheddar/PANTS

PANTS (PETase ANnotation and Triage System) discovers, triages and engineers PETase-like and MHETase-like enzymes for therapeutic use: degrading PET microplastics under physiological conditions rather than in an industrial reactor. It mines metagenomic sequence space, ranks candidates on axes that matter at 37 Β°C, and will serve the result as an interactive catalogue with predicted structures and in-silico engineering.

Why it matters: essentially the entire published PETase field optimises for industrial conditions (above PET’s glass transition at roughly 70 Β°C, often alkaline, with thermostability and enzyme cost as the dominant concerns). Therapeutic use inverts almost all of it: peak activity at 37 Β°C, pH 7.4, in serum, against highly crystalline aged microplastic, with immunogenicity and protease resistance suddenly central. A naive homology search seeded on characterised PETases ranks candidates towards the industrial optimum, because that is where the well-annotated, heavily-published enzymes sit. Correcting for that bias is most of what PANTS is for. It is useful for: anyone triaging polyesterase sequence space on physiological rather than industrial criteria, and anyone who wants a calibrated probability rather than an E-value rank before committing a wet-lab screening budget.

🧭 Why this is not a homology search

Detection is solved. Discrimination is not.

A profile HMM built from characterised PET hydrolases returns thousands of Ξ±/Ξ²-hydrolase fold members sharing the Ser-His-Asp triad and the oxyanion hole. Almost none have meaningful activity on crystalline PET, and sequence identity to IsPETase is a weak predictor of PET activity, so E-value rank is close to uninformative about the property of interest.

The architecture that follows: retrieval is the recall stage, the learned model is the precision stage. MMseqs2 and HMMER cast the net exhaustively and interpretably; the model ranks within it on axes retrieval is blind to. That also yields a free baseline: if the model cannot beat E-value rank on held-out characterised enzymes, that is a cheap and publishable negative result.

βš—οΈ The therapeutic constraint

AxisIndustrial optimumTherapeutic requirement
Temperature65 to 75 Β°CPeak activity at 37 Β°C
pH8 to 97.2 to 7.4
SubstrateAmorphous, pre-treated, high surface areaHighly crystalline aged microplastic and nanoplastic
MediumBufferSerum, plasma proteins, lipids, physiological ionic strength
Stability concernThermal denaturation over daysSerum protease resistance, aggregation, clearance
ImmunogenicityIrrelevantCentral
Product handlingRecovered and recycledTPA and EG must be tolerable at achievable local concentrations

πŸ”€ How it works

  SOURCE ENVIRONMENTS                      SEED SET
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚ compost      1.0M    β”‚                 β”‚ 6 wild types  (UniProt + UniParc)  β”‚
  β”‚ marine       0.7M    β”‚                 β”‚ 9 variants    (parent + mutations) β”‚
  β”‚ landfill     0.4M    β”‚                 β”‚ 2 variants    (PDB constructs)     β”‚
  β”‚ wastewater   0.03M   β”‚                 β”‚ 5 HGMPs       (SciDB deposit)      β”‚
  β”‚ human gut   12.1M    β”‚                 β”‚ 449 EC 3.1.1.101 (annotation)      β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β”‚  predicted proteins                           β”‚
             β”‚                                               β–Ό
             β”‚                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
             β”‚                              β”‚ cluster at 30% identity      β”‚
             β”‚                              β”‚ β†’ 1 profile HMM per cluster  β”‚
             β”‚                              β”‚ β†’ anchor each on UniProt's   β”‚
             β”‚                              β”‚   own ACT_SITE annotation    β”‚
             β”‚                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β–Ό                                              β”‚
  ╔═══════════════════════════════════════════════════╗     β”‚
  β•‘  RECALL                                           β•‘ β—„β”€β”€β”€β”˜
  β•‘                                                   β•‘
  β•‘   MMseqs2 prefilter        E ≀ 1e-5               β•‘   fast, exhaustive
  β•‘        β”‚                                          β•‘
  β•‘        β–Ό                                          β•‘
  β•‘   hmmscan vs profile library                      β•‘   assigns each survivor
  β•‘        β”‚                                          β•‘   to the family it
  β•‘        β–Ό                                          β•‘   actually resembles
  β•‘   triad filter    SerΒ·HisΒ·Asp connected in SPACE  β•‘   ← geometry, not motif
  β•‘        β”‚                                          β•‘
  β•šβ•β•β•β•β•β•β•β•β•ͺ══════════════════════════════════════════╝
           β”‚  retains ~0.006%  Β·  keeps E-value + bitscore
           β–Ό                     as the baseline to beat
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
     β”‚  CANDIDATES   β”‚  content-addressed on the sequence,
     β”‚               β”‚  so the same protein found twice is one row
     β””β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”˜
         β”‚       β”‚
         β”‚       └──────────────────────────┐
         β–Ό                                  β–Ό
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚ ESM-2 t12-35M       β”‚        β”‚ ESMFold  (≀ 450 aa)            β”‚
  β”‚ frozen, CPU         β”‚        β”‚   β”‚                            β”‚
  β”‚ 480-dim, mean-pool  β”‚        β”‚   β–Ό                            β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚ superpose onto IsPETase 6EQE   β”‚
             β”‚                   β”‚   β”‚  ← at WRITE time, so the   β”‚
             β–Ό                   β”‚   β–Ό    browser does none       β”‚
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”‚ active-site geometry           β”‚
  β”‚ activity head       β”‚        β”‚   triad distances, cleft width,β”‚
  β”‚ PU-corrected,       β”‚        β”‚   aromatic clamp               β”‚
  β”‚ calibrated          β”‚        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                         β”‚
             β”‚        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
             β–Ό        β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  SQLite  β†’  Flask  β†’  Catalogue Β· Superpose β”‚
        β”‚                       Candidate Β· Methods   β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

  Every stage writes a manifest: input hashes, tool versions, git commit, wall time.

Two things in that diagram are load-bearing and easy to miss. The triad filter tests whether Ser, His and Asp are connected in space, not whether a motif matches, so three residues present in sequence but not in contact correctly fail. And superposition happens when a structure is written, not in the browser, which is what makes an N-structure overlay cost N file loads instead of N alignments.

🌑️ The therapeutic gap, measured

The table above is the premise. These are the numbers. Every enzyme named in the project brief, plus every other PET hydrolase with a published optimum that could be found.

Rows are split by how the number was obtained, because that difference matters more than the value: the first block is extracted programmatically from UniProt’s curated BIOPHYSICOCHEMICAL PROPERTIES with ECO:0000269 experimental evidence and PubMed IDs attached, and is what sits in the database. The second is from the literature and is recorded here for context only.

πŸ“‘ Measured, in the database, each with its citation

EnzymeToptpH optSource
HGMP01 (human gut)40 Β°C~7.4, broad across pH 7.xPMID 39551294
IsPETase40 Β°C9.0PMID 26965627, 29603535
LCC50 Β°C8.5PMID 22194294, 24593046
T. alba est1 (D4Q9N1)50 Β°C6.0PMID 25910960
T. alba est2 (F7IX06)50 Β°C6.0PMID 20393707
TfCut1 (G8GER6)55 Β°C8.0PMID 23604968
TfCut255 Β°C8.0PMID 15638529, 20816933
T. fusca (Q47RJ6)60 Β°C8.0PMID 18658138, 20729325
T. fusca (Q47RJ7)60 Β°C8.0PMID 18658138

The engineered lineage, from the literature

Every variant named in the project brief. They are in the database at weaker provenance than the block above: extraction_confidence='review' and ECO:0000305 (inferred by curator) rather than ECO:0000269 (experimental, from a publication), because the values were collated from a secondary review rather than read from each primary paper.

Every engineered variant now carries a sequence. Two came from crystal structures, which is the stronger route: a PDB SEQRES is the construct that was actually expressed, crystallised and assayed, so nothing is applied or assumed. Each was verified by aligning against its parent and checking the substitution count against the published one, rather than trusting the name on the entry.

VariantSourceLengthSubstitutions vs parentPublished
HotPETasePDB 7QVH272 aa21 vs IsPETase~21
Cut190**SSPDB 7CEF262 aa4 vs Cut190 (incl. S226P/R228S)S226P/R228S

Both are stored as the mature construct, so they are shorter than their precursor parents.

The remaining three were resolved from their mutation sets, and two more variants were found in the same pass. Every set below was applied with apply_mutations, which refuses any substitution whose stated parent residue does not match, so a wrong position or a mature-vs-precursor numbering shift fails loudly instead of producing a plausible but wrong sequence. All five matched at offset 0 with the substitution count the papers report.

VariantParentMutationsConfirmed by
DuraPETaseIsPETaseS214H/I168R/W159H/S188Q/R280A/A180I/G165A/Q119Y/L117F/T140D10/10 parent residues match; 10 independent positions agreeing by chance is ~20⁻¹⁰
TurboPETaseBhrPETaseH218S/F222I/A209R/D238K/A251C/A281C/W104L/F243T8/8 match; the parent recorded before curation (IsPETase) was wrong
Z1-PETaseIsPETaseN37D/S121E/R132E/A171C/A180V/P181V/D186H/S193C/R224E/N233C/S242T/N246D/S282C13/13 match and all 13 sites read the mutant residue in PDB 8H5K
DepoPETaseIsPETaseT88I/D186H/D220N/N233K/N246D/R260Y/S290P7/7 match
LCC-A2LCCF243I/D238C/S283C/Y127G/H218Y/N248D6/6 match (LCC-ICCG plus H218Y/N248D)

Z1-PETase is confirmed twice over and independently: the mutation list applies cleanly to IsPETase, and the deposited 8H5K sequence differs from the derived one only by an SHM expression-tag scar and the signal peptide, with zero mismatches in the mature region.

Three findings from that search are worth recording, because each is a trap rather than a detail:

  • TurboPETase’s parent is BhrPETase, not IsPETase. The placeholder entry named the wrong parent. The mutation set does not apply to IsPETase at any offset, so the residue-match check caught it rather than a reviewer.
  • BhrPETase has no live UniProtKB entry at all. The accession PAZy records, A0A2H5Z9R5, is inactive (DEMERGED to A0ACD6B9U1), and A0ACD6B9U1 is itself DELETED as β€œnot part of a reference proteome”. The parent of a headline industrial enzyme is reachable only through UniParc UPI000CB4D10C, which never deletes. Its sequence is byte-identical to PAZy’s copy and carries an active EMBL WGS cross-reference.
  • Do not seed PHL7 from UniProt. Its only UniProt entry is the catalysis-deficient S131A mutant deposited for crystallography: right length, right name, catalytic serine knocked out. The same trap as PDB 7CEH (S176A), rejected earlier for Cut190**SS. PHL7’s active sequence is already present as a PAZy-measured positive.

The PES-H1 L92F/Q94Y variant is deliberately not derived, for want of a loadable parent rather than a confirmed set. Confirming it did settle a documented literature discrepancy: the same double mutant is written L92F/Q94Y in PES-H1 numbering and L93F/Q95Y in PHL7 numbering, and find_offset returns +1 and 0 respectively against the same sequence, producing an identical result either way.

Values collated in Engineering Evolution: How FAST-PETase and Other Variants Are Transforming Plastic Biodegradation.

VariantToptParentNotes
Z1-PETase30 Β°CIsPETase13 mutations, two engineered disulfides; 40x expression yield
IsPETase (wild type)30 to 35 Β°CnativeWeak on crystalline PET
DuraPETase37 Β°CIsPETase10 mutations; +31 Β°C thermostability, ~300x activity
FAST-PETase50 Β°CThermoPETase38x activity; 33.8 mM monomers in 96 h
HotPETase60 to 65 Β°CIsPETase21 mutations; melting temperature 82.5 Β°C
Cut190**SS65 Β°Cactinomycete cutinaseCalcium-dependent conformational switching
TurboPETase65 to 68 Β°CBhrPETase98.2% depolymerisation at 200 g/kg in 8 h
LCC-ICCG65 to 72 Β°CLCC1.3 g PET waste in 3 days from 1.25 mg enzyme
DepoPETase~50 Β°C (applied)IsPETase7 mutations; melting temperature +23.3 Β°C, ~1407x product
LCC-A278 Β°CLCC-ICCGLCC-ICCG plus H218Y/N248D

A discrepancy worth stating rather than smoothing over: UniProt’s curated value for IsPETase is 40 Β°C, while the literature review gives 30 to 35 Β°C. Both are defensible and they were measured on different substrates under different assays, which is exactly the harmonisation problem the project brief raises. The database keeps the UniProt value because it carries an experimental evidence code and a citation; this table shows both rather than picking a winner.

Read the two tables together and the shape of the field is obvious. The entire engineered lineage runs away from body temperature: FAST-PETase to 50 Β°C, HotPETase to 60 to 65, TurboPETase and LCC-ICCG to 65 to 72, LCC-A2 to 78. That is rational, because they were optimised for a reactor above PET’s glass transition.

Only three enzymes sit anywhere near 37 Β°C, and two of them (Z1-PETase, DuraPETase) are engineered variants of IsPETase that reach it by trading away the activity the others gained. HGMP01 is the only one that arrived there naturally, and the only measured enzyme in this project with a near-neutral pH optimum as well: everything else wants pH 8 to 9, and even IsPETase asks for 9.

That is the therapeutic gap, and it is not an argument: it is what the numbers say. It is also the reason the human gut was added as a fourth source environment, since an enzyme resident at 37 Β°C and pH 7.4 has already been selected under something close to the target conditions.

Why HGMP01 matters, and the trap in retrieving it

HGMP01 is a PET hydrolase identified from the human gut microbiome (Int J Biol Macromol 283, 2024). It hydrolyses PET nanoparticles, outperformed the four other candidates in that study, and shares only about 5% identity with IsPETase. Its homologues are distributed across 41 families and 94 genera of gut microbes.

It is in no public sequence database: zero hits across UniProt, NCBI protein and NCBI nuccore. The sequences live in the authors’ SciDB deposit.

The paper and the deposit number the enzymes differently, and matching on the name would have mislabelled all five. The paper’s HGMP01 to HGMP05 are the deposit’s HGMP03, 04, 06, 07 and 08. The mapping is pinned by two independent facts:

PaperLengthDepositLengthIdentifierHomologues
HGMP01275HGMP03275GUT_GENOME238302_00589697
HGMP02341HGMP04341GUT_GENOME243637_00613131
HGMP03323HGMP06323GUT_GENOME137663_0014396
HGMP04282HGMP07282GUT_GENOME171691_007431000
HGMP05321HGMP08320GUT_GENOME244370_0006487

Every length is distinct, so the assignment is 1:1 with no ambiguity. Independently, the paper states that the homologue search β€œidentified a total of 697 putative HGMP01-like enzymes”, and the deposit’s HGMP03 returned exactly 697 hits. Two unrelated numbers agreeing is what makes this a determination rather than a guess.

Every sequence is length-checked against the paper’s own table before being stored, and that check immediately caught a transposition between the similar identifiers GUT_GENOME244370_00064 and GUT_GENOME244064_00699, which would otherwise have filed the wrong protein as HGMP05 with nothing downstream to reveal it.

🚧 Current status

Live at pants.mdeller.com. The pipeline runs end to end from metagenome FASTA to folded, geometry-measured candidates, and the catalogue is served behind gunicorn and nginx. The project reached a conclusion that is not the one it set out to reach β€” read FINDINGS.md first, then NEXT.md.

PhaseState
0: Scaffold, schema, manifest provenanceβœ… Complete
1: Curation, hard negatives, activity dataβœ… Complete
2: Recall (profile HMMs, MMseqs2, HMMER)βœ… Complete
4: ESM-2 embeddingβœ… Complete
5: Activity head, calibration, evaluationβœ… Complete, and negative: a learned head does not beat retrieval on measured labels
6: Structures and active-site geometryβœ… Complete: 416 of 439 candidates folded, 559 reference structures
7 to 8: Web app and deploymentβœ… Complete: live on port 8005, listed on the mdeller.com launcher
9: Measured negatives and the three findingsβœ… Complete

What is in the database today:

SetCountNotes
Candidates439Mined from 14,804,920 metagenomic proteins across five environments, all triad-complete
Characterised enzymes1,348Of which 342 carry a measurement, the rest annotation
Measured negatives150Expressed, assayed, no product released β€” from two 2025 screens. The class this field usually lacks
Hard negatives131Other Ξ±/Ξ²-hydrolase folds, matched on five axes
Activity measurements2,7592,757 carrying a DOI
Reference structures55960 crystal, 104 AlphaFold, 395 ESMFold, all superposed onto IsPETase
Unlabelled homologues25,041Held outside the catalogue so they cannot inflate a quoted count

The headline result

Candidates are ranked by similarity to the nearest enzyme whose PET activity was measured, not by a learned classifier, because on measured labels no model built here beats that baseline. Every candidate carries a competence band from the measured identity-decay curve:

BandCandidatesMeaning
In range16β‰₯70% identity to a measured-active enzyme
Marginal3950–70%
Out of range384<50%, ranked but with no demonstrated validity

The out-of-range candidates are precisely the novel enzymes this project set out to find, and nothing here can score them. That is stated on the site rather than hidden, and the fix is measurement on new lineages β€” see release/validation_panel.csv.

Positives by evidence tier

The count that matters is not 854 but 341: the number with a measurement behind the label.

TiernWhat it means
EC-auto-annotated449EC 3.1.1.101 assigned by similarity (ECO:0000256). A prediction, not a measurement
ESTHER-family-predicted50Family membership only
ESTHER-family-protein-evidence14Family, protein observed
EC-experimental10EC 3.1.1.101 with ECO:0000269 and PubMed citations
Curated wild types and variants6Hand-curated, sequence-verified, mutations validated
PAZy-measured312In PAZy because activity was measured on a plastic and published, each with a DOI
HGMP-measured5Human gut PET hydrolases with measured activity (PMID 39551294)

πŸ§ͺ What Phase 1 found

Historical record. Everything in this section was true when it was written and has
since been superseded. The AUC 0.976 below was measured against negatives meaning β€œnot
reported active in a database”, which cannot distinguish an enzyme assayed and found dead
from one nobody assayed. When 150 measured negatives arrived, that number and the
conclusions drawn from it did not survive. The section is kept because the reasoning is
the record of how the project got to where it is β€” for the current position see
FINDINGS.md.

Two findings that changed the plan, both surfaced by the pre-training sanity gate rather than by review. Full detail in PHASE1_FINDINGS.md.

The nine curated positives are one cluster, not nine examples. They collapse into a single cluster at both 30% and 50% identity, because the engineered variants are 97.6% to 99.3% identical to their parents. Under the project’s own evaluation rule (split by cluster, never by sequence) that is one independent example, so no cluster-split evaluation is possible over them and any cross-validation is pure leakage. The first ungrouped trivial baseline returned AUC 0.9996 for exactly that reason. Harvesting the full ESTHER polyesterase family took the positive set to 87 sequences in 11 clusters at 30%, at the cost of those being annotation-only labels.

The hard negatives were separable on amino-acid composition alone. Cluster-grouped, a classifier using nothing but 20 amino-acid fractions and length scored AUC 0.954 against a null of 0.495. The coefficients diagnosed it: negatives Leu-rich, positives Ser/Thr/Gly/Pro-rich, which is a secreted-versus-cytoplasmic signature rather than polyester chemistry. Every characterised polyesterase is secreted; the negative families were largely intracellular.

Negatives are now matched on five axes: length distribution, identity to nearest positive, genus cap, signal peptide, and phylum. Phylum matching specifically contributed almost nothing (0.845 to 0.842), which is itself informative: the residual is not GC-driven.

Curating real activity data moved it further. EC 3.1.1.101 is poly(ethylene terephthalate) hydrolase, a curator’s assignment of measured function rather than a family guess, and harvesting it took the positive set from 87 sequences in 11 clusters to 529 in 29:

Positive setClustersComposition baselineVerdict
Curated only10.9996 (leakage, not a measurement)invalid
Plus ESTHER family110.842MARGINAL
Plus EC 3.1.1.101290.778MARGINAL

Still short of the 0.75 pass mark, but the trend confirms the diagnosis: much of the apparent shortcut was a small-sample artefact that shrinks as real diversity arrives.

Consequently the composition baseline is a permanently reported metric alongside the retrieval baseline, not merely a pre-training gate. Any claim the model makes has to clear both.

The labels were the blocker, and PAZy resolved it

For most of this project a head trained on the catalogue’s own labels scored AUC 1.000, which was a failure rather than a success: 449 positives carried EC 3.1.1.101 from ECO:0000256, meaning the label was assigned by sequence similarity. A sequence model reproducing that is close to tautological. Meanwhile the positives with real experimental evidence numbered 17 and spanned 5 clusters: too few for the cluster-split protocol to run at all, so the honest head could not be scored rather than scoring badly.

PAZy inverts the inclusion criterion. An enzyme is listed because activity was measured on a plastic and published, with the DOI attached.

Β Measured positivesClusters at 30%Clusters at 50%
Before1757
With PAZy3335173
Plus the confirmed engineered variants3415072

Trained on the measured set alone (300 after length filtering, 45 clusters, 220 negatives and near misses):

MetricValue
AUC, cluster-grouped0.976 Β± 0.021 over 4 valid folds
Average precision0.987
Brier score0.052
Composition-only baseline0.829

That is a different kind of number from the 1.000. The labels are experimental rather than similarity-derived, the split is across 45 independent units rather than impossible, and the head clears the composition baseline by a real margin instead of tying with it.

What it still does not show, tested rather than assumed. Running the head against the 125 near misses gave AUC 1.000, which is a warning rather than a triumph. Every near miss belongs to a single ESTHER family (Cutinase), and one homogeneous family separates as a block: composition alone scores 0.910 on the same contrast. That is a family-level question wearing the clothes of a functional one.

ContrastESM-2 headComposition only
vs distant Ξ±/Ξ²-hydrolase families0.9790.887
vs near misses1.0000.910
vs both0.9760.829

The honest test needs PET-inactive members of the polyesterase family, measured and published. Those barely exist, and the reason is structural: databases record what works. PAZy lists enzymes because activity was found; nobody systematically publishes β€œwe assayed this polyesterase on PET and it did nothing”. The negative class for the question that matters is largely unwritten, which is publication bias rather than a curation gap, and no further database mining will fix it.

🎯 The within-family test, run

There is one partial way round that, and it has now been run rather than argued about. PAZy curates enzymes measured on other plastics too (PA, PUR, PLA, PBAT, PHA). Most are different folds doing different jobs, and including a nylon amidase would be another easy negative. But 26 of them share a 30% cluster with a PET-active enzyme, which puts them inside the polyesterase family boundary. That is the closest thing to the missing negative class that exists.

Running the same head against negatives of increasing closeness, everything else fixed:

Negative regimePositivesNegativesHead AUCComposition only
Near-miss (one ESTHER Cutinase family)3051100.997 Β± 0.0060.890
Out-of-family (distant Ξ±/Ξ²-hydrolases)3051090.975 Β± 0.0220.906
Within-family (measured on another plastic)305260.850 Β± 0.0550.651
Within-family, mixed clusters only152260.493 Β± 0.2970.398

Discrimination decays monotonically as the negatives get closer, and collapses to chance at the boundary that matters. The head beats composition in every regime except the last. In the strictest one, where every negative has a PET-active enzyme inside its own cluster, so family membership carries no information at all, it scores 0.493: a coin flip.

The conclusion does not depend on where the family boundary is drawn. β€œInside the family” has no single right answer, so the same test was run under three definitions:

Family definitionNegativesShared clustersHead AUCComposition
Shares a 30% cluster with a PET-active enzyme2670.493 Β± 0.2970.398
Hits the per-cluster profile library (the test recall applies to every candidate)1230.279 Β± 0.1680.413
Passes both1230.279 Β± 0.1680.413

Under the stricter, profile-based definition the head is not merely at chance but inverted: it ranks the within-family negatives above the PET-active enzymes. With 12 negatives across 3 shared clusters that is not evidence of a real inverse signal, and it should not be read as one. What it does do is close off the remaining optimistic reading, because no choice of family boundary produces discrimination.

A fourth definition was tried and rejected rather than reported: the pooled PLC_all.hmm profile admits only 6 of the 155, and misses proteins literally named Cutinase and CutL1. That is the pooled profile’s already-documented failure β€” it scored 0/111 on the near misses, which is why the per-cluster library exists β€” and quoting it would have understated the negative set by reproducing a known bug.

The strictest rows are underpowered, and saying so is part of the result. One cluster holds 85% of the positives, so the cluster-grouped folds come out badly lopsided, and the per-fold AUCs are 0.193, 0.714, 0.208 and 0.857. A mean of 0.493 across that spread cannot distinguish β€œno signal” from β€œnot enough data to detect one”. What it does rule out is a large, easily-learned signal, which the 0.976 headline might otherwise be read as implying.

Two caveats travel with these numbers permanently:

  • The negatives are weak. PAZy records only positive substrate associations, so β€œPET not listed” conflates inactive with never assayed. Some fraction are false negatives, which pushes measured discrimination down: the within-family figures are a lower bound, not a point estimate.
  • The composition baseline is doing more work than it appears. It reaches 0.906 against out-of-family negatives. Most of the headline 0.976 is therefore available from amino acid composition alone, and the head’s real contribution is the margin above that, not the absolute number.

The practical conclusion is not that the approach fails, but that the evaluation is label-limited rather than method-limited, and the binding constraint is now a few dozen measured within-family negatives rather than any modelling choice.

πŸ”¬ And the same test on geometry

Geometry is the one signal here measured off coordinates rather than inherited from an annotation, so it is the obvious thing to try on the contrast the embeddings failed. AlphaFold models were taken for the characterised enzymes that have them (131 measured: 114 PET-active, 17 within-family negatives) and the active site measured on each. Mean pLDDT is 90.4 against 91.3, so nothing below is a model-confidence artefact.

Compared directly, several features separate the two groups convincingly:

FeaturePET-activeWithin-family negativesAUCp
Cleft depth (Γ…)4.203.410.819<0.001
Cleft-lining residues82.988.30.788 *<0.001
Oxyanion donor 2 distance (Γ…)4.564.950.742 *0.001
Oxyanion donor 1 distance (Γ…)2.973.230.696 *0.009
Cleft width (Γ…)19.3821.780.686 *0.014
Triad Ser–His (Γ…)2.872.870.5990.190

* inversely predictive: the feature is lower in PET-active enzymes.

PET-active polyesterases have deeper, narrower clefts with fewer lining residues and a tighter oxyanion hole. That is a physically sensible picture, and three of those p-values survive Bonferroni correction across the nine features tested.

It does not survive cluster-grouped evaluation. Trained on all nine features and split by 30% cluster, exactly as every other number in this project:

Β AUCFolds
Geometry, cluster-grouped0.533 Β± 0.1850.394 / 0.838 / 0.525 / 0.375
Sequence embeddings, same question0.493 Β± 0.297β€”

So the apparent geometric signature is largely cluster structure. Within the enzymes to hand, PET-active ones really do have deeper clefts; but which enzymes are PET-active is confounded with which family they belong to, and once a model has to generalise to a cluster it has never seen, the separation goes. Only 8 clusters contain a negative at all and only 4 of those also contain a PET-active enzyme, which is far too thin a base to learn a transferable rule from.

Both signals fail the same test for the same reason, and it is not the method. This is the clearest statement of the constraint the project is actually under: raw feature differences that look decisive at p<0.001 collapse under cluster-grouped splitting, which is precisely why that splitting is the rule here and why the composition baseline is reported permanently. The finding is not β€œgeometry does not work” but β€œgeometry cannot be shown to work on 17 negatives spanning 4 shared clusters”.

Three routes that would, in PHASE1_FINDINGS.md: ordinal within-paper rankings, regression on measured rates instead of a binary label, and geometry as an annotation-independent axis.

A caution about the evidence tiers. Of the 449 entries carrying EC 3.1.1.101 by automatic annotation, none is a measurement: they hold ECO:0000256 (by similarity), not ECO:0000269 (experimental). They were briefly labelled β€œunreviewed”, which reads as a curation backlog rather than the substantive difference it is. Sixteen positives have experimental evidence. That is the number the Methods tab will report.

πŸ”­ The profile library and the recall run

Recall is a two-stage funnel: MMseqs2 casts the net across millions of sequences fast, HMMER makes the sensitive call on the survivors. Every candidate keeps its retrieval numbers (E-value, bitscore, profile identity), because those are the baseline the learned model has to beat.

The library is one profile HMM per 30% sequence cluster, each with its own catalytic anchor, rather than a single pooled profile. That matters: a single profile built over the polyesterases scored 0 of 111 near misses as triad-complete, not because classic cutinases lack a catalytic triad but because they never aligned well enough for the columns to map. Per-cluster profiles took that to 79%, so the near misses survive recall and reach the scoring stage where they belong.

Anchors come from UniProt’s own Active site annotation rather than being hardcoded. Cross-checked before adoption: aligning to a pooled profile and reading IsPETase’s verified S160/D206/H237 columns predicted LCC as S165/D210/H242 and TfCut2 as S170/D216/H248, and UniProt’s independently curated annotations give exactly those numbers.

Β Β 
Library built from529 positives in 29 clusters at 30% identity
Profiles3 (264, 73 and 3 sequences), anchored on LCC, P9WP41 and A6WFI5
Proteins scanned2,220,462
Candidates recovered128, all triad-complete
Runtime1,424 s (24 min) on an M1 Max

Funnel

StageSurviving
Scanned14,778,289
Passed the prefilter, profile scan and triad filter439

Retention is 0.003%. That is a choice (a strict E-value, then a hard requirement that Ser, His and Asp be connected in space), not a property of the data.

By source environment

EnvironmentProteins scannedCandidatesPer 1MMedian %ID to nearest characterised
Human gut12,584,4583112529.7%
Compost1,020,575696834.1%
Marine plastisphere737,027446026.5%
Landfill436,229153432.8%
Wastewater26,63100Β 
Total14,778,28943930Β 

The gut is now 71% of the catalogue by count and 85% by sequences scanned. Its yield is the lowest of the four productive environments, which is the honest reading: polyesterases are rarer in the gut than in compost, and the gut cohort is large because it was sampled deeply, not because it is rich.

The identity bands are the interesting part, because they separate rediscovery from genuinely unexplored sequence space:

Environmentβ‰₯70% identity (rediscovery)40 to 70%<40% (novel)
Compost151440
Marine plastisphere0044
Landfill1212

Compost gives the highest yield per million proteins and hands back 15 near-identical copies of enzymes that are already characterised, one of them a 100% identity match. That is unsurprising: LCC itself is leaf-branch compost derived, so compost is where the field has already looked.

Every single marine plastisphere candidate sits below 40% identity to anything characterised, with a best bitscore of 64.9 against compost’s 486. Nothing in that cohort is a rediscovery. This is spec section 2’s thesis in one table: E-value rank pushes the well-known enzymes to the top and the unexplored ones down, and re-ranking that is exactly what the learned model is for.

The wastewater assembly returned nothing, which is a reasonable null: it is the only source in the set that is neither plastic-associated nor compost.

The blind test: did recall find HGMP01-like enzymes unaided?

HGMP01 was not used to seed recall. Its sequence was unavailable when the gut scan was designed, and once obtained it was deliberately left out of the profiles, because the paper that describes it reports HGMP01-like genes as widely distributed across the gut microbiome. Recovering them without the seed is a real test; seeding first would have made it circular.

Against the five measured HGMPs:

Β Β 
Gut candidates311
With a detectable hit to any HGMP254 of 311 (82%)
Whose nearest HGMP is HGMP0133
Best identity to HGMP0138.3%
Median identity to nearest HGMP27.5%

So the pipeline independently recovered a large cohort of gut proteins resembling enzymes it had never been shown, and 33 of them sit closest to the one with measured activity at 40 Β°C and neutral pH.

What this does not show. None of them is HGMP01: the best match is 38.3%, so these are relatives rather than rediscoveries. That is consistent with the source paper, which found 697 HGMP01-like enzymes at 20% identity or better across the whole UHGP-100 database, where this scan covered 50 assemblies. It is also the expected outcome: HGMP01 comes from a UHGG genome that these particular assemblies need not contain.

The useful claim is narrower than β€œPANTS found HGMP01” and more interesting than nothing: recall reaches the right neighbourhood of sequence space unaided, in an environment nobody had asked it about until the therapeutic framing pointed there.

🧱 Stack

LayerChoice
RecallMMseqs2 18-8cc5c, HMMER 3.4 (brew binaries, shelled out to)
EmbeddingESM-2 t12-35M, frozen, CPU
Headsscikit-learn logistic regression, PU-corrected, Platt/isotonic calibration
StructuresESMFold offline, Boltz-2 via BoltzMaker for ligand co-folds (v2)
StorageSQLite (WAL), one file, no external database
WebFlask + gunicorn behind nginx, server-rendered templates plus vanilla ES6
Front endPlotly.js, Mol*, Tabulator. No React, Vue, npm, webpack, Streamlit or Dash

Two virtual environments, deliberately. The droplet has 3.8 GB of RAM shared with five other applications, so the always-on web process never imports torch: requirements-web.txt is Flask, gunicorn and gemmi, and nothing else. All heavy compute is precomputed offline on an M1 Max and shipped as SQLite rows plus static mmCIF.

πŸ”§ Installation

git clone https://github.com/bellcheddar/PANTS.git
cd PANTS

# external tools
brew install hmmer mmseqs2

# pipeline venv (offline batch work: torch, transformers, scikit-learn)
python3 -m venv .venv
.venv/bin/pip install -r requirements-pipeline.txt

# web venv (always-on serving: no torch, ever)
python3 -m venv .venv-web
.venv-web/bin/pip install -r requirements-web.txt

# keep bulk data out of the iCloud-synced Documents tree
mkdir -p ~/PANTSData/{raw,interim}
ln -s ~/PANTSData/raw data/raw
ln -s ~/PANTSData/interim data/interim

cp .env.example .env

πŸš€ Usage

.venv/bin/python PANTS.py init                # create dirs, DB schema, check symlinks
.venv/bin/python PANTS.py curate-seeds        # fetch wild types, derive variants
.venv/bin/python PANTS.py harvest-negatives   # ESTHER hard negatives, matched
.venv/bin/python PANTS.py status              # database summary
.venv/bin/python PANTS.py serve               # local dev server on :8005
.venv/bin/pytest                              # 28 tests
CommandDoes
initCreates the directory tree and the schema, enables WAL, warns if data/raw is not a symlink out of iCloud
curate-seedsFetches each wild type from UniProt by accession and derives every confirmed variant from its parent
harvest-negativesStreams the ESTHER slice from UniProt, classifies by family, selects a matched negative set
statusCounts of candidates, scores, structures, characterised enzymes and recent runs
serveFlask dev server (production uses gunicorn on port 8005)

πŸ”¬ Sequences are fetched, never typed

Every sequence enters through the UniProt REST client. Engineered variants have no accession of their own, so each is stored as a parent plus a mutation list and the sequence is derived, with apply_mutations refusing any substitution whose stated parent residue does not match.

That check earns its keep: a wrong mutation set yields a sequence that is still a valid protein, still folds, still embeds and still trains. The error would never surface as a crash, only as quietly degraded scores. Where a complete mutation set could not be confirmed, the variant is recorded with no sequence and excluded from training, because a partial set gives a wrong sequence and that is worse than an honest gap.

find_offset determines the mature-versus-precursor numbering shift rather than guessing it: only an offset satisfying every mutation at once is accepted. All four confirmed variants validated at offset 0, across 14 residue positions.

Corrections this caught during curation: Q6A0I4 was initially curated as Cut190 and is actually TfCut2 (Thermobifida fusca). Cut190 is W0TJ64, and its strain assignment (AHK190 versus type strain P101, both 304 aa) is still unresolved.

πŸ“Š Evaluation protocol

ElementRule
SplitsBy sequence cluster at 30% and 50% identity, never by sequence. Both reported
GeneralisationLeave-one-family-out across ESTHER families
Retrieval baselineModel rank versus HMMER E-value rank on held-out characterised enzymes
Composition baselineAmino-acid composition plus length, cluster-grouped. Reported permanently
CalibrationReliability diagrams and Brier score, not just AUC
Prospective setAny PETase characterised after a fixed date, held out as a blind test
SubsetsReported separately for measured-activity and annotation-only positives

⚠️ Limitations

  1. Positives number in the low hundreds, and most carry family annotation rather than measured PET activity. Every score is an extrapolation from a small, biased sample.
  2. Published activity data is not harmonised across assay formats. Absolute rate predictions should not be trusted.
  3. Crystalline PET degradation at 37 Β°C by any known enzyme is slow. PANTS ranks relative promise, not therapeutic viability.
  4. Predicted structures are predictions. Cleft geometry from ESMFold on a metagenomic sequence with no close homologue carries real uncertainty.
  5. Nothing here addresses delivery, immunogenicity, biodistribution, or what happens to liberated TPA and EG in vivo. Those decide whether any of this is a therapy.
  6. Metagenomic candidates may come from unculturable organisms, may not express in a standard host, and may be fragments or misassemblies.
  7. A learned head does not beat retrieval on measured labels. On the hardest contrast the paired lead over nearest-neighbour retrieval is +0.159 [βˆ’0.263, +0.390], spanning zero, and eighteen times the language-model parameters changed nothing. The shipped ranking is therefore retrieval, and the earlier AUC 0.976 was measured against an easier negative class.
  8. Ranking PET activity within the polyesterase family is the question that matters, and it is not solved. Against 150 measured-inactive polyesterases the head reaches 0.582 Β± 0.067 and active-site geometry reaches 0.398 β€” below chance. The determinants are lineage-specific: the same model fitted inside different families points in unrelated or opposite directions, so a model trained across families learns something that reverses on a family it has not seen.
  9. Old note, kept: the composition baseline was 0.778 on the earlier annotation-heavy positive set. Until a model clears that as well as the E-value baseline, no claim of learned discrimination is supported.
  10. Of 854 positives, 341 carry a measurement. The rest are automatic EC annotation or family membership, so any head trained today is trained mostly on predicted labels.
  11. Everything of interest is packed tightly in embedding space (characterised PET enzymes sit at cosine 0.96 or above to each other, candidates at a median 0.931 to their nearest known enzyme). The head discriminates small differences inside a dense cluster, not well-separated groups.

πŸ“š Data sources

SourceUse
UniProt / UniRefReference sequence space, taxonomy, evidence level, signal peptides
ESTHERΞ±/Ξ²-hydrolase family assignment, hard negatives, near misses
PAZyCharacterised plastic-degrading enzymes: the measured-activity positives
PDBExperimental structures and ground-truth geometry
MGnify, JGI IMG/M, OceanDNA, Tara OceansMetagenomic assemblies for mining
Meltome Atlas, FireProtDBThermostability transfer learning
AlphaFold DBPrecomputed structures where a UniProt match exists

βœ… To Do

Roadmap for PANTS, roughly in dependency order. Suggestions welcome.

  • βœ… Repository scaffold and the two-venv split. requirements-web.txt carries Flask, gunicorn and gemmi and nothing else, so the always-on droplet process never imports torch. The droplet has 3.8 GB shared with five other applications, which makes this a memory constraint rather than a style preference
  • βœ… SQLite schema with manifest provenance. Thirteen tables, WAL enabled once at creation, every pipeline stage opening a run and writing input/output hashes, tool versions, git commit and wall time to both a table and a JSON file. A stage that raises still leaves its manifest behind
  • βœ… Verify torch on Python 3.14 (plan risk 8). torch 2.13.0 installs cleanly with MPS available, so no fallback to 3.11 was needed
  • βœ… Install and pin the external tools. HMMER 3.4 and MMseqs2 18-8cc5c, shelled out to rather than bound as libraries, with versions captured in every manifest
  • βœ… Move bulk data out of the iCloud tree. data/raw and data/interim symlink to ~/PANTSData; macOS β€œOptimize Mac Storage” evicts large files mid-run and this machine has only ~62 GB free
  • βœ… Curate the characterised seed set. Wild types fetched from UniProt by accession; engineered variants derived from parent plus mutation list, with every substitution checked against the parent residue it names. All four confirmed variants validated at offset 0 across 14 positions
  • βœ… Harvest ESTHER hard negatives. Matched on five axes: length distribution, identity to nearest positive, genus cap, signal peptide and phylum
  • βœ… Run the trivial-baseline gate before any embedding work (plan risk 1). It fired, and found both that the curated positives are one cluster rather than nine examples, and that the negatives were separable on a secreted-versus-cytoplasmic composition signature
  • βœ… Record an evidence level on every positive. UniProt protein_existence separates the 23 with protein-level evidence from the 56 predicted or inferred, so the two are never pooled in a reported metric
  • βœ… Make the composition baseline a permanent reported metric. Stored alongside the retrieval baseline in training_runs, with n_positive_clusters recording independent units rather than the raw count
  • βœ… Curate measured activity data. Taken from UniProt’s machine-readable, citable annotations rather than transcribed from PDFs, which is where fabrication risk lives. EC 3.1.1.101 (poly(ethylene terephthalate) hydrolase) gave 459 entries and took the positive set from 87 sequences in 11 clusters to 529 in 29. 47 measurements extracted (21 Km, 8 Topt, 8 pH optima, 10 qualitative), each carrying its PubMed IDs, with comparable_group_id keyed on parameter plus substrate so a Km on pNP-butanoate is never pooled with one on PET film
  • βœ… Add the gut microbiome as a fourth source environment. The three current environments (compost, marine plastisphere, landfill) are all external. A human gut metagenome is the one that matters most for the therapeutic framing: an enzyme already resident at 37 Β°C, pH 7.4 and in a proteolytic environment has been selected under something close to the target conditions, rather than being asked to work far from its optimum. HGMP01 is the concrete starting point: it is named in spec section 1, it is metagenome-derived rather than a variant of a characterised parent, and it is currently the one named enzyme the recall stage is expected to recover from sequence space instead of being seeded with. Done: 12,584,458 gut proteins from five MGnify studies, registered as human_gut and now 71% of the catalogue. HGMP01 itself could not be seeded: it returns zero hits in UniProt and in NCBI protein/nuccore, and its paper (PMID 39551294) has no linked sequence records, so the sequence sits in supplementary material. That is not a blocker but an advantage, because the same paper reports HGMP01-like genes as widely distributed across the gut microbiome, so recall finding them unaided is a blind test rather than a circular one
  • βœ… Obtained all five HGMP sequences. No public database holds them (zero hits across UniProt, NCBI protein and nuccore), but the authors deposited them on SciDB. The paper and the deposit use different numbering: the paper’s HGMP01 to HGMP05 are the deposit’s HGMP03, 04, 06, 07 and 08, so matching on name would have mislabelled all five. The mapping is pinned by two independent facts, sequence length (all five distinct, so 1:1) and homologue count (the paper’s β€œ697 putative HGMP01-like enzymes” matches the deposit’s HGMP03 exactly). HGMP01 = GUT_GENOME238302_00589, 275 aa, optimum 40 Β°C at near-neutral pH: the only measured PET hydrolase in this project whose optimum is close to physiological
  • βœ… Built the ordinal-within-paper fallback, and established why it is the route rather than a fallback. Before this the database held exactly one quantitative value measured on PET; all 21 Km values were on soluble pNP-ester proxies. Attempting the real thing showed why: PET rates live in figure panels, not in extractable text or structured deposits, so they cannot be harvested at scale. The brief anticipated this and proposed within-paper ordinal ranking, which now exists as a parameter_type with ordinal_rank_in_paper, seeded from PMID 39551294 (HGMP01 first of five on PET nanoparticles, the other four recorded as equal-second because the paper does not order them). Assay conditions are attached so the comparison is interpretable
  • βœ… Got measured within-family negatives β€” 29 to 156. The binding constraint, broken by two 2025 screens that assayed panels under one protocol and reported what did NOT work, both with openly deposited source data. ACS Catalysis 2025 (10.1021/acscatal.5c03460): 477 proteins with sequences, 216 assayed, 88 measured inactive at a stated 0.1% depolymerisation floor, and assayed at 40 Β°C as well as 60 Β°C β€” almost every optimum in this catalogue sits between 50 and 78 Β°C and the therapeutic target is 37 Β°C. Science 2025 (10.1126/science.adp5637, Data S3): 2,064 library entries, 183 assayed, 69 measured inactive against each entry’s own replicate standard deviation β€” active above 2 SD, inactive at or below 1 SD, and the 12 in between labelled neither way and excluded from training, because those are exactly the enzymes a threshold would be tuned on. The distinction that matters: PAZy’s negatives mean β€œnot reported active”, which cannot separate tested-and-failed from never-tested; these were expressed, assayed and found not to release product. Measurements went 75 to 2,759 and the catalogue 1,140 to 1,348
  • βœ… Re-ran every evaluation on the measured negatives, and found the constraint was never the count. Negatives 26 to 149; clusters holding BOTH an active and an inactive enzyme, 7 to 8. Five times the data bought one independent lineage, because the binding quantity is not how many negatives exist but how many lineages anyone has measured on both sides. On the full measured within-family contrast the head scores 0.648 and amino-acid composition scores 0.644 β€” no advantage at all over counting residues. Restricted to mixed clusters, the hardest honest test, it reaches 0.625 against composition’s 0.519. The real gain is the error bar: that test previously read 0.435 Β± 0.301, an interval that excluded nothing, and now reads 0.625 Β± 0.081. The model did not improve; the experiment became powered enough to give a stable answer, and the answer is a modest signal that is not composition. Also worth recording: adding polyesterase negatives collapsed the composition baseline from 0.803 to 0.565 and retrieval from 0.952 to 0.787, so the earlier numbers were flattered by an easy negative class, and the head-versus-retrieval gap stayed at zero (βˆ’0.009 before, +0.003 now) while both fell
  • βœ… Asked the geometry question of measured labels, and the earlier signal vanished. Active-site geometry was the one signal here measured off coordinates rather than inherited from an annotation, so it was the obvious thing to re-test. On inferred negatives cleft depth separated PET-active from PET-inactive at AUC 0.808, p 1.7e-07, falling to 0.534 cluster-grouped β€” read at the time as an underpowered evaluation waiting for data. Asked of 237 PET-active against 139 measured-inactive β€” the complete folded set, 205 new structures over 23 hours β€” all ESMFold on both sides so no coordinate-source confound applies, the answer is AUC 0.398 (0.360–0.453 across ten random splits). Below chance, and every split lands there: the relationship the features carry inside training clusters reverses in held-out ones, which is the signature of fitting lineage rather than activity. The trajectory is the strongest part of the evidence β€” 0.507 at 95 negatives, 0.498 at 125, 0.459 at 139, 0.398 with the positives complete. A real effect emerging from a thin sample strengthens and narrows around a non-null value; moving toward and past chance as the sample grows is a confound being diluted, and that distinction is exactly what let the earlier reading survive as β€œunderpowered” for as long as it did. A coin flip, with an interval finally tight enough to exclude something. Not one of the nine features survives at p<0.01 and cleft depth comes in at 0.529, p 0.38. That 0.808 was never measuring PET activity; it was measuring whatever separates the enzymes a database happens to list from the ones it does not, and it disappeared the moment the labels came from somebody running the assay. One limit stated with it: only 8 clusters hold both classes, and every structure is a prediction, so if ESMFold idealises the active site β€” which the paired crystal-versus-model comparison shows it does β€” a real difference could be flattened by the modelling rather than absent from the enzymes
  • βœ… Found why nothing transfers: the determinants are lineage-specific. Three independent methods had failed identically β€” sequence embeddings, a learned head and active-site geometry all work out-of-family and collapse within it β€” and the usual reading is too little data. This test asks instead whether a global rule can exist at all, and needs no train/test split, so it cannot be leakage in disguise: fit the same model separately inside each of the three lineages large enough to support one, then compare the directions the fits point in. The reference is not zero but an empirical ceiling β€” how well two bootstrap resamples of the same lineage agree, since noisy vectors from an identical process do not agree perfectly either. Two fits of the same lineage agree at ~+0.70. Two different lineages agree at roughly zero, and in two of three pairs point in OPPOSITE directions β€” what predicts activity in one family predicts inactivity in another. The same pattern appears in two feature sets sharing nothing, one from 3D coordinates and one from a language model over sequence. The high ceiling is what makes it a result rather than a shrug: within-lineage directions are well determined, so it is specifically the between-lineage comparison that fails. It also explains the below-chance numbers β€” a model trained across lineages learns a direction that reverses on an unseen one, which is exactly how geometry reached 0.398 and why an 18x larger language model changed nothing. The problem was never capacity and never only sample size: there may be no single global rule to learn. Established on three lineages, so a strong indication rather than a settled law, but the first explanation that accounts for every failure at once
  • βœ… Measured where the signal holds, and concluded the deliverable is retrieval. With a global rule ruled out, the remaining question is the one a user asks: how close must a candidate be to characterised enzymes before a prediction means anything? Re-clustering inside the 262-member lineage (171 measured-active, 91 measured-inactive) at 95/90/80/70/60/50% identity and holding out whole sub-clusters gives the curve. Read as point estimates it shows an operating band β€” head 0.703 against retrieval’s 0.544 at 70%. Read with intervals it is not there: the paired lead, head minus retrieval on the same held-out sub-clusters, is +0.159 [βˆ’0.263, +0.390], spanning zero. Seventeen sub-clusters cannot resolve a difference that size, and the curve is not monotonic β€” amino-acid composition beats both at 80%. One thing survives: at 70% the head’s own interval [0.521, 0.798] excludes 0.5, so within a lineage among relatives sharing ~70% of their sequence there is weak evidence of better-than-chance discrimination. It simply cannot be shown to beat looking up the nearest known PETase. So PANTS should ship nearest-neighbour retrieval, not a learned classifier β€” simple, untrained, no risk of learning a lineage direction that reverses, and nothing built here beats it on labels somebody measured. A smaller claim than the project set out to make, and the one the evidence supports
  • βœ… Switched candidate ranking to retrieval, with a stated competence range. Candidates were ranked by HMM bitscore, which says a sequence matches the polyesterase profile β€” the easy question, answered at AUC 0.98, and not what anyone is here for. They are now ranked by identity to the nearest enzyme whose PET activity was measured, which is different from the existing nearest_characterised_id: that field points at the nearest entry in the whole catalogue, usually one carrying an EC number assigned automatically by similarity, so it could rank a candidate highly for resembling something nobody ever assayed. Schema v17 adds nearest_measured_id, nearest_measured_identity and retrieval_band. Every candidate now carries its band, from the identity-decay measurement: 16 in range (β‰₯70%), 39 marginal (50–70%), 384 out of range (<50%) β€” ranked, but with no demonstrated validity at that distance. Median identity to a measured-active enzyme is 36.7%. The catalogue states the tension rather than hiding it: ranking by similarity rewards candidates resembling what is already known, which is the opposite of discovery and the bias this project set out to correct. The low-identity candidates are the interesting ones and the ones nothing here can score. That is the state of the evidence, and the fix is measurement on new lineages rather than a cleverer model
  • βœ… Ingested the rest of the Science supplement, and left one file out on purpose. S2 (2,064 sequences) is byte-identical to what S3 already supplied β€” verified all 2,064, then skipped, because ingesting it would create nothing and risk duplicating rows whose counts this project quotes as evidence. S1 is the 25,411-sequence homologue search space with no activity measured on any of it; 25,041 went into a separate unlabelled_sequences table rather than the catalogue, because nothing there has been characterised and letting it into the table whose totals are quoted would corrupt every count on the site. S7 gives per-cluster ecology β€” isolation source, biome, habitat, geography and the temperature the source organism was isolated at, which is not the enzyme’s optimum and is stored under a name that says so β€” kept at cluster level because that is the level it is reported at. 170 clusters stored, 354 catalogued enzymes linked. One result falls straight out: under the paper’s own cluster framework 14 clusters hold both a PET-active and a measured-inactive enzyme, against 8 under our 30% identity clustering, so the shortage of lineages measured on both sides is real under either definition and slightly less severe under theirs
  • βœ… Made the PAZy citations queryable, and found the ordinal route was not needed yet. Schema v15 lifts the primary DOI out of the free-text notes into a column: 342 enzymes across 88 papers, 31 of which cover more than one enzyme and 285 enzymes (83%) inside such a paper. An access audit over those 31 found 16 papers holding 177 enzymes with machine-readable full text through Europe PMC. The first one opened supplied absolute rates rather than ranks β€” percent depolymerisation under one protocol β€” which is strictly better than the ordinal signal this item was raised to extract, so ordinal encoding is deferred to the papers that only rank. Twelve papers holding 96 enzymes are not openly reachable, and are recorded as a quantified gap rather than a silent one
  • βœ… Resolved the Cut190 strain ambiguity. W0TJ64, not C7MVE8. Length could never separate them (both 304 aa), but the crystal structures can: 4WFI, 4WFJ, 4WFK, 5ZNO, 5ZRQ and 5ZRR all cross-reference W0TJ64, and C7MVE8 has no PDB entry at all. Structural evidence beats a name match, and the seed was right by luck rather than by evidence until now
  • βœ… Promoted Micpa-PETase and Kutbu-PETase to named enzymes. Both arrived through the bulk PAZy import as PAZy:270 and PAZy:276 under PAZy’s abbreviations, and every reference view filters on enzyme_id NOT LIKE 'PAZy:%', so an identifier decided whether a named enzyme with a crystal structure appeared at all. Renamed in place rather than duplicated β€” a second row with the same sequence would double-count the enzyme in every total on the site β€” cascading by hand through reference_structures, reference_geometry and activity_measurements, which reference it with ON UPDATE NO ACTION. Both verified against the Science library by exact sequence match before renaming: Micpa-PETase (Micromonospora pattaloongensis, PDB 8YTU at 1.34 Γ…) is the most active enzyme in that entire screen at 1,506 Β΅M product release, and Kutbu-PETase (Kutzneria buriramensis, PDB 8YTW at 2.65 Γ…) melts at 88.8 Β°C
  • βœ… Confirm the outstanding mutation sets. All five are resolved, and two further variants (DepoPETase, LCC-A2) were found in the same pass. HotPETase and Cut190**SS came from crystal structures; DuraPETase, TurboPETase and Z1-PETase from verified mutation sets, all matching at offset 0. Every engineered variant now carries a sequence, and the whole seed set rebuilds from one command
  • βœ… Choose and acquire the metagenome collections, size-checked first. 2,220,462 predicted proteins (858 MB) from landfill, marine plastisphere and compost assemblies. Only assemblies carry proteins: MGnify’s largest plastisphere study has 357 samples and no protein sequences at all, being 16S amplicon
  • βœ… Build the recall stage. One profile HMM per 30% cluster, each anchored on UniProt’s own Active site annotation, MMseqs2 prefilter then hmmscan and a triad completeness filter. 128 candidates from 2.2M proteins in 24 minutes, with discard counts reported at every step
  • βœ… Detect the oxyanion hole properly. The structure stage was already doing it structurally, but wrongly: β€œthe two backbone N atoms closest to the serine” returns Met161 and Trp185 on IsPETase, whose published donors are Tyr87 and Met161. Now takes donor 1 by position (the nucleophile elbow) and donor 2 from the sequence-distant oxyanion loop via an N–H direction test, recovering both donors from 6EQE and pinned by three regression tests. Geometry records which residues it identified, since the old output could not have revealed the error
  • βœ… Embed the candidate set. ESM-2 t12-35M, frozen, CPU, mean-pooled with padding and CLS/EOS excluded. 848 vectors at 480 dimensions in under a minute
  • βœ… Filter fragments and length outliers. From UniProt’s own Fragment flag rather than a length cutoff, plus a 200 to 450 aa window derived from the experimentally evidenced positives. Marked, never deleted, so the catalogue stays complete and the exclusion stays auditable
  • βœ… Train the PET activity head. Three labelling schemes, cluster-grouped, with the Elkan-Noto class prior estimated (c = 0.645) rather than assumed and swept across 1/3/5/10% on out-of-fold scores. At 30% identity: all-annotated 0.967 Β± 0.020, measured-only 0.921 Β± 0.072, PU 0.782 Β± 0.159. Two things the sweep taught by being wrong first: clipping the prior-adjusted score at 1 collapses everything above the prior into a tie and the ties move the AUC, which made the prior look influential (0.913 to 0.977) when it is invariant by construction; and refitting on the rows being scored returned 1.000 for every prior, memorisation wearing the costume of an invariance check. AUC is now omitted from the sweep on purpose and what the prior genuinely governs is reported instead β€” how many sequences get called positive, 78% at a 1% prior down to 65% at 10%
  • βœ… Run the full evaluation protocol. Five of the six components run; the sixth was made to run. Cluster splits at 30% and 50%: 0.967 and 0.975 all-annotated, so the threshold is not doing the work. Leave-one-family-out is degenerate, and that is the finding rather than a gap β€” all 13 ESTHER families are wholly positive or wholly negative (Polyesterase-lipase-cutinase 77/0, Cutinase 0/110), so holding one out removes a class and AUC is undefined: in this catalogue the label is family membership. Prospective holdout could not use pdb_release_date, which is empty for the entire catalogue, so UniProt first-public dates were fetched for 858 of 890 accessions spanning 1986 to 2026; AUC 0.908 at a 2020 cutoff, reported UNDERPOWERED because the test side holds 366 positives and 6 negatives. Reliability is saturated: five of eight quantile bins sit at a predicted 1.00, which is what a head that has learned family membership looks like. The verdict that matters is against the baselines: composition 0.736, nearest-measured-positive retrieval 0.931. The all-annotated head clears retrieval by +0.037 and the measured-only head does not clear it at all (-0.009). Trained on labels somebody actually measured, the learned head does not beat looking up the nearest known PETase β€” which is the same conclusion the sequence and geometry evaluations reached, arrived at a third way
  • βœ… Smoke-test ESMFold before committing to a full run. Cleared: 8.44 GB model (it bundles ESM-2 3B), 31 min to load, 109 s to fold 290 residues. No Boltz-2 fallback needed. The prediction reproduces IsPETase’s crystal active site exactly (S160/D206/H237, Ser-His 2.98 A against 2.94)
  • βœ… Extract active-site geometry, validated on crystal structures first. The triad is found by geometry rather than sequence position, and recovers the published triads of 6EQE and 4EB0 exactly. Validation caught a brittle cleft-width metric: a hard radius feeding a max meant a 0.4 A shift in one residue halved the answer, scoring IsPETase’s own prediction at 11.09 A against its crystal’s 20.90 A. Now a percentile over a wider radius, and crystal-to-prediction disagreement fell from 9.81 A to 1.81 A
  • βœ… Establish whether geometry actually tracks PET activity. First tested on AlphaFold models of 131 characterised enzymes (114 PET-active, 17 within-family negatives), pLDDT-matched so nothing is a model-confidence artefact. Raw feature differences are convincing and physically sensible (cleft depth AUC 0.819, p<0.001; PET-active enzymes have deeper, narrower clefts with a tighter oxyanion hole), but cluster-grouped it collapses to 0.533 Β± 0.185, statistically indistinguishable from the sequence head’s 0.493. The signature is largely cluster structure. Re-run on the finished structure set and it reproduces exactly: 342 enzymes rather than 131, raw cleft depth AUC 0.808, cluster-grouped 0.534 Β± 0.173. A 2.6Γ— larger benchmark changed the conclusion by 0.001, which is the strongest evidence yet that this is label-limited and not method-limited. The binding constraint barely moved: within-family negatives went 17 to 26, in 10 clusters
  • βœ… Found the crystal structures the reference set already had. The builder had always ordered its sources experimental-first, and the branch had never once fired: the PAZy import records a UniProt accession and leaves pdb_ids_json empty, so all 312 of its enzymes fell through to a model. 12 of 320 structures were experimental because of a missing lookup, not a missing structure. Linking UniProt’s cross-references and ranking them (exact sequence match, then fewest differences, then X-ray, then resolution) took it to 60 of 354, best resolution 0.91 Γ…. Two traps: comparing sequences anchored at position 1 reported LCC, Cut190 and twenty others as 209-274 differences when they are identical, because the deposit is the mature chain and the stored sequence the precursor β€” searching the offset took exact matches from 10 to 36; and UniProt cross-references homologues freely, so deposits past 8 differences are refused and 4 enzymes keep the model computed from their own sequence
  • βœ… Established that geometry is not comparable across structure source. Adding the 55 crystal structures made the activity result worse β€” cluster-grouped AUC 0.749 on predicted structures alone against 0.553 pooled, with non-overlapping ranges across twenty random split seeds. More data lowering a score is a confound announcing itself. Among enzymes of the same activity class, geometry alone tells a crystal structure from a model at AUC 0.723; and paired within the same protein (51 enzymes measured both ways, so no enzyme-selection artefact is possible) the oxyanion hole differs systematically: the second donor’s angle is 23.6Β° in the crystal against 15.6Β° in the model (p 1.1e-06), its distance +0.78 Γ… (p 1.3e-07). Predictions build a tighter, more idealised oxyanion hole than the protein actually has. Cleft depth is source-invariant (p 0.072) and is also the strongest activity feature, which is the usable finding: a geometry model must hold the source constant or restrict itself to the features that survive. A third fact closes it off β€” all 57 experimental structures are PET-active and not one of the 26 within-family negatives has a deposit, because nobody crystallises the enzymes that do not work
  • βœ… Build the v1 tabs. Home, Catalogue, Candidate, Compare and Methods, with 3Dmol.js over static PDB and Plotly for every chart
  • βœ… Superposed interactive structure viewer, first working version. Verified in a real browser, not assumed: multiple structures load into one Mol* viewport in distinct colours and genuinely overlay, which confirms the pre-superposed-at-write-time design end to end. Two rendering defects remain, both recorded below
  • βœ… Render structures as cartoon rather than wireframe. Root cause found: Mol* fell back to lines because gemmi’s mmCIF carries no polymer or secondary-structure annotation, and the UMD build exports only 9 symbols. Moved to 3Dmol.js and now write HELIX/SHEET records computed with biotite’s P-SEA annotate_sse, which 3Dmol parses to set atom.ss directly
  • βœ… Draw the catalytic triad. Resolved by the same move: molstar.MolScriptBuilder is not exported by the UMD viewer build, so the selection expression could never be constructed. 3Dmol selects the triad residues directly
  • βœ… Designed the viewer interaction. Three of the four open questions are settled and one deliberately is not. The overlay set: IsPETase and FAST-PETase shown by default, because a candidate’s geometry means nothing beside one reference and one reference cannot show how far a working engineered variant has already moved; plus per-lineage small multiples sharing one camera, paginated at twelve. The triad: a transparent yellow surface drawn from the residues geometry measured, never from positions inferred by an alignment, with substitutions in pink and a click reporting the side-chain distance between them. IsPETase as a ghost: yes, grey, and every structure superposed onto it at write time so the browser aligns nothing. Sequence panels on every viewer page, click-through in both directions, monomers only, panel captions, and coordinates served under versioned URLs. Still open: whether pLDDT colouring becomes the default. It is the honest colouring for a prediction and the wrong one for a crystal structure, and now that 60 of 354 references are experimental the answer differs by panel rather than by page
  • βœ… Deploy to pants.mdeller.com. Live on port 8005 behind gunicorn, nginx and certbot, with an entry in the mdeller.com launcher. All validation in deploy.sh runs before the first rsync, so a failed deploy cannot leave new code on disk with the service still running the old build. Two droplet-specific fixes landed with it: HTML now carries no-cache so heuristic caching cannot pin stale ?v= asset URLs, and the /static/ location overrides nginx’s stock mime type for .pdb (application/x-pilot, the PalmPilot format), which had silently defeated gzip_types and was sending 100 MB of compressible text uncompressed
  • βœ… Measured real droplet headroom. Not estimates: 3,915 MB total, 2,498 MB available, and no swap configured, so an overcommit is a hard OOM kill rather than a slowdown. PANTS’ own web service is 58 MB across two workers. The box carries six applications and the large ones are AlphaFraud (1,294 MB) and chatPDB (608 MB). Disk is 19 GB free of 77 GB. The conclusion for v2: ESMFold cannot run here at all β€” 8.44 GB of weights against 2.5 GB available β€” and nothing about that is close enough to tune. ESM-2 t12-35M at roughly 150 MB is the only model that fits, which is the same reason the web virtual environment carries no scientific libraries: structures and embeddings are computed offline and served as precomputed files
  • βœ… Tried to build on the sequence head, and stopped on evidence. Frozen ESM-2 at 35M, 150M and 650M, mean-pooled: size-weighted leave-one-cluster-out AUC 0.562, 0.472, 0.465 against a composition baseline of 0.472. Eighteen times the parameters buys nothing. Two measurement faults found on the way and fixed. The k-fold evaluation reported Β± 0.000 across ten seeds β€” not stability but only 2 distinct partitions, because one cluster holds 68% of the data and four folds cannot separate it; switched to leave-one-cluster-out. And the unweighted LOCO mean of 0.625 was an artefact of averaging seven clusters of 2–6 enzymes, where an AUC can only land near 0 or 1, alongside the three real values of 0.443, 0.429 and 0.574; size-weighted it is 0.472. With three evaluable folds the standard error is ~0.06, so every representation tried sits inside one interval β€” the differences were never measurable. A ranking objective was assessed as the escape route and rejected on data: only 3 clusters hold two enzymes whose rates differ by more than replicate noise, against 10 for the binary objective, so ranking narrows the base rather than widening it. What would change the verdict is not more enzymes but more lineages: roughly 10 enzymes from each of ~15 new 30% clusters under one protocol at 37 Β°C, about 150 assays, taking evaluable lineages from 3 to ~18 while measuring the therapeutic condition directly
  • βœ… Designed the validation panel that would lift the constraint. release/validation_panel.csv: 150 assays across 15 new 30%-identity lineages, one protocol, 37 Β°C on amorphous PET, taking evaluable lineages from 3 to about 18. Selected by breadth and deliberately not by predicted activity β€” using the prediction to choose what to measure would select enzymes resembling what is already known, which is the bias the project exists to correct. Members within each lineage are spread by greedy maximum-minimum distance rather than sampled from the centre, so ten near-duplicates do not measure the same enzyme ten times. First cut selected purely by cluster size and produced 140 of somebody else’s sequences against 10 of this project’s, testing none of the mining that built the catalogue; rebalanced to put PANTS’ own novel lineages first, giving 80 PANTS candidates (68 from human gut, the therapeutically relevant environment) and 70 homologues. Those 80 are precisely the out-of-range candidates nothing here can score, so measuring them adds lineages and asks whether the mining found anything real
  • βœ… Wrote the findings up, and made them un-staleable. FINDINGS.md is generated by scripts/build_findings_document.py, reading every figure from the JSON artefact that produced it β€” the same discipline applied after a Methods paragraph quoted a superseded AUC for weeks. Structured as claim / evidence / limitation rather than as narrative, because a negative result is only worth anything if a reader can see immediately what would overturn it
  • βœ… Hardened for handover. NEXT.md documents the state, the one experiment that matters, how to run everything, seven traps that have already cost time in this repo, and three things deliberately not done with the reasons. Five new tests guard the findings against drift by asserting structure and direction, never exact values β€” a test pinning AUC == 0.398 would fail the first time anyone legitimately adds data, which trains people to delete tests. 68 tests pass
  • ⬜ MHETase pipeline (v2). Its own seed and negatives: MHETase is Tannase family, so a PETase-seeded profile search cannot reach it
  • βœ… Published the catalogue as a citable dataset. Zenodo, CC BY 4.0, concept DOI 10.5281/zenodo.21807353, which always resolves to the newest version. v0.3.0 (10.5281/zenodo.21848998) carries eighteen files β€” the catalogue, the structures, and a JSON artefact for every analysis including the three negative results β€” and v0.2.0 (10.5281/zenodo.21827812) carried thirteen, each size-verified on upload and every figure in its description traced back to STATS.json before publishing. The description also leads with the negative result rather than burying it. DATASHEET.md is now GENERATED by build_release.py rather than hand-maintained: by v0.2.0 the hand-written one claimed 1,107 reference rows against 1,140, 48 measurements against 75 and 268 structures against 1,188, and still called the release β€œa snapshot taken before folding finished” months after folding finished

πŸ“¦ Dataset

The catalogue is deposited on Zenodo under CC BY 4.0: candidates with their retrieval scores and active-site geometry, the reference set split by evidence tier, the measured activity data with its citations, every pipeline run with its discard counts, and the predicted structures.

DOI

Β Β 
Concept DOI (always latest)10.5281/zenodo.21807353
This version (v0.1.0)10.5281/zenodo.21807354

Every figure in the deposit’s description and datasheet was recomputed from the deposited files by scripts/build_release.py rather than copied from this README. That is deliberate: on a sibling project six figures reached a Zenodo description by being copied from prose describing a checkpoint that was measured but never shipped, and a DOI would have made them permanent.

Cite as: Deller, M. C. (2026). PANTS: a triaged catalogue of candidate PET-degrading enzymes for therapeutic conditions. Version 0.1.0. Zenodo. https://doi.org/10.5281/zenodo.21807353

πŸ“ Licence

Data: Creative Commons Attribution 4.0 International, see LICENSE-DATA, and via the Zenodo deposit above.

Code: MIT, see LICENSE.

Attributing PANTS does not discharge the obligation to the sources it derives from: UniProt and UniRef (CC BY 4.0), the PDB (CC0), AlphaFold DB (CC BY 4.0), PAZy, ESTHER and MGnify, each of which carries its own terms.


πŸ‘€ Author

Marc C. Deller, D.Phil.
Structural biologist & drug discovery scientist

🌐marcdeller.comβœ‰οΈmarc@marcdeller.comπŸ™github.com/bellcheddar/PANTS