source: trunk/src/series/merge_proj.m @ 89

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

many bug corrections and cleaning. Activation of the BW option in uvmat. Improvement of the interaction of get_field with uvmat.

File size: 17.0 KB
Line 
1function GUI_input=merge_proj(num_i1,num_i2,num_j1,num_j2,Series)
2
3%requests for the visibility of input windows in the GUI series  (activated directly by the selection in the menu ACTION)
4if ~exist('num_i1','var')
5    GUI_input={'RootPath';'two';...%nbre of possible input series (options 'on'/'two'/'many', default:'one')
6        'SubDir';'on';... % subdirectory of derived files (PIV fields), ('on' by default)
7        'RootFile';'on';... %root input file name ('on' by default)
8        'FileExt';'on';... %input file extension ('on' by default)
9        'NomType';'on';...%type of file indexing ('on' by default)
10        'NbSlice';'on'; ...%nbre of slices ('off' by default)
11        'VelTypeMenu';'one';...% menu for selecting the velocity type (civ1,..) options 'off'/'one'/'two', 'off' by default)
12        'FieldMenu';'one';...% menu for selecting the field (s) in the input file(options 'off'/'one'/'two', 'off' by default)
13        'CoordType';'on';...%can use a transform function 'off' by default
14        'GetObject';'on';...%can use projection object ,'off' by default
15        %'GetMask';'on'...%can use mask option   ,'off' by default
16        %'PARAMETER'; options: name of the user defined parameter',repeat a line for each parameter
17               ''};
18    return %exit the function
19end
20
21%-------------------------------------------------
22hseries=guidata(Series.hseries);%handles of the GUI series
23WaitbarPos=get(hseries.waitbar_frame,'Position'); %positiopn of waitbar frame
24%-------------------------------------------------
25
26%projection object
27test_object=get(hseries.GetObject,'Value');
28if test_object
29    hset_object=findobj(allchild(0),'tag','set_object');
30    ProjObject=read_set_object(guidata(hset_object));
31    if ~isfield(ProjObject,'Style')
32            msgbox_uvmat('ERROR','Undefined projection object style')
33            return
34    end
35    if ~isequal(ProjObject.Style,'plane')
36            msgbox_uvmat('ERROR','The projection object must be a plane')
37            return
38    end
39    %answeryes=questdlg({['field series projected on ' Series.ProjObject.Style]});
40    answeryes=msgbox_uvmat('INPUT_Y-N',['field series projected on ' ProjObject.Style]);
41    if ~isequal(answeryes,'Yes')
42        return
43    end
44end
45
46%numbers of view fields (nbre of inputs in RootPath)
47testcell=iscell(Series.RootFile);
48if ~testcell
49    Series.RootPath={Series.RootPath};
50    Series.RootFile={Series.RootFile};
51    Series.SubDir={Series.SubDir};
52    Series.FileExt={Series.FileExt};
53    Series.NomType={Series.NomType};
54    num_i1={num_i1};
55    num_i2={num_i2};
56    num_j1={num_j1};
57    num_j2={num_j2};
58end
59nbview=length(Series.RootFile);%number of views (file series to merge)
60nbfield=size(num_i1{1},1)*size(num_i1{1},2);%number of fields in the time series
61transform=Series.CoordType; %  field transform function
62hhh=which('mmreader');
63for iview=1:nbview
64    test_movie(iview)=0;
65    if ~isequal(hhh,'')&& mmreader.isPlatformSupported()
66        if isequal(lower(FileExt{iview}),'.avi')
67            MovieObject{iview}=mmreader(fullfile(Series.RootPath{iview},[Series.RootFile{iview} Series.FileExt{iview}]));
68            test_movie(iview)=1;
69        end
70    end
71end
72
73%Calibration data and timing: read the ImaDoc files
74mode=''; %default
75timecell={};
76itime=0;
77NbSlice_calib={}; %test for z index
78for iview=1:nbview%Loop on views
79    XmlData{iview}=[];%default
80    filebase{iview}=fullfile(Series.RootPath{iview},Series.RootFile{iview});
81    if exist([filebase{iview} '.xml'],'file')
82        [XmlData{iview},error]=imadoc2struct([filebase{iview} '.xml']);
83        if isfield(XmlData{iview},'Time')
84            itime=itime+1;
85            timecell{itime}=XmlData{iview}.Time;
86        end
87        if isfield(XmlData{iview},'GeometryCalib') && isfield(XmlData{iview}.GeometryCalib,'SliceCoord')
88            NbSlice_calib{iview}=size(XmlData{iview}.GeometryCalib.SliceCoord,1);
89            if ~isequal(NbSlice_calib{iview},NbSlice_calib{1})
90                msgbox_uvmat('WARNING','inconsistent number of Z indices for the two field series');
91            end
92        end   
93    elseif exist([filebase{iview} '.civ'],'file')
94        [error,time,TimeUnit,mode,npx,npy,pxcmx,pxcmy]=read_imatext([filebase{iview} '.civ']);
95        itime=itime+1;
96        timecell{itime}=time;
97        XmlData{iview}.Time=time;
98        GeometryCalib.R=[pxcmx 0 0; 0 pxcmy 0;0 0 0];
99        GeometryCalib.Tx=0;
100        GeometryCalib.Ty=0;
101        GeometryCalib.Tz=1;
102        GeometryCalib.dpx=1;
103        GeometryCalib.dpy=1;
104        GeometryCalib.sx=1;
105        GeometryCalib.Cx=0;
106        GeometryCalib.Cy=0;
107        GeometryCalib.f=1;
108        GeometryCalib.kappa1=0;
109        GeometryCalib.CoordUnit='cm';
110        XmlData{iview}.GeometryCalib=GeometryCalib;
111        if error==1
112            msgbox_uvmat('WARNING','inconsistent number of fields in the .civ file');
113        end
114    end
115end
116
117%check coincidence in time
118multitime=0;
119if isempty(timecell)
120    time=[];
121elseif length(timecell)==1
122    time=timecell{1};
123elseif length(timecell)>1
124    multitime=1;
125    for icell=1:length(timecell)
126        if ~isequal(size(timecell{icell}),size(timecell{1}))
127            msgbox_uvmat('WARNING','inconsistent time array dimensions in ImaDoc fields, the time for the first series is used')
128            time=timecell{1};
129            multitime=0;
130            break
131        end
132    end
133end
134if multitime
135    for icell=1:length(timecell)
136        time(icell,:,:)=timecell{icell};
137    end
138    diff_time=max(max(diff(time)));
139    if diff_time>0
140        msgbox_uvmat('WARNING',['times of series differ by more than ' num2str(diff_time)])
141    end   
142end
143if size(time,2) < num_i2{1}(end) || size(time,3) < num_j2{1}(end)% ime array absent or too short in ImaDoc xml file'
144    time=[];
145end
146
147% coordinate transform or other user defined transform
148transform_fct=[];%default
149if isfield(Series,'transform_fct')
150    transform_fct=Series.transform_fct;
151end
152
153% Field and velocity type (the same for all views)
154Field_str=get(hseries.FieldMenu,'String');
155val=get(hseries.FieldMenu,'Value');
156FieldName=Field_str(val);%the same set of fields for all views
157VelType_str=get(hseries.VelTypeMenu,'String');
158VelType_val=get(hseries.VelTypeMenu,'Value');
159VelType=VelType_str{VelType_val}; %the same for all views
160if isequal(FieldName,'get_field...')
161    hget_field=findobj(allchild(0),'Name','get_field');%find the get_field... GUI
162    SubField=get_field('read_get_field',hObject,eventdata,hget_field); %read the names of the variables to plot in the get_field GUI
163end
164%detect whether all the files are 'images' or 'netcdf'
165testima=0;
166testvol=0;
167testcivx=0;
168testnc=0;
169FileExt=get(hseries.FileExt,'String');
170for iview=1:nbview
171     ext=FileExt{iview};
172     form=imformats(ext(2:end));
173     if isequal(lower(ext),'.vol')
174         testvol=testvol+1;
175     elseif ~isempty(form)||isequal(lower(ext),'.avi')% if the extension corresponds to an image format recognized by Matlab
176         testima=testima+1;
177     elseif isequal(ext,'.nc')
178         testnc=testnc+1;
179     end
180end
181if testvol
182    msgbox_uvmat('ERROR','volume images not implemented yet')
183    return
184end
185if testnc~=nbview && testima~=nbview && testvol~=nbview
186    msgbox_uvmat('ERROR','need a set of images or a set of netcdf files with the same fields as input')
187    return
188end
189if ~isequal(FieldName,'get_field...')
190    testcivx=testnc;
191end
192
193%name of output files and directory:
194% res_subdir=fullfile(Series.RootPath{1},[Series.SubDir{1} '_STAT']);
195ProjectDir=fileparts(fileparts(Series.RootPath{1}));% preoject directory (GERK)
196prompt={['result directory (in' ProjectDir ')']};
197RootPath=get(hseries.RootPath,'String');
198SubDir=get(hseries.SubDir,'String');
199if isequal(length(RootPath),1)
200    fulldir=RootPath{1};
201    subdir='merge_proj';
202    res_subdir=fullfile(fulldir,subdir);
203else
204    def={fullfile(ProjectDir,'0_RESULTS')};
205    dlgTitle='result directory';
206    lineNo=1;
207    answer=msgbox_uvmat('INPUT_TXT',dlgTitle,def);
208    fulldir=answer{1};
209    subdir=[];
210    dirlist=sort(Series.RootFile);
211    for iview=1:nbview
212        if ~isempty(subdir)
213            subdir=[subdir '-'];
214        end
215        subdir=[subdir dirlist{iview}];
216    end 
217    res_subdir=fullfile(fulldir,subdir);
218end
219ext=FileExt{1};
220if ~exist(fulldir,'dir')
221    msgbox_uvmat('ERROR',['directory ' fulldir ' needs to be created'])
222    return
223end
224if ~exist(res_subdir,'dir')
225    dircur=pwd;
226    cd(fulldir)
227    error=mkdir(subdir);
228    cd(dircur)
229end
230filebasesub=fullfile(res_subdir,Series.RootFile{1});
231filebase_merge=fullfile(res_subdir,'merged');%root name for the merged files
232
233    %MAIN LOOP
234for ifile=1:nbfield               
235    stopstate=get(hseries.RUN,'BusyAction');
236    if isequal(stopstate,'queue')% enable STOP command from the 'series' interface
237         update_waitbar(hseries.waitbar,WaitbarPos,ifile/nbfield)
238         Amerge=0;
239         
240         %----------LOOP ON VIEWS----------------------
241        nbtime=0;
242        for iview=1:nbview
243            %name of the current file
244            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});
245            if ~exist(filename,'file')
246                msgbox_uvmat('ERROR',['missing input file' filename])
247                break
248            end
249
250            %reading the current file
251            if testima
252                if test_movie(iview)
253                    Field{iview}.A=read(MovieObject{iview},num_i1{iview}(ifile));
254                else
255                    Field{iview}.A=imread(filename);
256                end % TODO: introduce ListVarName
257                npxy=size(Field{iview}.A);
258                Field{iview}.AX=[0.5 npxy(2)-0.5]; % coordinates of the first and last pixel centers
259                Field{iview}.AY=[npxy(1)-0.5 0.5];
260                Field{iview}.CoordType='px';
261                Field{iview}.AName='image';
262            else
263                if testcivx
264                    [Field{iview},VelTypeOut]=read_civxdata(filename,FieldName,VelType);
265                else
266                    [Field{iview},var_detect]=nc2struct(filename,SubField.ListVarName); %read the corresponding input data               
267                    Field{iview}.VarAttribute=SubField.VarAttribute;
268                end
269                if isfield(Field{iview},'Time')
270                    timeread(iview)=Field{iview}.Time;
271                    nbtime=nbtime+1;
272                end
273            end
274            % coord transform
275            % z index
276            if ~isempty(NbSlice_calib)
277                Field{iview}.ZIndex=mod(num_i1{iview}(ifile)-1,NbSlice_calib{1})+1;
278            end
279            if ~isempty(transform_fct)
280                Field{iview}=transform_fct(Field{iview},XmlData{iview});%transform to phys if requested
281            end
282            min(Field{iview}.X)
283            if testcivx
284                    Field{iview}=calc_field(FieldName,Field{iview});
285            end
286            min(Field{iview}.X)
287
288            %projection on object (gridded plane)
289            if test_object
290                Field{iview}=proj_field(Field{iview},ProjObject);
291            end
292        end   
293       
294         %----------END LOOP ON VIEWS----------------------
295         
296        %merge the nbview fields
297        MergeData=merge_field(Field);
298        if isfield(MergeData,'Txt')
299            msgbox_uvmat('ERROR',MergeData.Txt)
300            return
301        end
302       
303        % generating the name of the merged field
304        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));
305       
306        % time:
307        time_i=0;%default
308        if isempty(time)% time from ImaDoc prevails
309            time_i=sum(timeread)/nbtime;
310        else
311            time_i=(time(iview,num_i1{iview}(ifile),num_j1{iview}(ifile))+time(iview,num_i2{iview}(ifile),num_j2{iview}(ifile)))/2;
312        end
313       
314        % recording the merged field
315        if testima    %in case of input images an image is produced   
316            if isa(MergeData.A,'uint8')
317                bitdepth=8;
318            elseif isa(MergeData.A,'uint16')
319                bitdepth=16;
320            end
321            imwrite(MergeData.A,mergename,'BitDepth',bitdepth);
322            %write xml calibration file
323            siz=size(MergeData.A);
324            npy=siz(1);
325            npx=siz(2);
326            if isfield(MergeData,'VarAttribute')&&isfield(MergeData.VarAttribute{1},'Coord_2')&&isfield(MergeData.VarAttribute{1},'Coord_1')
327                Rangx=MergeData.VarAttribute{1}.Coord_2;
328                Rangy=MergeData.VarAttribute{1}.Coord_1;
329            elseif isfield(MergeData,'AX')&& isfield(MergeData,'AY')
330                Rangx=[MergeData.AX(1) MergeData.AX(end)];
331                Rangy=[MergeData.AY(1) MergeData.AY(end)];
332            else
333                Rangx=[0.5 npx-0.5];
334                Rangy=[npy-0.5 0.5];%default
335            end
336            pxcmx=(npx-1)/(Rangx(2)-Rangx(1));
337            pxcmy=(npy-1)/(Rangy(1)-Rangy(2));
338            T_x=-pxcmx*Rangx(1)+0.5;
339            T_y=-pxcmy*Rangy(2)+0.5;
340            GeometryCal.focal=1;
341            GeometryCal.R=[pxcmx,0,0;0,pxcmy,0;0,0,1];
342            GeometryCal.Tx_Ty_Tz=[T_x T_y 1];
343            ImaDoc.GeometryCalib=GeometryCal;
344            t=struct2xml(ImaDoc);
345            t=set(t,1,'name','ImaDoc');
346            save(t,[filebase_merge '.xml'])     
347            display([filebase_merge '.xml saved'])
348        else
349            MergeData.ListGlobalAttribute={'Project','InputFile_1','InputFile_end','nb_coord','nb_dim','dt','Time','civ'};       
350            MergeData.nb_coord=2;
351            MergeData.nb_dim=2;
352            MergeData.dt=1;
353            MergeData.Time=time_i;
354            error=struct2nc(mergename,MergeData); %save result file
355            if isempty(error)
356                display(['output file ' mergename ' written'])
357            else
358                display(error)
359            end
360        end
361    end
362end
363
364%--------------------------------------------------------------------------   
365function MergeData=merge_field(Data)
366% initiate Matlab  structure for physical field
367if isempty(Data)||~iscell(Data)
368    MergeData=[];
369    return
370end
371MergeData=Data{1};%default
372error=0;
373nbview=length(Data);
374if nbview==1
375    return
376end
377for iview=1:nbview
378    if ~isequal(MergeData.ListDimName,Data{iview}.ListDimName)
379        error=1;
380    end
381    if ~isequal(MergeData.ListVarName,Data{iview}.ListVarName)
382        error=1;
383    end
384end
385if error
386    MergeData.Txt='ERROR: attempt at merging fields of incompatible type';
387    return
388end
389
390%group the variables (fields of 'FieldData') in cells of variables with the same dimensions
391[CellVarIndex,NbDim,VarTypeCell]=find_field_indices(Data{1});
392%LOOP ON GROUPS OF VARIABLES SHARING THE SAME DIMENSIONS
393% CellVarIndex=cells of variable index arrays
394ivar_new=0; % index of the current variable in the projected field
395icoord=0;
396for icell=1:length(CellVarIndex)
397    if NbDim(icell)==1
398        continue
399    end
400    VarIndex=CellVarIndex{icell};%  indices of the selected variables in the list FieldData.ListVarName
401    VarType=VarTypeCell{icell};
402    ivar_X=VarType.coord_x;
403    ivar_Y=VarType.coord_y;
404    ivar_FF=VarType.errorflag;
405    if isempty(ivar_X)
406        test_grid=1;%test for input data on regular grid (e.g. image)coordinates
407    else
408        if length(ivar_Y)~=1
409                msgbox_uvmat('ERROR','y coordinate missing in proj_field.m')
410                return
411        end
412        test_grid=0;
413    end
414%    DimIndices=Data{1}.VarDimIndex{VarIndex(1)};%indices of the dimensions of the first variable (common to all variables in the cell)
415    %case of input fields with unstructured coordinates
416    if ~test_grid
417        for ivar=VarIndex
418            VarName=MergeData.ListVarName{ivar};
419            for iview=1:nbview
420                eval(['MergeData.' VarName '=[MergeData.' VarName '; Data{iview}.' VarName '];'])
421            end
422        end
423    %case of fields defined on a structured  grid
424    else 
425%        DimValue=MergeData.DimValue(DimIndices);%set of dimension values
426        testFF=0;
427        for iview=2:nbview
428%             if ~isequal(DimValue,Data{iview}.DimValue(DimIndices))
429%                 MergeData.Txt='ERROR: attempt at merging structured fields with different sizes';
430%                 return
431%             end
432            for ivar=VarIndex
433                VarName=MergeData.ListVarName{ivar};
434                if isfield(MergeData,'VarAttribute')
435                    if length(MergeData.VarAttribute)>=ivar && isfield(MergeData.VarAttribute{ivar},'Role') && isequal(MergeData.VarAttribute{ivar}.Role,'errorflag')
436                        testFF=1;
437                    end
438                end
439                eval(['MergeData.' VarName '=MergeData.' VarName '+ Data{iview}.' VarName ';'])
440            end
441        end
442        if testFF
443            nbaver=nbview-MergeData.FF;
444            indgood=find(nbaver>0);
445            for ivar=VarIndex
446                VarName=MergeData.ListVarName{ivar};
447                eval(['MergeData.' VarName '(indgood)=double(MergeData.' VarName '(indgood))./nbaver(indgood);'])
448            end
449        else
450            for ivar=VarIndex
451                VarName=MergeData.ListVarName{ivar};
452                eval(['MergeData.' VarName '=double(MergeData.' VarName ')./nbview;'])
453            end   
454        end
455    end
456end
457   
Note: See TracBrowser for help on using the repository browser.