Output Format
This page explains every field in the JSON files that LeMat-Synth produces.
Where are my result files?
After running any extraction script or lemat-synth extract, results are saved in a
folder structure like this:
results/
└── <paper-id>/
├── Fe2O3.json ← one file per synthesized material
├── Ni-Fe2O3.json
├── performance_mappings.json ← plot-to-material links (full pipeline only)
└── linking_summary.json ← counts: plots found, linked, skippedEach <material>.json file is the main result. The other two are only written when you
ran with figure extraction enabled (with_performance=true).
examples/scripts/case_study_thermocatalysis/)
and run_performance_only.py write linking_summary_llm.json and
linking_summary_human.json instead — the same summary plus an LLM evaluation of the
links, and a blank copy for your own annotation.The synthesis result file (<material>.json)
Minimal example
{
"material": "3%Ru/CaO",
"synthesis": {
"target_compound": "3%Ru/CaO",
"target_compound_type": "functional materials & catalysts",
"synthesis_method": "wet impregnation",
"starting_materials": [
{
"name": "RuCl3",
"amount": 0.12,
"unit": "g",
"vendor": "Sigma-Aldrich",
"purity": "99%"
},
{
"name": "CaO",
"amount": 1.0,
"unit": "g",
"vendor": null,
"purity": null
},
{
"name": "Deionized Water",
"amount": 20.0,
"unit": "mL",
"vendor": null,
"purity": null
}
],
"steps": [
{
"step_number": 1,
"action": "dissolve",
"description": "Dissolve RuCl3 in deionized water to form a precursor solution.",
"materials": [
{"name": "RuCl3", "amount": 0.12, "unit": "g", "vendor": null, "purity": null},
{"name": "Deionized Water", "amount": 20.0, "unit": "mL", "vendor": null, "purity": null}
],
"equipment": [{"name": "magnetic stirrer", "instrument_vendor": null, "settings": "room temperature"}],
"conditions": {
"temperature": null,
"temp_unit": null,
"duration": 30.0,
"time_unit": "min",
"atmosphere": "air",
"stirring": true,
"stirring_speed": null,
"pressure": null,
"pressure_unit": null,
"ph": null
}
},
{
"step_number": 2,
"action": "impregnate",
"description": "Add CaO support to the precursor solution and stir.",
"materials": [{"name": "CaO", "amount": 1.0, "unit": "g", "vendor": null, "purity": null}],
"equipment": [],
"conditions": {"temperature": null, "temp_unit": null, "duration": 2.0, "time_unit": "h",
"atmosphere": "air", "stirring": true, "stirring_speed": 300.0,
"pressure": null, "pressure_unit": null, "ph": null}
},
{
"step_number": 3,
"action": "dry",
"description": "Dry the impregnated sample overnight.",
"materials": [],
"equipment": [{"name": "oven", "instrument_vendor": null, "settings": null}],
"conditions": {"temperature": 110.0, "temp_unit": "C", "duration": 12.0,
"time_unit": "h", "atmosphere": "air", "stirring": false,
"stirring_speed": null, "pressure": null, "pressure_unit": null, "ph": null}
},
{
"step_number": 4,
"action": "calcine",
"description": "Calcine the dried catalyst in air at 500 °C.",
"materials": [],
"equipment": [{"name": "tube furnace", "instrument_vendor": null, "settings": "5°C/min ramp"}],
"conditions": {"temperature": 500.0, "temp_unit": "C", "duration": 4.0,
"time_unit": "h", "atmosphere": "air", "stirring": false,
"stirring_speed": null, "pressure": null, "pressure_unit": null, "ph": null}
}
],
"equipment": [
{"name": "magnetic stirrer", "instrument_vendor": null, "settings": null},
{"name": "oven", "instrument_vendor": null, "settings": null},
{"name": "tube furnace", "instrument_vendor": null, "settings": "5°C/min ramp"}
],
"notes": "Catalyst was reduced in H2 prior to activity measurement (not part of synthesis)."
},
"evaluation": {
"reasoning": "The extraction captures the impregnation route completely and adds nothing not present in the source text.",
"scores": {
"structural_completeness_score": 4.5,
"structural_completeness_reasoning": "All major fields populated; minor detail on drying oven vendor missing.",
"material_extraction_score": 5.0,
"material_extraction_reasoning": "Correct amounts, units, and purity values extracted.",
"process_steps_score": 4.0,
"process_steps_reasoning": "Steps in correct order; drying and calcination captured.",
"equipment_extraction_score": 4.5,
"equipment_extraction_reasoning": "Furnace and stirrer captured; oven brand missing.",
"conditions_extraction_score": 5.0,
"conditions_extraction_reasoning": "Temperatures, durations, and atmospheres all correct.",
"semantic_accuracy_score": 5.0,
"semantic_accuracy_reasoning": "All extracted information is faithful to the source.",
"format_compliance_score": 5.0,
"format_compliance_reasoning": "Schema fully respected.",
"overall_score": 4.71,
"overall_reasoning": "A faithful, near-complete extraction; only vendor-level details are missing."
},
"confidence_level": "high",
"missing_information": ["Calcination ramp rate for the second batch"],
"extraction_errors": [],
"improvement_suggestions": ["Capture the H2 reduction step in notes rather than omitting it."]
},
"performance": null
}Field-by-field explanation
Top level
| Field | Type | Description |
|---|---|---|
material | string | The material name exactly as extracted from the paper |
synthesis | object | The structured synthesis procedure (see below) |
evaluation | object | Quality scores from the LLM judge (see below) |
performance | object or null | Plot-linked performance data; null unless with_performance=true was used |
synthesis object
| Field | Type | Description |
|---|---|---|
target_compound | string | Chemical formula or name of the synthesized material |
target_compound_type | string | One of 16 fixed categories (see table below) |
synthesis_method | string | One of 35 fixed synthesis methods (see table below) |
starting_materials | list | Reagents and precursors used (see Material below) |
steps | list | Ordered synthesis steps (see ProcessStep below) |
equipment | list | All equipment mentioned in the synthesis (see Equipment below) |
notes | string or null | Anything relevant that did not fit the structured fields |
target_compound_type — allowed values
| Value | Examples |
|---|---|
metals & alloys | Cu, Fe-Ni alloy, stainless steel |
ceramics & glasses | Al₂O₃, SiO₂, BaTiO₃ |
polymers & soft matter | PDMS, PET, hydrogel |
composites | carbon fibre / epoxy, metal matrix |
semiconductors & electronic | GaAs, Si, InP |
nanomaterials | Au nanoparticles, TiO₂ nanorods |
two-dimensional materials | graphene, MoS₂ monolayer |
framework & porous materials | MOF, zeolite, COF |
biomaterials & biological | hydroxyapatite, collagen scaffold |
liquid materials | ionic liquid, solution |
hybrid & organic-inorganic | perovskite, organosilica |
functional materials & catalysts | Pt/Al₂O₃, zeolite catalyst |
energy & sustainability | LiFePO₄, solar cell absorber |
smart & responsive materials | shape-memory alloy, pH-responsive gel |
emerging & quantum materials | topological insulator, qubit |
other | anything not fitting above |
synthesis_method — common values
| Value | Brief description |
|---|---|
sol-gel | Hydrolysis/condensation of metal alkoxides |
hydrothermal | Reaction in sealed autoclave with water at high T/P |
solvothermal | Same but with non-aqueous solvent |
wet impregnation | Soak support in precursor solution, dry, calcine |
incipient wetness impregnation | Add just enough solution to fill pore volume |
precipitation / coprecipitation | Precipitate from solution by pH or temperature change |
solid-state | Mix powders and sinter/calcine |
CVD | Chemical vapour deposition |
PVD | Physical vapour deposition |
ball milling | Mechanical grinding of powders |
electrochemical deposition | Deposit material via applied current/potential |
combustion | Auto-ignition of metal-nitrate/fuel mixture |
atomic layer deposition | Alternating gas-phase precursor cycles |
arc melting & induction melting | High-temperature melting under controlled atmosphere |
mechanochemical | Solid-state reaction driven by mechanical energy |
other | Method not in the list |
Material object (inside starting_materials and steps[].materials)
| Field | Type | Description |
|---|---|---|
name | string | Chemical name or formula |
amount | number or null | Numeric quantity only (e.g. 0.12) |
unit | string or null | Unit of amount (e.g. "g", "mL", "mmol", "wt%") |
vendor | string or null | Supplier name if mentioned |
purity | string or null | Purity if stated (e.g. "99%", "ACS grade") |
ProcessStep object (inside steps)
| Field | Type | Description |
|---|---|---|
step_number | integer | Position in the sequence (starting from 1) |
action | string | Short verb for the step — usually one of the suggested verbs below |
description | string or null | Free-text description of the step from the paper |
materials | list of Material | Materials involved in this specific step |
equipment | list of Equipment | Equipment used in this step |
conditions | Conditions or null | Physical conditions for this step |
Suggested action values: add, mix, heat, cool, reflux, age, filter,
wash, dry, reduce, calcine, dissolve, precipitate, centrifuge, sonicate,
anneal, ion exchange, impregnate
synthesis_method and target_compound_type, action is not a closed
enum — the model is asked to pick from this list, but the schema accepts any string,
so occasional values such as "other" or "grind" do occur. If you filter or group
by action, check the distinct values you actually got first:
df["action"].value_counts().Conditions object (inside steps[].conditions)
| Field | Type | Description |
|---|---|---|
temperature | number or null | Numeric value only (e.g. 500.0) |
temp_unit | string or null | "C", "K", or "F" |
duration | number or null | Numeric value only |
time_unit | string or null | "h", "min", "s", "days" |
pressure | number or null | Numeric value only |
pressure_unit | string or null | "atm", "bar", "Pa", "torr", "psi" |
atmosphere | string or null | Gas phase (e.g. "air", "N2", "H2", "Ar") |
stirring | boolean or null | Whether stirring was used |
stirring_speed | number or null | Speed in rpm |
ph | number or null | pH value |
A null value means the paper did not mention that condition — it does not mean
the condition was absent.
Equipment object
| Field | Type | Description |
|---|---|---|
name | string | Instrument name (e.g. "autoclave", "tube furnace") |
instrument_vendor | string or null | Manufacturer if mentioned |
settings | string or null | Operating settings (e.g. "heating rate 5°C/min") |
evaluation object — quality scores
The seven scores live inside evaluation.scores, not directly under evaluation
— so the path to the headline number is evaluation.scores.overall_score.
| Field | Type | Description |
|---|---|---|
reasoning | string | The judge’s high-level assessment, written before the scores |
scores | object | The seven dimensions plus overall_score (see table below) |
confidence_level | string | The judge’s own confidence: "low", "medium", "high" |
missing_information | list of strings | Information present in the paper but absent from the extraction |
extraction_errors | list of strings | Specific inaccuracies the judge found |
improvement_suggestions | list of strings | How the extraction could be improved |
evaluation itself is null when the judge was disabled or its call failed.
evaluation.scores
Each dimension is scored from 1 (poor) to 5 (excellent) by the LLM judge.
| Field | What is being evaluated |
|---|---|
structural_completeness_score | Are all schema fields populated where information exists? |
material_extraction_score | Are names, amounts, units, and purities correct? |
process_steps_score | Are steps in the right order and correctly classified? |
equipment_extraction_score | Is all mentioned equipment captured? |
conditions_extraction_score | Are temperatures, times, atmospheres, pressures correct? |
semantic_accuracy_score | Is the meaning of each step faithfully preserved? |
format_compliance_score | Does the output conform to the schema? |
overall_score | Arithmetic mean of all above scores |
Each score comes with a *_reasoning field explaining the rationale, and
overall_score is accompanied by overall_reasoning.
Performance data (performance field)
Only present when with_performance=true is used. Contains plot-linked data for this material.
"performance": {
"material_name": "3%Ru/CaO",
"plot_data": [
{
"plot_index": 0,
"figure_reference": "Fig. 3a",
"series_name": "3%Ru/CaO",
"coordinates": [[200, 5.2], [250, 18.7], [300, 42.1], [350, 76.3], [400, 91.4]],
"x_axis_label": "Temperature",
"x_axis_unit": "°C",
"y_axis_label": "CO conversion",
"y_axis_unit": "%",
"plot_title": "Catalytic activity vs. temperature",
"confidence": "high"
}
]
}| Field | Description |
|---|---|
plot_index | Index of the figure in the paper (0-based) |
figure_reference | Label as it appears in the paper (e.g. "Fig. 3a") |
series_name | Legend entry from the plot |
coordinates | List of [x, y] pairs read from the plot |
x_axis_label / y_axis_label | Axis labels |
x_axis_unit / y_axis_unit | Axis units |
confidence | Linking confidence: "high", "medium", or "low" |
Reading results in Python
import json
from pathlib import Path
result_file = Path("results/my_paper/Fe2O3.json")
data = json.loads(result_file.read_text())
print(data["material"]) # "Fe2O3"
print(data["synthesis"]["synthesis_method"]) # "hydrothermal"
print(data["evaluation"]["scores"]["overall_score"]) # 4.3
print(data["evaluation"]["missing_information"]) # what the judge says was missed
for step in data["synthesis"]["steps"]:
print(f"Step {step['step_number']}: {step['action']} — {step['description']}")