From ab4ebdc4245b7026ae8dc277e3844584c0b6f333 Mon Sep 17 00:00:00 2001 From: Jacques Grelet <jacques.grelet@ird.fr> Date: Tue, 17 Jan 2012 15:36:18 +0000 Subject: [PATCH] simplify and improve date format management for future use, version as number 1.22 now read GOSUD 1.4 to 2.0 works now. Need to be more tested --- @netcdf_native/tsgqc_netcdf.csv | 20 +++++------ @netcdf_native/tsgqc_netcdf.xls | Bin 56320 -> 56320 bytes TSGQC_amelioration.xls | Bin 52736 -> 52736 bytes tsg_io/readArgoLocean.m | 3 +- tsg_io/readAsciiSample.m | 16 ++------- tsg_io/readAsciiTsg.m | 16 ++------- tsg_io/readTsgDataAstrolabe.m | 8 ++--- tsg_io/readTsgDataLabview.m | 3 +- tsg_io/readTsgDataNetCDF.m | 16 +++++++++ tsg_io/readTsgDataNuka.m | 5 +-- tsg_io/readTsgDataOracle.m | 5 +-- tsg_io/writeAsciiSample.m | 11 +----- tsg_io/writeAsciiTsg.m | 21 +++++------- tsg_io/writeTSGDataNetCDF.m | 1 + tsg_util/headerForm.m | 53 ++++++++++++++++++----------- tsg_util/netcdfTOtsgqc.m | 6 ++-- tsg_util/tsg_initialisation.m | 12 ++++--- tsg_util/tsg_preferences.m | 8 +++-- tsg_util/updateTsgStruct.m | 57 +++++++++++++++++++++++++++++--- tsgqc.m | 4 +-- 20 files changed, 161 insertions(+), 104 deletions(-) diff --git a/@netcdf_native/tsgqc_netcdf.csv b/@netcdf_native/tsgqc_netcdf.csv index db3a2f4..4db6628 100644 --- a/@netcdf_native/tsgqc_netcdf.csv +++ b/@netcdf_native/tsgqc_netcdf.csv @@ -18,9 +18,9 @@ $DIMENSIONS$ $VARIABLES$ #;key__;dimension__;type__;long_name;standard_name;units;conventions;valid_min;valid_max;format;FillValue_;epic_code;axis;resolution;comment;default_value;coordinate;# #;char;cell;char;char;char;char;char;double;double;char;double;double;char;double;char;double;char;# -#;REFERENCE_DATE_TIME;'STRING14';char;ORIGIN OF TIME;;;yyyymmddhhmmss;;;;;;;;Reference date for julian days origin;;;# -#;DATE;'DAYD','STRING14';char;DATE OF MAIN INSTRUMENT MEASUREMENT;;;yyyymmddhhmmss;;;;;;;;This is the original data describing the date, it must not be lost;;DAYD;# -#;DATE_EXT;'DAYD_EXT','STRING14';char;DATE OF EACH EXTERNAL DATA MEASUREMENT;;;yyyymmddhhmmss;;;;;;;;This is the original data describing the date, it must not be lost;;DAYD_EXT;# +#;REFERENCE_DATE_TIME;'STRING14';char;ORIGIN OF TIME;;;yyyymmddHHMMSS;;;;;;;;Reference date for julian days origin. The recommended reference date time is "19500101T000000Z": January 1st 1950 00:00:00;;;# +#;DATE;'DAYD','STRING14';char;DATE OF MAIN INSTRUMENT MEASUREMENT;;;yyyymmddHHMMSS;;;;;;;;This is the original data describing the date, it must not be lost;;DAYD;# +#;DATE_EXT;'DAYD_EXT','STRING14';char;DATE OF EACH EXTERNAL DATA MEASUREMENT;;;yyyymmddHHMMSS;;;;;;;;This is the original data describing the date, it must not be lost;;DAYD_EXT;# #;DAYD;'DAYD';double;DECIMAL JULIAN DAY (UTC) OF EACH MEASUREMENT;time;days since REFERENCE_DATE_TIME;Relative julian days with decimal part (as parts of the day);0;36600;%11.5f;;601;T;;Julian day of the measurement since REFERENCE_DATE_TIME;;DAYD;# #;DAYD_EXT;'DAYD_EXT';double;DECIMAL JULIAN DAY (UTC) OF EXTERNAL DATA MEASUREMENT;time;days since REFERENCE_DATE_TIME;Relative julian days with decimal part (as parts of the day);0;36600;%11.5f;;601;T;;Julian day of the measurement since REFERENCE_DATE_TIME;;DAYD_EXT;# #;LATX;'DAYD';float;LATITUDE OF EACH MEASUREMENT;latitude;degree_north;;-90;90;%+8.4f;99999;500;Y;;Latitude of the measurement (decimal);;DAYD;# @@ -84,7 +84,7 @@ $VARIABLES$ #;SSPS_EXT;'DAYD_EXT';float;SEA SURFACE SALINITY FROM EXTERNAL DATA;sea_surface_salinity;;;0;40;%6.3f;99999;;;0.001;Sea Surface Salinity (SSS) from external data instrument (WS,ARGO,CTD, XBT);;DAYD_EXT;# #;SSPS_EXT_QC;'DAYD_EXT';byte;SEA SURFACE SALINITY FROM EXTERNAL DATA QUALITY FLAG;;;;0;9;%1d;;;;;Quality flag applied on external sea surface salinity data values;0;DAYD_EXT;# #;SSPS_EXT_TYPE;'DAYD_EXT','STRING4';char;TYPE OF EXTERNAL SEA SURFACE SALINITY DATA ORIGIN;;;;;;;;;;;WS (Water Sample),ARGO,CTD,XBT,...;;DAYD_EXT;# -#;SSPS_EXT_ANALDATE;'DAYD_EXT','STRING14';char;DATE OF WATER SAMPLE SURFACE SALINITY ANALYSIS;;;yyyymmddhhmmss;;;;;;;;Date of sea surface salinity water sample analysis;;DAYD_EXT;# +#;SSPS_EXT_ANALDATE;'DAYD_EXT','STRING14';char;DATE OF WATER SAMPLE SURFACE SALINITY ANALYSIS;;;yyyymmddHHMMSS;;;;;;;;Date of sea surface salinity water sample analysis;;DAYD_EXT;# #;SSPS_EXT_BOTTLE;'DAYD_EXT','STRING4';char;SEA SURFACE SALINITY BOTTLE NUMBER;;;;;;;;;;;Number of sea surface salinity water sample;;DAYD_EXT;# % $ATTRIBUTES$ @@ -96,25 +96,25 @@ $ATTRIBUTES$ #;PROJECT_NAME;PROJECT NAME:;;popupmenu;ORE-SSS|CORIOLIS|IRD|SISMER|SURVOSRAL|TSG_Recherche;1;0.1;0.02;;right;Name of project which operates the TSG line, ex: ORE-SSS;# #;SHIP_CALL_SIGN;SHIP CALL SIGN:;;edit;;;;;;right;Ship call sign;# #;SHIP_MMSI;SHIP MMSI:;;edit;;;;;;right;Ship MMSI (ASN) number;# -#;DATE_TSG;TSG INSTALL DATE;;edit;;;;;;right;TSG installation date;# +#;DATE_TSG;TSG INSTALL DATE;;edit;;;;;;right;TSG installation date, format: yyyymmdd;# #;TYPE_TSG;TYPE TSG:;;popupmenu;SBE21|SBE45|UNKNO;1;0.1;0.02;;right;Thermosalinograph model number;# #;NUMBER_TSG;NUMBER TSG:;;edit;;;;;;right;TSG serial number;# -#;DATE_TINT;TINT INSTALL DATE;;edit;;;;;;right;TINT installation date;# +#;DATE_TINT;TINT INSTALL DATE;;edit;;;;;;right;TINT installation date, format: yyyymmdd;# #;TYPE_TINT;TYPE TINT:;;popupmenu;SBE38|SBE3S|UNKNO|NA;1;0.1;0.02;;right;External sea surface temperature sensor;# #;NUMBER_TINT;NUMBER TINT:;;edit;;;;;;right;External temperature sensor serial number;# #;DATA_TYPE;DATA TYPE:;;popupmenu;TRAJECTORY|PROFIL|TIME_SERIE;1;;;;right;Describe data type contained in file, eg: TRAJECTORY, PROFIL or TIME_SERIE;# #;DATA_MODE;DATA MODE:;;popupmenu;Delayed mode data|Real time data;1;0.1;0.02;;right;Indicate if the file contains real time or delayed mode data;# #;SAMPLING_PERIOD;SAMPLING PERIOD:;;edit;300;;0.050000001;;;right;Sampling period in seconds: 6 to 3600;# -#;DATE_START;DATE_START:;yyyymmddhhmnss;edit;;;;;;right;Date of first measurements;# -#;DATE_END;DATE END:;yyyymmddhhmnss;edit;;;;;;right;Date of last measurements;# +#;DATE_START;DATE_START:;yyyymmddHHMMSS;edit;;;;;;right;Date of first measurements, format: yyyymmddHHMMSS;# +#;DATE_END;DATE END:;yyyymmddHHMMSS;edit;;;;;;right;Date of last measurements, format: yyyymmddHHMMSS;# #;SOUTH_LATX;SOUTH LATX:;;edit;;;;;;right;South limit of measurements;# #;NORTH_LATX;NORTH LATX:;;edit;;;;;;right;North limit of measurements;# #;WEST_LONX;WEST LONX:;;edit;;;;;;right;West limit of measurements;# #;EAST_LONX;EAST LONX:;;edit;;;;;;right;East limit of measurements;# #;FORMAT_VERSION;FORMAT VERSION:;;popupmenu;1.6|2.0;2;0.1;0.02;;right;File format version;# #;CONVENTIONS;CONVENTIONS:;;popupmenu;GOSUD 1.6, CF1.4|GOSUD 2.0, CF1.4;2;0.1;0.02;;right;NetCDF file format conventions;# -#;DATE_CREATION;DATE CREATION:;yyyymmddhhmnss;edit;;;;;;right;Date and time of file creation, format: YYYYMMDDHHMISS;# -#;DATE_UPDATE;DATE UPDATE:;yyyymmddhhmnss;edit;;;;;;right;Date and time of file update, format: YYYYMMDDHHMISS;# +#;DATE_CREATION;DATE CREATION:;yyyymmddHHMMSS;edit;;;;;;right;Date and time of file creation, format: yyyymmddHHMMSS;# +#;DATE_UPDATE;DATE UPDATE:;yyyymmddHHMMSS;edit;;;;;;right;Date and time of file update, format: yyyymmddHHMMSS;# #;DATA_RESTRICTIONS;DATA RESTRICTIONS:;;edit;NONE;;;;;right;Restriction on use for these data;# #;CITATION;CITATION:;;edit;;;;;;left;This citation should be used for publications;# #;COMMENT;COMMENT:;;edit;;;;;;right;;# diff --git a/@netcdf_native/tsgqc_netcdf.xls b/@netcdf_native/tsgqc_netcdf.xls index 2186644bd03a6d4b2bd6fc8ca78d98b42b5c7cee..f1985238454f3b396d4d1ee95da4cfd8dd8621b1 100644 GIT binary patch delta 12261 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 delta 12359 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⪚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 T5&WM7UiGAi^QqCJZ>Rk~^cGh@ diff --git a/TSGQC_amelioration.xls b/TSGQC_amelioration.xls index ac69762074abe3ba3064eb156382fa0365348fdc..8820a2a76098ebabfdd13c9a1077593594ea7a5a 100644 GIT binary patch delta 7418 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 Z;V()gsTJ2=YD$}Mwzatu-?|i${ujhw1hfDE delta 7306 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 diff --git a/tsg_io/readArgoLocean.m b/tsg_io/readArgoLocean.m index bf30259..e2ebd73 100644 --- a/tsg_io/readArgoLocean.m +++ b/tsg_io/readArgoLocean.m @@ -74,7 +74,8 @@ argo.DAYD_EXT = argo.DAYD_EXT + data(:,17); % Convert date in character. % ------------------------------------------------------ -argo.DATE_EXT = datestr( argo.DAYD_EXT, 'yyyymmddHHMMSS' ); +argo.DATE_EXT = datestr( argo.DAYD_EXT,... + tsg.preference.date_format_variable ); argo.LONX_EXT = data(:, 7); argo.LATX_EXT = data(:, 8); diff --git a/tsg_io/readAsciiSample.m b/tsg_io/readAsciiSample.m index 39a09d8..6b87006 100644 --- a/tsg_io/readAsciiSample.m +++ b/tsg_io/readAsciiSample.m @@ -175,19 +175,9 @@ ss = double( s.(char(header(6))) ); s.DAYD_EXT = datenum(yy, mm, dd, hh, mi, ss); -% Convert date in character. This cannot be done using -% the Matlab Serial Date format as there can be -% some loss of precision. -% The following instruction is not precise enough : -% s.DATE_EXT = datestr( s.DAYD_EXT, 'yyyymmddHHMMSS' ); -% ------------------------------------------------------ -yy = num2str( s.(char(header(1))), '%4d' ); -mm = num2str( s.(char(header(2))), '%02d' ); -dd = num2str( s.(char(header(3))), '%02d' ); -hh = num2str( s.(char(header(4))), '%02d' ); -mi = num2str( s.(char(header(5))), '%02d' ); -ss = num2str( s.(char(header(6))), '%02d' ); -s.DATE_EXT = [yy mm dd hh mi ss]; +% Convert date using pre-defined format +% ------------------------------------- +s.DATE_EXT = datestr(s.DAYD_EXT, tsg.preference.date_format_variable); % Check if bottle/ship colocation is OK % ------------------------------------- diff --git a/tsg_io/readAsciiTsg.m b/tsg_io/readAsciiTsg.m index 511a535..69ec00f 100644 --- a/tsg_io/readAsciiTsg.m +++ b/tsg_io/readAsciiTsg.m @@ -128,19 +128,9 @@ ss = double( s.(char(header(6))) ); tsg.report.tsgfile = filename; tsg.DAYD = datenum(yy, mm, dd, hh, mi, ss); -% Convert date in character. This cannot be done using -% the Matlab Serial Date format as there can be -% some loss of precision. -% The following instruction is not precise enough : -% tsg.DATE = datestr( tsg.DAYD, 'yyyymmddHHMMSS' ); -% ------------------------------------------------------ -yy = num2str( s.(char(header(1))), '%4d' ); -mm = num2str( s.(char(header(2))), '%02d' ); -dd = num2str( s.(char(header(3))), '%02d' ); -hh = num2str( s.(char(header(4))), '%02d' ); -mi = num2str( s.(char(header(5))), '%02d' ); -ss = num2str( s.(char(header(6))), '%02d' ); -tsg.DATE = [yy mm dd hh mi ss]; +% Convert date using pre-defined format +% ------------------------------------- +tsg.DATE = datestr( tsg.DAYD, tsg.preference.date_format_variable ); nHeader = length( header ); for i = 7 : nHeader diff --git a/tsg_io/readTsgDataAstrolabe.m b/tsg_io/readTsgDataAstrolabe.m index 52638a1..bc2bad5 100644 --- a/tsg_io/readTsgDataAstrolabe.m +++ b/tsg_io/readTsgDataAstrolabe.m @@ -119,9 +119,6 @@ clear cellData % Date (y m d h m s) in the first 4 elements in data % -------------------------------------------------- -% ddmmyy = char(s.(char(header(1)))) ; -% dd = str2num(ddmmyy(:,1:2)); -% mm = str2num(ddmmyy(:,3:4)); ddmmyy = double(s.(char(header(1)))) ; nn = length(ddmmyy); dd = repmat(NaN, [nn 1]); @@ -144,7 +141,10 @@ ss = double( s.(char(header(4))) ); tsg.report.tsgfile = filename; tsg.DAYD = datenum(yy, mm, dd, hh, mi, ss); -tsg.DATE = datestr( tsg.DAYD, 'yyyymmddHHMMSS' ); + +% Convert date using pre-defined format +% ------------------------------------- +tsg.DATE = datestr( tsg.DAYD, tsg.preference.date_format_variable ); nHeader = length( header ); for i = 5 : nHeader diff --git a/tsg_io/readTsgDataLabview.m b/tsg_io/readTsgDataLabview.m index dcbf40e..8284090 100644 --- a/tsg_io/readTsgDataLabview.m +++ b/tsg_io/readTsgDataLabview.m @@ -165,7 +165,8 @@ if fid ~= -1 % Save original data. If date or time are incorrect data are deleted % ------------------------------------------------------------------ - tsg.DATE = deblank( datestr( tsg.DAYD, 'yyyymmddHHMMSS' ) ); + tsg.DATE = deblank( datestr(tsg.DAYD,... + tsg.preference.date_format_variable) ); tsg.LATX = lat(noNaN); tsg.LONX = lon(noNaN); tsg.SSJT = sst(noNaN); diff --git a/tsg_io/readTsgDataNetCDF.m b/tsg_io/readTsgDataNetCDF.m index e934bf0..98a578f 100644 --- a/tsg_io/readTsgDataNetCDF.m +++ b/tsg_io/readTsgDataNetCDF.m @@ -120,6 +120,12 @@ automaticQC( hMainFig ) tsg.(variable) = julianToDatenum(tsg.(variable)); end + % save in tsg structure attribute conventions for DATE viariables + % --------------------------------------------------------------- + if strmatch('DATE', variable) + tsg.conventions.(variable) = nv.conventions(:); + end + % assign netcdf variables in base workspace % ----------------------------------------- assignin('base', variable, nv(:)); @@ -183,6 +189,16 @@ automaticQC( hMainFig ) tsg.(var) = julianToDatenum(tsg.(var)); end + % save in tsg structure attribute conventions for DATE viariables + % --------------------------------------------------------------- + if strfind(var, 'DATE') + if strcmp(nc.VARIABLES.(var).conventions, 'yyyymmddhhmmss') + tsg.conventions.(var) = 'yyyymmddHHMMSS'; + else + tsg.conventions.(var) = nc.VARIABLES.(var).conventions; + end + end + % assign variable in base workspace % ------------------------------------------- assignin('base', var , tsg.(var)); diff --git a/tsg_io/readTsgDataNuka.m b/tsg_io/readTsgDataNuka.m index 4ddc9b5..7fbdffa 100644 --- a/tsg_io/readTsgDataNuka.m +++ b/tsg_io/readTsgDataNuka.m @@ -98,8 +98,9 @@ end % Fill other TSG variables % --------------------------------- -tsg.DATE = datestr([cellData{3} cellData{4} cellData{5} hh mm zeros(nrecords,1)],'yyyymmddHHMMSS'); -tsg.DAYD = datenum(tsg.DATE,'yyyymmddHHMMSS'); +tsg.DATE = datestr([cellData{3} cellData{4} cellData{5} hh mm zeros(nrecords,1)],... + tsg.preference.date_format_variable); +tsg.DAYD = datenum(tsg.DATE, tsg.preference.date_format_variable); tsg.LATX = cellData{7}; tsg.LONX = cellData{8}; tsg.SSPS = cellData{10}; diff --git a/tsg_io/readTsgDataOracle.m b/tsg_io/readTsgDataOracle.m index e543bfe..0dedf1a 100644 --- a/tsg_io/readTsgDataOracle.m +++ b/tsg_io/readTsgDataOracle.m @@ -128,8 +128,9 @@ if size(timechar,2)>5 else SS = zeros(nrecords,1); end -tsg.DATE = datestr([yyyy mm dd HH MM SS],'yyyymmddHHMMSS'); -tsg.DAYD = datenum(tsg.DATE,'yyyymmddHHMMSS'); +tsg.DATE = datestr([yyyy mm dd HH MM SS],... + tsg.preference.date_format_variable); +tsg.DAYD = datenum(tsg.DATE, tsg.preference.date_format_variable); tsg.LATX = cellData{3}; tsg.LONX = cellData{4}; tsg.SSJT = cellData{5}; diff --git a/tsg_io/writeAsciiSample.m b/tsg_io/writeAsciiSample.m index 61df45d..59f10a6 100644 --- a/tsg_io/writeAsciiSample.m +++ b/tsg_io/writeAsciiSample.m @@ -52,17 +52,8 @@ if choice if nbRecords ~= 0 % Use tsg.DATE_EXT to get the year, month, day, etc. - % This cannot be done using the Matlab Serial Date format as there can be - % some loss of precision. - % The following instruction is not precise enough : - % [year, month, day, hour, min, sec] = datevec( tsg.DAYD_EXT ); % ------------------------------------------------------ - year = str2num( tsg.DATE_EXT(:,1:4) ); - month = str2num( tsg.DATE_EXT(:,5:6) ); - day = str2num( tsg.DATE_EXT(:,7:8) ); - hour = str2num( tsg.DATE_EXT(:,9:10) ); - min = str2num( tsg.DATE_EXT(:,11:12) ); - sec = str2num( tsg.DATE_EXT(:,13:14) ); + [year, month, day, hour, min, sec] = datevec( tsg.DAYD_EXT ); tsg_data = [year month day hour min fix(sec) tsg.LATX_EXT tsg.LONX_EXT ]; header = 'YEAR MNTH DAYX hh mi ss LATX_EXT LONX_EXT'; diff --git a/tsg_io/writeAsciiTsg.m b/tsg_io/writeAsciiTsg.m index 5364faf..0a7877c 100644 --- a/tsg_io/writeAsciiTsg.m +++ b/tsg_io/writeAsciiTsg.m @@ -52,18 +52,15 @@ if choice nbRecords = length( tsg.DAYD ); if nbRecords ~= 0 - % Use tsg.DATE to get the year, month, day, etc. - % This cannot be done using the Matlab Serial Date format as there can be - % some loss of precision. - % The following instruction is not precise enough : - % [year, month, day, hour, min, sec] = datevec( tsg.DAYD ); - % ------------------------------------------------------ - year = str2num( tsg.DATE(:,1:4) ); - month = str2num( tsg.DATE(:,5:6) ); - day = str2num( tsg.DATE(:,7:8) ); - hour = str2num( tsg.DATE(:,9:10) ); - min = str2num( tsg.DATE(:,11:12) ); - sec = str2num( tsg.DATE(:,13:14) ); + % get the year, month, day, etc. + % ------------------------------- +% year = str2num( tsg.DATE(:,1:4) ); +% month = str2num( tsg.DATE(:,5:6) ); +% day = str2num( tsg.DATE(:,7:8) ); +% hour = str2num( tsg.DATE(:,10:11) ); +% min = str2num( tsg.DATE(:,12:13) ); +% sec = str2num( tsg.DATE(:,14:15) ); + [year, month, day, hour, min, sec] = datevec( tsg.DAYD ); tsg_data = [year month day hour min fix(sec) tsg.LATX mod(tsg.LONX+180,360)-180 ]; header = 'YEAR MNTH DAYX hh mi ss LATX LONX'; diff --git a/tsg_io/writeTSGDataNetCDF.m b/tsg_io/writeTSGDataNetCDF.m index dce5aea..807da14 100644 --- a/tsg_io/writeTSGDataNetCDF.m +++ b/tsg_io/writeTSGDataNetCDF.m @@ -122,6 +122,7 @@ end % Fixed dimensions % ---------------- nc('STRING256') = tsg.dim.STRING256; + nc('STRING16') = tsg.dim.STRING16; nc('STRING14') = tsg.dim.STRING14; nc('STRING8') = tsg.dim.STRING8; nc('STRING4') = tsg.dim.STRING4; diff --git a/tsg_util/headerForm.m b/tsg_util/headerForm.m index ad57610..807eadf 100644 --- a/tsg_util/headerForm.m +++ b/tsg_util/headerForm.m @@ -36,9 +36,9 @@ bottom = .95; inc_x = 3 * default_length; inc_y = 0.01; -% get actual date -% --------------- -date = datestr(now,30); +% get actual date to format +% ------------------------- +date = datestr(now, tsg.preference.date_format_attribute); % Get an instance of dynaload objetc from file 'tsgqc_netcdf.csv' % ----------------------------------------------------------------- @@ -61,7 +61,7 @@ add_coeff_var = { 'SSJT_CALCOEF', 'SSJT_LINCOEF', 'CNDC_CALCOEF', ... % if tsg_platform_info.csv not exist, create it % --------------------------------------------- -%existPlatform(hTsgGUI); +existPlatform(hTsgGUI); % % check if .ini file exist in data % % -------------------------------- @@ -79,7 +79,8 @@ platform_info = tsg_nc('tsg_platform.csv'); % end % header Uicontrols in a new figure -% --------------------------------- +% comment 'WindowStyle', 'modal', ... in debug mode +% --------------------------------------------------- hHeaderFig = figure(... 'BackingStore','off',... 'Name', 'TSG GLOBAL ATTRIBUTES AND VARIABLES', ... @@ -89,11 +90,10 @@ hHeaderFig = figure(... 'Toolbar', 'none', ... 'Tag', 'GLOBAL_ATTRIBUTES', ... 'Visible','on',... - 'WindowStyle', 'modal', ... 'Units', 'normalized',... 'Position',get(hTsgGUI,'Position'), ... 'Color', get(0, 'DefaultUIControlBackgroundColor')); - +%'WindowStyle', 'modal', ... % bg = [0.92549 0.913725 0.847059] = get(0, 'DefaultUIControlBackgroundColor'); % Iterate from each element from object nca and additional variables @@ -144,14 +144,30 @@ for i = nca_keys % display conventions field if exist % ---------------------------------- - uicontrol(... - 'Parent', hHeaderFig, ... - 'Units', 'normalized', ... - 'Style', 'text', ... - 'Fontsize', tsg.fontSize-2, ... - 'HorizontalAlignment', 'left', ... - 'Position', [left + 2*s.length, bottom, s.length, s.height], ... - 'String', char(s.conventions)); + convention = char(s.conventions); + name = char(s.name); + + % if attribute as a column conventions in csv file + % ------------------------------------------------ + if ~isempty(convention) + + % get it + % ------ + if ~isempty(strfind(name, 'DATE')) + convention = tsg.preference.date_format_attribute; + end + + % and display in text field + % ------------------------- + uicontrol(... + 'Parent', hHeaderFig, ... + 'Units', 'normalized', ... + 'Style', 'text', ... + 'Fontsize', tsg.fontSize-2, ... + 'HorizontalAlignment', 'left', ... + 'Position', [left + 2*s.length, bottom, s.length, s.height], ... + 'String', convention); + end % set dynamically uicontrol from tsg struct % ----------------------------------------- @@ -312,7 +328,7 @@ uiwait(hHeaderFig); % set tsg.DATE_UPDATE % ------------------- if strcmp(key, 'DATE_UPDATE') - tsg.(key) = [date(1:8) date(10:15)]; + tsg.(key) = date; end % if uicontrol is a popupmenu, string is cell array with all choices @@ -608,8 +624,7 @@ uiwait(hHeaderFig); % additionnal coefficients variable here % -------------------------------------- function add_coefficients - - + % display dynamically uicontrol text over add_var list % ---------------------------------------------------- for acv = add_coeff_var @@ -630,7 +645,7 @@ uiwait(hHeaderFig); % loop for each value of coefficient variable % ------------------------------------------- for ii=1:numel(tsg.(var)) - + tsg.([var '_CONV']); cle = tsg.([var '_CONV'])(ii,:); % if fillValue, don't display uicontrol diff --git a/tsg_util/netcdfTOtsgqc.m b/tsg_util/netcdfTOtsgqc.m index da8b96f..8af9c0e 100644 --- a/tsg_util/netcdfTOtsgqc.m +++ b/tsg_util/netcdfTOtsgqc.m @@ -123,9 +123,9 @@ for i = 1 : nfiles year = str2num(tsg.DATE(:,1:4)); month = str2num(tsg.DATE(:,5:6)); day = str2num(tsg.DATE(:,7:8)); - hour = str2num(tsg.DATE(:,9:10)); - min = str2num(tsg.DATE(:,11:12)); - sec = str2num(tsg.DATE(:,13:14)); + hour = str2num(tsg.DATE(:,10:11)); + min = str2num(tsg.DATE(:,12:13)); + sec = str2num(tsg.DATE(:,14:15)); %[year, month, day, hour, min, sec] = datevec( julianToDatenum(tsg.DAYD) ); tsg_data = [year month day hour min fix(sec) tsg.LATX mod(tsg.LONX+180,360)-180 ]; diff --git a/tsg_util/tsg_initialisation.m b/tsg_util/tsg_initialisation.m index 12fdbfa..dd983a2 100644 --- a/tsg_util/tsg_initialisation.m +++ b/tsg_util/tsg_initialisation.m @@ -62,7 +62,8 @@ end % define netcdf dimensions % ------------------------ tsg.dim.STRING256 = 256; -tsg.dim.STRING14 = 14; +tsg.dim.STRING16 = 16; % use for ISO8601 date format +tsg.dim.STRING14 = 14; % use for oldest date format tsg.dim.STRING8 = 8; tsg.dim.STRING4 = 4; tsg.dim.N1 = 1; @@ -77,9 +78,9 @@ tsg.dim.COEF_CONV_SIZE = tsg.dim.STRING8; % ------------------------------------------------------ REFERENCE_DATE_TIME = '19500101000000'; -% get actual date -% --------------- -date = datestr(now,30); +% get actual date with ISO8601 +% ---------------------------- +date = datestr(now, 'yyyyddmmHHMMSS'); % ------------------------------------------------------------------------- %% Levitus fields for climatology @@ -229,9 +230,10 @@ end % set some fields % --------------- tsg.FORMAT_VERSION = NETCDF_FORMAT_VERSION; -tsg.DATE_CREATION = [date(1:8) date(10:15)]; +tsg.DATE_CREATION = date; tsg.DATE_UPDATE = tsg.DATE_CREATION; tsg.REFERENCE_DATE_TIME = REFERENCE_DATE_TIME; +tsg.conventions = []; % Save tsg structure % ------------------ diff --git a/tsg_util/tsg_preferences.m b/tsg_util/tsg_preferences.m index b7b2dbe..a7d77cd 100644 --- a/tsg_util/tsg_preferences.m +++ b/tsg_util/tsg_preferences.m @@ -153,8 +153,12 @@ set(hTsgGUI,'Pointer','arrow'); preference.ssjt_max_string = {'40'}; preference.sstp_min_string = {'-3'}; preference.sstp_max_string = {'40'}; - preference.date_format_variable = {'yyyyMMddHHmmss'}; - preference.date_format_attribute = {'yyyy-MM-ddTHH:mm:ssZ'}; + + % according with tsg_netcdf.xls file + % change version number or delete tsgqc.mat + % ----------------------------------------- + preference.date_format_variable = 'yyyymmddHHMMSS'; + preference.date_format_attribute = 'yyyymmddHHMMSS'; % save preference struct to 'prefdir.mat' file % --------------------------------------------- diff --git a/tsg_util/updateTsgStruct.m b/tsg_util/updateTsgStruct.m index 6118554..fc31f61 100644 --- a/tsg_util/updateTsgStruct.m +++ b/tsg_util/updateTsgStruct.m @@ -61,11 +61,43 @@ else end % get date start and end value and set to globals attributes -% ----------------------------------------------------------------- -date = datestr(min(tsg.DAYD), 30); -tsg.DATE_START = [date(1:8) date(10:15)]; -date = datestr(max(tsg.DAYD), 30); -tsg.DATE_END = [date(1:8) date(10:15)]; +% by default db-oceano use this format yyyymmddHHMMSS +% ---------------------------------------------------------- +tsg.DATE_START = datestr(min(tsg.DAYD), tsg.preference.date_format_attribute); +tsg.DATE_END = datestr(max(tsg.DAYD), tsg.preference.date_format_attribute); + +% if date is in standard format, change, if not, user need to update +% inside headerform +% ------------------------------------------------------------------ +if size(tsg.DATE, 2) == 14 + tsg.DATE_CREATION = datestr(datenum(tsg.DATE_CREATION, ... + 'yyyyddmmHHMMSS'), tsg.preference.date_format_attribute); +end +if size(tsg.DATE, 2) == 14 + tsg.DATE_UPDATE = datestr(datenum(tsg.DATE_UPDATE, ... + 'yyyyddmmHHMMSS'), tsg.preference.date_format_attribute); +end + +% update tsg.xxx_DATE_xxx with new or ISO8601 format if necessary +% conventions for variables are saved in tsg.conventions structure +% see updateTsgStruct.m +% ---------------------------------------------------------------- +if ~isempty(tsg.REFERENCE_DATE_TIME) && ~isempty(tsg.conventions) + tsg.REFERENCE_DATE_TIME = datestr(datenum(tsg.REFERENCE_DATE_TIME,... + tsg.conventions.REFERENCE_DATE_TIME), tsg.preference.date_format_variable); +end +if ~isempty(tsg.DATE) && ~isempty(tsg.conventions) + tsg.DATE = datestr(datenum(tsg.DATE, ... + tsg.conventions.DATE), tsg.preference.date_format_variable); +end +if ~isempty(tsg.DATE_EXT) && ~isempty(tsg.conventions) + tsg.DATE_EXT = datestr(datenum(tsg.DATE_EXT, ... + tsg.conventions.DATE_EXT), tsg.preference.date_format_variable); +end +if ~isempty(tsg.SSPS_EXT_ANALDATE) && ~isempty(tsg.conventions) + tsg.SSPS_EXT_ANALDATE = datestr(datenum(tsg.DATE_EXT, ... + tsg.conventions.SSPS_EXT_ANALDATE), tsg.preference.date_format_variable); +end % Variables must exists % --------------------- @@ -112,6 +144,21 @@ end % ------------------ setappdata( hMainFig, 'tsg_data', tsg); +% reset calibration coefficients for this not comptatible version +% --------------------------------------------------------------- +if strcmp(tsg.FORMAT_VERSION, '1.4') + tsg.SSJT_CALCOEF = []; + tsg.CNDC_CALCOEF = []; + tsg.SSTP_CALCOEF = []; + tsg.SSJT_LINCOEF = []; + tsg.CNDC_LINCOEF = []; + tsg.SSTP_LINCOEF = []; + + % Save tsg structure + % ------------------ + setappdata( hMainFig, 'tsg_data', tsg); +end + % fill tsg calibration variables % ------------------------------ updateTsgStructWithCalCoeff(hMainFig); diff --git a/tsgqc.m b/tsgqc.m index 5a09877..e947e5d 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.3; % -> 1.3 -CHAR_VERSION = '1.3'; +VERSION = 1.22; % -> 1.3 +CHAR_VERSION = '1.22'; % netcdf file version, see DATA FORMAT TSG document: % CORTSG_format_gosud_1.5.doc -- GitLab