Skip to content

Commit

Permalink
changes
Browse files Browse the repository at this point in the history
  • Loading branch information
t-b committed Jan 12, 2023
1 parent e27e6c5 commit 4ba74f8
Showing 1 changed file with 120 additions and 53 deletions.
173 changes: 120 additions & 53 deletions Packages/MIES/MIES_SweepFormula_EPSP.ipf
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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)
Expand Down Expand Up @@ -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")
Expand All @@ -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)
Expand Down

0 comments on commit 4ba74f8

Please sign in to comment.