{
  "schema_version": "1.0.0",
  "name": "SeeSway core displacement analysis",
  "software_version": "0.2.0",
  "execution": "Local Python function; also used by the browser Python worker. This is documentation, not an HTTP analysis endpoint.",
  "source": "/python/seesway.py",
  "source_sha256": "2cd3b70c4ad397ac09742a9935e73d1819dd57e49a4f132c08d725eb3c46c8e6",
  "entrypoint": "seesway.analyse(payload)",
  "dependencies": [
    "numpy",
    "scipy (Butterworth filtering only)",
    "PyWavelets 1.9.0 (Symlet-8)"
  ],
  "inputs": {
    "csv": "UTF-8 text, first two columns ML/AP, optional ML,AP header; 16 to 100000 samples; maximum 5 MB text",
    "sample_rate": "Positive Hz, <=10000",
    "unit": [
      "mm",
      "cm",
      "m"
    ],
    "delimiter": [
      ",",
      ";",
      "tab"
    ],
    "filter": [
      "none",
      "moving",
      "butterworth",
      "wavelet"
    ],
    "window": "Moving average only: odd integer 3\u2013101, shorter than trace",
    "cutoff": "Butterworth only: Hz >0 and < sample_rate/2",
    "order": "Butterworth only: integer 1\u201310, browser uses 6",
    "dfa": "Boolean; DFA-1 on raw displacement, minimum 128 samples",
    "dfa_min": "integer >=4, default 16",
    "dfa_max": "integer <=N/4 and >=2*dfa_min, default N/4",
    "columns": "Two distinct zero-based column indices, default [0,1]",
    "header": "auto (ML/AP names only), yes or no",
    "wavelet_bands": "Boolean; default true, requires at least 512 samples"
  },
  "outputs": [
    "version",
    "settings",
    "metrics",
    "plot (may be decimated)",
    "filtered (all samples)",
    "warnings",
    "dfa (per-axis exponent, fit R squared, windows, fluctuation values; null if disabled)",
    "wavelet_bands (four full ML/AP traces and axis-specific path speeds)"
  ],
  "limitations": [
    "Research/education preview; no individual clinical decisions",
    "Not equivalent-validated against original SeeSway",
    "No sample entropy; new wavelet/DFA implementation not legacy-equivalence validated"
  ],
  "data_processing": "local; no trace upload",
  "errors": "ValueError for invalid inputs; UI displays message",
  "license": null
}