Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
2e505bc
Modifications to the visualization code to optionally use a cutoff in…
May 4, 2025
f70d827
Notebook now uses the dark cutoff feature from the addition to visual…
May 4, 2025
0d562db
Merge pull request #23 from lg345/master
lg345 May 4, 2025
88c0dd4
Merge pull request #24 from lg345/21-xspectvisualizationplot_2d_diffe…
lg345 May 4, 2025
026e82f
README update so link to docs is easy to find
May 4, 2025
962ad9d
adding gitignore to stop syncing jupyter temp files
May 4, 2025
7e15706
Difference in magnitude for the timing was causing issue with binning…
May 4, 2025
60e1c78
JB analysis notebook from today. Includes extra diagnostic functions
May 5, 2025
a6afd38
Adding a power titration alignment block into the notebook. Works out…
May 5, 2025
7c78ed6
Merge remote-tracking branch 'refs/remotes/origin/mfx10089224' into m…
May 5, 2025
6818bd3
Post beamtime push. Mainly changes to notebooks (XES examples, dehe_o…
May 6, 2025
ad9f27b
Fixing README.md
May 6, 2025
65fd736
Added hitfinding and statistics. Have not fine tuned the threshold yet.
May 7, 2025
f473f59
Reorganized to put all of the default attributes to the top of the in…
May 7, 2025
da6b6d0
Remvoed redundancy in new default attributes.
May 7, 2025
9bbdfea
Showing hitfinding and statistics in the notebook now.
May 7, 2025
a75331e
added power titration analysis
May 7, 2025
0de602b
Merge remote-tracking branch 'refs/remotes/origin/mfx10089224' into m…
May 7, 2025
d4c3d92
adding ignore file
May 13, 2025
2e3e394
Merge pull request #29 from lg345/master
lg345 May 18, 2025
66cb836
Merge pull request #30 from lg345/mfx10089224
lg345 May 18, 2025
998b6d4
Clearning up notebook locations and storing them in the examples folder
May 18, 2025
0ac873f
Changed purge_all_keys() to set keys at the beginning to ensure the k…
May 18, 2025
f9b8ba2
feat: Add laser-specific analysis method and refactor analysis
May 18, 2025
6260529
Cleaning up notebooks. getting close to mfx101080524 notebook working.
May 18, 2025
52bc4d9
Forgot to git track the newly moved files which became unctracked.
May 18, 2025
4399050
modified XSpect for side-facing epix detector at MFX with static spec…
May 18, 2025
36c877c
Took out the absolute threshold for Hitfinding really should handle t…
May 18, 2025
1cf7a47
Working notebook
May 18, 2025
640122e
Some reason the energies were coming back backwards. Also for normali…
May 18, 2025
2885e84
more working notebook.
May 18, 2025
df69efa
Updates to the diagnostics:
May 23, 2025
1281d9d
Renamed files
May 23, 2025
430510a
To diagnostics module added a method to open/load h5 file since it fr…
May 23, 2025
d9b72e9
deleting/renaming files
May 23, 2025
ac2f70e
I seemingly deleted an extra line
May 29, 2025
ed6b99d
Added option to use a y-array for normalization. PRobably should neve…
May 29, 2025
7d60bfb
Sort of working notebook. hopefully the last working.
May 29, 2025
6acc6bd
Merge pull request #42 from lg345/mfx101080524_Follmer
follmerlab May 30, 2025
8a41376
Add files via upload
Jul 18, 2025
5d3833f
Fixed link to readthedocs in README.md
lg345 Jul 18, 2025
35b4130
Update README.md
lg345 Jul 18, 2025
09360e7
XSpect_Analysis.py amended to include a droplet_reconstruction functi…
Aug 30, 2025
83c52fb
Deleting .ipynb_checkpoints dir because it is in .gitignore and also …
Sep 2, 2025
4c3e99f
Deleting .ipynb_checkpoints dir because it is in .gitignore and also …
Sep 2, 2025
b47f9e1
Removed diagnostics.ipynb notebook from master because it is causing …
Sep 2, 2025
18fed81
Merge pull request #49 from lg345/dev
jtbabicz Sep 2, 2025
a961692
Some adjustments to the XSpect_Controller correcting the summation of…
Sep 2, 2025
d70d010
Changes to time_binning (1) Fixed by by removing the if/else statemen…
Sep 4, 2025
2758fa7
Minor tweak in diagnostics ROI viewer. Changed plt.imshow aspect to a…
Sep 4, 2025
b88ed07
New features in visualization: In added option to sum all (all runs/…
Sep 15, 2025
5e7c4dd
(1) Added notebook demonstrating new analysis features for averaging …
Sep 15, 2025
80724eb
Simplified/revised the changes made yesterday for the averaging all l…
Sep 16, 2025
40d2b09
Add option to SVD post processing to change size of plot
Sep 16, 2025
83cca4d
New feature: diff_slice in visualization. Slice/plot the various ener…
Sep 17, 2025
4e1c2dc
Tweaked the plotting offset for the svdplot function. Multiplied the …
Sep 18, 2025
59bdebe
Fixed rotation for diagnostics xes_ROI which was broken. Added a thir…
Sep 18, 2025
fd6b27c
Rename new feature notebook
Sep 18, 2025
e5c6784
Updated new features notebook to show xes ROI improved features
Sep 18, 2025
d43d837
New feature: Added method to XASBatchAnalysis to pickle/save analysis…
Sep 19, 2025
a3325f6
Adjusted how standard deviation gets calculated - fisrt in reduce_det…
Sep 25, 2025
47b291c
Removed .ipynb_checkpoints folder
Sep 25, 2025
fc51b09
Merge branch 'master' into Droplet_Analysis_Working
rribson Sep 25, 2025
6c602ad
Merge pull request #51 from lg345/Droplet_Analysis_Working
rribson Sep 25, 2025
33e082b
For XES batch analysis rotation primary analysis: added option to giv…
Sep 25, 2025
f7c741b
testing diagnostics commit
Sep 25, 2025
453a575
Retesting commit
Sep 25, 2025
3cee321
Merge pull request #52 from lg345/Droplet_Analysis_Working
rribson Sep 25, 2025
b4dcc3a
Added check for self.crystal_dict in controller. If it exists it will…
Oct 6, 2025
681b4f7
Fixed pixels_to_patch and patch_pixels. The behavior before was to se…
Oct 6, 2025
4fcfa30
Reorganized some of the status messages to make more sense in the con…
Oct 7, 2025
b14b584
1. Updates to the controller primary_analysis_parallel_range method. …
Oct 10, 2025
2891d44
Updated README link to docs page
Oct 10, 2025
e1a4f6e
Adding XSpect_XES_examples.ipynb notebook bc I suspect its causing an…
Oct 10, 2025
e3ca65c
Merge branch 'jtb' into master
jtbabicz Oct 10, 2025
5d97d9d
Revert "Merge branch 'jtb' into master"
Oct 10, 2025
68f23cb
Removed vim tmp file
Oct 15, 2025
41f1649
(1) Moved code in controller primary_analysis_parallel_range combinin…
Oct 15, 2025
2b3ac6e
Added averaging all laser off across time bins option
Oct 16, 2025
65643a4
Propogated error for averaging all laser off
Oct 16, 2025
010b712
Removing empty file
Oct 16, 2025
0387bcd
Updated diff_slice to include error bars.
Oct 16, 2025
fc1a84c
Bug in update status string formating during the handling of ROI/angl…
Oct 17, 2025
72826ac
Same bug as previous commit with the type error with string formatting.
Oct 17, 2025
976875b
Fixed bugs Leland outlined in https://github.com/lg345/XSpect/issues/…
Oct 30, 2025
d465bd3
To post processing svdplot: (1) added xlims optional parameter (2) re…
Oct 31, 2025
6afe6d0
Analysis and controller currently working for XAS analysis, represent…
Feb 25, 2026
345ed7a
re staging files to push
Apr 8, 2026
f3d490f
Currently ScanAnalysis_1D_XES can be run, it's not compatible with pa…
May 5, 2026
522767f
Added class in Analysis module for spectrum derivative analyzer for f…
May 22, 2026
042d513
Merge pull request #90 from lg345/xcs101237825
rribson May 22, 2026
c6cd924
Phase 1A: YAML pipeline architecture infrastructure (issue #82)
lbgee Jun 5, 2026
84b0ad7
Add __pycache__ and .coverage to .gitignore, remove cached pyc files
lbgee Jun 5, 2026
1f2343e
Phase 1B+1C: Register analysis steps and prove XES/XAS workflows end-…
lbgee Jun 5, 2026
ebfa2e4
Update orchestrator log for Phase 1B-1C completion
lbgee Jun 5, 2026
7674356
Add YAML pipeline user guide: structure, steps, and workflow examples
lbgee Jun 5, 2026
bf0496c
Register rotate_detector step, add mfx101080524 example YAML
lbgee Jun 16, 2026
6976432
Close h5py handle after data load to allow multiprocessing pickling
lbgee Jun 16, 2026
58fe672
Fix pipeline step ordering to match old controller workflow
lbgee Jun 17, 2026
80c1b57
Fix batch parallelism, energy calibration, and spatial reduction for …
lbgee Jun 19, 2026
34fa6c4
Add regression test suite with saved reference arrays for ultrafast a…
lbgee Jun 19, 2026
fd9e12c
Add ultrafast XES validation notebook and update example notebooks
lbgee Jun 19, 2026
93cc74b
Exclude examples/results/ HDF5 output from version control
lbgee Jul 1, 2026
af1800a
Add abs HDF5 indices and precomputed_attrs injection to batch manager
lbgee Jul 1, 2026
cdd57ed
Add scalar pre-pipeline pass, max_shots limit, and _collect_scalar_pr…
lbgee Jul 1, 2026
8627e93
Add droplet_reconstruction step for sparse photon-counting HDF5 layouts
lbgee Jul 1, 2026
b2d42db
Overhaul patch_pixels with auto-detection and vectorized fit; add fin…
lbgee Jul 1, 2026
0c19782
Fix CCM/temporal binning: 3D detector support, NaN handling, ccm_ener…
lbgee Jul 1, 2026
918da88
Add patch_pixels auto-detect tests and update polynomial patching tol…
lbgee Jul 1, 2026
71fbe63
Add XCS xcs101591326 ultrafast/temporal/2D XAS pipeline configs and a…
lbgee Jul 1, 2026
ae358b6
Add MFX mfx101609126 per-shot XES, static RIXS, SEER, and droplet pip…
lbgee Jul 1, 2026
273f659
Add MFX mfx101609126 diagnostic and stochastic RIXS analysis notebooks
lbgee Jul 1, 2026
6cb4e78
Add droplet reconstruction evaluation scripts and pipeline notebooks
lbgee Jul 1, 2026
38134f4
Misc updates: remove hitfinding from mfx101080524 YAML, add diagnosti…
lbgee Jul 1, 2026
e38b397
Droplet reconstruction, patch_pixels auto-detect, XAS fixes, and XCS/…
lg345 Jul 1, 2026
15a3a8f
mfx102101026 Fe XES/XAS speciation pipeline: import-time ROI, logging…
lbgee Jul 15, 2026
1a3deb6
Add XSpect-setup-XES skill; native droplet_reconstruction workflow fo…
lbgee Jul 16, 2026
87e7a1a
XSpect-setup-XES: add HDF5 key identification phase with detector-nam…
lbgee Jul 16, 2026
349766b
Add filter_detector_variance step as sklearn alternative to ADU filte…
lbgee Jul 16, 2026
2220ef4
Document filter_detector_variance in YAML pipeline guide
lbgee Jul 16, 2026
98115f4
Merge variance-threshold detector filtering (#36)
lbgee Jul 16, 2026
21ddffb
Merge mfx102101026 (Ferricyanide XES) into feature/yaml-pipeline-arch…
lbgee Jul 16, 2026
f62bb26
Merge remote-tracking branch 'origin/master' into feature/yaml-pipeli…
lbgee Jul 16, 2026
dcfacd4
Merge pull request #100 from lg345/feature/yaml-pipeline-architecture
lg345 Jul 16, 2026
f047fce
Add Q2 review doc and rewrite README for YAML architecture
lbgee Jul 16, 2026
e01b0f6
Add requirements.txt with core runtime dependencies
lbgee Jul 16, 2026
ee237cf
Disclose XES-setup templates, de-dupe guardrails
lbgee Jul 16, 2026
fb7bbd9
Consolidate docs on MkDocs, deploy from master
lbgee Jul 16, 2026
3350ba6
Add common_mode_correction and subtract_polynomial_background steps
lbgee Jul 17, 2026
3bdc04a
Merge pull request #103 from lg345/feature/detector-common-mode-and-b…
lg345 Jul 17, 2026
aa7b75c
Add detailed step reference docs, grouped by category
lbgee Jul 17, 2026
2e3f802
Merge pull request #104 from lg345/docs/step-reference
lg345 Jul 17, 2026
fd50fbb
Add a YAML example to every step reference entry
lbgee Jul 17, 2026
684d622
Nest step reference and source under YAML pipeline; add example confi…
lbgee Jul 17, 2026
395b468
Merge pull request #105 from lg345/docs/step-examples
lg345 Jul 17, 2026
2994ec7
Merge pull request #106 from lg345/docs/pipeline-nav-examples
lg345 Jul 17, 2026
8bad4e9
new calibration mode up to Zr using foil emission energies
lbgee Jul 18, 2026
b6555b1
Add optional smalldata_dir override to experiment config
lbgee Jul 20, 2026
42b4f76
Add subtract_spatial_background pipeline step
lbgee Jul 21, 2026
03bb207
Add make_eventcode_mask pipeline step
lbgee Jul 24, 2026
93dc7f3
Merge pull request #107 from lg345/mfx102101026
lg345 Jul 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed .DS_Store
Binary file not shown.
46 changes: 0 additions & 46 deletions .github/workflows/build_versioned_mkdocs.yml

This file was deleted.

27 changes: 27 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: docs

on:
push:
branches: [master]
workflow_dispatch:

permissions:
contents: write

jobs:
build-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version: "3.12"
# Runtime deps so mkdocstrings can import the package for API docs.
- run: pip install -r requirements.txt
- run: pip install mkdocs mkdocs-material "mkdocstrings[python]"
# Non-strict: legacy-module docstrings emit griffe param-mismatch warnings
# that should not block the public deploy.
- run: mkdocs build
- run: mkdocs gh-deploy --force
17 changes: 16 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,19 @@
# ignore jupyter temp files
.ipynb_checkpoints/
Controller_Plans.ipynb
./examples/.ipynb_checkpoints/
XSpect_XES_examples.ipynb
*.swp
XSpect/*.swp

# Python bytecode
__pycache__/
*.pyc

# Coverage
.coverage

# Pipeline output data (HDF5 results, large arrays)
examples/results/

# MkDocs generated site
site/
199 changes: 199 additions & 0 deletions CONTEXT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
# XSpect Domain Glossary

## Core Entities

**Experiment** — An LCLS beamtime allocation identified by hutch + experiment_id + LCLS run number. Maps to a directory on S3DF containing smalldata HDF5 files.

**Run** — A numbered data collection within an experiment. Each run produces one HDF5 file containing shot-by-shot detector and diagnostic data. Not the same as an "LCLS run" (which is the beamtime allocation).

**Shot** — A single XFEL pulse event. Each shot produces one detector frame and associated diagnostic scalar values. Shots are classified by light status (xray, laser, or simultaneous).

**Shot Mask** — A boolean array over all shots in a run indicating which shots satisfy a given condition (e.g., `xray`, `laser`, `simultaneous`, or a filtered subset).

**Detector Key** — An HDF5 dataset path for a 2D area detector (e.g., ePix). Large, loaded per-batch with memory management.

**Diagnostic Key** — An HDF5 dataset path for a 1D scalar array (e.g., IPM intensity, encoder position, time tool correction). Small, loaded immediately.

## Analysis Concepts

**Pipeline** — An ordered list of analysis steps applied to each shot batch. Defined in YAML. Executed in order, no conditionals.

**Step** — A single registered analysis operation that reads from and writes to `run.results`. Stateless. All parameters from YAML.

**Reduction** — A post-pipeline operation that receives results from all batches/runs and produces aggregate outputs (e.g., summed spectra, normalized differences).

**Results Dict** — Flat dictionary on the run object (`run.results`) holding all intermediate and final data products. Keys are dot-separated strings.

**Batch** — A contiguous range of shots within a run, processed as a unit on one core. The controller splits runs into batches for parallelism and reconverges results afterward. Batch size is an operational parameter, not a scientific one.

## Instrument Concepts

**von Hamos Geometry** — A dispersive X-ray spectrometer geometry using a cylindrically bent crystal. Defines the mapping from detector pixel position to photon energy via crystal d-spacing, crystal radius, and detector distance.

**ROI (Region of Interest)** — A pixel range on the detector selected for analysis. Multiple ROIs can be defined and either combined or processed separately.

**ADU Threshold** — Analog-to-digital unit cutoff applied to detector pixels. Pixels below the threshold are zeroed to remove electronic noise.

**CCM (Channel-Cut Monochromator)** — Upstream monochromator that selects incident X-ray energy for XAS measurements. Defines the energy axis for absorption spectroscopy.

## Shot Classification

**xray** — Shots where the X-ray beam was on (from `lightStatus/xray`).

**laser** — Shots where the optical laser was on (from `lightStatus/laser`).

**simultaneous** — Shots where both xray AND laser were on. Used for pump-probe "laser-on" signal.

**xray_not_laser** — Shots where xray was on but laser was off. Used for pump-probe "laser-off" reference.

## Data Reduction Operations

**Union** — Select shots from a data array where multiple masks are simultaneously true (logical AND). E.g., "give me epix frames that are both simultaneous and laser."

**Separate** — Select shots where one mask is true and another is false (A AND NOT B). E.g., "give me epix frames that are xray but NOT laser."

**Temporal Reduction** — Bin shot-level data into time delay bins using timing diagnostics (laser delay stage + encoder + time tool correction).

**Spatial Reduction** — Collapse a spatial detector dimension by summing within ROIs.

**CCM Reduction** — Bin shot-level data into incident energy bins defined by monochromator positions.

---

## Architecture Overhaul: YAML-Driven Pipeline (Issue #82)

### Goal

Replace the 6 controller subclasses (`XESBatchAnalysis`, `XESBatchAnalysisRotation`, `XASBatchAnalysis`, `XASBatchAnalysis_1D_ccm`, `XASBatchAnalysis_1D_time`, `ScanAnalysis_1D`, `ScanAnalysis_1D_XES`) with a single generic `Pipeline` class that dispatches analysis steps from a YAML recipe. One YAML file = one reproducible analysis workflow.

### Target Module Layout

```
XSpect/
├── __init__.py
├── model/
│ ├── experiment.py # experiment, spectroscopy_experiment
│ ├── run.py # spectroscopy_run (results dict interface)
│ └── von_hamos.py # vonHamos crystal geometry
├── analysis/
│ ├── registry.py # @register_step, @register_reduction, dispatch
│ ├── spectroscopy.py # base operations (filter, union, separate, reduce)
│ ├── xes.py # XES-specific steps (normalize, energy axis, combine)
│ └── xas.py # XAS-specific steps (ccm axis, ccm binning)
├── controller/
│ ├── config_parser.py # YAML parsing + validation
│ ├── pipeline_runner.py # step dispatch loop + reduction orchestration
│ └── batch_manager.py # shot chunking, multiprocessing, reconvergence
├── visualization/
├── diagnostics/
└── postprocessing/
```

### Phase Structure (with dependencies)

```
Phase 1: MVP (Static XES end-to-end)
├── 1A: Core Infrastructure (#84)
│ ├── model/run.py — spectroscopy_run with self.results = {}
│ ├── model/experiment.py — move experiment classes as-is
│ ├── analysis/registry.py — @register_step, @register_reduction, dispatch
│ ├── controller/config_parser.py — YAML parse + section validation
│ ├── controller/pipeline_runner.py — dispatch loop (pipeline then reductions)
│ ├── controller/batch_manager.py — shot chunking + Pool + reconvergence
│ └── Pipeline class — from_yaml(), run(), results
│ Dependencies: None (foundational)
├── 1B: Register Static XES Steps (#85)
│ ├── filter_shots — threshold filter on diagnostic key
│ ├── union_shots — combine masks (AND)
│ ├── separate_shots — exclude masks (A AND NOT B)
│ ├── filter_detector_adu — zero pixels below threshold
│ ├── reduce_detector_shots — sum detector across shot dimension
│ ├── reduce_detector_spatial — ROI reduction of spatial dimension
│ ├── apply_roi — apply ROI mask
│ ├── rotate — scipy.ndimage.rotate wrapper
│ ├── patch_pixels — bad pixel interpolation
│ └── hit_finding — event detection + filter
│ Dependencies: 1A (registry must exist)
└── 1C: Static XES Integration (#86)
├── Example YAML config (xcsp23820_static.yaml)
├── model/von_hamos.py — move vonHamos class
├── Numerical validation — old path vs new path on same data
└── combine_runs reduction — basic cross-run summation
Dependencies: 1A + 1B (all steps registered, pipeline runnable)

Phase 2: Time-Resolved XES (#87)
├── New pipeline steps:
│ ├── time_binning — bin shots by delay stage + encoder + TT
│ ├── reduce_detector_temporal — bin detector into time bins
│ ├── normalize_xes — area-normalize XES spectra
│ ├── make_energy_axis — energy from von Hamos geometry
│ └── droplet_reconstruction — sparse-to-dense detector reconstruction
├── New reduction steps:
│ ├── combine_runs (full) — sum across runs with uncertainty propagation
│ ├── normalize_combined — normalize laser-on/off
│ └── compute_difference — normalized difference spectra
└── Dependencies: Phase 1 complete (1C passes validation)

Phase 3: XAS Pipelines (#88)
├── New pipeline steps:
│ ├── make_ccm_axis — CCM energy bins from setpoints
│ ├── ccm_binning — digitize shots into CCM bins
│ ├── reduce_detector_ccm — 1D XAS (energy only)
│ ├── reduce_detector_ccm_temporal — 2D XAS (energy + time)
│ └── bin_uniques — bin by arbitrary scan variable
├── Workflows replaced:
│ ├── XASBatchAnalysis → 2D YAML
│ ├── XASBatchAnalysis_1D_ccm → energy-only YAML
│ └── XASBatchAnalysis_1D_time → time-only YAML
└── Dependencies: Phase 2 complete (time_binning shared with XAS time-resolved)

Phase 4: Cleanup + Full Migration (#89)
├── Scan analysis:
│ └── reduce_det_scanvar — bin by arbitrary scan variable
├── PostProcessing integration:
│ └── Port fitting/kinetics as registered steps or standalone utilities
├── Visualization refactor:
│ └── Read from run.results dict, not getattr(run, key)
├── Deletion:
│ └── Remove XSpect_Controller.py (all subclasses dead)
└── Dependencies: Phases 1-3 complete (all analysis paths ported)
```

### Dependency Graph (critical path)

```
1A ──→ 1B ──→ 1C ──→ Phase 2 ──→ Phase 3 ──→ Phase 4
│ │
└── shares time_binning ──┘
```

Critical path: registry.py (1A) → step registration (1B) → integration test (1C). Everything after Phase 1 is incremental step additions with the same pattern.

### Design Decisions

| Decision | Resolution |
|----------|-----------|
| Pipeline model | Flat ordered list, top-to-bottom, no conditionals |
| Step dispatch | Registry via `@register_step(name)` decorator |
| Run state | `run.results` flat dict, dot-separated keys |
| `on:` field | String passed to step; step interprets (mask name, detector key, or derived key) |
| Parallelism | Transparent. `batch_size`/`cores` at runtime, not in YAML |
| Reduction lifecycle | `Pipeline.run()` executes two phases: batch-parallel pipeline, then serial reduction across all runs |
| Backwards compat | Old imports remain via shim `__init__.py` until Phase 4 deletes them |
| Test data | Small synthetic HDF5 fixture committed to `tests/fixtures/` for unit tests |
| YAML validation | Steps self-describe expected args; config_parser raises on unknown step names or missing required fields |
| Notebook interface | `Pipeline.from_yaml(path).run(cores=16, batch_size=2000)` |
Loading
Loading