Changeset 29


Ignore:
Timestamp:
Mar 3, 2010, 10:48:08 AM (14 years ago)
Author:
sommeria
Message:

read_imadoc suppressed (obsolete, replaced by imadoc2struct)
update_imadoc: bug repaired: existing xml file was erased
various cleaning (deals with non existing input file for series and uvmat)

Location:
trunk/src
Files:
2 added
1 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/imadoc2struct.m

    r19 r29  
    2121s.TimeUnit=[]; %default
    2222s.GeometryCalib=[];
    23 nom_type_ima=[];%default
    24 ext_ima=[];%default
     23% nom_type_ima=[];%default
     24% ext_ima=[];%default
    2525% abs_time=[];%initiation
    2626% GeometryCalib.CoordUnit='cm';%default
    27 mode=[]; %default
    28 NbSlice=1;%default
    29 npx=[];%default
    30 npy=[];%default
     27% mode=[]; %default
     28% NbSlice=1;%default
     29% npx=[];%default
     30% npy=[];%default
    3131% GeometryCalib.Pxcmx=1;
    3232% GeometryCalib.Pxcmy=1;
    3333% GeometryCalib=[];
    34 NbDtj=1;
     34% NbDtj=1;
    3535tsai=[];%default
    3636% if ~exist('testime','var')
     
    6464    end
    6565    s.Heading.ImageName=get(t,children(t,uid_FirstImage),'value');
    66     FirstImage=s.Heading.ImageName;
    67     if ~isempty(FirstImage)
    68         [Pathsub,RootFile,field_count,str2,str_a,str_b,ext,nom_type_ima]=name2display(FirstImage);
    69     end
     66%     FirstImage=s.Heading.ImageName;
     67%     if ~isempty(FirstImage)
     68%         [Pathsub,RootFile,field_count,str2,str_a,str_b,ext,nom_type_ima]=name2display(FirstImage);
     69%     end
    7070end
    7171
     
    7878        xindex=findstr(ImageSize,'x');
    7979        if length(xindex)>=2
    80             npx=str2num(ImageSize(1:xindex(1)-1));
    81             npy=str2num(ImageSize(xindex(1)+1:xindex(2)-1));
    82         end
    83     end
    84     uid_NbSlice=find(t,'/ImaDoc/Camera/NbSlice');
    85     if ~isempty(uid_NbSlice)
    86         NbSlice=str2num(get(t,children(t,uid_NbSlice),'value'));
    87         if isempty(NbSlice),NbSlice=1;end; %default
    88     end
     80%             npx=str2num(ImageSize(1:xindex(1)-1));
     81%             npy=str2num(ImageSize(xindex(1)+1:xindex(2)-1));
     82        end
     83    end
     84%     uid_NbSlice=find(t,'/ImaDoc/Camera/NbSlice');
     85%     if ~isempty(uid_NbSlice)
     86%         NbSlice=str2num(get(t,children(t,uid_NbSlice),'value'));
     87% %         if isempty(NbSlice),NbSlice=1;end; %default
     88%     end
    8989    uid_TimeUnit=find(t,'/ImaDoc/Camera/TimeUnit');
    9090    if ~isempty(uid_TimeUnit)
     
    9494    if ~isempty(uid_BurstTiming)
    9595        for k=1:length(uid_BurstTiming)
    96             Dtj=[];%default
    97             NbDtj=1;%default
     96%             Dtj=[];%default
     97%             NbDtj=1;%default
    9898            subt=branch(t,uid_BurstTiming(k));%subtree under BurstTiming
    9999             % reading Dtk
     
    121121            % reading Dtk
    122122            Dtk=get_value(subt,'/BurstTiming/Dtk',[]);
    123             NbDtk=get_value(subt,'/BurstTiming/NbDtk',1)
     123            NbDtk=get_value(subt,'/BurstTiming/NbDtk',1);
    124124            if isempty(Dtk)
    125125                s.Time=[s.Time;Time_val];
     
    141141if ~isempty(uid_GeometryCalib)
    142142    if length(uid_GeometryCalib)>1
    143         error=['More than one GeometryCalib in ' filecivxml];
     143        errormsg=['More than one GeometryCalib in ' filecivxml];
    144144        return
    145145    end
     
    149149        uid_pixcmx=find(subt,'/GeometryCalib/Pxcmx');
    150150        uid_pixcmy=find(subt,'/GeometryCalib/Pxcmy');
    151         if ~isempty(uid_pixcmx) & ~isempty(uid_pixcmy)%NON UTILISE
     151        if ~isempty(uid_pixcmx) && ~isempty(uid_pixcmy)%NON UTILISE
    152152           pixcmx=str2num(get(subt,children(subt,uid_pixcmx),'value'));
    153153            if isempty(pixcmx),pixcmx=1;end; %default
     
    180180        uid_Tx_Ty_Tz=find(subt,'/GeometryCalib/Tx_Ty_Tz');
    181181        uid_R=find(subt,'/GeometryCalib/R');
    182         if ~isempty(uid_focal) & ~isempty(uid_dpx_dpy) & ~isempty(uid_Cx_Cy)
     182        if ~isempty(uid_focal) && ~isempty(uid_dpx_dpy) && ~isempty(uid_Cx_Cy)
    183183            tsai.f=str2num(get(subt,children(subt,uid_focal),'value'));
    184184            dpx_dpy=str2num(get(subt,children(subt,uid_dpx_dpy),'value'));
  • trunk/src/nomtype2pair.m

    r19 r29  
    3030% Dtj: ~=0 if i index pairs are used
    3131
    32 function [nom_type_pair]=nomtype2pair(nom_type,Dti,Dtj);
     32function [nom_type_pair]=nomtype2pair(nom_type,Dti,Dtj)
    3333
    3434%determine nom_type_nc:
    35 nom_type_nc=[];%default
     35nom_type_pair=[];%default
    3636switch nom_type
    3737    case {'_i_j'}
  • trunk/src/series.m

    r26 r29  
    5555%--------------------------------------------------------------------------
    5656function series_OpeningFcn(hObject, eventdata, handles,param)
    57 
     57global nb_builtin
    5858% Choose default command line output for series
    5959handles.output = hObject;
     
    129129    set(handles.filter2,'Value',param.filter2);
    130130end
    131 %set(hObject,'UserData', SeriesData)
    132131set(hObject,'WindowButtonUpFcn',{@mouse_up_gui,handles})
    133132NomType_Callback(hObject, eventdata, handles)
    134 %mode_Callback(hObject, eventdata, handles)
    135133
    136134%loads the information stored in prefdir to initiate the browser and the list of functions
    137135menu_str={'check_files';'aver_stat';'time_series';'merge_proj';'clean_civ_cmx'};
     136nb_builtin=numel(menu_str); %number of functions
    138137 
    139 % menu_str=get(handles.ACTION,'String');%list of functions included in 'series.m'
    140 
    141138%remove from the list the last option 'more...'
    142139[path_series,name,ext]=fileparts(which('series'));
     
    292289function MenuBrowse_insert_Callback(hObject, eventdata, handles)
    293290
    294 %hseries=get(handles.browse_root,'parent');
    295 RootPathCell=get(handles.RootPath,'String');
    296 % SubDirCell=get(handles.SubDir,'String'); 
     291RootPathCell=get(handles.RootPath,'String');
    297292RootFileCell=get(handles.RootFile,'String');
    298293oldfile=''; %default
     
    398393% refresh the GUI data after introduction of a new file series
    399394function update_file(hObject, eventdata, handles,fileinput,addtest)
    400 hseries=get(handles.RootPath,'parent'); 
     395%hseries=get(handles.RootPath,'parent'); 
     396if ~exist(fileinput,'file')
     397    msgbox_uvmat('ERROR',['input file ' fileinput  ' does not exist'])
     398    return
     399end
     400hseries=handles.figure1;
    401401% refresh input root name, indices, file extension and nomenclature
    402402[RootPath,RootFile,field_count,str2,str_a,str_b,FileExt,NomType,SubDir]=name2display(fileinput);
    403403%check for movie image files
     404if ~isempty(FileExt)
    404405if ~isempty(imformats(FileExt(2:end)))
    405406    imainfo=imfinfo(fileinput);     
     
    408409        [RootPath,RootFile]=fileparts(fileinput);
    409410    end
     411end
    410412end
    411413NcType='none';%default
     
    492494drawnow
    493495
    494 % hseries=get(handles.RootFile,'parent');
    495 % SeriesData=get(hseries,'UserData');%read information set by the browser
    496 % ext_ima_read=[];
    497 % field_count=1;%default
    498 % pxcmx=1;
    499 % pxcmy=1;
    500496TimeUnit=''; %default
    501 % CoordUnit='';%default
    502497time=[];%default
    503498GeometryCalib=[];%default
    504499nb_field=[];%default
    505500nb_field2=[];%default
    506 % Heading=[];
    507 % [PD,Device]=fileparts(RootPathCell{1});
    508501SeriesData.PathCampaign=get(handles.PathCampaign,'String');
    509502
    510503% read timing and total frame number from the current file (movie files) !! may be overrid by xml file
    511 %icell=length(RootPathCell);
    512504FileBase=fullfile(RootPath,RootFile);
    513505
     
    890882%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    891883function mode_Callback(hObject, eventdata, handles)
    892 hseries=get(handles.mode,'parent');
     884%hseries=get(handles.mode,'parent');
     885hseries=handles.figure1;
    893886SeriesData=get(hseries,'UserData');
    894887mode_list=get(handles.mode,'String');
     
    991984%----------------------------------------------------------------
    992985function find_netcpair_civ(hObject, eventdata, handles,Val)
    993 hseries=get(handles.list_pair_civ,'parent');
    994 SeriesData=get(hseries,'UserData');
     986%hseries=get(handles.list_pair_civ,'parent');
     987SeriesData=get(handles.figure1,'UserData');
    995988% NomTypeCell=get(handles.NomType,'String');
    996989NomTypeCell=SeriesData.NomType;
     
    11731166SeriesData.displ_num(iview,:)=(displ_num(:,val))';
    11741167SeriesData.ref_time=ref_time;
    1175 set(hseries,'UserData',SeriesData)
     1168set(handles.figure1,'UserData',SeriesData)
    11761169list_pair_civ_Callback(hObject, eventdata, handles)
    11771170
     
    11851178Val=get(handles.RootPath,'Value');
    11861179IndexCell=get(handles.NomType,'String');
    1187 hseries=get(handles.list_pair_civ,'parent');
    1188 SeriesData=get(hseries,'UserData');
     1180%hseries=get(handles.list_pair_civ,'parent');
     1181SeriesData=get(handles.figure1,'UserData');
    11891182NomType=SeriesData.NomType{Val};
    11901183list_pair=get(handles.list_pair_civ,'String');%get the menu of image pairs
     
    12471240set(handles.NomType,'String',IndexCell)
    12481241SeriesData.displ_num(Val,:)=displ_num;
    1249 set(hseries,'UserData',SeriesData)
     1242set(handles.figure1,'UserData',SeriesData)
    12501243% set(handles.NomType,'Value',Val)
    12511244
     
    12961289%read root name and field type
    12971290set(handles.RUN,'BusyAction','queue');
    1298 hseries=get(handles.RUN,'parent');
    1299 set(0,'CurrentFigure',hseries)
     1291%hseries=get(handles.RUN,'parent');
     1292set(0,'CurrentFigure',handles.figure1)
    13001293if isequal(get(handles.GetObject,'Value'),1)
    13011294    Series.GetObject=1;
     
    13041297    Series.GetObject=0;
    13051298end
    1306 SeriesData=get(hseries,'UserData');
     1299SeriesData=get(handles.figure1,'UserData');
    13071300if isfield(SeriesData,'sethandles')
    13081301    if iscell(SeriesData.sethandles)
     
    14881481end
    14891482% fct_path
    1490         eval(['h_fun=@' action])
     1483eval(['h_fun=@' action ';'])
    14911484if ~isequal(fct_path,path_series)
    14921485        rmpath(fct_path)% add the prescribed path if not the current one   
     
    15321525%----------------------------------------------
    15331526function last_i_Callback(hObject, eventdata, handles)
    1534     hseries=get(handles.last_i,'parent');
     1527%     hseries=get(handles.last_i,'parent');
    15351528first_i=str2num(get(handles.first_i,'String'));
    15361529last_i=str2num(get(handles.last_i,'String'));
     
    15381531set(handles.ref_i,'String', num2str(ref_i))
    15391532ref_i_Callback(hObject, eventdata, handles)
    1540 SeriesData=get(hseries,'UserData');
     1533SeriesData=get(handles.figure1,'UserData');
    15411534if ~isfield(SeriesData,'Time')
    15421535    SeriesData.Time{1}=[];
     
    15501543%-------------------------------------------------------
    15511544function last_j_Callback(hObject, eventdata, handles)
    1552     hseries=get(handles.last_i,'parent');
     1545   % hseries=get(handles.last_i,'parent');
    15531546first_j=str2num(get(handles.first_j,'String'));
    15541547last_j=str2num(get(handles.last_j,'String'));
     
    15571550
    15581551ref_j_Callback(hObject, eventdata, handles)
    1559 SeriesData=get(hseries,'UserData');
     1552SeriesData=get(handles.figure1,'UserData');
    15601553if ~isfield(SeriesData,'Time')
    15611554    SeriesData.Time{1}=[];
     
    15711564mode_value=get(handles.mode,'Value');
    15721565mode=mode_list{mode_value};
    1573 hseries=get(handles.ref_i,'parent');
    1574 SeriesData=get(hseries,'UserData');
     1566%hseries=get(handles.ref_i,'parent');
     1567SeriesData=get(handles.figure1,'UserData');
    15751568%NomTypeCell=get(handles.NomType,'String');
    15761569NomTypeCell=SeriesData.NomType;
     
    15921585mode_value=get(handles.mode,'Value');
    15931586mode=mode_list{mode_value};
    1594 hseries=get(handles.ref_i,'parent');
    1595 SeriesData=get(hseries,'UserData');
    1596 %NomTypeCell=get(handles.NomType,'String');
     1587%hseries=get(handles.ref_i,'parent');
     1588SeriesData=get(handles.figure1,'UserData');
    15971589NomTypeCell=SeriesData.NomType;
    15981590if ~isempty(NomTypeCell)
    1599 Val=get(handles.NomType,'Value');
    1600 NomType=NomTypeCell{Val};
    1601 % NomType=get(handles.NomType,'String');
     1591    Val=get(handles.NomType,'Value');
     1592    NomType=NomTypeCell{Val};
    16021593    if isequal(NomType,'_i_j1-j2')|| isequal(NomType,'_i1-i2_j')|| isequal(NomType,'_i1-i2')
    16031594        if isequal(mode,'series(Dj)')
    16041595            find_netcpair_civ(hObject, eventdata, handles,Val);% update the menu of pairs depending on the available netcdf files
    1605 %             break
    16061596        end
    16071597    end
     
    16111601% --- Executes on selection change in ACTION.
    16121602function ACTION_Callback(hObject, eventdata, handles)
     1603global nb_builtin
    16131604list_ACTION=get(handles.ACTION,'String');% list menu fields
    16141605index_ACTION=get(handles.ACTION,'Value');% selected string index
     
    16161607path_series=which('series');%path to series.m
    16171608list_path=get(handles.ACTION,'UserData');%list of recorded paths to functions of the list ACTION
    1618 nb_builtin=0;
    1619 for ilist=1:length(list_path)
    1620     if isequal(list_path{ilist},path_series)
    1621         nb_builtin=nb_builtin+1;
    1622     else
    1623         break
    1624     end
    1625 end
    1626 if nb_builtin==0% the path of series has been changed, reinitialize
    1627 %     series_OpeningFcn(hObject, eventdata, handles)
    1628     return
    1629 end
    1630 
    1631 % add a new function to the menu
     1609
     1610% add a new function to the menu if the selected item is 'more...'
    16321611if isequal(ACTION,'more...')
    16331612    pathfct=fileparts(path_series);
    1634     browse_name=fullfile(path_series,'series');%go to UVMAT/SERIES_FCT by default
    1635     if length(list_path)>nb_builtin
    1636         browse_name=list_path{end};% initialize browser with  the path of the last introduced function
    1637      end
     1613%     browse_name=fullfile(path_series,'series');%go to UVMAT/series by default
     1614%     if length(list_path)>nb_builtin
     1615%         browse_name=list_path{end};% initialize browser with  the path of the last introduced function
     1616%      end
    16381617    [FileName, PathName, filterindex] = uigetfile( ...
    16391618       {'*.m', ' (*.m)';
    16401619        '*.m',  '.m files '; ...
    16411620        '*.*', 'All Files (*.*)'}, ...
    1642         'Pick a file',browse_name);
     1621        'Pick a file',list_path{end});
    16431622    if length(FileName)<2
    16441623        return
    1645     end
    1646    
    1647    
    1648    
    1649     ext_fct=FileName(end-1:end);% to be replaced by fileparts
     1624    end
     1625    [pp,ACTION,ext_fct]=fileparts(FileName);%(end-1:end);
    16501626    if ~isequal(ext_fct,'.m')
    16511627        msgbox_uvmat('ERROR','a Matlab function .m must be introduced');
    16521628        return
    16531629    end
    1654     ACTION=FileName(1:end-2);% ACTION choice updated by the selected item
    1655    
    1656     addpath(PathName)
    1657     eval(['h_function=@' ACTION]);
    1658     if ~isequal(path_series,PathName)
    1659     rmpath(PathName)
    1660     end
    1661     functions(h_function)
    16621630   
    16631631   % insert the choice in the action menu
     
    16651633   index_ACTION=get(handles.ACTION,'Value');% currently selected index in the list
    16661634   list_path{index_ACTION}=PathName;
    1667    if length(menu_str)>nb_builtin+5;
     1635   if length(menu_str)>nb_builtin+5; %nb_builtin=nbre of functions always remaining in the initial menu
    16681636       nbremove=length(menu_str)-nb_builtin-5;
    16691637       menu_str(nb_builtin+1:end-5)=[];
     
    16991667%check the current path to the selected function
    17001668PathName=list_path{index_ACTION};%current recorded path
    1701 if ~isequal(path_series,PathName)
    1702     CurrentPath=fileparts(which(ACTION));
    1703     if ~isequal(CurrentPath,PathName)&&~isequal(CurrentPath,fullfile(PathName,'private'))
    1704         addpath(PathName)
    1705         errormsg=check_functions;
    1706         msgbox_uvmat('CONFIRMATION',[['path ' PathName ' added to the current Matlab pathes'];errormsg])
    1707     end
    1708 end
     1669% if ~isequal(path_series,PathName)
     1670%     CurrentPath=fileparts(which(ACTION));
     1671%     if ~isequal(CurrentPath,PathName)
     1672%         addpath(PathName)
     1673%         errormsg=check_functions;
     1674%         msgbox_uvmat('CONFIRMATION',[['path ' PathName ' added to the current Matlab pathes'];errormsg])
     1675%     end
     1676% end
    17091677set(handles.path,'String',PathName); %show the path to the senlected function
    17101678
     
    17431711%set the displayed GUI item needed for input parameters
    17441712%list_input=feval(ACTION);% input list asked by the selected function
    1745 varargout=feval(ACTION);% input list asked by the selected function
     1713if ~isequal(path_series,PathName)
     1714    addpath(PathName)
     1715end
     1716eval(['h_function=@' ACTION ';']);
     1717if ~isequal(path_series,PathName)
     1718    rmpath(PathName)
     1719end
     1720
     1721varargout=h_function();
     1722%varargout=feval(ACTION);% input list asked by the selected function
    17461723Param_list={};
    17471724% RootPath=get(handles.RootPath,'String');
     
    18751852         delete(hget_field)%delete opened versions of get_field
    18761853     end
    1877      hseries=get(handles.FieldMenu,'parent');
    1878      SeriesData=get(hseries,'UserData');
     1854     %hseries=get(handles.FieldMenu,'parent');
     1855     SeriesData=get(handles.figure1,'UserData');
    18791856     filename=SeriesData.CurrentInputFile;
    18801857     if exist(filename,'file')
     
    19031880         delete(hget_field)
    19041881     end
    1905      hseries=get(handles.FieldMenu,'parent');
    1906      SeriesData=get(hseries,'UserData');
     1882     %hseries=get(handles.FieldMenu,'parent');
     1883     SeriesData=get(handles.figure1,'UserData');
    19071884     filename=SeriesData.CurrentInputFile_1;
    19081885     if exist(filename,'file')
     
    19191896     update_menu(handles.FieldMenu_1,scalar)
    19201897end   
    1921 % %----------------------------------------------------------------------
    1922 % % --makes a time averaged velocity field
    1923 % %----------------------------------------------------------------------
    1924 % function aver_vel(num_i1,num_i2,num_j1,num_j2,Series)
    1925 %                           %handles of the GUI series
    1926 %   
    1927 % hseries=guidata(Series.hseries);%handles of the GUI series
    1928 % WaitbarPos=get(hseries.waitbar_frame,'Position');
    1929 % Field_list=get(hseries.FieldMenu,'String');
    1930 % val=get(hseries.FieldMenu,'Value');
    1931 % FieldName=Field_list{val(1)};
    1932 % set(hseries.FieldMenu,'Value',val(1))% select only one input field
    1933 % if isequal(FieldName,'get_field...')
    1934 %     hget_field=findobj(allchild(0),'Name','get_field');%find the get_field... GUI
    1935 % end
    1936 % %root input file and type
    1937 % RootPath=get(hseries.RootPath,'String');
    1938 % SubDir=get(hseries.SubDir,'String');
    1939 % RootFile=get(hseries.RootFile,'String');
    1940 % %NomType=get(hseries.NomType,'String');
    1941 % NomType=Series.NomType;
    1942 % FileExt=get(hseries.FileExt,'String');
    1943 % ext=FileExt{1};     
    1944 % VelType_str=get(hseries.VelTypeMenu,'String');
    1945 % VelType_val=get(hseries.VelTypeMenu,'Value');
    1946 % VelType{1}=VelType_str{VelType_val};
    1947 %
    1948 % time=0; %default
    1949 % % number of slices
    1950 % NbSlice=str2num(get(hseries.NbSlice,'String'));
    1951 % if isempty(NbSlice)
    1952 %     NbSlice=1;
    1953 % end
    1954 % NbSlice_name=num2str(NbSlice);
    1955 % filebase=fullfile(RootPath{1},RootFile{1});
    1956 % Calib=[];
    1957 % if exist([filebase '.xml'],'file')
    1958 %     %[error,Heading,nom_type_read,ext_ima_read,time_imadoc,TimeUnit,mode,NbSlice,npx,npy,Calib]=read_imadoc([filebase '.xml']);
    1959 %     [XmlData,warntext]=imadoc2struct([filebase '.xml']);
    1960 % end
    1961 % if NbSlice==1
    1962 %    filebase_mean=[filebase '_mean']; %root name for the result
    1963 % else
    1964 %    filebase_mean=[filebase '_' NbSlice_name 'mean']; %root name for the results
    1965 %    answeryes=questdlg({['will make average in ' num2str(NbSlice) ' slices'];['results stored as files ' filebase_mean ' ...']});
    1966 %     if ~isequal(answeryes,'Yes')
    1967 %     return
     1898
     1899
     1900% %group the variables (fields of 'FieldData') in cells of variables with the same dimensions
     1901% %%%%%%%%%%%%%%%%%%%%%%% Function independante maintenant
     1902% %-----------------------------------------------------------------
     1903% [CellVarIndex,NbDim,VarTypeCell]=find_field_indices(Data{1});
     1904% %LOOP ON GROUPS OF VARIABLES SHARING THE SAME DIMENSIONS
     1905% % CellVarIndex=cells of variable index arrays
     1906% ivar_new=0; % index of the current variable in the projected field
     1907% icoord=0;
     1908% for icell=1:length(CellVarIndex)
     1909%     if NbDim(icell)==1
     1910%         continue
     1911%     end
     1912%     VarIndex=CellVarIndex{icell};%  indices of the selected variables in the list FieldData.ListVarName
     1913%     VarType=VarTypeCell{icell};
     1914%     ivar_X=VarType.coord_x;
     1915%     ivar_Y=VarType.coord_y;
     1916%     ivar_FF=VarType.errorflag;
     1917%     if isempty(ivar_X)
     1918%         test_grid=1;%test for input data on regular grid (e.g. image)coordinates
     1919%     else
     1920%         if length(ivar_Y)~=1
     1921%                 warndlg_uvmat('y coordinate missing in proj_field.m','ERROR')
     1922%                 return
     1923%         end
     1924%         test_grid=0;
     1925%     end
     1926% %    DimIndices=Data{1}.VarDimIndex{VarIndex(1)};%indices of the dimensions of the first variable (common to all variables in the cell)
     1927%     %case of input fields with unstructured coordinates
     1928%     if ~test_grid
     1929%         for ivar=VarIndex
     1930%             VarName=MergeData.ListVarName{ivar};
     1931%             for iview=1:nbview
     1932%                 eval(['MergeData.' VarName '=[MergeData.' VarName '; Data{iview}.' VarName ';'])
     1933%             end
     1934%         end
     1935%     %case of fields defined on a structured  grid
     1936%     else 
     1937% %        DimValue=MergeData.DimValue(DimIndices);%set of dimension values
     1938%         testFF=0;
     1939%         for iview=2:nbview
     1940% %             if ~isequal(DimValue,Data{iview}.DimValue(DimIndices))
     1941% %                 MergeData.Txt='ERROR: attempt at merging structured fields with different sizes';
     1942% %                 return
     1943% %             end
     1944%             for ivar=VarIndex
     1945%                 VarName=MergeData.ListVarName{ivar};
     1946%                 if isfield(MergeData,'VarAttribute')
     1947%                     if length(MergeData.VarAttribute)>=ivar && isfield(MergeData.VarAttribute{ivar},'Role') && isequal(MergeData.VarAttribute{ivar}.Role,'errorflag')
     1948%                         testFF=1;
     1949%                     end
     1950%                 end
     1951%                 eval(['MergeData.' VarName '=MergeData.' VarName '+ Data{iview}.' VarName ';'])
     1952%             end
     1953%         end
     1954%         if testFF
     1955%             nbaver=nbview-MergeData.FF;
     1956%             indgood=find(nbaver>0);
     1957%             for ivar=VarIndex
     1958%                 VarName=MergeData.ListVarName{ivar};
     1959%                 eval(['MergeData.' VarName '(indgood)=double(MergeData.' VarName '(indgood))./nbaver(indgood);'])
     1960%             end
     1961%         else
     1962%             for ivar=VarIndex
     1963%                 VarName=MergeData.ListVarName{ivar};
     1964%                 eval(['MergeData.' VarName '=double(MergeData.' VarName ')./nbview;'])
     1965%             end   
     1966%         end
    19681967%     end
    19691968% end
    1970 % siz=size(num_i1);
    1971 % nbfield2=siz(1); %nb of consecutive fields at each level(burst)
    1972 % lengthtot=siz(1)*siz(2);
    1973 % nbfield=floor(lengthtot/(nbfield2*NbSlice));%total number of i indexes (adjusted to an integer number of slices)
    1974 % nbfield_slice=nbfield*nbfield2;% number of fields per slice
    1975 % %projection object
    1976 % GridX=[];
    1977 % GridY=[];
    1978 % if isfield(Series,'sethandles')
    1979 %         Series.ProjObject=read_set_object(Series.sethandles);
    1980 %         if isfield(Series.ProjObject,'Style')
    1981 %             answeryes=questdlg({['statistics on field series projected on ' Series.ProjObject.Style]});
    1982 %             if ~isequal(answeryes,'Yes')
    1983 %                 return
    1984 %             end
    1985 %         end
    1986 % end
    1987 %
    1988 % %LOOP ON SLICES
    1989 % for i_slice=1:NbSlice
    1990 %     %select the series of image indices at the level islice
    1991 %     for ifield=1:nbfield
    1992 %         indselect(:,ifield)=((ifield-1)*NbSlice+(i_slice-1))*nbfield2+[1:nbfield2]';%selected indices on the list of files of a slice
    1993 %     end 
    1994 %     %name of result file
    1995 %     [filemean,idetect]=...
    1996 %                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});
    1997 %
    1998 %     % field=get(handles.civ1,'UserData');%read current selected field type (civ1,civ2...)
    1999 %     itime=0;
    2000 %      dt=[];
    2001 %      %LOOP ON FIELDS IN  A SLICE
    2002 %      test_interpolate=0;%default
    2003 %     for index=1:nbfield*nbfield2
    2004 %             ifile=indselect(index);
    2005 %         stopstate=get(hseries.RUN,'BusyAction');
    2006 %         if isequal(stopstate,'queue')% enable STOP command
    2007 %             update_waitbar(hseries.waitbar,WaitbarPos,ifile/(nbfield*nbfield2))
    2008 %             %name of the current file
    2009 %             [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});
    2010 %             %read input file
    2011 %             itime=itime+1;
    2012 %             if isequal(FieldName,'get_field...')
    2013 %                 hhget_field=guidata(hget_field);%handles of GUI elements in get_field
    2014 %                 hObject=0;
    2015 %                 eventdata=0;
    2016 %                 SubField=get_field('read_var_names',hObject,eventdata,hhget_field); %read the names of the variables to plot in the get_field GUI
    2017 %                 [Data,var_detect]=nc2struct(filename,SubField.ListVarName); %read input data   
    2018 %                 time(itime)=itime;
    2019 %                 dt=1;
    2020 %                 Calib_read=[];
    2021 %             else
    2022 %                 [nb_coord,nb_dim,Civ,CivStage,timeread,Data,VelTypeOut,Calib_read]=read_ncfield(filename,VelType{1});%reading the first file
    2023 %                  time(itime)=timeread;
    2024 %                 if isequal(Civ,1)
    2025 %                     Data.CoordType='px';%test for pixel coordinates
    2026 %                     if isequal(itime,1)
    2027 %                         dt=Data.dt;
    2028 %                     elseif ~isequal(Data.dt,dt)
    2029 %                         warndlg_uvmat('series with non constant dt, need phys coordinates','ERROR')
    2030 %                         return
    2031 %                     end
    2032 %                 end
    2033 %             end
    2034 %             %increment the detected fields, skip the others
    2035 %             if idetect==0
    2036 %                 warndlg_uvmat(['input file ' filename ' not found'],'ERROR')
    2037 %                 %A FAIRE STOCKER LE RESULT ACTUEL S'IL EXISTE
    2038 %             end
    2039 % %             itime=itime+1;
    2040 % %             time(itime)=timeread;
    2041 %       
    2042 %             %coordinate transform
    2043 %             if isempty(Calib)
    2044 %                 Calib=Calib_read;%use Calib from xml file in priority, then Calib from the current file
    2045 %             end
    2046 %             if ~isequal(Series.CoordType,'')
    2047 %                 Data=feval(Series.CoordType,Data,Calib);
    2048 %             end
    2049 %             %projection on object if defined
    2050 %             if isfield(Series,'ProjObject');
    2051 %                 Data=proj_field(Data,Series.ProjObject);
    2052 %                 if isequal(itime,1)%use the positions on the first field for the whole series, ou utiliser grille
    2053 %                     if isfield(Data,'Txt')%display error message
    2054 %                         warndlg(Data.Txt,'ERROR')
    2055 %                         return
    2056 %                     end
    2057 %                 end
    2058 %             else%remove false vectors and interpolate on the positions of the first field
    2059 %                 Data=document_field(Data);
    2060 %                 Data.Style='plane';
    2061 %             end
    2062 %     %%%%%%%%% initiate the average at the first iteration: check list and structure of variables
    2063 %             if ifile==i_slice%first field in the slice
    2064 %                 testfalse=0;
    2065 %                 ListIndex={};
    2066 %                 testnewcell=1;
    2067 %                 %group the variables (fields of 'Data') in cells of variables with the same dimensions
    2068 %                 [DimVarIndex,CellVarIndex]=find_field_indices(Data);
    2069 %                 VarIndex=CellVarIndex{1}; % ONLY THE FIRST VAR GROUP IS AVERAGED
    2070 %                 DimIndex=Data.VarDimIndex{VarIndex(1)};%indices of the dimensions of the first variable (common to all variables in the cell)         
    2071 %                 MeanData=Data;%transfer heading
    2072 %                 MeanData.Time=[time(1) time(end)];
    2073 %                 MeanData.Action=Series.Action;%name of the processing programme
    2074 %                 MeanData.ListDimName=Data.ListDimName(DimIndex);%name of dimension
    2075 %                 MeanData.DimValue=Data.DimValue(DimIndex);%values of dimension (nbre of vectors)
    2076 %                 MeanData.ListVarName=Data.ListVarName;
    2077 %                 MeanData.VarDimIndex=Data.VarDimIndex;
    2078 %                 MeanData.ListVarAttribute={'Role'};%list of variable attribute names A FAIRE: transferer les autres attributs
    2079 %                 testsum=ones(size(VarIndex));
    2080 %                 indexfalse=0;
    2081 %                 CoordName={};
    2082 %                 indexremove=[];
    2083 %                 if isfield(Data,'Role') % look for coordinate and flag variables   
    2084 %                     for ivar=1:length(VarIndex)
    2085 %                         VarName=Data.ListVarName{VarIndex(ivar)};
    2086 %                         var_role=Data.Role{VarIndex(ivar)};%'role' of the variable
    2087 %                         MeanData.Role{ivar}=var_role;
    2088 %                         if isequal(var_role,'falseflag')
    2089 %                             indexfalse=ivar; %test for false flag
    2090 %                             indexremove=ivar;
    2091 %                             FFName=VarName;
    2092 %                             testsum(ivar)=0;
    2093 %                             eval(['MeanData=rmfield(MeanData,''' VarName ''');']);%remove variable                     
    2094 %                         end
    2095 %                         if isequal(var_role,'warnflag')                       
    2096 %                             testsum(ivar)=0; %do not sum warn flag
    2097 %                             eval(['MeanData=rmfield(MeanData,''' VarName ''');']);%remove variable
    2098 %                             indexremove=[indexremove ivar];
    2099 %                         end                 
    2100 %                         if isequal(var_role,'coord_x')| isequal(var_role,'coord_y')|isequal(var_role,'coord_z')
    2101 %                             eval(['MeanData.' VarName '=Data.' VarName ';']);
    2102 %                             testsum(ivar)=0;
    2103 %                             eval(['CoordName=[CoordName ''' VarName '''];']);
    2104 %                         end
    2105 %                         if testsum(ivar)~=0
    2106 %                            eval(['MeanData.' VarName '=zeros(size(Data.' VarName '));']);%initialise sum
    2107 %                         end
    2108 %                     end
    2109 %                 end
    2110 %                 findsum=find(testsum);
    2111 %                 VarIndexSum=VarIndex(findsum);%indices of variables to sum (not coordinates nor flags)
    2112 %                 if length(CoordName)==0
    2113 %                     if isempty(DimVarIndex)|isequal(DimVarIndex,0)% no coordinate variable for structured coordinates, prepare histograms
    2114 %                          for ilist=1:length(VarIndexSum)
    2115 %                             VarName=Data.ListVarName{VarIndexSum(ilist)};
    2116 %                             eval(['MeanData=rmfield(MeanData,''' VarName ''');']);%remove variable
    2117 %                             indexremove=[indexremove ilist];
    2118 %                             eval(['[MeanData.' VarName 'hist,MeanData.' VarName 'val]=hist(Data.' VarName ',100);']);%make histo
    2119 %                             eval(['sizhist=size(MeanData.' VarName 'hist);'])
    2120 %                             if sizhist(1)==1
    2121 %                                 eval(['MeanData.' VarName 'hist=MeanData.' VarName 'hist'';'])
    2122 %                             end
    2123 %                             eval(['maxval=max(MeanData.' VarName 'val);']);
    2124 %                             eval(['minval=min(MeanData.' VarName 'val);']);
    2125 %                             dC(ilist)=(maxval-minval)/100;%size of the histogram bin   
    2126 %                          end
    2127 %                     else
    2128 % %                         icoord=0;
    2129 % %                         for ilist=1:length(DimVarIndex) 
    2130 % %                             VarDim=Data.ListVarName{DimVarIndex(ilist)};
    2131 % %                             icoord=icoord+1;
    2132 % %                             % eval(['Coord{' num2str(icord) '}=[' CoordName ''' VarName ''']']);
    2133 % %                              %eval(['Data.' CoordName{icoord} '=Data.' CoordName{icoord} '(indsel);']);
    2134 % %                         end
    2135 %                     end
    2136 %                 end
    2137 %                 if ~isempty(indexremove)
    2138 %                     MeanData.ListVarName(VarIndex(indexremove))=[];
    2139 %                     MeanData.VarDimIndex(VarIndex(indexremove))=[];
    2140 %                     if isfield(MeanData,'Role')%generaliser aus autres attributs
    2141 %                         MeanData.Role(VarIndex(indexremove))=[];
    2142 %                     end
    2143 %                 end
    2144 %                % END OF INITIALISATION
    2145 %
    2146 %             end
    2147 %       
    2148 %          % A FAIRE: regular grid if coord_x undefined
    2149 %             if indexfalse~=0 %suppress false data
    2150 %                  eval(['testexist=isfield(Data,''' FFName ''');'])
    2151 %                 if testexist
    2152 %                     eval(['indsel=find(Data.' FFName '==0);']);
    2153 %                     for icoord=1:length(CoordName)
    2154 %                         eval(['Data.' CoordName{icoord} '=Data.' CoordName{icoord} '(indsel);']);
    2155 %                     end
    2156 %                 end
    2157 %             end
    2158 %             for ilist=1:length(VarIndexSum)
    2159 %                 VarName=Data.ListVarName{VarIndexSum(ilist)};
    2160 %                 if indexfalse~=0 & testexist
    2161 %                     eval(['Data.' VarName '=Data.' VarName '(indsel);']);
    2162 %                 end
    2163 %                 if length(CoordName)==0%no variable use dfor unstructured coordinates
    2164 %                     if isempty(DimVarIndex)|isequal(DimVarIndex,0)% no coordinate variable for structured coordinates
    2165 % %                         %update histogram with the current field #ifile
    2166 %                         str_left=['[MeanData.' VarName 'val,MeanData.' VarName 'hist]='];
    2167 %                         str_right=['hist_update(MeanData.' VarName 'val,MeanData.' VarName 'hist,Data.' VarName ',dC(ilist));'];
    2168 %                         eval([str_left str_right]);%update global histo
    2169 %                     else
    2170 %                        %INTERPOLER
    2171 %                             
    2172 %                         eval(['MeanData.' VarName '=MeanData.' VarName '+Data.' VarName ';']);%increment sum%CAS x,y change
    2173 %                     end
    2174 %                 else   
    2175 %                     if length(CoordName)==2
    2176 %                         eval(['test_interp= ~isequal(Data.' CoordName{1} ',MeanData.' CoordName{1} ...
    2177 %                             ')|~isequal(Data.' CoordName{2} ',MeanData.' CoordName{2} ');'])
    2178 %                         if test_interp
    2179 %                             eval(['Data.' VarName '=griddata_uvmat(Data.' CoordName{1} ',Data.' CoordName{2}...
    2180 %                                 ',Data.' VarName ',MeanData.' CoordName{1} ',MeanData.' CoordName{2} ');']);
    2181 %                             test_interpolate=1;
    2182 %                         end
    2183 %                     end
    2184 %                     eval(['MeanData.' VarName '=MeanData.' VarName '+Data.' VarName ';']);%increment sum
    2185 %                 end
    2186 %             end
    2187 %         end
    2188 %     end
    2189 %     if length(CoordName)~=0 | ~isequal(DimVarIndex,0)% no coordinate variable for structured coordinates
    2190 %         for ilist=1:length(VarIndexSum) 
    2191 %             VarName=Data.ListVarName{VarIndexSum(ilist)};
    2192 %             eval(['MeanData.' VarName '=MeanData.' VarName '/itime;']);%normalize sum by the number of fields
    2193 %         end
    2194 %     else
    2195 %         MeanData.NbDim=1;
    2196 %         MeanData.ListDimName={};
    2197 %         MeanData.DimValue=[];
    2198 %         for ilist=1:length(VarIndexSum) 
    2199 %             VarName=Data.ListVarName{VarIndexSum(ilist)};
    2200 %             MeanData.ListVarName=[MeanData.ListVarName {[VarName 'val']} {[VarName 'hist']}];
    2201 %             MeanData.VarDimIndex=[MeanData.VarDimIndex {[ilist]} {[ilist]}];
    2202 %             MeanData.ListDimName=[MeanData.ListDimName {[VarName 'val']}];
    2203 %             eval(['MeanData.DimValue=[MeanData.DimValue length(MeanData.' VarName 'val)];']);
    2204 %         end   
    2205 %     end
    2206 %     figure
    2207 %     haxes=axes;
    2208 %     plot_field(MeanData,haxes)%plot the resulting average
    2209 %     % change variable names for consitency with civ1 data (need to generalize these programs)
    2210 %     if length(MeanData.ListVarName) >= 4 & isequal(MeanData.ListVarName(1:4), {'X'  'Y'  'U'  'V'})
    2211 %        MeanData.ListGlobalAttribute={'nb_coord','nb_dim','dt','absolut_time_T0','pixcmx','pixcmy','hart','civ','fix'};
    2212 %        MeanData.nb_coord=2;
    2213 %        MeanData.nb_dim=2;
    2214 %        MeanData.dt=1;
    2215 %        MeanData.absolut_time_T0=0;
    2216 %        MeanData.pixcmx=1; %pix per cm (1 by default)
    2217 %        MeanData.pixcmy=1; %pix per cm (1 by default)
    2218 %        MeanData.hart=0;
    2219 %        if isequal(Data.CoordType,'px')
    2220 %          MeanData.civ=1;
    2221 %       else
    2222 %          MeanData.civ=0;
    2223 %        end
    2224 %       MeanData.fix=0;
    2225 %         MeanData.ListVarName(1:4)={'vec_X'  'vec_Y'  'vec_U'  'vec_V'};
    2226 %         MeanData.vec_X=MeanData.X;
    2227 %         MeanData.vec_Y=MeanData.Y;
    2228 %         MeanData.vec_U=MeanData.U;
    2229 %         MeanData.vec_V=MeanData.V;
    2230 %     end
    2231 %     error=struct2nc(filemean,MeanData); %save result file
    2232 %     if isequal(error,0)
    2233 %         if test_interpolate
    2234 %             'fields interpolated to the positions of the first one'
    2235 %         end
    2236 %         [filemean ' written']
    2237 %     else
    2238 %         warndlg_uvmat(error,'ERROR')
    2239 %     end
    2240 % end
    2241 
    2242 %----------------------------------------------------------------------
    2243 % --project fields on a projection object (e. g. a regular grid), possibly
    2244 % merge several fields
    2245 %----------------------------------------------------------------------
    2246 %INPUT:
    2247 %num_i1: series of first indices i (given from the series interface as first_i:incr_i:last_i, mode and list_pair_civ)
    2248 %num_i2: series of second indices i (given from the series interface as first_i:incr_i:last_i, mode and list_pair_civ)
    2249 %num_j1: series of first indices j (given from the series interface as first_j:incr_j:last_j, mode and list_pair_civ )
    2250 %num_j2: series of second indices j (given from the series interface as first_j:incr_j:last_j, mode and list_pair_civ)
    2251 %OTHER INPUTS given by the structure Series
    2252 function GUI_input=merge_proj(num_i1,num_i2,num_j1,num_j2,Series);
    2253 
    2254 %requests for the visibility of input windows in the GUI series  (activated directly by the selection in the menu ACTION)
    2255 if ~exist('num_i1','var')
    2256     GUI_input={'RootPath';'two';...%nbre of possible input series (options 'on'/'two'/'many', default:'one')
    2257         'SubDir';'on';... % subdirectory of derived files (PIV fields), ('on' by default)
    2258         'RootFile';'on';... %root input file name ('on' by default)
    2259         'FileExt';'on';... %input file extension ('on' by default)
    2260         'NomType';'on';...%type of file indexing ('on' by default)
    2261         'NbSlice';'on'; ...%nbre of slices ('off' by default)
    2262         'VelTypeMenu';'one';...% menu for selecting the velocity type (civ1,..) options 'off'/'one'/'two', 'off' by default)
    2263         'FieldMenu';'one';...% menu for selecting the field (s) in the input file(options 'off'/'one'/'two', 'off' by default)
    2264         'CoordType';'on';...%can use a transform function 'off' by default
    2265         'GetObject';'on';...%can use projection object ,'off' by default
    2266         %'GetMask';'on'...%can use mask option   ,'off' by default
    2267         %'PARAMETER'; options: name of the user defined parameter',repeat a line for each parameter
    2268                ''};
    2269     return %exit the function
    2270 end
    2271 
    2272 %-------------------------------------------------
    2273 hseries=guidata(Series.hseries);%handles of the GUI series
    2274 WaitbarPos=get(hseries.waitbar_frame,'Position'); %positiopn of waitbar frame
    2275 %-------------------------------------------------
    2276 
    2277 %numbers of view fields (nbre of inputs in RootPath)
    2278 testcell=iscell(Series.RootFile);
    2279 if ~testcell
    2280     Series.RootPath={Series.RootPath};
    2281     Series.RootFile={Series.RootFile};
    2282     Series.SubDir={Series.SubDir};
    2283     Series.FileExt={Series.FileExt};
    2284     Series.NomType={Series.NomType};
    2285     num_i1={num_i1};
    2286     num_i2={num_i2};
    2287     num_j1={num_j1};
    2288     num_j2={num_j2};
    2289 end
    2290 nbview=length(Series.RootFile);%number of views (file series to merge)
    2291 nbfield=size(num_i1{1},1)*size(num_i1{1},2);%number of fields in the time series
    2292 transform=Series.CoordType; %  field transform function
    2293 hhh=which('mmreader');
    2294 for iview=1:nbview
    2295     test_movie(iview)=0;
    2296     if ~isequal(hhh,'')&& mmreader.isPlatformSupported()
    2297         if isequal(lower(FileExt{iview}),'.avi')
    2298             MovieObject{iview}=mmreader(fullfile(RootPath{iview},[RootFile{iview} FileExt{iview}]));
    2299             test_movie(iview)=1;
    2300         end
    2301     end
    2302 end
    2303 
    2304 %Calibration data and timing: read the ImaDoc files
    2305 mode=''; %default
    2306 timecell={};
    2307 itime=0;
    2308 NbSlice_calib={}; %test for z index
    2309 for iview=1:nbview%Loop on views
    2310     XmlData{iview}=[];%default
    2311     filebase{iview}=fullfile(Series.RootPath{iview},Series.RootFile{iview});
    2312     if exist([filebase{iview} '.xml'],'file')
    2313         [XmlData{iview},error]=imadoc2struct([filebase{iview} '.xml']);
    2314         if isfield(XmlData{iview},'Time')
    2315             itime=itime+1;
    2316             timecell{itime}=XmlData{iview}.Time;
    2317         end
    2318         if isfield(XmlData{iview},'GeometryCalib') && isfield(XmlData{iview}.GeometryCalib,'SliceCoord')
    2319             NbSlice_calib{iview}=size(XmlData{iview}.GeometryCalib.SliceCoord,1);
    2320             if ~isequal(NbSlice_calib{iview},NbSlice_calib{1})
    2321                 msgbox_uvmat('WARNING','inconsistent number of Z indices for the two field series');
    2322             end
    2323         end   
    2324     elseif exist([filebase{iview} '.civ'],'file')
    2325         [error,time,TimeUnit,mode,npx,npy,pxcmx,pxcmy]=read_imatext([filebase{iview} '.civ']);
    2326         itime=itime+1;
    2327         timecell{itime}=time;
    2328         XmlData{iview}.Time=time;
    2329         GeometryCalib.R=[pxcmx 0 0; 0 pxcmy 0;0 0 0];
    2330         GeometryCalib.Tx=0;
    2331         GeometryCalib.Ty=0;
    2332         GeometryCalib.Tz=1;
    2333         GeometryCalib.dpx=1;
    2334         GeometryCalib.dpy=1;
    2335         GeometryCalib.sx=1;
    2336         GeometryCalib.Cx=0;
    2337         GeometryCalib.Cy=0;
    2338         GeometryCalib.f=1;
    2339         GeometryCalib.kappa1=0;
    2340         GeometryCalib.CoordUnit='cm';
    2341         XmlData{iview}.GeometryCalib=GeometryCalib;
    2342         if error==1
    2343             msgbox_uvmat('WARNING','inconsistent number of fields in the .civ file');
    2344         end
    2345     end
    2346 end
    2347 
    2348 %check coincidence in time
    2349 multitime=0;
    2350 if length(timecell)==0
    2351     time=[];
    2352 elseif length(timecell)==1
    2353     time=timecell{1};
    2354 elseif length(timecell)>1
    2355     multitime=1;
    2356     for icell=1:length(timecell)
    2357         if ~isequal(size(timecell{icell}),size(timecell{1}))
    2358             msgbox_uvmat('WARNING','inconsistent time array dimensions in ImaDoc fields, the time for the first series is used')
    2359             time=timecell{1};
    2360             multitime=0;
    2361             break
    2362         end
    2363     end
    2364 end
    2365 if multitime
    2366     for icell=1:length(timecell)
    2367         time(icell,:,:)=timecell{icell};
    2368     end
    2369     diff_time=max(max(diff(time)));
    2370     if diff_time>0
    2371         msgbox_uvmat('WARNING',['times of series differ by more than ' num2str(diff_time)])
    2372     end   
    2373 end
    2374 if size(time,2) < num_i2{1}(end) || size(time,3) < num_j2{1}(end)% ime array absent or too short in ImaDoc xml file'
    2375     time=[];
    2376 end
    2377 
    2378 % Field and velocity type (the same for all views)
    2379 Field_str=get(hseries.FieldMenu,'String');
    2380 val=get(hseries.FieldMenu,'Value');
    2381 FieldName=Field_str(val);%the same set of fields for all views
    2382 VelType_str=get(hseries.VelTypeMenu,'String');
    2383 VelType_val=get(hseries.VelTypeMenu,'Value');
    2384 VelType=VelType_str{VelType_val}; %the same for all views
    2385 if isequal(FieldName,'get_field...')
    2386     hget_field=findobj(allchild(0),'Name','get_field');%find the get_field... GUI
    2387    % hhget_field=guidata(hget_field);%handles of GUI elements in get_field
    2388     SubField=get_field('read_get_field',hObject,eventdata,hget_field); %read the names of the variables to plot in the get_field GUI
    2389 %     if isequal(get(hhget_field.menu_coord,'Visible'),'on')
    2390 %         list_transform=get(hhget_field.menu_coord,'String');
    2391 %         val_list=get(hhget_field.menu_coord,'Value');
    2392 %         transform=list_transform{val_list};
    2393 %     end
    2394 end
    2395 %detect whether all the files are 'images' or 'netcdf'
    2396 testima=0;
    2397 testvol=0;
    2398 testcivx=0;
    2399 testnc=0;
    2400 FileExt=get(hseries.FileExt,'String');
    2401 for iview=1:nbview
    2402      ext=FileExt{iview};
    2403      form=imformats(ext([2:end]));
    2404      if isequal(lower(ext),'.vol')
    2405          testvol=testvol+1;
    2406      elseif ~isempty(form)||isequal(lower(ext),'.avi')% if the extension corresponds to an image format recognized by Matlab
    2407          testima=testima+1;
    2408      elseif isequal(ext,'.nc')
    2409          testnc=testnc+1;
    2410      end
    2411 end
    2412 if testvol
    2413     msgbox_uvmat('ERROR','volume images not implemented yet')
    2414     return
    2415 end
    2416 if testnc~=nbview && testima~=nbview && testvol~=nbview
    2417     msgbox_uvmat('ERROR','need a set of images or a set of netcdf files with the same fields as input')
    2418     return
    2419 end
    2420 if ~isequal(FieldName,'get_field...')
    2421     testcivx=testnc;
    2422 end
    2423 %name of output files and directory:
    2424 % res_subdir=fullfile(Series.RootPath{1},[Series.SubDir{1} '_STAT']);
    2425 ProjectDir=fileparts(fileparts(Series.RootPath{1}));% preoject directory (GERK)
    2426 prompt={['result directory (in' ProjectDir ')']};
    2427 RootPath=get(hseries.RootPath,'String');
    2428 SubDir=get(hseries.SubDir,'String');
    2429 if isequal(length(RootPath),1)
    2430     fulldir=RootPath{1};
    2431     subdir='GRID';
    2432     res_subdir=fullfile(fulldir,subdir);
    2433 else
    2434     def={fullfile(ProjectDir,'0_RESULTS')};
    2435     dlgTitle='result directory';
    2436     lineNo=1;
    2437     answer=msgbox_uvmat('INPUT_TXT',dlgTitle,def);
    2438     fulldir=answer{1};
    2439     subdir=[];
    2440     dirlist=sort(Series.RootFile);
    2441     for iview=1:nbview
    2442         if ~isempty(subdir)
    2443             subdir=[subdir '-'];
    2444         end
    2445         subdir=[subdir dirlist{iview}];
    2446     end 
    2447     res_subdir=fullfile(fulldir,subdir);
    2448 end
    2449 ext=FileExt{1};
    2450 if ~exist(fulldir,'dir')
    2451     msgbox_uvmat('ERROR',['directory ' fulldir ' needs to be created'])
    2452     return
    2453 end
    2454 if ~exist(res_subdir,'dir')
    2455     dircur=pwd;
    2456     cd(fulldir)
    2457     error=mkdir(subdir);
    2458     cd(dircur)
    2459 end
    2460 filebasesub=fullfile(res_subdir,Series.RootFile{1});
    2461 filebase_merge=fullfile(res_subdir,'merged');%root name for the merged files
    2462 
    2463 %projection object
    2464 if isfield(Series,'sethandles')
    2465     if ishandle(Series.sethandles.set_object)
    2466         Series.ProjObject=read_set_object(Series.sethandles);
    2467         if ~isfield(Series.ProjObject,'Style')
    2468             msgbox_uvmat('ERROR','Undefined projection object style')
    2469             return
    2470         end
    2471         if ~isequal(Series.ProjObject.Style,'plane')
    2472             msgbox_uvmat('ERROR','The projection object must be a plane')
    2473             return
    2474         end
    2475     end
    2476 end
    2477 
    2478     %MAIN LOOP
    2479 for ifile=1:nbfield               
    2480     stopstate=get(hseries.RUN,'BusyAction');
    2481     if isequal(stopstate,'queue')% enable STOP command from the 'series' interface
    2482          update_waitbar(hseries.waitbar,WaitbarPos,ifile/nbfield)
    2483          Amerge=0;
    2484          
    2485          %----------LOOP ON VIEWS----------------------
    2486         nbtime=0;
    2487         for iview=1:nbview
    2488             %name of the current file
    2489             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});
    2490             if ~exist(filename,'file')
    2491                 msgbox_uvmat('ERROR',['missing input file' filename])
    2492                 break
    2493             end
    2494 
    2495             %reading the current file
    2496             if testima
    2497                 if test_movie(iview)
    2498                     Field{iview}.A=read(MovieObject{iview},num_i1{iview}(ifile));
    2499                 else
    2500                     Field{iview}.A=read_image(filename,Series.NomType{iview},num_i1{iview}(ifile));
    2501                 end % TODO: introduce ListVarName
    2502                 npxy=size(Field{iview}.A);
    2503                 Field{iview}.AX=[0.5 npxy(2)-0.5]; % coordinates of the first and last pixel centers
    2504                 Field{iview}.AY=[npxy(1)-0.5 0.5];
    2505                 Field{iview}.CoordType='px';
    2506                 Field{iview}.AName='image';
    2507             else
    2508                 if testcivx
    2509                     [Field{iview},VelTypeOut]=read_civxdata(filename,FieldName,VelType);
    2510                 else
    2511                     [Field{iview},var_detect]=nc2struct(filename,SubField.ListVarName); %read the corresponding input data               
    2512                     Field{iview}.VarAttribute=SubField.VarAttribute;
    2513                 end
    2514                 if isfield(Field{iview},'Time')
    2515                     timeread(iview)=Field{iview}.Time;
    2516                     nbtime=nbtime+1;
    2517                 end
    2518             end
    2519             % coord transform
    2520             % z index
    2521             if ~isempty(NbSlice_calib)
    2522                 Field{iview}.ZIndex=mod(num_i1{iview}(ifile)-1,NbSlice_calib{1})+1;
    2523             end
    2524             if ~isequal(transform,'')
    2525                 Field{iview}=feval(Series.CoordType,Field{iview},XmlData{iview});%transform to phys if requested
    2526             end
    2527             if testcivx
    2528                     Field{iview}=calc_field(FieldName,Field{iview});
    2529             end
    2530 
    2531             %projection on object (gridded plane)
    2532             if isfield(Series,'ProjObject')
    2533                 Field{iview}=proj_field(Field{iview},Series.ProjObject);
    2534             end
    2535         end   
    2536        
    2537          %----------END LOOP ON VIEWS----------------------
    2538          
    2539         %merge the nbview fields
    2540         MergeData=merge_field(Field);
    2541         if isfield(MergeData,'Txt')
    2542             msgbox_uvmat('ERROR',MergeData.Txt)
    2543             return
    2544         end
    2545        
    2546         % generating the name of the merged field
    2547         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));
    2548        
    2549         % time:
    2550         time_i=0;%default
    2551         if isempty(time)% time from ImaDoc prevails
    2552             time_i=sum(timeread)/nbtime;
    2553         else
    2554             time_i=(time(iview,num_i1{iview}(ifile),num_j1{iview}(ifile))+time(iview,num_i2{iview}(ifile),num_j2{iview}(ifile)))/2;
    2555         end
    2556        
    2557         % recording the merged field
    2558         if testima    %in case of input images an image is produced   
    2559             if isa(MergeData.A,'uint8')
    2560                 bitdepth=8;
    2561             elseif isa(MergeData.A,'uint16')
    2562                 bitdepth=16;
    2563             end
    2564             imwrite(MergeData.A,mergename,'BitDepth',bitdepth);
    2565             %write xml calibration file
    2566             siz=size(MergeData.A);
    2567             npy=siz(1);
    2568             npx=siz(2);
    2569             if isfield(MergeData,'VarAttribute')&&isfield(MergeData.VarAttribute{1},'Coord_2')&&isfield(MergeData.VarAttribute{1},'Coord_1')
    2570                 Rangx=MergeData.VarAttribute{1}.Coord_2;
    2571                 Rangy=MergeData.VarAttribute{1}.Coord_1;
    2572             elseif isfield(MergeData,'AX')&& isfield(MergeData,'AY')
    2573                 Rangx=[MergeData.AX(1) MergeData.AX(end)];
    2574                 Rangy=[MergeData.AY(1) MergeData.AY(end)];
    2575             else
    2576                 Rangx=[0.5 npx-0.5];
    2577                 Rangy=[npy-0.5 0.5];%default
    2578             end
    2579             pxcmx=(npx-1)/(Rangx(2)-Rangx(1));
    2580             pxcmy=(npy-1)/(Rangy(1)-Rangy(2));
    2581             T_x=-pxcmx*Rangx(1)+0.5;
    2582             T_y=-pxcmy*Rangy(2)+0.5;
    2583             GeometryCal.focal=1;
    2584             GeometryCal.R=[pxcmx,0,0;0,pxcmy,0;0,0,1];
    2585             GeometryCal.Tx_Ty_Tz=[T_x T_y 1];
    2586             ImaDoc.GeometryCalib=GeometryCal;
    2587             t=struct2xml(ImaDoc);
    2588             t=set(t,1,'name','ImaDoc');
    2589             save(t,[filebase_merge '.xml'])     
    2590             display([filebase_merge '.xml saved'])
    2591         else
    2592             MergeData.ListGlobalAttribute={'Project','InputFile_1','InputFile_end','nb_coord','nb_dim','dt','Time','civ'};       
    2593             MergeData.nb_coord=2;
    2594             MergeData.nb_dim=2;
    2595             MergeData.dt=1;
    2596             MergeData.Time=time_i;
    2597             error=struct2nc(mergename,MergeData); %save result file
    2598             if isempty(error)
    2599                 display(['output file ' mergename ' written'])
    2600             else
    2601                 display(error)
    2602             end
    2603         end
    2604     end
    2605 end
    2606 
    2607 %--------------------------------------------------------------------------   
    2608 function MergeData=merge_field(Data)
    2609 % initiate Matlab  structure for physical field
    2610 if isempty(Data)||~iscell(Data)
    2611     MergeData=[];
    2612     return
    2613 end
    2614 MergeData=Data{1};%default
    2615 error=0;
    2616 nbview=length(Data);
    2617 if nbview==1
    2618     return
    2619 end
    2620 for iview=1:nbview
    2621     if ~isequal(MergeData.ListDimName,Data{iview}.ListDimName)
    2622         error=1;
    2623     end
    2624     if ~isequal(MergeData.ListVarName,Data{iview}.ListVarName)
    2625         error=1;
    2626     end
    2627 %      if ~isequal(MergeData.VarDimIndex,Data{iview}.VarDimIndex)
    2628 %         error=1;
    2629 %      end
    2630 end
    2631 if error
    2632     MergeData.Txt='ERROR: attempt at merging fields of incompatible type';
    2633     return
    2634 end
    2635 %group the variables (fields of 'FieldData') in cells of variables with the same dimensions
    2636 %-----------------------------------------------------------------
    2637 [CellVarIndex,NbDim,VarTypeCell]=find_field_indices(Data{1});
    2638 %LOOP ON GROUPS OF VARIABLES SHARING THE SAME DIMENSIONS
    2639 % CellVarIndex=cells of variable index arrays
    2640 ivar_new=0; % index of the current variable in the projected field
    2641 icoord=0;
    2642 for icell=1:length(CellVarIndex)
    2643     if NbDim(icell)==1
    2644         continue
    2645     end
    2646     VarIndex=CellVarIndex{icell};%  indices of the selected variables in the list FieldData.ListVarName
    2647     VarType=VarTypeCell{icell};
    2648     ivar_X=VarType.coord_x;
    2649     ivar_Y=VarType.coord_y;
    2650     ivar_FF=VarType.errorflag;
    2651     if isempty(ivar_X)
    2652         test_grid=1;%test for input data on regular grid (e.g. image)coordinates
    2653     else
    2654         if length(ivar_Y)~=1
    2655                 warndlg_uvmat('y coordinate missing in proj_field.m','ERROR')
    2656                 return
    2657         end
    2658         test_grid=0;
    2659     end
    2660 %    DimIndices=Data{1}.VarDimIndex{VarIndex(1)};%indices of the dimensions of the first variable (common to all variables in the cell)
    2661     %case of input fields with unstructured coordinates
    2662     if ~test_grid
    2663         for ivar=VarIndex
    2664             VarName=MergeData.ListVarName{ivar};
    2665             for iview=1:nbview
    2666                 eval(['MergeData.' VarName '=[MergeData.' VarName '; Data{iview}.' VarName ';'])
    2667             end
    2668         end
    2669     %case of fields defined on a structured  grid
    2670     else 
    2671 %        DimValue=MergeData.DimValue(DimIndices);%set of dimension values
    2672         testFF=0;
    2673         for iview=2:nbview
    2674 %             if ~isequal(DimValue,Data{iview}.DimValue(DimIndices))
    2675 %                 MergeData.Txt='ERROR: attempt at merging structured fields with different sizes';
    2676 %                 return
    2677 %             end
    2678             for ivar=VarIndex
    2679                 VarName=MergeData.ListVarName{ivar};
    2680                 if isfield(MergeData,'VarAttribute')
    2681                     if length(MergeData.VarAttribute)>=ivar && isfield(MergeData.VarAttribute{ivar},'Role') && isequal(MergeData.VarAttribute{ivar}.Role,'errorflag')
    2682                         testFF=1;
    2683                     end
    2684                 end
    2685                 eval(['MergeData.' VarName '=MergeData.' VarName '+ Data{iview}.' VarName ';'])
    2686             end
    2687         end
    2688         if testFF
    2689             nbaver=nbview-MergeData.FF;
    2690             indgood=find(nbaver>0);
    2691             for ivar=VarIndex
    2692                 VarName=MergeData.ListVarName{ivar};
    2693                 eval(['MergeData.' VarName '(indgood)=double(MergeData.' VarName '(indgood))./nbaver(indgood);'])
    2694             end
    2695         else
    2696             for ivar=VarIndex
    2697                 VarName=MergeData.ListVarName{ivar};
    2698                 eval(['MergeData.' VarName '=double(MergeData.' VarName ')./nbview;'])
    2699             end   
    2700         end
    2701     end
    2702 end
    2703    
    2704    
    2705 
     1969%     
    27061970
    27071971%-----------------------------
  • trunk/src/series/aver_stat.m

    r27 r29  
    3232WaitbarPos=get(hseries.waitbar_frame,'Position');
    3333%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    34 
    3534%root input file and type
    3635if ~iscell(Series.RootPath)% case of a single input field series
     
    235234
    236235% Root name of output files (TO GENERALISE FOR TWO INPUT SERIES)
    237 filebasesub=fullfile(RootPath{1},SubDir{1},RootFile{1});
    238 if isempty(SubDir{1}) % create a subdirectory '/mean'
    239     subdir_result='mean';
     236subdir_result='aver_stat';
     237% filebasesub=fullfile(RootPath{1},subdir_result,RootFile{1});
     238% if isempty(SubDir{1}) % create a subdirectory '/aver_stat'
     239%     subdir_result='aver_stat';
    240240%     filebasemean=fullfile(RootPath{1},subdir_result);
    241     if ~exist(fullfile(RootPath{1},subdir_result),'dir')
    242         dircur=pwd; %record current working directory
    243         cd(RootPath{1})% goes to the iamge directory
    244         [m1,m2,m3]=mkdir(subdir_result);
    245         if ~isequal(m2,'')
    246              msgbox_uvmat('CONFIRMATION',m2);%error message for directory creation
    247         end
    248         cd(dircur) %back to the initial working directory
    249     end
    250     filebase_out=filebase{1};
    251 else
    252    subdir_result=SubDir{1};
    253    filebase_out=[filebase{1} '_mean'];% output root name obtained by adding the suffix _mean to the input
    254 end
     241if ~exist(fullfile(RootPath{1},subdir_result),'dir')
     242    dircur=pwd; %record current working directory
     243    cd(RootPath{1})% goes to the iamge directory
     244    [m1,m2,m3]=mkdir(subdir_result);
     245    if ~isequal(m2,'')
     246         msgbox_uvmat('CONFIRMATION',m2);%error message for directory creation
     247    end
     248    cd(dircur) %back to the initial working directory
     249end
     250filebase_out=filebase{1};
     251% else
     252%    subdir_result=SubDir{1};
     253%    filebase_out=[filebase{1} '_mean'];% output root name obtained by adding the suffix _mean to the input
     254% end
    255255%output nomtype (to generalise)
    256256NomTypeOut=nomtype2pair(NomType{1},num_i2{end}(end)-num_i1{1}(1),num_j2{end}(end)-num_j1{1}(1));
    257257   
    258 if NbSlice==1 
    259     filebase_out=[filebasesub '_mean'];
    260 else
    261     filebase_out=[filebasesub '_' NbSlice_name 'mean'];
    262     answeryes=questdlg({['will make average in ' num2str(NbSlice) ' slices'];['results stored as files ' filebase_out ' ...']});
    263     if ~isequal(answeryes,'Yes')
    264         return
    265     end
    266 end
     258% if NbSlice==1 
     259%     filebase_out=[filebasesub '_mean'];
     260% else
     261%     filebase_out=[filebasesub '_' NbSlice_name 'mean'];
     262%     answeryes=questdlg({['will make average in ' num2str(NbSlice) ' slices'];['results stored as files ' filebase_out ' ...']});
     263%     if ~isequal(answeryes,'Yes')
     264%         return
     265%     end
     266% end
    267267
    268268% coordinate transform or other user defined transform
     
    394394    %writing the result file
    395395   if testima   
    396        if NbSlice==1
    397         [filemean]=name_generator(filebase_out,num_i1{1}(1),num_j1{1}(1),'.png',NomTypeOut,1,num_i2{end}(end),num_j2{end}(end));
    398        else % label the file number by the slice # for simplicity
    399           [filemean]=name_generator(filebase_out,i_slice,1,'.png','_i');
    400        end
     396%        if NbSlice==1
     397        [filemean]=name_generator(filebase_out,num_i1{1}(1),num_j1{1}(1),'.png',NomTypeOut,1,num_i2{end}(end),num_j2{end}(end),subdir_result);
     398%        else % label the file number by the slice # for simplicity
     399%           [filemean]=name_generator(filebase_out,i_slice,1,'.png','_i');
     400%        end
    401401        if exist(filemean,'file')
    402402            backupfile=filemean;
     
    429429            DataMean.ListGlobalAttribute=[DataMean.ListGlobalAttribute {'Time','Time_end'}];
    430430        end 
    431         if NbSlice==1
    432           filemean=name_generator(filebase_out,num_i1{1}(1),num_j1{1}(1),'.nc',NomTypeOut,1,num_i2{end}(end),num_j2{end}(end));
    433         else % label the file number by the slice # for simplicity
    434           [filemean]=name_generator(filebase_out,i_slice,1,'.nc','_i');
    435         end
     431%         if NbSlice==1
     432          filemean=name_generator(filebase_out,num_i1{1}(1),num_j1{1}(1),'.nc',NomTypeOut,1,num_i2{end}(end),num_j2{end}(end),subdir_result);
     433%         else % label the file number by the slice # for simplicity
     434%           [filemean]=name_generator(filebase_out,i_slice,1,'.nc','_i');
     435%         end
    436436        if exist(filemean,'file')
    437437            backupfile=filemean;
     
    459459hget_field=findobj(allchild(0),'name','get_field');%find the get_field... GUI
    460460delete(hget_field)
    461 'TEST'
    462461uvmat(filemean)
  • trunk/src/update_imadoc.m

    r17 r29  
    1010testappend=0;
    1111if exist(outputfile,'file');%=1 if the output file already exists, 0 else 
     12    testappend=1;
    1213    t=xmltree(outputfile); %read the file
    1314    backupfile=outputfile;
     
    2829        [t,uid_calib]=add(t,1,'element','GeometryCalib');
    2930    else %if GeometryCalib already exists, delete its content
    30 %         backupfile=outputfile;
    31 %         testexist=2;
    32 %         while testexist==2
    33 %            backupfile=[backupfile '~'];
    34 %            testexist=exist(backupfile,'file');
    35 %         end
    36 %         [success,message]=copyfile(outputfile,backupfile);%make backup
    3731        if isequal(success,1)
    3832            delete(outputfile)
     
    4236        uid_child=children(t,uid_calib);
    4337        t=delete(t,uid_child);
    44         testappend=1;
    4538    end
    4639end
     
    4942    t=set(t,1,'name','ImaDoc');
    5043    [t,uid_calib]=add(t,1,'element','GeometryCalib');
    51 %     t=struct2xml(GeometryCalib,t,uid_calib);
    5244end
    5345t=struct2xml(GeometryCalib,t,uid_calib);
  • trunk/src/uvmat.m

    r17 r29  
    470470%----------------------------------------------------------------
    471471function display_file_name(hObject, eventdata, handles,fileinput)
     472if ~exist(fileinput,'file')
     473    msgbox_uvmat('ERROR',['input file ' fileinput  ' does not exist'])
     474    return
     475end
    472476[RootPath,RootFile,i1,i2,str_a,str_b,ext,NomType,SubDir]=name2display(fileinput);
    473 form=imformats(ext(2:end));%test valid Matlab image formats
    474 if ~isempty(form)
    475     ext_test='.image';
    476     imainfo=imfinfo(fileinput); 
    477     if length(imainfo) >1 %case of image with multiple frames
     477ext_test=''; %default
     478if ~isempty(ext)
     479    form=imformats(ext(2:end));%test valid Matlab image formats
     480    if ~isempty(form)
     481        ext_test='.image';
     482        imainfo=imfinfo(fileinput); 
     483        if length(imainfo) >1 %case of image with multiple frames
     484            i1='1'; % set the frame counter to 1 by default
     485            i2='';
     486            str_a='';
     487            str_b='';
     488            NomType='*'; %indicate a set of indexed frames within a single file
     489            [RootPath,RootFile]=fileparts(fileinput); %include the indices in the root file
     490        end
     491    elseif isequal(lower(ext),'.avi')
     492        ext_test='.image';
    478493        i1='1'; % set the frame counter to 1 by default
    479494        i2='';
     
    482497        NomType='*'; %indicate a set of indexed frames within a single file
    483498        [RootPath,RootFile]=fileparts(fileinput); %include the indices in the root file
    484     end
    485 elseif isequal(lower(ext),'.avi')
    486     ext_test='.image';
    487     i1='1'; % set the frame counter to 1 by default
    488     i2='';
    489     str_a='';
    490     str_b='';
    491     NomType='*'; %indicate a set of indexed frames within a single file
    492     [RootPath,RootFile]=fileparts(fileinput); %include the indices in the root file
    493 else
    494     ext_test=lower(ext);
     499    else
     500        ext_test=lower(ext);
     501    end
    495502end
    496503switch ext_test
Note: See TracChangeset for help on using the changeset viewer.