diff --git a/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf b/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf index f87baea78a..36b30cdefe 100644 --- a/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf +++ b/Packages/MIES/MIES_AnalysisFunctions_PatchSeq.ipf @@ -1845,7 +1845,7 @@ End /// /// @retval fitOffset offsets of all line fits /// @retval fitSlope slopes of all line fits -static Function [WAVE fitOffset, WAVE fitSlope] PSQ_DS_FitFrequencyCurrentData(string device, variable sweepNo, WAVE apfreq, WAVE DAScales, variable numPointsForLineFit) +static Function [WAVE/D fitOffset, WAVE/D fitSlope] PSQ_DS_FitFrequencyCurrentData(string device, variable sweepNo, WAVE apfreq, WAVE DAScales, variable numPointsForLineFit) variable i, numPoints, numFits, first, last, hasEnoughPoints, initialFit string line, databrowser, key @@ -1905,7 +1905,7 @@ static Function [WAVE fitOffset, WAVE fitSlope] PSQ_DS_FitFrequencyCurrentData(s WAVE/T textualResultsValues = BSP_GetLogbookWave(databrowser, LBT_RESULTS, LBN_TEXTUAL_VALUES, selectedExpDevice = 1) - Make/FREE/N=(numFits) fitOffset, fitSlope + Make/FREE/D/N=(numFits) fitOffset, fitSlope for(i = 0; i < numFits; i += 1) sprintf key, "Sweep Formula store [Fit result %d]", i WAVE/Z fitResult = PSQ_GetSweepFormulaResultWave(textualResultsValues, key, sweepNo) @@ -1984,7 +1984,7 @@ End /// smaller than `maxFrequencyChangePercent`. static Function/WAVE PSQ_DS_GatherOvershootCorrection(WAVE apfreqParam, WAVE DAScalesParam, variable maxFrequencyChangePercent) - variable numEntries, numIterations, x, xp, y, yp, idx, i, xm + variable numEntries, numIterations, x, xp, y, yp, idx, i, xm, frac string msg Duplicate/FREE apfreqParam, apfreq @@ -2006,7 +2006,9 @@ static Function/WAVE PSQ_DS_GatherOvershootCorrection(WAVE apfreqParam, WAVE DAS y = apfreq[i] yp = apfreq[i + 1] - if(yp > (y * (1 + maxFrequencyChangePercent * PERCENT_TO_ONE))) + frac = yp / y - 1 + + if(frac > (maxFrequencyChangePercent * PERCENT_TO_ONE)) x = DAScales[i] xp = DAScales[i + 1] xm = (xp + x) / 2 @@ -2016,7 +2018,7 @@ static Function/WAVE PSQ_DS_GatherOvershootCorrection(WAVE apfreqParam, WAVE DAS EnsureLargeEnoughWave(results, indexShouldExist = idx) ASSERT(yp > y, "Incorrect data ordering") - sprintf msg, "adding DAScale entry: xm=%g, [x, xp]=[%g, %g], idx=%g", xm, x, xp, idx + sprintf msg, "adding DAScale entry: xm=%g, [x, xp]=[%g, %g], [y, yp]=[%g, %g], frac=%g, maxFreqChangePerc=%g, idx=%g", xm, x, xp, y, yp, frac, maxFrequencyChangePercent, idx DEBUGPRINT(msg) results[idx] = xm @@ -3217,7 +3219,7 @@ Function PSQ_DAScale(device, s) // we only want to calculate new DAScale values for passing sweeps // and if the initial FI slope is invalid we only need to measure futureDAScale values DAScalesIndex[s.headstage] += 1 - + dascale = PSQ_DS_CalculateDAScale(fitOffset, fitSlope, apfreq, maxFrequencyChangePercent) Make/FREE/D DAScaleNew = {dascale} Concatenate/NP=(ROWS) {DAScaleNew}, futureDAScales diff --git a/Packages/tests/HardwareAnalysisFunctions/UTF_PatchSeqDAScale_Adapt.ipf b/Packages/tests/HardwareAnalysisFunctions/UTF_PatchSeqDAScale_Adapt.ipf index b32938c5a1..1a34c97dd4 100644 --- a/Packages/tests/HardwareAnalysisFunctions/UTF_PatchSeqDAScale_Adapt.ipf +++ b/Packages/tests/HardwareAnalysisFunctions/UTF_PatchSeqDAScale_Adapt.ipf @@ -197,6 +197,9 @@ static Function/WAVE GetEntries_IGNORE(string device, variable sweepNo) wv[%validSlopePass] = GetLBNSingleEntry_IGNORE(device, sweepNo, PSQ_FMT_LBN_DA_AT_VALID_SLOPE_PASS) wv[%initialValidSlopePass] = GetLBNSingleEntry_IGNORE(device, sweepNo, PSQ_FMT_LBN_DA_AT_INIT_VALID_SLOPE_PASS) + Make/Free/N=(DimSize(wv, ROWS)) junk + junk[] = WaveExists(wv[p]) ? ChangeFreeWaveName(wv[p], GetDimLabel(wv, ROWS, p)) : NaN + return wv End @@ -214,26 +217,29 @@ static Function [WAVE apFreqRef, WAVE apfreqFromSupra, WAVE DAScalesFromSupra] E return [apFreqRef, apfreqFromSupra, DAScalesFromSupra] End -// WAVE wv = entries[%maxSlope] -// print/D wv -// -// WAVE wv = entries[%fiSlope] -// print/D wv -// -// WAVE wv = entries[%fiOffset] -// print/D wv -// -// WAVE wv = entries[%futureDAScales] -// print/D wv -// -// WAVE wv = entries[%fiSlopesFromSupra] -// print/D wv -// -// WAVE wv = entries[%fiOffsetsFromSupra] -// print/D wv -// -// WAVE wv = entries[%dascale] -// print/D wv +static Function PrintSomeValues(WAVE/WAVE entries) + + WAVE wv = entries[%maxSlope] + print/D wv + + WAVE wv = entries[%fiSlope] + print/D wv + + WAVE wv = entries[%fiOffset] + print/D wv + + WAVE wv = entries[%futureDAScales] + print/D wv + + WAVE wv = entries[%fiSlopesFromSupra] + print/D wv + + WAVE wv = entries[%fiOffsetsFromSupra] + print/D wv + + WAVE wv = entries[%dascale] + print/D wv +End static Function PS_DS_AD1_preAcq(string device) @@ -242,6 +248,8 @@ static Function PS_DS_AD1_preAcq(string device) // SamplingMultiplier, SamplingFrequency use defaults + AFH_AddAnalysisParameter("PSQ_DaScale_Adapt_DA_0", "MaxFrequencyChangePercent", var=25) + // use defaults for the rest Make/FREE asyncChannels = {2, 4} @@ -254,7 +262,7 @@ static Function PS_DS_AD1_preAcq(string device) JWN_SetWaveInWaveNote(overrideResults, "PassingSupraSweep", {7}) JWN_SetWaveInWaveNote(overrideResults, "PassingSupraSweeps", {4, 5, 6, 7}) - Make/FREE/D daScalesFromSupra = {1e-3, 2e-3, 3e-3, 4e-3} + Make/FREE/D daScalesFromSupra = {1, 2, 3, 4} JWN_SetWaveInWaveNote(overrideResults, "DAScalesSupra", daScalesFromSupra) Make/FREE/D apFrequenciesFromSupra = {10, 11, 13, 16} @@ -305,16 +313,16 @@ static Function PS_DS_AD1_REENTRY([string str]) CHECK_EQUAL_WAVES(entries[%apfreqFromSupra], apFreqFromSupra, mode = WAVE_DATA) CHECK_EQUAL_WAVES(entries[%dascaleFromSupra], DAScalesFromSupra, mode = WAVE_DATA) - Make/FREE/D maxSlopeRef = {3.000000106112566e-07 ,3.000000106112566e-07, 3.000000106112566e-07} - Make/FREE/D fiSlopeRef = {3.000000106112566e-07, 3.000000106112566e-07, 3.000000106112566e-07} + Make/FREE/D maxSlopeRef = {2.999999970665357e-10 ,2.999999970665357e-10, 2.999999970665357e-10} + Make/FREE/D fiSlopeRef = {2.999999970665357e-10, 2.999999970665357e-10, 2.999999970665357e-10} Make/FREE/D fiOffsetRef = {4, 4, 4} - Make/FREE/T futureDAScalesRef = {"0.00495999982456056;", \ - "0.00495999982456056;", \ - "0.00495999982456056;"} + Make/FREE/T futureDAScalesRef = {"5.22666666666667;", \ + "5.22666666666667;", \ + "5.22666666666667;"} - Make/FREE/D fiSlopesFromSupraRef = {1e-07, 2e-07, 3e-07} + Make/FREE/D fiSlopesFromSupraRef = {1e-07, 2e-10, 3e-10} Make/FREE/D fiOffsetsFromSupraRef = {9, 7, 4} - Make/FREE/D DAScalesRef = {0.004959999824560564, 0.004959999824560559, 0.004959999824560559} + Make/FREE/D DAScalesRef = {5.226666666666667, 5.226666666666667, 5.226666666666667} CHECK_EQUAL_WAVES(entries[%maxSlope], maxSlopeRef, mode = WAVE_DATA, tol = 1e-14) CHECK_EQUAL_WAVES(entries[%fiSlope], fiSlopeRef, mode = WAVE_DATA, tol = 1e-14) @@ -334,6 +342,8 @@ static Function PS_DS_AD2_preAcq(string device) // SamplingMultiplier, SamplingFrequency use defaults + AFH_AddAnalysisParameter("PSQ_DaScale_Adapt_DA_0", "MaxFrequencyChangePercent", var=25) + // use defaults for the rest Make/FREE asyncChannels = {2, 4} @@ -346,7 +356,7 @@ static Function PS_DS_AD2_preAcq(string device) JWN_SetWaveInWaveNote(overrideResults, "PassingSupraSweep", {7}) JWN_SetWaveInWaveNote(overrideResults, "PassingSupraSweeps", {4, 5, 6, 7}) - Make/FREE/D daScalesFromSupra = {1e-3, 2e-3, 3e-3, 4e-3} + Make/FREE/D daScalesFromSupra = {1, 2, 3, 4} JWN_SetWaveInWaveNote(overrideResults, "DAScalesSupra", daScalesFromSupra) Make/FREE/D apFrequenciesFromSupra = {10, 11, 13, 16} @@ -397,14 +407,14 @@ static Function PS_DS_AD2_REENTRY([string str]) CHECK_EQUAL_WAVES(entries[%apfreqFromSupra], apFreqFromSupra, mode = WAVE_DATA) CHECK_EQUAL_WAVES(entries[%dascaleFromSupra], DAScalesFromSupra, mode = WAVE_DATA) - Make/FREE/D maxSlopeRef = {3.000000106112566e-07} - Make/FREE/D fiSlopeRef = {1.041666841672395e-08} - Make/FREE/D fiOffsetRef = {15.58333301544189} - Make/FREE/T futureDAScalesRef = {"0.00495999982456056;"} + Make/FREE/D maxSlopeRef = {3e-10} + Make/FREE/D fiSlopeRef = {8.15217391304348e-12} + Make/FREE/D fiOffsetRef = {15.67391304347826} + Make/FREE/T futureDAScalesRef = {"5.22666666666667;"} - Make/FREE/D fiSlopesFromSupraRef = {1e-07, 2e-07, 3e-07} + Make/FREE/D fiSlopesFromSupraRef = {1e-10, 2e-10, 3e-10} Make/FREE/D fiOffsetsFromSupraRef = {9, 7, 4} - Make/FREE/D DAScalesRef = {0.00495999982456056} + Make/FREE/D DAScalesRef = {5.226666666666667} CHECK_EQUAL_WAVES(entries[%maxSlope], maxSlopeRef, mode = WAVE_DATA, tol = 1e-12) CHECK_EQUAL_WAVES(entries[%fiSlope], fiSlopeRef, mode = WAVE_DATA, tol = 1e-14) @@ -424,6 +434,8 @@ static Function PS_DS_AD3_preAcq(string device) // SamplingMultiplier, SamplingFrequency use defaults + AFH_AddAnalysisParameter("PSQ_DaScale_Adapt_DA_0", "MaxFrequencyChangePercent", var=25) + // use defaults for the rest Make/FREE asyncChannels = {2, 4} @@ -436,7 +448,7 @@ static Function PS_DS_AD3_preAcq(string device) JWN_SetWaveInWaveNote(overrideResults, "PassingSupraSweep", {7}) JWN_SetWaveInWaveNote(overrideResults, "PassingSupraSweeps", {4, 5, 6, 7}) - Make/FREE/D daScalesFromSupra = {1e-3, 2e-3, 3e-3, 4e-3} + Make/FREE/D daScalesFromSupra = {1, 2, 3, 4} JWN_SetWaveInWaveNote(overrideResults, "DAScalesSupra", daScalesFromSupra) Make/FREE/D apFrequenciesFromSupra = {10, 11, 13, 16} @@ -491,14 +503,14 @@ static Function PS_DS_AD3_REENTRY([string str]) CHECK_EQUAL_WAVES(entries[%apfreqFromSupra], apFreqFromSupra, mode = WAVE_DATA) CHECK_EQUAL_WAVES(entries[%dascaleFromSupra], DAScalesFromSupra, mode = WAVE_DATA) - Make/FREE/D maxSlopeRef = {3.000000106112566e-07, 3.000000106112566e-07} - Make/FREE/D fiSlopeRef = {3.000000106112566e-07, 1.041666841672395e-08 } - Make/FREE/D fiOffsetRef = {4, 15.58333301544189} - Make/FREE/T futureDAScalesRef = {"0.00495999982456056;", ""} + Make/FREE/D maxSlopeRef = {3e-10, 3e-10} + Make/FREE/D fiSlopeRef = {3e-10, 8.152173913043478e-12 } + Make/FREE/D fiOffsetRef = {4, 15.67391304347826} + Make/FREE/T futureDAScalesRef = {"5.22666666666667;", ""} - Make/FREE/D fiSlopesFromSupraRef = {1e-07, 2e-07, 3e-07} + Make/FREE/D fiSlopesFromSupraRef = {1e-10, 2e-10, 3e-10} Make/FREE/D fiOffsetsFromSupraRef = {9, 7, 4} - Make/FREE/D DAScalesRef = {0.00495999982456056, 0.004959999824560559} + Make/FREE/D DAScalesRef = {5.226666666666667, 5.226666666666667} CHECK_EQUAL_WAVES(entries[%maxSlope], maxSlopeRef, mode = WAVE_DATA, tol = 1e-14) CHECK_EQUAL_WAVES(entries[%fiSlope], fiSlopeRef, mode = WAVE_DATA, tol = 1e-14) @@ -518,6 +530,8 @@ static Function PS_DS_AD4_preAcq(string device) // SamplingMultiplier, SamplingFrequency use defaults + AFH_AddAnalysisParameter("PSQ_DaScale_Adapt_DA_0", "MaxFrequencyChangePercent", var=25) + // use defaults for the rest Make/FREE asyncChannels = {2, 4} @@ -525,12 +539,13 @@ static Function PS_DS_AD4_preAcq(string device) SetAsyncChannelProperties(device, asyncChannels, -1e6, +1e6) + Make/O/N=0 root:overrideResults + WAVE/Z overrideResults = GetOverrideResults() CHECK_WAVE(overrideResults, NUMERIC_WAVE) - JWN_SetWaveInWaveNote(overrideResults, "PassingSupraSweep", {7}) JWN_SetWaveInWaveNote(overrideResults, "PassingSupraSweeps", {4, 5, 6, 7}) - Make/FREE/D daScalesFromSupra = {1e-3, 2e-3, 3e-3, 4e-3} + Make/FREE/D daScalesFromSupra = {1, 2, 3, 4} JWN_SetWaveInWaveNote(overrideResults, "DAScalesSupra", daScalesFromSupra) Make/FREE/D apFrequenciesFromSupra = {10, 11, 13, 16} @@ -563,6 +578,7 @@ static Function PS_DS_AD5_preAcq(string device) // SamplingMultiplier, SamplingFrequency use defaults AFH_AddAnalysisParameter("PSQ_DaScale_Adapt_DA_0", "NumPointsForLineFit", var=3) + AFH_AddAnalysisParameter("PSQ_DaScale_Adapt_DA_0", "MaxFrequencyChangePercent", var=25) // defaults for the rest @@ -576,7 +592,7 @@ static Function PS_DS_AD5_preAcq(string device) JWN_SetWaveInWaveNote(overrideResults, "PassingSupraSweep", {7}) JWN_SetWaveInWaveNote(overrideResults, "PassingSupraSweeps", {4, 5}) - Make/FREE/D daScalesFromSupra = {1e-3, 2e-3} + Make/FREE/D daScalesFromSupra = {1, 2} JWN_SetWaveInWaveNote(overrideResults, "DAScalesSupra", daScalesFromSupra) Make/FREE/D apFrequenciesFromSupra = {10, 11} @@ -607,6 +623,8 @@ static Function PS_DS_AD6_preAcq(string device) AFH_AddAnalysisParameter("PSQ_DaScale_Adapt_DA_0", "BaselineRMSShortThreshold", var=0.07) // SamplingMultiplier, SamplingFrequency use defaults + + AFH_AddAnalysisParameter("PSQ_DaScale_Adapt_DA_0", "MaxFrequencyChangePercent", var=25) // use defaults for the rest @@ -620,7 +638,7 @@ static Function PS_DS_AD6_preAcq(string device) JWN_SetWaveInWaveNote(overrideResults, "PassingSupraSweep", {7}) JWN_SetWaveInWaveNote(overrideResults, "PassingSupraSweeps", {4, 5, 6, 7}) - Make/FREE/D daScalesFromSupra = {1e-3, 2e-3, 3e-3, 4e-3} + Make/FREE/D daScalesFromSupra = {1, 2, 3, 4} JWN_SetWaveInWaveNote(overrideResults, "DAScalesSupra", daScalesFromSupra) // invalid initial valid fit QC @@ -637,7 +655,7 @@ static Function PS_DS_AD6([string str]) WAVE wv = PSQ_CreateOverrideResults(str, PSQ_TEST_HEADSTAGE, PSQ_DA_SCALE, opMode = PSQ_DS_ADAPT) // all tests pass - wv[][][%APFrequency] = 16.1 - 5 * q + wv[][][%APFrequency] = 7 - 5 * q wv[][][%AsyncQC] = 1 wv[][][%BaselineQC] = 1 End @@ -672,11 +690,11 @@ static Function PS_DS_AD6_REENTRY([string str]) CHECK_EQUAL_WAVES(entries[%apfreqFromSupra], apFreqFromSupra, mode = WAVE_DATA) CHECK_EQUAL_WAVES(entries[%dascaleFromSupra], DAScalesFromSupra, mode = WAVE_DATA) - Make/FREE/D maxSlopeRef = {2.000000023372195e-07} - Make/FREE/D fiSlopeRef = {8.132530204818522e-10} - Make/FREE/D fiOffsetRef = {7.967469692230225} + Make/FREE/D maxSlopeRef = {2e-10} + Make/FREE/D fiSlopeRef = {3.333333333333333e-11} + Make/FREE/D fiOffsetRef = {6.666666666666667} - Make/FREE/D fiSlopesFromSupraRef = {1e-07, 2e-07, -4.99999998737621e-07} + Make/FREE/D fiSlopesFromSupraRef = {1e-07, 2e-10, -5e-10} Make/FREE/D fiOffsetsFromSupraRef = {9, 7, 28} Make/FREE/D DAScalesRef = {1}