How to Extend CoreMeta4Cat
This page explains how to add new entries to the CoreMeta4Cat schema — new preparation methods, characterisation techniques, reactor types, simulation methods, or shared slots. Each section follows the same general pattern, adapted to the specific pillar.
Before you start
Read the Design Patterns page first if you are new to the schema. Understanding the Activity/Plan split and the mixin pattern will make the extension rules below straightforward.
General rules
These rules apply when extending any part of CoreMeta4Cat.
Rule 1 — Extend, don't modify. Add new subclasses and slots. Do not rename or remove existing classes, slots, or enum values — this would break backward compatibility for any dataset already using them.
Rule 2 — Inherit from the right parent.
Each extension type has a designated parent class (see the table below). Always use is_a: with that parent, not with a sibling class.
| What you are adding | Parent class | File |
|---|---|---|
| New preparation method | PreparationMethod |
catcore_synthesis_ap.yaml |
| New characterisation technique | CharacterizationTechnique |
catcore_characterization_ap.yaml |
| New reactor type | ReactorDesignType |
catcore_reaction_ap.yaml |
| New simulation method | SimulationMethod |
catcore_simulation_ap.yaml |
| New calculated property | CalculatedProperty |
catcore_simulation_ap.yaml |
| New mixin (slot group) | (no parent — mixin: true) | Appropriate subprofile |
| New shared slot | (no class — top-level slot) | catcore_common.yaml |
Rule 3 — Register an ontology term.
Every new class should have a class_uri: pointing to a term in an established ontology (Voc4Cat, CHMO, OBI, NCIT, …). If no suitable term exists yet, use a provisional catcore-prefixed URI (catcore:MyNewClass) and open a Voc4Cat issue to request a proper term.
Rule 4 — Declare slots in the right file.
Slots used by exactly one class go in that class's subprofile file. Slots shared by two or more classes go in catcore_common.yaml.
Rule 5 — Apply existing mixins before adding new slots. If your new class needs drying, calcination, precipitation, or thermal process parameters, apply the appropriate mixin rather than redeclaring those slots. Only add method-specific slots beyond what the mixin provides.
Rule 6 — Mark obligation levels.
Every slot in a new class should have either required: true (Mandatory), recommended: true (Recommended), or neither (Optional). Do not leave obligations implicit.
Adding a preparation method
New catalyst synthesis routes are added to catcore_synthesis_ap.yaml as PreparationMethod subclasses.
Step-by-step
1. Identify which mixins apply.
Before declaring any slots, check whether the method includes a drying step, calcination step, precipitation step, or generic thermal process. Apply all relevant mixins:
MyNewMethod:
is_a: PreparationMethod
class_uri: voc4cat:XXXXXXX # register a real term, or use catcore: prefix temporarily
mixins:
- DryingMixin # if the method has a drying step
- CalcinationMixin # if the method has a calcination step
description: |-
Brief description of the preparation route.
2. Add only method-specific slots.
Slots already provided by mixins must not be redeclared. Only list slots that are unique to this method:
slots:
- my_specific_parameter_a
- my_specific_parameter_b
3. Declare the new slots in the slots section.
Add the slot definitions below the class definitions in the same file. Include slot_uri, range, unit (where applicable), and multivalued: true:
slots:
my_specific_parameter_a:
description: What this parameter means and its typical range.
range: float
slot_uri: catcore:my_specific_parameter_a # or a Voc4Cat / ontology URI
multivalued: true
unit:
ucum_code: Cel # use UCUM codes — e.g. Cel, h, mL/min, bar, g
my_specific_parameter_b:
description: What this parameter means.
range: string
slot_uri: catcore:my_specific_parameter_b
multivalued: true
Minimal complete example — PhotochemicalSynthesis
PhotochemicalSynthesis:
is_a: PreparationMethod
class_uri: catcore:PhotochemicalSynthesis # replace with Voc4Cat term when available
mixins:
- DryingMixin
description: |-
Catalyst preparation using light irradiation to drive photochemical
reduction or deposition of an active phase onto a support.
slots:
- light_source
- irradiation_wavelength
- irradiation_duration
- light_intensity
slots:
light_source:
description: Type of light source used (e.g. Xe lamp, UV-LED, solar simulator).
range: string
slot_uri: catcore:light_source
multivalued: true
irradiation_wavelength:
description: Dominant wavelength of the irradiation source.
range: float
slot_uri: catcore:irradiation_wavelength
multivalued: true
unit:
ucum_code: nm
irradiation_duration:
description: Total duration of light irradiation.
range: float
slot_uri: catcore:irradiation_duration
multivalued: true
unit:
ucum_code: h
light_intensity:
description: Irradiance at the sample surface.
range: float
slot_uri: catcore:light_intensity
multivalued: true
unit:
ucum_code: mW/cm2
Adding a characterisation technique
New analytical techniques are added to catcore_characterization_ap.yaml as CharacterizationTechnique subclasses.
Step-by-step
1. Check available mixins for the technique.
The characterisation subprofile provides these mixins — apply all that fit:
| Mixin | Covers |
|---|---|
XRaySourceMixin |
X-ray source type, anode, wavelength |
ElectronMicroscopyMixin |
Accelerating voltage, detector, magnification |
TemperatureProgramMixin |
Ramp rate, hold temperature, atmosphere |
ChromatographyMixin |
Column type, carrier gas, injection volume |
MassRangeMixin |
Mass range, ionisation mode, resolution |
PhotoluminescenceMixin |
Excitation wavelength, emission range |
ElectrochemistryMixin |
Scan rate, potential range, electrolyte |
2. Declare the new class.
MyNewTechnique:
is_a: CharacterizationTechnique
class_uri: CHMO:XXXXXXX # use a CHMO term where one exists
mixins:
- RelevantMixin
description: |-
What the technique measures and what information it provides about the catalyst.
slots:
- technique_specific_slot_a
3. Declare technique-specific slots.
Use the same pattern as for preparation method slots (see above). Place them in the slots: section of catcore_characterization_ap.yaml.
Minimal complete example — NeutronDiffraction
NeutronDiffraction:
is_a: CharacterizationTechnique
class_uri: CHMO:0000957
description: |-
Neutron powder diffraction for structure determination, particularly
sensitive to light elements and magnetic ordering.
slots:
- neutron_wavelength
- moderator_type
- detector_coverage
slots:
neutron_wavelength:
description: Wavelength of the neutron beam.
range: float
slot_uri: catcore:neutron_wavelength
multivalued: true
unit:
ucum_code: Ao # Angstrom
moderator_type:
description: Type of neutron moderator (e.g. cold, thermal, hot source).
range: string
slot_uri: catcore:moderator_type
multivalued: true
detector_coverage:
description: Angular range covered by the detector bank.
range: float
slot_uri: catcore:detector_coverage
multivalued: true
unit:
ucum_code: deg
Adding a reactor type
New reactor geometries or operating modes are added to catcore_reaction_ap.yaml as ReactorDesignType subclasses.
Step-by-step
New reactor types are simpler than new preparation methods — there are currently no reactor-specific mixins, so you just add the class and any reactor-specific slots directly:
MyNewReactor:
is_a: ReactorDesignType
class_uri: voc4cat:XXXXXXX
description: |-
Brief description of the reactor geometry and typical operating conditions.
slots:
- reactor_specific_slot_a
If the reactor shares parameters with an existing type (e.g. both are tubular flow reactors), consider whether a shared mixin should be introduced rather than duplicating slots.
Minimal complete example — MonolithReactor
MonolithReactor:
is_a: ReactorDesignType
class_uri: catcore:MonolithReactor # replace with Voc4Cat term when available
description: |-
Monolith reactor — a reactor containing a structured monolithic substrate
(ceramic or metallic) with parallel channels coated with catalyst.
slots:
- channel_density
- washcoat_loading
- monolith_material
slots:
channel_density:
description: Number of channels per unit cross-sectional area of the monolith.
range: float
slot_uri: catcore:channel_density
multivalued: true
unit:
ucum_code: 1/cm2
washcoat_loading:
description: Mass of washcoat (catalyst layer) per unit volume of monolith.
range: float
slot_uri: catcore:washcoat_loading
multivalued: true
unit:
ucum_code: g/L
monolith_material:
description: Material of the monolith substrate (e.g. cordierite, FeCrAlloy).
range: string
slot_uri: catcore:monolith_material
multivalued: true
Adding a simulation method
New computational approaches are added to catcore_simulation_ap.yaml as SimulationMethod subclasses.
Step-by-step
1. Check the DFTSettingsMixin if the method uses a plane-wave basis.
The simulation subprofile provides DFTSettingsMixin (exchange-correlation functional, k-point mesh, energy cutoff, pseudopotential type) for DFT-based methods. If your new method is DFT-derived (e.g. DFT+U, hybrid-DFT, GW), apply this mixin.
2. Declare the class and its specific slots.
MyNewSimulationMethod:
is_a: SimulationMethod
class_uri: NCIT:XXXXXXX # or catcore: prefix temporarily
mixins:
- DFTSettingsMixin # if DFT-based
description: |-
Description of the theoretical approach and its typical use cases in catalysis.
slots:
- method_specific_slot
Minimal complete example — KineticMonteCarlo
KineticMonteCarlo:
is_a: SimulationMethod
class_uri: catcore:KineticMonteCarlo
description: |-
Kinetic Monte Carlo simulation of surface reaction kinetics, using
a reaction network of elementary steps with rate constants.
slots:
- reaction_network_size
- simulation_time_kmc
- surface_coverage_tracking
slots:
reaction_network_size:
description: Number of elementary reaction steps in the KMC reaction network.
range: integer
slot_uri: catcore:reaction_network_size
multivalued: true
simulation_time_kmc:
description: Total simulated physical time of the KMC trajectory.
range: float
slot_uri: catcore:simulation_time_kmc
multivalued: true
unit:
ucum_code: s
surface_coverage_tracking:
description: Species for which surface coverage is tracked as a function of time.
range: string
slot_uri: catcore:surface_coverage_tracking
multivalued: true
Adding a calculated property
New computed outputs are added to catcore_simulation_ap.yaml as CalculatedProperty subclasses.
MyNewProperty:
is_a: CalculatedProperty
class_uri: catcore:MyNewProperty
description: |-
What physical or chemical quantity is computed and what it tells us about the catalyst.
slots:
- property_specific_slot
Adding a shared slot
If a slot is needed by two or more subprofiles, declare it in catcore_common.yaml rather than in any individual subprofile. This keeps the schema DRY and avoids slot name collisions.
Checklist before adding a slot to catcore_common:
- [ ] The slot is genuinely needed in at least two different subprofile modules
- [ ] No existing slot in
catcore_commoncovers the same concept - [ ] The slot has a
slot_uripointing to an established ontology term (or a provisional catcore URI) - [ ] A UCUM unit code is provided for all numeric slots
# In catcore_common.yaml, under the slots: section:
my_shared_slot:
description: What this parameter means, with any relevant units or value constraints.
range: float
slot_uri: catcore:my_shared_slot # replace with ontology URI if available
multivalued: true
unit:
ucum_code: mL/min
Adding a mixin class
If a set of slots is shared across three or more classes in the same subprofile, consider factoring them into a new mixin. Mixins shared across two subprofiles should go in catcore_common.yaml.
MyNewMixin:
mixin: true
description: |-
Brief description of what process step or parameter group this mixin covers,
and which classes are expected to use it.
slots:
- slot_a
- slot_b
- slot_c
Apply the mixin to a class via:
SomeConcreteClass:
is_a: PreparationMethod
mixins:
- MyNewMixin
Mixin scope
A mixin should cover a coherent, reusable process step — not an arbitrary collection of slots. If a set of slots is only needed by one class, declare the slots directly on that class rather than creating a mixin.
🔬 Deep dive: Extending the import hierarchy
Technical section
This section is for schema developers who need to introduce a new chemistry-layer or intermediate module between CoreMeta4Cat and DCAT-AP-PLUS. Most users extending the four pillars do not need this.
CoreMeta4Cat sits at the top of a layered import chain:
catcore.yaml → catcore_common.yaml → chem_dcat_ap → … → dcat_ap_plus
If you need to introduce a new intermediate chemistry layer (e.g. a polymer_catalysis_ap that adds polymer-specific base classes used across multiple pillars), add it between catcore_common and the first pillar that needs it. Import it in catcore_common.yaml via the imports: key, and document the new layer in the import hierarchy diagram in catcore.yaml.
Do not import new intermediate layers directly in individual pillar files — this would create hidden import order dependencies and make the schema harder to reason about.
Checklist summary
Before submitting a pull request with a new extension:
- [ ] New class uses
is_a:with the correct parent (see General rules) - [ ]
class_uri:is set (Voc4Cat / ontology term, orcatcore:placeholder with issue link) - [ ] Existing mixins are applied before adding new slots
- [ ] Slots exclusive to this class are declared in the correct subprofile file
- [ ] Slots shared across subprofiles are declared in
catcore_common.yaml - [ ] All slots have
slot_uri:,range:,multivalued: true - [ ] Numeric slots have
unit: { ucum_code: ... } - [ ] Obligation levels are set (
required:orrecommended:) on all slots - [ ] A brief description is provided on both the class and each new slot
- [ ] The schema validates with
gen-linkml/linkml-validatebefore opening the PR