diff --git a/muscles/degenerationAll3D.m b/muscles/degenerationAll3D.m index 2208dc3..3d5faf7 100644 --- a/muscles/degenerationAll3D.m +++ b/muscles/degenerationAll3D.m @@ -1,191 +1,192 @@ function muscles_results = degenerationAll3D(caseID, musclesList) %%DEGENERATIONALL3D returns a structure array containing muscle % measurements for each case ID entered as input and fills the Shoulder % database with muscle degeneration measurements % % This function fills the Shoulder database with the muscle degeneration % values of the case given as input, for all CT slices available. % The measurements are stored in a XLS file and in the MySQL database. % % USE: degenerationAll3D(caseID, musclesList) % % INPUT caseID: Case IDs for which you want to compute muscle degeneration. % Cell array that stores the case IDs as a char in the form 'P###' or % 'N###' (starts with "P" or "N" followed by 1 to 3 digits). % % musclesList: List of muscles which you want to compute muscle % degeneration. Cell array that stores each msucle name as a char. % % OUTPUT muscles_results: structure array containing fields 'Case_ID', % and structure array field "muscle name" with muscle % measurements for each slice for the current patient: 'Stot', % 'Satrophy', 'Sinfiltration', 'Sosteochondroma' and % 'Sdegeneration', 'atrophy', 'infiltration', 'osteochondroma' % and 'degeneration' % % REMARKS The muscle values (ratios) for all available CT slices are % saved in the muscles.xls file and in the shoulder MySQL % database. % % created with MATLAB ver.: 9.2.0.556344 (R2017a) on Windows 7 % Author: EPFL-LBO-VMC % Date: 29-kun-2017 % - CTDatabaseLocation = 'Z://data'; % Location of the CT database - XLSShoulderDatabaseLocation = 'C:/Users/vmalfroy/Dropbox/shoulderDatabase/'; % Location of the XLS ShoulderDatabase + CTDatabaseLocation = '../../../data'; % Location of the CT database +% XLSShoulderDatabaseLocation = 'C:/Users/vmalfroy/Dropbox/shoulderDatabase/'; % Location of the XLS ShoulderDatabase + XLSShoulderDatabaseLocation = '../../../data/Excel/'; % Location of the XLS ShoulderDatabase HUThresholdMuscle = 0; %#ok HUThresholdFat = 30; %#ok HUThresholdOsteochondroma = 166; %#ok % Check validity of input argument (cell array) validateattributes(caseID,{'cell'},{'nonempty'}); % Check that imput case IDs are unique [caseIDNames,~,uniqueCaseID] = unique(caseID); countOfCaseID = hist(uniqueCaseID,unique(uniqueCaseID))'; freqCaseIDs = struct('name',caseIDNames,'freq',num2cell(countOfCaseID)); repeatedValues = find([freqCaseIDs.freq] > 1); if(~isempty(repeatedValues)) warning('Input contains repeated Case ID: %s. Repeated occurences of that Case ID will be omitted. \n', freqCaseIDs(repeatedValues).name) caseID = caseIDNames'; end % open mySQL connection conn = openSQL(); % Get the list of exisiting cases in XLS database - [~,~,currDatabase] = xlsread([XLSShoulderDatabaseLocation 'Excel/xlsFromMatlab/muscles.xls']); + [~,~,currDatabase] = xlsread([XLSShoulderDatabaseLocation 'xlsFromMatlab/muscles.xls']); currDatabaseCaseIDlist = currDatabase(2:end,1); %Initialize structure array for results muscles_results = []; muscles_results = setfield(muscles_results,{length(caseID),1},'Case_ID',[]); % Compute muscle degeneration values and fill database for i = 1:length(caseID) % Check validity of input arguments (char and format 'P###' or 'N###') validateattributes(caseID{i},{'char'},{'nonempty'}); if (numel(regexp(caseID{i},'^[PN]\d{1,3}$')) == 0) error(['Invalid format of CaseID: ' caseID{i} '. CaseID must start with "P" or "N" and be followed by 1 to 3 digits.']); end % Find CT folder for the given Case ID levelDir1 = caseID{i}(1); if (length(caseID{i}(2:end)) < 2) levelDir2 = '0'; levelDir3 = '0'; elseif (length(caseID{i}(2:end)) < 3) levelDir2 = '0'; levelDir3 = caseID{i}(2); else levelDir2 = caseID{i}(2); levelDir3 = caseID{i}(3); end FindCaseCTFolder = dir([CTDatabaseLocation '/' levelDir1 '/' levelDir2 '/' levelDir3 '/' caseID{i} '*']); if (isempty(FindCaseCTFolder)) error(['Missing CT directory for CaseID: ' caseID{i}]); end CaseID_IPP = FindCaseCTFolder.name; CaseCTFolder = [CTDatabaseLocation '/' levelDir1 '/' levelDir2 '/' levelDir3 '/' CaseID_IPP]; % Compute musle degeneration values and store in the XLS database if exist([CaseCTFolder '/CT-' CaseID_IPP '-1/muscles'],'dir') == 7 %if a folder "muscles" exist, the patient name is added to the "measured" column muscleDirectory = [CaseCTFolder '/CT-' CaseID_IPP '-1/muscles']; slicesList = dir(muscleDirectory); slicesList = slicesList(3:end); muscles_results(i).Case_ID = caseID{i}; field2sort = 'SliceNumber'; %#ok for j=1:length(slicesList) for k=1:length(musclesList) disp(caseID{i}); % Compute muscle degeneration values eval([musclesList{k} '= muscleDegeneration3D(caseID{i}, musclesList{k},HUThresholdMuscle,HUThresholdFat,HUThresholdOsteochondroma,muscleDirectory);']); eval(['muscles_results = setfield(muscles_results,{i,1}, musclesList{k}, ' musclesList{k} ');']); % Sort muscle field by slice number eval(['[~,I] = sort(arrayfun (@(x) x.(field2sort), muscles_results(i,1).' musclesList{k} '));']); eval(['muscles_results(i,1).' musclesList{k} ' = muscles_results(i,1).' musclesList{k} '(I);']); end end muscles = cellstr(muscles_results(i).CT_id)'; for k = 1:length(musclesList) eval(['muscles = horzcat(muscles, transpose(struct2cell(muscles_results.' musclesList{k} ')));']); end % Write to XLS file % Replace line if already existing or append if(any(strcmp(currDatabaseCaseIDlist, caseID{i}))) - xlswrite([XLSShoulderDatabaseLocation 'Excel/xlsFromMatlab/muscles.xls'],muscles,'Feuil1',['A' int2str(find(strcmp(currDatabaseCaseIDlist, caseID{i}))+1)]); + xlswrite([XLSShoulderDatabaseLocation 'xlsFromMatlab/muscles.xls'],muscles,'Feuil1',['A' int2str(find(strcmp(currDatabaseCaseIDlist, caseID{i}))+1)]); else - xlswrite([XLSShoulderDatabaseLocation 'Excel/xlsFromMatlab/muscles.xls'],muscles,'Feuil1',['A' int2str(length(currDatabaseCaseIDlist)+1+i)]); + xlswrite([XLSShoulderDatabaseLocation 'xlsFromMatlab/muscles.xls'],muscles,'Feuil1',['A' int2str(length(currDatabaseCaseIDlist)+1+i)]); end % Write to MySQL database % Replace line if already existing or issue warning message sqlquery = ['SELECT CT_id FROM CT WHERE shoulder_id IN (SELECT shoulder_id FROM sCase WHERE folder_name = "' caseID{i} '")']; curs = exec(conn,sqlquery); if ~isempty(curs.Message) fprintf('\nMessage: %s\n', curs.Message); end curs=fetch(curs); sqlresult = curs.Data; if isnumeric(sqlresult{1}) SS_atrophy = sum([muscles_results(i).SS(:).Satrophy])/sum([muscles_results(i).SS(:).Stot]); SS_infiltration = sum([muscles_results(i).SS(:).Sinfiltration])/sum([muscles_results(i).SS(:).Stot]); SS_osteochondroma = sum([muscles_results(i).SS(:).Sosteochondroma])/sum([muscles_results(i).SS(:).Stot]); SS_degeneration = (sum([muscles_results(i).SS(:).Stot]) - sum([muscles_results(i).SS(:).Sdegeneration]))/sum([muscles_results(i).SS(:).Stot]); IS_atrophy = sum([muscles_results(i).IS(:).Satrophy])/sum([muscles_results(i).IS(:).Stot]); IS_infiltration = sum([muscles_results(i).IS(:).Sinfiltration])/sum([muscles_results(i).IS(:).Stot]); IS_osteochondroma = sum([muscles_results(i).IS(:).Sosteochondroma])/sum([muscles_results(i).IS(:).Stot]); IS_degeneration = (sum([muscles_results(i).IS(:).Stot]) - sum([muscles_results(i).IS(:).Sdegeneration]))/sum([muscles_results(i).IS(:).Stot]); SC_atrophy = sum([muscles_results(i).SC(:).Satrophy])/sum([muscles_results(i).SC(:).Stot]); SC_infiltration = sum([muscles_results(i).SC(:).Sinfiltration])/sum([muscles_results(i).SC(:).Stot]); SC_osteochondroma = sum([muscles_results(i).SC(:).Sosteochondroma])/sum([muscles_results(i).SC(:).Stot]); SC_degeneration = (sum([muscles_results(i).SC(:).Stot]) - sum([muscles_results(i).SC(:).Sdegeneration]))/sum([muscles_results(i).SC(:).Stot]); TM_atrophy = sum([muscles_results(i).TM(:).Satrophy])/sum([muscles_results(i).TM(:).Stot]); TM_infiltration = sum([muscles_results(i).TM(:).Sinfiltration])/sum([muscles_results(i).TM(:).Stot]); TM_osteochondroma = sum([muscles_results(i).TM(:).Sosteochondroma])/sum([muscles_results(i).TM(:).Stot]); TM_degeneration = (sum([muscles_results(i).TM(:).Stot]) - sum([muscles_results(i).TM(:).Sdegeneration]))/sum([muscles_results(i).TM(:).Stot]); % Update data in table 'muscle' data = {sqlresult{1} SS_atrophy SS_infiltration SS_osteochondroma SS_degeneration IS_atrophy IS_infiltration IS_osteochondroma IS_degeneration SC_atrophy SC_infiltration SC_osteochondroma SC_degeneration TM_atrophy TM_infiltration TM_osteochondroma TM_degeneration}; fieldNames = {'CT_id','SSA','SSI','SSO','SSD','ISA','ISI','ISO','ISD','SCA','SCI','SCO','SCD', 'TMA', 'TMI', 'TMO', 'TMD'}; upsert(conn, 'muscle', fieldNames, [1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], data); else error(['No entry for caseID ' caseID{i} ' was found in the ' conn.Instance ' MySQL database.']); end else error(['"muscles" folder missing for CaseID: ' caseID{i}]); end end end