diff --git a/bin/CompileLEVer.m b/bin/CompileLEVer.m new file mode 100644 index 0000000000000000000000000000000000000000..fec620633231ae59caa46b9169a4ae779d5c8c9c --- /dev/null +++ b/bin/CompileLEVer.m @@ -0,0 +1 @@ +mcc -m ../LEVer.m \ No newline at end of file diff --git a/src/MATLAB/AddImagePixelsField.m b/src/MATLAB/AddImagePixelsField.m index 37210f71d4cde67cd79c54b40ec19e42180646e2..09f333ab4faa9654c17b06a7a48c20becebf97a3 100644 --- a/src/MATLAB/AddImagePixelsField.m +++ b/src/MATLAB/AddImagePixelsField.m @@ -13,8 +13,12 @@ function AddImagePixelsField() 'imagePixels', cell(size(oldCellHulls)),... 'deleted', {oldCellHulls.deleted}); + progress = 1; + iterations = length(HashedCells); for t=1:length(HashedCells) - imgfname = [CONSTANTS.rootImageFolder CONSTANTS.datasetName '_t' num2str(t,'%03d') '.TIF']; + progress = progress+1; + Progressbar(progress/iterations); + imgfname = [CONSTANTS.rootImageFolder CONSTANTS.datasetName '_t' SignificantDigits(t) '.TIF']; [curimg map]=imread(imgfname); curimg=mat2gray(curimg); @@ -31,4 +35,5 @@ function AddImagePixelsField() CellHulls(hullIdx(i)).imagePixels = curimg(CellHulls(hullIdx(i)).indexPixels); end end + Progressbar(1);%clear it out end \ No newline at end of file diff --git a/src/MATLAB/AddNewSegmentHull.m b/src/MATLAB/AddNewSegmentHull.m index 7130667d2a1f1463071c879e73e40cb261de34c2..2dbf5d14bdb8c499adfa1e8bd520dca674a7fd9b 100644 --- a/src/MATLAB/AddNewSegmentHull.m +++ b/src/MATLAB/AddNewSegmentHull.m @@ -1,14 +1,16 @@ function newTrackID = AddNewSegmentHull(clickPt) - global CONSTANTS CellHulls CellFamilies Figures + global CONSTANTS CellHulls HashedCells Figures fileName = [CONSTANTS.rootImageFolder CONSTANTS.datasetName '_t' num2str(Figures.time,'%03d') '.TIF']; - [img colrMap] = imread(fileName); + [img colorMap] = imread(fileName); img = mat2gray(img); newObj = PartialImageSegment(img, clickPt, 200, 1.0); newHull = struct('time', [], 'points', [], 'centerOfMass', [], 'indexPixels', [], 'imagePixels', [], 'deleted', 0); + oldTracks = [HashedCells{Figures.time}.trackID]; + if ( isempty(newObj) ) % Add a point hull since we couldn't find a segmentation containing the click newHull.time = Figures.time; @@ -24,8 +26,11 @@ function newTrackID = AddNewSegmentHull(clickPt) newHull.imagePixels = newObj.imagePixels; end - CellHulls(end+1) = newHull; - newFamilyIDs = NewCellFamily(length(CellHulls), newHull.time); + newHullID = length(CellHulls)+1; + CellHulls(newHullID) = newHull; + newFamilyIDs = NewCellFamily(newHullID, newHull.time); + + newTrackID = TrackSplitHulls(newHullID, oldTracks, newHull.centerOfMass); - newTrackID = [CellFamilies(newFamilyIDs).rootTrackID]; +% newTrackID = [CellFamilies(newFamilyIDs).rootTrackID]; end \ No newline at end of file diff --git a/src/MATLAB/ConvertTrackingData.m b/src/MATLAB/ConvertTrackingData.m index 60ddf24509f8224b0ae1592bb498681c97c20807..deb1d45628ad476311a39e035effa4acd3c932ac 100644 --- a/src/MATLAB/ConvertTrackingData.m +++ b/src/MATLAB/ConvertTrackingData.m @@ -4,20 +4,10 @@ function ConvertTrackingData(objHulls,gConnect) %--Eric Wait -global CONSTANTS Costs HashedCells CellHulls CellFamilies +global CONSTANTS Costs CellHulls CellFamilies -%Initialize CONSTANTS CONSTANTS.imageSize = unique([objHulls(:).imSize]); -CONSTANTS.maxPixelDistance = 40; -CONSTANTS.maxCenterOfMassDistance = 80; -CONSTANTS.minParentCandidateTimeFrame = 5; -CONSTANTS.minParentHistoryTimeFrame = 5; -CONSTANTS.minParentFuture = 5; -CONSTANTS.minFamilyTimeFrame = 5; -CONSTANTS.maxFrameDifference = 5; -CONSTANTS.historySize = 50; -CONSTANTS.clickMargin = 500; -CONSTANTS.timeResolution = 10; %in frames per min + Costs = gConnect; %Initialize Structures @@ -30,13 +20,8 @@ cellHulls = struct(... 'imagePixels', {},... 'deleted', {}); -%loop through the data -% progress = 1; -% iterations = length(objHulls); -% cellHulls(length(objHulls)) = ; +%loop through the Hulls parfor i=1:length(objHulls) -% progress = progress+1; -% Progressbar(progress/iterations); cellHulls(i).time = objHulls(i).t; cellHulls(i).points = objHulls(i).pts; cellHulls(i).centerOfMass = objHulls(i).COM; @@ -69,8 +54,13 @@ if(length(hullList)~=length(CellHulls)) NewCellFamily(reprocess(i),objHulls(reprocess(i)).t); end end +Progressbar(1);%clear it out -TestDataIntegrity(1); +try + TestDataIntegrity(1); +catch errormsg + fprintf('\n%s\n',errormsg.message); +end %create the family trees ProcessNewborns(1:length(CellFamilies)); diff --git a/src/MATLAB/DrawCells.m b/src/MATLAB/DrawCells.m index ed1401c1f86d065a2e87aaeced6a1b0ecf238725..8c8ca3869b06121f23728e6d3f8789476e7b1859 100644 --- a/src/MATLAB/DrawCells.m +++ b/src/MATLAB/DrawCells.m @@ -14,7 +14,7 @@ if(isempty(CellFamilies(Figures.tree.familyID).tracks)),return,end figure(Figures.cells.handle); set(Figures.cells.timeLabel,'String',['Time: ' num2str(Figures.time)]); %read in image -fileName = [CONSTANTS.rootImageFolder CONSTANTS.imageDatasetName '_t' num2str(Figures.time,'%03d') '.TIF']; +fileName = [CONSTANTS.rootImageFolder CONSTANTS.datasetName '_t' SignificantDigits(Figures.time) '.TIF']; [img colrMap] = imread(fileName); xl=xlim; yl=ylim; diff --git a/src/MATLAB/GetDarkConnectedHulls.m b/src/MATLAB/GetDarkConnectedHulls.m new file mode 100644 index 0000000000000000000000000000000000000000..6ffd5ffc07398c59867bde84929f299dbf079b42 --- /dev/null +++ b/src/MATLAB/GetDarkConnectedHulls.m @@ -0,0 +1,113 @@ +function objsSegment = GetDarkConnectedHulls(objsSegment) + +%--Andrew Cohen + +global CONSTANTS + +th=max([objsSegment.t]); + +fname=[CONSTANTS.rootImageFolder '\' CONSTANTS.datasetName '_t' SignificantDigits(1) '.TIF']; +[im map]=imread(fname); +HashedHulls=cell(th,1); + +for n=1:length(objsSegment) + objsSegment(n).imSize=size(im); + objsSegment(n).DarkConnectedHulls=[]; + [r c]=ind2sub(objsSegment(n).imSize,objsSegment(n).indPixels); + objsSegment(n).COM=mean([r c],1); + HashedHulls{objsSegment(n).t}=[HashedHulls{objsSegment(n).t};n]; +end + +for t=1:th-1 + + if mod(t,20)==0 + fprintf(1,[num2str(t) ', ']); + end + if mod(t,200)==0 + fprintf(1,'\n'); + end + + + objsSegment=GetDistances(objsSegment,HashedHulls,t,t+1); + if t<th-1 + objsSegment=GetDistances(objsSegment,HashedHulls,t,t+2); + end +end + + + function objsSegment=GetDistances(objsSegment,HashedHulls,t1,t2) + bwHalo1=GetHalo(t1); + bwHalo2=GetHalo(t2); + bwCombo=GetCombo(bwHalo1,bwHalo2,objsSegment,HashedHulls,t1,t2); + LCombo=bwlabel(bwCombo); + for i=1:length(HashedHulls{t1}) + hi=HashedHulls{t1}(i); + ipix=objsSegment(hi).indPixels; + for j=1:length(HashedHulls{t2}) + hj=HashedHulls{t2}(j); + dCOM=norm(objsSegment(hi).COM-objsSegment(hj).COM); + if dCOM>(t2-t1)*CONSTANTS.dMaxCenterOfMass + continue + end + jpix=objsSegment(hj).indPixels; + if ~isempty(intersect(ipix,jpix)) + objsSegment(hi).DarkConnectedHulls=[objsSegment(hi).DarkConnectedHulls; hj 0]; + else + if length(ipix)<length(jpix) % p1 smaller + p1=ipix; + p2=jpix; + else + p1=jpix; + p2=ipix; + end + [r1 c1]=ind2sub(objsSegment(hi).imSize,p1); + [r2 c2]=ind2sub(objsSegment(hj).imSize,p2); + dCCmin=Inf; + for k=1:length(r1) + dd=( (r2-r1(k)).^2+(c2-c1(k)).^2); + d=sqrt(min(dd)); + if d<dCCmin + dCCmin=d; + end + if d<1 + break + end + end + if 1==t2-t1 + dmax=CONSTANTS.dMaxConnectComponet; + else + dmax=1.5*CONSTANTS.dMaxConnectComponet; + end + if dCCmin<dmax + objsSegment(hi).DarkConnectedHulls=[objsSegment(hi).DarkConnectedHulls; hj dCCmin]; + end + end + end + end + end + + + function bwHalo=GetHalo(t) + + fname=[CONSTANTS.rootImageFolder '\' CONSTANTS.datasetName '_t' SignificantDigits(t) '.TIF']; + [im map]=imread(fname); + im=mat2gray(im); + + + level=CONSTANTS.imageAlpha*graythresh(im); + bwHalo=im2bw(im,level); + end + + function bwCombo=GetCombo(bwHalo1,bwHalo2,objsSegment,HashedHulls,t1,t2) + + bwCombo=0*bwHalo1; + for i=1:length(HashedHulls{t1}) + bwCombo(objsSegment(HashedHulls{t1}(i)).indTailPixels)=1; + end + for i=1:length(HashedHulls{t2}) + bwCombo(objsSegment(HashedHulls{t2}(i)).indTailPixels)=1; + end + bwCombo(bwHalo1)=0; + bwCombo(bwHalo2)=0; + end +end \ No newline at end of file diff --git a/src/MATLAB/InitializeConstants.m b/src/MATLAB/InitializeConstants.m new file mode 100644 index 0000000000000000000000000000000000000000..e61181fa7eb5e6cdcef81520d82f11cc82058cc6 --- /dev/null +++ b/src/MATLAB/InitializeConstants.m @@ -0,0 +1,24 @@ +function InitializeConstants() +%Set all constants here + +%--Eric Wait +global CONSTANTS + +CONSTANTS.imageAlpha = 1; +CONSTANTS.maxRetrackDistSq = 40^2; +CONSTANTS.maxPixelDistance = 40; +CONSTANTS.maxCenterOfMassDistance = 80; +CONSTANTS.minParentCandidateTimeFrame = 5; +CONSTANTS.minParentHistoryTimeFrame = 5; +CONSTANTS.minParentFuture = 5; +CONSTANTS.minFamilyTimeFrame = 5; +CONSTANTS.maxFrameDifference = 5; +CONSTANTS.historySize = 50; +CONSTANTS.clickMargin = 500; +CONSTANTS.timeResolution = 10; %in frames per min +CONSTANTS.dMaxConnectComponet = 40; +CONSTANTS.dMaxCenterOfMass = 80; +CONSTANTS.lookAhead = 2; +CONSTANTS.minPlayer = 9; +CONSTANTS.minMitosis = 30; +end \ No newline at end of file diff --git a/src/MATLAB/OpenData.m b/src/MATLAB/OpenData.m index ca7354aa97e624eb90fbaeeb5fa5a4303fccc568..581d302a29a96bf1b770e6d48755d9081087c7a2 100644 --- a/src/MATLAB/OpenData.m +++ b/src/MATLAB/OpenData.m @@ -7,7 +7,7 @@ function opened = OpenData() global Figures Colors CONSTANTS CellFamilies CellHulls HashedCells Costs CellTracks if(isempty(Figures)) - fprintf('LEVer ver 3.7\n***DO NOT DISTRIBUTE***\n\n'); + fprintf('LEVer ver 4.0\n***DO NOT DISTRIBUTE***\n\n'); end if(exist('ColorScheme.mat','file')) @@ -56,85 +56,119 @@ if(~isempty(Figures)) end oldCONSTANTS = CONSTANTS; -% .mat file handling -while(~goodLoad) - fprintf('Select .mat data file...\n'); - [matFile,matPath,filterIndexMatFile] = uigetfile([settings.matFilePath '*.mat'],... - 'Open Data'); - - if (filterIndexMatFile==0) - return - else - fprintf('Opening file...'); - try - %clear out globals so they can rewriten - if(ishandle(Figures.cells.handle)) - close Figures.cells.handle - end - catch - end - CellFamilies = []; - CellTracks = []; - CellHulls = []; - HashedCells = []; - Costs = []; - CONSTANTS = []; - try - load([matPath matFile]); - fprintf('\nFile open.\n\n'); - catch exception - %DEBUG -- Uncomment - %disp(exception); - end - end - - if(exist('objHulls','var')) - fprintf('Converting File...'); - ConvertTrackingData(objHulls,gConnect); - fprintf('\nFile Converted.\n'); - CONSTANTS.datasetName = strtok(matFile,' '); - save([matPath CONSTANTS.datasetName '_LEVer'],... - 'CellFamilies','CellHulls','CellTracks','HashedCells','Costs','CONSTANTS'); - fprintf(['New file saved as:\n' CONSTANTS.datasetName '_LEVer.mat']); - goodLoad = 1; - elseif(exist('CellHulls','var')) - goodLoad = 1; - else - errordlg('Data either did not load properly or is not the right format for LEVer.'); - goodLoad = 0; - end -end %find the first image -imageFilter = [settings.imagePath '*' CONSTANTS.datasetName '*.TIF']; +imageFilter = [settings.imagePath '*.TIF']; while (filterIndexImage==0) fprintf('\nSelect first .TIF image...\n\n'); - [imageFile,imagePath,filterIndexImage] = uigetfile(imageFilter,['Open First Image in dataset: ' CONSTANTS.datasetName]); + [imageFile,imagePath,filterIndexImage] = uigetfile(imageFilter,'Open First Image in dataset: '); if (filterIndexImage==0) CONSTANTS = oldCONSTANTS; return end end -index = strfind(imageFile,'t'); +index = strfind(imageFile,'_t'); +frameT = '001'; if (~isempty(index) && filterIndexImage~=0) CONSTANTS.rootImageFolder = imagePath; - imageDataset = imageFile(1:(index(length(index))-2)); + imageDataset = imageFile(1:(index(length(index))-1)); CONSTANTS.imageDatasetName = imageDataset; - fileName=[CONSTANTS.rootImageFolder imageDataset '_t001.TIF']; + CONSTANTS.datasetName = imageDataset; + index2 = strfind(imageFile,'.'); + CONSTANTS.imageSignificantDigits = index2 - index - 2; + fileName=[CONSTANTS.rootImageFolder imageDataset '_t' SignificantDigits(1) '.TIF']; end while (isempty(index) || ~exist(fileName,'file')) - fprintf(['Image file name not in correct format: ' CONSTANTS.datasetName '_t001.TIF\nPlease choose another...\n']); + fprintf(['Image file name not in correct format: ' CONSTANTS.datasetName '_t' frameT '.TIF\nPlease choose another...\n']); [imageFile,imagePath,filterIndexImage] = uigetfile(settings.imagePath,'Open First Image'); if(filterIndexImage==0) CONSTANTS = oldCONSTANTS; return end index = strfind(imageFile,'t'); - CONSTANTS.rootImageFolder = [imgPath '\']; + CONSTANTS.rootImageFolder = [imagePath '\']; imageDataset = imageFile(1:(index(length(index))-2)); - fileName=[CONSTANTS.rootImageFolder imageDataSet '_t' num2str(t,'%03d') '.TIF']; + fileName=[CONSTANTS.rootImageFolder imageDataSet '_t' SignificantDigits(t) '.TIF']; +end + +answer = questdlg('Run Segmentation and Tracking or Use Existing Data?','Data Source','Segment & Track','Existing','Existing'); +switch answer + case 'Segment & Track' + InitializeConstants(); + SegAndTrack(); + case 'Existing' + while(~goodLoad) + fprintf('Select .mat data file...\n'); + [matFile,matPath,filterIndexMatFile] = uigetfile([settings.matFilePath '*.mat'],... + 'Open Data'); + + if (filterIndexMatFile==0) + return + else + fprintf('Opening file...'); + try + %clear out globals so they can rewriten + if(ishandle(Figures.cells.handle)) + close Figures.cells.handle + end + catch + end + CellFamilies = []; + CellTracks = []; + CellHulls = []; + HashedCells = []; + Costs = []; + rootImageFolder = CONSTANTS.rootImageFolder; + imageSignificantDigits = CONSTANTS.imageSignificantDigits; + + try + load([matPath matFile]); + fprintf('\nFile open.\n\n'); + catch exception + %DEBUG -- Uncomment + %disp(exception); + end + end + + if(~isfield(CONSTANTS,'rootImageFolder')) + CONSTANTS.rootImageFolder = rootImageFolder; + end + + if(~isfield(CONSTANTS,'imageSignificantDigits')) + CONSTANTS.imageSignificantDigits = imageSignificantDigits; + end + + if(exist('objHulls','var')) + fprintf('Converting File...'); + InitializeConstants(); + ConvertTrackingData(objHulls,gConnect); + fprintf('\nFile Converted.\n'); + CONSTANTS.datasetName = strtok(matFile,' '); + save([matPath CONSTANTS.datasetName '_LEVer'],... + 'CellFamilies','CellHulls','CellTracks','HashedCells','Costs','CONSTANTS'); + fprintf(['New file saved as:\n' CONSTANTS.datasetName '_LEVer.mat']); + goodLoad = 1; + elseif(exist('CellHulls','var')) + goodLoad = 1; + else + errordlg('Data either did not load properly or is not the right format for LEVer.'); + goodLoad = 0; + end + end + + %save out settings + settings.matFilePath = matPath; + settings.imageFile = imageFile; + settings.imagePath = [imagePath '\']; + save('LEVerSettings.mat','settings'); + + Figures.time = 1; + + LogAction(['Opened file ' matFile],[],[]); + otherwise + return end % Add imagePixels field to CellHulls structure (and resave in place) @@ -148,22 +182,16 @@ end opened = 1; -%save out settings -settings.matFilePath = matPath; -settings.imageFile = imageFile; -settings.imagePath = [imagePath '\']; -save('LEVerSettings.mat','settings'); - if (~strcmp(imageDataset,CONSTANTS.datasetName)) warndlg({'Image file name does not match .mat dataset name' '' 'LEVer may display cells incorectly!'},'Name mismatch','modal'); end -if(~isempty(Figures) && ishandle(Figures.cells.handle)) - close(Figures.cells.handle); -end +% if(~isempty(Figures) && ishandle(Figures.cells.handle)) +% close(Figures.cells.handle); +% end -Figures.time = 1; +% Figures.time = 1; -LogAction(['Opened file ' matFile],[],[]); +% LogAction(['Opened file ' matFile],[],[]); end diff --git a/src/MATLAB/PartialImageSegment.m b/src/MATLAB/PartialImageSegment.m index 73838a4e6351f3c2f19193ab3e2bf33e56574fe8..e93ab3ec89fb709dcfcc575b479123ae59bbb49d 100644 --- a/src/MATLAB/PartialImageSegment.m +++ b/src/MATLAB/PartialImageSegment.m @@ -103,7 +103,7 @@ function hull = PartialImageSegment(img, centerPt, subSize, alpha) HaloRat=length(find(p & bwHalo))/length(find(p)); - [r c]=ind2sub(imSize,pix); + [r c]=ind2sub(size(subImg),pix); ch=convhull(r,c); bwDarkInterior=bwDarkCenters&bwPoly; @@ -159,7 +159,7 @@ function hull = PartialImageSegment(img, centerPt, subSize, alpha) no.centerOfMass = mean([glr glc]); %no.indPixels=pix; - no.indexPixels = sub2ind(imSize,[glr glc]); + no.indexPixels = sub2ind(imSize, glr,glc); no.imagePixels=img(no.indexPixels); % surround completely by Halo? if all(bwHaloHoles(pix)) @@ -204,7 +204,7 @@ function hull = PartialImageSegment(img, centerPt, subSize, alpha) no.points=[glc(ch),glr(ch)]; no.centerOfMass = mean([glr glc]); - no.indexPixels = sub2ind(imSize,[glr glc]); + no.indexPixels = sub2ind(imSize, glr,glc); no.imagePixels=img(no.indexPixels); no.ID=-1; diff --git a/src/MATLAB/ReadTrackData.m b/src/MATLAB/ReadTrackData.m new file mode 100644 index 0000000000000000000000000000000000000000..972214f1fbaba21fd68705b90aa25eb2de4716f1 --- /dev/null +++ b/src/MATLAB/ReadTrackData.m @@ -0,0 +1,71 @@ +function [objHulls gConnect HashedHulls]=ReadTrackData(objHulls,DatasetName) +th=max([objHulls.t]); +HashedHulls=cell(th,1); + +% reset tracking info +for n=1:length(objHulls) + objHulls(n).Label=-1; + objHulls(n).inID=0; + objHulls(n).outID=0; + HashedHulls{objHulls(n).t}=[HashedHulls{objHulls(n).t};n]; +end +fname=['.\Tracked_' DatasetName '.txt']; +fid=fopen(fname,'r'); +bDone=0; +TrackList=[]; +while ~bDone + dd=fscanf(fid,'%d,%d,%d,%d,%d\n',5); + if -1==dd(1) + bDone=1; + break + end + TrackList=[TrackList;dd']; +end +bDone=0; +InList=[]; +while ~bDone + dd=fscanf(fid,'%d,%d,%f\n',3); + if isempty(dd) + bDone=1; + break + end + InList=[InList;dd']; +end + +fclose(fid); +for i=1:size(TrackList,1) + th=HashedHulls{TrackList(i,2)}; + thk=HashedHulls{TrackList(i,3)}; + o1=th(TrackList(i,4)); + o2=thk(TrackList(i,5)); + objHulls(o1).Label=TrackList(i,1); + objHulls(o2).Label=TrackList(i,1); + objHulls(o1).outID=o2; + objHulls(o2).inID=o1; +end + +cmap=hsv(256); +for i=1:max([objHulls.Label]) + oi = find([objHulls.Label]==i); + ccc=cmap(round(255*rand())+1,:); + for j=1:length( oi) + objHulls(oi(j)).ccc=ccc; + end +end +nLabel=max([objHulls.Label])+1; +for n=1:length(objHulls) + [r c]=ind2sub(objHulls(n).imSize,objHulls(n).indPixels); + objHulls(n).COM=mean([r c],1); + if objHulls(n).Label>0,continue,end + objHulls(n).Label= nLabel; + nLabel=nLabel+1; + ccc=cmap(round(255*rand())+1,:); + objHulls(n).ccc=ccc; +end + +gConnect=sparse([],[],[],length(objHulls),length(objHulls),round(.1*length(objHulls))); +for i=1:size(InList,1) + gConnect(InList(i,2),InList(i,1))=InList(i,3); +end +end + diff --git a/src/MATLAB/ResegmentEditedFamilies.m b/src/MATLAB/ResegmentEditedFamilies.m index 082df3da6135a371b7934bcc465fece1c8802302..accd92b490f3043bfdd2da8e34c555fd5d4053ce 100644 --- a/src/MATLAB/ResegmentEditedFamilies.m +++ b/src/MATLAB/ResegmentEditedFamilies.m @@ -69,7 +69,7 @@ function [oldHulls oldIdx] = ResegmentEditedFamilies(families, hullCheckRadiusSq continue; end - tmpgConnect = trackingCosts(hullsToTrack, t-1, avoidHulls, newHulls, newHash); + tmpgConnect = TrackingCosts(hullsToTrack, t-1, avoidHulls, newHulls, newHash); nzCostIdx = find(tmpgConnect(hullsToTrack(1),:)>0); diff --git a/src/MATLAB/SegAndTrack.m b/src/MATLAB/SegAndTrack.m new file mode 100644 index 0000000000000000000000000000000000000000..e3f16b948f787f0a05c84c98933a82a89c18d1f7 --- /dev/null +++ b/src/MATLAB/SegAndTrack.m @@ -0,0 +1,76 @@ +function SegAndTrack() +global CONSTANTS + +%% Segmentation +tic + +fileList = dir([CONSTANTS.rootImageFolder CONSTANTS.imageDatasetName '*.tif']); +numberOfImages = length(fileList); + +cellSegments = []; +numProcessors = getenv('Number_of_processors'); +numProcessors = str2double(numProcessors); +if(isempty(numProcessors) || isnan(numProcessors)),numProcessors = 2;end + +fprintf('Segmenting (using %s processors)...\n',num2str(numProcessors)); + +step = ceil(numberOfImages/numProcessors); + +if(~isempty(dir('.\segmentationData'))) + system('rmdir /S /Q .\segmentationData'); +end + +for timeStart=1:step:numberOfImages + system(['start Segmentor ' num2str(timeStart) ' ' num2str(step-1) ' "' ... + CONSTANTS.rootImageFolder(1:end-1) '" ' CONSTANTS.datasetName ' ' ... + num2str(CONSTANTS.imageAlpha) ' ' num2str(CONSTANTS.imageSignificantDigits) ' && exit']); +end + +for i=1:step:numberOfImages + fileName = ['.\segmentationData\objs_' num2str(i) '.mat']; + fileDescriptor = dir(fileName); + while(isempty(fileDescriptor)) + pause(1) + fileDescriptor = dir(fileName); + end + pause(2) +end + +for i=1:step:numberOfImages + fileName = ['.\segmentationData\objs_' num2str(i) '.mat']; + load(fileName); + cellSegments = [cellSegments objs]; + pause(1) +end + +cellSegments = GetDarkConnectedHulls(cellSegments); +save ( ['SegObjs_' CONSTANTS.datasetName '.mat'],'cellSegments'); +WriteSegData(cellSegments,CONSTANTS.datasetName); + +fprintf(1,'\nDone\n'); + +load ( ['SegObjs_' CONSTANTS.datasetName '.mat']); +fnameIn=['SegObjs_' CONSTANTS.datasetName '.txt']; +fnameOut=['Tracked_' CONSTANTS.datasetName '.txt']; +tSeg=toc; + +%% Tracking +tic +fprintf(1,'Tracking...'); +system(['.\MTC.exe ' fnameIn ' ' fnameOut ' > out.txt']); +fprintf('Done\n'); +tTrack=toc; + +%% Inport into LEVer's data sturcture +[objHulls gConnect HashedHulls] = ReadTrackData(cellSegments,CONSTANTS.datasetName); + +fprintf('Finalizing Data...'); +ConvertTrackingData(objHulls,gConnect); +fprintf('Done\n'); + +InitializeFigures(); + +SaveDataAs(); + +LogAction('Segmentation time - Tracking time',tSeg,tTrack); +end \ No newline at end of file diff --git a/src/MATLAB/Segmentor.m b/src/MATLAB/Segmentor.m new file mode 100644 index 0000000000000000000000000000000000000000..1e01b41543787e661a9acff7003856d7fe75f565 --- /dev/null +++ b/src/MATLAB/Segmentor.m @@ -0,0 +1,252 @@ +function objs = Segmentor(tStart,tLength,rootImageFolder,datasetName,imageAlpha,imageSignificantDigits) +% Segmentor is to be run as a seperate compiled function for parallel +% processing. It will process tLength-tStart amount of images. Call this +% function for the number of processors on the machine. + +% mcc -o Segmentor -m Segmentor.m + +%--Andrew Cohen + +% global CONSTANTS +se=strel('square',3); + +objs=[]; +if(ischar(tStart)),tStart = str2double(tStart);end +if(ischar(tLength)),tLength = str2double(tLength);end +if(ischar(imageAlpha)),imageAlpha = str2double(imageAlpha);end +if(ischar(imageSignificantDigits)),imageSignificantDigits = str2double(imageSignificantDigits);end + +for t = tStart:tStart + tLength + switch imageSignificantDigits + case 3 + frameT = num2str(t,'%03d'); + case 4 + frameT = num2str(t,'%04d'); + case 5 + frameT = num2str(t,'%05d'); + case 6 + frameT = num2str(t,'%06d'); + end + fname=[rootImageFolder '\' datasetName '_t' frameT '.TIF']; + if(isempty(dir(fname))),continue,end + + [im map]=imread(fname); + im=mat2gray(im); + + bwDark=0*im; + level=imageAlpha*graythresh(im); + bwHalo=im2bw(im,level); + + l2=graythresh(im); + pix=im(im<l2); + lDark=graythresh(pix); + bwDark(im<lDark)=1; + + % bwNorm=GetNormalVectors(bwHalo,bwDark); + bwNorm=0*bwDark; + + gd=imdilate(im,se); + ge=imerode(im,se); + ig=gd-ge; + lig=graythresh(ig); + bwig=im2bw(ig,lig); + seBig=strel('square',19); + bwmask=imclose(bwig,seBig); + + bwDarkCenters=(bwDark & bwmask ); + d=bwdist(~bwDarkCenters); + bwDarkCenters(d<2)=0; + % + + bwHaloMask=imdilate(bwHalo,seBig); + + bwHaloHoles=imfill(bwHalo ,8,'holes') & ~bwHalo; + bwDarkHoles=imfill(bwDarkCenters ,8,'holes') & ~bwDarkCenters; + bwgHoles=bwmorph(bwig | bwDarkCenters,'close',1) ; + bwgHoles=imfill( bwgHoles ,8,'holes') & ~(bwig |bwDarkCenters); + + bwHoles=bwHaloHoles |bwDarkHoles|bwgHoles; + + CC = bwconncomp(bwHoles,8); + LHoles = labelmatrix(CC); + stats = regionprops(CC, 'Area'); + idx = find([stats.Area] < 500); + bwHoles = ismember(LHoles, idx); + + % [r c]=find(bwHoles); + % plot(c,r,'.c'); + + bwCells=bwDarkCenters| bwHoles|bwNorm; + bwCells(~bwHaloMask)=0; + + + CC = bwconncomp(bwHalo,8); + LCells = labelmatrix(CC); + + bwCells(bwig)=0; + + % bwTails=imdilate(bwDarkCenters,strel('square',3)); + bwTails=bwDarkCenters; + bwTails(bwHalo)=0; + CC = bwconncomp(bwTails,8); + LTails = labelmatrix(CC); + + % hold off;imagesc(im);colormap(gray);hold on; + % title(num2str(t)); + % [r c]=find(bwTails|bwCells); + % plot(c,r,'.g') + + CC = bwconncomp(bwCells,8); + LCenters = labelmatrix(CC); + stats=regionprops(CC,'eccentricity'); + d=bwdist(~bwCells); + + num=max(LCenters(:)); + for n=1:num + pix=find(LCenters==n); + if length(pix)<50 + bwCells(pix)=0; + continue + end + + % if length(find(bwDarkCenters(pix)))<1 + % bwCells(pix)=0; + % continue + % end + + bwPoly=logical(0*im); + bwPoly(pix)=1; + bwPoly=bwmorph(bwPoly,'dilate',1); + p=bwperim(bwPoly); + + + igRat=length(find(p & bwig))/length(find(p)); + + HaloRat=length(find(p & bwHalo))/length(find(p)); + + [r c]=ind2sub(size(im),pix); + ch=convhull(r,c); + + bwDarkInterior=bwDarkCenters&bwPoly; + DarkRat=length(find(bwDarkInterior))/length(find(bwPoly)); + % fprintf(1,'%d, %2.3f, %2.3f, %2.3f %d\n',n ,igRat, DarkRat,HaloRat,length(pix)); + if HaloRat>0.5 || igRat<.1 ||(DarkRat<.5 && igRat<.5 && length(pix)<175) + % plot(c(ch),r(ch),'-y') + bwCells(pix)=0; + continue + end + dmax=max(d(pix)); + if dmax>4 + bwCells(pix(d(pix)<2))=0; + % bwCells(pix(find(d(pix)<2)))=0; + end + + end + + + bwCellFG=0*bwCells; + + CC = bwconncomp(bwCells,8); + LCenters = labelmatrix(CC); + stats=regionprops(CC,'area','Eccentricity'); + idx = find([stats.Area] >=25); + for i=1:length(idx) + pix=find(LCenters==idx(i)); + if length(pix)<20 + continue + end + [r c]=ind2sub(size(im),pix); + bwPoly=roipoly(im,c,r); + if bwarea(bwPoly)<1 + continue + end + + ch=convhull(r,c); + % one last check for parasites + if length(find(im(pix)>lDark))/length(pix)> 0.5 + % plot(c(ch),r(ch),'-c') + continue + end + % it's a keeper! + bwCellFG(pix)=1; + + + + % plot(c(ch),r(ch),'-r','linewidth',1.5) + + no=[]; + no.t=t; + no.pts=[c(ch),r(ch)]; + + no.indPixels=pix; + if LTails(r(1),c(1)) + TailPix = find(LTails==LTails(r(1),c(1))); + TailPix=union(TailPix,pix); + else + TailPix=pix; + end + no.indTailPixels=TailPix; + no.imPixels=im(pix); + % surround completely by Halo? + if all(bwHaloHoles(pix)) + no.BrightInterior=1; + else + no.BrightInterior=0; + end + no.ID=-1; + no.Eccentricity=stats(idx(i)).Eccentricity; + objs=[objs no]; + % drawnow + + + end + + % bright interiors + igm=bwig|bwHalo; + se=strel('square',5); + igm=imclose(igm,se); + igm=imfill(igm,'holes'); + igm(logical(bwCellFG))=0; + se=strel('square',13); + igm=imerode(igm,se); + + CC = bwconncomp(igm,8); + Ligm = labelmatrix(CC); + stats = regionprops(CC, 'Area','Eccentricity'); + idx = find( [stats.Area] >25 & [stats.Area] <1000 & [stats.Eccentricity]<.95 ) ; + + for i=1:length(idx) + pix=find(Ligm==idx(i)); + [r c]=ind2sub(size(im),pix); + ch=convhull(r,c); + + bwPoly = poly2mask(c(ch),r(ch),size(im,1),size(im,2)); + if ~isempty(find(bwCellFG &bwPoly, 1)),continue,end + no=[]; + no.t=t; + no.pts=[c(ch),r(ch)]; + no.ID=-1; + + no.indPixels=pix; + if LTails(r(1),c(1)) + TailPix = find(LTails==LTails(r(1),c(1))); + TailPix=union(TailPix,pix); + else + TailPix=pix; + end + no.indTailPixels=TailPix; + no.BrightInterior=1; + no.Eccentricity=stats(idx(i)).Eccentricity; + no.imPixels=im(pix); + objs=[objs no]; + + % plot(c(ch),r(ch),'-m') + % plot(c(ch),r(ch),'-r','linewidth',1.5) + % drawnow + end +end + +fileName = ['.\segmentationData\objs_' num2str(tStart) '.mat']; +if(isempty(dir('.\segmentationData'))),system('mkdir .\segmentationData');end +save(fileName,'objs'); +end \ No newline at end of file diff --git a/src/MATLAB/SignificantDigits.m b/src/MATLAB/SignificantDigits.m new file mode 100644 index 0000000000000000000000000000000000000000..0df525d2f60c938286b1891e0d16dff14043881b --- /dev/null +++ b/src/MATLAB/SignificantDigits.m @@ -0,0 +1,19 @@ +function digits = SignificantDigits(num) +% SignificantDigits will see how many digits the image file name needs for +% each frame and then will convert num to the appropriate string + +%--Eric Wait + +global CONSTANTS +digits = ''; +switch CONSTANTS.imageSignificantDigits + case 3 + digits = num2str(num,'%03d'); + case 4 + digits = num2str(num,'%04d'); + case 5 + digits = num2str(num,'%05d'); + case 6 + digits = num2str(num,'%06d'); +end +end \ No newline at end of file diff --git a/src/MATLAB/SplitHull.m b/src/MATLAB/SplitHull.m index 1d01f1aa269bfe2dae916da674dbcb5c080e026b..6893630d97bc770b3046c1aed0ab7d4635577f28 100644 --- a/src/MATLAB/SplitHull.m +++ b/src/MATLAB/SplitHull.m @@ -4,7 +4,10 @@ function newTrackIDs = SplitHull(hullID, k) %--Mark Winter -global CellHulls CellFamilies +global CellHulls CellFamilies HashedCells + +oldCOM = CellHulls(hullID).centerOfMass; +oldTracks = [HashedCells{CellHulls(hullID).time}.trackID]; newHulls = ResegmentHull(CellHulls(hullID), k); @@ -15,12 +18,16 @@ end % Just arbitrarily assign clone's hull for now CellHulls(hullID) = newHulls(1); +newHullIDs = hullID; % Other hulls are just added off the clone newFamilyIDs = []; for i=2:length(newHulls) CellHulls(end+1) = newHulls(i); newFamilyIDs = [newFamilyIDs NewCellFamily(length(CellHulls), newHulls(i).time)]; + newHullIDs = [newHullIDs length(CellHulls)]; end -newTrackIDs = [CellFamilies(newFamilyIDs).rootTrackID]; +% newTrackIDs = [CellFamilies(newFamilyIDs).rootTrackID]; + +newTrackIDs = TrackSplitHulls(newHullIDs, oldTracks, oldCOM); end diff --git a/src/MATLAB/TestDataIntegrity.m b/src/MATLAB/TestDataIntegrity.m index 67be371fbd778656dbf43859c22cb1aa2dc00ab2..1f0aedd462df638667e8bf76a96d9cc1cd7573d7 100644 --- a/src/MATLAB/TestDataIntegrity.m +++ b/src/MATLAB/TestDataIntegrity.m @@ -117,21 +117,22 @@ end %% check CellHulls % if(length(hullsList)~=length(find([CellHulls.deleted]==0))) missingHulls = find(ismember(find([CellHulls.deleted]==0),hullsList')==0); -if(~isempty(missingHulls)) - if(correct) - progress = 0; - iterations = length(missingHulls); - for i=1:length(missingHulls) - progress = progress+1; - Progressbar(progress/iterations); - if(isempty(CellHulls(missingHulls(i)).points)) - CellHulls(missingHulls(i)).deleted = 1; - end - end - else - error('HullsList ~= CellHulls'); - end -end +% if(~isempty(missingHulls)) +% if(correct) +% progress = 0; +% iterations = length(missingHulls); +% for i=1:length(missingHulls) +% progress = progress+1; +% Progressbar(progress/iterations); +% if(isempty(CellHulls(missingHulls(i)).points)) +% CellHulls(missingHulls(i)).deleted = 1; +% end +% end +% else +% error('HullsList ~= CellHulls'); +% end +% end +Progressbar(1);%clear it out fprintf('\nDone\n'); end diff --git a/src/MATLAB/TrackSplitHulls.m b/src/MATLAB/TrackSplitHulls.m new file mode 100644 index 0000000000000000000000000000000000000000..8a6471d808daebb3edd1b28ca51905e6ce64d473 --- /dev/null +++ b/src/MATLAB/TrackSplitHulls.m @@ -0,0 +1,148 @@ +function trackIDs = TrackSplitHulls(newHulls, forceTracks, COM) + global CONSTANTS CellHulls HashedCells + + t = CellHulls(newHulls(1)).time; + if ( t <= 1 ) + return; + end + + curHulls = [HashedCells{t}.hullID]; +% curTracks = [HashedCells{t}.trackID]; + lastHulls = [HashedCells{t-1}.hullID]; + distSq = sum((vertcat(CellHulls(lastHulls).centerOfMass) - ones(length(lastHulls),1)*COM).^2, 2); + + bTrackHull = distSq < CONSTANTS.maxRetrackDistSq; + trackHulls = lastHulls(bTrackHull); + + if ( isempty(trackHulls) ) + return; + end + + oldTracks = [HashedCells{t-1}(bTrackHull).trackID]; + +% % TODO: don't muck up edited tracks (labels) +% for i=1:length(oldTracks) +% hashTime = t - CellTracks(oldTracks(i)).startTime + 1; +% if ( length(CellTracks(oldTracks(i)).hulls) >= hashTime ) +% CellTracks(oldTracks(i)).hulls(hashTime) = 0; +% end +% end + + avoidHulls = setdiff(curHulls,newHulls); + tmpGConnect = TrackingCosts(trackHulls, t-1, avoidHulls, CellHulls, HashedCells); + + [r c] = ndgrid(trackHulls, curHulls); + costIdx = sub2ind(size(tmpGConnect), r, c); + costMatrix = tmpGConnect(costIdx); + + bAffected = any(costMatrix,1); + affectedHulls = curHulls(bAffected); + costMatrix = costMatrix(:,bAffected); + + bOutTracked = any(costMatrix,2); +% trackHulls = trackHulls(bOutTracked); + extendTracks = oldTracks(bOutTracked); + costMatrix = full(costMatrix(bOutTracked,:)); + + costMatrix(costMatrix == 0) = Inf; + +% % Dump unaffected tracks from the force-keep list +% affectedTracks = curTracks(bAffected); +% forceTracks = intersect(forceTracks, union(oldTracks,affectedTracks)); + + assignTracks(t, costMatrix, extendTracks, affectedHulls); + + trackIDs = [HashedCells{t}(ismember([HashedCells{t}.hullID],newHulls)).trackID]; +end + +function assignTracks(t, costMatrix, extendTracks, affectedHulls) +% bMustAssign = ismember(oldTracks, forceTracks); +% bDontChange = ismember(affectedTracks, setdiff(forceTracks,oldTracks)); +% +% % Remove columns representing assignments which will remove a +% % force-keep track +% affectedHulls = affectedHulls(~bDontChange); +% costMatrix = costMatrix(:,~bDontChange); + + [minInCosts,bestIncoming] = min(costMatrix,[],1); + [minOutCosts,bestOutgoing] = min(costMatrix,[],2); + + bestOutgoing = bestOutgoing'; + bMatchedCol = false(size(bestIncoming)); + bMatched = (bestIncoming(bestOutgoing) == (1:length(bestOutgoing))); + bMatchedCol(bestOutgoing(bMatched)) = 1; + matchedIdx = find(bMatched); + + % Assign matched edges + for i=1:length(matchedIdx) + assignHull = affectedHulls(bestOutgoing(matchedIdx(i))); + assignTrack = extendTracks(matchedIdx(i)); + + assignHullToTrack(t, assignHull, assignTrack); + end + + costMatrix(bMatched,:) = Inf; + costMatrix(:,bMatchedCol) = Inf; + + [minCost minIdx] = min(costMatrix(:)); + % Patch up whatever other tracks we can + while( ~isinf(minCost) ) + [r c] = ind2sub(size(costMatrix), minIdx); + assignHull = affectedHulls(c); + assignTrack = extendTracks(r); + + assignHullToTrack(t, assignHull, assignTrack); + + costMatrix(r,:) = Inf; + costMatrix(:,c) = Inf; + + [minCost minIdx] = min(costMatrix(:)); + end +end + +function assignHullToTrack(t, hull, track) + global HashedCells + + oldHull = []; + + % Get old hull - track assignments + bOldHull = [HashedCells{t}.trackID] == track; + if ( any(bOldHull) ) + oldHull = HashedCells{t}(bOldHull).hullID; + end + + oldTrack = HashedCells{t}([HashedCells{t}.hullID] == hull).trackID; + + % Hull - track assignment is unchanged + if ( oldHull == hull ) + return; + end + + if ( ~isempty(oldHull) ) + % Swap track assignments + swapTracking(t, oldHull, hull, track, oldTrack); + else + % Add hull to track + AddHullToTrack(hull, track, []); + end +end + +% Currently hullA has trackA, hullB has trackB +% swap so that hullA gets trackB and hullB gets trackA +function swapTracking(t, hullA, hullB, trackA, trackB) + global HashedCells CellTracks + + hashAIdx = ([HashedCells{t}.hullID] == hullA); + hashBIdx = ([HashedCells{t}.hullID] == hullB); + + % Swap track IDs + HashedCells{t}(hashAIdx).trackID = trackB; + HashedCells{t}(hashBIdx).trackID = trackA; + + % Swap hulls in tracks + hashTime = t - CellTracks(trackA).startTime + 1; + CellTracks(trackA).hulls(hashTime) = hullB; + + hashTime = t - CellTracks(trackB).startTime + 1; + CellTracks(trackB).hulls(hashTime) = hullA; +end diff --git a/src/MATLAB/WriteSegData.m b/src/MATLAB/WriteSegData.m new file mode 100644 index 0000000000000000000000000000000000000000..fd44da274aa968e35701d19199c36bf22c7b2ade --- /dev/null +++ b/src/MATLAB/WriteSegData.m @@ -0,0 +1,28 @@ +function WriteSegData(objsSegment,DatasetName) +sz=[1024 1344]; +th=max([objsSegment.t]); +HashedHulls=cell(th,1); + +% reset tracking info +for n=1:length(objsSegment) + HashedHulls{objsSegment(n).t}=[HashedHulls{objsSegment(n).t};n]; +end +fname=['SegObjs_' DatasetName '.txt']; +fid=fopen(fname,'wt'); +fprintf(fid,'%d %d\n',th,length(objsSegment) ); +for i=1:length(HashedHulls) + fprintf(fid,'%d\n',length(HashedHulls{i}) ); + for j=1:length(HashedHulls{i}) + [r c]=ind2sub(sz,objsSegment(HashedHulls{i}(j)).indPixels); + COM=round(mean([r c],1)); + %i,t,xCOM,yCOM + fprintf(fid,'%d %d %d %d:',COM(2),COM(1),length(r),size(objsSegment(HashedHulls{i}(j)).DarkConnectedHulls,1) ); + for k=1:size(objsSegment(HashedHulls{i}(j)).DarkConnectedHulls,1) + fprintf(fid,' %d,%f', objsSegment(HashedHulls{i}(j)).DarkConnectedHulls(k,1),objsSegment(HashedHulls{i}(j)).DarkConnectedHulls(k,2)); + end + fprintf(fid,'\n'); + end +end + +fclose(fid); +end \ No newline at end of file diff --git a/src/MATLAB/constrainedBestPath.m b/src/MATLAB/constrainedBestPath.m index a7da7e8593c3e3403c03872ef978901fb12f58ae..e4e45105face8ebca6e5cc0a37d3370a6cff6933 100644 --- a/src/MATLAB/constrainedBestPath.m +++ b/src/MATLAB/constrainedBestPath.m @@ -1,5 +1,4 @@ function [gConnect, allPathsCosts] = constrainedBestPath(hullIdx, tStart, tEnd, constraints, hulls, hash, gConnect) - scriptConstants global CONSTANTS windowSize = tEnd - tStart; @@ -32,11 +31,11 @@ function [gConnect, allPathsCosts] = constrainedBestPath(hullIdx, tStart, tEnd, thGlobal = [thHistory thPath]; if 105==tStart - dmax_cc=3*DMAX_CC; - dmax_com=3*DMAX_COM; + dmax_cc=3*CONSTANTS.dMaxConnectComponet; + dmax_com=3*CONSTANTS.dMaxCenterOfMass; else - dmax_cc=DMAX_CC; - dmax_com=DMAX_COM; + dmax_cc=CONSTANTS.dMaxConnectComponet; + dmax_com=CONSTANTS.dMaxCenterOfMass; end LocalCost = HullDist(hulls, thPath(1), thPath(2), dmax_cc, dmax_com); diff --git a/src/MATLAB/constrainedDFS.m b/src/MATLAB/constrainedDFS.m index 2db31ea86b2db4048fdfd53c0b2886b1c95b261e..52e26bafa8892b6efcd70a9c5ac4cf085b87b6de 100644 --- a/src/MATLAB/constrainedDFS.m +++ b/src/MATLAB/constrainedDFS.m @@ -1,5 +1,5 @@ function [path allPaths] = constrainedDFS(hullIdx, constraints, hulls, hash, t0, t1, path, allPaths) - scriptConstants; + global CONSTANTS curCnsts = []; bFoundPath = 0; @@ -9,11 +9,11 @@ function [path allPaths] = constrainedDFS(hullIdx, constraints, hulls, hash, t0, curCnsts = constraints{length(path)}; for i=1:length(curCnsts) if 105==t0 - dmax_cc=3*DMAX_CC; - dmax_com=3*DMAX_COM; + dmax_cc=3*CONSTANTS.dMaxConnectComponet; + dmax_com=3*CONSTANTS.dMaxCenterOfMass; else - dmax_cc=DMAX_CC; - dmax_com=DMAX_COM; + dmax_cc=CONSTANTS.dMaxConnectComponet; + dmax_com=CONSTANTS.dMaxCenterOfMass; end [d dSz] = HullDist(hulls, hullIdx, curCnsts(i), dmax_cc, dmax_com); diff --git a/src/MATLAB/scriptConstants.m b/src/MATLAB/scriptConstants.m deleted file mode 100644 index 57ed9033d4743f37afac01278d6501e48a9639ef..0000000000000000000000000000000000000000 --- a/src/MATLAB/scriptConstants.m +++ /dev/null @@ -1,11 +0,0 @@ -% CONSTANTS - -DMAX_CC=40; % -DMAX_COM=80; % - -LOOKAHEAD=2; - -% min lifetime to participate in split / merge, also anyone younger than -% this chooses after old folks at assignment -MIN_PLAYER=9; -MIN_MITOSIS=30; \ No newline at end of file diff --git a/src/MATLAB/trackingCosts.m b/src/MATLAB/trackingCosts.m index 8efa98110f7498f42f36cdb4c470659a0388a7a0..a34bb04dff2b0c8c5522d21744a292d8d6f25465 100644 --- a/src/MATLAB/trackingCosts.m +++ b/src/MATLAB/trackingCosts.m @@ -1,5 +1,5 @@ -function gConnect = trackingCosts(trackHulls, t, avoidHulls, hulls, hash) - windowSize = 4; +function gConnect = TrackingCosts(trackHulls, t, avoidHulls, hulls, hash) + windowSize = 2; gConnect = sparse([],[],[],length(hulls),length(hulls),round(0.1*length(hulls))); if ( t+1 > length(hash) )