0001 function trackOptiCellFiles( dirname, dirname_cell, CONST, header, clist )
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 if ~exist( 'clist', 'var') || isempty( clist) || isempty(clist.data)
0033 ID_LIST = [];
0034 else
0035 clist = gate(clist);
0036 ID_LIST = clist.data(:,1);
0037 end
0038
0039 if ~exist('header')
0040 header = [];
0041 end
0042
0043 max_cell_num = 0;
0044
0045
0046 if(nargin<1 || isempty(dirname))
0047 dirname='.';
0048 end
0049
0050 dirname = fixDir(dirname);
0051
0052 if(nargin<2 || isempty(dirname_cell))
0053 dirname_cell = dirname;
0054 end
0055
0056
0057 dirname_cell = fixDir (dirname_cell);
0058 contents=dir([dirname '/*_err.mat']);
0059 verbose = CONST.parallel.verbose;
0060
0061
0062
0063 if isempty( contents )
0064 disp( [header, 'trackOptiCellFiles: No error files have been found. Possibly too many segments.'] );
0065 else
0066
0067
0068 num_im = length(contents);
0069 data_c = loaderInternal([dirname,contents(end).name]);
0070 MAX_NUM_CELLS = max(data_c.regs.ID)+100;
0071 DA = cell(1,MAX_NUM_CELLS);
0072
0073 if CONST.parallel.show_status
0074 h = waitbar( 0, 'Make Cell Files.');
0075 cleanup = onCleanup( @()( delete( h ) ) );
0076 else
0077 h = [];
0078 end
0079
0080 for i = 1:num_im;
0081
0082 if CONST.parallel.show_status
0083 waitbar(i/num_im,h,['Make Cell Files--Frame: ',num2str(i),'/',num2str(num_im)]);
0084 elseif verbose
0085 disp( [header, 'Cell Files--Frame: ',num2str(i),'/',num2str(num_im)] );
0086 end
0087
0088
0089 data_c = loaderInternal([dirname,contents(i).name]);
0090 num_regs = data_c.regs.num_regs;
0091 if verbose
0092 disp( [header, 'CellFiles: ','Frame: ', num2str(i), '. max cell num: ', num2str( max_cell_num ) ] );
0093 end
0094
0095 for ii = 1:num_regs
0096 cellNum = data_c.regs.ID(ii);
0097 max_cell_num = max([max_cell_num, cellNum]);
0098
0099 if cellNum && ( isempty( ID_LIST ) || ismember( cellNum, ID_LIST ))
0100 if data_c.regs.birthF(ii) == 1 && data_c.regs.deathF(ii) == 1
0101
0102
0103 DA{cellNum} = intInitCell( data_c, ii, cellNum );
0104
0105 DA{cellNum} = intUpCell( DA{cellNum}, data_c, ii );
0106
0107 DA{cellNum} = intDelCell( DA{cellNum},...
0108 dirname_cell, cellNum );
0109
0110 elseif data_c.regs.birthF(ii)
0111
0112 DA{cellNum} = intInitCell( data_c, ii, cellNum );
0113
0114 elseif data_c.regs.deathF(ii)
0115
0116
0117 DA{cellNum} = intUpCell( DA{cellNum}, data_c, ii );
0118
0119
0120 DA{cellNum} = intDelCell( DA{cellNum},...
0121 dirname_cell, cellNum );
0122
0123 else
0124
0125 DA{cellNum} = intUpCell( DA{cellNum}, data_c, ii );
0126 end
0127 end
0128
0129 end
0130 end
0131
0132
0133 for ii=1:MAX_NUM_CELLS
0134 if ~isempty(DA{ii})
0135 if verbose
0136 disp( ['Missing cell ', num2str(DA{ii}.ID)] );
0137 end
0138 DA{ii} = intDelCell( DA{ii},dirname_cell, ii );
0139 end
0140 end
0141
0142 if CONST.parallel.show_status
0143 close(h);
0144 end
0145 end
0146 end
0147
0148
0149 function data = intInitCell( data_c, ii, cellNum )
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160 celld = data_c.CellA{ii};
0161 celld.r = data_c.regs.props(ii).Centroid;
0162 celld.error.label = data_c.regs.error.label{ii};
0163 celld.ehist = data_c.regs.ehist(ii);
0164 celld.contactHist = data_c.regs.contactHist(ii);
0165 celld.stat0 = data_c.regs.stat0(ii);
0166 data.CellA = {celld};
0167 data.death = data_c.regs.death(ii);
0168 data.birth = data_c.regs.birth(ii);
0169 data.divide = data_c.regs.divide(ii);
0170 data.sisterID = data_c.regs.sisterID(ii);
0171 data.motherID = data_c.regs.motherID(ii);
0172 data.daughterID = data_c.regs.daughterID{ii};
0173 data.ID = cellNum;
0174 data.neighbors = data_c.regs.neighbors{ii};
0175
0176 end
0177
0178
0179 function data = intUpCell( data, data_c, ii )
0180
0181
0182
0183
0184 celld = data_c.CellA{ii};
0185 celld.r = data_c.regs.props(ii).Centroid;
0186 celld.error.label = data_c.regs.error.label{ii};
0187 celld.ehist = data_c.regs.ehist(ii);
0188 celld.contactHist = data_c.regs.contactHist(ii);
0189 celld.stat0 = data_c.regs.stat0(ii);
0190
0191 try
0192 data.CellA = {data.CellA{:},celld};
0193 catch ME
0194 printError(ME);
0195 end
0196
0197 data.death = data_c.regs.death(ii);
0198 data.birth = data_c.regs.birth(ii);
0199 data.divide = data_c.regs.divide(ii);
0200 data.sisterID = data_c.regs.sisterID(ii);
0201 data.motherID = data_c.regs.motherID(ii);
0202 data.daughterID = data_c.regs.daughterID{ii};
0203 data.neighbors = data_c.regs.neighbors{ii};
0204
0205 end
0206
0207
0208 function data = intDelCell( data, dirToSave, cellNum )
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219 data.stat0 = data.CellA{end}.stat0;
0220 data.ehist = data.CellA{end}.ehist;
0221 data.contactHist = data.CellA{end}.contactHist;
0222 dirToSave = fixDir(dirToSave);
0223
0224 if data.stat0 == 2;
0225 dataname=[dirToSave,'Cell',sprintf( '%07d', cellNum ),'.mat'];
0226 else
0227 dataname=[dirToSave,'cell',sprintf( '%07d', cellNum ),'.mat'];
0228 end
0229
0230 save(dataname,'-STRUCT','data');
0231 data = [];
0232
0233 end
0234
0235
0236 function data = loaderInternal( filename )
0237
0238 data = load( filename );
0239 end