@@ -32,6 +32,7 @@ static StrConstant SF_OP_APFREQUENCY_X_TIME = "time"
3232
3333static StrConstant SF_OP_AVG_INSWEEPS = "in"
3434static StrConstant SF_OP_AVG_OVERSWEEPS = "over"
35+ static StrConstant SF_OP_AVG_GROUPS = "group"
3536
3637static StrConstant SF_OP_EPOCHS_TYPE_RANGE = "range"
3738static 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_64 BIT_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
513554End
514555
515556static 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)
691726End
@@ -704,6 +739,24 @@ Function/WAVE SFO_OperationDataset(STRUCT SF_ExecutionData &exd)
704739 return SFH_GetOutputForExecutor ( output, exd. graph, SF_OP_DATASET)
705740End
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+
707760Function /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
0 commit comments