From c4bd8b4f80a5c54560dcb471c7729673833c1db9 Mon Sep 17 00:00:00 2001 From: Yves Gouriou <yves.gouriou@ird.fr> Date: Wed, 25 Mar 2009 17:55:08 +0000 Subject: [PATCH] La variable ADJUSTED est calcule en utilisant : soit la variable SSPS ou SSJT, SSTP soit les variables _CAL si elles existent. --- TSGQC_amelioration.xls | Bin 25600 -> 25600 bytes tsg_data/DATA_FORMAT_TSG_V1-6.nc | Bin 1803596 -> 1803596 bytes tsg_util/corTsgLinear.m | 43 ++++++++++++++------------- tsg_util/corTsgMedian.m | 21 ++++++++------ tsg_util/diffTsgSample.m | 19 +++++++++--- tsg_util/plot_Correction.m | 48 ++++++++++++++++++------------- tsg_util/tsg_average.m | 24 ++++++++++------ tsgqc.m | 45 ++++++++++++++--------------- 8 files changed, 115 insertions(+), 85 deletions(-) diff --git a/TSGQC_amelioration.xls b/TSGQC_amelioration.xls index 3aededec1253305dc644757f578c597baa9e5077..90ebe87f65f6276904ba0446e0f439ebd2d18069 100644 GIT binary patch delta 3911 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 delta 3878 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 Dxrh!J diff --git a/tsg_data/DATA_FORMAT_TSG_V1-6.nc b/tsg_data/DATA_FORMAT_TSG_V1-6.nc index 44430545a6b479c390a6c49761841f8203673750..2ae81e21b06bea2dba3ba8c4609beeb5e8fab7e7 100644 GIT binary patch delta 168 zcmX@pm3O8qZ^L<Jc2h$$LklCr=4;ID*O(cBm<fnMY!)D91!6WJW(Q&pAm-eDjhTz@ z@%9B~95GL)Kk#OiXpcC<4a7X#BhK*pyh4_cn8V*LF-HK11%X&-yTlw}1+Mlh>&1as qV*8c#k}(^$UzpB&OJw^6arS1F_K*EyKr9Z#5<o1u{bRpW^j81?8AjUx delta 177567 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 P`f`1B^zzBqKmPMC8)%ni diff --git a/tsg_util/corTsgLinear.m b/tsg_util/corTsgLinear.m index e5c2375..991cd75 100644 --- a/tsg_util/corTsgLinear.m +++ b/tsg_util/corTsgLinear.m @@ -4,7 +4,10 @@ function [error] = corTsgLinear(hMainFig, PARA, dateMin, dateMax) % % Input % hMainFig ..... Handle to the main GUI -% PARA ......... Parameter +% PARA ..........Cell array +% PARA{1} contains the characters (SSP, SSJT, SSTP) +% PARA{2} contains either the cahracters (SSPS, SSJT, SSTP) +% or (SSPS_CAL, SSJT_CAL, SSTP_CAL) % dateMin ...... the correction is applied between dateMin and date Max % dateMax ...... the correction is applied between dateMin and date Max % @@ -66,10 +69,10 @@ VALUE_CHANGED = tsg.qc.hash.VALUE_CHANGED.code; % Intialisation % 01/09/2009 : intialisation to NaN % --------------------------------- -if isempty( tsg.([PARA '_ADJUSTED']) ) - tsg.([PARA '_ADJUSTED']) = NaN*ones(size(tsg.(PARA))); - tsg.([PARA '_ADJUSTED_QC']) = NaN*ones(size(tsg.([PARA '_QC']))); - tsg.([PARA '_ADJUSTED_ERROR']) = NaN*ones(size(tsg.(PARA))); +if isempty( tsg.([PARA{1} '_ADJUSTED']) ) + tsg.([PARA{1} '_ADJUSTED']) = NaN*ones(size(tsg.(PARA{1}))); + tsg.([PARA{1} '_ADJUSTED_QC']) = NaN*ones(size(tsg.([PARA{1} '_QC']))); + tsg.([PARA{1} '_ADJUSTED_ERROR']) = NaN*ones(size(tsg.(PARA{1}))); end if dateMax > dateMin @@ -77,7 +80,7 @@ if dateMax > dateMin % Find samples within TIME_WINDOWS with Good, probably Good, QC % ------------------------------------------------------------- ind = find( tsg.DAYD_EXT >= dateMin & tsg.DAYD_EXT <= dateMax &... - tsg.([SAMPLE '_EXT_QC']) <= PROBABLY_GOOD); + tsg.([SAMPLE '_EXT_QC']) <= PROBABLY_GOOD); if ~isempty(ind) @@ -102,24 +105,24 @@ if dateMax > dateMin % ------------------------------------------------------------------------ for icode = 1 : length( keptCode ) dtTsg = find( tsg.DAYD >= dateMin & tsg.DAYD <= dateMax &... - tsg.([PARA '_QC']) == keptCode( icode )); + tsg.([PARA{1} '_QC']) == keptCode( icode )); if ~isempty( dtTsg ) % Compute the correction + the error % ---------------------------------- - [tsg.([PARA '_ADJUSTED'])(dtTsg),... - tsg.([PARA '_ADJUSTED_ERROR'])(dtTsg)] =... + [tsg.([PARA{1} '_ADJUSTED'])(dtTsg),... + tsg.([PARA{1} '_ADJUSTED_ERROR'])(dtTsg)] =... polyval( p, tsg.DAYD(dtTsg), S, mu); % Compute the corrected value : orignal value + correction % -------------------------------------------------------- - tsg.([PARA '_ADJUSTED'])(dtTsg) =... - tsg.(PARA)(dtTsg) + tsg.([PARA '_ADJUSTED'])(dtTsg); + tsg.([PARA{1} '_ADJUSTED'])(dtTsg) =... + tsg.(PARA{2})(dtTsg) + tsg.([PARA{1} '_ADJUSTED'])(dtTsg); % Transfer the QC % --------------- - tsg.([PARA '_ADJUSTED_QC'])(dtTsg) = tsg.([PARA '_QC'])(dtTsg); + tsg.([PARA{1} '_ADJUSTED_QC'])(dtTsg) = tsg.([PARA{1} '_QC'])(dtTsg); end end @@ -134,12 +137,12 @@ if dateMax > dateMin % ------------------------------------------------------------------------ for icode = 1 : length( keptCode ) dtTsg = find( tsg.DAYD >= dateMin & tsg.DAYD <= dateMax &... - tsg.([PARA '_QC']) == keptCode( icode )); + tsg.([PARA{1} '_QC']) == keptCode( icode )); if ~isempty( dtTsg ) - tsg.([PARA '_ADJUSTED'])(dtTsg) = tsg.(PARA)(dtTsg) + meanDif; - tsg.([PARA '_ADJUSTED_ERROR'])(dtTsg) = meanDif / 2; - tsg.([PARA '_ADJUSTED_QC'])(dtTsg) = tsg.([PARA '_QC'])(dtTsg); + tsg.([PARA{1} '_ADJUSTED'])(dtTsg) = tsg.(PARA{2})(dtTsg) + meanDif; + tsg.([PARA{1} '_ADJUSTED_ERROR'])(dtTsg) = meanDif / 2; + tsg.([PARA{1} '_ADJUSTED_QC'])(dtTsg) = tsg.([PARA{1} '_QC'])(dtTsg); end end @@ -148,11 +151,11 @@ if dateMax > dateMin % The error minimum cannot be lower than 0.01 or equal to Inf % ----------------------------------------------------------- if ~isempty(ind2) && length(ind2) >= 2 - tsg.([PARA '_ADJUSTED_ERROR'])... - ( tsg.([PARA '_ADJUSTED_ERROR']) < 0.01 ) = 0.01; + tsg.([PARA{1} '_ADJUSTED_ERROR'])... + ( tsg.([PARA{1} '_ADJUSTED_ERROR']) < 0.01 ) = 0.01; - tsg.([PARA '_ADJUSTED_ERROR'])... - (isinf(tsg.([PARA '_ADJUSTED_ERROR'])) == 1) = 0.01; + tsg.([PARA{1} '_ADJUSTED_ERROR'])... + (isinf(tsg.([PARA{1} '_ADJUSTED_ERROR'])) == 1) = 0.01; end % end end diff --git a/tsg_util/corTsgMedian.m b/tsg_util/corTsgMedian.m index f55e748..401c936 100644 --- a/tsg_util/corTsgMedian.m +++ b/tsg_util/corTsgMedian.m @@ -6,7 +6,10 @@ function [error] = corTsgMedian(hMainFig, PARA, dateMin, dateMax) % % Input % hMainFig ..... Handle to the main GUI -% PARA ......... Parameter (SSPS, SSJT, SSTP) +% PARA ..........Cell array +% PARA{1} contains the characters (SSP, SSJT, SSTP) +% PARA{2} contains either the cahracters (SSPS, SSJT, SSTP) +% or (SSPS_CAL, SSJT_CAL, SSTP_CAL) % dateMin ...... the correction is applied between dateMin and date Max % dateMax ...... the correction is applied between dateMin and date Max % @@ -62,10 +65,10 @@ VALUE_CHANGED = tsg.qc.hash.VALUE_CHANGED.code; % intialisation % ------------- -if isempty( tsg.([PARA '_ADJUSTED']) ) - tsg.([PARA '_ADJUSTED']) = NaN*ones(size(tsg.(PARA))); - tsg.([PARA '_ADJUSTED_QC']) = NaN*ones(size(tsg.([PARA '_QC']))); - tsg.([PARA '_ADJUSTED_ERROR']) = NaN*ones(size(tsg.(PARA))); +if isempty( tsg.([PARA{1} '_ADJUSTED']) ) + tsg.([PARA{1} '_ADJUSTED']) = NaN*ones(size(tsg.(PARA{1}))); + tsg.([PARA{1} '_ADJUSTED_QC']) = NaN*ones(size(tsg.([PARA{1} '_QC']))); + tsg.([PARA{1} '_ADJUSTED_ERROR']) = NaN*ones(size(tsg.(PARA{1}))); end % Create a structure with an NaN @@ -185,13 +188,13 @@ if dateMax > dateMin % ---------------------------------------------------------------------- for icode = 1 : length( keptCode ) dtTsg = find( tsg.DAYD >= dateMin & tsg.DAYD <= dateMax &... - tsg.([PARA '_QC']) == keptCode( icode )); + tsg.([PARA{1} '_QC']) == keptCode( icode )); - tsg.([PARA '_ADJUSTED'])(dtTsg) = tsg.(PARA)(dtTsg) + ... + tsg.([PARA{1} '_ADJUSTED'])(dtTsg) = tsg.(PARA{2})(dtTsg) + ... interp1(cor.DAYD, cor.DIFF, tsg.DAYD(dtTsg)); - tsg.([PARA '_ADJUSTED_ERROR'])(dtTsg) = ... + tsg.([PARA{1} '_ADJUSTED_ERROR'])(dtTsg) = ... interp1(cor.DAYD, cor.ERROR, tsg.DAYD(dtTsg)); - tsg.([PARA '_ADJUSTED_QC'])(dtTsg) = tsg.([PARA '_QC'])(dtTsg); + tsg.([PARA{1} '_ADJUSTED_QC'])(dtTsg) = tsg.([PARA{1} '_QC'])(dtTsg); end end diff --git a/tsg_util/diffTsgSample.m b/tsg_util/diffTsgSample.m index 0f4158b..d9a8784 100644 --- a/tsg_util/diffTsgSample.m +++ b/tsg_util/diffTsgSample.m @@ -1,12 +1,22 @@ function diffTsgSample(hMainFig, PARA) % % Co-location of sample and TSG measurements -% Compute the sample-TSG difference +% Compute the Sample - TSG difference +% +% The TSG value is either the raw parameter either the calibrated parameter +% depending if a calibration has been done. +% +% Input +% hMainFig ........ Handle to the main GUI : TSGQC +% PARA ............ Cell array +% PARA{1} contains the characters (SSP, SSJT, SSTP) +% PARA{2} contains either the cahracters (SSPS, SSJT, SSTP) +% or (SSPS_CAL, SSJT_CAL, SSTP_CAL) % % Get the tsg and sample structures from the application % ------------------------------------------------------ -tsg = getappdata( hMainFig, 'tsg_data'); +tsg = getappdata( hMainFig, 'tsg_data'); % Get PROBABLY_GOOD code % ---------------------- @@ -16,14 +26,14 @@ defaultValueCode = tsg.qc.hash.MISSING_VALUE.code; % For temperature : % IF PARA = 'SSJT' use 'SSTP' to get the samples % ---------------------------------------------- -SAMPLE = PARA; +SAMPLE = char( PARA{1} ); if strcmp( SAMPLE, 'SSJT') SAMPLE = 'SSTP'; end % Consider only tsg data with NO_CONTROL, GOOD and PROBABLY_GOOD code % ------------------------------------------------------------------- -indTsg = find( tsg.([PARA '_QC']) < defaultValueCode ); +indTsg = find( tsg.([PARA{1} '_QC']) < defaultValueCode ); if ~isempty( indTsg ) @@ -46,6 +56,7 @@ if ~isempty( indTsg ) % Keep the smooth TSG value % ------------------------- smooth = tsg_average(hMainFig, PARA, indMin); + if timeDiff(indMin) < tsg.cst.TSG_WS_TIMEDIFF && ~isnan(smooth) % The smooth TSG time series (tsg_moveaverage) is diff --git a/tsg_util/plot_Correction.m b/tsg_util/plot_Correction.m index 2bab3d7..9e766c2 100644 --- a/tsg_util/plot_Correction.m +++ b/tsg_util/plot_Correction.m @@ -1,4 +1,12 @@ function plot_Correction( hMainFig, hPlotAxes, PARA ) +% +% Input +% hMainFig ........ Handle to the main GUI : TSGQC +% hPlotAxes ....... Handle des axes +% PARA ............ Cell array +% PARA{1} contains the characters (SSP, SSJT, SSTP) +% PARA{2} contains either the cahracters (SSPS, SSJT, SSTP) +% or (SSPS_CAL, SSJT_CAL, SSTP_CAL) % Reinitialise plot 1 and 3 % ------------------------- @@ -27,7 +35,7 @@ if ~isempty( tsg.([SAMPLE '_EXT']) ) if ~isempty(indWS) plot_Tsg( hMainFig, hPlotAxes, 1, tsg.DAYD_EXT(indWS),... tsg.EXT_DIF(indWS), tsg.([SAMPLE '_EXT_QC'])(indWS),... - [PARA '_WS'],'','none','square',5); + [PARA{1} '_WS'],'','none','square',5); end % Plot other (external) samples @@ -36,68 +44,68 @@ if ~isempty( tsg.([SAMPLE '_EXT']) ) if ~isempty(indEXT) plot_Tsg( hMainFig, hPlotAxes, 1, tsg.DAYD_EXT(indEXT),... tsg.EXT_DIF(indEXT), tsg.([SAMPLE '_EXT_QC'])(indEXT),... - [PARA '_EXT'],'','none','o',5); + [PARA{1} '_EXT'],'','none','o',5); end end % Select the records CORRECTED % Records corrected have an error value % ------------------------------------------- -iERR = find( isnan(tsg.([PARA '_ADJUSTED_ERROR'])) == 0); +iERR = find( isnan(tsg.([PARA{1} '_ADJUSTED_ERROR'])) == 0); % Plot the difference tsg.SSPS_ADJUSTED-tsg.SSPS on axe 1 % but only for records that were corrected using Water Sample -% and but not corrected with the calibration coefficients. % ----------------------------------------------------------- if iERR ~= 0 plot_Tsg( hMainFig, hPlotAxes, 1,... tsg.DAYD(iERR),... - tsg.([PARA '_ADJUSTED'])(iERR)-tsg.(PARA)(iERR),... - [], [PARA '_ADJUSTED'],'b','none','.',1); + tsg.([PARA{1} '_ADJUSTED'])(iERR)-tsg.(PARA{2})(iERR),... + [], [PARA{1} '_ADJUSTED'],'b','none','.',1); end % **************************** AXE 2 *********************************** -% Plot SSPS, SSJT, SSTP and SAMPLE, with code color, on axe 2 +% Plot SAMPLE and SSPS (SSJT, SSTP) with code color, on axe 2 % ----------------------------------------------------------- -plot_Tsg( hMainFig, hPlotAxes, 2, tsg.DAYD, tsg.(PARA), tsg.([PARA '_QC']),... - PARA,'','none','*',2); - if ~isempty( tsg.([SAMPLE '_EXT']) ) ind = 1: length( tsg.([SAMPLE '_EXT_TYPE'])); indWS = strmatch( 'WS', tsg.([SAMPLE '_EXT_TYPE']), 'exact'); if ~isempty(indWS) plot_Tsg( hMainFig, hPlotAxes, 2, tsg.DAYD_EXT(indWS),... tsg.([SAMPLE '_EXT'])(indWS), tsg.([SAMPLE '_EXT_QC'])(indWS),... - [PARA '_WS'],'','none','square',5); + [PARA{1} '_WS'],'','none','square',5); end indEXT = setxor(ind, indWS); if ~isempty(indEXT) plot_Tsg( hMainFig, hPlotAxes, 2, tsg.DAYD_EXT(indEXT),... tsg.([SAMPLE '_EXT'])(indEXT), tsg.([SAMPLE '_EXT_QC'])(indEXT),... - [PARA '_EXT'],'','none','o',5); + [PARA{1} '_EXT'],'','none','o',5); end end +plot_Tsg( hMainFig, hPlotAxes, 2, tsg.DAYD, tsg.(PARA{2}), tsg.([PARA{1} '_QC']),... + PARA{2},'','none','*',2); + + % **************************** AXE 3 *********************************** % Plot SSPS, with no code, on axe3 % -------------------------------- -plot_Tsg( hMainFig, hPlotAxes, 3, tsg.DAYD, tsg.([PARA '_ADJUSTED']), [],... - [PARA '_ADJUSTED'],'r','none','*',2); +plot_Tsg( hMainFig, hPlotAxes, 3, tsg.DAYD, tsg.([PARA{1} '_ADJUSTED']), [],... + [PARA{1} '_ADJUSTED'],'r','none','*',2); -plot_Tsg( hMainFig, hPlotAxes, 3, tsg.DAYD, tsg.(PARA),... - [],PARA,'k','none','*',2); +plot_Tsg( hMainFig, hPlotAxes, 3, tsg.DAYD, tsg.(PARA{2}),... + [],PARA{2},'k','none','*',2); % Plot TSG_ADJUSTED + ERROR on axe 3 % ----------------------------------- if iERR ~= 0 plot_Tsg( hMainFig, hPlotAxes, 3, tsg.DAYD(iERR),... - tsg.([PARA '_ADJUSTED'])(iERR) + tsg.([PARA '_ADJUSTED_ERROR'])(iERR),... - [], [PARA '_ADJUSTED'],'g','none','*',2); + tsg.([PARA{1} '_ADJUSTED'])(iERR) + tsg.([PARA{1} '_ADJUSTED_ERROR'])(iERR),... + [], [PARA{1} '_ADJUSTED'],'g','none','*',2); plot_Tsg( hMainFig, hPlotAxes, 3, tsg.DAYD(iERR),... - tsg.([PARA '_ADJUSTED'])(iERR) - tsg.([PARA '_ADJUSTED_ERROR'])(iERR),... - [], [PARA '_ADJUSTED'],'g','none','*',2); + tsg.([PARA{1} '_ADJUSTED'])(iERR) - tsg.([PARA{1} '_ADJUSTED_ERROR'])(iERR),... + [], [PARA{1} '_ADJUSTED'],'g','none','*',2); end end diff --git a/tsg_util/tsg_average.m b/tsg_util/tsg_average.m index 4464827..ffe8d9e 100644 --- a/tsg_util/tsg_average.m +++ b/tsg_util/tsg_average.m @@ -6,7 +6,13 @@ function [smooth] = tsg_average(hMainFig, PARA, iTsg) % are not taken into account. % % Input -% hMainFig ............ Handle to the main user interface +% hMainFig ........ Handle to the main GUI : TSGQC +% PARA ............ Cell array +% PARA{1} contains the characters (SSP, SSJT, SSTP) +% PARA{2} contains either the cahracters (SSPS, SSJT, SSTP) +% or (SSPS_CAL, SSJT_CAL, SSTP_CAL) +% iTsg ............ Indice of the TSG measurement the closest to the sample +% taking into account the TSG quality code % % No computation : NaN % @@ -20,7 +26,7 @@ tsg = getappdata( hMainFig, 'tsg_data'); % ind2 : indices of tsg.PARA not rejected by the S.D. test % ----------------------------------------------------------------------- ind1 = find( tsg.DAYD >= tsg.DAYD(iTsg) - tsg.cst.TSG_DT_SMOOTH/2 & ... - tsg.DAYD <= tsg.DAYD(iTsg) + tsg.cst.TSG_DT_SMOOTH/2 ); + tsg.DAYD <= tsg.DAYD(iTsg) + tsg.cst.TSG_DT_SMOOTH/2 ); ind2 = ind1; if ~isempty(ind2) @@ -30,22 +36,22 @@ if ~isempty(ind2) % Compare Standard Deviation to the MAX acceptable STD % ---------------------------------------------------- - while currentStd > tsg.([PARA '_STDMAX']) && currentStd ~= previousStd + while currentStd > tsg.([PARA{1} '_STDMAX']) && currentStd ~= previousStd previousStd = currentStd; % Standard deviation and average over timeInterval % ------------------------------------------------ - currentStd = nanstd( tsg.(PARA)(ind2) ); - meanParam = nanmean( tsg.(PARA)(ind2) ); + currentStd = nanstd( tsg.(PARA{2})(ind2) ); + meanParam = nanmean( tsg.(PARA{2})(ind2) ); - % Indices of 'good' values of Param + % Indices of 'good' values of Para % --------------------------------- - ind2 = ind1( tsg.(PARA)(ind1) >= meanParam - currentStd & ... - tsg.(PARA)(ind1) <= meanParam + currentStd ); + ind2 = ind1( tsg.(PARA{2})(ind1) >= meanParam - currentStd & ... + tsg.(PARA{2})(ind1) <= meanParam + currentStd ); end - smooth = nanmean( tsg.(PARA)(ind2) ); + smooth = nanmean( tsg.(PARA{2})(ind2) ); else smooth = NaN; diff --git a/tsgqc.m b/tsgqc.m index 6d4ba5c..d5c3fee 100644 --- a/tsgqc.m +++ b/tsgqc.m @@ -2384,12 +2384,7 @@ hrbInterpCancel = uicontrol( ... % Get the parameter we are working on (SSPS, SSJT, SSTP) % ------------------------------------------------------ SAMPLE = tsg.plot.sample; - PARA = tsg.plot.parameter{1}; -% % test if _CAL variable exist -% % --------------------------- -% if ~isempty( tsg.([PARA '_CAL']) ) -% PARA = [PARA '_CAL']; -% end + PARA = getParaCorModule( hMainFig ); % Switch somme buttons % -------------------- @@ -2506,25 +2501,21 @@ hrbInterpCancel = uicontrol( ... tsg = getappdata(hMainFig, 'tsg_data'); % Get parameter we are working on (SSPS, SSJT, SSTP) - % -------------------------------------------------- - PARA = tsg.plot.parameter{1}; + % or SSPS_CAL, SSJT_CAL, SSTP_CAL + % ------------------------------------------------- + PARA = getParaCorModule( hMainFig ); % To cancel the correction set the ADJUSTED variable % to [] % -------------------------------------------------- - tsg.([PARA '_ADJUSTED']) = []; - tsg.([PARA '_ADJUSTED_QC']) = []; - tsg.([PARA '_ADJUSTED_ERROR']) = []; + tsg.([PARA{1} '_ADJUSTED']) = []; + tsg.([PARA{1} '_ADJUSTED_QC']) = []; + tsg.([PARA{1} '_ADJUSTED_ERROR']) = []; % Save tsg data % ------------- setappdata(hMainFig, 'tsg_data', tsg); - % Set the ADJUSTED variable either to the raw variable or to - % the calibrated variable - % ---------------------------------------------------------- - % updateAdjustedVariable( hMainFig ); - % Plot in the 3 axes % ------------------ plot_Correction( hMainFig, hPlotAxes, PARA ); @@ -2548,10 +2539,14 @@ hrbInterpCancel = uicontrol( ... dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS'); dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS'); - % Get the parameter (SSPS, SSJT, or SSTP) - % --------------------------------------- + % Get tsg application data + % ------------------------ tsg = getappdata(hMainFig, 'tsg_data'); - PARA = tsg.plot.parameter{1}; + + % Get parameter we are working on (SSPS, SSJT, SSTP) + % or SSPS_CAL, SSJT_CAL, SSTP_CAL + % ------------------------------------------------- + PARA = getParaCorModule( hMainFig ); SAMPLE = tsg.plot.sample; if ~isempty( tsg.([SAMPLE '_EXT']) ) @@ -2598,10 +2593,14 @@ hrbInterpCancel = uicontrol( ... dateMin = datenum(get( hetDateMin, 'String'), 'yyyy-mm-dd HH:MM:SS'); dateMax = datenum(get( hetDateMax, 'String'), 'yyyy-mm-dd HH:MM:SS'); - % Get the parameter (SSPS, SSJT, or SSTP) - % --------------------------------------- - tsg = getappdata(hMainFig, 'tsg_data'); - PARA = tsg.plot.parameter{1}; + % Get tsg application data + % ------------------------ + tsg = getappdata(hMainFig, 'tsg_data'); + + % Get parameter we are working on (SSPS, SSJT, SSTP) + % or SSPS_CAL, SSJT_CAL, SSTP_CAL + % ------------------------------------------------- + PARA = getParaCorModule( hMainFig ); SAMPLE = tsg.plot.sample; if ~isempty( tsg.([SAMPLE '_EXT']) ) -- GitLab