Skip to main content

artistools

DOI PyPI - Version License

Supported Python versions Installation and pytest

Artistools is collection of plotting, analysis, and file format conversion tools for the ARTIS radiative transfer code.

The documentation is at artistools.readthedocs.io. It gives each command and some example outputs.

Installation

Requires Python >= 3.13. A free-threaded Python requires version 3.15 or later, e.g. Python 3.15t.

The artistools command can be invoked with uvx artistools (after installing uv), installed globally with uv tool install artistools, or installed into your environment with pip install artistools.

Development (editable installation)

For development, you will need a rust compiler and a clone of the repository:

git clone https://github.com/artis-mcrt/artistools.git
cd artistools

To make a uv virtual environment in the clone, with the development tools, run:

uv sync --all-extras
uv run -- prek install

uv run -- artistools then runs the command of the clone. To make the artistools command available outside the clone, also run uv tool install --editable .[extras].

Alternatively, to avoid uv and install into the system environment with pip:

pip install --group dev --editable .[extras]
prek install

To enable tab completion, run artistools completions. The command detects your shell and gives the steps for it.

Citing artistools

If you use artistools for a paper or a presentation, please cite it. For details, see https://zenodo.org/badge/latestdoi/53433932.

Usage

Run "artistools" (or the short alias "at") at the command-line to get a full list of subcommands, and "artistools --version" to check the installed version. Some common commands are:

  • artistools plotspectra (alias: at spec)
  • artistools plotlightcurves (alias: at lc)
  • artistools plotestimators (alias: at estimators)
  • artistools plotnltepops
  • artistools describe (a summary of a model: its cells, timesteps, output files, and ions)
  • artistools inputmodel describe

Give -h to a command for a summary of its arguments, or --help for the full help and the examples. Set ARTISTOOLS_TRACEBACK=1 to get the full traceback of an error. Run a command in a model folder, or give the path of the model folder. A command that reads a model takes the model path with --modelpath, e.g. artistools timesteps --modelpath mymodel. Most of these commands also take the model path as the last positional argument, e.g. artistools plotspectra -t 300 mymodel.

The plotted data as text

Each plot command gives the plotted data as a table with a header row and a space between the values. --print-data prints the table to the standard output. The progress messages go to the standard error, thus a pipe or a redirect gets the table alone. --output-format json or --output-format csv gives the table in that format. --write-data writes the same table to a .txt file beside the figure. A value that is not available is nan, and a value or a column name that contains a space has quotes. A written file starts with comment lines that give the artistools version, the time, the working folder, and the command. Thus the file tells how the command made each value. Read it with pl.read_csv(path, separator=" ", comment_prefix="#", null_values="nan"), or with comment="#" in pandas. For example, this command writes the electron temperature against the velocity at 300 days to a file:

artistools plotestimators Te -t 300 mymodel --print-data > te.txt

A plot can give more than one table, because a series with its own grid needs its own table. Examples are a reference spectrum in <figure>_references.txt, a model with a different wavelength grid in <figure>_grid2.txt, and the statistics and the curves of a residual panel in <figure>_residuals.txt and <figure>_residualcurves.txt. On the standard output, an empty line separates two tables. With --output-format json, the standard output holds one JSON object, with the rows of each table under its name, e.g. data and residuals. With --write-data, --output-format also gives the format and the suffix of each file, e.g. <figure>.json.

A model on a different host

These commands accept a model path of the form host:path, where host is a name that ssh knows:

  • plotestimators and its --interactive viewer;
  • plotlightcurves and its --interactive viewer;
  • plotspectra and its --interactive viewer;
  • at.scan_estimators in a Python script.
artistools plotspectra -t 300 vae26:~/scratch/mymodel

The rule of rsync decides whether a path is remote: a colon before the first slash makes a remote path. A local folder with such a colon in its name needs "./" at the start, e.g. ./model:2.

artistools starts the server on that host through ssh, and it prints the command and the reason for it. A release of artistools starts uvx artistools@<version> server, with the versions of the local artistools and polars. Thus the host needs only uv.

The server and the client must have the same server protocol, which is a number. It changes when a reader changes its arguments or its results, or when the format of a message changes. A clone with the server protocol of the release also starts the release. A clone with a different server protocol starts its git commit with uvx. The host then also needs git and Rust. The host cannot get a commit that is only in the clone, thus such a commit must have the server protocol of the release.

The server protocol does not change when the code of a reader changes. Thus a release on the host can give a different result from the clone. If the package files of the clone differ from the release, artistools prints a warning with the number of these files and the name of one file. The warning also gives the command that starts the git commit on the host.

The command sets POLARS_MAX_THREADS=16, because a login node can have hundreds of cores, and other users share them. The server reads the files and makes the data of each plot, e.g. it puts the packets into bins. Only the data to draw comes back, and the parquet caches stay beside the data on the host. A script sends the filter and the columns of each query to the host, and only the rows of the query come back.

An option that reads its files on the local host stops with an error. To start the server with a different command on the host, e.g. an artistools in a clone, set ARTISTOOLS_REMOTE_COMMAND:

export ARTISTOOLS_REMOTE_COMMAND='POLARS_MAX_THREADS=16 ~/artistools/.venv/bin/artistools server'

The environment of such a command must have the same version of polars as the client. The filter of a query goes to the host as a polars expression, and the format of an expression changes between two versions. If the versions differ, the client stops with an error that gives the uvx option.

Use from Python

artistools is mainly a set of commands, but a script or a notebook can call the same functions. import artistools as at gives a small set of names at the top level. Each package holds the other names, e.g. at.spectra and at.inputmodel.

from pathlib import Path

import artistools as at
import polars as pl

modelpath = Path("mymodel")
dfmodel, modelmeta = at.scan_modeldata(modelpath)
times_days = at.get_timestep_times(modelpath, loc="mid")
dftemperature = at.scan_estimators(modelpath).filter(pl.col("timestep") == 40).select("modelgridindex", "Te").collect()
dfspectrum = at.spectra.scan_spectra(modelpath, timestepmin=40, timestepmax=45)[-1].collect()

A function with the prefix scan_ returns a polars LazyFrame, or one LazyFrame for each direction bin. Call .collect() to get the data. A function with the prefix read_ returns the data at once, e.g. a DataFrame or a dictionary. Each function with the prefix get_ in the tables below returns its value at once, e.g. a number, a dictionary, or a DataFrame. The direction bin -1 is the average over all directions.

Some of these functions had an older name, e.g. get_modeldata in place of scan_modeldata, and read_spec in place of scan_spec. A script can still call the old name, but each call gives a DeprecationWarning that names the new function. A later release will delete the old names.

Names at the top level

Name Purpose
at.scan_modeldata Read model.txt. Return the cells as a LazyFrame, and the model parameters as a dictionary.
at.add_derived_cols_to_modeldata Add columns that follow from the model file, e.g. the volume and the mass of each cell.
at.get_inputparams Return the parameters of input.txt.
at.get_model_name Return the name of the model that holds a path.
at.get_nprocs Return the number of MPI processes of the model.
at.get_timestep_times Return the time in days of each timestep (loc is "start", "mid", "end", or "delta").
at.get_timestep_of_timedays Return the timestep that holds a time in days.
at.scan_estimators Read the estimators of all the run folders of a model as a LazyFrame, with a row for each timestep and cell.
at.scan_deposition Return deposition.out as a LazyFrame.
at.get_composition_data Return the elements and the ion stages of compositiondata.txt as a DataFrame.
at.get_ionstring Return a text such as Fe II for an atomic number and an ion stage.
at.get_ion_tuple Return (26, 2) for a text such as FeII, Fe II, or 26_2.
at.get_elsymbol Return the element symbol of an atomic number.
at.get_atomic_number Return the atomic number of an element symbol.
at.get_z_a_nucname Return the atomic number and the mass number of a text such as Pb208.
at.decode_roman_numeral Return the integer of a Roman numeral.
at.get_path Return a known path by name, e.g. the package folder.
at.firstexisting Return the first file of a list that exists, with a compressed copy as an alternative.
at.zopen Open a file, or its .zst, .gz, or .xz copy.

Main readers in the packages

Name Purpose
at.estimators.read_estimators Read the estimators of a few cells into a dictionary. This is slow for many cells, thus prefer at.scan_estimators.
at.spectra.scan_spectra Return a dictionary with a LazyFrame of the spectrum of each direction bin, as an average over a range of timesteps.
at.spectra.scan_spectra_from_packets Return a dictionary with a LazyFrame of the spectrum of each direction bin from the packets files, for a range of arrival times.
at.lightcurve.scan_lightcurve Read a light curve file. Return one LazyFrame for each direction bin.
at.lightcurve.scan_lightcurve_from_packets Return a dictionary with a LazyFrame of the luminosity against time of each direction bin, from the packets files.
at.packets.scan_packets Return the number of ranks and a LazyFrame of the packets of a model.
at.nltepops.read_nltepops Read the NLTE populations of a timestep and of one or more cells.
at.atomic.get_levels Return the energy levels of each ion, with the transitions as an option.
at.inputmodel.save_modeldata Write model.txt.zst from a dataframe of the cells.
at.plottools.set_mpl_style Apply the matplotlib style of artistools.

The command of a package

Some packages give their plot command as the function plot. This function is the command itself. These packages have a plot function:

  • at.spectra;
  • at.lightcurve;
  • at.estimators;
  • at.nltepops;
  • at.packets;
  • at.nonthermal;
  • at.gsinetwork;
  • at.radfield;
  • at.logs.

Each keyword is one command-line argument, and argsraw gives more arguments as text, e.g. argsraw=["-t", "300"]:

at.spectra.plot(argsraw=[], specpath=[modelpath], timedays="300", outputfile="spectrum.pdf")

Use with an LLM agent

artistools contains a skill for a large language model (LLM) agent, e.g. Claude Code. The skill tells the agent how to use artistools to answer a question about a model. An example is "What is the range of Te at 10 days?". This command installs the skill for Claude Code:

artistools installskill

The command makes a link in ~/.claude/skills to the skill in the installed package. Thus an update of artistools also updates the skill. If the environment variable CLAUDE_CONFIG_DIR has a value, the command uses $CLAUDE_CONFIG_DIR/skills. If artistools runs from the uv cache, e.g. with uvx, the command stops and makes no link, because uv can delete its cache. In that case, install artistools with uv tool install artistools, or give --copy.

For Codex, Cursor, or OpenCode, give --layout agents. The command then makes the link in ~/.agents/skills. For a different agent, give its skills folder with --skillsdir.

Start a new session of the agent after the installation. Then ask a question about a model. In Claude Code, you can also type /artis-data. In Codex, you can also type $artis-data.

Example output

Emission plot NLTE plot Estimator plot

License

Distributed under the MIT license. See LICENSE for more information.

https://github.com/artis-mcrt/artistools

Metadata

Release files for artistools 2026.11.9

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

Source distribution (sdist)

Source distribution for artistools 2026.11.9
File Size Uploaded Provenance Actions
artistools-2026.11.9.tar.gz 9.3 MB With provenance Details for artistools-2026.11.9.tar.gz

Built distributions (wheels)

Table of built distributions (wheels) for artistools 2026.11.9
File Actions
artistools-2026.11.9-cp315-abi3.abi3t-manylinux_2_28_x86_64.whl CPython 3.15 abi3, abi3t Linux glibc 2.28+ x86-64 Details for artistools-2026.11.9-cp315-abi3.abi3t-manylinux_2_28_x86_64.whl
artistools-2026.11.9-cp315-abi3.abi3t-manylinux_2_28_aarch64.whl CPython 3.15 abi3, abi3t Linux glibc 2.28+ ARM64 Details for artistools-2026.11.9-cp315-abi3.abi3t-manylinux_2_28_aarch64.whl
artistools-2026.11.9-cp315-abi3.abi3t-macosx_14_0_arm64.whl CPython 3.15 abi3, abi3t macOS 14.0+ ARM64 Details for artistools-2026.11.9-cp315-abi3.abi3t-macosx_14_0_arm64.whl
artistools-2026.11.9-cp313-abi3-manylinux_2_28_x86_64.whl CPython 3.13 abi3 Linux glibc 2.28+ x86-64 Details for artistools-2026.11.9-cp313-abi3-manylinux_2_28_x86_64.whl
artistools-2026.11.9-cp313-abi3-manylinux_2_28_aarch64.whl CPython 3.13 abi3 Linux glibc 2.28+ ARM64 Details for artistools-2026.11.9-cp313-abi3-manylinux_2_28_aarch64.whl
artistools-2026.11.9-cp313-abi3-macosx_14_0_arm64.whl CPython 3.13 abi3 macOS 14.0+ ARM64 Details for artistools-2026.11.9-cp313-abi3-macosx_14_0_arm64.whl

Total release size: 102.4 MB

Release files / artistools-2026.11.9.tar.gz

Download URL artistools-2026.11.9.tar.gz
Size 9.3 MB
Tags Source
SHA-256 checksum
How to use checksums
e69cf98d319b745bba9d630145278bbd9b65858e060391b6081a982b52ff2372
BLAKE2b-256 checksum
How to use checksums
a36c193b3c4c57529facf1728b1223b118a33dea2c2b73942631ca4b6f443bc9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.

Transparency log

Release files / artistools-2026.11.9-cp315-abi3.abi3t-manylinux_2_28_x86_64.whl

Download URL artistools-2026.11.9-cp315-abi3.abi3t-manylinux_2_28_x86_64.whl
Size 16.2 MB
Tags CPython 3.15 Linux glibc 2.28+ x86-64 abi3 abi3t
SHA-256 checksum
How to use checksums
9816b8f917545760f5d401d23fb8ff09a6863c3b155362e953ddc530896ca0de
BLAKE2b-256 checksum
How to use checksums
f3a07b18445145e83920d346af49df5c0b5edc21e399c3e05061eb969b0b0ce8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.

Transparency log

Release files / artistools-2026.11.9-cp315-abi3.abi3t-manylinux_2_28_aarch64.whl

Download URL artistools-2026.11.9-cp315-abi3.abi3t-manylinux_2_28_aarch64.whl
Size 16.3 MB
Tags CPython 3.15 Linux glibc 2.28+ ARM64 abi3 abi3t
SHA-256 checksum
How to use checksums
90963fa6d71c7b2b75db861c058919140166e4e6e5fd98268a6543080e052c9d
BLAKE2b-256 checksum
How to use checksums
b29fb4abfcdf691a713efc24ba3349d31a754c3eecf91122c60df7af0c8bd975
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.

Transparency log

Release files / artistools-2026.11.9-cp315-abi3.abi3t-macosx_14_0_arm64.whl

Download URL artistools-2026.11.9-cp315-abi3.abi3t-macosx_14_0_arm64.whl
Size 14.1 MB
Tags CPython 3.15 abi3 abi3t macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
f9830763ad585314acd1c8c5440911288e2f11ea1b47bcb34410d9d1aa3272ed
BLAKE2b-256 checksum
How to use checksums
7c54e76c7d3ef9f92d17902e14439b33a1ba6004f757812de72d40a881041a6d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.

Transparency log

Release files / artistools-2026.11.9-cp313-abi3-manylinux_2_28_x86_64.whl

Download URL artistools-2026.11.9-cp313-abi3-manylinux_2_28_x86_64.whl
Size 16.2 MB
Tags CPython 3.13 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
51f675866d11ea2c8d66fb752ef4a8b2b8cd6536b5f9df907f242b727e3cafef
BLAKE2b-256 checksum
How to use checksums
51e913f1437694fd4c31065873d9d393e7446d57d066a3d6693f19c2a15d971a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.

Transparency log

Release files / artistools-2026.11.9-cp313-abi3-manylinux_2_28_aarch64.whl

Download URL artistools-2026.11.9-cp313-abi3-manylinux_2_28_aarch64.whl
Size 16.3 MB
Tags CPython 3.13 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
12a8488ff4cccecdbcc92b79c96499f06ede4217d18763663da4a42faa013cc9
BLAKE2b-256 checksum
How to use checksums
d0ed6910b2b6321f65fefded70ce71d2e57a0477b7406e12a5457d6b7302bb81
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.

Transparency log

Release files / artistools-2026.11.9-cp313-abi3-macosx_14_0_arm64.whl

Download URL artistools-2026.11.9-cp313-abi3-macosx_14_0_arm64.whl
Size 14.1 MB
Tags CPython 3.13 abi3 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
d82a8ff96d33b36994c789c95af44f9cd169d935cc9956b58d7986e0e2f933de
BLAKE2b-256 checksum
How to use checksums
6e35de7bbd1d91bb7a877b884eaff8261bd459a9329b4b6f8a22b2457ebb2059
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.

Transparency log

Security for artistools 2026.11.9

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 7 files in this release have been uploaded with provenance metadata.

Select from 7 files

Attestation for artistools-2026.11.9.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 9, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release
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