source: trunk/src/series.m @ 20

Last change on this file since 20 was 17, checked in by sommeria, 14 years ago

possibilite de créer une grille physique dans geometry_calib (le faire apres avoir introduit les points sur l'image avec la souris)
petites corrections mineures sur les autres fichiers

File size: 182.3 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 CoordType (menu for coordinate transforms)
9%      .menu_coord_val: value for CoordType (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
32function varargout = series(varargin)
33
34% Begin initialization code - DO NOT EDIT
35gui_Singleton = 1;
36gui_State = struct('gui_Name',       mfilename, ...
37                   'gui_Singleton',  gui_Singleton, ...
38                   'gui_OpeningFcn', @series_OpeningFcn, ...
39                   'gui_OutputFcn',  @series_OutputFcn, ...
40                   'gui_LayoutFcn',  [] , ...
41                   'gui_Callback',   []);
42if nargin && ischar(varargin{1})
43    gui_State.gui_Callback = str2func(varargin{1});
44end
45
46if nargout
47    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
48else
49    gui_mainfcn(gui_State, varargin{:});
50end
51% End initialization code - DO NOT EDIT
52
53%--------------------------------------------------------------------------
54% --- Executes just before series is made visible.
55%--------------------------------------------------------------------------
56function series_OpeningFcn(hObject, eventdata, handles,param)
57
58% Choose default command line output for series
59handles.output = hObject;
60% Update handles structure
61guidata(hObject, handles);
62%default initial parameters
63
64%load the list of previously browsed files in menus Open and Open_1
65dir_perso=prefdir;
66profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
67if exist(profil_perso,'file')
68     h=load (profil_perso);
69     if isfield(h,'MenuFile_1')
70          set(handles.MenuFile_1,'Label',h.MenuFile_1);
71          set(handles.MenuFile_insert_1,'Label',h.MenuFile_1);
72     end
73     if isfield(h,'MenuFile_1')
74          set(handles.MenuFile_2,'Label',h.MenuFile_2);
75          set(handles.MenuFile_insert_2,'Label',h.MenuFile_2);
76     end
77     if isfield(h,'MenuFile_1')
78          set(handles.MenuFile_3,'Label',h.MenuFile_3);
79          set(handles.MenuFile_insert_3,'Label',h.MenuFile_3);
80     end
81     if isfield(h,'MenuFile_1')
82          set(handles.MenuFile_4,'Label',h.MenuFile_4);
83          set(handles.MenuFile_insert_4,'Label',h.MenuFile_4);
84     end
85     if isfield(h,'MenuFile_1')
86          set(handles.MenuFile_5,'Label',h.MenuFile_5);
87          set(handles.MenuFile_insert_5,'Label',h.MenuFile_5);
88     end
89end
90
91%check default input data
92if ~exist('param','var')
93    param=[]; %default
94end
95
96%file name and browser initialisation
97if isfield(param,'menu_coord_str')
98    set(handles.CoordType,'String',param.menu_coord_str)
99end
100if isfield(param,'menu_coord_val')
101    set(handles.CoordType,'Value',param.menu_coord_val);
102else
103     set(handles.CoordType,'Value',1);%default
104end
105
106if isfield(param,'FileName')
107    if isfield(param,'FileName_1')
108        update_file(hObject, eventdata, handles,param.FileName_1,0)
109        update_file(hObject, eventdata, handles,param.FileName,1)
110    else
111        update_file(hObject, eventdata, handles,param.FileName,0)
112    end
113end 
114
115%fields input initialisation
116if isfield(param,'list_fields')&& isfield(param,'index_fields') &&~isempty(param.list_fields) &&~isempty(param.index_fields)
117    set(handles.FieldMenu,'String',param.list_fields);% list menu fields
118    set(handles.FieldMenu,'Value',param.index_fields);% selected string index
119    FieldCell{1}=param.list_fields{param.index_fields};
120end
121if isfield(param,'civ1')&& islogical(param.civ1) && isfield(param,'civ2')&& islogical(param.civ2)&...
122        isfield(param,'interp1')&& islogical(param.interp1)&&isfield(param,'interp2')&& islogical(param.interp2)&...
123        isfield(param,'filter1')&& islogical(param.filter1)&&isfield(param,'filter2')&& islogical(param.filter2)
124    set(handles.civ1,'Value',param.civ1);
125    set(handles.civ2,'Value',param.civ1);
126    set(handles.interp1,'Value',param.interp1);
127    set(handles.interp2,'Value',param.interp2);
128    set(handles.filter1,'Value',param.filter1);
129    set(handles.filter2,'Value',param.filter2);
130end
131%set(hObject,'UserData', SeriesData)
132set(hObject,'WindowButtonUpFcn',{@mouse_up_gui,handles})
133NomType_Callback(hObject, eventdata, handles)
134%mode_Callback(hObject, eventdata, handles)
135
136%loads the information stored in prefdir to initiate the browser and the list of functions
137menu_str=get(handles.ACTION,'String');%list of functions included in 'series.m'
138menu_str(end)=[];%remove from the list the last option 'more...'
139path_series=which('series');%path of the function 'series'
140for ilist=1:length(menu_str)
141    fct_path{ilist,1}=path_series;%paths of the fuctions buil-in in 'series.m'
142end
143dir_perso=prefdir;
144profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
145if exist(profil_perso,'file')
146    h=load (profil_perso);
147    if isfield(h,'series_fct') && iscell(h.series_fct)
148         for ilist=1:length(h.series_fct)
149             [path,file]=fileparts(h.series_fct{ilist});
150             fct_path=[fct_path; {path}];%concatene the list of paths
151             menu_str=[menu_str; {file}];
152         end
153         menu_str=[menu_str;{'more...'}];
154         set(handles.ACTION,'String',menu_str)
155    end
156end
157set(handles.ACTION,'UserData',fct_path)% store the list of path in UserData of ACTION
158
159% display the GUI for the default action 'check_files'
160ACTION_Callback(hObject, eventdata, handles)
161
162%--------------------------------------------------------------
163% --- Outputs from this function are returned to the command line.
164%-----------------------------------------------------------------
165function varargout = series_OutputFcn(hObject, eventdata, handles)
166% varargout  cell array for returning output args (see VARARGOUT);
167% hObject    handle to figure
168% eventdata  reserved - to be defined in a future version of MATLAB
169% handles    structure with handles and user data (see GUIDATA)
170% Get default command line output from handles structure
171varargout{1} = handles.output;
172
173
174% --------------------------------------------------------------------
175function MenuBrowse_Callback(hObject, eventdata, handles)
176
177RootPathCell=get(handles.RootPath,'String');
178SubDirCell=get(handles.SubDir,'String'); 
179RootFileCell=get(handles.RootFile,'String');
180oldfile=''; %default
181if isempty(RootPathCell)|isequal(RootPathCell,{''})%loads the previously stored file name and set it as default in the file_input box
182     dir_perso=prefdir;
183     profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
184     if exist(profil_perso,'file')
185          h=load (profil_perso);
186         if isfield(h,'filebase')&ischar(h.filebase)
187                 oldfile=h.filebase;
188         end
189         if isfield(h,'RootPath')&ischar(h.RootPath)
190                 oldfile=h.RootPath;
191         end
192     end
193 else
194     oldfile=fullfile(RootPathCell{1},SubDirCell{1},RootFileCell{1});
195 end
196[FileName, PathName, filterindex] = uigetfile( ...
197       {'*.xml;*.xls;*.png;*.tif;*.avi;*.AVI;*.nc', ' (*.xml,*.xls, *.png,*.tif, *.avi,*.nc)';
198       '*.xml',  '.xml files '; ...
199        '*.xls',  '.xls files '; ...
200        '*.png','.png image files'; ...
201        '*.tif','.tif image files'; ...
202        '*.avi;*.AVI','.avi movie files'; ...
203        '*.nc','.netcdf files'; ...
204        '*.*',  'All Files (*.*)'}, ...
205        'Pick a file',oldfile);
206fileinput=[PathName FileName];%complete file name
207testblank=findstr(fileinput,' ');%look for blanks
208if ~isempty(testblank)
209    errordlg('forbidden input file name: contain blanks')
210    return
211end
212sizf=size(fileinput);
213if (~ischar(fileinput)|~isequal(sizf(1),1)),return;end
214[path,name,ext]=fileparts(fileinput);
215SeriesData=[];%dfault
216if isequal(ext,'.xml')
217    errordlg('input file type not implemented')%A Faire: ouvrir le fichier pour naviguer
218elseif isequal(ext,'.xls')
219    errordlg('input file type not implemented')%A Faire: ouvrir le fichier pour naviguer
220else
221    update_file(hObject, eventdata, handles,fileinput,0)
222     %update list of recent files in the menubar
223    MenuFile_1=fileinput;
224    MenuFile_2=get(handles.MenuFile_1,'Label');
225    MenuFile_3=get(handles.MenuFile_2,'Label');
226    MenuFile_4=get(handles.MenuFile_3,'Label');
227    MenuFile_5=get(handles.MenuFile_4,'Label');
228    set(handles.MenuFile_1,'Label',MenuFile_1)
229    set(handles.MenuFile_2,'Label',MenuFile_2)
230    set(handles.MenuFile_3,'Label',MenuFile_3)
231    set(handles.MenuFile_4,'Label',MenuFile_4)
232    set(handles.MenuFile_5,'Label',MenuFile_5)
233    set(handles.MenuFile_insert_1,'Label',MenuFile_1)
234    set(handles.MenuFile_insert_2,'Label',MenuFile_2)
235    set(handles.MenuFile_insert_3,'Label',MenuFile_3)
236    set(handles.MenuFile_insert_4,'Label',MenuFile_4)
237    set(handles.MenuFile_insert_5,'Label',MenuFile_5)
238    dir_perso=prefdir;
239    profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
240    if exist(profil_perso,'file')
241        save (profil_perso,'MenuFile_1','MenuFile_2','MenuFile_3','MenuFile_4', 'MenuFile_5','-append'); %store the file names for future opening of uvmat
242    else
243        txt=ver;
244        Release=txt(1).Release;
245        relnumb=str2num(Release(3:4));
246        if relnumb >= 14
247            save (profil_perso,'MenuFile_1','MenuFile_2','MenuFile_3','MenuFile_4', 'MenuFile_5','-V6'); %store the file names for future opening of uvmat
248        else
249            save (profil_perso,'MenuFile_1','MenuFile_2','MenuFile_3','MenuFile_4', 'MenuFile_5'); %store the file names for future opening of uvmat
250        end
251    end
252end
253% set(hseries,'UserData',SeriesData);
254% RootFile_Callback(hObject, eventdata, handles);
255% FileExt_Callback(hObject, eventdata, handles);
256% NomType_Callback(hObject, eventdata, handles)
257% mode_Callback(hObject, eventdata, handles)
258
259
260% --------------------------------------------------------------------
261function MenuFile_1_Callback(hObject, eventdata, handles)
262fileinput=get(handles.MenuFile_1,'Label');
263update_file(hObject, eventdata, handles,fileinput,0)
264
265% --------------------------------------------------------------------
266function MenuFile_2_Callback(hObject, eventdata, handles)
267fileinput=get(handles.MenuFile_2,'Label');
268update_file(hObject, eventdata, handles,fileinput,0)
269
270% --------------------------------------------------------------------
271function MenuFile_3_Callback(hObject, eventdata, handles)
272fileinput=get(handles.MenuFile_3,'Label');
273update_file(hObject, eventdata, handles,fileinput,0)
274
275% --------------------------------------------------------------------
276function MenuFile_4_Callback(hObject, eventdata, handles)
277fileinput=get(handles.MenuFile_4,'Label');
278update_file(hObject, eventdata, handles,fileinput,0)
279
280% --------------------------------------------------------------------
281function MenuFile_5_Callback(hObject, eventdata, handles)
282fileinput=get(handles.MenuFile_5,'Label');
283update_file(hObject, eventdata, handles,fileinput,0)
284
285% --------------------------------------------------------------------
286function MenuBrowse_insert_Callback(hObject, eventdata, handles)
287
288%hseries=get(handles.browse_root,'parent');
289RootPathCell=get(handles.RootPath,'String');
290% SubDirCell=get(handles.SubDir,'String'); 
291RootFileCell=get(handles.RootFile,'String');
292oldfile=''; %default
293if isempty(RootPathCell)|isequal(RootPathCell,{''})%loads the previously stored file name and set it as default in the file_input box
294     dir_perso=prefdir;
295     profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
296     if exist(profil_perso,'file')
297          h=load (profil_perso);
298         if isfield(h,'filebase')&ischar(h.filebase)
299                 oldfile=h.filebase;
300         end
301         if isfield(h,'RootPath')&ischar(h.RootPath)
302                 oldfile=h.RootPath;
303         end
304     end
305 else
306     oldfile=fullfile(RootPathCell{1},RootFileCell{1});
307 end
308[FileName, PathName, filterindex] = uigetfile( ...
309       {'*.xml;*.xls;*.png;*.avi;*.AVI;*.nc', ' (*.xml,*.xls, *.png, *.avi,*.nc)';
310       '*.xml',  '.xml files '; ...
311        '*.xls',  '.xls files '; ...
312        '*.png','.png image files'; ...
313        '*.avi;*.AVI','.avi movie files'; ...
314        '*.nc','.netcdf files'; ...
315        '*.*',  'All Files (*.*)'}, ...
316        'Pick a file',oldfile);
317fileinput=[PathName FileName];%complete file name
318testblank=findstr(fileinput,' ');%look for blanks
319if ~isempty(testblank)
320    errordlg('forbidden input file name: contain blanks')
321    return
322end
323sizf=size(fileinput);
324if (~ischar(fileinput)|~isequal(sizf(1),1)),return;end
325[path,name,ext]=fileparts(fileinput);
326SeriesData=[];%dfault
327if isequal(ext,'.xml')
328    errordlg('input file type not implemented')%A Faire: ouvrir le fichier pour naviguer
329elseif isequal(ext,'.xls')
330    errordlg('input file type not implemented')%A Faire: ouvrir le fichier pour naviguer
331else
332    update_file(hObject, eventdata, handles,fileinput,1)
333    %update list of recent files in the menubar
334    MenuFile_1=fileinput;
335    MenuFile_2=get(handles.MenuFile_1,'Label');
336    MenuFile_3=get(handles.MenuFile_2,'Label');
337    MenuFile_4=get(handles.MenuFile_3,'Label');
338    MenuFile_5=get(handles.MenuFile_4,'Label');
339    set(handles.MenuFile_1,'Label',MenuFile_1)
340    set(handles.MenuFile_2,'Label',MenuFile_2)
341    set(handles.MenuFile_3,'Label',MenuFile_3)
342    set(handles.MenuFile_4,'Label',MenuFile_4)
343    set(handles.MenuFile_5,'Label',MenuFile_5)
344    set(handles.MenuFile_insert_1,'Label',MenuFile_1)
345    set(handles.MenuFile_insert_2,'Label',MenuFile_2)
346    set(handles.MenuFile_insert_3,'Label',MenuFile_3)
347    set(handles.MenuFile_insert_4,'Label',MenuFile_4)
348    set(handles.MenuFile_insert_5,'Label',MenuFile_5)
349    dir_perso=prefdir;
350    profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
351    if exist(profil_perso,'file')
352        save (profil_perso,'MenuFile_1','MenuFile_2','MenuFile_3','MenuFile_4', 'MenuFile_5','-append'); %store the file names for future opening of uvmat
353    else
354        txt=ver;
355        Release=txt(1).Release;
356        relnumb=str2num(Release(3:4));
357        if relnumb >= 14
358            save (profil_perso,'MenuFile_1','MenuFile_2','MenuFile_3','MenuFile_4', 'MenuFile_5','-V6'); %store the file names for future opening of uvmat
359        else
360            save (profil_perso,'MenuFile_1','MenuFile_2','MenuFile_3','MenuFile_4', 'MenuFile_5'); %store the file names for future opening of uvmat
361        end
362    end
363end
364%------------------------------------------------
365
366% --------------------------------------------------------------------
367function MenuFile_insert_1_Callback(hObject, eventdata, handles)
368fileinput=get(handles.MenuFile_insert_1,'Label');
369update_file(hObject, eventdata, handles,fileinput,1)
370
371% --------------------------------------------------------------------
372function MenuFile_insert_2_Callback(hObject, eventdata, handles)
373fileinput=get(handles.MenuFile_insert_2,'Label');
374update_file(hObject, eventdata, handles,fileinput,1)
375
376% --------------------------------------------------------------------
377function MenuFile_insert_3_Callback(hObject, eventdata, handles)
378fileinput=get(handles.MenuFile_insert_3,'Label');
379update_file(hObject, eventdata, handles,fileinput,1)
380
381% --------------------------------------------------------------------
382function MenuFile_insert_4_Callback(hObject, eventdata, handles)
383fileinput=get(handles.MenuFile_insert_4,'Label');
384update_file(hObject, eventdata, handles,fileinput,1)
385
386% --------------------------------------------------------------------
387function MenuFile_insert_5_Callback(hObject, eventdata, handles)
388fileinput=get(handles.MenuFile_insert_5,'Label');
389update_file(hObject, eventdata, handles,fileinput,1)
390
391% --------------------------------------------------------------------
392% refresh the GUI data after introduction of a new file series
393function update_file(hObject, eventdata, handles,fileinput,addtest)
394hseries=get(handles.RootPath,'parent'); 
395% refresh input root name, indices, file extension and nomenclature
396[RootPath,RootFile,field_count,str2,str_a,str_b,FileExt,NomType,SubDir]=name2display(fileinput);
397%check for movie image files
398if ~isempty(imformats(FileExt(2:end)))
399    imainfo=imfinfo(fileinput);     
400    if length(imainfo) >1 %case of image with multiple frames
401        NomType='*';
402        [RootPath,RootFile]=fileparts(fileinput);
403    end
404end
405NcType='none';%default
406if isequal(FileExt,'.nc')
407   Data=nc2struct(fileinput,[]);
408   if isfield(Data,'absolut_time_T0')
409       NcType='civx'; % test for civx velocity fields
410   end
411end
412
413set(handles.RootPath,'Value',1)
414set(handles.SubDir,'Value',1)
415set(handles.RootFile,'Value',1)
416set(handles.NomType,'Value',1)
417set(handles.FileExt,'Value',1)
418set(handles.nb_field,'Value',1)
419set(handles.nb_field2,'Value',1)
420if addtest
421    SeriesData=get(hseries,'UserData');
422    SeriesData.displ_num=[0 0 0 0;SeriesData.displ_num];
423    SeriesData.CurrentInputFile_1=SeriesData.CurrentInputFile;
424    RootPathCell=[{RootPath}; get(handles.RootPath,'String')] ;
425    SubDirCell=[{SubDir}; get(handles.SubDir,'String')];
426    RootFileCell=[{RootFile}; get(handles.RootFile,'String')];
427    NomTypeCell=[{NomType}; SeriesData.NomType];
428    FileExtCell=[{FileExt}; get(handles.FileExt,'String')];
429    NcTypeCell=[{NcType};SeriesData.NcType];
430    set(handles.NomType,'String',[{};get(handles.NomType,'String')])
431else
432    SeriesData=[];%re-initialisation
433    SeriesData.displ_num=[0 0 0 0];
434    RootPathCell={RootPath};
435    SubDirCell={SubDir};
436    RootFileCell={RootFile};   
437    NomTypeCell={NomType};
438    FileExtCell={FileExt};   
439    NcTypeCell={NcType};
440end
441
442SeriesData.NomType=NomTypeCell;
443SeriesData.NcType=NcTypeCell;
444SeriesData.CurrentInputFile=fileinput;
445set(handles.RootPath,'String',RootPathCell);
446set(handles.SubDir,'String',SubDirCell);
447set(handles.RootFile,'String',RootFileCell);
448set(handles.NomType,'String',NomTypeCell);
449set(handles.FileExt,'String',FileExtCell); 
450
451%determine field indices
452ref_i=1; %default ref_i is a reference frame index used to find existing pairs from PIV
453if ~isempty(str2num(field_count))
454    ref_i=str2num(field_count);
455    if ~isempty(str2num(str2))
456        ref_i=floor((ref_i+str2num(str2))/2);% reference image number corresponding to the file
457        SeriesData.browse_Di=str2num(str2)-str2num(field_count);
458    end
459end
460set(handles.ref_i,'String',num2str(ref_i));
461set(handles.first_i,'String',num2str(ref_i));
462set(handles.last_i,'String',num2str(ref_i));
463ref_j=1; %default  ref_j is a reference frame index used to find existing pairs from PIV
464if ~isempty(str2num(str_a))
465    ref_j=str2num(str_a);
466    if ~isempty(str2num(str_b))
467        ref_j=floor((str2num(str_a)+str2num(str_b))/2);
468        SeriesData.browse_Dj=str2num(str_b)-str2num(str_a);
469    end         
470end
471set(handles.ref_j,'String',num2str(ref_j));
472set(handles.first_j,'String',num2str(ref_j))
473set(handles.last_j,'String',num2str(ref_j));
474%set(hseries,'UserData',SeriesData);
475
476%enable other menus and uicontrols
477set(handles.MenuOpen_insert,'Enable','on')
478set(handles.MenuFile_insert_1,'Enable','on')
479set(handles.MenuFile_insert_2,'Enable','on')
480set(handles.MenuFile_insert_3,'Enable','on')
481set(handles.MenuFile_insert_4,'Enable','on')
482set(handles.MenuFile_insert_5,'Enable','on')
483set(handles.RUN, 'Enable','On')
484set(handles.RUN,'BackgroundColor',[1 0 0])% set RUN button to red
485set(handles.RootPath,'BackgroundColor',[1 1 0]) % set RootPath edit box  to yellow
486drawnow
487
488% hseries=get(handles.RootFile,'parent');
489% SeriesData=get(hseries,'UserData');%read information set by the browser
490% ext_ima_read=[];
491% field_count=1;%default
492% pxcmx=1;
493% pxcmy=1;
494TimeUnit=''; %default
495% CoordUnit='';%default
496time=[];%default
497GeometryCalib=[];%default
498nb_field=[];%default
499nb_field2=[];%default
500% Heading=[];
501% [PD,Device]=fileparts(RootPathCell{1});
502SeriesData.PathCampaign=get(handles.PathCampaign,'String');
503
504% read timing and total frame number from the current file (movie files) !! may be overrid by xml file
505%icell=length(RootPathCell);
506FileBase=fullfile(RootPath,RootFile);
507
508% nb_field{icell,1}='?';%default
509% nb_field2{icell,1}='?';%default
510testima=0; %test for image input
511if isequal(lower(FileExt),'.avi') %.avi file
512    testima=1;
513    info=aviinfo([FileBase FileExt]);
514    time=[0:1/info.FramesPerSecond:(info.NumFrames-1)/info.FramesPerSecond]';
515    nb_field=info.NumFrames;
516    nb_field2=1;
517elseif ~isempty(imformats(FileExt(2:end)))
518    testima=1;
519    if isequal(NomType,'*')% multi-frame image
520        imainfo=imfinfo([FileBase FileExt]);     
521        if length(imainfo) >1 %case of image with multiple frames
522            nb_field=length(imainfo);
523            nb_field2=1;
524        end
525    end
526elseif isequal(FileExt,'.vol')
527     testima=1;
528end
529
530% enable field and veltype menus
531testfield=isequal(get(handles.FieldMenu,'enable'),'on');
532testfield_1=isequal(get(handles.FieldMenu_1,'enable'),'on');
533testveltype=isequal(get(handles.VelTypeMenu,'enable'),'on');
534testveltype_1=isequal(get(handles.VelTypeMenu_1,'enable'),'on');
535testtransform=isequal(get(handles.CoordType,'Enable'),'on');
536testnc=0;
537testnc_1=0;
538testcivx=0;
539testcivx_1=0;
540if length(FileExtCell)==1 || length(FileExtCell)>2
541    for iview=1:length(FileExtCell)
542        if isequal(FileExtCell{iview},'.nc')
543            testnc=1;
544        end
545        if isequal(NcTypeCell{iview},'civx')
546            testcivx=1;
547        end
548    end
549elseif length(FileExtCell)==2
550    testnc=isequal(FileExtCell{1},'.nc');
551    testnc_1=isequal(FileExtCell{2},'.nc');
552    testcivx=isequal(NcTypeCell{1},'civx');
553    testcivx_1=isequal(NcTypeCell{2},'civx');
554end
555if testfield && testnc
556    view_FieldMenu(handles,'on')
557    if testcivx
558        menustr=get(handles.FieldMenu,'String');
559        if isequal(menustr,{'get_field...'})
560            set(handles.FieldMenu,'String',{'get_field...';'velocity';'vort';'div';'more...'})
561        end
562    else
563        set(handles.FieldMenu,'Value',1)
564        set(handles.FieldMenu,'String',{'get_field...'})
565    end
566else
567    view_FieldMenu(handles,'off')
568end
569if testfield_1 && testnc_1
570    view_FieldMenu_1(handles,'on')
571    if testcivx_1
572        menustr=get(handles.FieldMenu_1,'String');
573        if isequal(menustr,{'get_field...'})
574            set(handles.FieldMenu_1,'String',{'get_field...';'velocity';'vort';'div';'more...'})
575        end
576    else
577        set(handles.FieldMenu_1,'Value',1)
578        set(handles.FieldMenu_1,'String',{'get_field...'})
579    end
580else
581    view_FieldMenu_1(handles,'off')
582end
583if testveltype && testcivx
584    set(handles.VelTypeMenu,'Visible','on')
585    set(handles.VelType_text,'Visible','on');
586else
587    set(handles.VelTypeMenu,'Visible','off')
588    set(handles.VelType_text,'Visible','off');
589end
590if testveltype_1 && testcivx_1
591    set(handles.VelTypeMenu_1,'Visible','on')
592    set(handles.VelType_text_1,'Visible','on');
593else
594    set(handles.VelTypeMenu_1,'Visible','off')
595    set(handles.VelType_text_1,'Visible','off');
596end
597if testtransform && (testcivx || testima)
598     view_TRANSFORM(handles,'on')
599else
600    view_TRANSFORM(handles,'off')
601end
602if ~isequal(FileExt,'.nc') && ~isequal(FileExt,'.cdf') && ~testima
603    msgbox_uvmat('ERROR',['invalid input file extension ' FileExt])
604    return
605end 
606
607%%%%%%%%   read image documentation file  if found%%%%%%%%%%%%%%%%%%%%%%%%%%%
608      %look for the file existence
609ext_imadoc='';
610if isequal(FileExt,'.xml')||isequal(FileExt,'.civ')
611    ext_imadoc=FileExt;
612elseif exist([FileBase '.xml'],'file')
613    ext_imadoc='.xml';
614elseif exist([FileBase '.civ'],'file')
615    ext_imadoc='.civ';
616end
617      %read the ImaDoc file
618% mode=''; %default
619% testheading=0; 
620XmlData=[];
621NbSlice_calib={};
622if isequal(ext_imadoc,'.xml')
623        [XmlData,warntext]=imadoc2struct([FileBase '.xml']);
624        if isfield(XmlData,'Heading') && isfield(XmlData.Heading,'ImageName')
625            [PP,FF,ext_ima_read]=fileparts(XmlData.Heading.ImageName);
626        end
627        if isfield(XmlData,'Time')
628            time=XmlData.Time;
629        end
630        if isfield(XmlData,'Camera')
631            if isfield(XmlData.Camera,'NbSlice')&& ~isempty(XmlData.Camera.NbSlice)
632                NbSlice_calib{iview}=XmlData.Camera.NbSlice;% Nbre of slices for Zindex in phys transform
633                if ~isequal(NbSlice_calib{iview},NbSlice_calib{1})
634                    msgbox_uvmat('WARNING','inconsistent number of Z indices for the two field series');
635                end
636            end
637            if isfield(XmlData.Camera,'TimeUnit')&& ~isempty(XmlData.Camera.TimeUnit)
638                TimeUnit=XmlData.Camera.TimeUnit;
639            end
640        end
641        if ~isempty(warntext)
642            msgbox_uvmat('WARNING',warntext)
643        end 
644elseif isequal(ext_imadoc,'.civ')
645    [error,XmlData.Time,TimeUnit,mode,npx,npy,pxcmx,pxcmy]=read_imatext([FileBase '.civ']);
646    time=XmlData.Time;
647    size(time)
648    GeometryCalib.R=[pxcmx 0 0; 0 pxcmy 0;0 0 0];
649    GeometryCalib.Tx=0;
650    GeometryCalib.Ty=0;
651    GeometryCalib.Tz=1;
652    GeometryCalib.dpx=1;
653    GeometryCalib.dpy=1;
654    GeometryCalib.sx=1;
655    GeometryCalib.Cx=0;
656    GeometryCalib.Cy=0;
657    GeometryCalib.f=1;
658    GeometryCalib.kappa1=0;
659    GeometryCalib.CoordUnit='cm';
660    XmlData.GeometryCalib=GeometryCalib;
661    if error==2, warntext=['no file ' FileBase '.civ'];
662    elseif error==1, warntext='inconsistent number of fields in the .civ file';
663    end 
664%     set(handles.npx,'String',num2str(npx));%fills nbre of pixels x box
665%     set(handles.npy,'String',num2str(npy));%fills nbre of pixels y box
666%     set(handles.pxcm,'String',num2str(pxcmx));%fills scale x (pixel/cm) box
667%     set(handles.pycm,'String',num2str(pxcmy));%fills scale y (pixel/cm) box
668%     set(handles.pxcm,'Visible','on');%fills scale x (pixel/cm) box
669%     set(handles.pycm,'Visible','on');%fills scale y (pixel/cm) box
670%     set(handles.view_xml,'Visible','on')
671%     set(handles.view_xml,'String','view .civ')
672end 
673if addtest
674    SeriesData.Time=[{time} SeriesData.Time];
675else
676   SeriesData.Time={time};
677end
678
679if ~isempty(time)
680    siztime=size(time);
681    nb_field=siztime(1);
682    nb_field2=siztime(2);
683end   
684set(handles.TimeUnit,'String',TimeUnit)
685if isempty(nb_field)
686    nb_field_str='?';
687    nb_field_str2='?';
688else
689    nb_field_str=num2str(nb_field);
690    nb_field_str2=num2str(nb_field2);
691end
692if addtest
693    nb_field_cell=[{nb_field_str} ;get(handles.nb_field,'String')];
694    nb_field2_cell=[{nb_field_str2} ;get(handles.nb_field2,'String')];
695else
696    nb_field_cell={nb_field_str};
697    nb_field2_cell={nb_field_str2};
698end
699set(handles.nb_field,'String',nb_field_cell);
700set(handles.nb_field2,'String',nb_field2_cell);
701set(hseries,'UserData',SeriesData);
702
703%number of slices
704if isfield(XmlData,'GeometryCalib') && isfield(XmlData.GeometryCalib,'SliceCoord')
705       siz=size(XmlData.GeometryCalib.SliceCoord);
706       if siz(1)>1
707           NbSlice=siz(1);
708       else
709           NbSlice=1;
710       end
711       set(handles.NbSlice,'String',num2str(NbSlice))
712end
713
714% set menus of index pairs
715NomType_Callback(hObject, eventdata, handles)
716
717dir_perso=prefdir;
718profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
719% save(profil_perso, 'FileBase'); %store the root name for future opening of uvmat
720if exist(profil_perso,'file')
721    save (profil_perso,'RootPath','SubDir','RootFile','NomType', '-append'); %store the root name for future opening of uvmat
722else
723    txt=ver;
724    Release=txt(1).Release;
725    relnumb=str2num(Release(3:4));
726    if relnumb >= 14
727        save (profil_perso,'RootPath','SubDir','RootFile','NomType','-V6') %store the root name for future opening of uvmat
728    else
729        save(profil_perso,'RootPath','SubDir','RootFile','NomType')
730    end         
731end
732set(handles.RootPath,'BackgroundColor',[1 1 1])
733set(handles.PathCampaign,'String',SeriesData.PathCampaign)
734last_j_Callback(hObject, eventdata, handles)
735last_i_Callback(hObject, eventdata, handles)
736
737%------------------------------------------------------------
738function RootPath_Callback(hObject, eventdata, handles)
739Val=get(handles.RootPath,'Value');
740synchronise_view(handles,Val)
741NomType_Callback(hObject, eventdata, handles)
742%------------------------------------------------------------
743
744function synchronise_view(handles,Val)
745set(handles.RootPath,'Value',Val)
746set(handles.SubDir,'Value',Val)
747set(handles.RootFile,'Value',Val)
748set(handles.NomType,'Value',Val)
749set(handles.FileExt,'Value',Val)
750set(handles.nb_field,'Value',Val)
751set(handles.nb_field2,'Value',Val)
752set(handles.time_first,'Value',Val)
753set(handles.time_last,'Value',Val)
754
755
756%---------------------------------------------------------
757% Executes on carriage return on the subdir civ1 edit window
758%--------------------------------------------------------
759function SubDir_Callback(hObject, eventdata, handles)
760
761Val=get(handles.SubDir,'Value');
762synchronise_view(handles,Val)
763NomType_Callback(hObject, eventdata, handles)
764
765%--------------------------------------------------------------
766%function activated when a new filebase (image series) is introduced
767%------------------------------------------------------------
768function RootFile_Callback(hObject, eventdata, handles)
769Val=get(handles.RootFile,'Value');
770synchronise_view(handles,Val)
771NomType_Callback(hObject, eventdata, handles)
772
773%--------------------------------------------------------------
774%function activated when a new filebase (image series) is introduced
775%------------------------------------------------------------
776function FileExt_Callback(hObject, eventdata, handles)
777Val=get(handles.FileExt,'Value');
778synchronise_view(handles,Val)
779
780%--------------------------------------------------------------
781%function activated when a new filebase (image series) is introduced
782%------------------------------------------------------------
783function nb_field_Callback(hObject, eventdata, handles)
784Val=get(handles.nb_field,'Value');
785synchronise_view(handles,Val)
786
787%--------------------------------------------------------------
788%function activated when a new filebase (image series) is introduced
789%------------------------------------------------------------
790function nb_field2_Callback(hObject, eventdata, handles)
791Val=get(handles.nb_field2,'Value');
792synchronise_view(handles,Val)
793
794%--------------------------------------------------------------
795%function activated when a new filebase (image series) is introduced
796%------------------------------------------------------------
797function time_first_Callback(hObject, eventdata, handles)
798Val=get(handles.time_first,'Value');
799synchronise_view(handles,Val)
800
801%--------------------------------------------------------------
802%function activated when a new filebase (image series) is introduced
803%------------------------------------------------------------
804function time_last_Callback(hObject, eventdata, handles)
805Val=get(handles.time_last,'Value');
806synchronise_view(handles,Val)
807
808%--------------------------------------------------------------
809%function activated by NomType
810%------------------------------------------------------------
811NomType_Callback(hObject, eventdata, handles)
812
813function NomType_Callback(hObject, eventdata, handles)
814hseries=get(handles.ProjObject,'Parent');
815SeriesData=get(hseries,'UserData');
816if isfield(SeriesData,'NomType')
817    NomTypeCell=SeriesData.NomType;
818else
819    NomTypeCell={};
820end
821nbfield2_cell=get(handles.nb_field2,'String');
822val=get(handles.nb_field2,'Value');
823if iscell(nbfield2_cell)
824    nbfield2=str2num(nbfield2_cell{val});
825else
826    nbfield2=str2num(nbfield2_cell);
827end
828nbfield_cell=get(handles.nb_field,'String');
829if iscell(nbfield_cell)
830    nbfield=str2num(nbfield_cell{val});
831else
832   nbfield=str2num(nbfield_cell);
833end
834
835set(handles.mode,'Visible','off') % do not show index pairs by default
836set(handles.list_pair_civ,'Visible','off')
837set(handles.ref_i,'Visible','off')
838set(handles.ref_i_text,'Visible','off')
839testpair=0;
840state_j='off';
841%set the menus of image pairs and default selection for series
842%list pairs if relevant
843Val=get(handles.NomType,'Value');
844synchronise_view(handles,Val)
845if ~isempty(NomTypeCell)
846    NomType=NomTypeCell{Val};
847    switch NomType 
848            case {'_i1-i2_j', '_i1-i2'}
849                set(handles.mode,'String',{'series(Di)'})
850                set(handles.mode,'Value',1);
851                set(handles.mode,'Visible','on')
852                testpair=1;
853            case {'#_ab'}
854                set(handles.mode,'String',{'bursts'})
855                set(handles.mode,'Value',1);
856                testpair=1;
857            case '_i_j1-j2'
858                set(handles.mode,'String',{'bursts';'series(Dj)'})%multiple choice
859                if ~isempty(nbfield) && ~isempty(nbfield2) && ((nbfield2>10) || (nbfield==1))
860                    set(handles.mode,'Value',2);
861                else
862                    set(handles.mode,'Value',1);% advice 'bursts' for small bursts
863                end
864                set(handles.mode,'Visible','on')
865                testpair=1;
866    end
867    switch NomType   
868            case {'_i_j','_i_j1-j2','_i1-i2_j','#_ab'},% two navigation indices
869                state_j='on';
870    end
871end   
872if testpair
873    mode_Callback(hObject, eventdata, handles) 
874else
875    set(handles.NomType,'String',NomTypeCell)
876end
877set(handles.first_j,'Visible',state_j)
878set(handles.incr_j,'Visible',state_j)
879set(handles.last_j,'Visible',state_j)
880set(handles.nb_field2,'Visible',state_j)
881
882%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%????????????
883% --- Executes on button press in mode.
884%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
885function mode_Callback(hObject, eventdata, handles)
886hseries=get(handles.mode,'parent');
887SeriesData=get(hseries,'UserData');
888mode_list=get(handles.mode,'String');
889mode_value=get(handles.mode,'Value');
890mode=mode_list{mode_value};
891NomType=[];
892test_find_pair=0;
893if isfield(SeriesData,'NomType')
894    NomTypeCell=SeriesData.NomType;
895    Val=get(handles.NomType,'Value');
896    NomType=NomTypeCell{Val};
897    test_find_pair=isequal(NomType,'_i_j1-j2')|| isequal(NomType,'_i1-i2_j')|| isequal(NomType,'_i1-i2')|| isequal(NomType,'#_ab');
898end
899% displ_num=[];%default
900% first_i=str2num(get(handles.first_i,'String'));
901% last_i=str2num(get(handles.last_i,'String'));
902time=[];
903if isfield(SeriesData,'Time')
904time=SeriesData.Time{1}; %get the set of times
905end
906siztime=size(time);
907nbfield=siztime(1);
908nbfield2=siztime(2);
909indchosen=1;  %%first pair selected by default
910if isequal(mode,'bursts')
911    enable_i(handles,'On')
912    enable_j(handles,'Off')   
913elseif  isequal(NomType,'_i_j1-j2')|| isequal(NomType,'_i1-i2_j')
914    enable_i(handles,'On')
915    enable_j(handles,'On')
916else
917    enable_i(handles,'On')
918    enable_j(handles,'Off')
919end   
920   
921   
922% elseif isequal(mode,'series(Dj)')       
923%     enable_j(handles,'On')     
924%     if nbfield==1
925%         enable_i(handles,'Off')
926%     else
927%         enable_i(handles,'On')
928%     end
929% elseif isequal(mode,'series(Di)')
930%     if nbfield2 > 1
931%          enable_j(handles,'On')
932%     else
933%          enable_j(handles,'Off')
934%     end
935% end 
936set(handles.list_pair_civ,'Value',indchosen);%set the default choice of image pairs for civ1
937% SetSeries.displ_num=displ_num;
938set(hseries,'UserData',SeriesData)
939
940%list pairs if relevant
941if test_find_pair
942     find_netcpair_civ(hObject, eventdata, handles,Val)
943end
944
945%-------------------------------------
946function enable_i(handles,state)
947set(handles.i_txt,'Visible',state)
948set(handles.first_i,'Visible',state)
949set(handles.last_i,'Visible',state)
950set(handles.incr_i,'Visible',state)
951set(handles.nb_field,'Visible',state)
952set(handles.ref_i,'Visible',state)
953set(handles.ref_i_text,'Visible',state)
954
955%-----------------------------------
956function enable_j(handles,state)
957set(handles.j_txt,'Visible',state)
958set(handles.first_j,'Visible',state)
959set(handles.last_j,'Visible',state)
960set(handles.incr_j,'Visible',state)
961set(handles.nb_field2,'Visible',state)
962set(handles.ref_j,'Visible',state)
963set(handles.ref_j_text,'Visible',state)
964
965%-----------------------------------
966function view_FieldMenu(handles,state)
967set(handles.FieldMenu,'Visible',state)
968set(handles.Field_text,'Visible',state)
969set(handles.Field_frame,'Visible',state)
970
971%-----------------------------------
972function view_FieldMenu_1(handles,state)
973set(handles.FieldMenu_1,'Visible',state)
974set(handles.Field_text_1,'Visible',state)
975
976%-----------------------------------
977function view_TRANSFORM(handles,state)
978set(handles.TRANSFORM_frame,'Visible',state)
979set(handles.CoordType,'Visible',state);
980set(handles.TRANSFORM_title,'Visible',state)
981
982%--------------------------------------------------------------
983% determine the menu for civ1 pairs depending on existing netcdf file at the middle of
984% the field series set by first_i, incr, last_i
985%----------------------------------------------------------------
986function find_netcpair_civ(hObject, eventdata, handles,Val)
987hseries=get(handles.list_pair_civ,'parent');
988SeriesData=get(hseries,'UserData');
989% NomTypeCell=get(handles.NomType,'String');
990NomTypeCell=SeriesData.NomType;
991NomType=NomTypeCell{Val};
992  set(handles.list_pair_civ,'Visible','on')
993%nomenclature types
994RootPathCell=get(handles.RootPath,'String');
995filepath=RootPathCell{Val};
996RootFileCell=get(handles.RootFile,'String');
997filename=RootFileCell{Val};
998filebase=fullfile(filepath,filename);
999SubDirCell=get(handles.SubDir,'String');
1000subdir=SubDirCell{Val};
1001if ~exist(fullfile(filepath,subdir),'dir')
1002         msgbox_uvmat('ERROR',['no civ file available: subdirectory ' subdir ' does not exist'])
1003         set(handles.list_pair_civ,'String',{''});
1004         return
1005end
1006mode_list=get(handles.mode,'String');
1007mode_value=get(handles.mode,'Value');
1008mode=mode_list{mode_value};
1009
1010%reads image numbers from the interface
1011ref_i=str2num(get(handles.ref_i,'String'));
1012ref_j=str2num(get(handles.ref_j,'String'));
1013% time=[];
1014% ref_time=[];
1015 ref_time=0;
1016if isfield(SeriesData,'Time')&~isempty(SeriesData.Time{Val})&~isequal(SeriesData.Time{Val},0)
1017    time=SeriesData.Time{Val}; %get the set of times
1018    siztime=size(time);
1019    nbfield=siztime(1);
1020    nbfield2=siztime(2);
1021%     test_imadoc=1;
1022else
1023%     test_imadoc=0;%no image documentation file
1024    nbfield=50;
1025    nbfield2=50;%default max number of pairs
1026end
1027%look for existing processed pairs involving the field at the middle of the series if civ1 will not
1028% be performed, while the result is needed for next steps.
1029displ_pair={''};
1030displ_num=[];
1031ind_exist=0;
1032TimeUnit=get(handles.TimeUnit,'String');
1033if length(TimeUnit)>=1
1034    dtunit=['m' TimeUnit];
1035else
1036    dtunit='e-03';
1037end
1038if isequal(mode,'series(Di)')
1039     for index=1:min(nbfield-1,50)
1040         filename=name_generator(filebase,ref_i-floor(index/2),ref_j,'.nc',NomType,1,ref_i+ceil(index/2),ref_j,subdir);
1041         select=(exist(filename,'file')==2);
1042         if select==1
1043               ind_exist=ind_exist+1;
1044                displ_num(1,ind_exist)=0;
1045                displ_num(2,ind_exist)=0;
1046                displ_num(3,ind_exist)=-floor(index/2);
1047                displ_num(4,ind_exist)=ceil(index/2);
1048                %[cte_detect,vdt,cte_read]=read_netcdf(filename,{'dt','dt2','absolut_time_T0','absolute_time_TO_2'});
1049                [Cte,var_detect,ichoice]=nc2struct(filename,{});
1050                if isfield(Cte,'dt2')
1051                    dt=Cte.dt2;
1052                elseif isfield(Cte,'dt')
1053                    dt=Cte.dt;
1054                end
1055                if isfield(Cte,'absolut_time_TO_2')
1056                    ref_time(ind_exist)=Cte.absolut_time_TO_2;%civ2 data used in priority
1057                elseif isfield(Cte,'absolut_time_TO')
1058                    ref_time(ind_exist)=Cte.absolut_time_TO;%civ2 data used in priorit
1059                elseif isfield(Cte,'Time')
1060                    ref_time(ind_exist)=Cte.Time;
1061                end
1062                displ_pair{ind_exist}=['Di= ' num2str(-floor(index/2)) '|' num2str(ceil(index/2)) ' :dt= ' num2str(dt*1000) dtunit];
1063         end
1064     end
1065     set(handles.list_pair_civ,'String',[displ_pair';{'Di=*|*'}]);   
1066elseif isequal(mode,'series(Dj)')% series on the j index
1067       for index=1:min(nbfield2-1,50)
1068           filename=name_generator(filebase,ref_i,ref_j-floor(index/2),'.nc',NomType,1,ref_i,ref_j+ceil(index/2),subdir);
1069           select=(exist(filename,'file')==2);
1070           if select==1
1071               ind_exist=ind_exist+1;
1072                displ_num(1,ind_exist)=-floor(index/2);
1073                displ_num(2,ind_exist)=ceil(index/2);
1074                displ_num(3,ind_exist)=0;
1075                displ_num(4,ind_exist)=0;
1076                %[cte_detect,vdt,cte_read]=read_netcdf(filename,{'dt','dt2','absolut_time_T0','absolute_time_TO_2'});
1077                [Cte,var_detect,ichoice]=nc2struct(nc,{});
1078                if isfield(Cte,'dt2')
1079                    dt=Cte.dt2;
1080                elseif isfield(Cte,'dt')
1081                    dt=Cte.dt;
1082                end
1083                if isfield(Cte,'absolut_time_TO_2')
1084                    ref_time(ind_exist)=Cte.absolut_time_TO_2;%civ2 data used in priority
1085                elseif isfield(Cte,'absolut_time_TO')
1086                    ref_time(ind_exist)=Cte.absolut_time_TO;%civ2 data used in priorit
1087                elseif isfield(Cte,'Time')
1088                    ref_time(ind_exist)=Cte.Time;
1089                end
1090%                 if cte_detect(2)==1;
1091%                     dt=cte_read(2);
1092%                     ref_time(ind_exist)=cte_read(4);%civ2 data used in priority
1093%                 else
1094%                     dt=cte_read(1);
1095%                     ref_time(ind_exist)=cte_read(3);
1096%                 end
1097                displ_pair{ind_exist}=['Dj= ' num2str(-floor(index/2)) '|' num2str(ceil(index/2)) ' :dt= ' num2str(dt*1000) dtunit];
1098           end
1099       end
1100       set(handles.list_pair_civ,'String',[displ_pair';{'Dj=*|*'}]);
1101elseif isequal(mode,'bursts') %case of bursts
1102    for numod_a=1:nbfield2-1 %nbfield2 always >=2 for 'bursts' mode
1103        for numod_b=(numod_a+1):nbfield2
1104            [filename]=name_generator(filebase,ref_i,numod_a,'.nc',NomType,1,ref_i,numod_b,subdir);
1105            select=(exist(filename,'file')==2);
1106            if select==1
1107                ind_exist=ind_exist+1;
1108                numlist_a(ind_exist)=numod_a;
1109                numlist_b(ind_exist)=numod_b;
1110                Attr=nc2struct(filename,[]);
1111                isfield(Attr,'absolut_time_T0_2')
1112                if isfield(Attr,'dt2')
1113                   dt(ind_exist)=Attr.dt2;
1114                   ref_time(ind_exist)=Attr.absolut_time_T0_2;
1115                elseif isfield(Attr,'dt')& isfield(Attr,'absolut_time_T0')
1116                   dt(ind_exist)=Attr.dt;
1117                   ref_time(ind_exist)=Attr.absolut_time_T0;
1118                else
1119                   dt(ind_exist)=NaN;%no information on dt
1120                end
1121                %determine nom_type_ima for pair display (used in num2stra.m)
1122                switch NomType
1123                    case {'#ab'}
1124                        nom_type_ima='#a';
1125                    case {'#AB'}
1126                        nom_type_ima='#A';
1127                    otherwise
1128                         nom_type_ima='_i_j';
1129                end
1130               displ_pair{ind_exist}=['j= ' num2stra(numod_a,nom_type_ima,2) '-' num2stra(numod_b,nom_type_ima,2) ...
1131                        ' :dt= ' num2str(dt(ind_exist)*1000)];
1132            end
1133         end
1134         set(handles.list_pair_civ,'String',[displ_pair';{'j=*-*'}]);
1135     end
1136     if exist('dt','var') & ~isempty(dt)
1137         [dtsort,indsort]=sort(dt);
1138         displ_num(1,:)=numlist_a(indsort);
1139         displ_num(2,:)=numlist_b(indsort);
1140         displ_num(3,:)=0;
1141         displ_num(4,:)=0;
1142         displ_pair=displ_pair(indsort);
1143         ref_time=ref_time(indsort);
1144     end
1145end
1146if ind_exist==0
1147         if  isequal(mode,'series(Dj)') | isequal(mode,'st_series(Dj)')
1148            msgbox_uvmat('ERROR',['no .nc file available for the selected reference index j=' num2str(ref_j) ' and subdirectory ' subdir])
1149        else
1150            msgbox_uvmat('ERROR',['no .nc file available for the selected reference index i=' num2str(ref_i) ' and subdirectory ' subdir])
1151        end
1152        if isequal(mode,'bursts') %case of bursts
1153            set(handles.list_pair_civ,'String',{'j=*-*'});
1154        elseif isequal(mode,'series(Di)') %case of bursts
1155            set(handles.list_pair_civ,'String',{'Di=*|*'});
1156        elseif isequal(mode,'series(Dj)') %case of bursts
1157            set(handles.list_pair_civ,'String',{'Dj=*|*'});
1158        end
1159end
1160
1161val=get(handles.list_pair_civ,'Value');
1162if val > length(displ_pair)
1163    set(handles.list_pair_civ,'Value',1);% first pair proposed by default in the menu
1164    val=1;
1165end
1166iview=get(handles.NomType,'Value');
1167SeriesData.displ_num(iview,:)=(displ_num(:,val))';
1168SeriesData.ref_time=ref_time;
1169set(hseries,'UserData',SeriesData)
1170list_pair_civ_Callback(hObject, eventdata, handles)
1171
1172%-------------------------------------------------------------
1173% --- Executes on selection in list_pair_civ.
1174function list_pair_civ_Callback(hObject, eventdata, handles)
1175%------------------------------------------------------------
1176
1177%update first_i and last_i according to the chosen image pairs
1178testupdate=0;
1179Val=get(handles.RootPath,'Value');
1180IndexCell=get(handles.NomType,'String');
1181hseries=get(handles.list_pair_civ,'parent');
1182SeriesData=get(hseries,'UserData');
1183NomType=SeriesData.NomType{Val};
1184list_pair=get(handles.list_pair_civ,'String');%get the menu of image pairs
1185index_pair=get(handles.list_pair_civ,'Value');
1186str_pair=list_pair{index_pair};
1187ind_equ=strfind(str_pair,'=');%find '='
1188ind_sep=strfind(str_pair,'|');%find pair separator '|'
1189ind_com=strfind(str_pair,':');%find ':'
1190test_bursts=0;
1191if isempty(ind_sep)
1192    ind_sep=strfind(str_pair,'-');%find pair separator if it is not '|'
1193    test_bursts=1;% we are in the case of bursts
1194end
1195displ_num=[0 0 0 0]; %default
1196if ~isempty(ind_sep)&& ~strcmp(str_pair(ind_sep-1),'*')% if there is a pair separator ('|' or '-')
1197    num1_str=str_pair(ind_equ(1)+1:ind_sep-1);
1198    num2_str=str_pair(ind_sep+1:ind_com-1);
1199    num1=str2double(num1_str);
1200    num2=str2double(num2_str);
1201    if isequal(num1_str(1),' ')
1202        num1_str(1)=[];
1203    end   
1204    if isequal(num2_str(end),' ')
1205        num2_str(end)=[];
1206    end
1207    switch NomType
1208       case {'_i1-i2_j'}
1209           if isequal(num1_str(1),'0')
1210               IndexCell{Val}=['_(i-(i+' num2_str ')_j'];
1211           else
1212               IndexCell{Val}=['_(i' num1_str ')-(i+' num2_str ')_j'];
1213           end
1214           displ_num(3)=num1;
1215           displ_num(4)=num2;
1216       case {'_i1-i2'}
1217           if isequal(num1_str(1),'0')
1218               IndexCell{Val}=['_(i' num1_str ')-(i+' num2_str ')'];
1219           else
1220               IndexCell{Val}=['_(i' num1_str ')-(i+' num2_str ')'];
1221           end
1222           displ_num(3)=num1;
1223           displ_num(4)=num2;
1224       case '_i_j1-j2'
1225          if test_bursts
1226              IndexCell{Val}=['_i_' num1_str '-' num2_str ];
1227          else
1228              if isequal(num1_str(1),'0')
1229                 IndexCell{Val}=['_i_j-(j+' num2_str ')'];
1230              else
1231                 IndexCell{Val}=['_i_(j' num1_str ')-(j+' num2_str ')'];
1232              end
1233          end
1234          displ_num(1)=num1;
1235          displ_num(2)=num2;
1236       case {'#_ab'} %TO COMPLETE
1237           IndexCell{Val}=['_i_' num1_str '-' num2_str ];
1238
1239    end
1240end
1241set(handles.NomType,'String',IndexCell)
1242SeriesData.displ_num(Val,:)=displ_num;
1243set(hseries,'UserData',SeriesData)
1244% set(handles.NomType,'Value',Val)
1245
1246if ~isequal(str_pair,'Dj=*|*')&~isequal(str_pair,'Di=*|*')
1247        mode_list=get(handles.mode,'String');
1248    mode_value=get(handles.mode,'Value');
1249    mode=mode_list{mode_value};
1250        if isequal(mode,'series(Di)')
1251        first_i=str2num(get(handles.first_i,'String'));
1252        last_i=str2num(get(handles.last_i,'String'));
1253        incr_i=str2num(get(handles.incr_i,'String'));
1254        num1=first_i:incr_i:last_i;
1255        lastfieldCell=get(handles.nb_field,'String');
1256        lastfield=str2num(lastfieldCell{1});
1257        if ~isempty(lastfield)
1258            ind=find((num1-floor(index_pair/2)*ones(size(num1))>0)& (num1+ceil(index_pair/2)*ones(size(num1))<=lastfield));
1259            num1=num1(ind);       
1260        end
1261        set(handles.first_i,'String',num2str(num1(1)));
1262        set(handles.last_i,'String',num2str(num1(end)));
1263        testupdate=1;
1264        elseif isequal(mode,'series(Dj)')
1265        first_j=str2num(get(handles.first_j,'String'));
1266        last_j=str2num(get(handles.last_j,'String'));
1267        incr_j=str2num(get(handles.incr_j,'String'));
1268        num_j=first_j:incr_j:last_j;
1269        lastfieldCell=get(handles.nb_field2,'String');
1270        if ~isempty(lastfieldCell)
1271            lastfield2=lastfieldCell{1};
1272            ind=find((num_j-floor(index_pair/2)*ones(size(num_j))>0)& ...
1273                 (num_j+ceil(index_pair/2)*ones(size(num_j))<=lastfield2));
1274        end
1275        testupdate=1;
1276        end
1277       
1278        %update the first and last times of the series
1279        if testupdate & isfield(SeriesData,'Time')
1280        if ~isempty(SeriesData.Time{1})
1281            displ_time(handles,SeriesData.Time{1});
1282        end
1283        end
1284end
1285%---------------------------------------------------
1286% --- Executes on button press in RUN.
1287%------------------------------------------------------
1288function RUN_Callback(hObject, eventdata, handles)
1289
1290%read root name and field type
1291set(handles.RUN,'BusyAction','queue');
1292hseries=get(handles.RUN,'parent');
1293set(0,'CurrentFigure',hseries)
1294if isequal(get(handles.GetObject,'Value'),1)
1295    Series.GetObject=1;
1296    GetObject_Callback(hObject, eventdata, handles)
1297else
1298    Series.GetObject=0;
1299end
1300SeriesData=get(hseries,'UserData');
1301if isfield(SeriesData,'sethandles')
1302    if iscell(SeriesData.sethandles)
1303        Series.sethandles=SeriesData.sethandles{1};
1304    else
1305        Series.sethandles=SeriesData.sethandles;%retrieve the handles of the set_object interface (to define projection objects)
1306    end
1307end
1308
1309%reinitiate waitbar position
1310Series.WaitbarPos=get(handles.waitbar_frame,'Position');%TO SUPPRESS
1311waitbarpos=Series.WaitbarPos;
1312waitbarpos(4)=0.005;%reinitialize waitbar to zero height
1313waitbarpos(2)=Series.WaitbarPos(2)+Series.WaitbarPos(4)-0.005;
1314set(handles.waitbar,'Position',waitbarpos)
1315
1316% read input file parameters and set menus
1317Series.PathProject=get(handles.PathCampaign,'String');
1318RootPath=get(handles.RootPath,'String');% path of the root name of the first field series
1319RootFile=get(handles.RootFile,'String');% root name of the first field series
1320SubDir=get(handles.SubDir,'String');% subdirectory for netcdf files
1321FileExt=get(handles.FileExt,'String');%file extension
1322if isempty(SeriesData)
1323    msgbox_uvmat('ERROR','no input file series')
1324    return
1325end
1326NomType=SeriesData.NomType;
1327if length(RootPath)==1 %string character input for user fct
1328    Series.RootPath=RootPath{1};
1329    Series.RootFile=RootFile{1};
1330    Series.SubDir=SubDir{1};
1331    Series.FileExt=FileExt{1};
1332    Series.NomType=NomType{1};
1333else %cell input for user fct
1334    Series.RootPath=RootPath;
1335    Series.RootFile=RootFile;
1336    Series.SubDir=SubDir;
1337    Series.FileExt=FileExt;
1338    Series.NomType=NomType;
1339end
1340if isequal(get(handles.FieldMenu,'Visible'),'on')
1341    FieldMenu=get(handles.FieldMenu,'String');
1342    FieldValue=get(handles.FieldMenu,'Value');
1343    Series.Field=FieldMenu(FieldValue);
1344end
1345menu_coord_state=get(handles.CoordType,'Visible');
1346Series.CoordType='';%default
1347if isequal(menu_coord_state,'on')
1348    menu_coord=get(handles.CoordType,'String');
1349    menu_index=get(handles.CoordType,'Value');
1350    Series.CoordType=menu_coord{menu_index};
1351end
1352Series.hseries=get(hObject,'Parent');
1353if isequal(get(handles.ParamVal,'Visible'),'on')
1354    ParamKey=get(handles.ParamKey,'String');
1355    if ischar(ParamKey)
1356        ParamKey{1}=ParamKey;
1357    end
1358    ParamString=get(handles.ParamVal,'String');
1359    if ischar(ParamString)
1360        for ilist=1:size(ParamString,1)
1361            ParamVal{ilist}=ParamString(ilist,:);
1362        end
1363    else
1364        ParamVal=ParamString;
1365    end   
1366end
1367
1368%read the set of field numbers
1369first_i=str2num(get(handles.first_i,'String'));
1370last_i=str2num(get(handles.last_i,'String'));
1371incr_i=str2num(get(handles.incr_i,'String'));
1372first_j=str2num(get(handles.first_j,'String'));
1373last_j=str2num(get(handles.last_j,'String'));
1374incr_j=str2num(get(handles.incr_j,'String'));
1375if ~isequal(get(handles.first_i,'Visible'),'on')
1376   first_i=1;
1377   last_i=1;
1378   incr_i=1;
1379end
1380if ~isequal(get(handles.first_j,'Visible'),'on')
1381    first_j=1;
1382    last_j=1;
1383    incr_j=1;
1384end
1385Series.NbSlice=str2num(get(handles.NbSlice,'String'));
1386if isequal(first_i,[])|isequal(first_j,[]), msgbox_uvmat('ERROR','first field number not defined'),...
1387    set(handles.RUN, 'Enable','On'), set(handles.RUN,'BackgroundColor',[1 0 0]),return,end;
1388if isequal(last_i,[])| isequal(last_j,[]),msgbox_uvmat('ERROR','last field number not defined'),...
1389    set(handles.RUN, 'Enable','On'), set(handles.RUN,'BackgroundColor',[1 0 0]),return,end;
1390if isequal(incr_i,[])| isequal(incr_j,[]),msgbox_uvmat('ERROR','increment in field number not defined'),...
1391    set(handles.RUN, 'Enable','On'), set(handles.RUN,'BackgroundColor',[1 0 0]),return,end;
1392if last_i < first_i | last_j < first_j , msgbox_uvmat('ERROR','last field number must be larger than the first one'),...
1393    set(handles.RUN, 'Enable','On'), set(handles.RUN,'BackgroundColor',[1 0 0]),return,end;
1394num_i=[first_i:incr_i:last_i];
1395num_j=[first_j:incr_j:last_j];
1396nbfield_cell=get(handles.nb_field,'String');
1397nbfield=[]; %default
1398for iview=1:length(nbfield_cell)
1399    nb=str2num(nbfield_cell{iview});
1400    if ~isempty(nb)
1401        nbfield=[nbfield nb];
1402    end
1403end
1404nbfield=min(nbfield);
1405nbfield2_cell=get(handles.nb_field2,'String');
1406nbfield2=[]; %default
1407for iview=1:length(nbfield2_cell)
1408    nb=str2num(nbfield2_cell{iview});
1409    if ~isempty(nb)
1410        nbfield2=[nbfield2 nb];
1411    end
1412end
1413nbfield2=min(nbfield2);
1414
1415%get complementary information from the 'series' interface
1416list_action=get(handles.ACTION,'String');% list menu action
1417index_action=get(handles.ACTION,'Value');% selected string index
1418action= list_action{index_action}; % selected string
1419mode_list=get(handles.mode,'String');
1420index_mode=get(handles.mode,'Value');
1421mode=mode_list{index_mode};
1422ind_shift=0;%default
1423
1424%determine the list of input file names
1425nbmissing=0;
1426for iview=1:length(RootPath)
1427    %case of pairs (.nc files)
1428   
1429    if isequal(NomType{iview},'_i_j1-j2')| isequal(NomType{iview},'_i1-i2_j')| isequal(NomType{iview},'_i1-i2')| isequal(NomType{iview},'#_ab')
1430        ind_shift=SeriesData.displ_num(iview,:);
1431        if isequal(ind_shift,[0 0 0 0]) % undefined pairs
1432            if isequal(NomType{iview},'#_ab')
1433                mode='#_ab';
1434            end
1435            [num_i1,num_i2,num_j1,num_j2,nbmissing]=netseries_generator(fullfile(RootPath{iview},RootFile{iview}),SubDir{iview},mode,first_i,incr_i,last_i,first_j,incr_j,last_j);
1436        else   
1437            [num_i1,num_i2,num_j1,num_j2,num_i,num_j]=find_file_indices(num_i,num_j,ind_shift,NomType{iview},mode);
1438            if isempty(num_i)
1439                msgbox_uvmat('ERROR','ERROR: empty set of input files chosen')
1440                return
1441            end
1442            if num_i(1)>first_i
1443               set(handles.first_i,'String',num2str(num_i(1)))%update the display of first field
1444               last_i_Callback(hObject, eventdata, handles)
1445            end
1446            if num_i(end)<last_i
1447               set(handles.last_i,'String',num2str(num_i(end)))%update the display of last field
1448               last_i_Callback(hObject, eventdata, handles)
1449            end
1450            if num_j(1)>first_j
1451               set(handles.first_j,'String',num2str(num_j(1)))%update the display of first field
1452               last_j_Callback(hObject, eventdata, handles)
1453            end
1454            if num_j(end)<last_j
1455               set(handles.last_j,'String',num2str(num_j(end)))%update the display of last field
1456               last_j_Callback(hObject, eventdata, handles)
1457            end
1458        end
1459    else%case of images
1460        [num_i1,num_j1]=meshgrid(num_i,num_j);
1461        num_i2=num_i1;
1462        num_j2=num_j1;
1463    end
1464    if length(RootPath)>1
1465        num_i1_cell{iview}=num_i1;
1466        num_i2_cell{iview}=num_i2;
1467        num_j1_cell{iview}=num_j1;
1468        num_j2_cell{iview}=num_j2;
1469    end
1470end
1471
1472% RUN RUN'
1473path_series=which('series');
1474list_path=get(handles.ACTION,'UserData');
1475index=get(handles.ACTION,'Value');
1476fct_path=list_path{index}; %path stored for the function ACTION
1477if ~isequal(fct_path,path_series)
1478    eval(['spath=which(''' action ''');']) %spath = current path of the selected function ACTION
1479    if ~isequal(spath,fct_path)& exist(fct_path,'dir')
1480        addpath(fct_path)% add the prescribed path if not the current one
1481    end
1482end
1483Series.Action=action;%name of the processing programme
1484set(handles.RUN,'BackgroundColor',[0.831 0.816 0.784])
1485drawnow
1486if length(RootPath)>1
1487    feval(action,num_i1_cell,num_i2_cell,num_j1_cell,num_j2_cell,Series);
1488else
1489    feval(action,num_i1,num_i2,num_j1,num_j2,Series);
1490end
1491set(handles.RUN,'BackgroundColor',[1 0 0])
1492
1493% %save the current interface setting as figure namefig, append .0 to the name if it already exists
1494% detect=1;
1495% while detect==1
1496%     namefigfull=[namedoc '.fig'];
1497%     hh=dir(namefigfull);
1498%     if ~isempty(hh)
1499%         detect=1;
1500%         namedoc=[namedoc '.0'];
1501%     else
1502%         detect=0;
1503%     end
1504% end
1505% saveas(gcbf,namefigfull);%save the interface with name namefigfull (A CHANGER EN FICHIER  .xml)
1506
1507%----------------------------------------------------
1508function STOP_Callback(hObject, eventdata, handles)
1509set(handles.RUN, 'BusyAction','cancel')
1510set(handles.RUN,'BackgroundColor',[1 0 0])
1511
1512%----------------------------------------------
1513
1514%----------------------------------------------------
1515function first_i_Callback(hObject, eventdata, handles)
1516last_i_Callback(hObject, eventdata, handles)
1517
1518%----------------------------------------------
1519function last_i_Callback(hObject, eventdata, handles)
1520    hseries=get(handles.last_i,'parent');
1521first_i=str2num(get(handles.first_i,'String'));
1522last_i=str2num(get(handles.last_i,'String'));
1523ref_i=ceil((first_i+last_i)/2);
1524set(handles.ref_i,'String', num2str(ref_i))
1525ref_i_Callback(hObject, eventdata, handles)
1526SeriesData=get(hseries,'UserData');
1527if ~isfield(SeriesData,'Time')
1528    SeriesData.Time{1}=[];
1529end
1530displ_time(handles,SeriesData.Time{1});
1531
1532%-------------------------------------------------------
1533function first_j_Callback(hObject, eventdata, handles)
1534 last_j_Callback(hObject, eventdata, handles)
1535
1536%-------------------------------------------------------
1537function last_j_Callback(hObject, eventdata, handles)
1538    hseries=get(handles.last_i,'parent');
1539first_j=str2num(get(handles.first_j,'String'));
1540last_j=str2num(get(handles.last_j,'String'));
1541ref_j=ceil((first_j+last_j)/2);
1542set(handles.ref_j,'String', num2str(ref_j))
1543
1544ref_j_Callback(hObject, eventdata, handles)
1545SeriesData=get(hseries,'UserData');
1546if ~isfield(SeriesData,'Time')
1547    SeriesData.Time{1}=[];
1548end
1549displ_time(handles,SeriesData.Time{1});
1550
1551
1552
1553
1554%-------------------------------------------------------
1555function ref_i_Callback(hObject, eventdata, handles)
1556mode_list=get(handles.mode,'String');
1557mode_value=get(handles.mode,'Value');
1558mode=mode_list{mode_value};
1559hseries=get(handles.ref_i,'parent');
1560SeriesData=get(hseries,'UserData');
1561%NomTypeCell=get(handles.NomType,'String');
1562NomTypeCell=SeriesData.NomType;
1563if ~isempty(NomTypeCell)
1564Val=get(handles.NomType,'Value');
1565NomType=NomTypeCell{Val};
1566% for ilist=1:length(NomType)
1567    if isequal(NomType,'_i_j1-j2')|| isequal(NomType,'_i1-i2_j')|| isequal(NomType,'_i1-i2')
1568        if isequal(mode,'series(Di)')
1569            find_netcpair_civ(hObject, eventdata, handles,Val);% update the menu of pairs depending on the available netcdf files
1570%             break
1571        end
1572    end
1573end
1574
1575%----------------------------------------------------
1576function ref_j_Callback(hObject, eventdata, handles)
1577mode_list=get(handles.mode,'String');
1578mode_value=get(handles.mode,'Value');
1579mode=mode_list{mode_value};
1580hseries=get(handles.ref_i,'parent');
1581SeriesData=get(hseries,'UserData');
1582%NomTypeCell=get(handles.NomType,'String');
1583NomTypeCell=SeriesData.NomType;
1584if ~isempty(NomTypeCell)
1585Val=get(handles.NomType,'Value');
1586NomType=NomTypeCell{Val};
1587% NomType=get(handles.NomType,'String');
1588    if isequal(NomType,'_i_j1-j2')|| isequal(NomType,'_i1-i2_j')|| isequal(NomType,'_i1-i2')
1589        if isequal(mode,'series(Dj)')
1590            find_netcpair_civ(hObject, eventdata, handles,Val);% update the menu of pairs depending on the available netcdf files
1591%             break
1592        end
1593    end
1594end
1595
1596%----------------------------------------------------
1597% --- Executes on selection change in ACTION.
1598function ACTION_Callback(hObject, eventdata, handles)
1599list_ACTION=get(handles.ACTION,'String');% list menu fields
1600index_ACTION=get(handles.ACTION,'Value');% selected string index
1601ACTION= list_ACTION{index_ACTION}; % selected function name
1602path_series=which('series');%path to series.m
1603list_path=get(handles.ACTION,'UserData');%list of recorded paths to functions of the list ACTION
1604nb_builtin=0;
1605for ilist=1:length(list_path)
1606    if isequal(list_path{ilist},path_series)
1607        nb_builtin=nb_builtin+1;
1608    else
1609        break
1610    end
1611end
1612if nb_builtin==0% the path of series has been changed, reinitialize
1613    series_OpeningFcn(hObject, eventdata, handles)
1614    return
1615end
1616
1617% add a new function to the menu
1618if isequal(ACTION,'more...')
1619    pathfct=fileparts(path_series);
1620    browse_name=fullfile(path_series,'SERIES_FCT');%go to UVMAT/SERIES_FCT by default
1621    if length(list_path)>nb_builtin
1622        browse_name=list_path{end};% initialize browser with  the path of the last introduced function
1623     end
1624    [FileName, PathName, filterindex] = uigetfile( ...
1625       {'*.m', ' (*.m)';
1626        '*.m',  '.m files '; ...
1627        '*.*', 'All Files (*.*)'}, ...
1628        'Pick a file',browse_name);
1629    if length(FileName)<2
1630        return
1631    end
1632    ext_fct=FileName(end-1:end);
1633    if ~isequal(ext_fct,'.m')
1634        msgbox_uvmat('ERROR','a Matlab function .m must be introduced');
1635        return
1636    end
1637    ACTION=FileName(1:end-2);% ACTION choice updated by the selected item
1638   
1639   % insert the choice in the action menu
1640   menu_str=update_menu(handles.ACTION,ACTION);%new action menu in which the new item has been appended if needed
1641   index_ACTION=get(handles.ACTION,'Value');% currently selected index in the list
1642   list_path{index_ACTION}=PathName;
1643   if length(menu_str)>nb_builtin+5;
1644       nbremove=length(menu_str)-nb_builtin-5;
1645       menu_str(nb_builtin+1:end-5)=[];
1646       list_path(nb_builtin+1:end-4)=[];
1647       index_ACTION=index_ACTION-nbremove;
1648       set(handles.ACTION,'Value',index_ACTION)
1649       set(handles.ACTION,'String',menu_str)
1650   end
1651   list_path{index_ACTION}=PathName;
1652   set(handles.ACTION,'UserData',list_path);
1653   set(handles.path,'enable','inactive')% indicate that the current path is accessible (not 'off')
1654   
1655   %record the current menu in personal file profil_perso
1656   dir_perso=prefdir;
1657   profil_perso=fullfile(dir_perso,'uvmat_perso.mat');
1658   for ilist=nb_builtin+1:length(menu_str)-1
1659       series_fct{ilist-nb_builtin}=fullfile(list_path{ilist},[menu_str{ilist} '.m']);
1660   end
1661   if exist(profil_perso,'file')
1662        save(profil_perso,'series_fct','-append')
1663   else
1664        txt=ver;
1665        Release=txt(1).Release;
1666        relnumb=str2num(Release(3:4));
1667        if relnumb >= 14
1668            save(profil_perso,'series_fct','-V6')
1669        else
1670            save(profil_perso, 'series_fct')
1671        end
1672   end
1673end
1674
1675%check the current path to the selected function
1676PathName=list_path{index_ACTION};%current recorded path
1677if ~isequal(path_series,PathName)
1678    CurrentPath=fileparts(which(ACTION));
1679    if ~isequal(CurrentPath,PathName)&&~isequal(CurrentPath,fullfile(PathName,'private'))
1680        addpath(PathName)
1681        errormsg=check_functions;
1682        msgbox_uvmat('CONFIRMATION',[['path ' PathName ' added to the current Matlab pathes'];errormsg])
1683    end
1684end
1685set(handles.path,'String',PathName); %show the path to the senlected function
1686
1687%default setting for the visibility of the GUI elements
1688%set( handles.Field,'Visible','off')%default
1689set(handles.RootPath,'UserData','many')
1690set(handles.SubDir,'Visible','on')
1691set(handles.RootFile,'Visible','on')
1692set(handles.NomType,'Visible','on')
1693set(handles.FileExt,'Visible','on')
1694set(handles.NbSlice,'Visible','off')
1695set(handles.NbSlice_title,'Visible','off')
1696set(handles.VelTypeMenu,'Visible','off');
1697set(handles.VelType_text,'Visible','off');
1698set(handles.VelTypeMenu_1,'Visible','off');
1699set(handles.VelType_text_1,'Visible','off');
1700view_FieldMenu(handles,'off')
1701view_FieldMenu_1(handles,'off')
1702view_TRANSFORM(handles,'off')
1703set(handles.ProjObject_frame,'Visible','off');
1704set(handles.GetMask,'Visible','off')
1705set(handles.Mask,'Visible','off')
1706set(handles.GetObject,'Visible','off');
1707set(handles.ProjObject,'Visible','off');
1708set(handles.OutputDir,'Visible','off');
1709set(handles.PARAMETERS_frame,'Visible','off');
1710set(handles.PARAMETERS_title,'Visible','off');
1711set(handles.ParamKey,'Visible','off')
1712set(handles.ParamVal,'Visible','off')
1713ParamKey={};
1714set(handles.FieldMenu,'Enable','off')
1715set(handles.VelTypeMenu,'Enable','off')
1716set(handles.FieldMenu_1,'Enable','off')
1717set(handles.VelTypeMenu_1,'Enable','off')
1718set(handles.CoordType,'Enable','off')
1719%set the displayed GUI item needed for input parameters
1720%list_input=feval(ACTION);% input list asked by the selected function
1721varargout=feval(ACTION);% input list asked by the selected function
1722Param_list={};
1723% RootPath=get(handles.RootPath,'String');
1724% RootFile=get(handles.RootFile,'String');
1725
1726%nb_series=length(RootFile);
1727FileExt=get(handles.FileExt,'String');
1728nb_series=length(FileExt);
1729testima_series=1; %test for a list of images only
1730testima=1;
1731testima_1=1;
1732testciv_series=1;
1733for iview=1:nb_series
1734    ext=FileExt{iview};
1735    if length(ext)<2
1736        ext='.none';
1737    end
1738    testimaview=~isempty(imformats(ext(2:end))) || isequal(lower(ext),'.avi');
1739    if ~testimaview
1740        if iview==1
1741            testima=0;
1742        end
1743        if iview==2
1744            testima_1=0;
1745        end
1746        testima_series=0;
1747    end
1748end
1749for ilist=1:length(varargout)-1
1750    switch varargout{ilist}
1751                       %RootFile always visible
1752         case 'RootPath'   %visible by default
1753            value=lower(varargout{ilist+1});
1754            if isequal(value,'one')||isequal(value,'two')||isequal(value,'many')
1755                set(handles.RootFile,'UserData',value)% for use in menu Open_insert
1756            end
1757        case 'SubDir' %visible by default
1758            if isequal(lower(varargout{ilist+1}),'off')
1759                set(handles.SubDir,'Visible','off')
1760            end
1761        case 'RootFile'   %visible by default
1762            value=lower(varargout{ilist+1});
1763            if isequal(value,'off')
1764                set(handles.RootFile,'Visible','off')
1765            elseif isequal(value,'one')||isequal(value,'two')||isequal(value,'many')
1766                set(handles.RootFile,'Visible','on')
1767                set(handles.RootFile,'UserData',value)% for use in menu Open_insert
1768            end
1769        case 'NomType'   %visible by default
1770            if isequal(lower(varargout{ilist+1}),'off')
1771                set(handles.NomType,'Visible','off')
1772            end
1773        case 'FileExt'   %visible by default
1774            if isequal(lower(varargout{ilist+1}),'off')
1775                set(handles.FileExt,'Visible','off')
1776            end
1777        case 'NbSlice'   %hidden by default
1778            if isequal(lower(varargout{ilist+1}),'on')
1779                set(handles.NbSlice,'Visible','on')
1780                set(handles.NbSlice_title,'Visible','on')
1781            end
1782        case 'VelTypeMenu'   %hidden by default
1783            if isequal(lower(varargout{ilist+1}),'one') || isequal(lower(varargout{ilist+1}),'two')
1784                set(handles.VelTypeMenu,'Enable','on')
1785                if nb_series >=1 && ~testima_series
1786                    set(handles.VelTypeMenu,'Visible','on')
1787                    set(handles.VelType_text,'Visible','on');
1788                    set(handles.Field_frame,'Visible','on')
1789                end
1790            end
1791            if isequal(lower(varargout{ilist+1}),'two')
1792                set(handles.VelTypeMenu_1,'Enable','on')
1793                if nb_series >=2 && ~testima_series
1794                    set(handles.VelTypeMenu_1,'Visible','on')
1795                    set(handles.VelType_text_1,'Visible','on');
1796                end
1797            end
1798        case 'FieldMenu'   %hidden by default
1799            if isequal(lower(varargout{ilist+1}),'one')||isequal(lower(varargout{ilist+1}),'two')
1800                set(handles.FieldMenu,'Enable','on') % test for MenuBorser
1801                if nb_series >=1 && ~testima_series
1802                    view_FieldMenu(handles,'on')
1803                end
1804            end
1805            if isequal(lower(varargout{ilist+1}),'two')
1806                set(handles.FieldMenu_1,'Enable','on')
1807                if nb_series >=2 && ~testima_1
1808                    view_FieldMenu_1(handles,'on')
1809                end
1810            end
1811        case 'CoordType'   %hidden by default
1812            if isequal(lower(varargout{ilist+1}),'on')
1813                set(handles.CoordType,'Enable','on')
1814                view_TRANSFORM(handles,'on')
1815            end
1816        case 'GetObject'   %hidden by default
1817            if isequal(lower(varargout{ilist+1}),'on')   
1818                set(handles.ProjObject_frame,'Visible','on')
1819                set(handles.GetObject,'Visible','on');
1820            end
1821        case 'Mask'   %hidden by default
1822            if isequal(lower(varargout{ilist+1}),'on')   
1823                set(handles.ProjObject_frame,'Visible','on')
1824                set(handles.GetMask,'Visible','on');
1825            end
1826        case 'PARAMETER' 
1827            set(handles.PARAMETERS_frame,'Visible','on')
1828            set(handles.PARAMETERS_title,'Visible','on')
1829            set(handles.ParamKey,'Visible','on')
1830            %set(handles.ParamVal,'Visible','on')
1831            Param_str=varargout{ilist+1};
1832            Param_list=[Param_list; {Param_str}];         
1833    end
1834end
1835if ~isempty(Param_list)
1836    set(handles.ParamKey,'String',Param_list)
1837    set(handles.ParamVal,'Visible','on')
1838end
1839
1840%-------------------------------------------------------------------
1841% --- Executes on selection change in FieldMenu.
1842%-------------------------------------------------------------------
1843function FieldMenu_Callback(hObject, eventdata, handles)
1844
1845field_str=get(handles.FieldMenu,'String');
1846field_index=get(handles.FieldMenu,'Value');
1847field=field_str{field_index(1)};
1848if isequal(field,'get_field...')   
1849     hget_field=findobj(allchild(0),'name','get_field');
1850     if ~isempty(hget_field)
1851         delete(hget_field)%delete opened versions of get_field
1852     end
1853     hseries=get(handles.FieldMenu,'parent');
1854     SeriesData=get(hseries,'UserData');
1855     filename=SeriesData.CurrentInputFile;
1856     if exist(filename,'file')
1857        get_field(filename)
1858     end
1859elseif isequal(field,'more...')
1860    str=calc_field;
1861    [ind_answer,v] = listdlg('PromptString','Select a file:',...
1862                'SelectionMode','single',...
1863                'ListString',str);
1864       % edit the choice in the fields and action menu
1865     scalar=cell2mat(str(ind_answer));
1866     update_menu(handles.FieldMenu,scalar)
1867end
1868
1869%------------------------------------------------------
1870% --- Executes on selection change in FieldMenu_1.
1871%-----------------------------------------------------
1872function FieldMenu_1_Callback(hObject, eventdata, handles)
1873field_str=get(handles.FieldMenu_1,'String');
1874field_index=get(handles.FieldMenu_1,'Value');
1875field=field_str{field_index};
1876if isequal(field,'get_field...')   
1877     hget_field=findobj(allchild(0),'name','get_field_1');
1878     if ~isempty(hget_field)
1879         delete(hget_field)
1880     end
1881     hseries=get(handles.FieldMenu,'parent');
1882     SeriesData=get(hseries,'UserData');
1883     filename=SeriesData.CurrentInputFile_1;
1884     if exist(filename,'file')
1885        hget_field=get_field(filename);
1886        set(hget_field,'name','get_field_1')
1887     end
1888elseif isequal(field,'more...')
1889    str=calc_field;
1890    [ind_answer,v] = listdlg('PromptString','Select a file:',...
1891                'SelectionMode','single',...
1892                'ListString',str);
1893       % edit the choice in the fields and action menu
1894     scalar=cell2mat(str(ind_answer));
1895     update_menu(handles.FieldMenu_1,scalar)
1896end   
1897
1898
1899%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1900 %detect the chosen series of files and check their date of modification:
1901%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1902%INPUT:
1903%num_i1: series of first indices i (given from the series interface as first_i:incr_i:last_i, mode and list_pair_civ)
1904%num_i2: series of second indices i (given from the series interface as first_i:incr_i:last_i, mode and list_pair_civ)
1905%num_j1: series of first indices j (given from the series interface as first_j:incr_j:last_j, mode and list_pair_civ )
1906%num_j2: series of second indices j (given from the series interface as first_j:incr_j:last_j, mode and list_pair_civ)
1907%OTHER INPUTS given by the structure Series
1908function GUI_input=check_files(num_i1_cell,num_i2_cell,num_j1_cell,num_j2_cell,Series) %(filecell,filecell_1,num_i,num_j,vel_type,field,param);
1909
1910%requests for the visibility of input windows in the GUI series  (activated directly by the selection in the menu ACTION)
1911if ~exist('num_i1_cell','var')
1912    GUI_input={'RootPath';'many';...%nbre of possible input series (options 'on'/'two'/'many', default:'one')
1913        'SubDir';'on';... % subdirectory of derived files (PIV fields), ('on' by default)
1914        'RootFile';'on';... %root input file name ('on' by default)
1915        'FileExt';'on';... %input file extension ('on' by default)
1916        'NomType';'on';...%type of file indexing ('on' by default)
1917        'NbSlice';'on'; ...%nbre of slices ('off' by default)
1918        %'VelTypeMenu';'on';...% menu for selecting the velocity type (civ1,..) 'off' by default)
1919        %'FieldMenu';'on';...% menu for selecting the field (s) in the input file(options 'off'/'one'/'two', 'off' by default)
1920        %'CoordType';'on'...%can use a transform function 'off' by default
1921        %'GetObject';'on'...%can use projection object ,'off' by default
1922        %'GetMask';'on'...%can use mask option   ,'off' by default
1923        %'PARAMETER'; options: name of the user defined parameter',repeat a line for each parameter
1924               ''};
1925    return %exit the function
1926end
1927
1928%standard parameters for waitbar and STOP action (do not modify)
1929hseries=guidata(Series.hseries);%handles of the GUI series
1930WaitbarPos=get(hseries.waitbar_frame,'Position');
1931
1932%%%%%%%%%%%%%%%%%%%%%%%%
1933
1934% number of slices
1935NbSlice=str2num(get(hseries.NbSlice,'String'));
1936if isempty(NbSlice)
1937    NbSlice=1;
1938end
1939NbSlice_name=num2str(NbSlice);
1940if isequal(NbSlice,[]),NbSlice=1; end; %default
1941
1942% number of views
1943count=0;
1944testcell=iscell(Series.RootFile);
1945if ~testcell
1946    Series.RootPath={Series.RootPath};
1947    Series.RootFile={Series.RootFile};
1948    Series.SubDir={Series.SubDir};
1949    Series.FileExt={Series.FileExt};
1950    Series.NomType={Series.NomType};
1951end   
1952nbview=length(Series.RootFile);
1953for iview=1:nbview
1954    filebase=fullfile(Series.RootPath{iview},Series.RootFile{iview});%root file name
1955    if testcell
1956        num_i1=num_i1_cell{iview}; num_i2=num_i2_cell{iview}; num_j1=num_j1_cell{iview}; num_j2=num_j2_cell{iview};
1957    else
1958        num_i1=num_i1_cell; num_i2=num_i2_cell; num_j1=num_j1_cell; num_j2=num_j2_cell;
1959    end
1960    siz=size(num_i1);
1961    nbfield2=siz(1); %nb of consecutive fields at each level(burst
1962    nbfield=siz(1)*siz(2);
1963    nbfield=floor(nbfield/(nbfield2*NbSlice));%total number of i indexes (adjusted to an integer number of slices)
1964    if isequal(lower(Series.FileExt{iview}),'.avi')
1965        info=aviinfo([filebase Series.FileExt{iview}]);
1966        message{1}=info.Filename;
1967        message{2}=info.FileModDate;
1968        message{3}=[num2str(info.FramesPerSecond) ' frames/s '];
1969        message{4}=info.ImageType;
1970        message{5}=['  compression' info.VideoCompression];
1971        message{6}=[ 'quality ' num2str(info.Quality)];   
1972        Tabchar=message;
1973    else
1974        datnum=[];
1975        Tabchar={};
1976        %LOOP ON SLICES
1977        for i_slice=1:NbSlice
1978            for ifield=1:nbfield
1979                indselect(:,ifield)=((ifield-1)*NbSlice+(i_slice-1))*nbfield2+[1:nbfield2]';%selected indices on the list of files of a slice
1980            end
1981            for index=1:nbfield*nbfield2
1982                stopstate=get(hseries.RUN,'BusyAction');
1983                if isequal(stopstate,'queue')% enable STOP command
1984                    update_waitbar(hseries.waitbar,WaitbarPos,index/(nbfield*nbfield2))
1985                    ifile=indselect(index);               
1986                    file=...
1987                       name_generator(filebase,num_i1(ifile),num_j1(ifile),Series.FileExt{iview},Series.NomType{iview},1,num_i2(ifile),num_j2(ifile),Series.SubDir{iview});               
1988                    [Path,Name,ext]=fileparts(file);
1989                    detect=exist(file,'file'); % check the existence of the file
1990                    if detect==0
1991                        count=count+1;
1992                        lastfield='not found';
1993                    else
1994                        datfile=dir(file);
1995                        datnum(ifile)=datenum(datfile.date);
1996                        filefound(ifile)={datfile.name};
1997                        lastfield='';
1998                        if isequal(Series.FileExt{iview},'.nc') || isequal(Series.FileExt{iview},'.cdf')
1999                            % check the content  netcdf file
2000                            Data=nc2struct(file,'ListGlobalAttribute','patch2','fix2','civ2','patch','fix','absolut_time_T0','hart');
2001                            if ~isempty(Data.patch2) && isequal(Data.patch2,1)
2002                                lastfield='patch2';
2003                            elseif ~isempty(Data.fix2) && isequal(Data.fix2,1)
2004                                lastfield='fix2';
2005                            elseif ~isempty(Data.civ2) && isequal(Data.civ2,1);
2006                                lastfield='civ2';
2007                            elseif ~isempty(Data.patch) && isequal(Data.patch,1);
2008                                lastfield='patch1';
2009                            elseif ~isempty(Data.fix) && isequal(Data.fix,1);
2010                                lastfield='fix1';
2011                            elseif ~isempty(Data.absolut_time_T0) && ~isempty(Data.hart)
2012                                lastfield='civ1';
2013                            end                         
2014                        end
2015                    end
2016                    Tabchar(1,i_slice)={['slice #' num2str(i_slice)]};
2017                    Tabchar(index+1,i_slice)={[file '   ' lastfield]};
2018                end
2019            end
2020        end
2021        if isempty(datnum)
2022            if NbSlice>1
2023                message=['no set of ' num2str(NbSlice) ' (NbSlices) files found'];
2024            else
2025                 message='no file found';
2026            end
2027        else
2028            datnum=datnum(find(datnum));%keep the non zero values corresponding to existing files
2029            [first,ind]=min(datnum);
2030            [last,indlast]=max(datnum);
2031            message={['oldest modification:  ' cell2mat(filefound(ind)) ' : ' datestr(first)];...
2032                ['latest modification:  ' cell2mat(filefound(indlast)) ' : ' datestr(last)]};
2033        end
2034        if ~isempty(Tabchar)
2035          Tabchar=reshape(Tabchar,NbSlice*(nbfield*nbfield2+1),1);
2036        end
2037    end
2038    hfig=figure(iview);
2039    clf
2040    if iview>1
2041        pos=get(iview-1,'Position');
2042        pos(1)=pos(1)+(iview-1)*pos(1)/nbview;
2043        set(hfig,'Position',pos)
2044    end
2045    set(hfig,'name',['view= ' num2str(iview)])
2046   
2047    h=uicontrol('Style','listbox', 'Position', [20 20 500 300], 'String', Tabchar, 'Callback', @ncbrowser_uvmat);
2048    hh=uicontrol('Style','listbox', 'Position', [20 340 500 40], 'String', message);
2049end
2050%----------------------------------------------------
2051%  determine the list of index pairs of processing file
2052%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2053function [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)
2054num_i1=num_i;% set of first image numbers by default
2055num_i2=num_i;
2056num_j1=num_j;
2057num_j2=num_j;
2058num_i_out=num_i;
2059num_j_out=num_j;
2060if isequal (NomType,'_i1-i2_j') |isequal (NomType,'_i1-i2')
2061    num_i1_line=num_i+ind_shift(3);% set of first image numbers
2062    num_i2_line=num_i+ind_shift(4);
2063    % adjust the first and last field number
2064        indsel=find(num_i1_line >= 1);
2065    num_i_out=num_i(indsel);
2066    num_i1_line=num_i1_line(indsel);
2067    num_i2_line=num_i2_line(indsel);
2068    num_j1=meshgrid(num_j,ones(size(num_i1_line)));
2069    num_j2=meshgrid(num_j,ones(size(num_i1_line)));
2070    [xx,num_i1]=meshgrid(num_j,num_i1_line);
2071    [xx,num_i2]=meshgrid(num_j,num_i2_line);
2072elseif isequal (NomType,'_i_j1-j2') || isequal (NomType,'#_ab')
2073    if isequal(mode,'bursts') %case of bursts (png_old or png_2D)
2074        num_j1=ind_shift(1)*ones(size(num_i));
2075        num_j2=ind_shift(2)*ones(size(num_i));
2076    else
2077        num_j1_col=num_j+ind_shift(1);% set of first image numbers
2078        num_j2_col=num_j+ind_shift(2);
2079        % adjust the first field number
2080        indsel=find((num_j1_col >= 1));   
2081        num_j_out=num_j(indsel);
2082        num_j1_col=num_j1_col(indsel);
2083        num_j2_col=num_j2_col(indsel);
2084        [num_i1,num_j1]=meshgrid(num_i,num_j1_col);
2085        [num_i2,num_j2]=meshgrid(num_i,num_j2_col);
2086    end   
2087end
2088
2089
2090%----------------------------------------------------------------------
2091% --- make average on a series of files
2092%----------------------------------------------------------------------
2093%INPUT:
2094%num_i1: series of first indices i (given from the series interface as first_i:incr_i:last_i, mode and list_pair_civ)
2095%num_i2: series of second indices i (given from the series interface as first_i:incr_i:last_i, mode and list_pair_civ)
2096%num_j1: series of first indices j (given from the series interface as first_j:incr_j:last_j, mode and list_pair_civ )
2097%num_j2: series of second indices j (given from the series interface as first_j:incr_j:last_j, mode and list_pair_civ)
2098%OTHER INPUTS given by the structure Series
2099%  Series.Time:
2100%  Series.GeometryCalib:
2101function GUI_input=aver_stat(num_i1,num_i2,num_j1,num_j2,Series)
2102%requests for the visibility of input windows in the GUI series  (activated directly by the selection in the menu ACTION)
2103if ~exist('num_i1','var')
2104    GUI_input={'RootPath';'two';...%nbre of possible input series (options 'on'/'two'/'many', default:'one')
2105        'SubDir';'on';... % subdirectory of derived files (PIV fields), ('on' by default)
2106        'RootFile';'on';... %root input file name ('on' by default)
2107        'FileExt';'on';... %input file extension ('on' by default)
2108        'NomType';'on';...%type of file indexing ('on' by default)
2109        'NbSlice';'on'; ...%nbre of slices ('off' by default)
2110        'VelTypeMenu';'two';...% menu for selecting the velocity type (options 'off'/'one'/'two',  'off' by default)
2111        'FieldMenu';'two';...% menu for selecting the field (s) in the input file(options 'off'/'one'/'two', 'off' by default)
2112        'CoordType'; 'on';...%can use a transform function
2113        'GetObject';'on';...%can use projection object(option 'off'/'one'/'two',
2114        %'GetMask';'on'...%can use mask option   
2115        %'PARAMETER'; %options: name of the user defined parameter',repeat a line for each parameter
2116               ''};
2117        return
2118end
2119
2120%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2121hseries=guidata(Series.hseries);%handles of the GUI series
2122WaitbarPos=get(hseries.waitbar_frame,'Position');
2123%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2124
2125%root input file and type
2126if ~iscell(Series.RootPath)% case of a single input field series
2127    num_i1={num_i1};num_j1={num_j1};num_i2={num_i2};num_j2={num_j2};
2128    RootPath={Series.RootPath};
2129    RootFile={Series.RootFile};
2130    SubDir={Series.SubDir};
2131    FileExt={Series.FileExt};
2132    NomType={Series.NomType};
2133else
2134    RootPath=Series.RootPath;
2135    RootFile=Series.RootFile;
2136    SubDir=Series.SubDir;
2137    NomType=Series.NomType;
2138    FileExt=Series.FileExt;
2139end   
2140ext=FileExt{1};
2141form=imformats(ext([2:end]));%test valid Matlab image formats
2142testima=0;
2143if ~isempty(form)||isequal(lower(ext),'.avi')||isequal(lower(ext),'.vol')
2144    testima(1)=1;
2145end
2146if length(FileExt)>=2
2147    ext_1=FileExt{2};
2148    form=imformats(ext_1([2:end]));%test valid Matlab image formats
2149    if ~isempty(form)||isequal(lower(ext_1),'.avi')||isequal(lower(ext_1),'.vol')
2150        testima(2)=1;
2151    end
2152    if testima(2)~=testima(1)
2153        msgbox_uvmat('ERROR','images and netcdf files cannot be compared')
2154        return
2155    end
2156end
2157
2158%Number of input series: this function  accepts two input file series at most (then it operates on the difference of fields)
2159nbview=length(RootPath);
2160if nbview>2 
2161    RootPath=RootPath(1:2);
2162    set(hseries.RootPath,'String',RootPath)
2163    SubDir=SubDir(1:2);
2164    set(hseries.SubDir,'String',SubDir)
2165    RootFile=RootFile(1:2);
2166    set(hseries.RootFile,'String',RootFile)
2167    NomType=NomType(1:2);
2168    FileExt=FileExt(1:2);
2169    set(hseries.FileExt,'String',FileExt)
2170    nbview=2;
2171end
2172hhh=which('mmreader');
2173for iview=1:nbview
2174    test_movie(iview)=0;
2175    if ~isequal(hhh,'')&& mmreader.isPlatformSupported()
2176        if isequal(lower(FileExt{iview}),'.avi')
2177            MovieObject{iview}=mmreader(fullfile(RootPath{iview},[RootFile{iview} FileExt{iview}]));
2178            test_movie(iview)=1;
2179        end
2180    end
2181end
2182
2183% number of slices
2184NbSlice=str2num(get(hseries.NbSlice,'String'));
2185if isempty(NbSlice)
2186    NbSlice=1;
2187end
2188NbSlice_name=num2str(NbSlice);
2189
2190% Field and velocity type (the same for the two views)
2191Field_str=get(hseries.FieldMenu,'String');
2192FieldName=[]; %default
2193testfield=get(hseries.FieldMenu,'Visible');
2194if isequal(testfield,'on')
2195    val=get(hseries.FieldMenu,'Value');
2196    FieldName=Field_str(val);%the same set of fields for all views
2197    if isequal(FieldName,{'get_field...'})
2198        hget_field=findobj(allchild(0),'name','get_field');%find the get_field... GUI
2199        if length(hget_field)>1
2200            delete(hget_field(2:end))
2201        elseif isempty(hget_field)
2202           filename=...
2203                 name_generator(fullfile(RootPath{1},RootFile{1}),num_i1{1}(1),num_j1{1}(1),FileExt{1},NomType{1},1,num_i2{1}(1),num_j2{1}(1),SubDir{1});
2204           get_field(filename);
2205           return
2206        end
2207        %hhget_field=guidata(hget_field);%handles of GUI elements in get_field
2208        SubField=read_get_field(hget_field); %read the names of the variables to plot in the get_field GUI
2209    end
2210end
2211%detect whether the two files are 'images' or 'netcdf'
2212testima=0;
2213testvol=0;
2214testcivx=0;
2215testnc=0;
2216FileExt=get(hseries.FileExt,'String');
2217% test_movie=0;
2218for iview=1:nbview
2219     ext=FileExt{iview};
2220     form=imformats(ext([2:end]));
2221     if isequal(lower(ext),'.vol')
2222         testvol=testvol+1;
2223     elseif ~isempty(form)||isequal(lower(ext),'.avi')% if the extension corresponds to an image format recognized by Matlab
2224         testima=testima+1;
2225     elseif isequal(ext,'.nc')
2226         testnc=testnc+1;
2227     end
2228end
2229if testvol
2230    msgbox_uvmat('ERROR','volume images not implemented yet')
2231    return
2232end
2233if testnc~=nbview && testima~=nbview && testvol~=nbview
2234    msgbox_uvmat('ERROR','compare two image series or two netcdf files with the same fields as input')
2235    return
2236end
2237if ~isequal(FieldName,{'get_field...'})
2238    testcivx=testnc;
2239end
2240
2241if testcivx
2242    VelType_str=get(hseries.VelTypeMenu,'String');
2243    VelType_val=get(hseries.VelTypeMenu,'Value');
2244    VelType{1}=VelType_str{VelType_val};
2245    if nbview==2
2246        VelType_str=get(hseries.VelTypeMenu_1,'String');
2247        VelType_val=get(hseries.VelTypeMenu_1,'Value');
2248        VelType{2}=VelType_str{VelType_val};
2249    end
2250end
2251
2252%Calibration data and timing: read the ImaDoc files
2253mode=''; %default
2254timecell={};
2255itime=0;
2256NbSlice_calib={};
2257for iview=1:nbview%Loop on views
2258    XmlData{iview}=[];%default
2259    filebase{iview}=fullfile(RootPath{iview},RootFile{iview});
2260    if exist([filebase{iview} '.xml'],'file')
2261        [XmlData{iview},error]=imadoc2struct([filebase{iview} '.xml']);
2262        if isfield(XmlData{iview},'Time')
2263            itime=itime+1;
2264            timecell{itime}=XmlData{iview}.Time;
2265        end
2266        if isfield(XmlData{iview},'GeometryCalib') && isfield(XmlData{iview}.GeometryCalib,'SliceCoord')
2267            NbSlice_calib{iview}=size(XmlData{iview}.GeometryCalib.SliceCoord,1);%nbre of slices for Zindex in phys transform
2268            if ~isequal(NbSlice_calib{iview},NbSlice_calib{1})
2269                msgbox_uvmat('WARNING','inconsistent number of Z indices for the two field series');
2270            end
2271        end
2272    elseif exist([filebase{iview} '.civ'],'file')
2273        [error,time,TimeUnit,mode,npx,npy,pxcmx,pxcmy]=read_imatext([filebase{iview} '.civ']);
2274        itime=itime+1;
2275        timecell{itime}=time;
2276        XmlData{iview}.Time=time;
2277        GeometryCalib.R=[pxcmx 0 0; 0 pxcmy 0;0 0 0];
2278        GeometryCalib.Tx=0;
2279        GeometryCalib.Ty=0;
2280        GeometryCalib.Tz=1;
2281        GeometryCalib.dpx=1;
2282        GeometryCalib.dpy=1;
2283        GeometryCalib.sx=1;
2284        GeometryCalib.Cx=0;
2285        GeometryCalib.Cy=0;
2286        GeometryCalib.f=1;
2287        GeometryCalib.kappa1=0;
2288        GeometryCalib.CoordUnit='cm';
2289        XmlData{iview}.GeometryCalib=GeometryCalib;
2290        if error==1
2291            msgbox_uvmat('WARNING','inconsistent number of fields in the .civ file');
2292        end
2293    end
2294end
2295
2296%check coincidence in time
2297multitime=0;
2298if length(timecell)==0
2299    time=[];
2300elseif length(timecell)==1
2301    time=timecell{1};
2302elseif length(timecell)>1
2303    multitime=1;
2304    for icell=1:length(timecell)
2305        if ~isequal(size(timecell{icell}),size(timecell{1}))
2306            msgbox_uvmat('WARNING','inconsistent time array dimensions in ImaDoc fields, the time for the first series is used')
2307            time=timecell{1};
2308            multitime=0;
2309            break
2310        end
2311    end
2312end
2313if multitime
2314    for icell=1:length(timecell)
2315        time(icell,:,:)=timecell{icell};
2316    end
2317    diff_time=max(max(diff(time)));
2318    if diff_time>0
2319        msgbox_uvmat('WARNING',['times of series differ by more than ' num2str(diff_time)])
2320    end   
2321end
2322if size(time,2) < num_i2{1}(end) || size(time,3) < num_j2{1}(end)% ime array absent or too short in ImaDoc xml file'
2323    time=[];
2324end
2325
2326% Root name of output files (TO GENERALISE FOR TWO INPUT SERIES)
2327filebasesub=fullfile(RootPath{1},SubDir{1},RootFile{1});
2328if isempty(SubDir{1}) % create a subdirectory '/mean'
2329    subdir_result='mean';
2330%     filebasemean=fullfile(RootPath{1},subdir_result);
2331    if ~exist(fullfile(RootPath{1},subdir_result),'dir')
2332        dircur=pwd; %record current working directory
2333        cd(RootPath{1})% goes to the iamge directory
2334        [m1,m2,m3]=mkdir(subdir_result);
2335        if ~isequal(m2,'')
2336             msgbox_uvmat('CONFIRMATION',m2);%error message for directory creation
2337        end
2338        cd(dircur) %back to the initial working directory
2339    end
2340    filebase_out=filebase{1};
2341else
2342   subdir_result=SubDir{1};
2343   filebase_out=[filebase{1} '_mean'];% output root name obtained by adding the suffix _mean to the input
2344end
2345%output nomtype (to generalise)
2346NomTypeOut=nomtype2pair(NomType{1},num_i2{end}(end)-num_i1{1}(1),num_j2{end}(end)-num_j1{1}(1));
2347   
2348if NbSlice==1 
2349    filebase_out=[filebasesub '_mean'];
2350else
2351    filebase_out=[filebasesub '_' NbSlice_name 'mean'];
2352    answeryes=questdlg({['will make average in ' num2str(NbSlice) ' slices'];['results stored as files ' filebase_out ' ...']});
2353    if ~isequal(answeryes,'Yes')
2354        return
2355    end
2356end
2357
2358% coordinate transform or other user defined transform
2359Coord_menu=get(hseries.CoordType,'String');
2360menu_val=get(hseries.CoordType,'Value');
2361usrfct=Coord_menu{menu_val};
2362testfct=~isequal(usrfct,'');
2363
2364%slice loop
2365siz=size(num_i1{1});
2366lengthtot=siz(1)*siz(2);
2367nbfield=floor(lengthtot/(siz(1)*NbSlice));%total number of i indexes (adjusted to an integer number of slices)
2368nbfield_slice=nbfield*siz(1);% number of fields per slice
2369
2370for i_slice=1:NbSlice
2371   S=0; %initiate the image sum S
2372   nbfiles=0;
2373   nbmissing=0;
2374    %averaging loop
2375   for ifile=i_slice:NbSlice:lengthtot
2376        stopstate=get(hseries.RUN,'BusyAction');
2377        if isequal(stopstate,'queue') % enable STOP command
2378             update_waitbar(hseries.waitbar,WaitbarPos,ifile/lengthtot)
2379             for iview=1:nbview
2380                [filename]=...
2381                           name_generator(filebase{iview},num_i1{iview}(ifile),num_j1{iview}(ifile),FileExt{iview},NomType{iview},1,num_i2{iview}(ifile),num_j2{iview}(ifile),SubDir{iview});
2382                if testima
2383                    Data{iview}.ListVarName={'A'};
2384                    Data{iview}.AName='image';
2385                    if test_movie(iview)
2386                        Data{iview}.A=read(MovieObject{iview},num_i1{iview}(ifile));
2387                    else
2388                        Data{iview}.A=read_image(filename,NomType{iview},num_i1{iview}(ifile));% read the image, num2 is the counter for avi files
2389                    end
2390                    Atype{iview}=class(Data{iview}.A);
2391                    Data{iview}.A=double(Data{iview}.A);
2392                elseif testcivx
2393                    [Data{iview},VelTypeOut]=read_civxdata(filename,FieldName,VelType);
2394                else
2395                    [Data{iview},var_detect]=nc2struct(filename,SubField.ListVarName); %read the corresponding input data               
2396                    Data{iview}.VarAttribute=SubField.VarAttribute;
2397                end
2398                if isfield(Data{iview},'Txt')
2399                    msgbox_uvmat('ERROR',['error of input reading: ' Data{iview}.Txt])
2400                    return
2401                end
2402             end   
2403             % coordinate transform (or other user defined transform)
2404             if ~isequal(Series.CoordType,'')
2405                 % z index
2406                if ~isempty(NbSlice_calib)
2407                    Data{iview}.ZIndex=mod(num_i1{iview}(ifile)-1,NbSlice_calib{1})+1;%Zindex for phys transform
2408                end
2409                if nbview==2
2410                    [Data{1},Data{2}]=feval(Series.CoordType,Data{1},XmlData{1},Data{2},XmlData{2});
2411                    if isempty(Data{2})
2412                        Data(2)=[];
2413                    end
2414                else
2415                    Data{1}=feval(Series.CoordType,Data{1},XmlData);
2416                end
2417             end     
2418            if testcivx
2419                    Data{iview}=calc_field(FieldName,Data{iview});%calculate field (vort..)
2420            end
2421            if length(Data)==2
2422                [Field,errormsg]=sub_field(Data{1},Data{2}); %substract the two fields
2423                if ~isempty(errormsg)
2424                    msgbox_uvmat('ERROR',['error in aver_stat/sub_field:' errormsg])
2425                    return
2426                end
2427            else
2428                Field=Data{1};
2429            end
2430            if isfield(Series,'ProjObject')
2431                [Field,errormsg]=proj_field(Field,Series.ProjObject);
2432                 if ~isempty(errormsg)
2433                    msgbox_uvmat('ERROR',['error in aver_stat/proj_field:' errormsg])
2434                    return
2435                end
2436             end                                                       
2437                nbfiles=nbfiles+1;
2438                if nbfiles==1 %first field
2439                    time_1=[];
2440                    if isfield(Field,'Time')
2441                        time_1=Field.Time(1);
2442                    end
2443                    DataMean=Field;%default
2444                else
2445                    for ivar=1:length(Field.ListVarName)
2446                        VarName=Field.ListVarName{ivar};
2447                        eval(['sizmean=size(DataMean.' VarName ');']);
2448                        eval(['siz=size(Field.' VarName ');']);
2449                        if ~isequal(siz,sizmean)
2450                            warndlg_uvmat(['unequal size of input field ' VarName ', need to interpolate on a grid'],'WARNING')
2451                            nbmissing=nbmissing+1;
2452                            break
2453                        else
2454                            eval(['DataMean.' VarName '=DataMean.' VarName '+ Field.' VarName ';']); % update the sum
2455                        end
2456                    end
2457                end
2458%             else
2459%                 nbmissing=nbmissing+1;
2460%             end
2461        end
2462    end %end averaging loop
2463    for ivar=1:length(Field.ListVarName)
2464        VarName=Field.ListVarName{ivar};
2465        eval(['DataMean.' VarName '=DataMean.' VarName '/nbfiles;']); % normalize the mean
2466    end
2467    if nbmissing~=0
2468        msgbox_uvmat('WARNING',[num2str(nbmissing) ' input files are missing or skipted'])
2469    end
2470    if isempty(time) % time read from files  prevails
2471        time_end=[];
2472        if isfield(Field,'Time')
2473            time_end=Field.Time(1);%last time read
2474            if ~isempty(time_1)
2475                DataMean.Time=time_1;
2476                DataMean.Time_end=time_end;
2477            end
2478        end
2479    else  % time from ImaDoc prevails
2480        DataMean.Time=time(1,num_i1{1}(1),num_j1{1}(1));
2481        DataMean.Time_end=time(end,num_i1{end}(end),num_j1{end}(end));
2482    end
2483   
2484    %writing the result file
2485   if testima   
2486       if NbSlice==1
2487        [filemean]=name_generator(filebase_out,num_i1{1}(1),num_j1{1}(1),'.png',NomTypeOut,1,num_i2{end}(end),num_j2{end}(end));
2488       else % label the file number by the slice # for simplicity
2489          [filemean]=name_generator(filebase_out,i_slice,1,'.png','_i');
2490       end
2491        if exist(filemean,'file')
2492            backupfile=filemean;
2493            testexist=2;
2494            while testexist==2
2495                backupfile=[backupfile(1:end-4) '~.png'];
2496                testexist=exist(backupfile,'file');
2497            end
2498            [success,message]=copyfile(filemean,backupfile);%make backup
2499            if ~isequal(success,1)
2500                msgbox_uvmat('ERROR',['previous file result ' filemean ' already exists, problem in backup'])
2501                return
2502            end
2503        end
2504        if isequal(Atype{1},'uint16')
2505            imwrite(uint16(DataMean.A),filemean,'BitDepth',16);
2506        else
2507            imwrite(uint8(DataMean.A),filemean,'BitDepth',8);
2508        end
2509        display([filemean ' written']);
2510    else %determine global attributes
2511        DataMean.ListGlobalAttribute=[DataMean.ListGlobalAttribute {Series.Action}];
2512        ActionKey='Action';
2513        while isfield(DataMean,ActionKey)
2514            ActionKey=[ActionKey '_1'];
2515        end
2516        eval(['DataMean.' ActionKey '=Series.Action;'])
2517        DataMean.ListGlobalAttribute=[DataMean.ListGlobalAttribute {ActionKey}];
2518        if isfield(DataMean,'Time')
2519            DataMean.ListGlobalAttribute=[DataMean.ListGlobalAttribute {'Time','Time_end'}];
2520        end 
2521        if NbSlice==1
2522          filemean=name_generator(filebase_out,num_i1{1}(1),num_j1{1}(1),'.nc',NomTypeOut,1,num_i2{end}(end),num_j2{end}(end));
2523        else % label the file number by the slice # for simplicity
2524          [filemean]=name_generator(filebase_out,i_slice,1,'.nc','_i');
2525        end
2526        if exist(filemean,'file')
2527            backupfile=filemean;
2528            testexist=2;
2529            while testexist==2
2530                backupfile=[backupfile(1:end-3) '~.nc'];
2531                testexist=exist(backupfile,'file');
2532            end
2533            [success,message]=copyfile(filemean,backupfile);%make backup
2534            if ~isequal(success,1)
2535                msgbox_uvmat('ERROR',['previous file result ' filemean ' already exists, problem in backup'])
2536                display(['previous file result ' filemean ' already exists, problem in backup'])
2537                return
2538            end
2539        end
2540        errormsg=struct2nc(filemean,DataMean); %save result file
2541        if isempty(errormsg)
2542            display([filemean ' written']);
2543        else
2544            msgbox_uvmat('ERROR',['error in writting result file: ' errormsg])
2545            display(errormsg)
2546        end
2547   end
2548end
2549hget_field=findobj(allchild(0),'name','get_field');%find the get_field... GUI
2550delete(hget_field)
2551'TEST'
2552uvmat(filemean)
2553
2554
2555% %----------------------------------------------------------------------
2556% % --makes a time averaged velocity field
2557% %----------------------------------------------------------------------
2558% function aver_vel(num_i1,num_i2,num_j1,num_j2,Series)
2559%                           %handles of the GUI series
2560%   
2561% hseries=guidata(Series.hseries);%handles of the GUI series
2562% WaitbarPos=get(hseries.waitbar_frame,'Position');
2563% Field_list=get(hseries.FieldMenu,'String');
2564% val=get(hseries.FieldMenu,'Value');
2565% FieldName=Field_list{val(1)};
2566% set(hseries.FieldMenu,'Value',val(1))% select only one input field
2567% if isequal(FieldName,'get_field...')
2568%     hget_field=findobj(allchild(0),'Name','get_field');%find the get_field... GUI
2569% end
2570% %root input file and type
2571% RootPath=get(hseries.RootPath,'String');
2572% SubDir=get(hseries.SubDir,'String');
2573% RootFile=get(hseries.RootFile,'String');
2574% %NomType=get(hseries.NomType,'String');
2575% NomType=Series.NomType;
2576% FileExt=get(hseries.FileExt,'String');
2577% ext=FileExt{1};     
2578% VelType_str=get(hseries.VelTypeMenu,'String');
2579% VelType_val=get(hseries.VelTypeMenu,'Value');
2580% VelType{1}=VelType_str{VelType_val};
2581%
2582% time=0; %default
2583% % number of slices
2584% NbSlice=str2num(get(hseries.NbSlice,'String'));
2585% if isempty(NbSlice)
2586%     NbSlice=1;
2587% end
2588% NbSlice_name=num2str(NbSlice);
2589% filebase=fullfile(RootPath{1},RootFile{1});
2590% Calib=[];
2591% if exist([filebase '.xml'],'file')
2592%     %[error,Heading,nom_type_read,ext_ima_read,time_imadoc,TimeUnit,mode,NbSlice,npx,npy,Calib]=read_imadoc([filebase '.xml']);
2593%     [XmlData,warntext]=imadoc2struct([filebase '.xml']);
2594% end
2595% if NbSlice==1
2596%    filebase_mean=[filebase '_mean']; %root name for the result
2597% else
2598%    filebase_mean=[filebase '_' NbSlice_name 'mean']; %root name for the results
2599%    answeryes=questdlg({['will make average in ' num2str(NbSlice) ' slices'];['results stored as files ' filebase_mean ' ...']});
2600%     if ~isequal(answeryes,'Yes')
2601%     return
2602%     end
2603% end
2604% siz=size(num_i1);
2605% nbfield2=siz(1); %nb of consecutive fields at each level(burst)
2606% lengthtot=siz(1)*siz(2);
2607% nbfield=floor(lengthtot/(nbfield2*NbSlice));%total number of i indexes (adjusted to an integer number of slices)
2608% nbfield_slice=nbfield*nbfield2;% number of fields per slice
2609% %projection object
2610% GridX=[];
2611% GridY=[];
2612% if isfield(Series,'sethandles')
2613%         Series.ProjObject=read_set_object(Series.sethandles);
2614%         if isfield(Series.ProjObject,'Style')
2615%             answeryes=questdlg({['statistics on field series projected on ' Series.ProjObject.Style]});
2616%             if ~isequal(answeryes,'Yes')
2617%                 return
2618%             end
2619%         end
2620% end
2621%
2622% %LOOP ON SLICES
2623% for i_slice=1:NbSlice
2624%     %select the series of image indices at the level islice
2625%     for ifield=1:nbfield
2626%         indselect(:,ifield)=((ifield-1)*NbSlice+(i_slice-1))*nbfield2+[1:nbfield2]';%selected indices on the list of files of a slice
2627%     end 
2628%     %name of result file
2629%     [filemean,idetect]=...
2630%                name_generator(filebase_mean,num_i1(i_slice),num_j1(1),Series.FileExt{1},'_i1-i2_j1-j2',1,num_i2(i_slice+nbfield_slice*NbSlice-1),num_j2(end),Series.SubDir{1});
2631%
2632%     % field=get(handles.civ1,'UserData');%read current selected field type (civ1,civ2...)
2633%     itime=0;
2634%      dt=[];
2635%      %LOOP ON FIELDS IN  A SLICE
2636%      test_interpolate=0;%default
2637%     for index=1:nbfield*nbfield2
2638%             ifile=indselect(index);
2639%         stopstate=get(hseries.RUN,'BusyAction');
2640%         if isequal(stopstate,'queue')% enable STOP command
2641%             update_waitbar(hseries.waitbar,WaitbarPos,ifile/(nbfield*nbfield2))
2642%             %name of the current file
2643%             [filename,idetect]=name_generator(filebase,num_i1(ifile),num_j1(ifile),Series.FileExt{1},Series.NomType{1},1,num_i2(ifile),num_j2(ifile),Series.SubDir{1});
2644%             %read input file
2645%             itime=itime+1;
2646%             if isequal(FieldName,'get_field...')
2647%                 hhget_field=guidata(hget_field);%handles of GUI elements in get_field
2648%                 hObject=0;
2649%                 eventdata=0;
2650%                 SubField=get_field('read_var_names',hObject,eventdata,hhget_field); %read the names of the variables to plot in the get_field GUI
2651%                 [Data,var_detect]=nc2struct(filename,SubField.ListVarName); %read input data   
2652%                 time(itime)=itime;
2653%                 dt=1;
2654%                 Calib_read=[];
2655%             else
2656%                 [nb_coord,nb_dim,Civ,CivStage,timeread,Data,VelTypeOut,Calib_read]=read_ncfield(filename,VelType{1});%reading the first file
2657%                  time(itime)=timeread;
2658%                 if isequal(Civ,1)
2659%                     Data.CoordType='px';%test for pixel coordinates
2660%                     if isequal(itime,1)
2661%                         dt=Data.dt;
2662%                     elseif ~isequal(Data.dt,dt)
2663%                         warndlg_uvmat('series with non constant dt, need phys coordinates','ERROR')
2664%                         return
2665%                     end
2666%                 end
2667%             end
2668%             %increment the detected fields, skip the others
2669%             if idetect==0
2670%                 warndlg_uvmat(['input file ' filename ' not found'],'ERROR')
2671%                 %A FAIRE STOCKER LE RESULT ACTUEL S'IL EXISTE
2672%             end
2673% %             itime=itime+1;
2674% %             time(itime)=timeread;
2675%       
2676%             %coordinate transform
2677%             if isempty(Calib)
2678%                 Calib=Calib_read;%use Calib from xml file in priority, then Calib from the current file
2679%             end
2680%             if ~isequal(Series.CoordType,'')
2681%                 Data=feval(Series.CoordType,Data,Calib);
2682%             end
2683%             %projection on object if defined
2684%             if isfield(Series,'ProjObject');
2685%                 Data=proj_field(Data,Series.ProjObject);
2686%                 if isequal(itime,1)%use the positions on the first field for the whole series, ou utiliser grille
2687%                     if isfield(Data,'Txt')%display error message
2688%                         warndlg(Data.Txt,'ERROR')
2689%                         return
2690%                     end
2691%                 end
2692%             else%remove false vectors and interpolate on the positions of the first field
2693%                 Data=document_field(Data);
2694%                 Data.Style='plane';
2695%             end
2696%     %%%%%%%%% initiate the average at the first iteration: check list and structure of variables
2697%             if ifile==i_slice%first field in the slice
2698%                 testfalse=0;
2699%                 ListIndex={};
2700%                 testnewcell=1;
2701%                 %group the variables (fields of 'Data') in cells of variables with the same dimensions
2702%                 [DimVarIndex,CellVarIndex]=find_field_indices(Data);
2703%                 VarIndex=CellVarIndex{1}; % ONLY THE FIRST VAR GROUP IS AVERAGED
2704%                 DimIndex=Data.VarDimIndex{VarIndex(1)};%indices of the dimensions of the first variable (common to all variables in the cell)         
2705%                 MeanData=Data;%transfer heading
2706%                 MeanData.Time=[time(1) time(end)];
2707%                 MeanData.Action=Series.Action;%name of the processing programme
2708%                 MeanData.ListDimName=Data.ListDimName(DimIndex);%name of dimension
2709%                 MeanData.DimValue=Data.DimValue(DimIndex);%values of dimension (nbre of vectors)
2710%                 MeanData.ListVarName=Data.ListVarName;
2711%                 MeanData.VarDimIndex=Data.VarDimIndex;
2712%                 MeanData.ListVarAttribute={'Role'};%list of variable attribute names A FAIRE: transferer les autres attributs
2713%                 testsum=ones(size(VarIndex));
2714%                 indexfalse=0;
2715%                 CoordName={};
2716%                 indexremove=[];
2717%                 if isfield(Data,'Role') % look for coordinate and flag variables   
2718%                     for ivar=1:length(VarIndex)
2719%                         VarName=Data.ListVarName{VarIndex(ivar)};
2720%                         var_role=Data.Role{VarIndex(ivar)};%'role' of the variable
2721%                         MeanData.Role{ivar}=var_role;
2722%                         if isequal(var_role,'falseflag')
2723%                             indexfalse=ivar; %test for false flag
2724%                             indexremove=ivar;
2725%                             FFName=VarName;
2726%                             testsum(ivar)=0;
2727%                             eval(['MeanData=rmfield(MeanData,''' VarName ''');']);%remove variable                     
2728%                         end
2729%                         if isequal(var_role,'warnflag')                       
2730%                             testsum(ivar)=0; %do not sum warn flag
2731%                             eval(['MeanData=rmfield(MeanData,''' VarName ''');']);%remove variable
2732%                             indexremove=[indexremove ivar];
2733%                         end                 
2734%                         if isequal(var_role,'coord_x')| isequal(var_role,'coord_y')|isequal(var_role,'coord_z')
2735%                             eval(['MeanData.' VarName '=Data.' VarName ';']);
2736%                             testsum(ivar)=0;
2737%                             eval(['CoordName=[CoordName ''' VarName '''];']);
2738%                         end
2739%                         if testsum(ivar)~=0
2740%                            eval(['MeanData.' VarName '=zeros(size(Data.' VarName '));']);%initialise sum
2741%                         end
2742%                     end
2743%                 end
2744%                 findsum=find(testsum);
2745%                 VarIndexSum=VarIndex(findsum);%indices of variables to sum (not coordinates nor flags)
2746%                 if length(CoordName)==0
2747%                     if isempty(DimVarIndex)|isequal(DimVarIndex,0)% no coordinate variable for structured coordinates, prepare histograms
2748%                          for ilist=1:length(VarIndexSum)
2749%                             VarName=Data.ListVarName{VarIndexSum(ilist)};
2750%                             eval(['MeanData=rmfield(MeanData,''' VarName ''');']);%remove variable
2751%                             indexremove=[indexremove ilist];
2752%                             eval(['[MeanData.' VarName 'hist,MeanData.' VarName 'val]=hist(Data.' VarName ',100);']);%make histo
2753%                             eval(['sizhist=size(MeanData.' VarName 'hist);'])
2754%                             if sizhist(1)==1
2755%                                 eval(['MeanData.' VarName 'hist=MeanData.' VarName 'hist'';'])
2756%                             end
2757%                             eval(['maxval=max(MeanData.' VarName 'val);']);
2758%                             eval(['minval=min(MeanData.' VarName 'val);']);
2759%                             dC(ilist)=(maxval-minval)/100;%size of the histogram bin   
2760%                          end
2761%                     else
2762% %                         icoord=0;
2763% %                         for ilist=1:length(DimVarIndex) 
2764% %                             VarDim=Data.ListVarName{DimVarIndex(ilist)};
2765% %                             icoord=icoord+1;
2766% %                             % eval(['Coord{' num2str(icord) '}=[' CoordName ''' VarName ''']']);
2767% %                              %eval(['Data.' CoordName{icoord} '=Data.' CoordName{icoord} '(indsel);']);
2768% %                         end
2769%                     end
2770%                 end
2771%                 if ~isempty(indexremove)
2772%                     MeanData.ListVarName(VarIndex(indexremove))=[];
2773%                     MeanData.VarDimIndex(VarIndex(indexremove))=[];
2774%                     if isfield(MeanData,'Role')%generaliser aus autres attributs
2775%                         MeanData.Role(VarIndex(indexremove))=[];
2776%                     end
2777%                 end
2778%                % END OF INITIALISATION
2779%
2780%             end
2781%       
2782%          % A FAIRE: regular grid if coord_x undefined
2783%             if indexfalse~=0 %suppress false data
2784%                  eval(['testexist=isfield(Data,''' FFName ''');'])
2785%                 if testexist
2786%                     eval(['indsel=find(Data.' FFName '==0);']);
2787%                     for icoord=1:length(CoordName)
2788%                         eval(['Data.' CoordName{icoord} '=Data.' CoordName{icoord} '(indsel);']);
2789%                     end
2790%                 end
2791%             end
2792%             for ilist=1:length(VarIndexSum)
2793%                 VarName=Data.ListVarName{VarIndexSum(ilist)};
2794%                 if indexfalse~=0 & testexist
2795%                     eval(['Data.' VarName '=Data.' VarName '(indsel);']);
2796%                 end
2797%                 if length(CoordName)==0%no variable use dfor unstructured coordinates
2798%                     if isempty(DimVarIndex)|isequal(DimVarIndex,0)% no coordinate variable for structured coordinates
2799% %                         %update histogram with the current field #ifile
2800%                         str_left=['[MeanData.' VarName 'val,MeanData.' VarName 'hist]='];
2801%                         str_right=['hist_update(MeanData.' VarName 'val,MeanData.' VarName 'hist,Data.' VarName ',dC(ilist));'];
2802%                         eval([str_left str_right]);%update global histo
2803%                     else
2804%                        %INTERPOLER
2805%                             
2806%                         eval(['MeanData.' VarName '=MeanData.' VarName '+Data.' VarName ';']);%increment sum%CAS x,y change
2807%                     end
2808%                 else   
2809%                     if length(CoordName)==2
2810%                         eval(['test_interp= ~isequal(Data.' CoordName{1} ',MeanData.' CoordName{1} ...
2811%                             ')|~isequal(Data.' CoordName{2} ',MeanData.' CoordName{2} ');'])
2812%                         if test_interp
2813%                             eval(['Data.' VarName '=griddata_uvmat(Data.' CoordName{1} ',Data.' CoordName{2}...
2814%                                 ',Data.' VarName ',MeanData.' CoordName{1} ',MeanData.' CoordName{2} ');']);
2815%                             test_interpolate=1;
2816%                         end
2817%                     end
2818%                     eval(['MeanData.' VarName '=MeanData.' VarName '+Data.' VarName ';']);%increment sum
2819%                 end
2820%             end
2821%         end
2822%     end
2823%     if length(CoordName)~=0 | ~isequal(DimVarIndex,0)% no coordinate variable for structured coordinates
2824%         for ilist=1:length(VarIndexSum) 
2825%             VarName=Data.ListVarName{VarIndexSum(ilist)};
2826%             eval(['MeanData.' VarName '=MeanData.' VarName '/itime;']);%normalize sum by the number of fields
2827%         end
2828%     else
2829%         MeanData.NbDim=1;
2830%         MeanData.ListDimName={};
2831%         MeanData.DimValue=[];
2832%         for ilist=1:length(VarIndexSum) 
2833%             VarName=Data.ListVarName{VarIndexSum(ilist)};
2834%             MeanData.ListVarName=[MeanData.ListVarName {[VarName 'val']} {[VarName 'hist']}];
2835%             MeanData.VarDimIndex=[MeanData.VarDimIndex {[ilist]} {[ilist]}];
2836%             MeanData.ListDimName=[MeanData.ListDimName {[VarName 'val']}];
2837%             eval(['MeanData.DimValue=[MeanData.DimValue length(MeanData.' VarName 'val)];']);
2838%         end   
2839%     end
2840%     figure
2841%     haxes=axes;
2842%     plot_field(MeanData,haxes)%plot the resulting average
2843%     % change variable names for consitency with civ1 data (need to generalize these programs)
2844%     if length(MeanData.ListVarName) >= 4 & isequal(MeanData.ListVarName(1:4), {'X'  'Y'  'U'  'V'})
2845%        MeanData.ListGlobalAttribute={'nb_coord','nb_dim','dt','absolut_time_T0','pixcmx','pixcmy','hart','civ','fix'};
2846%        MeanData.nb_coord=2;
2847%        MeanData.nb_dim=2;
2848%        MeanData.dt=1;
2849%        MeanData.absolut_time_T0=0;
2850%        MeanData.pixcmx=1; %pix per cm (1 by default)
2851%        MeanData.pixcmy=1; %pix per cm (1 by default)
2852%        MeanData.hart=0;
2853%        if isequal(Data.CoordType,'px')
2854%          MeanData.civ=1;
2855%       else
2856%          MeanData.civ=0;
2857%        end
2858%       MeanData.fix=0;
2859%         MeanData.ListVarName(1:4)={'vec_X'  'vec_Y'  'vec_U'  'vec_V'};
2860%         MeanData.vec_X=MeanData.X;
2861%         MeanData.vec_Y=MeanData.Y;
2862%         MeanData.vec_U=MeanData.U;
2863%         MeanData.vec_V=MeanData.V;
2864%     end
2865%     error=struct2nc(filemean,MeanData); %save result file
2866%     if isequal(error,0)
2867%         if test_interpolate
2868%             'fields interpolated to the positions of the first one'
2869%         end
2870%         [filemean ' written']
2871%     else
2872%         warndlg_uvmat(error,'ERROR')
2873%     end
2874% end
2875
2876%----------------------------------------------------------------------
2877% --project fields on a projection object (e. g. a regular grid), possibly
2878% merge several fields
2879%----------------------------------------------------------------------
2880%INPUT:
2881%num_i1: series of first indices i (given from the series interface as first_i:incr_i:last_i, mode and list_pair_civ)
2882%num_i2: series of second indices i (given from the series interface as first_i:incr_i:last_i, mode and list_pair_civ)
2883%num_j1: series of first indices j (given from the series interface as first_j:incr_j:last_j, mode and list_pair_civ )
2884%num_j2: series of second indices j (given from the series interface as first_j:incr_j:last_j, mode and list_pair_civ)
2885%OTHER INPUTS given by the structure Series
2886function GUI_input=merge_proj(num_i1,num_i2,num_j1,num_j2,Series);
2887
2888%requests for the visibility of input windows in the GUI series  (activated directly by the selection in the menu ACTION)
2889if ~exist('num_i1','var')
2890    GUI_input={'RootPath';'two';...%nbre of possible input series (options 'on'/'two'/'many', default:'one')
2891        'SubDir';'on';... % subdirectory of derived files (PIV fields), ('on' by default)
2892        'RootFile';'on';... %root input file name ('on' by default)
2893        'FileExt';'on';... %input file extension ('on' by default)
2894        'NomType';'on';...%type of file indexing ('on' by default)
2895        'NbSlice';'on'; ...%nbre of slices ('off' by default)
2896        'VelTypeMenu';'one';...% menu for selecting the velocity type (civ1,..) options 'off'/'one'/'two', 'off' by default)
2897        'FieldMenu';'one';...% menu for selecting the field (s) in the input file(options 'off'/'one'/'two', 'off' by default)
2898        'CoordType';'on';...%can use a transform function 'off' by default
2899        'GetObject';'on';...%can use projection object ,'off' by default
2900        %'GetMask';'on'...%can use mask option   ,'off' by default
2901        %'PARAMETER'; options: name of the user defined parameter',repeat a line for each parameter
2902               ''};
2903    return %exit the function
2904end
2905
2906%-------------------------------------------------
2907hseries=guidata(Series.hseries);%handles of the GUI series
2908WaitbarPos=get(hseries.waitbar_frame,'Position'); %positiopn of waitbar frame
2909%-------------------------------------------------
2910
2911%numbers of view fields (nbre of inputs in RootPath)
2912testcell=iscell(Series.RootFile);
2913if ~testcell
2914    Series.RootPath={Series.RootPath};
2915    Series.RootFile={Series.RootFile};
2916    Series.SubDir={Series.SubDir};
2917    Series.FileExt={Series.FileExt};
2918    Series.NomType={Series.NomType};
2919    num_i1={num_i1};
2920    num_i2={num_i2};
2921    num_j1={num_j1};
2922    num_j2={num_j2};
2923end
2924nbview=length(Series.RootFile);%number of views (file series to merge)
2925nbfield=size(num_i1{1},1)*size(num_i1{1},2);%number of fields in the time series
2926transform=Series.CoordType; %  field transform function
2927hhh=which('mmreader');
2928for iview=1:nbview
2929    test_movie(iview)=0;
2930    if ~isequal(hhh,'')&& mmreader.isPlatformSupported()
2931        if isequal(lower(FileExt{iview}),'.avi')
2932            MovieObject{iview}=mmreader(fullfile(RootPath{iview},[RootFile{iview} FileExt{iview}]));
2933            test_movie(iview)=1;
2934        end
2935    end
2936end
2937
2938%Calibration data and timing: read the ImaDoc files
2939mode=''; %default
2940timecell={};
2941itime=0;
2942NbSlice_calib={}; %test for z index
2943for iview=1:nbview%Loop on views
2944    XmlData{iview}=[];%default
2945    filebase{iview}=fullfile(Series.RootPath{iview},Series.RootFile{iview});
2946    if exist([filebase{iview} '.xml'],'file')
2947        [XmlData{iview},error]=imadoc2struct([filebase{iview} '.xml']);
2948        if isfield(XmlData{iview},'Time')
2949            itime=itime+1;
2950            timecell{itime}=XmlData{iview}.Time;
2951        end
2952        if isfield(XmlData{iview},'GeometryCalib') && isfield(XmlData{iview}.GeometryCalib,'SliceCoord')
2953            NbSlice_calib{iview}=size(XmlData{iview}.GeometryCalib.SliceCoord,1);
2954            if ~isequal(NbSlice_calib{iview},NbSlice_calib{1})
2955                msgbox_uvmat('WARNING','inconsistent number of Z indices for the two field series');
2956            end
2957        end   
2958    elseif exist([filebase{iview} '.civ'],'file')
2959        [error,time,TimeUnit,mode,npx,npy,pxcmx,pxcmy]=read_imatext([filebase{iview} '.civ']);
2960        itime=itime+1;
2961        timecell{itime}=time;
2962        XmlData{iview}.Time=time;
2963        GeometryCalib.R=[pxcmx 0 0; 0 pxcmy 0;0 0 0];
2964        GeometryCalib.Tx=0;
2965        GeometryCalib.Ty=0;
2966        GeometryCalib.Tz=1;
2967        GeometryCalib.dpx=1;
2968        GeometryCalib.dpy=1;
2969        GeometryCalib.sx=1;
2970        GeometryCalib.Cx=0;
2971        GeometryCalib.Cy=0;
2972        GeometryCalib.f=1;
2973        GeometryCalib.kappa1=0;
2974        GeometryCalib.CoordUnit='cm';
2975        XmlData{iview}.GeometryCalib=GeometryCalib;
2976        if error==1
2977            msgbox_uvmat('WARNING','inconsistent number of fields in the .civ file');
2978        end
2979    end
2980end
2981
2982%check coincidence in time
2983multitime=0;
2984if length(timecell)==0
2985    time=[];
2986elseif length(timecell)==1
2987    time=timecell{1};
2988elseif length(timecell)>1
2989    multitime=1;
2990    for icell=1:length(timecell)
2991        if ~isequal(size(timecell{icell}),size(timecell{1}))
2992            msgbox_uvmat('WARNING','inconsistent time array dimensions in ImaDoc fields, the time for the first series is used')
2993            time=timecell{1};
2994            multitime=0;
2995            break
2996        end
2997    end
2998end
2999if multitime
3000    for icell=1:length(timecell)
3001        time(icell,:,:)=timecell{icell};
3002    end
3003    diff_time=max(max(diff(time)));
3004    if diff_time>0
3005        msgbox_uvmat('WARNING',['times of series differ by more than ' num2str(diff_time)])
3006    end   
3007end
3008if size(time,2) < num_i2{1}(end) || size(time,3) < num_j2{1}(end)% ime array absent or too short in ImaDoc xml file'
3009    time=[];
3010end
3011
3012% Field and velocity type (the same for all views)
3013Field_str=get(hseries.FieldMenu,'String');
3014val=get(hseries.FieldMenu,'Value');
3015FieldName=Field_str(val);%the same set of fields for all views
3016VelType_str=get(hseries.VelTypeMenu,'String');
3017VelType_val=get(hseries.VelTypeMenu,'Value');
3018VelType=VelType_str{VelType_val}; %the same for all views
3019if isequal(FieldName,'get_field...')
3020    hget_field=findobj(allchild(0),'Name','get_field');%find the get_field... GUI
3021   % hhget_field=guidata(hget_field);%handles of GUI elements in get_field
3022    SubField=get_field('read_get_field',hObject,eventdata,hget_field); %read the names of the variables to plot in the get_field GUI
3023%     if isequal(get(hhget_field.menu_coord,'Visible'),'on')
3024%         list_transform=get(hhget_field.menu_coord,'String');
3025%         val_list=get(hhget_field.menu_coord,'Value');
3026%         transform=list_transform{val_list};
3027%     end
3028end
3029%detect whether all the files are 'images' or 'netcdf'
3030testima=0;
3031testvol=0;
3032testcivx=0;
3033testnc=0;
3034FileExt=get(hseries.FileExt,'String');
3035for iview=1:nbview
3036     ext=FileExt{iview};
3037     form=imformats(ext([2:end]));
3038     if isequal(lower(ext),'.vol')
3039         testvol=testvol+1;
3040     elseif ~isempty(form)||isequal(lower(ext),'.avi')% if the extension corresponds to an image format recognized by Matlab
3041         testima=testima+1;
3042     elseif isequal(ext,'.nc')
3043         testnc=testnc+1;
3044     end
3045end
3046if testvol
3047    msgbox_uvmat('ERROR','volume images not implemented yet')
3048    return
3049end
3050if testnc~=nbview && testima~=nbview && testvol~=nbview
3051    msgbox_uvmat('ERROR','need a set of images or a set of netcdf files with the same fields as input')
3052    return
3053end
3054if ~isequal(FieldName,'get_field...')
3055    testcivx=testnc;
3056end
3057%name of output files and directory:
3058% res_subdir=fullfile(Series.RootPath{1},[Series.SubDir{1} '_STAT']);
3059ProjectDir=fileparts(fileparts(Series.RootPath{1}));% preoject directory (GERK)
3060prompt={['result directory (in' ProjectDir ')']};
3061RootPath=get(hseries.RootPath,'String');
3062SubDir=get(hseries.SubDir,'String');
3063if isequal(length(RootPath),1)
3064    fulldir=RootPath{1};
3065    subdir='GRID';
3066    res_subdir=fullfile(fulldir,subdir);
3067else
3068    def={fullfile(ProjectDir,'0_RESULTS')};
3069    dlgTitle='result directory';
3070    lineNo=1;
3071    answer=msgbox_uvmat('INPUT_TXT',dlgTitle,def);
3072    fulldir=answer{1};
3073    subdir=[];
3074    dirlist=sort(Series.RootFile);
3075    for iview=1:nbview
3076        if ~isempty(subdir)
3077            subdir=[subdir '-'];
3078        end
3079        subdir=[subdir dirlist{iview}];
3080    end 
3081    res_subdir=fullfile(fulldir,subdir);
3082end
3083ext=FileExt{1};
3084if ~exist(fulldir,'dir')
3085    msgbox_uvmat('ERROR',['directory ' fulldir ' needs to be created'])
3086    return
3087end
3088if ~exist(res_subdir,'dir')
3089    dircur=pwd;
3090    cd(fulldir)
3091    error=mkdir(subdir);
3092    cd(dircur)
3093end
3094filebasesub=fullfile(res_subdir,Series.RootFile{1});
3095filebase_merge=fullfile(res_subdir,'merged');%root name for the merged files
3096
3097%projection object
3098if isfield(Series,'sethandles')
3099    if ishandle(Series.sethandles.set_object)
3100        Series.ProjObject=read_set_object(Series.sethandles);
3101        if ~isfield(Series.ProjObject,'Style')
3102            msgbox_uvmat('ERROR','Undefined projection object style')
3103            return
3104        end
3105        if ~isequal(Series.ProjObject.Style,'plane')
3106            msgbox_uvmat('ERROR','The projection object must be a plane')
3107            return
3108        end
3109    end
3110end
3111
3112    %MAIN LOOP
3113for ifile=1:nbfield               
3114    stopstate=get(hseries.RUN,'BusyAction');
3115    if isequal(stopstate,'queue')% enable STOP command from the 'series' interface
3116         update_waitbar(hseries.waitbar,WaitbarPos,ifile/nbfield)
3117         Amerge=0;
3118         
3119         %----------LOOP ON VIEWS----------------------
3120        nbtime=0;
3121        for iview=1:nbview
3122            %name of the current file
3123            filename=name_generator(filebase{iview},num_i1{iview}(ifile),num_j1{iview}(ifile),Series.FileExt{iview},Series.NomType{iview},1,num_i2{iview}(ifile),num_j2{iview}(ifile),SubDir{iview});
3124            if ~exist(filename,'file')
3125                msgbox_uvmat('ERROR',['missing input file' filename])
3126                break
3127            end
3128
3129            %reading the current file
3130            if testima
3131                if test_movie(iview)
3132                    Field{iview}.A=read(MovieObject{iview},num_i1{iview}(ifile));
3133                else
3134                    Field{iview}.A=read_image(filename,Series.NomType{iview},num_i1{iview}(ifile));
3135                end % TODO: introduce ListVarName
3136                npxy=size(Field{iview}.A);
3137                Field{iview}.AX=[0.5 npxy(2)-0.5]; % coordinates of the first and last pixel centers
3138                Field{iview}.AY=[npxy(1)-0.5 0.5];
3139                Field{iview}.CoordType='px';
3140                Field{iview}.AName='image';
3141            else
3142                if testcivx
3143                    [Field{iview},VelTypeOut]=read_civxdata(filename,FieldName,VelType);
3144                else
3145                    [Field{iview},var_detect]=nc2struct(filename,SubField.ListVarName); %read the corresponding input data               
3146                    Field{iview}.VarAttribute=SubField.VarAttribute;
3147                end
3148                if isfield(Field{iview},'Time')
3149                    timeread(iview)=Field{iview}.Time;
3150                    nbtime=nbtime+1;
3151                end
3152            end
3153            % coord transform
3154            % z index
3155            if ~isempty(NbSlice_calib)
3156                Field{iview}.ZIndex=mod(num_i1{iview}(ifile)-1,NbSlice_calib{1})+1;
3157            end
3158            if ~isequal(transform,'')
3159                Field{iview}=feval(Series.CoordType,Field{iview},XmlData{iview});%transform to phys if requested
3160            end
3161            if testcivx
3162                    Field{iview}=calc_field(FieldName,Field{iview});
3163            end
3164
3165            %projection on object (gridded plane)
3166            if isfield(Series,'ProjObject')
3167                Field{iview}=proj_field(Field{iview},Series.ProjObject);
3168            end
3169        end   
3170       
3171         %----------END LOOP ON VIEWS----------------------
3172         
3173        %merge the nbview fields
3174        MergeData=merge_field(Field);
3175        if isfield(MergeData,'Txt')
3176            msgbox_uvmat('ERROR',MergeData.Txt)
3177            return
3178        end
3179       
3180        % generating the name of the merged field
3181        mergename=name_generator(filebase_merge,num_i1{iview}(ifile),num_j1{iview}(ifile),Series.FileExt{iview},Series.NomType{iview},1,num_i2{iview}(ifile),num_j2{iview}(ifile));
3182       
3183        % time:
3184        time_i=0;%default
3185        if isempty(time)% time from ImaDoc prevails
3186            time_i=sum(timeread)/nbtime;
3187        else
3188            time_i=(time(iview,num_i1{iview}(ifile),num_j1{iview}(ifile))+time(iview,num_i2{iview}(ifile),num_j2{iview}(ifile)))/2;
3189        end
3190       
3191        % recording the merged field
3192        if testima    %in case of input images an image is produced   
3193            if isa(MergeData.A,'uint8')
3194                bitdepth=8;
3195            elseif isa(MergeData.A,'uint16')
3196                bitdepth=16;
3197            end
3198            imwrite(MergeData.A,mergename,'BitDepth',bitdepth);
3199            %write xml calibration file
3200            siz=size(MergeData.A);
3201            npy=siz(1);
3202            npx=siz(2);
3203            if isfield(MergeData,'VarAttribute')&&isfield(MergeData.VarAttribute{1},'Coord_2')&&isfield(MergeData.VarAttribute{1},'Coord_1')
3204                Rangx=MergeData.VarAttribute{1}.Coord_2;
3205                Rangy=MergeData.VarAttribute{1}.Coord_1;
3206            elseif isfield(MergeData,'AX')&& isfield(MergeData,'AY')
3207                Rangx=[MergeData.AX(1) MergeData.AX(end)];
3208                Rangy=[MergeData.AY(1) MergeData.AY(end)];
3209            else
3210                Rangx=[0.5 npx-0.5];
3211                Rangy=[npy-0.5 0.5];%default
3212            end
3213            pxcmx=(npx-1)/(Rangx(2)-Rangx(1));
3214            pxcmy=(npy-1)/(Rangy(1)-Rangy(2));
3215            T_x=-pxcmx*Rangx(1)+0.5;
3216            T_y=-pxcmy*Rangy(2)+0.5;
3217            GeometryCal.focal=1;
3218            GeometryCal.R=[pxcmx,0,0;0,pxcmy,0;0,0,1];
3219            GeometryCal.Tx_Ty_Tz=[T_x T_y 1];
3220            ImaDoc.GeometryCalib=GeometryCal;
3221            t=struct2xml(ImaDoc);
3222            t=set(t,1,'name','ImaDoc');
3223            save(t,[filebase_merge '.xml'])     
3224            display([filebase_merge '.xml saved'])
3225        else
3226            MergeData.ListGlobalAttribute={'Project','InputFile_1','InputFile_end','nb_coord','nb_dim','dt','Time','civ'};       
3227            MergeData.nb_coord=2;
3228            MergeData.nb_dim=2;
3229            MergeData.dt=1;
3230            MergeData.Time=time_i;
3231            error=struct2nc(mergename,MergeData); %save result file
3232            if isempty(error)
3233                display(['output file ' mergename ' written'])
3234            else
3235                display(error)
3236            end
3237        end
3238    end
3239end
3240
3241%--------------------------------------------------------------------------   
3242function MergeData=merge_field(Data)
3243% initiate Matlab  structure for physical field
3244if isempty(Data)||~iscell(Data)
3245    MergeData=[];
3246    return
3247end
3248MergeData=Data{1};%default
3249error=0;
3250nbview=length(Data);
3251if nbview==1
3252    return
3253end
3254for iview=1:nbview
3255    if ~isequal(MergeData.ListDimName,Data{iview}.ListDimName)
3256        error=1;
3257    end
3258    if ~isequal(MergeData.ListVarName,Data{iview}.ListVarName)
3259        error=1;
3260    end
3261%      if ~isequal(MergeData.VarDimIndex,Data{iview}.VarDimIndex)
3262%         error=1;
3263%      end
3264end
3265if error
3266    MergeData.Txt='ERROR: attempt at merging fields of incompatible type';
3267    return
3268end
3269%group the variables (fields of 'FieldData') in cells of variables with the same dimensions
3270%-----------------------------------------------------------------
3271[CellVarIndex,NbDim,VarTypeCell]=find_field_indices(Data{1});
3272%LOOP ON GROUPS OF VARIABLES SHARING THE SAME DIMENSIONS
3273% CellVarIndex=cells of variable index arrays
3274ivar_new=0; % index of the current variable in the projected field
3275icoord=0;
3276for icell=1:length(CellVarIndex)
3277    if NbDim(icell)==1
3278        continue
3279    end
3280    VarIndex=CellVarIndex{icell};%  indices of the selected variables in the list FieldData.ListVarName
3281    VarType=VarTypeCell{icell};
3282    ivar_X=VarType.coord_x;
3283    ivar_Y=VarType.coord_y;
3284    ivar_FF=VarType.errorflag;
3285    if isempty(ivar_X)
3286        test_grid=1;%test for input data on regular grid (e.g. image)coordinates
3287    else
3288        if length(ivar_Y)~=1
3289                warndlg_uvmat('y coordinate missing in proj_field.m','ERROR')
3290                return
3291        end
3292        test_grid=0;
3293    end
3294%    DimIndices=Data{1}.VarDimIndex{VarIndex(1)};%indices of the dimensions of the first variable (common to all variables in the cell)
3295    %case of input fields with unstructured coordinates
3296    if ~test_grid
3297        for ivar=VarIndex
3298            VarName=MergeData.ListVarName{ivar};
3299            for iview=1:nbview
3300                eval(['MergeData.' VarName '=[MergeData.' VarName '; Data{iview}.' VarName ';'])
3301            end
3302        end
3303    %case of fields defined on a structured  grid
3304    else 
3305%        DimValue=MergeData.DimValue(DimIndices);%set of dimension values
3306        testFF=0;
3307        for iview=2:nbview
3308%             if ~isequal(DimValue,Data{iview}.DimValue(DimIndices))
3309%                 MergeData.Txt='ERROR: attempt at merging structured fields with different sizes';
3310%                 return
3311%             end
3312            for ivar=VarIndex
3313                VarName=MergeData.ListVarName{ivar};
3314                if isfield(MergeData,'VarAttribute')
3315                    if length(MergeData.VarAttribute)>=ivar && isfield(MergeData.VarAttribute{ivar},'Role') && isequal(MergeData.VarAttribute{ivar}.Role,'errorflag')
3316                        testFF=1;
3317                    end
3318                end
3319                eval(['MergeData.' VarName '=MergeData.' VarName '+ Data{iview}.' VarName ';'])
3320            end
3321        end
3322        if testFF
3323            nbaver=nbview-MergeData.FF;
3324            indgood=find(nbaver>0);
3325            for ivar=VarIndex
3326                VarName=MergeData.ListVarName{ivar};
3327                eval(['MergeData.' VarName '(indgood)=double(MergeData.' VarName '(indgood))./nbaver(indgood);'])
3328            end
3329        else
3330            for ivar=VarIndex
3331                VarName=MergeData.ListVarName{ivar};
3332                eval(['MergeData.' VarName '=double(MergeData.' VarName ')./nbview;'])
3333            end   
3334        end
3335    end
3336end
3337   
3338   
3339%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3340 %detect the chosen series of files and check their date of modification:
3341%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3342%INPUT:
3343%num_i1: series of first indices i (given from the series interface as first_i:incr_i:last_i, mode and list_pair_civ)
3344%num_i2: series of second indices i (given from the series interface as first_i:incr_i:last_i, mode and list_pair_civ)
3345%num_j1: series of first indices j (given from the series interface as first_j:incr_j:last_j, mode and list_pair_civ )
3346%num_j2: series of second indices j (given from the series interface as first_j:incr_j:last_j, mode and list_pair_civ)
3347%OTHER INPUTS given by the structure Series
3348function GUI_input=clean_civ_cmx(num_i1,num_i2,num_j1,num_j2,Series) %(filecell,filecell_1,num_i,num_j,vel_type,field,param);
3349
3350%requests for the visibility of input windows in the GUI series  (activated directly by the selection in the menu ACTION)
3351if ~exist('num_i1','var')
3352    GUI_input={'RootPath';'many';...%nbre of possible input series (options 'on'/'two'/'many', default:'one')
3353        'SubDir';'on';... % subdirectory of derived files (PIV fields), ('on' by default)
3354        %'RootFile';'on';... %root input file name ('on' by default)
3355        %'FileExt';'on';... %input file extension ('on' by default)
3356        %'NomType';'on';...%type of file indexing ('on' by default)
3357        %'NbSlice';'on'; ...%nbre of slices ('off' by default)
3358        %'VelTypeMenu';'one';...% menu for selecting the velocity type (civ1,..) options 'off'/'one'/'two', 'off' by default)
3359        %'FieldMenu';'one';...% menu for selecting the field (s) in the input file(options 'off'/'one'/'two', 'off' by default)
3360        %'CoordType';'on'...%can use a transform function 'off' by default
3361        %'GetObject';'on'...%can use projection object ,'off' by default
3362        %'GetMask';'on'...%can use mask option   ,'off' by default
3363        %'PARAMETER'; options: name of the user defined parameter',repeat a line for each parameter
3364               ''};
3365    return %exit the function
3366end
3367%---------------------------------------------------------
3368hseries=guidata(Series.hseries);%handles of the GUI series
3369WaitbarPos=get(hseries.waitbar_frame,'Position');
3370
3371%%%%%%%%%%%%%%%%%%%%%%%%
3372message='this function will delete all files with extensions .log, .bat, .cmx,.cmx2,.errors in the input directory(ies)';
3373answer=msgbox_uvmat('INPUT_Y-N',message);
3374if ~isequal(answer,'Yes')
3375    return
3376end
3377nbdelete=0;
3378testcell=iscell(Series.RootFile);
3379if ~testcell
3380    Series.RootPath={Series.RootPath};
3381    Series.RootFile={Series.RootFile};
3382    Series.SubDir={Series.SubDir};
3383    Series.FileExt={Series.FileExt};
3384    Series.NomType={Series.NomType};
3385end
3386for iview=1:length(Series.RootFile)
3387    hdir=dir(fullfile(Series.RootPath{iview},Series.SubDir{iview}));%list files
3388    for ilist=1:length(hdir)
3389        update_waitbar(hseries.waitbar,WaitbarPos,ilist/length(hdir))
3390        FileName=hdir(ilist).name;
3391        [dd,ff,Ext]=fileparts(FileName);
3392        if isequal(Ext,'.log')||isequal(Ext,'.bat')||isequal(Ext,'.cmx')||isequal(Ext,'.cmx2')|| isequal(Ext,'.errors')
3393            delete(fullfile(Series.RootPath{iview},Series.SubDir{iview},FileName))
3394            nbdelete=nbdelete+1;
3395        end
3396    end
3397end
3398msgbox_uvmat('CONFIRMATION',['END: ' num2str(nbdelete) ' files deleted by clean_civ_cmx'])
3399
3400
3401
3402
3403
3404%-----------------------------
3405function mouse_up_gui(ggg,eventdata,handles)
3406if isequal(get(ggg,'SelectionType'),'alt')
3407    display('global CurData, UserData of GUI series')
3408    global CurData
3409    CurData=get(ggg,'UserData');
3410    evalin('base','global CurData');%make CurData global in the workspace
3411    evalin('base','CurData'); %display CurData in the workspace
3412    commandwindow
3413   % plot_text(CurData)
3414end
3415
3416
3417
3418% %----------------------------------------------------------------------
3419% % --- display image movie and display time average
3420% %OBSOLETE: A SUPPRIMER
3421% %----------------------------------------------------------------------
3422% function movie_ima(handles,filecell,filecell_1,num1,num_a,field)
3423%
3424% global hfig1 hfig2 hfig3 poscolbar
3425% global A val HIST
3426%
3427% A=[];aviobj=[];
3428% % set(hfig1,'UserData','ima')% set the current field state to 'image'
3429% set(handles.zoom,'Value',1); %put zoom on
3430% nom_type=get(handles.file_input,'UserData');
3431% % field=get(handles.civ1,'UserData');
3432% % fields=field(1).fields;
3433% set(handles.speed,'Visible','On')%show slider to set movie speed
3434% set(handles.mo_speed_txt,'Visible','On')
3435%
3436% if ~isempty(filecell_1)
3437%    file1=get(handles.file1_input,'UserData');
3438%    field1=file1.field;
3439%    scal_type1=field1.fields;
3440%    vel_type1=field1.vel_type;
3441%    filename_1=filecell_1(1);% first file name in the series
3442% else
3443%    filename_1=[];
3444% end
3445% scal_type{1}=field(1).fields;
3446% vel_type{1}=field(1).vel_type;
3447% % display the first field
3448% [A,time,dt,rangx0,rangy0]=view_ima(handles,cell2mat(filecell(1)),filename_1,num1(1),num_a(1));
3449%
3450% % calculate the histogram of the first image
3451% nxy=size(A);
3452% ndim=length(nxy);
3453% if ndim==2 % case of B/W images
3454%     nxy(3)=1;
3455% end
3456% C=reshape(A,nxy(1)*nxy(2),nxy(3));
3457% Amaxmax=double(max(max(max(A))));
3458% Aminmin=double(min(min(min(A))));
3459% if isa(C,'uint8')|isa(C,'uint16')
3460%     C=double(C);
3461%     dC=1;
3462% else
3463%     dC=(Amaxmax-Aminmin)/100;
3464% end
3465% val=[Aminmin:dC:Amaxmax];% define bins for histogram
3466% HIST=hist(C,val);% initiate the global histogram
3467% if ndim==2, HIST=HIST'; end;
3468%
3469% auto_scale=get(handles.auto_scale,'Value');
3470% min_input=str2num(get(handles.min_input,'String'));% select the minimum
3471% max_input=str2num(get(handles.scale_input,'String'));% select the max
3472% zoomstate=get(handles.zoom,'Value');
3473%
3474% if isequal(get(handles.window_input,'String'),'avi'),
3475%     basename=get(handles.file_input,'String');
3476%     prompt = {'file name';'frames per second';'frame resolution ([nbpixels x y])';'axis position relative to the frame'};
3477%     dlg_title = 'select properties of the output avi movie';
3478%     num_lines= 1;
3479%     def     = {[basename '_out.avi'];'5';'[1024 768]';'[0.05 0.07 0.87 0.88]'};
3480%     answer = inputdlg(prompt,dlg_title,num_lines,def);
3481%     aviname=answer{1};
3482%     fps=str2num(answer{2});
3483%     if exist(aviname,'file')==2
3484%         delete(aviname);
3485%     end;
3486%     aviobj=avifile(aviname,'Compression','None','fps',fps);
3487%     
3488%     %display first view for tests
3489%     figure(2);
3490%     hh=get(gcf,'CurrentAxes');
3491%     if isempty(hh),
3492%         hfig1=axes;
3493%     else
3494%         hfig1=hh;
3495%     end;
3496%     if isequal(filecell_1,{})
3497%         filename_1=[];
3498%     else
3499%         filename_1=cell2mat(filecell_1(1));
3500%     end
3501%     poscolbar=[0.93 0.15 0.02 0.7];
3502%     view_ima(handles,cell2mat(filecell(1)),filename_1,num1(1),num_a(1));% show the first field
3503%     nbpix=eval(answer{3});
3504%     set(gcf,'Position',[1 1 nbpix])% resolution XVGA
3505%     set(hfig1,'Position',eval(answer{4}));
3506%     
3507%     msgbox({'adjust figure 2 with its matlab edit menu ' ;...
3508%             'then type any keyboard key to get the avi movie as a copy of figure 2 display'})
3509%     pause;
3510%     hh=colorbar;
3511%     poscolbar=get(hh,'Position');
3512% end
3513%
3514% %%%%%%%%%%%%%%%%
3515% %mask and usrdfct
3516% maskname=[]; %default
3517% if isequal(get(handles.mask_test,'Value'),1)
3518%     maskbase=get(handles.mask_test,'UserData');
3519% end
3520% % image or scalar processing programme set by user
3521% % if (get(handles.usr_fct,'Value')==1)
3522% %      usrfct=get(handles.usr_fct,'UserData');
3523% % else
3524% %      usrfct='';
3525% % end
3526% nburst=1; % nburst(1) =nbre of names in filename= nbre of bursts
3527% set(handles.text_display_1,'String',['image movie'])
3528% nbfield=length(filecell);
3529% if nbfield >1
3530% for ifile=2:nbfield
3531%     stopstate=get(handles.run0,'BusyAction');
3532%     if isequal(stopstate,'queue')% enable STOP command
3533%        pausetime=1.02-get(handles.speed,'Value');
3534%          pause(pausetime)
3535%          if isequal(get(handles.mask_test,'Value'),1)
3536%                 maskname=name_generator(maskbase,num1(ifile),1,'.png','png_series');
3537%             end
3538%             if isequal(AName{1},'image')
3539%                 A=read_image(cell2mat(filecell(ifile)),num1(ifile),maskname);% read the first image, num2 is the counter for avi files
3540%             else % read the first field from the netcdf file, imposing the pixel positions in the selected domain
3541%                  [A,time(ifile),dtr,rgx,rgy,vt_out,erread]=read_scalar(filecell{ifile},vel_type,scal_type,rangx0,rangy0,nxy,maskname);
3542%                 if erread==1;
3543%                     errordlg({['no spatial derivative in ' filecell{ifile}]; 'run patch first'}); return
3544%                 elseif erread==2;
3545%                     errordlg(['no field ' vel_type{1} ' in ' filecell{ifile}]); return
3546%                 elseif erread==3;
3547%                     errordlg(['scalar ' scal_type{1} ' not found in' filecell{ifile}]); return
3548%                 elseif erread==4;
3549%                     errordlg(['all points aligned in' filecell{ifile}]); return
3550%                 end
3551%             end
3552%           
3553%             % read the second image
3554%             if ~isempty(filecell_1)
3555%                 if isequal(scal_type{1},'image')
3556%                     A1=read_image(cell2mat(filecell_1(ifile)),num1(ifile),maskname);% read the second image, num2 is the counter for avi files
3557%                     Avalue_1=double(A1(indy,indx,:));
3558%                 else % read the second field from the netcdf file, imposing the pixel positions in the selected domain
3559%                     [Avalue_1,time1(ifile),dtr,rgx,rgy,vt_out,erread]=read_scalar(filecell_1{ifile},{vel_type1},{scal_type1},rangx0,rangy0,npxy,maskname,usrfct);
3560%                     if erread==1;
3561%                         errordlg({['no spatial derivative in ' filecell_1{ifile}]; 'run patch first'}); return
3562%                     elseif erread==2;
3563%                         errordlg(['no field ' vel_type1 ' in ' filecell_1{ifile}]); return
3564%                     elseif erread==3;
3565%                         errordlg(['scalar ' scal_type1 ' not found in' filecell_1{ifile}]); return
3566%                     elseif erread==4;
3567%                         errordlg(['all points aligned in' filecell_1{ifile}]); return
3568%                     end
3569%                 end
3570%                 time(ifile)=(time(ifile)+time1(ifile))/2;
3571%                 Avalue=Avalue-Avalue_1;
3572%             end
3573%         set(handles.abs_time,'String',time);
3574%         set(handles.field_counter,'String',num2str(num1(ifile)));
3575%         set(handles.a_input,'String',num2stra(num_a(ifile),nom_type));
3576%         C=reshape(A,nxy(1)*nxy(2),nxy(3));% reshape in a vector
3577%         [val,HIST]=hist_update(val,HIST,C,dC);
3578%         [h,Amin,Amax]=plot_image(hfig1,rangx0,rangy0,1,scal_type{1},auto_scale,min_input,max_input,poscolbar,A);
3579%         set(handles.min_input,'String',num2str(Amin));% select the minimum
3580%         set(handles.scale_input,'String',num2str(Amax));% select the minimum
3581%          if ~isequal(aviobj,[]),
3582% %              mov=getframe(hfig1);
3583%               mov=getframe(gcf);
3584%              aviobj=addframe(aviobj,mov);end
3585%          if (get(handles.zoom,'Value') == get(handles.zoom,'Max')),zoom on,end
3586%          set(handles.field_counter,'String',num2str(num1(ifile)))
3587% %     end
3588% end
3589% end
3590% end
3591% aviobj=close(aviobj);
3592%
3593% %plot global image histogram
3594%         HIST=HIST/(nbfield*nxy(1)*nxy(2));% normalized by the number of points
3595%         axes(hfig2) %in main window
3596%         if ndim==2
3597%             plot(val,HIST)
3598%         else
3599%             plot(val,HIST(:,1),'r',val,HIST(:,2),'g',val,HIST(:,3),'b')
3600%         end
3601%         residu=1-sum(HIST,1);
3602%         title(['histo, residu ' num2str(residu)])
3603%         grid on
3604%         axes(hfig3)
3605%         cla %clear the second histogram window
3606%         
3607
3608
3609%----------------------------------------------------------------------
3610% --- make a time series analysis
3611%----------------------------------------------------------------------
3612%INPUT:
3613%num_i1: series of first indices i (given from the series interface as first_i:incr_i:last_i, mode and list_pair_civ)
3614%num_i2: series of second indices i (given from the series interface as first_i:incr_i:last_i, mode and list_pair_civ)
3615%num_j1: series of first indices j (given from the series interface as first_j:incr_j:last_j, mode and list_pair_civ )
3616%num_j2: series of second indices j (given from the series interface as first_j:incr_j:last_j, mode and list_pair_civ)
3617%OTHER INPUTS given by the structure Series
3618function GUI_input=time_series(num_i1,num_i2,num_j1,num_j2,Series)
3619
3620%requests for the visibility of input windows in the GUI series  (activated directly by the selection in the menu ACTION)
3621if ~exist('num_i1','var')
3622    GUI_input={'RootPath';'two';...%nbre of possible input series (options 'on'/'two'/'many', default:'one')
3623        'SubDir';'on';... % subdirectory of derived files (PIV fields), ('on' by default)
3624        'RootFile';'on';... %root input file name ('on' by default)
3625        'FileExt';'on';... %input file extension ('on' by default)
3626        'NomType';'on';...%type of file indexing ('on' by default)
3627        'NbSlice';'on'; ...%nbre of slices ('off' by default)
3628        'VelTypeMenu';'two';...% menu for selecting the velocity type (civ1,..) options 'off'/'one'/'two', 'off' by default)
3629        'FieldMenu';'two';...% menu for selecting the field (s) in the input file(options 'off'/'one'/'two', 'off' by default)
3630        'CoordType';'on';...%can use a transform function 'off' by default
3631        'GetObject';'on';...%can use projection object ,'off' by default
3632        %'GetMask';'on'...%can use mask option   ,'off' by default
3633        %'PARAMETER'; options: name of the user defined parameter',repeat a line for each parameter
3634               ''};
3635    return %exit the function
3636end
3637
3638%------------------------------------------------------
3639hseries=guidata(Series.hseries);%handles in the GUI series
3640WaitbarPos=get(hseries.waitbar_frame,'Position'); %position of the waitbar frame
3641
3642%projection object
3643test_object=get(hseries.GetObject,'Value');
3644if test_object%isfield(Series,'sethandles')
3645    Series.ProjObject=read_set_object(Series.sethandles);
3646    %answeryes=questdlg({['field series projected on ' Series.ProjObject.Style]});
3647    answeryes=msgbox_uvmat('INPUT_Y-N',['field series projected on ' Series.ProjObject.Style]);
3648    if ~isequal(answeryes,'Yes')
3649        return
3650    end
3651else
3652    msgbox_uvmat('ERROR','a projection object is needed');
3653    return
3654end
3655
3656% root names
3657if iscell(Series.RootPath)
3658    RootPath=Series.RootPath;
3659    RootFile=Series.RootFile;
3660    SubDir=Series.SubDir;
3661    FileExt=Series.FileExt;
3662    NomType=Series.NomType;
3663else
3664    RootPath={Series.RootPath};
3665    RootFile={Series.RootFile};
3666    SubDir={Series.SubDir};
3667    FileExt={Series.FileExt};
3668    NomType={Series.NomType};
3669    num_i1={num_i1};
3670    num_i2={num_i2};
3671    num_j1={num_j1};
3672    num_j2={num_j2};
3673end
3674ext=FileExt{1};
3675form=imformats(ext([2:end]));%test valid Matlab image formats
3676testima=0;
3677if ~isempty(form)||isequal(lower(ext),'.avi')
3678    testima=1;
3679end
3680nbview=length(RootPath);%number of series (1 or 2)
3681nbfield=size(num_i1{1},1)*size(num_i1{1},2); %number of fields in the time series
3682
3683%Number of input series: this function  accepts only a single input file series
3684nbview=length(RootPath);
3685if nbview==2
3686    %TODO: choose between difference and two series
3687elseif nbview>2  % TODO: make multiple series
3688%     RootPath=RootPath(1:2);
3689%     set(hseries.RootPath,'String',RootPath)
3690%     SubDir=SubDir(1:2);
3691%     set(hseries.SubDir,'String',SubDir)
3692%     RootFile=RootFile(1:2);
3693%     set(hseries.RootFile,'String',RootFile)
3694%     NomType=NomType(1:2);
3695%     %set(hseries.NomType,'String',NomType)
3696%     FileExt=FileExt(1:2);
3697%     set(hseries.FileExt,'String',FileExt)
3698%     nbview=2;
3699end
3700hhh=which('mmreader');
3701for iview=1:nbview
3702    test_movie(iview)=0;
3703    if ~isequal(hhh,'')&& mmreader.isPlatformSupported()
3704        if isequal(lower(FileExt{iview}),'.avi')
3705            MovieObject{iview}=mmreader(fullfile(RootPath{iview},[RootFile{iview} FileExt{iview}]));
3706            test_movie(iview)=1;
3707        end
3708    end
3709end
3710filebase{1}=fullfile(RootPath{1},RootFile{1});
3711
3712% number of slices
3713NbSlice=str2num(get(hseries.NbSlice,'String'));
3714if isempty(NbSlice)
3715    NbSlice=1;
3716end
3717NbSlice_name=num2str(NbSlice);
3718
3719% Field and velocity type (the same for the two views)
3720if isfield(Series,'Field')
3721    FieldName=Series.Field;%the same set of fields for all views
3722else
3723    FieldName={''};
3724end
3725if isequal(FieldName,{'get_field...'})
3726    hget_field=findobj(allchild(0),'name','get_field');%find the get_field... GUI
3727    if numel(hget_field)>1
3728        delete(hget_field(2:end)) % delete multiple occurerence of the GUI get_fioeld
3729    elseif isempty(hget_field)
3730       filename=name_generator(filebase{1},num_i1{1}(1),num_j1{1}(1),FileExt{1},NomType{1},1,num_i2{1}(1),num_j2{1}(1),SubDir{1});
3731       idetect(iview)=exist(filename,'file');
3732       hget_field=get_field(filename);
3733       return
3734    end
3735    %hhget_field=guidata(hget_field);%handles of GUI elements in get_field
3736    SubField=read_get_field(hget_field) %read the names of the variables to plot in the get_field GUI
3737    if isempty(SubField)
3738        delete(hget_field)
3739       filename=name_generator(filebase{1},num_i1{1}(1),num_j1{1}(1),FileExt{1},NomType{1},1,num_i2{1}(1),num_j2{1}(1),SubDir{1});
3740        hget_field=get_field(filename);
3741        SubField=read_get_field(hget_field); %read the names of the variables to plot in the get_field GUI
3742    end
3743%     if isequal(get(hhget_field.menu_coord,'Visible'),'on')
3744%         list_transform=get(hhget_field.menu_coord,'String');
3745%         val_list=get(hhget_field.menu_coord,'Value');
3746%         transform=list_transform{val_list};
3747%     end
3748end
3749
3750%detect whether the two files are 'images' or 'netcdf'
3751testima=0;
3752testvol=0;
3753testcivx=0;
3754testnc=0;
3755FileExt=get(hseries.FileExt,'String');
3756for iview=1:nbview
3757     ext=FileExt{iview};
3758     form=imformats(ext([2:end]));
3759     if isequal(lower(ext),'.vol')
3760         testvol=testvol+1;
3761     elseif ~isempty(form)||isequal(lower(ext),'.avi')% if the extension corresponds to an image format recognized by Matlab
3762         testima=testima+1;
3763     elseif isequal(ext,'.nc')
3764         testnc=testnc+1;
3765     end
3766end
3767if testvol
3768    msgbox_uvmat('ERROR','volume images not implemented yet')
3769    return
3770end
3771if testnc~=nbview && testima~=nbview && testvol~=nbview
3772    msgbox_uvmat('need a set of images or a set of netcdf files with the same fields as input','ERROR')
3773    return
3774end
3775if ~isequal(FieldName,{'get_field...'})
3776    testcivx=testnc;
3777end
3778
3779% Root name of output files (TO GENERALISE FOR TWO INPUT SERIES)
3780filebasesub=fullfile(RootPath{1},RootFile{1});
3781if NbSlice==1
3782    filebase_out=[filebasesub '_time'];
3783else
3784    filebase_out=[filebasesub '_' NbSlice_name 'mtim'];
3785    increment=num_i1{1}(2)-num_i1{1}(1);
3786    if ~isequal(increment,1) % if an increment is set
3787        answeryes=msgbox_uvmat('INPUT_Y-N',['will take time series in ' num2str(NbSlice) 'slices with increment = ' num2str(increment) '!']);
3788    else   
3789        answeryes=msgbox_uvmat('INPUT_Y-N',{['will take time series in ' num2str(NbSlice) ' slices'];['results stored as files ' filebase_out ' ...']});
3790    end
3791    if ~isequal(answeryes,'Yes')
3792        return
3793    end
3794end
3795VelType_str=get(hseries.VelTypeMenu,'String');
3796VelType_val=get(hseries.VelTypeMenu,'Value');
3797VelType{1}=VelType_str{VelType_val};
3798if nbview==2
3799    VelType_str=get(hseries.VelTypeMenu_1,'String');
3800    VelType_val=get(hseries.VelTypeMenu_1,'Value');
3801    VelType{2}=VelType_str{VelType_val};
3802end
3803
3804%Calibration data and timing: read the ImaDoc files
3805mode=''; %default
3806timecell={};
3807XmlData={};
3808itime=0;
3809NbSlice_calib={};
3810for iview=1:nbview%Loop on views
3811    XmlData{iview}=[];%default
3812    filebase{iview}=fullfile(RootPath{iview},RootFile{iview});
3813    if exist([filebase{iview} '.xml'],'file')
3814        [XmlData{iview},error]=imadoc2struct([filebase{iview} '.xml']);
3815        if isfield(XmlData{iview},'Time')
3816            itime=itime+1;
3817            timecell{itime}=XmlData{iview}.Time;
3818        end
3819        if isfield(XmlData{iview},'GeometryCalib') && isfield(XmlData{iview}.GeometryCalib,'SliceCoord')
3820            NbSlice_calib{iview}=size(XmlData{iview}.GeometryCalib.SliceCoord,1);%nbre of slices for Zindex in phys transform
3821            if ~isequal(NbSlice_calib{iview},NbSlice_calib{1})
3822                msgbox_uvmat('WARNING','inconsistent number of Z indices for the field series');
3823            end
3824        end
3825    elseif exist([filebase{iview} '.civ'],'file')
3826        [error,time,TimeUnit,mode,npx,npy,pxcmx,pxcmy]=read_imatext([filebase{iview} '.civ']);
3827        itime=itime+1;
3828        timecell{itime}=time;
3829        XmlData{iview}.Time=time;
3830        GeometryCalib.R=[pxcmx 0 0; 0 pxcmy 0;0 0 0];
3831        GeometryCalib.Tx=0;
3832        GeometryCalib.Ty=0;
3833        GeometryCalib.Tz=1;
3834        GeometryCalib.dpx=1;
3835        GeometryCalib.dpy=1;
3836        GeometryCalib.sx=1;
3837        GeometryCalib.Cx=0;
3838        GeometryCalib.Cy=0;
3839        GeometryCalib.f=1;
3840        GeometryCalib.kappa1=0;
3841        GeometryCalib.CoordUnit='cm';
3842        XmlData{iview}.GeometryCalib=GeometryCalib;
3843        if error==1
3844            msgbox_uvmat('WARNING','inconsistent number of fields in the .civ file');
3845        end
3846    end
3847end
3848
3849%check coincidence in time
3850multitime=0;
3851if length(timecell)==0
3852    time=[];
3853elseif length(timecell)==1
3854    time=timecell{1};
3855elseif length(timecell)>1
3856    multitime=1;
3857    for icell=1:length(timecell)
3858        if ~isequal(size(timecell{icell}),size(timecell{1}))
3859            warndlg_uvmat('inconsistent time array dimensions in ImaDoc fields, the time for the first series is used','WARNING')
3860            time=timecell{1};
3861            multitime=0;
3862            break
3863        end
3864    end
3865end
3866if multitime
3867    for icell=1:length(timecell)
3868        time(icell,:,:)=timecell{icell};
3869    end
3870    diff_time=max(max(diff(time)));
3871    if diff_time>0
3872        warndlg_uvmat(['times of series differ by more than ' num2str(diff_time)],'WARNING')
3873    end   
3874end
3875if size(time,2) < num_i2{1}(end) || size(time,3) < num_j2{1}(end)% ime array absent or too short in ImaDoc xml file'
3876    time=[];
3877end
3878
3879% image or scalar processing programme set by user
3880Coord_menu=get(hseries.CoordType,'String');
3881menu_val=get(hseries.CoordType,'Value');
3882usrfct=Coord_menu{menu_val};
3883testfct=~isequal(usrfct,'');
3884
3885% to update:
3886VelType_str=get(hseries.VelTypeMenu,'String');
3887VelType_val=get(hseries.VelTypeMenu,'Value');
3888VelType{1}=VelType_str{VelType_val};
3889if nbview==2
3890    VelType_str=get(hseries.VelTypeMenu_1,'String');
3891    VelType_val=get(hseries.VelTypeMenu_1,'Value');
3892    VelType{2}=VelType_str{VelType_val};
3893end
3894
3895%LOOP ON SLICES
3896for i_slice=1:NbSlice
3897     dt=[];
3898     nbmissing=0; %number of undetected files
3899     nbfiles=0;
3900    %%%%%%%%%%%%%%%%%%%%%%%%%%%%LOOP ON FIELDS IN  A SLICE
3901    for ifile=i_slice:NbSlice:nbfield 
3902        stopstate=get(hseries.RUN,'BusyAction');
3903        if isequal(stopstate,'queue')% enable STOP command
3904             update_waitbar(hseries.waitbar,WaitbarPos,ifile/nbfield)
3905             for iview=1:nbview
3906                filename=...
3907                           name_generator(filebase{iview},num_i1{iview}(ifile),num_j1{iview}(ifile),FileExt{iview},NomType{iview},1,num_i2{iview}(ifile),num_j2{iview}(ifile),SubDir{iview});
3908                idetect(iview)=exist(filename,'file');
3909                Data{iview}=[]; %default     
3910                if testima                 
3911                    Data{iview}.ListVarName={'A'};
3912                    Data{iview}.AName='image';
3913                    if test_movie(iview)
3914                        A=read(MovieObject{iview},num_i1{iview}(ifile));
3915                    else
3916                        A=double(read_image(filename,NomType{iview},num_i1{iview}(ifile)));% read the image, num2 is the counter for avi files
3917                    end
3918                    Data{iview}.ListVarName={'coord_y','coord_x','A'}; %
3919                    npy=size(A,1);
3920                    npx=size(A,2);
3921                    nbcolor=size(A,3);
3922                    if nbcolor==3
3923                         Data{iview}.VarDimName={'coord_y','coord_x',{'coord_y','coord_x','rgb'}};
3924                    else
3925                         Data{iview}.VarDimName={'coord_y','coord_x',{'coord_y','coord_x'}};
3926                    end 
3927                    Data{iview}.coord_y=[npy-0.5 0.5];
3928                    Data{iview}.coord_x=[0.5 npx-0.5];
3929                    Data{iview}.A=A;
3930                    Data{iview}.CoordType='px';
3931                elseif testcivx
3932                    [Data{iview},VelTypeOut]=read_civxdata(filename,FieldName,VelType);
3933                else
3934                    [Data{iview},var_detect]=nc2struct(filename,SubField.ListVarName); %read the corresponding input data               
3935                    Data{iview}.VarAttribute=SubField.VarAttribute;
3936                end
3937                if ~isempty(NbSlice_calib)  % z index
3938                    Data{iview}.ZIndex=mod(num_i1{iview}(ifile)-1,NbSlice_calib{1})+1;
3939                end
3940             end
3941            % geometry transform or other user defined transform
3942            if ~isequal(Series.CoordType,'')           
3943                if nbview==2
3944                    [Data{1},Data{2}]=feval(Series.CoordType,Data{1},XmlData{1},Data{2},XmlData{2});
3945                    if isempty(Data{2})
3946                        Data(2)=[];
3947                    end
3948                else
3949                    Data{1}=feval(Series.CoordType,Data{1},XmlData{1});
3950                end
3951            end
3952            if testcivx
3953                    Data{iview}=calc_field(FieldName,Data{iview});%calculate field (vort..)
3954            end
3955            if length(Data)==2
3956                [Field,errormsg]=sub_field(Data{1},Data{2}); %substract the two fields
3957                if ~isempty(errormsg)
3958                    msgbox_uvmat('ERROR',['error in time_series/sub_field:' errormsg])
3959                    return
3960                end
3961            else
3962                Field=Data{1};
3963            end
3964            if isfield(Series,'ProjObject')
3965                Series.ProjObject
3966                [Field,errormsg]=proj_field(Field,Series.ProjObject);
3967                if ~isempty(errormsg)
3968                    msgbox_uvmat('ERROR',['error in time_series/proj_field:' errormsg])
3969                    return
3970                end
3971            end
3972            if min(idetect)>=1% the input file(s) have been detected         
3973                nbfiles=nbfiles+1;
3974                if nbfiles==1 %first field: initiate the time series
3975                    RecordData=Field;%default
3976                    RecordData.NbDim=Field.NbDim+1; %add the time dimension for plots         
3977                    nbvar=length(Field.ListVarName);
3978                    if nbvar==0
3979                        msgbox_uvmat('ERROR','no input variable selected in get_field')
3980                        return
3981                    end
3982                    testsum=2*ones(1,nbvar);%initiate flag for action on each variable
3983                    indexfalse=0;
3984                    CoordName={};
3985                    indexremove=[];
3986                    if isfield(Field,'VarAttribute') % look for coordinate and flag variables   
3987                        for ivar=1:nbvar
3988                            if length(Field.VarAttribute)>=ivar && isfield(Field.VarAttribute{ivar},'Role')
3989                                var_role=Field.VarAttribute{ivar}.Role;%'role' of the variable
3990                                if isequal(var_role,'errorflag')
3991                                    msgbox_uvmat('ERROR','do not handle error flags in time series')
3992                                    return                                               
3993                                end
3994                                if isequal(var_role,'warnflag')                       
3995                                    testsum(ivar)=0;  % not recorded variable
3996                                    eval(['RecordData=rmfield(RecordData,''' Field.ListVarName{ivar} ''');']);%remove variable
3997                                end                 
3998                                if isequal(var_role,'coord_x')| isequal(var_role,'coord_y')|...
3999                                    isequal(var_role,'coord_z')|isequal(var_role,'coord')
4000                                    testsum(ivar)=1; %constant coordinates, record without time evolution
4001                                end
4002                                % check whether the variable ivar is a dimension variable
4003                                %index=Field.VarDimIndex{ivar};%dimension indices of the variable #ivar
4004                                DimCell=Field.VarDimName{ivar};
4005                                if ischar(DimCell)
4006                                    DimCell={DimCell};
4007                                end
4008                                if numel(DimCell)==1 && isequal(Field.ListVarName{ivar},DimCell{1})%detect dimension variables
4009                                   testsum(ivar)=1;
4010                                end
4011                            end
4012                        end
4013                    end
4014                    for ivar=1:nbvar
4015                        if testsum(ivar)==2                     
4016                            eval(['RecordData.' Field.ListVarName{ivar} '=[];'])
4017                        end
4018                    end
4019                    RecordData.ListVarName=[{'Time'} RecordData.ListVarName];
4020                end
4021                for ivar=1:length(Field.ListVarName)
4022                    VarName=Field.ListVarName{ivar};
4023                    eval(['VarVal=Field.' VarName ';']);
4024                    if testsum(ivar)==2% test for recorded variable
4025                        eval(['VarVal=Field.' VarName ';']);
4026                        if isequal(Series.ProjObject.ProjMode,'inside')% take the average in the domain for 'inside' mode
4027                            if isempty(VarVal)
4028                                msgbox_uvmat('ERROR',['empty result at frame index ' num2str(num_i1{iview}(ifile))])
4029                                return                             
4030                            end
4031                            VarVal=mean(VarVal,1);
4032                        end
4033                        VarVal=shiftdim(VarVal,-1); %shift dimension
4034                        eval(['RecordData.' VarName '=cat(1,RecordData.' VarName ',VarVal);']);%concanete the current field to the time series   
4035                    elseif testsum(ivar)==1% variable representing fixed coordinates
4036                        eval(['VarInit=RecordData.' VarName ';']);
4037                        if ~isequal(VarVal,VarInit)
4038                            msgbox_uvmat('ERROR',['time series requires constant coordinates ' VarName])
4039                            return
4040                        end
4041                    end                 
4042                end
4043                % time:
4044                if isempty(time)% time read in ncfiles
4045                   if isfield(Field,'Time')
4046                       RecordData.Time(nbfiles,1)=Field.Time;
4047                   else
4048                       RecordData.Time(nbfiles,1)=nbfiles;%default
4049                   end
4050                else % time from ImaDoc prevails
4051                    RecordData.Time(nbfiles,1)=(time(1,num_i1{1}(ifile),num_j1{1}(ifile))+time(end,num_i2{end}(ifile),num_j2{end}(ifile)))/2;
4052                end
4053            else
4054                nbmissing=nbmissing+1;
4055            end
4056        end
4057    end
4058    %remove time for global attributes if exists
4059    for iattr=1:numel(RecordData.ListGlobalAttribute)
4060        if strcmp(RecordData.ListGlobalAttribute{iattr},'Time')
4061            RecordData.ListGlobalAttribute(iattr)=[];
4062            break
4063        end
4064    end
4065    for ivar=1:numel(RecordData.ListVarName)
4066        VarName=RecordData.ListVarName{ivar};
4067        eval(['RecordData.' VarName '=squeeze(RecordData.' VarName ');']) %remove singletons
4068    end
4069        % add time dimension and update VarDimIndex:
4070   %if ~isequal(Series.ProjObject.ProjMode,'inside')% take the average in the domain for 'inside' mode
4071        for ivar=1:length(Field.ListVarName)
4072%              vardimindex=Field.VarDimIndex{ivar};% array of dimension indices for variable VarIndex(ivar)
4073             DimCell=Field.VarDimName(ivar);
4074             if testsum(ivar)==2%variable used as time series
4075%                  RecordData.VarDimIndex{ivar}=[1 vardimindex+1];
4076                  RecordData.VarDimName{ivar}=[{'Time'} DimCell];
4077             elseif testsum(ivar)==1
4078%                  RecordData.VarDimIndex{ivar}=[vardimindex+1];
4079                 RecordData.VarDimName{ivar}=DimCell;
4080             end
4081        end
4082   % end
4083    indexremove=find(~testsum);
4084    if ~isempty(indexremove)
4085        RecordData.ListVarName(1+indexremove)=[];
4086        RecordData.VarDimName(indexremove)=[];
4087        if isfield(RecordData,'Role')&~isempty(RecordData.Role{1})%generaliser aus autres attributs
4088            RecordData.Role(1+indexremove)=[];
4089        end
4090    end
4091    %RecordData.VarDimIndex=[{[1]} RecordData.VarDimIndex]; %time dimension
4092    %shift variable attributes
4093    if isfield(RecordData,'VarAttribute')
4094        RecordData.VarAttribute=[{[]} RecordData.VarAttribute];
4095    end
4096    RecordData.VarDimName=[{'Time'} RecordData.VarDimName];
4097    RecordData.Action=Series.Action;%name of the processing programme
4098    %name of result file
4099    [filemean]=...
4100               name_generator(filebase_out,num_i1{1}(i_slice),num_j1{1}(i_slice),'.nc','_i1-i2_j1-j2',1,num_i2{end}(ifile),num_j2{end}(ifile),SubDir{1});
4101    errormsg=struct2nc(filemean,RecordData); %save result file
4102    if isempty(errormsg)
4103        display([filemean ' written'])
4104    else
4105        msgbox_uvmat('ERROR',['error in Series/struct2nc' errormsg])
4106    end
4107end
4108figure
4109haxes=axes;
4110
4111plot_field(RecordData,haxes)
4112hget_field=findobj(allchild(0),'name','get_field');
4113if ~isempty(hget_field)
4114    delete(hget_field)
4115end
4116get_field(filemean,RecordData)
4117   
4118%-----------------------------------------------------------------------
4119% --- Executes on selection change in CoordType.
4120function CoordType_Callback(hObject, eventdata, handles)
4121menu_str=get(handles.CoordType,'String');
4122ind_coord=get(handles.CoordType,'Value');
4123coord_option=menu_str{ind_coord};
4124if isequal(coord_option,'more...');
4125    fct_name='';
4126    if exist('./TMP/current_usr_fct.mat','file')% if a file is found
4127        h=load('./TMP/current_usr_fct.mat');
4128        if isfield(h,'fct_name');
4129            fct_name=h.fct_name;
4130        end
4131    end
4132    prompt = {'Enter the name of the transform function'};
4133    dlg_title = 'user defined transform';
4134    num_lines= 1;
4135    [FileName, PathName, filterindex] = uigetfile( ...
4136       {'*.m', ' (*.m)';
4137        '*.m',  '.m files '; ...
4138        '*.*', 'All Files (*.*)'}, ...
4139        'Pick a file', fct_name);
4140    fct_name=fullfile(PathName,FileName);
4141    addpath(PathName);%add the path to the selected fct
4142    [errormsg,date_str]=check_functions;%check whether new functions can oversed the uvmat package A UTILISER
4143    if ~exist(fct_name,'file')
4144           warndlg(['image procesing fct ' fct_name ' not found'])
4145    else
4146        transform=FileName(1:end-2);%
4147        update_menu(handles.CoordType,transform)%add the selected fct to the menu
4148  %      set(handles.mouse_coord,'String',menu([1:end-1])')%update the mouse coord menu
4149      %save ('./TMP/current_usr_fct.mat','fct_name');
4150    end   
4151end
4152ind_coord=get(handles.CoordType,'Value');   
4153
4154%---------------------------------------------------------------------
4155% --- Executes on selection change in ProjObject.
4156function ProjObject_Callback(hObject, eventdata, handles)
4157
4158list_object=get(handles.ProjObject,'String');
4159index=get(handles.ProjObject,'Value');
4160hseries=get(handles.ProjObject,'Parent');
4161SeriesData=get(hseries,'UserData');
4162Obj=SeriesData.ProjObject{index};
4163[SeriesData.hset_object,SeriesData.sethandles]=set_object(SeriesData.ProjObject{index});
4164set(hseries,'UserData',SeriesData);
4165
4166%-------------------------------------------------------------
4167%generates a series of file names with reference numbers between range1 and
4168%range2 with increment incr. The reference number num_ref is the image number at the middle of the
4169%image pair. The set of first numbers num1 of the image pairs is also
4170%given as output
4171%------------------------------------------------------
4172function [num_i1,num_i2,num_j1,num_j2,nbmissing]=netseries_generator(filebase,subdir,mode,first_i,incr_i,last_i,first_j,incr_j,last_j)
4173[Path,Name]=fileparts(filebase);
4174filebasesub=fullfile(Path,subdir,Name);
4175filecell={};%default
4176num_i1=[];
4177num_i2=[];
4178num_j1=[];
4179num_j2=[];
4180ind0_i=first_i:incr_i:last_i;
4181nbcolumn=length(ind0_i);
4182ind0_j=first_j:incr_j:last_j;
4183nbline=length(ind0_j);
4184if isequal(mode,'#_ab')
4185    dirpair=dir([filebasesub '*_*.nc']);
4186elseif isequal(mode,'bursts')|isequal(mode,'series(Dj)') 
4187    dirpair=dir([filebasesub '_*_*-*.nc']);
4188elseif isequal(mode,'series(Di)')
4189    dirpair=dir([filebasesub '_*-*_*.nc']);
4190else
4191    errordlg('option *|* not yet implemented')
4192    return
4193end
4194if isempty(dirpair)
4195        errordlg('no pair detected in the selected range')
4196        return
4197end
4198    %ind0_i=first_i:incr_i:last_i;
4199    %nbcolumn=length(ind0_i);
4200    %dirpair=dir([filebasesub '_*_*-*.nc']);
4201if isequal(mode,'bursts')|isequal(mode,'#_ab')
4202    icount=0;
4203    for ifile=1:length(dirpair)
4204        [RootPath,RootFile,str_1,str_2,str_a,str_b,ext,nom_type]=name2display(dirpair(ifile).name);
4205       
4206%         if isempty(str2num(str_1))
4207%             dirpair(ifile).name
4208%         end
4209        num1_r=str2num(str_1);
4210        if isequal(RootFile,Name) & ~isempty(num1_r)   
4211            num_i1(ifile)=num1_r;
4212            num_a(ifile)=stra2num(str_a);
4213            num_b(ifile)=stra2num(str_b);
4214%             icount=icount+1;
4215        end     
4216    end
4217    length(dirpair)
4218%     num_j=floor((num_a+num_b)/2); %list of reference indices of the detected files
4219    test_range= (num_i1 >=first_i)&(num_i1<= last_i);% =1 when both numbers are in the range
4220    ind_i=((num_i1-first_i)/incr_i)+1;%indices i in the list of prescribed file indices
4221    select=find(test_range &(floor(ind_i)==ind_i));%selected indices of num_i1 in the file directory
4222    ind_i=ind_i(select);%set of selected indices ind_i
4223    [ind_i,indsort]=sort(ind_i);%sorted list of ind_i
4224    select=select(indsort);
4225    num_i1=num_i1(select);
4226    num_a=num_a(select);
4227    num_b=num_b(select);
4228    dirpair=dirpair(select);
4229    [ind_remove]=find_pairs(dirpair,ind_i,nbcolumn);
4230    ind_i(ind_remove)=[];
4231    num_a(ind_remove)=[];
4232    num_b(ind_remove)=[];
4233    num_j1=zeros(1,nbcolumn);%default
4234    num_j2=num_j1;
4235    num_j1(ind_i)=num_a;
4236    num_j2(ind_i)=num_b;
4237    num_i1=first_i:incr_i:last_i;
4238    num_i2=num_i1;
4239    nbmissing=nbcolumn-length(ind_i);
4240
4241elseif isequal(mode,'series(Di)')
4242    %ind0_i=first_i:incr_i:last_i;
4243    %nbcolumn=length(ind0_i);
4244    %ind0_j=first_j:incr_j:last_j;
4245    %nbline=length(ind0_j);
4246    %dirpair=dir([filebasesub '_*-*_*.nc']);
4247    for ifile=1:length(dirpair)
4248        [RootPath,RootFile,str_1,str_2,str_a,str_b,ext,nom_type]=name2display(dirpair(ifile).name);
4249        num_i1_r(ifile)=str2num(str_1);
4250        num_i2_r(ifile)=str2num(str_2);
4251        num_j(ifile)=str2num(str_a);
4252    end
4253    num_i=floor((num_i1_r+num_i2_r)/2); %list of reference indices of the detected files
4254    test_range= (num_i >=first_i)&(num_i<= last_i)&(num_j >=first_j)&(num_j<= last_j);% =1 when both numbers are in the range
4255    ind_i=((num_i-first_i)/incr_i)+1;%indices i and j in the list of prescribed file indices
4256    ind_j=((num_j-first_j)/incr_j)+1;
4257    ind_ij=ind_j+nbline*(ind_i-1);%indices in the reshhaped series of prescribed file indices
4258    select=find(test_range &(floor(ind_i)==ind_i)&(floor(ind_j)==ind_j));%selected indices in the file directory
4259    ind_ij=ind_ij(select);%set of selected indices ind_ij
4260    [ind_ij,indsort]=sort(ind_ij);%sorted list of ind_ij
4261    select=select(indsort);
4262    num_i1_r=num_i1_r(select);
4263    num_i2_r=num_i2_r(select);
4264%     num_j=num_j(select);
4265    dirpair=dirpair(select);
4266    [ind_remove]=find_pairs(dirpair,ind_ij,nbcolumn*nbline) ;
4267    ind_ij(ind_remove)=[];
4268    num_i1_r(ind_remove)=[];
4269    num_i2_r(ind_remove)=[];
4270    num_i1=zeros(1,nbline*nbcolumn);%default
4271    num_i2=num_i1;
4272    num_i1(ind_ij)=num_i1_r;
4273    num_j2(ind_ij)=num_i2_r;
4274    num_i1=reshape(num_i1,nbline,nbcolumn);
4275    num_i2=reshape(num_i2,nbline,nbcolumn);
4276    num_j1=meshgrid(ind0_i,ind0_j);
4277    num_j2=num_j1;
4278    nbmissing=nbline*nbcolumn-length(ind_ij);
4279elseif isequal(mode,'series(Dj)')
4280 %   ind0_i=first_i:incr_i:last_i;
4281 %   nbcolumn=length(ind0_i);
4282 %   ind0_j=first_j:incr_j:last_j;
4283  %  nbline=length(ind0_j);
4284  %  dirpair=dir([filebasesub '_*_*-*.nc']);
4285    for ifile=1:length(dirpair)
4286        [RootPath,RootFile,str_1,str_2,str_a,str_b,ext,nom_type]=name2display(dirpair(ifile).name);
4287        num_i(ifile)=str2num(str_1);
4288        num_a(ifile)=str2num(str_a);
4289        num_b(ifile)=str2num(str_b);
4290    end
4291    num_j=floor((num_a+num_b)/2); %list of reference indices of the detected files
4292    test_range= (num_i >=first_i)&(num_i<= last_i)&(num_j >=first_j)&(num_j<= last_j);% =1 when both numbers are in the range
4293    ind_i=((num_i-first_i)/incr_i)+1;%indices i and j in the list of prescribed file indices
4294    ind_j=((num_j-first_j)/incr_j)+1;
4295    ind_ij=ind_j+nbline*(ind_i-1);%indices in the reshhaped series of prescribed file indices
4296    select=find(test_range &(floor(ind_i)==ind_i)&(floor(ind_j)==ind_j));%selected indices in the file directory
4297    ind_ij=ind_ij(select);%set of selected indices ind_ij
4298    [ind_ij,indsort]=sort(ind_ij);%sorted list of ind_ij
4299    select=select(indsort);
4300    num_i=num_i(select);
4301    num_a=num_a(select);
4302    num_b=num_b(select);
4303    dirpair=dirpair(select);
4304    [ind_remove]=find_pairs(dirpair,ind_ij,nbcolumn*nbline) ;
4305    ind_ij(ind_remove)=[];
4306    num_a(ind_remove)=[];
4307    num_b(ind_remove)=[];
4308    num_j1=zeros(1,nbline*nbcolumn);%default
4309    num_j2=num_j1;
4310    num_j1(ind_ij)=num_a;
4311    num_j2(ind_ij)=num_b;
4312    num_j1=reshape(num_j1,nbline,nbcolumn);
4313    num_j2=reshape(num_j2,nbline,nbcolumn);
4314    num_i1=meshgrid(ind0_i,ind0_j);
4315    num_i2=num_i1;
4316    nbmissing=nbline*nbcolumn-length(ind_ij);
4317%     for i=1:length(indsel);%A SUPPRIMER ULTERIEUREMENT
4318%         if indsel(i)==0
4319%             filecell{i}='';
4320%         else
4321%             Name=dirpair(indsel(i)).name;
4322%             filecell{i}=fullfile(Path,subdir,Name);
4323%         end
4324%     end
4325%else
4326%    errordlg('option *|* not yet implemented')
4327%    return
4328end
4329
4330%%%%%%%%%%%%%
4331function [ind_remove]=find_pairs(dirpair,ind_i,last_i)
4332
4333        indsel=ind_i;
4334        indiff=diff(ind_i); %test index increment to detect multiplets (several pairs with the same index ind_i) and holes in the series
4335        indiff=[1 indiff last_i-ind_i(end)+1];%for testing gaps with the imposed bounds
4336        if ~isempty(indiff)
4337            indiff2=diff(indiff);
4338            indiffp=[indiff2 1];
4339            indiffm=[1 indiff2];
4340            ind_multi_m=find((indiff==0)&(indiffm<0))-1;%indices of first members of multiplets
4341            ind_multi_p=find((indiff==0)&(indiffp>0));%indices of last members of multiplets
4342                %for each multiplet, select the most recent file
4343            ind_remove=[];
4344            for i=1:length(ind_multi_m)
4345                ind_pairs=ind_multi_m(i):ind_multi_p(i);
4346                for imulti=1:length(ind_pairs)
4347                    datepair(imulti)=datenum(dirpair(ind_pairs(imulti)).date);%dates of creation
4348                end
4349                [datenew,indsort2]=sort(datepair); %sort the multiplet by creation date
4350                ind_s=indsort2(1:end-1);%
4351                ind_remove=[ind_remove ind_pairs(ind_s)];%remove these indices, leave the last one
4352            end
4353        end
4354
4355%--------------------------------------------------------
4356
4357 
4358%-----------------------------------------------------------
4359% find the times corresponding to the first and last indices of a series
4360%
4361function displ_time(handles,times)
4362hseries=get(handles.last_i,'parent');
4363SeriesData=get(hseries,'UserData');%
4364first_i=str2num(get(handles.first_i,'String'));
4365first_j=str2num(get(handles.first_j,'String'));
4366last_i=str2num(get(handles.last_i,'String'));
4367last_j=str2num(get(handles.last_j,'String'));
4368% index_civ=get(handles.list_pair_civ,'Value');
4369% NomType=get(handles.NomType,'String');
4370NomType=SeriesData.NomType;
4371mode_list=get(handles.mode,'String');
4372index_mode=get(handles.mode,'Value');
4373mode=mode_list{index_mode};
4374% ind_shift=0;%default
4375
4376time_first=[];
4377time_last=[];
4378if ~isfield(SeriesData,'Time')
4379    SeriesData.Time{1}=[];
4380end
4381for iview=1:length(NomType)
4382    time_first_cell{iview}='?';
4383    time_last_cell{iview}='?';%default
4384    time=SeriesData.Time{iview};
4385    if isequal(NomType{iview},'_i1-i2_j')|isequal(NomType{iview},'_i_j1-j2')|isequal(NomType{iview},'#_ab')|isequal(NomType{iview},'_i1-i2')
4386        if isfield(SeriesData,'displ_num')& ~isempty(SeriesData.displ_num)
4387            ind_shift=SeriesData.displ_num(iview,:);
4388            if isequal(mode,'bursts')
4389                first_j=0;
4390                last_j=0;
4391            end
4392            first_i1=first_i +ind_shift(3);
4393            first_i2 =first_i +ind_shift(4);
4394            first_j1 =first_j +ind_shift(1);
4395            first_j2 =first_j +ind_shift(2);
4396            last_i1=last_i +ind_shift(3);
4397            last_i2 =last_i +ind_shift(4);   
4398            last_j1 =last_j +ind_shift(1);
4399            last_j2 =last_j +ind_shift(2);
4400            siz=size(SeriesData.Time{1});
4401            if first_i1>=1 && first_j1
4402                >=1 && siz(1)>=last_i2 && siz(2)>=last_j2
4403                time_first=(time(first_i1,first_j1)+time(first_i2,first_j2))/2;
4404                time_last=(time(last_i1,last_j1)+time(last_i2,last_j2))/2;
4405            else%read the time in the nc files
4406                RootPath=get(handles.RootPath,'String');
4407                RootFile=get(handles.RootFile,'String');
4408                SubDir=get(handles.SubDir,'String');
4409                %VelType=get(handles.VelType,'String');
4410                VelType_str=get(handles.VelTypeMenu,'String');
4411                VelType_val=get(handles.VelTypeMenu,'Value');
4412                VelType=VelType_str{VelType_val};
4413                filebase=fullfile(RootPath{1},RootFile{1});
4414                [filefirst]=name_generator(filebase,first_i1,first_j1,'.nc',NomType{iview},1,first_i2,first_j2,SubDir{iview});
4415                if  exist(filefirst,'file')
4416                    Attrib=nc2struct(filefirst,[]);
4417                    if isfield(Attrib,'Time')
4418                        time_first=Attrib.Time;
4419                    else
4420                        if isfield(Attrib,'absolut_time_T0')
4421                            time_first=Attrib.absolut_time_T0;
4422                        end
4423                        if isfield(Attrib,'absolut_time_T0_2')&&~(isequal(VelType,'civ1')||isequal(VelType,'interp1')||isequal(VelType,'filter1'))
4424                            time_first=Attrib.absolut_time_T0_2;
4425                        end
4426                    end
4427                end
4428                [filelast]=name_generator(filebase,last_i1,last_j1,'.nc',NomType{iview},1,last_i2,last_j2,SubDir{iview});
4429                if exist(filelast,'file')
4430                   Attrib=nc2struct(filelast,[]);
4431                    if isfield(Attrib,'Time')
4432                        time_last=Attrib.Time;
4433                    else
4434                        if isfield(Attrib,'absolut_time_T0')
4435                            time_last=Attrib.absolut_time_T0;
4436                        end
4437                        if isfield(Attrib,'absolut_time_T0_2')&&~(isequal(VelType,'civ1')||isequal(VelType,'interp1')||isequal(VelType,'filter1'))
4438                            time_last=Attrib.absolut_time_T0_2;
4439                        end
4440                    end
4441                end
4442            end
4443        end
4444    else
4445        siz=size(times);
4446        if siz(1)>=last_i & siz(2)>=last_j
4447            time_first=times(first_i,first_j);
4448            time_last=times(last_i,last_j);
4449        end
4450    end
4451    time_first_cell{iview}=num2str(time_first,4);
4452    time_last_cell{iview}=num2str(time_last,4);
4453end
4454set(handles.time_first,'Value',1)
4455set(handles.time_last,'Value',1)
4456set(handles.time_first,'String',time_first_cell);
4457set(handles.time_last,'String',time_last_cell);
4458
4459%--------------------------------------------------------------------
4460% --- Executes on selection change in VelTypeMenu.
4461function VelTypeMenu_Callback(hObject, eventdata, handles)
4462% VelTypeList=get(handles.VelTypeMenu,'String');
4463% VelTypeIndex=get(handles.VelTypeMenu,'Value');
4464% VelTypeCell=get(handles.VelType,'String');
4465% VelTypeCell{1}=VelTypeList{VelTypeIndex};
4466% set(handles.VelType,'String',VelTypeCell)
4467
4468
4469%--------------------------------------------------------------------
4470% --- Executes on button press in GetObject.
4471function GetObject_Callback(hObject, eventdata, handles)
4472hseries=get(handles.GetObject,'parent');
4473SeriesData=get(hseries,'UserData');
4474value=get(handles.GetObject,'Value');
4475if value
4476     set(handles.GetObject,'BackgroundColor',[1 1 0])%put unactivated buttons to yellow
4477     DataInit.ParentButton=handles.GetObject;
4478     hset_object=findobj(allchild(0),'Name','set_object');%find the set_object interface handle
4479     if ishandle(hset_object)
4480         [SeriesData.hset_object,SeriesData.sethandles]=set_object(DataInit); %open the set_object interface
4481     else
4482         DataInit.TITLE='POINTS';%default option
4483         [SeriesData.hset_object,SeriesData.sethandles]=set_object(DataInit); %open the set_object interface
4484     end
4485else
4486    set(handles.GetObject,'BackgroundColor',[0 1 0])%put activated buttons to green
4487    if isfield(SeriesData,'hset_object')&& ishandle(SeriesData.hset_object)
4488        close(SeriesData.hset_object)
4489    end
4490end
4491set(hseries,'UserData',SeriesData)
4492
4493%--------------------------------------------------------------
4494function GetMask_Callback(hObject, eventdata, handles)
4495value=get(handles.GetMask,'Value');
4496if value
4497    errordlg('not implemented yet')
4498end
4499%--------------------------------------------------------------
4500
4501%--------------------------------------------------------------------------
4502%'uv_ncbrowser': interactively calls the netcdf file browser 'get_field.m'
4503function ncbrowser_uvmat(hObject, eventdata)
4504     bla=get(gcbo,'String');
4505     ind=get(gcbo,'Value');
4506     filename=cell2mat(bla(ind));
4507      blank=find(filename==' ');
4508      filename=filename(1:blank-1);
4509     get_field(filename)
4510
4511
4512
4513% --------------------------------------------------------------------
4514function MenuHelp_Callback(hObject, eventdata, handles)
4515
4516path_to_uvmat=which ('uvmat');% check the path of uvmat
4517pathelp=fileparts(path_to_uvmat);
4518helpfile=fullfile(pathelp,'UVMAT_DOC','uvmat_doc.html');
4519if isempty(dir(helpfile)), errordlg('Please put the help file uvmat_doc.html in the  directory UVMAT/UVMAT_DOC')
4520else
4521web([helpfile '#series'])   
4522end
4523
4524
4525
4526
4527
4528
Note: See TracBrowser for help on using the repository browser.