{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://scischema.org/schemas/physics/neutrino-event-reconstruction/1.0.0/master-schema.json",
  "version": "1.0.0",
  "title": "Neutrino Event Reconstruction Process Schema",
  "description": "Schema representing the neutrino event reconstruction process in liquid scintillator detectors. Combines detector geometry, optical and PMT models, reconstruction algorithms (vertex / energy / direction / PID), machine-learning configuration including CNN approaches (e.g., NOvA-style CVN), calibration strategy, performance validation with systematic uncertainties, and trigger/event selection criteria.",
  "type": "object",
  "$defs": {
    "QuantityValue": {
      "type": "object",
      "description": "A reported quantity with value and unit.",
      "properties": {
        "value": {
          "type": "number",
          "description": "Numerical value of the quantity."
        },
        "unit": {
          "type": "string",
          "description": "Measurement unit associated with the value."
        }
      },
      "required": [
        "value",
        "unit"
      ],
      "unevaluatedProperties": false
    }
  },
  "properties": {
    "detector_geometry": {
      "type": "object",
      "description": "Physical properties and configuration of the detector.",
      "properties": {
        "detector_radius": {
          "$ref": "#/$defs/QuantityValue",
          "description": "Radius of the detector's active volume.",
          "properties": {
            "unit": {
              "const": "cm"
            }
          }
        },
        "detector_height": {
          "$ref": "#/$defs/QuantityValue",
          "description": "Height of the detector's active volume (if cylindrical).",
          "properties": {
            "unit": {
              "const": "cm"
            }
          }
        },
        "inner_vessel_radius": {
          "$ref": "#/$defs/QuantityValue",
          "description": "Radius of the inner vessel containing the liquid scintillator.",
          "properties": {
            "unit": {
              "const": "cm"
            }
          }
        },
        "outer_vessel_radius": {
          "$ref": "#/$defs/QuantityValue",
          "description": "Radius of the outer vessel surrounding the liquid scintillator.",
          "properties": {
            "unit": {
              "const": "cm"
            }
          }
        },
        "pmt_count": {
          "type": "integer",
          "description": "Total number of PMTs in the detector."
        },
        "pmt_coverage": {
          "type": "number",
          "description": "Fractional coverage of the detector surface by PMTs.",
          "minimum": 0,
          "maximum": 1
        },
        "pmt_positions": {
          "type": "array",
          "description": "Array of PMT positions in the detector coordinate system.",
          "items": {
            "type": "object",
            "properties": {
              "pmt_id": {
                "type": "integer",
                "description": "Unique identifier for the PMT."
              },
              "x": {
                "$ref": "#/$defs/QuantityValue",
                "description": "X-coordinate of the PMT position.",
                "properties": {
                  "unit": {
                    "const": "cm"
                  }
                }
              },
              "y": {
                "$ref": "#/$defs/QuantityValue",
                "description": "Y-coordinate of the PMT position.",
                "properties": {
                  "unit": {
                    "const": "cm"
                  }
                }
              },
              "z": {
                "$ref": "#/$defs/QuantityValue",
                "description": "Z-coordinate of the PMT position.",
                "properties": {
                  "unit": {
                    "const": "cm"
                  }
                }
              }
            },
            "required": [
              "pmt_id",
              "x",
              "y",
              "z"
            ]
          }
        },
        "fiducial_volume": {
          "type": "object",
          "description": "Defined volume within the detector used for physics analysis.",
          "properties": {
            "fiducial_radius": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Radius of the fiducial volume.",
              "properties": {
                "unit": {
                  "const": "cm"
                }
              }
            },
            "fiducial_height": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Height of the fiducial volume (if cylindrical).",
              "properties": {
                "unit": {
                  "const": "cm"
                }
              }
            },
            "boundary_distance_cut": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Distance from the detector boundary excluded from the fiducial volume.",
              "properties": {
                "unit": {
                  "const": "cm"
                }
              }
            },
            "vertex_reconstruction_quality_cut": {
              "type": "string",
              "description": "Quality cut criteria applied to vertex reconstruction."
            },
            "position_dependent_resolution_variation": {
              "type": "number",
              "description": "Variation in resolution due to position within the fiducial volume."
            }
          },
          "required": [
            "fiducial_radius",
            "boundary_distance_cut"
          ]
        }
      },
      "required": [
        "detector_radius",
        "pmt_count",
        "pmt_coverage",
        "fiducial_volume"
      ]
    },
    "input_data_and_detector_models": {
      "type": "object",
      "description": "Input data formats and detector models used in the reconstruction process.",
      "properties": {
        "input_data_format": {
          "type": "object",
          "description": "Direct input for reconstruction algorithms — typically a list of PMT hit information after initial electronics calibration.",
          "properties": {
            "format": {
              "type": "string",
              "description": "File format of the input data (e.g., ROOT, HDF5, NPY, CSV, custom binary)."
            },
            "hit_time": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/QuantityValue",
                "properties": {
                  "unit": {
                    "const": "ns"
                  }
                }
              },
              "description": "Array of times at which the PMTs detected light."
            },
            "hit_charge": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/QuantityValue",
                "properties": {
                  "unit": {
                    "const": "PE"
                  }
                }
              },
              "description": "Array of charge amounts detected by the PMTs."
            },
            "pmt_id": {
              "type": "array",
              "items": {
                "type": "integer"
              },
              "description": "Array of unique identifiers for the PMTs that recorded the hits."
            },
            "first_hit_time": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Time of the first hit in the event.",
              "properties": {
                "unit": {
                  "const": "ns"
                }
              }
            },
            "total_nhits": {
              "type": "integer",
              "description": "Total number of hits recorded in the event."
            }
          },
          "required": [
            "format",
            "hit_time",
            "hit_charge",
            "pmt_id",
            "first_hit_time",
            "total_nhits"
          ]
        },
        "detector_optical_model": {
          "type": "object",
          "description": "Mathematical model describing the lifecycle of photons within the liquid scintillator medium.",
          "properties": {
            "scintillation_yield": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Number of photons produced per MeV of deposited energy.",
              "properties": {
                "unit": {
                  "const": "photons/MeV"
                }
              }
            },
            "scintillation_time_profile": {
              "type": "object",
              "description": "Scintillation decay time constants.",
              "properties": {
                "fast_decay_constant": {
                  "$ref": "#/$defs/QuantityValue",
                  "description": "Fast decay constant for the scintillation time profile.",
                  "properties": {
                    "unit": {
                      "const": "ns"
                    }
                  }
                },
                "slow_decay_constant": {
                  "$ref": "#/$defs/QuantityValue",
                  "description": "Slow decay constant for the scintillation time profile.",
                  "properties": {
                    "unit": {
                      "const": "ns"
                    }
                  }
                }
              },
              "required": [
                "fast_decay_constant",
                "slow_decay_constant"
              ]
            },
            "cherenkov_yield": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Number of Cherenkov photons produced per MeV of deposited energy.",
              "properties": {
                "unit": {
                  "const": "photons/MeV"
                }
              }
            },
            "absorption_length": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Mean distance a photon travels before being absorbed.",
              "properties": {
                "value": {
                  "minimum": 0
                },
                "unit": {
                  "const": "cm"
                }
              }
            },
            "re_emission_probability": {
              "type": "number",
              "description": "Probability that an absorbed photon is re-emitted.",
              "minimum": 0,
              "maximum": 1
            },
            "rayleigh_scattering_length": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Mean distance a photon travels before Rayleigh scattering.",
              "properties": {
                "value": {
                  "minimum": 0
                },
                "unit": {
                  "const": "cm"
                }
              }
            },
            "refractive_index": {
              "type": "number",
              "description": "Refractive index of the liquid scintillator medium."
            },
            "effective_refractive_index": {
              "type": "number",
              "description": "Effective refractive index for the detectable wavelength distribution, used in directionality reconstruction."
            },
            "group_velocity_correction": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Theoretical group velocity correction for Cherenkov photons.",
              "properties": {
                "unit": {
                  "const": "ns/m"
                }
              }
            }
          },
          "required": [
            "scintillation_yield",
            "scintillation_time_profile",
            "cherenkov_yield",
            "absorption_length",
            "re_emission_probability",
            "rayleigh_scattering_length",
            "refractive_index"
          ]
        },
        "pmt_response_model": {
          "type": "object",
          "description": "Model of the Photomultiplier Tube's behavior, characterising how single photons are converted into measurable electrical signals.",
          "properties": {
            "quantum_efficiency": {
              "type": "number",
              "description": "Probability that a photon incident on the PMT photocathode produces a photoelectron.",
              "minimum": 0,
              "maximum": 1
            },
            "transit_time_spread": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Transit time spread (TTS) of the PMT.",
              "properties": {
                "unit": {
                  "const": "ns"
                }
              }
            },
            "dark_noise_rate": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Rate of dark noise hits.",
              "properties": {
                "unit": {
                  "const": "Hz"
                }
              }
            },
            "single_photoelectron_resolution": {
              "type": "number",
              "description": "Resolution of the PMT for single photoelectron signals (sigma/mean)."
            },
            "afterpulsing_probability": {
              "type": "number",
              "description": "Probability of afterpulsing following a primary pulse.",
              "minimum": 0,
              "maximum": 1
            },
            "pmt_type": {
              "type": "string",
              "description": "Type and model of PMT used in the detector (e.g., 20-inch NNVT MCP-PMT for JUNO, Hamamatsu R7081 for KamLAND)."
            }
          },
          "required": [
            "quantum_efficiency",
            "transit_time_spread",
            "dark_noise_rate",
            "single_photoelectron_resolution",
            "afterpulsing_probability",
            "pmt_type"
          ]
        },
        "background_model": {
          "type": "object",
          "description": "Model describing backgrounds present in the detector.",
          "properties": {
            "accidental_coincidences_rate": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Rate of accidental coincidences in the detector.",
              "properties": {
                "unit": {
                  "const": "Hz"
                }
              }
            },
            "accidental_components": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Types of accidental background components (e.g., 210Bi, 210Po, 85Kr, 40K)."
            },
            "correlated_background_rate": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Rate of correlated background events",
              "properties": {
                "unit": {
                  "const": "Hz"
                }
              }
            },
            "correlated_backgrounds": {
              "type": "array",
              "description": "List of correlated background sources (e.g., cosmogenic isotopes, external gamma rays).",
              "items": {
                "type": "object",
                "properties": {
                  "isotope": {
                    "type": "string",
                    "description": "Name of the isotope contributing to the background (e.g., 210Bi, 85Kr)."
                  },
                  "rate": {
                    "$ref": "#/$defs/QuantityValue",
                    "description": "Interaction rate of the background isotope.",
                    "properties": {
                      "unit": {
                        "const": "Hz"
                      }
                    }
                  },
                  "energy_spectrum": {
                    "type": "string",
                    "description": "Description or reference to the energy spectrum of the background isotope."
                  }
                },
                "required": [
                  "isotope",
                  "rate"
                ]
              }
            },
            "cosmogenic_isotopes": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "Cosmogenic isotopes contributing to background (e.g., 9Li, 8He)."
            }
          },
          "required": [
            "accidental_coincidences_rate"
          ]
        },
        "detector_technology": {
          "type": "object",
          "description": "Technological aspects of the detector: multi-zone design, doping, and veto systems.",
          "properties": {
            "multi_zone_design": {
              "type": "object",
              "description": "Parameters of the multi-zone detector structure",
              "properties": {
                "target_vessel_radius": {
                  "$ref": "#/$defs/QuantityValue",
                  "description": "Radius of the innermost target vessel containing the (Gd-loaded) liquid scintillator in a multi-zone detector design.",
                  "properties": {
                    "unit": {
                      "const": "cm"
                    }
                  }
                },
                "buffer_vessel_radius": {
                  "$ref": "#/$defs/QuantityValue",
                  "description": "Radius of the buffer vessel surrounding the target volume, providing passive shielding against external radioactivity.",
                  "properties": {
                    "unit": {
                      "const": "cm"
                    }
                  }
                },
                "outer_vessel_radius": {
                  "$ref": "#/$defs/QuantityValue",
                  "description": "Radius of the outer vessel surrounding the liquid scintillator",
                  "properties": {
                    "unit": {
                      "const": "cm"
                    }
                  }
                },
                "target_material": {
                  "type": "string",
                  "description": "Material filling the central target volume (e.g., Gd-loaded liquid scintillator, LAB-based scintillator)."
                }
              }
            },
            "gadolinium_doping": {
              "type": "object",
              "description": "Properties of gadolinium doping in liquid scintillator",
              "properties": {
                "gd_concentration": {
                  "$ref": "#/$defs/QuantityValue",
                  "description": "Concentration of gadolinium in the scintillator",
                  "properties": {
                    "unit": {
                      "const": "g/L"
                    }
                  }
                },
                "neutron_capture_efficiency": {
                  "type": "number",
                  "description": "Efficiency of neutron capture on gadolinium",
                  "minimum": 0,
                  "maximum": 1
                },
                "neutron_capture_time": {
                  "$ref": "#/$defs/QuantityValue",
                  "description": "Time for neutron capture by gadolinium",
                  "properties": {
                    "unit": {
                      "const": "microseconds"
                    }
                  }
                }
              },
              "required": [
                "gd_concentration",
                "neutron_capture_efficiency",
                "neutron_capture_time"
              ]
            },
            "muon_veto_system": {
              "type": "object",
              "description": "Muon detection and veto system parameters",
              "properties": {
                "veto_type": {
                  "type": "string",
                  "description": "e.g., water Cherenkov, RPC."
                },
                "muon_detection_efficiency": {
                  "type": "number",
                  "description": "Efficiency of cosmic muon detection",
                  "minimum": 0,
                  "maximum": 1
                }
              }
            }
          }
        }
      },
      "required": [
        "input_data_format",
        "detector_optical_model",
        "pmt_response_model",
        "background_model"
      ]
    },
    "reconstruction_algorithms": {
      "type": "object",
      "description": "Algorithms used to reconstruct neutrino events.",
      "properties": {
        "vertex_reconstruction_algorithm": {
          "type": "object",
          "description": "Algorithm to determine the three-dimensional position (x, y, z) of an event within the detector volume.",
          "properties": {
            "algorithm_type": {
              "type": "string",
              "description": "Type of vertex reconstruction algorithm (e.g., CCA, time-likelihood, charge-time-likelihood, deep learning, maximum-likelihood)."
            },
            "likelihood_function_definition": {
              "type": "string",
              "description": "Definition of the likelihood function used in the algorithm (if applicable)."
            },
            "minimization_algorithm": {
              "type": "string",
              "description": "e.g., Minuit, BFGS, Nelder-Mead."
            },
            "neural_network_architecture": {
              "type": "object",
              "description": "Architecture of the neural network (if deep learning is used). References the machine_learning_configuration.network_architecture.",
              "properties": {
                "architecture_reference": {
                  "type": "string",
                  "description": "Reference to machine_learning_configuration.network_architecture."
                },
                "input_representation": {
                  "type": "string",
                  "description": "e.g., aggregated features, PMT map, graph, point cloud, hit-time-charge tensor."
                }
              }
            },
            "loss_function_type": {
              "type": "string",
              "description": "Type of loss function used in the algorithm (e.g., MSE, MAE, negative log-likelihood)."
            }
          },
          "required": [
            "algorithm_type"
          ]
        },
        "energy_reconstruction_algorithm": {
          "type": "object",
          "description": "Algorithm to estimate the total deposited energy of the event.",
          "properties": {
            "non_linearity_correction_model": {
              "type": "object",
              "description": "Model for correcting energy non-linearity (e.g., Birks' law).",
              "properties": {
                "birks_constant": {
                  "$ref": "#/$defs/QuantityValue",
                  "description": "Birks' constant for scintillator quenching.",
                  "properties": {
                    "unit": {
                      "const": "mm/MeV"
                    }
                  }
                },
                "cherenkov_contribution": {
                  "type": "number",
                  "description": "Fractional contribution of Cherenkov light to the observed energy.",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [
                "birks_constant"
              ]
            },
            "uniformity_correction_map": {
              "type": "object",
              "description": "Method or map used to correct for position-dependent detector response non-uniformity.",
              "properties": {
                "map_type": {
                  "type": "string",
                  "description": "e.g., 3D grid, radial, z-dependent."
                },
                "coordinate_system": {
                  "type": "string",
                  "description": "e.g., cylindrical, spherical, Cartesian."
                },
                "resolution": {
                  "type": "array",
                  "description": "Resolution of the correction map in each dimension",
                  "items": {
                    "$ref": "#/$defs/QuantityValue",
                    "properties": {
                      "unit": {
                        "const": "cm"
                      }
                    }
                  }
                }
              },
              "required": [
                "map_type",
                "coordinate_system",
                "resolution"
              ]
            },
            "total_charge_summation": {
              "type": "string",
              "description": "Method used for total charge summation (e.g., integration window)."
            },
            "machine_learning_regressor": {
              "type": "string",
              "description": "Type of machine learning regressor used (if applicable)."
            },
            "energy_scale_calibration_method": {
              "type": "string",
              "description": "Method used for energy scale calibration."
            }
          },
          "required": [
            "non_linearity_correction_model"
          ]
        },
        "direction_reconstruction_algorithm": {
          "type": "object",
          "description": "Algorithm to reconstruct the initial direction of the primary particle.",
          "properties": {
            "cherenkov_scintillation_separation_method": {
              "type": "string",
              "description": "Method to separate Cherenkov from scintillation light (e.g., time-based, likelihood-based)."
            },
            "hit_order": {
              "type": "integer",
              "description": "Order of hit used in directional analysis (1 = first hit).",
              "minimum": 1
            },
            "directional_angle": {
              "type": "array",
              "items": {
                "type": "number"
              },
              "description": "Array of directional angles cos(alpha) for PMT hits."
            },
            "cherenkov_group_velocity_correction": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Effective correction for the group velocity of Cherenkov photons.",
              "properties": {
                "unit": {
                  "const": "ns/m"
                }
              }
            },
            "time_of_flight_correction": {
              "type": "boolean",
              "description": "Indicates whether Time-of-Flight correction is applied to hit times"
            },
            "hit_time_likelihood_function": {
              "type": "string",
              "description": "Definition of the hit time likelihood function."
            },
            "angular_pdf_model": {
              "type": "string",
              "description": "Model for the angular probability density function of Cherenkov light."
            },
            "cos_theta_cherenkov_angle": {
              "type": "number",
              "description": "Cosine of the Cherenkov angle used in the reconstruction.",
              "minimum": -1,
              "maximum": 1
            },
            "correlated_integrated_directionality": {
              "type": "object",
              "description": "Configuration for the Correlated and Integrated Directionality (CID) method.",
              "properties": {
                "enabled": {
                  "type": "boolean",
                  "description": "Whether the CID method is used for directionality."
                },
                "nth_hit_cut": {
                  "type": "integer",
                  "description": "Number of earliest hits used for the CID analysis."
                },
                "angular_binning": {
                  "type": "integer",
                  "description": "Number of bins used for the angular distribution in the CID method."
                }
              }
            }
          },
          "required": [
            "cherenkov_scintillation_separation_method"
          ]
        },
        "particle_identification": {
          "type": "object",
          "description": "Algorithms to distinguish between different particle types, including convolutional neural networks for prong identification.",
          "properties": {
            "pulse_shape_discriminator": {
              "type": "string",
              "description": "Method for pulse shape discrimination (e.g., tail-to-total ratio)."
            },
            "topology_features": {
              "type": "array",
              "description": "List of topological features used for particle identification.",
              "items": {
                "type": "string"
              }
            },
            "classifier_type": {
              "type": "string",
              "description": "e.g., BDT, CNN, GNN, DNN, Transformer, Random Forest."
            },
            "alpha_beta_separation_power": {
              "type": "number",
              "description": "Ability to distinguish alpha and beta particles based on pulse shape"
            },
            "pid_rejection_ratio": {
              "type": "number",
              "description": "Background rejection factor for particle identification."
            },
            "neural_network_architecture": {
              "type": "object",
              "description": "Architecture of the neural network (if deep learning is used). References the machine_learning_configuration.network_architecture.",
              "properties": {
                "architecture_reference": {
                  "type": "string",
                  "description": "Reference to the specific architecture defined in machine_learning_configuration.network_architecture."
                },
                "input_representation": {
                  "type": "string",
                  "description": "Type of input representation used (e.g., aggregated features, PMT map, graph, point cloud, hit-time-charge tensor)."
                }
              }
            }
          },
          "required": [
            "classifier_type",
            "pulse_shape_discriminator"
          ]
        },
        "convolutional_visual_network": {
          "type": "object",
          "description": "Configuration for CNNs used in event classification and reconstruction (NOvA-style CVN).",
          "properties": {
            "architecture": {
              "type": "object",
              "description": "Network architecture definition for the convolutional visual network, including input views, convolutional and pooling layers, dropout, and output configuration.",
              "properties": {
                "input_views": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Detector views used as input (e.g., XZ, YZ)."
                },
                "convolutional_layers": {
                  "type": "array",
                  "description": "Configuration of convolutional layers in the network.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "kernel_size": {
                        "type": "string",
                        "description": "Size of the convolutional kernel (e.g., 7x7, 3x3)."
                      },
                      "stride": {
                        "type": "integer",
                        "description": "Stride of the convolution operation."
                      },
                      "type": {
                        "type": "string",
                        "description": "e.g., standard, inception module."
                      }
                    },
                    "required": [
                      "kernel_size",
                      "stride"
                    ]
                  }
                },
                "pooling_layers": {
                  "type": "array",
                  "description": "Configuration of pooling layers in the network.",
                  "items": {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "description": "e.g., max, average."
                      },
                      "kernel_size": {
                        "type": "string",
                        "description": "Size of the convolutional kernel (e.g., 7x7, 3x3)."
                      },
                      "stride": {
                        "type": "integer",
                        "description": "Stride of the convolution operation."
                      }
                    }
                  }
                },
                "dropout_rate": {
                  "type": "number",
                  "description": "Dropout rate applied during training.",
                  "minimum": 0,
                  "maximum": 1
                },
                "siamese_style": {
                  "type": "boolean",
                  "description": "Whether the network uses a Siamese-style architecture for multi-view inputs."
                },
                "output_classes": {
                  "type": "integer",
                  "description": "Number of output classes for event classification."
                }
              }
            },
            "training": {
              "type": "object",
              "description": "Training configuration for the convolutional visual network (framework, optimizer, learning rate, batch size, and number of epochs).",
              "properties": {
                "framework": {
                  "type": "string",
                  "description": "e.g., Caffe, TensorFlow, PyTorch."
                },
                "optimizer": {
                  "type": "string",
                  "description": "Optimizer used for training (e.g., SGD, Adam)."
                },
                "learning_rate": {
                  "type": "number",
                  "description": "Initial learning rate for training."
                },
                "batch_size": {
                  "type": "integer",
                  "description": "Size of the batch used during training."
                },
                "number_of_epochs": {
                  "type": "integer",
                  "description": "Number of epochs for training."
                }
              }
            }
          }
        }
      },
      "required": [
        "vertex_reconstruction_algorithm",
        "energy_reconstruction_algorithm",
        "direction_reconstruction_algorithm",
        "particle_identification"
      ]
    },
    "calibration_strategy": {
      "type": "object",
      "description": "Systematic deployment of radioactive sources and use of naturally-occurring signals to characterise detector response.",
      "properties": {
        "calibration_source_types": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "e.g., 60Co, 214Bi-214Po, AmBe, laser, LED."
        },
        "deployment_positions": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "e.g., center, off-axis, near PMT wall."
        },
        "calibration_frequency": {
          "type": "string",
          "description": "e.g., daily, weekly, monthly."
        },
        "spallation_neutron_usage": {
          "type": "boolean",
          "description": "Whether spallation neutrons are used for calibration."
        },
        "energy_anchor_points": {
          "type": "array",
          "description": "Energy points used to anchor the energy scale calibration.",
          "items": {
            "$ref": "#/$defs/QuantityValue",
            "properties": {
              "unit": {
                "const": "MeV"
              }
            }
          }
        },
        "cherenkov_calibration": {
          "type": "object",
          "description": "Calibration of Cherenkov light properties using gamma sources.",
          "properties": {
            "gamma_sources_used": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "e.g., 54Mn, 40K."
            },
            "group_velocity_correction_measured": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Group velocity correction for Cherenkov photons derived from calibration.",
              "properties": {
                "unit": {
                  "const": "ns/m"
                }
              }
            }
          }
        }
      },
      "required": [
        "calibration_source_types",
        "calibration_frequency"
      ]
    },
    "machine_learning_configuration": {
      "type": "object",
      "description": "Machine learning configurations used in reconstruction.",
      "properties": {
        "network_architecture": {
          "type": "object",
          "description": "Model structure used for machine learning-based reconstruction.",
          "properties": {
            "architecture_type": {
              "type": "string",
              "description": "e.g., DNN, CNN-ResNet, CNN-VGG, GNN-DeepSphere, Transformer, point-cloud net."
            },
            "number_of_layers": {
              "type": "integer",
              "description": "Number of layers in the neural network."
            },
            "number_of_parameters": {
              "type": "integer",
              "description": "Total number of trainable parameters in the network."
            },
            "input_representation": {
              "type": "string",
              "description": "Type of input representation used (e.g., aggregated features, PMT map, graph, point cloud, hit-time-charge tensor)."
            },
            "residual_connections": {
              "type": "boolean",
              "description": "Whether the architecture uses residual connections."
            }
          },
          "required": [
            "architecture_type",
            "input_representation"
          ]
        },
        "training_configuration": {
          "type": "object",
          "description": "Hyperparameters governing the machine learning training process.",
          "properties": {
            "optimizer": {
              "type": "string",
              "description": "e.g., Adam, AdamW, SGD, RMSprop, Lion."
            },
            "learning_rate_schedule": {
              "type": "string",
              "description": "e.g., cosine, exponential, stepwise, warmup-cosine."
            },
            "batch_size": {
              "type": "integer",
              "description": "Size of the batch used during training."
            },
            "number_of_epochs": {
              "type": "integer",
              "description": "Number of epochs for training."
            },
            "train_validation_test_split": {
              "type": "object",
              "description": "Split ratio for training, validation, and test datasets.",
              "properties": {
                "train": {
                  "type": "number",
                  "description": "Fraction of data used for training",
                  "minimum": 0,
                  "maximum": 1
                },
                "validation": {
                  "type": "number",
                  "description": "Fraction of data used for validation",
                  "minimum": 0,
                  "maximum": 1
                },
                "test": {
                  "type": "number",
                  "description": "Fraction of data used for testing",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [
                "train",
                "validation",
                "test"
              ]
            },
            "data_augmentation_techniques": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "e.g., noise injection, hit-time smearing, PMT masking, rotation."
            },
            "loss_function": {
              "type": "string",
              "description": "e.g., MSE, MAE, cross-entropy, focal loss, smooth L1, NLL."
            },
            "regularization_techniques": {
              "type": "object",
              "description": "Regularization techniques applied during training.",
              "properties": {
                "weight_decay": {
                  "type": "number",
                  "description": "Weight decay (L2 regularization) value used during training."
                },
                "label_smoothing": {
                  "type": "number",
                  "description": "Label smoothing factor used during training (between 0 and 1).",
                  "minimum": 0,
                  "maximum": 1
                },
                "stochastic_depth": {
                  "type": "number",
                  "description": "Stochastic depth drop rate (between 0 and 1).",
                  "minimum": 0,
                  "maximum": 1
                },
                "dropout_rate": {
                  "type": "number",
                  "description": "Dropout rate applied during training.",
                  "minimum": 0,
                  "maximum": 1
                }
              }
            },
            "exponential_moving_average": {
              "type": "number",
              "description": "Decay rate for exponential moving average of weights (between 0 and 1).",
              "minimum": 0,
              "maximum": 1
            }
          },
          "required": [
            "optimizer",
            "batch_size",
            "number_of_epochs",
            "train_validation_test_split",
            "loss_function"
          ]
        },
        "simulation_and_training_dataset": {
          "type": "object",
          "description": "Parameters of the Monte Carlo simulated datasets used for training and validation.",
          "properties": {
            "monte_carlo_generator": {
              "type": "string",
              "description": "e.g., Geant4, RAT, SNiPER, FLUKA."
            },
            "physics_process_list": {
              "type": "array",
              "description": "List of physics processes simulated in the dataset.",
              "items": {
                "type": "string"
              }
            },
            "training_sample_size": {
              "type": "integer",
              "description": "Number of events in the training sample."
            },
            "energy_range": {
              "type": "object",
              "description": "Energy range of the simulated events.",
              "properties": {
                "min": {
                  "$ref": "#/$defs/QuantityValue",
                  "description": "Minimum energy in training set",
                  "properties": {
                    "unit": {
                      "const": "MeV"
                    }
                  }
                },
                "max": {
                  "$ref": "#/$defs/QuantityValue",
                  "description": "Maximum energy in training set",
                  "properties": {
                    "unit": {
                      "const": "MeV"
                    }
                  }
                }
              },
              "required": [
                "min",
                "max"
              ]
            },
            "vertex_distribution": {
              "type": "string",
              "description": "Distribution of event vertices in the simulation (e.g., uniform, central)."
            },
            "detector_conditions_modeled": {
              "type": "array",
              "items": {
                "type": "string"
              },
              "description": "e.g., nominal, high noise, low light yield."
            },
            "semi_supervised_learning": {
              "type": "object",
              "description": "Configuration for semi-supervised learning setups.",
              "properties": {
                "enabled": {
                  "type": "boolean",
                  "description": "Whether the CID method is used for directionality."
                },
                "pseudo_label_source": {
                  "type": "string",
                  "description": "Source of pseudo-labels (e.g., pre-trained model, data-driven)."
                },
                "additional_data_size": {
                  "type": "integer",
                  "description": "Number of additional pseudo-labeled events used in training."
                }
              }
            }
          },
          "required": [
            "monte_carlo_generator",
            "training_sample_size",
            "energy_range"
          ]
        }
      },
      "required": [
        "network_architecture",
        "training_configuration",
        "simulation_and_training_dataset"
      ]
    },
    "performance_validation": {
      "type": "object",
      "description": "Validation of reconstruction performance, with systematic uncertainties and IBD-specific metrics.",
      "properties": {
        "reconstruction_performance_metrics": {
          "type": "object",
          "description": "Standardized metrics used to quantify and compare reconstruction performance.",
          "properties": {
            "vertex_resolution_RMS": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Vertex resolution reported as RMS of position residuals.",
              "properties": {
                "unit": {
                  "const": "cm"
                }
              }
            },
            "vertex_bias": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Systematic bias in vertex reconstruction.",
              "properties": {
                "unit": {
                  "const": "cm"
                }
              }
            },
            "energy_resolution": {
              "type": "number",
              "description": "Energy resolution sigma_E/E."
            },
            "energy_scale_residual_non_linearity": {
              "type": "number",
              "description": "Residual non-linearity in the energy scale after correction."
            },
            "angular_resolution": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Median angular error.",
              "properties": {
                "unit": {
                  "const": "degrees"
                }
              }
            },
            "pid_rejection_ratio": {
              "type": "number",
              "description": "Background rejection factor for particle identification."
            },
            "classification_efficiency": {
              "type": "number",
              "description": "Efficiency of event classification (e.g., 40% improvement for νe appearance).",
              "minimum": 0,
              "maximum": 1
            },
            "training_time": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Time taken for training the model.",
              "properties": {
                "unit": {
                  "const": "hours"
                }
              }
            },
            "memory_usage": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Memory usage during training or inference.",
              "properties": {
                "unit": {
                  "const": "GB"
                }
              }
            }
          },
          "required": [
            "vertex_resolution_RMS",
            "vertex_bias",
            "energy_resolution",
            "angular_resolution"
          ]
        },
        "systematic_uncertainties": {
          "type": "object",
          "description": "Systematic uncertainties affecting the reconstruction performance.",
          "properties": {
            "energy_scale_uncertainty": {
              "type": "number",
              "description": "Uncertainty in the energy scale calibration."
            },
            "vertex_reconstruction_uncertainty": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Uncertainty in the vertex reconstruction due to detector effects.",
              "properties": {
                "unit": {
                  "const": "cm"
                }
              }
            },
            "direction_reconstruction_uncertainty": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Uncertainty in the direction reconstruction.",
              "properties": {
                "unit": {
                  "const": "degrees"
                }
              }
            },
            "background_subtraction_uncertainty": {
              "type": "number",
              "description": "Uncertainty due to background subtraction methods."
            },
            "background_model_uncertainty": {
              "type": "number",
              "description": "Uncertainty in the background model"
            },
            "detector_response_uncertainty": {
              "type": "number",
              "description": "Uncertainty in detector response calibration"
            },
            "fiducial_volume_uncertainty": {
              "type": "number",
              "description": "Uncertainty in fiducial volume definition"
            },
            "reactor_flux_uncertainty": {
              "type": "number",
              "description": "Uncertainty in reactor antineutrino flux"
            },
            "group_velocity_correction_uncertainty": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Uncertainty in the group velocity correction for Cherenkov photons.",
              "properties": {
                "unit": {
                  "const": "ns/m"
                }
              }
            },
            "position_reconstruction_bias": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Bias in position reconstruction of electrons",
              "properties": {
                "unit": {
                  "const": "cm"
                }
              }
            }
          }
        },
        "ibd_performance_metrics": {
          "type": "object",
          "description": "Performance metrics specific to inverse beta decay (IBD) events.",
          "properties": {
            "neutron_detection_efficiency": {
              "type": "number",
              "description": "Efficiency of neutron detection in IBD events.",
              "minimum": 0,
              "maximum": 1
            },
            "positron_detection_efficiency": {
              "type": "number",
              "description": "Efficiency of positron detection in IBD events.",
              "minimum": 0,
              "maximum": 1
            },
            "coincidence_window": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Time window for prompt-delayed coincidence in IBD events.",
              "properties": {
                "unit": {
                  "const": "microseconds"
                }
              }
            },
            "prompt_delayed_distance_cut": {
              "$ref": "#/$defs/QuantityValue",
              "description": "Maximum distance between prompt and delayed signals in IBD events.",
              "properties": {
                "unit": {
                  "const": "cm"
                }
              }
            }
          }
        }
      },
      "required": [
        "reconstruction_performance_metrics",
        "systematic_uncertainties"
      ]
    },
    "trigger_and_event_selection": {
      "type": "object",
      "description": "Criteria for triggering and selecting events for reconstruction, including CNN-based selection.",
      "properties": {
        "trigger_threshold": {
          "$ref": "#/$defs/QuantityValue",
          "description": "Minimum PE threshold required to trigger an event.",
          "properties": {
            "unit": {
              "const": "PE"
            }
          }
        },
        "event_selection_criteria": {
          "type": "object",
          "description": "Criteria used to select events for reconstruction analysis.",
          "properties": {
            "energy_range": {
              "type": "object",
              "description": "Energy range of the simulated events.",
              "properties": {
                "min": {
                  "$ref": "#/$defs/QuantityValue",
                  "description": "Minimum reconstructed energy required for an event to pass the selection.",
                  "properties": {
                    "unit": {
                      "const": "MeV"
                    }
                  }
                },
                "max": {
                  "$ref": "#/$defs/QuantityValue",
                  "description": "Maximum reconstructed energy allowed for an event to pass the selection.",
                  "properties": {
                    "unit": {
                      "const": "MeV"
                    }
                  }
                }
              },
              "required": [
                "min",
                "max"
              ]
            },
            "fiducial_volume_cut": {
              "type": "string",
              "description": "Reference to detector_geometry.fiducial_volume, or explicit cut expression (e.g., 'R < 14.5 m and |z| < 14.5 m')."
            },
            "pulse_shape_discrimination": {
              "type": "boolean",
              "description": "Whether pulse-shape discrimination is used to reject alpha backgrounds."
            },
            "multiplicity_cut": {
              "type": "integer",
              "description": "Minimum number of PMT hits required."
            },
            "cvn_selection": {
              "type": "object",
              "description": "Criteria for event selection using convolutional visual networks.",
              "properties": {
                "cvn_classifier_threshold": {
                  "type": "number",
                  "description": "Threshold for CVN classifier output to select events.",
                  "minimum": 0,
                  "maximum": 1
                },
                "cvn_pid_threshold": {
                  "type": "number",
                  "description": "Threshold for CVN particle identification output to select events.",
                  "minimum": 0,
                  "maximum": 1
                }
              }
            }
          },
          "required": [
            "energy_range"
          ]
        }
      },
      "required": [
        "trigger_threshold",
        "event_selection_criteria"
      ]
    }
  },
  "required": [
    "detector_geometry",
    "input_data_and_detector_models",
    "reconstruction_algorithms",
    "performance_validation"
  ],
  "unevaluatedProperties": false
}
