function downcast(data, crd, cfl); % DOWNCAST - Select the start and end of the cast to process % Brian Schlining % 27 Jan 2000 global figHandle plotHandle hndl column btnClrUp = [1 .6 .6]; btnClrDwn = [ .6 1 .6]; lineColor = [0.74 0.74 1]; Marker = 'ko'; switch nargin case 1 if isstr(data) action = data; else column = data; action = 'newView'; end case 3 action = 'init'; end %fprintf('************downcast(%s,%i)**************\n', action, column); switch action case 'init' localinitfig(data, crd, cfl); case 'newView' % Switch the view to a new variable UserData = get(figHandle, 'UserData'); i = find(strcmp(UserData.fields, 'Depth')); if column == i downcast('depthView'); else Y = UserData.data(:,i); X = UserData.data(:,column); plot(X,Y, 'Color', lineColor) set(gca, 'YDir', 'reverse', 'XScale', 'log') title(UserData.fields{column}); xlabel(UserData.units{column}); ylabel('Depth'); lims = UserData.lims(1):UserData.lims(2); hold on plotHandle = plot(X(lims),Y(lims),'r'); hndl(1) = plot(X(UserData.lims(1)),Y(UserData.lims(1)),'ro'); %,'ButtonDownFcn','downcast(''AdjustLow'')'); hndl(2) = plot(X(UserData.lims(2)),Y(UserData.lims(2)),'ro'); %,'ButtonDownFcn','downcast(''AdjustHigh'')'); hold off end case 'depthView' UserData = get(figHandle, 'UserData'); X = UserData.data(:,column); plot(X,'Color', lineColor); set(gca, 'YDir', 'reverse') xlabel('Data point'); ylabel('Depth'); lims = UserData.lims(1):UserData.lims(2); X2 = ones(size(X))*NaN; X2(lims) = X(lims); hold on plotHandle = plot(X2,'r'); hndl(1) = plot(UserData.lims(1),X(UserData.lims(1)),Marker,'MarkerFaceColor',btnClrUp,'ButtonDownFcn',... 'downcast(''AdjustHigh'');'); hndl(2) = plot(UserData.lims(2),X(UserData.lims(2)),Marker,'MarkerFaceColor',btnClrUp,'ButtonDownFcn',... 'downcast(''AdjustLow'');'); hold off case 'AdjustLow' set(figHandle,'WindowButtonUpFcn', 'downcast(''buttonupLow'')', ... 'WindowButtonMotionFcn', 'downcast(''setLow'');'); set(hndl(2),'MarkerFaceColor',btnClrDwn); % Turn marker green while selected downcast('setLow'); % Update new marker position case 'AdjustHigh' % If high marker is selected set(figHandle,'WindowButtonUpFcn', 'downcast(''buttonupHigh'')', ... 'WindowButtonMotionFcn', 'downcast(''setHigh'');'); set(hndl(1),'MarkerFaceColor',btnClrDwn); % Turn marker green while selected downcast('setHigh'); % Update new marker position case 'setLow' % Set low marker position while selected pt = get(gca,'CurrentPoint'); UserData = get(figHandle, 'UserData'); i = find(strcmp(UserData.fields, 'Depth')); Y = UserData.data(:,column); ptX = pt(1); ptY = Y(round(ptX)); UserData.lims = [UserData.lims(1) round(pt(1)) ]; set(figHandle,'UserData',UserData) set(hndl(2),'XData',ptX,'YData',ptY,'ButtonDownFcn','downcast(''AdjustLow'');'); case 'setHigh' % Set high marker position while selected pt = get(gca,'CurrentPoint'); UserData = get(figHandle, 'UserData'); i = find(strcmp(UserData.fields, 'Depth')); Y = UserData.data(:,column); ptX = pt(1); ptY = Y(round(ptX)); UserData.lims = [round(pt(1)) UserData.lims(2)]; set(gcf,'UserData',UserData) set(hndl(1),'XData',ptX,'YData',ptY,'ButtonDownFcn','downcast(''AdjustHigh'');'); case 'buttonupLow' % Turn marker red when released% Marker released set(figHandle,'WindowButtonUpFcn', '','WindowButtonMotionFcn', ''); set(hndl(2),'MarkerFaceColor',btnClrUp); UserData = get(figHandle, 'UserData'); lims = UserData.lims(1):UserData.lims(2); X = UserData.data(:,column); X2 = ones(size(X))*NaN; X2(lims) = X(lims); set(plotHandle,'YData', X2); case 'buttonupHigh' % Turn marker red whn released% Marker released set(figHandle,'WindowButtonUpFcn', '','WindowButtonMotionFcn', ''); set(hndl(1),'MarkerFaceColor',btnClrUp); UserData = get(figHandle, 'UserData'); lims = UserData.lims(1):UserData.lims(2); X = UserData.data(:,column); X2 = ones(size(X))*NaN; X2(lims) = X(lims); set(plotHandle,'YData', X2); case 'exit' UserData = get(figHandle, 'UserData'); lims = UserData.lims; close(figHandle); return end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function localinitfig(data, crd, cfl) global figHandle column % Create labelS labelS = sprintf('''>&%s'',',cfl.info(:).description); % turn descriptions into an evaluable string labelS(end) = 32; % change last character from comma to blank %labelS = ['''&Sensor'',',labelS,'''>&EXIT''']; % add &Depth to the start of the string labelS = ['''&Sensor'',',labelS]; labelS = eval(['str2mat(' labelS ')']); % Change to a character matrix % create callback strings % turn descriptions into evaluable string of calls to viewadcp callS = sprintf('''downcast(%i);'',',1:length(cfl.info)); callS(end) = 32; % change last character from comma to blank %callS = [''''',',callS,'''downcast(''''exit'''');''']; % &Depth callback must be empty '' callS = [''''',',callS]; callS = eval(['str2mat(' callS ')']); % change to a character matrix %=================== % Create the figure %=================== figHandle = figure; % create figure and get handle makemenu(figHandle,labelS,callS); % create menu %================================== % Set intial guess to the downcast %================================== fields = {cfl.info.description}; i = find(strcmp(fields, 'Depth')); depth = data(:,i); column = i; crdFields = fieldnames(crd); good = find(strcmp(crdFields, 'endDowncastRecord')); if isempty(good) bottom = find(depth == max(depth)); else bottom = crd.endDowncastRecord + 1; end bad = find(depth < 0); depth(bad) = NaN; top = min(find(depth == nanmin(depth(1:bottom)))); UserData.lims = [top bottom]; UserData.data = data; UserData.fields = {cfl.info.description}; UserData.units = {cfl.info.units}; set(figHandle, 'UserData', UserData); downcast('newView');