Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions Packages/MIES/MIES_Constants.ipf
Original file line number Diff line number Diff line change
Expand Up @@ -2147,6 +2147,10 @@ StrConstant SF_META_DONOTPLOT = "/DoNotPlot" // number, boolean,
StrConstant SF_META_WINDOW_HOOK = "/WindowHook" // string
StrConstant SF_META_FORMULA = "/Formula" // string
StrConstant SF_META_PLOT = "/Plot" // number, boolean, defaults to false (0)
StrConstant SF_META_ERRORBARYPLUS = "/ErrorYPlus" // numeric wave
StrConstant SF_META_ERRORBARYMINUS = "/ErrorYMinus" // numeric wave
StrConstant SF_META_ERRORBARXPLUS = "/ErrorXPlus" // numeric wave
StrConstant SF_META_ERRORBARXMINUS = "/ErrorXMinus" // numeric wave

/// A color group allows to have matching colors for sweep data with the same channel type/number and sweep.
/// It is applied before the matching headstage/average colors in #SF_GetTraceColor().
Expand Down Expand Up @@ -2442,11 +2446,6 @@ Constant PSX_DECONV_FILTER_DEF_ORDER = 4

StrConstant PSX_JWN_COMBO_KEYS_NAME = "ComboKeys"

StrConstant SF_OP_MERGE = "merge"
StrConstant SF_OP_FIT = "fit"
StrConstant SF_OP_FITLINE = "fitline"
StrConstant SF_OP_DATASET = "dataset"

StrConstant SWEEP_NOTE_KEY_ORIGCREATIONTIME_UTC = "OriginalCreationTimeInUTC"

StrConstant DF_NAME_FREE = "freeroot"
Expand Down Expand Up @@ -2552,6 +2551,10 @@ StrConstant SF_OP_TPINST = "tpinst"
StrConstant SF_OP_TPBASE = "tpbase"
StrConstant SF_OP_TPFIT = "tpfit"
StrConstant SF_OP_EXTRACT = "extract"
StrConstant SF_OP_MERGE = "merge"
StrConstant SF_OP_FIT = "fit"
StrConstant SF_OP_FITLINE = "fitline"
StrConstant SF_OP_DATASET = "dataset"

#ifdef AUTOMATED_TESTING
StrConstant SF_OP_TESTOP = "testop"
Expand Down Expand Up @@ -2614,3 +2617,10 @@ StrConstant SF_WINNAME_SUFFIX_TABLE = "table"
Constant SF_DISPLAYTYPE_GRAPH = 0
Constant SF_DISPLAYTYPE_TABLE = 1
///@}

/// @name Maximum number of colors for traces defined
///
/// @anchor TraceColorMax
///@{
Constant TRACECOLORMAX = 21
///@}
14 changes: 12 additions & 2 deletions Packages/MIES/MIES_GuiUtilities.ipf
Original file line number Diff line number Diff line change
Expand Up @@ -650,7 +650,7 @@ End
/// where the color white has been removed.
Function [STRUCT RGBColor s] GetTraceColor(variable index)

index = mod(index, 21)
index = mod(index, TRACECOLORMAX)
switch(index)
case 0:
s.red = 7967; s.green = 7710; s.blue = 7710
Expand Down Expand Up @@ -742,11 +742,21 @@ Function [STRUCT RGBColor s] GetTraceColor(variable index)
endswitch
End

/// @brief Returns the trace color used for avergae type traces
/// @brief Returns the trace color used for average type traces
Function [STRUCT RGBColor s] GetTraceColorForAverage()

[s] = GetTraceColor(NUM_HEADSTAGES + 1)
End

/// @brief Returns a color that is not attributed to a headstage and not the average color
Function [STRUCT RGBColor s] GetTraceColorNonHeadstage(variable idx)

variable range

range = TRACECOLORMAX - (NUM_HEADSTAGES + 2)
idx = mod(idx, range)

[s] = GetTraceColor(idx + NUM_HEADSTAGES + 2)
End

/// @brief Get colors from alternative color scheme
Expand Down
15 changes: 15 additions & 0 deletions Packages/MIES/MIES_JSONWaveNotes.ipf
Original file line number Diff line number Diff line change
Expand Up @@ -318,3 +318,18 @@ threadsafe Function/WAVE JWN_CreatePath(WAVE wv, string jsonPath)
JSON_AddTreeObject(jsonID, jsonPath)
JWN_WriteWaveNote(wv, JWN_GetWaveNoteHeader(wv), jsonID)
End

/// @brief Returns a text wave with the json keys available at path, null wave if path does not exist
///
/// @param wv wave reference where the WaveNote is taken from
/// @param jsonPath path to fetch the keys from
threadsafe Function/WAVE JWN_GetKeys(WAVE wv, string jsonPath)

variable jsonID

jsonID = JWN_GetWaveNoteAsJSON(wv)
WAVE/Z keys = JSON_GetKeys(jsonID, jsonPath, ignoreErr = 1)
JSON_Release(jsonID)

return keys
End
85 changes: 82 additions & 3 deletions Packages/MIES/MIES_SweepFormula.ipf
Original file line number Diff line number Diff line change
Expand Up @@ -968,6 +968,7 @@ static Function [variable dataCnt, variable gdIndex, string annotation, variable
STRUCT RGBColor color
variable numTraces, yPoints, xPoints, yMxN, xMxN, idx, splitTraces
variable i, isCategoryAxis, splitX, splitY
variable rangeBeginX, rangeEndX, rangeBeginY, rangeEndY
string info

WAVE/Z wvX = $""
Expand Down Expand Up @@ -1035,6 +1036,7 @@ static Function [variable dataCnt, variable gdIndex, string annotation, variable
SF_CollectTraceData(gdIndex, plotFormData, traces[i], wvX, wvY)
AppendTograph/W=$pg.win/C=(color.red, color.green, color.blue) wvY[][i]/TN=$traces[i]
annotation += SF_GetMetaDataAnnotationText(pg.plotMetaData, wvResultY, traces[i])
SF_AddErrorBars(pg.graph, pg.win, wvY, traces[i])
endfor
elseif((xMxN == 1) && (yMxN == 1)) // 1D
if(yPoints == 1) // 0D vs 1D
Expand All @@ -1046,6 +1048,7 @@ static Function [variable dataCnt, variable gdIndex, string annotation, variable
SF_CollectTraceData(gdIndex, plotFormData, traces[i], wvX, wvY)
AppendTograph/W=$pg.win/C=(color.red, color.green, color.blue) wvY[][0]/TN=$traces[i] vs wvX[i][]
annotation += SF_GetMetaDataAnnotationText(pg.plotMetaData, wvResultY, traces[i])
SF_AddErrorBars(pg.graph, pg.win, wvY, traces[i], rangeBeginX = i, rangeEndX = i)
endfor
elseif(xPoints == 1) // 1D vs 0D
numTraces = yPoints
Expand All @@ -1056,8 +1059,10 @@ static Function [variable dataCnt, variable gdIndex, string annotation, variable
SF_CollectTraceData(gdIndex, plotFormData, traces[i], wvX, wvY)
AppendTograph/W=$pg.win/C=(color.red, color.green, color.blue) wvY[i][]/TN=$traces[i] vs wvX[][0]
annotation += SF_GetMetaDataAnnotationText(pg.plotMetaData, wvResultY, traces[i])
SF_AddErrorBars(pg.graph, pg.win, wvY, traces[i], rangeBeginY = i, rangeEndY = i)
endfor
else // 1D vs 1D

splitTraces = min(yPoints, xPoints)
numTraces = floor(max(yPoints, xPoints) / splitTraces)
SF_CheckNumTraces(pg.graph, numTraces)
Expand Down Expand Up @@ -1086,10 +1091,16 @@ static Function [variable dataCnt, variable gdIndex, string annotation, variable
endif

SF_CollectTraceData(gdIndex, plotFormData, traces[i], wvX, wvY)
splitY = SF_SplitPlotting(wvY, ROWS, i, splitTraces)
splitX = SF_SplitPlotting(wvX, ROWS, i, splitTraces)
AppendTograph/W=$pg.win/C=(color.red, color.green, color.blue) wvY[splitY, splitY + splitTraces - 1][0]/TN=$traces[i] vs wvX[splitX, splitX + splitTraces - 1][0]
splitY = SF_SplitPlotting(wvY, ROWS, i, splitTraces)
splitX = SF_SplitPlotting(wvX, ROWS, i, splitTraces)
rangeBeginX = splitX
rangeEndX = splitX + splitTraces - 1
rangeBeginY = splitY
rangeEndY = splitY + splitTraces - 1
AppendTograph/W=$pg.win/C=(color.red, color.green, color.blue) wvY[rangeBeginY, rangeEndY][0]/TN=$traces[i] vs wvX[rangeBeginX, rangeEndX][0]
annotation += SF_GetMetaDataAnnotationText(pg.plotMetaData, wvResultY, traces[i])

SF_AddErrorBars(pg.graph, pg.win, wvY, traces[i], rangeBeginX = rangeBeginX, rangeEndX = rangeEndX, rangeBeginY = rangeBeginY, rangeEndY = rangeEndY)
endfor
endif
elseif(yMxN == 1) // 1D vs 2D
Expand All @@ -1101,6 +1112,7 @@ static Function [variable dataCnt, variable gdIndex, string annotation, variable
SF_CollectTraceData(gdIndex, plotFormData, traces[i], wvX, wvY)
AppendTograph/W=$pg.win/C=(color.red, color.green, color.blue) wvY[][0]/TN=$traces[i] vs wvX[][i]
annotation += SF_GetMetaDataAnnotationText(pg.plotMetaData, wvResultY, traces[i])
SF_AddErrorBars(pg.graph, pg.win, wvY, traces[i])
endfor
elseif(xMxN == 1) // 2D vs 1D or 0D
if(xPoints == 1) // 2D vs 0D -> extend X to 1D with constant value
Expand All @@ -1116,6 +1128,7 @@ static Function [variable dataCnt, variable gdIndex, string annotation, variable
SF_CollectTraceData(gdIndex, plotFormData, traces[i], wvX, wvY)
AppendTograph/W=$pg.win/C=(color.red, color.green, color.blue) wvY[][i]/TN=$traces[i] vs wvX
annotation += SF_GetMetaDataAnnotationText(pg.plotMetaData, wvResultY, traces[i])
SF_AddErrorBars(pg.graph, pg.win, wvY, traces[i])
endfor
else // 2D vs 2D
numTraces = WaveExists(wvX) ? max(1, max(yMxN, xMxN)) : max(1, yMxN)
Expand All @@ -1136,6 +1149,7 @@ static Function [variable dataCnt, variable gdIndex, string annotation, variable
AppendTograph/W=$pg.win/C=(color.red, color.green, color.blue) wvY[][i]/TN=$traces[i]
endif
annotation += SF_GetMetaDataAnnotationText(pg.plotMetaData, wvResultY, traces[i])
SF_AddErrorBars(pg.graph, pg.win, wvY, traces[i])
endfor
endif

Expand All @@ -1146,6 +1160,71 @@ static Function [variable dataCnt, variable gdIndex, string annotation, variable
return [dataCnt, gdIndex, annotation, formulaAddedOncePerDataset]
End

static Function SF_AddErrorBars(string graph, string win, WAVE wvY, string traceName, [variable rangeBeginX, variable rangeEndX, variable rangeBeginY, variable rangeEndY])

rangeBeginX = ParamIsDefault(rangeBeginX) ? 0 : rangeBeginX
rangeEndX = ParamIsDefault(rangeEndX) ? Inf : rangeEndX
rangeBeginY = ParamIsDefault(rangeBeginY) ? 0 : rangeBeginY
rangeEndY = ParamIsDefault(rangeEndY) ? Inf : rangeEndY

DFREF dfr = SF_GetBrowserDF(graph)

WAVE/Z errorbarYPlusFree = JWN_GetNumericWaveFromWaveNote(wvY, SF_META_ERRORBARYPLUS)
if(WaveExists(errorbarYPlusFree))
WAVE wvYplusPermanentOrig = GetSweepFormulaErrorbar(dfr, traceName, SF_META_ERRORBARYPLUS)
WAVE errorbarYPlus = MoveWaveWithOverwrite(wvYplusPermanentOrig, errorbarYPlusFree)
endif
WAVE/Z errorbarYMinusFree = JWN_GetNumericWaveFromWaveNote(wvY, SF_META_ERRORBARYMINUS)
if(WaveExists(errorbarYMinusFree))
WAVE wvYminusPermanentOrig = GetSweepFormulaErrorbar(dfr, traceName, SF_META_ERRORBARYMINUS)
WAVE errorbarYMinus = MoveWaveWithOverwrite(wvYminusPermanentOrig, errorbarYMinusFree)
endif
WAVE/Z errorbarXPlusFree = JWN_GetNumericWaveFromWaveNote(wvY, SF_META_ERRORBARXPLUS)
if(WaveExists(errorbarXPlusFree))
WAVE wvXplusPermanentOrig = GetSweepFormulaErrorbar(dfr, traceName, SF_META_ERRORBARXPLUS)
WAVE errorbarXPlus = MoveWaveWithOverwrite(wvXplusPermanentOrig, errorbarXPlusFree)
endif
WAVE/Z errorbarXMinusFree = JWN_GetNumericWaveFromWaveNote(wvY, SF_META_ERRORBARXMINUS)
if(WaveExists(errorbarXMinusFree))
WAVE wvXminusPermanentOrig = GetSweepFormulaErrorbar(dfr, traceName, SF_META_ERRORBARXMINUS)
WAVE errorbarXMinus = MoveWaveWithOverwrite(wvXminusPermanentOrig, errorbarXMinusFree)
endif

if(!WaveExists(errorbarYPlus) && !WaveExists(errorbarYMinus) && !WaveExists(errorbarXPlus) && !WaveExists(errorbarXMinus))
return NaN
endif

if(WaveExists(errorbarYPlus) && WaveExists(errorbarYMinus) && WaveExists(errorbarXPlus) && WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, XY, wave=(errorbarXplus[rangeBeginX, rangeEndX], errorbarXminus[rangeBeginX, rangeEndX]), wave=(errorbarYplus[rangeBeginY, rangeEndY], errorbarYminus[rangeBeginY, rangeEndY])
elseif(WaveExists(errorbarYPlus) && WaveExists(errorbarYMinus) && WaveExists(errorbarXPlus) && !WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, XY, wave=(errorbarXplus[rangeBeginX, rangeEndX],), wave=(errorbarYplus[rangeBeginY, rangeEndY], errorbarYminus[rangeBeginY, rangeEndY])
elseif(WaveExists(errorbarYPlus) && WaveExists(errorbarYMinus) && !WaveExists(errorbarXPlus) && WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, XY, wave=(, errorbarXminus[rangeBeginX, rangeEndX]), wave=(errorbarYplus[rangeBeginY, rangeEndY], errorbarYminus[rangeBeginY, rangeEndY])
elseif(WaveExists(errorbarYPlus) && WaveExists(errorbarYMinus) && !WaveExists(errorbarXPlus) && !WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, Y, wave=(errorbarYplus[rangeBeginY, rangeEndY], errorbarYminus[rangeBeginY, rangeEndY])
elseif(WaveExists(errorbarYPlus) && !WaveExists(errorbarYMinus) && WaveExists(errorbarXPlus) && WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, XY, wave=(errorbarXplus[rangeBeginX, rangeEndX], errorbarXminus[rangeBeginX, rangeEndX]), wave=(errorbarYplus[rangeBeginY, rangeEndY],)
elseif(WaveExists(errorbarYPlus) && !WaveExists(errorbarYMinus) && WaveExists(errorbarXPlus) && !WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, XY, wave=(errorbarXplus[rangeBeginX, rangeEndX],), wave=(errorbarYplus[rangeBeginY, rangeEndY],)
elseif(WaveExists(errorbarYPlus) && !WaveExists(errorbarYMinus) && !WaveExists(errorbarXPlus) && !WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, Y, wave=(errorbarYplus[rangeBeginY, rangeEndY],)
elseif(!WaveExists(errorbarYPlus) && WaveExists(errorbarYMinus) && WaveExists(errorbarXPlus) && WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, XY, wave=(errorbarXplus[rangeBeginX, rangeEndX], errorbarXminus[rangeBeginX, rangeEndX]), wave=(, errorbarYminus[rangeBeginY, rangeEndY])
elseif(!WaveExists(errorbarYPlus) && WaveExists(errorbarYMinus) && WaveExists(errorbarXPlus) && !WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, XY, wave=(errorbarXplus[rangeBeginX, rangeEndX],), wave=(, errorbarYminus[rangeBeginY, rangeEndY])
elseif(!WaveExists(errorbarYPlus) && WaveExists(errorbarYMinus) && !WaveExists(errorbarXPlus) && !WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, Y, wave=(errorbarYminus[rangeBeginY, rangeEndY],)
elseif(!WaveExists(errorbarYPlus) && !WaveExists(errorbarYMinus) && WaveExists(errorbarXPlus) && WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, X, wave=(errorbarXplus[rangeBeginX, rangeEndX], errorbarXminus[rangeBeginX, rangeEndX])
elseif(!WaveExists(errorbarYPlus) && !WaveExists(errorbarYMinus) && WaveExists(errorbarXPlus) && !WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, X, wave=(errorbarXplus[rangeBeginX, rangeEndX],)
elseif(!WaveExists(errorbarYPlus) && !WaveExists(errorbarYMinus) && !WaveExists(errorbarXPlus) && WaveExists(errorbarXMinus))
ErrorBars/W=$win $traceName, X, wave=(, errorbarXminus[rangeBeginX, rangeEndX])
else
FATAL_ERROR("Impossible case")
endif
End

static Function [variable dataCnt] SF_CreateTracesForResults(STRUCT SF_PlotterGraphStruct &pg)

variable i, idx, showInTable, numData, formulaAddedOncePerDataset
Expand Down
6 changes: 5 additions & 1 deletion Packages/MIES/MIES_SweepFormula_Operations.ipf
Original file line number Diff line number Diff line change
Expand Up @@ -2223,7 +2223,11 @@ static Function/WAVE SFO_IndexOverDataSetsForPrimitiveOperation(STRUCT SF_Execut
WAVE/WAVE arg1 = SF_ResolveDatasetFromJSON(exd, 1)
dataSetNum0 = DimSize(arg0, ROWS)
dataSetNum1 = DimSize(arg1, ROWS)
SFH_ASSERT(dataSetNum0 > 0 && dataSetNum1 > 0, "No input data for " + opShort)
if(dataSetNum0 == 0 && dataSetNum1 == 0)
WAVE/WAVE output = SFH_CreateSFRefWave(exd.graph, opShort, 0)
return output
endif
SFH_ASSERT(dataSetNum0 > 0 && dataSetNum1 > 0, "No input data on one side for " + opShort)
if(dataSetNum0 == dataSetNum1)
WAVE/WAVE output = SFH_CreateSFRefWave(exd.graph, opShort, dataSetNum0)
WAVE/WAVE input = arg0
Expand Down
2 changes: 1 addition & 1 deletion Packages/MIES/MIES_SweepFormula_Parser.ipf
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ static StrConstant SF_PARSER_REGEX_SIGNED_NUMBER = "^(?i)[+-]?[0-9]+(?:\.[0
static StrConstant SF_PARSER_REGEX_QUOTED_STRING = "^\".*\"$"
static StrConstant SF_PARSER_REGEX_SIGNED_PARENTHESIS = "^(?i)[+-]?\\([\s\S]*$"
static StrConstant SF_PARSER_REGEX_SIGNED_FUNCTION = "^(?i)[+-]?[A-Za-z]+"
static StrConstant SF_PARSER_REGEX_OTHER_VALID_CHARS = "[A-Za-z0-9_\.:;=!$]"
static StrConstant SF_PARSER_REGEX_OTHER_VALID_CHARS = "[A-Za-z0-9_\.:;=!$<>]"

// The structure stores data that is required and gathered when a SF formula is parsed
static Structure SF_ParserData
Expand Down
36 changes: 36 additions & 0 deletions Packages/MIES/MIES_Utilities_Checks.ipf
Original file line number Diff line number Diff line change
Expand Up @@ -526,3 +526,39 @@ Function ListHasOnlyOneUniqueEntry(string list, [string sep])

return 1
End

static Function [WAVE/T fitProps, variable row] GetIntegratedFitFunctionRow(string fitFuncName)

variable col

ASSERT(!IsEmpty(fitFuncName), "Expected non-empty fit func name")

WAVE/T fitProps = GetSFIgorFitProperties()

col = FindDimLabel(fitProps, COLS, "FITFUNC")
ASSERT(col >= 0, "Column not found")
FindValue/Z/TEXT=(fitFuncName)/TXOP=4/RMD=[][col] fitProps

return [fitProps, V_row]
End

/// @brief Returns 1 if the given fitFuncName is an Igor integrated fit function, 0 otherwise
Function IsIntegratedFitFunction(string fitFuncName)

variable index

[WAVE/T fitProps, index] = GetIntegratedFitFunctionRow(fitFuncName)

return index >= 0
End

/// @brief Returns the number of coefficients required for an integrated fit function
Function GetIntegratedFitFunctionCoefficientNumber(string fitFuncName)

variable index

[WAVE/T fitProps, index] = GetIntegratedFitFunctionRow(fitFuncName)
ASSERT(index >= 0, "Given fitFuncName is not an integrated Igor fit function: " + fitFuncName)

return str2num(fitProps[index][%NUMCOEFS])
End
76 changes: 76 additions & 0 deletions Packages/MIES/MIES_WaveDataFolderGetters.ipf
Original file line number Diff line number Diff line change
Expand Up @@ -7664,6 +7664,41 @@ Function/WAVE GetSweepFormulaY(DFREF dfr, variable graphNr)
return wv
End

/// @brief Return a permanent wave for errorBars
Function/WAVE GetSweepFormulaErrorbar(DFREF dfr, string traceName, string tagName)

string wName, suffix

strswitch(tagName)
case SF_META_ERRORBARYPLUS:
suffix = "yplus"
break
case SF_META_ERRORBARYMINUS:
suffix = "yminus"
break
case SF_META_ERRORBARXPLUS:
suffix = "xplus"
break
case SF_META_ERRORBARXMINUS:
suffix = "xminus"
break
default:
FATAL_ERROR("Unknown errorbar tag")
endswitch

wName = "sf_errorbar_" + traceName + "_" + suffix

WAVE/Z/D/SDFR=dfr wv = $wName

if(WaveExists(wv))
return wv
endif

Make/N=0/D dfr:$wName/WAVE=wv

return wv
End

/// @brief Return the global temporary wave for extended popup menu
Function/WAVE GetPopupExtMenuWave()

Expand Down Expand Up @@ -9405,3 +9440,44 @@ Function/WAVE GetFullPlottingWITH(variable size)

return plotWITH
End

/// @brief Returns a wave with all Igor integrated fit functions and their respective number of coefficients
/// For poly functions up to 4th order is included (Igor Pro supports up to 20th order)
Function/WAVE GetSFIgorFitProperties()

Make/FREE/T/N=(28, 2) wv

wv[0][] = {{"gauss"}, {"4"}}
wv[1][] = {{"lor"}, {"4"}}
wv[2][] = {{"Voigt"}, {"5"}}
wv[3][] = {{"exp"}, {"3"}}
wv[4][] = {{"dblexp"}, {"5"}}
wv[5][] = {{"exp_XOffset"}, {"3"}}
wv[6][] = {{"dblexp_XOffset"}, {"5"}}
wv[7][] = {{"dblexp_peak"}, {"5"}}
wv[8][] = {{"sin"}, {"4"}}
wv[9][] = {{"line"}, {"2"}}
wv[10][] = {{"poly 1"}, {"1"}}
wv[11][] = {{"poly 2"}, {"2"}}
wv[12][] = {{"poly 3"}, {"3"}}
wv[13][] = {{"poly 4"}, {"4"}}
wv[14][] = {{"poly_XOffset 1"}, {"1"}}
wv[15][] = {{"poly_XOffset 2"}, {"2"}}
wv[16][] = {{"poly_XOffset 3"}, {"3"}}
wv[17][] = {{"poly_XOffset 4"}, {"4"}}
wv[18][] = {{"hillequation"}, {"4"}}
wv[19][] = {{"sigmoid"}, {"4"}}
wv[20][] = {{"power"}, {"3"}}
wv[21][] = {{"lognormal"}, {"4"}}
wv[22][] = {{"log"}, {"2"}}
wv[23][] = {{"gauss2D"}, {"7"}}
wv[24][] = {{"poly2D 1"}, {"3"}}
wv[25][] = {{"poly2D 2"}, {"6"}}
wv[26][] = {{"poly2D 3"}, {"10"}}
wv[27][] = {{"poly2D 4"}, {"15"}}

SetDimLabel COLS, 0, FITFUNC, wv
SetDimLabel COLS, 1, NUMCOEFS, wv

return wv
End
Loading