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, skipped

Each <material>.json file is the main result. The other two are only written when you ran with figure extraction enabled (with_performance=true).

Note
The thermocatalysis case-study script (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

FieldTypeDescription
materialstringThe material name exactly as extracted from the paper
synthesisobjectThe structured synthesis procedure (see below)
evaluationobjectQuality scores from the LLM judge (see below)
performanceobject or nullPlot-linked performance data; null unless with_performance=true was used

synthesis object

FieldTypeDescription
target_compoundstringChemical formula or name of the synthesized material
target_compound_typestringOne of 16 fixed categories (see table below)
synthesis_methodstringOne of 35 fixed synthesis methods (see table below)
starting_materialslistReagents and precursors used (see Material below)
stepslistOrdered synthesis steps (see ProcessStep below)
equipmentlistAll equipment mentioned in the synthesis (see Equipment below)
notesstring or nullAnything relevant that did not fit the structured fields

target_compound_type — allowed values

ValueExamples
metals & alloysCu, Fe-Ni alloy, stainless steel
ceramics & glassesAl₂O₃, SiO₂, BaTiO₃
polymers & soft matterPDMS, PET, hydrogel
compositescarbon fibre / epoxy, metal matrix
semiconductors & electronicGaAs, Si, InP
nanomaterialsAu nanoparticles, TiO₂ nanorods
two-dimensional materialsgraphene, MoS₂ monolayer
framework & porous materialsMOF, zeolite, COF
biomaterials & biologicalhydroxyapatite, collagen scaffold
liquid materialsionic liquid, solution
hybrid & organic-inorganicperovskite, organosilica
functional materials & catalystsPt/Al₂O₃, zeolite catalyst
energy & sustainabilityLiFePO₄, solar cell absorber
smart & responsive materialsshape-memory alloy, pH-responsive gel
emerging & quantum materialstopological insulator, qubit
otheranything not fitting above

synthesis_method — common values

ValueBrief description
sol-gelHydrolysis/condensation of metal alkoxides
hydrothermalReaction in sealed autoclave with water at high T/P
solvothermalSame but with non-aqueous solvent
wet impregnationSoak support in precursor solution, dry, calcine
incipient wetness impregnationAdd just enough solution to fill pore volume
precipitation / coprecipitationPrecipitate from solution by pH or temperature change
solid-stateMix powders and sinter/calcine
CVDChemical vapour deposition
PVDPhysical vapour deposition
ball millingMechanical grinding of powders
electrochemical depositionDeposit material via applied current/potential
combustionAuto-ignition of metal-nitrate/fuel mixture
atomic layer depositionAlternating gas-phase precursor cycles
arc melting & induction meltingHigh-temperature melting under controlled atmosphere
mechanochemicalSolid-state reaction driven by mechanical energy
otherMethod not in the list

Material object (inside starting_materials and steps[].materials)

FieldTypeDescription
namestringChemical name or formula
amountnumber or nullNumeric quantity only (e.g. 0.12)
unitstring or nullUnit of amount (e.g. "g", "mL", "mmol", "wt%")
vendorstring or nullSupplier name if mentioned
puritystring or nullPurity if stated (e.g. "99%", "ACS grade")

ProcessStep object (inside steps)

FieldTypeDescription
step_numberintegerPosition in the sequence (starting from 1)
actionstringShort verb for the step — usually one of the suggested verbs below
descriptionstring or nullFree-text description of the step from the paper
materialslist of MaterialMaterials involved in this specific step
equipmentlist of EquipmentEquipment used in this step
conditionsConditions or nullPhysical 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

Warning
Unlike 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)

FieldTypeDescription
temperaturenumber or nullNumeric value only (e.g. 500.0)
temp_unitstring or null"C", "K", or "F"
durationnumber or nullNumeric value only
time_unitstring or null"h", "min", "s", "days"
pressurenumber or nullNumeric value only
pressure_unitstring or null"atm", "bar", "Pa", "torr", "psi"
atmospherestring or nullGas phase (e.g. "air", "N2", "H2", "Ar")
stirringboolean or nullWhether stirring was used
stirring_speednumber or nullSpeed in rpm
phnumber or nullpH value

A null value means the paper did not mention that condition — it does not mean the condition was absent.


Equipment object

FieldTypeDescription
namestringInstrument name (e.g. "autoclave", "tube furnace")
instrument_vendorstring or nullManufacturer if mentioned
settingsstring or nullOperating 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.

FieldTypeDescription
reasoningstringThe judge’s high-level assessment, written before the scores
scoresobjectThe seven dimensions plus overall_score (see table below)
confidence_levelstringThe judge’s own confidence: "low", "medium", "high"
missing_informationlist of stringsInformation present in the paper but absent from the extraction
extraction_errorslist of stringsSpecific inaccuracies the judge found
improvement_suggestionslist of stringsHow 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.

FieldWhat is being evaluated
structural_completeness_scoreAre all schema fields populated where information exists?
material_extraction_scoreAre names, amounts, units, and purities correct?
process_steps_scoreAre steps in the right order and correctly classified?
equipment_extraction_scoreIs all mentioned equipment captured?
conditions_extraction_scoreAre temperatures, times, atmospheres, pressures correct?
semantic_accuracy_scoreIs the meaning of each step faithfully preserved?
format_compliance_scoreDoes the output conform to the schema?
overall_scoreArithmetic mean of all above scores

Each score comes with a *_reasoning field explaining the rationale, and overall_score is accompanied by overall_reasoning.

Note
A low score means the extraction is incomplete or inaccurate relative to the source paper. It does not mean the synthesis itself was poor. The judge follows the rule “absence is not an error” — it will not penalise for omitting information that was never in the paper.

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"
    }
  ]
}
FieldDescription
plot_indexIndex of the figure in the paper (0-based)
figure_referenceLabel as it appears in the paper (e.g. "Fig. 3a")
series_nameLegend entry from the plot
coordinatesList of [x, y] pairs read from the plot
x_axis_label / y_axis_labelAxis labels
x_axis_unit / y_axis_unitAxis units
confidenceLinking 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']}")