Morphology Analysis
The morphology module extracts structural features from segmented organelles, including volume, surface area, length, and shape descriptors. These features are fundamental for characterizing subcellular structures across imaging modalities.
Overview
Morphological analysis quantifies the physical properties of organelles based on their 3D masks or coordinate representations. iPA categorizes organelles into three morphological classes:
Spherical organelles: ISGs, vesicles, lipid droplets - characterized by volume and sphericity
Cylindrical organelles: Mitochondria - characterized by volume and aspect ratio
Tubular organelles: F-actin, microtubules - characterized by total length and network topology
The extracted features enable quantitative comparisons of organelle morphology under different conditions (e.g., low vs. high glucose) and across imaging modalities.
Core Functions
extract_isg_features
- ipa.analysis.extract_isg_features(isg_mask, min_distance=5, min_size=20, save_csv=False, output_path=None)[source]
Use watershed algorithm to perform 3D segmentation on ISG mask, generating data in the same format as 3D analysis results.
Parameters: - isg_mask: numpy ndarray, 3D ISG binary mask - min_distance: int, minimum distance for peak detection - min_size: int, minimum connected region size - save_csv: bool, whether to save CSV file - output_path: str, output CSV file path
Returns: - pandas.DataFrame: DataFrame containing segmentation results - numpy.ndarray: 3D segmented label image
Extracts comprehensive morphological features from insulin secretory granule (ISG) masks using watershed-based instance segmentation.
Features Extracted:
Volume (μm³)
Surface area (μm²)
Sphericity (0-1, where 1 = perfect sphere)
Major/minor axis lengths (nm)
Eccentricity
Solidity (area / convex area)
Equivalent diameter
Algorithm:
Apply distance transform to ISG mask
Detect local maxima as seed points
Perform watershed segmentation to separate touching ISGs
Calculate morphological features for each instance
Optionally save results to CSV
Parameters:
img_isg(np.ndarray): 3D binary ISG maskmin_distance(int, optional): Minimum distance between peaks for seed detection. Default: 5min_size(int, optional): Minimum connected component size (voxels). Default: 20save_csv(bool, optional): Whether to save results to CSV. Default: Falseoutput_path(str, optional): Output CSV file path. Required ifsave_csv=True
Returns:
df(pd.DataFrame): DataFrame containing morphological features for each ISG instancelabels(np.ndarray): 3D labeled mask with unique instance IDs
Example:
from ipa.analysis import extract_isg_features
from ipa.data_loader import UniversalDataLoader
# Load ISG mask from SXT data
isg_mask = UniversalDataLoader.load_data("isg_segmentation.mrc")
# Extract features
features_df, labels = extract_isg_features(
isg_mask,
min_distance=5,
min_size=20,
save_csv=True,
output_path="results/isg_morphology.csv"
)
print(f"Found {len(features_df)} ISGs")
print(f"Mean volume: {features_df['Vol (unit)'].mean():.3f} μm³")
print(f"Mean sphericity: {features_df['Sphericity'].mean():.3f}")
calculate_tubular_length
- ipa.analysis.calculate_tubular_length(skeleton_mask, voxel_size=(1.0, 1.0, 1.0), return_individual=False)[source]
Calculate the total length of tubular organelles by summing the distances between adjacent skeleton voxels.
- Parameters:
skeleton_mask (np.ndarray) – 3D binary mask representing the skeleton of the tubular structure.
voxel_size (tuple) – Physical size of each voxel (z, y, x) in nm or um.
return_individual (bool) – If True, also returns a list of lengths for each individual connected component. NOTE: This is computationally expensive for large masks as it performs BFS on coordinates.
- Returns:
Total length if return_individual is False. (Total length, List of individual lengths) if return_individual is True.
- Return type:
float or tuple
Calculates the total length of tubular organelles (e.g., F-actin, microtubules) from skeleton masks by summing distances between adjacent skeleton voxels.
Algorithm:
Extract skeleton voxel coordinates from binary mask
Build KDTree for efficient nearest neighbor search
Find nearest neighbors for each voxel within a radius threshold
Sum unique connections (divided by 2 to avoid double counting)
Convert to physical units using voxel size
Parameters:
skeleton_mask(np.ndarray): 3D binary skeleton maskvoxel_size(tuple, optional): Physical voxel size (Z, Y, X) in nm. Default: (1.0, 1.0, 1.0)return_individual(bool, optional): Whether to return individual filament lengths. Default: False
Returns:
If
return_individual=False: Total length (float, in nm)If
return_individual=True: Tuple of (total_length, list_of_individual_lengths)
Biological Significance:
Tubular length is a key metric for cytoskeletal networks. Changes in F-actin or microtubule length reflect cellular remodeling during processes like glucose-stimulated insulin secretion (GSIS).
Example:
from ipa.analysis import calculate_tubular_length
import json
import numpy as np
# Load actin coordinates from JSON (cryo-ET data)
with open("actin_filled_points.json", 'r') as f:
actin_data = json.load(f)
# Reconstruct skeleton mask from coordinates
coords = np.array([pt for filament in actin_data.values() for pt in filament])
skeleton_mask = np.zeros(volume_shape, dtype=np.uint8)
for z, y, x in coords.astype(int):
skeleton_mask[z, y, x] = 1
# Calculate length (cryo-ET voxel size: 1.34 nm)
total_length, individual_lengths = calculate_tubular_length(
skeleton_mask,
voxel_size=(1.34, 1.34, 1.34),
return_individual=True
)
print(f"Total F-actin length: {total_length:.2f} nm")
print(f"Number of filaments: {len(individual_lengths)}")
print(f"Mean filament length: {np.mean(individual_lengths):.2f} nm")
actin_to_actin_analysis
- ipa.analysis.actin_to_actin_analysis(data_id: str, mask_file: str, actin_file: str, config: Dict) Dict[source]
Calculate distance analysis between actin filaments
This function analyzes spatial relationships between actin filaments, calculates shortest distances between filamentous structures, and generates corresponding statistical information and visualization results.
- Parameters:
data_id (str) – Dataset identifier for naming output files
mask_file (str) – Vesicle mask file path (.mrc format)
actin_file (str) – Actin point coordinates file path (.json format)
config (Dict) – Configuration parameters dictionary containing: - voxel_size_xyz (List[float]): Voxel size [x, y, z] in Angstroms - shift_bias (List[float]): Coordinate offset [x, y, z] - visualization (bool): Whether to generate visualization charts - save_intermediate (bool): Whether to save intermediate result files - output_dir (str, optional): Output directory path
- Returns:
- Analysis result dictionary containing:
data_id (str): Dataset identifier
total_actin_filaments (int): Total number of actin filaments
total_distances (int): Total number of calculated distances
distance_stats (Dict): Distance statistics (mean, std, min/max, etc.)
status (str): Analysis status (‘success’ or ‘error’)
output_directory (str): Output directory path
vector_file (str, optional): Vector data file path
distance_file (str, optional): Distance data file path
plot_file (str, optional): Visualization chart file path
- Return type:
Dict
- Raises:
FileNotFoundError – Raised when input files do not exist
ImportError – Raised when required modules are not available
Analyzes spatial relationships within actin filament networks, calculating shortest distances between filaments and generating statistical summaries.
Parameters:
data_id(str): Dataset identifier for output filesmask_file(str): Vesicle mask file path (.mrc)actin_file(str): Actin coordinates file (.json)config(dict): Configuration dictionary with keys: -voxel_size_xyz(list): Voxel dimensions [nm] -shift_bias(list): Coordinate offset correction [nm] -visualization(bool): Enable visualization -output_dir(str): Output directory
Returns:
results(dict): Dictionary containing: -distance_stats: Distance statistics (mean, std, percentiles) -contact_sites: List of contact point coordinates -visualization_path: Path to saved figure (if enabled)
Example:
from ipa.analysis import actin_to_actin_analysis
config = {
'voxel_size_xyz': [1.34, 1.34, 1.34], # Cryo-ET
'shift_bias': [0.0, 0.0, 0.0],
'visualization': True,
'output_dir': 'results/'
}
results = actin_to_actin_analysis(
data_id="sample_01",
mask_file="vesicle_mask.mrc",
actin_file="actin_coords.json",
config=config
)
print(f"Mean inter-filament distance: {results['distance_stats']['mean']:.2f} nm")
actin_angle_distance_pair_enhanced_analysis
- ipa.analysis.actin_angle_distance_pair_enhanced_analysis(data_id: str, actin_file: str, vesicle_file: str, config: Dict) Dict[source]
Enhanced Actin angle-distance pair analysis function with custom actinangle2dist implementation
- Parameters:
data_id – Data ID for the analysis
actin_file – Path to actin points file (.json)
vesicle_file – Path to vesicle mask file (.mrc)
config – Configuration parameters dictionary
- Returns:
Dictionary containing analysis results
- Return type:
Dict
Enhanced analysis of actin angle-distance pair relationships with advanced statistical measures. This function calculates both the distance from actin filaments to reference structures and the angular orientation relative to those structures.
Parameters:
data_id(str): Dataset identifieractin_file(str): Path to actin coordinates file (.json)vesicle_file(str): Path to vesicle mask file (.mrc)config(dict): Configuration dictionary
Returns:
results(dict): Dictionary with enhanced analysis metrics including angle-distance correlations
Example:
from ipa.analysis import actin_angle_distance_pair_enhanced_analysis
config = {
'voxel_size_xyz': [1.34, 1.34, 1.34],
'shift_bias': [0.0, 0.0, 0.0],
'visualization': True,
'output_dir': 'results/'
}
results = actin_angle_distance_pair_enhanced_analysis(
data_id="sample_01",
actin_file="actin_coords.json",
vesicle_file="vesicle_mask.mrc",
config=config
)
Usage Examples
Complete Morphology Workflow
This example demonstrates extracting multiple morphological features from different organelle types:
from ipa.analysis import extract_isg_features, calculate_tubular_length
from ipa.data_loader import UniversalDataLoader
import tifffile
import json
import numpy as np
# 1. ISG Morphology (from SXT)
print("=== ISG Morphology ===")
isg_mask = UniversalDataLoader.load_data("isg_mask.mrc")
isg_features, isg_labels = extract_isg_features(
isg_mask,
min_distance=5,
min_size=20,
save_csv=True,
output_path="results/isg_features.csv"
)
print(f"Total ISGs: {len(isg_features)}")
print(f"Volume distribution: mean={isg_features['Vol (unit)'].mean():.3f}, "
f"std={isg_features['Vol (unit)'].std():.3f}")
# 2. F-actin Length (from cryo-ET)
print("\n=== F-actin Length ===")
with open("actin_points.json", 'r') as f:
actin_data = json.load(f)
# Reconstruct mask
volume_shape = (100, 200, 200)
coords = np.array([pt for filament in actin_data.values() for pt in filament])
actin_mask = np.zeros(volume_shape, dtype=np.uint8)
for z, y, x in coords.astype(int):
actin_mask[z, y, x] = 1
total_length, individual_lengths = calculate_tubular_length(
actin_mask,
voxel_size=(1.34, 1.34, 1.34),
return_individual=True
)
print(f"Total length: {total_length:.2f} nm")
print(f"Filament count: {len(individual_lengths)}")
# 3. Compare across conditions
print("\n=== Condition Comparison ===")
# Low glucose
lg_features, _ = extract_isg_features(lg_isg_mask)
# High glucose
hg_features, _ = extract_isg_features(hg_isg_mask)
print(f"LG mean volume: {lg_features['Vol (unit)'].mean():.3f} μm³")
print(f"HG mean volume: {hg_features['Vol (unit)'].mean():.3f} μm³")