diff --git a/ShoulderCase/@ShoulderCaseAnonymiser/ShoulderCaseAnonymiser.m b/ShoulderCase/@ShoulderCaseAnonymiser/ShoulderCaseAnonymiser.m index 72bd04e..ed33ae7 100644 --- a/ShoulderCase/@ShoulderCaseAnonymiser/ShoulderCaseAnonymiser.m +++ b/ShoulderCase/@ShoulderCaseAnonymiser/ShoulderCaseAnonymiser.m @@ -1,81 +1,138 @@ classdef ShoulderCaseAnonymiser < handle - properties SCasePath - amiraFolders - dicomFolders - end + failedRenaming = {"MatlabException","currentPath","newPath"}; + amiraFiles + failedAmiraAnonymisation = {"MatlabException","filePath"} - - methods + dicomFiles + failedDicomAnonymisation = {"MatlabException","filePath"} + end - function obj = ShoulderCaseAnonymiser(SCaseID) - obj.setCase(SCaseID); + methods + function obj = ShoulderCaseAnonymiser(SCasePath) + obj.setCase(SCasePath); end + function setCase(obj,SCasePath) + obj.SCasePath = SCasePath; - function setCase(obj,SCaseID) - database = ShoulderCaseLoader; - obj.SCasePath = database.getCasePath(SCaseID); + obj.amiraFiles = obj.getFilesInSubfolders("*.hx"); + obj.dicomFiles = obj.getFilesInSubfolders("*.dcm"); + end - obj.amiraFolders = obj.getSubfolders("amira"); - obj.dicomFolders = obj.getSubfolders("dicom"); + 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.anonymiseFolders(); + end - function output = getSubfolders(obj,subfolderName) - subfolderPattern = fullfile(obj.SCasePath,"**",subfolderName); - output = unique(string( {dir(subfolderPattern).folder} )); + function anonymiseDicomFiles(obj) + arrayfun(@(filename)obj.anonymiseDicomFile(filename),obj.dicomFiles); + arrayfun(@(filename)obj.renameFileOrFolder(filename,obj.anonymiseFilename(filename)),obj.dicomFiles); end + end - function anonymiseDicomFolders(obj) + methods (Access = private) + function anonymiseDicomFile(obj,filename) fieldToKeep = ["PatientAge","PatientSex","PatientSize","PatientWeight"]; - for folder = obj.dicomFolders - dicomFiles = obj.getAllFilesPathInFolder(folder,"*.dcm"); - arrayfun(@(filename)dicomanon(filename,filename,"keep",fieldToKeep),dicomFiles); - arrayfun(@(filename)movefile(filename,obj.anonymiseFilename(filename)),dicomFiles); + try + dicomanon(filename,filename,"keep",fieldToKeep); + catch ME + obj.failedDicomAnonymisation{end+1,1} = ME; + obj.failedDicomAnonymisation{end,2} = filename; end end + end - function output = getAllFilesPathInFolder(obj,folder,filePattern) - filesPath = dir(fullfile(folder,filePattern)); - filesPath = fullfile(string({filesPath.folder}),string({filesPath.name})); - output = filesPath; - end - - + methods 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,''); % remove IPP - inputString = regexprep(inputString,'[A-Z]{2}',''); % remove initials - inputString = regexprep(inputString,'_','-'); - inputString = regexprep(inputString,'[-]{2,}','-'); % remove multiple '-' + inputString = regexprep(inputString,"[-_]" + obj.getIPP + "[-_][A-Z]{2}",''); % remove IPP with initials + inputString = regexprep(inputString,"[-_]" + obj.getIPP,''); % remove IPP output = inputString; end - function output = getIPP(obj) - output = extractAfter(obj.SCasePath,"-"); + [~,SCaseFolder,~] = fileparts(obj.SCasePath); + IPP = extractAfter(SCaseFolder,"-"); + output = IPP; end + function anonymiseAmiraFiles(obj) + arrayfun(@(filename)obj.anonymiseAmiraFile(filename),obj.amiraFiles); + end + end - function anonymiseAmiraFolders(obj) + + 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 + end + methods + 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 + + function anonymiseFolders(obj) + CTFolders = obj.getFilesInSubfolders("CT*"); + arrayfun(@(foldername)obj.renameFileOrFolder(foldername,obj.anonymiseFilename(foldername)),CTFolders); + obj.renameFileOrFolder(obj.SCasePath,obj.anonymiseFilename(obj.SCasePath)); + 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