Skip to content
Snippets Groups Projects
Commit ebe59d59 authored by ac 20's avatar ac 20
Browse files

smooth.patch updated to be track agnostic

parent ee088cb0
Branches
No related tags found
No related merge requests found
......@@ -11,8 +11,7 @@ tProcess.tTrack1=toc(tx);
[conn,CONSTANTS]=openDB(strDB);
tx=tic();
Smooth.Patch.patch11(conn);
Smooth.Patch.patch12(conn);
Smooth.Patch.patch(conn);
tProcess.tPatch=toc(tx);
tx=tic();
......
function [qSrc,qDst]=getPatchCandidates(conn)
cmd=[' select min(cost),cellID_src,cellID_dst,trackID_src,C2.trackID as '...
' trackID_dst,tmax as tmax_src from tblDistCC inner join '...
' (select cellID as cellID1,trackID as trackID_src,max(time) as '...
' tmax from tblCells where trackID not in '...
' (select trackID from tblFamilies inner join tblCells as C1 '...
' on cellID_parent=C1.cellID) '...
' group by trackID) on tblDistCC.cellID_src=cellID1 inner join '...
' tblCells as C2 on cellID_dst=C2.cellID ' ...
' group by trackID,cellID_src'];
qSrc=fetch(conn,cmd);
cmd=[' select min(cost),cellID_src,cellID_dst,trackID as trackIDdst,tmin from tblDistCC '...
' inner join (select cellID,trackID,min(time) as tmin from tblCells ' ...
' where cellID not in (select cellID_child1 from tblFamilies) '...
' and cellID not in (select cellID_child2 from tblFamilies) group by trackID) on tblDistCC.cellID_dst=cellID '...
' group by trackID,cellID_dst'];
qDst=fetch(conn,cmd);
function qTarget=getPatchTarget(conn,qSrc)
cmd=['select min(time) as t0 from tblCells where trackID=(select trackID from '...
' tblCells where cellID=' num2str(qSrc.cellID_dst) ')'];
q=fetch(conn,cmd);
if 1==q.t0 || q.t0<qSrc.tmax_src-3
qTarget=[];
return;
end
cmd=['select dst.trackID as trackID_dst,dst.time as time_dst,src.trackID '...
' as trackID_src,src.time as time_src,min(cost),cellID_src,cellID_dst '...
' from (select tblDistCC.*,time,trackID from tblCells inner join '...
' tblDistCC on cellID=cellID_dst where trackID=(select trackID '...
' from tblCells where cellID=' num2str(qSrc.cellID_dst) ') and time>='...
num2str(qSrc.tmax_src-4) ' and time<=' num2str(qSrc.tmax_src+1) ...
' ) inner join tblCells as dst on cellID_dst=dst.cellID '...
'inner join tblCells as src on cellID_src=src.cellID '...
'group by cellID_dst '];
qTarget=fetch(conn,cmd);
if ~isempty(setdiff(qTarget.trackID_src,[qSrc.trackID_dst,qSrc.trackID_src])) ||...
isempty(intersect(qTarget.trackID_src,[qSrc.trackID_src]))
qTarget=[];
end
function patch(conn,CONSTANTS)
trackList=fetch(conn,'select trackID from tblCells group by trackID');
qt={};
for i=1:length(trackList.trackID)
qt{i}=fetch(conn,['select time,iNest,cellID from tblCells where trackID=' ...
num2str(trackList.trackID(i)) ' order by time asc' ]);
end
qmax=fetch(conn,'select max(iNest) as maxNest from tblCells');
patchList=[];
patchMap=cell(CONSTANTS.imageData.NumberOfFrames,qmax.maxNest);
for i=1:length(qt)
for j=i+1:length(qt)
if i==j
continue
end
tOverlap=intersect(qt{i}.time,qt{j}.time);
if isempty(tOverlap)
continue
end
iNest=qt{i}.iNest(ismember(qt{i}.time,tOverlap));
jNest=qt{j}.iNest(ismember(qt{j}.time,tOverlap));
% since qt is sorted by time comparison is valid
% todo - check that both times are continuous
if (iNest(1)==jNest(1) && iNest(end)==jNest(end))
patchTime=qt{i}.time(ismember(qt{i}.time,tOverlap));
for k=1:length(patchTime)
idxi=find(ismember(qt{i}.time,tOverlap));
cidi=qt{i}.cellID(idxi(k));
idxj=find(ismember(qt{j}.time,tOverlap));
cidj=qt{j}.cellID(idxj(k));
patchMap{patchTime(k),iNest(k)}=union(patchMap{patchTime(k),iNest(k)},[cidi,cidj]);
end
% np=table(
% patchList=[
np=table(min(qt{i}.time),max(qt{i}.time),trackList.trackID(i),...
min(qt{j}.time),max(qt{j}.time),trackList.trackID(j),...
'VariableNames',{'t0i','t1i','tidi','t0j','t1j','tidj'});
if isempty(patchList)
patchList=np;
else
patchList=[patchList;np];
end
end
end
end
[time,nestList]=find(~cellfun(@isempty,patchMap));
for i=1:length(time)
t=time(i);
iNest=nestList(i);
cids=patchMap{t,iNest};
[newCell,pe]=Ensemble.ensembleCheckMerge(conn,cids,CONSTANTS);
if ~isempty(newCell) && pe>0.75
Ensemble.writeMergedCell(conn,cids,newCell,CONSTANTS);
end
end
function patch(conn)
cmd='select cellID_child1 as cellID from tblFamilies union select cellID_child2 as cellID from tblFamilies';
qChildren=fetch(conn,cmd);
cidChildren=qChildren.cellID;
cmd='select cellID_parent from tblFamilies';
qParents=fetch(conn,cmd);
cidParents=qParents.cellID_parent;
Smooth.Patch.patch11(conn,cidChildren);
Smooth.Patch.patch12(conn,cidParents,cidChildren);
% true love patcher!
function patch11(conn)
% sometimes the tracker makes decisions based on longer time projections
% if those fail, we fall back on the original single frame true love
% (1st choice ccDistance <-> 1st choice ccDistance)
function patch11(conn,cidChildren)
cmd=['select cellID,trackID,max(time) as tmax from tblCells '...
' where trackID not in (select trackID from tblCells inner join tblFamilies'...
' on cellID_parent=cellID) group by trackID'];
qSrc=fetch(conn,cmd);
cidList=Helpers.sqlEncodeVector(qSrc.cellID);
if isempty(qSrc)
return
end
cidList=Helpers.sqlEncodeVector(qSrc.cellID);
cmd=['select cellID_src,cellID_dst,min(cost) from tblDistCC where cellID_src in ' ...
cidList ' group by cellID_src'];
qSrcCosts=fetch(conn,cmd);
cmd=['select cellID_src,cellID_dst,min(cost),trackID as trackID_dst,time as time_dst '...
cmd=['select cellID_src,cellID_dst,trackID as trackID_dst,min(cost),time as time_dst '...
' from tblCells inner join tblDistCC on cellID=cellID_dst where cellID_src in '...
cidList ' and cellID_dst not in '...
' (select cellID_child1 from tblFamilies) ' ...
' and cellID_dst not in (select cellID_child2 from tblFamilies) ' ...
' group by cellID_dst '];
cidList];
qPatch=fetch(conn,cmd);
qPatch(qPatch.cellID_dst~=qPatch.trackID_dst,:)=[];
for i=1:length(qPatch.cellID_src)
if ~isempty(intersect(cidChildren,qPatch.cellID_dst(i)))
% can't patch to a mitotic child
continue;
end
% check src costs. true love?
idxSrcCosts=find(qSrcCosts.cellID_src==qPatch.cellID_src(i));
if qSrcCosts.cellID_dst(idxSrcCosts)~=qPatch.cellID_dst(i)
......
function patch12(conn)
% the second chance patcher
% here, eligible tracks can get assigned their 1st choice, even if they
% are the corresponding 2nd choice
function patch12(conn,cidParents,cidChildren)
% patch src's are leaf nodes on the tree
% patch dst's are parent nodes on the tree
[qSrc,qDst]=Smooth.Patch.getPatchCandidates(conn);
cmd=' select cellID_child1 as cellID from tblFamilies union select cellID_child2 as cellID from tblFamilies';
qChildren=fetch(conn,cmd);
qSrc=getPatchCandidates(conn);
for i=1:length(qSrc.cellID_dst)
if ~isempty(intersect(qChildren.cellID,qSrc.cellID_dst(i)))
if ~isempty(intersect(cidChildren,qSrc.cellID_dst(i)))
continue
end
if ~isempty(intersect(cidParents,qSrc.cellID_src(i)))
continue
end
qTarget=Smooth.Patch.getPatchTarget(conn,qSrc(i,:));
qTarget=getPatchTarget(conn,qSrc(i,:));
if isempty(qTarget)
continue;
end
cmd=['update tblCells set trackID=' num2str(qSrc.trackID_src(i)) ...
' where trackID=' num2str(qSrc.trackID_dst(i)) ' and time>'...
num2str(qSrc.tmax_src(i))];
cmd=['update tblCells set trackID=(select trackID from tblCells where '...
' cellID=' num2str(qSrc.cellID_src(i)) ') where trackID= '...
' (select trackID from tblCells where cellID=' ...
num2str(qSrc.cellID_dst(i)) ') and time>(select max(time) from '...
' tblCells where trackID=(select trackID from tblCells where cellID='...
num2str(qSrc.cellID_src(i)) '))'];
exec(conn,cmd);
qSrc.trackID_src(qSrc.trackID_src==qSrc.trackID_dst(i))=qSrc.trackID_src(i);
end
function qTarget=getPatchTarget(conn,qSrc)
cmd=['select min(time) as tminDst,trackID as trackID_dst from tblCells where trackID=(select trackID from '...
' tblCells where cellID=' num2str(qSrc.cellID_dst) ')'];
q=fetch(conn,cmd);
cmd=['select max(time) as tmaxSrc, trackID as trackID_src from tblCells where trackID=(select trackID from '...
' tblCells where cellID=' num2str(qSrc.cellID_src) ')'];
qt=fetch(conn,cmd);
if 1==q.tminDst || q.tminDst<qt.tmaxSrc-3
qTarget=[];
return;
end
cmd=['select dst.trackID as trackID_dst,dst.time as time_dst,src.trackID '...
' as trackID_src,src.time as time_src,min(cost),cellID_src,cellID_dst '...
' from (select tblDistCC.*,time,trackID from tblCells inner join '...
' tblDistCC on cellID=cellID_dst where trackID=(select trackID '...
' from tblCells where cellID=' num2str(qSrc.cellID_dst) ') and time>='...
num2str(qt.tmaxSrc-4) ' and time<=' num2str(qt.tmaxSrc+1) ...
' ) inner join tblCells as dst on cellID_dst=dst.cellID '...
'inner join tblCells as src on cellID_src=src.cellID '...
'group by cellID_dst '];
qTarget=fetch(conn,cmd);
if ~isempty(setdiff(qTarget.trackID_src,[q.trackID_dst,qt.trackID_src])) ||...
isempty(intersect(qTarget.trackID_src,[qt.trackID_src]))
qTarget=[];
end
function qSrc=getPatchCandidates(conn)
cmd=[' select min(cost),cellID_src,cellID_dst from tblDistCC inner join '...
' tblCells on cellID_dst=cellID ' ...
' group by trackID,cellID_src'];
qSrc=fetch(conn,cmd);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment