Skip to content

Commit a14309c

Browse files
authored
Merge pull request #2565 from AllenInstitute/feature/2565-sf_new_average_mode
Add new mode for SF average operation
2 parents 6863b5b + e929b54 commit a14309c

10 files changed

+341
-39
lines changed

Packages/MIES/MIES_Constants.ipf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2540,6 +2540,7 @@ StrConstant SF_OP_TPSS = "tpss"
25402540
StrConstant SF_OP_TPINST = "tpinst"
25412541
StrConstant SF_OP_TPBASE = "tpbase"
25422542
StrConstant SF_OP_TPFIT = "tpfit"
2543+
StrConstant SF_OP_EXTRACT = "extract"
25432544
///@}
25442545

25452546
StrConstant SF_PROPERTY_TABLE = "Table"

Packages/MIES/MIES_SweepFormula.ipf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ Function/WAVE SF_GetNamedOperations()
9898
SF_OP_MERGE, SF_OP_FIT, SF_OP_FITLINE, SF_OP_DATASET, SF_OP_SELECTVIS, SF_OP_SELECTCM, SF_OP_SELECTSTIMSET, \
9999
SF_OP_SELECTIVSCCSWEEPQC, SF_OP_SELECTIVSCCSETQC, SF_OP_SELECTRANGE, SF_OP_SELECTEXP, SF_OP_SELECTDEV, \
100100
SF_OP_SELECTEXPANDSCI, SF_OP_SELECTEXPANDRAC, SF_OP_SELECTSETCYCLECOUNT, SF_OP_SELECTSETSWEEPCOUNT, \
101-
SF_OP_SELECTSCIINDEX, SF_OP_SELECTRACINDEX, SF_OP_ANAFUNCPARAM, SF_OP_CONCAT, SF_OP_TABLE}
101+
SF_OP_SELECTSCIINDEX, SF_OP_SELECTRACINDEX, SF_OP_ANAFUNCPARAM, SF_OP_CONCAT, SF_OP_TABLE, SF_OP_EXTRACT}
102102

103103
return wt
104104
End

Packages/MIES/MIES_SweepFormula_Executor.ipf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,9 @@ Function/WAVE SFE_FormulaExecutor(STRUCT SF_ExecutionData &exd, [variable srcLoc
469469
case SF_OP_DATASET:
470470
WAVE out = SFO_OperationDataset(exdop)
471471
break
472+
case SF_OP_EXTRACT:
473+
WAVE out = SFO_OperationExtract(exdop)
474+
break
472475
case SF_OP_SELECTVIS:
473476
WAVE out = SFOS_OperationSelectVis(exdop)
474477
break

Packages/MIES/MIES_SweepFormula_Helpers.ipf

Lines changed: 97 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,9 @@ End
248248
/// @param copy [optional, defaults to 0] If the returned data should be safe for modification (true) or is only read (false)
249249
/// @param[out] wvNote [optional, defaults to None] Wave note of the dataset, useful for single result cases where you still need
250250
/// to query JSON wave note entries
251-
Function/WAVE SFH_GetArgumentAsWave(STRUCT SF_ExecutionData &exd, string opShort, variable argNum, [string defOp, WAVE/Z defWave, variable singleResult, variable expectedMinorType, variable expectedMajorType, variable copy, string &wvNote])
251+
/// @param resolveSelect [optional, defaults to 0] If set then argument of the select type are automatically converted to sweep data, effectively the data() operation is applied
252+
/// As with data, if the argument is an array of selects, each sweep result gets concatenated to a wref wave
253+
Function/WAVE SFH_GetArgumentAsWave(STRUCT SF_ExecutionData &exd, string opShort, variable argNum, [string defOp, WAVE/Z defWave, variable singleResult, variable expectedMinorType, variable expectedMajorType, variable copy, string &wvNote, variable resolveSelect])
252254

253255
variable checkExist, numArgs, checkMinorType, checkMajorType, result
254256
string msg
@@ -273,12 +275,23 @@ Function/WAVE SFH_GetArgumentAsWave(STRUCT SF_ExecutionData &exd, string opShort
273275
else
274276
singleResult = !!singleResult
275277
endif
276-
copy = ParamIsDefault(copy) ? 0 : !!copy
278+
copy = ParamIsDefault(copy) ? 0 : !!copy
279+
resolveSelect = ParamIsDefault(resolveSelect) ? 0 : !!resolveSelect
277280

278281
numArgs = SFH_GetNumberOfArguments(exd)
279282

280283
if(argNum < numArgs)
281-
WAVE/WAVE input = SF_ResolveDatasetFromJSON(exd, argNum)
284+
if(resolveSelect)
285+
WAVE/Z/WAVE input = SFH_GetArgumentSelect(exd, argNum, doNotEnforce = 1)
286+
if(WaveExists(input))
287+
WAVE/WAVE data = SFH_GetDataFromSelect(exd.graph, input)
288+
WAVE input = data
289+
else
290+
WAVE/WAVE input = SF_ResolveDatasetFromJSON(exd, argNum)
291+
endif
292+
else
293+
WAVE/WAVE input = SF_ResolveDatasetFromJSON(exd, argNum)
294+
endif
282295

283296
if(singleResult)
284297
sprintf msg, "Argument #%d of operation %s: Too many input values", argNum, opShort
@@ -1067,16 +1080,24 @@ End
10671080
/// There is also a quick path for argNum >= numArgs, which is the case for e.g. data()
10681081
/// For that case numArgs is 0 and select is expected at argNum 0. Then the result of "select()" is
10691082
/// returned (as selectArray with a single element)
1083+
/// If the doNotEnforce flag is set then a select type value at the arguments location is not enforced.
1084+
/// If the argument is neither a single select or an array of selects then a null wave is returned.
10701085
///
10711086
/// selectArray is wave reference wave containing select composite wave reference waves with SELECTION, RANGE each.
10721087
///
10731088
/// This allows operations with selects as arguments to iterate over different selections given by the user
1074-
Function/WAVE SFH_GetArgumentSelect(STRUCT SF_ExecutionData &exd, string opShort, variable argNum)
1089+
Function/WAVE SFH_GetArgumentSelect(STRUCT SF_ExecutionData &exd, variable argNum, [variable doNotEnforce])
10751090

1076-
variable numArgs
1077-
string type
1091+
variable numArgs, cond
1092+
string type
1093+
1094+
doNotEnforce = ParamIsDefault(doNotEnforce) ? 0 : !!doNotEnforce
10781095

10791096
numArgs = SFH_GetNumberOfArguments(exd)
1097+
if(argNum >= numArgs && doNotEnforce)
1098+
return $""
1099+
endif
1100+
10801101
if(argNum < numArgs)
10811102

10821103
WAVE/WAVE selectComp = SF_ResolveDatasetFromJSON(exd, argNum)
@@ -1087,15 +1108,31 @@ Function/WAVE SFH_GetArgumentSelect(STRUCT SF_ExecutionData &exd, string opShort
10871108
return selectArray
10881109
endif
10891110

1090-
SFH_ASSERT(DimSize(selectComp, ROWS) == 1, "Expected a single array")
1111+
cond = DimSize(selectComp, ROWS) == 1
1112+
if(doNotEnforce && !cond)
1113+
return $""
1114+
endif
1115+
SFH_ASSERT(cond, "Expected a single array")
10911116
WAVE array = selectComp[0]
1092-
SFH_ASSERT(IsTextWave(array), "Expected a text wave")
1117+
cond = IsTextWave(array)
1118+
if(doNotEnforce && !cond)
1119+
return $""
1120+
endif
1121+
SFH_ASSERT(cond, "Expected a text wave")
10931122

10941123
Make/FREE/WAVE/N=(DimSize(array, ROWS)) selectArray = SFH_AttemptDatasetResolve(WaveText(array, row = p), checkWithSFHAssert = 1)
10951124
for(WAVE/Z/WAVE selectComp : selectArray)
1096-
ASSERT(WaveExists(selectComp), "Expected select composite")
1125+
cond = WaveExists(selectComp)
1126+
if(doNotEnforce && !cond)
1127+
return $""
1128+
endif
1129+
ASSERT(cond, "Expected select composite")
10971130
type = JWN_GetStringFromWaveNote(selectComp, SF_META_DATATYPE)
1098-
SFH_ASSERT(!CmpStr(type, SF_DATATYPE_SELECTCOMP), "Expected select data as argument")
1131+
cond = !CmpStr(type, SF_DATATYPE_SELECTCOMP)
1132+
if(doNotEnforce && !cond)
1133+
return $""
1134+
endif
1135+
SFH_ASSERT(cond, "Expected select data as argument")
10991136
endfor
11001137

11011138
return selectArray
@@ -2070,3 +2107,53 @@ Function SFH_StoreAssertInfoExecutor(variable jsonId, variable srcLocId, string
20702107
info[%JSONPATH] = jsonPath
20712108
info[%STEP] = num2istr(SF_STEP_EXECUTOR)
20722109
End
2110+
2111+
Function/WAVE SFH_GetDataFromSelect(string graph, WAVE/WAVE selectData)
2112+
2113+
WAVE/WAVE output = SFH_GetSweepsForFormula(graph, selectData, SF_OP_DATA)
2114+
if(!DimSize(output, ROWS))
2115+
DebugPrint("Call to SFH_GetSweepsForFormula returned no results")
2116+
endif
2117+
2118+
SFH_AddOpToOpStack(output, "", SF_OP_DATA)
2119+
SFH_ResetArgSetupStack(output, SF_OP_DATA)
2120+
2121+
return output
2122+
End
2123+
2124+
/// @brief Function returns a wave reference wave with one wave for each element of the dataset array
2125+
/// Each wave contains the resolved dataset (as wave references)
2126+
///
2127+
/// @param exd Execution data structure
2128+
/// @param argNum Argument index
2129+
/// @param resolveSelect [optional, defaults to 0] If set then argument of the select type are automatically converted to sweep data, effectively the data() operation is applied
2130+
/// As with data, if the argument is an array of selects, each sweep result gets concatenated to a wref wave
2131+
/// @returns wref wave with one wave for each dataset array element. Each wave contains the resolved dataset as waveref wave.
2132+
Function/WAVE SFH_GetDatasetArrayAsResolvedWaverefs(STRUCT SF_ExecutionData &exd, variable argNum, [variable resolveSelect])
2133+
2134+
variable numGroups
2135+
2136+
resolveSelect = ParamIsDefault(resolveSelect) ? 0 : !!resolveSelect
2137+
2138+
SFH_ASSERT(argNum < SFH_GetNumberOfArguments(exd), "operation has no argument number " + num2istr(argNum))
2139+
if(resolveSelect)
2140+
WAVE/Z/WAVE input = SFH_GetArgumentSelect(exd, argNum, doNotEnforce = 1)
2141+
if(WaveExists(input))
2142+
// In contrast to SFH_GetArgumentAsWave, resolve all selects from the array separately
2143+
numGroups = DimSize(input, ROWS)
2144+
SFH_ASSERT(numGroups >= 2, "First argument must be an array with at least two elements")
2145+
Make/FREE/WAVE/N=(numGroups) dataFromEachGroup = SFH_GetDataFromSelect(exd.graph, {input[p]})
2146+
endif
2147+
endif
2148+
2149+
if(!WaveExists(dataFromEachGroup))
2150+
WAVE/WAVE input = SF_ResolveDatasetFromJSON(exd, argNum)
2151+
SFH_ASSERT(IsTextWave(input[0]), "Expected a dataset")
2152+
WAVE/T elemRefs = input[0]
2153+
numGroups = DimSize(elemRefs, ROWS)
2154+
SFH_ASSERT(numGroups >= 2, "First argument must be an array with at least two elements")
2155+
Make/FREE/WAVE/N=(numGroups) dataFromEachGroup = SFH_AttemptDatasetResolve(elemRefs[p], checkWithSFHAssert = 1)
2156+
endif
2157+
2158+
return dataFromEachGroup
2159+
End

Packages/MIES/MIES_SweepFormula_Operations.ipf

Lines changed: 77 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ static StrConstant SF_OP_APFREQUENCY_X_TIME = "time"
3232

3333
static StrConstant SF_OP_AVG_INSWEEPS = "in"
3434
static StrConstant SF_OP_AVG_OVERSWEEPS = "over"
35+
static StrConstant SF_OP_AVG_GROUPS = "group"
3536

3637
static StrConstant SF_OP_EPOCHS_TYPE_RANGE = "range"
3738
static StrConstant SF_OP_EPOCHS_TYPE_NAME = "name"
@@ -62,7 +63,7 @@ Function/WAVE SFO_OperationAnaFuncParam(STRUCT SF_ExecutionData &exd)
6263
SFH_CheckArgumentCount(exd, SF_OP_ANAFUNCPARAM, 0, maxArgs = 2)
6364

6465
WAVE/T names = SFH_GetArgumentAsWave(exd, SF_OP_ANAFUNCPARAM, 0, singleResult = 1)
65-
WAVE/Z selectData = SFH_GetArgumentSelect(exd, SF_OP_DATA, 1)
66+
WAVE/Z selectData = SFH_GetArgumentSelect(exd, 1)
6667

6768
WAVE/WAVE output = SFO_OperationAnaFuncParamIterate(exd.graph, names, selectData, SF_OP_ANAFUNCPARAM)
6869

@@ -493,23 +494,63 @@ Function/WAVE SFO_OperationAvg(STRUCT SF_ExecutionData &exd)
493494

494495
numArgs = SFH_CheckArgumentCount(exd, opShort, 1, maxArgs = 2)
495496

496-
WAVE/WAVE input = SF_ResolveDatasetFromJSON(exd, 0)
497-
mode = SFH_GetArgumentAsText(exd, opShort, 1, defValue = SF_OP_AVG_INSWEEPS, allowedValues = {SF_OP_AVG_INSWEEPS, SF_OP_AVG_OVERSWEEPS})
497+
mode = SFH_GetArgumentAsText(exd, opShort, 1, defValue = SF_OP_AVG_INSWEEPS, allowedValues = {SF_OP_AVG_INSWEEPS, SF_OP_AVG_OVERSWEEPS, SF_OP_AVG_GROUPS})
498+
if(!CmpStr(mode, SF_OP_AVG_INSWEEPS) || !CmpStr(mode, SF_OP_AVG_OVERSWEEPS))
499+
WAVE/WAVE input = SFH_GetArgumentAsWave(exd, opShort, 0, resolveSelect = 1)
500+
strswitch(mode)
501+
case SF_OP_AVG_INSWEEPS:
502+
WAVE/WAVE output = SFH_CreateSFRefWave(exd.graph, opShort, DimSize(input, ROWS))
503+
output[] = SFO_OperationAvgImplIn(input[p])
504+
SFH_TransferFormulaDataWaveNoteAndMeta(input, output, opShort, SF_DATATYPE_AVG)
505+
return SFH_GetOutputForExecutor(output, exd.graph, opShort, clear = input)
498506

499-
strswitch(mode)
500-
case SF_OP_AVG_INSWEEPS:
501-
WAVE/WAVE output = SFH_CreateSFRefWave(exd.graph, opShort, DimSize(input, ROWS))
502-
output[] = SFO_OperationAvgImplIn(input[p])
503-
SFH_TransferFormulaDataWaveNoteAndMeta(input, output, opShort, SF_DATATYPE_AVG)
504-
return SFH_GetOutputForExecutor(output, exd.graph, opShort, clear = input)
507+
case SF_OP_AVG_OVERSWEEPS:
508+
return SFO_OperationAvgImplOver(input, exd.graph, opShort)
505509

506-
case SF_OP_AVG_OVERSWEEPS:
507-
return SFO_OperationAvgImplOver(input, exd.graph, opShort)
510+
default:
511+
FATAL_ERROR("Unhandled avg operation mode")
512+
endswitch
513+
elseif(!CmpStr(mode, SF_OP_AVG_GROUPS))
514+
WAVE/WAVE dataFromEachGroup = SFH_GetDatasetArrayAsResolvedWaverefs(exd, 0, resolveSelect = 1)
515+
WAVE/WAVE averagedGroup = SFO_OperationAvgImplSweepGroups(dataFromEachGroup, exd.graph, opShort)
516+
SFH_TransferFormulaDataWaveNoteAndMeta(dataFromEachGroup[0], averagedGroup, opShort, SF_DATATYPE_AVG)
508517

509-
default:
510-
FATAL_ERROR("Unknown avg operation mode")
511-
endswitch
518+
return SFH_GetOutputForExecutor(averagedGroup, exd.graph, opShort)
519+
else
520+
FATAL_ERROR("Unhandled avg operation mode")
521+
endif
522+
End
512523

524+
static Function/WAVE SFO_OperationAvgImplSweepGroups(WAVE/WAVE sweepsFromEachSelection, string graph, string opShort)
525+
526+
variable numData, numMaxSweeps, numGroups, i, j
527+
STRUCT RGBColor s
528+
529+
[s] = GetTraceColorForAverage()
530+
Make/FREE/W/U traceColor = {s.red, s.green, s.blue}
531+
532+
numGroups = DimSize(sweepsFromEachSelection, ROWS)
533+
Make/FREE/D/N=(numGroups) sweepCnts = DimSize(sweepsFromEachSelection[p], ROWS)
534+
numMaxSweeps = WaveMax(sweepCnts)
535+
WAVE/WAVE output = SFH_CreateSFRefWave(graph, opShort, numMaxSweeps)
536+
for(i = 0; i < numMaxSweeps; i += 1)
537+
Make/FREE/WAVE/N=(numGroups) avgSet
538+
numData = 0
539+
for(j = 0; j < numGroups; j += 1)
540+
if(DimSize(sweepsFromEachSelection[j], ROWS) > i)
541+
avgSet[numData] = WaveRef(sweepsFromEachSelection[j], row = i)
542+
numData += 1
543+
endif
544+
endfor
545+
Redimension/N=(numData) avgSet
546+
WAVE/WAVE avg = MIES_fWaveAverage(avgSet, 1, IGOR_TYPE_64BIT_FLOAT)
547+
output[i] = avg[0]
548+
JWN_SetWaveInWaveNote(output[i], SF_META_TRACECOLOR, traceColor)
549+
JWN_SetNumberInWaveNote(output[i], SF_META_TRACETOFRONT, 1)
550+
JWN_SetNumberInWaveNote(output[i], SF_META_LINESTYLE, 0)
551+
endfor
552+
553+
return output
513554
End
514555

515556
static Function/WAVE SFO_OperationAvgImplOver(WAVE/WAVE input, string graph, string opShort)
@@ -677,15 +718,9 @@ Function/WAVE SFO_OperationData(STRUCT SF_ExecutionData &exd)
677718
variable i, numArgs
678719

679720
SFH_CheckArgumentCount(exd, SF_OP_DATA, 0, maxArgs = 1)
680-
WAVE/WAVE selectData = SFH_GetArgumentSelect(exd, SF_OP_DATA, 0)
721+
WAVE/WAVE selectData = SFH_GetArgumentSelect(exd, 0)
681722

682-
WAVE/WAVE output = SFH_GetSweepsForFormula(exd.graph, selectData, SF_OP_DATA)
683-
if(!DimSize(output, ROWS))
684-
DebugPrint("Call to SFH_GetSweepsForFormula returned no results")
685-
endif
686-
687-
SFH_AddOpToOpStack(output, "", SF_OP_DATA)
688-
SFH_ResetArgSetupStack(output, SF_OP_DATA)
723+
WAVE output = SFH_GetDataFromSelect(exd.graph, selectData)
689724

690725
return SFH_GetOutputForExecutor(output, exd.graph, SF_OP_DATA)
691726
End
@@ -704,6 +739,24 @@ Function/WAVE SFO_OperationDataset(STRUCT SF_ExecutionData &exd)
704739
return SFH_GetOutputForExecutor(output, exd.graph, SF_OP_DATASET)
705740
End
706741

742+
// extract(<dataset>, index)
743+
Function/WAVE SFO_OperationExtract(STRUCT SF_ExecutionData &exd)
744+
745+
variable idx
746+
string opShort = SF_OP_EXTRACT
747+
748+
SFH_CheckArgumentCount(exd, opShort, 2, maxArgs = 2)
749+
750+
WAVE/WAVE datasets = SFH_GetArgumentAsWave(exd, opShort, 0)
751+
idx = SFH_GetArgumentAsNumeric(exd, opShort, 1)
752+
SFH_ASSERT(idx >= 0 && idx < DimSize(datasets, ROWS), "index out of range")
753+
754+
WAVE/WAVE output = SFH_CreateSFRefWave(exd.graph, opShort, 1)
755+
output[0] = datasets[idx]
756+
757+
return SFH_GetOutputForExecutor(output, exd.graph, opShort)
758+
End
759+
707760
Function/WAVE SFO_OperationDerivative(STRUCT SF_ExecutionData &exd)
708761

709762
variable numArgs
@@ -808,7 +861,7 @@ Function/WAVE SFO_OperationEpochs(STRUCT SF_ExecutionData &exd)
808861
endif
809862

810863
WAVE/Z/WAVE selectData = $""
811-
WAVE/Z/WAVE selectDataArray = SFH_GetArgumentSelect(exd, SF_OP_EPOCHS, 1)
864+
WAVE/Z/WAVE selectDataArray = SFH_GetArgumentSelect(exd, 1)
812865
if(WaveExists(selectDataArray))
813866
SFH_ASSERT(DimSize(selectDataArray, ROWS) == 1, "Expected a single select specification")
814867
WAVE/Z/WAVE selectDataComp = selectDataArray[0]
@@ -1090,7 +1143,7 @@ Function/WAVE SFO_OperationLabnotebook(STRUCT SF_ExecutionData &exd)
10901143
modeTxt = SFH_GetArgumentAsText(exd, SF_OP_LABNOTEBOOK, 2, allowedValues = allowedValuesMode, defValue = "DATA_ACQUISITION_MODE")
10911144
mode = ParseLogbookMode(modeTxt)
10921145

1093-
WAVE/Z selectData = SFH_GetArgumentSelect(exd, SF_OP_LABNOTEBOOK, 1)
1146+
WAVE/Z selectData = SFH_GetArgumentSelect(exd, 1)
10941147

10951148
WAVE/T lbnKeys = SFH_GetArgumentAsWave(exd, SF_OP_LABNOTEBOOK, 0, expectedMajorType = IGOR_TYPE_TEXT_WAVE, singleResult = 1)
10961149

Packages/MIES/MIES_SweepFormula_Operations_TP.ipf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ Function/WAVE SFOTP_OperationTP(STRUCT SF_ExecutionData &exd)
4242
WAVE/Z ignoreTPs
4343
endif
4444

45-
WAVE/Z selectData = SFH_GetArgumentSelect(exd, SF_OP_TP, 1)
45+
WAVE/Z selectData = SFH_GetArgumentSelect(exd, 1)
4646

4747
WAVE/WAVE wMode = SF_ResolveDatasetFromJSON(exd, 0)
4848
dataType = JWN_GetStringFromWaveNote(wMode, SF_META_DATATYPE)

Packages/MIES/MIES_SweepFormula_PSX.ipf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4760,7 +4760,7 @@ Function/WAVE PSX_OperationKernel(STRUCT SF_ExecutionData &exd)
47604760

47614761
SFH_CheckArgumentCount(exd, SF_OP_PSX_KERNEL, 0, maxArgs = 4)
47624762

4763-
WAVE/Z/WAVE selectDataCompArray = SFH_GetArgumentSelect(exd, SF_OP_PSX_KERNEL, 0)
4763+
WAVE/Z/WAVE selectDataCompArray = SFH_GetArgumentSelect(exd, 0)
47644764
SFH_ASSERT(WaveExists(selectDataCompArray), "Could not gather sweep data from select statement")
47654765

47664766
riseTau = SFH_GetArgumentAsNumeric(exd, SF_OP_PSX_KERNEL, 1, defValue = 1, checkFunc = IsStrictlyPositiveAndFinite)
@@ -4910,7 +4910,7 @@ Function/WAVE PSX_OperationStats(STRUCT SF_ExecutionData &exd)
49104910

49114911
id = SFH_GetArgumentAsText(exd, SF_OP_PSX, 0, checkFunc = IsValidObjectName)
49124912

4913-
WAVE/Z/WAVE selectDataCompArray = SFH_GetArgumentSelect(exd, SF_OP_PSX_STATS, 1)
4913+
WAVE/Z/WAVE selectDataCompArray = SFH_GetArgumentSelect(exd, 1)
49144914
SFH_Assert(WaveExists(selectDataCompArray), "Missing select data")
49154915

49164916
WAVE allProps = PSX_GetAllStatsProperties()

Packages/MIES/SweepFormulaHelp.ifn

3.7 KB
Binary file not shown.

0 commit comments

Comments
 (0)