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