@@ -1058,66 +1058,6 @@ static Function SF_GetDAChannel(string graph, variable sweep, variable channelTy
10581058 return NaN
10591059End
10601060
1061- static Function/WAVE SF_FilterSelectDataFromDisplayed ( string graph, WAVE selectData)
1062-
1063- variable i , j, index
1064- variable numEntries, numTraces
1065- variable sweepNo, channelType, channelNumber
1066- variable dimPosSweepNo, dimPosChannelType, dimPosChannelNumber
1067- variable dimPosSelectSweepNo, dimPosSelectChannelType, dimPosSelectChannelNumber
1068-
1069- ASSERT ( WindowExists ( graph) , "graph window does not exist" )
1070-
1071- numEntries = DimSize ( selectData, ROWS)
1072-
1073- WAVE /T/ Z traces = GetTraceInfos ( graph)
1074- if ( ! WaveExists ( traces))
1075- DebugPrint ( "No traces found for extracting sweep wave locations." )
1076- return $ ""
1077- endif
1078- numTraces = DimSize ( traces, ROWS)
1079-
1080- Duplicate / FREE selectData, selectDataFiltered
1081- dimPosSweepNo = FindDimLabel ( traces, COLS, "sweepNumber" )
1082- dimPosChannelType = FindDimLabel ( traces, COLS, "channelType" )
1083- dimPosChannelNumber = FindDimLabel ( traces, COLS, "channelNumber" )
1084-
1085- dimPosSelectSweepNo = FindDimLabel ( selectData, COLS, "SWEEP" )
1086- dimPosSelectChannelType = FindDimLabel ( selectData, COLS, "CHANNELTYPE" )
1087- dimPosSelectChannelNumber = FindDimLabel ( selectData, COLS, "CHANNELNUMBER" )
1088-
1089- WAVE selectDisplayed = SF_NewSelectDataWave ( numTraces, 1 )
1090- selectDisplayed[][ % SWEEP] = str2num ( traces[ p][ dimPosSweepNo])
1091- selectDisplayed[][ % CHANNELTYPE] = WhichListItem ( traces[ p][ dimPosChannelType] , XOP_CHANNEL_NAMES)
1092- selectDisplayed[][ % CHANNELNUMBER] = str2num ( traces[ p][ dimPosChannelNumber])
1093-
1094- for ( i = 0; i < numEntries; i += 1 )
1095-
1096- sweepNo = selectData[ i ][ % SWEEP]
1097- channelType = selectData[ i ][ % CHANNELTYPE]
1098- channelNumber = selectData[ i ][ % CHANNELNUMBER]
1099-
1100- for ( j = 0; j < numTraces; j += 1 )
1101-
1102- if ( selectDisplayed[ j][ dimPosSelectSweepNo] == sweepNo && selectDisplayed[ j][ dimPosSelectChannelType] == channelType && selectDisplayed[ j][ dimPosSelectChannelNumber] == channelNumber)
1103-
1104- selectDataFiltered[ index][ % SWEEP] = sweepNo
1105- selectDataFiltered[ index][ % CHANNELTYPE] = channelType
1106- selectDataFiltered[ index][ % CHANNELNUMBER] = channelNumber
1107- index += 1
1108-
1109- break
1110- endif
1111- endfor
1112- endfor
1113- if ( ! index)
1114- return $ ""
1115- endif
1116- Redimension / N= ( index, -1 ) selectDataFiltered
1117-
1118- return selectDataFiltered
1119- End
1120-
11211061static Function/WAVE SF_GetSweepsForFormula ( string graph, WAVE range, WAVE selectData)
11221062
11231063 variable i , j, rangeStart, rangeEnd, pOffset, delta, numRows, DAChannel, numSweeps, sweepNo
@@ -1340,49 +1280,94 @@ End
13401280/// @param graph DataBrowser or SweepBrowser reference graph
13411281/// @param channels @c SF_FormulaExecutor style @c channels() wave
13421282/// @param sweeps @c SF_FormulaExecutor style @c sweeps() wave
1343- /// @param entrySourceType type of the labnotebook entry, one of @ref DataAcqModes.
1344- /// If you don't care about the entry source type pass #UNKNOWN_MODE.
1283+ /// @param fromDisplayed boolean variable, if set the selectdata is determined from the displayed sweeps
1284+ ///
13451285/// @return a selectData style wave with three columns
13461286/// containing sweepNumber, channelType and channelNumber
1347- static Function/WAVE SF_GetActiveChannelNumbersForSweeps ( string graph, WAVE channels, WAVE sweeps, variable entrySourceType )
1287+ static Function/WAVE SF_GetActiveChannelNumbersForSweeps ( string graph, WAVE channels, WAVE sweeps, variable fromDisplayed )
13481288
1349- variable i , j, k, l, channelType, channelNumber, sweepNo, outIndex
1289+ variable i , j, k, l, channelType, channelNumber, sweepNo, sweepNoT , outIndex
13501290 variable numSweeps, numInChannels, numSettings, maxChannels, activeChannel, numActiveChannels
13511291 variable isSweepBrowser, cIndex
13521292 variable dimPosSweep, dimPosChannelNumber, dimPosChannelType
1293+ variable dimPosTSweep, dimPosTChannelNumber, dimPosTChannelType
1294+ variable numTraces
13531295 string setting, settingList, msg, device, dataFolder, singleSweepDFStr
13541296
1355- ASSERT ( windowExists ( graph) , "DB/SB not specified." )
1356- SF_ASSERT ( DimSize ( channels, COLS) == 2, "A channel input consists of [[channelType, channelNumber]+]." )
1357- SetDimLabel COLS, 0, channelType, channels
1358- SetDimLabel COLS, 1, channelNumber, channels
1359- SF_ASSERT ( DimSize ( sweeps, COLS) < 2, "Sweeps are one-dimensional." )
1360- SF_ASSERT (( IsNaN ( UNKNOWN_MODE) && IsNaN ( entrySourceType)) || \
1361- entrySourceType == DATA_ACQUISITION_MODE || \
1362- entrySourceType == TEST_PULSE_MODE || \
1363- entrySourceType == NUMBER_OF_LBN_DAQ_MODES, \
1364- "Undefined labnotebook mode. Use one in group DataAcqModes" )
1297+ if ( ! DimSize ( sweeps, ROWS) || ! DimSize ( channels, ROWS))
1298+ return $ ""
1299+ endif
13651300
1366- isSweepBrowser = BSP_IsSweepBrowser ( graph )
1301+ fromDisplayed = !! fromDisplayed
13671302
1368- if ( isSweepBrowser)
1369- DFREF sweepBrowserDFR = SB_GetSweepBrowserFolder ( graph)
1370- WAVE /T sweepMap = GetSweepBrowserMap ( sweepBrowserDFR)
1303+ if ( fromDisplayed)
1304+ WAVE /T/ Z traces = GetTraceInfos ( graph)
1305+ if ( ! WaveExists ( traces))
1306+ return $ ""
1307+ endif
1308+ numTraces = DimSize ( traces, ROWS)
1309+ dimPosTSweep = FindDimLabel ( traces, COLS, "sweepNumber" )
1310+ Make / FREE/ D/ N= ( numTraces) displayedSweeps = str2num ( traces[ p][ dimPosTSweep])
1311+ WAVE displayedSweepsUnique = GetUniqueEntries ( displayedSweeps, dontDuplicate=1 )
1312+ MatrixOp / FREE sweepsDP = fp64 ( sweeps)
1313+ WAVE /Z sweepsIntersect = GetSetIntersection ( sweepsDP, displayedSweepsUnique)
1314+ if ( ! WaveExists ( sweepsIntersect))
1315+ return $ ""
1316+ endif
1317+ WAVE sweeps = sweepsIntersect
1318+ numSweeps = DimSize ( sweeps, ROWS)
1319+
1320+ WAVE selectDisplayed = SF_NewSelectDataWave ( numTraces, 1 )
1321+ dimPosSweep = FindDimLabel ( selectDisplayed, COLS, "SWEEP" )
1322+ dimPosChannelType = FindDimLabel ( selectDisplayed, COLS, "CHANNELTYPE" )
1323+ dimPosChannelNumber = FindDimLabel ( selectDisplayed, COLS, "CHANNELNUMBER" )
1324+
1325+ dimPosTChannelType = FindDimLabel ( traces, COLS, "channelType" )
1326+ dimPosTChannelNumber = FindDimLabel ( traces, COLS, "channelNumber" )
1327+ for ( i = 0; i < numSweeps; i += 1 )
1328+ sweepNo = sweeps[ i ]
1329+ for ( j = 0; j < numTraces; j += 1 )
1330+ sweepNoT = str2num ( traces[ j][ dimPosTSweep])
1331+ if ( sweepNo == sweepNoT)
1332+ selectDisplayed[ outIndex][ dimPosSweep] = sweepNo
1333+ selectDisplayed[ outIndex][ dimPosChannelType] = WhichListItem ( traces[ j][ dimPosTChannelType] , XOP_CHANNEL_NAMES)
1334+ selectDisplayed[ outIndex][ dimPosChannelNumber] = str2num ( traces[ j][ dimPosTChannelNumber])
1335+ outIndex += 1
1336+ endif
1337+ if ( outIndex == numTraces)
1338+ break
1339+ endif
1340+ endfor
1341+ if ( outIndex == numTraces)
1342+ break
1343+ endif
1344+ endfor
1345+ Redimension / N= ( outIndex, -1 ) selectDisplayed
1346+ numTraces = outIndex
1347+
1348+ outIndex = 0
13711349 else
1372- SF_ASSERT ( BSP_HasBoundDevice ( graph) , "No device bound." )
1373- device = BSP_GetDevice ( graph)
1374- DFREF deviceDFR = GetDeviceDataPath ( device)
1350+ isSweepBrowser = BSP_IsSweepBrowser ( graph)
1351+ if ( isSweepBrowser)
1352+ DFREF sweepBrowserDFR = SB_GetSweepBrowserFolder ( graph)
1353+ WAVE /T sweepMap = GetSweepBrowserMap ( sweepBrowserDFR)
1354+ else
1355+ SF_ASSERT ( BSP_HasBoundDevice ( graph) , "No device bound." )
1356+ device = BSP_GetDevice ( graph)
1357+ DFREF deviceDFR = GetDeviceDataPath ( device)
1358+ endif
13751359 endif
13761360
13771361 // search sweeps for active channels
13781362 numSweeps = DimSize ( sweeps, ROWS)
13791363 numInChannels = DimSize ( channels, ROWS)
13801364
13811365 WAVE selectData = SF_NewSelectDataWave ( numSweeps, NUM_DA_TTL_CHANNELS + NUM_AD_CHANNELS)
1382-
1383- dimPosSweep = FindDimLabel ( selectData, COLS, "SWEEP" )
1384- dimPosChannelType = FindDimLabel ( selectData, COLS, "CHANNELTYPE" )
1385- dimPosChannelNumber = FindDimLabel ( selectData, COLS, "CHANNELNUMBER" )
1366+ if ( ! fromDisplayed)
1367+ dimPosSweep = FindDimLabel ( selectData, COLS, "SWEEP" )
1368+ dimPosChannelType = FindDimLabel ( selectData, COLS, "CHANNELTYPE" )
1369+ dimPosChannelNumber = FindDimLabel ( selectData, COLS, "CHANNELNUMBER" )
1370+ endif
13861371
13871372 for ( i = 0; i < numSweeps; i += 1 )
13881373 sweepNo = sweeps[ i ]
@@ -1391,25 +1376,26 @@ static Function/WAVE SF_GetActiveChannelNumbersForSweeps(string graph, WAVE chan
13911376 continue
13921377 endif
13931378
1394- if ( isSweepBrowser)
1395- cIndex = FindDimLabel ( sweepMap, COLS, "Sweep" )
1396- FindValue / RMD= [][ cIndex] / TEXT= num2istr ( sweepNo) / TXOP=4 sweepMap
1397- if ( V_value == -1 )
1379+ if ( ! fromDisplayed)
1380+ if ( isSweepBrowser)
1381+ cIndex = FindDimLabel ( sweepMap, COLS, "Sweep" )
1382+ FindValue / RMD= [][ cIndex] / TEXT= num2istr ( sweepNo) / TXOP=4 sweepMap
1383+ if ( V_value == -1 )
1384+ continue
1385+ endif
1386+ dataFolder = sweepMap[ V_row][ % DataFolder]
1387+ device = sweepMap[ V_row][ % Device]
1388+ DFREF deviceDFR = GetAnalysisSweepPath ( dataFolder, device)
1389+ endif
1390+ singleSweepDFStr = GetSingleSweepFolderAsString ( deviceDFR, sweepNo)
1391+ if ( ! DataFolderExists ( singleSweepDFStr))
1392+ continue
1393+ endif
1394+ DFREF sweepDFR = $ singleSweepDFStr
1395+ WAVE /Z numericalValues = BSP_GetLogbookWave ( graph, LBT_LABNOTEBOOK, LBN_NUMERICAL_VALUES, sweepNumber = sweepNo)
1396+ if ( ! WaveExists ( numericalValues))
13981397 continue
13991398 endif
1400- dataFolder = sweepMap[ V_row][ % DataFolder]
1401- device = sweepMap[ V_row][ % Device]
1402- DFREF deviceDFR = GetAnalysisSweepPath ( dataFolder, device)
1403- endif
1404- singleSweepDFStr = GetSingleSweepFolderAsString ( deviceDFR, sweepNo)
1405- if ( ! DataFolderExists ( singleSweepDFStr))
1406- continue
1407- endif
1408- DFREF sweepDFR = $ singleSweepDFStr
1409-
1410- WAVE /Z numericalValues = BSP_GetLogbookWave ( graph, LBT_LABNOTEBOOK, LBN_NUMERICAL_VALUES, sweepNumber = sweepNo)
1411- if ( ! WaveExists ( numericalValues))
1412- continue
14131399 endif
14141400
14151401 for ( j = 0; j < numInChannels; j += 1 )
@@ -1450,29 +1436,52 @@ static Function/WAVE SF_GetActiveChannelNumbersForSweeps(string graph, WAVE chan
14501436 break
14511437 endswitch
14521438
1453- WAVE /Z activeChannels = GetLastSetting ( numericalValues, sweepNo, setting, entrySourceType)
1454- if ( ! WaveExists ( activeChannels))
1455- continue
1456- endif
1457- if ( IsNaN ( channelNumber))
1458- // faster than ZapNaNs due to no mem alloc
1459- numActiveChannels = DimSize ( activeChannels, ROWS)
1460- for ( l = 0; l < numActiveChannels; l += 1 )
1461- activeChannel = activeChannels[ l]
1462- if ( ! IsNaN ( activeChannel) && activeChannel < maxChannels)
1439+ if ( fromDisplayed)
1440+ for ( l = 0; l < numTraces; l += 1 )
1441+ if ( IsNaN ( channelNumber))
1442+ if ( sweepNo == selectDisplayed[ l][ dimPosSweep] && channelType == selectDisplayed[ l][ dimPosChannelType])
1443+ activeChannel = selectDisplayed[ l][ dimPosChannelNumber]
1444+ if ( activeChannel < maxChannels)
1445+ selectData[ outIndex][ dimPosSweep] = sweepNo
1446+ selectData[ outIndex][ dimPosChannelType] = channelType
1447+ selectData[ outIndex][ dimPosChannelNumber] = selectDisplayed[ l][ dimPosChannelNumber]
1448+ outIndex += 1
1449+ endif
1450+ endif
1451+ else
1452+ if ( sweepNo == selectDisplayed[ l][ dimPosSweep] && channelType == selectDisplayed[ l][ dimPosChannelType] && channelNumber == selectDisplayed[ l][ dimPosChannelNumber] && channelNumber < maxChannels)
1453+ selectData[ outIndex][ dimPosSweep] = sweepNo
1454+ selectData[ outIndex][ dimPosChannelType] = channelType
1455+ selectData[ outIndex][ dimPosChannelNumber] = channelNumber
1456+ outIndex += 1
1457+ endif
1458+ endif
1459+ endfor
1460+ else
1461+ WAVE /Z activeChannels = GetLastSetting ( numericalValues, sweepNo, setting, DATA_ACQUISITION_MODE)
1462+ if ( ! WaveExists ( activeChannels))
1463+ continue
1464+ endif
1465+ if ( IsNaN ( channelNumber))
1466+ // faster than ZapNaNs due to no mem alloc
1467+ numActiveChannels = DimSize ( activeChannels, ROWS)
1468+ for ( l = 0; l < numActiveChannels; l += 1 )
1469+ activeChannel = activeChannels[ l]
1470+ if ( ! IsNaN ( activeChannel) && activeChannel < maxChannels)
1471+ selectData[ outIndex][ dimPosSweep] = sweepNo
1472+ selectData[ outIndex][ dimPosChannelType] = channelType
1473+ selectData[ outIndex][ dimPosChannelNumber] = activeChannel
1474+ outIndex += 1
1475+ endif
1476+ endfor
1477+ elseif ( channelNumber < maxChannels)
1478+ FindValue / V= ( channelNumber) activeChannels
1479+ if ( V_Value >= 0 )
14631480 selectData[ outIndex][ dimPosSweep] = sweepNo
14641481 selectData[ outIndex][ dimPosChannelType] = channelType
1465- selectData[ outIndex][ dimPosChannelNumber] = activeChannel
1482+ selectData[ outIndex][ dimPosChannelNumber] = channelNumber
14661483 outIndex += 1
14671484 endif
1468- endfor
1469- elseif ( channelNumber < maxChannels)
1470- FindValue / V= ( channelNumber) activeChannels
1471- if ( V_Value >= 0 )
1472- selectData[ outIndex][ dimPosSweep] = sweepNo
1473- selectData[ outIndex][ dimPosChannelType] = channelType
1474- selectData[ outIndex][ dimPosChannelNumber] = channelNumber
1475- outIndex += 1
14761485 endif
14771486 endif
14781487
@@ -2589,12 +2598,7 @@ static Function/WAVE SF_OperationSelect(variable jsonId, string jsonPath, string
25892598 endif
25902599 endif
25912600
2592- WAVE /Z out = SF_GetActiveChannelNumbersForSweeps ( graph, channels, sweeps, DATA_ACQUISITION_MODE)
2593- if ( ! CmpStr ( mode, "displayed" ) && WaveExists ( out))
2594- WAVE selectDataAll = out
2595- WAVE /Z out = SF_FilterSelectDataFromDisplayed ( graph, selectDataAll)
2596- endif
2597-
2601+ WAVE /Z out = SF_GetActiveChannelNumbersForSweeps ( graph, channels, sweeps, ! CmpStr ( mode, "displayed" ))
25982602 if ( ! WaveExists ( out))
25992603 DebugPrint ( "Call to SF_GetSweepNumbersForSelect returned no results" )
26002604 WAVE out = SF_GetDefaultEmptyWave ()
0 commit comments