0001 function BatchSuperSeggerOpti(dirname_,skip,clean_flag,res,startEnd,showWarnings)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057 if (nargin < 1) || isempty( dirname_ ) || strcmp(dirname_ ,'.')
0058 dirname_ = pwd;
0059 end
0060 dirname_ = fixDir(dirname_);
0061
0062 if nargin < 2 || isempty( skip )
0063 skip = 1;
0064 end
0065
0066 if nargin < 3 || isempty( clean_flag )
0067 clean_flag = 0;
0068 end
0069
0070 if nargin < 4 || isempty( res )
0071 res = [];
0072 end
0073
0074
0075 if ~exist( 'startEnd', 'var' ) || isempty( startEnd )
0076 startEnd = [1 20];
0077 end
0078
0079 if ~exist( 'showWarnings', 'var' ) || isempty( showWarnings )
0080 showWarnings = 1;
0081 end
0082
0083
0084 if ~checkToolboxes
0085 return;
0086 end
0087
0088
0089
0090 if isstruct(res)
0091 CONST = res;
0092 else
0093 disp (['BatchSuperSeggerOpti : Loading constants file ', res]);
0094 if exist('loadConstantsMine','file');
0095 CONST = loadConstantsMine(res);
0096 else
0097 CONST = loadConstants(res,0);
0098 end
0099 end
0100
0101
0102 if clean_flag && showWarnings
0103 try
0104 disp ('Clean flag is set to true.')
0105 answer=input('Do you want to continue, Y/N [Y]:','s');
0106 if lower(answer) ~='y'
0107 disp ('Exiting BatchSuperSegger. Reset clean flag and rerun');
0108 return
0109 end
0110 catch
0111
0112 end
0113 end
0114
0115 if startEnd(1)>1
0116 CONST.align.ALIGN_FLAG = 0;
0117 end
0118
0119
0120 if exist( dirname_, 'dir' )
0121 if exist( [dirname_,filesep,'raw_im'] ,'dir') && ...
0122 (numel(dir ([dirname_,filesep,'raw_im',filesep,'*.tif'])) || ...
0123 exist([dirname_,filesep,'raw_im',filesep,'cropbox.mat'],'file'))
0124 disp('BatchSuperSeggerOpti : images already aligned');
0125 if exist([dirname_,filesep,'raw_im',filesep,'cropbox.mat'],'file')
0126 tmp = load( [dirname_,filesep,'raw_im',filesep,'cropbox.mat'] );
0127 crop_box_array = tmp.crop_box_array;
0128 else
0129 crop_box_array = cell(1,10000);
0130 end
0131 elseif numel(dir ([dirname_,filesep,'*.tif']))
0132
0133 if ~isRightNameFormat(dirname_)
0134 disp('Images in incorrect naming format. Using convertImageNames to convert names.')
0135 convertImageNames(dirname_)
0136 end
0137
0138 mkdir( [dirname_,filesep,'raw_im'] );
0139 if CONST.align.ALIGN_FLAG
0140 crop_box_array = trackOptiAlignPad( dirname_,...
0141 CONST.parallel.parallel_pool_num, CONST);
0142 movefile( [dirname_,filesep,'*.tif'], [dirname_,filesep,'raw_im'] )
0143 movefile( [dirname_,'align',filesep,'*.tif'], [dirname_,filesep]);
0144 rmdir( [dirname_,'align'] );
0145 else
0146 crop_box_array = cell(1,10000);
0147 end
0148 else
0149 error('No images found');
0150 end
0151
0152 else
0153 error(['BatchSuperSeggerOpti : Can''t find directory ''',dirname_,'''. Exiting.'] );
0154 end
0155
0156
0157
0158 trackOptiPD(dirname_, CONST);
0159 save( [dirname_,'CONST.mat'],'-STRUCT', 'CONST' );
0160 save( [dirname_,'raw_im',filesep,'cropbox.mat'], 'crop_box_array' );
0161
0162
0163
0164
0165 contents = dir([dirname_,'xy*']);
0166
0167 if isempty(contents)
0168 disp('BSSO: No xy directories were found.');
0169 else
0170 num_dir_tmp = numel(contents);
0171 nxy = [];
0172 num_xy = 0;
0173
0174 for i = 1:num_dir_tmp
0175 if (contents(i).isdir) && (numel(contents(i).name) > 2)
0176 num_xy = num_xy+1;
0177 nxy = [nxy, str2num(contents(i).name(3:end))];
0178 dirname_list{i} = [dirname_,contents(i).name,filesep];
0179 end
0180 end
0181
0182
0183 contents = dir([dirname_list{1},'fluor*']);
0184 num_dir_tmp = numel(contents);
0185 nc = 1;
0186 num_c = 1;
0187
0188 for i = 1:num_dir_tmp
0189 if (contents(i).isdir) && (numel(contents(i).name) > numel('fluor'))
0190 num_c = num_c+1;
0191 nc = [nc, str2num(contents(i).name(numel('fluor')+1:end))+1];
0192 end
0193 end
0194
0195
0196
0197
0198 if (num_xy>1) && (CONST.parallel.parallel_pool_num>0)
0199 workers = CONST.parallel.parallel_pool_num;
0200 CONST.parallel.parallel_pool_num = 0;
0201 else
0202 workers=0;
0203 end
0204
0205 if workers || ~CONST.parallel.show_status
0206 h = [];
0207 else
0208 h = waitbar( 0, ['Data segmentation xy: 0/',num2str(num_xy)] );
0209 cleanup = onCleanup( @()( delete( h ) ) );
0210 end
0211
0212
0213 for j = 1:num_xy
0214
0215 dirname_xy = dirname_list{j};
0216 intProcessXY( dirname_xy, skip, nc, num_c, clean_flag, ...
0217 CONST, startEnd, crop_box_array{j})
0218
0219 if workers || ~CONST.parallel.show_status
0220 disp( ['BatchSuperSeggerOpti: No status bar. xy ',num2str(j), ...
0221 ' of ', num2str(num_xy),'.']);
0222 else
0223 if isvalid(h)
0224 waitbar( j/num_xy,h,...
0225 ['Data segmentation xy: ',num2str(j),...
0226 '/',num2str(num_xy)]);
0227 end
0228 end
0229 end
0230
0231 if workers
0232 poolobj = gcp('nocreate');
0233 delete(poolobj);
0234 end
0235
0236
0237 if ~workers
0238 close(h);
0239 end
0240
0241 end
0242
0243
0244 end
0245
0246 function intProcessXY( dirname_xy, skip, nc, num_c, clean_flag, ...
0247 CONST, startEnd, crop_box)
0248
0249
0250
0251
0252
0253 file_filter = '*.tif';
0254 verbose = CONST.parallel.verbose;
0255
0256
0257 tmp1 = strfind( dirname_xy, 'xy');
0258 tmp2 = strfind( dirname_xy,[filesep]);
0259
0260 if ~isempty(tmp1) && ~isempty(tmp2)
0261 header = [dirname_xy(tmp1(end):(tmp2(end)-1)),': '];
0262 else
0263 header = [dirname_xy];
0264 end
0265
0266
0267 contents=dir([dirname_xy,'phase',filesep,file_filter]);
0268 num_im = numel(contents);
0269
0270 nz = [];
0271 nt = [];
0272
0273 for i = 1:num_im;
0274 nameInfo = ReadFileName( contents(i).name );
0275 nt = [nt, nameInfo.npos(1,1)];
0276 nz = [nz, nameInfo.npos(4,1)];
0277 end
0278
0279 nt = sort(unique(nt));
0280 nz = sort(unique(nz));
0281
0282 num_t = numel(nt);
0283 num_z = numel(nz);
0284
0285 if isempty(nz) || nz(1)==-1
0286 nz = 1;
0287 end
0288
0289
0290 disp([header 'BatchSuperSeggerOpti : Segmenting Cells']);
0291
0292 if (CONST.parallel.parallel_pool_num>0)
0293 workers = CONST.parallel.parallel_pool_num;
0294 else
0295 workers=0;
0296 end
0297
0298 if ~CONST.parallel.show_status
0299 h = [];
0300 else
0301 h = waitbar( 0, ['BatchSuperSeggerOpti : Frame 0/',num2str(num_t)] );
0302 cleanup = onCleanup( @()( delete( h ) ) );
0303 end
0304
0305 stamp_name = [dirname_xy,'seg',filesep,'.doSegFull'];
0306
0307 if clean_flag
0308 cleanSuperSegger (dirname_xy, startEnd, skip)
0309 end
0310
0311
0312
0313 if startEnd(1) <= 2 && startEnd(2) >=2 && ~exist( stamp_name, 'file' )
0314
0315 for i = 1:num_t
0316
0317 if isempty( crop_box )
0318 crop_box_tmp = [];
0319 else
0320 crop_box_tmp = crop_box(i,:);
0321 end
0322
0323 doSeg(i, nameInfo, nc, nz, nt, num_z, num_c, dirname_xy, ...
0324 skip, CONST, [header,'t',num2str(i),': '], crop_box_tmp);
0325
0326 if ~CONST.parallel.show_status
0327 if verbose
0328 disp( [header, 'BatchSuperSeggerOpti : Segment. Frame ',num2str(i), ...
0329 ' of ', num2str(num_t),'.']);
0330 end
0331 else
0332 waitbar( i/num_t, h,...
0333 ['Data segmentation t: ',num2str(i),'/',num2str(num_t)]);
0334 end
0335 end
0336 time_stamp = clock;
0337 save( stamp_name, 'time_stamp');
0338 end
0339 if CONST.parallel.show_status
0340 if isvalid(h)
0341 close(h);
0342 end
0343 end
0344
0345
0346 if startEnd(2) >2
0347 trackOpti(dirname_xy,skip,CONST, header, startEnd);
0348 end
0349 end
0350