diff --git a/ShoulderCase/@ShoulderCaseAnonymiser/ShoulderCaseAnonymiser.m b/ShoulderCase/@ShoulderCaseAnonymiser/ShoulderCaseAnonymiser.m index d0362e8..dc5a793 100644 --- a/ShoulderCase/@ShoulderCaseAnonymiser/ShoulderCaseAnonymiser.m +++ b/ShoulderCase/@ShoulderCaseAnonymiser/ShoulderCaseAnonymiser.m @@ -1,154 +1,163 @@ classdef ShoulderCaseAnonymiser < handle properties (Access = private) SCasePath failedRenaming = {}; amiraFiles failedAmiraAnonymisation = {} dicomFiles failedDicomAnonymisation = {} + IPPFiles + fullAnonymisationRunned = false end methods function obj = ShoulderCaseAnonymiser(SCasePath) obj.setCase(string(SCasePath)); end function output = getProperties(obj) output.SCasePath = obj.SCasePath; output.fullAnonymisationRunned = obj.fullAnonymisationRunned; output.failedAmiraAnonymisation = obj.failedAmiraAnonymisation; output.failedDicomAnonymisation = obj.failedDicomAnonymisation; output.failedRenaming = obj.failedRenaming; output.amiraFiles = obj.amiraFiles; output.dicomFiles = obj.dicomFiles; + output.IPPFiles = obj.IPPFiles; end function setCase(obj,SCasePath) obj.SCasePath = SCasePath; obj.amiraFiles = obj.getFilesInSubfolders("*.hx"); obj.dicomFiles = obj.getFilesInSubfolders("*.dcm"); end function output = getFilesInSubfolders(obj,filePattern) filesPath = dir(fullfile(obj.SCasePath,"**",filePattern)); filesPath = fullfile(string({filesPath.folder}),string({filesPath.name})); output = filesPath; end function fullAnonymisation(obj) obj.anonymiseDicomFiles(); obj.anonymiseAmiraFiles(); obj.anonymiseCTFolders(); + obj.anonymiseIPPFiles(); if isempty(obj.failedAmiraAnonymisation) & isempty(obj.failedDicomAnonymisation) & isempty(obj.failedRenaming) obj.renameFileOrFolder(obj.SCasePath,obj.anonymiseFilename(obj.SCasePath)); end obj.fullAnonymisationRunned = true; end function anonymiseDicomFiles(obj) - arrayfun(@(filename)obj.anonymiseDicomFile(filename),obj.dicomFiles); + % arrayfun(@(filename)obj.anonymiseDicomFile(filename),obj.dicomFiles); arrayfun(@(filename)obj.renameFileOrFolder(filename,obj.anonymiseFilename(filename)),obj.dicomFiles); end end methods (Access = private) function anonymiseDicomFile(obj,filename) fieldToKeep = ["PatientAge","PatientSex","PatientSize","PatientWeight"]; try dicomanon(filename,filename,"keep",fieldToKeep); catch ME obj.failedDicomAnonymisation{end+1,1} = ME; obj.failedDicomAnonymisation{end,2} = filename; end end function output = anonymiseFilename(obj,filename) [folder,name,extension] = fileparts(filename); output = fullfile(folder,obj.anonymiseString(name) + extension); end function output = anonymiseString(obj,inputString) inputString = regexprep(inputString,"[-_]" + obj.getIPP + "[-_][A-Z]{2}",''); % remove IPP with initials inputString = regexprep(inputString,"[-_]" + obj.getIPP,''); % remove IPP output = inputString; end end methods function output = getIPP(obj) [~,SCaseFolder,~] = fileparts(obj.SCasePath); IPP = extractAfter(SCaseFolder,"-"); output = IPP; end function anonymiseAmiraFiles(obj) arrayfun(@(filename)obj.anonymiseAmiraFile(filename),obj.amiraFiles); end end methods (Access = private) function anonymiseAmiraFile(obj,filename) try lines = obj.readlines(filename); anonymisedLines = obj.anonymiseString(lines); obj.writelines(filename,anonymisedLines); catch ME obj.failedAmiraAnonymisation{end+1,1} = ME; obj.failedAmiraAnonymisation{end,2} = filename; end end function output = readlines(obj,filename) lines = []; fid = fopen(filename,"r"); while(not(feof(fid))) lines = [lines ; string(fgetl(fid))]; end fclose(fid); output = lines; end function writelines(obj,filename,lines) fid = fopen(filename,"w"); arrayfun(@(line)fprintf(fid,line + "\n"),lines); fclose(fid); end end methods function anonymiseCTFolders(obj) CTFolders = obj.getFilesInSubfolders("CT*"); arrayfun(@(foldername)obj.renameFileOrFolder(foldername,obj.anonymiseFilename(foldername)),CTFolders); end + + function anonymiseIPPFiles(obj) + obj.IPPFiles = obj.getFilesInSubfolders("*" + obj.getIPP() + "*"); + arrayfun(@(filename)obj.renameFileOrFolder(filename,obj.anonymiseFilename(filename)),obj.IPPFiles); + end end methods (Access = private) function renameFileOrFolder(obj,currentPath,newPath) if currentPath == newPath return end try movefile(currentPath,newPath); catch ME obj.failedRenaming{end+1,1} = ME; obj.failedRenaming{end,2} = currentPath; obj.failedRenaming{end,3} = newPath; end end end end \ No newline at end of file