From 90b68d14e2135cfb9d7307e6fb8321556d9eec25 Mon Sep 17 00:00:00 2001 From: Michael Huth Date: Thu, 11 Apr 2024 13:56:26 +0200 Subject: [PATCH 1/8] EP: Make EP_AddUserEpoch device independent --- .../MIES/MIES_AnalysisFunctions_PatchSeq.ipf | 26 ++++++++++++------- Packages/MIES/MIES_Epochs.ipf | 7 +++-- Packages/tests/UserAnalysisFunctions.ipf | 9 ++++--- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf b/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf index 98246c2380..333a5830ae 100644 --- a/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf +++ b/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf @@ -596,6 +596,7 @@ static Function PSQ_EvaluateBaselineProperties(string device, STRUCT AnalysisFun endif // END TEST + WAVE/T epochWave = GetEpochsWave(device) for(i = 0; i < NUM_HEADSTAGES; i += 1) if(!statusHS[i]) @@ -606,7 +607,7 @@ static Function PSQ_EvaluateBaselineProperties(string device, STRUCT AnalysisFun ASSERT(IsFinite(DAC), "Could not determine DAC channel number for HS " + num2istr(i) + " for device " + device) epName = "Name=Baseline Chunk;Index=" + num2istr(chunk) epShortName = PSQ_BASELINE_CHUNK_SHORT_NAME_PREFIX + num2istr(chunk) - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, chunkStartTimeMax * MILLI_TO_ONE, (chunkStartTimeMax + chunkLengthTime) * MILLI_TO_ONE, epName, shortname = epShortName) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, chunkStartTimeMax * MILLI_TO_ONE, (chunkStartTimeMax + chunkLengthTime) * MILLI_TO_ONE, epName, shortname = epShortName) if(chunk == 0) // store baseline RMS short/long tartget V analysis parameters in labnotebook on first use @@ -3598,7 +3599,8 @@ static Function PSQ_Ramp_AddEpoch(string device, variable headstage, WAVE wv, st epBegin = IndexToScale(wv, first, ROWS) * MILLI_TO_ONE epEnd = IndexToScale(wv, last, ROWS) * MILLI_TO_ONE - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) + WAVE/T epochWave = GetEpochsWave(device) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) End /// @brief Determine if we have three passing sweeps with the same DAScale value @@ -4703,7 +4705,8 @@ static Function [variable epBegin, variable epEnd] PSQ_CR_GetSpikeEvaluationRang sprintf tags, "Type=Chirp spike evaluation" sprintf shortName, "CR_SE" - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) + WAVE/T epochWave = GetEpochsWave(device) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) return [epBegin * ONE_TO_MILLI, epEnd * ONE_TO_MILLI] End @@ -4764,7 +4767,7 @@ static Function [variable epBegin, variable epEnd] PSQ_CR_GetChirpEvaluationRang sprintf tags, "Type=Chirp cycles evaluation" sprintf shortName, "CR_CE" - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) + EP_AddUserEpoch(epochsWave, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) return [epBegin * ONE_TO_MILLI, epEnd * ONE_TO_MILLI] End @@ -5245,7 +5248,8 @@ static Function PSQ_CreateTestpulseLikeEpoch(string device, variable DAC, string sprintf tags, "Type=Testpulse Like;Index=%d", tpIndex sprintf shortName, "TP%d", tpIndex - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) + WAVE/T epochWave = GetEpochsWave(device) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) // pre TP baseline // same epBegin as full TP @@ -5253,7 +5257,7 @@ static Function PSQ_CreateTestpulseLikeEpoch(string device, variable DAC, string sprintf tags, "Type=Testpulse Like;SubType=Baseline;Index=%d;", tpIndex sprintf shortName, "TP%d_B0", tpIndex - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) // pulse TP epBegin = epEnd @@ -5262,7 +5266,7 @@ static Function PSQ_CreateTestpulseLikeEpoch(string device, variable DAC, string sprintf tags, "Type=Testpulse Like;SubType=Pulse;Amplitude=%g;Index=%d;", amplitude, tpIndex sprintf shortName, "TP%d_P", tpIndex - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) // post TP baseline epBegin = epEnd @@ -5270,7 +5274,7 @@ static Function PSQ_CreateTestpulseLikeEpoch(string device, variable DAC, string sprintf tags, "Type=Testpulse Like;SubType=Baseline;Index=%d;", tpIndex sprintf shortName, "TP%d_B1", tpIndex - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) return epEnd End @@ -5698,6 +5702,7 @@ static Function PSQ_SE_CreateEpochs(string device, variable headstage, string pa wbBegin = 0 wbEnd = totalOnsetDelay * MILLI_TO_ONE + WAVE/T epochWave = GetEpochsWave(device) for(i = 0; i < numEpochs; i += 1) duration = ST_GetStimsetParameterAsVariable(setName, "Duration", epochIndex = i) * MILLI_TO_ONE @@ -5727,7 +5732,7 @@ static Function PSQ_SE_CreateEpochs(string device, variable headstage, string pa epEnd = epBegin + chunkLength [tags, shortName] = PSQ_CreateBaselineChunkSelectionStrings(userEpochIndexBLC) - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) userEpochIndexBLC += 1 elseif(i == 1 || i == 4 || i == 7 || i == 12 || i == 15 || i == 18) epBegin = wbBegin @@ -6115,6 +6120,7 @@ static Function PSQ_CreateBaselineChunkSelectionEpochs(string device, variable h wbBegin = 0 wbEnd = totalOnsetDelay * MILLI_TO_ONE + WAVE/T epochWave = GetEpochsWave(device) for(i = 0; i < numEpochs; i += 1) duration = ST_GetStimsetParameterAsVariable(setName, "Duration", epochIndex = i) * MILLI_TO_ONE @@ -6139,7 +6145,7 @@ static Function PSQ_CreateBaselineChunkSelectionEpochs(string device, variable h epEnd = epBegin + chunkLength [tags, shortName] = PSQ_CreateBaselineChunkSelectionStrings(index) - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) index += 1 endfor diff --git a/Packages/MIES/MIES_Epochs.ipf b/Packages/MIES/MIES_Epochs.ipf index 9db63def09..fb7b2db94e 100644 --- a/Packages/MIES/MIES_Epochs.ipf +++ b/Packages/MIES/MIES_Epochs.ipf @@ -1152,7 +1152,7 @@ End /// Allows to add user epochs for not yet finished sweeps. The tree level /// is fixed to #EPOCH_USER_LEVEL to not collide with stock entries. /// -/// @param device device +/// @param epochWave epoch wave /// @param channelType channel type, currently only #XOP_CHANNEL_TYPE_DAC and #XOP_CHANNEL_TYPE_TTL is supported /// @param channelNumber channel number /// @param epBegin start time of the epoch in seconds @@ -1160,11 +1160,10 @@ End /// @param tags tags for the epoch /// @param shortName [optional, defaults to auto-generated] user defined short name for the epoch, will /// be prefixed with #EPOCH_SHORTNAME_USER_PREFIX -Function EP_AddUserEpoch(string device, variable channelType, variable channelNumber, variable epBegin, variable epEnd, string tags, [string shortName]) +Function EP_AddUserEpoch(WAVE/T epochWave, variable channelType, variable channelNumber, variable epBegin, variable epEnd, string tags, [string shortName]) ASSERT(channelType == XOP_CHANNEL_TYPE_DAC || channelType == XOP_CHANNEL_TYPE_TTL, "Currently only epochs for the DA and TTL channels are supported") - WAVE/T epochWave = GetEpochsWave(device) if(ParamIsDefault(shortName)) sprintf shortName, "%s%d", EPOCH_SHORTNAME_USER_PREFIX, EP_GetEpochCount(epochWave, channelNumber, channelType) else @@ -1172,7 +1171,7 @@ Function EP_AddUserEpoch(string device, variable channelType, variable channelNu shortName = EPOCH_SHORTNAME_USER_PREFIX + shortName endif - return EP_AddEpoch(epochWave, channelNumber, channelType, epBegin * ONE_TO_MICRO, epEnd * ONE_TO_MICRO, tags, shortName, EPOCH_USER_LEVEL) + EP_AddEpoch(epochWave, channelNumber, channelType, epBegin * ONE_TO_MICRO, epEnd * ONE_TO_MICRO, tags, shortName, EPOCH_USER_LEVEL) End /// @brief Adds a epoch to the epochsWave diff --git a/Packages/tests/UserAnalysisFunctions.ipf b/Packages/tests/UserAnalysisFunctions.ipf index ba9ecf5d56..87370dcd1c 100644 --- a/Packages/tests/UserAnalysisFunctions.ipf +++ b/Packages/tests/UserAnalysisFunctions.ipf @@ -967,7 +967,8 @@ Function StopMidSweep_V3(string device, STRUCT AnalysisFunction_V3 &s) case MID_SWEEP_EVENT: DAC = AFH_GetDACFromHeadstage(device, s.headstage) - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, 0, 1e9, "key=value") + WAVE/T epochWave = GetEpochsWave(device) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, 0, 1e9, "key=value") return ANALYSIS_FUNC_RET_EARLY_STOP endswitch @@ -981,7 +982,8 @@ Function AddTooLargeUserEpoch_V3(string device, STRUCT AnalysisFunction_V3 &s) switch(s.eventType) case PRE_SWEEP_CONFIG_EVENT: DAC = AFH_GetDACFromHeadstage(device, s.headstage) - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, 0, 1e9, "key=value") + WAVE/T epochWave = GetEpochsWave(device) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, 0, 1e9, "key=value") break endswitch End @@ -993,7 +995,8 @@ Function AddUserEpoch_V3(string device, STRUCT AnalysisFunction_V3 &s) DAC = AFH_GetDACFromHeadstage(device, s.headstage) sprintf tags, "HS=%d;eventType=%d;", s.headstage, s.eventType - EP_AddUserEpoch(device, XOP_CHANNEL_TYPE_DAC, DAC, 0.5, 0.6, tags) + WAVE/T epochWave = GetEpochsWave(device) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, 0.5, 0.6, tags) End Function ChangeTPSettings(device, s) From 93fe0999fe5641094c3e51d4fc058b5ef6c475a3 Mon Sep 17 00:00:00 2001 From: Michael Huth Date: Thu, 11 Apr 2024 15:45:03 +0200 Subject: [PATCH 2/8] Tests: Move helper function for epoch recreation testing to UTF_HelperFunctions - this change makes the epoch recreation test function also available for analysis functions testing --- Packages/tests/HardwareBasic/UTF_Epochs.ipf | 43 --------------------- Packages/tests/UTF_HelperFunctions.ipf | 43 +++++++++++++++++++++ 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/Packages/tests/HardwareBasic/UTF_Epochs.ipf b/Packages/tests/HardwareBasic/UTF_Epochs.ipf index 612bb5b59a..e8a6371d34 100644 --- a/Packages/tests/HardwareBasic/UTF_Epochs.ipf +++ b/Packages/tests/HardwareBasic/UTF_Epochs.ipf @@ -1221,46 +1221,3 @@ static Function EP_EpochTest18_REENTRY([STRUCT IUTF_mData &mData]) TestEpochsGeneric(mData.s0) End - -static Function TestEpochReceationRemoveUserEpochs(WAVE/T epochChannel) - - variable i, epochCnt - - epochCnt = DimSize(epochChannel, ROWS) - Make/FREE/T/N=(epochCnt) shortnames = EP_GetShortName(epochChannel[p][EPOCH_COL_TAGS]) - for(i = epochCnt - 1; i >= 0; i -= 1) - if(GrepString(shortnames[i], "^" + EPOCH_SHORTNAME_USER_PREFIX)) - DeleteWavePoint(epochChannel, ROWS, i) - endif - endfor -End - -static Function TestEpochReceation(string device) - - variable channelNumber - variable sweepNo = 0 - - WAVE/Z numericalValues = GetLBNumericalValues(device) - WAVE/Z textualValues = GetLBTextualValues(device) - DFREF deviceDFR = GetDeviceDataPath(device) - DFREF sweepDFR = GetSingleSweepFolder(deviceDFR, sweepNo) - - WAVE/Z activeChannels = GetActiveChannels(numericalValues, textualValues, sweepNo, XOP_CHANNEL_TYPE_DAC) - CHECK_WAVE(activeChannels, FREE_WAVE | NUMERIC_WAVE) - for(channelNumber = 0; channelNumber < NUM_DA_TTL_CHANNELS; channelNumber += 1) - - if(IsNaN(activeChannels[channelNumber])) - continue - endif - WAVE/Z/T epochChannelRef = EP_FetchEpochs(numericalValues, textualValues, sweepNo, sweepDFR, channelNumber, XOP_CHANNEL_TYPE_DAC) - WAVE/Z/T epochChannelRec = MIES_EP#EP_FetchEpochsFromRecreation(numericalValues, textualValues, sweepNo, sweepDFR, channelNumber, XOP_CHANNEL_TYPE_DAC) - - if(WaveExists(epochChannelRef)) - TestEpochReceationRemoveUserEpochs(epochChannelRef) - // also TP channels can be active but have no epochs - CHECK_EQUAL_WAVES(epochChannelRec, epochChannelRef) - else - CHECK_WAVE(epochChannelRec, NULL_WAVE) - endif - endfor -End diff --git a/Packages/tests/UTF_HelperFunctions.ipf b/Packages/tests/UTF_HelperFunctions.ipf index fed7e32c50..607e47c01e 100644 --- a/Packages/tests/UTF_HelperFunctions.ipf +++ b/Packages/tests/UTF_HelperFunctions.ipf @@ -1135,3 +1135,46 @@ Function [string baseSet, string stimsetList, string customWavePath, variable am return [setNameB, stimsetList, wPath, amplitude] End + +static Function TestEpochReceationRemoveUserEpochs(WAVE/T epochChannel) + + variable i, epochCnt + + epochCnt = DimSize(epochChannel, ROWS) + Make/FREE/T/N=(epochCnt) shortnames = EP_GetShortName(epochChannel[p][EPOCH_COL_TAGS]) + for(i = epochCnt - 1; i >= 0; i -= 1) + if(GrepString(shortnames[i], "^" + EPOCH_SHORTNAME_USER_PREFIX)) + DeleteWavePoint(epochChannel, ROWS, i) + endif + endfor +End + +Function TestEpochReceation(string device) + + variable channelNumber + variable sweepNo = 0 + + WAVE/Z numericalValues = GetLBNumericalValues(device) + WAVE/Z textualValues = GetLBTextualValues(device) + DFREF deviceDFR = GetDeviceDataPath(device) + DFREF sweepDFR = GetSingleSweepFolder(deviceDFR, sweepNo) + + WAVE/Z activeChannels = GetActiveChannels(numericalValues, textualValues, sweepNo, XOP_CHANNEL_TYPE_DAC) + CHECK_WAVE(activeChannels, FREE_WAVE | NUMERIC_WAVE) + for(channelNumber = 0; channelNumber < NUM_DA_TTL_CHANNELS; channelNumber += 1) + + if(IsNaN(activeChannels[channelNumber])) + continue + endif + WAVE/Z/T epochChannelRef = EP_FetchEpochs(numericalValues, textualValues, sweepNo, sweepDFR, channelNumber, XOP_CHANNEL_TYPE_DAC) + WAVE/Z/T epochChannelRec = MIES_EP#EP_FetchEpochsFromRecreation(numericalValues, textualValues, sweepNo, sweepDFR, channelNumber, XOP_CHANNEL_TYPE_DAC) + + if(WaveExists(epochChannelRef)) + TestEpochReceationRemoveUserEpochs(epochChannelRef) + // also TP channels can be active but have no epochs + CHECK_EQUAL_WAVES(epochChannelRec, epochChannelRef) + else + CHECK_WAVE(epochChannelRec, NULL_WAVE) + endif + endfor +End From 35b27fb88ad2a97841dc9d90f68509d5cea6106b Mon Sep 17 00:00:00 2001 From: Michael Huth Date: Thu, 11 Apr 2024 15:46:32 +0200 Subject: [PATCH 3/8] Ana: refactor - move parts of Chirp user epoch creation to own device independent functions - no functional change --- .../MIES/MIES_AnalysisFunctions_PatchSeq.ipf | 68 +++++++++++++++---- 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf b/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf index 333a5830ae..15cf25674c 100644 --- a/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf +++ b/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf @@ -4672,8 +4672,7 @@ End /// /// Zero is the DA/AD wave zero. static Function [variable epBegin, variable epEnd] PSQ_CR_GetSpikeEvaluationRange(string device, variable sweepNo, variable headstage) - variable DAC, totalOnsetDelay, chirpStart, chirpEnd - string tags, shortname + variable DAC, totalOnsetDelay WAVE numericalValues = GetLBNumericalValues(device) WAVE textualValues = GetLBTextualValues(device) @@ -4696,7 +4695,28 @@ static Function [variable epBegin, variable epEnd] PSQ_CR_GetSpikeEvaluationRang WAVE durations = PSQ_GetPulseDurations(device, PSQ_CHIRP, sweepNo, totalOnsetDelay) - chirpStart = totalOnsetDelay + PSQ_BL_EVAL_RANGE + WAVE/T epochWave = GetEpochsWave(device) + [epBegin, epEnd] = PSQ_CR_AddSpikeEvaluationEpoch(epochsWave, DAC, headstage, durations, totalOnsetDelay) + + return [epBegin * ONE_TO_MILLI, epEnd * ONE_TO_MILLI] +End + +/// @brief Adds PSQ_Chirp spike evaluation epoch +/// +/// @param epochsWave 4d epochs wave +/// @param DAC DAC number +/// @param headstage headstage number +/// @param durations pulse duration wave +/// @param totalOnsetDelayMS totalOnsetDelay in ms +/// +/// @retval epBegin epoch begin in s +/// @retval epEnd epoch end in s +Function [variable epBegin, variable epEnd] PSQ_CR_AddSpikeEvaluationEpoch(WAVE/T epochsWave, variable DAC, variable headstage, WAVE durations, variable totalOnsetDelayMS) + + variable chirpStart, chirpEnd + string tags, shortName + + chirpStart = totalOnsetDelayMS + PSQ_BL_EVAL_RANGE chirpEnd = chirpStart + durations[headstage] epBegin = chirpStart * MILLI_TO_ONE @@ -4705,10 +4725,9 @@ static Function [variable epBegin, variable epEnd] PSQ_CR_GetSpikeEvaluationRang sprintf tags, "Type=Chirp spike evaluation" sprintf shortName, "CR_SE" - WAVE/T epochWave = GetEpochsWave(device) - EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) + EP_AddUserEpoch(epochsWave, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) - return [epBegin * ONE_TO_MILLI, epEnd * ONE_TO_MILLI] + return [epBegin, epEnd] End /// @brief Return the begin/start [ms] of the chirp bounds evaluation range @@ -4717,7 +4736,7 @@ End static Function [variable epBegin, variable epEnd] PSQ_CR_GetChirpEvaluationRange(string device, variable sweepNo, variable headstage, variable requestedCycles) variable DAC, stimsetQC - string name, tags, regexp, shortname, key + string name, tags, shortname, key WAVE numericalValues = GetLBNumericalValues(device) WAVE textualValues = GetLBTextualValues(device) @@ -4736,10 +4755,7 @@ static Function [variable epBegin, variable epEnd] PSQ_CR_GetChirpEvaluationRang return [epBegin, epEnd] endif - sprintf regexp, "^(E1_TG_C%d|E1_TG_C%d)$", 0, requestedCycles - 1 - WAVE/T/Z fullCycleEpochs = EP_GetEpochs(numericalValues, textualValues, NaN, XOP_CHANNEL_TYPE_DAC, DAC, \ - regexp, treelevel = 2, epochsWave = epochsWave) - + WAVE/Z/T fullCycleEpochs = PSQ_CR_GetFullCycleEpochs(numericalValues, textualValues, DAC, epochsWave, requestedCycles) if(!WaveExists(fullCycleEpochs)) printf "Could not find chirp cycles in epoch 1.\r" ControlWindowToFront() @@ -4761,6 +4777,23 @@ static Function [variable epBegin, variable epEnd] PSQ_CR_GetChirpEvaluationRang return [NaN, NaN] endif + [epBegin, epEnd] = PSQ_CR_AddCycleEvaluationEpoch(epochsWave, fullCycleEpochs, DAC) + + return [epBegin * ONE_TO_MILLI, epEnd * ONE_TO_MILLI] +End + +/// @brief Add PSQ_Chirp cycle evaluation epoch +/// +/// @param epochsWave 4d epoch wave +/// @param fullCycleEpochs 2d epoch wave with epochs of full cycles (sorted) +/// @param DAC DAC number +/// +/// @retval epBegin epoch begin in s +/// @retval epEnd epoch end in s +Function [variable epBegin, variable epEnd] PSQ_CR_AddCycleEvaluationEpoch(WAVE/T epochsWave, WAVE/T fullCycleEpochs, variable DAC) + + string tags, shortName + epBegin = str2num(fullCycleEpochs[0][EPOCH_COL_STARTTIME]) epEnd = str2num(fullCycleEpochs[DimSize(fullCycleEpochs, ROWS) - 1][EPOCH_COL_ENDTIME]) @@ -4769,7 +4802,18 @@ static Function [variable epBegin, variable epEnd] PSQ_CR_GetChirpEvaluationRang EP_AddUserEpoch(epochsWave, XOP_CHANNEL_TYPE_DAC, DAC, epBegin, epEnd, tags, shortName = shortName) - return [epBegin * ONE_TO_MILLI, epEnd * ONE_TO_MILLI] + return [epBegin, epEnd] +End + +Function/WAVE PSQ_CR_GetFullCycleEpochs(WAVE numericalValues, WAVE/T textualValues, variable DAC, WAVE/T epochsWave, variable requestedCycles) + + string regexp + + sprintf regexp, "^(E1_TG_C%d|E1_TG_C%d)$", 0, requestedCycles - 1 + WAVE/T/Z fullCycleEpochs = EP_GetEpochs(numericalValues, textualValues, NaN, XOP_CHANNEL_TYPE_DAC, DAC, \ + regexp, treelevel = 2, epochsWave = epochsWave) + + return fullCycleEpochs End /// @brief Manually force the pre/post set events From 9055d93df67855f1cbcfe547323cd0b15229dfd5 Mon Sep 17 00:00:00 2001 From: Michael Huth Date: Thu, 11 Apr 2024 09:49:10 +0200 Subject: [PATCH 4/8] EP: Add EpochRecreation support for User epochs from PSQ_Chirp - for Cycle evaluation and Spike evaluation - exclude supported user epochs from epoch creation in reference epoch wave cleanup that removes unsupported user epochs --- Packages/MIES/MIES_Epochs.ipf | 86 +++++++++++++++++++ Packages/tests/HardwareBasic/UTF_Epochs.ipf | 2 +- .../tests/UTF_HardwareHelperFunctions.ipf | 8 +- Packages/tests/UTF_HelperFunctions.ipf | 23 ++--- 4 files changed, 106 insertions(+), 13 deletions(-) diff --git a/Packages/MIES/MIES_Epochs.ipf b/Packages/MIES/MIES_Epochs.ipf index fb7b2db94e..9651846a5e 100644 --- a/Packages/MIES/MIES_Epochs.ipf +++ b/Packages/MIES/MIES_Epochs.ipf @@ -1752,6 +1752,7 @@ static Function/WAVE EP_RecreateEpochsFromLoadedData(WAVE numericalValues, WAVE/ WAVE/T recEpochWave = GetEpochsWaveAsFree() EP_CollectEpochInfoDA(recEpochWave, s) + EP_AddRecreatedUserEpochs(numericalValues, textualValues, sweepDFR, sweepNo, s, recEpochWave) WAVE/Z channelDA = GetDAQDataSingleColumnWaveNG(numericalValues, textualValues, sweepNo, sweepDFR, XOP_CHANNEL_TYPE_DAC, s.DACList[0]) ASSERT(WaveExists(channelDA), "Could not retrieve first DA sweep") @@ -1772,3 +1773,88 @@ static Function/WAVE EP_RecreateEpochsFromLoadedData(WAVE numericalValues, WAVE/ return recEpochWave End + +static Function EP_AddRecreatedUserEpochs(WAVE numericalValues, WAVE/T textualValues, DFREF sweepDFR, variable sweepNo, STRUCT DataConfigurationResult &s, WAVE/T epochWave) + + variable firstDAC, firstHS, totalOnsetDelayMS, index, type + string key + + firstDAC = s.DACList[0] + firstHS = s.headstageDAC[0] + totalOnsetDelayMS = s.onsetDelay * s.samplingIntervalDA * MICRO_TO_MILLI + key = "Generic function" + [WAVE settings, index] = GetLastSettingChannel(numericalValues, textualValues, sweepNo, key, firstDAC, XOP_CHANNEL_TYPE_DAC, DATA_ACQUISITION_MODE) + ASSERT(WaveExists(settings), "Unable to retrieve analysis function name from LNB") + WAVE/T settingsT = settings + type = MapAnaFuncToConstant(settingsT[index]) + + switch(type) + case PSQ_CHIRP: + EP_AddRecreatedUserEpochs_PSQ_Chirp(numericalValues, textualValues, sweepDFR, sweepNo, firstDAC, firstHS, totalOnsetDelayMS, epochWave) + break + default: + DEBUGPRINT("EP_Recreation: Unsupported analysis function -> skipped.") + return NaN + endswitch +End + +static Function EP_AddRecreatedUserEpochs_PSQ_Chirp(WAVE numericalValues, WAVE/T textualValues, DFREF sweepDFR, variable sweepNo, variable DAC, variable headStage, variable totalOnsetDelayMS, WAVE/T epochWave) + + variable index, stimsetQC, chirpCycles, spikeCheck + variable epBegin, epEnd + string key, params + + key = "Function params (encoded)" + [WAVE settings, index] = GetLastSettingChannel(numericalValues, textualValues, sweepNo, key, DAC, XOP_CHANNEL_TYPE_DAC, DATA_ACQUISITION_MODE) + ASSERT(WaveExists(settings), "EP_Recreation: Could not query analysis function parameters from LNB.") + WAVE/T settingsT = settings + params = settingsT[index] + + key = CreateAnaFuncLBNKey(PSQ_CHIRP, PSQ_FMT_LBN_CR_STIMSET_QC, query = 1) + stimsetQC = GetLastSettingIndep(numericalValues, sweepNo, key, UNKNOWN_MODE) + ASSERT(!IsNaN(stimsetQC), "Chirp was run, but no QC result found.") + if(!stimsetQC) + return NaN + endif + + chirpCycles = AFH_GetAnalysisParamNumerical("NumberOfChirpCycles", params) + ASSERT(IsFinite(chirpCycles) && chirpCycles > 0, "Invalid chirp cycles") + + WAVE/Z/T fullCycleEpochs = PSQ_CR_GetFullCycleEpochs(numericalValues, textualValues, DAC, epochWave, chirpCycles) + ASSERT(WaveExists(fullCycleEpochs) && DimSize(fullCycleEpochs, ROWS) == (chirpCycles == 1 ? 1 : 2), "Chirp resulted in successful stimset QC, but could not find cycle base epochs E1_TG_C0 && E1_TG_C" + num2istr(chirpCycles - 1)) + [epBegin, epEnd] = PSQ_CR_AddCycleEvaluationEpoch(epochWave, fullCycleEpochs, DAC) + + spikeCheck = AFH_GetAnalysisParamNumerical("SpikeCheck", params) + ASSERT(IsFinite(spikeCheck), "Invalid SpikeCheck param") + if(!spikeCheck) + return NaN + endif + + key = CreateAnaFuncLBNKey(PSQ_CHIRP, PSQ_FMT_LBN_PULSE_DUR, query = 1) + WAVE/Z durations = GetLastSetting(numericalValues, sweepNo, key, UNKNOWN_MODE) + ASSERT(WaveExists(durations), "Chirp spikeCheck was enabled, but could not find durations in LNB") + [epBegin, epEnd] = PSQ_CR_AddSpikeEvaluationEpoch(epochWave, DAC, headStage, durations, totalOnsetDelayMS) +End + +/// @brief Fetches a single epoch channel from a recreated epoch wave. +/// The returned epoch channel wave has the same form as epoch information that was stored in the LNB returned by @ref EP_FetchEpochs +/// +/// @param epochWave 4d epoch wave +/// @param channelNumber GUI channel number +/// @param channelType channel type, one of @ref XopChannelConstants +/// @returns epoch channel wave (2d) +Function/WAVE EP_FetchEpochsFromRecreated(WAVE epochWave, variable channelNumber, variable channelType) + + string epList + + epList = EP_EpochWaveToStr(epochWave, channelNumber, channelType) + if(IsEmpty(epList)) + return $"" + endif + WAVE epChannel = EP_EpochStrToWave(epList) + if(!DimSize(epChannel, ROWS)) + return $"" + endif + + return epChannel +End diff --git a/Packages/tests/HardwareBasic/UTF_Epochs.ipf b/Packages/tests/HardwareBasic/UTF_Epochs.ipf index e8a6371d34..61cdb40edf 100644 --- a/Packages/tests/HardwareBasic/UTF_Epochs.ipf +++ b/Packages/tests/HardwareBasic/UTF_Epochs.ipf @@ -467,7 +467,7 @@ static Function TestEpochsGeneric(string device) endfor endfor - TestEpochReceation(device) + TestEpochRecreation(device, sweepNo) End static Function TestUnacquiredEpoch(WAVE sweep, WAVE epochChannel) diff --git a/Packages/tests/UTF_HardwareHelperFunctions.ipf b/Packages/tests/UTF_HardwareHelperFunctions.ipf index 0e0e86d356..f2732244da 100644 --- a/Packages/tests/UTF_HardwareHelperFunctions.ipf +++ b/Packages/tests/UTF_HardwareHelperFunctions.ipf @@ -562,8 +562,8 @@ static Function CheckAnaFuncVersion(string device, variable type) End Function CommonAnalysisFunctionChecks(string device, variable sweepNo, WAVE headstageQC) - string key - variable type + string key + variable type, DAC, index CHECK_EQUAL_VAR(GetSetVariable(device, "SetVar_Sweep"), sweepNo + 1) CHECK_EQUAL_VAR(AFH_GetLastSweepAcquired(device), sweepNo) @@ -597,6 +597,10 @@ Function CommonAnalysisFunctionChecks(string device, variable sweepNo, WAVE head CheckForOtherUserLBNKeys(device, type) CheckRangeOfUserLabnotebookKeys(device, type, sweepNo) CheckDAStimulusSets(device, sweepNo, type) + + if(type == PSQ_CHIRP) + TestEpochRecreation(device, sweepNo) + endif End /// Used for patch seq analysis functions and NextStimSetName/NextIndexingEndStimSetName analysis parameters diff --git a/Packages/tests/UTF_HelperFunctions.ipf b/Packages/tests/UTF_HelperFunctions.ipf index 607e47c01e..81b4acf821 100644 --- a/Packages/tests/UTF_HelperFunctions.ipf +++ b/Packages/tests/UTF_HelperFunctions.ipf @@ -1136,41 +1136,44 @@ Function [string baseSet, string stimsetList, string customWavePath, variable am return [setNameB, stimsetList, wPath, amplitude] End -static Function TestEpochReceationRemoveUserEpochs(WAVE/T epochChannel) +static Function TestEpochRecreationRemoveUnsupportedUserEpochs(WAVE/T epochChannel) variable i, epochCnt + Make/FREE/T supportedUserEpochs = {"CR_CE", "CR_SE"} + supportedUserEpochs[] = EPOCH_SHORTNAME_USER_PREFIX + supportedUserEpochs[p] + epochCnt = DimSize(epochChannel, ROWS) Make/FREE/T/N=(epochCnt) shortnames = EP_GetShortName(epochChannel[p][EPOCH_COL_TAGS]) for(i = epochCnt - 1; i >= 0; i -= 1) if(GrepString(shortnames[i], "^" + EPOCH_SHORTNAME_USER_PREFIX)) + FindValue/TEXT=shortnames[i]/TXOP=4 supportedUserEpochs + if(V_Value >= 0) + continue + endif DeleteWavePoint(epochChannel, ROWS, i) endif endfor End -Function TestEpochReceation(string device) +Function TestEpochRecreation(string device, variable sweepNo) variable channelNumber - variable sweepNo = 0 WAVE/Z numericalValues = GetLBNumericalValues(device) WAVE/Z textualValues = GetLBTextualValues(device) DFREF deviceDFR = GetDeviceDataPath(device) DFREF sweepDFR = GetSingleSweepFolder(deviceDFR, sweepNo) - WAVE/Z activeChannels = GetActiveChannels(numericalValues, textualValues, sweepNo, XOP_CHANNEL_TYPE_DAC) - CHECK_WAVE(activeChannels, FREE_WAVE | NUMERIC_WAVE) + WAVE epochWave = MIES_EP#EP_RecreateEpochsFromLoadedData(numericalValues, textualValues, sweepDFR, sweepNo) + for(channelNumber = 0; channelNumber < NUM_DA_TTL_CHANNELS; channelNumber += 1) - if(IsNaN(activeChannels[channelNumber])) - continue - endif WAVE/Z/T epochChannelRef = EP_FetchEpochs(numericalValues, textualValues, sweepNo, sweepDFR, channelNumber, XOP_CHANNEL_TYPE_DAC) - WAVE/Z/T epochChannelRec = MIES_EP#EP_FetchEpochsFromRecreation(numericalValues, textualValues, sweepNo, sweepDFR, channelNumber, XOP_CHANNEL_TYPE_DAC) + WAVE/Z/T epochChannelRec = EP_FetchEpochsFromRecreated(epochWave, channelNumber, XOP_CHANNEL_TYPE_DAC) if(WaveExists(epochChannelRef)) - TestEpochReceationRemoveUserEpochs(epochChannelRef) + TestEpochRecreationRemoveUnsupportedUserEpochs(epochChannelRef) // also TP channels can be active but have no epochs CHECK_EQUAL_WAVES(epochChannelRec, epochChannelRef) else From 9902eca3eded81f9553a3e748ec12ebeb1fc195d Mon Sep 17 00:00:00 2001 From: Michael Huth Date: Wed, 17 Apr 2024 18:04:38 +0200 Subject: [PATCH 5/8] EP: Add recreation support for PSQ_Chirp baseline epochs --- .../MIES/MIES_AnalysisFunctions_PatchSeq.ipf | 22 ++++++-- Packages/MIES/MIES_Constants.ipf | 3 +- Packages/MIES/MIES_Epochs.ipf | 50 ++++++++++++------- Packages/tests/UTF_HelperFunctions.ipf | 49 ++++++++++++------ 4 files changed, 86 insertions(+), 38 deletions(-) diff --git a/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf b/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf index 15cf25674c..0d11a3a3a9 100644 --- a/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf +++ b/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf @@ -446,7 +446,7 @@ static Function PSQ_EvaluateBaselineProperties(string device, STRUCT AnalysisFun variable leakCurPassedAll, maxLeakCurrent, targetVThreshold variable rmsShortThreshold, rmsLongThreshold variable chunkPassedRMSShortOverride, chunkPassedRMSLongOverride, chunkPassedTargetVOverride, chunkPassedLeakCurOverride - string msg, adUnit, ctrl, key, epName, epShortName + string msg, adUnit, ctrl, key STRUCT PSQ_PulseSettings ps PSQ_GetPulseSettingsForType(type, ps) @@ -605,9 +605,7 @@ static Function PSQ_EvaluateBaselineProperties(string device, STRUCT AnalysisFun DAC = AFH_GetDACFromHeadstage(device, i) ASSERT(IsFinite(DAC), "Could not determine DAC channel number for HS " + num2istr(i) + " for device " + device) - epName = "Name=Baseline Chunk;Index=" + num2istr(chunk) - epShortName = PSQ_BASELINE_CHUNK_SHORT_NAME_PREFIX + num2istr(chunk) - EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, chunkStartTimeMax * MILLI_TO_ONE, (chunkStartTimeMax + chunkLengthTime) * MILLI_TO_ONE, epName, shortname = epShortName) + PSQ_AddBaselineEpoch(epochWave, DAC, chunk, chunkStartTimeMax, chunkLengthTime) if(chunk == 0) // store baseline RMS short/long tartget V analysis parameters in labnotebook on first use @@ -848,6 +846,22 @@ static Function PSQ_EvaluateBaselineProperties(string device, STRUCT AnalysisFun endif End +/// @brief Add base line epoch to user epochs +/// +/// @param epochWave 4D epochs wave +/// @param DAC DAC channel number +/// @param chunk number of evaluated chunk +/// @param chunkStartTimeMax start time of chunk in ms +/// @param chunkLengthTime time length of chunk in ms +Function PSQ_AddBaselineEpoch(WAVE epochWave, variable DAC, variable chunk, variable chunkStartTimeMax, variable chunkLengthTime) + + string epName, epShortName + + epName = "Name=Baseline Chunk;Index=" + num2istr(chunk) + epShortName = PSQ_BASELINE_CHUNK_SHORT_NAME_PREFIX + num2istr(chunk) + EP_AddUserEpoch(epochWave, XOP_CHANNEL_TYPE_DAC, DAC, chunkStartTimeMax * MILLI_TO_ONE, (chunkStartTimeMax + chunkLengthTime) * MILLI_TO_ONE, epName, shortname = epShortName) +End + /// @brief Return the number of chunks /// /// A chunk is #PSQ_BL_EVAL_RANGE [ms] of baseline. diff --git a/Packages/MIES/MIES_Constants.ipf b/Packages/MIES/MIES_Constants.ipf index 5837c2cea2..e6071c1bc3 100644 --- a/Packages/MIES/MIES_Constants.ipf +++ b/Packages/MIES/MIES_Constants.ipf @@ -1119,7 +1119,8 @@ Constant PSQ_CALC_METHOD_RMS = 0x2 // root-mean-square (rms) Constant PSQ_BL_FAILED = 1 -StrConstant PSQ_BASELINE_CHUNK_SHORT_NAME_PREFIX = "BLC" +StrConstant PSQ_BASELINE_CHUNK_SHORT_NAME_PREFIX = "BLC" +StrConstant PSQ_BASELINE_CHUNK_SHORT_NAME_RE_MATCHER = "BLC[[:digit:]]+" /// @} /// @name PatchSeq labnotebook constants diff --git a/Packages/MIES/MIES_Epochs.ipf b/Packages/MIES/MIES_Epochs.ipf index 9651846a5e..73daf124f5 100644 --- a/Packages/MIES/MIES_Epochs.ipf +++ b/Packages/MIES/MIES_Epochs.ipf @@ -1800,8 +1800,8 @@ End static Function EP_AddRecreatedUserEpochs_PSQ_Chirp(WAVE numericalValues, WAVE/T textualValues, DFREF sweepDFR, variable sweepNo, variable DAC, variable headStage, variable totalOnsetDelayMS, WAVE/T epochWave) - variable index, stimsetQC, chirpCycles, spikeCheck - variable epBegin, epEnd + variable index, stimsetQC, chirpCycles, spikeCheck, baselineQC + variable epBegin, epEnd, chunk, chunkPassed, chunkStartTimeMax, chunkLengthTime string key, params key = "Function params (encoded)" @@ -1810,30 +1810,46 @@ static Function EP_AddRecreatedUserEpochs_PSQ_Chirp(WAVE numericalValues, WAVE/T WAVE/T settingsT = settings params = settingsT[index] - key = CreateAnaFuncLBNKey(PSQ_CHIRP, PSQ_FMT_LBN_CR_STIMSET_QC, query = 1) - stimsetQC = GetLastSettingIndep(numericalValues, sweepNo, key, UNKNOWN_MODE) - ASSERT(!IsNaN(stimsetQC), "Chirp was run, but no QC result found.") - if(!stimsetQC) - return NaN + key = CreateAnaFuncLBNKey(PSQ_CHIRP, PSQ_FMT_LBN_PULSE_DUR, query = 1) + WAVE/Z durations = GetLastSetting(numericalValues, sweepNo, key, UNKNOWN_MODE) + ASSERT(WaveExists(durations), "Could not find durations in LNB") + + spikeCheck = AFH_GetAnalysisParamNumerical("SpikeCheck", params) + ASSERT(IsFinite(spikeCheck), "Invalid SpikeCheck param") + if(spikeCheck) + [epBegin, epEnd] = PSQ_CR_AddSpikeEvaluationEpoch(epochWave, DAC, headStage, durations, totalOnsetDelayMS) endif + for(chunk = 0;; chunk += 1) + key = CreateAnaFuncLBNKey(PSQ_CHIRP, PSQ_FMT_LBN_CHUNK_PASS, chunk = chunk, query = 1) + chunkPassed = GetLastSettingIndep(numericalValues, sweepNo, key, UNKNOWN_MODE, defValue = NaN) + if(IsNaN(chunkPassed)) + break + endif + chunkLengthTime = PSQ_BL_EVAL_RANGE + chunkStartTimeMax = chunk ? (totalOnsetDelayMS + PSQ_BL_EVAL_RANGE + WaveMax(durations)) + chunk * PSQ_BL_EVAL_RANGE : totalOnsetDelayMS + PSQ_AddBaselineEpoch(epochWave, DAC, chunk, chunkStartTimeMax, chunkLengthTime) + endfor + chirpCycles = AFH_GetAnalysisParamNumerical("NumberOfChirpCycles", params) ASSERT(IsFinite(chirpCycles) && chirpCycles > 0, "Invalid chirp cycles") - WAVE/Z/T fullCycleEpochs = PSQ_CR_GetFullCycleEpochs(numericalValues, textualValues, DAC, epochWave, chirpCycles) - ASSERT(WaveExists(fullCycleEpochs) && DimSize(fullCycleEpochs, ROWS) == (chirpCycles == 1 ? 1 : 2), "Chirp resulted in successful stimset QC, but could not find cycle base epochs E1_TG_C0 && E1_TG_C" + num2istr(chirpCycles - 1)) - [epBegin, epEnd] = PSQ_CR_AddCycleEvaluationEpoch(epochWave, fullCycleEpochs, DAC) + if(!WaveExists(fullCycleEpochs)) + return NaN + endif - spikeCheck = AFH_GetAnalysisParamNumerical("SpikeCheck", params) - ASSERT(IsFinite(spikeCheck), "Invalid SpikeCheck param") - if(!spikeCheck) + key = CreateAnaFuncLBNKey(PSQ_CHIRP, PSQ_FMT_LBN_CR_STIMSET_QC, query = 1) + stimsetQC = GetLastSettingIndep(numericalValues, sweepNo, key, UNKNOWN_MODE) + if(IsNaN(stimsetQC)) + // fallback + stimsetQC = !(chirpCycles > 1 && DimSize(fullCycleEpochs, ROWS) == 1) + endif + if(!stimsetQC) return NaN endif - key = CreateAnaFuncLBNKey(PSQ_CHIRP, PSQ_FMT_LBN_PULSE_DUR, query = 1) - WAVE/Z durations = GetLastSetting(numericalValues, sweepNo, key, UNKNOWN_MODE) - ASSERT(WaveExists(durations), "Chirp spikeCheck was enabled, but could not find durations in LNB") - [epBegin, epEnd] = PSQ_CR_AddSpikeEvaluationEpoch(epochWave, DAC, headStage, durations, totalOnsetDelayMS) + ASSERT(DimSize(fullCycleEpochs, ROWS) == (chirpCycles == 1 ? 1 : 2), "Chirp resulted in successful stimset QC, but could not find cycle base epochs E1_TG_C0 && E1_TG_C" + num2istr(chirpCycles - 1)) + [epBegin, epEnd] = PSQ_CR_AddCycleEvaluationEpoch(epochWave, fullCycleEpochs, DAC) End /// @brief Fetches a single epoch channel from a recreated epoch wave. diff --git a/Packages/tests/UTF_HelperFunctions.ipf b/Packages/tests/UTF_HelperFunctions.ipf index 81b4acf821..c98f4216f4 100644 --- a/Packages/tests/UTF_HelperFunctions.ipf +++ b/Packages/tests/UTF_HelperFunctions.ipf @@ -1136,29 +1136,42 @@ Function [string baseSet, string stimsetList, string customWavePath, variable am return [setNameB, stimsetList, wPath, amplitude] End -static Function TestEpochRecreationRemoveUnsupportedUserEpochs(WAVE/T epochChannel) +static Function TestEpochRecreationRemoveUnsupportedUserEpochs(WAVE/T epochChannel, variable type) - variable i, epochCnt + variable index, epochCnt + string shortName, supportedUserEpochsRegExp + string regexpUserEpochs = "^" + EPOCH_SHORTNAME_USER_PREFIX + ".*" Make/FREE/T supportedUserEpochs = {"CR_CE", "CR_SE"} - supportedUserEpochs[] = EPOCH_SHORTNAME_USER_PREFIX + supportedUserEpochs[p] - - epochCnt = DimSize(epochChannel, ROWS) - Make/FREE/T/N=(epochCnt) shortnames = EP_GetShortName(epochChannel[p][EPOCH_COL_TAGS]) - for(i = epochCnt - 1; i >= 0; i -= 1) - if(GrepString(shortnames[i], "^" + EPOCH_SHORTNAME_USER_PREFIX)) - FindValue/TEXT=shortnames[i]/TXOP=4 supportedUserEpochs - if(V_Value >= 0) - continue - endif - DeleteWavePoint(epochChannel, ROWS, i) - endif + Make/FREE/T psqChirpEpochs = {PSQ_BASELINE_CHUNK_SHORT_NAME_RE_MATCHER} + if(type == PSQ_CHIRP) + Concatenate/FREE/T/NP {psqChirpEpochs}, supportedUserEpochs + endif + supportedUserEpochs[] = "^" + EPOCH_SHORTNAME_USER_PREFIX + supportedUserEpochs[p] + supportedUserEpochsRegExp = TextWaveToList(supportedUserEpochs, "|") + supportedUserEpochsRegExp = RemoveEnding(supportedUserEpochsRegExp, "|") + supportedUserEpochsRegExp = "^(?![\s\S]*" + supportedUserEpochsRegExp + ")[\s\S]*$" + Make/FREE/T/N=(DimSize(epochChannel, ROWS)) shortnames = EP_GetShortName(epochChannel[p][EPOCH_COL_TAGS]) + WAVE/Z userEpochIndices = FindIndizes(shortNames, str = regexpUserEpochs, prop = PROP_GREP) + if(!WaveExists(userEpochIndices)) + return NaN + endif + Make/FREE/T/N=(DimSize(userEpochIndices, ROWS)) userEpochShortNames = shortnames[userEpochIndices[p]] + WAVE/Z matches = FindIndizes(userEpochShortNames, str = supportedUserEpochsRegExp, prop = PROP_GREP) + if(!WaveExists(matches)) + return NaN + endif + matches[] = userEpochIndices[matches[p]] + Sort/R matches, matches + for(index : matches) + DeleteWavePoint(epochChannel, ROWS, index) endfor End Function TestEpochRecreation(string device, variable sweepNo) - variable channelNumber + variable channelNumber, index, type + string anaFunc WAVE/Z numericalValues = GetLBNumericalValues(device) WAVE/Z textualValues = GetLBTextualValues(device) @@ -1173,7 +1186,11 @@ Function TestEpochRecreation(string device, variable sweepNo) WAVE/Z/T epochChannelRec = EP_FetchEpochsFromRecreated(epochWave, channelNumber, XOP_CHANNEL_TYPE_DAC) if(WaveExists(epochChannelRef)) - TestEpochRecreationRemoveUnsupportedUserEpochs(epochChannelRef) + [WAVE settings, index] = GetLastSettingChannel(numericalValues, textualValues, sweepNo, "Generic function", channelNumber, XOP_CHANNEL_TYPE_DAC, DATA_ACQUISITION_MODE) + REQUIRE_WAVE(settings, TEXT_WAVE) + WAVE/T settingsT = settings + type = MapAnaFuncToConstant(settingsT[index]) + TestEpochRecreationRemoveUnsupportedUserEpochs(epochChannelRef, type) // also TP channels can be active but have no epochs CHECK_EQUAL_WAVES(epochChannelRec, epochChannelRef) else From 7c37c5a4260757389cfb512acefc88cdc6d599c4 Mon Sep 17 00:00:00 2001 From: Michael Huth Date: Sat, 20 Apr 2024 21:12:23 +0200 Subject: [PATCH 6/8] Tests: Add test for checking user epochs in historic data - renamed TestEpochRecreation to TestEpochRecreationFromLoadedPXP to prevent naming confusion with the utility function of the same name in UTF_HelperFunctions.ipf - Limited TestEpochRecreationFromLoadedPXP to test only for pxp files as the testing approach does not work with nwb files. - Added test TestEpochRecreationShortNames and related utility function ExportEpochsFromFileToDF to create additional reference data. - TestEpochRecreationShortNames tests for existence of epochs in historic data. 1. all epochs present in the historic data reduced by the in epoch recreation supported user epochs must be present in the recreated epochs 2. all user epochs from recreated epochs must exist in the epochs of the historic data Some historic data does not have existing user epochs. For these files recreated epochs can be exported with the utility function ExportEpochsFromFileToDF to a data folder in HistoricData.pxp. For these files the refEpFolder has to be set in TestEpochRecreationShortNames. Then the second part of the TestEpochRecreationShortNames tests effectively, if the current implementation of epoch recreation recreates all user epochs that were recreated at the time the export with ExportEpochsFromFileToDF was done, i.e. changes in the current code that remove previous user epochs are found. --- Packages/MIES/MIES_Epochs.ipf | 4 +- Packages/tests/HistoricData/HistoricData.pxp | Bin 1994 -> 216411 bytes .../HistoricData/UTF_EpochRecreation.ipf | 95 +++++++++++- .../tests/HistoricData/UTF_HistoricData.ipf | 6 +- Packages/tests/UTF_HelperFunctions.ipf | 138 +++++++++++++++--- 5 files changed, 218 insertions(+), 25 deletions(-) diff --git a/Packages/MIES/MIES_Epochs.ipf b/Packages/MIES/MIES_Epochs.ipf index 73daf124f5..8c8c3b90e4 100644 --- a/Packages/MIES/MIES_Epochs.ipf +++ b/Packages/MIES/MIES_Epochs.ipf @@ -1784,7 +1784,9 @@ static Function EP_AddRecreatedUserEpochs(WAVE numericalValues, WAVE/T textualVa totalOnsetDelayMS = s.onsetDelay * s.samplingIntervalDA * MICRO_TO_MILLI key = "Generic function" [WAVE settings, index] = GetLastSettingChannel(numericalValues, textualValues, sweepNo, key, firstDAC, XOP_CHANNEL_TYPE_DAC, DATA_ACQUISITION_MODE) - ASSERT(WaveExists(settings), "Unable to retrieve analysis function name from LNB") + if(!WaveExists(settings)) + return NaN + endif WAVE/T settingsT = settings type = MapAnaFuncToConstant(settingsT[index]) diff --git a/Packages/tests/HistoricData/HistoricData.pxp b/Packages/tests/HistoricData/HistoricData.pxp index 20ff2eef4be77c02a74aeeeee71962efa0269e7b..42288342fc50b9c52f96dd2cddfe93c26b34fde0 100644 GIT binary patch literal 216411 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 >b}m7 zpsP~u(dOOS%pCQ9m}6?D6UK%oqeStmopgR5$xWRcbQcbaAV<9y|N(G6|>W-X?u4w;n8gN&XH7oJDXkQtWWOT0LvOj@z&x#{F3je4t(9) znPhn`J(0`mHVwgEWZjutC+$K?E$hb-bEF>2ZseyG94k23_FK%ZbJahr91Qf6tGq8w za)Zhaln1+(B1DbZPSfF@#Q5**aqr(dAh91svk)QCx%C)g^$mlC|Mw0=UDS7gj#uB1$@mBbw_;wl~?eRL>*nCZ?ncZ z&$PBs%fz$rw-Y*Yd86S$0f!fo`-F1Sfp`xG3R-%mR^gCYHazD){v@a=N!%;ahl)Rm zl?^TsSUGejyQ6L4BGS1K+Q3|KiNojy_9`*=PsHg4``%#ocS#v(EiMOf%d20QZCtTG0wCCR* zlTS_KK^p(EohMYE_{5$c+0`@n-p~3#%;lcCI zZ*{oj@}8BYrL~>cUvp)i!-2qQ;A#G=I8Ij7!h2rKG~Uuv-;m$@-gU}fCGYLYXZ2{$ zb+y%qva?P$MG@tRnK%V21hpU569;{ZMc*&3M zstx8}s4z5KyX45OYR^Td-0-4~4}4EgU;k+1ZbtHNL1=vB1H+?@`>XZ$V9_P@9F37x!=1lvr_~H~-#J^Xk*yYGH9hc!2XC^#22#Vn!pYI_LmBk=DBa literal 1994 zcmV;*2Q~N~iwFP!000001LYV^ZzD;yV^3ywy)x`93|jV7>qsbBId=Oio)~#|9e*UA z8GlUdOhzNLR=K-uH`DHFb(b9n5SjxwE}TH(2v;tgIUx8295@5wv^Rvb7Z8wrueV4IFulV!*BO zN=BgbuaFdSAAk9~55sHW@ai4^H!m6y2JrN|5j{653`1Nh)dhYO)k&OSMNKU@n9!{1;3Q&8r6c^$Gfbht3V8)_0lec6 zKSINywII#iJE0)Wy$~*+*t>U^c8U1ogSg1uaF7N80nqxgV(*5QK<@w`0Q#B(@PXbA zza6A_5PA@#xF5bBWV#Q^%{$Yz5kW(I4!t$6&%|5v`YOw8h`L8s{;^{Ba^c8^F{20{w z+}zY9cq63`saRJs_ofR7140EN3p1oPFm@6AHK_jWo+c zB9Q#y1E&%iC;jxc!pA0`80t3ABl%B%jfwoM(w#H=WAVy+c!j>7$8F*JD`MyOJ<9(M zTx-tx`eGJ#QtXI-`^|6Pg&#ccKmNOr=3~}t@N58$D&3R1&#T=JV9iJAHR+FwqwFT_ zX_;Dmcr)VW>5{ge6(1BA@|6%!oDkD_!P)01;OIn|TXJ#%I{5}zlrRP%YZgbm*caC8r2@VFHf(0iibOYvM$M2Wa`*+Yo3$ zpe&7nG7)XE6P&@4FNl8>Be6oEu$Y%(J}T#sAl4Zc{1|WMb4M8x`#fe5zxbt5}9 z9(EvxI2_fD0pFCjw#fTMl8ciVfMexWqg{VeZ6CJE)ymN!dSYuK|1(Pmf8)jnoWCTc z0TdkQdnN=_MMx2cnth%3slHL>D)Z)s23IFK+nAUtbmulTm<}368+^*##7MTuj+{%R zbMf6Qey1||Tp}0W$z>AxTr}$XA-PX1&P8E(+yEV#khz#;HQ3r-PB%BpUx(yE3}N08 zA#m8ds_Cod2?FD&O8TdcL!D_epNO_hW;D5AeXuIoEMBPb$>ZXtqj5G1I>z&IE}oO+ zt>mL(CNF1`&x$gMU0{Of`;0D=bY>StJd__gR%i3OC@YmogVB#QU3U$)At7#Jd363J zg>Q1dhcv$k0I$swm91$(X_Dt`Zm(iH&o*ASW=h zd)P!Y5{+zVhN4eYXeNbV{}B|L1mIN$MVOJ&QMc77b*q(Lx7z8}oBN2wts!F0(I2fUK4SE=qD?eDJ;U@{BKEMYSUs;z;l3jV)o6N>pu*p$H-j78kpq&s4eF;mUr zhNHoh!U^r`jO>*fd#zTl`n+9jcIwZnz4Ae|{I~dmAk)%RW?)_k cD8*m}S`6MvCa= 0) + continue + endif + Redimension/N=(numEpochsRef + 1, -1) epochChannelRef + epochChannelRef[numEpochsRef][] = epochChannelRecRef[i][q] + numEpochsRef += 1 + endfor +End + +/// @brief The historic epoch comparison only compares existence of epochs from shortnames if present +static Function CompareEpochsHistoricChannel(WAVE/T epochChannelRef, WAVE/T epochChannelRec) + + string shortName + variable i, numEpochs, numEpochsRec + + numEpochs = DimSize(epochChannelRef, ROWS) + Make/FREE/T/N=(numEpochs) epRefShortnames = EP_GetShortName(epochChannelRef[p][EPOCH_COL_TAGS]) + numEpochsRec = DimSize(epochChannelRec, ROWS) + Make/FREE/T/N=(numEpochsRec) epRecShortnames = EP_GetShortName(epochChannelRec[p][EPOCH_COL_TAGS]) + ASSERT(numEpochs > 0, "numEpochs is zero") + // test if all reference epochs are also present in recreated + for(i = 0; i < numEpochs; i += 1) + shortName = epRefShortnames[i] + if(IsEmpty(shortName)) + continue + endif + FindValue/TEXT=shortName/TXOP=4 epRecShortnames + INFO("Could not find reference epoch %s in recreated epochs.", s0 = shortName) + CHECK_GE_VAR(V_value, 0) + endfor + // test if all recreated user epochs are also present in reference + ASSERT(numEpochsRec > 0, "numEpochsRec is zero") + for(i = 0; i < numEpochsRec; i += 1) + shortName = epRecShortnames[i] + if(strsearch(shortName, EPOCH_SHORTNAME_USER_PREFIX, 0) != 0) + continue + endif + FindValue/TEXT=shortName/TXOP=4 epRefShortnames + INFO("Could not find recreated user epoch %s in reference epochs.", s0 = shortName) + CHECK_GE_VAR(V_value, 0) + endfor +End From 70ec26159f3409737be5122d972f98db17d1a930 Mon Sep 17 00:00:00 2001 From: Michael Huth Date: Mon, 22 Apr 2024 14:23:04 +0200 Subject: [PATCH 7/8] Tests: Split generators in HistoricDataTests for PXP and NWB files - some tests work only with pxp files, which is now covered by selecting the right data generator --- .../UTF_AttemptNWB2ExportOnOldData.ipf | 2 +- .../HistoricData/UTF_EpochRecreation.ipf | 5 ---- .../tests/HistoricData/UTF_HistoricData.ipf | 30 ++++++++++++++++--- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/Packages/tests/HistoricData/UTF_AttemptNWB2ExportOnOldData.ipf b/Packages/tests/HistoricData/UTF_AttemptNWB2ExportOnOldData.ipf index cd02338b5d..5c94c6a399 100644 --- a/Packages/tests/HistoricData/UTF_AttemptNWB2ExportOnOldData.ipf +++ b/Packages/tests/HistoricData/UTF_AttemptNWB2ExportOnOldData.ipf @@ -3,7 +3,7 @@ #pragma rtFunctionErrors=1 #pragma ModuleName=ExportToNWB -/// UTF_TD_GENERATOR GetHistoricDataFiles +/// UTF_TD_GENERATOR GetHistoricDataFilesPXP static Function TestExportingDataToNWB([string str]) string file, miesPath, nwbFileName diff --git a/Packages/tests/HistoricData/UTF_EpochRecreation.ipf b/Packages/tests/HistoricData/UTF_EpochRecreation.ipf index 23b7d66f7f..bf2bae5437 100644 --- a/Packages/tests/HistoricData/UTF_EpochRecreation.ipf +++ b/Packages/tests/HistoricData/UTF_EpochRecreation.ipf @@ -47,11 +47,6 @@ static Function TestEpochRecreationFromLoadedPXP([string str]) string file, miesPath, win, device variable numObjectsLoaded, first, last, i - if(!StringEndsWith(LowerStr(str), ".pxp")) - PASS() - return NaN - endif - file = "input:" + str PathInfo home diff --git a/Packages/tests/HistoricData/UTF_HistoricData.ipf b/Packages/tests/HistoricData/UTF_HistoricData.ipf index e49d38aa4e..15127bf4df 100644 --- a/Packages/tests/HistoricData/UTF_HistoricData.ipf +++ b/Packages/tests/HistoricData/UTF_HistoricData.ipf @@ -212,16 +212,38 @@ End Function/WAVE GetHistoricDataFiles() + WAVE/T pxpFiles = GetHistoricDataFilesPXP() + WAVE/T nwbFiles = GetHistoricDataFilesNWB() + + Concatenate/FREE/NP/T {pxpFiles, nwbFiles}, files + + DownloadFilesIfRequired(files) + SetLabelsForDGWave(files) + + return files +End + +Function/WAVE GetHistoricDataFilesPXP() + Make/FREE/T files = {"C57BL6J-629713.05.01.02.pxp", \ "Chat-IRES-Cre-neo;Ai14-582723.15.10.01.pxp", \ "Pvalb-IRES-Cre;Ai14-646904.13.03.02.pxp", \ "Sst-IRES-Cre;Ai14-554002.08.06.02.pxp", \ "Sst-IRES-Cre;Th-P2A-FlpO;Ai65-561491.09.09.02.pxp", \ "very_early_mies-data_H17.03.016.11.09.01.pxp", \ - "epoch_clipping_2022_03_08_140256.pxp", \ - "nwb2_H17.03.016.11.09.01.nwb", \ - "C57BL6J-628261.02.01.02.nwb", \ - "Gad2-IRES-Cre;Ai14-709273.06.02.02.nwb", \ + "epoch_clipping_2022_03_08_140256.pxp"} + + DownloadFilesIfRequired(files) + SetLabelsForDGWave(files) + + return files +End + +Function/WAVE GetHistoricDataFilesNWB() + + Make/FREE/T files = {"nwb2_H17.03.016.11.09.01.nwb", \ + "C57BL6J-628261.02.01.02.nwb", \ + "Gad2-IRES-Cre;Ai14-709273.06.02.02.nwb", \ "H22.03.311.11.08.01.06.nwb"} DownloadFilesIfRequired(files) From 07e3642210bcbe5fb117b04d74043f0fbb09c8fe Mon Sep 17 00:00:00 2001 From: Michael Huth Date: Thu, 25 Apr 2024 20:31:00 +0200 Subject: [PATCH 8/8] Tests: Include ^U_ prefix and $ suffix in regex for user epoch recreation test --- Packages/MIES/MIES_Constants.ipf | 2 +- Packages/tests/UTF_HelperFunctions.ipf | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Packages/MIES/MIES_Constants.ipf b/Packages/MIES/MIES_Constants.ipf index e6071c1bc3..27e0bb048d 100644 --- a/Packages/MIES/MIES_Constants.ipf +++ b/Packages/MIES/MIES_Constants.ipf @@ -1120,7 +1120,7 @@ Constant PSQ_CALC_METHOD_RMS = 0x2 // root-mean-square (rms) Constant PSQ_BL_FAILED = 1 StrConstant PSQ_BASELINE_CHUNK_SHORT_NAME_PREFIX = "BLC" -StrConstant PSQ_BASELINE_CHUNK_SHORT_NAME_RE_MATCHER = "BLC[[:digit:]]+" +StrConstant PSQ_BASELINE_CHUNK_SHORT_NAME_RE_MATCHER = "^U_BLC[[:digit:]]+$" /// @} /// @name PatchSeq labnotebook constants diff --git a/Packages/tests/UTF_HelperFunctions.ipf b/Packages/tests/UTF_HelperFunctions.ipf index c242ee0cb2..03a8f5672c 100644 --- a/Packages/tests/UTF_HelperFunctions.ipf +++ b/Packages/tests/UTF_HelperFunctions.ipf @@ -1141,12 +1141,11 @@ static Function TestEpochRecreationRemoveUnsupportedUserEpochs(WAVE/T epochChann string shortName, supportedUserEpochsRegExp string regexpUserEpochs = "^" + EPOCH_SHORTNAME_USER_PREFIX + ".*" - Make/FREE/T supportedUserEpochs = {"CR_CE", "CR_SE"} + Make/FREE/T supportedUserEpochs = {"^U_CR_CE$", "^U_CR_SE$"} Make/FREE/T psqChirpEpochs = {PSQ_BASELINE_CHUNK_SHORT_NAME_RE_MATCHER} if(type == PSQ_CHIRP) Concatenate/FREE/T/NP {psqChirpEpochs}, supportedUserEpochs endif - supportedUserEpochs[] = "^" + EPOCH_SHORTNAME_USER_PREFIX + supportedUserEpochs[p] supportedUserEpochsRegExp = TextWaveToList(supportedUserEpochs, "|") supportedUserEpochsRegExp = RemoveEnding(supportedUserEpochsRegExp, "|") supportedUserEpochsRegExp = "^(?![\s\S]*" + supportedUserEpochsRegExp + ")[\s\S]*$"