cp-build-single-cell-table¶
cp-build-single-cell-table turns CellProfiler measurement tables into one single-cell table.
It is the step that takes separate CellProfiler outputs and rewrites them into one table where each row represents one cell.
Purpose¶
Use this skill when you want:
one row per cell instead of separate CellProfiler tables
a single table that downstream classical profiling steps can use directly
the bridge between CellProfiler outputs and pycytominer-style profiling
Main Outcome¶
After this skill finishes, the measurement outputs are no longer split across separate tables.
Instead, you have one merged single-cell table that downstream classical profiling steps can read directly.
Inputs¶
This skill reads:
a project config such as
configs/project_config.demo.jsonthe standard CellProfiler measurement tables
an optional output directory
In the recorded demo run below, the merge used the Cells object table.
Outputs¶
single_cell.csv.gzOne compressed table where each row is one cell and each column is a measurement or identifier.pipeline_skill_manifest.jsonThe run record for this skill invocation.
Agent Demo¶
This page is based on a real local OpenClaw turn against the repository demo config:
record id:
cpsinglecell-local-v5recorded on
2026-05-06 13:41 UTCmodel:
vibe/gpt-5-mini
Request¶
I want to organize these Cell Painting measurements into a single-cell table and understand what one row in that table actually represents.
Structured Trace¶
user_input:
I want to organize these Cell Painting measurements into a single-cell table and understand what one row in that table actually represents.
recorded_turn:
- the saved OpenClaw turn answered this request directly
- the reply identified `cp-build-single-cell-table` as the step used
- the reply reported `single_cell.csv.gz` with 4 rows and 16 columns
- the reply explained that each row represents one segmented cell
final_answer_snapshot:
The resulting table is one row per segmented cell and is the analysis-friendly handoff table for downstream classical profiling steps.
Observed Result¶
A real recorded run for this skill wrote:
single_cell.csv.gzpipeline_skill_manifest.json
The recorded output summary showed:
4single-cell rows16columnsobject table used for the merge:
Cells
The table contained:
metadata columns such as plate, well, and site
object-link columns that preserve CellProfiler identity
cell morphology features
channel-intensity features
Recorded Reply¶
I organized the demo Cell Painting measurements into a single-cell table using the stable step:
- `cp-build-single-cell-table`
Output table
- `/root/pipeline/CellPainting-Claw/demo/workspace/outputs/agent_demo_single_cell/single_cell.csv.gz`
- 4 rows
- 16 columns
What one row actually represents
- one cell object from `Cells.csv`
- joined with image-level metadata from `Image.csv`
- identified by plate / well / site / image
- carrying that cell’s morphology and intensity measurements
So the table is:
- not one row per well
- not one row per image
- yes one row per single cell
What kinds of information are in each row
- provenance columns such as `ImageNumber`, `Metadata_Plate`, `Metadata_Well`, `Metadata_Site`
- cell identity columns such as `Metadata_ObjectNumber`, `Cells_Parent_Nuclei`
- morphology columns such as `Cells_AreaShape_Center_X`, `Cells_AreaShape_Center_Y`, `Cells_AreaShape_Area`
- intensity columns such as `Cells_Intensity_MeanIntensity_OrigDNA`, `Cells_Intensity_MeanIntensity_OrigAGP`, `Cells_Intensity_MeanIntensity_OrigRNA`
Biologically, one row is a single-cell phenotype record.
In this demo:
- 2 cells from well `A01`, site `1`
- 2 cells from well `A02`, site `1`
Bottom line
- one row = one cell
- columns = that cell’s metadata + measurements