Commit d5637ab0 authored by jayd1860's avatar jayd1860
Browse files

v1.18.6

-- Modify algorithm to speed up MemoryRequired calculation to use current element instead of current group to take into account that the individual elements can be processed separately.
parent ff12f1d5
Loading
Loading
Loading
Loading
+32 −1
Original line number Diff line number Diff line
@@ -322,10 +322,36 @@ classdef DataTreeClass < handle
            if isempty(obj)
                return;
            end
            nbytes = length(obj.groups) * obj.groups(1).MemoryRequired(option);
            nbytes = length(obj.groups) * obj.currElem.MemoryRequired(option);
        end
        
        
        % ----------------------------------------------------------------------------------
        function diskspaceToSpare = CheckAvailableDiskSpace(obj, hwait)
            if ishandle(hwait)
                obj.logger.Write(sprintf('Estimating disk space required to save processing results ...\n'), obj.logger.ProgressBar(), hwait);
            end
            memRequired = obj.currElem.MemoryRequired('disk');
            diskspaceToSpare = (getFreeDiskSpace() - memRequired);   % Disk space to spare in megabytes
            diskspacePercentRemaining = 100 * diskspaceToSpare/memRequired;
            msg = {};
            obj.logger.Write(sprintf('CheckAvailableDiskSpace:    disk space available = %0.1f MB,    required disk space estimate = %0.1f MB\n', getFreeDiskSpace()/1e6, memRequired/1e6));
            if diskspaceToSpare < 0
                msg{1} = sprintf('ERROR: Cannot save processing results requiring ~%0.1f MB of disk space on current drive with only %0.1f MB of free space available.\n', ...
                                  memRequired/1e6, getFreeDiskSpace()/1e6);
            elseif diskspacePercentRemaining < 200
                msg{1} = sprintf('WARNING: Available disk space on the current drive is low (%0.1f MB). This may cause problems saving processing results in the future.', ...
                                  getFreeDiskSpace()/1e6);
                msg{2} = sprintf('Consider moving your data set to a drive with more free space\n');
            end            
            if ~isempty(msg)
                MessageBox([msg{:}]);
                obj.logger.Write([msg{:}]);
            end            
        end
        
        
            
        % ----------------------------------------------------------
        function Save(obj, hwait)
            if ~exist('hwait','var')
@@ -335,6 +361,11 @@ classdef DataTreeClass < handle
            t_local = tic;
            for ii = 1:length(obj.groups)
                obj.logger.Write(sprintf('Saving group %d in %s\n', ii, [obj.groups(ii).pathOutput, 'groupResults.mat']));
                
                % Check that there is anough disk space
                if obj.CheckAvailableDiskSpace(hwait) < 0
                    continue;
                end
                obj.groups(ii).Save(hwait);
            end
            obj.logger.Write(sprintf('Completed saving groupResults.mat for all groups in %0.3f seconds.\n', toc(t_local)));
+15 −40
Original line number Diff line number Diff line
@@ -268,10 +268,23 @@ classdef GroupClass < TreeNodeClass
            if isempty(obj)
                return;
            end
            
            nbytes = obj.procStream.MemoryRequired() + length(obj.subjs) * obj.subjs(1).MemoryRequired(option);
        end


        % ----------------------------------------------------------------------------------        
        function nbytes = MemoryRequiredExact(obj, option)
            if ~exist('option','var')
                option = 'disk';
            end
            nbytes = obj.procStream.MemoryRequired();
            for ii = 1:length(obj.subjs)
                nbytes = nbytes + obj.subjs(ii).MemoryRequiredExact(option);
            end
        end

        
        % ----------------------------------------------------------------------------------
        function SetPath(obj, dirname)
            obj.path = dirname;
@@ -594,30 +607,6 @@ classdef GroupClass < TreeNodeClass
        end
        
        
        % ----------------------------------------------------------------------------------
        function [diskspaceToSpare, diskspacePercentRemaining] = CheckAvailableDiskSpace(obj, hwait)
            if ishandle(hwait)
                obj.logger.Write(sprintf('Estimating disk space required to save processing results ...\n'), obj.logger.ProgressBar(), hwait);
            end
            diskspaceToSpare = (getFreeDiskSpace() - obj.MemoryRequired('disk'));   % Disk space to spare in megabytes
            diskspacePercentRemaining = 100 * diskspaceToSpare/obj.MemoryRequired('disk');
            msg = {};
            obj.logger.Write(sprintf('CheckAvailableDiskSpace:    disk space available = %0.1f MB,    disk space required estimate = %0.1f MB\n', getFreeDiskSpace()/1e6, obj.MemoryRequired('disk')/1e6));
            if diskspaceToSpare < 0
                msg{1} = sprintf('ERROR: Cannot save processing results requiring ~%0.1f MB of disk space on current drive with only %0.1f MB of free space available.\n', ...
                                  obj.MemoryRequired('disk')/1e6, getFreeDiskSpace()/1e6);
            elseif diskspacePercentRemaining < 200
                msg{1} = sprintf('WARNING: Available disk space on the current drive is low (%0.1f MB). This may cause problems saving processing results in the future.', ...
                                  getFreeDiskSpace()/1e6);
                msg{2} = sprintf('Consider moving your data set to a drive with more free space\n');
            end            
            if ~isempty(msg)
                MessageBox([msg{:}]);
                obj.logger.Write([msg{:}]);
            end
        end
        
        
     
        % ----------------------------------------------------------------------------------
        function Save(obj, hwait)
@@ -627,20 +616,6 @@ classdef GroupClass < TreeNodeClass
            
            obj.logger.Write(sprintf('Saving processed data in %s\n', [obj.path, 'groupResults.mat']));
            
            % Check that there is anough disk space 
            while CheckAvailableDiskSpace(obj, hwait) < 0
                q = MenuBox('Do you want to save processing results on a different drive?', {'Yes','No'});
                if q==1
                    pname = uigetdir(topLevelDir(), 'Please select alternate folder');
                    if pname == 0
                        return;
                    end
                    obj.pathOutput = pname;
                else
                    return
                end
            end
            
            if ishandle(hwait)
                obj.logger.Write(sprintf('Auto-saving processing results ...\n'), obj.logger.ProgressBar(), hwait);
            end
+12 −0
Original line number Diff line number Diff line
@@ -423,6 +423,18 @@ classdef SubjClass < TreeNodeClass
        end

        
        % ----------------------------------------------------------------------------------        
        function nbytes = MemoryRequiredExact(obj, option)
            if ~exist('option','var')
                option = 'disk';
            end
            nbytes = obj.procStream.MemoryRequired();
            for ii = 1:length(obj.runs)
                nbytes = nbytes + obj.runs(ii).MemoryRequired(option);
            end
        end

        
        % ----------------------------------------------------------------------------------
        function tblcells = GenerateTableCells_MeanHRF(obj, trange, width, iBlk)
            if ~exist('trange','var') || isempty(trange)
+1 −1
Original line number Diff line number Diff line
@@ -2,5 +2,5 @@ function vrnnum = getVernum()

vrnnum{1} = '1';   % Major version #
vrnnum{2} = '18';  % Major sub-version #
vrnnum{3} = '5';   % Minor version #
vrnnum{3} = '6';   % Minor version #
vrnnum{4} = '0';   % Minor sub-version # or patch #: 'p1', 'p2', etc