source: trunk/src/series.m @ 594

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

bugs corrected. One step further for using compiled fcts and cluster with series

File size: 109.1 KB
Line 
1%'series': master function associated to the GUI series.m for analysis field series 
2%------------------------------------------------------------------------
3% function varargout = series(varargin)
4% associated with the GUI series.fig
5%
6%INPUT
7% param: structure with input parameters (link with the GUI uvmat)
8%      .menu_coord_str: string for the TransformName (menu for coordinate transforms)
9%      .menu_coord_val: value for TransformName (menu for coordinate transforms)
10%      .FileName: input file name
11%      .FileName_1: second input file name
12%      .list_field: menu of input fields
13%      .index_fields: chosen index
14%      .civ1=0 or 1, .interp1,  ... : input civ field type
15%
16%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
17%  Copyright Joel Sommeria, 2008, LEGI / CNRS-UJF-INPG, sommeria@coriolis-legi.org.
18%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
19%     This file is part of the toolbox UVMAT.
20%
21%     UVMAT is free software; you can redistribute it and/or modify
22%     it under the terms of the GNU General Public License as published by
23%     the Free Software Foundation; either version 2 of the License, or
24%     (at your option) any later version.
25%
26%     UVMAT is distributed in the hope that it will be useful,
27%     but WITHOUT ANY WARRANTY; without even the implied warranty of
28%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
29%     GNU General Public License (file UVMAT/COPYING.txt) for more details.
30%AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
31
32%------------------------------------------------------------------------
33%------------------------------------------------------------------------
34%  I - MAIN FUNCTION series
35%------------------------------------------------------------------------
36%------------------------------------------------------------------------
37function varargout = series(varargin)
38
39% Begin initialization code - DO NOT EDIT
40gui_Singleton = 1;
41gui_State = struct('gui_Name',       mfilename, ...
42                   'gui_Singleton',  gui_Singleton, ...
43                   'gui_OpeningFcn', @series_OpeningFcn, ...
44                   'gui_OutputFcn',  @series_OutputFcn, ...
45                   'gui_LayoutFcn',  [] , ...
46                   'gui_Callback',   []);
47if nargin && ischar(varargin{1})
48    gui_State.gui_Callback = str2func(varargin{1});
49end
50
51if nargout
52    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
53else
54    gui_mainfcn(gui_State, varargin{:});
55end
56% End initialization code - DO NOT EDIT
57
58%--------------------------------------------------------------------------
59% --- Executes just before series is made visible.
60%--------------------------------------------------------------------------
61function series_OpeningFcn(hObject, eventdata, handles,Param)
62
63% Choose default command line output for series
64handles.output = hObject;
65% Update handles structure
66guidata(hObject, handles);
67
68%% initial settings
69drawnow
70set(hObject,'Units','pixels')
71set(handles.PairString,'ColumnName',{'pairs'})
72set(handles.PairString,'ColumnEditable',logical(0))
73set(handles.PairString,'ColumnFormat',{'char'})
74set(handles.PairString,'Data',{''})
75series_ResizeFcn(hObject, eventdata, handles)%resize table according to series GUI size
76set(hObject,'WindowButtonDownFcn',{'mouse_down'})%allows mouse action with right button (zoom for uicontrol display)
77% check default input data
78if ~exist('Param','var')
79    Param=[]; %default
80end
81
82%% default list of functions in the mebu ActionName
83ActionList={'check_data_files';'aver_stat';'time_series';'merge_proj'};% WARNING: fits with nb_builtin_ACTION=4 in ActionName_callback
84[path_series,name,ext]=fileparts(which('series'));% path to the GUI series
85path_series_fct=fullfile(path_series,'series');%path of the functions in subdirectroy 'series'
86path_bin=fullfile(path_series,'bin');%path of the binary functions (compiled)
87ActionPathList=regexprep(ActionList,'^.+$',path_series_fct);% set path=path_series to each function in the list ('^.+$'=any non empty nbre of char form beginning to end of char string)
88ActionPathList=[ActionPathList regexprep(ActionList,'^.+$',path_bin)];% set path to compiled functions
89ActionExtList={'.m';'.sh'};% default choice of extensions (Matlab fct .m or compiled version .sh)
90RunModeList={'local';'background'};% default choice of extensions (Matlab fct .m or compiled version .sh)
91[s,w]=system('oarstat');% look for cluster system 'oar'
92if isequal(s,0)
93    RunModeList=[RunModeList;{'cluster_oar'}];
94end
95[s,w]=system('qstat');% look for cluster system 'sge'
96if isequal(s,0)
97    RunModeList=[RunModeList;{'cluster_sge'}];
98end
99set(handles.RunMode,'String',RunModeList)
100
101%% default list of functions in the mebu TransformName
102TransformList={'';'sub_field';'phys';'phys_polar'};% WARNING: must fit with the corresponding menu in uvmat and nb_builtin_transform=4 in  TransformName_callback
103path_transform_fct=fullfile(path_series,'transform_field');
104TransformPathList=regexprep(TransformList,'^.+$',path_transform_fct);% set path=path_transform_fct to each function in the list ('^.+$'=any non empty nbre of char form beginning to end of char string)
105
106%% load the personal file uvmat_perso.mat
107dir_perso=prefdir;
108profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
109if exist(profil_perso,'file')
110    h=load (profil_perso);
111    %get the list of previous input files in the upper bar menu Open
112    if isfield(h,'MenuFile')
113        for ifile=1:min(length(h.MenuFile),5)
114            eval(['set(handles.MenuFile_' num2str(ifile) ',''Label'',h.MenuFile{ifile});'])
115        end
116    end
117    %get the menu of actions
118    if isfield(h,'ActionExtListUser') && iscell(h.ActionExtListUser)
119        ActionExtList=[ActionExtList; h.ActionExtListUser];
120    end
121    if isfield(h,'ActionListUser') && iscell(h.ActionListUser) && isfield(h,'ActionPathListUser') && iscell(h.ActionPathListUser)
122        ActionList=[ActionList;h.ActionListUser];
123        ActionPathList=[ActionPathList;h.ActionPathListUser];
124    end
125    %get the menu of transform fct
126    if isfield(h,'TransformListUser') && iscell(h.TransformListUser) && isfield(h,'TransformPathListUser') && iscell(h.TransformPathListUser)
127        TransformList=[TransformList;h.TransformListUser];
128        TransformPathList=[TransformPathList;h.TransformPathListUser];
129    end
130end
131
132%% selection of the input Action fct
133ActionCheckExist=false(size(ActionList));
134for ilist=1:numel(ActionList)
135    ActionCheckExist(ilist)=exist(fullfile(ActionPathList{ilist},[ActionList{ilist} '.m']),'file');
136end
137ActionPathList=ActionPathList(ActionCheckExist,:);
138ActionList=ActionList(ActionCheckExist);
139set(handles.ActionName,'String',[ActionList;{'more...'}])
140set(handles.ActionName,'UserData',ActionPathList)
141ActionIndex=[];
142if isfield(Param,'ActionName')% copy the selected menu index transferred in Param from uvmat
143    ActionIndex=find(strcmp(Param.ActionName,ActionList),1);
144end
145if isempty(ActionIndex)
146    ActionIndex=1;
147end
148set(handles.ActionName,'Value',ActionIndex)
149set(handles.ActionPath,'String',ActionPathList{ActionIndex})
150set(handles.ActionExt,'Value',1)
151set(handles.ActionExt,'String',ActionExtList)
152
153%% selection of the input transform fct
154TransformCheckExist=false(size(TransformList));
155TransformCheckExist(1)=1;%the first option is blank: no transform, always allowed
156for ilist=2:numel(TransformList)
157    TransformCheckExist(ilist)=exist(fullfile(TransformPathList{ilist},[TransformList{ilist} '.m']),'file');
158end
159TransformPathList=TransformPathList(TransformCheckExist);
160TransformList=TransformList(TransformCheckExist);
161set(handles.TransformName,'String',[TransformList;{'more...'}])
162set(handles.TransformName,'UserData',TransformPathList)
163TransformIndex=[];
164if isfield(Param,'TransformName')% copy the selected menu index transferred in Param from uvmat
165    TransformIndex=find(strcmp(Param.TransformName,TransformList),1);
166end
167if isempty(TransformIndex)
168    TransformIndex=1;
169end
170set(handles.TransformName,'Value',TransformIndex)
171set(handles.TransformPath,'String',TransformPathList{TransformIndex})
172   
173%% fields input initialisation
174if isfield(Param,'list_fields')&& isfield(Param,'index_fields') &&~isempty(Param.list_fields) &&~isempty(Param.index_fields)
175    set(handles.FieldName,'String',Param.list_fields);% list menu fields
176    set(handles.FieldName,'Value',Param.index_fields);% selected string index
177end
178if isfield(Param,'Coord_x_str')&& isfield(Param,'Coord_x_val')
179        set(handles.Coord_x,'String',Param.Coord_x_str);% list menu fields
180    set(handles.Coord_x,'Value',Param.Coord_x_val);% selected string index
181end
182if isfield(Param,'Coord_y_str')&& isfield(Param,'Coord_y_val')
183        set(handles.Coord_y,'String',Param.Coord_y_str);% list menu fields
184    set(handles.Coord_y,'Value',Param.Coord_y_val);% selected string index
185end
186
187%% Adjust the GUI according to the binaries available in PARAM.xml
188% path_uvmat=fileparts(which('uvmat')); %path to civ
189% addpath (path_uvmat) ; %add the path to civ, (useful in case of change of working directory after civ has been s opened in the working directory)
190% errormsg=[];%default error message
191% xmlfile='PARAM.xml';
192% if exist(xmlfile,'file')
193%     try
194%         t=xmltree(xmlfile);
195%         sparam=convert(t);
196%     catch ME
197%         errormsg={' Unable to read the file PARAM.xml defining the  binaries:';ME.message};
198%     end
199% else
200%     errormsg=[xmlfile ' not found: path to binaries undefined'];
201% end
202% if ~isempty(errormsg)
203%     msgbox_uvmat('WARNING',errormsg);
204% end
205% test_batch=0;%default: ,no batch mode available
206% if isfield(sparam,'BatchParam') && isfield(sparam.BatchParam,'BatchMode')
207%     test_batch=strcmp(sparam.BatchParam.BatchMode,'sge'); %sge is currently the only implemented batch mod
208% end
209% RUNVal=get(handles.RunMode,'Value');
210% if test_batch==0
211%    if RUNVal>2
212%        set(handles.RunMode,'Value',1)
213%    end
214%    set(handles.RunMode,'String',{'local';'background'})
215% else
216%     set(handles.RunMode,'String',{'local';'background';'cluster'})
217% end
218
219%% introduce the input file name(s) if defined from input Param
220if isfield(Param,'FileName')
221    InputTable={'','','','',''}; % refresh the file input table
222    set(handles.InputTable,'Data',InputTable)
223    if isfield(Param,'FileName_1')
224        display_file_name(handles,Param.FileName_1,0)
225        display_file_name(handles,Param.FileName,1)
226    else
227        display_file_name(handles,Param.FileName,0)
228    end
229end 
230if isfield(Param,'incr_i')
231    set(handles.num_incr_i,'String',num2str(Param.incr_i))
232end
233if isfield(Param,'incr_j')
234    set(handles.num_incr_j,'String',num2str(Param.incr_j))
235end
236
237
238%------------------------------------------------------------------------
239% --- Outputs from this function are returned to the command line.
240function varargout = series_OutputFcn(hObject, eventdata, handles)
241%------------------------------------------------------------------------
242% varargout  cell array for returning output args (see VARARGOUT);
243% hObject    handle to figure
244% eventdata  reserved - to be defined in a future version of MATLAB
245% handles    structure with handles and user data (see GUIDATA)
246% Get default command line output from handles structure
247varargout{1} = handles.output;
248
249%------------------------------------------------------------------------
250%------------------------------------------------------------------------
251%  II - FUNCTIONS FOR INTRODUCING THE INPUT FILES
252% automatically sets the global properties when the rootfile name is introduced
253% then activate the view-field actionname if selected
254% it is activated either by clicking on the RootPath window or by the
255% browser
256%------------------------------------------------------------------------
257%------------------------------------------------------------------------
258function MenuBrowse_Callback(hObject, eventdata, handles)
259%------------------------------------------------------------------------   
260InputTable=get(handles.InputTable,'Data');
261if isempty(InputTable)
262    RootPathCell={};
263else
264    RootPathCell=InputTable(:,1);
265end
266oldfile=''; %default
267if isempty(RootPathCell)||isequal(RootPathCell,{''})%loads the previously stored file name and set it as default in the file_input box
268     dir_perso=prefdir;
269     profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
270     if exist(profil_perso,'file')
271          h=load (profil_perso);
272         if isfield(h,'filebase')&&ischar(h.filebase)
273                 oldfile=h.filebase;
274         end
275         if isfield(h,'RootPath')&&ischar(h.RootPath)
276                 oldfile=h.RootPath;
277         end
278     end
279else
280     SubDirCell=InputTable(:,2);
281    RootFileCell=InputTable(:,3);
282     oldfile=fullfile(RootPathCell{1},SubDirCell{1},RootFileCell{1});
283 end
284[FileName, PathName, filterindex] = uigetfile( ...
285       {'*.xml;*.xls;*.png;*.tif;*.avi;*.AVI;*.nc', ' (*.xml,*.xls, *.png,*.tif, *.avi,*.nc)';
286       '*.xml',  '.xml files '; ...
287        '*.xls',  '.xls files '; ...
288        '*.png','.png image files'; ...
289        '*.tif','.tif image files'; ...
290        '*.avi;*.AVI','.avi movie files'; ...
291        '*.nc','.netcdf files'; ...
292        '*.*',  'All Files (*.*)'}, ...
293        'Pick a file',oldfile);
294fileinput=[PathName FileName];%complete file name
295if isempty(fileinput),return;end %abandon if no file is introduced by the browser
296[path,name,ext]=fileparts(fileinput);
297if isequal(ext,'.xml')
298    [Param,Heading]=xml2struct(fileinput);
299    if ~strcmp(Heading,'Series')
300        msg_box_uvmat('ERROR','xml file heading is not <Series>')
301    else
302        fill_GUI(Param,handles.series);%fill the GUI with the parameters retrieved from the xml file
303        if isfield(Param,'CheckObject')&& Param.CheckObject
304            set_object(Param.ProjObject)
305        end
306        set(handles.REFRESH,'UserData',[1:size(Param.InputTable,1)])
307        REFRESH_Callback([],[], handles)
308        return
309    end
310elseif isequal(ext,'.xls')
311    msg_box_uvmat('ERROR','input file type not implemented')%A Faire: ouvrir le fichier pour naviguer
312else
313    display_file_name(handles,fileinput,0)
314end
315
316% --------------------------------------------------------------------
317function MenuFile_1_Callback(hObject, eventdata, handles)
318fileinput=get(handles.MenuFile_1,'Label');
319display_file_name(handles,fileinput,0)
320
321% --------------------------------------------------------------------
322function MenuFile_2_Callback(hObject, eventdata, handles)
323fileinput=get(handles.MenuFile_2,'Label');
324display_file_name(handles,fileinput,0)
325
326% --------------------------------------------------------------------
327function MenuFile_3_Callback(hObject, eventdata, handles)
328fileinput=get(handles.MenuFile_3,'Label');
329display_file_name( handles,fileinput,0)
330
331% --------------------------------------------------------------------
332function MenuFile_4_Callback(hObject, eventdata, handles)
333fileinput=get(handles.MenuFile_4,'Label');
334display_file_name(handles,fileinput,0)
335
336% --------------------------------------------------------------------
337function MenuFile_5_Callback(hObject, eventdata, handles)
338fileinput=get(handles.MenuFile_5,'Label');
339display_file_name(handles,fileinput,0)
340
341% --------------------------------------------------------------------
342function MenuBrowse_insert_Callback(hObject, eventdata, handles)
343InputTable=get(handles.InputTable,'Data');
344RootPathCell=InputTable(:,1);
345SubDirCell=InputTable(:,3);
346RootFileCell=InputTable(:,2);
347oldfile=''; %default
348if isempty(RootPathCell)||isequal(RootPathCell,{''})%loads the previously stored file name and set it as default in the file_input box
349     dir_perso=prefdir;
350     profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
351     if exist(profil_perso,'file')
352          h=load (profil_perso);
353         if isfield(h,'filebase')&ischar(h.filebase)
354                 oldfile=h.filebase;
355         end
356         if isfield(h,'RootPath')&ischar(h.RootPath)
357                 oldfile=h.RootPath;
358         end
359     end
360 else
361     oldfile=fullfile(RootPathCell{1},RootFileCell{1});
362 end
363[FileName, PathName, filterindex] = uigetfile( ...
364       {'*.xml;*.xls;*.png;*.avi;*.AVI;*.nc', ' (*.xml,*.xls, *.png, *.avi,*.nc)';
365       '*.xml',  '.xml files '; ...
366        '*.xls',  '.xls files '; ...
367        '*.png','.png image files'; ...
368        '*.avi;*.AVI','.avi movie files'; ...
369        '*.nc','.netcdf files'; ...
370        '*.*',  'All Files (*.*)'}, ...
371        'Pick a file',oldfile);
372fileinput=[PathName FileName];%complete file name
373sizf=size(fileinput);
374if (~ischar(fileinput)|~isequal(sizf(1),1)),return;end
375[path,name,ext]=fileparts(fileinput);
376if isequal(ext,'.xml')
377    msgbox_uvmat('ERROR','input file type not implemented')%A Faire: ouvrir le fichier pour naviguer
378elseif isequal(ext,'.xls')
379    msgbox_uvmat('ERROR','input file type not implemented')%A Faire: ouvrir le fichier pour naviguer
380else
381    display_file_name(handles,fileinput,'append')
382end
383
384% --------------------------------------------------------------------
385function MenuFile_insert_1_Callback(hObject, eventdata, handles)
386% --------------------------------------------------------------------   
387fileinput=get(handles.MenuFile_insert_1,'Label');
388display_file_name(handles,fileinput,'append')
389
390% --------------------------------------------------------------------
391function MenuFile_insert_2_Callback(hObject, eventdata, handles)
392% --------------------------------------------------------------------   
393fileinput=get(handles.MenuFile_insert_2,'Label');
394display_file_name(handles,fileinput,'append')
395
396% --------------------------------------------------------------------
397function MenuFile_insert_3_Callback(hObject, eventdata, handles)
398% --------------------------------------------------------------------   
399fileinput=get(handles.MenuFile_insert_3,'Label');
400display_file_name( handles,fileinput,'append')
401
402% --------------------------------------------------------------------
403function MenuFile_insert_4_Callback(hObject, eventdata, handles)
404% --------------------------------------------------------------------   
405fileinput=get(handles.MenuFile_insert_4,'Label');
406display_file_name( handles,fileinput,'append')
407
408% --------------------------------------------------------------------
409function MenuFile_insert_5_Callback(hObject, eventdata, handles)
410% --------------------------------------------------------------------   
411fileinput=get(handles.MenuFile_insert_5,'Label');
412display_file_name(handles,fileinput,'append')
413
414%------------------------------------------------------------------------
415% --- Executes when entered data in editable cell(s) in InputTable.
416function InputTable_CellEditCallback(hObject, eventdata, handles)
417%------------------------------------------------------------------------
418set(handles.REFRESH,'Visible','on')
419iview=eventdata.Indices(1);
420view_set=get(handles.REFRESH,'UserData');
421if isempty(find(view_set==iview))
422    set(handles.REFRESH,'UserData',[view_set iview])
423end
424%% enable other menus and uicontrols
425set(handles.MenuOpen_insert,'Enable','on')
426set(handles.MenuFile_insert_1,'Enable','on')
427set(handles.MenuFile_insert_2,'Enable','on')
428set(handles.MenuFile_insert_3,'Enable','on')
429set(handles.MenuFile_insert_4,'Enable','on')
430set(handles.MenuFile_insert_5,'Enable','on')
431set(handles.RUN, 'Enable','On')
432set(handles.RUN,'BackgroundColor',[1 0 0])% set RUN button to red
433
434%update the output dir
435% SubDir=sort(InputTable(:,2)); %set of subdirectories sorted in alphabetical order
436% SubDirOut=SubDir{1};
437% if numel(SubDir)>1
438%     for ilist=2:numel(SubDir)
439%         SubDirOut=[SubDirOut '-' SubDir{ilist}];
440%     end
441% end
442% set(handles.OutputSubDir,'String',SubDirOut)
443
444%------------------------------------------------------------------------
445% --- Executes on button press in REFRESH.
446function REFRESH_Callback(hObject, eventdata, handles)
447%------------------------------------------------------------------------
448InputTable=get(handles.InputTable,'Data');
449view_set=get(handles.REFRESH,'UserData');
450set(handles.REFRESH,'BackgroundColor',[0.7 0.7 0.7])% set REFRESH  button to grey color
451drawnow
452for iview=view_set
453    RootPath=fullfile(InputTable{iview,1},InputTable{iview,2});
454    if ~exist(RootPath,'dir')
455        i1_series=[];
456        RootPath=fileparts(RootPath); %will try the upped forldr
457    else
458        [RootPath,SubDir,RootFile,i1_series,i2_series,j1_series,j2_series,tild,FileType,MovieObject]=...
459            find_file_series(fullfile(InputTable{iview,1},InputTable{iview,2}),[InputTable{iview,3} InputTable{iview,4} InputTable{iview,5}]);
460    end
461    if isempty(i1_series)
462        [FileName, PathName, filterindex] = uigetfile( ...
463            {'*.xml;*.xls;*.png;*.tif;*.avi;*.AVI;*.nc', ' (*.xml,*.xls, *.png,*.tif, *.avi,*.nc)';
464            '*.xml',  '.xml files '; ...
465            '*.xls',  '.xls files '; ...
466            '*.png','.png image files'; ...
467            '*.tif','.tif image files'; ...
468            '*.avi;*.AVI','.avi movie files'; ...
469            '*.nc','.netcdf files'; ...
470            '*.*',  'All Files (*.*)'}, ...
471            ['unvalid entry at line ' num2str(iview) ', pick a file'],RootPath);
472        fileinput=[PathName FileName];%complete file name
473        if isempty(fileinput),return;end %abandon if the operation has been cancelled: no input from browser
474        [path,name,ext]=fileparts(fileinput);
475        display_file_name(handles,fileinput,iview)
476    else
477        update_rootinfo(handles,i1_series,i2_series,j1_series,j2_series,FileType,MovieObject,iview)
478    end
479end
480set(handles.REFRESH,'BackgroundColor',[1 0 0])% set REFRESH  button to grey color
481set(handles.REFRESH,'Visible','off')
482set(handles.REFRESH,'UserData',[])
483
484%------------------------------------------------------------------------
485% --- Function called when a new file is opened, either by series_OpeningFcn or by the browser
486function display_file_name(handles,fileinput,iview)
487%------------------------------------------------------------------------ 
488%
489% INPUT:
490% handles: handles of elements in the GUI
491% fielinput: input file name, including path
492% append =0 (refresh the Input table with the new file), ='append' append a new line in the table
493
494%% get the input root name, indices, file extension and nomenclature NomType
495if ~exist(fileinput,'file')
496    msgbox_uvmat('ERROR',['input file ' fileinput  ' does not exist'])
497    return
498end
499
500%% enable other menus and uicontrols
501set(handles.MenuOpen_insert,'Enable','on')
502set(handles.MenuFile_insert_1,'Enable','on')
503set(handles.MenuFile_insert_2,'Enable','on')
504set(handles.MenuFile_insert_3,'Enable','on')
505set(handles.MenuFile_insert_4,'Enable','on')
506set(handles.MenuFile_insert_5,'Enable','on')
507set(handles.RUN, 'Enable','On')
508set(handles.RUN,'BackgroundColor',[1 0 0])% set RUN button to red
509set(handles.InputTable,'BackgroundColor',[1 1 0]) % set RootPath edit box  to yellow
510drawnow
511
512%% detect root name, nomenclature and indices in the input file name:
513[FilePath,FileName,FileExt]=fileparts(fileinput);
514% detect the file type, get the movie object if relevant, and look for the corresponding file series:
515% the root name and indices may be corrected by including the first index i1 if a corresponding xml file exists
516[RootPath,SubDir,RootFile,i1_series,i2_series,j1_series,j2_series,NomType,FileType,MovieObject,i1,i2,j1,j2]=find_file_series(FilePath,[FileName FileExt]);
517if isempty(RootFile)&&isempty(i1_series)
518    errormsg='no input file in the series';
519    return
520end
521
522%% fill the list of file series
523InputTable=get(handles.InputTable,'Data');
524if strcmp(iview,'append') % display the input data as a new line in the table
525     iview=size(InputTable,1);
526     InputTable(iview+1,:)={'','','','',''};
527     InputTable(iview,:)=[{RootPath},{SubDir},{RootFile},{NomType},{FileExt}];
528elseif iview==0 % or re-initialise the list of  input  file series
529    iview=1;
530    InputTable=[{'','','','',''};{'','','','',''}];
531     InputTable(iview,:)=[{RootPath},{SubDir},{RootFile},{NomType},{FileExt}];
532    set(handles.TimeTable,'Data',[{[]},{[]},{[]},{[]}])
533    set(handles.MinIndex,'Data',[{[]},{[]}])
534    set(handles.MaxIndex,'Data',[{[]},{[]}])
535    set(handles.ListView,'Value',1)
536    set(handles.ListView,'String',{'1'})
537end
538nbview=size(InputTable,1);
539set(handles.ListView,'String',mat2cell((1:nbview)',ones(nbview,1)))
540set(handles.ListView,'Value',iview)
541set(handles.InputTable,'Data',InputTable)
542
543%% determine the selected reference field indices for pair display
544ref_i=1; %default ref_i is a reference frame index used to find existing pairs from PIV
545if ~isempty(i1)
546    ref_i=i1;
547    if ~isempty(i2)
548        ref_i=floor((ref_i+i2)/2);% reference image number corresponding to the file
549    end
550end
551set(handles.num_ref_i,'String',num2str(ref_i));
552ref_j=1; %default  ref_j is a reference frame index used to find existing pairs from PIV
553if ~isempty(j1)
554    ref_j=j1;
555    if ~isempty(j2)
556        ref_j=floor((j1+j2)/2);
557    end         
558end
559set(handles.num_ref_j,'String',num2str(ref_j));
560
561%% update the list of recent files in the menubar and save it for future opening
562MenuFile=[{get(handles.MenuFile_1,'Label')};{get(handles.MenuFile_2,'Label')};...
563    {get(handles.MenuFile_3,'Label')};{get(handles.MenuFile_4,'Label')};{get(handles.MenuFile_5,'Label')}];
564str_find=strcmp(fileinput,MenuFile);
565if isempty(find(str_find,1))
566    MenuFile=[{fileinput};MenuFile];%insert the current file if not already in the list
567end
568for ifile=1:min(length(MenuFile),5)
569    eval(['set(handles.MenuFile_' num2str(ifile) ',''Label'',MenuFile{ifile});'])
570    eval(['set(handles.MenuFile_insert_' num2str(ifile) ',''Label'',MenuFile{ifile});'])
571end
572dir_perso=prefdir;
573profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
574if exist(profil_perso,'file')
575    save (profil_perso,'MenuFile','-append'); %store the file names for future opening of uvmat
576else
577    save (profil_perso,'MenuFile','-V6'); %store the file names for future opening of uvmat
578end
579
580set(handles.InputTable,'BackgroundColor',[1 1 1])
581
582%% initiate input file series and refresh the current field view:     
583update_rootinfo(handles,i1_series,i2_series,j1_series,j2_series,FileType,MovieObject,iview);
584
585%------------------------------------------------------------------------
586% --- Update information about a new field series (indices to scan, timing,
587%     calibration from an xml file
588function update_rootinfo(handles,i1_series,i2_series,j1_series,j2_series,FileType,VideoObject,iview)
589%------------------------------------------------------------------------
590%% update the output dir
591InputTable=get(handles.InputTable,'Data');
592SubDir=sort(InputTable(1:end-1,2)); %set of subdirectories sorted in alphabetical order
593SubDirOut=SubDir{1};
594if numel(SubDir)>1
595    for ilist=2:numel(SubDir)
596        SubDirOut=[SubDirOut '-' SubDir{ilist}];
597    end
598end
599set(handles.OutputSubDir,'String',SubDirOut)
600
601%% display the min and max indices for the file series
602if size(i1_series,2)==2 && min(min(i1_series(:,1,:)))==0
603    MinIndex_j=1;
604    MaxIndex_j=1;
605    MinIndex_i=find(i1_series(:,2,:), 1 )-1;
606    MaxIndex_i=find(i1_series(:,2,:), 1, 'last' )-1;
607else
608    pair_max=squeeze(max(i1_series,[],1)); %max on pair index
609    j_max=max(pair_max,[],1);
610    %i_sum=sum(sum(i1_series,2),1);%sum of i1_series on the last index
611    MaxIndex_i=find(j_max, 1, 'last' )-1;% max ref index i
612    MinIndex_i=find(j_max, 1 )-1;% min ref index i
613    diff_i_max=diff(j_max);
614    if isequal (diff_i_max,diff_i_max(1)*ones(size(diff_i_max)))
615        set(handles.num_incr_i,'String',num2str(diff_i_max(1)))
616    end
617    i_max=max(pair_max,[],2);
618    MaxIndex_j=max(find(i_max))-1;% max ref index i
619    MinIndex_j=min(find(i_max))-1;% min ref index i
620    diff_j_max=diff(i_max);
621    if isequal (diff_j_max,diff_j_max(1)*ones(size(diff_j_max)))
622        set(handles.num_incr_j,'String',num2str(diff_j_max(1)))
623    end
624end
625MinIndex=get(handles.MinIndex,'Data');%retrieve the min indices in the table MinIndex
626MaxIndex=get(handles.MaxIndex,'Data');%retrieve the max indices in the table MaxIndex
627if isequal(MinIndex_i,-1)
628    MinIndex_i=0;
629end
630if isequal(MinIndex_j,-1)
631    MinIndex_j=0;
632end
633MinIndex{iview,1}=MinIndex_i;
634MinIndex{iview,2}=MinIndex_j;
635MaxIndex{iview,1}=MaxIndex_i;
636MaxIndex{iview,2}=MaxIndex_j;
637
638set(handles.MinIndex,'Data',MinIndex)%display the min indices in the table MinIndex
639set(handles.MaxIndex,'Data',MaxIndex)%display the max indices in the table MaxIndex
640
641%% adjust the first and last indices if requested by the bounds
642first_i=str2num(get(handles.num_first_i,'String'));
643ref_i=str2num(get(handles.num_ref_i,'String'));
644ref_j=str2num(get(handles.num_ref_j,'String'));
645if isempty(first_i)
646    first_i=ref_i;
647elseif first_i < MinIndex_i
648    first_i=MinIndex_i;
649elseif first_i >MaxIndex_i
650    first_i=MinIndex_i;
651end
652first_j=str2num(get(handles.num_first_j,'String'));
653if isempty(first_j)
654    first_j=ref_j;
655elseif first_j<MinIndex_j
656    first_j=MinIndex_j;
657elseif first_j >MaxIndex_j
658    first_j=MinIndex_j;
659end
660last_i=str2num(get(handles.num_last_i,'String'));
661if isempty(last_i)
662    last_i=ref_i;
663elseif last_i > MaxIndex_i
664    last_i=MaxIndex_i;
665elseif last_i<first_i
666    last_i=first_i;
667end
668last_j=str2num(get(handles.num_first_j,'String'));
669if isempty(last_j)
670    last_j=ref_j;
671elseif last_j>MaxIndex_j
672    last_j=MaxIndex_j;
673elseif last_i<first_i
674    last_i=first_i;
675end
676set(handles.num_first_i,'String',num2str(first_i));
677set(handles.num_first_j,'String',num2str(first_j));
678set(handles.num_last_i,'String',num2str(last_i));
679set(handles.num_last_j,'String',num2str(last_j));
680
681%% read timing and total frame number from the current file (movie files) may be overrid by xml file
682InputTable=get(handles.InputTable,'Data');
683FileBase=fullfile(InputTable{iview,1},InputTable{iview,3});
684time=[];%default
685% case of movies
686if strcmp(InputTable{iview,4},'*')
687    if ~isempty(VideoObject)
688        imainfo=get(VideoObject);
689        time=(0:1/imainfo.FrameRate:(imainfo.NumberOfFrames-1)/imainfo.FrameRate)';
690       % set(handles.Dt_txt,'String',['Dt=' num2str(1000/imainfo.FrameRate) 'ms']);%display the elementary time interval in millisec
691        ColorType='truecolor';
692    elseif ~isempty(imformats(regexprep(InputTable{iview,5},'^.',''))) || isequal(InputTable{iview,5},'.vol')%&& isequal(NomType,'*')% multi-frame image
693        if ~isempty(InputTable{iview,2})
694            imainfo=imfinfo(fullfile(InputTable{iview,1},InputTable{iview,2},[InputTable{iview,3} InputTable{iview,5}]));
695        else
696            imainfo=imfinfo([FileBase InputTable{iview,5}]);
697        end
698        ColorType=imainfo.ColorType;%='truecolor' for color images
699        if length(imainfo) >1 %case of image with multiple frames
700            nbfield=length(imainfo);
701            nbfield_j=1;
702        end
703    end
704end
705
706%%  read image documentation file  if found%%%%%%%%%%%%%%%%%%%%%%%%%%%
707XmlData=[];
708NbSlice_calib={};
709XmlFileName=find_imadoc(InputTable{iview,1},InputTable{iview,2},InputTable{iview,3},InputTable{iview,5});
710if ~isempty(XmlFileName)
711        [XmlData,warntext]=imadoc2struct(XmlFileName);
712        if isfield(XmlData,'Heading') && isfield(XmlData.Heading,'ImageName') && ischar(XmlData.Heading.ImageName)
713            [PP,FF,ext_ima_read]=fileparts(XmlData.Heading.ImageName);
714        end
715        if isfield(XmlData,'Time')
716            time=XmlData.Time;
717        end
718        if isfield(XmlData,'Camera')
719            if isfield(XmlData.Camera,'NbSlice')&& ~isempty(XmlData.Camera.NbSlice)
720                NbSlice_calib{iview}=XmlData.Camera.NbSlice;% Nbre of slices for Zindex in phys transform
721                if ~isequal(NbSlice_calib{iview},NbSlice_calib{1})
722                    msgbox_uvmat('WARNING','inconsistent number of Z indices for the two field series');
723                end
724            end
725            if isfield(XmlData.Camera,'TimeUnit')&& ~isempty(XmlData.Camera.TimeUnit)
726                TimeUnit=XmlData.Camera.TimeUnit;
727            end
728        end
729        if ~isempty(warntext)
730            msgbox_uvmat('WARNING',warntext)
731        end 
732end
733
734%% update time table
735if ~isempty(time)
736    TimeTable=get(handles.TimeTable,'Data');
737    first_i=str2num(get(handles.num_first_i,'String'));
738    last_i=str2num(get(handles.num_last_i,'String'));
739    first_j=str2num(get(handles.num_first_j,'String'));
740    last_j=str2num(get(handles.num_last_j,'String'));
741    MinIndexTable=get(handles.MinIndex,'Data');
742    MinIndex_i=MinIndexTable{iview,1};
743    MinIndex_j=MinIndexTable{iview,2};
744    MaxIndexTable=get(handles.MaxIndex,'Data');
745    MaxIndex_i=MaxIndexTable{iview,1};
746    MaxIndex_j=MaxIndexTable{iview,2};
747    if isempty(MinIndex_j)% only i index
748        if MinIndex_i>0
749            TimeTable{iview,1}=time(MinIndex_i);
750        end
751        TimeTable{iview,2}=time(first_i);
752        TimeTable{iview,3}=time(last_i);
753        TimeTable{iview,4}=time(MaxIndex_i);
754    elseif ~isempty(time)
755        if MinIndex_i>0
756            TimeTable{iview,1}=time(MinIndex_i,MinIndex_j);
757        end
758        if size(time)>=[last_i last_j]
759            TimeTable{iview,2}=time(first_i,first_j);
760            TimeTable{iview,3}=time(last_i,last_j);
761        end
762        if size(time)>=[MaxIndex_i MaxIndex_j];
763            TimeTable{iview,4}=time(MaxIndex_i,MaxIndex_j);
764        end
765    end
766    set(handles.TimeTable,'Data',TimeTable)
767end
768
769%% number of slices
770NbSlice=1;%default
771if isfield(XmlData,'GeometryCalib') && isfield(XmlData.GeometryCalib,'SliceCoord')
772    siz=size(XmlData.GeometryCalib.SliceCoord);
773    if siz(1)>1
774        NbSlice=siz(1);
775    end
776end
777set(handles.num_NbSlice,'String',num2str(NbSlice))
778   
779%% update pair menus
780set(handles.Pairs,'Visible','on')
781set(handles.PairString,'Visible','on')
782ListView=get(handles.ListView,'String');
783ListView{iview}=num2str(iview);
784set(handles.ListView,'String',ListView);
785set(handles.ListView,'Value',iview)
786update_mode(handles,i1_series,i2_series,j1_series,j2_series,time)
787
788%% update the series info in 'UserData'
789SeriesData=get(handles.series,'UserData');
790SeriesData.i1_series{iview}=i1_series;
791SeriesData.i2_series{iview}=i2_series;
792SeriesData.j1_series{iview}=j1_series;
793SeriesData.j2_series{iview}=j2_series;
794SeriesData.FileType{iview}=FileType;
795SeriesData.Time{iview}=time;
796set(handles.series,'UserData',SeriesData)
797
798%% enable j index visibilitycellfun(@isempty,regexp(PairString,'^j'))
799% state='off';
800check_jindex=~cellfun(@isempty,SeriesData.j1_series); %look for non empty j indices
801if isempty(find(check_jindex))
802    enable_j(handles,'off') % no j index needed
803else
804    PairString=get(handles.PairString,'Data');
805    if isempty(find(cellfun(@isempty,regexp(PairString,'^j'))))% if all pair string begins by j (burst)
806        enable_j(handles,'off') % no j index needed
807    else
808        enable_j(handles,'on')
809    end
810end
811
812%% display the set of existing files as an image
813set(handles.FileStatus,'Units','pixels')
814Position=get(handles.FileStatus,'Position');
815set(handles.FileStatus,'Units','normalized')
816xI=0.5:Position(3)-0.5;
817nbview=numel(SeriesData.i1_series);
818pair_max=cell(1,nbview);
819for iview=1:nbview
820    pair_max{iview}=squeeze(max(SeriesData.i1_series{iview},[],1)); %max on pair index
821    if (strcmp(get(handles.num_first_j,'Visible'),'off')&& size(pair_max{iview},2)~=1)
822        pair_max{iview}=squeeze(max(pair_max{iview},[],1)); % consider only the i index
823    end
824    index_min(iview)=find(pair_max{iview}>0, 1 );
825    index_max(iview)=find(pair_max{iview}>0, 1, 'last' );
826end
827index_min=min(index_min);
828index_max=max(index_max);
829range_index=index_max-index_min+1;
830scale_y=Position(4)/nbview;
831scale_x=Position(3)/range_index;
832x=(0.5:range_index-0.5)*Position(3)/range_index;
833% y=(0.5:nbview-0.5)*Position(4)/nbview;
834range_y=max(1,floor(Position(4)/nbview));
835CData=zeros(nbview*range_y,Position(3));
836for iview=1:nbview
837    ind_y=1+(iview-1)*range_y:iview*range_y;
838    LineData=zeros(1,range_index);
839    x_index=find(pair_max{iview}>0)-index_min+1;
840    LineData(x_index)=1;
841    if numel(x)>1
842    LineData=interp1(x,LineData,xI,'nearest');
843    CData(ind_y,:)=ones(size(ind_y'))*LineData;
844    end
845end
846CData=cat(3,zeros(size(CData)),CData,zeros(size(CData)));
847set(handles.FileStatus,'CData',CData);
848
849
850%% enable field and veltype menus, in accordance with the current action
851ActionName_Callback([],[], handles)
852
853%% check for pair display
854check_pairs=0;
855for iview=1:numel(SeriesData.i2_series)
856    if ~isempty(SeriesData.i2_series{iview})||~isempty(SeriesData.j2_series{iview})
857        check_pairs=1;
858    end
859end
860if check_pairs
861    set(handles.Pairs,'Visible','on')
862    set(handles.PairString,'Visible','on')
863else
864    set(handles.Pairs,'Visible','off')
865    set(handles.PairString,'Visible','off')
866end
867
868%% set length of waitbar
869displ_time(handles)
870
871
872%% set default options in menu 'Fields'
873switch FileType
874    case {'civx','civdata'}
875        [FieldList,ColorList]=calc_field;
876        set(handles.FieldName,'String',[{'image'};FieldList;{'get_field...'}]);%standard menu for civx data
877        set(handles.FieldName,'Value',2) % set menu to 'velocity
878        set(handles.Coord_x,'Value',1);
879        set(handles.Coord_x,'String',{'X'});
880        set(handles.Coord_y,'Value',1);
881        set(handles.Coord_y,'String',{'Y'});
882    case 'netcdf'
883        set(handles.FieldName,'Value',1)
884        set(handles.FieldName,'String',{'get_field...'})
885        if isempty(i2_series)
886            i2=[];
887        else
888            i2=i2_series(1,ref_j+1,ref_i+1);
889        end
890        if isempty(j1_series)
891            j1=[];j2=[];
892        else
893            j1=j1_series(1,ref_j+1,ref_i+1);
894            if isempty(j2_series)
895                j2=[];
896            else
897                j2=j2_series(1,ref_j+1,ref_i+1);
898            end
899        end
900        FileName=fullfile_uvmat(InputTable{iview,1},InputTable{iview,2},InputTable{iview,3},InputTable{iview,5},InputTable{iview,4},i1_series(1,ref_j+1,ref_i+1),i2,j1,j2);
901        hget_field=get_field(FileName);
902        hhget_field=guidata(hget_field);
903        get_field('RUN_Callback',hhget_field.RUN,[],hhget_field);
904    otherwise
905        set(handles.FieldName,'Value',1) % set menu to 'image'
906        set(handles.FieldName,'String',{'image'})
907        set(handles.Coord_x,'Value',1);
908        set(handles.Coord_x,'String',{'AX'});
909        set(handles.Coord_y,'Value',1);
910        set(handles.Coord_y,'String',{'AY'});
911end
912
913%------------------------------------------------------------------------
914function num_first_i_Callback(hObject, eventdata, handles)
915%------------------------------------------------------------------------
916num_last_i_Callback(hObject, eventdata, handles)
917
918%------------------------------------------------------------------------
919function num_last_i_Callback(hObject, eventdata, handles)
920%------------------------------------------------------------------------
921SeriesData=get(handles.series,'UserData');
922if ~isfield(SeriesData,'Time')
923    SeriesData.Time{1}=[];
924end
925displ_time(handles);
926
927%------------------------------------------------------------------------
928function num_first_j_Callback(hObject, eventdata, handles)
929%------------------------------------------------------------------------
930 num_last_j_Callback(hObject, eventdata, handles)
931
932%------------------------------------------------------------------------
933function num_last_j_Callback(hObject, eventdata, handles)
934%------------------------------------------------------------------------
935first_j=str2num(get(handles.num_first_j,'String'));
936last_j=str2num(get(handles.num_last_j,'String'));
937ref_j=ceil((first_j+last_j)/2);
938set(handles.num_ref_j,'String', num2str(ref_j))
939num_ref_j_Callback(hObject, eventdata, handles)
940SeriesData=get(handles.series,'UserData');
941if ~isfield(SeriesData,'Time')
942    SeriesData.Time{1}=[];
943end
944displ_time(handles);
945
946
947%------------------------------------------------------------------------
948% ---- find the times corresponding to the first and last indices of a series
949function displ_time(handles)
950%------------------------------------------------------------------------
951SeriesData=get(handles.series,'UserData');%
952ref_i=[str2num(get(handles.num_first_i,'String')) str2num(get(handles.num_last_i,'String'))];
953ref_j=[str2num(get(handles.num_first_j,'String')) str2num(get(handles.num_last_j,'String'))];
954TimeTable=get(handles.TimeTable,'Data');
955Pairs=get(handles.PairString,'Data');
956for iview=1:size(TimeTable,1)
957    if size(SeriesData.Time,1)<iview
958        break
959    end
960    i1=ref_i;
961    j1=ref_j;
962    i2=ref_i;
963    j2=ref_j;
964    % case of pairs
965    if ~isempty(Pairs{iview,1})
966        r=regexp(Pairs{iview,1},'(?<mode>(Di=)|(Dj=)) -*(?<num1>\d+)\|(?<num2>\d+)','names');
967        if isempty(r)
968            r=regexp(Pairs{iview,1},'(?<num1>\d+)(?<mode>-)(?<num2>\d+)','names');
969        end
970        switch r.mode
971            case 'Di='  %  case 'series(Di)')
972                i1=ref_i-str2num(r.num1);
973                i2=ref_i+str2num(r.num2);
974            case 'Dj='  %  case 'series(Dj)'
975                j1=ref_j-str2num(r.num1);
976                j2=ref_j+str2num(r.num2);
977            case '-'  % case 'bursts'
978                j1=str2num(r.num1)*ones(size(ref_i));
979                j2=str2num(r.num2)*ones(size(ref_i));
980        end
981    end
982    TimeTable{iview,2}=[];
983    TimeTable{iview,3}=[];
984    if size(SeriesData.Time{iview},1)>=i2(2)&&size(SeriesData.Time{iview},1)>=j2(2)
985        if isempty(ref_j)
986            time_first=(SeriesData.Time{iview}(i1(1))+SeriesData.Time{iview}(i2(1)))/2;
987            time_last=(SeriesData.Time{iview}(i1(2))+SeriesData.Time{iview}(i2(2)))/2;
988        else
989            time_first=(SeriesData.Time{iview}(i1(1),j1(1))+SeriesData.Time{iview}(i2(1),j2(1)))/2;
990            time_last=(SeriesData.Time{iview}(i1(2),j1(2))+SeriesData.Time{iview}(i2(2),j2(2)))/2;
991        end
992        TimeTable{iview,2}=time_first; %TODO: take into account pairs
993        TimeTable{iview,3}=time_last; %TODO: take into account pairs
994    end
995end
996set(handles.TimeTable,'Data',TimeTable)
997
998%% set the waitbar position with respect to the min and max in the series
999for iview=1:numel(SeriesData.i1_series)
1000    pair_max{iview}=squeeze(max(SeriesData.i1_series{iview},[],1)); %max on pair index
1001    if (strcmp(get(handles.num_first_j,'Visible'),'off')&& size(pair_max{iview},2)~=1)
1002        pair_max{iview}=squeeze(max(pair_max{iview},[],1)); % consider only the i index
1003    end
1004    pair_max{iview}=reshape(pair_max{iview},1,[]);
1005    index_min(iview)=find(pair_max{iview}>0, 1 );
1006    index_max(iview)=find(pair_max{iview}>0, 1, 'last' );
1007end
1008[index_min,iview_min]=min(index_min);
1009[index_max,iview_max]=min(index_max);
1010if size(SeriesData.i1_series{iview_min},2)==1% movie
1011    index_first=ref_i(1);
1012    index_last=ref_i(2);
1013else
1014    index_first=(ref_i(1)-1)*(size(SeriesData.i1_series{iview_min},1))+ref_j(1)+1;
1015    index_last=(ref_i(2)-1)*(size(SeriesData.i1_series{iview_max},1))+ref_j(2)+1;
1016end
1017range=index_max-index_min+1;
1018coeff_min=(index_first-index_min)/range;
1019coeff_max=(index_last-index_min+1)/range;
1020Position=get(handles.Waitbar,'Position');% position of the waitbar:= [ x,y, width, height]
1021Position_status=get(handles.FileStatus,'Position');
1022Position(1)=coeff_min*Position_status(3)+Position_status(1);
1023Position(3)=Position_status(3)*(coeff_max-coeff_min);
1024set(handles.Waitbar,'Position',Position)
1025update_waitbar(handles.Waitbar,0)
1026
1027%------------------------------------------------------------------------
1028% --- Executes when selected cell(s) is changed in PairString.
1029function PairString_CellSelectionCallback(hObject, eventdata, handles)
1030%------------------------------------------------------------------------   
1031set(handles.ListView,'Value',eventdata.Indices(1))% detect the selected raw index
1032ListView_Callback ([],[],handles) % update the list of available pairs
1033
1034%------------------------------------------------------------------------
1035%------------------------------------------------------------------------
1036%  III - FUNCTIONS ASSOCIATED TO THE FRAME SET PAIRS
1037%------------------------------------------------------------------------
1038%------------------------------------------------------------------------
1039% --- Executes on selection change in ListView.
1040function ListView_Callback(hObject, eventdata, handles)
1041%------------------------------------------------------------------------   
1042SeriesData=get(handles.series,'UserData');
1043i2_series=[];
1044j2_series=[];
1045iview=get(handles.ListView,'Value');
1046if ~isempty(SeriesData.i2_series{iview})
1047    i2_series=SeriesData.i2_series{iview};
1048end
1049if ~isempty(SeriesData.j2_series{iview})
1050    j2_series=SeriesData.j2_series{iview};
1051end
1052update_mode(handles,SeriesData.i1_series{iview},SeriesData.i2_series{iview},...
1053    SeriesData.j1_series{iview},SeriesData.j2_series{iview},SeriesData.Time{iview})
1054
1055%------------------------------------------------------------------------
1056% --- Executes on button press in mode.
1057function mode_Callback(hObject, eventdata, handles)
1058%------------------------------------------------------------------------       
1059SeriesData=get(handles.series,'UserData');
1060iview=get(handles.ListView,'Value');
1061mode_list=get(handles.mode,'String');
1062mode=mode_list{get(handles.mode,'Value')};
1063if isequal(mode,'bursts')
1064    enable_i(handles,'On')
1065    enable_j(handles,'Off') %do not display j index scanning in burst mode (j is fixed by the burst choice)
1066else
1067    enable_i(handles,'On')
1068    enable_j(handles,'Off')
1069end
1070fill_ListPair(handles,SeriesData.i1_series{iview},SeriesData.i2_series{iview},...
1071    SeriesData.j1_series{iview},SeriesData.j2_series{iview},SeriesData.Time{iview})
1072ListPairs_Callback([],[],handles)
1073
1074%-------------------------------------------------------------
1075% --- Executes on selection in ListPairs.
1076function ListPairs_Callback(hObject,eventdata,handles)
1077%------------------------------------------------------------
1078list_pair=get(handles.ListPairs,'String');%get the menu of image pairs
1079if isempty(list_pair)
1080    string='';
1081else
1082    string=list_pair{get(handles.ListPairs,'Value')};
1083    string=regexprep(string,',.*','');%removes time indication (after ',')
1084end
1085PairString=get(handles.PairString,'Data');
1086iview=get(handles.ListView,'Value');
1087PairString{iview,1}=string;
1088% report the selected pair string to the table PairString
1089set(handles.PairString,'Data',PairString)
1090
1091%------------------------------------------------------------------------
1092function num_ref_i_Callback(hObject, eventdata, handles)
1093%------------------------------------------------------------------------
1094mode_list=get(handles.mode,'String');
1095mode=mode_list{get(handles.mode,'Value')};
1096SeriesData=get(handles.series,'UserData');
1097iview=get(handles.ListView,'Value');
1098fill_ListPair(handles,SeriesData.i1_series{iview},SeriesData.i2_series{iview},...
1099    SeriesData.j1_series{iview},SeriesData.j2_series{iview},SeriesData.Time{iview});% update the menu of pairs depending on the available netcdf files
1100ListPairs_Callback([],[],handles)
1101
1102%------------------------------------------------------------------------
1103function num_ref_j_Callback(hObject, eventdata, handles)
1104%------------------------------------------------------------------------
1105num_ref_i_Callback(hObject, eventdata, handles)
1106
1107%------------------------------------------------------------------------
1108function update_mode(handles,i1_series,i2_series,j1_series,j2_series,time)
1109%------------------------------------------------------------------------   
1110% check_burst=0;
1111if isempty(j2_series)% no j pair
1112    if isempty(i2_series)
1113        set(handles.mode,'Value',1)
1114        set(handles.mode,'String',{''})% no pair menu to display
1115    else   
1116        set(handles.mode,'Value',1)
1117        set(handles.mode,'String',{'series(Di)'}) % pair menu with only option Di
1118    end
1119else %existence of j pairs
1120    pair_max=squeeze(max(i1_series,[],1)); %max on pair index
1121    j_max=max(pair_max,[],1);
1122    MaxIndex_i=max(find(j_max))-1;% max ref index i
1123    MinIndex_i=min(find(j_max))-1;% min ref index i
1124    i_max=max(pair_max,[],2);
1125    MaxIndex_j=max(find(i_max))-1;% max ref index i
1126    MinIndex_j=min(find(i_max))-1;% min ref index i
1127    if MaxIndex_j==MinIndex_j
1128        set(handles.mode,'Value',1);
1129        set(handles.mode,'String',{'bursts'})
1130%         check_burst=1;
1131    elseif MaxIndex_i==MinIndex_i
1132        set(handles.mode,'Value',1);
1133        set(handles.mode,'String',{'series(Dj)'})
1134    else
1135        set(handles.mode,'String',{'bursts';'series(Dj)'})
1136        if (MaxIndex_j-MinIndex_j)>10
1137            set(handles.mode,'Value',2);%set mode to series(Dj) if more than 10 j values
1138        else
1139            set(handles.mode,'Value',1);
1140%             check_burst=1;
1141        end
1142    end
1143end
1144% if check_burst
1145%     enable_i(handles,'On')
1146%     enable_j(handles,'Off') %do not display j index scanning in burst mode (j is fixed by the burst choice)
1147% else
1148%     enable_i(handles,'On')
1149%     if isempty(j1_series)
1150%          enable_j(handles,'Off')
1151%     else
1152%         enable_j(handles,'On')
1153%     end
1154% end
1155fill_ListPair(handles,i1_series,i2_series,j1_series,j2_series,time)
1156ListPairs_Callback([],[],handles)
1157
1158%--------------------------------------------------------------
1159% determine the menu for civ1 pairstring depending on existing netcdf files
1160% with the reference indices num_ref_i and num_ref_j
1161%----------------------------------------------------------------
1162function fill_ListPair(handles,i1_series,i2_series,j1_series,j2_series,time)
1163
1164mode_list=get(handles.mode,'String');
1165mode=mode_list{get(handles.mode,'Value')};
1166ref_i=str2num(get(handles.num_ref_i,'String'));
1167if isempty(ref_i)
1168    ref_i=1;
1169end
1170if strcmp(get(handles.num_ref_j,'Visible'),'on')
1171    ref_j=str2num(get(handles.num_ref_j,'String'));
1172    if isempty(ref_j)
1173        ref_j=1;
1174    end
1175else
1176    ref_j=1;
1177end
1178TimeUnit=get(handles.TimeUnit,'String');
1179if length(TimeUnit)>=1
1180    dtunit=['m' TimeUnit];
1181else
1182    dtunit='e-03';
1183end
1184
1185displ_pair={};
1186if strcmp(mode,'series(Di)')
1187    if isempty(i2_series)
1188        msgbox_uvmat('ERROR','no i1-i2 pair available')
1189        return
1190    end
1191    diff_i=i2_series-i1_series;
1192    min_diff=min(diff_i(diff_i>0));
1193    max_diff=max(diff_i(diff_i>0));
1194    for ipair=min_diff:max_diff
1195        if numel(diff_i(diff_i==ipair))>0
1196            pair_string=['Di= ' num2str(-floor(ipair/2)) '|' num2str(ceil(ipair/2)) ];
1197            if ~isempty(time)
1198                if ref_i<=floor(ipair/2)
1199                    ref_i=floor(ipair/2)+1;% shift ref_i to get the first pair
1200                end
1201                Dt=time(ref_i+ceil(ipair/2),ref_j)-time(ref_i-floor(ipair/2),ref_j);
1202                pair_string=[pair_string ', Dt=' num2str(Dt) ' ' dtunit];
1203            end
1204            displ_pair=[displ_pair;{pair_string}];
1205        end
1206    end
1207    if ~isempty(displ_pair)
1208        displ_pair=[displ_pair;{'Di=*|*'}];
1209    end
1210elseif strcmp(mode,'series(Dj)')
1211    if isempty(j2_series)
1212        msgbox_uvmat('ERROR','no j1-j2 pair available')
1213        return
1214    end
1215    diff_j=j2_series-j1_series;
1216    min_diff=min(diff_j(diff_j>0));
1217    max_diff=max(diff_j(diff_j>0));
1218    for ipair=min_diff:max_diff
1219        if numel(diff_j(diff_j==ipair))>0
1220            pair_string=['Dj= ' num2str(-floor(ipair/2)) '|' num2str(ceil(ipair/2)) ];
1221            if ~isempty(time)
1222                if ref_j<=floor(ipair/2)
1223                    ref_j=floor(ipair/2)+1;% shift ref_i to get the first pair
1224                end
1225                Dt=time(ref_i,ref_j+ceil(ipair/2))-time(ref_i,ref_j-floor(ipair/2));
1226                pair_string=[pair_string ', Dt=' num2str(Dt) ' ' dtunit];
1227            end
1228            displ_pair=[displ_pair;{pair_string}];
1229        end
1230    end
1231    if ~isempty(displ_pair)
1232        displ_pair=[displ_pair;{'Dj=*|*'}];
1233    end
1234elseif strcmp(mode,'bursts')
1235    if isempty(j2_series)
1236        msgbox_uvmat('ERROR','no j1-j2 pair available')
1237        return
1238    end
1239    diff_j=j2_series-j1_series;
1240    min_j1=min(j1_series(j1_series>0));
1241    max_j1=max(j1_series(j1_series>0));
1242    min_j2=min(j2_series(j2_series>0));
1243    max_j2=max(j2_series(j2_series>0));
1244    for pair1=min_j1:min(max_j1,min_j1+20)
1245        for pair2=min_j2:min(max_j2,min_j2+20)
1246        if numel(j1_series(j1_series==pair1))>0 && numel(j2_series(j2_series==pair2))>0
1247            displ_pair=[displ_pair;{['j= ' num2str(pair1) '-' num2str(pair2)]}];
1248        end
1249        end
1250    end
1251    if ~isempty(displ_pair)
1252        displ_pair=[displ_pair;{'j=*-*'}];
1253    end
1254end
1255set(handles.num_ref_i,'String',num2str(ref_i)) % update ref_i and ref_j
1256set(handles.num_ref_j,'String',num2str(ref_j))
1257
1258%% display list of pairstring
1259displ_pair_list=get(handles.ListPairs,'String');
1260NewVal=[];
1261if ~isempty(displ_pair_list)
1262Val=get(handles.ListPairs,'Value');
1263NewVal=find(strcmp(displ_pair_list{Val},displ_pair),1);% look at the previous display in the new menu displ_pï¿œir
1264end
1265if ~isempty(NewVal)
1266    set(handles.ListPairs,'Value',NewVal)
1267else
1268    set(handles.ListPairs,'Value',1)
1269end
1270set(handles.ListPairs,'String',displ_pair)
1271
1272%-------------------------------------
1273function enable_i(handles,state)
1274set(handles.i_txt,'Visible',state)
1275set(handles.num_first_i,'Visible',state)
1276set(handles.num_last_i,'Visible',state)
1277set(handles.num_incr_i,'Visible',state)
1278% set(handles.num_MaxIndex_i,'Visible',state)
1279set(handles.num_ref_i,'Visible',state)
1280set(handles.ref_i_text,'Visible',state)
1281
1282%-----------------------------------
1283function enable_j(handles,state)
1284set(handles.j_txt,'Visible',state)
1285set(handles.num_first_j,'Visible',state)
1286set(handles.num_last_j,'Visible',state)
1287set(handles.num_incr_j,'Visible',state)
1288set(handles.num_ref_j,'Visible',state)
1289set(handles.ref_j_text,'Visible',state)
1290% if strcmp(state,'off')
1291%     set(handles.MinIndex,'ColumnName',{'imax'})
1292% set(handles.MinIndex,'ColumnEditable',logical(0))
1293% else
1294%         set(handles.MinIndex,'ColumnName',{'imax','jmax'})
1295% end
1296
1297
1298%%%%%%%%%%%%%%%%%%%%
1299%%  MAIN ActionName FUNCTIONS
1300%%%%%%%%%%%%%%%%%%%%
1301%------------------------------------------------------------------------
1302% --- Executes on button press in RUN.
1303function RUN_Callback(hObject, eventdata, handles)
1304%------------------------------------------------------------------------
1305set(handles.RUN,'BusyAction','queue');
1306set(0,'CurrentFigure',handles.series)
1307set(handles.RUN, 'Enable','Off')
1308set(handles.RUN,'BackgroundColor',[0.831 0.816 0.784])
1309drawnow
1310[Series,filexml,errormsg]=prepare_jobs(handles);
1311if ~isempty(errormsg)
1312    msgbox_uvmat('ERROR',errormsg)
1313    return
1314end
1315RunModeList=get(handles.RunMode,'String');
1316RunMode=RunModeList{get(handles.RunMode,'Value')};
1317ActionExtList=get(handles.ActionExt,'String');
1318ActionExt=ActionExtList{get(handles.ActionExt,'Value')};% '.m' or '.sh' (compiled)
1319ActionPath=get(handles.ActionPath,'String');
1320ActionList=get(handles.ActionName,'String');
1321ActionName=ActionList{get(handles.ActionName,'Value')};
1322path_series=fileparts(which('series'));
1323
1324% create the Action fct handle if RunMode option = 'local'
1325if strcmp(RunMode,'local')
1326    if ~isequal(ActionPath,path_series)
1327        eval(['spath=which(''' ActionName ''');']) %spath = current path of the selected function ACTION
1328        if ~exist(ActionPath,'dir')
1329            msgbox_uvmat('ERROR',['The prescribed function path ' ActionPath ' does not exist']);
1330            return
1331        end
1332        if ~isequal(spath,ActionPath)
1333            addpath(ActionPath)% add the prescribed path if not the current one
1334        end
1335    end
1336    eval(['h_fun=@' ActionName ';'])%create a function handle for ACTION
1337    if ~isequal(ActionPath,path_series)
1338        rmpath(ActionPath)% add the prescribed path if not the current one
1339    end
1340end
1341
1342%% Get RunTime code from the file PARAM.xml (needed to run compiled functions)
1343errormsg='';%default error message
1344xmlfile=fullfile(path_series,'PARAM.xml');
1345test_batch=0;%default: ,no batch mode available
1346if ~exist(xmlfile,'file')
1347    [success,message]=copyfile(fullfile(path_series,'PARAM.xml.default'),xmlfile);
1348end
1349RunTime='';
1350if strcmp(ActionExt,'.sh')
1351    if exist(xmlfile,'file')
1352        s=xml2struct(xmlfile);
1353        if strcmp(RunMode,'cluster') && isfield(s,'BatchParam')
1354            if isfield(s.BatchParam,'RunTime')
1355                RunTime=s.BatchParam.RunTime;
1356            end
1357            if isfield(s.BatchParam,'NbCore')
1358                NbCore=s.BatchParam.NbCore;
1359            end
1360        elseif (strcmp(RunMode,'background')||strcmp(RunMode,'local')) && isfield(s,'RunParam')
1361            if isfield(s.RunParam,'RunTime')
1362                RunTime=s.RunParam.RunTime;
1363            end
1364            if isfield(s.RunParam,'NbCore')
1365                NbCore=s.RunParam.NbCore;
1366            end
1367        end
1368    end
1369    if isempty(RunTime) && strcmp(RunMode,'cluster')
1370        msgbox_uvmat('ERROR','RunTime name not found in PARAM.xml, compiled version .sh cannot run on cluster')
1371        return
1372    end
1373    Series.RunTime=RunTime;
1374end
1375   
1376%% set nbre of processes
1377if ~isfield(Series,'NbSlice')
1378    Series.NbSlice=[];
1379end
1380if isempty(Series.NbSlice)
1381    switch RunMode
1382        case {'local','background'}
1383         NbCore=1;% no need to split the calculation
1384        case 'cluster'
1385            if strcmp(Series.Action.ActionExt,'.m')% case of Matlab function (uncompiled)
1386                NbCore=1;% one core used only (limitation of Matlab licences)
1387                msgbox_uvmat('WARNING','Number of cores =1: select the compiled version civ_matlab.sh for multi-core processing');
1388            else
1389            answer=inputdlg({'Number of cores (max 36)','extra oar options'},'oarsub parameter',1,{'12',''});
1390            NbCore=str2double(answer{1});
1391            end
1392    end
1393    NbProcess=NbCore;% choose one process per core
1394else
1395    NbProcess=Series.NbSlice;% the nbre of run processes is equal to the number of slices
1396end
1397
1398%% read index ranges
1399first_i=1;
1400last_i=1;
1401incr_i=1;
1402first_j=1;
1403last_j=1;
1404incr_j=1;
1405if isfield(Series.IndexRange,'first_i')
1406    first_i=Series.IndexRange.first_i;
1407    incr_i=Series.IndexRange.incr_i;
1408    last_i=Series.IndexRange.last_i;
1409end
1410if isfield(Series.IndexRange,'first_j')
1411    first_j=Series.IndexRange.first_j;
1412    last_j=Series.IndexRange.last_j;
1413end
1414if last_i < first_i || last_j < first_j , msgbox_uvmat('ERROR','last field number must be larger than the first one'),...
1415    set(handles.RUN, 'Enable','On'), set(handles.RUN,'BackgroundColor',[1 0 0]),return
1416else
1417    BlockLength=ceil(numel(first_i:incr_i:last_i)/NbProcess);
1418end
1419
1420%% main processing
1421for iprocess=1:NbProcess% TOD0
1422%     split the input files
1423%     adjust Param
1424%     create xmlfile and batfile
1425end
1426switch RunMode
1427    case 'local'
1428        Series.RUNHandle=handles.RUN;
1429        Series.WaitbarHandle=handles.Waitbar;
1430        for iprocess=1:NbProcess
1431            if isempty(Series.NbSlice)
1432                Series.IndexRange.first_i=first_i+(iprocess-1)*BlockLength;
1433                Series.IndexRange.last_i=first_i+(iprocess)*BlockLength-1;
1434            else
1435                Series.IndexRange.first_i= first_i+iprocess-1;
1436                Series.IndexRange.incr_i=incr_i*Series.NbSlice;
1437            end
1438            if ~isempty(filexml)
1439                t=struct2xml(Series);
1440                t=set(t,1,'name','Series');
1441                if isequal(Series.IndexRange.last_i,Series.IndexRange.first_i)
1442                    term_i=num2str(Series.IndexRange.first_i);
1443                else
1444                    term_i=[num2str(Series.IndexRange.first_i) '-' num2str(Series.IndexRange.last_i)];
1445                end
1446                if isequal(Series.IndexRange.last_j,Series.IndexRange.first_j)
1447                    term_j=num2str(Series.IndexRange.first_j);
1448                else
1449                    term_j=[num2str(Series.IndexRange.first_j) '-' num2str(Series.IndexRange.last_j)];
1450                end
1451                save(t,[filexml '_' term_i '_' term_j '.xml']);
1452            end
1453            switch ActionExt
1454                case '.m'
1455                    h_fun(Series);
1456                case '.sh'
1457                    switch computer
1458                        case {'PCWIN','PCWIN64'} %Windows system
1459                            filename=regexprep(filename,'\\','\\\\');% add '\' so that '\' are left as characters
1460                            % TODO launch command in DOS
1461                        case {'GLNX86','GLNXA64','MACI64'}%Linux  system
1462%                             cmd=['#!/bin/bash \n '...
1463%                                 '#$ -cwd \n '...
1464%                                 'hostname && date \n '...
1465%                                 'umask 002 \n'...
1466%                                 fullfile(ActionPath,[ActionName '.sh']) ' ' Series.RunTime ' ' filexml '_' term_i '_' term_j '.xml'];%allow writting access to created files for user group
1467                             system([fullfile(ActionPath,[ActionName '.sh']) ' ' Series.RunTime ' ' filexml '_' term_i '_' term_j '.xml']);
1468                    end
1469            end
1470        end
1471    case 'background'
1472        if isempty(filexml)
1473            Series=h_fun(Series);% no background in the absence of output file
1474        else
1475            % update the xml file after interactive input with the function
1476%             Series.Specific='?';
1477%             Series=h_fun(Series);
1478            t=struct2xml(Series);
1479            t=set(t,1,'name','Series');
1480            save(t,filexml);
1481           
1482            filename_bat=regexprep(filexml,'.xml$','.bat');% create executable file to run program in background
1483            [fid,message]=fopen(filename_bat,'w');
1484            if isequal(fid,-1)
1485                msgbox_uvmat('ERROR', ['creation of .bat file: ' message]);
1486                return
1487            end
1488            %ActionPath=get(handles.ActionPath,'String');
1489            filelog=regexprep(filexml,'.xml$','.log');
1490       
1491            switch computer
1492                case {'GLNX86','GLNXA64','MACI64'}
1493                    text_matlabscript=[...
1494                        '#!/bin/bash \n'...
1495                        '. /etc/sysprofile \n'...
1496                        'matlab -nodisplay -nosplash -nojvm -logfile ''' filelog ''' <<END_MATLAB \n'...
1497                        'addpath(''' path_series '''); \n'...
1498                        'addpath(''' Series.Action.ActionPath '''); \n'...
1499                        '' Series.Action.ActionName  '( ''' filexml '''); \n'...
1500                        'exit \n'...
1501                        'END_MATLAB \n'];
1502                    fprintf(fid,text_matlabscript);
1503                    fclose(fid);
1504                    system(['chmod +x ' filename_bat]);% set the file to executable
1505                    system(['. ' filename_bat ' &']);%execute fct
1506                   
1507                case {'PCWIN','PCWIN64'}
1508                    text_matlabscript=['matlab -automation -logfile ' regexprep(filelog,'\\','\\\\')...
1509                        ' -r "addpath(''' regexprep(path_series,'\\','\\\\') ''');'...
1510                        'addpath(''' regexprep(Series.Action.ActionPath,'\\','\\\\') ''');'...
1511                        '' Series.Action.ActionName  '( ''' regexprep(filexml,'\\','\\\\') ''');exit"'];
1512                    fprintf(fid,text_matlabscript);
1513                    fclose(fid);
1514                    dos([filename_bat ' &']);
1515            end
1516        end
1517        update_waitbar(handles.Waitbar,1); % put the waitbar to end position to indicate launching is finished
1518     case 'cluster' %NOT YET READY
1519        switch batch_mode
1520            case 'sge' %at the moment only psmn ENS Lyon uses it
1521                for p=1:length(batch_file_list)
1522                    cmd=['!qsub -q piv1,piv2,piv3 '...
1523                        '-e ' regexprep(batch_file_list{p},'.bat','.errors') ' -o ' regexprep(batch_file_list{p},'.bat','.log ')...
1524                        ' -v ' 'LD_LIBRARY_PATH=/home/sjoubaud/matlab_sylvain/civx/lib ' batch_file_list{p}];
1525                    display(cmd);eval(cmd);
1526                end
1527            case 'oar'
1528                max_walltime=3600*12; % 12h max
1529                oar_modes={'oar-parexec','oar-dispatch','mpilauncher'};
1530                text={'Batch processing on servcalcul3 LEGI';...
1531                    'Please choose one of the followint modes';...
1532                    '* oar-parexec : default and best choice';...
1533                    '* oar-dispatch : jobs in a container of several cores';...
1534                    '* mpilauncher : one single parallel mpi job using several cores';...
1535                    '**********************************'...
1536                    };
1537                [S,v]=listdlg('PromptString',text,'ListString',oar_modes,...
1538                    'SelectionMode','single','ListSize',[400 100],'Name','LEGI job mode');
1539                switch oar_modes{S}
1540                    case 'oar-parexec' %oar-dispatch.pl
1541%                         if strcmp(Series.Action.ActionExt,'.m')% case of Matlab function (uncompiled)
1542%                             ncores=1;% one core used only (limitation of Matlab licences)
1543%                             msgbox_uvmat('WARNING','Number of cores =1: select the compiled version civ_matlab.sh for multi-core processing');
1544%                         else
1545%                         answer=inputdlg({'Number of cores (max 36)','extra oar options'},'oarsub parameter',1,{'12',''});
1546%                         ncores=str2double(answer{1});
1547%                         end
1548
1549                        extra_oar=answer{2};
1550                        walltime_onejob=600;%seconds
1551                        filename_joblist=fullfile(RootBat,'job_list.txt');
1552                        fid=fopen(filename_joblist,'w');
1553                        for p=1:length(batch_file_list)
1554                            fprintf(fid,[batch_file_list{p} '\n']);% list of exe files (TODO: create them)
1555                        end
1556                        fclose(fid);
1557                        oar_command=['oarsub -n CIVX '...
1558                            '-t idempotent --checkpoint ' num2str(walltime_onejob+60) ' '...
1559                            '-l /core=' num2str(ncores) ','...
1560                            'walltime=' datestr(min(1.05*walltime_onejob/86400*max(length(batch_file_list),ncores)/ncores,max_walltime/86400),13) ' '...
1561                            '-E ' regexprep(filename_joblist,'\.txt\>','.stderr') ' '...
1562                            '-O ' regexprep(filename_joblist,'\.txt\>','.stdout') ' '...
1563                            extra_oar ' '...
1564                            '"oar-parexec -s -f ' filename_joblist ' '...
1565                            '-l ' filename_joblist '.log"\n'];
1566                        filename_oarcommand=fullfile(RootBat,'oar_command');
1567                        fid=fopen(filename_oarcommand,'w');
1568                        fprintf(fid,oar_command);
1569                        fclose(fid);
1570                        fprintf(oar_command);% display in command line
1571                        system(oar_command);
1572                    case 'oar-dispatch' %oar-dispatch.pl
1573                        ncores=str2double(...
1574                            inputdlg('Number of cores (max 36)','oarsub parameter',1,{'6'})...
1575                            );
1576                        walltime_onejob=600;%seconds
1577                        filename_joblist=fullfile(RootBat,'job_list.txt');
1578                        fid=fopen(filename_joblist,'w');
1579                        for p=1:length(batch_file_list)
1580                            oar_command=['oarsub -n CIVX '...
1581                                '-E ' regexprep(batch_file_list{p},'\.bat\>','.stderr') ' -O ' regexprep(batch_file_list{p},'\.bat\>','.stdout ')...
1582                                '-l "/core=1,walltime=' datestr(walltime_onejob/86400,13) '"   ' batch_file_list{p}];
1583                            fprintf(fid,[oar_command '\n']);
1584                        end
1585                        fclose(fid);
1586                        oar_command=['oarsub -t container -n civx-container '...
1587                            '-l /core=' num2str(ncores)...
1588                            ',walltime=' datestr(1.05*walltime_onejob/86400*max(length(batch_file_list),ncores)/ncores,13) ' '...
1589                            '-E ' regexprep(filename_joblist,'\.txt\>','.stderr') ' '...
1590                            '-O ' regexprep(filename_joblist,'\.txt\>','.stdout') ' '...
1591                            '"oar-dispatch -f ' filename_joblist '"'];
1592                        filename_oarcommand=fullfile(RootBat,'oar_command');
1593                        fid=fopen(filename_oarcommand,'w');
1594                        fprintf(fid,[oar_command '\n']);
1595                        fclose(fid);
1596                        display(oar_command);
1597                        eval(['! . ' filename_oarcommand])
1598                    case 'mpilauncher'
1599                        filename_joblist=fullfile(RootBat,'job_list.txt');
1600                        fid=fopen(filename_joblist,'w');
1601                       
1602                        for p=1:length(batch_file_list)
1603                            fprintf(fid,[batch_file_list{p} '\n']);
1604                        end
1605                        fclose(fid)
1606                        text_oarscript=[...
1607                            '#!/bin/bash \n'...
1608                            '#OAR -n Mylauncher \n'...
1609                            '#OAR -l node=4/core=5,walltime=0:15:00 \n'...
1610                            '#OAR -E ' fullfile(RootBat,'stderrfile.log') ' \n'...
1611                            '#OAR -O ' fullfile(RootBat,'stdoutfile.log') ' \n'...
1612                            '# ========================================================= \n'...
1613                            '# This simple program launch a multinode parallel OpenMPI mpilauncher \n'...
1614                            '# application for coriolis PIV post-processing. \n'...
1615                            '# OAR uses oarshmost wrapper to propagate the user environement. \n'...
1616                            '# This wrapper assert that the user has the same environment on all the \n'...
1617                            '# allocated nodes (basic behavior needed by most MPI applications).  \n'...
1618                            '# \n'...
1619                            '# REQUIREMENT: \n'...
1620                            '# the oarshmost wrapper should be installed in $HOME/bin directory. \n'...
1621                            '# If a different location is used, change the line following the comment "Bidouille" \n'...
1622                            '# ========================================================= \n'...
1623                            '#   USER should only modify these 2 lines  \n'...
1624                            'WORKDIR=' pwd ' \n'...
1625                            'COMMANDE="mpilauncher  -f ' filename_joblist '" \n'...
1626                            '# ========================================================= \n'...
1627                            '# DO NOT MODIFY the FOLOWING LINES. (or be carefull) \n'...
1628                            'echo "job starting on: "`hostname` \n'...
1629                            'MPINODES="-host `tr [\\\\\\n] [,] <$OAR_NODEFILE |sed -e "s/,$/ /"`" \n'...
1630                            'NCPUS=`cat $OAR_NODEFILE |wc -l` \n'...
1631                            '#========== Bidouille ============== \n'...
1632                            'export OMPI_MCA_plm_rsh_agent=oar-envsh \n'...%                     'cd $WORKDIR \n'...
1633                            'CMD="mpirun -np $NCPUS -wdir $WORKDIR $MPINODES $COMMANDE" \n'...
1634                            'echo "I run: $CMD"  \n'...
1635                            '$CMD \n'...
1636                            'echo "job ending" \n'...
1637                            ];
1638                        filename_oarscript=fullfile(RootBat,'oar_command');
1639                        fid=fopen(filename_oarscript,'w');
1640                        fprintf(fid,[text_oarscript]);
1641                        fclose(fid);
1642                        eval(['!chmod +x  ' filename_oarscript]);
1643                        eval(['!oarsub -S ' filename_oarscript]);
1644                end
1645        end
1646end
1647
1648set(handles.RUN, 'Enable','On')
1649set(handles.RUN,'BackgroundColor',[1 0 0])
1650set(handles.RUN, 'Value',0)
1651
1652%------------------------------------------------------------------------
1653function STOP_Callback(hObject, eventdata, handles)
1654%------------------------------------------------------------------------
1655set(handles.RUN, 'BusyAction','cancel')
1656set(handles.RUN,'BackgroundColor',[1 0 0])
1657set(handles.RUN,'enable','on')
1658set(handles.RUN, 'Value',0)
1659
1660% %------------------------------------------------------------------------
1661% % --- Executes on button press in BIN.
1662% function BIN_Callback(hObject, eventdata, handles)
1663% %------------------------------------------------------------------------
1664%     cmd=['#!/bin/bash \n '...
1665%         '#$ -cwd \n '...
1666%         'hostname && date \n '...
1667%         'umask 002 \n'...
1668%         Param.xml.CivmBin ' ' Param.xml.RunTime ' ' filename_xml ' ' OutputFile '.nc'];
1669%     
1670%------------------------------------------------------------------------
1671% --- Main launch command, called by RUN and BATCH
1672
1673function [Series,filexml,errormsg]=prepare_jobs(handles)
1674%INPUT:
1675% handles: handles of graphic objects on the GUI series
1676% run=0, just to display parameters for MenuExport/GUI config
1677% run=1 (default) prepare the computation
1678
1679%------------------------------------------------------------------------
1680filexml='';
1681errormsg='';
1682
1683%% Read parameters from series
1684Series=read_GUI(handles.series);
1685if isfield(Series,'Pairs')
1686    Series=rmfield(Series,'Pairs'); %info Pairs not needed for output
1687end
1688
1689
1690%% projection object
1691% if isfield(Series,'CheckObject')
1692%     if Series.CheckObject
1693%         hset_object=findobj(allchild(0),'tag','set_object');
1694%         Series.ProjObject=read_GUI(hset_object);
1695%         CheckObject_Callback([], [], handles)
1696%     end
1697% else
1698%     Series.CheckObject=0;
1699% end
1700
1701%% get_field GUI
1702if isfield(Series,'InputFields')&&isfield(Series.InputFields,'Field')
1703    if strcmp(Series.InputFields.Field,'get_field...')
1704        hget_field=findobj(allchild(0),'name','get_field');
1705        Series.GetField=read_GUI(hget_field);
1706    end
1707end
1708
1709%% defining the ActionName function handle
1710% list_action=get(handles.ActionName,'String');% list menu action
1711% index=get(handles.ActionName,'Value');
1712% action= list_action{index}; % selected string
1713% %Series.hseries=handles.series; % handles to the series GUI
1714% path_series=which('series');
1715% ActionPathList=get(handles.ActionName,'UserData');
1716% ActionPath=ActionPathList{index}; %path stored for the function ACTION
1717% if ~isequal(ActionPath,path_series)
1718%     eval(['spath=which(''' action ''');']) %spath = current path of the selected function ACTION
1719%     if ~exist(ActionPath,'dir')
1720%         errormsg=['The prescribed function path ' ActionPath ' does not exist'];
1721%         return
1722%     end
1723%     if ~isequal(spath,ActionPath)
1724%         addpath(ActionPath)% add the prescribed path if not the current one
1725%     end
1726% end
1727% eval(['h_fun=@' action ';'])%create a function handle for ACTION
1728% if ~isequal(ActionPath,path_series)
1729%         rmpath(ActionPath)% add the prescribed path if not the current one   
1730% end
1731
1732%% create the output data directory and write in it the xml file from the GUI config
1733%determine the root file corresponding to the first sub dir
1734if get(handles.RUN,'value') && isfield(Series,'OutputSubDir')
1735    SubDirOut=[get(handles.OutputSubDir,'String') Series.OutputDirExt];
1736    SubDirOutNew=SubDirOut;
1737    iview=1;
1738    SeriesData=get(handles.series,'UserData');
1739    if size(Series.InputTable,1)>1 && isfield(SeriesData,'AllowInputSort') && SeriesData.AllowInputSort
1740        [tild,iview]=sort(Series.InputTable(:,2)); %subdirectories sorted in alphabetical order
1741        Series.InputTable=Series.InputTable(iview,:);
1742    end
1743    detect=exist(fullfile(Series.InputTable{1,1},SubDirOutNew),'dir');% test if  the dir  already exist
1744    check_create=1; %need to create the result directory by default
1745    while detect
1746        answer=msgbox_uvmat('INPUT_Y-N',['use existing ouput directory: ' fullfile(Series.InputTable{1,1},SubDirOutNew) ', possibly delete previous data']);
1747        if isequal(answer,'Yes')
1748            detect=0;
1749            check_create=0;
1750        else
1751            r=regexp(SubDirOutNew,'(?<root>.*\D)(?<num1>\d+)$','names');%detect whether name ends by a number
1752            if isempty(r)
1753                r(1).root=[SubDirOutNew '_'];
1754                r(1).num1='0';
1755            end
1756            SubDirOutNew=[r(1).root num2str(str2num(r(1).num1)+1)];%increment the index by 1 or put 1
1757            detect=exist(fullfile(Series.InputTable{1,1},SubDirOutNew),'dir');% test if  the dir  already exists   
1758            check_create=1;
1759        end
1760    end
1761    Series.OutputDirExt=regexprep(SubDirOutNew,Series.OutputSubDir,'');
1762    Series.OutputRootFile=Series.InputTable{1,3};% the first sorted RootFile taken for output
1763    set(handles.OutputDirExt,'String',Series.OutputDirExt)
1764    % create output directory
1765    OutputDir=fullfile(Series.InputTable{1,1},[Series.OutputSubDir Series.OutputDirExt]);
1766    if check_create
1767        [tild,msg1]=mkdir(OutputDir);
1768        if ~strcmp(msg1,'')
1769            errormsg=['cannot create ' OutputDir ': ' msg1];%error message for directory creation
1770            return
1771        end
1772    end
1773    filexml=fullfile(OutputDir,Series.InputTable{1,3});% name of the parameter xml file set in this directory
1774end
1775%removes redondant information
1776Series.IndexRange=rmfield(Series.IndexRange,'TimeTable');
1777Series.IndexRange=rmfield(Series.IndexRange,'MinIndex');
1778Series.IndexRange=rmfield(Series.IndexRange,'MaxIndex');
1779%removes empty lines of InputTable
1780empty_line=false(size(Series.InputTable,1),1);
1781for iline=1:size(Series.InputTable,1)
1782    empty_line(iline)=isequal(Series.InputTable(iline,1:3),{'','',''});
1783end
1784Series.InputTable(empty_line,:)=[];
1785
1786%------------------------------------------------------------------------
1787% --- Executes on selection change in ActionName.
1788function ActionName_Callback(hObject, eventdata, handles)
1789%------------------------------------------------------------------------
1790%% stop any ongoing series processing
1791if isequal(get(handles.RUN,'Value'),1)
1792    answer= msgbox_uvmat('INPUT_Y-N','stop current Action process?');
1793    if strcmp(answer,'Yes')
1794        STOP_Callback(hObject, eventdata, handles)
1795    else
1796        return
1797    end
1798end
1799
1800%% get Action name and path
1801nb_builtin_ACTION=4; %nbre of functions initially proposed in the menu ActionName (as defined in the Opening fct of series)
1802ActionList=get(handles.ActionName,'String');% list menu fields
1803ActionIndex=get(handles.ActionName,'Value');
1804if ~isequal(ActionIndex,1)
1805    InputTable=get(handles.InputTable,'Data');
1806    if isempty(InputTable{1,4})
1807        msgbox_uvmat('ERROR','no input file available: use Open in the menu bar')
1808        return
1809    end
1810end
1811ActionName= ActionList{get(handles.ActionName,'Value')}; % selected function name
1812ActionPathList=get(handles.ActionName,'UserData');%list of recorded paths to functions of the list ActionName
1813
1814%% add a new function to the menu if 'more...' has been selected in the menu ActionName
1815if isequal(ActionName,'more...')
1816    [FileName, PathName] = uigetfile( ...
1817        {'*.m', ' (*.m)';
1818        '*.m',  '.m files '; ...
1819        '*.*', 'All Files (*.*)'}, ...
1820        'Pick a series processing function ',get(handles.ActionPath,'String'));
1821    if length(FileName)<2
1822        return
1823    end
1824    [ActionPath,ActionName,ActionExt]=fileparts(FileName);
1825    % insert the choice in the menu
1826    ActionIndex=find(strcmp(ActionName,ActionList),1);% look for the selected function in the menu Action
1827    if isempty(ActionIndex)%the input string does not exist in the menu
1828        ActionIndex= length(ActionList);
1829        ActionList=[ActionList(1:end-1);{ActionName};ActionList(end)];% the selected function is appended in the menu, before the last item 'more...'
1830        set(handles.ActionName,'String',ActionList)
1831    end
1832    %set(handles.ActionName,'Value',ActionIndex)
1833    %list_path{ActionIndex}=PathName;
1834    % remove old Action options in the menu (keeping a menu length <nb_builtin_ACTION+5)
1835    if length(ActionList)>nb_builtin_ACTION+5; %nb_builtin=nbre of functions always remaining in the initial menu
1836        nbremove=length(ActionList)-nb_builtin_ACTION-5;
1837        ActionList(nb_builtin_ACTION+1:end-5)=[];
1838        ActionPathList(nb_builtin_ACTION+1:end-4)=[];
1839        ActionIndex=ActionIndex-nbremove;
1840    end
1841    set(handles.ActionName,'Value',ActionIndex)
1842    set(handles.ActionName,'String',ActionList)
1843    ActionPathList{ActionIndex}=PathName;
1844    set(handles.ActionPath,'enable','inactive')% indicate that the current path is accessible (not 'off')
1845   
1846    % record the file extension and update the paths in userdata
1847    ActionExtList=get(handles.ActionExt,'String');
1848    ActionExtIndex=find(strcmp(ActionExt,ActionExtList), 1);
1849    if isempty(ActionExtIndex)
1850        set(handles.ActionExt,'String',[ActionExtList;{ActionExt}])
1851        set(handles.ActionExt,'Value',numel(ActionExtList)+1)
1852        ActionPathNew=cell(size(ActionPathList,1),1);%new column of ActionPath
1853        ActionPathNew{ActionIndex}=ActionPath;
1854        ActionPathList=[ActionPathList ActionPathNew];
1855    end
1856    set(handles.ActionName,'UserData',ActionPathList);
1857   
1858    %record the current menu in personal file profil_perso
1859    dir_perso=prefdir;
1860    profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
1861    if nb_builtin_ACTION+1<=length(ActionList)-1
1862        ActionListUser=ActionList(nb_builtin_ACTION+1:numel(ActionList)-1);
1863        ActionPathListUser=ActionPathList(nb_builtin_ACTION+1:numel(ActionList)-1,:);
1864        ActionExtListUser={};
1865        if numel(ActionExtList)>2
1866            ActionExtListUser=ActionExtList(3:end);
1867        end
1868        if exist(profil_perso,'file')
1869            save(profil_perso,'ActionListUser','ActionPathListUser','ActionExtListUser','-append')
1870        else
1871            save(profil_perso,'ActionListUser','ActionPathListUser','ActionExtListUser','-V6')
1872        end
1873    end
1874end
1875
1876%% check the current ActionPath to the selected function
1877ActionPath=ActionPathList{ActionIndex};%current recorded path
1878set(handles.ActionPath,'String',ActionPath); %show the path to the senlected function
1879
1880%% reinitialise the waitbar
1881update_waitbar(handles.Waitbar,0)
1882
1883%% default setting for the visibility of the GUI elements
1884set(handles.FieldTransform,'Visible','off')
1885set(handles.CheckObject,'Visible','off');
1886set(handles.ProjObject,'Visible','off');
1887set(handles.CheckMask,'Visible','off')
1888set(handles.Mask,'Visible','off')
1889
1890%% create the function handle for Action
1891path_series=which('series');
1892if ~isequal(ActionPath,path_series)
1893    eval(['spath=which(''' ActionName ''');']) %spath = current path of the selected function ACTION
1894    if ~exist(ActionPath,'dir')
1895        errormsg=['The prescribed function path ' ActionPath ' does not exist'];
1896        return
1897    end
1898    if ~isequal(spath,ActionPath)
1899        addpath(ActionPath)% add the prescribed path if not the current one
1900    end
1901end
1902eval(['h_fun=@' ActionName ';'])%create a function handle for ACTION
1903if ~isequal(ActionPath,path_series)
1904        rmpath(ActionPath)% add the prescribed path if not the current one   
1905end
1906
1907%% prepare the input param
1908[Series,tild,errormsg]=prepare_jobs(handles);
1909if ~isempty(errormsg)
1910    msgbox_uvmat('ERROR',errormsg)
1911    return
1912end
1913ParamOut=h_fun(Series);
1914
1915%% Put the first line of the selected Action fct as tootip help
1916try
1917    [fid,errormsg] =fopen([ActionName '.m']);
1918    InputText=textscan(fid,'%s',1,'delimiter','\n');
1919    fclose(fid);
1920    set(handles.ActionName,'ToolTipString',InputText{1}{1})% put the first line of the selected function as tooltip help
1921end
1922% if ~isequal(path_series,PathName)
1923%     rmpath(PathName)
1924% end
1925Param_list={};
1926
1927%% Detect the types of input files
1928SeriesData=get(handles.series,'UserData');
1929nb_civ=0;nb_netcdf=0;
1930if ~isempty(SeriesData)
1931    nb_civ=numel(find(strcmp('civx',SeriesData.FileType)|strcmp('civdata',SeriesData.FileType)));
1932    nb_netcdf=numel(find(strcmp('netcdf',SeriesData.FileType)));
1933end
1934
1935%% Check whether alphabetical sorting of input Subdir is alowed by the Action fct  (for multiples series entries)
1936SeriesData.AllowInputSort=0;%default
1937if isfield(ParamOut,'AllowInputSort')&&isequal(ParamOut.AllowInputSort,'on')
1938    SeriesData.AllowInputSort=1;
1939end
1940
1941%% Impose the whole input file index range if requested
1942if isfield(ParamOut,'WholeIndexRange')&&isequal(ParamOut.WholeIndexRange,'on')
1943    MinIndex=get(handles.MinIndex,'Data');
1944    MaxIndex=get(handles.MaxIndex,'Data');
1945    if ~isempty(MinIndex)
1946        set(handles.num_first_i,'String',num2str(MinIndex{1}))
1947        set(handles.num_last_i,'String',num2str(MaxIndex{1}))
1948        set(handles.num_incr_i,'String','1')
1949        if size(MinIndex,2)>=2
1950            set(handles.num_first_j,'String',num2str(MinIndex{1,2}))
1951            set(handles.num_last_j,'String',num2str(MaxIndex{1,2}))
1952            set(handles.num_incr_j,'String','1')
1953        end
1954    end
1955else
1956% check index ranges
1957first_i=1;last_i=1;first_j=1;last_j=1;
1958if isfield(Series.IndexRange,'first_i')
1959    first_i=Series.IndexRange.first_i;
1960    last_i=Series.IndexRange.last_i;
1961end
1962if isfield(Series.IndexRange,'first_j')
1963    first_j=Series.IndexRange.first_j;
1964    last_j=Series.IndexRange.last_j;
1965end
1966if last_i < first_i || last_j < first_j , msgbox_uvmat('ERROR','last field number must be larger than the first one'),...
1967    set(handles.RUN, 'Enable','On'), set(handles.RUN,'BackgroundColor',[1 0 0]),return,end;
1968end
1969
1970%% NbSlice visibility
1971NbSliceVisible='off';%default
1972if isfield(ParamOut,'NbSlice') && isequal(ParamOut.NbSlice,'on')
1973    NbSliceVisible='on';
1974    set(handles.num_NbProcess,'String',get(handles.num_NbSlice,'String'))% the nbre of processes is imposed as the nbre of slices
1975else
1976    set(handles.num_NbProcess,'String','')% free nbre of processes
1977end
1978set(handles.num_NbSlice,'Visible',NbSliceVisible)
1979set(handles.NbSlice_title,'Visible',NbSliceVisible)
1980
1981%% Visibility of VelType and VelType_1 menus
1982VelTypeVisible='off';  %hidden by default
1983VelType_1Visible='off';
1984InputFieldsVisible='off';%visibility of the frame Fields
1985if isfield(ParamOut,'VelType')
1986    if strcmp( ParamOut.VelType,'one')||strcmp( ParamOut.VelType,'two')
1987        if nb_civ>=1
1988            VelTypeVisible='on';
1989            InputFieldsVisible='on';
1990        end
1991    end
1992    if strcmp( ParamOut.VelType,'two')
1993        if nb_civ>=2
1994            VelType_1Visible='on';
1995        end
1996    end
1997end
1998set(handles.VelType,'Visible',VelTypeVisible)
1999set(handles.VelType_text,'Visible',VelTypeVisible);
2000set(handles.VelType_1,'Visible',VelType_1Visible)
2001set(handles.VelType_text_1,'Visible',VelType_1Visible);
2002
2003%% Visibility of FieldName and FieldName_1 menus
2004FieldNameVisible='off';  %hidden by default
2005FieldName_1Visible='off';  %hidden by default
2006if isfield(ParamOut,'FieldName')
2007    if strcmp( ParamOut.FieldName,'one')||strcmp( ParamOut.FieldName,'two')
2008        if (nb_civ+nb_netcdf)>=1
2009            InputFieldsVisible='on';
2010            FieldNameVisible='on';
2011        end
2012    end
2013    if strcmp( ParamOut.FieldName,'two')
2014        if (nb_civ+nb_netcdf)>=1
2015            FieldName_1Visible='on';
2016        end
2017    end
2018end
2019set(handles.InputFields,'Visible',InputFieldsVisible)
2020set(handles.FieldName,'Visible',FieldNameVisible) % test for MenuBorser
2021set(handles.FieldName_1,'Visible',FieldName_1Visible)
2022
2023%% Visibility of FieldTransform menu
2024FieldTransformVisible='off';  %hidden by default
2025if isfield(ParamOut,'FieldTransform')
2026    FieldTransformVisible=ParamOut.FieldTransform; 
2027    TransformName_Callback([],[], handles)
2028end
2029set(handles.FieldTransform,'Visible',FieldTransformVisible)
2030
2031%% Visibility of projection object
2032ProjObjectVisible='off';  %hidden by default
2033if isfield(ParamOut,'ProjObject')
2034    ProjObjectVisible=ParamOut.ProjObject;
2035end
2036set(handles.CheckObject,'Visible',ProjObjectVisible)
2037if ~get(handles.CheckObject,'Value')
2038    ProjObjectVisible='off';
2039end
2040set(handles.ProjObject,'Visible',ProjObjectVisible)
2041set(handles.DeleteObject,'Visible',ProjObjectVisible)
2042set(handles.ViewObject,'Visible',ProjObjectVisible)
2043
2044
2045%% Visibility of mask input
2046MaskVisible='off';  %hidden by default
2047if isfield(ParamOut,'Mask')
2048    MaskVisible=ParamOut.Mask;
2049end
2050set(handles.Mask,'Visible',MaskVisible)
2051set(handles.CheckMask,'Visible',MaskVisible);
2052
2053%% definition of the directory containing the output files
2054OutputDirVisible='off';
2055if isfield(ParamOut,'OutputDirExt')&&~isempty(ParamOut.OutputDirExt)
2056    set(handles.OutputDirExt,'String',ParamOut.OutputDirExt)
2057    OutputDirVisible='on';
2058end
2059set(handles.OutputDirExt,'Visible',OutputDirVisible)
2060set(handles.OutputSubDir,'Visible',OutputDirVisible)
2061set(handles.OutputDir_title,'Visible',OutputDirVisible)
2062set(handles.RunMode,'Visible',OutputDirVisible)
2063set(handles.ActionExt,'Visible',OutputDirVisible)
2064set(handles.RunMode_title,'Visible',OutputDirVisible)
2065set(handles.ActionExt_title,'Visible',OutputDirVisible)
2066
2067%% definition of an additional parameter set, determined by an ancillary GUI
2068if isfield(ParamOut,'ActionInput')
2069    set(handles.ActionInput,'Visible','on')
2070    set(handles.ActionInput_title,'Visible','on')
2071    set(handles.ActionInput,'String',ActionName)
2072    SeriesData.ActionInput=ParamOut.ActionInput;
2073else
2074    set(handles.ActionInput,'Visible','off')
2075    set(handles.ActionInput_title,'Visible','off')
2076    if isfield(SeriesData,'ActionInput')
2077    SeriesData=rmfield(SeriesData,'ActionInput');
2078    end
2079end   
2080set(handles.series,'UserData',SeriesData)
2081
2082%------------------------------------------------------------------------
2083% --- Executes on selection change in FieldName.
2084function FieldName_Callback(hObject, eventdata, handles)
2085%------------------------------------------------------------------------
2086field_str=get(handles.FieldName,'String');
2087field_index=get(handles.FieldName,'Value');
2088field=field_str{field_index(1)};
2089if isequal(field,'get_field...')   
2090     hget_field=findobj(allchild(0),'name','get_field');
2091     if ~isempty(hget_field)
2092         delete(hget_field)%delete opened versions of get_field
2093     end
2094     filecell=get_file_series(read_GUI(handles.series));
2095     if exist(filecell{1,1},'file')
2096        get_field(filecell{1,1})
2097     end
2098elseif isequal(field,'more...')
2099    str=calc_field;
2100    [ind_answer,v] = listdlg('PromptString','Select a file:',...
2101                'SelectionMode','single',...
2102                'ListString',str);
2103       % edit the choice in the fields and actionname menu
2104     scalar=cell2mat(str(ind_answer));
2105     update_menu(handles.FieldName,scalar)
2106end
2107
2108%------------------------------------------------------------------------
2109% --- Executes on selection change in FieldName_1.
2110function FieldName_1_Callback(hObject, eventdata, handles)
2111%------------------------------------------------------------------------
2112field_str=get(handles.FieldName_1,'String');
2113field_index=get(handles.FieldName_1,'Value');
2114field=field_str{field_index};
2115if isequal(field,'get_field...')   
2116     hget_field=findobj(allchild(0),'name','get_field_1');
2117     if ~isempty(hget_field)
2118         delete(hget_field)
2119     end
2120     SeriesData=get(handles.series,'UserData');
2121     filename=SeriesData.CurrentInputFile_1;
2122     if exist(filename,'file')
2123        hget_field=get_field(filename);
2124        set(hget_field,'name','get_field_1')
2125     end
2126elseif isequal(field,'more...')
2127    str=calc_field;
2128    [ind_answer,v] = listdlg('PromptString','Select a file:',...
2129                'SelectionMode','single',...
2130                'ListString',str);
2131       % edit the choice in the fields and actionname menu
2132     scalar=cell2mat(str(ind_answer));
2133     update_menu(handles.FieldName_1,scalar)
2134end   
2135
2136
2137%%%%%%%%%%%%%
2138function [ind_remove]=find_pairs(dirpair,ind_i,last_i)
2139indsel=ind_i;
2140indiff=diff(ind_i); %test index increment to detect multiplets (several pairs with the same index ind_i) and holes in the series
2141indiff=[1 indiff last_i-ind_i(end)+1];%for testing gaps with the imposed bounds
2142if ~isempty(indiff)
2143    indiff2=diff(indiff);
2144    indiffp=[indiff2 1];
2145    indiffm=[1 indiff2];
2146    ind_multi_m=find((indiff==0)&(indiffm<0))-1;%indices of first members of multiplets
2147    ind_multi_p=find((indiff==0)&(indiffp>0));%indices of last members of multiplets
2148    %for each multiplet, select the most recent file
2149    ind_remove=[];
2150    for i=1:length(ind_multi_m)
2151        ind_pairs=ind_multi_m(i):ind_multi_p(i);
2152        for imulti=1:length(ind_pairs)
2153            datepair(imulti)=datenum(dirpair(ind_pairs(imulti)).date);%dates of creation
2154        end
2155        [datenew,indsort2]=sort(datepair); %sort the multiplet by creation date
2156        ind_s=indsort2(1:end-1);%
2157        ind_remove=[ind_remove ind_pairs(ind_s)];%remove these indices, leave the last one
2158    end
2159end
2160
2161%------------------------------------------------------------------------
2162% --- determine the list of index pairstring of processing file
2163function [num_i1,num_i2,num_j1,num_j2,num_i_out,num_j_out]=find_file_indices(num_i,num_j,ind_shift,NomType,mode)
2164%------------------------------------------------------------------------
2165num_i1=num_i;% set of first image numbers by default
2166num_i2=num_i;
2167num_j1=num_j;
2168num_j2=num_j;
2169num_i_out=num_i;
2170num_j_out=num_j;
2171% if isequal (NomType,'_1-2_1') || isequal (NomType,'_1-2')
2172if isequal(mode,'series(Di)')
2173    num_i1_line=num_i+ind_shift(3);% set of first image numbers
2174    num_i2_line=num_i+ind_shift(4);
2175    % adjust the first and last field number
2176        indsel=find(num_i1_line >= 1);
2177    num_i_out=num_i(indsel);
2178    num_i1_line=num_i1_line(indsel);
2179    num_i2_line=num_i2_line(indsel);
2180    num_j1=meshgrid(num_j,ones(size(num_i1_line)));
2181    num_j2=meshgrid(num_j,ones(size(num_i1_line)));
2182    [xx,num_i1]=meshgrid(num_j,num_i1_line);
2183    [xx,num_i2]=meshgrid(num_j,num_i2_line);
2184elseif isequal (mode,'series(Dj)')||isequal (mode,'bursts')
2185    if isequal(mode,'bursts') %case of bursts (png_old or png_2D)
2186        num_j1=ind_shift(1)*ones(size(num_i));
2187        num_j2=ind_shift(2)*ones(size(num_i));
2188    else
2189        num_j1_col=num_j+ind_shift(1);% set of first image numbers
2190        num_j2_col=num_j+ind_shift(2);
2191        % adjust the first field number
2192        indsel=find((num_j1_col >= 1));   
2193        num_j_out=num_j(indsel);
2194        num_j1_col=num_j1_col(indsel);
2195        num_j2_col=num_j2_col(indsel);
2196        [num_i1,num_j1]=meshgrid(num_i,num_j1_col);
2197        [num_i2,num_j2]=meshgrid(num_i,num_j2_col);
2198    end   
2199end
2200
2201%------------------------------------------------------------------------
2202% --- Executes on button press in CheckObject.
2203function CheckObject_Callback(hObject, eventdata, handles)
2204%------------------------------------------------------------------------
2205value=get(handles.CheckObject,'Value');
2206if value
2207     set(handles.CheckObject,'BackgroundColor',[1 1 0])%put unactivated buttons to yellow
2208     hset_object=findobj(allchild(0),'tag','set_object');%find the set_object interface handle
2209     if ishandle(hset_object)
2210         uistack(hset_object,'top')% show the GUI set_object if opened
2211     else
2212         %get the object file
2213         InputTable=get(handles.InputTable,'Data');
2214         defaultname=InputTable{1,1};
2215         if isempty(defaultname)
2216            defaultname={''};
2217         end
2218        [FileName, PathName, filterindex] = uigetfile( ...
2219       {'*.xml;*.mat', ' (*.xml,*.mat)';
2220       '*.xml',  '.xml files '; ...
2221        '*.mat',  '.mat matlab files '}, ...
2222        'Pick an xml object file (or use uvmat to create it)',defaultname);
2223        fileinput=[PathName FileName];%complete file name
2224        sizf=size(fileinput);
2225        if (~ischar(fileinput)||~isequal(sizf(1),1)),return;end
2226        %read the file
2227        data=xml2struct(fileinput);
2228        if ~isfield(data,'Type')
2229             msgbox_uvmat('ERROR',[fileinput ' is not an object xml file'])
2230             return
2231        end
2232        if ~isfield(data,'ProjMode')
2233             data.ProjMode='none';
2234        end
2235        hset_object=set_object(data);% call the set_object interface
2236     end
2237     ProjObject=read_GUI(hset_object);
2238     set(handles.ProjObject,'String',ProjObject.Name);%display the object name
2239     SeriesData=get(handles.series,'UserData');
2240     SeriesData.ProjObject=ProjObject;
2241     set(handles.series,'UserData',SeriesData);
2242     set(handles.DeleteObject,'Visible','on');
2243     set(handles.ViewObject,'Visible','on');
2244else
2245    set(handles.CheckObject,'BackgroundColor',[0.7 0.7 0.7])%put activated buttons to green
2246end
2247%set(handles.series,'UserData',SeriesData)
2248
2249%--------------------------------------------------------------
2250function CheckMask_Callback(hObject, eventdata, handles)
2251value=get(handles.CheckMask,'Value');
2252if value
2253    msgbox_uvmat('ERROR','not implemented yet')
2254end
2255%--------------------------------------------------------------
2256
2257%-------------------------------------------------------------------
2258%'uv_ncbrowser': interactively calls the netcdf file browser 'get_field.m'
2259function ncbrowser_uvmat(hObject, eventdata)
2260%-------------------------------------------------------------------
2261     bla=get(gcbo,'String');
2262     ind=get(gcbo,'Value');
2263     filename=cell2mat(bla(ind));
2264      blank=find(filename==' ');
2265      filename=filename(1:blank-1);
2266     get_field(filename)
2267
2268% ------------------------------------------------------------------
2269function MenuHelp_Callback(hObject, eventdata, handles)
2270%-------------------------------------------------------------------
2271path_to_uvmat=which ('uvmat');% check the path of uvmat
2272pathelp=fileparts(path_to_uvmat);
2273helpfile=fullfile(pathelp,'uvmat_doc','uvmat_doc.html');
2274if isempty(dir(helpfile)), msgbox_uvmat('ERROR','Please put the help file uvmat_doc.html in the sub-directory /uvmat_doc of the UVMAT package')
2275else
2276    addpath (fullfile(pathelp,'uvmat_doc'))
2277    web([helpfile '#series'])
2278end
2279
2280%-------------------------------------------------------------------
2281% --- Executes on selection change in TransformName.
2282function TransformName_Callback(hObject, eventdata, handles)
2283%----------------------------------------------------------------------
2284TransformList=get(handles.TransformName,'String');
2285TransformIndex=get(handles.TransformName,'Value');
2286TransformName=TransformList{TransformIndex};
2287TransformPathList=get(handles.TransformName,'UserData');
2288nb_builtin_transform=4;
2289% ff=functions(list_transform{end});
2290if isequal(TransformName,'more...');
2291%     coord_fct='';
2292%     prompt = {'Enter the name of the transform function'};
2293%     dlg_title = 'user defined transform';
2294%     num_lines= 1;
2295    [FileName, PathName] = uigetfile( ...
2296       {'*.m', ' (*.m)';
2297        '*.m',  '.m files '; ...
2298        '*.*', 'All Files (*.*)'}, ...
2299        'Pick a transform function',get(handles.TransformPath,'String'));
2300    if isequal(FileName,0)
2301        return     %browser closed without choice
2302    end
2303    if isequal(PathName(end),'/')||isequal(PathName(end),'\')
2304        PathName(end)=[];
2305    end
2306    [TransformPath,TransformName,TransformExt]=fileparts(FileName);% removes extension .m
2307    if ~strcmp(TransformExt,'.m')
2308        msgbox_uvmat('ERROR','a Matlab function .m must be introduced');
2309        return
2310    end
2311     % insert the choice in the menu
2312    TransformIndex=find(strcmp(TransformName,TransformList),1);% look for the selected function in the menu Action
2313    if isempty(TransformIndex)%the input string does not exist in the menu
2314        TransformIndex= length(TransformList);
2315        TransformList=[TransformList(1:end-1);{TransformnName};TransformList(end)];% the selected function is appended in the menu, before the last item 'more...'
2316        set(handles.TransformName,'String',TransformList)
2317        TransformPathList=[TransformPathList;{TransformPath}];
2318    end
2319   % save the new menu in the personal file 'uvmat_perso.mat'
2320   dir_perso=prefdir;%personal Matalb directory
2321   profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
2322   if exist(profil_perso,'file')
2323       for ilist=nb_builtin_transform+1:numel(TransformPathList)
2324           TransformListUser{ilist-nb_builtin_transform}=TransformList{ilist};
2325           TransformPathListUser{ilist-nb_builtin_transform}=TransformPathList{ilist};
2326       end
2327       save (profil_perso,'TransformPathListUser','TransformListUser','-append'); %store the root name for future opening of uvmat
2328   end
2329end
2330
2331%display the current function path
2332set(handles.TransformPath,'String',TransformPathList{TransformIndex}); %show the path to the senlected function
2333set(handles.TransformName,'UserData',TransformPathList);
2334
2335
2336% --------------------------------------------------------------------
2337function MenuExportConfig_Callback(hObject, eventdata, handles)
2338global Series
2339[tild,Series,errormsg]=prepare_jobs(handles);
2340% Series=read_GUI(handles.series);
2341
2342evalin('base','global Series')%make CurData global in the workspace
2343display('current series config :')
2344evalin('base','Series') %display CurData in the workspace
2345commandwindow; %brings the Matlab command window to the front
2346
2347
2348% --- Executes on selection change in RunMode.
2349function RunMode_Callback(hObject, eventdata, handles)
2350
2351% --- Executes on selection change in Coord_x.
2352function Coord_x_Callback(hObject, eventdata, handles)
2353
2354
2355% --- Executes on selection change in Coord_y.
2356function Coord_y_Callback(hObject, eventdata, handles)
2357
2358
2359
2360% --- Executes when series is resized.
2361function series_ResizeFcn(hObject, eventdata, handles)
2362%% input table
2363set(handles.InputTable,'Unit','pixel')
2364Pos=get(handles.InputTable,'Position');
2365set(handles.InputTable,'Unit','normalized')
2366ColumnWidth=round([0.5 0.14 0.14 0.14 0.08]*(Pos(3)-52));
2367ColumnWidth=num2cell(ColumnWidth);
2368set(handles.InputTable,'ColumnWidth',ColumnWidth)
2369
2370%% MinIndex and MaxIndex
2371set(handles.MinIndex,'Unit','pixel')
2372Pos=get(handles.MinIndex,'Position');
2373set(handles.MinIndex,'Unit','normalized')
2374ColumnWidth=get(handles.MinIndex,'ColumnWidth');
2375if numel(ColumnWidth)==2
2376    ColumnWidth=num2cell(floor([0.5 0.5]*(Pos(3)-20)));
2377else
2378    ColumnWidth={Pos(3)-5};
2379end   
2380set(handles.MinIndex,'ColumnWidth',ColumnWidth)
2381set(handles.MaxIndex,'ColumnWidth',ColumnWidth)
2382
2383%% TimeTable
2384set(handles.TimeTable,'Unit','pixel')
2385Pos=get(handles.TimeTable,'Position');
2386set(handles.TimeTable,'Unit','normalized')
2387ColumnWidth=get(handles.TimeTable,'ColumnWidth');
2388ColumnWidth=num2cell(floor([0.25 0.25 0.25 0.25]*(Pos(3)-20)));
2389set(handles.TimeTable,'ColumnWidth',ColumnWidth)
2390
2391
2392%% PairString
2393set(handles.PairString,'Unit','pixel')
2394Pos=get(handles.PairString,'Position');
2395set(handles.PairString,'Unit','normalized')
2396set(handles.PairString,'ColumnWidth',{Pos(3)-5})
2397
2398
2399% --- Executes on button press in status.
2400function status_Callback(hObject, eventdata, handles)
2401val=get(handles.status,'Value');
2402
2403%% delete current display fig if selection is off
2404if val==0
2405    set(handles.status,'BackgroundColor',[0 1 0])
2406    hfig=findobj(allchild(0),'name','series_status');
2407    if ~isempty(hfig)
2408        delete(hfig)
2409    end
2410    return
2411end
2412set(handles.status,'BackgroundColor',[1 1 0])
2413drawnow
2414% listtype={'civ1','fix1','patch1','civ2','fix2','patch2'};
2415% Param.CheckCiv1=get(handles.CheckCiv1,'Value');
2416% Param.CheckFix1=get(handles.CheckFix1,'Value');
2417% Param.CheckPatch1=get(handles.CheckPatch1,'Value');
2418% Param.CheckCiv2=get(handles.CheckCiv2,'Value');
2419% Param.CheckFix2=get(handles.CheckFix2,'Value');
2420% Param.CheckPatch2=get(handles.CheckPatch2,'Value');
2421% box_test=[Param.CheckCiv1 Param.CheckFix1 Param.CheckPatch1 Param.CheckCiv2 Param.CheckFix2 Param.CheckPatch2];
2422%
2423% option_civ=find(box_test,1,'last');%last selected option (non-zero index of box_test)
2424% filecell=get(handles.civ,'UserData');%retrieve the list of output files expected for PIV
2425% test_new=0;
2426% if ~isfield(filecell,'nc')
2427%     test_new=1;
2428%     [ref_i,ref_j,errormsg]=find_ref_indices(handles);
2429%     if ~isempty(errormsg)
2430%         msgbox_uvmat('ERROR',errormsg)
2431%         return
2432%     end
2433%     filecell=set_civ_filenames(handles,ref_i,ref_j,box_test);%determine the output file expected from the GUI status
2434% end
2435% if ~isequal(box_test(4:6),[0 0 0])
2436%     civ_files=filecell.nc.civ2;%case of civ2 operations
2437% else
2438%     civ_files=filecell.nc.civ1;
2439% end
2440% InputTable=get(handles.InputTable,'Data');
2441% OutputDir=fullfile(InputTable{1,1},[get(handles.OutputSubDir,'String') get(handles.OutputDirExt,'String')]);
2442StatusData.time_ref=get(handles.RUN,'UserData');% get the time of launch
2443% StatusData.option_civ=option_civ;
2444Param=read_GUI(handles.series);
2445RootPath=Param.InputTable{1,1};
2446%SubDir=Param.InputTable{1,2};
2447OutputSubDir=[Param.OutputSubDir Param.OutputDirExt];% subdirectory for output files
2448OutputDir=fullfile(RootPath,OutputSubDir);
2449% set(hlist,'UserData',OutputDir)
2450hfig=findobj(allchild(0),'name','series_status');
2451if isempty(hfig)
2452    hfig=figure('DeleteFcn',@stop_status);
2453    set(hfig,'MenuBar','none')% suppress the menu bar
2454    set(hfig,'NumberTitle','off')%suppress the fig number in the title
2455    set(hfig,'name','series_status')
2456    set(hfig,'tag','series_status')
2457%    set(hfig,'UserData',civ_files)
2458    hlist= uicontrol('Style','listbox','Units','normalized', 'Position',[0.05 0.09 0.9 0.71], 'Callback', {'open_uvmat'},'tag','list','UserData',OutputDir);
2459    uicontrol('Style','edit','Units','normalized', 'Position', [0.05 0.87 0.9 0.1],'tag','msgbox','Max',2,'String',OutputDir);
2460    uicontrol('Style','frame','Units','normalized', 'Position', [0.05 0.81 0.9 0.05]);
2461    %uicontrol('Style','pushbutton','Units','normalized', 'Position', [0.7 0.01 0.2 0.07],'String','Close','FontWeight','bold','FontUnits','points','FontSize',11,'Callback',@close_GUI);
2462    uicontrol('Style','pushbutton','Units','normalized', 'Position', [0.7 0.01 0.2 0.07],'String','Close','FontWeight','bold','FontUnits','points','FontSize',11,'Callback',@stop_status);
2463    hrefresh=uicontrol('Style','pushbutton','Units','normalized', 'Position', [0.1 0.01 0.2 0.07],'String','Refresh','FontWeight','bold','FontUnits','points','FontSize',11,'Callback',@refresh_GUI);
2464    set(hrefresh,'UserData',StatusData)
2465    BarPosition=[0.05 0.81 0.01 0.05];
2466    uicontrol('Style','frame','Units','normalized', 'Position',BarPosition ,'BackgroundColor',[1 0 0],'tag','waitbar');
2467    drawnow
2468end
2469
2470refresh_GUI(hrefresh,[])
2471%------------------------------------------------------------------------   
2472% launched by refreshing the status figure
2473function refresh_GUI(hObject, eventdata)
2474%------------------------------------------------------------------------
2475% Tabchar={};
2476% BarPosition=[0.05 0.81 0.01 0.05];
2477hfig=get(hObject,'parent');
2478hmsgbox=findobj(hfig,'tag','msgbox');
2479hlist=findobj(hfig,'tag','list');
2480% StatusData=get(hObject,'UserData');
2481OutputDir=get(hmsgbox,'String');
2482ListFiles=dir(OutputDir);
2483ListDisplay=cell(numel(ListFiles),1);
2484for ilist=1:numel(ListDisplay)
2485    ListDisplay{ilist}=ListFiles(ilist).name;
2486end
2487set(hlist,'String',ListDisplay)
2488% civ_files=get(hfig,'UserData');
2489
2490% [filepath,filename,ext]=fileparts(civ_files{1});
2491% [tild,SubDir,extdir]=fileparts(filepath);
2492% SubDir=[SubDir extdir];
2493% option_civ=StatusData.option_civ;
2494% nbfiles=numel(civ_files);
2495% testrecent=0;
2496% count=0;
2497% datnum=zeros(1,nbfiles);
2498% filefound=cell(1,nbfiles);
2499% for ifile=1:nbfiles
2500%     detect=exist(civ_files{ifile},'file'); % check the existence of the file
2501%     option=0;
2502%     if detect==0
2503%         option_str='not created';
2504%     else
2505%         datfile=dir(civ_files{ifile});
2506%         if isfield(datfile,'datenum')
2507%             datnum(ifile)=datfile.datenum;%only available in recent matlab versions
2508%             testrecent=1;
2509%         end
2510%         filefound(ifile)={datfile.name};
2511%         
2512%         % check the content  netcdf file
2513%         Data=nc2struct(civ_files{ifile},'ListGlobalAttribute','CivStage','patch2','fix2','civ2','patch','fix');
2514%         option_list={'civ1','fix1','patch1','civ2','fix2','patch2'};
2515%         if ~isempty(Data.CivStage)
2516%             option=Data.CivStage;%case of Matlab civ
2517%         else
2518%             if ~isempty(Data.patch2) && isequal(Data.patch2,1)
2519%                 option=6;
2520%             elseif ~isempty(Data.fix2) && isequal(Data.fix2,1)
2521%                 option=5;
2522%             elseif ~isempty(Data.civ2) && isequal(Data.civ2,1);
2523%                 option=4;
2524%             elseif ~isempty(Data.patch) && isequal(Data.patch,1);
2525%                 option=3;
2526%             elseif ~isempty(Data.fix) && isequal(Data.fix,1);
2527%                 option=2;
2528%             else
2529%                 option=1;
2530%             end
2531%         end
2532%         option_str=option_list{option};
2533%         if datnum(ifile)<StatusData.time_ref
2534%             option_str=[option_str '  --OLD--'];
2535%         end
2536%     end
2537%     if option >= option_civ
2538%         count=count+1;
2539%     end
2540%     [filepath,filename,ext]=fileparts(civ_files{ifile});
2541%     Tabchar{ifile,1}=[fullfile(SubDir,filename) ext  '...' option_str];
2542% end
2543% datnum=datnum(datnum~=0);%keep the non zero values corresponding to existing files
2544% if isempty(datnum)
2545%     if testrecent
2546%         message='no civ result created yet';
2547%     else
2548%         message='';
2549%     end
2550% else
2551%     datnum=datnum(datnum~=0);%keep the non zero values corresponding to existing files
2552%     [first,ind]=min(datnum);
2553%     [last,indlast]=max(datnum);
2554%     message={[num2str(count) ' file(s) done over ' num2str(nbfiles)] ;['oldest modification:  ' cell2mat(filefound(ind)) ' : ' datestr(first)];...
2555%         ['latest modification:  ' cell2mat(filefound(indlast)) ' : ' datestr(last)]};
2556% end
2557% hlist=findobj(hfig,'tag','list');
2558% hmsgbox=findobj(hfig,'tag','msgbox');
2559% hwaitbar=findobj(hfig,'tag','waitbar');
2560% set(hlist,'String',Tabchar)
2561% set(hmsgbox,'String', message)
2562% if count>0 %&& ~test_new
2563%     BarPosition(3)=0.9*count/nbfiles;
2564%     set(hwaitbar,'Position',BarPosition)
2565% end
2566%------------------------------------------------------------------------   
2567% launched by deleting the status figure
2568function stop_status(hObject, eventdata)
2569%------------------------------------------------------------------------
2570hciv=findobj(allchild(0),'tag','series');
2571hhciv=guidata(hciv);
2572set(hhciv.status,'value',0) %reset the status uicontrol in the GUI civ
2573set(hhciv.status,'BackgroundColor',[0 1 0])
2574delete(gcbf)
2575
2576% --- Executes on selection change in ActionExt.
2577function ActionExt_Callback(hObject, eventdata, handles)
2578ActionExtList=get(handles.ActionExt,'String');
2579ActionExt=ActionExtList{get(handles.ActionExt,'Value')};
2580ActionList=get(handles.ActionName,'String');
2581ActionName=ActionList{get(handles.ActionName,'Value')};
2582if strcmp(ActionExt,'.sh')
2583    ActionFullName=fullfile(get(handles.ActionPath,'String'),[ActionName '.sh']);
2584    if ~exist(ActionFullName,'file')
2585        answer=msgbox_uvmat('INPUT_Y-N','compiled version has not been created: compile now?');
2586        if strcmp(answer,'Yes')
2587            currentdir=pwd;
2588            cd(get(handles.ActionPath,'String'))
2589            compile(ActionName)
2590            cd(currentdir)
2591        end
2592    end
2593    currentdir=pwd;
2594    cd(get(handles.ActionPath,'String'))
2595    sh_file=dir([ActionName '.sh']);
2596    m_file=dir([ActionName '.m']);
2597    if isfield(m_file,'datenum') && m_file.datenum>sh_file.datenum
2598        set(handles.ActionExt,'BackgroundColor',[1 1 0])
2599        answer=msgbox_uvmat('INPUT_Y-N',[ActionName '.sh needs to be updated: recompile now?']);
2600        if strcmp(answer,'Yes')
2601            compile(ActionName)
2602        end
2603        set(handles.ActionExt,'BackgroundColor',[1 1 1])
2604    end
2605    cd(currentdir)
2606end
2607
2608
2609function ActionInput_Callback(hObject, eventdata, handles)
2610
2611
2612% --- Executes on button press in DeleteObject.
2613function DeleteObject_Callback(hObject, eventdata, handles)
2614if get(handles.DeleteObject,'Value')
2615        SeriesData=get(handles.series,'UserData');
2616    SeriesData.ProjObject=[];
2617    set(handles.series,'UserData',SeriesData)
2618    set(handles.ProjObject,'String','')
2619    set(handles.CheckObject,'Value',0)
2620    set(handles.DeleteObject,'Visible','off')
2621    set(handles.ViewObject,'Visible','off')
2622end
2623
2624% --- Executes on button press in ViewObject.
2625function ViewObject_Callback(hObject, eventdata, handles)
2626if get(handles.ViewObject,'Value')
2627        UserData=get(handles.series,'UserData');
2628    set_object(UserData.ProjObject)
2629else
2630    hset_object=findobj(allchild(0),'Tag','set_object');
2631    if ~isempty(hset_object)
2632        delete(hset_object)
2633    end
2634end
2635
2636
2637function num_NbProcess_Callback(hObject, eventdata, handles)
2638
2639
2640function num_NbSlice_Callback(hObject, eventdata, handles)
2641NbSlice=str2num(get(handles.num_NbSlice,'String'));
2642set(handles.num_NbProcess,'String',num2str(NbSlice))
Note: See TracBrowser for help on using the repository browser.