Index: doc/theses/mike_brooks_MMath/benchmarks/string/string-separate-compilation-overhead.README.txt
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/string/string-separate-compilation-overhead.README.txt	(revision 810c2c596a73f36f250f13be31cf07734799f98a)
+++ doc/theses/mike_brooks_MMath/benchmarks/string/string-separate-compilation-overhead.README.txt	(revision 810c2c596a73f36f250f13be31cf07734799f98a)
@@ -0,0 +1,22 @@
+The overhead-amount numbers are produced in MS Excel, to fast-track a data exploration result "into production."
+The python script overlays them onto the data that gives the location at which they should be drawn.
+
+[string-separate-compilation-overhead.xlsx]
+'Raw' tab
+- side-by-side pastes of
+  A-I, b.*: result-allocate-speed-cfa.csv
+  J-R, ns.*: result-allocate-speed-cfa-NOSEPCOMP.csv
+- with calculated columns in S+
+- cmp.chk verifies the pastes line up
+- cmp.DeltaOpDur is the key output: nanoseconds by which NoSepCmp beats Baseline
+'Agg' tab
+- power query on raw: group by {corp-len-grp, tun}; each group has 5 repeat runs
+- a group's mean cmp.DeltaOpDur is the NoSepCmp advantage at this corpus length and tuning choice
+last tab
+- pick just the two overhead cases that the graph uses; project only the overhead delta
+- the groups (50, 0.2) and (200, 0.2) correspond to the pair of CFA configurations in plot-string-allocn-attrib
+- export as %.csv 
+
+[string-separate-compilation-overhead.csv]
+- export of %.xlsx, last tab
+- input to the "usual" Python script
Index: doc/theses/mike_brooks_MMath/benchmarks/string/string-separate-compilation-overhead.csv
===================================================================
--- doc/theses/mike_brooks_MMath/benchmarks/string/string-separate-compilation-overhead.csv	(revision 810c2c596a73f36f250f13be31cf07734799f98a)
+++ doc/theses/mike_brooks_MMath/benchmarks/string/string-separate-compilation-overhead.csv	(revision 810c2c596a73f36f250f13be31cf07734799f98a)
@@ -0,0 +1,3 @@
+﻿size,tuning,key,mean DeltaOpDur
+50,0.2,50:0.2,1.935964369
+200,0.2,200:0.2,4.526384769
Index: doc/theses/mike_brooks_MMath/plots/string-allocn-attrib-sepcmp.py
===================================================================
--- doc/theses/mike_brooks_MMath/plots/string-allocn-attrib-sepcmp.py	(revision 810c2c596a73f36f250f13be31cf07734799f98a)
+++ doc/theses/mike_brooks_MMath/plots/string-allocn-attrib-sepcmp.py	(revision 810c2c596a73f36f250f13be31cf07734799f98a)
@@ -0,0 +1,44 @@
+import pandas as pd
+import numpy as np
+import os
+import sys
+from pathlib import Path
+
+sys.path.insert(0, os.path.dirname(__file__))
+from common import *
+
+infile_attrib = os.path.dirname(os.path.abspath(__file__)) + '/../build/plot-string-allocn-attrib.dat'
+attribs = pd.read_csv(infile_attrib, 
+                        sep='\t',
+                        header=0)
+
+infile_sepcmp = os.path.dirname(os.path.abspath(__file__)) + '/../benchmarks/string/string-separate-compilation-overhead.csv'
+sepcmps = pd.read_csv(infile_sepcmp, 
+                        header=0)
+
+# putting the sepcmp bar at the top of 'other', so just below ctor-dtor
+category_above_semcmp = 'ctor-dtor'
+
+# print(attribs)
+# print(sepcmps)
+
+# print(attribs.columns)
+
+isfirst = True
+
+for _,scr in sepcmps.iterrows():
+    size = scr['size']
+#    tuning = r['tuning']
+    attrib_key = attribs[ (attribs['corpus-meanlen-tgt'] == size) &
+                            (attribs['sut-platform'] == 'cfa') &
+                           ( attribs['category'] == category_above_semcmp )]
+    attrib_key = attrib_key.copy()
+#    print(attrib_key)
+    assert( len(attrib_key) == 1 )
+#    attrib_key = attrib_key.iloc[0] # convert from singleton table to row
+    attrib_key['sepcmp-Delta'] = scr['mean DeltaOpDur']
+    attrib_key['sepcmp-adjusted'] = attrib_key['grp-prior-duration-ns'] - attrib_key['sepcmp-Delta']
+
+    print(attrib_key.to_csv(header=isfirst, index=False, sep='\t', na_rep="0"), end='')
+    isfirst = False
+
Index: doc/theses/mike_brooks_MMath/plots/string-allocn.d
===================================================================
--- doc/theses/mike_brooks_MMath/plots/string-allocn.d	(revision 79f1285aa1d04ff9f1897f55f3205b23ce00836a)
+++ doc/theses/mike_brooks_MMath/plots/string-allocn.d	(revision 810c2c596a73f36f250f13be31cf07734799f98a)
@@ -1,4 +1,5 @@
 plots/string-allocn.gp.INPUTS: build/plot-string-allocn.dat
 plots/string-allocn.gp.INPUTS: build/plot-string-allocn-attrib.dat
+plots/string-allocn.gp.INPUTS: build/plot-string-allocn-attrib-sepcmp.dat
 plots/string-allocn.py.INPUTS: benchmarks/string/result-allocate-space-cfa.ssv
 plots/string-allocn.py.INPUTS: benchmarks/string/result-allocate-space-stl.ssv
@@ -7,2 +8,4 @@
 plots/string-allocn-attrib.py.INPUTS: benchmarks/string/result-allocate-attrib-stl.ssv
 plots/string-allocn-attrib.py.INPUTS: benchmarks/string/result-allocate-attrib-cfa.ssv
+plots/string-allocn-attrib-sepcmp.py.INPUTS: benchmarks/string/string-separate-compilation-overhead.csv
+plots/string-allocn-attrib-sepcmp.py.INPUTS: build/plot-string-allocn-attrib.dat
Index: doc/theses/mike_brooks_MMath/plots/string-allocn.gp
===================================================================
--- doc/theses/mike_brooks_MMath/plots/string-allocn.gp	(revision 79f1285aa1d04ff9f1897f55f3205b23ce00836a)
+++ doc/theses/mike_brooks_MMath/plots/string-allocn.gp	(revision 810c2c596a73f36f250f13be31cf07734799f98a)
@@ -112,5 +112,16 @@
 }
 
+# bonus legend of black box = sepcomp overhead
+set object rect from graph 0.05, graph 0.92 to graph 0.11, graph 0.935 fc rgb "black"
+set label "sep. comp.\noverhead" at graph 0.14, graph 0.935 left font "Times,15"
 
+pattern(i) = \
+    (i==1 ? 1 : \
+     i==2 ? 4 : \
+     i==3 ? 2 : \
+     i==4 ? 6 : \
+     i==5 ? 3 : \
+     i==6 ? 5 : \
+              1)
 
 plot \
@@ -120,5 +131,12 @@
 			  (stringcolumn("category") eq STATS_word[i] ? ($5 + $8) : 1/0): \
 			  (stringcolumn("category") eq STATS_word[i] ? (BAR_RELWD*(BAR_XSHIFT*$1**LEN_X_SEP*$3/SCALE)) : 1/0) \
-		with boxes ls i title STATS_word[i], \
+		with boxes ls i fs pattern pattern(i) title STATS_word[i], \
+	INDIR.'/plot-string-allocn-attrib-sepcmp.dat' \
+	    using (BAR_XSHIFT*$1**LEN_X_SEP*$3/SCALE*0.75): \
+			(($8+$10)/2): \
+			(BAR_RELWD*(BAR_XSHIFT*$1**LEN_X_SEP*$3/SCALE)/4): \
+			($9/2) \
+		notitle \
+		with boxxyerrorbars lt rgb "black", \
 	INDIR."/plot-string-allocn.dat" \
 	   i 1 using (50 **LEN_X_SEP*$5/SCALE):2     notitle with lines      lt rgb "red"         dt '.'  lw 2, \
Index: doc/theses/mike_brooks_MMath/string.tex
===================================================================
--- doc/theses/mike_brooks_MMath/string.tex	(revision 79f1285aa1d04ff9f1897f55f3205b23ce00836a)
+++ doc/theses/mike_brooks_MMath/string.tex	(revision 810c2c596a73f36f250f13be31cf07734799f98a)
@@ -2024,7 +2024,4 @@
 So again, \CFA helps users who just want to treat strings as values, and not think about the resource management under the covers.
 
-\PAB{Something is wrong with these sentences: While not a design goal, and not graphed, \CFA in STL-emulation mode outperformed STL in this case.
-User-managed allocation reuse did not affect either implementation in this case; only ``fresh'' results are shown.}
-
 
 \subsection{Test: Pass Argument}
@@ -2190,6 +2187,4 @@
 The skipped attribution \emph{Other} has samples that meet none of the criteria above.
 
-\PAB{From Mike: need to add the sep-comp side bar to the graph.}
-
 Beside \CFA's principal bars, a bar for separate-compilation overhead (\emph{sep.\ comp.}) shows the benefit that STL enjoys by using monolithic compilation.
 \CFA currently forgoes this benefit.
