Skip to content

The catalog and pl.run

The catalog and pl.run

Module and method ids (all 73)

Module Methods Input formats
point_cloud_processing voxel_downsample, statistical_outlier_removal, radius_outlier_removal, mesh_to_pointcloud .ply .pcd .txt .xyz
mesh_processing subdivision, simplification, mesh_to_pcd_uniform, mesh_to_pcd_poisson_disk .ply .obj .stl .off
voxel_to_mesh voxelization, binary_erosion .ply .obj .stl .off
sdf compute_sdf, occupancy_reconstruction, sdf_voxel_visualization .ply .obj .stl .off
point_cloud_reconstruction poisson, convex_hull, alpha_shape, ball_pivoting .ply .pcd .txt .xyz
registration (two inputs) ransac_global, icp_refinement, ransac_icp_pipeline .ply .pcd .txt .xyz
deformable_registration cpd_deformable (two inputs), gaussian_deformation .ply .pcd .txt .xyz
point_cloud_segmentation ransac_plane, dbscan_clustering .ply .pcd .txt .xyz
stereo_3d_reconstruction depth_colorization, depth_filter .ply .pcd .txt .xyz
lidar_scene_detection height_colorization, ground_removal, object_clustering .ply .pcd .txt .xyz .las
lidar_camera_fusion intensity_colorization, roi_extraction, multi_resolution .ply .pcd .txt .xyz .las
features_extraction normal_estimation, fpfh_features, curvature_estimation .ply .pcd .txt .xyz
collision_detection sdf_collision, penetration_depth .ply .obj .stl .off
pyvista_mesh_processing pv_decimate, pv_subdivide, pv_smooth_laplacian, pv_smooth_taubin, pv_clean, pv_fill_holes, pv_compute_normals, pv_triangulate, pv_extract_surface .ply .obj .stl .vtk .vtu
pyvista_pointcloud_processing pv_threshold, pv_clip_plane, pv_clip_box, pv_random_sample, pv_extract_points .ply .pcd .vtk .vtu .obj .stl
pyvista_volume_processing pv_contour, pv_slice, pv_slice_orthogonal, pv_threshold_volume, pv_extract_geometry, pv_extract_cells .vti .vtk .vtu .ply .obj .stl
pyvista_analysis pv_curvature, pv_distance, pv_glyph, pv_vector_magnitude, pv_scalar_stats, pv_extract_feature_edges .ply .obj .stl .vtk .vtu
simpleitk_registration (two inputs) rigid, advanced_rigid, affine, bspline, demons, difference_analysis .vti .mha .nrrd .nii .dcm
simpleitk_segmentation otsu_threshold, manual_threshold, connected_components, watershed .vti .mha .nrrd .nii

Outputs are .ply for the first 17 modules and .vti for the SimpleITK ones. Registration methods also write <output>.json next to the output with the estimated transform (rotation_deg, translation_mm, matrices).

Do not guess parameter names: print them.

print(pl.describe("point_cloud_reconstruction.poisson"))
# point_cloud_reconstruction.poisson  -  Poisson Surface Reconstruction
#   output: .ply
#   parameters:
#     depth: int = 9 [4..12]
#       Octree depth ...
#     density_quantile: float = 0.01 [0.0..0.5]
#     ...
m = pl.catalog().method("simpleitk_registration", "rigid")
[p.name for p in m.parameters]  # learning_rate, num_iterations, sampling_percentage, initializer, metric, ...
m.dual_input  # True
pl.catalog().methods_for(".mha")  # every Method accepting .mha
pl.catalog().find("poisson", ".ply")  # resolve a bare id for a file type

A few parameters that come up constantly: voxel_downsample(voxel_size), statistical_outlier_removal(nb_neighbors, std_ratio), poisson(depth, density_quantile, normal_radius), pv_decimate(target_reduction), pv_smooth_laplacian(n_iterations), mesh_to_pcd_poisson_disk(num_points), icp_refinement(voxel_size, max_iterations >= 100, icp_estimation_method), ransac_icp_pipeline(voxel_size, rotation_degrees), dbscan_clustering(eps, min_points), rigid(num_iterations, metric, initializer=GEOMETRY|MOMENTS, sampling_percentage, shrink_factors="4,2,1"), manual_threshold(lower, upper), connected_components(min_size).

pl.run

res = pl.run("simpleitk_registration", "rigid", "ct.mha", moving="mr.mha", num_iterations=200)
res = pl.run("point_cloud_processing.voxel_downsample", "scan.ply", "small.ply", voxel_size=0.02)
res.output      # Path written (default: pl.output_dir()/<stem>_<method>_<id>.<ext>)
res.sidecar     # Path of <output>.json when the script wrote one (registration), else None
res.log         # full stdout+stderr of the script, ANSI stripped
res.duration_s, res.command, res.params (as sent), res.provenance()

Signature: run(module, method=None, input=None, /, output=None, *, moving=None, params=None, timeout=600, python=None, on_log=None, on_progress=None, cwd=None, **params). The first three are positional-only, so a parameter literally called method or input (e.g. pv_contour(method="flying_edges")) still works as a keyword. params={...} and keywords may be mixed but not repeat.

Validation before execution (raises pl.ParameterError): unknown name (with a "did you mean"), wrong type, out of [min..max], enum not in options (case-insensitive, normalised), output extension not the method's, input extension not accepted by the module, moving missing for a two-input method or given to a single-input one. Coercion to the command line: floats repr, bools true/false, lists joined with commas (shrink_factors=[4, 2, 1]).

Execution: a subprocess python -m pardesline.ops.<module>.<script> --input ... --output ... [--moving ...] --name value ... with PYTHONUNBUFFERED=1, MPLBACKEND=Agg, PYVISTA_OFF_SCREEN=true, LOGURU_COLORIZE=False. Lines starting with PROGRESS:NN go to on_progress(int); every other line goes to on_log(str) or to loguru at DEBUG. timeout kills the child and raises pl.RunError (.returncode is None); a non-zero exit raises pl.RunError with the last 25 log lines in str(err); exit 0 without an output file is also a RunError.

CLI

pardesline list [--ext .mha] [--category registration]
pardesline describe simpleitk_registration.rigid
pardesline run point_cloud_processing.voxel_downsample scan.ply -o small.ply --voxel_size 0.02
pardesline run simpleitk_registration.rigid ct.mha --moving mr.mha -o reg.vti --num_iterations 200 -q
pardesline version

Parameters after the input are --name value (booleans --flag true). The run prints the output path (and the sidecar path) on stdout and echoes the script log on stderr unless -q. Exit code 1 with error: ... on any PardesLineError or missing file. The cloud commands (login, upload, send, inbox, ls, download, share, whoami, logout) are forwarded to the cloud client.

Running a script directly (same contract as the hosted platform)

python -m pardesline.ops.simpleitk_segmentation.otsu_threshold --input ct.mha --output mask.vti
python -m pardesline.ops.registration.icp_refinement --input fixed.ply --output moved.ply --moving moving.ply --voxel_size 0.05

Exit 0 means the output was written. Prefer pl.run from Python: it validates, names the output and captures the log.

Source: skills/catalog-and-run/SKILL.md, one of the twenty skills served by pardesline mcp; published on 2026-10-10.