4Misc_Start(#4Platform@VersionCheckg@bThis experiment requires Igor Pro 8.00 or later because it has waves with long dimension labels. xHH@Rg(HHdh xHH@Rg(HHdh x HH@Rg(HHdh ^Graph*sWDashSettings#  !4 4 4 4 4 4 mhome99dC:Users:aclight:Downloads:RecentWindows3D Graphics.ihfAdvanced Topics.ihfAnalysis of Functions.ihfAnalysis.ihfAnnotations.ihfCategory Plots.ihfCommands.ihfContour Plots.ihfControls.ihf 4Misc_End(#TXOPState_Start (#SQL64@4XOPState_End(#0L;IV_FlagS_info)ProcGlobal#CodeBrowserModule#updatePanel;•HideTools/A !6@:`mresultWave<????j^>w>!Í>F$&>^"I>(>z l>%4Ct>&Jw㴲>X>>U><| >j^>Z> > ΛPI>@_@PJ>Ih+>->y픫>Hӏ{ܟ>7FNl>smx>u5؃> Sof>?Up>yeTQ>T>]b|L>L'>!j>MQsն>JG_A>e;E>7d8>ظ>$A>mQ\>ESt>6B ->8l[5y>$ rݕ>g>Aka>UB>@؟>md_m>Y>Z>:#9>^l=h>ە >58߀}>B[Ω>1 >."3V>6sC>L v>T:/>a~>&}_>[G);>-q&ޭ>=nMU>B]G>+~HuU0>&gG>c"<>&}_> %>}߬>WzT>fG+p>DP >1"><>T >q;>$4^Bݭ>Ɨy@>`#<>fͩ>{PZͮ>$>>E>?Y> y|m>?r>qHΨ>۬c>v>׎>)>Ocȯ>E >>CtXD>iy>k>)zv>#5T>9+>z_.t>FLI>X>c>i.>">vTjH>$I>%>ѵ>.V`~>U>H-6J>C>V4>QklwV>k^p>N`->Ȗ2>$>0.>N>|tܶ>2qcͩ>2ED>/S>>G݀}>QX ҵ>e B>)$>gg>4 R>J~>Q>$z>gk*>qߒ> H%D>RX;>i87>'0loǭ>K >b1>3M;[K>_ڭ>jan?ƻȩJ>{)FzX>>PC?~Sb>D*#5>J(׺w>k6E6F ?P8oC>ê>C>X@W?8 >X >`pQ?W>}ש>l>PmO?(Hlw=>9Sը>ݩ쿭>sa?= T>>io>)N#?ZTYN?^ >Iw>XG*?*R~ ?Bʸ>Y^4^>ԊpF~1? m ?!3z>7>37? ~?7e:>X.\Kա>iãR??f'+?[4>Si>XYLD??_Q?4 >|q>2zK?E!?,>lNb>.~*ٯM?Q"I1'?`ó]>>$q>j`==T?3Ҧ),?Bwg>L{>=|\?1?<>IJ>e,Uc?@ 6?+>sǯ>s ~i?[=?4 A>>8wq?Q΂A?SG'>t>[MKjJu?ˀF?R%>۰>Rz,|?<@L?\JՎ>o-ޱ>KĂ?vlQ?>b_ ׄ>JSONTextwaveStringByKeyDimLabelWaveTextWaveHashReadingWriting  @YhresultWaveSummed<????8š>;nu>/`n!>&i5>Kg&>>>x`B7>;nu>P>>Ov>>OdN>ъ^>]c1>jF>1i,>5Q<>V]Ɇ>HG>f@E>}>*ˈ>HE&q>#Y?y>U;>}Z(B8>Οa7>PpE?>zjNH>rW>Tz>zТ->)!໶>yL >l ͚>!;Ou>hr6>" 4>=C_>lUP>C >ϦS>P b>8>o+?Z>6>ЇT>UF[>7VO> >t$ 7>_>-q>d>^SA>=#>Z>2D[>!>t.|>8g>:>>Xߢa>u`Ek>s 1>˙j>0>1" >TOr>%G>bMu>Ju?7,>dы?.%W>)DE ?=5>6L?z*C>I|kŹ?hAP҈>:P8ʀ?5+>Ɨ&1? \r??f#?vY7ps?saa*??ed\t1?6%?A7?RD-S?/l(??nu\w?˶wRD?ngR/?3AK4#K?l$"?bFGM?FkO'?R/ @T?r",?C8}w\?2?j 6c?V6?r׮%Ri?>=?6]q?  (A?Y3u?F F?-&|?L?}vĂ?N:Q?JSONTextwaveStringByKeyDimLabelWaveTextWaveHashReadingQ{dindizesd???? HH0IGGqG IHPH+IK1H)HI@NAHPH FP I!IHNHH@H@=H@C1H*GGdH@HpTF \H%H!GaG`,4I@ IHAI>GxG H`H I>F` 2II|I I H I0IHrI H@&HvF`mHHQI0IAH|5IR%I {HziH`H``HuGvFH@5IH~I 3HHPIfGP(:I HH~H08IH@a8HHCGGknGG0rI¦H lIGI`6I G`H`H@0IF2I@ HHGH>H@i++ddd????K@r==dddnum????  Packages!k  ResizeControlsPanel!!o~0L;IIndicatorWindowName8$*  گ :EditorTextWaver????SF_InfoTabSettingsbutton_BrowserSettings_Exportbutton_Calculation_RestoreDatabutton_RemoveRangesbutton_TimeAlignment_Actionbutton_sweepFormula_checkbutton_sweepFormula_displaycheck_BrowserSettings_ADCcheck_BrowserSettings_ARcheck_BrowserSettings_DACcheck_BrowserSettings_DB_Failedcheck_BrowserSettings_DB_Passedcheck_BrowserSettings_OChancheck_BrowserSettings_OVScheck_BrowserSettings_PAcheck_BrowserSettings_SFcheck_BrowserSettings_TAcheck_BrowserSettings_TTLcheck_BrowserSettings_dDAQcheck_BrowserSettings_splitTTLcheck_Calculation_AverageTracescheck_Calculation_ZeroTracescheck_Display_EqualYignorecheck_Display_EqualYrangecheck_Display_VisibleXrangecheck_SweepControl_HideSweepcheck_auto_removecheck_channelSel_AD_0check_channelSel_AD_1check_channelSel_AD_10check_channelSel_AD_11check_channelSel_AD_12check_channelSel_AD_13check_channelSel_AD_14check_channelSel_AD_15check_channelSel_AD_2check_channelSel_AD_3check_channelSel_AD_4check_channelSel_AD_5check_channelSel_AD_6check_channelSel_AD_7check_channelSel_AD_8check_channelSel_AD_9check_channelSel_AD_Allcheck_channelSel_DA_0check_channelSel_DA_1check_channelSel_DA_2check_channelSel_DA_3check_channelSel_DA_4check_channelSel_DA_5check_channelSel_DA_6check_channelSel_DA_7check_channelSel_DA_Allcheck_channelSel_HEADSTAGE_0check_channelSel_HEADSTAGE_1check_channelSel_HEADSTAGE_2check_channelSel_HEADSTAGE_3check_channelSel_HEADSTAGE_4check_channelSel_HEADSTAGE_5check_channelSel_HEADSTAGE_6check_channelSel_HEADSTAGE_7check_channelSel_HEADSTAGE_ALLcheck_headstage_axis_labelcheck_highlightRangescheck_overlaySweeps_disableHScheck_overlaySweeps_non_commulacheck_ovs_clear_on_new_ra_cyclecheck_ovs_clear_on_new_stimset_cyclecheck_pulseAver_deconvcheck_pulseAver_indTracescheck_pulseAver_multGraphscheck_pulseAver_showAvercheck_pulseAver_timeAligncheck_pulseAver_zeroTracgroup_SB_axes_scalinggroup_calcgroup_channelSel_ADgroup_channelSel_DAgroup_channelSel_HEADSTAGEgroup_enable_artifactgroup_enable_channelsgroup_enable_dashboardgroup_enable_pulsegroup_enable_sweepFormulagroup_enable_sweepsgroup_properties_artefactgroup_properties_pulsegroup_properties_sweepFormulagroup_properties_sweepsgroup_pulseAver_deconvgroup_timealignmentlist_dashboardlist_of_rangeslist_of_ranges1popup_DB_lockedDevicespopup_TimeAlignment_Masterpopup_TimeAlignment_Modepopup_overlaySweeps_selectsetvar_Display_EqualYlevelsetvar_TimeAlignment_LevelCrosssetvar_cutoff_length_aftersetvar_cutoff_length_beforesetvar_overlaySweeps_offsetsetvar_overlaySweeps_stepsetvar_pulseAver_deconv_rangesetvar_pulseAver_deconv_smthsetvar_pulseAver_deconv_tausetvar_pulseAver_endPulsesetvar_pulseAver_fallbackLengthsetvar_pulseAver_startPulsesetvar_sweepFormula_parseResultslider_BrowserSettings_dDAQstatus_sweepFormula_parserLeft\W623\JRLeft\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRLeft\W623\JRLeft\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRLeft\W623\JRMiddle\W623\JRLeft\W623\JRMiddle\W623\JRLeft\W623\JRLeft\W623\JRLeft\W623\JRMiddle\W623\JRLeft\W623\JRLeft\W623\JRMiddle\W623\JRMiddle\W623\JRLeft\W623\JRLeft\W623\JRLeft\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRMiddle\W623\JRLeft\W623\JRMiddle\W623\JRRight\W623\JRRight\W623\JRRight\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRLeft\W623\JRLeft\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRRight\W623\JRSame Width\W623\JRRight\W623\JRSame Width\W623\JRRight\W623\JRRight\W623\JRRight\W623\JRSame Width\W623\JRRight\W623\JRRight\W623\JRSame Width\W623\JRSame Width\W623\JRRight\W623\JRRight\W623\JRRight\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRSame Width\W623\JRLeft\W623\JRSame Width\W623\JRRight\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRBottom\W623\JRBottom\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRGuide enableBoxTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRGuide enableBoxTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRGuide MainBoxTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRBottom\W623\JRTop\W623\JRBottom\W623\JRBottom\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRBottom\W623\JRBottom\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRGuide enableBoxBottom\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRGuide enableBoxBottom\W623\JRTop\W623\JRBottom\W623\JRTop\W623\JRGuide MainBoxBottom\W623\JRBottom\W623\JRTop\W623\JRTop\W623\JRBottom\W623\JRBottom\W623\JRBottom\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRTop\W623\JRBottom\W623\JRTop\W623\JRBottom\W623\JRSF_InfoTabSettingsbutton_BrowserSettings_Exportbutton_Calculation_RestoreDatabutton_RemoveRangesbutton_TimeAlignment_Actionbutton_sweepFormula_checkbutton_sweepFormula_displaycheck_BrowserSettings_ADCcheck_BrowserSettings_ARcheck_BrowserSettings_DACcheck_BrowserSettings_DB_Failedcheck_BrowserSettings_DB_Passedcheck_BrowserSettings_OChancheck_BrowserSettings_OVScheck_BrowserSettings_PAcheck_BrowserSettings_SFcheck_BrowserSettings_TAcheck_BrowserSettings_TTLcheck_BrowserSettings_dDAQcheck_BrowserSettings_splitTTLcheck_Calculation_AverageTracescheck_Calculation_ZeroTracescheck_Display_EqualYignorecheck_Display_EqualYrangecheck_Display_VisibleXrangecheck_SweepControl_HideSweepcheck_auto_removecheck_channelSel_AD_0check_channelSel_AD_1check_channelSel_AD_10check_channelSel_AD_11check_channelSel_AD_12check_channelSel_AD_13check_channelSel_AD_14check_channelSel_AD_15check_channelSel_AD_2check_channelSel_AD_3check_channelSel_AD_4check_channelSel_AD_5check_channelSel_AD_6check_channelSel_AD_7check_channelSel_AD_8check_channelSel_AD_9check_channelSel_AD_Allcheck_channelSel_DA_0check_channelSel_DA_1check_channelSel_DA_2check_channelSel_DA_3check_channelSel_DA_4check_channelSel_DA_5check_channelSel_DA_6check_channelSel_DA_7check_channelSel_DA_Allcheck_channelSel_HEADSTAGE_0check_channelSel_HEADSTAGE_1check_channelSel_HEADSTAGE_2check_channelSel_HEADSTAGE_3check_channelSel_HEADSTAGE_4check_channelSel_HEADSTAGE_5check_channelSel_HEADSTAGE_6check_channelSel_HEADSTAGE_7check_channelSel_HEADSTAGE_ALLcheck_headstage_axis_labelcheck_highlightRangescheck_overlaySweeps_disableHScheck_overlaySweeps_non_commulacheck_ovs_clear_on_new_ra_cyclecheck_ovs_clear_on_new_stimset_cyclecheck_pulseAver_deconvcheck_pulseAver_indTracescheck_pulseAver_multGraphscheck_pulseAver_showAvercheck_pulseAver_timeAligncheck_pulseAver_zeroTracgroup_SB_axes_scalinggroup_calcgroup_channelSel_ADgroup_channelSel_DAgroup_channelSel_HEADSTAGEgroup_enable_artifactgroup_enable_channelsgroup_enable_dashboardgroup_enable_pulsegroup_enable_sweepFormulagroup_enable_sweepsgroup_properties_artefactgroup_properties_pulsegroup_properties_sweepFormulagroup_properties_sweepsgroup_pulseAver_deconvgroup_timealignmentlist_dashboardlist_of_rangeslist_of_ranges1popup_DB_lockedDevicespopup_TimeAlignment_Masterpopup_TimeAlignment_Modepopup_overlaySweeps_selectsetvar_Display_EqualYlevelsetvar_TimeAlignment_LevelCrosssetvar_cutoff_length_aftersetvar_cutoff_length_beforesetvar_overlaySweeps_offsetsetvar_overlaySweeps_stepsetvar_pulseAver_deconv_rangesetvar_pulseAver_deconv_smthsetvar_pulseAver_deconv_tausetvar_pulseAver_endPulsesetvar_pulseAver_fallbackLengthsetvar_pulseAver_startPulsesetvar_sweepFormula_parseResultslider_BrowserSettings_dDAQstatus_sweepFormula_parsernameleftrighttopbottom /M`{7Rk#?Yr&<Rh}'<Qf{:Vr0On $9CVi0Mdz  4 S m  ) H c    - ; I W e s  ) 7 E S a o }  % 3 A O ] k y !/=KYgu)5CO[gu!/=KYgu$6BN`r&8J\n"4FXj| 0BTfx,>Pbt(:L^k} -:L^p$6HZfx%0;U`kv&1<GR]hs~ #.9DOZep{  +6P[fq #.9DOZep{$/:EP[x(3>IT_ju   % 0 ; F Q \ g r } ! !!"!-!8!C!N!Y!v!!!!!!!!!!"""$"/":"E"P"["f"q"|"""""""""EditorTextWavemd گ EditorTitleWave????ControlLeft EdgeRight EdgeTop EdgeBottom Edge"-y( *  S :EditorSelWaver?????SF_InfoTabSettingsbutton_BrowserSettings_Exportbutton_Calculation_RestoreDatabutton_RemoveRangesbutton_TimeAlignment_Actionbutton_sweepFormula_checkbutton_sweepFormula_displaycheck_BrowserSettings_ADCcheck_BrowserSettings_ARcheck_BrowserSettings_DACcheck_BrowserSettings_DB_Failedcheck_BrowserSettings_DB_Passedcheck_BrowserSettings_OChancheck_BrowserSettings_OVScheck_BrowserSettings_PAcheck_BrowserSettings_SFcheck_BrowserSettings_TAcheck_BrowserSettings_TTLcheck_BrowserSettings_dDAQcheck_BrowserSettings_splitTTLcheck_Calculation_AverageTracescheck_Calculation_ZeroTracescheck_Display_EqualYignorecheck_Display_EqualYrangecheck_Display_VisibleXrangecheck_SweepControl_HideSweepcheck_auto_removecheck_channelSel_AD_0check_channelSel_AD_1check_channelSel_AD_10check_channelSel_AD_11check_channelSel_AD_12check_channelSel_AD_13check_channelSel_AD_14check_channelSel_AD_15check_channelSel_AD_2check_channelSel_AD_3check_channelSel_AD_4check_channelSel_AD_5check_channelSel_AD_6check_channelSel_AD_7check_channelSel_AD_8check_channelSel_AD_9check_channelSel_AD_Allcheck_channelSel_DA_0check_channelSel_DA_1check_channelSel_DA_2check_channelSel_DA_3check_channelSel_DA_4check_channelSel_DA_5check_channelSel_DA_6check_channelSel_DA_7check_channelSel_DA_Allcheck_channelSel_HEADSTAGE_0check_channelSel_HEADSTAGE_1check_channelSel_HEADSTAGE_2check_channelSel_HEADSTAGE_3check_channelSel_HEADSTAGE_4check_channelSel_HEADSTAGE_5check_channelSel_HEADSTAGE_6check_channelSel_HEADSTAGE_7check_channelSel_HEADSTAGE_ALLcheck_headstage_axis_labelcheck_highlightRangescheck_overlaySweeps_disableHScheck_overlaySweeps_non_commulacheck_ovs_clear_on_new_ra_cyclecheck_ovs_clear_on_new_stimset_cyclecheck_pulseAver_deconvcheck_pulseAver_indTracescheck_pulseAver_multGraphscheck_pulseAver_showAvercheck_pulseAver_timeAligncheck_pulseAver_zeroTracgroup_SB_axes_scalinggroup_calcgroup_channelSel_ADgroup_channelSel_DAgroup_channelSel_HEADSTAGEgroup_enable_artifactgroup_enable_channelsgroup_enable_dashboardgroup_enable_pulsegroup_enable_sweepFormulagroup_enable_sweepsgroup_properties_artefactgroup_properties_pulsegroup_properties_sweepFormulagroup_properties_sweepsgroup_pulseAver_deconvgroup_timealignmentlist_dashboardlist_of_rangeslist_of_ranges1popup_DB_lockedDevicespopup_TimeAlignment_Masterpopup_TimeAlignment_Modepopup_overlaySweeps_selectsetvar_Display_EqualYlevelsetvar_TimeAlignment_LevelCrosssetvar_cutoff_length_aftersetvar_cutoff_length_beforesetvar_overlaySweeps_offsetsetvar_overlaySweeps_stepsetvar_pulseAver_deconv_rangesetvar_pulseAver_deconv_smthsetvar_pulseAver_deconv_tausetvar_pulseAver_endPulsesetvar_pulseAver_fallbackLengthsetvar_pulseAver_startPulsesetvar_sweepFormula_parseResultslider_BrowserSettings_dDAQstatus_sweepFormula_parsernameleftrighttopbottomEditorSelWave  WindowCoordinates!mUv@$u W_windowCoordinates ????ResizeControlsPanel90697.251778.2485.757296872.25388.5windowNamelefttoprightbottompanelResscreenReswidthPointsheightPoints!')+16  KBColorize!n 0L;IgStartingHuegLinearHuegSaturation?gLightness?gAllMarkersMenuItem4@gUniqueMarkersMenuItem?gAllLineStylesMenuItem?gPopRedgPopGreengPopBluegColorTableNamedBZ14}| y" y",PhueRGBImaged{Gz????Һxx``BBHHNNTTZZ``llrrxx****006666<>>??333?L?fff?@([ y" y" hueTickLabels ????>d=<q=k 8 1+%  y" y",PlightRGBImaged????ffim&qtRx{|<ҍh(T~>Ըj*Vр٬@l,Xt :h-[!O}Cq6 d!!"*##X$$%&&K''z())*-0369<C o/ X$'+/2D69q=AD1HK[ORVZ]Gadshlo2sv]z}Iߏu 5ˡ^!Jw  7 *,// Platform=WindowsNT, IGORVersion=9.000, architecture=Intel, systemTextEncoding="Windows-1252", historyTextEncoding="UTF-8", procwinTextEncoding="UTF-8", recreationTextEncoding="UTF-8", build=36586 #pragma TextEncoding = "UTF-8" Silent 101 // use | as bitwise or -- not comment. if (IgorVersion() < 8.00) *** This experiment requires Igor Pro 8.00 or later because it has waves with long dimension labels *** endif DefaultFont "Arial" Execute/P/Q/Z SelectString(NumberByKey("IGORVERS", IgorInfo(0)) >= 5, "", "COMPILEPROCEDURES ") Execute/Q/Z SelectString(NumberByKey("IGORVERS", IgorInfo(0)) >= 5, "", "SetIgorHook AfterCompiledHook=ProcGlobal#CodeBrowserModule#updatePanel") MoveWindow/P 448.5,70.25,1268.25,598.25 MoveWindow/C 11.25,155,899.25,657.5 KillStrings/Z root:gWMSetNextTextFilesTextEncoding +#pragma TextEncoding = "UTF-8" #pragma rtGlobals=3 // Use modern global access method and strict wave access. #pragma rtFunctionErrors=1 //#include "json_functions" // Key Value Store benchmark // // requires free JSON XOP from https://docs.byte-physics.de/json-xop/ //#define JSON_TEST //#define STRING_BY_KEY_TEST //#define DIM_LABELS_TEST //#define WAVE_TEST #define TEXT_WAVE_TEST #define TEXT_WAVE_HASH_MAP_TEST constant ROWS = 0 constant COLS = 1 Menu "Run Benchmark" "Start Benchmark", /Q, Bench() End Function IntNoise(from, to) Variable from, to Variable amp = to - from return floor(from + mod(abs(enoise(100 * amp)), amp + 1)) End Function Bench() variable NUM_RUNS_READ = 100 variable NUM_RUNS_WRITE = 100 variable numExponentials = 6 variable expStep = 10 variable size variable ref, i, j, idx, jsonID, e, elapsed string output, name, str, result variable numRunsWrite Make/O/D/N=(6, 2, numExponentials * expStep) resultWave resultWave = NaN SetScale/P z, 0, 1 / expStep, "", resultWave SetDimLabel 0, 0, JSON, resultWave SetDimLabel 0, 1, Textwave, resultWave SetDimLabel 0, 2, StringByKey, resultWave SetDimLabel 0, 3, DimLabel, resultWave SetDimLabel 0, 4, Wave, resultWave SetDimLabel 0, 5, TextWaveHash, resultWave SetDimLabel 1, 0, Reading, resultWave SetDimLabel 1, 1, Writing, resultWave Execute/Q "Graph0()" Execute/Q "Graph1_2()" // name is the key and num2str(index) is the value for(e = 0; e < numExponentials * expStep; e += 1) size = trunc(10^(e / expStep)) if(e > 25) NUM_RUNS_READ = 10 NUM_RUNS_WRITE = 10 endif if(e > 40) NUM_RUNS_READ = 100 NUM_RUNS_WRITE = 100 endif if(size < NUM_RUNS_WRITE) numRunsWrite = NUM_RUNS_WRITE else numRunsWrite = 1 endif SetRandomSeed 1 Make/N=(NUM_RUNS_READ)/O indizes = IntNoise(0, size - 1) #ifdef JSON_TEST jsonID = JSON_New() ref = stopmSTimer(-2) for(i = 0; i < numRunsWrite; i += 1) for(j = 0; j < size; j += 1) name = "abcd" + num2str(j) JSON_SetString(jsonID, "/" + name, num2str(j)) endfor endfor elapsed = (stopmSTimer(-2) - ref)/1e6/numRunsWrite/size resultWave[%JSON][%Writing][e] = elapsed ref = stopmSTimer(-2) for(i = 0; i < NUM_RUNS_READ; i += 1) name = "abcd" + num2str(indizes[i]) output = JSON_GetString(jsonID, "/" + name) endfor elapsed = (stopmSTimer(-2) - ref)/1e6/NUM_RUNS_READ resultWave[%JSON][%Reading][e] = elapsed JSON_Release(jsonID) #endif // JSON_TEST #ifdef TEXT_WAVE_TEST Make/FREE/T/N=(size) tw ref = stopmSTimer(-2) for(i = 0; i < numRunsWrite; i += 1) for(j = 0; j < size; j += 1) name = "abcd" + num2str(j) tw[j] = name endfor endfor elapsed = (stopmSTimer(-2) - ref)/1e6/numRunsWrite/size resultWave[%TextWave][%Writing][e] = elapsed ref = stopmSTimer(-2) for(i = 0; i < NUM_RUNS_READ; i += 1) name = "abcd" + num2str(indizes[i]) //FindValue/TEXT=(name)/TXOP=4/UOFV tw FindValue/TEXT=(name)/TXOP=4 tw output = num2str(V_Value) endfor elapsed = (stopmSTimer(-2) - ref)/1e6/NUM_RUNS_READ resultWave[%TextWave][%Reading][e] = elapsed #endif // TEXT_WAVE_TEST #ifdef TEXT_WAVE_HASH_MAP_TEST ref = stopmSTimer(-2) Make/FREE/T/N=(size) tw Make/FREE/I/U/N=(size) twHash // crc32 values are unsigned 32-bit integers for(i = 0; i < numRunsWrite; i += 1) for(j = 0; j < size; j += 1) name = "abcd" + num2str(j) tw[j] = name twHash[j] = StringCrC(0, name) endfor endfor elapsed = (stopmSTimer(-2) - ref)/1e6/numRunsWrite/size resultWave[%TextWaveHash][%Writing][e] = elapsed Variable outputIndex ref = stopmSTimer(-2) for(i = 0; i < NUM_RUNS_READ; i += 1) name = "abcd" + num2str(indizes[i]) outputIndex = FindPointIndexOfString(name, tw, twHash) output = tw[outputIndex] endfor elapsed = (stopmSTimer(-2) - ref)/1e6/NUM_RUNS_READ resultWave[%TextWaveHash][%Reading][e] = elapsed #endif // TEXT_WAVE_HASH_MAP_TEST #ifdef STRING_BY_KEY_TEST ref = stopmSTimer(-2) for(i = 0; i < numRunsWrite; i += 1) str = PadString("", size * 20, 0) for(j = 0; j < size; j += 1) name = "abcd" + num2str(j) str += name + ":" + num2str(j) + ";" endfor endfor elapsed = (stopmSTimer(-2) - ref)/1e6/numRunsWrite/size resultWave[%StringByKey][%Writing][e] = elapsed ref = stopmSTimer(-2) for(i = 0; i < NUM_RUNS_READ; i += 1) name = "abcd" + num2str(indizes[i]) result = StringbyKey(name, str) endfor elapsed = (stopmSTimer(-2) - ref)/1e6/NUM_RUNS_READ resultWave[%StringByKey][%Reading][e] = elapsed #endif // STRING_BY_KEY_TEST #ifdef DIM_LABELS_TEST Make/n=(size)/FREE/T dimlabels ref = stopmSTimer(-2) for(i = 0; i < numRunsWrite; i += 1) for(j = 0; j < size; j += 1) name = "abcd" + num2str(j) SetdimLabel ROWS, j, $name, dimlabels dimlabels[j] = num2str(j) endfor endfor elapsed = (stopmSTimer(-2) - ref)/1e6/numRunsWrite/size resultWave[%DimLabel][%Writing][e] = elapsed ref = stopmSTimer(-2) for(i = 0; i < NUM_RUNS_READ; i += 1) name = "abcd" + num2str(indizes[i]) result = dimlabels[%$name] endfor elapsed = (stopmSTimer(-2) - ref)/1e6/NUM_RUNS_READ resultWave[%DimLabel][%Reading][e] = elapsed #endif // DIM_LABELS_TEST #ifdef WAVE_TEST ref = stopmSTimer(-2) for(i = 0; i < numRunsWrite; i += 1) DFREF dfr = NewFreeDataFolder() for(j = 0; j < size; j += 1) name = "abcd" + num2istr(j) Make/T/N=1 dfr:$name/WAVE=wv wv[0] = num2istr(j) endfor endfor elapsed = (stopmSTimer(-2) - ref)/1e6/numRunsWrite/size resultWave[%Wave][%Writing][e] = elapsed ref = stopmSTimer(-2) for(i = 0; i < NUM_RUNS_READ; i += 1) name = "abcd" + num2istr(indizes[i]) WAVE/SDFR=dfr/T wv = $name result = wv[0] endfor elapsed = (stopmSTimer(-2) - ref)/1e6/NUM_RUNS_READ resultWave[%Wave][%Reading][e] = elapsed #endif // WAVE_TEST DoUpdate endfor Duplicate/O resultWave, resultWaveSummed resultWaveSummed[][0][] = resultWaveSummed[p][0][r] + resultWaveSummed[p][1][r] Redimension/N=(-1, 1, -1) resultWaveSummed End Window Graph0() : Graph PauseUpdate; Silent 1 // building window... Display /W=(255,60.5,1026,544.25) resultWaveSummed[%JSON][0][*]/TN=JSON,resultWaveSummed[%DimLabel][0][*]/TN=DimLabel AppendToGraph resultWaveSummed[%StringByKey][0][*]/TN=StringByKey,resultWaveSummed[%TExtwave][0][*]/TN=TextWave AppendToGraph resultWaveSummed[%wave][0][*]/TN=Wave AppendToGraph resultWaveSummed[%TextWaveHash][0][*]/TN=TextWaveHash ModifyGraph mode=4 ModifyGraph marker=55 ModifyGraph lSize=1.5 ModifyGraph rgb(JSON)=(0,0,0),rgb(DimLabel)=(39321,1,31457),rgb(StringByKey)=(65535,32764,16385) ModifyGraph rgb(TextWave)=(2,39321,1),rgb(Wave)=(0,0,65535) ModifyGraph msize=2 ModifyGraph grid(left)=1 ModifyGraph log(left)=1 ModifyGraph minor(bottom)=1 ModifyGraph fSize=18 Label left "\\Z18Execution time in [s]" Label bottom "\\Z18data size, 10\\Sx\\M elements" Legend/C/N=text0/J/A=MC/X=-37.94/Y=39.69 "\\Z18\\Zr075Dimension Label\\[0 \\s(DimLabel)\rJSON\\X0 \\s(JSON)\rTextWave\\X0 \\s(TextWave) " AppendText "\nStringByKey\\X0 \\s(StringByKey) \rWave\\X0 \\s(Wave) " AppendText "\nTextWaveHash\\X0 \\s(TextWaveHash) " TextBox/C/N=text1/A=MC/X=3.63/Y=47.01 "\\Z18Combined time of one write and read operation" EndMacro Window Graph1_2() : Graph PauseUpdate; Silent 1 // building window... Display /W=(70.5,601.25,840.75,1085) resultWave[%JSON][%Reading][*]/TN=JsonReading AppendToGraph resultWave[%dimlabel][%Reading][*]/TN=DimLabelReading,resultWave[%textwave][%Reading][*]/TN=TextWaveReading AppendToGraph resultWave[%stringByKey][%Reading][*]/TN=StringByKeyReading,resultWave[%wave][%Reading][*]/TN=WaveReading AppendToGraph resultWave[%TextWaveHash][%Reading][*]/TN=TextWaveHashReading AppendToGraph resultWave[%JSON][%Writing][*]/TN=JsonWriting,resultWave[%dimlabel][%Writing][*]/TN=DimLabelWriting AppendToGraph resultWave[%textwave][%Writing][*]/TN=TextWaveWriting,resultWave[%stringByKey][%Writing][*]/TN=StringByKeyWriting AppendToGraph resultWave[%wave][%Writing][*]/TN=WaveWriting AppendToGraph resultWave[%TextWaveHash][%Writing][*]/TN=TextWaveHashWriting ModifyGraph mode=4 ModifyGraph marker(JsonReading)=19,marker(DimLabelReading)=19,marker(TextWaveReading)=19 ModifyGraph marker(StringByKeyReading)=19,marker(WaveReading)=19,marker(JsonWriting)=16 ModifyGraph marker(DimLabelWriting)=16,marker(TextWaveWriting)=16,marker(StringByKeyWriting)=16 ModifyGraph marker(WaveWriting)=16 ModifyGraph marker(TextWaveHashReading)=19 ModifyGraph marker(TextWaveHashWriting)=16 ModifyGraph lSize=1.5 ModifyGraph rgb(JsonReading)=(0,0,0),rgb(DimLabelReading)=(39321,1,31457),rgb(TextWaveReading)=(2,39321,1) ModifyGraph rgb(StringByKeyReading)=(65535,32764,16385),rgb(WaveReading)=(0,0,65535) ModifyGraph rgb(JsonWriting)=(0,0,0),rgb(DimLabelWriting)=(39321,1,31457),rgb(TextWaveWriting)=(2,39321,1) ModifyGraph rgb(StringByKeyWriting)=(65535,32764,16385),rgb(WaveWriting)=(0,0,65535) ModifyGraph msize=2 ModifyGraph mrkThick=1 ModifyGraph grid(left)=1 ModifyGraph log(left)=1 ModifyGraph minor(bottom)=1 ModifyGraph fSize=18 ModifyGraph lblMargin(left)=10 ModifyGraph lblLatPos(left)=3 Label left "\\Z18Execution time in [s]" Label bottom "\\Z18data size, 10\\Sx\\M elements" Legend/C/N=text0/J/A=MC/X=-30.58/Y=40.81 "\\Z18\\Zr075\rDimension Label\\[0 \\s(DimLabelReading) Read \\s(DimLabelWriting) Write" AppendText "JSON\\X0 \\s(JsonReading) Read \\s(JsonWriting) Write\nTextwave\\X0 \\s(TextWaveReading) Read \\s(TextWaveWriting) Write" AppendText "\nStringByKey\\X0 \\s(StringByKeyReading) Read \\s(StringByKeyWriting) Write\r\nWave\\X0 \\s(WaveReading) Read \\s(WaveWriting) Write" AppendText/N=text0 "TextWaveHash\\X0 \\s(TextWaveHashReading) Read \\s(TextWaveHashWriting) Write" TextBox/C/N=text1/A=MC/X=-9.64/Y=147.84 "Time of one read/write operation" TextBox/C/N=text2/A=MC/X=11.55/Y=47.79 "\\Z18Time of one read/write operation" EndMacro Function FindPointIndexOfString(String inputStr, WAVE/T textWave, WAVE hashTableWave) int inputStrCRC = StringCRC(0, inputStr) Variable pointIndex = -1 Variable currentStartingIndex = 0 do FindValue/U=(inputStrCRC)/S=(currentStartingIndex) hashTableWave // Slower but provides the right answer //FindValue/U=(inputStrCRC)/UOFV hashTableWave // Not for use if avoiding collissions is a must! if (V_Value < 0) return V_Value // Didn't find inputStr in textWave elseif (CmpStr(textWave[V_Value], inputStr, 2)!=0) // Check for the unusual but possible case where the crc32 of inputStr // matches in hashTableWave but the actual unhashed text // strings do not match. currentStartingIndex = V_Value + 1 else return V_Value endif while (1) // Should never get here End