Skip to content
Snippets Groups Projects
readTsgDataXML.m 6.05 KiB
Newer Older
function [error] = readTsgDataXML( hMainFig, filename)
% [error] = readTsgDataXML( hMainFig, filename)
% Function to read the TSG data XML file
%
% Input
% -----
% hMainFig ............ Handel to the main user interface
% filename ........... Data filename
%
% Output
% ------
% error .............. 1: OK - -1 : an error occured
%
% The data are store using setappdata - Variable name : 'tsg_data'
%
% Function not yet implemented
% Caution : replace the fill-value with NaN
% Get the data from the application GUI
% -------------------------------------
tsg = getappdata( hMainFig, 'tsg_data');

% Display read file info on console
% ---------------------------------
fprintf('\nREAD_XML_FILE\n'); tic;

% Open the file
% -------------
fd = fopen( file(self), 'rt' );
if( fd == -1 )
  warndlg( msg_error, 'XML error dialog');
  sprintf('...cannot locate %s\n', filename);
  error = -1;
  return;
end

fprintf('...reading %s : ', filename);

h = hashtable;

%% parse le fichier XML
tree = xml_parseany( fileread( file( self ) ) );
%data = tree.DATA{1}.CONTENT;

% decode l'entete, a completer
%tsg.CYCLE_MESURE = tree.ENTETE{1}.CYCLE_MESURE{1}.LIBELLE{1}.CONTENT;
tsg.DATA_ACQUISITION     = tree.ENTETE{1}.CYCLE_MESURE{1}.INSTITUT{1}.CONTENT;
tsg.PLATFORME   = tree.ENTETE{1}.PLATEFORME{1}.LIBELLE{1}.CONTENT;
tsg.TSG_TYPE   = tree.ENTETE{1}.INSTRUMENT{1}.ATTRIBUTE.TYPE;
fclose(fd);

%% deuxieme lecture des donnees dans le fichier apres la balise <DATA>
% on lit la deuxieme ligne contenant les entetes des colonnes
fd = fopen( file(self), 'rt' );
while ~feof(fd)
  line = fgetl(fd);
  [tok match] = regexp(line,'<(\w+)>','tokens');  
  if isempty(match), continue, end
  if strmatch(tok{1},'DATA'), break, end
end  

% lit la ligne contenant les entetes des colonnes
header = fgetl(fd);
%disp( ['Entete: ', header] );
variables = strread( header, '%s' ); 
columns = length( variables );

% cree l'equivalent d'une table de hashage des codes Roscop (GF3)
% valides -> colonne associe
for i = 1: columns
  if (~strcmp(variables(i),'N/A') && ~strcmp(variables(i),'YEAR') )
    h = put( h, variables{i}, i );
  elseif( strcmp(variables(i),'YEAR') )
    col_year = i;
  end
end 

cles = keys(h);
val  = values(h);

[A,count] = fscanf( fd, '%g', [columns,inf] );
% 
nb = count / columns;
disp( [num2str(nb),' records'] );
% 
% on inverse la matrice
A=A';

% test si filtre median necessaire
prompt = {'Enter median filter size:'};
dlg_title = 'Input for median filter';
num_lines = 1;
size = inputdlg(prompt,dlg_title,num_lines,{num2str(tsg.medianSize)});
% si l'utilisateur sort par cancel, pas de filtre mais on ne sauvegarde pas
  tsg.medianSize = str2num(size{1});
  % Save tsg structure 
  % ------------------
  setappdata( hMainFig, 'tsg_data', tsg);
end

% gere les dates
year = A(:,col_year);
year_base = year(1);
% met la date au format YYYYMMDDHHmmss
ref_date  = [num2str(year_base) '0101000000'];

%% attributs globaux (data_0d)
assignin('base', 'CYCLE_MESURE', tsg.CYCLE_MESURE );
assignin('base', 'INSTITUT', tsg.CYCLE_MESURE );
assignin('base', 'INSTITUT', tsg.PLATFORME );
assignin('base', 'INSTRUMENT', tsg.TSG_TYPE );

%% variables 1 dimension (data_1d)
assignin('base', 'REFERENCE_DATE_TIME', tsg.REFERENCE_DATE_TIME );

for i = 1 : length(cles)
  data = A(:,val{i});
  data( find( data > 1e35 ) ) = NaN;
  switch cles{i}
    case 'DAYD'
      % pre-allocation
      %days = ones(nb,1);
      %for k=1: nb  % DAYD
      %  days(k) = to_day(year_base,to_date(year(k), data(k), 'n'));
      %end
      days = to_day(year_base,to_date(year,data,'n'));
        % affichage de la taille apres 
        fprintf('...find %d records after median filter', length(days) );
      end  % cas de thermo antea
      self = set(self, 'data_1d', cles{i}, days);
      assignin('base', cles{i}, days );
    case {'LATX','LONX' }
      if (tsg.medianSize > 0 ); data = medianf( data, tsg.medianSize ); end  % cas de thermo antea
      self = set(self, 'data_1d', cles{i}, data);
      assignin('base', cles{i}, data );
    otherwise
      if (tsg.medianSize > 0 ); data = medianf( data, tsg.medianSize ); end  % cas de thermo antea
      self = set(self, 'data_2d', cles{i}, data);
      assignin('base', cles{i}, data);
  end
end

%     % Read the file
%     % -------------
%     tsgData = fscanf(fid, '%d/%d/%d %d:%d:%d %f %f %f %f %d %f %f', ...
%                      [13 Inf])';
%     
%     % Every variable are put in a structure
%     % -------------------------------------
%     tsg.TIME       = datenum(tsgData(:,3), tsgData(:,2),tsgData(:,1), ...
%                              tsgData(:,4),tsgData(:,5),tsgData(:,6));
%     tsg.LATITUDE   = tsgData(:,7);
%     tsg.LONGITUDE  = tsgData(:,8);
%     tsg.TEMP_TSG   = tsgData(:,9);
%     tsg.PSAL       = tsgData(:,10);
%     tsg.PSAL_QC    = tsgData(:,11);
%     tsg.PSAL_ADJ   = tsgData(:,12);
%     tsg.PSAL_ERR   = tsgData(:,13);

%     % populate tsg.file structure
%     % ---------------------------
%     [tsg.file.pathstr, tsg.file.name, tsg.file.ext] = ...
%       fileparts(filename);
%     % Save the data in the application GUI
%     % ------------------------------------
%     setappdata( hMainFig, 'tsg_data', tsg );
    
    % Clear the Workspace
    % -------------------
    clear tsgdata
    
    % Close the file
    % --------------
    fclose( fid );
   
    % Perform somme automatic tests
    % -----------------------------
    automaticQC( hMainFig )
    % Keep somme information for the log file
    % ---------------------------------------
    tsg.report.tsgfile = filename;

    % Display time to read file on console
    % ------------------------------------
    t = toc; fprintf('...done (%6.2f sec).\n\n',t);

    % Everything is not OK 
    % -------------
    error = -1;
end