Metrics API¶
This module contains core functions for dose analysis, DVH computation, quality metrics, and plan comparison.
DVH Module¶
dvh ¶
Dose-Volume Histogram (DVH) computation and analysis.
This module provides functions for computing DVHs and extracting DVH-based metrics such as volume at dose (VX) and dose at volume (DX).
Classes¶
Functions¶
compute_dvh ¶
compute_dvh(dose: Dose, structure: Structure, max_dose: Optional[float] = None, step_size: float = 0.1) -> Tuple[np.ndarray, np.ndarray]
Compute dose-volume histogram for a structure.
A DVH shows the percentage of structure volume that receives at least a given dose level.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure
|
Structure
|
Structure to compute DVH for |
required |
max_dose
|
Optional[float]
|
Maximum dose for histogram bins (auto-detect if None) |
None
|
step_size
|
float
|
Bin width in Gy |
0.1
|
Returns:
| Type | Description |
|---|---|
ndarray
|
Tuple of (dose_bins, volume_percentages) |
ndarray
|
|
Tuple[ndarray, ndarray]
|
|
Examples:
>>> from dosemetrics.dose import Dose
>>> from dosemetrics.metrics import dvh
>>>
>>> dose = Dose.from_dicom("rtdose.dcm")
>>> ptv = structures.get_structure("PTV")
>>>
>>> dose_bins, volumes = dvh.compute_dvh(dose, ptv)
>>>
>>> # Plot DVH
>>> import matplotlib.pyplot as plt
>>> plt.plot(dose_bins, volumes)
>>> plt.xlabel("Dose (Gy)")
>>> plt.ylabel("Volume (%)")
Source code in src/dosemetrics/metrics/dvh.py
compute_volume_at_dose ¶
Compute percentage of structure receiving at least the dose threshold.
This computes VX where X is the dose threshold (e.g., V20 = % volume >= 20 Gy).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure
|
Structure
|
Structure to analyze |
required |
dose_threshold
|
float
|
Dose threshold in Gy |
required |
Returns:
| Type | Description |
|---|---|
float
|
Percentage of volume (0-100) receiving >= dose_threshold |
Examples:
>>> # V20: percentage of lung receiving >= 20 Gy
>>> v20 = compute_volume_at_dose(dose, lung, 20.0)
>>> print(f"V20: {v20:.1f}%")
>>>
>>> # V5: percentage of heart receiving >= 5 Gy
>>> v5 = compute_volume_at_dose(dose, heart, 5.0)
Source code in src/dosemetrics/metrics/dvh.py
compute_dose_at_volume ¶
Compute dose received by a given percentage of structure volume.
This computes DX where X is the volume percentage (e.g., D95 = dose to 95% of volume).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure
|
Structure
|
Structure to analyze |
required |
volume_percent
|
float
|
Volume percentage (0-100) |
required |
Returns:
| Type | Description |
|---|---|
float
|
Dose in Gy that the specified volume percentage receives |
Raises:
| Type | Description |
|---|---|
ValueError
|
If volume_percent is not in range 0-100 |
Examples:
>>> # D95: dose covering 95% of PTV
>>> d95 = compute_dose_at_volume(dose, ptv, 95)
>>> print(f"D95: {d95:.2f} Gy")
>>>
>>> # D_0.1cc for OAR (requires volume in cc conversion)
>>> # For now, use percentile approximation
>>> d_max = compute_dose_at_volume(dose, brainstem, 0.1)
Source code in src/dosemetrics/metrics/dvh.py
compute_dose_at_volume_cc ¶
Compute dose received by a given absolute volume in cc.
This computes D_Xcc (e.g., D_0.1cc = dose to hottest 0.1 cc).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure
|
Structure
|
Structure to analyze |
required |
volume_cc
|
float
|
Absolute volume in cubic centimeters |
required |
Returns:
| Type | Description |
|---|---|
float
|
Dose in Gy received by the specified volume |
Examples:
>>> # D_0.1cc: dose to hottest 0.1 cc (common OAR metric)
>>> d_0_1cc = compute_dose_at_volume_cc(dose, brainstem, 0.1)
>>> print(f"D_0.1cc: {d_0_1cc:.2f} Gy")
Source code in src/dosemetrics/metrics/dvh.py
compute_equivalent_uniform_dose ¶
Compute Equivalent Uniform Dose (EUD).
EUD = (mean(D_i^a))^(1/a)
The a-parameter depends on tissue type: - a < 0 for tumors (emphasizes cold spots) - a > 0 for normal tissues (emphasizes hot spots)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure
|
Structure
|
Structure to analyze |
required |
a_parameter
|
float
|
Tissue-specific parameter |
required |
Returns:
| Type | Description |
|---|---|
float
|
Equivalent uniform dose in Gy |
References
Niemierko, Med Phys 1997
Examples:
>>> # For tumor (emphasize underdosage)
>>> eud_tumor = compute_equivalent_uniform_dose(dose, ptv, a_parameter=-10)
>>>
>>> # For OAR (emphasize overdosage)
>>> eud_oar = compute_equivalent_uniform_dose(dose, brainstem, a_parameter=5)
Source code in src/dosemetrics/metrics/dvh.py
create_dvh_table ¶
create_dvh_table(dose: Dose, structure_set: StructureSet, structure_names: Optional[list] = None, max_dose: Optional[float] = None, step_size: float = 0.1) -> pd.DataFrame
Create DVH table for multiple structures in long format.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure_set
|
StructureSet
|
StructureSet containing structures |
required |
structure_names
|
Optional[list]
|
List of structure names to include (optional) |
None
|
max_dose
|
Optional[float]
|
Maximum dose for bins |
None
|
step_size
|
float
|
Dose bin width in Gy |
0.1
|
Returns:
| Type | Description |
|---|---|
DataFrame
|
DataFrame with columns [Dose, Structure, Volume] |
Examples:
>>> dvh_df = create_dvh_table(dose, structures,
... structure_names=["PTV", "Brainstem", "SpinalCord"])
>>> dvh_df.to_csv("dvh_data.csv")
Source code in src/dosemetrics/metrics/dvh.py
extract_dvh_metrics ¶
extract_dvh_metrics(dose: Dose, structure: Structure, dose_thresholds: Optional[list] = None, volume_percentages: Optional[list] = None) -> Dict[str, float]
Extract common DVH metrics for a structure.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure
|
Structure
|
Structure to analyze |
required |
dose_thresholds
|
Optional[list]
|
List of dose levels for VX metrics (Gy) |
None
|
volume_percentages
|
Optional[list]
|
List of volume percentages for DX metrics |
None
|
Returns:
| Type | Description |
|---|---|
Dict[str, float]
|
Dictionary with DVH metrics |
Examples:
>>> metrics = extract_dvh_metrics(
... dose, ptv,
... dose_thresholds=[20, 40, 60],
... volume_percentages=[2, 50, 95, 98]
... )
>>> print(metrics)
{'V20': 98.5, 'V40': 97.2, 'V60': 95.8, 'D2': 63.5, 'D50': 60.2, ...}
Source code in src/dosemetrics/metrics/dvh.py
compute_dose_statistics ¶
Compute comprehensive dose statistics for a structure.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure
|
Structure
|
Structure to analyze |
required |
Returns:
| Type | Description |
|---|---|
Dict[str, float]
|
Dictionary with statistics including: |
Dict[str, float]
|
|
Dict[str, float]
|
|
Examples:
>>> from dosemetrics.dose import Dose
>>> from dosemetrics.structure_set import StructureSet
>>> from dosemetrics.metrics import dvh
>>>
>>> dose = Dose.from_dicom("rtdose.dcm")
>>> structures = StructureSet(...)
>>> ptv = structures.get_structure("PTV")
>>>
>>> stats = dvh.compute_dose_statistics(dose, ptv)
>>> print(f"Mean dose: {stats['mean_dose']:.2f} Gy")
>>> print(f"D95: {stats['D95']:.2f} Gy")
Source code in src/dosemetrics/metrics/dvh.py
compute_mean_dose ¶
Compute mean dose in structure.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure
|
Structure
|
Structure to analyze |
required |
Returns:
| Type | Description |
|---|---|
float
|
Mean dose in Gy |
Source code in src/dosemetrics/metrics/dvh.py
compute_max_dose ¶
Compute maximum dose in structure.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure
|
Structure
|
Structure to analyze |
required |
Returns:
| Type | Description |
|---|---|
float
|
Maximum dose in Gy |
Source code in src/dosemetrics/metrics/dvh.py
compute_min_dose ¶
Compute minimum dose in structure.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure
|
Structure
|
Structure to analyze |
required |
Returns:
| Type | Description |
|---|---|
float
|
Minimum dose in Gy |
Source code in src/dosemetrics/metrics/dvh.py
compute_median_dose ¶
Compute median dose in structure.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure
|
Structure
|
Structure to analyze |
required |
Returns:
| Type | Description |
|---|---|
float
|
Median dose in Gy |
Source code in src/dosemetrics/metrics/dvh.py
compute_dose_percentile ¶
Compute dose percentile (DX).
D95 means 95% of the volume receives at least this dose. This corresponds to the 5th percentile of the dose distribution.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
structure
|
Structure
|
Structure to analyze |
required |
percentile
|
float
|
Volume percentage (0-100). For D95, use percentile=95 |
required |
Returns:
| Type | Description |
|---|---|
float
|
Dose in Gy that the specified percentage of volume receives |
Raises:
| Type | Description |
|---|---|
ValueError
|
If percentile is not in range 0-100 |
Examples:
>>> # D95: dose received by 95% of volume
>>> d95 = compute_dose_percentile(dose, ptv, 95)
>>>
>>> # D50: median dose
>>> d50 = compute_dose_percentile(dose, ptv, 50)
>>>
>>> # D05: near-maximum dose (hot spot)
>>> d05 = compute_dose_percentile(dose, ptv, 5)
Source code in src/dosemetrics/metrics/dvh.py
Conformity Module¶
conformity ¶
Conformity indices for target coverage evaluation.
This module provides various conformity indices used to evaluate how well the prescription isodose conforms to the target volume. These metrics are critical for assessing treatment plan quality.
Classes¶
Functions¶
compute_conformity_index ¶
Compute Conformity Index (CI).
CI = V_target_rx / V_rx
Where: - V_target_rx = volume of target receiving >= prescription dose - V_rx = total volume receiving >= prescription dose
Measures how well the prescription isodose conforms to the target. Ideal value is 1.0. Values < 1.0 indicate dose spillage outside target.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
target
|
Structure
|
Target structure (PTV, CTV, etc.) |
required |
prescription_dose
|
float
|
Prescription dose in Gy |
required |
Returns:
| Type | Description |
|---|---|
float
|
Conformity index (dimensionless, typically 0-1) |
References
ICRU Report 62 (1999)
Examples:
>>> ci = compute_conformity_index(dose, ptv, prescription_dose=60.0)
>>> print(f"Conformity Index: {ci:.3f}")
Source code in src/dosemetrics/metrics/conformity.py
compute_conformity_number ¶
Compute Conformity Number (CN) or Conformation Number.
CN = (V_target_rx / V_target) * (V_target_rx / V_rx)
Combines target coverage and dose spillage into a single metric. Ideal value is 1.0.
The first factor (V_target_rx / V_target) represents target coverage. The second factor (V_target_rx / V_rx) represents conformity.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
target
|
Structure
|
Target structure |
required |
prescription_dose
|
float
|
Prescription dose in Gy |
required |
Returns:
| Type | Description |
|---|---|
float
|
Conformity number (0-1) |
References
van't Riet et al., Int J Radiat Oncol Biol Phys 1997
Examples:
>>> cn = compute_conformity_number(dose, ptv, prescription_dose=60.0)
>>> print(f"Conformity Number: {cn:.3f}")
Source code in src/dosemetrics/metrics/conformity.py
compute_paddick_conformity_index ¶
Compute Paddick Conformity Index (CI_Paddick).
CI_Paddick = (V_target_rx)^2 / (V_target * V_rx)
This index is commonly used for radiosurgery and SBRT plans. Ideal value is 1.0.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
target
|
Structure
|
Target structure |
required |
prescription_dose
|
float
|
Prescription dose in Gy |
required |
Returns:
| Type | Description |
|---|---|
float
|
Paddick conformity index (0-1) |
References
Paddick, J Neurosurg 2000
Examples:
>>> # Often used for stereotactic radiosurgery
>>> ci_paddick = compute_paddick_conformity_index(dose, gtv, prescription_dose=18.0)
>>> print(f"Paddick CI: {ci_paddick:.3f}")
Source code in src/dosemetrics/metrics/conformity.py
compute_coverage ¶
Compute target coverage.
Coverage = V_target_rx / V_target
Percentage of target volume receiving at least the prescription dose.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
target
|
Structure
|
Target structure |
required |
prescription_dose
|
float
|
Prescription dose in Gy |
required |
Returns:
| Type | Description |
|---|---|
float
|
Coverage as fraction (0-1) or percentage if multiplied by 100 |
Examples:
>>> coverage = compute_coverage(dose, ptv, prescription_dose=60.0)
>>> print(f"Target coverage: {coverage*100:.1f}%")
Source code in src/dosemetrics/metrics/conformity.py
compute_spillage ¶
Compute dose spillage outside target.
Spillage = (V_rx - V_target_rx) / V_rx
Fraction of prescription isodose volume that is outside the target. Lower values indicate better conformity.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
target
|
Structure
|
Target structure |
required |
prescription_dose
|
float
|
Prescription dose in Gy |
required |
Returns:
| Type | Description |
|---|---|
float
|
Spillage as fraction (0-1) |
Examples:
>>> spillage = compute_spillage(dose, ptv, prescription_dose=60.0)
>>> print(f"Dose spillage: {spillage*100:.1f}%")
Source code in src/dosemetrics/metrics/conformity.py
Homogeneity Module¶
homogeneity ¶
Homogeneity indices for target dose uniformity.
This module provides metrics to assess the uniformity of dose distribution within target volumes. More homogeneous dose distributions are generally preferred for tumor control.
Classes¶
Functions¶
compute_homogeneity_index ¶
compute_homogeneity_index(dose: Dose, target: Structure, d2_percentile: float = 2.0, d98_percentile: float = 98.0) -> float
Compute Homogeneity Index (HI).
HI = (D2 - D98) / D50
Where: - D2 = dose received by 2% of volume (near-maximum) - D98 = dose received by 98% of volume (near-minimum) - D50 = median dose
Measures dose uniformity within target. Lower values indicate more homogeneous dose distribution.
Typical acceptable range: 0.05 - 0.20
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
target
|
Structure
|
Target structure (PTV, CTV, etc.) |
required |
d2_percentile
|
float
|
Upper percentile for near-max (typically 2%) |
2.0
|
d98_percentile
|
float
|
Lower percentile for near-min (typically 98%) |
98.0
|
Returns:
| Type | Description |
|---|---|
float
|
Homogeneity index (dimensionless) |
References
ICRU Report 83 (2010)
Examples:
>>> hi = compute_homogeneity_index(dose, ptv)
>>> print(f"Homogeneity Index: {hi:.3f}")
>>> if hi < 0.15:
... print("Excellent dose homogeneity")
Source code in src/dosemetrics/metrics/homogeneity.py
compute_gradient_index ¶
compute_gradient_index(dose: Dose, target: Structure, prescription_dose: float, half_prescription_volume_method: bool = True) -> float
Compute Gradient Index (GI) for dose fall-off outside target.
Two calculation methods: 1. Half-prescription volume: GI = V_50% / V_100% 2. Distance-based: Ratio of volumes at specific distances
Where: - V_100% = volume receiving >= prescription dose - V_50% = volume receiving >= 50% prescription dose
Lower values indicate steeper dose fall-off (better for sparing OARs).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
target
|
Structure
|
Target structure |
required |
prescription_dose
|
float
|
Prescription dose in Gy |
required |
half_prescription_volume_method
|
bool
|
Use V_50%/V_100% method (default True) |
True
|
Returns:
| Type | Description |
|---|---|
float
|
Gradient index (dimensionless, typically 2-8) |
References
Paddick and Lippitz, J Neurosurg 2006
Examples:
>>> gi = compute_gradient_index(dose, ptv, prescription_dose=60.0)
>>> print(f"Gradient Index: {gi:.2f}")
>>> if gi < 3.0:
... print("Excellent dose fall-off")
Source code in src/dosemetrics/metrics/homogeneity.py
compute_dose_homogeneity ¶
Compute coefficient of variation (CV) of dose within target.
CV = std_dose / mean_dose
Alternative measure of dose homogeneity. Lower values indicate more uniform dose distribution.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
target
|
Structure
|
Target structure |
required |
Returns:
| Type | Description |
|---|---|
float
|
Coefficient of variation (dimensionless) |
Examples:
Source code in src/dosemetrics/metrics/homogeneity.py
compute_uniformity_index ¶
Compute uniformity index.
UI = 1 - (D_max - D_min) / D_prescription
Values closer to 1.0 indicate better uniformity.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dose
|
Dose
|
Dose distribution object |
required |
target
|
Structure
|
Target structure |
required |
Returns:
| Type | Description |
|---|---|
float
|
Uniformity index (0-1) |
Note
Requires prescription dose in target metadata or as parameter. Currently uses median dose as approximation.
Examples:
Source code in src/dosemetrics/metrics/homogeneity.py
Geometric Module¶
geometric ¶
Geometric similarity and overlap metrics for structure comparison.
This module provides metrics to compare two structure sets, typically used for evaluating auto-segmentation algorithms or inter-observer variability.
Classes¶
Functions¶
compute_dice_coefficient ¶
Compute Dice coefficient (Sørensen-Dice index).
Dice = 2 * |A ∩ B| / (|A| + |B|)
Measures overlap between two structures. Range [0, 1], where 1 is perfect overlap.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
structure1
|
Structure
|
First structure |
required |
structure2
|
Structure
|
Second structure |
required |
Returns:
| Type | Description |
|---|---|
float
|
Dice coefficient (0-1) |
References
Dice, Ecology 1945; Sørensen, Biologiske Skrifter 1948
Examples:
>>> auto_ptv = structures_auto.get_structure("PTV")
>>> manual_ptv = structures_manual.get_structure("PTV")
>>> dice = compute_dice_coefficient(auto_ptv, manual_ptv)
>>> print(f"Dice: {dice:.3f}")
Source code in src/dosemetrics/metrics/geometric.py
compute_jaccard_index ¶
Compute Jaccard index (Intersection over Union, IoU).
Jaccard = |A ∩ B| / |A ∪ B|
Measures overlap between two structures. Range [0, 1], where 1 is perfect overlap. More conservative than Dice coefficient.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
structure1
|
Structure
|
First structure |
required |
structure2
|
Structure
|
Second structure |
required |
Returns:
| Type | Description |
|---|---|
float
|
Jaccard index (0-1) |
References
Jaccard, New Phytologist 1912
Examples:
Source code in src/dosemetrics/metrics/geometric.py
compute_volume_difference ¶
Compute absolute volume difference.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
structure1
|
Structure
|
First structure |
required |
structure2
|
Structure
|
Second structure |
required |
Returns:
| Type | Description |
|---|---|
float
|
Absolute volume difference in cubic centimeters |
Examples:
>>> vol_diff = compute_volume_difference(auto_ptv, manual_ptv)
>>> print(f"Volume difference: {vol_diff:.2f} cc")
Source code in src/dosemetrics/metrics/geometric.py
compute_volume_ratio ¶
Compute volume ratio V1/V2.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
structure1
|
Structure
|
First structure (numerator) |
required |
structure2
|
Structure
|
Second structure (denominator) |
required |
Returns:
| Type | Description |
|---|---|
float
|
Volume ratio (dimensionless) |
Examples:
Source code in src/dosemetrics/metrics/geometric.py
compute_sensitivity ¶
Compute sensitivity (recall, true positive rate).
Sensitivity = TP / (TP + FN) = |A ∩ B| / |B|
Measures how much of structure2 is covered by structure1.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
structure1
|
Structure
|
Predicted/test structure |
required |
structure2
|
Structure
|
Reference/ground truth structure |
required |
Returns:
| Type | Description |
|---|---|
float
|
Sensitivity (0-1) |
Examples:
>>> sens = compute_sensitivity(auto_structure, manual_structure)
>>> print(f"Sensitivity: {sens:.3f}")
Source code in src/dosemetrics/metrics/geometric.py
compute_specificity ¶
compute_specificity(structure1: Structure, structure2: Structure, background_mask: Optional[ndarray] = None) -> float
Compute specificity (true negative rate).
Specificity = TN / (TN + FP)
Requires definition of background/universe. If not provided, uses the bounding box union of both structures.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
structure1
|
Structure
|
Predicted/test structure |
required |
structure2
|
Structure
|
Reference/ground truth structure |
required |
background_mask
|
Optional[ndarray]
|
Mask defining the universe (optional) |
None
|
Returns:
| Type | Description |
|---|---|
float
|
Specificity (0-1) |
Examples:
>>> spec = compute_specificity(auto_structure, manual_structure)
>>> print(f"Specificity: {spec:.3f}")
Source code in src/dosemetrics/metrics/geometric.py
compute_hausdorff_distance ¶
compute_hausdorff_distance(structure1: Structure, structure2: Structure, percentile: Optional[float] = None) -> float
Compute Hausdorff distance between two structures.
If percentile is specified, computes the percentile Hausdorff distance (e.g., 95th percentile HD95), which is more robust to outliers.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
structure1
|
Structure
|
First structure |
required |
structure2
|
Structure
|
Second structure |
required |
percentile
|
Optional[float]
|
If specified, compute percentile HD (e.g., 95 for HD95) |
None
|
Returns:
| Type | Description |
|---|---|
float
|
Hausdorff distance in mm |
Examples:
>>> hd = compute_hausdorff_distance(auto_structure, manual_structure)
>>> hd95 = compute_hausdorff_distance(auto_structure, manual_structure, percentile=95)
Source code in src/dosemetrics/metrics/geometric.py
compute_mean_surface_distance ¶
Compute mean surface distance between two structures.
Average of all point-to-surface distances (symmetric).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
structure1
|
Structure
|
First structure |
required |
structure2
|
Structure
|
Second structure |
required |
Returns:
| Type | Description |
|---|---|
float
|
Mean surface distance in mm |
Source code in src/dosemetrics/metrics/geometric.py
compare_structure_sets ¶
compare_structure_sets(structure_set1: StructureSet, structure_set2: StructureSet, structure_names: Optional[list] = None) -> pd.DataFrame
Compute geometric metrics between two structure sets.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
structure_set1
|
StructureSet
|
First structure set (e.g., auto-segmentation) |
required |
structure_set2
|
StructureSet
|
Second structure set (e.g., manual segmentation) |
required |
structure_names
|
Optional[list]
|
List of structure names to compare (optional) |
None
|
Returns:
| Type | Description |
|---|---|
DataFrame
|
DataFrame with geometric metrics for each structure |
Examples:
>>> auto_structures = load_structure_set("auto/")
>>> manual_structures = load_structure_set("manual/")
>>> comparison = compare_structure_sets(auto_structures, manual_structures)
>>> print(comparison)
Source code in src/dosemetrics/metrics/geometric.py
Usage Examples¶
Computing a Basic DVH¶
from dosemetrics import Dose, Structure
from dosemetrics.metrics.dvh import compute_dvh
dose = Dose.from_nifti("dose.nii.gz")
structure = Structure.from_nifti("ptv.nii.gz", name="PTV")
dvh = compute_dvh(
dose=dose,
structure=structure,
bins=1000
)
Calculating Quality Metrics¶
from dosemetrics import Dose, Structure
from dosemetrics.metrics.conformity import compute_conformity_index
from dosemetrics.metrics.homogeneity import compute_homogeneity_index
from dosemetrics.metrics.dvh import compute_dose_statistics
# Conformity Index
ci = compute_conformity_index(
dose=dose,
target=ptv,
prescription_dose=60.0
)
# Homogeneity Index
hi = compute_homogeneity_index(
dose=dose,
target=ptv
)
# Dose Statistics
stats = compute_dose_statistics(
dose=dose,
structure=ptv
)
Comparing Dose Distributions¶
from dosemetrics import Dose, StructureSet
from dosemetrics.utils.comparison import compare_dose_distributions
# Compare dose distributions across multiple structures
comparison_df = compare_dose_distributions(
dose1=dose_tps,
dose2=dose_predicted,
structure_set=structures,
structure_names=["PTV", "Heart", "Lung_L"],
output_file="comparison.pdf"
)
See Also¶
- I/O Module - Loading and saving data
- Utils Module - Plotting and compliance checking
- User Guide: DVH Analysis
- User Guide: Quality Metrics