{
  "title": "Synthetic equal-area Gaussian chromatography peaks",
  "status": "Constructed teaching model, not an experimental chromatogram",
  "equations": {
    "individual_density": "p(t; mu,sigma)=exp(-(t-mu)^2/(2*sigma^2))/(sigma*sqrt(2*pi))",
    "sum": "p1(t)+p2(t)",
    "resolution": "Rs=2*(mu2-mu1)/(wb1+wb2)=delta/(4*sigma)",
    "baseline_width_convention": "wb=4*sigma: tangents at Gaussian inflection points intercept the zero baseline at mu +/- 2*sigma; Gaussian support remains infinite"
  },
  "inputs": {
    "peak_1_center_s": 120.0,
    "peak_2_center_s": [
      140.0,
      160.0,
      180.0
    ],
    "sigma_s": 10.0,
    "individual_peak_area_on_real_line": 1,
    "sum_area_on_real_line": 2,
    "separations_s": [
      20.0,
      40.0,
      60.0
    ],
    "baseline_width_each_s": 40
  },
  "sampling": {
    "start_s": 0,
    "end_s": 240,
    "step_s": 0.1,
    "points_per_case": 2401,
    "csv_data_rows": 7203
  },
  "units": "Time in seconds; normalized density in inverse seconds. Neither concentration nor detector voltage.",
  "limits": [
    "No actual chromatograph is modeled.",
    "No measured noise, asymmetry, baseline or drift is included.",
    "No chemical identity, selectivity, retention chemistry or real-instrument performance is inferred.",
    "Individual Gaussian areas are one on the entire real line; the finite plot omits negligible tails.",
    "The tangent baseline width is a convention, not finite support.",
    "Rs=1.5 is a geometric value here; it does not imply zero overlap or validated separation of real analytes."
  ],
  "validation": {
    "area_absolute_tolerance": 2e-09,
    "integration": "NumPy trapezoidal rule on the plotted grid; analytic Gaussian finite-window area also reported",
    "cases": [
      {
        "separation_s": 20.0,
        "resolution_Rs": 0.5,
        "peak_1_window_area_trapezoid": 1.0,
        "peak_2_window_area_trapezoid": 1.0,
        "peak_2_window_area_analytic": 1.0,
        "sum_window_area_trapezoid": 2.0000000000000004
      },
      {
        "separation_s": 40.0,
        "resolution_Rs": 1.0,
        "peak_1_window_area_trapezoid": 1.0,
        "peak_2_window_area_trapezoid": 0.9999999999999994,
        "peak_2_window_area_analytic": 0.9999999999999993,
        "sum_window_area_trapezoid": 1.9999999999999996
      },
      {
        "separation_s": 60.0,
        "resolution_Rs": 1.5,
        "peak_1_window_area_trapezoid": 1.0,
        "peak_2_window_area_trapezoid": 0.9999999990131088,
        "peak_2_window_area_analytic": 0.9999999990134123,
        "sum_window_area_trapezoid": 1.999999999013109
      }
    ]
  },
  "software": {
    "numpy": "2.5.3",
    "matplotlib": "3.11.2"
  },
  "reproduction": "Run python reproduce.py using installed numpy and matplotlib. Outputs are written beside the script."
}
