Index: doc/theses/mike_brooks_MMath/plots/ListCommon.py
===================================================================
--- doc/theses/mike_brooks_MMath/plots/ListCommon.py	(revision 806534c33b76c15f8fcbe15f6e5dd9cc2af0f376)
+++ doc/theses/mike_brooks_MMath/plots/ListCommon.py	(revision d1ccc57d1942a4fa9108a4a0eda75497665de223)
@@ -136,11 +136,23 @@
     #   print( "marginalizing on", marginalizeOn, "conditioning on", conditionOn, file=sys.stderr )
 
-        stats = canonSrc.groupby(conditionOn)['mean_op_dur_ns'].agg(**{
-            c_tgtPeers: 'count',
-            c_tgtBl: gmean
-        })
-        group_lookup = timings.set_index(conditionOn).index
-        timings[c_tgtPeers] = stats[c_tgtPeers].reindex(group_lookup).values
-        timings[c_tgtBl] = stats[c_tgtBl].reindex(group_lookup).values
+        if conditionOn:
+            stats = canonSrc.groupby(conditionOn)['mean_op_dur_ns'].agg(**{
+                c_tgtPeers: 'count',
+                c_tgtBl: gmean
+            })
+            group_lookup = timings.set_index(conditionOn).index
+            timings[c_tgtPeers] = stats[c_tgtPeers].reindex(group_lookup).values
+            timings[c_tgtBl] = stats[c_tgtBl].reindex(group_lookup).values
+        else:
+            stats = canonSrc.groupby((lambda _: 0))['mean_op_dur_ns'].agg(**{
+                c_tgtPeers: 'count',
+                c_tgtBl: gmean
+            })
+            # Extract the single row
+            row = stats.iloc[0]
+            # Broadcast to all rows
+            timings[c_tgtPeers] = row[c_tgtPeers]
+            timings[c_tgtBl] = row[c_tgtBl]
+
 
         # everywhere := itself / [preferred-subset derived]
@@ -405,5 +417,9 @@
     tgtAccessor = 'all',
     tgtInterleave = 0.0,
-    marginalizeOn=['fx'] ):
+    drillOn = ['fx'],
+    marginalizeOn = None ):  # None means match drill-on
+
+    if marginalizeOn == None:
+        marginalizeOn = drillOn
 
     # watch out for filtering too early here; need everything sticking around until baselines are applies
@@ -450,5 +466,5 @@
     aggregated[ c_measureBkt ] = aggregated[c_measure].apply( botOfBucketOfVal )
 
-    marggrp = aggregated.groupby(marginalizeOn)
+    drillgrp = aggregated.groupby(drillOn)
 
 
@@ -457,8 +473,8 @@
     # print()
 
-    for mkey, mgroup in marggrp:
+    for dkey, dgroup in drillgrp:
 #       print(mgroup, file=sys.stderr)
 
-        histo_raw = mgroup[ c_measureBkt ].value_counts()
+        histo_raw = dgroup[ c_measureBkt ].value_counts()
         for b in buckets:
             if b not in histo_raw.keys():
@@ -472,5 +488,5 @@
         histo.insert(y_lo_col_loc + 1, "y_hi", histo["y_lo"].apply(topValOfBucketBotVal))
 
-        header = str.join(', ', mkey)
+        header = str.join(', ', dkey)
         print(f'"{header}"')
         text = histo.to_csv(header=False, index=False, sep='\t')
Index: doc/theses/mike_brooks_MMath/plots/list-mchn-szz.py
===================================================================
--- doc/theses/mike_brooks_MMath/plots/list-mchn-szz.py	(revision 806534c33b76c15f8fcbe15f6e5dd9cc2af0f376)
+++ doc/theses/mike_brooks_MMath/plots/list-mchn-szz.py	(revision d1ccc57d1942a4fa9108a4a0eda75497665de223)
@@ -11,3 +11,4 @@
     tgtPolarity = 'all',
     tgtAccessor = 'all',
-    marginalizeOn=['machine', 'SizeZone'] )
+    drillOn=['machine', 'SizeZone'],
+    marginalizeOn=explanations )
