From 449e8420f67e3a4dcd42c74fc6b72c303a6a250a Mon Sep 17 00:00:00 2001
From: schlda00 <kai.schleicher@unibas.ch>
Date: Tue, 22 Apr 2025 14:22:08 +0200
Subject: [PATCH] Add and use function to measure shape features

---
 2d_spots_in_fibers.py | 61 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 60 insertions(+), 1 deletion(-)

diff --git a/2d_spots_in_fibers.py b/2d_spots_in_fibers.py
index 6daff6e..7df8f36 100644
--- a/2d_spots_in_fibers.py
+++ b/2d_spots_in_fibers.py
@@ -349,6 +349,59 @@ def measure_intensity_sum(imp, rm):
     return label_id, sum_intensity
 
 
+def measure_shape_parameters(imp, rm):
+    """
+    Measure theraw integrated intensity for all rois in target imp.
+
+    Parameters
+    ----------
+    imp : ImagePlus
+        The image from which the intensity will be measured.
+    rm : RoiManager
+        The ROI Manager containing the regions of interest to be analyzed.
+
+    Returns
+    -------
+    label_id : list of str
+        A list of labels corresponding to each ROI.
+    area : list of int
+        A list of the areas for each ROI.
+    perimeter : list of int
+        A list of the perimeters for each ROI.
+    min_feret : list of int
+        A list of the min feret diameters for each ROI.
+
+    Notes
+    -----
+    The results are stored in a `ij.ResultsTable`,
+    from which the values are extracted.
+
+    Example
+    -------
+    >>> label_id, area, perimeter, min_feret = measure_shape_parameters(imp, roi_manager)
+    """
+
+    rt_ = ResultsTable()
+    options = M.FERET | M.AREA | M.PERIMETER
+    an = Analyzer (imp, options, rt_)
+    an.setPrecision(1)
+    
+    label_id = []
+    area = []
+    perimeter = []
+    min_feret = []
+
+    for index, roi in enumerate(rm.getRoisAsArray()):
+        imp.setRoi(roi)
+        an.measure()
+        label_id.append(roi.getName())
+        area.append(int(rt_.getColumn("Area")[index]))
+        perimeter.append(int(rt_.getColumn("MinFeret")[index]))
+        min_feret.append(int(rt_.getColumn("Perim.")[index]))
+    
+    return label_id, area, perimeter, min_feret
+
+
 def add_results_to_resultstable(results_table, column, values):
     """Add values to the ResultsTable starting from row 0 of a given column.
 
@@ -451,6 +504,12 @@ dapi_binary = convert_to_binary(dapi_channel, threshold)
 
 # detect spots and count them per fiber
 results_table = ResultsTable()
+load_rois_from_zip(fiber_segmentation_roiset, rm)
+fiber_label_IDs, area, perimeter, min_feret = measure_shape_parameters(dapi_binary, rm)
+add_results_to_resultstable(results_table, "fiber label ID", fiber_label_IDs)
+add_results_to_resultstable(results_table, "Area", area)
+add_results_to_resultstable(results_table, "Perimeter", perimeter)
+add_results_to_resultstable(results_table, "Min. Feret", min_feret)
 for index, channel in enumerate(processing_channels):
     channel = int(channel)
     quality_threshold = float(quality_thresholds[index])
@@ -462,7 +521,7 @@ for index, channel in enumerate(processing_channels):
     dapi_negative_spots_binary = ImageCalculator.run(spots_binary_imp, dapi_positive_spots_binary, "Subtract create")
     
     load_rois_from_zip(fiber_segmentation_roiset, rm)
-    fiber_label_IDs, n_spots_per_fiber = measure_intensity_sum(spots_binary_imp, rm)
+    _, n_spots_per_fiber = measure_intensity_sum(spots_binary_imp, rm)
     _, n_dapi_positive_spots_per_fiber = measure_intensity_sum(dapi_positive_spots_binary, rm)
     _, n_dapi_negative_spots_per_fiber = measure_intensity_sum(dapi_negative_spots_binary, rm)
 
-- 
GitLab