source: trunk/src/get_field.m @ 672

Last change on this file since 672 was 672, checked in by sommeria, 11 years ago

various bugs corrected

File size: 35.3 KB
Line 
1%'get_field': display variables and attributes from a Netcdf file, and OK selected fields
2%------------------------------------------------------------------------
3%function varargout = get_field(varargin)
4% associated with the GUI get_field.fig
5%
6%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
7%  Copyright Joel Sommeria, 2008, LEGI / CNRS-UJF-INPG, sommeria@coriolis-legi.org.
8%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
9%     This file is part of the toolbox UVMAT.
10%
11%     UVMAT is free software; you can redistribute it and/or modify
12%     it under the terms of the GNU General Public License as published by
13%     the Free Software Foundation; either version 2 of the License, or
14%     (at your option) any later version.
15%
16%     UVMAT is distributed in the hope that it will be useful,
17%     but WITHOUT ANY WARRANTY; without even the implied warranty of
18%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19%     GNU General Public License (file UVMAT/COPYING.txt) for more details.
20%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
21
22function varargout = get_field(varargin)
23
24% Last Modified by GUIDE v2.5 09-Jun-2013 11:15:54
25
26% Begin initialization code - DO NOT EDIT
27gui_Singleton = 1;
28gui_State = struct('gui_Name',       mfilename, ...
29                   'gui_Singleton',  gui_Singleton, ...
30                   'gui_OpeningFcn', @get_field_OpeningFcn, ...
31                   'gui_OutputFcn',  @get_field_OutputFcn, ...
32                   'gui_LayoutFcn',  [] , ...
33                   'gui_Callback',   []);
34if nargin && ischar(varargin{1})&& ~isempty(regexp(varargin{1},'_Callback','once'))
35    gui_State.gui_Callback = str2func(varargin{1});
36end
37
38if nargout
39    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
40else
41    gui_mainfcn(gui_State, varargin{:});
42end
43% End initialization code - DO NOT EDIT
44
45%------------------------------------------------------------------------
46% --- Executes just before get_field is made visible.
47%------------------------------------------------------------------------
48function get_field_OpeningFcn(hObject, eventdata, handles,filename,ParamIn)
49
50%% GUI settings
51handles.output = 'Cancel';
52guidata(hObject, handles);
53set(hObject,'WindowButtonDownFcn',{'mouse_down'}) % allows mouse action with right button (zoom for uicontrol display)
54
55%% enter input data
56set(handles.inputfile,'String',filename)% fill the input file name
57Field=nc2struct(filename,[]);% reads the  field structure, without the variables
58if isfield(Field,'Txt')
59    msgbox_uvmat('ERROR',['get_field/nc2struct/' Field.Txt])% display error message for input fiel reading
60    return
61end
62if ~isfield(Field,'ListVarName')
63    return
64end
65if ~exist('ParamIn','var')
66    ParamIn=[];
67end
68
69%% look at singletons and variables with a single dimension
70Field.Display=Field;
71Field.Check0D=zeros(size(Field.ListVarName));% =1 for arrays with a single value
72NbVar=numel(Field.VarDimName);
73for ilist=1:NbVar
74    if ischar(Field.VarDimName{ilist})
75        Field.VarDimName{ilist}={Field.VarDimName{ilist}}; %transform string into cell
76    end
77    NbDim=numel(Field.VarDimName{ilist});
78    check_singleton=false(1,NbDim);
79    for idim=1:NbDim
80        dim_index=strcmp(Field.VarDimName{ilist}{idim},Field.ListDimName);%index in the list of dimensions
81        check_singleton(idim)=isequal(Field.DimValue(dim_index),1);%check_singleton=1 for singleton
82    end
83    Field.Check0D(ilist)=(isequal(check_singleton,ones(1,NbDim)));% =1 if the variable reduces to a single value
84    if ~Field.Check0D(ilist)
85    Field.Display.VarDimName{ilist}=Field.VarDimName{ilist}(~check_singleton);% eliminate singletons in the list of variable dimensions
86    end
87    %Field.NbDim(ilist)=numel(Field.VarDimNameNonSingleton{ilist});%nbre of array dimensions after elimination of singletons
88end
89if ~isfield(Field,'VarAttribute')
90    Field.VarAttribute={};
91end
92if numel(Field.VarAttribute)<NbVar% complement VarAttribute by blanjs if neded
93    Field.VarAttribute(numel(Field.VarAttribute)+1:NbVar)=cell(1,NbVar-numel(Field.VarAttribute));
94end
95% Field.Display = list of variables and corresponding properties obtained after removal of singletons
96Field.Display.ListVarName=Field.ListVarName(~Field.Check0D);
97Field.Display.VarAttribute=Field.VarAttribute(~Field.Check0D);
98Field.Display.VarDimName=Field.Display.VarDimName(~Field.Check0D);
99Field.Display.DimValue=Field.DimValue(Field.DimValue~=1);
100Field.Display.ListDimName=Field.ListDimName(Field.DimValue~=1);
101
102%% analyse the input field cells
103[CellInfo,NbDim,errormsg]=find_field_cells(Field.Display);
104if ~isempty(errormsg)
105    msgbox_uvmat('ERROR',['get_field / Field_input / find_field_cells: ' errormsg])
106    return
107end
108[Field.MaxDim,imax]=max(NbDim);
109
110%% set time mode
111ListSwitchVarIndexTime={'file index'};% default setting: the time is the file index
112% look at global attributes with numerical values
113check_numvalue=false;
114check_time=false;
115for ilist=1:numel(Field.ListGlobalAttribute)
116    Value=Field.(Field.ListGlobalAttribute{ilist});
117    check_numvalue(ilist)=isnumeric(Value);
118    check_time(ilist)=~isempty(find(regexp(Field.ListGlobalAttribute{ilist},'Time'),1));
119end
120Field.Display.ListGlobalAttribute=Field.ListGlobalAttribute(check_numvalue);% select the attributes with float numerical value
121if ~isempty(Field.Display.ListGlobalAttribute)
122    ListSwitchVarIndexTime=[ListSwitchVarIndexTime; {'attribute'}];% the time can be chosen as a global attribute
123end
124nboption=numel(ListSwitchVarIndexTime);
125if Field.MaxDim>=2
126    ListSwitchVarIndexTime=[ListSwitchVarIndexTime;{'variable'};{'dim index'}];% the time can be chosen as a dim index
127end
128if ~isempty(find(check_time, 1))
129    set(handles.SwitchVarIndexTime,'Value',2);
130else
131    set(handles.SwitchVarIndexTime,'Value',1);
132end
133set(handles.SwitchVarIndexTime,'String',ListSwitchVarIndexTime)
134set(handles.get_field,'UserData',Field);% record the finput field structure
135SwitchVarIndexTime_Callback([], [], handles)
136
137%% set vector menu (priority) if detected or scalar menu for space dim >=2, or usual (x,y) plot for 1D fields
138set(handles.vector_x,'String',Field.Display.ListVarName)% fill the menu of x vector components
139set(handles.vector_y,'String',Field.Display.ListVarName)% fill the menu of y vector components
140set(handles.vector_z,'String',[{''} Field.Display.ListVarName])% fill the menu of y vector components
141set(handles.vec_color,'String',[{''} Field.Display.ListVarName])% fill the menu of y vector components
142set(handles.scalar,'Value',1)% fill the menu of y vector components
143set(handles.scalar,'String',Field.Display.ListVarName)% fill the menu of y vector components
144set(handles.ordinate,'Value',1)% fill the menu of y vector components
145set(handles.ordinate,'String',Field.Display.ListVarName)% fill the menu of y vector components
146if isfield(Field,'Conventions')&& strcmp(Field.Conventions,'uvmat/civdata')
147    set(handles.FieldOption,'String',{'1D plot';'scalar';'vectors';'civdata...'})
148else
149    set(handles.FieldOption,'String',{'1D plot';'scalar';'vectors'})
150end
151if Field.MaxDim>=2 % case of 2D (or 3D) fields
152    if isfield(CellInfo{imax},'VarIndex_vector_x') &&  isfield(CellInfo{imax},'VarIndex_vector_y')
153        set(handles.FieldOption,'Value',3)% set vector selection option
154        set(handles.vector_x,'Value',CellInfo{imax}.VarIndex_vector_x(1))
155        set(handles.vector_y,'Value',CellInfo{imax}.VarIndex_vector_y(1))
156        set(handles.FieldOption,'Value',3)
157    else
158        set(handles.FieldOption,'Value',2)
159    end
160else % case of 1D fields
161    set(handles.FieldOption,'Value',1)
162end
163
164%% fill the general list of dimensions, variables, attributes
165if isfield(Field,'ListDimName')&&~isempty(Field.ListDimName)
166    Tabcell(:,1)=Field.ListDimName;
167    for iline=1:length(Field.ListDimName)
168        Tabcell{iline,2}=num2str(Field.DimValue(iline));
169    end
170    Tabchar=cell2tab(Tabcell,' = ');
171    set(handles.dimensions,'String',Tabchar)
172end
173set(handles.variables,'Value',1)
174set(handles.variables,'String',[{'*'} Field.ListVarName])
175variables_Callback(handles.variables,[], handles)% list the global attributes
176
177%% fill menus for coordinates and time
178FieldOption_Callback(handles.variables,[], handles)% list the global attributes
179%     if isfield(CellInfo{imax},'VarIndex_coord_x')&&  isfield(CellInfo{imax},'VarIndex_coord_y')
180%         set(handles.Coord_x,'Value',CellInfo{imax}.VarIndex_coord_x(1))
181%         set(handles.Coord_y,'Value',CellInfo{imax}.VarIndex_coord_y(1))
182%     end
183
184%% Make choices of coordinates from input
185if isfield(CellInfo{imax},'CoordIndex')
186    CoordIndex=CellInfo{imax}.CoordIndex;
187    if numel(CoordIndex)==2
188        YName=Field.ListVarName{CoordIndex(1)};
189        XName=Field.ListVarName{CoordIndex(2)};
190        ListCoord=get(handles.Coord_x,'String');
191        XIndex=find(strcmp(XName,ListCoord));
192        if ~isempty(XIndex)
193            set(handles.Coord_x,'Value',XIndex)
194        end
195        YIndex=find(strcmp(YName,ListCoord));
196        if ~isempty(YIndex)
197            set(handles.Coord_y,'Value',YIndex)
198        end
199    end
200end
201
202%% put the GUI on the lower right of the sceen
203set(hObject,'Unit','pixel')
204pos_view_field=get(hObject,'Position');
205set(0,'Unit','pixels')
206ScreenSize=get(0,'ScreenSize');
207pos_view_field(1)=ScreenSize(1)+ScreenSize(3)-pos_view_field(3);
208pos_view_field(2)=ScreenSize(2);
209set(hObject,'Position',pos_view_field)
210set(handles.get_field,'WindowStyle','modal')% Make the GUI modal
211drawnow
212uiwait(handles.get_field);
213
214return
215
216SwitchVarIndexTime_Callback([],[], handles)
217
218%% set z coordinate menu if relevant
219if Field.MaxDim>=3
220    set(handles.vector_z,'Visible','on')
221    set(handles.vector_z,'String',Field.ListVarName(~Field.Check0D))
222    set(handles.Coord_z,'Visible','on')
223    set(handles.SwitchVarIndexZ,'Visible','on')
224    set(handles.Z_title,'Visible','on')
225else
226    set(handles.vector_z,'Visible','off')
227    set(handles.Coord_z,'Visible','off')
228    set(handles.Z_title,'Visible','off')
229end
230
231%------------------------------------------------------------------------
232% --- Outputs from this function are returned to the command line.
233%------------------------------------------------------------------------
234function varargout = get_field_OutputFcn(hObject, eventdata, handles)
235
236varargout{1} = handles.output;
237delete(handles.get_field)
238
239%------------------------------------------------------------------------
240% --- Executes when user attempts to close get_field.
241%------------------------------------------------------------------------
242function get_field_CloseRequestFcn(hObject, eventdata, handles)
243
244if isequal(get(handles.get_field, 'waitstatus'), 'waiting')
245    % The GUI is still in UIWAIT, us UIRESUME
246    uiresume(handles.get_field);
247else
248    % The GUI is no longer waiting, just close it
249    delete(handles.get_field);
250end
251
252%------------------------------------------------------------------------
253% --- Executes on button press in OK.
254%------------------------------------------------------------------------
255function OK_Callback(hObject, eventdata, handles)
256
257handles.output=read_GUI(handles.get_field);
258guidata(hObject, handles);% Update handles structure
259uiresume(handles.get_field);
260drawnow
261
262% -----------------------------------------------------------------------
263% --- Activated by selection in the list of variables
264% ----------------------------------------------------------------------
265function variables_Callback(hObject, eventdata, handles)
266
267Tabchar={''};%default
268Tabcell=[];
269hselect_field=get(handles.variables,'parent');
270Field=get(handles.get_field,'UserData');
271index=get(handles.variables,'Value');%index in the list 'variables'
272
273%% list global TimeAttribute names and values if index=1 (blank TimeVariable display) is selected
274if isequal(index,1)
275    set(handles.attributes_txt,'String','global attributes')
276    if isfield(Field,'ListGlobalAttribute') && ~isempty(Field.ListGlobalAttribute)
277        for iline=1:length(Field.ListGlobalAttribute)
278            Tabcell{iline,1}=Field.ListGlobalAttribute{iline};
279            if isfield(Field, Field.ListGlobalAttribute{iline})
280                val=Field.(Field.ListGlobalAttribute{iline});
281                if ischar(val);% attribute value is char string
282                    Tabcell{iline,2}=val;
283                elseif size(val,1)==1 %attribute value is a number or matlab vector
284                    Tabcell{iline,2}=num2str(val);
285                end
286            end
287        end
288        Tabchar=cell2tab(Tabcell,'=');
289    end
290    %% list Attribute names and values associated to the Variable # index-1
291else
292    list_var=get(handles.variables,'String');
293    var_select=list_var{index};
294    set(handles.attributes_txt,'String', ['attributes of ' var_select])
295    if isfield(Field,'VarAttribute')&& length(Field.VarAttribute)>=index-1
296        %         nbline=0;
297        VarAttr=Field.VarAttribute{index-1};
298        if isstruct(VarAttr)
299            attr_list=fieldnames(VarAttr);
300            for iline=1:length(attr_list)
301                Tabcell{iline,1}=attr_list{iline};
302                eval(['val=VarAttr.' attr_list{iline} ';'])
303                if ischar(val);
304                    Tabcell{iline,2}=val;
305                else
306                    Tabcell{iline,2}=num2str(val);
307                end
308            end
309        end
310    end
311   
312end
313if ~isempty(Tabcell)
314    Tabchar=cell2tab(Tabcell,'=');
315    %     Tabchar=[{''};Tabchar];
316end
317set(handles.attributes,'Value',1);% select the first item
318set(handles.attributes,'String',Tabchar);
319
320%% update dimensions;
321if isfield(Field,'ListDimName')
322    Tabdim={};%default
323    if isequal(index,1)%list all dimensions
324        dim_indices=1:length(Field.ListDimName);
325        set(handles.dimensions_txt,'String', 'dimensions')
326    else
327        DimCell=Field.VarDimName{index-1};
328        if ischar(DimCell)
329            DimCell={DimCell};
330        end
331        dim_indices=[];
332        for idim=1:length(DimCell)
333            dim_index=strcmp(DimCell{idim},Field.ListDimName);%vector with size of Field.ListDimName, =0
334            dim_index=find(dim_index,1);
335            dim_indices=[dim_indices dim_index];
336        end
337        set(handles.dimensions_txt,'String', ['dimensions of ' var_select])
338    end
339    for iline=1:length(dim_indices)
340        Tabdim{iline,1}=Field.ListDimName{dim_indices(iline)};
341        Tabdim{iline,2}=num2str(Field.DimValue(dim_indices(iline)));
342    end
343    Tabchar=cell2tab(Tabdim,' = ');
344    Tabchar=[{''} ;Tabchar];
345    set(handles.dimensions,'Value',1)
346    set(handles.dimensions,'String',Tabchar)
347end
348
349%------------------------------------------------------------------------
350% --- Executes on selection change in FieldOption.
351%------------------------------------------------------------------------
352function FieldOption_Callback(hObject, eventdata, handles)
353
354Field=get(handles.get_field,'UserData');
355FieldList=get(handles.FieldOption,'String');
356FieldOption=FieldList{get(handles.FieldOption,'Value')};
357switch FieldOption
358   
359    case '1D plot'
360        set(handles.Coordinates,'Visible','on')
361        set(handles.PanelOrdinate,'Visible','on')
362        pos=get(handles.PanelOrdinate,'Position');
363        pos(1)=2;
364        pos_coord=get(handles.Coordinates,'Position');
365        pos(2)=pos_coord(2)-pos(4)-2;
366        set(handles.PanelOrdinate,'Position',pos)
367        set(handles.PanelScalar,'Visible','off')
368        set(handles.PanelVectors,'Visible','off')
369        set(handles.Coord_y,'Visible','off')
370        set(handles.Y_title,'Visible','off')
371        set(handles.Coord_z,'Visible','off')
372        set(handles.Z_title,'Visible','off')
373        ordinate_Callback(hObject, eventdata, handles)
374       
375    case 'scalar'
376        set(handles.Coordinates,'Visible','on')
377        set(handles.PanelOrdinate,'Visible','off')
378        set(handles.PanelScalar,'Visible','on')
379        set(handles.PanelVectors,'Visible','off')
380        pos=get(handles.PanelScalar,'Position');
381        pos(1)=2;
382        pos_coord=get(handles.Coordinates,'Position');
383        pos(2)=pos_coord(2)-pos(4)-2;
384        set(handles.PanelScalar,'Position',pos)
385        set(handles.Coord_y,'Visible','on')
386        set(handles.Y_title,'Visible','on')
387        %default scalar selection
388        test_coord=zeros(size(Field.Display.VarDimName)); %=1 when variable #ilist is eligible as structured coordiante
389        for ilist=1:numel(Field.Display.VarDimName)
390            if isfield(Field.Display,'VarAttribute') && numel(Field.Display.VarAttribute)>=ilist && isfield(Field.Display.VarAttribute{ilist},'Role')
391                Role=Field.Display.VarAttribute{ilist}.Role;
392                if strcmp(Role,'coord_x')||strcmp(Role,'coord_y')
393                    test_coord(ilist)=1;
394                end
395            end
396            dimnames=Field.Display.VarDimName{ilist}; %list of dimensions for variable #ilist
397            if numel(dimnames)==1 && strcmp(dimnames{1},Field.Display.ListVarName{ilist})%dimension variable
398                test_coord(ilist)=1;
399            end
400        end
401        scalar_index=find(~test_coord,1);%get the first variable not a coordiante
402        if isempty(scalar_index)
403            set(handles.scalar,'Value',1)
404        else
405            set(handles.scalar,'Value',scalar_index)
406        end       
407        scalar_Callback(hObject, eventdata, handles)
408       
409    case 'vectors'
410        set(handles.Coordinates,'Visible','on')
411        set(handles.PanelOrdinate,'Visible','off')
412        set(handles.PanelScalar,'Visible','off')
413        set(handles.PanelVectors,'Visible','on')
414        pos=get(handles.PanelVectors,'Position');
415        pos(1)=2;
416        pos_coord=get(handles.Coordinates,'Position');
417        pos(2)=pos_coord(2)-pos(4)-2;
418        set(handles.PanelVectors,'Position',pos)
419        set(handles.Coord_y,'Visible','on')
420        set(handles.Y_title,'Visible','on')
421        %default vector selection
422        test_coord=zeros(size(Field.Display.VarDimName)); %=1 when variable #ilist is eligible as structured coordiante
423        for ilist=1:numel(Field.Display.VarDimName)
424            if isfield(Field.Display,'VarAttribute') && numel(Field.Display.VarAttribute)>=ilist && isfield(Field.Display.VarAttribute{ilist},'Role')
425                Role=Field.Display.VarAttribute{ilist}.Role;
426                if strcmp(Role,'coord_x')||strcmp(Role,'coord_y')
427                    test_coord(ilist)=1;
428                end
429            end
430            dimnames=Field.Display.VarDimName{ilist}; %list of dimensions for variable #ilist
431            if numel(dimnames)==1 && strcmp(dimnames{1},Field.Display.ListVarName{ilist})%dimension variable
432                test_coord(ilist)=1;
433            end
434        end
435        vector_index=find(~test_coord,2);%get the first variable not a coordiante
436        if isempty(vector_index)
437            set(handles.vector_x,'Value',1)
438            set(handles.vector_y,'Value',2)
439        else
440            set(handles.vector_x,'Value',vector_index(1))
441            set(handles.vector_y,'Value',vector_index(2))
442        end       
443        vector_Callback(handles)
444       
445    case 'civdata...'
446        set(handles.PanelOrdinate,'Visible','off')
447        set(handles.PanelScalar,'Visible','off')
448        set(handles.PanelVectors,'Visible','off')
449        set(handles.Coordinates,'Visible','off')
450end
451
452%------------------------------------------------------------------------
453function ordinate_Callback(hObject, eventdata, handles)
454%------------------------------------------------------------------------
455Field=get(handles.get_field,'UserData');
456y_index=get(handles.ordinate,'Value');
457y_menu=get(handles.ordinate,'String');
458YName=y_menu{y_index};
459
460%% set list of possible coordinates
461test_component=zeros(size(Field.Display.VarDimName));%=1 when variable #ilist is eligible as unstructured coordinate
462test_coord=zeros(size(Field.Display.VarDimName)); %=1 when variable #ilist is eligible as structured coordiante
463ListCoord={''};
464dim_var=Field.Display.VarDimName{y_index};%list of dimensions of the selected variable
465
466for ilist=1:numel(Field.Display.VarDimName)
467    dimnames=Field.Display.VarDimName{ilist}; %list of dimensions for variable #ilist
468    if isequal(dimnames,dim_var)
469        test_component(ilist)=1;
470    elseif numel(dimnames)==1 && ~isempty(find(strcmp(dimnames{1},dim_var)))%variable ilist is a 1D array which can be coordinate variable
471        test_coord(ilist)=1;
472    end
473end
474var_component=find(test_component);% list of variable indices elligible as unstructured coordinates
475var_coord=find(test_coord);% % list of variable indices elligible as structured coordinates
476ListCoord=Field.Display.ListVarName([var_component var_coord]);
477
478%% set default coord selection
479if numel(find(test_coord))>3
480    set(handles.SwitchVarIndexTime,'Value',3)% the last dim must be considered as time
481end
482if numel(var_component)<2
483    if numel(test_coord)<2
484        ListCoord={''};
485    else
486        set(handles.Coord_x,'Value',2)
487        set(handles.Coord_y,'Value',1)
488    end
489else
490    coord_val=1;
491    for ilist=1:numel(var_component)
492        ivar=var_component(ilist);
493        if isfield(Field.Display,'VarAttribute') && numel(Field.Display.VarAttribute)>=ivar && isfield(Field.Display.VarAttribute{ivar},'Role')
494            Role=Field.Display.VarAttribute{ivar}.Role;
495            if strcmp(Role,'coord_x')
496                coord_val=ilist;
497            end
498        end
499    end
500    set(handles.Coord_x,'Value',coord_val)
501end
502set(handles.Coord_x,'String',ListCoord)
503
504
505%% set list of time coordinates
506menu=get(handles.SwitchVarIndexTime,'String');
507TimeOption=menu{get(handles.SwitchVarIndexTime,'Value')};
508switch TimeOption
509    case 'variable'
510        if numel(find(test_coord))<3
511            ListTime={''};
512        else
513            ListTime=Field.Display.ListVarName(find(test_coord,end));
514        end
515        set(handles.TimeName,'Value',1)
516        set(handles.TimeName,'String',ListTime)
517    case 'dim index'
518        if numel(find(test_coord))<3
519            ListTime={''};
520        else
521            ListTime=Field.Display.VarDimName{find(test_coord,end)};
522        end
523        set(handles.TimeName,'Value',1)
524        set(handles.TimeName,'String',ListTime)
525end 
526update_field(handles,YName)
527
528%------------------------------------------------------------------------
529% --- Executes on selection change in scalar menu.
530%------------------------------------------------------------------------
531function scalar_Callback(hObject, eventdata, handles)
532
533Field=get(handles.get_field,'UserData');
534scalar_index=get(handles.scalar,'Value');
535scalar_menu=get(handles.scalar,'String');
536ScalarName=scalar_menu{scalar_index};
537
538%% set list of possible coordinates
539test_component=zeros(size(Field.Display.VarDimName));%=1 when variable #ilist is eligible as unstructured coordinate
540test_coord=zeros(size(Field.Display.VarDimName)); %=1 when variable #ilist is eligible as structured coordiante
541dim_var=Field.Display.VarDimName{scalar_index};%list of dimensions of the selected variable
542for ilist=1:numel(Field.Display.VarDimName)
543    dimnames=Field.Display.VarDimName{ilist}; %list of dimensions for variable #ilist
544    if isequal(dimnames,dim_var)
545        test_component(ilist)=1;
546    elseif numel(dimnames)==1 && ~isempty(find(strcmp(dimnames{1},dim_var)))%variable ilist is a 1D array which can be coordinate variable
547        test_coord(ilist)=1;
548    end
549end
550var_component=find(test_component);% list of variable indices elligible as unstructured coordinates
551var_coord=find(test_coord);% % list of variable indices elligible as structured coordinates
552ListCoord=Field.Display.ListVarName([var_component var_coord]);
553
554%% set default coord selection
555if numel(find(test_coord))>3
556    set(handles.SwitchVarIndexTime,'Value',3)% the last dim must be considered as time
557end
558% if numel(var_component)<2
559%     if numel(test_coord)<2
560%         ListCoord={''};
561%     else
562%         set(handles.Coord_x,'Value',2)
563%         set(handles.Coord_y,'Value',1)
564%     end
565% else
566coord_val=[0 0];
567% look for labelled unstructured coordinates
568for ilist=1:numel(var_component)
569    ivar=var_component(ilist);
570    if isfield(Field.Display,'VarAttribute') && numel(Field.Display.VarAttribute)>=ivar && isfield(Field.Display.VarAttribute{ivar},'Role')
571        Role=Field.Display.VarAttribute{ivar}.Role;
572        if strcmp(Role,'coord_x')
573            coord_val(1)=ilist;
574        elseif strcmp(Role,'coord_y')
575            coord_val(2)=ilist;
576        end
577    end
578end
579if numel(find(coord_val))<2
580    if numel(var_coord)>=2
581        coord_val=[numel(var_component)+2 numel(var_component)+1];
582    else
583        coord_val=[1 2];
584    end
585end
586set(handles.Coord_x,'Value',coord_val(1))
587set(handles.Coord_y,'Value',coord_val(2))
588set(handles.Coord_y,'String',ListCoord)
589set(handles.Coord_x,'String',ListCoord)
590
591
592%% set list of time coordinates
593menu=get(handles.SwitchVarIndexTime,'String');
594TimeOption=menu{get(handles.SwitchVarIndexTime,'Value')};
595switch TimeOption
596    case 'variable'
597        if numel(find(test_coord))<3
598            ListTime={''};
599        else
600            ListTime=Field.Display.ListVarName(find(test_coord,end));
601        end
602        set(handles.TimeName,'Value',1)
603        set(handles.TimeName,'String',ListTime)
604    case 'dim index'
605        if numel(find(test_coord))<3
606            ListTime={''};
607        else
608            ListTime=Field.Display.VarDimName{find(test_coord,end)};
609        end
610        set(handles.TimeName,'Value',1)
611        set(handles.TimeName,'String',ListTime)
612end 
613update_field(handles,ScalarName)
614
615% --- Executes on button press in check_rgb.
616function check_rgb_Callback(hObject, eventdata, handles)
617
618
619%------------------------------------------------------------------------
620% --- Executes on selection change in vector_x.
621%------------------------------------------------------------------------
622function vector_x_Callback(hObject, eventdata, handles)
623
624vector_x_menu=get(handles.vector_x,'String');
625vector_x_index=get(handles.vector_x,'Value');
626vector_x=vector_x_menu{vector_x_index};
627vector_Callback(handles)
628update_field(handles,vector_x)
629
630%------------------------------------------------------------------------
631% --- Executes on selection change in vector_x.
632function vector_y_Callback(hObject, eventdata, handles)
633%------------------------------------------------------------------------
634vector_y_menu=get(handles.vector_x,'String');
635vector_y_index=get(handles.vector_x,'Value');
636vector_y=vector_y_menu{vector_y_index};
637vector_Callback(handles)
638update_field(handles,vector_y)
639
640%------------------------------------------------------------------------
641% --- Executes on selection change in vector_z.
642function vector_z_Callback(hObject, eventdata, handles)
643%------------------------------------------------------------------------
644vector_z_menu=get(handles.vector_z,'String');
645vector_z_index=get(handles.vector_z,'Value');
646vector_z=vector_z_menu{vector_z_index};
647vector_Callback(handles)
648update_field(handles,vector_z)
649
650%------------------------------------------------------------------------
651% --- Executes on selection change in vec_color.
652function vec_color_Callback(hObject, eventdata, handles)
653%------------------------------------------------------------------------
654index=get(handles.vec_color,'Value');
655string=get(handles.vec_color,'String');
656VarName=string{index};
657vector_Callback(handles)
658update_field(handles,VarName)
659
660%------------------------------------------------------------------------
661% --- Executes on selection change in vector_x or vector_y
662function vector_Callback( handles)
663%------------------------------------------------------------------------
664Field=get(handles.get_field,'UserData');
665vector_x_index=get(handles.vector_x,'Value');
666vector_y_index=get(handles.vector_y,'Value');
667vec_color_index=get(handles.vec_color,'Value');
668
669%% set list of possible coordinates
670test_component=zeros(size(Field.Display.VarDimName));%=1 when variable #ilist is eligible as unstructured coordinate
671test_coord=zeros(size(Field.Display.VarDimName)); %=1 when variable #ilist is eligible as structured coordiante
672check_consistent=1;%check that the selected vector components (and possibly color var) have the same dimensiosn
673ListCoord={''};
674dim_var=Field.Display.VarDimName{vector_x_index};%list of dimensions of the selected variable
675if ~isequal(dim_var,Field.Display.VarDimName{vector_y_index})
676    check_consistent=0;
677elseif vec_color_index~=1 && ~isequal(dim_var,Field.Display.VarDimName{vec_color_index})
678    check_consistent=0;
679end
680% the two vector components have consistent dimensions
681if check_consistent
682    for ilist=1:numel(Field.Display.VarDimName)
683        dimnames=Field.Display.VarDimName{ilist}; %list of dimensions for variable #ilist
684        if isequal(dimnames,dim_var)
685            test_component(ilist)=1;
686        elseif numel(dimnames)==1 && ~isempty(find(strcmp(dimnames{1},dim_var)))%variable ilist is a 1D array which can be coordinate variable
687            test_coord(ilist)=1;
688        end
689    end
690    var_component=find(test_component);% list of variable indices elligible as unstructured coordiantes
691    var_coord=find(test_coord);% % list of variable indices elligible as structured coordinates
692    ListCoord=Field.Display.ListVarName([var_component var_coord]);
693   
694    %% set default coord selection
695    if numel(find(test_coord))>3
696        set(handles.SwitchVarIndexTime,'Value',3)% the last dim must be considered as time
697    end
698    if numel(var_component)<2
699        if numel(test_coord)<2
700            ListCoord={''};
701        else
702            set(handles.Coord_x,'Value',2)
703            set(handles.Coord_y,'Value',1)
704        end
705    else
706        coord_val=[0 0];
707        for ilist=1:numel(var_component)
708            ivar=var_component(ilist);
709            if isfield(Field.Display,'VarAttribute') && numel(Field.Display.VarAttribute)>=ivar && isfield(Field.Display.VarAttribute{ivar},'Role')
710                Role=Field.Display.VarAttribute{ivar}.Role;
711                if strcmp(Role,'coord_x')
712                    coord_val(1)=ilist;
713                elseif strcmp(Role,'coord_y')
714                    coord_val(2)=ilist;
715                end
716            end
717        end
718        if isempty(coord_val)
719            coord_val=var_coord;% case of dimension coordinates
720        end
721        if numel(find(coord_val))<2
722            coord_val=[numel(var_component)+2 numel(var_component)+1];
723        end
724        set(handles.Coord_x,'Value',coord_val(1))
725        set(handles.Coord_y,'Value',coord_val(2))
726    end
727end
728set(handles.Coord_y,'String',ListCoord)
729set(handles.Coord_x,'String',ListCoord)
730
731
732%% set list of time coordinates
733menu=get(handles.SwitchVarIndexTime,'String');
734TimeOption=menu{get(handles.SwitchVarIndexTime,'Value')};
735switch TimeOption
736    case 'variable'
737        if numel(find(test_coord))<3
738            ListTime={''};
739        else
740            ListTime=Field.Display.ListVarName(find(test_coord,end));
741        end
742        set(handles.TimeName,'Value',1)
743        set(handles.TimeName,'String',ListTime)
744    case 'dim index'
745        if numel(find(test_coord))<3
746            ListTime={''};
747        else
748            ListTime=Field.Display.VarDimName{find(test_coord,end)};
749        end
750        set(handles.TimeName,'Value',1)
751        set(handles.TimeName,'String',ListTime)
752end 
753
754%------------------------------------------------------------------------
755% --- Executes on selection change in SwitchVarIndexX.
756%------------------------------------------------------------------------
757function SwitchVarIndexX_Callback(hObject, eventdata, handles)
758
759%------------------------------------------------------------------------
760% --- Executes on selection change in Coord_x.
761%------------------------------------------------------------------------
762function Coord_x_Callback(hObject, eventdata, handles)
763
764index=get(handles.Coord_x,'Value');
765string=get(handles.Coord_x,'String');
766VarName=string{index};
767update_field(handles,VarName)
768
769%------------------------------------------------------------------------
770% --- Executes on selection change in Coord_y.
771%------------------------------------------------------------------------
772function Coord_y_Callback(hObject, eventdata, handles)
773
774index=get(handles.Coord_y,'Value');
775string=get(handles.Coord_y,'String');
776VarName=string{index};
777update_field(handles,VarName)
778
779%------------------------------------------------------------------------
780% --- Executes on selection change in Coord_z.
781%------------------------------------------------------------------------
782function Coord_z_Callback(hObject, eventdata, handles)
783
784index=get(handles.Coord_z,'Value');
785string=get(handles.Coord_z,'String');
786VarName=string{index};
787update_field(handles,VarName)
788
789%------------------------------------------------------------------------
790% --- Executes on selection change in SwitchVarIndexTime.
791%------------------------------------------------------------------------
792function SwitchVarIndexTime_Callback(hObject, eventdata, handles)
793
794Field=get(handles.get_field,'UserData');
795menu=get(handles.SwitchVarIndexTime,'String');
796option=menu{get(handles.SwitchVarIndexTime,'Value')};
797
798switch option
799    case 'file index'
800        set(handles.TimeName, 'Visible','off')% the time is taken as the file index
801    case 'attribute'
802        set(handles.TimeName, 'Visible','on')% timeName menu represents the available attributes
803        time_index=[];
804        PreviousList=get(handles.TimeName, 'String');
805        index=[];
806        if ~isempty(PreviousList)
807            PreviousAttr=PreviousList{get(handles.TimeName, 'Value')};
808            index=find(strcmp(PreviousAttr,Field.Display.ListGlobalAttributes));
809        end
810        if isempty(index)
811            time_index=find(~cellfun('isempty',regexp(Field.Display.ListGlobalAttribute,'Time')));% index of the attributes containing the string 'Time'
812        end
813        if ~isempty(time_index)
814            set(handles.TimeName,'Value',time_index(1))
815        else
816            set(handles.TimeName,'Value',1)
817        end
818        set(handles.TimeName, 'String',Field.Display.ListGlobalAttribute)
819    case 'variable'% TimeName menu represents the available variables
820        set(handles.TimeName, 'Visible','on')
821        TimeVarName=Field.Display.SingleVarName;% slist of variables with a single dimension (candidate for time)
822        List=get(handles.TimeName,'String');
823        option=List{get(handles.TimeName,'Value')};
824        ind=find(strcmp(option,TimeVarName));
825        if isempty(ind)
826            set(handles.TimeName, 'Value',1);
827        else
828            set(handles.TimeName, 'Value',ind);
829        end
830        set(handles.TimeName, 'String',TimeVarName)
831    case 'dim index'% TimeName menu represents the available dimensions
832        set(handles.TimeName, 'Visible','on')
833        TimeVarName=Field.Display.SingleDimName;
834        List=get(handles.TimeName,'String');
835        option=List{get(handles.TimeName,'Value')};
836        ind=find(strcmp(option,TimeVarName));
837        if isempty(ind)
838            set(handles.TimeName, 'Value',1);
839        else
840            set(handles.TimeName, 'Value',ind);
841        end
842        set(handles.TimeName, 'String',TimeVarName)
843end
844
845%-----------------------------------------------------------------------
846function update_field(handles,VarName)
847%-----------------------------------------------------------------------
848Field=get(handles.get_field,'UserData');
849index=name2index(VarName,Field.ListVarName);
850if ~isempty(index)
851    set(handles.variables,'Value',index+1)
852    variables_Callback(handles.variables, [], handles)
853end
854
855%------------------------------------------------------------------------
856% --- give index numbers of the strings str in the list ListvarName
857% -----------------------------------------------------------------------
858function VarIndex_y=name2index(cell_str,ListVarName)
859
860VarIndex_y=[];
861if ischar(cell_str)
862    for ivar=1:length(ListVarName)
863        varlist=ListVarName{ivar};
864        if isequal(varlist,cell_str)
865            VarIndex_y= ivar;
866            break
867        end
868    end
869elseif iscell(cell_str)
870    for isel=1:length(cell_str)
871        varsel=cell_str{isel};
872        for ivar=1:length(ListVarName)
873            varlist=ListVarName{ivar};
874            if isequal(varlist,varsel)
875                VarIndex_y=[VarIndex_y ivar];
876            end
877        end
878    end
879end
Note: See TracBrowser for help on using the repository browser.