HCRProbeForge
HCRProbeForge is a cross-platform package for designing, checking, curating,
plotting, and exporting HCR v3 split-initiator probe sets. It provides a
command-line interface and a local browser interface. The CLI, helper commands,
and webapp use the same scientific pipeline and file naming conventions, but
their default selection policies differ: direct hcrprobeforge designs are
one-pass by default, while the all-channel helper, manifest helper, and webapp
enable smart auto-curation by default.
The package accepts a gene symbol, a RefSeq transcript accession, one FASTA record, or a gene/accession manifest. It retrieves or reuses exact NCBI transcripts, generates channel-specific candidates with HCRProbeDesign and Bowtie2, runs Primer3-based oligo QC, performs the configured curation and selection, draws probe maps, and writes candidate and selected order tables with metadata. Smart-curated outputs and one-pass Pre-mRNA outputs include a selected non-overlapping order table. A one-pass mature-transcript run deliberately preserves the native upstream candidate table and does not apply final non-overlap selection.
The webapp defaults to a loopback-only local server. Sequences, probe tables, and results stay on the computer running HCRProbeForge. Browser state-changing requests use a per-server capability token and same-origin checks; non-loopback binding requires an explicit access token. NCBI is contacted only when a workflow needs a transcript, annotation, or genome assembly.
Contents
- What the package does
- Installation
- Verify the installation
- Species and genome indexes
- Launch the webapp
- Manifest input and resume contract
- CLI quick start
- Complete CLI option reference
- Option interactions and reproducible command patterns
- How transcript selection works
- How the design pipeline works
- HCR channels and final-order conventions
- Auto-curation technical details
- Candidate ranking and auto_score
- Final oligo QC thresholds
- Annotation and coordinate conventions
- Output layout
- Understanding the output files
- Caching and reproducibility
- Troubleshooting
- Architecture and data flow
- Failure safety and reproducibility
- Preserving provenance and getting help
- License and citation
- Additional project documents
What the package does
For a normal NCBI-backed design, HCRProbeForge:
- Validates the input and species/reference pairing.
- Resolves a gene symbol to a NCBI Gene record and linked RefSeq RNA records, or validates the exact accession supplied by the user.
- Retrieves the exact transcript FASTA and feature annotation, or validates a user-supplied single-record FASTA.
- Reuses a valid versioned local transcript cache.
- Calls HCRProbeDesign with the requested channel, tile, thermodynamic, genomic-specificity, and candidate-count settings.
- Runs final-oligo Primer3 QC on the actual initiator-bearing P1/P2 oligos, unless --no-oligo-qc is requested.
- If smart curation is enabled, applies the non-overlap selection, adaptive-tier, coverage, and cross-pair review rules. A normal one-pass mature-transcript run preserves the native candidate table. A normal one-pass Pre-mRNA run filters candidates to the requested genomic scope and enforces interval non-overlap before writing its order-ready table.
- Writes the appropriate candidate or selected-pair tables, IDT order files, maps, QC workbooks, reports, logs, and run metadata.
The scientific pipeline is the same from the CLI and webapp. The webapp
collects options, starts the same functions, shows progress, and presents
the current run's files. Defaults are entry-point-specific: direct
hcrprobeforge is one-pass unless smart curation is requested, whereas
hcrprobeforge-all-channels, hcrprobeforge-manifest, and the webapp select
smart curation by default. To obtain comparable output behavior, specify
--auto-curate-if-needed or the one-pass setting explicitly.
Installation
Use a dedicated conda environment for scientific executables, then install the Python package with pip. The commands use python -m pip so pip belongs to the active interpreter.
Choose a working directory
Choose any directory where you want HCRProbeForge to save project results.
The paths below are examples only; replace them with a directory that suits
your project. The directory is a project root: HCRProbeForge creates its
runs/ and cache/ folders inside it. A descriptive name makes it clear that
the directory will contain all outputs from the project. For example:
mkdir -p "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
cd "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
The webapp uses the results directory selected in its form. CLI commands use
the path supplied to --outdir; if it is relative, it is resolved from the
current working directory. If the webapp or CLI receives
$HOME/hcrprobeforge_projects/hcr_probe_design_project, all run, cache, plot,
QC, and manifest workflow outputs are nested below that directory. The webapp
also maintains a small index_metadata/ registry copy under the parent of the
selected project root (<project parent>/index_metadata/), rather than inside
the project root. Environment variables can relocate reference assets or a
direct-CLI cache elsewhere. A folder named hcr_results is still supported as
the default, but it is not automatically added to a user-selected path.
The first genome-masked design also requires a ready registered index. Build
the selected species index before the first design, or deliberately use
--no-genomemask when genomic specificity screening is not wanted. For the
default preset, the usual first setup is:
hcrprobeforge index fetch --species xtr --threads 4
Index downloads and builds are assembly-dependent. As a planning estimate, allow at least a few GB of free disk for a small reference and tens of GB for large vertebrate assemblies, including temporary files; small indexes may finish in minutes, while large downloads/builds can take tens of minutes or hours and may need roughly 8 GB or more of available RAM. Check the assembly provider's size and the machine's available resources before starting. The package does not bundle genome indexes.
macOS
Install Miniforge once. The following commands select the correct Apple Silicon or Intel installer automatically:
curl -L "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-$(uname -m).sh" -o Miniforge3.sh
bash Miniforge3.sh -b -p "$HOME/miniforge3"
macos_shell="${SHELL##*/}"; macos_shell="${macos_shell:-bash}"
"$HOME/miniforge3/bin/conda" init "$macos_shell"
source "$HOME/miniforge3/bin/activate"
Open a new Terminal window, change to your chosen working directory, and create the environment:
cd "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
conda create -n hcrprobe -c conda-forge -c bioconda python=3.11 pip bowtie2 pysam -y
conda activate hcrprobe
python -m pip install hcrprobeforge
hcrprobeforge-web
Start the webapp in later sessions with:
conda activate hcrprobe
cd "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
hcrprobeforge-web
macOS keeps its native browser and folder-opening behavior.
Windows
HCRProbeForge can run from native Windows Python when Python, Bowtie2, and the
HCRProbeDesign command-line tools are installed and available on PATH. WSL2
with Ubuntu is recommended because the Conda/bioconda installation below
provides the external scientific executables most consistently. The WSL2
instructions are not a separate HCRProbeForge mode; they run the same package
inside Linux on Windows.
For the recommended WSL2 setup, install Ubuntu from the Microsoft Store, or run this in an elevated PowerShell window:
wsl --install -d Ubuntu
Restart if prompted, open Ubuntu, create the Linux user, and run the following inside the Ubuntu terminal:
curl -L "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-$(uname -m).sh" -o Miniforge3.sh
bash Miniforge3.sh -b -p "$HOME/miniforge3"
"$HOME/miniforge3/bin/conda" init bash
source "$HOME/miniforge3/bin/activate"
conda create -n hcrprobe -c conda-forge -c bioconda python=3.11 pip bowtie2 pysam -y
conda activate hcrprobe
python -m pip install hcrprobeforge
mkdir -p "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
cd "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
hcrprobeforge-web
HCRProbeForge detects WSL and opens the webapp in the Windows browser through
explorer.exe. Folder buttons use wslpath plus Windows Explorer. The URL
is always printed if manual opening is needed.
Ubuntu stores Linux files inside the WSL distribution. explorer.exe . opens
the current folder in Windows Explorer; the same files can be reached at
\\wsl.localhost\Ubuntu\home\<your-linux-user> (the older
\\wsl$\Ubuntu\home\<your-linux-user> form also works). Windows drives are mounted under
/mnt, so C:\Users\Name\Documents is normally
/mnt/c/Users/Name/Documents. Large reference files are usually faster under
the Linux filesystem in ~/ than under /mnt/c.
Start the webapp in later Ubuntu sessions with:
conda activate hcrprobe
cd "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
hcrprobeforge-web
For a native PowerShell installation, install Python 3.10 or newer, create and
activate a virtual environment, and install HCRProbeForge with
python -m pip install hcrprobeforge. Pip installs the Python-side
hcrprobedesign dependency, including designProbes and
buildGenomeIndex. Install the external Bowtie2 executables separately and
put them on PATH:
py -3 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip hcrprobeforge
where.exe bowtie2
where.exe bowtie2-build
where.exe designProbes
where.exe buildGenomeIndex
If the installed HCRProbeDesign or Bowtie2 distribution does not provide a working native Windows executable, use the WSL2 route above.
Linux
curl -L "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-$(uname -m).sh" -o Miniforge3.sh
bash Miniforge3.sh -b -p "$HOME/miniforge3"
"$HOME/miniforge3/bin/conda" init bash
source "$HOME/miniforge3/bin/activate"
mkdir -p "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
cd "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
conda create -n hcrprobe -c conda-forge -c bioconda python=3.11 pip bowtie2 pysam -y
conda activate hcrprobe
python -m pip install hcrprobeforge
hcrprobeforge-web
Desktop Linux uses xdg-open or gio for folders; headless systems can use the
printed URL. To upgrade later, use the cross-platform instructions in
Updating without reinstalling dependencies.
Start the webapp later
After installation, start HCRProbeForge in any later session with:
conda activate hcrprobe
cd "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
hcrprobeforge-web
The command opens the local webapp in the default browser when the operating
system supports that behavior and always prints the URL in the terminal.
hcrprobeforge-web is the HCRProbeForge launcher. Installing
hcrprobeforge also installs the Python package hcrprobedesign, which
provides the scientific designProbes and buildGenomeIndex tools. Bowtie2
(bowtie2 and bowtie2-build) remains an external executable and is supplied
by the Conda environment in the examples above.
Install from the GitHub source with environment.yml
This option creates a Conda environment and installs the local checkout through pip. It is not a separate Conda package:
git clone https://github.com/AlhashemZ/hcrprobeforge.git
cd hcrprobeforge
conda env create -f environment.yml
conda activate hcrprobe
hcrprobeforge-web
After updating the checkout:
cd hcrprobeforge
git pull
conda activate hcrprobe
python -m pip install --upgrade --editable .
Installation without conda
Conda is recommended because it supplies Bowtie2 consistently, but a Python
virtual environment also works if bowtie2 and bowtie2-build are already on
PATH. Pip installs HCRProbeDesign as an HCRProbeForge dependency, so its
designProbes and buildGenomeIndex commands are installed with the package:
python3 -m venv .venv
source .venv/bin/activate # macOS/Linux
python -m pip install --upgrade pip
python -m pip install .
On Windows PowerShell, activate with
.\.venv\Scripts\Activate.ps1. If the shell blocks activation, use a
per-user execution-policy change or launch the environment's Python directly.
This route does not install Bowtie2; install it separately and verify it with
where.exe (Windows) or command -v (macOS/Linux). If pip reports that a
dependency must be built locally, follow that dependency's build instructions
for the selected operating system.
Installing from a release wheel
Download a wheel from PyPI or the
GitHub Releases page.
If you downloaded the prepared publication bundle, unzip it and use the wheel
from its pypi/ directory:
cd /path/to/release-bundle-<release>
python -m pip install --upgrade ./pypi/hcrprobeforge-<release>-py3-none-any.whl
GitHub Releases also publish the wheel as a release asset. If you downloaded that asset directly, change to the directory containing the downloaded wheel:
cd /path/to/downloaded-wheel
python -m pip install --upgrade ./hcrprobeforge-<release>-py3-none-any.whl
If the active conda environment already contains all required Python and external dependencies:
python -m pip install --upgrade --no-deps ./hcrprobeforge-<release>-py3-none-any.whl
Use --no-deps only after checking the environment. It updates HCRProbeForge
without asking pip to resolve dependencies.
Installing from a source checkout
From an unpacked source directory:
conda activate hcrprobe
python -m pip install --upgrade .
This installs the checkout as a normal package. If you are modifying the
source tree, use --editable instead; restart the CLI process or webapp after
changing code.
Updating without reinstalling dependencies
Pip's default dependency strategy is already only-if-needed; the explicit
flag below documents that choice but is not required. To update a normal
installation:
python -m pip install --upgrade --upgrade-strategy only-if-needed hcrprobeforge
For a local wheel:
python -m pip install --upgrade --upgrade-strategy only-if-needed \
./hcrprobeforge-<release>-py3-none-any.whl
Pip replaces HCRProbeForge and keeps already-satisfied dependency versions; it
changes a dependency only when the installed version does not satisfy the
package requirement. Repository build and validation procedures are documented
in DEVELOPMENT.md.
Verify the installation
hcrprobeforge --version
hcrprobeforge --help
hcrprobeforge index --help
hcrprobeforge-web --help
hcrprobeforge-all-channels --help
hcrprobeforge-manifest --help
Then check designProbes, buildGenomeIndex, bowtie2, and bowtie2-build
with command -v on macOS/Linux or where.exe on Windows.
Primer3 is installed as the Python package primer3-py, not as a separate
executable. Check it with:
python -c "import primer3; print('primer3-py is available')"
Species and genome indexes
Genomic masking is enabled by default. Use an index built from the same
organism and genome reference selected for transcript retrieval. If no
matching index is registered, build one first or provide an explicit Bowtie2
prefix with --index. --no-genomemask disables specificity screening and
Built-in species presets
The package includes six built-in organism presets. Xenopus tropicalis uses the
HCRProbeDesign index alias xtr, while user-facing output uses
Xenopus_tropicalis. Preset aliases are short technical names accepted by the
CLI and index registry; project results, cache folders, and index-metadata
folders use the readable display name (sanitized only for filesystem safety).
xtr is the only built-in alias for Xenopus tropicalis; build or rebuild that
reference with xtr.
| CLI/webapp alias | Organism sent to NCBI | Assembly | NCBI accession | Results component |
|---|---|---|---|---|
| xtr | Xenopus tropicalis | UCB_Xtro_10.0 | GCF_000004195.4 | Xenopus_tropicalis |
| xla | Xenopus laevis | Xenopus_laevis_v10.1 | GCF_017654675.1 | Xenopus_laevis |
| zebrafish | Danio rerio | GRCz12ab | GCF_052040795.1 | Zebrafish |
| mouse | Mus musculus | GRCm39 | GCF_000001635.27 | Mouse |
| chicken | Gallus gallus | bGalGal1.mat.broiler.GRCg7b | GCF_016699485.2 | Chicken |
| human | Homo sapiens | GRCh38.p14 | GCF_000001405.40 | Human |
These are package defaults, not a permanent restriction. Record the assembly and accession from reference.json with published probes. If a newer assembly has consistent annotation and transcript support, add it with an explicit assembly accession and a new index alias.
Add a custom species preset
Organisms that are not built into the package can be added without changing the scientific design pipeline. A custom preset has three required values:
- a stable alias used by the CLI and index registry;
- a readable display name shown in the webapp; and
- the exact NCBI organism name used for transcript and accession retrieval.
The assembly name is optional at preset-creation time. The NCBI assembly accession is required for an NCBI download unless a local genome FASTA is supplied. Provide one of those two genome sources before building the genome index. The transcript side remains NCBI-backed through the organism name; the local FASTA is used only to build the genome index.
From the CLI:
hcrprobeforge species add \
--alias octopus_v1 \
--display-name "Octopus vulgaris" \
--organism "Octopus vulgaris" \
--assembly-accession GCF_<ASSEMBLY_ID>.<VERSION> \
--assembly-name Octopus_v1
# Or save a local genome FASTA with the preset:
hcrprobeforge species add \
--alias octopus_local \
--display-name "Octopus vulgaris" \
--organism "Octopus vulgaris" \
--assembly-name Octopus_local \
--genome-fasta /path/to/octopus.fna
hcrprobeforge species list
Replace GCF_<ASSEMBLY_ID>.<VERSION> with a real versioned NCBI assembly
accession before running the command.
Then build the index using the existing index workflow:
hcrprobeforge index fetch --species octopus_v1 --threads 4
hcrprobeforge index build --species octopus_local --fasta /path/to/octopus.fna --threads 4
In the webapp, choose Add a new species… at the bottom of the Species menu. The dialog marks required and optional fields explicitly and provides tooltips for the alias, organism, assembly, and FASTA choices. An uploaded genome FASTA is copied into the HCRProbeForge reference-data directory; the original file is not modified. After the species is added, it remains in the Species menu and can be selected in Build a genome index. The saved FASTA is used automatically when the local FASTA field is left blank. The NCBI organism field alone is not a genome source: it identifies the organism for transcript retrieval, but does not select a reproducible assembly. The dialog shows a red required marker beside the accession and explains the local-FASTA exception. Supply a versioned NCBI assembly accession or a genome FASTA before building the index. The webapp exposes an adjacent × control for every custom preset. Clicking it opens a confirmation dialog rather than a browser alert. After the confirmation checkbox is selected, deletion removes the preset from the species registry, its saved custom FASTA, HCRProbeForge reference metadata, and the exact unshared Bowtie2 index files registered for that custom preset. It also removes obsolete HCRProbeDesign registrations and any now-empty alias folder. The dialog previews the paths and file count before confirmation. An index shared with another installed reference, or a prefix outside the managed HCRProbeDesign data directory, is retained for safety. Built-in presets are protected and their indexes are never changed by custom-species deletion.
The Species menu renders one option per custom preset using its display name. If a successful index build has a separate assembly alias in its metadata, that alias is not added as a second user-facing species option.
Custom presets are stored in:
~/.hcrprobeforge/references/species_presets.json
The location follows HCRPROBEFORGE_REFERENCE_DIR when that environment
variable is set. A custom preset does not bypass species validation: the
selected organism is still passed to NCBI, and exact accessions must belong to
that organism. If a transcript is unavailable, the normal validation error is
returned before scientific output or transcript cache data are retained.
Build a preset index
The index command resolves and validates the NCBI Assembly record, downloads the genomic FASTA and matching GFF3 annotation, passes the uncompressed FASTA to HCRProbeDesign's buildGenomeIndex, and registers the resulting Bowtie2 prefix. The annotation SQLite lookup used by Pre-mRNA is optional because many users only need mature-transcript designs:
hcrprobeforge index fetch --species xtr --threads 4
hcrprobeforge index fetch --species xla --threads 4
hcrprobeforge index fetch --species zebrafish --threads 4
hcrprobeforge index fetch --species mouse --threads 4
hcrprobeforge index fetch --species chicken --threads 4
hcrprobeforge index fetch --species human --threads 4
hcrprobeforge index list
# Also prepare the annotation database now for future Pre-mRNA/intron designs
hcrprobeforge index fetch --species xtr --with-annotation-db --threads 4
The examples use four build threads, which is also the default. Choose a value appropriate for the available CPU cores and memory.
A ready reference is reused. Use --force to rebuild it. The equivalent
webapp workflow is the Build index tab; leave assembly fields blank to use
the preset. When you click Run, the webapp asks whether you will need
Pre-mRNA/intron design. Selecting the option builds the annotation database
now and may take several minutes; leaving it clear builds only the genome
index and defers SQLite construction until the first Pre-mRNA run. Its result
page reports the full index prefix and metadata JSON.
Assembly downloads use the FTP directory returned by NCBI Assembly. The FASTA
filename is derived from that directory and normalized to NCBI's underscore
convention, so assembly names such as Release 6 plus ISO1 MT do not produce
invalid %20 filename requests. The downloader validates the requested
accession in the ESummary response, retries transient HTTP failures, writes to
a temporary file, verifies that the compressed content can be decompressed,
and only then starts buildGenomeIndex. If the usual filename is not present,
it checks the Assembly directory listing for another *_genomic.fna.gz file.
If no usable file can be found, the error names the accession and directs you
to verify the Assembly record or use the local-FASTA index workflow. Successful
builds retain the uncompressed genome.fna and annotation.gff when NCBI
provides them. annotation.sqlite is retained only when
--with-annotation-db was selected; otherwise it is deferred until the first
Pre-mRNA run. Temporary compressed downloads and their .gz copies are not
retained. A genome index can still be registered when NCBI temporarily has no
annotation, but Pre-mRNA will report that the matching annotation must be
supplied or downloaded before design.
Use another assembly
First verify that the desired NCBI assembly has appropriate annotation and transcript support. Then provide its accession, optionally its expected name, and preferably a new alias:
hcrprobeforge index fetch \
--species zebrafish \
--assembly-accession GCF_<ALTERNATE_ASSEMBLY_ID>.<VERSION> \
--assembly-name <EXPECTED_ASSEMBLY_NAME> \
--index-alias zebrafish_alternate \
--threads 4
Replace the accession and expected name with a real compatible assembly. The example intentionally uses placeholders rather than implying that an older or built-in assembly is newer.
The same pattern works for either Xenopus preset, mouse, chicken, zebrafish,
or human. A new alias keeps an existing reference available. Reuse an alias
with --force only when intentionally replacing that registration.
hcrprobeforge index list shows registered
references and their status.
The webapp exposes these fields under Build index:
- NCBI assembly accession selects the exact record;
- Expected assembly name prevents an accidental mismatch;
- Index alias is the HCRProbeDesign registration name;
- Build threads controls index-building parallelism;
- Rebuild existing index corresponds to
--force.
Build from a local genome FASTA
hcrprobeforge index build \
--species local_xtr \
--fasta /path/to/genome.fna \
--annotation /path/to/matching/annotation.gff3 \
--assembly MyAssembly \
--threads 4
Use a matching organism during design:
hcrprobeforge sox9 --species local_xtr \
--organism "Xenopus tropicalis" --channel B3
If a matching GFF3 was supplied, the same registered local reference can be used for Pre-mRNA design. The accession is still retrieved and validated from NCBI using the organism name; the local genome and annotation provide the genomic target and index:
hcrprobeforge sox9 --species local_xtr \
--organism "Xenopus tropicalis" --target-type pre-mrna --channel B3
Or use a direct Bowtie2 prefix:
hcrprobeforge sox9 --species xtr \
--index /path/to/index/prefix --channel B3
The prefix is the path before the Bowtie2 .1.bt2 or .1.bt2l suffix.
For a local build, --annotation is optional when you only need mature
transcript designs. Add --with-annotation-db only when the supplied GFF3 is
from the same assembly and you want to prepare Pre-mRNA lookup during the
index build:
hcrprobeforge index build \
--species local_xtr \
--fasta /path/to/genome.fna \
--annotation /path/to/matching/annotation.gff3 \
--with-annotation-db \
--assembly MyAssembly \
--threads 4
If you leave the option off, the first Pre-mRNA run builds the database from the matching annotation. Existing ready references and compatible local reference assets are reused before a new download is attempted.
The index and species commands use separate option groups. The assembly flags
are intentionally command-specific: index fetch uses
--assembly-accession to identify an NCBI record and --assembly-name to
verify its returned display name, while index build uses --assembly as the
display name recorded for a local FASTA build. They are not interchangeable.
| Command | Purpose |
|---|---|
hcrprobeforge index list |
List managed reference metadata and readiness. |
hcrprobeforge species list |
List built-in and user-created species presets. |
hcrprobeforge species add |
Create a persistent custom species preset. |
hcrprobeforge index fetch |
Download and build the selected NCBI assembly. |
hcrprobeforge index build |
Build an index from a local genome FASTA. |
| Command | Option | Meaning |
|---|---|---|
index fetch |
--assembly-accession ACCESSION |
Exact versioned NCBI GCF_ or GCA_ assembly accession; defaults to the preset accession. |
index fetch |
--assembly-name NAME |
Expected NCBI assembly name; the build stops if NCBI returns a different name. |
index fetch |
--index-alias ALIAS |
Stable HCRProbeDesign alias for the registered index. Use a new alias for an alternate assembly. |
index build |
--assembly NAME |
Display name recorded for a local FASTA build. |
species add |
--genome-fasta FILE |
Local genome FASTA saved with a custom species preset. |
index fetch / index build |
--threads N |
Number of index-building threads; default 4. |
index fetch / index build |
--force |
Rebuild and replace an existing registration. |
index fetch / index build |
--with-annotation-db |
Build the optional SQLite genomic-annotation lookup during index construction. Without it, construction is deferred until the first Pre-mRNA run. |
index fetch |
--email EMAIL / --api-key KEY |
NCBI request credentials; NCBI_EMAIL and NCBI_API_KEY are used by default. |
Run hcrprobeforge index fetch --help or hcrprobeforge index build --help to
see the installed command's complete syntax.
Where indexes and metadata are stored
The actual registered Bowtie2 files belong to HCRProbeDesign. Its default data directory is:
~/.hcrprobedesign/
Set HCRPROBEDESIGN_DATA_DIR to relocate it. The exact registered prefix is
printed by the index command and webapp result page.
HCRProbeForge reference records are stored by default in:
~/.hcrprobeforge/references/<species>/<assembly>/reference.json
Set HCRPROBEFORGE_REFERENCE_DIR to relocate this registry. The webapp also
writes a metadata copy under the parent of the selected project root. If the
project root is $HOME/hcrprobeforge_projects/hcr_probe_design_project, the
phrase
<project parent> means $HOME/hcrprobeforge_projects:
<project parent>/index_metadata/<display-name component>/<assembly>/reference.json
HCRProbeForge reference assets are kept separately from Bowtie2 indexes:
~/.hcrprobeforge/references/<species>/<assembly>/
├── reference.json
├── genome.fna
├── annotation.gff # when available or supplied
└── annotation.sqlite # optional; built at index time or first Pre-mRNA run
Reusable project caches are kept below the selected project root rather than inside the hidden reference directory:
<project>/cache/<species>/<workflow>/
├── transcripts/<accession>/ # mature transcript cache
└── premrna/
├── models/<assembly>/ # parsed transcript/exon models
└── targets/<assembly>/<accession>/ # assembled genomic targets by mode
├── intronic_all.fa/.json
└── whole_all.fa/.json
The annotation database is a persistent reference asset because it is shared
by many targets; model and sequence caches are project workflow data. A
complete database is identified by its schema marker, final tables, indexes,
and SQLite structural validation. The normal readiness check is deliberately
fast; a full integrity audit is available for diagnostic validation. An
interrupted or incomplete annotation.sqlite is rebuilt atomically before a
Pre-mRNA design proceeds.
The reference-asset directory follows HCRPROBEFORGE_REFERENCE_DIR.
Compressed .gz files are used only as download/input sources and are not
retained beside these uncompressed assets.
The Build a genome index tab also provides Open index folder, which opens HCRProbeDesign's persistent data directory in the operating system's file browser. The actual Bowtie2 files are normally below:
~/.hcrprobedesign/indices/<index alias>/
This location follows HCRPROBEDESIGN_DATA_DIR when that environment variable
is set. The webapp rechecks the Bowtie2 files while it is open, so deleting an
index folder changes the species badge from ready to not registered. A design
or manifest started afterward stops before transcript lookup and explains how
to rebuild the missing index. Closing or reloading a browser tab does not stop
the local server, so a design or index build cannot be interrupted by a tab
lifecycle event. Stop the server with Ctrl-C in its terminal or use an
explicit authenticated shutdown request after all jobs finish. Species
presets cannot be added or removed while a design, QC, manifest, plot, or
index job is queued or running.
The species component is derived from the display name, while the assembly
component identifies the built reference. Short index aliases remain in the
HCRProbeDesign registry and Bowtie2 prefix; they are not used as project
species folder names. index_metadata is a metadata directory, not the genome
index directory.
When a custom species is removed from the Species menu, the confirmation dialog lists the saved FASTA, HCRProbeForge metadata, and exact Bowtie2 files that will be deleted, plus obsolete HCRProbeDesign entries and empty alias folders. Only unshared prefixes below the HCRProbeDesign data root are eligible. Built-in preset indexes, shared custom indexes, and out-of-root prefixes are retained. Config files are updated atomically with a backup. If a previous installation left a custom alias registered without a complete index, the next custom build repairs that incomplete registration automatically.
Launch the webapp
Activate the environment containing HCRProbeForge, HCRProbeDesign, Bowtie2, and the Python dependencies:
hcrprobeforge-web
Open http://127.0.0.1:8766/. If that port is already in use, HCRProbeForge automatically tries the next available ports and prints the actual URL. You can also choose a starting port explicitly:
hcrprobeforge-web --port 8780
hcrprobeforge-web --port 8780 --no-browser
The browser opens automatically unless --no-browser is supplied. The default
host is local-only:
hcrprobeforge-web --host 127.0.0.1 --port 8780
For an intentional network bind, provide a long access token and use the
printed access URL. The access token is required whenever --host is not a
loopback address:
export SERVER_TOKEN='<LONG_RANDOM_TOKEN>'
hcrprobeforge-web --host 0.0.0.0 --auth-token "$SERVER_TOKEN" --no-browser
<LONG_RANDOM_TOKEN> is a placeholder; replace it with a newly generated,
private value. The default loopback server does not require a user-supplied
token for its browser URL. For a loopback server, stop it with Ctrl-C in the
terminal; the authenticated /shutdown request below is for a server started
with --auth-token.
The five workflows
The setup page uses tabs:
- Design one target: a gene, optional accession, or one FASTA record; one or all channels.
- Design a gene list: CSV, TSV, XLSX, XLSM, or text input.
- Plot a probe table: an existing HCRProbeDesign TSV/text table to PNG and SVG.
- QC an oligo table: an existing IDT/selected-pairs table to an Excel workbook.
- Build a genome index: retrieve/register an NCBI assembly or build from a local FASTA.
Species and organism are near the top so transcript retrieval and genomic specificity use the same reference. Advanced settings contain the same transcript, design, curation, QC, and plotting options as the CLI.
When a preset already has a registered index on the computer, the selected species field shows an Index ready on this computer badge. If the badge says Index not registered yet, build the preset index first or select an explicit Bowtie2 prefix in Advanced settings/CLI.
Before designing, normal runs need a genome index for the selected species. If the badge says the index is not registered, use Build a genome index first. Turning off genome masking skips this requirement but is not recommended, because probes will not be screened for off-target matches.
The setup page reads the finished reference metadata and refreshes both badges
when it opens, when the browser window regains focus, and when a page is
restored from browser history. Setup rendering and the live status endpoint
use the committed metadata/path state rather than opening the SQLite file, so
returning after an index build is immediate even for large annotation files.
The design worker still performs full SQLite validation before querying
annotations. Dynamic setup, progress, result, and status responses are marked
non-cacheable, so returning with Start another run does not require a
manual browser refresh after an index build. If a browser has an existing
HCRProbeForge page open, close that tab and start the installed
hcrprobeforge-web process again after an upgrade; already-running Python
processes do not load updated package code.
The How to start guide can be reopened from the setup page. It explains species selection, index preparation, designing, plotting, QC, and results.
Input inspection and progress
Inspect input checks the selected workflow before a long operation starts. It
does not contact NCBI, build an index, run designProbes, or write scientific
output. The checks are intentionally the same shape checks used when the real
workflow is started:
| Workflow | What Inspect input checks |
|---|---|
| Design one target | Species/organism pairing, gene/accession/FASTA exclusivity, one FASTA record, supported bases, accession syntax, transcript-policy conflicts, and design/QC option values. |
| Design a gene list | Manifest file type, readable rows, recognized gene/accession/channel columns, structural row validity, duplicate jobs, and directory-name collisions. An optional channel column must contain B1-B5. |
| Plot a probe table | Probe-table file type, required HCRProbeDesign columns, numeric coordinates/metrics, non-empty rows, and any supplied transcript-length bound. |
| QC an oligo table | File type, readable table format, required name/sequence or P1/P2 columns, non-empty rows, and sequence validity through the same QC reader used by the run. |
| Build a genome index | Built-in or custom species preset, build-thread value, assembly accession syntax, local FASTA availability, and the selected preset’s assembly details. NCBI confirms that an accession/name pair exists during the build itself. |
Inspection cannot prove that a gene symbol or accession exists for an
organism without making the NCBI request. Manifest rows are therefore checked
again during execution. A true species mismatch is recorded as
skipped_species_mismatch; a mistyped gene or unresolved accession is recorded
as failed. Neither starts a design or retains new design/cache files, and
valid rows continue to run. Structural errors are shown before the run so they
can be corrected first.
Long jobs show the active phase and progress. Cancel run stops the current download, index build, or external design process when possible, prevents the next channel or manifest job from starting, and returns to setup.
For an index build, the progress phases identify source retrieval, annotation database preparation when selected, Bowtie2 index construction, registration, and final metadata validation. The optional annotation database is committed atomically before the reference is marked ready. Therefore a Pre-mRNA database ready badge means the registered reference metadata points to the finished database; the first Pre-mRNA design still performs a read-only schema validation before use.
Webapp workflow instructions
For Design one target:
- Select the species and check the index-status badge.
- If no index is registered, use Build index first.
- Choose one channel or All channels (B1-B5).
- Enter a gene, an accession, or upload one FASTA record.
- Optionally give the workflow a readable folder name.
- Inspect input, adjust Advanced settings only if needed, and run.
For Design a gene list:
- Select the species and channels.
- Upload CSV, TSV, XLSX, XLSM, or text.
- Use gene_symbol and accession headers, or one gene per line; accession may be blank.
- Optionally add a
channelcolumn with B1-B5 values for multiplex rows; leave it blank when the global channel selection should apply. - Inspect the manifest and fix any reported structural error or directory collision. Species mismatches are reported as skips; unresolved genes and accessions are reported as failures.
For Plot a probe table, choose a pastel or minimal theme and select whether
probe blocks are coloured by GC, dTm, or order. A sibling
*_transcript_resolution.json may provide annotation metadata, but a
standalone table still needs --transcript-length when its full sequence
length cannot be inferred from the table. For QC an oligo table, choose the
input file and optionally provide the workbook name. The QC workflow reads the
orderable sequences and writes its workbook in the QC run folder.
The webapp command itself has these options:
| Command | Meaning |
|---|---|
hcrprobeforge-web |
Start a local server on 127.0.0.1:8766 and open the browser. |
hcrprobeforge-web --host HOST --port PORT |
Choose a bind address and starting port. If the requested port is occupied, ports through PORT + 9 are tried. Non-loopback hosts require --auth-token. |
hcrprobeforge-web --auth-token <LONG_RANDOM_TOKEN> |
Set the per-process capability token; required for non-loopback binding. The value is a placeholder and the access URL is printed in the terminal. |
hcrprobeforge-web --allowed-host HOST |
Add an allowed HTTP Host header name, such as a trusted machine name or IP; repeat the option for additional names. This is not a firewall or HTTPS setting. |
hcrprobeforge-web --no-browser |
Start the server without opening a browser window. |
The all-channel, manifest, index, and species helper commands are documented in the corresponding sections of this README.
Webapp security and networking
The default server listens only on 127.0.0.1, so other computers cannot
connect to it. Every POST action also requires the per-process capability
token. The browser receives that token in a strict cookie, and the webapp
checks the request Host and, when supplied, the Origin. These protections stop
a separate webpage from silently starting a run, deleting a custom species,
opening local folders, or shutting down the server.
When --host is a non-loopback address, --auth-token is mandatory; remote
access is not enabled merely by changing the bind address. The
terminal prints an access URL containing the token once; open that URL only in
the intended browser and do not share it. The built-in server uses HTTP, not
HTTPS, so do not expose it to an untrusted network. For remote use, prefer an
SSH tunnel or an HTTPS reverse proxy in front of the loopback server. Use
--allowed-host to restrict which HTTP Host names may be accepted.
Closing, reloading, or navigating away from a tab never sends a shutdown
request. The server remains available for other tabs and active worker threads.
An explicit shutdown request is accepted only while the job queue is idle;
while a job is queued, running, or cancelling it returns a busy response and
leaves the server running. For the default loopback server, pressing Ctrl-C
in the terminal is the simplest shutdown method. The server still creates an
internal per-process token for browser POST actions, but it is not printed
because the browser's strict cookie carries it. If you need an HTTP shutdown
request, start the server with an explicit token so the same token can be sent
from the shell:
export SERVER_TOKEN='<LONG_RANDOM_TOKEN>'
hcrprobeforge-web --auth-token "$SERVER_TOKEN" --no-browser &
curl -X POST \
-H "X-HCRProbeForge-Token: $SERVER_TOKEN" \
http://127.0.0.1:8766/shutdown
Replace the placeholder with the private token used to start the authenticated server. Cancellation is cooperative: the worker stops at its cancellation checks and may need time to finish an external subprocess. It is not a guarantee that every external process stops immediately.
The port fallback changes only where the unchanged webapp listens. It does not alter transcript retrieval, genome selection, Bowtie2 indexing, probe generation, QC, curation, selection, output paths chosen by the user, or any other scientific behavior.
The webapp is a front end, not a second implementation. Before a submission it
disables fields that belong to another tab, validates the values that can be
checked locally, and then calls the same core or batch functions as the CLI.
The Inspect input button does not download an assembly or run designProbes.
It checks the shape of the supplied input so simple mistakes can be corrected
before a long job begins.
Manifest input and resume contract
A manifest is a list of independent target requests. It can be a CSV, TSV,
XLSX, XLSM, or plain UTF-8 text file. The parser ignores completely blank lines
and lines beginning with #. A row containing other fields but no gene label
is reported as invalid. A header is optional. When a header is present, these
names are recognized:
| Purpose | Accepted header names |
|---|---|
| Gene label | gene_symbol, gene, gene_name, or gene name |
| Transcript | accession, transcript, transcript_accession, or refseq_accession |
| HCR channel | channel, channels, hcr_channel, or hcr_channels |
The default command-level species is xtr; pass --species for another
preset. The default channel selection is B1,B2,B3,B4,B5, and a blank channel
field expands to that selection. The all-channel helper uses the same five
channel default. Plain-text fields may be separated by whitespace, commas, or
literal tab characters; CSV and TSV files should use their normal delimiters.
The manifest helper enables smart auto-curation by default, while a direct
hcrprobeforge invocation is one-pass unless --auto-curate-if-needed is
given. The webapp's Smart auto-curation control is selected by default; clear
it for a one-pass design.
Without a header, the first column is the gene label and the optional second
column is interpreted as either an exact accession or a channel (B1-B5).
Headerless three-column rows use gene_symbol, accession, channel order.
For example, all of these forms are valid:
# gene only; the selected --channels value applies
sox9
# gene plus an exact transcript
sox9 NM_001016853.2
# gene plus a per-row HCR channel
foxj1 B1
# gene, exact transcript, and per-row HCR channel
pkd2 NM_001088456.1 B2
A gene-only row is resolved using the selected transcript policy; a row with
an accession is validated as that exact transcript. An explicit accession is
never expanded by --all-transcripts. When a channel column is present, its
single B1-B5 value overrides the command's --channels setting for that
row. Rows with a blank channel continue to use --channels, so existing
manifests behave exactly as before.
Before design starts, preflight assigns each row a safe path component while
retaining the original biological label in metadata and status tables. It
reports rows with missing required values, malformed accessions, invalid
channel values, exact duplicate jobs, an accession used under multiple labels,
and path collisions. Completely blank lines are ignored rather than reported.
Ordinary invalid rows are excluded from execution but do not stop other valid
rows from running. Output-directory collisions are different: because they
could make two jobs overwrite one another, a collision stops the entire
manifest before any design starts. If no structurally valid jobs remain, the
manifest exits with an error without launching a design.
The per-row channel is part of the duplicate key: the same gene/accession can
legitimately occur once for B1 and once for B2. For example, a/b and a_b
both normalize to a_b; that collision stops the manifest before any design
is launched. A blank-channel row that expands to B1-B5 cannot overlap an
explicit row for the same target/channel, because that would make two rows
write the same result tree. Exact duplicate gene/accession/channel rows are
represented once in the executable job list. The first occurrence is run;
later occurrences are reported as duplicate bookkeeping rows and are not
executed again. Duplicates do not receive a separate .skipped marker because
they are not independent jobs; their status and reason remain in
manifest_preflight.tsv.
Each job is tracked independently. A successful job receives a .done marker;
an ordinary failed job receives a .failed marker and a log containing the
captured output. A true species-mismatch row receives a .skipped marker and a
status-table record, but no design or transcript-cache output. Explicit
per-row channel jobs have channel-specific marker and log names, so the same
gene/accession can be resumed independently for different channels. A
completed marker stores a signature of the HCRProbeForge version, species,
channels, smart-mode default, and forwarded design/QC/curation options. A later
invocation reuses a completed job only when that signature and the stored
species metadata both match. Changing an option causes that job to run again.
Completed markers without a parameter signature are rebuilt once so they can
acquire the current format. A temporary NCBI failure uses exit code 75. The
all-channel and manifest helpers retry that row or channel up to
HCRPROBEFORGE_CHANNEL_ATTEMPTS times (default 3); after the final attempt,
the manifest records a failed row and the helper returns a nonzero result.
Parsing, design, QC, and species-validation failures are not relabelled as
network failures.
The selected species is applied to both gene-symbol lookup and exact
transcript validation. An accession whose NCBI record belongs to another
organism is recorded as skipped_species_mismatch, produces a .skipped
marker, and does not make the manifest fail. A gene typo, unresolved accession,
or invalid transcript response is recorded as failed with a .failed marker
and makes the manifest return a nonzero status. In either case the row is
omitted from design and its new transcript/cache/output files are removed;
other manifest rows continue. The manifest command reports these outcomes
separately. Structural preflight-invalid rows also make the command return
nonzero; duplicate bookkeeping rows and true species-mismatch skips do not.
The
manifest_preflight.tsv, run_status.tsv, and outcome tables show the row and
the reason, while manifest logs retain the NCBI diagnostic for review.
Manifest status and result bookkeeping intentionally remain after a failure so the user can identify and resume the failed row. Direct single-target, plot, QC, and index failures are transactional and do not retain partial scientific outputs or a misleading empty output directory.
CLI quick start
The design examples below assume that the matching species index has already
been built, as described in Species and genome indexes.
The default design performs genomic masking and stops if no matching index is
registered. Use --no-genomemask only when you deliberately want to skip that
specificity check. If --species is omitted, the CLI uses the built-in xtr
species preset; specify it explicitly for any other organism.
Design one target
Gene-only input performs automatic transcript selection:
hcrprobeforge sox9 --species xtr --channel B3
This direct CLI command uses one-pass mode. Its native <target>_IDT.tsv
output is an upstream candidate table, not the final selected non-overlapping
order set. For a selected order-ready result, enable smart curation explicitly:
hcrprobeforge sox9 --species xtr --channel B3 \
--auto-curate-if-needed --target-probes 20 \
--outdir "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
For a reproducible exact transcript:
hcrprobeforge sox9 --accession NM_001016853.2 \
--species xtr --channel B3 --auto-curate-if-needed \
--target-probes 20 \
--outdir "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
For a custom target sequence:
hcrprobeforge --fasta target.fa --species xtr \
--channel B3 --outdir "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
FASTA input must contain one record and cannot be combined with gene or accession.
Design a Pre-mRNA target
Pre-mRNA is an explicit target mode for any preset with a matching registered genome and genomic annotation. It resolves one exact RefSeq transcript, then uses that assembly's annotation and FASTA to reconstruct the full genomic transcript in transcript 5′→3′ order: every exon and every intron is present in the target sequence. On a minus-strand model, each genomic segment is reverse-complemented and ordered in transcript orientation.
Use --target-type pre-mrna when probes must be intron-specific. It permits
only complete pairs inside selected introns, so exonic and intron-boundary
candidates are excluded before QC and curation. Use pre-mrna-whole when the
design should cover the entire unspliced transcript: exons, introns, and
boundary-spanning candidates are eligible. Both modes use the same genomic
target and annotation; the mode changes only candidate eligibility and
selection policy.
Leave --premrna-introns blank to use every annotated intron. When smart
curation is enabled, the Pre-mRNA selector distributes the requested final
pairs as evenly as sequence capacity allows across those introns. With smart
curation disabled, the one-pass design filters candidates to the selected
introns and enforces interval non-overlap before writing the order-ready table.
The one-pass path does not use --target-probes as a cap on the native
candidate request; use smart curation when you need a requested final count.
To target only particular introns, use a comma-separated 1-based list:
hcrprobeforge sox10 --species xtr \
--target-type pre-mrna --premrna-introns 1,3,5 \
--channel B3 --target-probes 20 --auto-curate-if-needed \
--outdir "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
For reproducibility, you may replace the gene-only input with the exact
versioned RefSeq accession resolved for the gene. Pre-mRNA design requires a
ready registered index and uses that registered assembly for both annotation
and genomic specificity screening; do not override it with --index. The
index workflow downloads and retains the uncompressed genome FASTA and GFF3
when an NCBI preset is built. If a ready index does not yet have the matching
reference assets, the first Pre-mRNA design downloads them once and caches the
indexed annotation and assembled target. The general smart-curation checkbox
remains optional in this mode: when enabled, curation distributes candidates
as evenly as capacity allows across selected introns; when disabled, the
ordinary one-pass design filters and packs eligible candidates after intron
filtering without targeting a final count. Packing means that candidates are
ordered by target coordinates and a candidate is retained only when it does
not overlap a pair already retained.
Intron numbering follows the transcript's 5′→3′ direction. Thus intron 1 is
the first intron encountered in transcript orientation, including for a
minus-strand genomic model. Pre-mRNA start and end coordinates are
1-based inclusive positions on the assembled full genomic-transcript target in
that same transcript orientation; mature-transcript coordinates refer to the
mature transcript sequence.
The output metadata records the assembly, selected transcript, intron numbers, genomic coordinates, strand, target mode, cache paths, assembled target length, and the distribution rule. For whole-target design:
hcrprobeforge sox10 --species xtr \
--target-type pre-mrna-whole \
--channel B3 --target-probes 20 --auto-curate-if-needed \
--outdir "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
The webapp exposes the two Pre-mRNA modes only for a selected species preset and shows whether that species has a complete annotation database. If the badge says the database will be built on the first Pre-mRNA run, the first run may take time to scan the GFF3; later targets reuse the SQLite database and the project cache. Mature-transcript mode remains the default and is unchanged.
For a normal one-pass intronic run, the native HCRProbeDesign table is kept as
<target>_candidate_IDT.tsv under details/ for diagnostics. It can contain
exonic or intron-boundary candidates from the upstream tool. The package
filters those candidates to complete selected introns, applies interval
non-overlap, writes
<target>_eligible_IDT_order.csv, and uses that eligible table for the normal
Pre-mRNA oligo QC. With --auto-curate-if-needed, every candidate reservoir is
filtered before curation and the final order file is
<target>_final_IDT_order.csv. In pre-mrna-whole, exonic, intronic, and
boundary-spanning candidates are eligible; the map and annotations identify
which regions each candidate overlaps.
Design all linked transcripts
hcrprobeforge sox9 --species xtr \
--all-transcripts --channel B3
Do not combine --all-transcripts with --accession or --fasta. The all-channel
helper forwards it to each requested channel:
hcrprobeforge-all-channels sox9 --species xtr --all-transcripts
Design selected channels
hcrprobeforge-all-channels sox9 --species xtr
hcrprobeforge-all-channels sox9 --species xtr --channels B1,B3
hcrprobeforge-all-channels sox9 --accession NM_001016853.2 \
--species xtr --channels B2,B4
The helper owns --fasta, --outdir, --accession, and --channels; pass
each of those to the helper itself, not as forwarded arguments. It also accepts
the design and curation options accepted by hcrprobeforge. Its default is all
five channels with smart auto-curation enabled.
Design a manifest
hcrprobeforge-manifest genes.tsv "$HOME/hcrprobeforge_projects/hcr_probe_design_project" --species xtr
hcrprobeforge-manifest genes.csv "$HOME/hcrprobeforge_projects/hcr_probe_design_project" --species mouse --channels B1,B2,B3
hcrprobeforge-manifest genes.xlsx "$HOME/hcrprobeforge_projects/hcr_probe_design_project" --species human
hcrprobeforge-manifest multiplex.csv "$HOME/hcrprobeforge_projects/hcr_probe_design_project" --species xtr
Supported extensions are CSV, TSV, XLSX, XLSM, and plain text. Headered files
can use gene_symbol, accession, and optional channel. Headerless files may
contain one gene per line, gene plus accession, gene plus channel, or
gene/accession/channel in three-column order:
sox9
sox9 NM_001016853.2
gnrhr2/nmi NM_001114076.1
foxj1 B1
pkd2 NM_001088456.1 B2
For a multiplex experiment, put the channel beside each target. This CSV example avoids relying on visually invisible tab characters:
gene_symbol,accession,channel
foxj1,NM_<TRANSCRIPT_ID>.<VERSION>,B1
pkd2,NM_<TRANSCRIPT_ID>.<VERSION>,B2
arl13b,NM_<TRANSCRIPT_ID>.<VERSION>,B3
Replace the transcript placeholders with real RefSeq accessions. TSV files are
also supported; use actual tab separators rather than the two characters \t.
Run it once with the normal command. The optional per-row channel overrides
--channels for that row; rows without a channel use the global value. Exact
duplicate gene/accession/channel rows execute once: the first occurrence runs,
and later occurrences are recorded as duplicate bookkeeping rows without a
separate job marker.
Original biological labels remain in metadata and status tables; only path
components use the safe-name rule. Preflight detects invalid channel values
and path-normalization collisions before design starts. Species-
mismatched rows are recorded as skipped; mistyped genes and unresolved
accessions are recorded as failed. Neither starts a design, and valid rows
continue to run; the manifest exits nonzero when a row fails.
Plot an existing table
hcrprobeforge --plot-only probes.tsv \
--plot-theme minimal --plot-color-by dtm \
--plot-dpi 300 --outdir "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
Both PNG and SVG maps are written. The theme and color variable are separate:
minimal changes style and --plot-color-by dtm changes probe-block colors. Use
--transcript-length when the full length cannot be inferred.
Run QC on an existing table
hcrprobeforge --qc-only final_IDT_order.csv \
--qc-output "$HOME/hcrprobeforge_projects/hcr_probe_design_project/qc_review/final_oligo_structure_QC.xlsx"
Accepted inputs include IDT CSV/TSV/XLSX and selected-pairs tables. Without
--qc-output, CLI QC writes beside the input. Webapp QC writes in its QC run
directory.
Complete CLI option reference
Run hcrprobeforge --help for the authoritative installed help.
Input and transcript retrieval
| Option | Default | Meaning |
|---|---|---|
gene |
none | Gene symbol or display label; unsafe characters stay in metadata. |
--organism |
preset | NCBI scientific name for a custom registered alias. |
--accession |
automatic | Exact RefSeq transcript accession. |
--fasta |
none | One FASTA record; cannot combine with gene/accession. |
--target-type |
mature | mature (default), pre-mrna (full target with intron-only eligibility), or pre-mrna-whole (full target with exon/intron eligibility); Pre-mRNA requires a matching registered genome/annotation. |
--premrna-introns |
all | Comma-separated 1-based intron numbers for pre-mrna; blank includes all introns in the full genomic target. Not used by pre-mrna-whole. |
--all-transcripts |
off | Design every linked RefSeq RNA transcript. |
--transcript-policy |
auto | auto, longest, interactive, or require-accession. |
--email |
NCBI_EMAIL |
Email sent with NCBI requests. |
--api-key |
NCBI_API_KEY |
Optional NCBI API key. |
Reference and design
| Option | Default | Meaning |
|---|---|---|
--species |
xtr | Registered species/index alias. |
--index |
registered alias | Explicit Bowtie2 prefix for mature-transcript designs. It cannot be used with --target-type pre-mrna or pre-mrna-whole, which must use the registered reference's matching genome and annotation. |
--channel |
B1 | B1, B2, B3, B4, or B5. |
--tile-size |
52 | Target tile length in nucleotides. |
--min-gc / --max-gc |
45 / 55 | Candidate GC bounds. |
--min-gibbs / --max-gibbs |
-70 / -50 | Gibbs free-energy bounds reported by HCRProbeDesign, in kcal/mol. |
--target-gibbs |
-60 | Preferred Gibbs free-energy value for candidate ranking, in kcal/mol. |
--max-run-mismatches |
2 | Maximum tolerated mismatches in HCRProbeDesign's C/G-rich-run filter. The upstream run length is 7 nt and is not exposed as a HCRProbeForge option; this is not a Bowtie2 alignment-mismatch setting. |
--max-probes |
dynamic | Candidate-pair request sent to the initial designProbes run: 30 in one-pass mode, or the smart-mode initial request described in How the design pipeline works. It is not the final selected count. |
--num-hits-allowed |
1 | Maximum number of Bowtie2 genomic alignments accepted by HCRProbeDesign for each target tile. The intended genomic alignment consumes one reported hit, so 1 allows a unique on-target tile and rejects tiles with additional genomic matches. A tile that has zero accepted end-to-end genomic alignments, including a tile that spans an exon–exon junction with no contiguous genomic match, is not rejected by this maximum-hit setting alone; this option is not a positive on-target or junction-validity test. Screening uses the selected registered genome index; HCRProbeForge does not add a separate junction, paralog, or X. laevis homeolog screen. |
--dtm-filter |
off | Enable filtering by probe-arm dTm, the absolute difference between the two arm melting temperatures, in °C. |
--dtm-max |
5 | Maximum dTm in °C when --dtm-filter is enabled. dTm is the absolute difference between the two arm Tm values. The auto-score separately adds a fixed penalty for dTm above 5 °C, even when a different --dtm-max is supplied. |
--no-genomemask |
off | Disable genomic specificity screening. |
Plotting
| Option | Default | Meaning |
|---|---|---|
--plot-only |
none | Plot an existing probe table and exit. |
--transcript-length |
inferred | Full sequence length for plotting. Supply it for a standalone table when it cannot be inferred from the table or sibling metadata. |
--plot-theme |
pastel | pastel or minimal. |
--plot-color-by |
gc | Color by GC percentage, probe-pair dTm in °C, or displayed table/order position (order). The order mode cycles through the map palette by row number; it is not a biological score. |
--plot-dpi |
300 | PNG resolution; SVG is always generated. |
--no-probe-labels |
off | Hide probe numbers. |
--plot-title |
automatic | Replacement map title. |
QC, curation, and output
| Option | Default | Meaning |
|---|---|---|
--no-oligo-qc |
off | Skip final oligo QC. |
--qc-only |
none | QC an existing IDT/selected-pairs table. |
--qc-output |
automatic | XLSX/XLSM output for QC-only. |
--auto-curate-if-needed |
off | Run fallback tiers when needed. |
--target-probes |
20 | Desired final pair count in smart mode. In one-pass mature and Pre-mRNA-intronic modes it does not cap the native candidate request or candidate table; one-pass Pre-mRNA still filters and packs eligible intronic candidates without overlap. Use --max-probes to control the one-pass candidate request. |
--min-acceptable-probes |
12 | Minimum pair count used by smart-curation/reporting to label an undersized result as a useful partial_success. It does not change candidate generation, the --target-probes cap, or interval selection; the actual result status and counts are recorded in the report. |
--qc-stringency |
balanced | strict, balanced, or permissive. |
--auto-curate-plan |
standard | standard, conservative, or deep. |
--max-auto-runs |
12 | Additional distinct runs per phase. |
--auto-curate-max-probes |
dynamic | Candidate request for added smart-curation tiers; the default is described in How the design pipeline works. |
--coverage-policy |
balanced | balanced or qc-only. |
--outdir |
hcr_results | Project output root. |
The helper commands add --channels as a comma-separated subset of B1-B5; its
default is B1,B2,B3,B4,B5. The index command has separate options described
above.
Option interactions and reproducible command patterns
The options are intentionally grouped by responsibility. A command can contain options from several groups, but an option is acted on only by the workflow that uses it. This makes it possible to keep one documented command line for a project without accidentally changing a plot or QC run with a design-only setting.
The following interactions are the ones most likely to matter in practice:
| Situation | Rule |
|---|---|
--species without --organism |
A built-in alias supplies the NCBI organism, assembly metadata, and registered HCRProbeDesign index alias. |
| Registered custom alias | Supply the matching --organism; the package will not guess the taxon from an arbitrary alias. |
--index |
Overrides the registered Bowtie2 prefix for a mature-transcript design. It does not change the NCBI organism used for transcript retrieval and is rejected for Pre-mRNA modes. |
--fasta |
Must be a single FASTA record and cannot be combined with a gene symbol or --accession. The selected species/index still controls genomic masking unless it is disabled. |
--all-transcripts |
Applies to gene-only input. It cannot be combined with --accession, because an explicit accession already identifies one transcript. |
--transcript-policy |
Applies only when a gene symbol needs automatic transcript selection. It has no effect on an explicit accession or custom FASTA. |
--target-type pre-mrna or pre-mrna-whole |
Requires one NCBI-selected transcript and a complete registered index with matching genomic assets; it cannot be combined with --fasta, --all-transcripts, or --index. pre-mrna restricts pairs to complete selected introns; pre-mrna-whole allows the full genomic target. Mature-pipeline QC and scientific parameters are unchanged. |
--premrna-introns |
Restricts Pre-mRNA to comma-separated 1-based intron numbers. Blank uses every annotated intron. The selector uses equal capacity-aware intron quotas. |
--auto-curate-if-needed |
Enables the capacity-aware curation search and requires final oligo QC; do not combine it with --no-oligo-qc. |
--target-probes and --max-probes |
--target-probes is the desired final pair count. --max-probes is the candidate request sent to the initial designProbes call. They are not interchangeable. |
--plot-only and --qc-only |
These are standalone modes. They read an existing table and do not run transcript retrieval or probe design. |
--plot-* options |
They affect plot-only output and the maps produced by a design run; they do not change candidate generation or selection. |
--qc-output |
It is used by QC-only mode. Automatic design QC remains beside the design output and uses the standard final-QC filename. |
--no-genomemask |
Deliberately skips genome specificity screening. It is useful for a custom sequence with no meaningful reference, but it removes an important design check. |
--outdir |
Is the project root. The package creates runs/ and cache/ below it and keeps species/workflow paths separate. |
For a reproducible design, pin the species, versioned transcript accession, channel, and the design/curation options that differ from the defaults:
hcrprobeforge sox9 --accession NM_001016853.2 \
--species xtr --channel B3 --auto-curate-if-needed \
--target-probes 20 \
--outdir "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
For a one-pass design that must call designProbes only once, omit smart
curation and set the candidate request explicitly:
hcrprobeforge sox9 --accession NM_001016853.2 \
--species xtr --channel B3 --max-probes 30 \
--outdir "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
For plotting and QC, the input table is the scientific input and the output folder is presentation/bookkeeping output:
hcrprobeforge --plot-only selected_pairs.tsv --plot-color-by dtm \
--plot-theme pastel --outdir "$HOME/hcrprobeforge_projects/hcr_probe_design_project"
hcrprobeforge --qc-only final_IDT_order.csv \
--qc-output "$HOME/hcrprobeforge_projects/hcr_probe_design_project/qc_review.xlsx"
The installed command is authoritative if a future HCRProbeDesign release adds
an option. Use hcrprobeforge --help, hcrprobeforge index fetch --help, and
hcrprobeforge-web --help when copying commands between environments.
How transcript selection works
With a gene and the default --transcript-policy auto, HCRProbeForge uses the
requested species and deterministic ranking:
- exact active NCBI Gene match;
- a record with linked RefSeq RNA;
- RefSeq Select when available;
- curated NM_/NR_ before predicted XM_/XR_;
- complete before partial records;
- longest remaining transcript;
- accession as the final tie-break.
The selected accession, alternatives, GeneID, ranking fields, and reason are
saved in a file named <target>_transcript_resolution.json (where <target>
is replaced by the safe target name). longest ignores accession class,
interactive prompts in a terminal, and require-accession stops when a manual
accession is needed. The webapp supports the non-interactive policies.
Exact RefSeq sequence and feature data are validated against the accession version. Annotation is reporting-only: it may add 5'-UTR, CDS, and 3'-UTR tracks and region counts without changing candidate generation or selection.
Custom FASTA bypasses NCBI transcript lookup and annotation. It must contain A/C/G/T/N; U is converted to T. Coordinates are 1-based within the FASTA record.
How the design pipeline works
- HCRProbeDesign enumerates and filters candidate tiles and provides channel-specific HCR oligo sequences.
- HCRProbeForge retains the candidate reservoir and calculates/report metrics used by QC and, when enabled, the selection pipeline.
- Primer3 checks the final initiator-bearing P1/P2 oligos for hairpins, self-dimers, same-pair heterodimers, and pool-level heterodimers.
- When smart auto-curation is enabled, it can request additional predefined tiers when the initial design is insufficient, dimer reviews remain, or balanced coverage is poor for a sufficiently long transcript.
- Smart selection maximizes acceptable non-overlapping pair count first, then respects explicit QC priorities, coverage, and technical tie-breakers.
- One-pass output, or smart-curated final output, and its metadata are written after the required QC processing succeeds. One-pass intronic Pre-mRNA output is filtered to complete selected introns and interval-packed so returned order-ready pairs do not overlap.
HCRProbeDesign reports GibbsFE as predicted target-binding free energy in
kcal/mol, using its documented 37 °C and 0.33 M salt-correction model. More
negative values indicate stronger predicted binding. HCRProbeDesign reports
dTm as the absolute melting-temperature difference between the two split
target-binding arms, in °C.
Smart mode normally requests four times the value of --target-probes initially
and five times that value from added tiers. These are candidate requests, not a
promise of final count.
Short transcripts may correctly yield fewer pairs because of geometric
capacity, sequence filtering, specificity, or QC.
The _final_IDT_order.csv file contains the actual selected initiator-bearing
oligos produced by smart curation. In a normal one-pass mature-transcript run,
the native <target>_IDT.tsv is the candidate order table and no non-overlap
selection has been applied. In a normal intronic Pre-mRNA run,
<target>_eligible_IDT_order.csv is the filtered, non-overlapping candidate
order table; the
native <target>_candidate_IDT.tsv is retained for diagnostics. Do not
reconstruct order sequences from target tiles.
HCR channels and final-order conventions
Each selected probe pair is made from two orderable oligos. The 52-nt default
is the target-tile length supplied to HCRProbeDesign; it is not the length of
either final order oligo. HCRProbeDesign splits each target tile and adds the
channel-specific initiator and spacer structure before HCRProbeForge performs
final-oligo QC. In the standard 52-nt model, the target tile is split into two
25-nt target-binding arms with a 2-nt central gap (25 + 2 + 25 = 52); the
initiator and spacer sequences are then added to those arms. For the even tile
sizes used by the published fallback plans, each arm has
(tile size − 2) / 2 nucleotides: 50 nt gives 24+2+24, 48 gives 23+2+23,
46 gives 22+2+22, 44 gives 21+2+21, 42 gives 20+2+20, 40 gives 19+2+19,
38 gives 18+2+18, and 36 gives 17+2+17. These shorter tiers are rescue
options, not equivalent substitutes for the standard 25-nt arms; shorter arms
can reduce target specificity and may have different Tm behavior. The final
QC and genomic screening rules still apply, but users should retain the tile
size, arm lengths, and HCRProbeDesign version with the design. The final order
file contains two rows per selected pair, normally named with _P1 and _P2
suffixes.
The channel is part of the scientific design input. It must match the HCR amplifier used in the experiment:
| Probe channel | P1/odd 20-nt channel sequence component | P2/even 20-nt channel sequence component | Matching amplifier |
|---|---|---|---|
| B1 | GAGGAGGGCAGCAAACGGAA |
TAGAAGAGTCTTCCTTTACG |
B1 H1/H2 |
| B2 | CCTCGTAAATCCTCATCAAA |
AAATCATCCAGTAAACCGCC |
B2 H1/H2 |
| B3 | GTCCCTGCCTCTATATCTTT |
TTCCACTCAACTTTAACCCG |
B3 H1/H2 |
| B4 | CCTCAACCTACCTCCAACAA |
ATTCTCACCATATTCGCTTC |
B4 H1/H2 |
| B5 | CTCACTCCCAATCTCTATAA |
AACTACCCTACAAATCCAAT |
B5 H1/H2 |
Each sequence in this table is a 20-nt channel-specific initiator-side component that includes the 2-nt spacer used by the HCRProbeDesign channel convention. The strings are shown 5′→3′ for their P1 or P2 attachment; they are not complete order oligos, and they do not replace the P1/P2 sequences written by HCRProbeDesign in the final IDT file.
The exact sequence and name columns in a final IDT CSV are the orderable record. Candidate tables are useful for review, but a normal one-pass native candidate table is not necessarily a non-overlapping final set. A design of 20 selected pairs normally produces 40 final oligos. Inspect the final QC workbook and selected-pairs table before ordering, especially when a run used permissive fallback tiers, a custom FASTA, or a Pre-mRNA target.
Auto-curation technical details
Smart auto-curation is a capacity-aware search around the initial design settings. It does not replace the candidate generator or silently change the sequence calculations. It asks HCRProbeDesign for additional candidate reservoirs, runs the same final-oligo QC on those candidates, and lets the existing selector compare all acceptable candidates together.
Initial and fallback phases
Phase 0 is always the exact initial request. No relaxation is applied to the user's initial tile size, GC range, Gibbs range, C/G-run setting, or QC stringency. Smart-mode candidate reservoir sizes use the initial and per-tier defaults documented in the option reference unless the corresponding candidate-count options are supplied. These are reservoir sizes, not promises about the number of final pairs.
The normal phase follows the selected --auto-curate-plan and
--qc-stringency. A deep adaptive phase is started only when an applicable
condition indicates that more searching may help. The normal and deep phases
have separate --max-auto-runs limits. Duplicate parameter combinations are
skipped and do not consume a run slot.
The fallback decision considers three things:
- The selected count is below the smaller of the requested target and the transcript-specific deep-plan geometric capacity.
- The selected set still contains self-dimer or same-pair P1/P2 dimer review flags.
- Balanced coverage is enabled and the selected set has an applicable span, gap, or occupied-bin review condition.
Low-yield or dimer rescue may use permissive candidate acceptance, but it still rejects practical-reject structures and strong self- or same-pair dimers. Coverage-only rescue keeps the original QC stringency; improved distribution does not justify admitting a poorer-quality oligo. All runs, effective parameters, triggers, and stopping reasons are recorded in the auto-curation JSON and Markdown report.
Geometric capacity and short-transcript protection
The geometric upper bound is calculated independently for every contiguous unambiguous A/C/G/T segment:
capacity(tile size) = sum floor(unambiguous segment length / tile size)
The report records capacity for the canonical 52-nt tile, the shortest tile in the selected normal plan, and the 36-nt deep-plan minimum. These are only upper bounds: GC, Gibbs, C/G-run filters, genomic specificity, candidate export, Primer3 QC, and interval packing can reduce the achievable count.
Balanced coverage is automatically disabled when the canonical 52-nt capacity is below ten pairs. Even when the policy is enabled, coverage review and coverage-triggered fallback require a selected set of at least ten pairs. Short transcripts are still allowed to use shorter tiles when that increases the acceptable non-overlapping count, but they are not penalized for failing long-transcript coverage criteria.
Standard and deep plans
The standard plan uses these tiers, in order. The user's initial CLI/webapp tile, GC, Gibbs, and C/G-run values are used exactly for the initial run. The plan then considers each distinct standard tier, including the first row when the user's initial values differ from it; an identical tier is not run twice. Subsequent tiers are only considered when smart curation needs them.
| Tier | Tile (nt) | GC (%) | Max C/G-run mismatches | Gibbs range | Target Gibbs |
|---|---|---|---|---|---|
| 1 | 52 | 45–55 | 2 | −70 to −50 | −60 |
| 2 | 52 | 40–60 | 2 | −70 to −50 | −60 |
| 3 | 52 | 35–65 | 2 | −70 to −50 | −60 |
| 4 | 52 | 30–65 | 1 | −70 to −50 | −60 |
| 5 | 50 | 40–60 | 2 | −70 to −48 | −58 |
| 6 | 48 | 40–60 | 2 | −70 to −47 | −56 |
| 7 | 46 | 40–65 | 1 | −70 to −45 | −55 |
| 8 | 44 | 40–65 | 1 | −70 to −43 | −52 |
| 9 | 42 | 40–65 | 1 | −70 to −40 | −50 |
The conservative plan uses five tiers: 52 nt at 45–55% GC, 52 nt at 40–60%, 50 nt at 40–60% with a −70 to −48 Gibbs range, 48 nt at 40–60% with a −70 to −47 range, and 46 nt at 40–65% with one allowed C/G-run mismatch. The deep plan is explicit below; it broadens the 50–42 nt tiers to 35–65% GC and one C/G-run mismatch, then adds shorter tiers. The exact plan used is written to the report; the selector may retain a mix of tile sizes when that produces a better valid set.
| Deep tier | Tile (nt) | GC (%) | Max C/G-run mismatches | Gibbs range | Target Gibbs |
|---|---|---|---|---|---|
| 1–4 | 52 | 45–55, 40–60, 35–65, 30–65 | 2, 2, 2, 1 | −70 to −50 | −60 |
| 5 | 50 | 35–65 | 1 | −70 to −48 | −58 |
| 6 | 48 | 35–65 | 1 | −70 to −47 | −56 |
| 7 | 46 | 35–65 | 1 | −70 to −45 | −55 |
| 8 | 44 | 35–65 | 1 | −70 to −43 | −52 |
| 9 | 42 | 35–65 | 1 | −70 to −40 | −50 |
| 10 | 40 | 35–65 | 1 | −70 to −38 | −46 |
| 11 | 38 | 35–65 | 0 | −70 to −36 | −44 |
| 12 | 36 | 35–65 | 0 | −70 to −34 | −42 |
Balanced transcript coverage
Coverage is a tie-breaker after count and explicit QC. It never replaces a cleaner set with a more heavily flagged set. For a selected set the pipeline calculates:
- the fraction of the transcript spanned from the first probe start to the last probe end;
- the largest untargeted gap, including terminal gaps;
- ideal spacing (
transcript length / selected pair count); - the largest-gap-to-ideal-spacing ratio;
- the number of occupied bins out of ten transcript bins; and
- mean deviation from evenly spaced target positions.
For sets with at least ten probe pairs, balanced fallback can be triggered when any of these conditions applies:
probe span fraction < 0.85
maximum untargeted gap > 2.5 × ideal spacing
occupied transcript bins < 8 of 10
These are search triggers and report conditions, not hard biological failures. If no equally clean alternative exists, the cleaner set is retained and the remaining coverage issue is reported.
Candidate ranking and auto_score
The final set is not chosen by taking the lowest auto_score values. The
selection objective is lexicographic and prioritizes practical quality:
- maximize the number of non-overlapping selected pairs, up to
--target-probes; - minimize selected self-dimer and same-pair P1/P2 dimer review burden;
- minimize dimer deltaG severity;
- minimize strong or energetically concerning hairpins;
- minimize mild Tm-only hairpin reviews;
- when balanced coverage is enabled, improve even transcript distribution among otherwise equivalent sets; and
- use source tier, tile length, GC, Gibbs, dTm, and
auto_scoreas technical tie-breakers.
auto_score is therefore a review aid and late tie-breaker. It is not a
thermodynamic measurement, Primer3 output, biological confidence score, or
pass/fail threshold. Lower is preferred only when the higher-priority
objectives are equivalent.
auto_score =
source_tier * 100
+ max(0, 52 - tile_size) * 3
+ abs(GC - 50) * 2
+ abs(GibbsFE - source_target_gibbs) * 1.5
+ max(0, dTm - 5) * 8
+ QC_penalty
The report's internal source_tier field is zero-based: it is 0 for the
initial run, which is user-facing Tier 1, 1 for the first relaxed tier (Tier
2), 2 for Tier 3, and so on. The source-tier penalty is therefore 0 for the
initial run, 100 for the first relaxed tier, 200 for the second, and so on. The
tile-size penalty is zero at 52 nt
and increases by three for every nucleotide below 52. This is a deliberately
simple technical tie-breaker that keeps the standard 52-nt design preferred
when higher-priority QC and coverage objectives are equivalent; it is not a
measured biological penalty or a claim that every nucleotide reduction has the
same experimental effect. GC is favored near 50%.
Gibbs is favored near the target for the source tier, and dTm above 5 °C adds
an increasing penalty. QC penalty components reflect the observed review
burden; they do not replace the explicit QC gate.
Final oligo QC thresholds
Primer3 is run on the actual initiator-bearing P1 and P2 order sequences after HCRProbeDesign constructs the channel-specific oligos. This is important: the final order oligo can fold or dimerize differently from its transcript target tile. The same QC logic is used in automatic design and the standalone QC workflow.
HCRProbeForge calls primer3-py hairpin, homodimer, and heterodimer functions
without overriding their Primer3 thermodynamic defaults: 50 mM monovalent
salt, 1.5 mM divalent salt, 0.6 mM dNTP, 50 nM oligonucleotide concentration,
37 °C, and a maximum loop size of 30 bases. The QC report converts Primer3
deltaG values from cal/mol to kcal/mol and reports melting temperatures in °C.
Reproducibility records the installed primer3-py version; these are the
thermodynamic-analysis defaults, not a custom salt or oligo-concentration model
validated specifically for every HCR hybridization buffer. The package's QC
cutoffs are conservative review heuristics, not experimental guarantees; keep
the workbook and validate the final oligos under the intended assay conditions.
The following classifications are reported for each structure type:
| Structure | Review | Strong review | Practical reject |
|---|---|---|---|
| Hairpin | Tm ≥ 50 °C or ΔG ≤ −5 kcal/mol | ΔG ≤ −8 kcal/mol, or Tm ≥ 60 °C and ΔG ≤ −7 kcal/mol | not used as a standalone hard reject |
| Self-dimer | ΔG ≤ −9 kcal/mol | ΔG ≤ −12 kcal/mol | ΔG ≤ −15 kcal/mol |
| Same-pair P1/P2 heterodimer | ΔG ≤ −10 kcal/mol | ΔG ≤ −12 kcal/mol, or Tm ≥ 37 °C and ΔG ≤ −11 kcal/mol | not used as a standalone hard reject |
| Cross-pool heterodimer | ΔG ≤ −10.5 kcal/mol | ΔG ≤ −13 kcal/mol | ΔG ≤ −15 kcal/mol |
All stringencies exclude practical-reject structures and strong self- or same-pair dimers. Balanced and strict modes also exclude strong hairpins. Strict mode additionally excludes ordinary self- and same-pair review flags. Permissive mode can retain strong-hairpin candidates during yield rescue, but does not admit the hard dimer exclusions listed above. Cross-pool dimer reviews are evaluated on the selected pool and can trigger replacement repair; they are not silently treated as single-candidate hairpin or same-pair gates. A cross-pool practical-reject threshold (ΔG ≤ −15 kcal/mol) is therefore a repair trigger/review note rather than an unconditional candidate deletion; if no count-preserving replacement is found, the remaining issue is retained in the report. Mild Tm-only hairpin reviews are recorded and ranked below dimer concerns.
The final QC workbook contains the structure calls and numerical values. A QC-only run does not design probes; it reads the provided oligo table, checks the orderable sequences, and writes a workbook to the requested QC folder.
Annotation and coordinate conventions
Transcript coordinates are 1-based and inclusive. In mature-transcript mode,
probe start and end coordinates refer to the mature transcript sequence
used for design. In Pre-mRNA mode, they refer to the assembled full genomic
transcript in transcript orientation, as described above. The FASTA sequence
itself is normalized to uppercase DNA; U is converted to T and only A/C/G/T/N
are accepted.
NCBI feature annotation is reporting-only. When an exact RefSeq record is available, the package can label 5′ UTR, CDS, 3′ UTR, partial/unannotated terminal sequence, and unclassified non-CDS sequence on the map and in selected-pair tables. It does not alter candidate generation, QC, non-overlap selection, or order sequences. If annotation retrieval fails, design continues with an unsegmented transcript map and the report records the reason.
Pre-mRNA is the separate opt-in exception to that reporting-only rule: it
reconstructs the full genomic transcript from the selected model, keeps
transcript-strand orientation (including reverse-complementing minus-strand
transcripts), and maps exons and introns onto the target. In pre-mrna
intronic mode, candidates must be completely contained in selected introns. In
pre-mrna-whole mode, candidates may be in exons, introns, or span a boundary.
The assembled target and transcript model are cached under the selected
project's cache/<species>/<workflow>/premrna/ tree, while the
mature-transcript default remains reporting-only as described above.
Maps and metadata use the conventional 5′ and 3′ biological labels. JSON
files are UTF-8 encoded, so programs that parse them receive the same labels.
Map feature labels are placed inside their own annotation region whenever the
complete label fits. Mature-transcript labels may use an external callout when
their individual region is too narrow; Pre-mRNA exon/intron labels that do not
fit are omitted to keep dense maps readable. Probe-number labels use one
inside/outside mode for each group of boxes whose rendered widths are within
roughly 15% of one another, rather than mixing label placement within that
group. Clearly different tile-length groups may use different modes when
their available space differs.
Species matching is also part of input validation. For an NCBI-backed exact accession, the title/organism metadata must agree with the selected species before the sequence is written to the cache or passed to design. This prevents a transcript from another organism being designed against the selected genome. A FASTA supplied by the user is not assigned an NCBI organism; the user is responsible for providing a sequence from the selected organism and index.
Output layout
The project root is the directory supplied to --outdir or entered in the
webapp's Results/project folder field. For example, if that value is
$HOME/hcrprobeforge_projects/hcr_probe_design_project, all run, cache, plot,
QC, and manifest outputs are nested below it. The webapp also keeps a small
index_metadata/ reference-metadata copy under its parent directory, at
<project parent>/index_metadata/; that registry copy is described separately
below.
hcr_probe_design_project/
├── cache/
│ └── <species>/
│ ├── individual_designs/ # transcript and target cache for single-target designs
│ ├── manifests/<manifest-name>/ # cache for one manifest run
│ ├── plot/ # created only if plotting writes cache data
│ └── qc/ # created only if QC writes cache data
└── runs/
└── <species>/
├── individual_designs/
│ ├── <target>/ # one-target run
│ └── <gene>/<gene>_B1/<target>/ # all-channel run
├── manifests/<manifest-name>/
│ ├── results/<gene>/<gene>_B1/<target>/
│ ├── status/
│ │ ├── tables/*.tsv
│ │ └── *.done, *.failed, or *.skipped
│ └── logs/*.log
├── plot/<plot-name>/
└── qc/<qc-name>/
<species> is the readable display-name component, such as
Xenopus_tropicalis; it is not necessarily the short HCRProbeDesign alias.
Important result files stay at the target root. Native design tables,
transcript-resolution data, run parameters, and other diagnostic files are
grouped under details/. Manifest status tables are grouped under
status/tables/, and manifest logs remain under logs/.
For a normal one-pass design, the target root contains the map, summary, and
QC workbook when applicable, while the native probe and IDT tables are under
details/. Smart-curated runs additionally place the selected-pairs table,
final IDT order file, final map, final QC workbook, and curation report at the
target root; its individual tier runs are under details/design_runs/. An
intronic Pre-mRNA one-pass run also places its filtered
<target>_eligible_IDT_order.csv at the target root; its unfiltered upstream
candidate order table stays under details/.
If a design, plot, QC, or index operation fails, newly created scientific outputs and partial cache/index metadata are removed so an incomplete run is not mistaken for a usable result. Files from an existing run that were overwritten during the failed operation are restored. Manifest status tables, failure markers, and logs are retained because they explain which row failed and what to correct before rerunning.
Understanding the output files
*_final_selected_pairs.tsv: selected non-overlapping probe pairs from smart curation, with coordinates, metrics, QC, curation, and annotation fields.*_final_IDT_order.csv: order-oriented P1/P2 table with the selected sequences from smart curation.*_final_probe_map.pngand*_final_probe_map.svg: transcript maps.*_final_oligo_structure_QC.xlsx: Primer3 structure-QC workbook.*_auto_curate_report.jsonand.md: capacity, tiers, fallback, coverage, QC, and selected-coordinate decisions.*_candidate_master.tsv: merged candidate reservoir.*_backup_candidates.tsvand*_rejected_candidates.tsv: alternatives and rejected candidates.*_transcript_resolution.json: accession selection and cache provenance.*_probes.tsvand*_IDT.tsv: native one-pass candidate tables underdetails/.*_candidate_IDT.tsv: native intronic Pre-mRNA candidates underdetails/; these are retained for diagnostics and are not the filtered order table.*_eligible_IDT_order.csv: intronic Pre-mRNA candidates that passed complete- intron eligibility, used as the one-pass QC input.run_parameters.json,summary.json, and logs: run provenance underdetails/.
Manifest status/tables include manifest_preflight.tsv, run_status.tsv, channel_design_outcomes.tsv, and transcript_design_summary.tsv.
The webapp report shows final maps for design/plot workflows, selected-pair files for design/manifest workflows, the full output directory, and a collapsible console. It does not mix files from previous runs.
Caching and reproducibility
Transcript FASTA, compact NCBI records, and feature annotation are cached by
exact accession-version. Direct CLI, helper, manifest, and webapp workflows
normally use one project cache tree under <project>/cache/<species>, with
the same readable workflow names used below runs/. A manifest cache is
grouped by manifest name. Plot and QC cache folders are not created unless
those workflows actually write cache data.
Override the cache location explicitly:
export HCRPROBEFORGE_CACHE_DIR=/path/to/shared/hcrprobeforge-cache
For direct CLI runs this environment variable replaces the project cache location. The all-channel helper and webapp deliberately set their own project-scoped cache path so channels and workflows cannot accidentally share unrelated results; use the project directory or the workflow's explicit cache setting for those front ends.
Windows PowerShell:
$env:HCRPROBEFORGE_CACHE_DIR = "D:\data\hcrprobeforge-cache"
The supported environment variables are:
| Variable | Effect |
|---|---|
HCRPROBEFORGE_CACHE_DIR |
Override the direct CLI cache root. The all-channel helper and webapp normally set a project-scoped cache themselves. |
HCRPROBEFORGE_REFERENCE_DIR |
Relocate the HCRProbeForge reference registry, custom-species presets, and managed reference assets. |
HCRPROBEDESIGN_DATA_DIR |
Relocate HCRProbeDesign's registered Bowtie2 indexes. |
HCRPROBEFORGE_CHANNEL_ATTEMPTS |
Maximum retry attempts per helper/manifest channel for retryable NCBI failures; default 3. |
NCBI_EMAIL |
Contact email used for NCBI requests when --email is omitted. |
NCBI_API_KEY |
Optional NCBI API key used when --api-key is omitted. |
If neither --email nor NCBI_EMAIL is supplied, HCRProbeForge omits the email
parameter; it does not invent or persist an address. Supplying an email is
recommended for responsible NCBI use, especially for larger jobs. An API key
is optional and only changes the NCBI request-rate allowance.
Gene-only input is intentionally time-dependent: it resolves against the
current NCBI Gene/RefSeq Select records. For reproducibility, pin an exact
versioned RefSeq accession and record the assembly accession and index alias.
Keep selected-pair and IDT files, reference.json or the index prefix,
transcript-resolution JSON, run parameters, curation report, exact input,
species, assembly, accession, and index alias with published designs. The run
parameters also record HCRProbeForge, HCRProbeDesign, Primer3, Bowtie2, and
relevant Python dependency versions when available.
Troubleshooting
designProbes or buildGenomeIndex was not found
Activate the environment containing HCRProbeDesign and check PATH with command -v or where.exe. The Python package cannot execute a command invisible to the environment that launched it.
bowtie2 or bowtie2-build was not found
Install Bowtie2 with conda/mamba or add its directory to PATH, then recheck from the same terminal.
NCBI reports no Assembly record
Check that the accession is an NCBI Assembly accession and that its spelling and version are correct. Provide the expected assembly name as an additional safety check. An accession valid in another NCBI database may not be an Assembly accession.
NCBI requests fail or are slow
Set NCBI_EMAIL and optionally NCBI_API_KEY. Avoid many simultaneous runs.
Transient E-utilities and genome-download responses are retried; an
exact-accession cache or local FASTA avoids repeated downloads. Download
errors include the requested accession and the URL candidates that were
checked.
An NCBI Assembly genome file is not found
The Assembly accession may be valid even when a guessed filename is not. The
package first uses the authoritative FTP directory from NCBI and derives the
filename from its normalized directory basename. It then tries a small set of
record-derived alternatives and checks the directory listing for a
*_genomic.fna.gz file. If all candidates fail, verify the accession in the
NCBI Assembly record and either retry later or download the genomic FASTA
yourself and use:
hcrprobeforge index build --species <alias> --fasta /path/to/genome.fna
For a local build, --annotation is optional for mature designs and should be
the GFF3 from the same assembly when Pre-mRNA will be used. The package copies
the uncompressed FASTA and annotation into its managed reference directory.
Use --with-annotation-db to build the SQLite lookup during index creation;
otherwise the first Pre-mRNA run builds it on demand. NCBI remains the
transcript source for NCBI-backed designs.
The setup page shows an old index or Pre-mRNA status
The index and Pre-mRNA badges are derived from the registered reference
metadata, not from the transcript cache. A successful index build is recorded
only after its Bowtie2 files and any requested annotation.sqlite are
complete. The webapp refreshes the selected option automatically and all
dynamic responses use no-store cache headers. If a webapp process is still
running after an upgrade, stop it and launch the installed version again;
installing a new wheel does not replace code already loaded by a running
Python process.
If the badge remains pending after restarting, inspect the selected reference
directory and confirm that reference.json has status: "ready",
annotation_database_status: "ready", and an existing annotation.sqlite.
The design path validates the database schema before extracting a genomic
transcript and reports a specific rebuild or missing-annotation error when the
database is incomplete. Mature-transcript mode does not require this database.
No registered index exists
For a design that uses genomic masking, HCRProbeForge reports the selected
species and tells you that its Bowtie2 index is missing. Build the matching
preset with hcrprobeforge index fetch --species <alias> or use the Build a
genome index tab, then rerun the design. You can also provide a valid explicit
--index prefix. A failed design is rolled back, so there is no failed-run
log to inspect; the error message is the diagnostic. Use --no-genomemask
only when you deliberately accept that genomic specificity screening is not
being performed.
A gene symbol is not found for a custom species
Some non-standard organisms have incomplete or inconsistent NCBI Gene and RefSeq links even when the sequence exists. If symbol lookup or linked RefSeq RNA lookup fails, retry with the exact NCBI/RefSeq transcript or gene accession. If NCBI does not provide a usable transcript record, use the FASTA workflow and provide the transcript sequence directly. This fallback changes only input resolution; it does not change probe generation, genomic masking, oligo QC, or selection behavior.
A manifest stops before design
Open status/tables/manifest_preflight.tsv. A manifest stops before any design
only when preflight finds an output-directory collision that could make two
jobs overwrite one another, or when no valid executable rows remain. Invalid
accessions and empty-gene rows are reported and excluded while other valid rows
continue. Fix the reported input or collision and rerun.
All linked transcripts does not start
Do not combine --all-transcripts with --accession or --fasta. In the webapp,
choose Design one target, enter a gene, enable Design all linked transcripts in
Advanced settings, and leave accession blank.
A plot still looks like pastel GC coloring
Pass both options:
hcrprobeforge --plot-only probes.tsv \
--plot-theme minimal --plot-color-by dtm
The theme changes style; --plot-color-by dtm changes probe-block colors. The webapp forwards both to the same plotting function.
Fewer probe pairs are returned than requested
Read the curation report. Geometric capacity, sequence filtering, repeats, specificity, or QC can limit the final set. Smart mode can try configured fallback tiers but cannot create acceptable non-overlapping sequence that does not exist.
The webapp port is already in use
hcrprobeforge-web --port 8780
An updated webapp page is not visible
Stop and relaunch the webapp after installing an update, then refresh the browser. A running Python process continues using the package version that was loaded when it started.
Architecture and data flow
The package has one scientific pipeline and several ways to run it. The CLI,
all-channel helper, manifest helper, and webapp use the same transcript
resolution, candidate generation, QC, curation, and output rules. Their default
selection policies are different: direct hcrprobeforge is one-pass, while
the all-channel helper, manifest helper, and webapp use smart auto-curation by
default. The webapp collects and validates form values, starts the selected
workflow, shows its progress, and presents the files produced by that same
pipeline.
Normal design data flow
The following order is important when interpreting a run:
- The selected species is resolved to an organism name, assembly record, and
HCRProbeDesign index alias. For example, the user-facing Xenopus
tropicalis choice uses the registered
xtrreference. - A gene symbol is resolved through NCBI Gene and linked RefSeq records, or an explicit accession is validated directly. A supplied FASTA bypasses NCBI transcript selection.
- The selected exact transcript accession and organism metadata are checked before a transcript FASTA or annotation is accepted. A record naming a different built-in species is rejected before it can be cached or designed.
- The exact versioned transcript sequence is retrieved from the project cache when it is valid, or downloaded from NCBI and then cached. Cache validation checks the accession-version, FASTA header, sequence alphabet, length, and stored SHA-256.
designProbesreceives the same sequence, channel, species/index alias, tile, GC, Gibbs, C/G-run, dTm, specificity, and candidate-count arguments selected by the user. This is the candidate-generation boundary.- HCRProbeForge reads the native candidate output, attaches reporting fields, and runs Primer3 on the actual initiator-bearing P1/P2 order sequences.
- Smart curation, when requested, combines eligible candidate reservoirs and selects a non-overlapping set using the documented QC and coverage rules. One-pass mode preserves the native candidates instead.
- The relevant candidate or selected-pair tables, order table, map, QC workbook, reports, and provenance JSON are written after processing succeeds.
Why the species choice affects both NCBI and Bowtie2
The species choice has two separate jobs that must agree. Its scientific name is sent to NCBI so a gene symbol or accession resolves in the intended taxon; its registered HCRProbeDesign alias selects the Bowtie2 genome index used for genomic masking. The package records both values, plus the assembly and assembly accession, in run metadata. This prevents a transcript from one species from being silently screened against another species' genome.
The built-in preset is an organism/assembly pairing, not a promise that every NCBI record is interchangeable. When another assembly is considered, check that NCBI provides compatible RefSeq transcript and feature records first. Fetch the assembly with a new index alias so the existing index remains available:
hcrprobeforge index fetch --species xla \
--assembly-accession GCF_<ALTERNATE_ASSEMBLY_ID>.<VERSION> \
--assembly-name <EXPECTED_ASSEMBLY_NAME> \
--index-alias xla_alternate
Replace the accession and expected name with a real compatible assembly; the values above are placeholders.
The alias can then be supplied to a design as a registered species. The
transcript organism remains Xenopus laevis; the alternate assembly is
recorded in the installed-reference metadata. Never reuse an alias for a
different assembly unless replacement is intentional and --force is used.
Webapp field behavior
The webapp is organized into five tabs. Each tab enables only the controls that are meaningful for that operation, and controls for other workflows are not submitted:
| Tab | Required input | Applicable optional controls |
|---|---|---|
| Design one target | species, channel, gene/accession/one-record FASTA | transcript policy, genome/index options, design thresholds, smart curation, plot and final-QC options |
| Design a gene list | species, channel, manifest file | transcript policy, design thresholds, smart curation, plot and final-QC options |
| Plot a probe table | existing probe TSV/text table | transcript length, plot theme, color, DPI, title, label visibility |
| QC an oligo table | existing IDT or selected-pairs table | QC workbook output path |
| Build a genome index | species preset and either a preset assembly accession or local genome FASTA | expected assembly name, alternate accession, alias, matching GFF3 for local builds, threads, rebuild |
Species and NCBI organism are shown before workflow-specific fields. A built-in preset supplies its saved assembly information for index building. A custom preset can save that information in the species dialog, but its NCBI organism alone is not a genome source: provide either a versioned assembly accession or a local genome FASTA before building. The expected assembly name, local FASTA, and alias are optional controls when an alternative source or name is desired. The Index ready on this computer status means that the registered Bowtie2 files are present on the computer; metadata alone is not treated as a usable index.
The Inspect input button performs workflow-specific structural checks
without starting designProbes, downloading a genome, or writing a
scientific result. It is a convenience check, not a replacement for NCBI
validation or a completed index build. It checks the species/organism pairing,
the appropriate input file and required columns, FASTA record count and
sequence alphabet, manifest channel and path rules, plot coordinate bounds,
QC table readability, numeric ranges, allowed enumerated values, and
assembly-accession syntax. NCBI-backed gene and accession checks still happen
at execution time, where true species mismatches are skipped and unresolved
genes/accessions are failed individually.
Manifest data flow and resume behavior
Manifest rows are normalized into a run record containing the original gene label, an optional exact accession, an optional single HCR channel, and a safe directory label. The original label remains in metadata and status tables; only filesystem path components are normalized. Preflight rejects path-normalization collisions before design. Exact duplicate gene/accession/channel rows are represented by the first executable job; only that first occurrence has a resume marker. The same target may be listed for different channels.
For each valid row, the runner:
- checks the stored done marker and validates that any existing output belongs to the selected species;
- resolves a gene symbol within the selected organism, or validates an exact accession against the selected organism before writing transcript data;
- chooses the row's channel when present, otherwise uses the global
--channelsselection; - runs the selected channel(s) through the same single-target pipeline;
- records the effective accession, channel, output roots, status, and summaries; and
- writes a done, failed, or skipped marker that allows the manifest history to be inspected and resumed.
An explicit accession is one exact transcript and is not expanded by
--all-transcripts. Gene-only rows may use the all-transcripts option. A
temporary NCBI failure uses exit code 75 and is eligible for the helper's
bounded retry. A true species mismatch is skipped after the organism check;
an unresolved gene or accession is a failed row. Design, QC, parsing, and
other failures remain visible as failed rows and do not abort later jobs. The
underlying design invocation is unchanged: each selected row/channel still receives the same sequence,
species, index, and design settings as a single-target run.
Failure safety and reproducibility
The package uses best-effort rollback for a new direct design, plot, QC run, or index build. Before work begins it records the existing filesystem entries and backs up existing output files that may be replaced. If the operation raises an error, newly created entries are removed and overwritten output files are restored. This includes partial FASTA files, transcript annotations, candidate tables, maps, QC workbooks, index metadata, and partial Bowtie2 files created by a failed new build.
Rollback is scoped to the current operation and is not a replacement for backups. Do not run two writers against the same project directory at the same time; concurrent command-line runs are not globally locked or isolated.
Manifest status tables, failed markers, and manifest logs are intentionally retained because they describe which row failed and allow a catalogue to be resumed. They are bookkeeping, not scientific result files. A failed direct design does not retain a per-target log, so the error message does not direct the user to a nonexistent log. In particular, a missing species index is reported by name with instructions to use the Build a genome index workflow.
The package does not silently fall back to a different species, assembly, or index. If an exact NCBI accession's organism disagrees with the selected organism, the run stops before caching or design. A user-supplied FASTA is accepted as a custom sequence after sequence validation; its biological origin must be checked by the user because it has no NCBI organism metadata.
Preserving provenance and getting help
For a published probe set, keep the selected-pairs table, order file, final QC
workbook, reference.json or registered index prefix, transcript-resolution
JSON, run parameters, curation report, exact input, species, assembly,
transcript accession-version, and index alias together. This information makes
the design reproducible and allows a later reviewer to distinguish a changed
transcript, assembly, channel, or curation setting from a changed sequence.
When reporting a problem, include the HCRProbeForge version, Python version, operating system, command, species and assembly metadata, and a redacted error message. For Pre-mRNA problems, also include the transcript accession-version, selected intron numbers, and the genome/GFF3 assembly identity. Do not include NCBI credentials or private sequences in a public issue.
License and citation
HCRProbeForge is distributed under the MIT License; see LICENSE. The
hcrprobedesign and primer3-py Python packages are installed automatically
by pip as HCRProbeForge dependencies. Bowtie2 is an external executable and is
not bundled; install bowtie2 and bowtie2-build separately, for example
through Conda or bioconda. Review the exact licenses of the versions installed
in your environment; the package's dependency notices identify the declared
dependencies and known external tools but do not replace their license files.
HCR v3 initiator sequences, amplifier reagents, and related protocol materials
may have separate provider terms or intellectual-property restrictions; users
must verify the terms that apply to their intended assay and supplier. NCBI
data and RefSeq records are subject to NCBI and database-provider usage terms;
retain the accession and assembly provenance with published designs. Cite
HCRProbeForge together with HCRProbeDesign, Bowtie2, Primer3, NCBI RefSeq, and
the exact genome assembly used for specificity screening. CITATION.cff
contains the software citation metadata for the current release.
Additional project documents
The following repository documents provide complementary information:
CONTRIBUTING.mddescribes contribution expectations and scientific regression-test requirements.DEVELOPMENT.mdis the maintainer and release-validation guide, including clean builds and artifact checks.CHANGELOG.mdlists user-visible changes by release.VERSION_HISTORY.mdprovides a compact release history.VALIDATION_REPORT.mdrecords the reproducible checks performed for the current release.THIRD_PARTY_NOTICES.mdsummarizes dependency, executable, data, and assay-material licensing considerations.
Metadata
Release files for hcrprobeforge 1.3.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| hcrprobeforge-1.3.7.tar.gz | 274.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| hcrprobeforge-1.3.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 482.0 kB
Release files / hcrprobeforge-1.3.7.tar.gz
| Download URL | hcrprobeforge-1.3.7.tar.gz |
|---|---|
| Size | 274.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2d30117491998ae5959c422b30aa731c7f5c5396f05e0eef6e33143eb24b5dd5
|
|
BLAKE2b-256 checksum How to use checksums |
538fbc69c16a310fb72e411949fc5719e3d91d32b229286c4bb96a25b94f424c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.15
|
Release files / hcrprobeforge-1.3.7-py3-none-any.whl
| Download URL | hcrprobeforge-1.3.7-py3-none-any.whl |
|---|---|
| Size | 208.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
644b30e20462815583e1e93fd4a04196a1ea71241b3ac2f35f4f4dab1bc9097d
|
|
BLAKE2b-256 checksum How to use checksums |
0932ce750cdbde611da95344393916f2c8fdead9eddd5311b7f7253ffb6383ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.15
|