Skip to content

Commit 8803d9c

Browse files
MichaelHutht-b
authored andcommitted
SF: Speed optimization of select operation
- included "displayed" handling in SF_GetActiveChannelNumbersForSweeps
1 parent 85d599e commit 8803d9c

File tree

1 file changed

+131
-127
lines changed

1 file changed

+131
-127
lines changed

Packages/MIES/MIES_SweepFormula.ipf

Lines changed: 131 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,66 +1058,6 @@ static Function SF_GetDAChannel(string graph, variable sweep, variable channelTy
10581058
return NaN
10591059
End
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-
11211061
static 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

Comments
 (0)