source: trunk/src/name_generator.m @ 120

Last change on this file since 120 was 120, checked in by gostiaux, 13 years ago

gedit

File size: 15.5 KB
Line 
1%'name_generator': creates a file name from a root name and indices.
2%------------------------------------------------------------------------
3% [filename,idetect,num_i1_out,num_j1_out,num_i2_out,num_j2_out,subdir_out]=...
4%        name_generator(filebase,num_i1,num_j1,ext,nom_type,comp_input,num_i2,num_j2,subdir);
5%------------------------------------------------------------------------           
6% This function detects the existence the constructed file name and it can
7% find indices according to file existence if they are not specified
8% rmq: this function is related to the reverse functions display2name and name2diplay
9%------------------------------------------------------------------------
10% OUTPUT:
11% filename: string representing the file name (including path)
12% idetect: =1 if the file is detected, 0 otherwise
13% num_i1_out,num_j1_out,num_i2_out,num_j2_out,subdir_out: index numbers and subdirectory detected
14%            for free input (= to the corresponding input indices when comp_input=1)
15%------------------------------------------------------------------------
16% INPUT:
17% 'filebase': the root name,
18% 'num_i1: first labelling index i
19% 'num_j1', first labelling index j
20% 'ext': file name extension (e.g. '.png' or '.nc')
21% 'nom_type': string defining the kind of nomenclature used:
22%       nom_type='': constant name [filebase ext] (default output if 'nom_type' is undefined)
23%       nom_type='*': the same  file [filebase ext] contains successive fields (ex avi movies)
24%       nom_type='%03d' or '%04d', series of indexed images with numbers completed with zeros to 3 or 4 digits, e.g.'aa045.tif'
25%       nom_type='_i': series of files with a single index i preceded by '_'(e.g. 'aa_45.png').
26%       nom_type='_%03d', '_%04d', or '_%05d', series of indexed images with _ and numbers completed with zeros to 3, 4 or 5 digits, e.g.'aa_045.tif'
27%       nom_type='#' series of indexed images wich is not series_i [filebase index ext], e.g. 'aa045.jpg' or 'aa45.tif'
28%       nom_type='_i_j' matrix of files with two indices i and j separated by '_'(e.g. 'aa_45_2.png')
29%       nom_type='_i1-i2' from pairs from a single index (e.g. 'aa_45-47.nc')
30%       nom_type='_i_j1-j2'pairs of j indices (e.g. 'aa_45_2-3.nc')
31%       nom_type='_i1-i2_j' pairs of i indices (e.g. 'aa_45-46_2.nc')
32%       nom_type='%3da','%3dA' with a numerical index and an index letter(e.g.'aa045b.png'),
33%       nom_type='#a','#A' with a numerical index and an index letter(e.g.'aa045b.png'), OBSOLETE (replaced by 'series_i_j')
34%       nom_type='#_ab' from pairs of '#a' images (e.g. 'aa045bc.nc'),
35%       nom_type='%3d_ab' from pairs of '%3da' images (e.g. 'aa045bc.nc')
36%'comp_input' (for nom_type involving index pairs (e.g. netc))
37%       comp_input=1: the index pair is imposed,
38%       comp_input=0: the index pair is automatically searched, choosing the most recent  file in case of multiple choice
39% 'num_i2': second index i (for nom_type involving index pairs (e.g. netc))
40% 'num_j2': second index j (for nom_type involving index pairs (e.g. netc))
41% 'subdir': (used for nom_type=netc...) string representing the name of the subdirectory 'subdir' containing file.
42%       subdir='': no subdirectory,
43%       subdir='?', the file is first searched with no subdirectory, then in the most recently modified subdirectory if not detected.
44
45% A FAIRE: si comp_inpu=0, si _i_j n'existe pas, chercher _i,
46function [filename,num_i1_out,num_j1_out,num_i2_out,num_j2_out,subdir_out]=...
47           name_generator(filebase,num_i1,num_j1,ext,nom_type,comp_input,num_i2,num_j2,subdir);
48sizf=size(filebase);
49if (~ischar(filebase)||~isequal(sizf(1),1)),filebase='';end
50if ~exist('ext','var')
51    ext='';
52end
53if ~exist('nom_type','var')
54    nom_type='';
55end
56if ~ischar(ext),ext='';end
57idetect=0;
58if ~exist('num_i1','var') || isempty(num_i1) || isnan(num_i1)
59    num_i1=1; %default
60end
61if ~exist('num_j1','var') ||  isempty(num_j1) || isnan(num_j1)
62    num_j1=1; %default
63end
64if ~exist('num_i2','var') ||  isempty(num_i2) || isnan(num_i2)
65    num_i2=num_i1; %default
66end
67if ~exist('num_j2','var') || isempty(num_j2) || isnan(num_j2)
68    num_j2=num_j1; %default
69end
70if ~exist('subdir','var')|| isempty(subdir)
71    subdir='' ; %default
72end
73num_i1_out=num_i1;%default output
74num_j1_out=num_j1;%default output
75num_i2_out=num_i2;%default output
76num_j2_out=num_j2;%default output
77
78test_pairs=strcmp(nom_type,'netc_old')| strcmp(nom_type,'netc_2D') | strcmp(nom_type,'netc_3D')| strcmp(nom_type,'_i1-i2_j1-j2')| ...
79  strcmp(nom_type,'netc_series')| strcmp(nom_type,'#_ab')| strcmp(nom_type,'_i_j1-j2')| strcmp(nom_type,'_i1-i2_j')| strcmp(nom_type,'_i1-i2');
80test_2D= strcmp(nom_type,'netc_old') |strcmp(nom_type,'netc_2D')|strcmp(nom_type,'#_ab') |strcmp(nom_type,'_i_j1-j2');
81test_3D=strcmp(nom_type,'netc_3D') |strcmp(nom_type,'netc_series')| strcmp(nom_type,'_i1-i2_j')| strcmp(nom_type,'_i1-i2');
82if strcmp(nom_type,'series_i')| strcmp(nom_type,'_i');
83        filename=[filebase '_' num2str(num_i1) ext];
84        num_i2_out=num_i1;
85        num_j1_out=[];
86        num_j2_out=[];
87elseif length(nom_type)==5 && strcmp(nom_type(1:3),'_%0')&& strcmp(nom_type(5),'d');
88        filename=[filebase '_' num2str(num_i1,nom_type(2:5)) ext];
89        num_i2_out=num_i1;
90        num_j2_out=num_j1;
91elseif strcmp(nom_type,'series_i_j')| strcmp(nom_type,'_i_j')
92        filename=[filebase '_' num2str(num_i1) '_' num2str(num_j1) ext];
93        num_i2_out=num_i1;
94        num_j2_out=num_j1;
95elseif strcmp(nom_type,'png_old')| strcmp(nom_type,'#a')| strcmp(nom_type,'#A')
96        filename=[filebase num2str(num_i1,'%03d') num2stra(num_j1,nom_type) ext];
97        num_i2_out=num_i1;
98        num_j2_out=num_j1;
99elseif  length(nom_type)>=5 & strcmp(nom_type(2:3),'%0') & strcmp(nom_type(5),'d')  %strcmp(nom_type,'_%04dA') %camera PCO Toulouse
100        filename=[filebase nom_type(1) num2str(num_i1,nom_type(2:4)) num2stra(num_j1,nom_type) ext];
101        num_i2_out=num_i1;
102        num_j2_out=num_j1;   
103elseif strcmp(nom_type,'raw_SMD') %suffix a, b, c without extension
104        filename=[filebase num2str(num_i1,'%03d') num2stra(num_j1,nom_type)];
105        num_i2_out=num_i1;
106        num_j2_out=num_j1;
107elseif strcmp(nom_type,'ima_num')| strcmp(nom_type,'#')
108        filename=[filebase num2str(num_i1) ext];
109        num_i2_out=num_i1;
110        num_j1_out=[];
111        num_j2_out=[];
112elseif length(nom_type)>=4 & strcmp(nom_type(1:2),'%0') & strcmp(nom_type(end),'d')
113        filename=[filebase num2str(num_i1,nom_type) ext]; %test number with a 0 before
114        num_i2_out=num_i1;
115        num_j1_out=[];
116        num_j2_out=[];
117elseif length(nom_type)>=4 & strcmp(nom_type(1:2),'%0') & strcmp(nom_type(end-1:end),'dA')
118        filename=[filebase num2str(num_i1,nom_type(1:end-1)) num2stra(num_j1,'#A') ext]; %test number with a 0 before
119        num_i2_out=num_i1;
120        num_j1_out=[];
121        num_j2_out=[];
122
123%case of derived file indexing (e.g. netcdf files)
124elseif test_pairs
125    filebasesub=filebase;
126    % get the root name filebasesub for the netcdf files
127    if  ~strcmp(subdir,'') && ~strcmp(subdir,'?')
128            [Path,Name]=fileparts(filebase);
129            filebasesub=fullfile(Path,subdir,Name);
130    end
131     %inexistant pair if num_i2=0 or num_j2=0
132%     if strcmp(num_i2,0)
133%         filename=[filebasesub '*-*_' num2str(num_i1) ext];
134%         return
135%     end
136%     if strcmp(num_j2,0)
137%         filename=[filebasesub '_' num2str(num_i1) '_*-*' ext];
138%         return
139%     end
140    % case of an imposed image pair (comp_input=1)
141    if  (exist('comp_input','var') & isequal(comp_input,1))
142            if isequal(nom_type,'netc_old')|isequal(nom_type,'#_ab')
143                if isequal(num2str(num_j1),num2str(num_j2))% case of displacements at the same time
144                    filename=[filebasesub num2str(num_i1,'%03d') '_' num2stra(num_j1,nom_type) ext];
145                else
146                    filename=[filebasesub num2str(num_i1,'%03d') '_' num2stra(num_j1,nom_type) num2stra(num_j2,nom_type) ext];
147                end
148                num_i2_out=num_i1;
149            elseif isequal(nom_type,'netc_2D')|isequal(nom_type,'_i_j1-j2')
150                if isequal(num2str(num_j1),num2str(num_j2))% case of displacements at the same time
151                    filename=[filebasesub '_' num2str(num_i1) '_' num2str(num_j1) ext];
152                else
153                    filename=[filebasesub '_' num2str(num_i1) '_' num2str(num_j1) '-' num2str(num_j2) ext];
154                end
155                num_i2_out=num_i1;
156            elseif isequal(nom_type,'netc_3D') || isequal(nom_type,'_i1-i2_j')
157                if isequal(num2str(num_i1),num2str(num_i2))% case of displacements at the same time
158                      filename=[filebasesub '_' num2str(num_i1) '_' num2str(num_j1) ext];
159                else
160                    filename=[filebasesub '_' num2str(num_i1) '-' num2str(num_i2) '_' num2str(num_j1) ext];
161                end
162                num_j2_out=num_j1;
163            elseif isequal(nom_type,'netc_series') || isequal(nom_type,'_i1-i2')
164                if isequal(num2str(num_i1),num2str(num_i2))% case of displacements at the same time
165                     filename=[filebasesub '_' num2str(num_i1) ext];
166                else
167                    filename=[filebasesub '_' num2str(num_i1) '-' num2str(num_i2) ext];
168                end
169                num_j2_out=num_j1;
170            elseif isequal(nom_type,'_i1-i2_j1-j2')
171                if isequal(num2str(num_i1),num2str(num_i2))% case of displacements at the same time
172                    app1= [num2str(num_i1)];
173                else
174                    app1= [num2str(num_i1) '-' num2str(num_i2)];
175                end
176                if isequal(num2str(num_j1),num2str(num_j2))% case of displacements at the same time
177                    app2= [num2str(num_j1)];
178                else
179                    app2= [num2str(num_j1) '-' num2str(num_j2)];
180                end     
181                filename=[filebasesub '_' app1 '_' app2 ext];
182            end
183            idetect=1;
184           % idetect=(exist(filename,'file')==2);
185     % case of an image pair to determine (comp_input=0)
186    else
187            [filename,num_i1_out,num_j1_out,num_i2_out,num_j2_out,idetect]=search_pair(filebasesub,num_i1,num_j1,num_i2,nom_type);
188    end
189   
190     %look for sub-directories containing netcdf files
191    if idetect==0 && isequal(subdir,'?')
192        [pathfile,name]=fileparts(filebase);
193        direct=dir(pathfile);%directory containing filebase
194        datedir=[];%default
195        idir=0;
196        indir=find(cell2mat({direct.isdir}));% find indices of subdirectories
197        direct=direct(indir([3:end]));% keep only the subdirectories,eliminating the two first terms '.' and '..'
198        lengthdir=length(direct);
199        if lengthdir==0
200            subdir='';% no subdirectory found
201        else
202            for idir=1:lengthdir
203                date_str=direct(idir).date;%string of the date of last modification
204                datedir(idir)=0;%default
205                char_code=double(date_str);% code of the date characters
206                special_char=(char_code>127); %non standard Ascii character (e.g. date in french)
207                if isempty(find(special_char))% standard Ascii character
208                    datedir(idir)=datenum(date_str);
209                end                           
210%                 datedir(idir)=datenum(direct(idir).date); %absolute date of last directory modification
211            end
212            [mostrec,indrec]=max(datedir);% most recently modified subdir chosen by default
213            subdir=direct(indrec).name; %chosen directory
214        end
215        filebasesub=fullfile(pathfile,subdir,name);
216        %if the image pair is imposed
217        if (exist('comp_input','var') & isequal(comp_input,1))
218            if isequal(nom_type,'netc_old')|isequal(nom_type,'#_ab')
219                filename=[filebasesub num2str(num_i1,'%03d') '_' num2stra(num_j1,nom_type) num2stra(num_j2,nom_type) ext];
220            elseif isequal(nom_type,'netc_2D')|isequal(nom_type,'_i1_j1-j2')
221                filename=[filebasesub '_' num2str(num_i1) '_' num2str(num_j1) '-' num2str(num_i2) ext];
222            elseif isequal(nom_type,'netc_3D')|isequal(nom_type,'_i1-i2_j')
223                filename=[filebasesub '_' num2str(num_i1) '-' num2str(num_i2) '_' num2str(num_j1) ext];
224            elseif isequal(nom_type,'netc_series')|isequal(nom_type,'_i1-i2')
225                filename=[filebasesub '_' num2str(num_i1) '-' num2str(num_i2) ext];
226            end
227            idetect=(exist(filename,'file')==2);
228        else
229            [filename,num_i1_out,num_j1_out,num_i2_out,num_j2_out,idetect]=search_pair(filebasesub,num_i1,num_j1,num_i2,nom_type);             
230        end
231    end
232% elseif isequal(nom_type,'none')|isequal(nom_type,'')|isequal(nom_type,'*')
233else
234    filebasesub=filebase;
235    if ~isequal(subdir,'') && ~isequal(subdir,'?')
236            [Path,Name]=fileparts(filebase);
237            filebasesub=fullfile(Path,subdir,Name);
238    end
239    filename=[filebasesub ext];
240    idetect=(exist(filename,'file')==2); 
241end
242if ~isequal(subdir,'?'), subdir_out=subdir; else, subdir_out='';end;
243
244%------------------------------------------------------------------------
245% --- search the appropriate image pair (netcdf file) corresponding to a given image number
246function [filename,num_i1,num_j1,num_i2,num_j2,idetect]=search_pair(filebasesub,num_i1,num_j1,num_i2,nom_type)
247%------------------------------------------------------------------------
248% for nom_type=netc_2D or netc_old, it searches all the pairs corresponding
249% to num_i1, and chooses the most recent file.
250%for nom_type=netc_3D or netc_series, it searches all the pairs (num_i1
251%num_i2), with num_i1 as the first  index, and chooses the most recent file.
252
253filename=[];num_j2=[];idetect=0;%default values
254if isequal(nom_type,'netc_old')|isequal(nom_type,'#_ab')
255    dirpair=dir([filebasesub num2str(num_i1,'%03d') '_*.nc']);
256elseif isequal(nom_type,'netc_2D')|isequal(nom_type,'_i_j1-j2')
257    dirpair=dir([filebasesub '_' num2str(num_i1) '_*-*.nc']);
258elseif isequal(nom_type,'netc_3D')|isequal(nom_type,'_i1-i2_j')
259    dirpair=dir([filebasesub '_' num2str(num_i1) '-*_' num2str(num_j1) '.nc']);
260elseif isequal(nom_type,'netc_series')|isequal(nom_type,'_i1-i2')
261    dirpair=dir([filebasesub '_' num2str(num_i1) '-*.nc']);
262    if isempty(dirpair)
263        dirpair=dir([filebasesub '_*-' num2str(num_i2) '.nc']);
264    end
265end
266nbpair=length(dirpair);
267if nbpair >= 1 %choose the most recent file if several are found
268    idetect=1; %detected pair
269    for ipair=1:nbpair
270         date_str=dirpair(ipair).date;%string of the date of last modification
271         datepair(ipair)=0;%default
272         char_code=double(date_str);% code of the date characters
273         special_char=(char_code>127); %non standard Ascii character (e.g. date in french)
274         if isempty(find(special_char))% standard Ascii character
275             datepair(ipair)=datenum(date_str);
276         end   
277      %  datepair(ipair)=datenum(dirpair(ipair).date);
278    end
279    [choice,indpair]=max(datepair);
280%     [filebase,field_count,str2,str_a,str_b,ext,nom_type]=name2display(dirpair(indpair).name);
281    [pathname,file,field_count,str2,str_a,str_b,ext,nom_type]=name2display(dirpair(indpair).name);
282    num_i1=str2num(field_count);
283    num_i2=str2num(str2);
284    num_j1=stra2num(str_a);
285    num_j2=stra2num(str_b);
286     pathname=fileparts(filebasesub);% CORRIGE LE 6 JUIN (ETAIT DESACTIVE)
287    filename=fullfile(pathname,dirpair(indpair).name);
288end
289
290
Note: See TracBrowser for help on using the repository browser.