Skip to main content

PORTICO

Projection Onto Roto-Translational and Internal COordinates

+------------------------------------+
|                   _   _            |
|  _ __   ___  _ __| |_(_) ___ ___   |
| | '_ \ / _ \| '__| __| |/ __/ _ \  |
| | |_) | (_) | |  | |_| | (_| (_) | |
| | .__/ \___/|_|   \__|_|\___\___/  |
| |_|                                |
+------------------------------------+

PORTICO is a Python program for the asymptotic classification of transition-state normal modes in molecular dissociation and fragmentation.

For a dissociation channel

R  →  TS‡  →  P1 + P2

some degrees of freedom that are vibrational at the transition state correspond asymptotically to rotations or translations of the product fragments. PORTICO automatically identifies the normal modes assigned to this roto-translational sector, without manual inspection of normal-mode animations and without propagating the reaction path toward the asymptotic product region.

The current implementation is restricted to channels yielding two product fragments, including atomic, linear, and nonlinear products.

How it works

PORTICO constructs a mixed representation at the transition-state or dividing-surface geometry,

B = [ Bv
      Bt,r ]

from two blocks:

  • Bv — rows obtained from a complete, non-redundant set of internal coordinates spanning the vibrational degrees of freedom of the isolated product fragments;

  • Bt,r — normalized rigid-body translational and rotational displacement vectors of the product fragments embedded in the transition-state geometry.

The roto-translational rows are constructed geometrically from the fragment centroids and the principal axes of their geometric inertia tensors. With this construction, the rows of Bv are orthogonal to those of Bt,r in the Euclidean metric used for the classification, while the rows within Bt,r are mutually orthonormal.

The normal modes are expressed in this mixed representation through the Wilson GF formalism. For each mode i, PORTICO computes a scalar roto-translational weight,

Ωi ∈ [0, 1],

from the components associated with Bt,r.

The number of normal modes assigned to the roto-translational sector is fixed by the dimensionality of the dissociation channel. For a stationary first-order saddle point, the imaginary-frequency mode is assigned to this sector by construction because it defines the reaction coordinate. The remaining required roto-translational modes are selected from the real-frequency modes by ranking their Ωi values. No empirical threshold in Ωi is used.

PORTICO can also analyze non-stationary geometries. With

stationary no

the gradient direction is projected out and plays the role of the reaction coordinate. This allows analysis of points along a reaction path or externally defined non-stationary dividing surfaces.

For nominally linear products that are appreciably bent at the transition-state/dividing-surface geometry, PORTICO replaces the usual pair of linear-bending rows by an instantaneous bond-angle row plus the appropriate rigid-rotation row, preserving the separation between the product-vibrational and roto-translational blocks.

Requirements

Core PORTICO requires:

  • Python ≥ 3.8
  • numpy
  • scipy
  • matplotlib

The package also installs the gaussian2gts converter. If that utility has additional dependencies in your installation, consult its package metadata or script header.

Installation

From PyPI

pip install cathedralpkg-portico

From GitHub

pip install git+https://github.com/cathedralpkg/portico.git

In a conda environment

conda create -n portico python=3.11
conda activate portico
pip install cathedralpkg-portico

Any of the above installs the portico and gaussian2gts commands in your PATH.

The scripts can also be executed directly with Python if the required dependencies are available.

Usage

portico input_file_name          # run a classification
portico -h | --help              # show help
portico -g | --ginput            # generate an example input file
portico -v | --version           # show program version

An example input file can be generated with:

portico --ginput

This creates portico.inp in the current directory, unless a file with that name already exists.

Input file

A typical input file is:

# Files with the electronic-structure data (gts format)
file_saddle   TS.gts        # transition state / dividing-surface structure
file_product1 P1.gts        # product fragment 1
file_product2 P2.gts        # product fragment 2

# Atom mapping (1-based): each product atom is mapped onto one atom
# of the transition-state/dividing-surface structure
product1:
  1 1
  2 2
  3 3
  4 4
end

product2:
  1 5
  2 6
end

# Optional keywords
file_plot       omegas.png    # output plot
eps_conn        1.30          # connectivity scale factor
eps_ccic        6.00          # max. |freq(cc) - freq(ic)| in cm^-1
linear_cutoff   170.0         # linearity threshold in degrees
stationary      yes           # yes: stationary point; no: non-stationary point
#seed           9876543210    # optional random seed for reproducibility

Required keywords

Keyword Meaning
file_saddle .gts file for the transition-state or dividing-surface structure
file_product1 .gts file for product fragment 1
file_product2 .gts file for product fragment 2

Atom mapping

The atom mapping is 1-based.

Every atom of each product must be mapped, every atom of the transition-state/dividing-surface structure must appear exactly once across the two product mappings, and mapped atoms must correspond to the same chemical element.

PORTICO checks the mapping before the classification starts and aborts if the mapping is incomplete, duplicated, out of range, or chemically inconsistent.

Optional keywords

Keyword Default Meaning
file_plot omegas.png output file for the Ωi bar plot
eps_conn 1.30 scale factor used to infer molecular connectivity
eps_ccic 6.00 maximum allowed difference between Cartesian- and internal-coordinate frequencies, in cm⁻¹
linear_cutoff 170.0 angle threshold used in the treatment of nominally linear products
stationary yes yes for a stationary point; no for a non-stationary geometry
seed current time random seed used when selecting a non-redundant product-vibrational coordinate set

If seed is omitted, PORTICO initializes the random seed from the current time and prints it in the output. Specify it explicitly to reproduce the same product-vibrational coordinate selection.

Required electronic-structure data

PORTICO reads electronic-structure data from plain-text .gts files.

For the transition-state or dividing-surface structure and for each isolated product, the file contains:

  • Cartesian geometry;
  • Cartesian energy gradient;
  • Cartesian Hessian;
  • charge;
  • multiplicity;
  • electronic energy;
  • point-group information;
  • rotational symmetry number.

For a stationary point the gradient is numerically zero. For

stationary no

a non-zero gradient is required and its direction is projected out before the mode classification.

Output

PORTICO reports the roto-translational weight Ωi of the analyzed normal modes and identifies the modes assigned to the roto-translational sector.

For a stationary first-order saddle point, the imaginary-frequency mode is assigned to this sector by construction and is reported as ifreq.

Example:

      freq (cm^-1)   Omega_i
    --------------------------
        -1531.2        ifreq   [roto-translational]
         1266.7        0.955   [roto-translational]
         2210.0        0.954   [roto-translational]
          812.1        0.934   [roto-translational]
          715.0        0.907   [roto-translational]
         1644.3        0.706
         1166.2        0.537
         ...

The output also includes diagnostic information such as:

  • the number of product-vibrational, translational, and rotational rows;
  • the shape and rank of the mixed B matrix;
  • whether the mixed matrix is full rank;
  • numerical checks of the orthogonality between the different row blocks;
  • comparison of Cartesian and mixed-representation frequencies;
  • the random seed used for the calculation;
  • ΔΩ, when available, between the last selected roto-translational mode and the next mode in the Ωi ranking.

The Ωi plot is written to the file specified by file_plot.

The .gts file format

The .gts format is a plain-text format shared by programs in the Cathedral package. It stores the electronic-structure data of a single molecular structure.

A .gts file is organized in blocks delimited by start_<block> and end_<block> keywords. Lines beginning with # are comments and are ignored. Quantities used by PORTICO are expressed in atomic units.

start_basic / end_basic

Scalar properties of the structure:

Keyword Meaning
charge total charge
multiplicity spin multiplicity
energy total electronic energy, in hartree
pointgroup point group, e.g. C1, C2v
rotsigma rotational symmetry number

start_cc / end_cc

One line per atom: atomic number followed by the three Cartesian coordinates in bohr.

Example:

006   x   y   z

start_grad / end_grad

Cartesian energy gradient in hartree/bohr, one atom per line with three components.

For a stationary point the gradient is numerically zero. A non-zero gradient is required for the analysis of a non-stationary geometry.

start_hess / end_hess

The Cartesian Hessian is stored in lower-triangular form, in hartree/bohr²:

F_11, F_21, F_22, F_31, F_32, F_33, ...

The values are written sequentially; the program reconstructs the full symmetric 3N × 3N matrix.

Converting Gaussian outputs to .gts

The helper utility gaussian2gts converts a Gaussian log file from a frequency calculation into .gts format:

gaussian2gts TS.log
gaussian2gts P1.log
gaussian2gts P2.log

If another electronic-structure package is used, an analogous converter can be written to produce the same plain-text .gts format.

Notes on the mixed representation

The roto-translational rows are geometric rigid-body displacement vectors, not scalar internal coordinates. In particular, the rotational rows are constructed without atom-dependent mass weighting.

The product-vibrational rows are orthogonal to the roto-translational rows in the Euclidean metric used for the classification. The rows within the product-vibrational block are not generally mutually orthogonal, so the absolute value of Ωi depends on the selected non-redundant internal-coordinate representation. PORTICO therefore uses the ordering of the Ωi values, together with the channel dimensionality, rather than an empirical absolute threshold.

At non-stationary geometries, the gradient-dependent curvature terms are included for rows derived from scalar internal coordinates. Rotational displacement rows do not correspond to gradients of scalar coordinates; the associated second-derivative contribution is therefore omitted. This approximation is discussed in the accompanying publication.

Current scope

The current implementation supports dissociation channels yielding two fragments and can treat atomic, linear, and nonlinear products.

PORTICO does not locate a transition state, variational dividing surface, or free-energy bottleneck. It analyzes a supplied stationary or non-stationary geometry and classifies its local degrees of freedom.

Citation

If you use PORTICO in your work, please cite:

D. Ferro-Costas, Portico: a program for the asymptotic classification of transition-state normal modes, submitted to Computer Physics Communications (2026).

Please replace the provisional citation above with the final bibliographic information once the article is published.

License

Distributed under the MIT License. See LICENSE for details.

Author

David Ferro-Costas — Universidade de Santiago de Compostela
ORCID: 0000-0002-8365-4047

Metadata

Release files for cathedralpkg-portico 2026.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cathedralpkg-portico 2026.1
File Size Uploaded
cathedralpkg_portico-2026.1.tar.gz 40.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for cathedralpkg-portico 2026.1
File Interpreter ABI Platform
cathedralpkg_portico-2026.1-py3-none-any.whl Python 3 none any Details

Total release size: 80.7 kB

Release files / cathedralpkg_portico-2026.1.tar.gz

Download URL cathedralpkg_portico-2026.1.tar.gz
Size 40.0 kB
Tags Source
SHA-256 checksum
How to use checksums
4aaba4f6884702bbfefb3f74ef93cd6f079fcce508a1e0866dc8d2080b03c6ed
BLAKE2b-256 checksum
How to use checksums
55fcf39e4cb9412462daef83ae177877c081d2d797e0cfed3694d525f0128864
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.12

Release files / cathedralpkg_portico-2026.1-py3-none-any.whl

Download URL cathedralpkg_portico-2026.1-py3-none-any.whl
Size 40.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
94535dd7e5c09644573d18c0c0409486ba2548967d11ec70ebb259518322d3a9
BLAKE2b-256 checksum
How to use checksums
0d6473c9ed2a6e43026ab8876ddc81892ceaee23e1d5f2085512e47cedf905f6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.12

Release history Release notifications | RSS feed

This release

2026.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page