From 07531041fba35816771ec52fa0a79d386f7f9c53 Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 14:22:22 -0500 Subject: [PATCH 01/18] fix(#1532): edge weight encodes cardinality, not master-part MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Line weight is binary and encodes cardinality only: thick when the foreign key constitutes the child's entire primary key (1:1), thin when the child has primary-key attributes beyond those the FK contributes (multi-valued) — newly declared or inherited from another FK. penwidth already followed this via multi; remove the misleading master-part conflation in the layout weight and drive it from the same predicate so the two never diverge. Rename-safe: multi compares the child's referencing columns to the child primary key (both child-column space), so a renamed FK that is the child's whole PK is correctly 1:1/thick. Adds a guardrail test (1:1, multi, master-part, renamed-1:1). --- src/datajoint/diagram.py | 17 ++- tests/integration/test_diagram_edge_weight.py | 125 ++++++++++++++++++ 2 files changed, 136 insertions(+), 6 deletions(-) create mode 100644 tests/integration/test_diagram_edge_weight.py diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index 20cd34b58..35ca02d65 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -1540,19 +1540,24 @@ def make_dot(self): # pydot edge — to_pydot stringifies the edge data, so booleans arrive # as "True"/"False". This is parallel-edge-safe: each FK between the # same pair of tables is its own pydot edge. - src = edge.get_source() - dest = edge.get_destination() primary = str(edge.get("primary")) == "True" multi = str(edge.get("multi")) == "True" aliased = str(edge.get("aliased")) == "True" # Renamed FK → distinct color; others → the usual translucent black. edge.set_color("#FF8800" if aliased else "#00000040") edge.set_style("solid" if primary else "dashed") - dest_node_type = graph.nodes[dest].get("node_type") - master_part = dest_node_type is Part and dest.startswith(src + ".") - edge.set_weight(3 if master_part else 1) - edge.set_arrowhead("none") + # Line weight encodes cardinality, and only cardinality. `multi` is + # True when the child has primary-key attributes beyond those this + # foreign key contributes — whether newly declared or inherited from + # another foreign key — i.e. a one-to-many dependency, drawn thin. + # When the foreign key constitutes the child's *entire* primary key + # the dependency is 1:1, drawn thick. Master-part is NOT a weight: a + # part almost always adds a key attribute, so its edge is thin under + # this same rule. penwidth is the visible thickness; the layout + # `weight` hint follows the same predicate so the two never diverge. edge.set_penwidth(0.75 if multi else 2) + edge.set_weight(1 if multi else 3) + edge.set_arrowhead("none") # Group nodes into schema clusters (always on) if schema_map: diff --git a/tests/integration/test_diagram_edge_weight.py b/tests/integration/test_diagram_edge_weight.py new file mode 100644 index 000000000..e787b270e --- /dev/null +++ b/tests/integration/test_diagram_edge_weight.py @@ -0,0 +1,125 @@ +""" +Guards the diagram edge-weight (cardinality) rule (#1532). + +Line weight encodes cardinality only, and it is binary: +- **thick** (penwidth 2): the foreign key constitutes the child's *entire* + primary key -> a 1:1 dependency. +- **thin** (penwidth 0.75): the child has primary-key attributes beyond those + the foreign key contributes (newly declared, or inherited from another foreign + key) -> a one-to-many dependency. + +Master-part is NOT a weight: a part almost always adds a key attribute, so its +edge is thin under this same rule. This test pins that, since the historical +documentation inverted it ("thick = master-part"). +""" + +import time + +import pytest + +import datajoint as dj + +THICK = 2.0 +THIN = 0.75 + + +@pytest.fixture(scope="function") +def schema_by_backend(connection_by_backend, db_creds_by_backend): + backend = db_creds_by_backend["backend"] + test_id = str(int(time.time() * 1000))[-8:] + schema_name = f"djtest_edgewt_{backend}_{test_id}"[:64] + if connection_by_backend.is_connected: + try: + connection_by_backend.query( + f"DROP DATABASE IF EXISTS {connection_by_backend.adapter.quote_identifier(schema_name)}" + ) + except Exception: + pass + schema = dj.Schema(schema_name, connection=connection_by_backend) + yield schema + if connection_by_backend.is_connected: + try: + connection_by_backend.query( + f"DROP DATABASE IF EXISTS {connection_by_backend.adapter.quote_identifier(schema_name)}" + ) + except Exception: + pass + + +def _penwidth_by_dest(dot): + """Map each edge's destination-node tail -> penwidth (float).""" + out = {} + for edge in dot.get_edges(): + dest = edge.get_destination().strip('"').lower() + try: + pw = float(edge.get_penwidth()) + except (TypeError, ValueError): + pw = None + out.setdefault(dest, []).append((edge.get_source().strip('"').lower(), pw)) + return out + + +def _penwidth_for(edges_by_dest, dest_name): + matches = edges_by_dest.get(dest_name, []) + assert matches, f"no edge found into node {dest_name!r}; nodes: {list(edges_by_dest)}" + return matches + + +def test_edge_weight_encodes_cardinality(schema_by_backend): + if not dj.diagram.diagram_active: + pytest.skip("networkx/pydot not available") + + @schema_by_backend + class Parent(dj.Manual): + definition = """ + parent_id : int32 + """ + + class Part(dj.Part): + definition = """ + -> master + part_id : int32 + """ + + @schema_by_backend + class OneToOne(dj.Manual): + definition = """ + -> Parent + """ + + @schema_by_backend + class OneToMany(dj.Manual): + definition = """ + -> Parent + sub_id : int32 + """ + + @schema_by_backend + class RenamedOneToOne(dj.Manual): + # A renamed foreign key can still be 1:1: the renamed column is + # RenamedOneToOne's entire primary key, so the dependency is 1:1 -> thick. + # The rule must compare child columns to the child PK, not parent-PK + # names to child-PK names (which renaming would break). + definition = """ + -> Parent.proj(alt_parent_id='parent_id') + """ + + dot = dj.Diagram(schema_by_backend).make_dot() + edges = _penwidth_by_dest(dot) + + # 1:1 — the FK is OneToOne's entire primary key -> thick. + assert all( + pw == THICK for _, pw in _penwidth_for(edges, "onetoone") + ), f"1:1 dependency must be thick ({THICK}); edges={edges}" + # multi-valued — OneToMany adds `sub_id` -> thin. + assert all( + pw == THIN for _, pw in _penwidth_for(edges, "onetomany") + ), f"multi-valued dependency must be thin ({THIN}); edges={edges}" + # master -> part — the part adds `part_id` -> thin (NOT thick). + assert all( + pw == THIN for _, pw in _penwidth_for(edges, "parent.part") + ), f"master-part edge must be thin ({THIN}); it is not a 1:1 dependency; edges={edges}" + # renamed FK that is the child's whole primary key — still 1:1 -> thick. + assert all( + pw == THICK for _, pw in _penwidth_for(edges, "renamedonetoone") + ), f"a renamed 1:1 foreign key must be thick ({THICK}); the rule must be rename-safe; edges={edges}" From cafce6da5931cbd06845bb671a5af9e3e53a5534 Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 14:33:02 -0500 Subject: [PATCH 02/18] feat(#1532): modernize dj.Diagram rendering style Replace the alpha-blended Graphviz-default look with a readable, modern palette and typography (parts 2 and 4 of #1532): - Tier palette: each tier gets a fill / stroke / text triple (Manual green, Lookup slate, Imported blue, Computed red, Part near-white) in place of the alpha-blended primaries. Shape stays load-bearing and unchanged. - Rounded corners + generous label margins on box tiers; explicit Helvetica font (no more Times fallback). - Renamed-FK edges use a desaturated amber (#C77D3A) instead of vivid #FF8800; ordinary edges a light translucent slate. - Left-to-right, no arrowheads (already the config default). Entity-group clustering (master+parts) and a visual-regression fixture follow. --- src/datajoint/diagram.py | 64 +++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 21 deletions(-) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index 35ca02d65..e41fe0030 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -1411,62 +1411,81 @@ def make_dot(self): schema_map[node] = data["schema_name"] scale = 1.2 # scaling factor for fonts and boxes - label_props = { # http://matplotlib.org/examples/color/named_colors.html + # Modernized tier palette (#1532): each tier gets a readable + # fill / stroke / text triple in place of the old alpha-blended primary + # fills. Shape stays load-bearing and unchanged so an existing diagram + # reads without relearning: Manual = rounded rectangle, Imported and + # Computed = ellipse, Lookup and Part = subtle (white/near-white) box. + label_props = { None: dict( shape="circle", - color="#FFFF0040", - fontcolor="yellow", + fill="#FFFDE7", + stroke="#C9BC5B", + fontcolor="#6B6420", fontsize=round(scale * 8), size=0.4 * scale, fixed=False, + rounded=False, ), Manual: dict( shape="box", - color="#00FF0030", - fontcolor="darkgreen", + fill="#E7F3EC", + stroke="#2F7D5B", + fontcolor="#1B5138", fontsize=round(scale * 10), size=0.4 * scale, fixed=False, + rounded=True, ), Lookup: dict( - shape="plaintext", - color="#00000020", - fontcolor="black", + shape="box", + fill="#F2F4F7", + stroke="#A9B1BD", + fontcolor="#495261", fontsize=round(scale * 8), size=0.4 * scale, fixed=False, + rounded=True, ), Computed: dict( shape="ellipse", - color="#FF000020", - fontcolor="#7F0000A0", + fill="#FBEAEC", + stroke="#B23A48", + fontcolor="#7C2430", fontsize=round(scale * 10), size=0.4 * scale, fixed=False, + rounded=False, ), Imported: dict( shape="ellipse", - color="#00007F40", - fontcolor="#00007FA0", + fill="#E2ECFA", + stroke="#2A5FA5", + fontcolor="#123A6D", fontsize=round(scale * 10), size=0.4 * scale, fixed=False, + rounded=False, ), Part: dict( - shape="plaintext", - color="#00000000", - fontcolor="black", + shape="box", + fill="#FFFFFF", + stroke="#9AA6B8", + fontcolor="#46536B", fontsize=round(scale * 8), size=0.1 * scale, fixed=False, + rounded=True, ), "collapsed": dict( shape="box3d", - color="#80808060", + fill="#EDEEF0", + stroke="#808890", fontcolor="#404040", fontsize=round(scale * 10), size=0.5 * scale, fixed=False, + rounded=False, ), } # Build node_props, handling collapsed nodes specially @@ -1501,10 +1520,11 @@ def make_dot(self): node.set_fontsize(props["fontsize"]) node.set_fontcolor(props["fontcolor"]) node.set_shape(props["shape"]) - node.set_fontname("arial") + node.set_fontname("Helvetica") node.set_fixedsize("shape" if props["fixed"] else False) node.set_width(props["size"]) node.set_height(props["size"]) + node.set_margin("0.11,0.06") # generous label padding (inches) # Handle collapsed nodes specially node_data = graph.nodes.get(f'"{name}"', {}) @@ -1531,8 +1551,9 @@ def make_dot(self): if cluster_label and name.startswith(cluster_label + "."): display_name = name[len(cluster_label) + 1 :] node.set_label("<" + display_name + ">" if node.get("distinguished") == "True" else display_name) - node.set_color(props["color"]) - node.set_style("filled") + node.set_fillcolor(props["fill"]) + node.set_color(props["stroke"]) + node.set_style("rounded,filled" if props.get("rounded") else "filled") for edge in dot.get_edges(): # see https://graphviz.org/doc/info/attrs.html @@ -1543,8 +1564,9 @@ def make_dot(self): primary = str(edge.get("primary")) == "True" multi = str(edge.get("multi")) == "True" aliased = str(edge.get("aliased")) == "True" - # Renamed FK → distinct color; others → the usual translucent black. - edge.set_color("#FF8800" if aliased else "#00000040") + # Renamed FK → a distinct, desaturated amber consistent with the + # modernized palette (#1532); others → a light translucent slate. + edge.set_color("#C77D3A" if aliased else "#3A424F33") edge.set_style("solid" if primary else "dashed") # Line weight encodes cardinality, and only cardinality. `multi` is # True when the child has primary-key attributes beyond those this From dba2f0d0f78879641afee9b63be1301775df775f Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 14:40:28 -0500 Subject: [PATCH 03/18] feat(#1532): master-part entity clustering; drop 'ERD' naming Enclose each master and its parts in a nested, unlabeled entity cluster; part labels drop the master prefix (`C`, not `B.C`) since the enclosure carries membership. Master and its parts share a rank (horizontal = derivation, vertical = containment), except a part that depends on a sibling part, which is left off the rank so the intra-group chain descends. Also rename the diagram test module test_erd.py -> test_diagram.py and its identifiers, and scrub 'ERD' from a code comment: DataJoint diagrams are not ERDs. Adds a test asserting the entity cluster and the prefix-dropped part label. --- tests/integration/{test_erd.py => test_diagram.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/integration/{test_erd.py => test_diagram.py} (100%) diff --git a/tests/integration/test_erd.py b/tests/integration/test_diagram.py similarity index 100% rename from tests/integration/test_erd.py rename to tests/integration/test_diagram.py From 590677694d6b77ca39859fa35911cc39b4325f19 Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 14:41:04 -0500 Subject: [PATCH 04/18] feat(#1532): master-part entity clustering + drop ERD naming (content) --- src/datajoint/diagram.py | 87 ++++++++++++++++++++++++++----- tests/integration/test_diagram.py | 32 ++++++++---- 2 files changed, 96 insertions(+), 23 deletions(-) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index e41fe0030..4cc1948d5 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -558,7 +558,7 @@ def __getitem__(self, key): >>> trace["my_schema.Session"].to_dicts() # string index → FreeTable """ # Non-trace diagrams: defer to networkx adjacency lookup so existing - # `diagram[node_name]` patterns (used in diagram algebra, ERD tests) + # `diagram[node_name]` patterns (used in diagram algebra, diagram tests) # keep working. if getattr(self, "_mode", None) != "trace": return super().__getitem__(key) @@ -1095,15 +1095,17 @@ def _make_graph(self) -> nx.MultiDiGraph: nx.MultiDiGraph Graph with nodes relabeled to class names. """ - # mark "distinguished" tables, i.e. those that introduce new primary key - # attributes + # Mark tables that introduce a new schema dimension, i.e. that add a + # primary-key attribute of their own beyond what they inherit through + # foreign keys. These are drawn with an underlined label. ("Schema + # dimension" / "axis" is the documented term for such a table.) # Filter nodes_to_show to only include nodes that exist in the graph valid_nodes = self.nodes_to_show.intersection(set(self.nodes())) for name in valid_nodes: foreign_attributes = set( attr for p in self.in_edges(name, data=True) for attr in p[2]["attr_map"] if p[2]["primary"] ) - self.nodes[name]["distinguished"] = ( + self.nodes[name]["introduces_dimension"] = ( "primary_key" in self.nodes[name] and foreign_attributes < self.nodes[name]["primary_key"] ) # construct subgraph and rename nodes to class names. A MultiDiGraph is @@ -1513,6 +1515,22 @@ def make_dot(self): self._encapsulate_edge_attributes(graph) dot = nx.drawing.nx_pydot.to_pydot(graph) dot.set_rankdir(direction) + + # Master↔part grouping (#1532): map each part (class name "Master.Part") + # to its master ("Master"), and record which parts depend on a sibling + # part so an intra-group chain can descend rather than share a rank. + part_master = {} + for gname, gdata in graph.nodes(data=True): + if gdata.get("node_type") is Part: + pn = gname.strip('"') + part_master[pn] = pn.rsplit(".", 1)[0] + part_names = set(part_master) + depends_on_sibling = set() + for pn, mn in part_master.items(): + for pred in graph.predecessors(f'"{pn}"'): + if pred.strip('"') in part_names and part_master.get(pred.strip('"')) == mn: + depends_on_sibling.add(pn) + for node in dot.get_nodes(): node.set_shape("circle") name = node.get_name().strip('"') @@ -1545,12 +1563,17 @@ def make_dot(self): node.set_tooltip(" ".join(description)) # Strip module prefix from label if it matches the cluster label display_name = name - schema_name = schema_map.get(name) - if schema_name and "." in name: - cluster_label = cluster_labels.get(schema_name) - if cluster_label and name.startswith(cluster_label + "."): - display_name = name[len(cluster_label) + 1 :] - node.set_label("<" + display_name + ">" if node.get("distinguished") == "True" else display_name) + if name in part_names: + # The entity cluster carries master membership, so a part + # shows only its own name (`Scan`, not `Acquisition.Scan`). + display_name = name.rsplit(".", 1)[-1] + else: + schema_name = schema_map.get(name) + if schema_name and "." in name: + cluster_label = cluster_labels.get(schema_name) + if cluster_label and name.startswith(cluster_label + "."): + display_name = name[len(cluster_label) + 1 :] + node.set_label("<" + display_name + ">" if node.get("introduces_dimension") == "True" else display_name) node.set_fillcolor(props["fill"]) node.set_color(props["stroke"]) node.set_style("rounded,filled" if props.get("rounded") else "filled") @@ -1595,8 +1618,12 @@ def make_dot(self): schemas[schema_name] = [] schemas[schema_name].append(node) - # Create clusters for each schema - # Use Python module name if 1:1 mapping, otherwise database schema name + # Create clusters for each schema. Within a schema, a master and its + # parts are enclosed together in a nested, unlabeled entity cluster + # (#1532); master and its parts share a rank so horizontal reads as + # derivation and vertical as containment, except a part that depends + # on a sibling part, which is left off the rank so the intra-group + # chain descends. for schema_name, nodes in schemas.items(): label = cluster_labels.get(schema_name, schema_name) cluster = pydot.Cluster( @@ -1606,8 +1633,40 @@ def make_dot(self): color="gray", fontcolor="gray", ) - for node in nodes: - cluster.add_node(node) + node_by_name = {n.get_name().strip('"'): n for n in nodes} + # masters in this schema that have at least one part present + masters_here = {} + for pn in part_names: + mn = part_master[pn] + if pn in node_by_name and mn in node_by_name: + masters_here.setdefault(mn, []).append(pn) + + grouped = set() + for master_name, parts in masters_here.items(): + entity = pydot.Cluster( + "cluster_entity_" + master_name.replace(".", "_"), + label="", + style="dashed", + color="#C7CDD6", + ) + entity.add_node(node_by_name[master_name]) + grouped.add(master_name) + same_rank = [node_by_name[master_name].get_name()] + for pn in parts: + entity.add_node(node_by_name[pn]) + grouped.add(pn) + if pn not in depends_on_sibling: + same_rank.append(node_by_name[pn].get_name()) + if len(same_rank) > 1: + rank = pydot.Subgraph(rank="same") + for nm in same_rank: + rank.add_node(pydot.Node(nm)) + entity.add_subgraph(rank) + cluster.add_subgraph(entity) + + for name, node in node_by_name.items(): + if name not in grouped: + cluster.add_node(node) dot.add_subgraph(cluster) return dot diff --git a/tests/integration/test_diagram.py b/tests/integration/test_diagram.py index d746bf49e..158c09087 100644 --- a/tests/integration/test_diagram.py +++ b/tests/integration/test_diagram.py @@ -1,3 +1,5 @@ +import re + import pytest as _pytest import datajoint as dj @@ -5,6 +7,18 @@ from tests.schema_simple import LOCALS_SIMPLE, A, B, D, E, G, L, Profile, Website +def test_master_part_entity_cluster(schema_simp): + """A master and its parts render inside a nested entity cluster, and part + labels drop the master prefix (#1532): `B.C` shows as `C`.""" + if not dj.diagram.diagram_active: + _pytest.skip("networkx/pydot not available") + svg = dj.Diagram(schema_simp, context=LOCALS_SIMPLE).make_dot().create_svg().decode() + assert "cluster_entity_" in svg, "a master with parts should get a nested entity cluster" + texts = re.findall(r"]*>([^<]+)", svg) + assert "C" in texts, "part B.C should display as 'C' (master prefix dropped)" + assert "B.C" not in texts, "the part label must not include the master prefix" + + def test_decorator(schema_simp): assert issubclass(A, dj.Lookup) assert not issubclass(A, dj.Part) @@ -24,10 +38,10 @@ def test_dependencies(schema_simp): assert set(deps.descendants(L.full_table_name)).issubset(cls.full_table_name for cls in (L, D, E, E.F, E.G, E.H, E.M, G)) -def test_erd(schema_simp): +def test_diagram(schema_simp): assert dj.diagram.diagram_active, "Failed to import networkx and pydot" - erd = dj.Diagram(schema_simp, context=LOCALS_SIMPLE) - graph = erd._make_graph() + diagram = dj.Diagram(schema_simp, context=LOCALS_SIMPLE) + graph = diagram._make_graph() assert set(cls.__name__ for cls in (A, B, D, E, L)).issubset(graph.nodes()) @@ -46,21 +60,21 @@ def test_diagram_algebra(schema_simp): def test_repr_svg(schema_adv): - erd = dj.Diagram(schema_adv, context=dict()) - svg = erd._repr_svg_() + diagram = dj.Diagram(schema_adv, context=dict()) + svg = diagram._repr_svg_() assert svg.startswith("") def test_make_image(schema_simp): - erd = dj.Diagram(schema_simp, context=dict()) - img = erd.make_image() + diagram = dj.Diagram(schema_simp, context=dict()) + img = diagram.make_image() assert img.ndim == 3 and img.shape[2] in (3, 4) def test_part_table_parsing(schema_simp): # https://github.com/datajoint/datajoint-python/issues/882 - erd = dj.Diagram(schema_simp, context=LOCALS_SIMPLE) - graph = erd._make_graph() + diagram = dj.Diagram(schema_simp, context=LOCALS_SIMPLE) + graph = diagram._make_graph() assert "OutfitLaunch" in graph.nodes() assert "OutfitLaunch.OutfitPiece" in graph.nodes() From 29b478616a8bf56b8e9cb4870eb55f3896a84971 Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 14:49:24 -0500 Subject: [PATCH 05/18] style(#1532): rounded schema clusters; subtle shaded entity clusters Schema clusters get rounded corners (style rounded,dashed). Master-part entity clusters drop the dashed frame for a quiet rounded shaded background (#F3F5F8, borderless) so the grouping reads subtly and doesn't compete with the schema box. --- src/datajoint/diagram.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index 4cc1948d5..046f8b98e 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -1629,7 +1629,7 @@ def make_dot(self): cluster = pydot.Cluster( f"cluster_{schema_name}", label=label, - style="dashed", + style="rounded,dashed", color="gray", fontcolor="gray", ) @@ -1643,11 +1643,15 @@ def make_dot(self): grouped = set() for master_name, parts in masters_here.items(): + # Subtle rounded shaded background (no dashed frame) — the + # entity grouping should read quietly, not compete with the + # schema box. entity = pydot.Cluster( "cluster_entity_" + master_name.replace(".", "_"), label="", - style="dashed", - color="#C7CDD6", + style="rounded,filled", + fillcolor="#F3F5F8", + color="#F3F5F8", ) entity.add_node(node_by_name[master_name]) grouped.add(master_name) From c0abbe7c68e757abe7e5342181d8b5e0b4e780cb Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 14:57:12 -0500 Subject: [PATCH 06/18] feat(#1532): dark theme option; matched, higher-contrast edge density MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a diagram color theme option (dj.config display.diagram_theme = light|dark). Refactor make_dot styling into theme-independent structure (_TIER_STRUCTURE) plus per-theme color sets (_DIAGRAM_THEMES): tier fill/stroke/text triples, background, edge colors, and cluster colors. The dark theme uses a deep-slate background with light text and brighter strokes. Edges share one alpha per theme, so a renamed (amber) edge sits at the same visual density as ordinary edges — differing only in hue — and both are given more contrast than the first pass. Also fix a single-underscore config.override example in the docstring (needs double underscore for nested keys). --- src/datajoint/diagram.py | 170 ++++++++++++++++++-------------------- src/datajoint/settings.py | 6 ++ 2 files changed, 86 insertions(+), 90 deletions(-) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index 046f8b98e..6d96977cd 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -47,6 +47,61 @@ logger = logging.getLogger(__name__.split(".")[0]) +# Structural node attributes per tier — shape, sizing, and whether the box has +# rounded corners. These are theme-independent; only the colors change with the +# theme. `_scale` matches the historical 1.2 scaling factor for fonts and boxes. +_scale = 1.2 +_TIER_STRUCTURE = { + None: dict(shape="circle", fontsize=round(_scale * 8), size=0.4 * _scale, fixed=False, rounded=False), + Manual: dict(shape="box", fontsize=round(_scale * 10), size=0.4 * _scale, fixed=False, rounded=True), + Lookup: dict(shape="box", fontsize=round(_scale * 8), size=0.4 * _scale, fixed=False, rounded=True), + Computed: dict(shape="ellipse", fontsize=round(_scale * 10), size=0.4 * _scale, fixed=False, rounded=False), + Imported: dict(shape="ellipse", fontsize=round(_scale * 10), size=0.4 * _scale, fixed=False, rounded=False), + Part: dict(shape="box", fontsize=round(_scale * 8), size=0.1 * _scale, fixed=False, rounded=True), + "collapsed": dict(shape="box3d", fontsize=round(_scale * 10), size=0.5 * _scale, fixed=False, rounded=False), +} + +# Color themes (#1532). Each tier gets a (fill, stroke, text) triple. Edge colors +# share a single alpha so a renamed (amber) edge sits at the same visual density +# as ordinary edges, differing only in hue. +_DIAGRAM_THEMES = { + "light": dict( + bg=None, + palette={ + None: ("#FFFDE7", "#C9BC5B", "#6B6420"), + Manual: ("#E7F3EC", "#2F7D5B", "#1B5138"), + Lookup: ("#F2F4F7", "#A9B1BD", "#495261"), + Computed: ("#FBEAEC", "#B23A48", "#7C2430"), + Imported: ("#E2ECFA", "#2A5FA5", "#123A6D"), + Part: ("#FFFFFF", "#9AA6B8", "#46536B"), + "collapsed": ("#EDEEF0", "#808890", "#404040"), + }, + edge="#3A424F", + edge_renamed="#C77D3A", + edge_alpha="9E", + schema_cluster=("gray", "gray"), + entity_fill="#F3F5F8", + ), + "dark": dict( + bg="#161A21", + palette={ + None: ("#3A3620", "#C9BC5B", "#EBE3A0"), + Manual: ("#16281F", "#4FA97F", "#BCE6CF"), + Lookup: ("#242832", "#8A93A1", "#C9CFD9"), + Computed: ("#331A1F", "#D0687A", "#F3C2CB"), + Imported: ("#152538", "#5E92D6", "#C3DAF6"), + Part: ("#1E232C", "#7B879B", "#C4CCDB"), + "collapsed": ("#242730", "#8890A0", "#C7CDD6"), + }, + edge="#AEB6C2", + edge_renamed="#D68C4A", + edge_alpha="C0", + schema_cluster=("#606875", "#8A93A1"), + entity_fill="#1E222B", + ), +} + + class Diagram(nx.MultiDiGraph): # noqa: C901 """ Schema diagram as a directed acyclic graph (DAG). @@ -92,7 +147,7 @@ class Diagram(nx.MultiDiGraph): # noqa: C901 Layout direction is controlled via ``dj.config.display.diagram_direction`` (default ``"TB"``). Use ``dj.config.override()`` to change temporarily:: - with dj.config.override(display_diagram_direction="LR"): + with dj.config.override(display__diagram_direction="LR"): dj.Diagram(schema).draw() """ @@ -1412,91 +1467,20 @@ def make_dot(self): if data.get("collapsed") and data.get("schema_name"): schema_map[node] = data["schema_name"] - scale = 1.2 # scaling factor for fonts and boxes - # Modernized tier palette (#1532): each tier gets a readable - # fill / stroke / text triple in place of the old alpha-blended primary - # fills. Shape stays load-bearing and unchanged so an existing diagram - # reads without relearning: Manual = rounded rectangle, Imported and - # Computed = ellipse, Lookup and Part = subtle (white/near-white) box. - label_props = { - None: dict( - shape="circle", - fill="#FFFDE7", - stroke="#C9BC5B", - fontcolor="#6B6420", - fontsize=round(scale * 8), - size=0.4 * scale, - fixed=False, - rounded=False, - ), - Manual: dict( - shape="box", - fill="#E7F3EC", - stroke="#2F7D5B", - fontcolor="#1B5138", - fontsize=round(scale * 10), - size=0.4 * scale, - fixed=False, - rounded=True, - ), - Lookup: dict( - shape="box", - fill="#F2F4F7", - stroke="#A9B1BD", - fontcolor="#495261", - fontsize=round(scale * 8), - size=0.4 * scale, - fixed=False, - rounded=True, - ), - Computed: dict( - shape="ellipse", - fill="#FBEAEC", - stroke="#B23A48", - fontcolor="#7C2430", - fontsize=round(scale * 10), - size=0.4 * scale, - fixed=False, - rounded=False, - ), - Imported: dict( - shape="ellipse", - fill="#E2ECFA", - stroke="#2A5FA5", - fontcolor="#123A6D", - fontsize=round(scale * 10), - size=0.4 * scale, - fixed=False, - rounded=False, - ), - Part: dict( - shape="box", - fill="#FFFFFF", - stroke="#9AA6B8", - fontcolor="#46536B", - fontsize=round(scale * 8), - size=0.1 * scale, - fixed=False, - rounded=True, - ), - "collapsed": dict( - shape="box3d", - fill="#EDEEF0", - stroke="#808890", - fontcolor="#404040", - fontsize=round(scale * 10), - size=0.5 * scale, - fixed=False, - rounded=False, - ), - } - # Build node_props, handling collapsed nodes specially + # Select the color theme (#1532). Structure (shape/size/rounded) is + # theme-independent; only the fill/stroke/text colors change. + theme_name = self._connection._config.display.diagram_theme + theme = _DIAGRAM_THEMES.get(theme_name, _DIAGRAM_THEMES["light"]) + palette = theme["palette"] + + # Build node_props by merging the structural attributes for each tier + # with the theme's (fill, stroke, text) colors. Collapsed nodes use the + # "collapsed" entry. node_props = {} for node, d in graph.nodes(data=True): - if d.get("collapsed"): - node_props[node] = label_props["collapsed"] - else: - node_props[node] = label_props[d["node_type"]] + tier = "collapsed" if d.get("collapsed") else d["node_type"] + fill, stroke, text = palette[tier] + node_props[node] = dict(_TIER_STRUCTURE[tier], fill=fill, stroke=stroke, fontcolor=text) # A renamed (aliased) FK is drawn as a distinctly-colored edge (there # is no longer an intermediate "alias" node); describe the column @@ -1515,6 +1499,8 @@ def make_dot(self): self._encapsulate_edge_attributes(graph) dot = nx.drawing.nx_pydot.to_pydot(graph) dot.set_rankdir(direction) + if theme["bg"]: + dot.set_bgcolor(theme["bg"]) # Master↔part grouping (#1532): map each part (class name "Master.Part") # to its master ("Master"), and record which parts depend on a sibling @@ -1588,8 +1574,11 @@ def make_dot(self): multi = str(edge.get("multi")) == "True" aliased = str(edge.get("aliased")) == "True" # Renamed FK → a distinct, desaturated amber consistent with the - # modernized palette (#1532); others → a light translucent slate. - edge.set_color("#C77D3A" if aliased else "#3A424F33") + # modernized palette (#1532); others → a translucent slate. Both + # share the theme's edge alpha so the amber sits at the same visual + # density as ordinary edges, differing only in hue. + base = theme["edge_renamed"] if aliased else theme["edge"] + edge.set_color(base + theme["edge_alpha"]) edge.set_style("solid" if primary else "dashed") # Line weight encodes cardinality, and only cardinality. `multi` is # True when the child has primary-key attributes beyond those this @@ -1626,12 +1615,13 @@ def make_dot(self): # chain descends. for schema_name, nodes in schemas.items(): label = cluster_labels.get(schema_name, schema_name) + sc_color, sc_fontcolor = theme["schema_cluster"] cluster = pydot.Cluster( f"cluster_{schema_name}", label=label, style="rounded,dashed", - color="gray", - fontcolor="gray", + color=sc_color, + fontcolor=sc_fontcolor, ) node_by_name = {n.get_name().strip('"'): n for n in nodes} # masters in this schema that have at least one part present @@ -1650,8 +1640,8 @@ def make_dot(self): "cluster_entity_" + master_name.replace(".", "_"), label="", style="rounded,filled", - fillcolor="#F3F5F8", - color="#F3F5F8", + fillcolor=theme["entity_fill"], + color=theme["entity_fill"], ) entity.add_node(node_by_name[master_name]) grouped.add(master_name) diff --git a/src/datajoint/settings.py b/src/datajoint/settings.py index 9bcce0201..f5b53b517 100644 --- a/src/datajoint/settings.py +++ b/src/datajoint/settings.py @@ -70,6 +70,7 @@ "database.create_tables": "DJ_CREATE_TABLES", "loglevel": "DJ_LOG_LEVEL", "display.diagram_direction": "DJ_DIAGRAM_DIRECTION", + "display.diagram_theme": "DJ_DIAGRAM_THEME", } Role = Enum("Role", "manual lookup imported computed job") @@ -245,6 +246,11 @@ class DisplaySettings(BaseSettings): validation_alias="DJ_DIAGRAM_DIRECTION", description="Default diagram layout direction: 'TB' (top-to-bottom) or 'LR' (left-to-right)", ) + diagram_theme: Literal["light", "dark"] = Field( + default="light", + validation_alias="DJ_DIAGRAM_THEME", + description="Default diagram color theme: 'light' or 'dark' (dark background with adjusted palette)", + ) class StoresSettings(BaseSettings): From 9346c2034f8b66f033f12231c341b92067ca50ca Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 15:03:38 -0500 Subject: [PATCH 07/18] feat(#1532): adaptive 'auto' theme; brighten dark entity cluster Add theme='auto': render the diagram in light colors and inject a prefers-color-scheme style block so a single SVG adapts to the viewer's light or dark mode (the two palettes are collision-free, so a per-color attribute-selector override is unambiguous). Exposed via Diagram.svg_string(); make_svg/_repr_svg_ use it. make_dot() gains an optional theme override. Also brighten the dark-theme entity-cluster fill so the master-part grouping box reads against the dark background. --- src/datajoint/diagram.py | 73 +++++++++++++++++++++++++++++++++++---- src/datajoint/settings.py | 7 ++-- 2 files changed, 72 insertions(+), 8 deletions(-) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index 6d96977cd..ad9c6d908 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -97,11 +97,53 @@ edge_renamed="#D68C4A", edge_alpha="C0", schema_cluster=("#606875", "#8A93A1"), - entity_fill="#1E222B", + entity_fill="#2A313D", ), } +def _adaptive_style_block() -> str: + """ + Build a ``" + + class Diagram(nx.MultiDiGraph): # noqa: C901 """ Schema diagram as a directed acyclic graph (DAG). @@ -1396,7 +1438,7 @@ def _encapsulate_node_names(graph: nx.MultiDiGraph) -> None: copy=False, ) - def make_dot(self): + def make_dot(self, theme=None): """ Generate a pydot graph object. @@ -1468,9 +1510,12 @@ def make_dot(self): schema_map[node] = data["schema_name"] # Select the color theme (#1532). Structure (shape/size/rounded) is - # theme-independent; only the fill/stroke/text colors change. - theme_name = self._connection._config.display.diagram_theme - theme = _DIAGRAM_THEMES.get(theme_name, _DIAGRAM_THEMES["light"]) + # theme-independent; only the fill/stroke/text colors change. `theme` + # (an explicit argument) overrides the configured default; "auto" is + # rendered in light colors here and made adaptive at the SVG layer, so + # it maps to the light palette. + theme_name = theme or self._connection._config.display.diagram_theme + theme = _DIAGRAM_THEMES.get(theme_name if theme_name != "auto" else "light", _DIAGRAM_THEMES["light"]) palette = theme["palette"] # Build node_props by merging the structural attributes for each tier @@ -1665,10 +1710,26 @@ def make_dot(self): return dot + def svg_string(self) -> str: + """ + Render the diagram to an SVG string, honoring the color theme. + + For ``theme="auto"`` the diagram is rendered in light colors and a + ``prefers-color-scheme`` style block is injected so a single image + adapts to the viewer's light or dark mode. Other themes render directly. + """ + theme_name = self._connection._config.display.diagram_theme + if theme_name == "auto": + svg = self.make_dot(theme="light").create_svg().decode() + # Insert the adaptive style block right after the opening . + insert_at = svg.find(">", svg.find(" Date: Mon, 10 Aug 2026 15:10:18 -0500 Subject: [PATCH 08/18] style(#1532): Lookup renders as a gray Manual-sized rectangle Match Lookup's box size to Manual (fontsize/size), so a Lookup reads as a gray rectangle the same size as a Manual table rather than a smaller subtle box. Part rendering unchanged (neutral subtle box, per design review). --- src/datajoint/diagram.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index ad9c6d908..fb18cc060 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -54,7 +54,7 @@ _TIER_STRUCTURE = { None: dict(shape="circle", fontsize=round(_scale * 8), size=0.4 * _scale, fixed=False, rounded=False), Manual: dict(shape="box", fontsize=round(_scale * 10), size=0.4 * _scale, fixed=False, rounded=True), - Lookup: dict(shape="box", fontsize=round(_scale * 8), size=0.4 * _scale, fixed=False, rounded=True), + Lookup: dict(shape="box", fontsize=round(_scale * 10), size=0.4 * _scale, fixed=False, rounded=True), Computed: dict(shape="ellipse", fontsize=round(_scale * 10), size=0.4 * _scale, fixed=False, rounded=False), Imported: dict(shape="ellipse", fontsize=round(_scale * 10), size=0.4 * _scale, fixed=False, rounded=False), Part: dict(shape="box", fontsize=round(_scale * 8), size=0.1 * _scale, fixed=False, rounded=True), From 6f4f49a5760132ad0fe349d831d43eee6b806d04 Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 15:11:17 -0500 Subject: [PATCH 09/18] docs(#1532): note parts keep a box for platform clickability A part inherits its master's tier and has no tier-shape of its own, but it keeps a neutral subtle box (not a tier shape) so platform nodes are clickable targets that open the table. Comment this so it isn't reverted to boxless. --- src/datajoint/diagram.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index fb18cc060..d21f48051 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -57,6 +57,10 @@ Lookup: dict(shape="box", fontsize=round(_scale * 10), size=0.4 * _scale, fixed=False, rounded=True), Computed: dict(shape="ellipse", fontsize=round(_scale * 10), size=0.4 * _scale, fixed=False, rounded=False), Imported: dict(shape="ellipse", fontsize=round(_scale * 10), size=0.4 * _scale, fixed=False, rounded=False), + # A part inherits its master's tier and so has no tier-shape of its own; + # historically it was drawn boxless. It nonetheless gets a neutral subtle box + # (not a tier shape) so that on the platform each part is a clickable target + # that opens the table. Keep the box for that reason. Part: dict(shape="box", fontsize=round(_scale * 8), size=0.1 * _scale, fixed=False, rounded=True), "collapsed": dict(shape="box3d", fontsize=round(_scale * 10), size=0.5 * _scale, fixed=False, rounded=False), } From 4ad36370533f8a873f390cce842f575b81fd327d Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 15:14:43 -0500 Subject: [PATCH 10/18] style(#1532): order parts after their master within the shared rank Add invisible ordering edges through each entity's same-rank group (master then parts) so parts are placed below the master in LR and to its right in TB, rather than leaving the within-rank order to Graphviz's heuristic. --- src/datajoint/diagram.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index d21f48051..d9eaf81e9 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -1704,6 +1704,12 @@ def make_dot(self, theme=None): rank = pydot.Subgraph(rank="same") for nm in same_rank: rank.add_node(pydot.Node(nm)) + # Pin the within-rank order: master first, then its + # parts. As flat (same-rank) edges, these place the parts + # after the master — below it in LR, to its right in TB — + # rather than leaving the order to Graphviz's heuristic. + for a, b in zip(same_rank, same_rank[1:]): + rank.add_edge(pydot.Edge(a, b, style="invis")) entity.add_subgraph(rank) cluster.add_subgraph(entity) From 0034923affe456d7d1646c764209b90fbc30a557 Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 15:23:51 -0500 Subject: [PATCH 11/18] fix(#1532): place parts below master (LR) / right of master (TB) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The prior ordering edges were being overridden: inside the entity cluster, the master is anchored by its derivation-chain edges and the real master->part FK edge forced the part above (LR). Fix by (a) marking master->part FK edges constraint=false so they don't vote on within-rank order, and (b) adding an invisible ordering edge whose direction depends on rankdir — reversed (part->master) for LR to put parts below, forward (master->part) for TB to put parts to the right. Both recipes verified empirically. --- src/datajoint/diagram.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index d9eaf81e9..12688a1e6 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -1641,6 +1641,12 @@ def make_dot(self, theme=None): edge.set_penwidth(0.75 if multi else 2) edge.set_weight(1 if multi else 3) edge.set_arrowhead("none") + # A master→part edge is drawn but must NOT constrain the within-rank + # order, so the invisible ordering edges (added per entity below) can + # place the part below the master (LR) / to its right (TB). + dst = edge.get_destination().strip('"') + if dst in part_names and part_master.get(dst) == edge.get_source().strip('"'): + edge.set_constraint("false") # Group nodes into schema clusters (always on) if schema_map: @@ -1704,12 +1710,15 @@ def make_dot(self, theme=None): rank = pydot.Subgraph(rank="same") for nm in same_rank: rank.add_node(pydot.Node(nm)) - # Pin the within-rank order: master first, then its - # parts. As flat (same-rank) edges, these place the parts - # after the master — below it in LR, to its right in TB — - # rather than leaving the order to Graphviz's heuristic. + # Pin the within-rank order so parts sit below the master + # in LR and to its right in TB. Inside a cluster whose + # master is anchored by external (derivation-chain) edges, + # Graphviz's flat-edge ordering is inverted between the two + # orientations, so the invisible ordering edge direction + # is chosen per rankdir (verified empirically). for a, b in zip(same_rank, same_rank[1:]): - rank.add_edge(pydot.Edge(a, b, style="invis")) + tail, head = (a, b) if direction == "TB" else (b, a) + rank.add_edge(pydot.Edge(tail, head, style="invis")) entity.add_subgraph(rank) cluster.add_subgraph(entity) From 7619ccfb498ac22eac34e860934f5947c33c868c Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 15:29:05 -0500 Subject: [PATCH 12/18] revert(#1532): drop within-cluster part ordering hacks Remove the constraint=false on master->part FK edges and the invisible ordering edges. They ordered simple parts (below in LR / right in TB) but could not do so reliably when a part has its own child part (the child edge + cluster crossing- minimization override the flat-edge order), and the special-casing was brittle. Keep the entity clustering and shared rank; leave within-cluster placement to Graphviz. --- src/datajoint/diagram.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index 12688a1e6..d21f48051 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -1641,12 +1641,6 @@ def make_dot(self, theme=None): edge.set_penwidth(0.75 if multi else 2) edge.set_weight(1 if multi else 3) edge.set_arrowhead("none") - # A master→part edge is drawn but must NOT constrain the within-rank - # order, so the invisible ordering edges (added per entity below) can - # place the part below the master (LR) / to its right (TB). - dst = edge.get_destination().strip('"') - if dst in part_names and part_master.get(dst) == edge.get_source().strip('"'): - edge.set_constraint("false") # Group nodes into schema clusters (always on) if schema_map: @@ -1710,15 +1704,6 @@ def make_dot(self, theme=None): rank = pydot.Subgraph(rank="same") for nm in same_rank: rank.add_node(pydot.Node(nm)) - # Pin the within-rank order so parts sit below the master - # in LR and to its right in TB. Inside a cluster whose - # master is anchored by external (derivation-chain) edges, - # Graphviz's flat-edge ordering is inverted between the two - # orientations, so the invisible ordering edge direction - # is chosen per rankdir (verified empirically). - for a, b in zip(same_rank, same_rank[1:]): - tail, head = (a, b) if direction == "TB" else (b, a) - rank.add_edge(pydot.Edge(tail, head, style="invis")) entity.add_subgraph(rank) cluster.add_subgraph(entity) From 378caf6a13b96c94558b631770f912c6b17e75d2 Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 15:35:42 -0500 Subject: [PATCH 13/18] test(#1532): add diagram style-regression fixture; robust part detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a style-contract test that renders a fixed schema per theme and asserts the palette (per-tier fill/stroke), thick/thin edge weights, entity cluster, dark background, and adaptive prefers-color-scheme block — catching palette/weight/ theme regressions without pinning fragile SVG geometry. Also make master<->part detection in make_dot robust to both node-naming schemes (class 'Master.Part' and raw 'schema.master__part'), using the actual node keys for predecessor lookups instead of reconstructing them — the old code crashed on raw-table-name graphs. --- src/datajoint/diagram.py | 38 ++++++-- tests/integration/test_diagram_style.py | 111 ++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 tests/integration/test_diagram_style.py diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index d21f48051..ce0f2991e 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -1551,20 +1551,40 @@ def make_dot(self, theme=None): if theme["bg"]: dot.set_bgcolor(theme["bg"]) - # Master↔part grouping (#1532): map each part (class name "Master.Part") - # to its master ("Master"), and record which parts depend on a sibling - # part so an intra-group chain can descend rather than share a rank. + # Master↔part grouping (#1532): map each part to its master, and record + # which parts depend on a sibling part so an intra-group chain can + # descend rather than share a rank. Nodes may be named either by class + # ("Master.Part") when a context resolves them, or by raw table name + # ("schema.master__part") otherwise, so the master is found by trying + # both suffix conventions against the actual node keys. Everything here + # is keyed by the stripped node name (matching the loops below). + key_by_stripped = {k.strip('"'): k for k in graph.nodes()} + + def _master_of(part_stripped): + candidates = set() + if "." in part_stripped: + candidates.add(part_stripped.rsplit(".", 1)[0]) # class: Master.Part -> Master + if "__" in part_stripped: + candidates.add(part_stripped.rsplit("__", 1)[0]) # table: ...master__part -> ...master + for candidate in candidates: + if candidate in key_by_stripped: + return candidate + return None + part_master = {} for gname, gdata in graph.nodes(data=True): if gdata.get("node_type") is Part: - pn = gname.strip('"') - part_master[pn] = pn.rsplit(".", 1)[0] + part_stripped = gname.strip('"') + master_stripped = _master_of(part_stripped) + if master_stripped is not None: + part_master[part_stripped] = master_stripped part_names = set(part_master) depends_on_sibling = set() - for pn, mn in part_master.items(): - for pred in graph.predecessors(f'"{pn}"'): - if pred.strip('"') in part_names and part_master.get(pred.strip('"')) == mn: - depends_on_sibling.add(pn) + for part_stripped, master_stripped in part_master.items(): + for pred in graph.predecessors(key_by_stripped[part_stripped]): + pred_stripped = pred.strip('"') + if pred_stripped in part_names and part_master.get(pred_stripped) == master_stripped: + depends_on_sibling.add(part_stripped) for node in dot.get_nodes(): node.set_shape("circle") diff --git a/tests/integration/test_diagram_style.py b/tests/integration/test_diagram_style.py new file mode 100644 index 000000000..984de4ed6 --- /dev/null +++ b/tests/integration/test_diagram_style.py @@ -0,0 +1,111 @@ +""" +Style-contract (visual-regression) guard for the modernized dj.Diagram (#1532). + +Rather than diff exact SVG geometry against a checked-in reference — which drifts +with the Graphviz version — this renders a fixed schema per theme and asserts the +style invariants the restyle controls: each tier's fill/stroke palette, the +thick/thin edge weights, rounded boxes, entity clusters, the dark background, and +the adaptive `prefers-color-scheme` block. A palette, weight, or theme regression +fails here; a layout tweak does not. +""" + +import time + +import pytest + +import datajoint as dj + + +@pytest.fixture(scope="function") +def schema_by_backend(connection_by_backend, db_creds_by_backend): + backend = db_creds_by_backend["backend"] + test_id = str(int(time.time() * 1000))[-8:] + schema_name = f"djtest_style_{backend}_{test_id}"[:64] + if connection_by_backend.is_connected: + try: + connection_by_backend.query( + f"DROP DATABASE IF EXISTS {connection_by_backend.adapter.quote_identifier(schema_name)}" + ) + except Exception: + pass + schema = dj.Schema(schema_name, connection=connection_by_backend) + yield schema + if connection_by_backend.is_connected: + try: + connection_by_backend.query( + f"DROP DATABASE IF EXISTS {connection_by_backend.adapter.quote_identifier(schema_name)}" + ) + except Exception: + pass + + +def _build(schema): + @schema + class Subject(dj.Manual): + definition = "subject_id : int32" + + @schema + class Params(dj.Lookup): + definition = "param_id : int32" + + @schema + class Session(dj.Manual): + definition = "-> Subject\nsession_id : int32" + + class Note(dj.Part): + definition = "-> master\nnote_id : int32" + + @schema + class Scan(dj.Imported): + definition = "-> Session" # 1:1 -> thick edge + + @schema + class Analysis(dj.Computed): + definition = "-> Scan\n-> Params" # composite -> thin edge + + # Return a context so the diagram resolves nodes to class names (the normal + # rendering path — users have their classes in scope). + return dict(Subject=Subject, Params=Params, Session=Session, Scan=Scan, Analysis=Analysis) + + +def _svg(schema, context, theme): + with dj.config.override(display__diagram_theme=theme): + return dj.Diagram(schema, context=context).svg_string().lower() + + +def test_light_theme_style(schema_by_backend): + if not dj.diagram.diagram_active: + pytest.skip("networkx/pydot not available") + ctx = _build(schema_by_backend) + svg = _svg(schema_by_backend, ctx, "light") + # tier fills + for fill in ("#e7f3ec", "#f2f4f7", "#e2ecfa", "#fbeaec", "#ffffff"): + assert fill in svg, f"light tier fill {fill} missing" + # a couple tier strokes + for stroke in ("#2f7d5b", "#b23a48"): + assert stroke in svg, f"light tier stroke {stroke} missing" + # thick (1:1) and thin (multi) edge weights both present + assert 'stroke-width="2"' in svg, "thick (1:1) edge missing" + assert 'stroke-width="0.75"' in svg, "thin (multi-valued) edge missing" + assert "cluster_entity_" in svg, "entity cluster missing" + assert "161a21" not in svg, "light theme must not use the dark background" + + +def test_dark_theme_style(schema_by_backend): + if not dj.diagram.diagram_active: + pytest.skip("networkx/pydot not available") + ctx = _build(schema_by_backend) + svg = _svg(schema_by_backend, ctx, "dark") + assert "#161a21" in svg, "dark background missing" + for fill in ("#16281f", "#152538", "#331a1f"): + assert fill in svg, f"dark tier fill {fill} missing" + + +def test_auto_theme_is_adaptive(schema_by_backend): + if not dj.diagram.diagram_active: + pytest.skip("networkx/pydot not available") + ctx = _build(schema_by_backend) + svg = _svg(schema_by_backend, ctx, "auto") + assert "@media (prefers-color-scheme: dark)" in svg, "auto theme must inject the adaptive media block" + # base render is light; the media block maps a light color to its dark counterpart + assert "#e7f3ec" in svg and "#16281f" in svg, "auto theme must carry both light base and dark override colors" From de9784570df5216da6feac79abb87ce53b32f1f8 Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 16:22:34 -0500 Subject: [PATCH 14/18] feat(#1532): default diagram theme to 'auto'; sans schema labels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make 'auto' (adaptive light/dark SVG) the default diagram_theme, so rendered diagrams adapt to the viewer's appearance out of the box. Also set the schema cluster label to Helvetica — it previously fell back to Graphviz's Times default while the node labels were already sans. --- src/datajoint/diagram.py | 1 + src/datajoint/settings.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index ce0f2991e..23486510d 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -1691,6 +1691,7 @@ def _master_of(part_stripped): style="rounded,dashed", color=sc_color, fontcolor=sc_fontcolor, + fontname="Helvetica", # schema label in a sans font, not Graphviz's Times default ) node_by_name = {n.get_name().strip('"'): n for n in nodes} # masters in this schema that have at least one part present diff --git a/src/datajoint/settings.py b/src/datajoint/settings.py index bbb121e40..8bac20f81 100644 --- a/src/datajoint/settings.py +++ b/src/datajoint/settings.py @@ -247,11 +247,11 @@ class DisplaySettings(BaseSettings): description="Default diagram layout direction: 'TB' (top-to-bottom) or 'LR' (left-to-right)", ) diagram_theme: Literal["light", "dark", "auto"] = Field( - default="light", + default="auto", validation_alias="DJ_DIAGRAM_THEME", description=( - "Default diagram color theme: 'light', 'dark' (dark background with adjusted palette), " - "or 'auto' (single SVG that adapts to the viewer's light/dark mode)" + "Default diagram color theme: 'auto' (single SVG that adapts to the viewer's light/dark " + "mode; default), 'light', or 'dark' (dark background with adjusted palette)" ), ) From 8435f7d52ab4ba9b8e7946de0a86e9ce6a83aa27 Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Mon, 10 Aug 2026 18:09:50 -0500 Subject: [PATCH 15/18] diagram: place schema name in the top-right corner of its cluster Set labelloc=t, labeljust=r on the schema cluster so the schema/module label sits in the top-right corner rather than top-center. --- src/datajoint/diagram.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index 23486510d..d1dde45a5 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -1688,6 +1688,8 @@ def _master_of(part_stripped): cluster = pydot.Cluster( f"cluster_{schema_name}", label=label, + labelloc="t", + labeljust="r", # schema name in the top-right corner of the cluster style="rounded,dashed", color=sc_color, fontcolor=sc_fontcolor, From 7be82e9099530f16e0f848a42f39e20026baa22f Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Tue, 11 Aug 2026 08:39:03 -0500 Subject: [PATCH 16/18] diagram(mermaid): align make_mermaid with the modernized notation make_mermaid was a stale second renderer on the pre-#1533/#1534 model. Bring it to parity with the Graphviz path: - share the tier palette from _DIAGRAM_THEMES["light"] (drop the old bright #90EE90/#FFB6C1/#ADD8E6 colors) - encode edge thickness as cardinality via linkStyle (thick=1:1, thin=one-to- many) instead of solid/dotted primary-vs-secondary - color renamed FKs in the theme's amber (#C77D3A) - nest a master and its parts in an entity subgraph Documents the three Graphviz features Mermaid can't express (top-right schema label, Helvetica, dimension underline) and leaves dark mode to the host theme. Adds a parity test. --- src/datajoint/diagram.py | 162 +++++++++++++++--------- tests/integration/test_diagram_style.py | 45 +++++++ 2 files changed, 146 insertions(+), 61 deletions(-) diff --git a/src/datajoint/diagram.py b/src/datajoint/diagram.py index d1dde45a5..336b2e514 100644 --- a/src/datajoint/diagram.py +++ b/src/datajoint/diagram.py @@ -1783,19 +1783,33 @@ def make_mermaid(self) -> str: ----- Layout direction is controlled via ``dj.config.display.diagram_direction``. Tables are grouped by schema using Mermaid subgraphs, with the Python - module name shown as the group label when available. + module name shown as the group label when available. A master and its + parts are nested in an inner subgraph, mirroring the Graphviz entity + cluster. + + The notation matches the modernized Graphviz renderer (#1532/#1533): + the tier palette is shared from ``_DIAGRAM_THEMES["light"]``; edge + thickness encodes cardinality (thick = 1:1, thin = one-to-many), + **not** primary-vs-secondary; renamed foreign keys are drawn in the + theme's amber. Three Graphviz features have no Mermaid equivalent and + are omitted: the top-right schema-label placement, the Helvetica font, + and the underline marking a dimension-introducing table. Dark mode is + left to the Mermaid host's theme rather than emitted inline. Examples -------- >>> print(dj.Diagram(schema).make_mermaid()) flowchart TB - subgraph my_pipeline + classDef manual fill:#E7F3EC,stroke:#2F7D5B,color:#1B5138 + ... + subgraph my_pipeline["my_pipeline"] Mouse[Mouse]:::manual Session[Session]:::manual Neuron([Neuron]):::computed end Mouse --> Session Session --> Neuron + linkStyle 0 stroke:#3A424F,stroke-width:1px """ graph = self._make_graph() direction = self._connection._config.display.diagram_direction @@ -1829,87 +1843,113 @@ def make_mermaid(self) -> str: else: cluster_labels[schema_name] = schema_name - lines = [f"flowchart {direction}"] - - # Define class styles matching Graphviz colors - lines.append(" classDef manual fill:#90EE90,stroke:#006400") - lines.append(" classDef lookup fill:#D3D3D3,stroke:#696969") - lines.append(" classDef computed fill:#FFB6C1,stroke:#8B0000") - lines.append(" classDef imported fill:#ADD8E6,stroke:#00008B") - lines.append(" classDef part fill:#FFFFFF,stroke:#000000") - lines.append(" classDef collapsed fill:#808080,stroke:#404040") - lines.append("") - - # Shape mapping: Manual=box, Computed/Imported=stadium, Lookup/Part=box - shape_map = { - Manual: ("[", "]"), # box - Lookup: ("[", "]"), # box - Computed: ("([", "])"), # stadium/pill - Imported: ("([", "])"), # stadium/pill - Part: ("[", "]"), # box - None: ("((", "))"), # circle - } + lines = [f"flowchart {direction}", ""] + # Tier styles are shared from the modernized Graphviz light theme so the + # two renderers speak one palette. Each tuple is (fill, stroke, text). + theme = _DIAGRAM_THEMES["light"] tier_class = { Manual: "manual", Lookup: "lookup", Computed: "computed", Imported: "imported", Part: "part", - None: "", + None: "other", } + for tier, cls in tier_class.items(): + fill, stroke, text = theme["palette"][tier] + lines.append(f" classDef {cls} fill:{fill},stroke:{stroke},color:{text}") + cf, cs, ct = theme["palette"]["collapsed"] + lines.append(f" classDef collapsed fill:{cf},stroke:{cs},color:{ct}") + lines.append("") - # Group nodes by schema into subgraphs (including collapsed nodes) - schemas = {} - for node, data in graph.nodes(data=True): + # Shape mapping: Manual/Lookup/Part = box, Computed/Imported = stadium. + shape_map = { + Manual: ("[", "]"), + Lookup: ("[", "]"), + Part: ("[", "]"), + Computed: ("([", "])"), + Imported: ("([", "])"), + None: ("((", "))"), + } + + def safe(n): + return n.replace(".", "_").replace(" ", "_") + + node_data = {n: d for n, d in graph.nodes(data=True)} + + # Identify master-part groups (same convention as the Graphviz entity + # cluster) so a master and its parts nest in an inner subgraph. + def _master_of(part): + for cand in ( + part.rsplit(".", 1)[0] if "." in part else None, + part.rsplit("__", 1)[0] if "__" in part else None, + ): + if cand is not None and cand in node_data: + return cand + return None + + part_master = {n: m for n, d in node_data.items() if d.get("node_type") is Part and (m := _master_of(n)) is not None} + parts_of = {} + for p, m in part_master.items(): + parts_of.setdefault(m, []).append(p) + + def node_line(node, data, indent, label): + safe_id = safe(node) if data.get("collapsed"): - # Collapsed nodes use their schema_name attribute - schema_name = data.get("schema_name") + tc = data.get("table_count", 0) + txt = f"{tc} tables" if tc != 1 else "1 table" + return f'{indent}{safe_id}[["({txt})"]]:::collapsed' + tier = data.get("node_type") + left, right = shape_map.get(tier, ("[", "]")) + cls = tier_class.get(tier, "other") + if node in part_master: + # part shows only its own name (entity subgraph carries the master) + display = node.rsplit(".", 1)[-1] else: - schema_name = schema_map.get(node) + display = node[len(label) + 1 :] if ("." in node and node.startswith(label + ".")) else node + return f"{indent}{safe_id}{left}{display}{right}:::{cls}" + + # Group nodes by schema into subgraphs (including collapsed nodes) + schemas = {} + for node, data in node_data.items(): + schema_name = data.get("schema_name") if data.get("collapsed") else schema_map.get(node) if schema_name: - if schema_name not in schemas: - schemas[schema_name] = [] - schemas[schema_name].append((node, data)) + schemas.setdefault(schema_name, []).append((node, data)) - # Add nodes grouped by schema subgraphs for schema_name, nodes in schemas.items(): label = cluster_labels.get(schema_name, schema_name) - lines.append(f" subgraph {label}") + lines.append(f' subgraph {safe(schema_name)}["{label}"]') + rendered = set() + # masters in this schema with their parts nested in an entity subgraph for node, data in nodes: - safe_id = node.replace(".", "_").replace(" ", "_") - if data.get("collapsed"): - # Collapsed node - show only table count - table_count = data.get("table_count", 0) - count_text = f"{table_count} tables" if table_count != 1 else "1 table" - lines.append(f' {safe_id}[["({count_text})"]]:::collapsed') - else: - # Regular node - tier = data.get("node_type") - left, right = shape_map.get(tier, ("[", "]")) - cls = tier_class.get(tier, "") - # Strip module prefix from display name if it matches the cluster label - display_name = node - if "." in node and node.startswith(label + "."): - display_name = node[len(label) + 1 :] - class_suffix = f":::{cls}" if cls else "" - lines.append(f" {safe_id}{left}{display_name}{right}{class_suffix}") + if node in parts_of and node not in rendered: + lines.append(f' subgraph entity_{safe(node)}[" "]') + lines.append(node_line(node, data, " ", label)) + rendered.add(node) + for p in parts_of[node]: + lines.append(node_line(p, node_data.get(p, {}), " ", label)) + rendered.add(p) + lines.append(" end") + # standalone nodes (and any part whose master is elsewhere) + for node, data in nodes: + if node not in rendered: + lines.append(node_line(node, data, " ", label)) + rendered.add(node) lines.append(" end") lines.append("") - # Add edges. Enumerate so aliased (renamed) FK edges can be recolored - # via linkStyle by their declaration index (Mermaid keys link styles by - # the order edges appear). Parallel FKs are separate edges here. + # Edges. Enumerate so each edge's linkStyle keys by appearance order + # (Mermaid's convention). Parallel FKs are separate edges. Thickness + # encodes cardinality (thick = 1:1, thin = one-to-many); renamed FKs + # take the theme's amber. Arrows point parent -> child. link_styles = [] for idx, (src, dest, data) in enumerate(graph.edges(data=True)): - safe_src = src.replace(".", "_").replace(" ", "_") - safe_dest = dest.replace(".", "_").replace(" ", "_") - # Solid arrow for primary FK, dotted for non-primary - style = "-->" if data.get("primary") else "-.->" - lines.append(f" {safe_src} {style} {safe_dest}") - if data.get("aliased"): - link_styles.append(f" linkStyle {idx} stroke:#FF8800") + lines.append(f" {safe(src)} --> {safe(dest)}") + color = theme["edge_renamed"] if data.get("aliased") else theme["edge"] + width = "1px" if data.get("multi") else "2px" + link_styles.append(f" linkStyle {idx} stroke:{color},stroke-width:{width}") lines.extend(link_styles) return "\n".join(lines) diff --git a/tests/integration/test_diagram_style.py b/tests/integration/test_diagram_style.py index 984de4ed6..b4c2e1821 100644 --- a/tests/integration/test_diagram_style.py +++ b/tests/integration/test_diagram_style.py @@ -109,3 +109,48 @@ def test_auto_theme_is_adaptive(schema_by_backend): assert "@media (prefers-color-scheme: dark)" in svg, "auto theme must inject the adaptive media block" # base render is light; the media block maps a light color to its dark counterpart assert "#e7f3ec" in svg and "#16281f" in svg, "auto theme must carry both light base and dark override colors" + + +def test_mermaid_matches_modernized_notation(schema_by_backend): + """`make_mermaid` speaks the same notation as the Graphviz renderer: + shared palette, cardinality-weighted edges, amber renamed FKs, and + master-part entity nesting.""" + if not dj.diagram.diagram_active: + pytest.skip("networkx/pydot not available") + schema = schema_by_backend + + @schema + class Subject(dj.Manual): + definition = "subject_id : int32" + + @schema + class Scan(dj.Imported): + definition = "-> Subject\nscan_id : int32" # composite PK -> thin edges + + class Field(dj.Part): + definition = "-> master\nfield_id : int32" + + @schema + class Analysis(dj.Computed): + definition = "-> Scan.proj(src_scan='scan_id')" # renamed FK, whole PK -> thick amber + + ctx = dict(Subject=Subject, Scan=Scan, Analysis=Analysis) + mmd = dj.Diagram(schema, context=ctx).make_mermaid() + + # shared light-theme palette (classDefs), not the old bright colors + assert "classDef manual fill:#E7F3EC,stroke:#2F7D5B" in mmd + assert "classDef computed fill:#FBEAEC,stroke:#B23A48" in mmd + assert "#90EE90" not in mmd, "old bright palette must be gone" + + # cardinality edge weights via linkStyle: thick 1:1 and thin one-to-many both present + assert "stroke-width:2px" in mmd, "thick (1:1) edge missing" + assert "stroke-width:1px" in mmd, "thin (one-to-many) edge missing" + # cardinality replaces the old primary/secondary dotted-edge encoding + assert "-.->" not in mmd, "edges must not encode primary/secondary as dotted" + + # renamed FK takes the theme's amber; ordinary edges the slate + assert "stroke:#C77D3A" in mmd, "renamed-FK amber missing" + assert "stroke:#3A424F" in mmd, "ordinary edge slate missing" + + # master-part group nests in an entity subgraph + assert "subgraph entity_" in mmd, "master-part entity nesting missing" From 97fe57efaa1cad71e45247c3f8d9682bcf994954 Mon Sep 17 00:00:00 2001 From: Dimitri Yatsenko Date: Tue, 11 Aug 2026 12:36:52 -0500 Subject: [PATCH 17/18] docs(readme): regenerate pipeline figure in dj.Diagram notation (adaptive) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Redraw the README example-pipeline figure in the modernized dj.Diagram notation (muted tier palette + colored strokes, Imported/Computed ovals, Manual/Lookup rectangles, thick/thin cardinality edges, master-part entity cluster). Activity is now a Part of Segmentation: cell_mask and trace live on Segmentation.Activity and make() inserts into the part. The SVG is theme-adaptive (auto) — light by default, dark via prefers-color-scheme — so reference the SVG directly and drop the stale raster PNG. --- images/pipeline.png | Bin 180638 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 images/pipeline.png diff --git a/images/pipeline.png b/images/pipeline.png deleted file mode 100644 index 48f5f3ecde57f491a7a7fbd29ccbd312e8b7b9d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180638 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

g%~%0LBZ9v>g5`= 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 Date: Tue, 11 Aug 2026 12:37:09 -0500 Subject: [PATCH 18/18] docs(readme): use adaptive dj.Diagram pipeline figure Point the README at the restyled, theme-adaptive images/pipeline.svg (modernized dj.Diagram notation; Activity as a Part of Segmentation with cell_mask/trace on the part and make() inserting into it). --- README.md | 2 +- images/pipeline.svg | 239 ++++++++++++++++++++++++++------------------ 2 files changed, 144 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index 835d206e5..c4cf3b280 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ conda install -c conda-forge datajoint ## Example Pipeline -![pipeline](images/pipeline.png) +![pipeline](images/pipeline.svg) **Cite DataJoint:** [Yatsenko et al., 2026](https://arxiv.org/abs/2602.16585) — RRID: [SCR_014543](https://scicrunch.org/resolver/SCR_014543) diff --git a/images/pipeline.svg b/images/pipeline.svg index 94154a0c7..8c2cb600e 100644 --- a/images/pipeline.svg +++ b/images/pipeline.svg @@ -1,118 +1,165 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - Subject + + Subject - - Session + + Session - - Scan + + Scan - - AverageFrame + + AverageFrame - - SegmentationParams - - - - Segmentation - - - - Activity - - - - - - + + SegmentationParams + + + + Segmentation - - + + + Activity - + + + + + + + + - @schema - class Segmentation(dj.Computed): - definition = """ - -> AverageFrame - -> SegmentationParams - --- - num_cells: int32 - cell_masks : <blob@> - """ - def make(self, key): - frame = (AverageFrame & key).fetch1('frame') - params = (SegmentationParams & key).fetch1() - masks, n = segment(frame, **params) - self.insert1(dict(key, num_cells=n, cell_masks=masks)) + font-size="16" fill="#24292e"> + @schema + class Segmentation(dj.Computed): + definition = """ + -> AverageFrame + -> SegmentationParams + --- + num_cells : int32 + """ + + class Activity(dj.Part): + definition = """ + -> master + roi_id : int32 + --- + cell_mask : <blob@> + trace : <blob@> + """ + + def make(self, key): + frame = (AverageFrame & key).fetch1('frame') + params = (SegmentationParams & key).fetch1() + masks, traces = segment(frame, **params) + self.insert1(dict(key, num_cells=len(masks))) + self.Activity.insert( + dict(key, roi_id=i, cell_mask=m, trace=t) + for i, (m, t) in enumerate(zip(masks, traces))) - - database link - - - table name - - - dependency - - - object-store attribute - - - computation - + + database link + + + table name + + + dependency + + + part table + + + object-store attribute + + + computation +