API Reference¶
Core Types¶
FilmScan¶
Scanned film with RGB channels normalized to [0, 1].
from chromadose.core.types import FilmScan
film = FilmScan(red=red_array, green=green_array, blue=blue_array, dpi=72.0)
film.shape # (H, W)
film.rgb # (H, W, 3)
film.pixel_size_mm # 25.4 / dpi
DoseMap¶
Result of film-to-dose conversion.
dose_map.dose # (H, W) dose in Gy
dose_map.uncertainty # (H, W) per-pixel uncertainty
dose_map.dose_r # (H, W) red channel dose
dose_map.dose_g # (H, W) green channel dose
dose_map.dose_b # (H, W) blue channel dose
dose_map.method # str
dose_map.metadata # dict
Calibration¶
Facade for building and managing calibrations.
import chromadose as cd
cal = cd.Calibration.from_arrays(doses, red_pixels, green_pixels, blue_pixels)
cal.save("cal.json")
cal = cd.Calibration.load("cal.json")
cal.result # CalibrationResult with .red, .green, .blue FitParams
cal.summary() # Human-readable summary string
cal.plot_curves() # matplotlib figure
FitParams¶
Rational function parameters for one channel: pixel(D) = (r + sD) / (t + D)
params.pixel(dose_array) # predict pixel values
params.dose(pixel_array) # invert to dose
params.dpixel_ddose(dose_array) # derivative
Methods¶
MickeSolver¶
MayerSolver¶
MultigaussianSolver¶
from chromadose.methods import MultigaussianCalibration, MultigaussianSolver
mg_cal = MultigaussianCalibration(doses, pixel_samples)
solver = MultigaussianSolver(mg_cal)
dose_map = solver.solve(film, calibration_result)
dose_map = solver.solve_6channel(film, pre_film, calibration_result)
ANNSolver¶
from chromadose.methods import ANNCalibration, ANNSolver
ann_cal = ANNCalibration(n_hidden=32, n_ensemble=5)
ann_cal.fit(pixels, doses)
solver = ANNSolver(ann_cal)
dose_map = solver.solve(film, calibration_result)
Analysis¶
gamma_2d()¶
from chromadose.analysis import gamma_2d
result = gamma_2d(reference, evaluated, dose_criteria=3.0, distance_criteria_mm=3.0)
result.pass_rate # float [0, 1]
result.gamma_map # (H, W) array
Profile Functions¶
from chromadose.analysis import extract_row_profile, compare_profiles
profile = extract_row_profile(dose, row=100, pixel_size_mm=1.0)
comp = compare_profiles(ref_profile, eval_profile)
Registration¶
from chromadose.analysis import register_auto, register_manual
result = register_auto(reference, evaluated, pixel_size_mm=1.0)
result.registered # aligned dose map
I/O¶
DICOM Import¶
from chromadose.io.dicom import load_dicom_dose, resample_to_film
rt_dose = load_dicom_dose("rtdose.dcm")
resampled = resample_to_film(rt_dose, film_shape=(500, 500), film_pixel_size_mm=0.353)
PDF Reports¶
from chromadose.io import generate_report
generate_report("report.pdf", dose_map, gamma_result=gamma, profiles=[comp])