itasc.contact_analysis.contacts.signed_contact_length

Signed contact length — the signed central junction-length reaction coordinate.

Boltzmann-inversion of this coordinate yields the effective potential / barrier ΔE_eff of T1 transitions: the energy a junction climbs to reach the four-fold vertex. That inversion and the resulting potential-landscape plot are downstream concerns owned by the data repo, not this package — this module only computes the signed lengths themselves. It is the ITASC analogue of the reference’s extract_central_junction_lengths / plot_signed_lengths_neg_log_p_histogram (morphogenesis-on-chip_analysis), but the sign comes from the t1_events table (losinggaining pairs) rather than curated “quad” JSONs.

Headless and Qt-free: it operates on an already-read PositionContactAnalysis, so it never opens HDF5 itself and runs unchanged in scripts, notebooks, and the napari plugin.

Functions

signed_central_junction_lengths(analysis, *)

Signed central junction length per T1 event, per frame.

itasc.contact_analysis.contacts.signed_contact_length.signed_central_junction_lengths(analysis, *, pixel_size_um=None, labels=None)[source]

Signed central junction length per T1 event, per frame.

For each T1 event the central junction is the edge that flips from the losing cell pair (pre-transition) to the gaining pair (post-transition). Every frame in which an event’s losing edge exists contributes a negative sample (−length); every frame its gaining edge exists contributes a positive one (+length). The magnitude is the edge length; it crosses zero at the four-fold vertex, so pooled and inverted these reproduce the reference’s double-well potential without curated quads.

Fragmented contacts are joined first: the build splits a single cell-cell boundary into several edge rows (one per disconnected segment from _coordinate_segments), so the lengths of all rows sharing a (frame, cell-pair) are summed into one total junction length before signing. Otherwise each fragment would enter the landscape as its own (short) sample. This is the headless analogue of the v1 find_shared_boundary / order_boundary_pixels join that produced one length per junction.

All frames an edge exists are used (no ± window) — matching the reference, which histograms the whole movie.

Columns (column-major, all equal length):

  • t1_event_id — the event each sample belongs to.

  • frame — the frame the sample is read from.

  • signed_length±length, in µm when pixel_size_um is given else px.

  • role"losing" (negative) or "gaining" (positive).

  • contact_type — the event’s transition pair "<losing>→<gaining>" (e.g. "A-A→A-B"), where each side is the contact label (contact_labels.contact_label_for()) of that junction’s cell pair. "" when no labels map is given (the label-agnostic default). A single per-event label is used (not per-side), so both the negative losing lobe and the positive gaining lobe of an event share it and a grouped curve still spans L = 0 for the barrier.

labels maps cell_id -> label (an optional, caller-supplied per-cell classification); a cell absent from it is "unclassified".

Returns empty (but typed) arrays when there are no events or no matching edges; an event whose losing/gaining edges never appear in edges simply contributes nothing.

Return type:

dict[str, ndarray]

Parameters: