CERR (structCompare.m)

6 Ansichten (letzte 30 Tage)
Reem Alahmadi
Reem Alahmadi am 31 Aug. 2022
Kommentiert: Reem Alahmadi am 3 Sep. 2022
Hello
How to run this code?
if length(varargin{:}) > 1
command = 'INIT';
for i=1:length(varargin{:})
structAll(i) = str2num(varargin{1}{i});
end
elseif length(varargin{:}) == 1
command = 'EXIT';
end
global stateS planC
indexS = planC{end};
switch upper(command)
case 'INIT'
try
scanNum = getStructureAssociatedScan(structAll(1));
for i=2:length(structAll)
if scanNum ~= getStructureAssociatedScan(structAll(i))
error('All structures must be associated to the same scan')
return;
end
end
%Remove old masks
cleanupAxes(stateS.handle.CERRAxis)
structCompare({'exit'})
oldLayout = stateS.layout;
% Change panel layout to 4 medium
sliceCallBack('layout', 4)
% Link the three views and display Transverse view on the three axes
Ax1 = stateS.handle.CERRAxis(1);
Ax2 = stateS.handle.CERRAxis(2);
Ax3 = stateS.handle.CERRAxis(3);
setAxisInfo(Ax1,'scanSelectMode','manual','structSelectMode','manual','scanSets',scanNum,'structureSets',scanNum,'doseSets',[],'view','transverse','xRange',[],'yRange',[])
setAxisInfo(Ax2,'scanSelectMode','manual','structSelectMode','manual','scanSets',scanNum,'structureSets',scanNum,'doseSets',[])
setAxisInfo(Ax3,'scanSelectMode','manual','structSelectMode','manual','scanSets',scanNum,'structureSets',scanNum,'doseSets',[])
setAxisInfo(Ax2,'coord',{'Linked', Ax1},...
'view',{'Linked', Ax1},'xRange',{'Linked', Ax1},...
'yRange',{'Linked', Ax1});
setAxisInfo(Ax3,'coord',{'Linked', Ax1},...
'view',{'Linked', Ax1},'xRange',{'Linked', Ax1},...
'yRange',{'Linked', Ax1});
%Set coord at the starting slice of strNum1
[~,~,z] = size(getScanArray(planC{indexS.scan}(scanNum)));
[xCoord,yCoord,zCoord] = getScanXYZVals(planC{indexS.scan}(scanNum));
for i=1:z
if ~isempty(planC{indexS.structures}(structAll(1)).contour(i).segments) && ~isempty(planC{indexS.structures}(structAll(1)).contour(i).segments(1).points)
coord = zCoord(i);
break
end
end
setAxisInfo(Ax1,'coord',coord,'xRange',[xCoord(1) xCoord(end)],'yRange',[yCoord(end) yCoord(1)])
%Create an unLinked 5th axis to look at other view
if length(stateS.handle.CERRAxis) < 5
sliceCallBack('DUPLICATEAXIS',Ax1)
setAxisInfo(stateS.handle.CERRAxis(5),'scanSelectMode','manual','structSelectMode','manual','scanSets',scanNum,'structureSets',scanNum,'doseSets',[],'view','sagittal','xRange',[],'yRange',[],'coord',median(yCoord))
end
%Turn-off all structures except the two selected for comparison
sliceCallBack('ViewNoStructures')
for i=1:length(structAll)
sliceCallBack('toggleSingleStruct',num2str(structAll(i)))
end
%Store strNum1, strNum2 and oldLayout in stateS
if ~isfield(stateS,'structCompare')
stateS.structCompare.oldLayout = oldLayout;
end
stateS.structCompare.structAll = structAll;
%5> Plot histogram
% averageMask3M = logical(zeros(getUniformScanSize(planC{indexS.scan}(scanNum))));
% for i=1:length(structAll)
% averageMask3M = averageMask3M + getUniformStr(i);
% end
% averageMask3M = averageMask3M/length(structAll);
% [iV,jV,kV]=find3d(averageMask3M);
% iMin = min(iV);
% iMax = max(iV);
% jMin = min(jV);
% jMax = max(jV);
% kMin = min(kV);
% kMax = max(kV);
% averageMask3M = averageMask3M(iMin:iMax,jMin:jMax,kMin:kMax);
%get the min and max i, j, k
%bigMask=zeros(getUniformScanSize(planC{indexS.scan}(1)));
bigMask=zeros(getUniformScanSize(planC{indexS.scan}(1)),'int8');
for i=1:length(structAll)
mask3M = getUniformStr(structAll(i));
bigMask=bigMask | mask3M;
end
[iV,jV,kV]=find3d(bigMask);
iMin = min(iV);
iMax = max(iV);
jMin = min(jV);
jMax = max(jV);
kMin = min(kV);
kMax = max(kV);
clear iV kV jV bigMask
%averageMask3M = single(zeros([length(iMin:iMax) length(jMin:jMax) length(kMin:kMax)]));
averageMask3M = zeros([length(iMin:iMax) length(jMin:jMax) length(kMin:kMax)],'single');
%get clipped average mask for each volume
rateMat = logical([]);
for i=1:length(structAll)
mask3M = getUniformStr(structAll(i));
averageMask3M = averageMask3M + mask3M(iMin:iMax,jMin:jMax,kMin:kMax);
temp=mask3M(iMin:iMax,jMin:jMax,kMin:kMax);
rateMat=[rateMat,temp(:)];
end
clear mask3M
averageMask3M = averageMask3M/length(structAll);
iterlim=100;
senstart=0.9999*ones(1,length(structAll));
specstart=0.9999*ones(1,length(structAll));
[staple3M, sen, spec, Sall] = staple(rateMat,iterlim, single(senstart), single(specstart));
mean_sen=mean(sen); std_sen=std(sen);
mean_spec=mean(spec); std_spec=std(spec);
%get volume of an uniformized voxel
[xUnifV,yUnifV,zUnifV] = getUniformScanXYZVals(planC{indexS.scan}(scanNum));
vol = (xUnifV(2)-xUnifV(1)) * (yUnifV(1)-yUnifV(2)) * (zUnifV(2)-zUnifV(1));
numBins = 20;
obsAgree = linspace(0.001,1,numBins);
rater_prob=mean(rateMat,1);
chance_prob=sqrt(rater_prob.*(1-rater_prob));
chance_prob_mat=repmat(chance_prob,size(rateMat,1),single(1));
reliability_mat=mean((rateMat-chance_prob_mat)./(1-chance_prob_mat),2);
%mean_chance_prob=mean(chance_prob);
for i=1:length(obsAgree)
%volV(i) = vol * length(find(averageMask3M(:) >= percentV(i)));
%indAvg = find(averageMask3M(:) < obsAgree(i));
volV(i) = sum((averageMask3M(:) >= obsAgree(i))*vol);
volStapleV(i) = sum((staple3M(:) >= obsAgree(i))*vol);
%kappa(i)=(obsAgree(i)-mean_chance_prob)/(1-mean_chance_prob);
volKappaV(i) = sum((reliability_mat(:) >= obsAgree(i))*vol);
end
%calculate overall kappa
[kappa,pval,k, pk]=kappa_stats(rateMat,[0 1]); % agreement
%% calculations
min_vol=min(sum(rateMat,1))*vol;
max_vol=max(sum(rateMat,1))*vol;
mean_vol=mean(sum(rateMat,1))*vol;
sd_vol=std(sum(rateMat,1))*vol;
disp('-------------------------------------------')
disp(['Overall kappa: ',num2str(kappa)])
disp(['p-value: ',num2str(pval)])
disp(['Mean Sensitivity: ',num2str(mean_sen)])
disp(['Std. Sensitivity: ',num2str(std_sen)])
disp(['Mean Specificity: ',num2str(mean_spec)])
disp(['Std. Specificity: ',num2str(std_spec)])
disp(['Min. volume: ',num2str(min_vol)])
disp(['Max. volume: ',num2str(max_vol)])
disp(['Mean volume: ',num2str(mean_vol)])
disp(['Std. volume: ',num2str(sd_vol)])
disp(['Intersection volume: ',num2str(volV(end))])
disp(['Union volume: ',num2str(volV(1))])
disp('-------------------------------------------')
clear rateMat averageMask3M chance_prob_mat mask3M indAvg
stapleToPass = zeros(getUniformScanSize(planC{indexS.scan}(1)),'single');
stapleToPass(iMin:iMax,jMin:jMax,kMin:kMax) = reshape(staple3M,length(iMin:iMax),length(jMin:jMax),length(kMin:kMax));
correctedMaskToPass = zeros(getUniformScanSize(planC{indexS.scan}(1)),'single');
correctedMaskToPass(iMin:iMax,jMin:jMax,kMin:kMax) = reshape(reliability_mat,length(iMin:iMax),length(jMin:jMax),length(kMin:kMax));
agreementHistogram('init',obsAgree,volV,volStapleV,volKappaV,stapleToPass,correctedMaskToPass)
%figure, plot(percentV,volV/volV(1)) %percent volume
%6> Draw mask for structure 1,2 and the difference
showComparisonMask(structAll,mean(obsAgree))
stateS.CTDisplayChanged = 1;
stateS.structsChanged = 1;
CERRRefresh
catch
structCompare('EXIT')
end
case 'EXIT'
if ~isfield(stateS,'structCompare')
return;
end
sliceCallBack('layout', stateS.structCompare.oldLayout)
%unLink the axes
Ax1 = stateS.handle.CERRAxis(1);
setAxisInfo(Ax1,'coord',[],'view','transverse','xRange',[],...
'yRange',[],'scanSets',1,'structureSets',1)
stateS.handle.aI(2).coord = [];
stateS.handle.aI(2).view = 'sagittal';
stateS.handle.aI(2).xRange = [];
stateS.handle.aI(2).yRange = [];
stateS.handle.aI(2).scanSets = 1;
stateS.handle.aI(2).structureSets = 1;
stateS.handle.aI(3).coord = [];
stateS.handle.aI(3).view = 'coronal';
stateS.handle.aI(3).xRange = [];
stateS.handle.aI(3).yRange = [];
stateS.handle.aI(3).scanSets = 1;
stateS.handle.aI(3).structureSets = 1;
stateS = rmfield(stateS,'structCompare');
%close the active histogram figure
hFig = findobj('name','Agreement Histogram');
delete(hFig);
%setAxisInfo(hAxis, 'coord', coord, 'view', view, 'xRange', [], 'yRange', []);
% Remove check-mark from the "Consensus" drop-down
set(findobj(stateS.handle.CERRStructMenu,'label', 'Consensus'),'Checked','off');
if isfield(stateS.handle,'stapleText')
handleV = ishandle(stateS.handle.stapleText);
delete(stateS.handle.stapleText(handleV))
end
CERRRefresh
end
  2 Kommentare
Abderrahim. B
Abderrahim. B am 31 Aug. 2022
This is a MATLAB function I believe . First and last command line are missed. Where did you find this code?
Reem Alahmadi
Reem Alahmadi am 3 Sep. 2022

Melden Sie sich an, um zu kommentieren.

Antworten (0)

Kategorien

Mehr zu Image Processing Toolbox finden Sie in Help Center und File Exchange

Tags

Produkte


Version

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by