Skip to content

SweepFormula: Groups multiple x-axis labels #2423

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
110 changes: 61 additions & 49 deletions Packages/MIES/MIES_SweepFormula.ipf
Original file line number Diff line number Diff line change
Expand Up @@ -1266,16 +1266,9 @@ static Function [WAVE/WAVE formulaResults, STRUCT SF_PlotMetaData plotMetaData]
if(WaveExists(wvXRef))
if(numResultsX == 1)
WAVE/Z wvXdata = wvXRef[0]
if(WaveExists(wvXdata) && DimSize(wvXdata, ROWS) == numResultsY && numpnts(wvYdata) == 1)
if(IsTextWave(wvXdata))
WAVE/T wT = wvXdata
Make/FREE/T wvXnewDataT = {wT[i]}
formulaResults[i][%FORMULAX] = wvXnewDataT
else
WAVE wv = wvXdata
Make/FREE/D wvXnewDataD = {wv[i]}
formulaResults[i][%FORMULAX] = wvXnewDataD
endif
if(WaveExists(wvXdata) && DimSize(wvXdata, ROWS) == numResultsY && numpnts(wvYdata) == 1 && numpnts(wvXdata) != 1)
Duplicate/FREE/T/RMD=[i] wvXdata, wvXnewData
formulaResults[i][%FORMULAX] = wvXnewData
else
formulaResults[i][%FORMULAX] = wvXRef[0]
endif
Expand All @@ -1302,7 +1295,7 @@ static Function [WAVE/WAVE formulaResults, STRUCT SF_PlotMetaData plotMetaData]

dataUnits = ""
if(!IsNull(dataUnitCheck))
dataUnits = SelectString(addDataUnitsInAnnotation && !IsEmpty(dataUnitCheck), "", "(" + dataUnitCheck + ")")
dataUnits = SelectString(addDataUnitsInAnnotation && !IsEmpty(dataUnitCheck), "", SF_FormatUnit(dataUnitCheck))
endif

plotMetaData.dataType = JWN_GetStringFromWaveNote(wvYRef, SF_META_DATATYPE)
Expand All @@ -1314,6 +1307,11 @@ static Function [WAVE/WAVE formulaResults, STRUCT SF_PlotMetaData plotMetaData]
return [formulaResults, plotMetaData]
End

static Function/S SF_FormatUnit(string unit)

return "(" + unit + ")"
End

static Function/S SF_GetAnnotationPrefix(string dataType)

strswitch(dataType)
Expand Down Expand Up @@ -1744,48 +1742,59 @@ static Function SF_CommonWindowSetup(string win, string graph)
DoWindow/T $win, newTitle
End

static Function/WAVE SF_GatherYUnits(WAVE/WAVE formulaResults, string explicitLbl, WAVE/Z/T yUnits)
static Function SF_GatherAxisLabels(WAVE/WAVE formulaResults, string explicitLbl, string formulaLabel, WAVE/T axisLabels)

variable i, size, numData
string unit

if(!WaveExists(yUnits))
Make/FREE/T/N=0 yUnits
endif

size = DimSize(yUnits, ROWS)
size = DimSize(axisLabels, ROWS)
if(!isEmpty(explicitLbl))
Redimension/N=(size + 1) yUnits
yUnits[size] = explicitLbl
return yUnits
Redimension/N=(size + 1) axisLabels
axisLabels[size] = explicitLbl
return NaN
endif

numData = DimSize(formulaResults, ROWS)
Redimension/N=(size + numData) yUnits
Redimension/N=(size + numData) axisLabels

for(i = 0; i < numData; i += 1)
WAVE/Z wvResultY = formulaResults[i][%FORMULAY]
if(!WaveExists(wvResultY))
continue
endif
yUnits[size] = WaveUnits(wvResultY, COLS)
size += 1

strswitch(formulaLabel)
case "FORMULAY":
unit = WaveUnits(wvResultY, COLS)
break
case "FORMULAX":
WAVE/Z wvResultX = formulaResults[i][%FORMULAX]
if(WaveExists(wvResultX))
unit = WaveUnits(wvResultX, ROWS)
else
unit = WaveUnits(wvResultY, ROWS)
endif
break
default:
ASSERT(0, "Unsupported formulaLabel: " + formulaLabel)
break
endswitch

// fallback to the unit if present
if(!IsEmpty(unit))
axisLabels[size] = SF_FormatUnit(unit)
size += 1
endif
endfor
Redimension/N=(size) yUnits

return yUnits
Redimension/N=(size) axisLabels
End

static Function/S SF_CombineYUnits(WAVE/T units)

string separator = " / "
string result = ""
static Function/S SF_CombineAxisLabels(WAVE/T axisLabels)

WAVE/T unique = GetUniqueEntries(units, dontDuplicate = 1)
for(unit : unique)
result += unit + separator
endfor
WAVE/T unique = GetUniqueEntries(axisLabels, dontDuplicate = 1)

return RemoveEndingRegExp(result, separator)
return TextWaveToList(unique, " / ", trailSep = 0)
End

static Function SF_CheckNumTraces(string graph, variable numTraces)
Expand Down Expand Up @@ -1869,7 +1878,7 @@ static Function SF_FormulaPlotter(string graph, string formula, [variable dmMode
variable winDisplayMode, showLegend, tagCounter, overrideMarker
variable xMxN, yMxN, xPoints, yPoints, keepUserSelection, numAnnotations, formulasAreDifferent, postPlotPSX
variable formulaCounter, gdIndex, markerCode, lineCode, lineStyle, traceToFront, isCategoryAxis
string win, wList, winNameTemplate, exWList, wName, annotation, yAxisLabel, wvName, info, xAxis
string win, wList, winNameTemplate, exWList, wName, annotation, xAxisLabel, yAxisLabel, wvName, info, xAxis
string formulasRemain, yAndXFormula, xFormula, yFormula, tagText, name, winHook
STRUCT SF_PlotMetaData plotMetaData
STRUCT RGBColor color
Expand Down Expand Up @@ -1897,8 +1906,9 @@ static Function SF_FormulaPlotter(string graph, string formula, [variable dmMode
postPlotPSX = 0
showLegend = 1
formulaCounter = 0
WAVE/Z wvX = $""
WAVE/Z/T yUnits = $""
WAVE/Z wvX = $""

Make/FREE/T/N=0 xAxisLabels, yAxisLabels

formulasRemain = graphCode[j]

Expand Down Expand Up @@ -1930,8 +1940,8 @@ static Function SF_FormulaPlotter(string graph, string formula, [variable dmMode
Abort
endtry

WAVE/T yUnitsResult = SF_GatherYUnits(formulaResults, plotMetaData.yAxisLabel, yUnits)
WAVE/T yUnits = yUnitsResult
SF_GatherAxisLabels(formulaResults, plotMetaData.xAxisLabel, "FORMULAX", xAxisLabels)
SF_GatherAxisLabels(formulaResults, plotMetaData.yAxisLabel, "FORMULAY", yAxisLabels)

if(!cmpstr(plotMetaData.dataType, SF_DATATYPE_PSX))
PSX_Plot(win, graph, formulaResults, plotMetaData)
Expand Down Expand Up @@ -2122,8 +2132,6 @@ static Function SF_FormulaPlotter(string graph, string formula, [variable dmMode
formulaCounter += 1
while(1)

yAxisLabel = SF_CombineYUnits(yUnits)

if(showLegend)
customLegend = JWN_GetStringFromWaveNote(formulaResults, SF_META_CUSTOM_LEGEND)

Expand Down Expand Up @@ -2263,15 +2271,19 @@ static Function SF_FormulaPlotter(string graph, string formula, [variable dmMode
endfor
endfor

if(!IsEmpty(plotMetaData.xAxisLabel) && traceCnt > 0)
Label/W=$win bottom, plotMetaData.xAxisLabel
ModifyGraph/W=$win tickUnit(bottom)=1
endif
if(!IsEmpty(yAxisLabel) && traceCnt > 0)
Label/W=$win left, yAxisLabel
ModifyGraph/W=$win tickUnit(left)=1
endif
if(traceCnt > 0)
xAxisLabel = SF_CombineAxisLabels(xAxisLabels)
if(!IsEmpty(xAxisLabel))
Label/W=$win bottom, xAxisLabel
ModifyGraph/W=$win tickUnit(bottom)=1
endif

yAxisLabel = SF_CombineAxisLabels(yAxisLabels)
if(!IsEmpty(yAxisLabel))
Label/W=$win left, yAxisLabel
ModifyGraph/W=$win tickUnit(left)=1
endif

ModifyGraph/W=$win zapTZ(bottom)=1
endif

Expand Down
56 changes: 56 additions & 0 deletions Packages/tests/Basic/UTF_SweepFormula.ipf
Original file line number Diff line number Diff line change
Expand Up @@ -2122,3 +2122,59 @@ static Function TestVariableReadOnly()

KillWaves/Z root:testData
End

static Function TestKeepsUnitsWhenMappingMultipleYToOne()

string win, graph, xAxis, yAxis, code

win = GetDataBrowserWithData()
graph = SFH_GetFormulaGraphForBrowser(win)

Make/O data1 = {1}
SetScale/P x, 0, 1, "x1", data1
SetScale/P y, 0, 1, "y1", data1

Make/O data2 = {2, 3}
SetScale/P x, 0, 1, "x2", data2
SetScale/P y, 0, 1, "y2", data2

code = "dataset(wave(data1), wave(data1)) vs dataset(wave(data2))"
ExecuteSweepFormulaInDB(code, win)
yAxis = AxisLabel(graph, "left")
CHECK_EQUAL_STR(yAxis, "(y1)")
xAxis = AxisLabel(graph, "bottom")
CHECK_EQUAL_STR(xAxis, "(x2)")

KillWaves/Z data1, data2
End

static Function TestAxisLabelGathering()

string win, graph, xAxis, yAxis, code

win = GetDataBrowserWithData()
graph = SFH_GetFormulaGraphForBrowser(win)

Make/O data1 = {1}
SetScale/P x, 0, 1, "x1", data1
SetScale/P y, 0, 1, "y1", data1

Make/O data2 = {2}
SetScale/P x, 0, 1, "x2", data2
SetScale/P y, 0, 1, "y2", data2

Make/O data3 = {3}
SetScale/P x, 0, 1, "x3", data3
SetScale/P y, 0, 1, "y3", data3

code = "wave(data1)\r" + \
"with \r" + \
"wave(data2) vs wave(data3)\r"
ExecuteSweepFormulaInDB(code, win)
yAxis = AxisLabel(graph, "left")
CHECK_EQUAL_STR(yAxis, "(y1) / (y2)")
xAxis = AxisLabel(graph, "bottom")
CHECK_EQUAL_STR(xAxis, "(x1) / (x3)")

KillWaves/Z data1, data2, data3
End
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ static Function TestSweepFormulaAxisLabels(string device)

// Test combine of different data unit in multiple data waves
str = AxisLabel(plotWin, "left")
strRef = "mV / pA"
strRef = "(mV) / (pA)"
CHECK_EQUAL_STR(strRef, str)

str = AxisLabel(plotWin, "bottom")
Expand Down