@@ -458,6 +458,13 @@ Function BSP_SetSweepBrowser(win)
458458 BSP_SetBrowserType ( win, BROWSERTYPE_SWEEPBROWSER)
459459End
460460
461+ /// @brief wrapper function for external calls
462+ Function BSP_IsSweepBrowser ( win)
463+ string win
464+
465+ return ! cmpstr ( BSP_GetBrowserType ( win) , BROWSERTYPE_SWEEPBROWSER)
466+ End
467+
461468/// @brief wrapper function for external calls
462469Function BSP_IsDataBrowser ( win)
463470 string win
@@ -1048,8 +1055,8 @@ Function BSP_ScaleAxes(win)
10481055 graph = GetMainWindow ( win)
10491056 bsPanel = BSP_GetPanel ( win)
10501057 visXRange = GetCheckBoxState ( bsPanel, "check_Display_VisibleXrange" )
1051- equalY = GetCheckBoxState ( bsPanel, "check_Display_EqualYrange" )
1052- equalYIgn = GetCheckBoxState ( bsPanel, "check_Display_EqualYignore" )
1058+ equalY = GetCheckBoxState ( bsPanel, "check_Display_EqualYrange" ) && ! IsControlDisabled ( bsPanel , "check_Display_EqualYrange" )
1059+ equalYIgn = GetCheckBoxState ( bsPanel, "check_Display_EqualYignore" ) && ! IsControlDisabled ( bsPanel , "check_Display_EqualYignore" )
10531060
10541061 ASSERT ( visXRange + equalY + equalYIgn <= 1, "Only one scaling mode is allowed to be selected" )
10551062
@@ -1111,6 +1118,32 @@ Function BSP_CheckProc_ChangedSetting(cba) : CheckBoxControl
11111118 DisableControl ( bsPanel, "slider_BrowserSettings_dDAQ" )
11121119 endif
11131120 break
1121+ case "check_BrowserSettings_DAC" :
1122+ if ( checked)
1123+ EnableControl ( bsPanel, "check_BrowserSettings_VisEpochs" )
1124+ else
1125+ DisableControl ( bsPanel, "check_BrowserSettings_VisEpochs" )
1126+ endif
1127+ break
1128+ case "check_BrowserSettings_TTL" :
1129+ if ( checked)
1130+ EnableControl ( bsPanel, "check_BrowserSettings_splitTTL" )
1131+ else
1132+ DisableControl ( bsPanel, "check_BrowserSettings_splitTTL" )
1133+ endif
1134+ break
1135+ case "check_BrowserSettings_VisEpochs" :
1136+ #if IgorVersion () >= 9.0
1137+ if ( checked)
1138+ DisableControls ( bsPanel, "check_Display_EqualYrange;check_Display_EqualYignore" )
1139+ else
1140+ EnableControls ( bsPanel, "check_Display_EqualYrange;check_Display_EqualYignore" )
1141+ endif
1142+ #else
1143+ print "Epoch visualization is an Igor Pro 9 only feature."
1144+ ControlWindowToFront ()
1145+ #endif
1146+ break
11141147 default :
11151148 if ( StringMatch ( ctrl, "check_channelSel_*" ))
11161149 BSP_GUIToChannelSelectionWave ( bsPanel, ctrl, checked)
@@ -1423,3 +1456,154 @@ Function BSP_UnHideSettingsHistory(win)
14231456 SetWindow $ settingsHistoryPanel hide=0, needUpdate=1
14241457 endif
14251458End
1459+
1460+ #if IgorVersion () >= 9.0
1461+
1462+ /// @brief Debug function to add traces with epoch information
1463+ Function BSP_AddTracesForEpochs ( string win)
1464+
1465+ variable i , j, k, numEntries, start_x, start_y, end_x, end_y, yOffset
1466+ variable headstage, yLevelOffset, level, idx, numTraces, numEpochs
1467+ variable sweepNumber
1468+ STRUCT RGBColor c
1469+ string xaxis, yaxis, axes, axis, levels_x_name, levels_y_name, name
1470+ string level_0 _trace, level_1 _trace, level_2 _trace, level_3 _trace
1471+
1472+ if ( ! BSP_IsDataBrowser ( win) && ! BSP_IsSweepBrowser ( win))
1473+ printf "The current window is neither a databrowser nor a sweepbrowser windows.\r "
1474+ ControlWindowToFront ()
1475+ return Nan
1476+ endif
1477+
1478+ DFREF dfr = GetEpochsVisualizationFolder ( BSP_GetFolder ( win, MIES_BSP_PANEL_FOLDER))
1479+ RemoveTracesFromGraph ( win, dfr = dfr)
1480+
1481+ WAVE /T/ Z traceInfos = GetTraceInfos ( win, addFilterKeys = { "channelType" , "AssociatedHeadstage" } , addFilterValues = { "DA" , "1" })
1482+
1483+ if ( ! WaveExists ( traceInfos))
1484+ printf "Could not find any DA traces. Please enable them for display.\r "
1485+ ControlWindowToFront ()
1486+ return NaN
1487+ endif
1488+
1489+ numTraces = DimSize ( traceInfos, ROWS)
1490+ for ( j = 0; j < numTraces; j += 1 )
1491+ yaxis = traceInfos[ j][ % YAXIS]
1492+ xaxis = traceInfos[ j][ % XAXIS]
1493+
1494+ headstage = str2num ( traceInfos[ j][ % headstage])
1495+ sweepNumber = str2num ( traceInfos[ j][ % sweepNumber])
1496+
1497+ WAVE /T textualValues = BSP_GetlBNWave ( win, LBN_TEXTUAL_VALUES, sweepNumber = sweepNumber)
1498+
1499+ WAVE /T epochLBEntries = GetLastSetting ( textualValues, sweepNumber, EPOCHS_ENTRY_KEY, DATA_ACQUISITION_MODE)
1500+ WAVE /T epochs = ListToTextWaveMD ( epochLBEntries[ headstage] , 2, rowSep = ":" , colSep = "," )
1501+
1502+ sprintf name, "epochs_sweep%d_HS%d" , sweepNumber, headstage
1503+
1504+ Duplicate / O/ T epochs, dfr:$ name/Wave = epochs
1505+
1506+ yLevelOffset = 10
1507+ yOffset = - yLevelOffset
1508+
1509+ numEpochs = DimSize ( epochs, ROWS)
1510+
1511+ Make / FREE/ N= ( 4 ) currentLevel, indexInLevel
1512+
1513+ sprintf levels_x_name, "levels_x_sweep%d_HS%d" , sweepNumber, headstage
1514+ Make / O/ N= ( numEpochs * 3, 4, 2 ) dfr:$ levels_x_name/WAVE = levels_x
1515+ levels_x = NaN
1516+
1517+ sprintf levels_y_name, "levels_y_sweep%d_HS%d" , sweepNumber, headstage
1518+ Make / O/ N= ( numEpochs * 3, 4, 2 ) dfr:$ levels_y_name/WAVE = levels_y
1519+ levels_y = NaN
1520+ SetStringInWaveNote ( levels_y, "EpochInfo" , GetWavesDataFolder ( epochs, 2 ))
1521+
1522+ for ( k = 0; k < numEpochs; k += 1 )
1523+
1524+ start_x = str2num ( epochs[ k][ 0 ]) * 1000
1525+ end_x = str2num ( epochs[ k][ 1 ]) * 1000
1526+
1527+ level = str2num ( epochs[ k][ 3 ])
1528+
1529+ start_y = yOffset - yLevelOffset * level - 0.1 * yLevelOffset * currentLevel[ level]
1530+ end_y = start_y
1531+
1532+ idx = indexInLevel[ level]
1533+ levels_x[ idx][ level][ 0 ] = start_x
1534+ levels_x[ idx + 1 ][ level][ 0 ] = end_x
1535+ levels_x[ idx + 2 ][ level][ 0 ] = NaN
1536+ levels_x[ idx, idx + 2 ][ level][ 1 ] = k
1537+
1538+ levels_y[ idx][ level][ 0 ] = start_y
1539+ levels_y[ idx + 1 ][ level][ 0 ] = end_y
1540+ levels_y[ idx + 2 ][ level][ 0 ] = NaN
1541+ levels_y[ idx, idx + 2 ][ level][ 1 ] = k
1542+
1543+ indexInLevel[ level] = idx + 3
1544+
1545+ currentLevel[ level] += 1
1546+ endfor
1547+
1548+ sprintf level_0 _trace, "level%d_x_sweep%d_HS%d" , 0, sweepNumber, headstage
1549+ sprintf level_1 _trace, "level%d_x_sweep%d_HS%d" , 1, sweepNumber, headstage
1550+ sprintf level_2 _trace, "level%d_x_sweep%d_HS%d" , 2, sweepNumber, headstage
1551+ sprintf level_3 _trace, "level%d_x_sweep%d_HS%d" , 3, sweepNumber, headstage
1552+
1553+ AppendToGraph / W=$ win/ L=$ yAxis levels_y[][ 0 ] / TN=$ level_0 _trace vs levels_x[][ 0 ]
1554+ AppendToGraph / W=$ win/ L=$ yAxis levels_y[][ 1 ] / TN=$ level_1 _trace vs levels_x[][ 1 ]
1555+ AppendToGraph / W=$ win/ L=$ yAxis levels_y[][ 2 ] / TN=$ level_2 _trace vs levels_x[][ 2 ]
1556+ AppendToGraph / W=$ win/ L=$ yAxis levels_y[][ 3 ] / TN=$ level_3 _trace vs levels_x[][ 3 ]
1557+
1558+ [ c] = GetTraceColor ( 0 )
1559+ ModifyGraph / W=$ win marker ( $ level_0 _trace) =10, mode ( $ level_0 _trace) =4, rgb ( $ level_0 _trace) = ( c. red, c. green, c. blue)
1560+ [ c] = GetTraceColor ( 1 )
1561+ ModifyGraph / W=$ win marker ( $ level_1 _trace) =10, mode ( $ level_1 _trace) =4, rgb ( $ level_1 _trace) = ( c. red, c. green, c. blue)
1562+ [ c] = GetTraceColor ( 2 )
1563+ ModifyGraph / W=$ win marker ( $ level_2 _trace) =10, mode ( $ level_2 _trace) =4, rgb ( $ level_2 _trace) = ( c. red, c. green, c. blue)
1564+ [ c] = GetTraceColor ( 3 )
1565+ ModifyGraph / W=$ win marker ( $ level_3 _trace) =10, mode ( $ level_3 _trace) =4, rgb ( $ level_3 _trace) = ( c. red, c. green, c. blue)
1566+
1567+ SetWindow $ win tooltipHook ( hook) = BSP_EpochGraphToolTip
1568+
1569+ DoWindow / F $ win
1570+ ShowTraceInfoTags ()
1571+
1572+ SetAxis / W=$ win/ A
1573+ endfor
1574+ End
1575+
1576+ Function BSP_EpochGraphToolTip ( s)
1577+ STRUCT WMTooltipHookStruct & s
1578+
1579+ variable idx, first, last
1580+ Variable hookResult = 0 // 0 tells Igor to use the standard tooltip
1581+
1582+ // traceName is set only for graphs and only if the mouse hovered near a trace
1583+ if ( strlen ( s. traceName) > 0 )
1584+ s. tooltip = "a <-> b"
1585+ s. isHtml = 1
1586+ WAVE w = s. yWave // The trace's Y wave
1587+ if ( WaveDims ( w) > 2 )
1588+ WAVE /T/ Z epochs = $ GetStringFromWaveNote ( w, "EpochInfo" )
1589+ ASSERT ( WaveExists ( epochs) , "Missing epoch info" )
1590+ hookResult = 1 // 1 tells Igor to use our custom tooltip
1591+ idx = w[ s. row][ s. column][ 1 ]
1592+ first = str2num ( epochs[ idx][ 0 ]) * 1000
1593+ last = str2num ( epochs[ idx][ 1 ]) * 1000
1594+
1595+ s. tooltip = num2str ( first) + "<->" + num2str ( last) + "\n " + epochs[ idx][ 2 ]
1596+ endif
1597+ endif
1598+
1599+ return hookResult
1600+ End
1601+
1602+ #else
1603+
1604+ Function BSP_AddTracesForEpochs ( string win)
1605+
1606+ BUG ( "Epoch visualization is an IP9-only feature" )
1607+ End
1608+
1609+ #endif
0 commit comments