From 4eb6cfb8145389552321c6830729dd8663155c1d Mon Sep 17 00:00:00 2001 From: Jacques Grelet <jacques.grelet@ird.fr> Date: Tue, 27 Sep 2011 14:52:46 +0000 Subject: [PATCH] merge avec dev_concat et passage en V1.2 --- TSGQC_amelioration.xls | Bin 40960 -> 51200 bytes tsg_io/concatStructTSG.m | 332 +++++++++++++++++++++++++++++++++++++ tsg_io/readTsgIniLabview.m | 24 ++- tsg_io/read_data.m | 151 +++++++++++++++++ tsg_util/updateTsgStruct.m | 11 +- tsgqc.m | 81 +-------- 6 files changed, 511 insertions(+), 88 deletions(-) create mode 100644 tsg_io/concatStructTSG.m create mode 100644 tsg_io/read_data.m diff --git a/TSGQC_amelioration.xls b/TSGQC_amelioration.xls index d22eaac479daede8bd30552cb33c3ba44eca6518..52efdd34fd0a3391dcc6a098da9ad192b95a1b91 100644 GIT binary patch literal 51200 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 EzgXwcNdN!< delta 9797 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 diff --git a/tsg_io/concatStructTSG.m b/tsg_io/concatStructTSG.m new file mode 100644 index 0000000..0a92c15 --- /dev/null +++ b/tsg_io/concatStructTSG.m @@ -0,0 +1,332 @@ +function concatStructTSG( hMainFig, tsg_old ) +% +% Concatenate some elements of a TSG structure. Mainly : +% - TSG data members (DAYD, DATE, LATX, LONX, SSPS, SSJT, SSTP) +% - Discrete data (_EXT) members (DAYD, DATE, LATX, LONX, SSPS, SSTP) +% +% Right now, the function do not concatenate : +% - Calibration coefficent +% - '_HIST' +% - preference +% +% If the concatenanted TSG structures have identical dates, the double +% are supressed. +% +% This function is called by read_data.m + +% The function calls : +% concatNumTsg - At the end of this file +% concatInt8Tsg - At the end of this file +% supTsgDouble - At the end of this file +% supTsgExtDouble - At the end of this file +% +% Input +% hMainFig .... Handle to the main application +% tsg_old ..... TSG struct array, the first loaded in tsgqc. The data will +% be concatenated in this variable +% +% The tsg structure array to concatenate has been initialised in +% read_data and saved in the application data variable 'tsg_data'. +% +% $Id$ + +% Retrieve the new tsg struct that we want to concatenate +% ------------------------------------------------------- +tsg_new = getappdata( hMainFig, 'tsg_data' ); + +% Get NO_CONTROL code value +% ------------------------- +NO_CONTROL = tsg_old.qc.hash.NO_CONTROL.code; + +% Sort the date in ascending order. +% iOrder is used to sort the members of the strcture +% DAYD is not concatenated right now because the function concatNumTsg uses +% the variable DAYD to konw the size of the arrays. +% ---------------------------------------------------------------------- +DAYD = [tsg_old.DAYD; tsg_new.DAYD]; +[DAYD, iOrder] = sort(DAYD); + +% Concatenate the arrays +% ---------------------- +tsg_old.DATE = [tsg_old.DATE; tsg_new.DATE]; +tsg_old.DATE = tsg_old.DATE(iOrder,:); + +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'LATX'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'LONX'); +tsg_old = concatInt8Tsg( iOrder, NO_CONTROL, tsg_old, tsg_new, 'POSITION_QC'); +% +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SPDC'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'PRES'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'FLOW'); +% +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'CNDC'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'CNDC_STD'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'CNDC_CAL'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'CNDC_FREQ'); +% +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSJT'); +tsg_old = concatInt8Tsg( iOrder, NO_CONTROL, tsg_old, tsg_new, 'SSJT_QC'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSJT_STD'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSJT_CAL'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSJT_FREQ'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSJT_ADJUSTED'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSJT_ADJUSTED_ERROR'); +tsg_old = concatInt8Tsg( iOrder, NO_CONTROL, tsg_old, tsg_new, 'SSJT_ADJUSTED_QC'); +% % concatStrTsg( iOrder, tsg_old, tsg_new, 'SSJT_ADJUSTED_HIST'); +% +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSPS'); +tsg_old = concatInt8Tsg( iOrder, NO_CONTROL, tsg_old, tsg_new, 'SSPS_QC'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSPS_STD'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSPS_CAL'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSPS_ADJUSTED'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSPS_ADJUSTED_ERROR'); +tsg_old = concatInt8Tsg( iOrder, NO_CONTROL, tsg_old, tsg_new, 'SSPS_ADJUSTED_QC'); +% % concatStrTsg( iOrder, tsg_old, tsg_new, 'SSPS_ADJUSTED_HIST'); +% +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSTP'); +tsg_old = concatInt8Tsg( iOrder, NO_CONTROL, tsg_old, tsg_new, 'SSTP_QC'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSTP_CAL'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSTP_FREQ'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSTP_ADJUSTED'); +tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, 'SSTP_ADJUSTED_ERROR'); +tsg_old = concatInt8Tsg( iOrder, NO_CONTROL, tsg_old, tsg_new, 'SSTP_ADJUSTED_QC'); +% % concatStrTsg( iOrder, tsg_old, tsg_new, 'SSTP_ADJUSTED_HIST'); + +tsg_old.DAYD = DAYD; + +% Suppress double. Compare the dates +% ---------------------------------- +tsg_old = supTsgDouble(tsg_old); + +% Discrete samples +% ---------------- +tsg_old.DAYD_EXT = [tsg_old.DAYD_EXT; tsg_new.DAYD_EXT]; +tsg_old.DATE_EXT = [tsg_old.DATE_EXT; tsg_new.DATE_EXT]; +tsg_old.LATX_EXT = [tsg_old.LATX_EXT; tsg_new.LATX_EXT]; +tsg_old.LONX_EXT = [tsg_old.LONX_EXT; tsg_new.LONX_EXT]; +tsg_old.SSPS_EXT = [tsg_old.SSPS_EXT; tsg_new.SSPS_EXT]; +tsg_old.SSPS_EXT_BOTTLE = strvcat(tsg_old.SSPS_EXT_BOTTLE, tsg_new.SSPS_EXT_BOTTLE); +tsg_old.SSPS_EXT_QC = [tsg_old.SSPS_EXT_QC; tsg_new.SSPS_EXT_QC]; +tsg_old.SSPS_EXT_TYPE = strvcat(tsg_old.SSPS_EXT_TYPE, tsg_new.SSPS_EXT_TYPE); +tsg_old.SSPS_EXT_ANALDATE = strvcat(tsg_old.SSPS_EXT_ANALDATE,tsg_new.SSPS_EXT_ANALDATE); +tsg_old.SSTP_EXT = [tsg_old.SSTP_EXT; tsg_new.SSTP_EXT]; +tsg_old.SSTP_EXT_QC = [tsg_old.SSTP_EXT_QC; tsg_new.SSTP_EXT_QC]; +tsg_old.SSTP_EXT_TYPE = strvcat(tsg_old.SSTP_EXT_TYPE, tsg_new.SSTP_EXT_TYPE); + +if ~isempty(tsg_old.DAYD_EXT) + [tsg_old.DAYD_EXT, iOrder] = sort(tsg_old.DAYD_EXT); + tsg_old.DATE_EXT = tsg_old.DATE_EXT(iOrder,:); + tsg_old.LATX_EXT = tsg_old.LATX_EXT(iOrder); + tsg_old.LONX_EXT = tsg_old.LONX_EXT(iOrder); + tsg_old.SSPS_EXT = tsg_old.SSPS_EXT(iOrder); + tsg_old.SSPS_EXT_QC = tsg_old.SSPS_EXT_QC(iOrder); + tsg_old.SSPS_EXT_BOTTLE = tsg_old.SSPS_EXT_BOTTLE(iOrder,:); + tsg_old.SSPS_EXT_TYPE = tsg_old.SSPS_EXT_TYPE(iOrder,:); + tsg_old.SSPS_EXT_ANALDATE = tsg_old.SSPS_EXT_ANALDATE(iOrder,:); + tsg_old.SSTP_EXT = tsg_old.SSTP_EXT(iOrder); + tsg_old.SSTP_EXT_QC = tsg_old.SSTP_EXT_QC(iOrder); + tsg_old.SSTP_EXT_TYPE = tsg_old.SSTP_EXT_TYPE(iOrder,:); +end + +% Suppress Double. Compare the dates +% ---------------------------------- +tsg_old = supTsgExtDouble(tsg_old); + +setappdata( hMainFig, 'tsg_data', tsg_old ); + +end + +%% ************************************************************************ +function tsg_old = concatNumTsg( iOrder, tsg_old, tsg_new, Para) +% +% function concatNumTsg : Concatenate 2 numeric TSG arrays +% +% Input +% iOrder - Indicies to organise the array in time ascending order +% tsg_old - First TSG structure +% tsg_new - TSG structure that we want to concatenate +% Para - Member of the structures to concatenate +% +% Output +% tsg_old - TSG structure +% + +% If tsg_new.Para and tsg_old.Para are empty nothing is done +% ---------------------------------------------------------- +if isempty(tsg_new.(Para)) && isempty(tsg_old.(Para)) + return; + +% If only tsg_new.PARA is empty, fill it with NaN. The dimension of the +% final array must must be equal to the sum of the dimension of tsg.DAYD +% and tsg_old.DAYD +% ---------------------------------------------------------------------- +elseif isempty(tsg_new.(Para)) + tsg_new.(Para) = NaN * ones( size( tsg_new.DAYD ) ); + +% See preceding comment +% --------------------- +elseif isempty(tsg_old.(Para)) + tsg_old.(Para) = NaN * ones( size( tsg_old.DAYD ) ); +end + +% Concatenation +% ------------- +tsg_old.(Para) = [tsg_old.(Para); tsg_new.(Para)]; + +% Re-order the struct array +% ------------------------- +tsg_old.(Para) = tsg_old.(Para)(iOrder); + +end + +%% ************************************************************************* +function tsg_old = concatInt8Tsg( iOrder, NO_CONTROL, tsg_old, tsg_new, Para) +% +% function concatInt8Tsg : Concatenate 2 numeric int8 arrays +% +% Input +% iOrder - Indicies to organise the array in time ascending order +% NO_CONTROL - Value for no control quality code +% tsg_old - First TSG structure +% tsg_new - Second TSG structure +% Para - Member of the structures to concatenate +% +% Output +% tsg_old - TSG structure +% + +% If tsg_new.Para and tsg_old.Para are empty nothing is done +% ---------------------------------------------------------- +if isempty(tsg_new.(Para)) && isempty(tsg_old.(Para)) + return; + +% If only tsg.PARA is empty, fill it with NO_CONTROL. The dimension of the +% concatenate array must must be equal to the sum of the dimension of +% tsg.DAYD and tsg_old.DAYD +% -------------------------------------------------------------------- +elseif isempty(tsg_new.(Para)) + tsg_new.(Para) = int8(NO_CONTROL) * int8(ones( size( tsg_new.DAYD ))); + +% See preceding comment +% --------------------- +elseif isempty(tsg_old.(Para)) + tsg_old.(Para) = int8(NO_CONTROL) * int8(ones( size( tsg_old.DAYD ))); +end + +% Concatenation +% ------------- +tsg_old.(Para) = [tsg_old.(Para); tsg_new.(Para)]; + +% Re-order the struct array +% ------------------------- +tsg_old.(Para) = tsg_old.(Para)(iOrder); + +end + +%% ************************************************************************ +function tsg = supTsgDouble( tsg) +% +% function supTsgDouble : Suppress TSG measurements made at the same date +% The comparison cannot be made using tsg.DAYD : +% This cannot be done using the Matlab Serial Date format as there can be +% some loss of precision. Especially when a floating number was written in +% a file. +% +% I use tsg.DATE. Could be simplify by comparing string rather than +% converting DATE with datenum +% +% ------------------------------------------------------------------------ + +% Convert string array DATE in numerical array +% -------------------------------------------- +date = str2num(tsg.DATE); + +% Compare adjacent element in an array +% ------------------------------------ +date_diff = find( diff( date ) == 0 ); +if ~isempty( date_diff ) + tsg.DAYD(date_diff) = []; + tsg.DATE(date_diff,:) = []; + + tsg.LATX(date_diff) = []; + tsg.LONX(date_diff) = []; + tsg.POSITION_QC(date_diff) = []; + + if ~isempty(tsg.SPDC); tsg.SPDC(date_diff) = []; end + if ~isempty(tsg.PRES); tsg.PRES(date_diff) = []; end + if ~isempty(tsg.FLOW); tsg.FLOW(date_diff) = []; end + if ~isempty(tsg.CNDC); tsg.CNDC(date_diff) = []; end + if ~isempty(tsg.CNDC_STD); tsg.CNDC_STD(date_diff) = []; end + if ~isempty(tsg.CNDC_CAL); tsg.CNDC_CAL(date_diff) = []; end + if ~isempty(tsg.CNDC_FREQ); tsg.CNDC_FREQ(date_diff) = []; end + + if ~isempty(tsg.SSJT); tsg.SSJT(date_diff) = []; end + if ~isempty(tsg.SSJT_QC); tsg.SSJT_QC(date_diff) = []; end + if ~isempty(tsg.SSJT_STD); tsg.SSJT_STD(date_diff) = []; end + if ~isempty(tsg.SSJT_CAL); tsg.SSJT_CAL(date_diff) = []; end + if ~isempty(tsg.SSJT_FREQ); tsg.SSJT_FREQ(date_diff) = []; end + if ~isempty(tsg.SSJT_ADJUSTED); tsg.SSJT_ADJUSTED(date_diff) = []; end + if ~isempty(tsg.SSJT_ADJUSTED_ERROR); tsg.SSJT_ADJUSTED_ERROR(date_diff) = []; end + if ~isempty(tsg.SSJT_ADJUSTED_QC); tsg.SSJT_ADJUSTED_QC(date_diff) = []; end + % if ~isempty(tsg.SSJT_ADJUSTED_HIST(date_diff,:) = []; end + + if ~isempty(tsg.SSPS); tsg.SSPS(date_diff) = []; end + if ~isempty(tsg.SSPS_QC); tsg.SSPS_QC(date_diff) = []; end + if ~isempty(tsg.SSPS_STD); tsg.SSPS_STD(date_diff) = []; end + if ~isempty(tsg.SSPS_CAL); tsg.SSPS_CAL(date_diff) = []; end + if ~isempty(tsg.SSPS_ADJUSTED); tsg.SSPS_ADJUSTED(date_diff) = []; end + if ~isempty(tsg.SSPS_ADJUSTED_ERROR); tsg.SSPS_ADJUSTED_ERROR(date_diff) = []; end + if ~isempty(tsg.SSPS_ADJUSTED_QC); tsg.SSPS_ADJUSTED_QC(date_diff) = []; end + % if ~isempty(tsg.SSPS_ADJUSTED_HIST(date_diff,:) = []; end + + if ~isempty(tsg.SSTP); tsg.SSTP(date_diff) = []; end + if ~isempty(tsg.SSTP_QC); tsg.SSTP_QC(date_diff) = []; end + if ~isempty(tsg.SSTP_CAL); tsg.SSTP_CAL(date_diff) = []; end + if ~isempty(tsg.SSTP_FREQ); tsg.SSTP_FREQ(date_diff) = []; end + if ~isempty(tsg.SSTP_ADJUSTED); tsg.SSTP_ADJUSTED(date_diff) = []; end + if ~isempty(tsg.SSTP_ADJUSTED_ERROR); tsg.SSTP_ADJUSTED_ERROR(date_diff) = []; end + if ~isempty(tsg.SSTP_ADJUSTED_QC); tsg.SSTP_ADJUSTED_QC(date_diff) = []; end + % if ~isempty(tsg.SSTP_ADJUSTED_HIST);tsg.SSTP_ADJUSTED_HIST(date_diff,:) = []; end +end +end + +%% ************************************************************************ +function tsg = supTsgExtDouble(tsg) +% +% supTsgExtDouble : suppress EXT measurements made at the same date +% The comparison cannot be made using tsg.DAYD_EXT. +% This cannot be done using the Matlab Serial Date format as there can be +% some loss of precision. +% +% I use tsg.DATE_EXT +% ------------------------------------------------------------------------ +if ~isempty( tsg.DATE_EXT ) + + % Convert string array DATE in numerical array + % -------------------------------------------- + date = str2num(tsg.DATE_EXT); + + % Compare adjacent element in an array + % --------------------------------------------- + date_diff = find( diff( date ) == 0 ); + + if ~isempty( date_diff ) + tsg.DAYD_EXT(date_diff) = []; + tsg.DATE_EXT(date_diff,:) = []; + tsg.LATX_EXT(date_diff) = []; + tsg.LONX_EXT(date_diff) = []; + tsg.SSPS_EXT(date_diff) = []; + tsg.SSPS_EXT_QC(date_diff) = []; + tsg.SSPS_EXT_BOTTLE(date_diff,:) = []; + tsg.SSPS_EXT_TYPE(date_diff,:) = []; + tsg.SSPS_EXT_ANALDATE(date_diff,:)= []; + tsg.SSTP_EXT(date_diff) = []; + tsg.SSTP_EXT_QC(date_diff) = []; + tsg.SSTP_EXT_TYPE(date_diff,:) = []; + end + +end +end + + + diff --git a/tsg_io/readTsgIniLabview.m b/tsg_io/readTsgIniLabview.m index f7e0d24..5959804 100644 --- a/tsg_io/readTsgIniLabview.m +++ b/tsg_io/readTsgIniLabview.m @@ -65,7 +65,7 @@ while ~feof(fid) % construct regex with pair cle=value % and extract value % use quantifier none greedy (.*?) - % remove double quote from experssion : ["]* + % remove double quote from expression : ["]* % --------------------------------------------------- regex = strcat('^\s*', clef, '\s*=\s*["]*(.+?)["]*$'); match = regexp( str, regex, 'tokens'); @@ -129,12 +129,20 @@ while ~feof(fid) % -------- k = match{1}{1}; + % get value + % --------- + v = match{1}{2}; + % convert date in julian day when key is 'DATE', else to double % ------------------------------------------------------------- if strcmpi(k, 'DATE') - v = datenumToJulian(datenum(match{1}{2}, 'dd/mm/yyyy')); + v = datenumToJulian(datenum(v, 'dd/mm/yyyy')); else - v = str2double(match{1}{2}); + + % in case where comma is decimal separator, replace it + % with by dot + % ---------------------------------------------------- + v = str2double(regexprep(v, ',', '.')); end % add key to _CONV array, with length of STRING8 @@ -147,17 +155,19 @@ while ~feof(fid) % for debbuging only % ------------------ - %fprintf('%s: %s -> %f\n', clef, k, v); + fprintf('%s: %s -> %f\n', clef, k, v); case 1 % add value to variable array - % --------------------------- - tsg.(clef) = str2double(match{1}{1}); + % in case where comma is decimal separator, replace it + % with by dot + % ---------------------------------------------------- + tsg.(clef) = str2double(regexprep(match{1}{1}, ',', '.')); % for debbuging only % ------------------ - %fprintf('%s: %f\n', clef, tsg.(clef)); + fprintf('%s: %f\n', clef, tsg.(clef)); end % quit for loop diff --git a/tsg_io/read_data.m b/tsg_io/read_data.m new file mode 100644 index 0000000..5d59980 --- /dev/null +++ b/tsg_io/read_data.m @@ -0,0 +1,151 @@ +function [errTsg, errSpl] = read_data( hMainFig, filterIndex, fullFileName) +% +% Read TSG file or Discrete data (Water sample, ARGO, etc.) +% +% Called by TSGQC.M +% +% Input +% hMainFig Handle to the Main figure - Defined in TSGQC.m +% filterIndex Integer - Type of file +% fullFileName file name to read - Directory+filename +% +% Output +% errTsg Error code for TSG files +% errSpl Error code for discrete data file +% +% Filter index values +% 1 - Argo file *.arg (G. Reverdin format) +% 2 - TSG Astrolabe text file *.ast +% 3 - WS ascii file *.btl (tsgqc ascci format) +% 4 - TSG labview file *.lbv +% 5 - TSG netcdf file *.nc +% 6 - TSG Oracle text file *.ora +% 7 - TSG SDF file *.sdf +% 8 - SPL ascii file *.spl (tsgqc ascci format) +% 9 - TSG Nuka transmit file *.transmit* +% 10 - TSG text file *.tsgqc (tsgqc ascci format) +% 11 - TSG XML file *.xml +% +% errTsg, errSpl +% 1 - File read OK +% < 0 - An error occured +% +% $id:$ + +% Error code - Initialisation +% --------------------------- +errTsg = -2; +errSpl = -2; + +% Retrieve named application data +% ------------------------------- +tsg = getappdata( hMainFig, 'tsg_data'); + +switch filterIndex + + % Read discrete data (Water sample, Argo, etc.) + % --------------------------------------------- + case {1, 3, 8} + + % A TSG file must have been uploaded before reading Water sample file + % -------------------------------------------------------------------- + if isempty( tsg.SSPS ) + + msgbox('Load a TSG file before a Water sample file', 'Read Bucket'); + return; + + elseif filterIndex == 1 + % Read Argo file *.arg (G. Reverdin format) + errSpl = readArgoLocean( hMainFig, fullFileName ); + + elseif filterIndex == 3 || filterIndex == 8 + % Read sample file *.spl + errSpl = readAsciiSample( hMainFig, fullFileName, 'SPL'); + + end + + % Read TSG data file + % ------------------ + case {2, 4, 5, 6, 7, 9, 10, 11} + + % Save the TSG structure - Temporary variable + % ------------------------------------------- + tsg_old = tsg; + + % Initialisation of TSG data struct : tsg variable + % ------------------------------------------------ + tsg_initialisation(hMainFig); + + % Read the file. TSG values are stored in a tsg variable + % ------------- + switch filterIndex + case 2 % read TSG Astrolabe text file *.ast + errTsg = readTsgDataAstrolabe(hMainFig, fullFileName); + case 4 % read TSG labview file *.lbv + errTsg = readTsgDataLabview(hMainFig, fullFileName ); + case 5 % read TSG netcdf file *.nc + errTsg = readTsgDataNetCDF(hMainFig, fullFileName ); + case 6 % read TSG Oracle text file *.ora + errTsg = readTsgDataOracle(hMainFig, fullFileName); + case 7 % read TSG SDF file *.sdf + errTsg = readTsgDataSDF(hMainFig, fullFileName ); + case 9 % read TSG Nuka transmit file *.transmit* + errTsg = readTsgDataNuka(hMainFig, fullFileName); + case 10 % read TSG text file *.tsgqc + errTsg = readAsciiTsg(hMainFig, fullFileName); + case 11 % read TSG XML file *.xml + errTsg = readTsgDataXML(hMainFig, fullFileName ); + end + + % Problem to read the file - Back to tsgqc.m + % ------------------------------------------ + if errTsg < 0 + return + end + + % Test if a TSG file is already uploaded in TSGQC + % Give the possibility to concatenate new and old files + % ----------------------------------------------------- + button = 'Replace'; + if ~isempty( tsg.SSPS ) + qstring = {'TSG data have already been uploaded in TSGQC '; ' '; ... + 'Do you want to Replace or to Concatenate them?'}; + title = 'Read TSG Data'; + button = questdlg(qstring, title,'Replace','Concatenate','Cancel', 'Cancel'); + end + + switch button + case 'Replace' + return + + case 'Concatenate' + if strcmp( button, 'Concatenate') + concatStructTSG( hMainFig, tsg_old ); + end + + case 'Cancel' + % reassign the structure array tsg_old to the application data + % tsg_data + % -------------------------------------------------------------- + setappdata( hMainFig, 'tsg_data', tsg_old); + return; + + otherwise + return; + end + + otherwise + + % Reset pointer to arrow + % ---------------------- + set( hMainFig, 'Pointer', 'arrow' ); + + % diplay warning msgbox + % --------------------- + msgbox( {['Invalid TSG file: ' fileName],... + 'Please select another file'},... + 'Warning open file', 'warn', 'modal' ); + + return; +end % switch filterIndex +end % function diff --git a/tsg_util/updateTsgStruct.m b/tsg_util/updateTsgStruct.m index d88d884..6118554 100644 --- a/tsg_util/updateTsgStruct.m +++ b/tsg_util/updateTsgStruct.m @@ -138,13 +138,14 @@ for i = 1:numel(var) for j = 1:tsg.dim.LINCOEF tsg.(var{i})(j) = lin_val(j); end + + % write LINCOEF_CONV's + % convert cell array of string to char array + % ------------------------------------------ + tsg.([var{i} '_CONV']) = char(lin_type); + end - % rewrite LINCOEF's - % convert cell array of string to char array - % ------------------------------------------ - tsg.([var{i} '_CONV']) = char(lin_type); - end diff --git a/tsgqc.m b/tsgqc.m index 473aeae..5892484 100644 --- a/tsgqc.m +++ b/tsgqc.m @@ -37,8 +37,8 @@ global NETCDF_FORMAT_VERSION % version number, may be used to initialize some files when it change % 0.90x -> 1.0RCx % ------------------------------------------------------------------- -VERSION = 1.1; % -> 1.1 -CHAR_VERSION = '1.1'; +VERSION = 1.2; % -> 1.2 +CHAR_VERSION = '1.2'; % netcdf file version, see DATA FORMAT TSG document: % CORTSG_format_gosud_1.5.doc @@ -1201,7 +1201,7 @@ hrbInterpCancel = uicontrol( ... % Open standard dialog box for retrieving files % --------------------------------------------- [fileName, pathname, filterIndex] = uigetfile( ... - {'*.nc';'*.ast';'*.btl';'*.lbv';'*.arg';'*.ora';'*.sdf';'*.spl';... + {'*.arg';'*.ast';'*.btl';'*.lbv';'*.nc';'*.ora';'*.sdf';'*.spl';... '*.transmit*'; '*.tsgqc';'*.xml'}, 'Pick a file'); % flushes the event queue and updates the closed uigetfile window @@ -1223,79 +1223,8 @@ hrbInterpCancel = uicontrol( ... % Read the data % ------------- - errTsg = -2; - errSpl = -2; - switch filterIndex - - case 5 % Read Argo file *.arg (G. Reverdin format) - if ~isempty( tsg.SSPS ) - errSpl = readArgoLocean( hMainFig, fullFileName ); - else - msgbox('Load a TSG file before a Water sample file', 'Read Bucket'); - end - - case 2 % read TSG Astrolabe text file *.ast - tsg_initialisation(hMainFig); - errTsg = readTsgDataAstrolabe( hMainFig, fullFileName); - - case 3 % read bucket file *.btl - if ~isempty( tsg.SSPS ) - errSpl = readAsciiSample( hMainFig, fullFileName, 'WS'); - else - msgbox('Load a TSG file before a Water sample file', 'Read Bucket'); - end - - case 4 % read TSG labview file *.lbv - tsg_initialisation(hMainFig); - errTsg = readTsgDataLabview( hMainFig, fullFileName ); - - case 1 % read TSG netcdf file *.nc - tsg_initialisation(hMainFig); - errTsg = readTsgDataNetCDF( hMainFig, fullFileName ); - - case 6 % read TSG Oracle text file *.ora - tsg_initialisation(hMainFig); - errTsg = readTsgDataOracle( hMainFig, fullFileName); - - case 7 % read TSG SDF file *.sdf - tsg_initialisation(hMainFig); - errTsg = readTsgDataSDF( hMainFig, fullFileName ); - - case 8 % Read Sample file *.spl - if ~isempty( tsg.SSPS ) - errSpl = readAsciiSample( hMainFig, fullFileName, 'SPL'); - else - msgbox('Load a TSG file before a Water sample file', 'Read Bucket'); - end - - case 9 % read TSG Nuka transmit file *.transmit* - tsg_initialisation(hMainFig); - errTsg = readTsgDataNuka( hMainFig, fullFileName); - - case 10 % read TSG text file *.tsgqc - tsg_initialisation(hMainFig); - errTsg = readAsciiTsg( hMainFig, fullFileName); - - case 11 % read TSG XML file *.xml - tsg_initialisation(hMainFig); - errTsg = readTsgDataXML( hMainFig, fullFileName ); - - otherwise - - % Reset pointer to arrow - % ---------------------- - set( hMainFig, 'Pointer', 'arrow' ); - - % diplay warning msgbox - % --------------------- - msgbox( {['Invalid TSG file: ' fileName],... - 'Please select another file'},... - 'Warning open file', 'warn', 'modal' ); - - return; - - end % switch filterIndex - + [errTsg, errSpl] = read_data( hMainFig, filterIndex, fullFileName); + % Get the tsg structure % --------------------- tsg = getappdata( hMainFig, 'tsg_data'); -- GitLab