0001 function varargout = VMT_BuildCustomFlatFile(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 gui_Singleton = 1;
0027 gui_State = struct('gui_Name', mfilename, ...
0028 'gui_Singleton', gui_Singleton, ...
0029 'gui_OpeningFcn', @VMT_BuildCustomFlatFile_OpeningFcn, ...
0030 'gui_OutputFcn', @VMT_BuildCustomFlatFile_OutputFcn, ...
0031 'gui_LayoutFcn', [] , ...
0032 'gui_Callback', []);
0033 if nargin && ischar(varargin{1})
0034 gui_State.gui_Callback = str2func(varargin{1});
0035 end
0036
0037 if nargout
0038 [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
0039 else
0040 gui_mainfcn(gui_State, varargin{:});
0041 end
0042
0043
0044
0045
0046 function VMT_BuildCustomFlatFile_OpeningFcn(hObject, eventdata, handles, varargin)
0047
0048
0049
0050
0051
0052
0053
0054 handles.output = hObject;
0055
0056
0057 guidata(hObject, handles);
0058
0059
0060
0061 guiparams = createGUIparams;
0062
0063
0064
0065 setappdata(handles.figure1,'guiparams',guiparams)
0066
0067
0068
0069 initGUI(handles)
0070
0071
0072
0073
0074
0075
0076 function varargout = VMT_BuildCustomFlatFile_OutputFcn(hObject, eventdata, handles)
0077
0078
0079
0080
0081
0082
0083 varargout{1} = handles.output;
0084
0085
0086
0087 function AvailableItems_Callback(hObject, eventdata, handles)
0088
0089
0090
0091
0092
0093
0094
0095
0096 function SelectedItems_Callback(hObject, eventdata, handles)
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106 function AddSelected_Callback(hObject, eventdata, handles)
0107
0108
0109
0110
0111
0112 AvailableItems = get(handles.AvailableItems,'string');
0113 SelectedItems = get(handles.SelectedItems, 'string');
0114
0115
0116 idx = get(handles.AvailableItems,'value');
0117 SelectedStr = AvailableItems(idx);
0118 NotSelectedStr = AvailableItems(~ismember(AvailableItems,SelectedStr));
0119
0120
0121 set(handles.SelectedItems, 'String', vertcat(SelectedItems,SelectedStr))
0122 set(handles.AvailableItems, 'String', NotSelectedStr)
0123
0124
0125 set(handles.AvailableItems, 'Value', [])
0126 set(handles.SelectedItems, 'Value', [])
0127
0128
0129 set_enable(handles,'itemsareselected')
0130
0131
0132
0133 function AddAll_Callback(hObject, eventdata, handles)
0134
0135
0136
0137
0138
0139 AvailableItems = get(handles.AvailableItems,'string');
0140 SelectedItems = get(handles.SelectedItems, 'string');
0141
0142
0143 set(handles.SelectedItems, 'String', vertcat(SelectedItems,AvailableItems))
0144 set(handles.AvailableItems, 'String', [])
0145
0146
0147 set(handles.AvailableItems, 'Value', [])
0148 set(handles.SelectedItems, 'Value', [])
0149
0150
0151 set_enable(handles,'itemsareselected')
0152
0153
0154
0155 function RemoveSelected_Callback(hObject, eventdata, handles)
0156
0157
0158
0159
0160
0161 AvailableItems = get(handles.AvailableItems,'string');
0162 SelectedItems = get(handles.SelectedItems, 'string');
0163
0164
0165 idx = get(handles.SelectedItems,'value');
0166 SelectedStr = SelectedItems(idx);
0167 NotSelectedStr = SelectedItems(~ismember(SelectedItems,SelectedStr));
0168
0169
0170 set(handles.AvailableItems,'String', vertcat(AvailableItems,SelectedStr))
0171 set(handles.SelectedItems, 'String', NotSelectedStr)
0172
0173
0174 set(handles.AvailableItems, 'Value', [])
0175 set(handles.SelectedItems, 'Value', [])
0176
0177
0178 if isempty(NotSelectedStr)
0179 set_enable(handles,'noitemsselected')
0180 end
0181
0182
0183
0184 function RemoveAll_Callback(hObject, eventdata, handles)
0185
0186
0187
0188
0189
0190 AvailableItems = get(handles.AvailableItems,'string');
0191 SelectedItems = get(handles.SelectedItems, 'string');
0192
0193
0194 set(handles.AvailableItems,'String', vertcat(AvailableItems,SelectedItems))
0195 set(handles.SelectedItems, 'String', [])
0196
0197
0198 set(handles.AvailableItems, 'Value', [])
0199 set(handles.SelectedItems, 'Value', [])
0200
0201
0202 set_enable(handles,'noitemsselected')
0203
0204
0205
0206 function MoveUp_Callback(hObject, eventdata, handles)
0207
0208
0209
0210
0211
0212 AvailableItems = get(handles.AvailableItems,'string');
0213 SelectedItems = get(handles.SelectedItems, 'string');
0214
0215
0216 idx = get(handles.SelectedItems,'value');
0217 SelectedStr = SelectedItems(idx);
0218 NotSelectedStr = SelectedItems(~ismember(SelectedItems,SelectedStr));
0219
0220
0221 if idx > 1
0222 top = SelectedItems(1:idx-1);
0223 bot = SelectedItems(idx+1:end);
0224 sorted = vertcat(top(1:end-1),SelectedStr,top(end),bot);
0225
0226
0227 set(handles.SelectedItems,'String',sorted)
0228
0229
0230 set(handles.SelectedItems,'Value', idx-1)
0231 end
0232
0233
0234
0235 function MoveDown_Callback(hObject, eventdata, handles)
0236
0237
0238
0239
0240
0241 AvailableItems = get(handles.AvailableItems,'string');
0242 SelectedItems = get(handles.SelectedItems, 'string');
0243
0244
0245 idx = get(handles.SelectedItems,'value');
0246 SelectedStr = SelectedItems(idx);
0247 NotSelectedStr = SelectedItems(~ismember(SelectedItems,SelectedStr));
0248
0249
0250 if idx < length(SelectedItems)
0251 top = SelectedItems(1:idx-1);
0252 bot = SelectedItems(idx+1:end);
0253 sorted = vertcat(top,bot(1),SelectedStr,bot(2:end));
0254
0255
0256 set(handles.SelectedItems,'String',sorted)
0257
0258
0259 set(handles.SelectedItems,'Value', idx+1)
0260 end
0261
0262
0263
0264 function SaveCSVFile_Callback(hObject, eventdata, handles)
0265
0266
0267
0268 guiparams = getappdata(handles.figure1,'guiparams');
0269 guiprefs = guiparams.prefs;
0270 SelectedItems = get(handles.SelectedItems, 'string');
0271
0272
0273
0274
0275 if ispref('VMT','csvexport')
0276 csvexport = getpref('VMT','csvexport');
0277 if exist(csvexport.path,'dir')
0278 guiprefs.csvexport_path = csvexport.path;
0279 else
0280 guiprefs.csvexport_path = pwd;
0281 end
0282 if exist(fullfile(csvexport.path,csvexport.file),'file')
0283 guiprefs.csvexport_file = csvexport.file;
0284 else
0285 guiprefs.csvexport_file = '';
0286 end
0287 else
0288 guiprefs.csvexport_path = pwd;
0289 guiprefs.csvexport_file = '';
0290
0291 csvexport.path = pwd;
0292 csvexport.file = '';
0293 setpref('VMT','csvexport',csvexport)
0294 end
0295
0296
0297
0298 switch guiparams.gp_vmt.gui_state
0299 case 'fileloaded'
0300
0301 Lia = ismember(...
0302 guiparams.available_variables_ascii(:,1),...
0303 SelectedItems);
0304 vars = guiparams.available_variables_ascii(Lia,2);
0305
0306
0307 outdata = [];
0308 maxr1 = size(guiparams.gp_vmt.V.mcsX,1);
0309 for i = 1:length(vars)
0310 if any(strfind(vars{i},'Roz'))
0311 Roz = regexp(vars{i},'\.','split');
0312 [r,c] = size(guiparams.gp_vmt.V.Roz.(Roz{end}));
0313 maxr2 = size(guiparams.gp_vmt.V.Roz.up,1);
0314 if r == maxr1
0315 outdata(:,i) = guiparams.gp_vmt.V.Roz.(Roz{end})(:);
0316 else
0317 outdata(:,i) = reshape(repmat(guiparams.gp_vmt.V.Roz.(Roz{end}),maxr2,1),maxr2*c,1);
0318 end
0319 else
0320 [r,c] = size(guiparams.gp_vmt.V.(vars{i}));
0321 if r == maxr1
0322 outdata(:,i) = guiparams.gp_vmt.V.(vars{i})(:);
0323 else
0324 outdata(:,i) = reshape(repmat(guiparams.gp_vmt.V.(vars{i}),maxr1,1),maxr1*c,1);
0325 end
0326 end
0327 end
0328
0329
0330 outheader = SelectedItems';
0331
0332
0333 outdata(isnan(outdata)) = -9999;
0334
0335
0336 [the_file,the_path] = ...
0337 uiputfile({'*.csv','Comma Separated Values File (*.csv)'}, ...
0338 'Choose where to save the output CSV file', ...
0339 fullfile(guiprefs.csvexport_path,guiprefs.csvexport_file));
0340
0341 if ischar(the_file)
0342
0343 str1 = repmat('%s, ',1,i); str1 = str1(1:end-2);
0344 str2 = repmat('%f, ',1,i); str2 = str2(1:end-2);
0345 headformat = [str1 '\n'];
0346 dataformat = [str2 '\n'];
0347 fid = fopen(fullfile(the_path,the_file),'w');
0348 fprintf(fid,headformat,outheader{:});
0349 fprintf(fid,dataformat,outdata');
0350 fclose(fid);
0351
0352
0353 csvexport.path = the_path;
0354 csvexport.file = the_file;
0355 setpref('VMT','csvexport',csvexport)
0356 end
0357
0358
0359 case 'multiplematfiles'
0360
0361 hwait = waitbar(0,'Processing multiple input files, please be patient...');
0362
0363
0364 Lia = ismember(...
0365 guiparams.available_variables_multi_mat(:,1),...
0366 SelectedItems);
0367 vars = guiparams.available_variables_multi_mat(Lia,2);
0368
0369
0370 drng = [guiparams.gp_vmt.depth_range_min guiparams.gp_vmt.depth_range_max];
0371 windowSize = guiparams.gp_vmt.smoothing_window_size;
0372 QuiverSpacing = guiparams.gp_vmt.vector_spacing_plan_view;
0373
0374
0375
0376
0377 zf = length(guiparams.gp_vmt.mat_file);
0378 for n = 1:zf
0379 waitbar(n/(zf+1),hwait)
0380 load(fullfile(guiparams.gp_vmt.mat_path,guiparams.gp_vmt.mat_file{n}))
0381
0382
0383 if ~isempty(drng)
0384 indx = find(V.mcsDepth(:,1) < drng(1) | V.mcsDepth(:,1) > drng(2));
0385
0386
0387 V.mcsX(indx,:) = nan;
0388 V.mcsY(indx,:) = nan;
0389 V.mcsEast(indx,:) = nan;
0390 V.mcsNorth(indx,:) = nan;
0391 clear indx
0392 end
0393
0394
0395 V.mcsX1 = nanmean(V.mcsX,1);
0396 V.mcsY1 = nanmean(V.mcsY,1);
0397
0398
0399 V.mcsEast1 = VMT_LayerAveMean(V.mcsDepth,V.mcsEast);
0400 V.mcsNorth1 = VMT_LayerAveMean(V.mcsDepth,V.mcsNorth);
0401
0402
0403
0404 if windowSize == 0
0405 V.mcsX1sm = V.mcsX1;
0406 V.mcsY1sm = V.mcsY1;
0407 V.mcsEast1sm = V.mcsEast1;
0408 V.mcsNorth1sm = V.mcsNorth1;
0409 else
0410 V.mcsEast1sm = nanmoving_average(V.mcsEast1,windowSize);
0411 V.mcsNorth1sm = nanmoving_average(V.mcsNorth1,windowSize);
0412 V.mcsX1sm = V.mcsX1;
0413 V.mcsY1sm = V.mcsY1;
0414 end
0415
0416
0417 for zi = 1 : z
0418 Mag(:,:,zi) = A(zi).Comp.mcsMag(:,:);
0419
0420 end
0421 numavg = nansum(~isnan(Mag),3);
0422 numavg(numavg==0) = NaN;
0423 enscnt = nanmean(numavg,1);
0424 [I,J] = ind2sub(size(enscnt),find(enscnt>=1));
0425 et = windowSize+J(1):QuiverSpacing:J(end);
0426
0427 if n == 1
0428
0429 lenp = 0;
0430 end
0431
0432
0433 len = length(V.mcsX1sm(1,et));
0434 table(lenp+1:len+lenp,1)=V.mcsX1sm(1,et);
0435 table(lenp+1:len+lenp,2)=V.mcsY1sm(1,et);
0436 table(lenp+1:len+lenp,3)=V.mcsDist(1,et);
0437 table(lenp+1:len+lenp,4)=V.mcsBed(1,et);
0438 table(lenp+1:len+lenp,5)=V.mcsBedElev(1,et);
0439 table(lenp+1:len+lenp,6)=nanmean(V.mcsEast1sm(:,et),1);
0440 table(lenp+1:len+lenp,7)=nanmean(V.mcsNorth1sm(:,et),1);
0441 lenp = length(V.mcsX1sm(1,et))+lenp;
0442
0443 clear A V z Mag numavg et enscnt I J
0444 end
0445
0446
0447 table(:,8)=sqrt(table(:,6).^2+table(:,7).^2);
0448 table(:,9)=ari2geodeg(atan2(table(:,7),table(:,6))*180/pi);
0449
0450
0451 outheader = SelectedItems';
0452 i = length(outheader);
0453
0454
0455 outdata = table(:,Lia);
0456 outdata(isnan(outdata)) = -9999;
0457
0458
0459 [the_file,the_path] = ...
0460 uiputfile({'*.csv','Comma Separated Values File (*.csv)'}, ...
0461 'Choose where to save the output CSV file', ...
0462 fullfile(guiprefs.csvexport_path,guiprefs.csvexport_file));
0463
0464 if ischar(the_file)
0465
0466 str1 = repmat('%s, ',1,i); str1 = str1(1:end-2);
0467 str2 = repmat('%f, ',1,i); str2 = str2(1:end-2);
0468 headformat = [str1 '\n'];
0469 dataformat = [str2 '\n'];
0470 fid = fopen(fullfile(the_path,the_file),'w');
0471 fprintf(fid,headformat,outheader{:});
0472 fprintf(fid,dataformat,outdata');
0473 fclose(fid);
0474
0475
0476 csvexport.path = the_path;
0477 csvexport.file = the_file;
0478 setpref('VMT','csvexport',csvexport)
0479 end
0480
0481 otherwise
0482 end
0483
0484
0485 if exist('hwait','var') && ishandle(hwait)
0486 waitbar(1,hwait)
0487 delete(hwait)
0488 end
0489
0490
0491 function [guiparams] = createGUIparams
0492
0493
0494
0495 hVMTgui = getappdata(0,'hVMTgui');
0496 guiparams_vmt = getappdata(hVMTgui,'guiparams');
0497 guiprefs_vmt = getappdata(hVMTgui,'guiprefs');
0498 guiparams.gp_vmt = guiparams_vmt;
0499 guiparams.prefs = guiprefs_vmt;
0500
0501
0502 guiparams.available_variables = {};
0503 guiparams.selected_variables = {};
0504 guiparams.available_variables_ascii = {...
0505 ...
0506 'X' 'mcsX';...
0507 'Y' 'mcsY';...
0508 'Z' 'mcsDepth';...
0509 'Distance' 'mcsDist';...
0510 'Bed depth' 'mcsBed';...
0511 'Bed elevation' 'mcsBedElev';...
0512 'East velocity' 'mcsEast';...
0513 'North velocity' 'mcsNorth';...
0514 'Up velocity' 'mcsVert';...
0515 'Velocity magnitude' 'mcsMag';...
0516 'Velocity direction' 'mcsDir';...
0517 'U velocity' 'u';...
0518 'V velocity' 'v';...
0519 'W velocity' 'w';...
0520 'Backscatter (smooth)' 'mcsBack';...
0521 'U (zsd) velocity' 'vp';...
0522 'V (zsd) velocity' 'vs';...
0523 'U (roz) velocity' 'Roz.up';...
0524 'V (roz) velocity' 'Roz.us';...
0525 'U (smoothed) vel' 'uSmooth';...
0526 'V (smoothed) vel' 'vSmooth';...
0527 'W (smoothed) vel' 'wSmooth';...
0528 'U (zsd,smoothed) vel' 'vpSmooth';...
0529 'V (zsd,smoothed) vel' 'vsSmooth';...
0530 'U (roz,smoothed) vel' 'Roz.upSmooth';...
0531 'V (roz,smoothed) vel' 'Roz.usSmooth';...
0532 'Backscatter (smooth)' 'mcsBackSmooth';...
0533 'Vel Direction (smooth)' 'mcsDirSmooth';...
0534 };
0535 guiparams.available_variables_single_mat = {...
0536 ...
0537 'X' 'mcsX';...
0538 'Y' 'mcsY';...
0539 'Z' 'mcsDepth';...
0540 'Distance' 'mcsDist';...
0541 'Bed depth' 'mcsBed';...
0542 'Bed elevation' 'mcsBedElev';...
0543 'East velocity' 'mcsEast';...
0544 'North velocity' 'mcsNorth';...
0545 'Up velocity' 'mcsVert';...
0546 'Velocity magnitude' 'mcsMag';...
0547 'Velocity direction' 'mcsDir';...
0548 'U velocity' 'u';...
0549 'V velocity' 'v';...
0550 'W velocity' 'w';...
0551 'Backscatter (smooth)' 'mcsBack';...
0552 'U (zsd) velocity' 'vp';...
0553 'V (zsd) velocity' 'vs';...
0554 'U (roz) velocity' 'Roz.up';...
0555 'V (roz) velocity' 'Roz.us';...
0556 'U (smoothed) vel' 'uSmooth';...
0557 'V (smoothed) vel' 'vSmooth';...
0558 'W (smoothed) vel' 'wSmooth';...
0559 'U (zsd,smoothed) vel' 'vpSmooth';...
0560 'V (zsd,smoothed) vel' 'vsSmooth';...
0561 'U (roz,smoothed) vel' 'Roz.upSmooth';...
0562 'V (roz,smoothed) vel' 'Roz.usSmooth';...
0563 'Backscatter (smooth)' 'mcsBackSmooth';...
0564 'Vel Direction (smooth)' 'mcsDirSmooth';...
0565 };
0566 guiparams.available_variables_multi_mat = {...
0567 ...
0568 'X' 'mcsX';...
0569 'Y' 'mcsY';...
0570 ...
0571 'Distance' 'mcsDist';...
0572 'Bed depth' 'mcsBed';...
0573 'Bed elevation' 'mcsBedElev';...
0574 'Layer-avg east vel' 'davE';...
0575 'Layer-avg north vel' 'davN';...
0576 'Velocity magnitude' 'Vmag';...
0577 'Velocity direction' 'Vdir';...
0578 };
0579 guiparams.available_variables_nodata = {};
0580
0581
0582
0583
0584
0585
0586
0587
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608 function initGUI(handles)
0609
0610
0611 guiparams = getappdata(handles.figure1,'guiparams');
0612
0613
0614
0615 switch guiparams.gp_vmt.gui_state
0616 case 'fileloaded'
0617 set_enable(handles,'ascii')
0618 case 'multiplematfiles'
0619 set_enable(handles,'multi-mat')
0620 case 'init'
0621 set_enable(handles,'nodata')
0622 otherwise
0623 set_enable(handles,'nodata')
0624 end
0625
0626
0627
0628
0629 function set_enable(handles,enable_state)
0630
0631
0632 guiparams = getappdata(handles.figure1,'guiparams');
0633
0634
0635 switch enable_state
0636 case 'ascii'
0637
0638 AvailableItems = get(handles.AvailableItems,'string');
0639 SelectedItems = get(handles.SelectedItems, 'string');
0640
0641
0642 set(handles.AvailableItems, 'string', guiparams.available_variables_ascii(:,1))
0643 set(handles.SelectedItems, 'string', {})
0644 case 'single-mat'
0645
0646 AvailableItems = get(handles.AvailableItems,'string');
0647 SelectedItems = get(handles.SelectedItems, 'string');
0648
0649
0650 set(handles.AvailableItems, 'string', guiparams.available_variables_single_mat(:,1))
0651 set(handles.SelectedItems, 'string', {})
0652 case 'multi-mat'
0653
0654 AvailableItems = get(handles.AvailableItems,'string');
0655 SelectedItems = get(handles.SelectedItems, 'string');
0656
0657
0658 set(handles.AvailableItems, 'string', guiparams.available_variables_multi_mat(:,1))
0659 set(handles.SelectedItems, 'string', {})
0660 case 'nodata'
0661
0662 AvailableItems = get(handles.AvailableItems,'string');
0663 SelectedItems = get(handles.SelectedItems, 'string');
0664
0665
0666 set(handles.AvailableItems, 'string', guiparams.available_variables_nodata)
0667 set(handles.SelectedItems, 'string', {})
0668 case 'itemsareselected'
0669 set(handles.SaveCSVFile,'enable','on')
0670 case 'noitemsselected'
0671 set(handles.SaveCSVFile,'enable','off')
0672 end
0673
0674
0675 setappdata(handles.figure1,'guiparams',guiparams);