Skip to content

Commit 87cffc1

Browse files
authored
Merge pull request #986 from AllenInstitute/feature/986-make-epoch-viewing-work-in-sweep-browser
Make epoch viewing work in sweep browser
2 parents c6e92ef + 556bc29 commit 87cffc1

10 files changed

+310
-250
lines changed

Packages/MIES/MIES_BrowserSettingsPanel.ipf

Lines changed: 186 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,13 @@ Function BSP_SetSweepBrowser(win)
458458
BSP_SetBrowserType(win, BROWSERTYPE_SWEEPBROWSER)
459459
End
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
462469
Function 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
14251458
End
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

Packages/MIES/MIES_Constants.ipf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ Constant HARDWARE_DAC_EXTERNAL_TRIGGER = 0x1
622622

623623
/// Used to upgrade the GuiStateWave as well as the DA Ephys panel
624624
Constant DA_EPHYS_PANEL_VERSION = 53
625-
Constant DATA_SWEEP_BROWSER_PANEL_VERSION = 29
625+
Constant DATA_SWEEP_BROWSER_PANEL_VERSION = 30
626626
Constant WAVEBUILDER_PANEL_VERSION = 10
627627
Constant ANALYSISBROWSER_PANEL_VERSION = 1
628628

Packages/MIES/MIES_DataBrowser.ipf

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ Function DB_ResetAndStoreCurrentDBPanel()
101101
SetWindow $panelTitle, userdata(Config_FileHash) = ""
102102
SetWindow $panelTitle, userdata(PulseAverageSettings) = ""
103103

104+
// invalidate hooks
105+
#if IgorVersion() >= 9.00
106+
SetWindow $panelTitle,tooltiphook(hook)=$""
107+
#endif
108+
104109
// static defaults for SweepControl subwindow
105110
PopupMenu Popup_SweepControl_Selector WIN = $scPanel, mode=1,popvalue=" ", value= #"\" \""
106111
CheckBox check_SweepControl_AutoUpdate WIN = $scPanel, value= 1
@@ -191,6 +196,7 @@ Function DB_ResetAndStoreCurrentDBPanel()
191196
CheckBox check_BrowserSettings_DAC WIN = $bsPanel, value= 0
192197
CheckBox check_BrowserSettings_ADC WIN = $bsPanel, value= 1
193198
CheckBox check_BrowserSettings_TTL WIN = $bsPanel, value= 0
199+
CheckBox check_BrowserSettings_splitTTL WIN = $bsPanel, value= 0,disable=DISABLE_CONTROL_BIT
194200
CheckBox check_BrowserSettings_OChan WIN = $bsPanel, value= 0
195201
CheckBox check_BrowserSettings_dDAQ WIN = $bsPanel, value= 0
196202
CheckBox check_Calculation_ZeroTraces WIN = $bsPanel, value= 0
@@ -201,16 +207,17 @@ Function DB_ResetAndStoreCurrentDBPanel()
201207
PopupMenu popup_TimeAlignment_Mode WIN = $bsPanel, mode=1, popvalue="Level (Raising)",value= #"\"Level (Raising);Level (Falling);Min;Max\""
202208
SetVariable setvar_TimeAlignment_LevelCross WIN = $bsPanel, value= _NUM:0
203209
CheckBox check_Display_VisibleXrange WIN = $bsPanel, value= 0
204-
CheckBox check_Display_EqualYrange WIN = $bsPanel, value= 0
205-
CheckBox check_Display_EqualYignore WIN = $bsPanel, value= 0
210+
CheckBox check_Display_EqualYrange WIN = $bsPanel, value= 0, disable=0
211+
CheckBox check_Display_EqualYignore WIN = $bsPanel, value= 0, disable=0
206212
SetVariable setvar_Display_EqualYlevel WIN = $bsPanel, value= _NUM:0
207-
Slider slider_BrowserSettings_dDAQ WIN = $bsPanel, value= -1
213+
Slider slider_BrowserSettings_dDAQ WIN = $bsPanel, value= -1,disable=DISABLE_CONTROL_BIT
208214
CheckBox check_SweepControl_HideSweep WIN = $bsPanel, value= 0
209-
CheckBox check_BrowserSettings_splitTTL WIN = $bsPanel, value= 0
210215
CheckBox check_BrowserSettings_DB_Passed WIN = $bsPanel, value= 0
211216
CheckBox check_BrowserSettings_DB_Failed WIN = $bsPanel, value= 0
212217
CheckBox check_BrowserSettings_SF WIN = $bsPanel, value= 0
213218

219+
CheckBox check_BrowserSettings_VisEpochs WIN = $bsPanel, value=0,disable=DISABLE_CONTROL_BIT
220+
214221
sfFormula = BSP_GetSFFormula(panelTitle)
215222
ReplaceNotebookText(sfFormula, "data(\rcursors(A,B),\rchannels(AD),\rsweeps()\r)")
216223

0 commit comments

Comments
 (0)