NCCOOS Trac Projects: Top | Web | Platforms | Processing | Viz | Sprints | Sandbox | (Wind)

root/gliderproc/trunk/gliderCTD_Generate_L1_Data.m

Revision 509 (checked in by cbc, 11 years ago)

Add Harvey's CTD QA code for Pelagia.

Line 
1 %
2 %  gliderCTD_Generate_L1_Data_v1.m
3 %
4 %  Purpose: Apply thermal lag correction to glider CTD salinity and density
5 %           and generate Level 1 data mat files.
6 %
7 %  NOTE: At top of file, set glider index, deployment number and desired correction parameters
8 %
9 %  Requires:
10 %  correctThermalLag.m - Code from authors that implements Garau et al. 2011, Thermal
11 %  lag correction on Slocum CTD glider data, JAOT, 28,
12 %  1065-1071,doi:10.1175/JTECH-D-10-05030.1
13 %
14 %  MATLAB folder - contains util, seawater,
15 %
16 %
17 %  Author:  William Stark
18 %           Marine Sciences Department
19 %           UNC-Chapel Hill
20 %
21 %  Created: 21 May 2012
22 %   reviewed, modified by HES December 2012, March 2013, called v1
23 %   June 2013, implemented some QC procedures for ramses, HES
24 %   20130703 - Iterate throuth gliders and deployments. - CBC
25 %   20130725 - Implemented some QC procedures for pelagia. - HES
26 %
27 %//////////////////////////////////////////////////////////////////////////
28 % TO DO: (done, 3/12/2013)
29 % compare sci_m_present_time and sci_ctdxx_timestamp - looks like ptime-ctd_time is
30 % 0.6 +-0.6 second, never goes negative but can be very big positive
31 % number.  Appears to happen at surfacing, and that the CTD throws several
32 % measurements with the same time stamp, maybe a flushed buffer?  Have
33 % badflagged the values, identified as times when the two timestamps are very
34 % different.
35 %
36 % check final density calculation - done correctly
37 %
38 % resolve best determination of lat and lon - HES: looked at this some;
39 % lat/lon are most common measure but appear to reflect dead reckoning.
40 % waypoints are just that, intended targets, so chose gps in the end for
41 % determining position of each CTD point.  Commented out code to process
42 % other position measures for now.
43 %
44 % removed chlorophyll from processing, do separately
45
46
47 clear all;
48
49 % add paths for required files...
50 addpath('MATLAB/util/');
51 %addpath('MATLAB/matutil/');
52 addpath('MATLAB/seawater/');
53 %addpath('MATLAB/plots/');
54 addpath('MATLAB/strfun/');
55 %addpath('MATLAB/opnml/');
56 %addpath('MATLAB/opnml/FEM/');
57
58 % SET THE GLIDER INDEX (Pelagia = 1, Ramses = 2) ...
59 for gliderIndex=1:2
60
61     % SET THE DEPLOYMENT NUMBER (1, 2 or 3) ...
62     for deploymentNumber=1:3
63        
64         clearvars -except gliderIndex deploymentNumber;
65
66         % glider name string...
67         if (gliderIndex==1)
68             strGliderName = 'Pelagia';
69         else
70             strGliderName = 'Ramses';
71         end
72        
73         disp(['Generating Level 1 CTD data for ', strGliderName, ' Deployment ', num2str(deploymentNumber)]);
74
75         % SET CORRECTION PARAMETERS STRUCTURE...
76         correctionParams = [0.1587 0.0214 6.5316 1.5969];
77
78         % populate arrays for the deployment start and end dates...
79         % ex. strStart(2, 3) is start date for Ramses, Deployment 3
80         strStart = {'26-Jan-2012', '16-Feb-2012', '16-Mar-2012'; '26-Jan-2012', '16-Feb-2012', '16-Mar-2012'};
81         strEnd   = {'14-Feb-2012', '08-Mar-2012', '04-Apr-2012'; '14-Feb-2012', '12-Mar-2012', '03-Apr-2012'};
82
83         % deployment number string...
84         strDeploymentNumber = num2str(deploymentNumber);
85
86         % deployment start date string...
87         strStartDate = strStart(gliderIndex, deploymentNumber);
88
89         % deployment end date string...
90         strEndDate = strEnd(gliderIndex, deploymentNumber);
91
92         % define the path to the glider ascii files...
93         %datadir = strcat('/Users/haloboy/Documents/MASC/MATLAB/CTD_data_correction/GLIDER_CTD_DATA_LEVEL0/',...
94         datadir = strcat('GLIDER_DATA_LEVEL0/', strGliderName, '_Deployment', strDeploymentNumber, '/');
95
96         % define default bounds for use in plots...
97         switch gliderIndex
98             case 1  % Pelagia
99                 switch deploymentNumber
100                     case 1  % Deployment 1
101                         tempBounds =  [17.0 24.0];
102                         salinBounds = [36.0 36.4];
103                         densBounds =  [1025.0 1026.6];
104                         chlorBounds = [0.0 4.0];
105
106                     case 2  % Deployment 2
107                         tempBounds =  [17.0 24.0];
108                         salinBounds = [36.0 36.5];
109                         densBounds =  [1024.5 1026.8];
110                         chlorBounds = [0.0 4.0];
111
112                     case 3  % Deployment 3
113                         tempBounds =  [17.0 24.0];
114                         salinBounds = [35.9 36.7];
115                         densBounds =  [1024.4 1026.4];
116                         chlorBounds = [0.0 4.0];
117                 end
118             case 2  % Ramses
119                 switch deploymentNumber
120                     case 1  % Deployment 1
121                         tempBounds =  [8.0 23.0];
122                         salinBounds = [35.0 36.4];
123                         densBounds =  [1024.5 1027.5];
124                         chlorBounds = [0.0 4.0];
125
126                     case 2  % Deployment 2
127                         tempBounds =  [9.0 25.0];
128                         salinBounds = [35.2 36.6];
129                         densBounds =  [1024.0 1027.5];
130                         chlorBounds = [0.0 4.0];
131
132                     case 3  % Deployment 3
133                         tempBounds =  [10.0 24.5];
134                         salinBounds = [35.3 36.7];
135                         densBounds =  [1024.4 1027.4];
136                         chlorBounds = [0.0 4.0];
137                 end
138         end
139
140
141         %##########################################################################################
142
143
144
145
146
147         %*** READ IN EBD DATA *****************************************************
148         % declare variables for storing data...
149         temp=[];
150         cond=[];
151         pres=[];
152         ctd_time=[];
153         %chlor=[];
154         ptime=[];
155         % mtime=[]; scioxy=[]; scibb=[]; scicdom=[]; scichlor=[]; scibbam=[];
156
157         % try to load all *.ebdasc files at once...
158         [files, Dstruct] = wilddir(datadir, '.ebdasc');
159         nfile = size(files, 1);
160
161         for i=1:nfile-1
162             % protect against empty ebd file
163             if(Dstruct(i).bytes>0)
164                 data = read_gliderasc2([datadir, files(i,:)]);
165                 %data = read_gliderasc3([datadir, files(i,:)]);
166
167                 % if the number of values (in data.data) is less than the number of
168                 % vars (in data.vars), this means that the data were not completely read
169                 % in.  To correct this, pad data.data with NaNs until its length
170                 % equals that of data.vars...
171                 if (length(data.data) < length(data.vars))
172                     data.data = padarray(data.data, [0 length(data.vars)-length(data.data)], NaN, 'post');
173                 end
174
175                 % populate variables with data...
176                 if(~isempty(data.data))
177                      temp = [temp;data.data(:,strmatch('sci_water_temp', data.vars, 'exact'))];             % temperature
178                      cond = [cond;data.data(:,strmatch('sci_water_cond', data.vars, 'exact'))];             % conductivity
179                      pres = [pres;data.data(:,strmatch('sci_water_pressure', data.vars, 'exact'))];         % pressure (measure of depth) science bay
180                      ctd_time = [ctd_time;data.data(:,strmatch('sci_ctd41cp_timestamp', data.vars, 'exact'))];         % ctd timestamp
181                 %    switch gliderIndex
182                  %       case 1  % this is Pelagia...
183                  %           chlor = [chlor;data.data(:,strmatch('sci_bbfl2s_chlor_scaled', data.vars, 'exact'))];  % chlorophyll
184                  %       case 2  % this is Ramses...
185                  %           chlor = [chlor;data.data(:,strmatch('sci_flbbcd_chlor_units', data.vars, 'exact'))];  % chlorophyll
186                  %   end
187                     ptime = [ptime;data.data(:,strmatch('sci_m_present_time', data.vars, 'exact'))];       % present time
188                 end
189
190                 data = [];
191             end 
192         end
193         %**************************************************************************
194
195         %*** READ IN DBD DATA *****************************************************
196         % declare variables for storing data...
197         ptime_dbd=[];
198         horizontalVelocity=[];
199         depth = [];
200         pitch=[];
201         avgDepthRate = [];
202         angleOfAttack = [];
203         %lat = [];
204         %lon = [];
205         gpsLat = [];
206         gpsLon = [];
207         %wptLat = [];
208         %wptLon = [];
209
210         % try to load all *.dbdasc files at once...
211         [files, Dstruct] = wilddir(datadir, '.dbdasc');
212         nfile = size(files, 1);
213
214         clear data;
215
216         for i=1:nfile
217             % protect against empty dbd file
218             if(Dstruct(i).bytes>0)
219                 data = read_gliderasc2([datadir, files(i,:)]);
220                 %data = read_gliderasc3([datadir, files(i,:)]);
221
222                 % if the number of values (in data.data) is less than the number of
223                 % vars (in data.vars), this means that the data were not completely read
224                 % in.  To correct this, pad data.data with NaNs until its length
225                 % equals that of data.vars...
226                 if (length(data.data) < length(data.vars))
227                     data.data = padarray(data.data, [0 length(data.vars)-length(data.data)], NaN, 'post');
228                 end
229
230                 % populate variables with data...
231                 if(~isempty(data.data))
232                     ptime_dbd = [ptime_dbd; data.data(:,strmatch('m_present_time', data.vars, 'exact'))];               % present time
233                     horizontalVelocity = [horizontalVelocity; data.data(:,strmatch('m_speed', data.vars, 'exact'))];    % horizontal glider velocity     
234                     depth = [depth; data.data(:,strmatch('m_depth', data.vars, 'exact'))];                              % depth     
235                     pitch = [pitch; data.data(:,strmatch('m_pitch', data.vars, 'exact'))];                              % pitch (radians)
236                     avgDepthRate = [avgDepthRate; data.data(:,strmatch('m_avg_depth_rate', data.vars, 'exact'))];       % avg depth rate
237                     angleOfAttack = [angleOfAttack; data.data(:,strmatch('u_angle_of_attack', data.vars, 'exact'))];    % angle of attack (radians)
238                   %  wptLat = [wptLat; data.data(:,strmatch('c_wpt_lat', data.vars, 'exact'))];                          % Waypoint latitude
239                   %  wptLon = [wptLon; data.data(:,strmatch('c_wpt_lon', data.vars, 'exact'))];                          % Waypoint longitude
240                     gpsLat = [gpsLat; data.data(:,strmatch('m_gps_lat', data.vars, 'exact'))];                          % GPS latitude
241                     gpsLon = [gpsLon; data.data(:,strmatch('m_gps_lon', data.vars, 'exact'))];                          % GPS longitude
242                   %  lat = [lat; data.data(:,strmatch('m_lat', data.vars, 'exact'))];                                    % latitude
243                   %  lon = [lon; data.data(:,strmatch('m_lon', data.vars, 'exact'))];                                    % longitude
244                 end
245
246                 data = [];
247             end
248         end
249         %**************************************************************************
250
251
252         % first, apply the sort() function to make sure that values in the time vectors
253         % (ptime and ptime_dbd) increase monotonically...
254         [Y,I] = sort(ptime);
255         ptime = Y;
256         temp = temp(I);
257         cond = cond(I);
258         pres = pres(I);
259         ctd_time=ctd_time(I);
260
261         [Y,I] = sort(ptime_dbd);
262         ptime_dbd = Y;
263         horizontalVelocity = horizontalVelocity(I);
264         depth = depth(I);
265         pitch = pitch(I);
266         avgDepthRate = avgDepthRate(I);
267         angleOfAttack = angleOfAttack(I);
268         %wptLat = wptLat(I);
269         %wptLon = wptLon(I);
270         gpsLat = gpsLat(I);
271         gpsLon = gpsLon(I);
272         %lat = lat(I);
273         %lon = lon(I);
274
275
276         % remove ctd measurements when ptime and ctd_time are a lot different
277         iweird=find(ptime-ctd_time > 10);
278         ptime(iweird)=NaN; temp(iweird)=NaN; pres(iweird)=NaN; cond(iweird)=NaN;
279         ctd_time(iweird)=NaN;
280
281         % remove nans from EBD data...
282         % HES - need full triplet from CTD
283         i = find(~isnan(temp) & ~isnan(pres) & ~isnan(cond));
284         ptime = ptime(i); temp = temp(i); cond = cond(i); pres = pres(i);
285         ctd_time = ctd_time(i);
286
287         % remove conductivity values less than 1, must be at surface or bad
288         i = find(cond>=1);
289         ptime = ptime(i);  temp = temp(i);  pres = pres(i);  cond = cond(i);
290         ctd_time = ctd_time(i);
291
292         % remove pressure values less than 0
293         i = find(pres>=0);
294         ptime = ptime(i);  temp = temp(i);  pres = pres(i);  cond = cond(i);
295         ctd_time = ctd_time(i);
296
297         % some QC - use diff to ID spikes in temperature and conductivity and
298         % remove them
299         % these values chosen from looking at ramses, may need different set for
300         % pelagia
301
302         if(gliderIndex == 2) % apply only to ramses
303             ib=find(abs(diff(temp))>1.);
304             ib2=find(abs(diff(cond))>0.15);
305             ibb=union(ib,ib2);
306             temp(ibb+1)=NaN;
307             cond(ibb+1)=NaN;
308             i=find(~isnan(temp));
309             ptime = ptime(i);  temp = temp(i);  pres = pres(i);  cond = cond(i);
310             ctd_time = ctd_time(i);
311         elseif(gliderIndex == 1)
312             ib=find(abs(diff(temp))>1.5);
313             ib2=find(abs(diff(cond))>0.1);
314             ibb=union(ib,ib2);
315             temp(ibb+1)=NaN;
316             cond(ibb+1)=NaN;
317             i=find(~isnan(temp));
318             ptime = ptime(i);  temp = temp(i);  pres = pres(i);  cond = cond(i);
319             ctd_time = ctd_time(i);
320         end
321
322         % convert pitch and angle of attack from radians to degrees...
323         pitch = pitch*180/pi;
324         angleOfAttack = angleOfAttack*180/pi;
325
326         % compute actual glide angle = pitch + angle of attack...
327         glideAngle = pitch + angleOfAttack;
328
329         % make copy of dbd time stamp vector for use in salinity/density correction...
330         ptime1_dbd = ptime_dbd;
331
332         % remove nans from DBD data...HES - re-wrote this to interpolate each
333         % variable to ebd timebase using all existing values.  Includes threshold
334         % on horizontal velocity of greater than zero (really important, fair number
335         % of values <0, not sure where these happen but think at surface) and >0.6
336         % m/s (less certain of this, could be looked at further)
337         i = find(~isnan(horizontalVelocity));
338         % use hv, interpolated horizontal speed BEFORE thresholding,
339         % for removing poor salinity after processing - still includes
340         % crazy speeds
341         hv = interp1(ptime1_dbd(i), horizontalVelocity(i), ctd_time);
342
343         i = find(~isnan(horizontalVelocity)&(horizontalVelocity>0.1 & horizontalVelocity<0.6));
344         horizontalVelocity = interp1(ptime1_dbd(i), horizontalVelocity(i), ctd_time);
345
346         i = find(~isnan(depth));
347         depth = interp1(ptime1_dbd(i), depth(i), ctd_time);
348
349         i = find(~isnan(pitch));
350         pitch = interp1(ptime1_dbd(i), pitch(i), ctd_time);
351
352         i = find(~isnan(avgDepthRate));
353         avgDepthRate = interp1(ptime1_dbd(i), avgDepthRate(i), ctd_time);
354
355         i = find(~isnan(glideAngle));
356         glideAngle = interp1(ptime1_dbd(i), glideAngle(i), ctd_time);
357
358         % make sure there are no NaNs in the final set of data...HES: important for
359         % horizontalVelocity - a start-up problem - just zaps opening points??
360         i = find(~isnan(horizontalVelocity));
361         horizontalVelocity = horizontalVelocity(i); depth = depth(i); pitch = pitch(i);
362         avgDepthRate = avgDepthRate(i); glideAngle = glideAngle(i);
363         ptime = ptime(i); temp = temp(i); cond = cond(i); pres = pres(i);
364         ctd_time = ctd_time(i); hv = hv(i);
365
366         % scale up the pressure...
367         pres = pres*10;
368
369         % calculate salinity (without correction)...
370         salin = sw_salt(10*cond/sw_c3515, temp, pres);
371
372         % calculate density (without correction)...
373         dens = sw_pden(salin, temp, pres, 0);
374
375         % calculate glider velocity using horizontal velocity (m_speed) and average depth rate (m_avg_depth_rate)...
376         gliderVelocity = sqrt(horizontalVelocity.^2 + avgDepthRate.^2);
377
378         % pass the correction parameters into the correctThermalLags function, which
379         % returns the corrected profile structure (with corrected temp and cond added)...
380         %
381         % profileStructure:  ptime: Present time instant at which this row was collected
382         %                    depth: Depth (pressure in decibars) measured by the CTD
383         %                    temp: Temperature measured by the CTD
384         %                    cond: Conductivity measured by the CTD
385         %                    pitch: Pitch angle of the glider (optional)
386         %
387         %
388
389         % CORRECTION SCHEME:  Pass in a glider velocity vector, so that correctThermalLag() will return
390         % profile data that has been corrected using flow speed equal to this glider velocity.
391         % Correction parameters are calculated using passed-in glider velocity.
392         profileStructure = struct('ptime', ctd_time, 'depth', pres, 'temp', temp, 'cond', cond, 'pitch', glideAngle);
393         [correctedProfileData, varargout] = correctThermalLag(profileStructure, correctionParams, gliderVelocity);
394
395         % get the corrected temperature...
396         tempCorrected = correctedProfileData.tempInCell;
397
398         % calculate the corrected salinity using the corrected temperature...
399         salinCorrected = sw_salt(10*cond/sw_c3515, tempCorrected, pres);
400
401         % implement some clean-up here?  Will eliminate a lot of points. Issue is with salinities when glider is at
402         % top or bottom of profiles.  Use original velocity measure (hv) and pitch
403         % to identify points for exclusion
404         % these values set by look at ramses; may need alternate set for
405         % pelagia (now set based on deployment 1)
406
407         if(gliderIndex == 2)
408             iv = find(hv<0.1 | hv > 0.7);
409             ip = find (abs(pitch) < 10.);
410             ib = union(iv,ip);
411             salinCorrected(ib) = NaN;
412         elseif(gliderIndex == 1)
413             iv = find(hv<0.1);
414             ip = find(pitch>5 & pitch < 15);
415             ib = union(iv,ip);
416             salinCorrected(ib) = NaN;
417         end
418            
419             % the step above likely removes many points, need to make sure that dataset
420             % is consistent, so use salinity to ID valid times going forward
421
422         i = find(~isnan(salinCorrected));
423         ptime=ptime(i);  temp=temp(i);  tempCorrected=tempCorrected(i); salin=salin(i);
424         salinCorrected=salinCorrected(i); pres=pres(i); dens=dens(i);
425        
426
427         % calculate density...should this use temp corrected?? HES - no, now have
428         % best estimate of salinity to combine with originally measured temp
429         densCorrected = sw_pden(salinCorrected, temp, pres, 0);
430
431         % convert ptime into datenum style...for plotting I think, commenting out
432         ptime_datenum = ptime/3600/24+datenum(1970, 1, 1, 0, 0, 0);
433         %ptime_datenum_dbd = ptime_dbd/3600/24+datenum(1970, 1, 1, 0, 0, 0);
434         %ptimehrly = fix(ptime_datenum*24)/24;
435         %ptimedaily = fix(ptime_datenum);
436         %ptimedaily2 = unique(ptimedaily);
437         %ptimedaily2 = ptimedaily2(1:2:end);
438
439
440         % make copies of dbd time stamp vector for use in lat/lon interpolation...
441         ptime_dbd_gps = ptime_dbd;
442         %ptime_dbd_wpt = ptime_dbd;
443
444         % convert lats and lons to digital degrees...
445         gpsLat = ddmm2decdeg(gpsLat);
446         gpsLon = ddmm2decdeg(gpsLon);
447         %wptLat = ddmm2decdeg(wptLat);
448         %wptLon = ddmm2decdeg(wptLon);
449         %lat = ddmm2decdeg(lat);
450         %lon = ddmm2decdeg(lon);
451
452         % eliminate outliers in gpsLat, gpsLon...
453         i = find(abs(gpsLat) <= 90.0);
454         gpsLat = gpsLat(i);  gpsLon = gpsLon(i);  ptime_dbd_gps = ptime_dbd_gps(i);
455         i = find(abs(gpsLon) <= 180.0);
456         gpsLat = gpsLat(i);  gpsLon = gpsLon(i);  ptime_dbd_gps = ptime_dbd_gps(i);
457
458         % eliminate nans before interpolating...
459         i = find(~isnan(gpsLat));
460         gpsLat = gpsLat(i);  gpsLon = gpsLon(i);  ptime_dbd_gps = ptime_dbd_gps(i);
461         %i = find(~isnan(wptLat));
462         %wptLat = wptLat(i);  wptLon = wptLon(i);  ptime_dbd_wpt = ptime_dbd_wpt(i);
463
464         % interpolate DBD lat/lon data to align with EBD data...
465         gpsLat = interp1(ptime_dbd_gps, gpsLat, ptime);
466         gpsLon = interp1(ptime_dbd_gps, gpsLon, ptime);
467         %wptLat = interp1(ptime_dbd_wpt, wptLat, ptime);
468         %wptLon = interp1(ptime_dbd_wpt, wptLon, ptime);
469
470         % use sw_dpth() to calculate depth from pres...
471         depth = sw_dpth(pres, gpsLat);
472
473
474         % create configuration struct...
475         units = struct(... %'chlor', 'micrograms liter-1',...
476                        'dens', 'kg m-3',...
477                        'densCorrected', 'kg m-3',...
478                        'depth', 'm',...
479                        'gpsLat', 'decimal degrees',...
480                        'gpsLon', 'decimal degrees',...
481                        'pres', 'decibars',...
482                        'ptime', 'seconds since 0000-01-01T00:00',...
483                        'ptime_datenum', 'seconds since 0000-01-01T00:00',...
484                        'salin', 'psu',...
485                        'salinCorrected', 'psu',...
486                        'temp', 'deg C');
487
488         variable_description = struct(... %'chlor', 'chlorophyll measured by glider',...
489                                       ... %'chlorBounds', 'default chlorophyll bounds for plots',...
490                                       'dens', 'density measured by glider',...
491                                       'densBounds', 'default density bounds for plots',...
492                                       'densCorrected', 'density corrected for thermal lag',...
493                                       'depth', 'depth calculated as function of pressure and position latitude',...
494                                       'gpsLat', 'position latitude measured by glider GPS',...
495                                       'gpsLon', 'position longitude measured by glider GPS',...
496                                       'pres', 'pressure measured by glider',...
497                                       'ptime', 'time vector reported by glider',...
498                                       'ptime_datenum', 'Serial Date Number string',...
499                                       'salin', 'salinity measured by glider',...
500                                       'salinBounds', 'default salinity bounds for plots',...
501                                       'salinCorrected', 'salinity corrected for thermal lag',...
502                                       'temp', 'temperature measured by glider',...
503                                       'tempBounds', 'default temperature bounds for plots');
504
505         correction_parameters = struct('alpha_offset', correctionParams(1),...
506                                        'alpha_slope', correctionParams(2),...
507                                        'tau_offset', correctionParams(3),...
508                                        'tau_slope', correctionParams(4));
509
510         config = struct('glider_name', strGliderName,...
511                         'deployment_number', strDeploymentNumber,...
512                         'start_date', strStartDate,...
513                         'end_date', strEndDate,...
514                         'thermal_lag_correction_parameters', correction_parameters,...
515                         'var_descriptions', variable_description,...
516                         'var_units', units);
517
518         % set Level 1 data mat file name...
519         strMatFileName = strcat(strGliderName, '_Deployment', strDeploymentNumber, '_CTD_L1.mat');
520
521
522
523         % save glider/deployment data to mat file...
524         save(strMatFileName,...
525              'config',...
526              ...% 'chlor',...
527              ...% 'chlorBounds',...
528              'dens',...
529              'densBounds',...
530              'densCorrected',...
531              'depth',...
532              'gpsLat',...
533              'gpsLon',...
534              'pres',...
535              'ptime',...
536              'ptime_datenum',...
537              'salin',...
538              'salinBounds',...
539              'salinCorrected',...
540              'temp',...
541              'tempBounds');
542     end
543 end
544
Note: See TracBrowser for help on using the browser.