Commit 09702016 authored by Jay Dubb's avatar Jay Dubb
Browse files

v1.28.0

-- Step 1 of allowing child GUIs to disable synchronized browsing through the data tree with MainGUI and providing option in the child GUIs to toggle enable/disable of synchronized browsing. This change implements array of current elements in DataTreeClass as a first step.
-- Also remove confusing Reset Group Folder menu option from MainGUI File menu and rename Rest Current Element to Reset Processing Results and also auto save the reset to groupResults on disk (the feedback from David is that this option isn't useful otherwise).
parent 6a56fe91
Loading
Loading
Loading
Loading
+68 −30
Original line number Diff line number Diff line
@@ -20,12 +20,14 @@ classdef DataTreeClass < handle
            global logger
            
            obj.groups              = GroupClass().empty();
            obj.currElem            = TreeNodeClass().empty();
            obj.reg                 = RegistriesClass().empty();
            obj.config              = ConfigFileClass().empty();
            obj.dirnameGroups       = {};
            obj.logger              = InitLogger(logger, 'DataTree');
            
            obj.currElem            = TreeNodeClass().empty();
            for ii = 1:length(10)
                obj.currElem(ii) = TreeNodeClass();
            end
            
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            % Parse args
@@ -104,8 +106,11 @@ classdef DataTreeClass < handle
        
        
        % --------------------------------------------------------------
        function Copy(obj, obj2)
            idx = obj2.currElem.GetIndexID();
        function Copy(obj, obj2, iC)
            if ~exist('iC','var') || isempty(iC)
                iC = 1;
            end
            idx = obj2.currElem(iC).GetIndexID();
            iG = idx(1);
            iS = idx(2);
            iR = idx(3);
@@ -114,14 +119,17 @@ classdef DataTreeClass < handle
            else
                obj.groups(iG).Copy(obj.groups(iG))
            end
            obj.SetCurrElem(iG, iS, iR);
            obj.SetCurrElem(iG, iS, iR, iC);
            obj.groups(iG).SetConditions();
        end
        
        
        % --------------------------------------------------------------
        function CopyStims(obj, obj2)
            idx = obj2.currElem.GetIndexID();
        function CopyStims(obj, obj2, iC)
            if ~exist('iC','var') || isempty(iC)
                iC = 1;
            end
            idx = obj2.currElem(iC).GetIndexID();
            iG = idx(1);
            obj.groups(iG).CopyStims(obj2.groups(iG));
        end
@@ -436,16 +444,17 @@ classdef DataTreeClass < handle
            if isempty(obj.groups)
                return;
            end
            err = obj.currElem.Load();
            err = obj.currElem(1).Load();
        end


        % ----------------------------------------------------------
        function SetCurrElem(obj, iGroup, iSubj, iRun)
        function iC = SetCurrElem(obj, iGroup, iSubj, iRun, new)
            
            %%%% Parse arguments
            if isempty(obj.groups)
                return;
            end
            
            if nargin==1
                iGroup = 0;
                iSubj = 0;
@@ -456,36 +465,59 @@ classdef DataTreeClass < handle
            elseif nargin==3
                iRun  = 0;                
            end
            if ~exist('new','var')
                new = '';
            end
                        
            if obj.currElem.IsSame(iGroup, iSubj, iRun)
            % We can have multiple current elements simultaneously. 
            % Decide which current element we are setting 
            iC = 1;            
            if isnumeric(new)                
                iC = new;
            elseif strcmp(new, 'new')
                for ii = 1:length(obj.currElem)
                    if ~obj.busy
                        break;
                    end
                end
                iC = ii;
            end
                        
            if obj.currElem(iC).IsSame(iGroup, iSubj, iRun)
                return;
            end
            
            % Free up memory of current element before reassigning it to
            % another node.
            obj.currElem.FreeMemory();
            obj.currElem(iC).FreeMemory();
            
            if iSubj==0 && iRun==0
                obj.currElem = obj.groups(iGroup);
                obj.currElem(iC) = obj.groups(iGroup);
            elseif iSubj>0 && iRun==0
                obj.currElem = obj.groups(iGroup).subjs(iSubj);
                obj.currElem(iC) = obj.groups(iGroup).subjs(iSubj);
            elseif iSubj>0 && iRun>0
                obj.currElem = obj.groups(iGroup).subjs(iSubj).runs(iRun);
                obj.currElem(iC) = obj.groups(iGroup).subjs(iSubj).runs(iRun);
            end
        end


        % ----------------------------------------------------------
        function procElem = GetCurrElem(obj)
            procElem = obj.currElem;
        function procElem = GetCurrElem(obj, iC)
            if ~exist('iC','var') || isempty(iC)
                iC = 1;
            end
            procElem = obj.currElem(iC);
        end


        % ----------------------------------------------------------
        function [iGroup, iSubj, iRun] = GetCurrElemIndexID(obj)
            iGroup = obj.currElem.iGroup;
            iSubj = obj.currElem.iSubj;
            iRun = obj.currElem.iRun;
        function [iGroup, iSubj, iRun] = GetCurrElemIndexID(obj, iC)
            if ~exist('iC','var') || isempty(iC)
                iC = 1;
            end
            iGroup = obj.currElem(iC).iGroup;
            iSubj = obj.currElem(iC).iSubj;
            iRun = obj.currElem(iC).iRun;
        end


@@ -533,15 +565,21 @@ classdef DataTreeClass < handle


        % ----------------------------------------------------------
        function CalcCurrElem(obj)
            obj.currElem.Calc();
        function CalcCurrElem(obj, iC)
            if ~exist('iC','var') || isempty(iC)
                iC = 1;
            end
            obj.currElem(iC).Calc();
        end

        
        % ----------------------------------------------------------
        function ResetCurrElem(obj)
            obj.currElem.Reset();
            idx = obj.currElem.GetIndexID();
        function ResetCurrElem(obj, iC)
            if ~exist('iC','var') || isempty(iC)
                iC = 1;
            end
            obj.currElem(iC).Reset();
            idx = obj.currElem(iC).GetIndexID();
            if isa(obj.currElem, 'SubjClass')
                obj.groups(idx(1)).Reset('up')
            elseif isa(obj.currElem, 'RunClass')
+16 −18
Original line number Diff line number Diff line
classdef TreeNodeClass < handle
classdef TreeNodeClass < handle & matlab.mixin.Heterogeneous
    
    properties % (Access = private)        
        name;
@@ -13,15 +13,15 @@ classdef TreeNodeClass < handle
        updateParentGui;
    end
     
    properties
    properties (Access = public)
        outputVars
        DEBUG
        path
        busy
    end

    methods       
        
        
        % ---------------------------------------------------------------------------------
        function obj = TreeNodeClass(arg)
            obj.DEBUG = 0;
@@ -35,6 +35,7 @@ classdef TreeNodeClass < handle
            obj.err = 0;
            obj.CondNames = {};
            obj.path = filesepStandard(pwd);
            obj.busy = 0;
            
            
            obj.InitParentAppFunc();
@@ -114,24 +115,15 @@ classdef TreeNodeClass < handle
        function objnew = copy(obj)
            switch(class(obj))
                case 'RunClass'
                    objnew = RunClass('copy');
                    objnew = RunClass(obj);
                case 'SubjClass'
                    objnew = SubjClass('copy');
                    objnew = SubjClass(obj);
                case 'GroupClass'
                    objnew = GroupClass('copy');
                case ''
                    objnew = GroupClass(obj');
            end
            objnew.name = obj.name;
            objnew.type = obj.type;
            objnew.err = obj.err;
            objnew.CondNames = obj.CondNames;
            objnew.procStream.Copy(obj.procStream, obj.GetFilename);
        end
        
               
        % ----------------------------------------------------------------------------------
        % Copy processing params (procInut and procResult) from
        % obj2 to obj
        % ----------------------------------------------------------------------------------
        function Copy(obj, obj2, conditional)
            if ~isempty(obj2.procStream)
@@ -625,11 +617,18 @@ classdef TreeNodeClass < handle
        end
        
        
        % ----------------------------------------------------------------------------------
        function FreeMemorySubBranch(obj)
            
        end

        
        % ----------------------------------------------------------------------------------
        function FreeMemory(obj)
            if isempty(obj)
                return
            end
            obj.busy = 0;
            obj.FreeMemorySubBranch();
            obj.procStream.FreeMemory(obj.GetFilename);
        end
@@ -659,7 +658,6 @@ classdef TreeNodeClass < handle
            filename = obj.SaveMemorySpace(obj.name);
        end
        
                        
    end

    
+4 −4
Original line number Diff line number Diff line
@@ -52,8 +52,8 @@ iCh = maingui.axesSDG.iCh;
iSrcDet     = maingui.axesSDG.iSrcDet;
color       = maingui.axesSDG.linecolor;

SD          = maingui.dataTree.currElem.GetSDG();
bbox        = maingui.dataTree.currElem.GetSdgBbox();
SD          = maingui.dataTree.currElem(1).GetSDG();
bbox        = maingui.dataTree.currElem(1).GetSdgBbox();

% Set axes handle properties and parameters 
if ~ishandles(hAxes)
@@ -83,13 +83,13 @@ nSrcs = size(SD.SrcPos,1);
nDets       = size(SD.DetPos,1);

% get mlActAuto from procResult if it exists and replace ch.MeasListActMan 
nDataBlks = maingui.dataTree.currElem.GetDataBlocksNum();
nDataBlks = maingui.dataTree.currElem(1).GetDataBlocksNum();
MeasList = [];
MeasListActMan = [];
MeasListActAuto = [];
MeasListVis = [];
for iBlk = 1:nDataBlks   
    ch              = maingui.dataTree.currElem.GetMeasList(iBlk);
    ch              = maingui.dataTree.currElem(1).GetMeasList(iBlk);
    MeasList        = [MeasList; ch.MeasList];
    MeasListActMan  = [MeasListActMan; ch.MeasListActMan];
    MeasListActAuto = [MeasListActAuto; ch.MeasListActAuto];
+5 −5
Original line number Diff line number Diff line
@@ -21,15 +21,15 @@ axes(hAxes);
hold on

iCh       = maingui.axesSDG.iCh;
iDataBlks = maingui.dataTree.currElem.GetDataBlocksIdxs(iCh);
iDataBlks = maingui.dataTree.currElem(1).GetDataBlocksIdxs(iCh);
tPtsExclTot = [];
for iBlk = iDataBlks
    if strcmp(mode,'manual')
        tInc = maingui.dataTree.currElem.GetTincMan(iBlk);
        tInc = maingui.dataTree.currElem(1).GetTincMan(iBlk);
    elseif strcmp(mode,'auto')
        tInc = maingui.dataTree.currElem.GetTincAuto(iBlk);
        tInc = maingui.dataTree.currElem(1).GetTincAuto(iBlk);
    elseif strcmp(mode,'autoch')
        tInc = maingui.dataTree.currElem.GetTincAutoCh(iBlk);        
        tInc = maingui.dataTree.currElem(1).GetTincAutoCh(iBlk);        
    else
        continue
    end
@@ -47,7 +47,7 @@ for iBlk = iDataBlks
            break
        end
        col = setColor(mode, ii);
        t = maingui.dataTree.currElem.GetTime(iBlk);
        t = maingui.dataTree.currElem(1).GetTime(iBlk);
        [h, tPtsExclTot] = drawPatches(t, tInc(:, kk), tPtsExclTot, col, handles);        
        if strcmp(mode,'manual')
            for jj=1:length(h)
+6 −6
Original line number Diff line number Diff line
@@ -4,17 +4,17 @@ if isempty(handles)
    return
end

if ~isempty(maingui.dataTree.currElem.GetRawData())   
if ~isempty(maingui.dataTree.currElem(1).GetRawData())   
    set(handles.radiobuttonPlotRaw, 'enable','on')
else
    set(handles.radiobuttonPlotRaw, 'enable','off')
end
if ~isempty(maingui.dataTree.currElem.GetDod())
if ~isempty(maingui.dataTree.currElem(1).GetDod())
    set(handles.radiobuttonPlotOD, 'enable','on')
else
    set(handles.radiobuttonPlotOD, 'enable','off')
end
if ~isempty(maingui.dataTree.currElem.GetDc())
if ~isempty(maingui.dataTree.currElem(1).GetDc())
    set(handles.radiobuttonPlotConc, 'enable','on')
else
    set(handles.radiobuttonPlotConc, 'enable','off')
@@ -41,13 +41,13 @@ end

iCondGrp = get(handles.popupmenuConditions, 'value'); 
CondName = maingui.dataTree.groups(1).CondNames{iCondGrp};
if ~isempty(maingui.dataTree.currElem.GetDodAvg(CondName)) || ~isempty(maingui.dataTree.currElem.GetDcAvg(CondName))
if ~isempty(maingui.dataTree.currElem(1).GetDodAvg(CondName)) || ~isempty(maingui.dataTree.currElem(1).GetDcAvg(CondName))
    set(handles.checkboxPlotHRF, 'enable','on');
    if ~isa(maingui.dataTree.currElem, 'RunClass')
        set(handles.checkboxPlotHRF, 'value',1);
        if ~isempty(maingui.dataTree.currElem.GetDcAvg())
        if ~isempty(maingui.dataTree.currElem(1).GetDcAvg())
            set(handles.radiobuttonPlotConc, 'value',1);
        elseif ~isempty(maingui.dataTree.currElem.GetDodAvg())
        elseif ~isempty(maingui.dataTree.currElem(1).GetDodAvg())
            set(handles.radiobuttonPlotOD, 'value',1);
        end
    end
Loading