Skip to main content

Glass-box local periodicity-loss observable of the mRNA stacking profile for repeat-expansion disorders (DM1, Huntington, SCA1)

Project description

energorna

CI PyPI License: MIT

Glass-box local periodicity-loss observable of the mRNA stacking-energy profile, for repeat-expansion disorders. Numpy-only, no ViennaRNA / GPU / API. Part of the QMetrika Bio-IA thermodynamic engine (same Turner nearest-neighbor parameters as ef-synonymous).

English · Español


English

The idea

In repeat-expansion diseases (myotonic dystrophy type 1, Huntington, SCA1, DM2…), age at onset is not set only by how many repeats there are, but by whether the repeat tract is interrupted. Interruptions (e.g. CCG in the CTG tract of DM1, CAA in the CAG tract of Huntington, CAT in SCA1) break the periodicity of the nearest-neighbor stacking energy profile Φ, disrupt the slipped-strand substrate that drives somatic instability, and delay onset.

energorna computes a single glass-box observable — periodicity_loss = 1 − ACF_period(Φ), the loss of autocorrelation (at the motif period) of the Turner stacking profile — that captures this. It auto-calibrates the period per motif (3 for trinucleotides, 4 for the CCTG tetranucleotide) and, unlike simply counting interruptions, is sensitive to their type and position.

Install

pip install energorna

Use — CLI

# pure (CTG)40 vs an interrupted allele
energorna score --repeat CTG --n 40
energorna score --seq CTGCTGCTG...CCGCTG... --motif CTG --json
energorna score --seq-file allele.fasta --motif CAG

Output shows the observable next to the traditional baselines:

motif CTG (period 3) · 62 units · longest uninterrupted run 51
  periodicity_loss      = 0.18xx   <- observable
  periodicity_loss (3') = 0.19xx
  n_interruptions       = 4        (count baseline)
  fragmentation_index   = 0.09xx   (fragmentation baseline)

Use — Python

import energorna as ef

ef.calibrate_lag("CCTG")                    # -> 4 (auto-detects the motif period)
ef.periodicity_loss(seq, unit="CTG")        # global observable
ef.periodicity_profile(seq, unit="CTG")     # (pos, loss) resolved 5'->3'
ef.periodicity_loss_3prime(seq, unit="CTG") # 3'-weighted
ef.n_interruptions(seq, "CTG")              # count baseline (to compare)

Why it matters (validation)

Across three diseases, periodicity_loss (or its axis, the longest uninterrupted stretch) predicts age at onset better than counting repeats:

Disease Data Result
DM1 Pešović 2018, n=7 periodicity vs onset residual r=+0.81 (LOO robust, bootstrap CI [+0.59,+0.99], perm p=0.027) vs count +0.53; captures type (CCG≫CTC) & position
Huntington GeM-HD 2019 (published directions) LOI < canonical < duplication — matches onset ordering
SCA1 Menon 2013 Table S3, n=35 longest uninterrupted stretch predicts onset R²=0.64 vs 0.24 for total size (r=−0.80, p=5×10⁻⁵)

Honest scope

A biologically motivated correlate, not proven causality. Individual, interruption-typed cohorts at scale (OPTIMISTIC, Enroll-HD) are access-controlled; the claim is "better predictor than count on the available data, with a mechanistic hypothesis and falsifiable predictions" (correlation with measured somatic instability, UV melting, MSH3 binding). Research use only.


Español

La idea

En enfermedades de expansión de repeticiones (distrofia miotónica tipo 1, Huntington, SCA1, DM2…), la edad de inicio no la fija solo cuántas repeticiones hay, sino si el tracto está interrumpido. Las interrupciones (p. ej. CCG en el tracto CTG de DM1, CAA en el CAG de Huntington, CAT en SCA1) rompen la periodicidad del perfil de energía de apilamiento nearest-neighbor Φ, alteran el sustrato slipped-strand que dirige la inestabilidad somática y retrasan el inicio.

energorna calcula un único observable glass-box — periodicity_loss = 1 − ACF_periodo(Φ), la pérdida de autocorrelación (al periodo del motivo) del perfil de apilamiento Turner — que lo captura. Auto-calibra el periodo por motivo (3 en trinucleótidos, 4 en el tetranucleótido CCTG) y, a diferencia de contar interrupciones, es sensible a su tipo y posición.

Instalación

pip install energorna

Uso — CLI

energorna score --repeat CTG --n 40
energorna score --seq CTGCTG...CCGCTG... --motif CTG --json
energorna score --seq-file alelo.fasta --motif CAG

Uso — Python

import energorna as ef
ef.calibrate_lag("CCTG")                    # -> 4 (auto-detecta el periodo)
ef.periodicity_loss(seq, unit="CTG")        # observable global
ef.periodicity_profile(seq, unit="CTG")     # perfil (pos, pérdida) 5'->3'
ef.periodicity_loss_3prime(seq, unit="CTG") # ponderado 3'

Por qué importa (validación)

En tres enfermedades, periodicity_loss (o su eje, el tramo ininterrumpido más largo) predice la edad de inicio mejor que contar repeticiones: DM1 (Pešović n=7, r=+0,81), Huntington (direcciones publicadas, LOI<canónico<duplicación) y SCA1 (Menon 2013 n=35, R²=0,64 vs 0,24 del tamaño total). Ver la tabla en la sección en inglés.

Alcance honesto

Es un correlato biológicamente motivado, no una causalidad demostrada. Los datos individuales tipados a escala son de acceso controlado; el claim es "mejor predictor que el conteo en los datos disponibles, con hipótesis mecanística y predicciones falsables". Uso solo para investigación (RUO).


Citation / Cita

Vilar Sánchez JA. energoRNA: local periodicity loss of the mRNA stacking profile predicts age at onset in repeat-expansion disorders. QMetrika Labs, 2026. Method covered by patent P202630522 (OEPM). Code under MIT.

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

energorna-0.1.0.tar.gz (9.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

energorna-0.1.0-py3-none-any.whl (9.4 kB view details)

Uploaded Python 3

File details

Details for the file energorna-0.1.0.tar.gz.

File metadata

  • Download URL: energorna-0.1.0.tar.gz
  • Upload date:
  • Size: 9.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for energorna-0.1.0.tar.gz
Algorithm Hash digest
SHA256 8c20ccc252ae814fc68351e08ff50cbf05b3e4ac107d2104482856da42f37435
MD5 3cba374524fdda719e732c3680c9a58d
BLAKE2b-256 ffaaf4a69bc1b4bfc8d1f960bcb2569bc9df9719e41c0ade7fe2d3ac0659cb8c

See more details on using hashes here.

Provenance

The following attestation bundles were made for energorna-0.1.0.tar.gz:

Publisher: publish.yml on josevilar-qbioai/energorna

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file energorna-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: energorna-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 9.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for energorna-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 31b6d17782c7616c4f77d436694b190174ff2d5546a2cccedfa7396109cde16f
MD5 8b61ea229cd4de405456433bb1d89e5e
BLAKE2b-256 49a9fe3a95034ad17e197d3d6a5fe8d4935a37130f945e497c5bd66eadf6faa7

See more details on using hashes here.

Provenance

The following attestation bundles were made for energorna-0.1.0-py3-none-any.whl:

Publisher: publish.yml on josevilar-qbioai/energorna

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page