diff --git a/Packages/MIES/MIES_SweepFormula_EPSP.ipf b/Packages/MIES/MIES_SweepFormula_EPSP.ipf index 7bbc26af7c..85436f639a 100644 --- a/Packages/MIES/MIES_SweepFormula_EPSP.ipf +++ b/Packages/MIES/MIES_SweepFormula_EPSP.ipf @@ -369,6 +369,7 @@ static Function ES_FitEventDecay(WAVE sweepDataFiltOff, variable eventIndex, WAV AssertOnAndClearRTError() Make/FREE/D/N=3 coefWave + // TODO let CurveFit output the fitted curve so that we can plot it later on CurveFit/Q/N=1/NTHR=1/M=0/W=2 exp_XOffset, kwCWave=coefWave, sweepDataFiltOff(i_peak_t, n_min_t); err = GetRTError(1) if(err) @@ -622,47 +623,24 @@ static Function [WAVE/D results, WAVE/D xValues] ES_GetStatsResults(WAVE events, return [results, indizes] End -// epspStats(select(channels(AD),sweeps()), prop, state, [postProc]) +// epspStats(prop, select(channels(AD),sweeps()), state, [postProc]) // // # prop: amp/x-pos/x-interval/tau // # state: accepted/rejected/all // # postProc: nothing/avg/count/hist Function/WAVE ES_OperationStats(variable jsonId, string jsonPath, string graph) - string stateAsStr, prop, postProc, propLabel, yLabel, xLabel - variable state, err + string stateAsStr, prop, postProc + variable state - WAVE/Z selectData = SFH_GetArgumentSelect(jsonID, jsonPath, graph, SF_OP_EPSP_STATS, 0) - SFH_Assert(WaveExists(selectData), "Missing select operation") + prop = SFH_GetArgumentAsText(jsonID, jsonPath, graph, SF_OP_EPSP_STATS, 0, allowedValues = {"amp", "x-pos", "x-interval", "tau"}) + + WAVE/Z selectData = SFH_GetArgumentSelect(jsonID, jsonPath, graph, SF_OP_EPSP_STATS, 1) + SFH_Assert(WaveExists(selectData), "Missing select data") - prop = SFH_GetArgumentAsText(jsonID, jsonPath, graph, SF_OP_EPSP_STATS, 1, allowedValues = {"amp", "x-pos", "x-interval", "tau"}) stateAsStr = SFH_GetArgumentAsText(jsonID, jsonPath, graph, SF_OP_EPSP_STATS, 2, allowedValues = {"accepted", "rejected", "all"}) postProc = SFH_GetArgumentAsText(jsonID, jsonPath, graph, SF_OP_EPSP_STATS, 3, defValue = "nothing", allowedValues = {"nothing", "avg", "count", "hist"}) - WAVE/Z events = ES_GetEventsFromResults(graph, selectData) - SFH_ASSERT(WaveExists(events), "Could not find any EPSP events in the results wave") - - strswitch(prop) - case "amp": - propLabel = "i_amp" - yLabel = "Amplitude" + " (" + JWN_GetStringFromWaveNote(events, ES_Y_DATA_UNIT) + ")" - break - case "x-pos": - propLabel = "dc_peak_time" - yLabel = "Event time" + " (" + JWN_GetStringFromWaveNote(events, ES_X_DATA_UNIT) + ")" - break - case "x-interval": - propLabel = "isi" - yLabel = "Event interval" + " (" + JWN_GetStringFromWaveNote(events, ES_X_DATA_UNIT) + ")" - break - case "tau": - propLabel = "tau" - yLabel = "Decay tau" + " (" + JWN_GetStringFromWaveNote(events, ES_X_DATA_UNIT) + ")" - break - default: - ASSERT(0, "Impossible prop") - endswitch - strswitch(stateAsStr) case "accepted": state = ES_EVENT_ACCEPT @@ -677,34 +655,51 @@ Function/WAVE ES_OperationStats(variable jsonId, string jsonPath, string graph) ASSERT(0, "Impossible state") endswitch - [WAVE resultsRaw, WAVE xValues] = ES_GetStatsResults(events, state, propLabel) + WAVE/WAVE output = ES_OperationStatsImpl(graph, selectData, prop, state, postProc) + + return SFH_GetOutputForExecutor(output, graph, SF_OP_EPSP_STATS) +End + +static Function/WAVE ES_OperationStatsImpl(string graph, WAVE selectData, string prop, variable state, string postProc) + + string propLabel, propLabelAxis + variable err, numSelected, i, sweepNo, chanNr, chanType, index + + WAVE/WAVE output = SFH_CreateSFRefWave(graph, SF_OP_EPSP_STATS, MINIMUM_WAVE_SIZE) + + numSelected = DimSize(selectData, ROWS) + for(i = 0; i < numSelected; i += 1) + + sweepNo = selectData[i][%SWEEP] + chanNr = selectData[i][%CHANNELNUMBER] + chanType = selectData[i][%CHANNELTYPE] + + if(!IsValidSweepNumber(sweepNo)) + continue + endif + + Duplicate/FREE/RMD=[i][] selectData, singleSelectData + + WAVE/Z events = ES_GetEventsFromResults(graph, singleSelectData) + SFH_ASSERT(WaveExists(events), "Could not find any EPSP events in the results wave") - WAVE/WAVE output = SFH_CreateSFRefWave(graph, SF_OP_EPSP_STATS, 1) + [WAVE resultsRaw, WAVE xValues] = ES_GetStatsResults(events, state, propLabel) + + if(!WaveExists(resultsRaw)) + continue + endif - if(WaveExists(resultsRaw)) strswitch(postProc) case "nothing": WAVE/D results = resultsRaw JWN_SetWaveInWaveNote(results, SF_META_XVALUES, xValues) - - JWN_SetStringInWaveNote(output, SF_META_XAXISLABEL, "Event") - JWN_SetStringInWaveNote(output, SF_META_YAXISLABEL, yLabel) - break case "avg": MatrixOP/FREE results = mean(resultsRaw) - - JWN_SetStringInWaveNote(output, SF_META_XAXISLABEL, "NA") - JWN_SetStringInWaveNote(output, SF_META_YAXISLABEL, "Averaged " + LowerStr(yLabel)) - break case "count": MatrixOP/FREE results = numRows(resultsRaw) - - JWN_SetStringInWaveNote(output, SF_META_XAXISLABEL, "NA") - JWN_SetStringInWaveNote(output, SF_META_YAXISLABEL, "Count") - break case "hist": Make/FREE/N=0/D results @@ -713,18 +708,64 @@ Function/WAVE ES_OperationStats(variable jsonId, string jsonPath, string graph) if(err) WaveClear results endif + break + default: + ASSERT(0, "Impossible state") + endswitch - sprintf xLabel, "%s with bin width [%g]", yLabel, DimDelta(results, ROWS) - JWN_SetStringInWaveNote(output, SF_META_XAXISLABEL, xLabel) - JWN_SetStringInWaveNote(output, SF_META_YAXISLABEL, "Event count") + EnsureLargeEnoughWave(output, minimumSize = index) + output[index] = results + index += 1 + endfor + Redimension/N=(index) output + + // we assume here that all event waves have the same X/Y data units + if(WaveExists(events)) + strswitch(prop) + case "amp": + propLabel = "i_amp" + propLabelAxis = "Amplitude" + " (" + JWN_GetStringFromWaveNote(events, ES_Y_DATA_UNIT) + ")" + break + case "x-pos": + propLabel = "dc_peak_time" + propLabelAxis = "Event time" + " (" + JWN_GetStringFromWaveNote(events, ES_X_DATA_UNIT) + ")" + break + case "x-interval": + propLabel = "isi" + propLabelAxis = "Event interval" + " (" + JWN_GetStringFromWaveNote(events, ES_X_DATA_UNIT) + ")" break + case "tau": + propLabel = "tau" + propLabelAxis = "Decay tau" + " (" + JWN_GetStringFromWaveNote(events, ES_X_DATA_UNIT) + ")" + break + default: + ASSERT(0, "Impossible prop") endswitch - output[0] = results + strswitch(postProc) + case "nothing": + JWN_SetStringInWaveNote(output, SF_META_XAXISLABEL, "Event") + JWN_SetStringInWaveNote(output, SF_META_YAXISLABEL, propLabelAxis) + break + case "avg": + JWN_SetStringInWaveNote(output, SF_META_XAXISLABEL, "NA") + JWN_SetStringInWaveNote(output, SF_META_YAXISLABEL, "Averaged " + LowerStr(propLabelAxis)) + break + case "count": + JWN_SetStringInWaveNote(output, SF_META_XAXISLABEL, "NA") + JWN_SetStringInWaveNote(output, SF_META_YAXISLABEL, "Count") + break + case "hist": + JWN_SetStringInWaveNote(output, SF_META_XAXISLABEL, propLabelAxis) + JWN_SetStringInWaveNote(output, SF_META_YAXISLABEL, "Event count") + break + default: + ASSERT(0, "Impossible state") + endswitch endif - return SFH_GetOutputForExecutor(output, graph, SF_OP_EPSP_STATS) + return output End static Function/DF ES_GetWorkingFolder(string win) @@ -1027,9 +1068,32 @@ static Function/S ES_GenerateResultsKey(string graph, WAVE selectData) return key End +static Function/WAVE ES_GetEventsFromDataFolder(string graph, string key) + + string matches + + DFREF baseDFR = SFH_GetWorkingDF(graph) + matches = GetListOfObjects(baseDFR, "^epsp.*", typeFlag = COUNTOBJECTS_DATAFOLDER, exprType = MATCH_REGEXP, fullPath = 1) + + if(ItemsInList(matches) != 1) + return $"" + endif + + DFREF dfr = $StringFromList(0, matches) + + WAVE epspEventWave = GetEPSPEventWaveFromDFR(dfr) + + if(!cmpstr(JWN_GetStringFromWaveNote(epspEventWave, ES_EVENTS_RESULTS_WAVE_NOTE), key)) + // correct data + return epspEventWave + endif + + return $"" +End + static Function/WAVE ES_GetEventsFromResults(string graph, WAVE selectData) - string entry, name + string entry, name, matches, key variable sweepNo ASSERT(DimSize(selectData, ROWS) == 1, "Expected only one selected sweep with one channel") @@ -1038,11 +1102,14 @@ static Function/WAVE ES_GetEventsFromResults(string graph, WAVE selectData) WAVE/T/Z textualResultsValues = BSP_GetLogbookWave(graph, LBT_RESULTS, LBN_TEXTUAL_VALUES, sweepNumber = sweepNo) SFH_ASSERT(WaveExists(textualResultsValues), "Could not find the textual results wave") - sprintf name, "Sweep Formula epsp [%s]", ES_GenerateResultsKey(graph, selectData) + key = ES_GenerateResultsKey(graph, selectData) + + sprintf name, "Sweep Formula epsp [%s]", key entry = GetLastSettingTextIndep(textualResultsValues, NaN, name, SWEEP_FORMULA_RESULT) if(IsEmpty(entry)) - return $"" + // prefer data from local folder iff no results data could be found + return ES_GetEventsFromDataFolder(graph, key) endif return JSONToWave(entry)