{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://scischema.org/schemas/materials/dynamic-mechanical-analysis/1.0.0/master-schema.json",
  "version": "1.0.0",
  "title": "DMA / SAOS experiment record (stable slim interchange schema)",
  "description": "Slim stable DMA / SAOS interchange schema with segmented canonical measurement tables, optional raw signals, optional external URIs, interfacial support, compact TTS, and minimal QC metadata.",
  "type": "object",
  "unevaluatedProperties": false,
  "$defs": {
    "conditioning_step": {
      "type": "object",
      "unevaluatedProperties": false,
      "required": [
        "method"
      ],
      "properties": {
        "method": {
          "type": "string",
          "enum": [
            "drying",
            "annealing",
            "solvent_removal",
            "dialysis",
            "none",
            "other"
          ],
          "description": "Conditioning method applied to the sample before testing."
        },
        "temperature_c": {
          "type": "number",
          "description": "Temperature during conditioning in degrees Celsius."
        },
        "duration_h": {
          "type": "number",
          "minimum": 0,
          "description": "Duration of the conditioning step in hours."
        },
        "atmosphere": {
          "type": "string",
          "description": "Atmosphere used during conditioning (e.g. vacuum, nitrogen, ambient air)."
        },
        "notes": {
          "type": "string",
          "description": "Free-text notes about this conditioning step."
        }
      },
      "description": "Structured sample conditioning or preparation step."
    },
    "uncertainty": {
      "type": "object",
      "unevaluatedProperties": false,
      "description": "Optional 1-sigma or reported half-width uncertainties using the same units as the parent fields.",
      "properties": {
        "torque_n_m": {
          "type": "number",
          "minimum": 0,
          "description": "Uncertainty in torque at this point, in newton-meters."
        },
        "phase_angle_deg": {
          "type": "number",
          "minimum": 0,
          "description": "Uncertainty in phase angle at this point, in degrees."
        },
        "storage_modulus_pa": {
          "type": "number",
          "minimum": 0,
          "description": "Uncertainty in storage modulus at this point, in pascals."
        },
        "loss_modulus_pa": {
          "type": "number",
          "minimum": 0,
          "description": "Uncertainty in loss modulus at this point, in pascals."
        },
        "complex_modulus_pa": {
          "type": "number",
          "minimum": 0,
          "description": "Uncertainty in complex modulus at this point, in pascals."
        },
        "complex_viscosity_pa_s": {
          "type": "number",
          "minimum": 0,
          "description": "Uncertainty in complex viscosity at this point, in pascal-seconds."
        },
        "tan_delta": {
          "type": "number",
          "minimum": 0,
          "description": "Uncertainty in tan(delta) at this point."
        },
        "interfacial_shear_storage_modulus_mn_m": {
          "type": "number",
          "minimum": 0,
          "description": "Uncertainty in interfacial shear storage modulus, in millinewtons per meter."
        },
        "interfacial_shear_loss_modulus_mn_m": {
          "type": "number",
          "minimum": 0,
          "description": "Uncertainty in interfacial shear loss modulus, in millinewtons per meter."
        },
        "interfacial_dilatational_storage_modulus_mn_m": {
          "type": "number",
          "minimum": 0,
          "description": "Uncertainty in interfacial dilatational storage modulus, in millinewtons per meter."
        },
        "interfacial_dilatational_loss_modulus_mn_m": {
          "type": "number",
          "minimum": 0,
          "description": "Uncertainty in interfacial dilatational loss modulus, in millinewtons per meter."
        }
      }
    },
    "measurement_point": {
      "type": "object",
      "unevaluatedProperties": false,
      "required": [
        "angular_frequency_rad_s",
        "temperature_c"
      ],
      "properties": {
        "point_index": {
          "type": "integer",
          "minimum": 0,
          "description": "Zero-based index of this row within the segment measurement table."
        },
        "time_s": {
          "type": "number",
          "minimum": 0,
          "description": "Elapsed time associated with this measurement point in seconds."
        },
        "angular_frequency_rad_s": {
          "type": "number",
          "minimum": 0,
          "description": "Angular frequency at this measurement point in radians per second."
        },
        "temperature_c": {
          "type": "number",
          "description": "Sample temperature at this measurement point in degrees Celsius."
        },
        "torque_n_m": {
          "type": "number",
          "description": "Measured torque at this point in newton-meters."
        },
        "phase_angle_deg": {
          "type": "number",
          "minimum": 0,
          "maximum": 90,
          "description": "Phase lag in degrees between applied strain and measured stress response."
        },
        "storage_modulus_pa": {
          "type": "number",
          "minimum": 0,
          "description": "Storage modulus G' at this point in pascals."
        },
        "loss_modulus_pa": {
          "type": "number",
          "minimum": 0,
          "description": "Loss modulus G'' at this point in pascals."
        },
        "complex_modulus_pa": {
          "type": "number",
          "minimum": 0,
          "description": "Complex modulus |G*| at this point in pascals."
        },
        "complex_viscosity_pa_s": {
          "type": "number",
          "minimum": 0,
          "description": "Complex viscosity eta* at this point in pascal-seconds."
        },
        "tan_delta": {
          "type": "number",
          "minimum": 0,
          "description": "Loss tangent tan(delta) = G''/G' at this point."
        },
        "interfacial_shear_storage_modulus_mn_m": {
          "type": "number",
          "minimum": 0,
          "description": "Interfacial shear storage modulus at this point in millinewtons per meter."
        },
        "interfacial_shear_loss_modulus_mn_m": {
          "type": "number",
          "minimum": 0,
          "description": "Interfacial shear loss modulus at this point in millinewtons per meter."
        },
        "interfacial_dilatational_storage_modulus_mn_m": {
          "type": "number",
          "minimum": 0,
          "description": "Interfacial dilatational storage modulus at this point in millinewtons per meter."
        },
        "interfacial_dilatational_loss_modulus_mn_m": {
          "type": "number",
          "minimum": 0,
          "description": "Interfacial dilatational loss modulus at this point in millinewtons per meter."
        },
        "uncertainty": {
          "$ref": "#/$defs/uncertainty",
          "description": "Optional uncertainty block for values reported at this measurement point."
        }
      },
      "allOf": [
        {
          "anyOf": [
            {
              "required": [
                "storage_modulus_pa",
                "loss_modulus_pa"
              ]
            },
            {
              "required": [
                "interfacial_shear_storage_modulus_mn_m",
                "interfacial_shear_loss_modulus_mn_m"
              ]
            },
            {
              "required": [
                "interfacial_dilatational_storage_modulus_mn_m",
                "interfacial_dilatational_loss_modulus_mn_m"
              ]
            }
          ],
          "description": "One canonical measurement row with aligned frequency, temperature, and rheological values."
        }
      ],
      "description": "One canonical measurement row with aligned frequency, temperature, and rheological values."
    },
    "master_curve_point": {
      "type": "object",
      "unevaluatedProperties": false,
      "required": [
        "reduced_angular_frequency_rad_s"
      ],
      "properties": {
        "reduced_angular_frequency_rad_s": {
          "type": "number",
          "minimum": 0,
          "description": "Reduced angular frequency on the master curve in rad/s."
        },
        "storage_modulus_pa": {
          "type": "number",
          "minimum": 0,
          "description": "Storage modulus on the master curve in pascals."
        },
        "loss_modulus_pa": {
          "type": "number",
          "minimum": 0,
          "description": "Loss modulus on the master curve in pascals."
        },
        "complex_viscosity_pa_s": {
          "type": "number",
          "minimum": 0,
          "description": "Complex viscosity on the master curve in pascal-seconds."
        },
        "tan_delta": {
          "type": "number",
          "minimum": 0,
          "description": "Loss tangent on the master curve."
        }
      },
      "description": "One point on a time-temperature-superposition master curve."
    }
  },
  "required": [
    "schema_version",
    "experiment_mode",
    "metadata",
    "sample",
    "instrument",
    "segments"
  ],
  "properties": {
    "schema_version": {
      "type": "string",
      "const": "1.0.0-slim",
      "description": "Stable external contract version."
    },
    "experiment_mode": {
      "type": "string",
      "enum": [
        "saos_rheometer",
        "bulk_dma",
        "interfacial_shear"
      ],
      "description": "High-level experimental modality used to route parsing, UI defaults, and validation expectations."
    },
    "metadata": {
      "type": "object",
      "unevaluatedProperties": false,
      "required": [
        "experiment_id",
        "started_at"
      ],
      "properties": {
        "experiment_id": {
          "type": "string",
          "description": "Unique record identifier (UUID, LIMS key, or lab code)."
        },
        "started_at": {
          "type": "string",
          "format": "date-time",
          "description": "ISO 8601 experiment start time."
        },
        "ended_at": {
          "type": "string",
          "format": "date-time",
          "description": "ISO 8601 experiment end time, if known."
        },
        "operator": {
          "type": "string",
          "description": "Name or identifier of the person who conducted the experiment."
        },
        "institution": {
          "type": "string",
          "description": "Organization or laboratory responsible for the experiment."
        },
        "experiment_location": {
          "type": "string",
          "description": "Physical location where the experiment was performed (room, site, or facility)."
        },
        "replicate_group_id": {
          "type": "string",
          "description": "Shared identifier for nominally replicated records."
        },
        "instrument_software": {
          "type": "string",
          "description": "Instrument control or acquisition software name and version."
        },
        "analysis_software_version": {
          "type": "string",
          "description": "Software used for post-processing or modulus calculation."
        },
        "export_source": {
          "type": "string",
          "description": "Human-readable export source such as manual_entry, vendor_csv, or parquet_bundle."
        },
        "notes": {
          "type": "string",
          "description": "Free-text notes about the experiment record or export context."
        }
      },
      "description": "Administrative and provenance metadata for the experiment record."
    },
    "sample": {
      "type": "object",
      "unevaluatedProperties": false,
      "required": [
        "sample_id",
        "geometry"
      ],
      "properties": {
        "sample_id": {
          "type": "string",
          "description": "Unique identifier for the specimen or sample lot."
        },
        "material": {
          "type": "string",
          "description": "Short material identifier or specimen name."
        },
        "material_description": {
          "type": "string",
          "description": "Longer free-text description of polymer, blend, filler, lot, or specimen history."
        },
        "chemical_composition": {
          "type": "string",
          "description": "Chemical composition, grade, or formulation summary."
        },
        "material_state": {
          "type": "string",
          "enum": [
            "solid",
            "melt",
            "gel",
            "solution",
            "other"
          ],
          "description": "Physical state of the material during testing."
        },
        "geometry": {
          "description": "Shape-coupled geometry. The branch determines which dimensional fields are valid.",
          "oneOf": [
            {
              "type": "object",
              "unevaluatedProperties": false,
              "required": [
                "shape",
                "dimensions_mm"
              ],
              "properties": {
                "shape": {
                  "const": "disk",
                  "description": "Discriminator selecting the geometry branch (disk, film, bubble, etc.)."
                },
                "dimensions_mm": {
                  "type": "object",
                  "unevaluatedProperties": false,
                  "required": [
                    "diameter_mm",
                    "thickness_mm"
                  ],
                  "properties": {
                    "diameter_mm": {
                      "type": "number",
                      "exclusiveMinimum": 0,
                      "description": "Specimen diameter in millimeters."
                    },
                    "thickness_mm": {
                      "type": "number",
                      "exclusiveMinimum": 0,
                      "description": "Specimen thickness in millimeters."
                    }
                  },
                  "description": "Characteristic dimensions of the specimen in millimeters."
                },
                "strain_uniformity": {
                  "type": "string",
                  "enum": [
                    "uniform",
                    "non_uniform",
                    "unknown"
                  ],
                  "description": "Expected strain uniformity in the loaded geometry."
                },
                "edge_treatment": {
                  "type": "string",
                  "enum": [
                    "smooth",
                    "serrated",
                    "sanded",
                    "adhesive",
                    "other",
                    "unknown"
                  ],
                  "description": "Slip mitigation or edge preparation."
                },
                "notes": {
                  "type": "string",
                  "description": "Free-text notes about geometry, loading, or specimen preparation."
                }
              },
              "description": "Shape-coupled geometry. The branch determines which dimensional fields are valid."
            },
            {
              "type": "object",
              "unevaluatedProperties": false,
              "required": [
                "shape",
                "dimensions_mm"
              ],
              "properties": {
                "shape": {
                  "const": "film",
                  "description": "Discriminator selecting the geometry branch (disk, film, bubble, etc.)."
                },
                "dimensions_mm": {
                  "description": "Characteristic dimensions of the specimen in millimeters.",
                  "oneOf": [
                    {
                      "type": "object",
                      "unevaluatedProperties": false,
                      "required": [
                        "diameter_mm",
                        "thickness_mm"
                      ],
                      "properties": {
                        "diameter_mm": {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "description": "Specimen diameter in millimeters."
                        },
                        "thickness_mm": {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "description": "Specimen thickness in millimeters."
                        }
                      },
                      "description": "Characteristic dimensions of the specimen in millimeters."
                    },
                    {
                      "type": "object",
                      "unevaluatedProperties": false,
                      "required": [
                        "length_mm",
                        "width_mm",
                        "thickness_mm"
                      ],
                      "properties": {
                        "length_mm": {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "description": "Specimen length in millimeters."
                        },
                        "width_mm": {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "description": "Specimen width in millimeters."
                        },
                        "thickness_mm": {
                          "type": "number",
                          "exclusiveMinimum": 0,
                          "description": "Specimen thickness in millimeters."
                        }
                      },
                      "description": "Characteristic dimensions of the specimen in millimeters."
                    }
                  ]
                },
                "strain_uniformity": {
                  "type": "string",
                  "enum": [
                    "uniform",
                    "non_uniform",
                    "unknown"
                  ],
                  "description": "Expected strain uniformity in the loaded geometry."
                },
                "edge_treatment": {
                  "type": "string",
                  "enum": [
                    "smooth",
                    "serrated",
                    "sanded",
                    "adhesive",
                    "other",
                    "unknown"
                  ],
                  "description": "Slip mitigation or edge preparation."
                },
                "notes": {
                  "type": "string",
                  "description": "Free-text notes about geometry, loading, or specimen preparation."
                }
              },
              "description": "Shape-coupled geometry. The branch determines which dimensional fields are valid."
            },
            {
              "type": "object",
              "unevaluatedProperties": false,
              "required": [
                "shape",
                "dimensions_mm"
              ],
              "properties": {
                "shape": {
                  "const": "rectangular_bar",
                  "description": "Discriminator selecting the geometry branch (disk, film, bubble, etc.)."
                },
                "dimensions_mm": {
                  "type": "object",
                  "unevaluatedProperties": false,
                  "required": [
                    "length_mm",
                    "width_mm",
                    "thickness_mm"
                  ],
                  "properties": {
                    "length_mm": {
                      "type": "number",
                      "exclusiveMinimum": 0,
                      "description": "Specimen length in millimeters."
                    },
                    "width_mm": {
                      "type": "number",
                      "exclusiveMinimum": 0,
                      "description": "Specimen width in millimeters."
                    },
                    "thickness_mm": {
                      "type": "number",
                      "exclusiveMinimum": 0,
                      "description": "Specimen thickness in millimeters."
                    }
                  },
                  "description": "Characteristic dimensions of the specimen in millimeters."
                },
                "strain_uniformity": {
                  "type": "string",
                  "enum": [
                    "uniform",
                    "non_uniform",
                    "unknown"
                  ],
                  "description": "Expected strain uniformity in the loaded geometry."
                },
                "edge_treatment": {
                  "type": "string",
                  "enum": [
                    "smooth",
                    "serrated",
                    "sanded",
                    "adhesive",
                    "other",
                    "unknown"
                  ],
                  "description": "Slip mitigation or edge preparation."
                },
                "notes": {
                  "type": "string",
                  "description": "Free-text notes about geometry, loading, or specimen preparation."
                }
              },
              "description": "Shape-coupled geometry. The branch determines which dimensional fields are valid."
            },
            {
              "type": "object",
              "unevaluatedProperties": false,
              "required": [
                "shape",
                "interface_type",
                "dimensions_mm"
              ],
              "properties": {
                "shape": {
                  "const": "bubble",
                  "description": "Discriminator selecting the geometry branch (disk, film, bubble, etc.)."
                },
                "interface_type": {
                  "type": "string",
                  "enum": [
                    "air_water",
                    "liquid_liquid",
                    "other"
                  ],
                  "description": "Type of interface studied for interfacial geometries."
                },
                "dimensions_mm": {
                  "type": "object",
                  "unevaluatedProperties": false,
                  "required": [
                    "radius_curvature_mm"
                  ],
                  "properties": {
                    "radius_curvature_mm": {
                      "type": "number",
                      "exclusiveMinimum": 0,
                      "description": "Bubble or curved-interface radius of curvature in millimeters."
                    },
                    "thickness_mm": {
                      "type": "number",
                      "exclusiveMinimum": 0,
                      "description": "Specimen thickness in millimeters."
                    }
                  },
                  "description": "Characteristic dimensions of the specimen in millimeters."
                },
                "strain_uniformity": {
                  "type": "string",
                  "enum": [
                    "uniform",
                    "non_uniform",
                    "unknown"
                  ],
                  "description": "Expected strain uniformity in the loaded geometry."
                },
                "edge_treatment": {
                  "type": "string",
                  "enum": [
                    "smooth",
                    "serrated",
                    "sanded",
                    "adhesive",
                    "other",
                    "unknown"
                  ],
                  "description": "Slip mitigation or edge preparation."
                },
                "notes": {
                  "type": "string",
                  "description": "Free-text notes about geometry, loading, or specimen preparation."
                }
              },
              "description": "Shape-coupled geometry. The branch determines which dimensional fields are valid."
            },
            {
              "type": "object",
              "unevaluatedProperties": false,
              "required": [
                "shape",
                "interface_type"
              ],
              "properties": {
                "shape": {
                  "const": "planar_interface",
                  "description": "Discriminator selecting the geometry branch (disk, film, bubble, etc.)."
                },
                "interface_type": {
                  "type": "string",
                  "enum": [
                    "air_water",
                    "liquid_liquid",
                    "solid_liquid",
                    "other"
                  ],
                  "description": "Type of interface studied for interfacial geometries."
                },
                "dimensions_mm": {
                  "type": "object",
                  "description": "Characteristic dimensions of the specimen in millimeters.",
                  "unevaluatedProperties": true
                },
                "strain_uniformity": {
                  "type": "string",
                  "enum": [
                    "uniform",
                    "non_uniform",
                    "unknown"
                  ],
                  "description": "Expected strain uniformity in the loaded geometry."
                },
                "edge_treatment": {
                  "type": "string",
                  "enum": [
                    "smooth",
                    "serrated",
                    "sanded",
                    "adhesive",
                    "other",
                    "unknown"
                  ],
                  "description": "Slip mitigation or edge preparation."
                },
                "notes": {
                  "type": "string",
                  "description": "Free-text notes about geometry, loading, or specimen preparation."
                }
              },
              "description": "Shape-coupled geometry. The branch determines which dimensional fields are valid."
            },
            {
              "type": "object",
              "unevaluatedProperties": false,
              "required": [
                "shape",
                "dimensions_mm"
              ],
              "properties": {
                "shape": {
                  "const": "other",
                  "description": "Discriminator selecting the geometry branch (disk, film, bubble, etc.)."
                },
                "dimensions_mm": {
                  "type": "object",
                  "unevaluatedProperties": true,
                  "description": "Characteristic dimensions of the specimen in millimeters."
                },
                "strain_uniformity": {
                  "type": "string",
                  "enum": [
                    "uniform",
                    "non_uniform",
                    "unknown"
                  ],
                  "description": "Expected strain uniformity in the loaded geometry."
                },
                "edge_treatment": {
                  "type": "string",
                  "enum": [
                    "smooth",
                    "serrated",
                    "sanded",
                    "adhesive",
                    "other",
                    "unknown"
                  ],
                  "description": "Slip mitigation or edge preparation."
                },
                "notes": {
                  "type": "string",
                  "description": "Free-text notes about geometry, loading, or specimen preparation."
                }
              },
              "description": "Shape-coupled geometry. The branch determines which dimensional fields are valid."
            }
          ]
        },
        "conditioning_steps": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/conditioning_step",
            "description": "One structured conditioning or preparation step applied before testing."
          },
          "description": "Structured sample conditioning history."
        },
        "notes": {
          "type": "string",
          "description": "Free-text notes about the sample or its handling."
        }
      },
      "description": "Sample identity, geometry, conditioning history, and material context."
    },
    "instrument": {
      "type": "object",
      "unevaluatedProperties": false,
      "required": [
        "type",
        "fixture",
        "temperature_control"
      ],
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "controlled_strain_rheometer",
            "controlled_stress_rheometer",
            "dma_oscillatory",
            "interfacial_rheometer",
            "other"
          ],
          "description": "Instrument category used for the measurement."
        },
        "manufacturer": {
          "type": "string",
          "description": "Instrument manufacturer name."
        },
        "model": {
          "type": "string",
          "description": "Instrument model name or number."
        },
        "serial_number": {
          "type": "string",
          "description": "Instrument serial number."
        },
        "fixture": {
          "type": "string",
          "enum": [
            "parallel_plate",
            "cone_and_plate",
            "torsion",
            "single_cantilever",
            "dual_cantilever",
            "three_point_bend",
            "tension",
            "double_wall_ring",
            "bubble_needle",
            "other"
          ],
          "description": "Measuring geometry or fixture mounted on the instrument."
        },
        "primary_deformation": {
          "type": "string",
          "enum": [
            "shear",
            "dilatational",
            "combined",
            "unknown"
          ],
          "description": "Primary deformation mode imposed or measured by the instrument."
        },
        "temperature_control": {
          "type": "object",
          "unevaluatedProperties": false,
          "required": [
            "method"
          ],
          "properties": {
            "method": {
              "type": "string",
              "enum": [
                "peltier",
                "convection_oven",
                "liquid_cooling",
                "circulating_bath",
                "liquid_nitrogen",
                "other"
              ],
              "description": "Method used to control sample temperature."
            },
            "range_c": {
              "type": "object",
              "unevaluatedProperties": false,
              "properties": {
                "min": {
                  "type": "number",
                  "description": "Minimum temperature of the configured range in degrees Celsius."
                },
                "max": {
                  "type": "number",
                  "description": "Maximum temperature of the configured range in degrees Celsius."
                }
              },
              "description": "Rated or configured temperature operating range in degrees Celsius."
            },
            "accuracy_c": {
              "type": "number",
              "minimum": 0,
              "description": "Reported temperature-control accuracy in degrees Celsius."
            },
            "stabilization_time_min": {
              "type": "number",
              "minimum": 0,
              "description": "Typical or configured thermal stabilization time in minutes."
            }
          },
          "description": "Temperature-control subsystem configuration."
        },
        "angular_frequency_range_rad_s": {
          "type": "object",
          "unevaluatedProperties": false,
          "properties": {
            "min": {
              "type": "number",
              "minimum": 0,
              "description": "Minimum angular frequency in rad/s."
            },
            "max": {
              "type": "number",
              "minimum": 0,
              "description": "Maximum angular frequency in rad/s."
            }
          },
          "description": "Configured or achievable angular-frequency operating range in rad/s."
        },
        "strain_resolution_percent": {
          "type": "number",
          "minimum": 0,
          "description": "Reported strain resolution or minimum resolvable strain amplitude in percent."
        },
        "notes": {
          "type": "string",
          "description": "Free-text notes about the instrument setup."
        }
      },
      "description": "Instrument identity, fixture, temperature control, and capability metadata."
    },
    "segments": {
      "type": "array",
      "minItems": 1,
      "description": "Ordered protocol/data segments. Use one segment for a simple single-protocol experiment.",
      "items": {
        "type": "object",
        "unevaluatedProperties": false,
        "required": [
          "segment_id",
          "protocol",
          "datasets"
        ],
        "properties": {
          "segment_id": {
            "type": "string",
            "description": "Stable identifier for this segment within the record."
          },
          "label": {
            "type": "string",
            "description": "Human-readable label for the segment (e.g. frequency sweep at 25 C)."
          },
          "run_id": {
            "type": "string",
            "description": "Instrument or session sub-run identifier for this segment."
          },
          "segment_started_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 start time for this segment, if known."
          },
          "segment_ended_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 end time for this segment, if known."
          },
          "protocol": {
            "type": "object",
            "unevaluatedProperties": false,
            "required": [
              "strain",
              "oscillation",
              "temperature_program",
              "contact"
            ],
            "properties": {
              "strain": {
                "type": "object",
                "unevaluatedProperties": false,
                "required": [
                  "amplitude_percent"
                ],
                "properties": {
                  "amplitude_percent": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "maximum": 100,
                    "description": "Applied oscillatory strain amplitude as a percentage."
                  },
                  "linear_viscoelastic_verified": {
                    "type": "boolean",
                    "description": "Whether the response was verified to be within the linear viscoelastic region."
                  },
                  "strain_sweep": {
                    "type": "object",
                    "unevaluatedProperties": false,
                    "properties": {
                      "performed": {
                        "type": "boolean",
                        "description": "Whether a strain-amplitude sweep was performed."
                      },
                      "max_strain_percent_tested": {
                        "type": "number",
                        "exclusiveMinimum": 0,
                        "maximum": 100,
                        "description": "Maximum strain amplitude tested during the strain sweep, in percent."
                      },
                      "moduli_independent_of_strain": {
                        "type": "boolean",
                        "description": "Whether moduli were observed to be independent of strain over the tested range."
                      }
                    },
                    "description": "Results of an optional strain-amplitude sweep used to verify linearity."
                  },
                  "notes": {
                    "type": "string",
                    "description": "Free-text notes about strain settings or LVR verification."
                  }
                },
                "description": "Oscillatory strain settings and linear-viscoelastic checks."
              },
              "oscillation": {
                "type": "object",
                "unevaluatedProperties": false,
                "required": [
                  "kind"
                ],
                "properties": {
                  "kind": {
                    "type": "string",
                    "enum": [
                      "single_frequency",
                      "frequency_sweep"
                    ],
                    "description": "Whether the segment used a single frequency or a frequency sweep."
                  },
                  "frequency_unit": {
                    "type": "string",
                    "const": "rad_s",
                    "description": "Frequencies in this slim profile are expressed in radians per second."
                  },
                  "single": {
                    "type": "object",
                    "unevaluatedProperties": false,
                    "properties": {
                      "angular_frequency_rad_s": {
                        "type": "number",
                        "exclusiveMinimum": 0,
                        "description": "Applied angular frequency for a single-frequency test in rad/s."
                      }
                    },
                    "description": "Single-frequency oscillation settings."
                  },
                  "sweep": {
                    "type": "object",
                    "unevaluatedProperties": false,
                    "properties": {
                      "spacing": {
                        "type": "string",
                        "enum": [
                          "logarithmic",
                          "linear",
                          "custom"
                        ],
                        "description": "Spacing of frequency points in the sweep."
                      },
                      "angular_frequency_rad_s": {
                        "type": "object",
                        "unevaluatedProperties": false,
                        "required": [
                          "min",
                          "max"
                        ],
                        "properties": {
                          "min": {
                            "type": "number",
                            "minimum": 0,
                            "description": "Minimum angular frequency in the sweep, in rad/s."
                          },
                          "max": {
                            "type": "number",
                            "minimum": 0,
                            "description": "Maximum angular frequency in the sweep, in rad/s."
                          }
                        },
                        "description": "Angular-frequency range for the sweep in rad/s."
                      },
                      "points": {
                        "type": "array",
                        "items": {
                          "type": "number",
                          "minimum": 0,
                          "description": "One explicit angular-frequency setpoint in rad/s for custom spacing."
                        },
                        "description": "Explicit list of angular frequencies in rad/s (if custom spacing is used)."
                      },
                      "point_count": {
                        "type": "integer",
                        "minimum": 2,
                        "description": "Total number of frequency points in the sweep."
                      },
                      "points_per_decade": {
                        "type": "integer",
                        "minimum": 1,
                        "description": "Number of logarithmically spaced points per frequency decade."
                      }
                    },
                    "description": "Frequency-sweep settings for this segment."
                  }
                },
                "allOf": [
                  {
                    "if": {
                      "properties": {
                        "kind": {
                          "const": "single_frequency",
                          "description": "Whether the segment used a single frequency or a frequency sweep."
                        }
                      },
                      "description": "Oscillatory frequency protocol for this segment."
                    },
                    "then": {
                      "required": [
                        "single"
                      ]
                    },
                    "description": "Oscillatory frequency protocol for this segment."
                  },
                  {
                    "if": {
                      "properties": {
                        "kind": {
                          "const": "frequency_sweep",
                          "description": "Whether the segment used a single frequency or a frequency sweep."
                        }
                      },
                      "description": "Oscillatory frequency protocol for this segment."
                    },
                    "then": {
                      "required": [
                        "sweep"
                      ]
                    },
                    "description": "Oscillatory frequency protocol for this segment."
                  }
                ],
                "description": "Oscillatory frequency protocol for this segment."
              },
              "temperature_program": {
                "type": "object",
                "unevaluatedProperties": false,
                "required": [
                  "mode"
                ],
                "properties": {
                  "mode": {
                    "type": "string",
                    "enum": [
                      "isothermal",
                      "ramp",
                      "multi_step",
                      "other"
                    ],
                    "description": "Temperature-program mode (isothermal, ramp, multi-step, or other)."
                  },
                  "isothermal_temperature_c": {
                    "type": "number",
                    "description": "Target isothermal temperature in degrees Celsius."
                  },
                  "ramp_rate_c_per_min": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "description": "Temperature ramp rate in degrees Celsius per minute."
                  },
                  "temperature_range_c": {
                    "type": "object",
                    "unevaluatedProperties": false,
                    "required": [
                      "min",
                      "max"
                    ],
                    "properties": {
                      "min": {
                        "type": "number",
                        "description": "Minimum temperature of the ramp in degrees Celsius."
                      },
                      "max": {
                        "type": "number",
                        "description": "Maximum temperature of the ramp in degrees Celsius."
                      }
                    },
                    "description": "Start and end temperatures for a ramp in degrees Celsius."
                  },
                  "temperature_points_c": {
                    "type": "array",
                    "items": {
                      "type": "number",
                      "description": "One target temperature in degrees Celsius."
                    },
                    "description": "Explicit list of target temperatures in degrees Celsius."
                  },
                  "isothermal_holds": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "unevaluatedProperties": false,
                      "required": [
                        "temperature_c",
                        "duration_min"
                      ],
                      "properties": {
                        "temperature_c": {
                          "type": "number",
                          "description": "Hold temperature in degrees Celsius."
                        },
                        "duration_min": {
                          "type": "number",
                          "minimum": 0,
                          "description": "Hold duration in minutes."
                        }
                      },
                      "description": "One isothermal hold step within a multi-step temperature program."
                    },
                    "description": "Ordered list of isothermal hold steps."
                  },
                  "notes": {
                    "type": "string",
                    "description": "Free-text notes about the temperature program."
                  }
                },
                "allOf": [
                  {
                    "if": {
                      "properties": {
                        "mode": {
                          "const": "isothermal",
                          "description": "Temperature-program mode (isothermal, ramp, multi-step, or other)."
                        }
                      },
                      "description": "Temperature protocol executed during this segment."
                    },
                    "then": {
                      "required": [
                        "isothermal_temperature_c"
                      ]
                    },
                    "description": "Temperature protocol executed during this segment."
                  },
                  {
                    "if": {
                      "properties": {
                        "mode": {
                          "const": "ramp",
                          "description": "Temperature-program mode (isothermal, ramp, multi-step, or other)."
                        }
                      },
                      "description": "Temperature protocol executed during this segment."
                    },
                    "then": {
                      "required": [
                        "ramp_rate_c_per_min",
                        "temperature_range_c"
                      ]
                    },
                    "description": "Temperature protocol executed during this segment."
                  }
                ],
                "description": "Temperature protocol executed during this segment."
              },
              "contact": {
                "type": "object",
                "unevaluatedProperties": false,
                "required": [
                  "gap_mm"
                ],
                "properties": {
                  "gap_mm": {
                    "type": "number",
                    "exclusiveMinimum": 0,
                    "description": "Configured or measured gap between plates or fixture members in millimeters."
                  },
                  "normal_force_n": {
                    "type": "number",
                    "description": "Applied or measured normal force in newtons."
                  },
                  "normal_force_monitored": {
                    "type": "boolean",
                    "description": "Whether normal force was monitored during the segment."
                  },
                  "automatic_gap_compensation": {
                    "type": "boolean",
                    "description": "Whether automatic gap compensation was enabled."
                  },
                  "notes": {
                    "type": "string",
                    "description": "Free-text notes about contact conditions."
                  }
                },
                "description": "Gap and normal-force contact settings for the segment."
              },
              "deformation_type": {
                "type": "string",
                "enum": [
                  "shear",
                  "dilatational",
                  "combined",
                  "unknown"
                ],
                "description": "Dominant deformation mode for this segment protocol."
              }
            },
            "description": "Protocol parameters executed during this segment."
          },
          "datasets": {
            "type": "object",
            "unevaluatedProperties": false,
            "properties": {
              "measurement_points": {
                "type": "array",
                "minItems": 0,
                "items": {
                  "$ref": "#/$defs/measurement_point",
                  "description": "One measurement point (frequency/temperature row) in the canonical table."
                },
                "description": "Canonical row-based measurement table for this segment."
              },
              "raw_signals": {
                "type": "object",
                "unevaluatedProperties": false,
                "description": "Optional raw time-series supplement. JSON Schema does not enforce equal lengths across parallel arrays.",
                "properties": {
                  "time_s": {
                    "type": "array",
                    "items": {
                      "type": "number",
                      "minimum": 0,
                      "description": "One elapsed-time sample in seconds."
                    },
                    "description": "Raw time base for optional parallel signal arrays, in seconds."
                  },
                  "torque_n_m": {
                    "type": "array",
                    "items": {
                      "type": "number",
                      "description": "One raw torque sample in newton-meters."
                    },
                    "description": "Raw measured torque time series in newton-meters."
                  },
                  "phase_angle_deg": {
                    "type": "array",
                    "items": {
                      "type": "number",
                      "description": "One raw phase-angle sample in degrees."
                    },
                    "description": "Raw phase-angle time series in degrees."
                  },
                  "temperature_c": {
                    "type": "array",
                    "items": {
                      "type": "number",
                      "description": "One raw temperature sample in degrees Celsius."
                    },
                    "description": "Raw temperature time series in degrees Celsius."
                  }
                }
              },
              "derived_summary": {
                "type": "object",
                "unevaluatedProperties": false,
                "properties": {
                  "reported_glass_transition_c": {
                    "type": "number",
                    "description": "Reported glass-transition temperature in degrees Celsius."
                  },
                  "tan_delta_peak": {
                    "type": "object",
                    "unevaluatedProperties": false,
                    "properties": {
                      "temperature_c": {
                        "type": "number",
                        "description": "Temperature of the tan-delta peak in degrees Celsius."
                      },
                      "angular_frequency_rad_s": {
                        "type": "number",
                        "minimum": 0,
                        "description": "Angular frequency at the tan-delta peak in rad/s."
                      },
                      "frequency_hz": {
                        "type": "number",
                        "minimum": 0,
                        "description": "Frequency at the tan-delta peak in hertz."
                      }
                    },
                    "description": "Reported tan-delta peak location for this segment."
                  },
                  "crossover_frequency_rad_s": {
                    "type": "number",
                    "minimum": 0,
                    "description": "Angular frequency where G' equals G'' in rad/s."
                  },
                  "crossover_modulus_pa": {
                    "type": "number",
                    "minimum": 0,
                    "description": "Modulus at the G'/G'' crossover in pascals."
                  }
                },
                "description": "Optional segment-level derived quantities not tied to a single measurement row."
              },
              "external_series_uri": {
                "type": "string",
                "format": "uri",
                "description": "URI to an external file or object store containing the segment time series."
              }
            },
            "allOf": [
              {
                "anyOf": [
                  {
                    "required": [
                      "measurement_points"
                    ],
                    "properties": {
                      "measurement_points": {
                        "type": "array",
                        "minItems": 1,
                        "description": "Canonical row-based measurement table for this segment."
                      }
                    },
                    "description": "Measured, derived, and optionally external data for this segment."
                  },
                  {
                    "required": [
                      "external_series_uri"
                    ]
                  }
                ],
                "description": "Measured, derived, and optionally external data for this segment."
              }
            ],
            "description": "Measured, derived, and optionally external data for this segment."
          }
        },
        "description": "One ordered protocol and dataset segment within the experiment."
      }
    },
    "time_temperature_superposition": {
      "type": "object",
      "unevaluatedProperties": false,
      "required": [
        "applied"
      ],
      "properties": {
        "applied": {
          "type": "boolean",
          "description": "Whether time-temperature superposition was applied to this record."
        },
        "reference_temperature_c": {
          "type": "number",
          "description": "Reference temperature for the master curve in degrees Celsius."
        },
        "shift_factor_kind": {
          "type": "string",
          "enum": [
            "linear_a_t",
            "log_a_t"
          ],
          "description": "How shift factor values are encoded to prevent ambiguity across tools."
        },
        "shift_factors": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "unevaluatedProperties": false,
            "required": [
              "temperature_c",
              "value"
            ],
            "properties": {
              "temperature_c": {
                "type": "number",
                "description": "Temperature at which this shift factor was determined, in degrees Celsius."
              },
              "value": {
                "type": "number",
                "description": "Shift factor value; interpret using shift_factor_kind."
              }
            },
            "description": "Shift-factor entry for one measurement temperature."
          },
          "description": "Temperature-dependent shift factors used to build the master curve."
        },
        "master_curve_points": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/master_curve_point",
            "description": "One point on the TTS master curve."
          },
          "description": "Optional tabulated master-curve points after shifting."
        },
        "activation_energy_kj_mol": {
          "type": "number",
          "minimum": 0,
          "description": "Activation energy derived from shift-factor analysis in kilojoules per mole."
        },
        "extended_angular_frequency_rad_s": {
          "type": "object",
          "unevaluatedProperties": false,
          "required": [
            "min",
            "max"
          ],
          "properties": {
            "min": {
              "type": "number",
              "minimum": 0,
              "description": "Minimum reduced angular frequency on the master curve in rad/s."
            },
            "max": {
              "type": "number",
              "minimum": 0,
              "description": "Maximum reduced angular frequency on the master curve in rad/s."
            }
          },
          "description": "Angular-frequency range spanned by the shifted master curve in rad/s."
        },
        "shift_model": {
          "type": "string",
          "enum": [
            "wlf",
            "arrhenius",
            "manual",
            "unknown"
          ],
          "description": "Model used to fit or justify the shift factors."
        },
        "notes": {
          "type": "string",
          "description": "Free-text notes about the TTS procedure or fit quality."
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "applied": {
                "const": true,
                "description": "Whether time-temperature superposition was applied to this record."
              }
            },
            "description": "Optional time-temperature superposition (TTS) metadata and master-curve data."
          },
          "then": {
            "required": [
              "reference_temperature_c",
              "shift_factor_kind",
              "shift_factors"
            ]
          },
          "description": "Optional time-temperature superposition (TTS) metadata and master-curve data."
        }
      ],
      "description": "Optional time-temperature superposition (TTS) metadata and master-curve data."
    },
    "data_quality": {
      "type": "object",
      "unevaluatedProperties": false,
      "properties": {
        "linear_viscoelastic_verified": {
          "type": "boolean",
          "description": "Whether the dataset was verified to be in the linear viscoelastic region."
        },
        "time_temperature_superposition_valid": {
          "type": "boolean",
          "description": "Whether the TTS treatment is considered valid for this record."
        },
        "edge_slip_suspected": {
          "type": "boolean",
          "description": "Whether edge slip or wall slip is suspected in the data."
        },
        "cox_merz_validated": {
          "type": "boolean",
          "description": "Whether Cox-Merz rule consistency was checked or validated."
        },
        "overall_quality_score": {
          "type": "number",
          "minimum": 0,
          "maximum": 1,
          "description": "Optional normalized overall quality score between 0 and 1."
        },
        "notes": {
          "type": "string",
          "description": "Free-text notes about data-quality assessment."
        }
      },
      "description": "Compact quality-control flags and optional summary score for the record."
    },
    "interpretation": {
      "type": "object",
      "unevaluatedProperties": false,
      "properties": {
        "summary": {
          "type": "string",
          "description": "Short narrative summary of the experiment outcome."
        },
        "notable_features": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "One notable observation or feature."
          },
          "description": "List of notable observations or features in the data."
        }
      },
      "description": "Optional human-authored interpretation of the experiment results."
    },
    "extensions": {
      "type": "object",
      "unevaluatedProperties": true,
      "description": "Namespaced lab- or domain-specific payloads outside the stable core contract."
    }
  }
}
