Bio Fragment Analysis
GPTomics/bioSkills
Extracts cfDNA fragmentomics features (DELFI genome-wide short/long ratios, WPS nucleosome positioning, Griffin GC-corrected accessibility profiles, end-motifs/MDS, OCF) for cancer detection and…
Predict RNA secondary structure, MFE folding, base-pair probabilities, RNA-RNA interactions via ViennaRNA Python bindings.
$ npx skills add jaechang-hits/SciAgent-Skills --skill viennarna-structure-prediction -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills viennarna-structure-prediction --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/molecular-biology/viennarna-structure-prediction .claude/skills/viennarna-structure-prediction && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "viennarna-structure-prediction" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/molecular-biology/viennarna-structure-prediction into .claude/skills/viennarna-structure-prediction/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "viennarna-structure-prediction", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/molecular-biology/viennarna-structure-predictionType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add jaechang-hits/SciAgent-Skills --skill viennarna-structure-prediction -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills viennarna-structure-prediction --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/molecular-biology/viennarna-structure-prediction .agents/skills/viennarna-structure-prediction && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "viennarna-structure-prediction" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/molecular-biology/viennarna-structure-prediction into .agents/skills/viennarna-structure-prediction/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "viennarna-structure-prediction", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jaechang-hits/SciAgent-Skills --skill viennarna-structure-prediction -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills viennarna-structure-prediction --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/molecular-biology/viennarna-structure-prediction .cursor/skills/viennarna-structure-prediction && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "viennarna-structure-prediction" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/molecular-biology/viennarna-structure-prediction into .cursor/skills/viennarna-structure-prediction/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "viennarna-structure-prediction", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/jaechang-hits/SciAgent-Skills.git --path skills/molecular-biology/viennarna-structure-prediction--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add jaechang-hits/SciAgent-Skills --skill viennarna-structure-prediction -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills viennarna-structure-prediction --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/molecular-biology/viennarna-structure-prediction .gemini/skills/viennarna-structure-prediction && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "viennarna-structure-prediction" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/molecular-biology/viennarna-structure-prediction into .gemini/skills/viennarna-structure-prediction/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "viennarna-structure-prediction", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install jaechang-hits/SciAgent-Skills viennarna-structure-predictionInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add jaechang-hits/SciAgent-Skills --skill viennarna-structure-prediction -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/molecular-biology/viennarna-structure-prediction .github/skills/viennarna-structure-prediction && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "viennarna-structure-prediction" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/molecular-biology/viennarna-structure-prediction into .github/skills/viennarna-structure-prediction/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "viennarna-structure-prediction", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add jaechang-hits/SciAgent-Skills --skill viennarna-structure-prediction -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install jaechang-hits/SciAgent-Skills viennarna-structure-prediction --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/jaechang-hits/SciAgent-Skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/molecular-biology/viennarna-structure-prediction .opencode/skills/viennarna-structure-prediction && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "viennarna-structure-prediction" agent skill from https://github.com/jaechang-hits/SciAgent-Skills/tree/main/skills/molecular-biology/viennarna-structure-prediction into .opencode/skills/viennarna-structure-prediction/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "viennarna-structure-prediction", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
viennarna-structure-predictionPredict RNA secondary structure, MFE folding, base-pair probabilities, RNA-RNA interactions via ViennaRNA Python bindings.
Viennarna Structure Prediction is an agent skill from jaechang-hits/SciAgent-Skills. Predict RNA secondary structure, MFE folding, base-pair probabilities, RNA-RNA interactions via ViennaRNA Python bindings. Pipeline: sequence → MFE → partition function and pair-probability matrix → dot-bracket → duplex. Use for siRNA/sgRNA targeting, ribozyme design, RNA accessibility. Use RNAfold CLI for batch use without Python.
Its SKILL.md is about 5.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Research & Science, covering Bioinformatics and Accessibility. It works with Python. The repository describes itself as: 197 bioinformatics & life science skills for Claude Code and AI agents — BixBench 92.0% accuracy. RNA-seq, single-cell, drug discovery, proteomics, and more. Powers OmicsHorizon. The licence is MIT.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 82c862c. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
condapippythonFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
doi.orgtbi.univie.ac.atgithub.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Viennarna Structure Prediction loads about 5.4k tokens when it runs. Until then it costs about 91 tokens; SKILL.md has 885 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from jaechang-hits/SciAgent-Skills at commit 82c862c, republished under its MIT licence (© jaechang-hits). 885 words, ~5,421 tokens.
.claude/skills/viennarna-structure-prediction/SKILL.md (or your agent's skills folder).ViennaRNA is the gold-standard toolkit for RNA secondary structure prediction based on thermodynamic nearest-neighbor parameters. It predicts the minimum free energy (MFE) structure and dot-bracket notation for a given RNA sequence, computes the full partition function to obtain base pair probabilities, and models RNA-RNA interactions via co-folding and duplex prediction. The Python bindings (import RNA) expose the full ViennaRNA C library with sequence-level and fold-compound APIs. Command-line programs (RNAfold, RNAalifold, RNAduplex) are also available and demonstrated here.
mfold (web server) or RNAstructure instead when you need Mfold algorithm predictions specifically or need the Efold partition function; ViennaRNA uses the Turner 2004 nearest-neighbor parameters and is the standard for research-grade thermodynamic predictionViennaRNA (Python bindings), matplotlib, numpy# Install via conda (recommended)
conda install -c conda-forge -c bioconda viennarna
# Verify installation
python -c "import RNA; print(RNA.__version__)"
# 2.6.4
# Install additional Python dependencies
pip install matplotlib numpy pandas
# Optional: verify CLI tools are available
RNAfold --version
# RNAfold 2.6.4import RNA
# Predict MFE structure for an RNA sequence
sequence = "GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUCCACAGAAUUCGCACCA"
structure, mfe = RNA.fold(sequence)
print(f"Sequence: {sequence}")
print(f"Structure: {structure}")
print(f"MFE: {mfe:.2f} kcal/mol")
# Sequence: GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUCCACAGAAUUCGCACCA
# Structure: (((((((..((((........)))).(((((.......))))).....(((((.......))))))))))))....
# MFE: -31.30 kcal/molLoad an RNA sequence and compute its minimum free energy secondary structure using RNA.fold(). Validate the input and inspect the dot-bracket output.
import RNA
def prepare_sequence(seq: str) -> str:
"""Normalize sequence: uppercase, replace T→U, validate alphabet."""
seq = seq.upper().replace("T", "U").strip()
invalid = set(seq) - set("ACGUNX")
if invalid:
raise ValueError(f"Invalid characters in sequence: {invalid}")
return seq
# E. coli tRNA-Phe (GenBank: M10217)
raw_seq = "GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUCCACAGAAUUCGCACCA"
sequence = prepare_sequence(raw_seq)
structure, mfe = RNA.fold(sequence)
print(f"Sequence length: {len(sequence)} nt")
print(f"Structure: {structure}")
print(f"MFE: {mfe:.2f} kcal/mol")
# Validate: structure length must equal sequence length
assert len(structure) == len(sequence), "Structure and sequence length mismatch"
# Count stems (paired bases)
n_paired = structure.count("(") + structure.count(")")
n_unpaired = structure.count(".")
print(f"Paired bases: {n_paired} | Unpaired bases: {n_unpaired}")
print(f"Stem fraction: {n_paired/len(sequence):.2f}")The RNA.fold_compound object is the central API for partition function, base pair probabilities, and constrained folding.
import RNA
sequence = "GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUCCACAGAAUUCGCACCA"
# Create fold compound (wraps the sequence with model parameters)
fc = RNA.fold_compound(sequence)
# Compute MFE structure via the fold compound API
structure, mfe = fc.mfe()
print(f"MFE structure: {structure}")
print(f"MFE: {mfe:.2f} kcal/mol")
# Evaluate free energy of an alternative structure
alt_structure = "." * len(sequence) # fully unfolded
energy = fc.eval_structure(alt_structure)
print(f"Fully unfolded energy: {energy:.2f} kcal/mol")
print(f"Folding stabilization: {energy - mfe:.2f} kcal/mol")Compute the thermodynamic partition function to obtain ensemble-level base pair probabilities. High-probability pairs indicate well-defined structural elements.
import RNA
import numpy as np
sequence = "GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUCCACAGAAUUCGCACCA"
n = len(sequence)
fc = RNA.fold_compound(sequence)
# Step 1: MFE folding (required before pf for proper initialization)
structure_mfe, mfe = fc.mfe()
# Step 2: Rescale Boltzmann factors for numerical stability (optional but recommended)
fc.exp_params_rescale(mfe)
# Step 3: Compute partition function
structure_pf, gibbs_free_energy = fc.pf()
print(f"Gibbs free energy (ensemble): {gibbs_free_energy:.2f} kcal/mol")
print(f"MFE structure: {structure_mfe}")
print(f"Centroid (pf): {structure_pf}")
# Step 4: Retrieve base pair probability matrix
bpp = fc.bpp() # returns (n+1)x(n+1) matrix; 1-indexed
# Convert to 0-indexed numpy array for analysis
probs = np.zeros((n, n))
for i in range(1, n + 1):
for j in range(i + 1, n + 1):
if bpp[i][j] > 0.0:
probs[i - 1][j - 1] = bpp[i][j]
probs[j - 1][i - 1] = bpp[i][j]
# Identify high-confidence pairs (p > 0.9)
high_conf = [(i, j, probs[i, j]) for i in range(n) for j in range(i + 1, n) if probs[i, j] > 0.9]
print(f"\nHigh-confidence base pairs (p > 0.9): {len(high_conf)}")
for i, j, p in high_conf[:5]:
print(f" {sequence[i]}{i+1} — {sequence[j]}{j+1}: p={p:.3f}")Plot the base pair probability matrix as a heatmap to visualize structural regions.
import RNA
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
sequence = "GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUCCACAGAAUUCGCACCA"
n = len(sequence)
fc = RNA.fold_compound(sequence)
structure_mfe, mfe = fc.mfe()
fc.exp_params_rescale(mfe)
fc.pf()
bpp = fc.bpp()
# Build matrix
probs = np.zeros((n, n))
for i in range(1, n + 1):
for j in range(i + 1, n + 1):
if bpp[i][j] > 0.0:
probs[i - 1][j - 1] = bpp[i][j]
probs[j - 1][i - 1] = bpp[i][j]
fig, ax = plt.subplots(figsize=(8, 7))
im = ax.imshow(probs, cmap="hot_r", vmin=0, vmax=1, origin="upper", aspect="equal")
plt.colorbar(im, ax=ax, label="Base pair probability")
ax.set_xlabel("Nucleotide position")
ax.set_ylabel("Nucleotide position")
ax.set_title(f"Base Pair Probability Matrix\n(n={n} nt, MFE={mfe:.2f} kcal/mol)")
plt.tight_layout()
plt.savefig("bpp_matrix.png", dpi=150, bbox_inches="tight")
print("Saved: bpp_matrix.png")Use RNA.cofold() to predict the interaction between two RNA sequences by concatenating them with an & separator.
import RNA
# miRNA (hsa-miR-21-5p) and its target sequence in mRNA (PTEN 3'UTR region)
mirna_seq = "UAGCUUAUCAGACUGAUGUUGA"
target_seq = "UCAACAUCAGUCUGAUAAGCUA" # approximate complementary target
# Co-fold: concatenate with & separator
cofold_seq = mirna_seq + "&" + target_seq
structure, mfe = RNA.cofold(cofold_seq)
print(f"miRNA: {mirna_seq}")
print(f"Target: {target_seq}")
print(f"Co-fold MFE: {mfe:.2f} kcal/mol")
# Parse the structure — & is retained in output
n1, n2 = len(mirna_seq), len(target_seq)
struct_mirna = structure[:n1]
struct_ampersand = structure[n1]
struct_target = structure[n1 + 1:]
print(f"miRNA structure: {struct_mirna}")
print(f"Target structure: {struct_target}")
paired_in_duplex = struct_mirna.count("(") + struct_mirna.count(")")
print(f"Bases paired across the duplex: {paired_in_duplex}")Compute the accessibility of a target region within a longer mRNA sequence — critical for siRNA and antisense oligonucleotide efficiency.
import RNA
import numpy as np
def compute_accessibility(mrna_seq: str, window: int = 40) -> list:
"""
Compute per-position probability of being unpaired (accessible) using
a sliding-window approach on the partition function.
Returns list of (position, accessibility) tuples.
"""
n = len(mrna_seq)
fc = RNA.fold_compound(mrna_seq)
_, mfe = fc.mfe()
fc.exp_params_rescale(mfe)
fc.pf()
bpp = fc.bpp()
# Probability of being paired at each position
p_paired = np.zeros(n)
for i in range(1, n + 1):
for j in range(1, n + 1):
if i != j:
p = bpp[min(i,j)][max(i,j)]
p_paired[i - 1] += p
p_unpaired = 1.0 - np.clip(p_paired, 0, 1)
return p_unpaired
# Example: 80-nt mRNA segment with a known accessible region
mrna = "AUGCUAGCUAGCUAGCUAUGCUAGCUAGCUUUUUUUUUUUUAUGCUAGCUAGCUAGCUAGCUAGCUAGCUAGCUAGC"
p_unpaired = compute_accessibility(mrna)
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 3))
ax.bar(range(1, len(mrna) + 1), p_unpaired, color="#2166ac", alpha=0.8)
ax.axhline(0.5, color="red", lw=1, ls="--", label="50% unpaired")
ax.set_xlabel("Position (nt)")
ax.set_ylabel("P(unpaired)")
ax.set_title("RNA Accessibility Profile")
ax.legend()
plt.tight_layout()
plt.savefig("rna_accessibility.png", dpi=150, bbox_inches="tight")
print("Saved: rna_accessibility.png")
# Top 5 most accessible positions (siRNA target candidates)
best = sorted(enumerate(p_unpaired, 1), key=lambda x: -x[1])[:5]
print("\nMost accessible positions:")
for pos, prob in best:
print(f" Position {pos}: P(unpaired) = {prob:.3f} ({mrna[pos-1]})")Use the RNAfold CLI for batch folding via subprocess, then parse the output.
# Fold a single sequence from stdin
echo "GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUCCACAGAAUUCGCACCA" | RNAfold
# Output:
# GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUCCACAGAAUUCGCACCA
# (((((((..((((........)))).(((((.......))))).....(((((.......)))))))))))).... (-31.30)
# Batch fold from FASTA file
RNAfold < sequences.fasta > structures.txt
# Generate base pair probability dot plot (PostScript)
RNAfold --noPS < sequences.fasta # suppress PostScript output
RNAfold -p < sequences.fasta # save dot plot as rna.ps# Python: run RNAfold via subprocess and parse output
import subprocess
import re
def run_rnafold(sequence: str) -> tuple:
"""Run RNAfold CLI and return (structure, mfe) tuple."""
result = subprocess.run(
["RNAfold", "--noPS"],
input=sequence,
capture_output=True, text=True, timeout=30
)
if result.returncode != 0:
raise RuntimeError(f"RNAfold failed: {result.stderr}")
lines = result.stdout.strip().split("\n")
# Last line: structure and energy, e.g. "((....)) (-5.40)"
match = re.match(r"^([.()\[\]{}<>|]+)\s+\((-?\d+\.\d+)\)$", lines[-1])
if not match:
raise ValueError(f"Could not parse RNAfold output: {lines[-1]}")
structure = match.group(1)
mfe = float(match.group(2))
return structure, mfe
sequences = [
("tRNA-Phe", "GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUCCACAGAAUUCGCACCA"),
("miR-21", "UAGCUUAUCAGACUGAUGUUGA"),
]
for name, seq in sequences:
struct, mfe = run_rnafold(seq)
print(f"{name}: {mfe:.2f} kcal/mol | {struct}")Apply hard constraints (force or forbid specific base pairs) and enumerate suboptimal structures.
import RNA
sequence = "GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUCCACAGAAUUCGCACCA"
# --- Constrained folding: force specific pairs ---
fc = RNA.fold_compound(sequence)
# Add hard constraint: force positions 1-7 to be paired (known stem)
hc = RNA.hc_add_bp(fc, 1, 72) # force pair between position 1 and 72 (0-indexed in C API)
structure_c, mfe_c = fc.mfe()
print(f"Constrained MFE: {mfe_c:.2f} kcal/mol")
print(f"Constrained struct: {structure_c}")
# --- Enumerate suboptimal structures (delta_mfe threshold) ---
fc_sub = RNA.fold_compound(sequence)
_, mfe_opt = fc_sub.mfe()
# Get suboptimal structures within 5 kcal/mol of MFE
delta = 5.0 # kcal/mol window
subopt_list = RNA.subopt(sequence, int(delta * 100)) # energy in 10-cal units
print(f"\nSuboptimal structures within {delta} kcal/mol of MFE:")
print(f"Total suboptimal structures: {len(subopt_list)}")
for s in subopt_list[:3]:
e = s.energy / 100.0 # convert from 10-cal to kcal/mol
print(f" {s.structure} ({e:.2f} kcal/mol)")| Parameter | Default | Range / Options | Effect |
|---|---|---|---|
sequence (RNA.fold) | — | ACGU string | Input RNA sequence; T is auto-converted to U |
temperature (model detail) | 37.0 °C | 0–100 °C | Folding temperature; lower temp stabilizes structures |
dangles (model detail) | 2 | 0, 1, 2, 3 | Dangling end treatment; 2=average, 0=none, use 2 for most applications |
noGU (model detail) | False | True/False | Disallow G-U wobble pairs when True |
noLP (model detail) | False | True/False | Disallow lonely base pairs (single-bp stems); reduces noise |
delta (RNA.subopt) | — | float kcal/mol | Energy window above MFE for suboptimal structure enumeration |
window (sliding window) | — | int nt | Sliding window size for long-sequence accessibility analysis |
When to use: Fold a library of RNA sequences (e.g., candidate aptamers, guide RNAs) and compare energies.
import RNA
from pathlib import Path
def read_fasta(fasta_path: str) -> list:
"""Parse FASTA file, return list of (name, sequence) tuples."""
records = []
name, seq = None, []
for line in Path(fasta_path).read_text().splitlines():
if line.startswith(">"):
if name:
records.append((name, "".join(seq).upper().replace("T", "U")))
name, seq = line[1:].split()[0], []
else:
seq.append(line.strip())
if name:
records.append((name, "".join(seq).upper().replace("T", "U")))
return records
# Example: fold sequences from a FASTA file
sequences = [
("aptamer_1", "GGGUUUUGAAACUAAACUAGGCUCUAGCGCUGGUGUCCCUUCCCGGCUCUAGCCUCAGCAGAAGCUUGAAAAAACCC"),
("aptamer_2", "GGGAGACAAGAAUAAACGCUCAACGUCUACCAUGAUCGAAUGCUAGCCUUCUAGCUUGCUUCGGCAGCACUAUAGGG"),
("aptamer_3", "GGGCGACCCUGAUGAGUCCCAAGUCGAAACGAUUCCUUUUUAAACUCAUGGUGCCCAGCCUCGCUCAGCA"),
]
print(f"{'Name':<15} {'Length':>8} {'MFE':>10} {'Structure'}")
print("-" * 80)
for name, seq in sequences:
struct, mfe = RNA.fold(seq)
print(f"{name:<15} {len(seq):>8} {mfe:>10.2f} {struct[:50]}...")When to use: Evaluate whether a CRISPR sgRNA guide sequence folds into secondary structures that reduce Cas9 binding efficiency.
import RNA
def assess_sgrna(guide_seq: str, scaffold: str = None) -> dict:
"""
Assess sgRNA secondary structure.
guide_seq: 20-nt spacer sequence (RNA)
scaffold: constant sgRNA scaffold sequence (default: SpCas9)
"""
if scaffold is None:
# SpCas9 sgRNA scaffold (Addgene standard)
scaffold = "GUUUUAGAGCUAGAAAUAGCAAGUUAAAAUAAGGCUAGUCCGUUAUCAACUUGAAAAAGUGGCACCGAGUCGGUGCUUU"
full_sgrna = guide_seq.upper().replace("T", "U") + scaffold
fc = RNA.fold_compound(full_sgrna)
structure, mfe = fc.mfe()
fc.exp_params_rescale(mfe)
fc.pf()
bpp = fc.bpp()
n_guide = len(guide_seq)
# Check if any guide bases are paired (bad for targeting)
guide_paired = sum(
bpp[min(i, j)][max(i, j)]
for i in range(1, n_guide + 1)
for j in range(1, n_guide + 1)
if i != j
)
guide_accessibility = 1.0 - min(1.0, guide_paired / n_guide)
return {
"guide_seq": guide_seq,
"mfe": mfe,
"structure": structure[:n_guide],
"guide_access": guide_accessibility,
"predicted_ok": guide_accessibility > 0.7,
}
guides = ["GCACUAGUGACGCAUGGCAC", "GGGCAUAGCUAGCUAGCUAU", "AAAUUCGCACUAGUGACGCA"]
for g in guides:
result = assess_sgrna(g)
status = "OK" if result["predicted_ok"] else "WARN (self-paired)"
print(f"{g}: accessibility={result['guide_access']:.2f}, MFE={result['mfe']:.1f} kcal/mol [{status}]")When to use: Create a mountain plot — a classic RNA structure visualization showing stem height along the sequence.
import RNA
import matplotlib.pyplot as plt
def dot_bracket_to_mountain(structure: str) -> list:
"""Convert dot-bracket structure to mountain plot heights."""
heights = []
level = 0
for c in structure:
if c == "(":
level += 1
heights.append(level)
if c == ")":
level -= 1
return heights
sequence = "GCGGAUUUAGCUCAGUUGGGAGAGCGCCAGACUGAAGAUCUGGAGGUCCUGUGUUCGAUCCACAGAAUUCGCACCA"
structure, mfe = RNA.fold(sequence)
heights = dot_bracket_to_mountain(structure)
fig, axes = plt.subplots(2, 1, figsize=(12, 5), sharex=True,
gridspec_kw={"height_ratios": [1, 3]})
# Top: sequence text
axes[0].text(0.5, 0.5, "tRNA-Phe | E. coli", ha="center", va="center",
fontsize=10, transform=axes[0].transAxes)
axes[0].axis("off")
# Bottom: mountain plot
axes[1].fill_between(range(len(sequence)), heights, step="mid",
color="#2c7bb6", alpha=0.7, label=f"MFE = {mfe:.2f} kcal/mol")
axes[1].set_xlabel("Nucleotide position")
axes[1].set_ylabel("Stem height")
axes[1].set_title("Mountain Plot")
axes[1].legend()
plt.tight_layout()
plt.savefig("mountain_plot.png", dpi=150, bbox_inches="tight")
print(f"Saved: mountain_plot.png (MFE structure: {structure[:40]}...)")| Output | Type | Description |
|---|---|---|
structure | string | Dot-bracket notation of MFE secondary structure; ( and ) for paired bases, . for unpaired |
mfe | float (kcal/mol) | Minimum free energy of the predicted structure; more negative = more stable |
bpp | (n+1)×(n+1) matrix | Base pair probability matrix from partition function; element [i][j] = P(i paired with j), 1-indexed |
bpp_matrix.png | PNG | Heatmap visualization of base pair probabilities |
rna_accessibility.png | PNG | Per-position probability of being unpaired |
mountain_plot.png | PNG | Mountain plot of stem heights along the sequence |
| Problem | Cause | Solution |
|---|---|---|
ImportError: No module named 'RNA' | ViennaRNA Python bindings not installed | Install via conda install -c conda-forge viennarna; pip install alone may fail to link C library |
RuntimeError: RNAfold not found | ViennaRNA CLI not in PATH | Confirm with which RNAfold; if using conda env, activate it before running scripts |
| MFE is unexpectedly positive (> 0) | Very short or repetitive sequence with no favorable pairs | Short sequences (< 10 nt) often have positive MFE; check sequence length and composition |
bpp matrix all zeros after fc.pf() | fc.mfe() must be called before fc.pf() on the same fold compound | Always call fc.mfe() first, then fc.exp_params_rescale(mfe), then fc.pf() |
| Suboptimal enumeration returns thousands of structures | Window too large for long sequences | Reduce delta to 2–3 kcal/mol for long sequences; very stable sequences have dense suboptimal ensembles |
Co-fold (RNA.cofold) shows unexpected pairing | Intramolecular folding dominates in one strand | Inspect each strand separately first; low individual-strand MFE indicates strong self-structure interfering with duplex |
© jaechang-hits, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/molecular-biology/viennarna-structure-prediction of jaechang-hits/SciAgent-Skills.
Open the folder on GitHubat commit 82c862c
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in jaechang-hits/SciAgent-Skills, which our catalogue first saw on October 7, 2026.
Viennarna Structure Prediction next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Viennarna Structure Prediction this skilljaechang-hits/SciAgent-Skills | 374 | 1 repos | ~5.4k | Automated safety check: Pass | MIT | |
| Bio Fragment AnalysisGPTomics/bioSkills | 1.2k | 1 repos | ~4.3k | Automated safety check: Pass | MIT | |
| Bio Multi Omics Mofa IntegrationGPTomics/bioSkills | 1.2k | 1 repos | ~4.6k | Automated safety check: Pass | MIT | |
| Bio Atac Seq Motif DeviationGPTomics/bioSkills | 1.2k | 2 repos | ~5.2k | Automated safety check: Pass | MIT | |
| Bio Atac Seq Motif DeviationFreedomIntelligence/OpenClaw-Medical-Skills | 3.1k | — | ~2.3k | Automated safety check: Pass | None | |
| Alphagenome Single Variant Analysisgoogle-deepmind/science-skills | 3.2k | 2 repos | ~3k | Automated safety check: Notes | Apache-2.0 |
GPTomics/bioSkills
Extracts cfDNA fragmentomics features (DELFI genome-wide short/long ratios, WPS nucleosome positioning, Griffin GC-corrected accessibility profiles, end-motifs/MDS, OCF) for cancer detection and…
GPTomics/bioSkills
Discovers shared and view-specific latent factors across bulk multi-omics blocks (RNA-seq, proteomics, methylation) on a common sample axis with MOFA2's unsupervised Bayesian group factor model…
GPTomics/bioSkills
Analyze TF motif accessibility variability across samples or single cells using chromVAR.
FreedomIntelligence/OpenClaw-Medical-Skills
Analyze transcription factor motif accessibility variability using chromVAR.
google-deepmind/science-skills
Analyzes genetic variant effects on gene expression (RNA-seq), chromatin accessibility (DNASE), histone marks (ChIP), and transcription factors using the AlphaGenome API.
K-Dense-AI/scientific-agent-skills
Estimates reaction fluxes inside cells from steady-state carbon-13 labeling data with a bundled mfapy-based solver, and reports which fluxes the data pin down.
jaechang-hits/SciAgent-Skills
NEB-IRC activation energy pipeline for reaction barriers using GFN2-xTB and pysisyphus.
jaechang-hits/SciAgent-Skills
3Dmol.js WebGL molecular visualization emitted as self-contained HTML.
jaechang-hits/SciAgent-Skills
Constraint-based (COBRA) analysis of genome-scale metabolic models: FBA, FVA, knockouts, flux sampling, production envelopes, gapfilling, media optimization.
jaechang-hits/SciAgent-Skills
Read, write, and edit ChemDraw CDX/CDXML files with RDKit's rdkit.Chem.rdChemDraw plus direct XML editing, always paired with a rendered PNG.
jaechang-hits/SciAgent-Skills
Programmatic PubMed access via NCBI E-utilities REST API. An agent skill from jaechang-hits/SciAgent-Skills.
jaechang-hits/SciAgent-Skills
Scaffold a new SciAgent-Skills entry. An agent skill from jaechang-hits/SciAgent-Skills.
Works with
Categories
Predict RNA secondary structure, MFE folding, base-pair probabilities, RNA-RNA interactions via ViennaRNA Python bindings. Viennarna Structure Prediction is an agent skill from jaechang-hits/SciAgent-Skills. Predict RNA secondary structure, MFE folding, base-pair probabilities, RNA-RNA interactions via ViennaRNA Python bindings.
Viennarna Structure Prediction fits situations like: siRNA/sgRNA targeting; ribozyme design; RNA accessibility.
Run `npx skills add jaechang-hits/SciAgent-Skills --skill viennarna-structure-prediction -a claude-code`. Or copy the skill folder (skills/molecular-biology/viennarna-structure-prediction in jaechang-hits/SciAgent-Skills) into .claude/skills/viennarna-structure-prediction in your project. Claude Code loads it when a task matches its description.
Run `npx skills add jaechang-hits/SciAgent-Skills --skill viennarna-structure-prediction -a codex`. Or copy the skill folder (skills/molecular-biology/viennarna-structure-prediction in jaechang-hits/SciAgent-Skills) into .agents/skills/viennarna-structure-prediction in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add jaechang-hits/SciAgent-Skills --skill viennarna-structure-prediction -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/viennarna-structure-prediction, .gemini/skills/viennarna-structure-prediction, .github/skills/viennarna-structure-prediction and .opencode/skills/viennarna-structure-prediction in your project.
Going by SKILL.md and its folder, Viennarna Structure Prediction needs the command-line tools its instructions call (conda, pip and python). Our summary lists: Python 3.
SKILL.md names 3 domains. As links in the text: doi.org, tbi.univie.ac.at and github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Viennarna Structure Prediction is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.4k tokens (SKILL.md is roughly 22k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Viennarna Structure Prediction: Bio Fragment Analysis (GPTomics/bioSkills, 1.2k stars), Bio Multi Omics Mofa Integration (GPTomics/bioSkills, 1.2k stars), Bio Atac Seq Motif Deviation (GPTomics/bioSkills, 1.2k stars) and Bio Atac Seq Motif Deviation (FreedomIntelligence/OpenClaw-Medical-Skills, 3.1k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
jaechang-hits (a GitHub user) maintains it in jaechang-hits/SciAgent-Skills, which has 374 GitHub stars. The repository holds 169 skills in this directory. The repository was last updated on September 29, 2026.
Source: jaechang-hits/SciAgent-Skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.