Project configuration

A ModelManager project is rooted at a data directory (data/). Everything about a project — which input categories exist, where their folders live, the database — is derived from that directory and a single configuration file inside it: inputs.toml.

The data directory

initializeModelManager takes the path to data/ and opens the project there:

initializeModelManager(MySimulator(...), "/path/to/project/data")

Inside data/ ModelManager expects:

data/
├── inputs/
│   ├── inputs.toml          # location configuration (see below)
│   ├── configs/             # one folder per "config" input
│   │   └── default/
│   ├── custom_codes/
│   └── ...                  # one subtree per registered location
└── <database file>          # e.g. mm.db (name set by centralDBFileName)

The exact set of subfolders under inputs/ is not hard-coded — it is whatever inputs.toml declares. The database filename defaults to mm.db and can be overridden by a backend via centralDBFileName.

dataDir returns the active data directory; pathToInputsConfig returns the path to inputs.toml; locationPath resolves the directory for a given location.

inputs.toml

inputs.toml declares the project's locations — the categories of input that a simulation draws from. Each top-level table is one location:

[config]
required = true
varied = true
basename = "PhysiCell_settings.xml"

[custom_code]
required = true
varied = false

[ic_cell]
required = false
varied = ["cells.csv", "cells.xml"]
basename = ["cells.csv", "cells.xml"]
path_from_inputs = ["ics", "cells"]

Each location table supports these keys:

KeyMeaning
requiredWhether every simulation must supply a folder for this location.
variedWhether the location supports parameter variations. A Bool, or a Vector{Bool} (one per basename) for multi-file locations.
basenameThe primary input file(s) inside each folder. Required when varied is true. May be a Vector to allow alternative file names.
path_from_inputsOptional relative path from inputs/ to the location's folders. Defaults to the pluralized location name (e.g. configconfigs/). Path elements are validated: they may not be absolute, escape the project with .., or contain a path separator.

inputs.toml is parsed by parseProjectInputsConfigurationFile, which validates the keys and stores the result in the project globals.

ProjectLocations

The parsed configuration is summarized by ProjectLocations, reachable via projectLocations:

julia> projectLocations()

It exposes three tuples of location symbols:

  • all — every registered location (alphabetically sorted),
  • required — locations whose folder is mandatory,
  • varied — locations that support variations.

These drive the rest of the framework: InputFolders iterates all to build a canonical NamedTuple, the database schema generates one ID column per location, and VariationID tracks one entry per varied location.

Location naming helpers

A family of small functions derives the database and filesystem names for a location from its symbol. These keep the schema and folder layout consistent:

FunctionExample (:config)
locationTableName"configs"
locationIDName"config_id"
locationVariationIDName"config_variation_id"
locationVariationsTableName"config_variations"
locationVariationsDBName"config_variations.db"
locationFolder"configs"

Backends and advanced users generally rely on these rather than hard-coding column or table names. See the Project configuration & locations API reference for the full list.