From 0e020e207591a208828c41166140d5ba61043c72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Coussat?= Date: Wed, 19 Aug 2026 16:56:23 +0200 Subject: [PATCH 1/2] ENH: Adapt pctbinning.py to use HoleFillingImageFilter Mimick commit 81676eb10a64b1b7473691ae356f874069f624e8 --- applications/pctbinning/pctbinning.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/applications/pctbinning/pctbinning.py b/applications/pctbinning/pctbinning.py index ce291ee0..e4b10ecb 100644 --- a/applications/pctbinning/pctbinning.py +++ b/applications/pctbinning/pctbinning.py @@ -190,15 +190,14 @@ def process(args_info: argparse.Namespace): projection.Update() - filler = pct.SmallHoleFiller[OutputImageType]() + hole_filter = pct.HoleFillingImageFilter[OutputImageType].New() if args_info.fill: - filler.SetImage(projection.GetOutput()) - filler.SetHolePixel(0.0) - filler.Fill() + hole_filter.SetInput(projection.GetOutput()) + hole_filter.Update() cii = itk.ChangeInformationImageFilter[OutputImageType].New() if args_info.fill: - cii.SetInput(filler.GetOutput()) + cii.SetInput(hole_filter.GetOutput()) else: cii.SetInput(projection.GetOutput()) cii.ChangeOriginOn() From edf464e9fbd130a358f748fcca28f7adfb90e3f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Coussat?= Date: Wed, 19 Aug 2026 16:14:30 +0200 Subject: [PATCH 2/2] ENH: Update pctbinning.py with LMU features --- applications/pctbinning/pctbinning.py | 33 +++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/applications/pctbinning/pctbinning.py b/applications/pctbinning/pctbinning.py index e4b10ecb..80f286e0 100644 --- a/applications/pctbinning/pctbinning.py +++ b/applications/pctbinning/pctbinning.py @@ -22,6 +22,7 @@ def build_parser(): parser.add_argument( "-c", "--count", help="Image of count of proton pairs per pixel" ) + parser.add_argument("--variance", help="Image of variance of WEPL values per pixel") parser.add_argument( "--scatwepl", help="Image of scattering WEPL of proton pairs per pixel" ) @@ -33,6 +34,11 @@ def build_parser(): action="store_true", default=False, ) + parser.add_argument( + "--particle", + help="Particle used for imaging (proton or alpha)", + default="proton", + ) parser.add_argument( "-v", "--verbose", help="Verbose execution", action="store_true", default=False ) @@ -88,6 +94,12 @@ def build_parser(): action="store_true", default=False, ) + parser.add_argument( + "--fillvariance", + help="Fill holes, i.e. pixels that were not hit by protons (for variance projections)", + action="store_true", + default=False, + ) parser.add_argument( "--trackerresolution", help="Tracker resolution in mm", type=float ) @@ -159,6 +171,8 @@ def process(args_info: argparse.Namespace): projection.SetRobust(args_info.robust) projection.SetComputeScattering(bool(args_info.scatwepl)) projection.SetComputeNoise(bool(args_info.noise)) + projection.SetComputeVariance(bool(args_info.variance)) + projection.SetParticle(args_info.particle) if args_info.quadricIn: # quadric = object surface @@ -216,6 +230,25 @@ def process(args_info: argparse.Namespace): # Write itk.imwrite(projection.GetCount(), args_info.count) + if args_info.variance: + VarianceImageType = itk.Image[itk.F, 3] + variance_hole_filter = pct.HoleFillingImageFilter[VarianceImageType].New() + if args_info.fillvariance: + variance_hole_filter.SetInput(projection.GetVariance()) + variance_hole_filter.Update() + cii_var = itk.ChangeInformationImageFilter[VarianceImageType].New() + if args_info.fillvariance: + cii_var.SetInput(variance_hole_filter.GetOutput()) + else: + cii_var.SetInput(projection.GetVariance()) + cii_var.ChangeOriginOn() + cii_var.ChangeDirectionOn() + cii_var.ChangeSpacingOn() + cii_var.SetOutputDirection(projection.GetOutput().GetDirection()) + cii_var.SetOutputOrigin(projection.GetOutput().GetOrigin()) + cii_var.SetOutputSpacing(projection.GetOutput().GetSpacing()) + itk.imwrite(cii_var.GetOutput(), args_info.variance) + if args_info.scatwepl: # Write itk.imwrite(projection.GetAngle(), args_info.scatwepl)