dose_cv_from_sizes — DRIVE doseunif op

• Data kinds: any × scalar × scalar → table

• Call: import fullseye as fs; fs.ledger.dose_cv_from_sizes(sizes, dose_mg: 'float', density: 'float', estimator: 'str | None' = None, frame=None, ci: 'float' = 0.9, n_boot: 'int' = 400, seed: 'int' = 0) -> 'dict' (to call the implementation directly, import doseunif; doseunif.dose_cv_from_sizes(sizes, dose_mg: 'float', density: 'float', estimator: 'str | None' = None, frame=None, ci: 'float' = 0.9, n_boot: 'int' = 400, seed: 'int' = 0) -> 'dict'; from the registry, opsdrive.get("dose_cv_from_sizes"))

Usage

Content CV of 1 dose from measured particle sizes (particle-count fluctuation only, Poisson), with its bias and interval.

sizes comes in 2 forms:

• 1-D array = a sample of number-based particle diameters [µm] (e.g. diameters of grind.particle_image_d50). estimator: "lognormal" (default —— D63 = exp(m + 4.5 v) from the mean and variance of ln d) / "moment" (D63³ = Σd⁶/Σd³ as is. The mean is unbiased, but it is dominated by a few large particles and the median comes out low). Passing frame = (H_px, W_px, pitch_um) corrects the loss of large particles in a measurement that discards particles touching the border (particle_image_d50 of border="exclude": particles on the outer-ring pixels are discarded) with the Miles–Lantuéjoul weight 1 / (((H−2)p − d)((W−2)p − d)) (omitting it gives about −5 % on average, see the module header). Intervals: percentile bootstrap at ci (two-sided) (n_boot times, both estimators) and the lognormal delta method (Kish's effective number n_eff, Var ln CV = (9v/n_eff + 364.5 v²/(n_eff − 1))/4).

• dict (edges, volume) = a volume-based table from laser diffraction (grind.particle_size_read / grind.particle_size_synth). estimator: "histogram" (default —— the identity D63³ = E_v[d³] by integrating each bin as "uniform in ln d", assuming no distribution shape) / "lognormal" (σ = ln(D84/D16)/2, D63 = D50 exp(1.5σ²)). The table has no particle count, so no sample interval is given (ci_bootstrap is None). coarse_share = the share of E_v[d³] contributed by the bins above D90 (degree of dependence on the coarse tail).

Returns: cv (chosen estimator), d63, per-estimator cv_* and d63_*, sigma_ln, d_number_median (sample) / d50_volume (table), particles_per_dose, n and n_eff, top1pct_share_d6 (sample: share of Σd⁶ taken by the largest 1 % of particles), ci_bootstrap and ci_delta, estimator, source ("sample" / "psd"), edge_corrected. Raises ValueError: fewer than 10 particles, non-finite or non-positive, broken table (same checks as grind.particle_size_dx), particles that do not fit in frame, misspelling.

References (sample data, literature)

• Sample-data catalog (download URLs / licences) — 2-D uses skimage.data (BSD/public domain) plus synthetic images; 3-D lists download URLs for real data sources (Stanford, PDS, …).

• Operator provenance and references — the sources of the research/methods this op family came from.

• The canonical algorithm (author, year) and its uses are named in the family usage guide above.

Runnable examples (verified samples that actually call this op)

• poc_dose_uniformity_from_grinding — py -3.11 examples/poc_dose_uniformity_from_grinding.py

Ops the type connects to (they accept table as input)

course_layout · course_occupancy · course_contains · world_build · world_camera · world_move · lidar_scan · rss_longitudinal_same

Same category (doseunif)

dose_cv_lognormal · grind_time_for_dose_cv


*Provenance: doseunif.py — DRIVE operator registry. This per-op note is generated by tools/opdocs.py md (do not hand-edit).*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.