Unverified Commit ad471a6d authored by stephen scott tucker's avatar stephen scott tucker Committed by GitHub
Browse files

1.25.6: feature exclude: changes for to time point exclusion interface,...

1.25.6: feature exclude: changes for to time point exclusion interface, implementation of channel exclusion and visibility interfaces as in Homer2 (#21)

* tIncMan interface changes, mlActMan and mlVis interface ports

* tInc man, auto, interface changes, manual exclude reset button

* Reversion of a stim change
parent 4c43ac1e
Loading
Loading
Loading
Loading
+56 −5
Original line number Diff line number Diff line
@@ -4,8 +4,9 @@ classdef ProcInputClass < handle
    % of acquisition data or is derived from acquisition data but not stored there. 
    %
    properties
        tIncMan;                 % Manually include/excluded time points
        mlActMan;                % Manually include/excluded time points
        tIncMan;                 % Manually included/excluded time points
        mlActMan;                % Manually included/excluded channels
        mlVis;                   % Channels which are visible or invisible in axesData
        acquired;                % Modifiable acquisition parameters initally copied from acquisition files
        stimValSettings;         % Derived stim values 
        misc;
@@ -21,6 +22,7 @@ classdef ProcInputClass < handle
            end
            obj.tIncMan = {};
            obj.mlActMan = {};
            obj.mlVis = {};
            obj.misc = [];
            obj.stimValSettings = struct('none',0, 'incl',1, 'excl_manual',-1, 'excl_auto',-2);
            if nargin==0
@@ -44,7 +46,12 @@ classdef ProcInputClass < handle
            if ~isempty(obj2.tIncMan)
                obj.tIncMan = obj2.tIncMan;
            end
            
            if ~isempty(obj2.mlActMan)
                obj.mlActMan = obj2.mlActMan;
            end
            if ~isempty(obj2.mlVis)
                obj.mlVis = obj2.mlVis;
            end
            fields = properties(obj.misc);
            for ii=1:length(fields)
                if ~eval(sprintf('isproperty(obj2.misc, ''%s'')', fields{ii}))
@@ -181,10 +188,54 @@ classdef ProcInputClass < handle
       
        
        % ----------------------------------------------------------------------------------
        function mlActMan = GetMeasListActMan(obj, iBlk)
            mlActMan = {};            
        function ml = GetMeasListActMan(obj, iBlk)
        if ~exist('iBlk','var')
            iBlk = 1;
        end
        if ~isempty(obj.mlActMan)
            ml = obj.mlActMan{iBlk};
        else
            ml = []; 
        end
        end

        
        % ----------------------------------------------------------------------------------
        function SetMeasListActMan(obj, ml, iBlk)
            if ~exist('iBlk','var')
                iBlk = 1;
            end
            if isempty(obj.mlActMan)
                obj.mlActMan{iBlk} = ml;
            elseif length(obj.mlActMan{iBlk}) == length(ml)
               obj.mlActMan{iBlk} = ml; 
            end
        end

        % ----------------------------------------------------------------------------------
        function ml = GetMeasListVis(obj, iBlk)
        if ~exist('iBlk','var')
            iBlk = 1;
        end
        if ~isempty(obj.mlVis)
            ml = obj.mlVis{iBlk};
        else
            ml = []; 
        end
        end
        
        
        % ----------------------------------------------------------------------------------
        function SetMeasListVis(obj, ml, iBlk)
            if ~exist('iBlk','var')
                iBlk = 1;
            end
            if isempty(obj.mlVis)
                obj.mlVis{iBlk} = ml;
            elseif length(obj.mlVis{iBlk}) == length(ml)
               obj.mlVis{iBlk} = ml; 
            end
        end
        
        % ----------------------------------------------------------------------------------
        function n = GetDataBlocksNum(obj)
+755 −735
Original line number Diff line number Diff line
@@ -378,26 +378,46 @@ classdef RunClass < TreeNodeClass
        
        
        
        % ----------------------------------------------------------------------------------
        function InitMlActMan(obj, iBlk)
            if ~exist('iBlk','var')
                iBlk = 1;
            end
            ch = obj.acquired.GetMeasList(iBlk);
            obj.procStream.input.SetMeasListActMan(ones(size(ch, 1), 1));
        end
        
        % ----------------------------------------------------------------------------------
        function InitMlVis(obj, iBlk)
            if ~exist('iBlk','var')
                iBlk = 1;
            end
            ch = obj.acquired.GetMeasList(iBlk);
            obj.procStream.input.SetMeasListVis(ones(size(ch, 1), 1));
        end
            
        % ----------------------------------------------------------------------------------
        function ch = GetMeasList(obj, iBlk)
            if ~exist('iBlk','var') || isempty(iBlk)
                iBlk=1;
            end
            ch                    = InitMeasLists();
            
            ch = struct('MeasList',[], 'MeasListVis',[], 'MeasListActMan',[], 'MeasListActAuto',[]);
            
            ch.MeasList        = obj.acquired.GetMeasList(iBlk);
            ch.MeasListActMan  = obj.procStream.GetMeasListActMan(iBlk);
            ch.MeasListActAuto = obj.procStream.GetMeasListActAuto(iBlk);
            ch.MeasListVis     = obj.procStream.GetMeasListVis(iBlk);
            
            if isempty(ch.MeasListActMan)
                ch.MeasListActMan  = ones(size(ch.MeasList,1),1);
                obj.InitMlActMan();  % TODO find a more sensical place to do this
                ch.MeasListActMan  = obj.procStream.GetMeasListActMan(iBlk);
            end
            if isempty(ch.MeasListActAuto)
                ch.MeasListActAuto = ones(size(ch.MeasList,1),1);
            end
            if isempty(ch.MeasListVis)
                ch.MeasListVis = ones(size(ch.MeasList,1),1);
                obj.InitMlVis();
                ch.MeasListVis = obj.procStream.GetMeasListVis(iBlk);
            end
            ch.MeasListAct     = bitand(ch.MeasListActMan, ch.MeasListActMan);
        end
+39 −16
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ global maingui

tic;

% This function plots the prove geometry
% This function plots the probe geometry
% Command line call:
% plotAxes_SDG(guidata(gcbo),bool);
%
@@ -59,9 +59,12 @@ bbox = maingui.dataTree.currElem.GetSdgBbox();
if ~ishandles(hAxes)
    return;
end
% Set gca to be SDG axes
axes(hAxes);
% Delete all channel lines drawn
if ishandles(maingui.axesSDG.handles.ch)
    delete(maingui.axesSDG.handles.ch)
    delete(findobj(hAxes, 'Type', 'line'))  % Prevents previously drawn lines from piling up
end
axis(hAxes, [bbox(1), bbox(2), bbox(3), bbox(4)]);
%set(hAxes, 'xticklabel','', 'yticklabel','', 'xgrid','off, ygrid','off')
@@ -80,7 +83,6 @@ nSrcs = size(SD.SrcPos,1);
nDets       = size(SD.DetPos,1);

% get mlActAuto from procResult if it exists and replace ch.MeasListActMan 
% [iDataBlks, iCh] = maingui.dataTree.currElem.GetDataBlocksIdxs(iCh);
nDataBlks = maingui.dataTree.currElem.GetDataBlocksNum();
MeasList = [];
MeasListActMan = [];
@@ -95,10 +97,10 @@ for iBlk = 1:nDataBlks
end
ml    = MeasList(MeasList(:,1)>0,:);
lstML = find(ml(:,4)==1); %cw6info.displayLambda);
lwidth = 3;
lstIncl = find(MeasListActMan(1:length(lstML))==1);
lstExclMan = find(MeasListActMan(1:length(lstML))==0);
lstExclAuto = find(MeasListActAuto(1:length(lstML))==0);
lstInvisible = find(MeasListVis(1:length(lstML))==0);
hCh = zeros(length(lstML),1);

% Draw all channels
@@ -107,14 +109,22 @@ for ii = 1:length(lstML)
    if     ismember(ii, lstIncl)
        % Draw included channel
        col = [1.00 1.00 1.00] * 0.85;
        lstyle = '-';
    elseif ismember(ii, lstExclMan)
        % Draw manually excluded channel
        col = [1.00 0.85 0.85] * 1.00;
        col = [1.00 1.00 1.00] * 0.85;
        lstyle = '--';
    elseif ismember(ii,lstExclAuto)
        % Draw auto-excluded channel
        col = [1.00 1.00 0.85] * 1.00;
        col = [1.00 1.00 1.00] * 0.85;
        lstyle = ':';
    end
    if ismember(ii, lstInvisible)
        lwidth = 1; 
    else
        lwidth = 3;
    end
    set(hCh(ii), 'color',col, 'linewidth',lwidth, 'ButtonDownFcn',bttndownfcn);
    set(hCh(ii), 'color', col, 'linewidth', lwidth, 'ButtonDownFcn', bttndownfcn, 'linestyle', lstyle);
end

% Draw the user-selected channels
@@ -127,22 +137,35 @@ if ~isempty(iSrcDet) && iSrcDet(1,1)~=0
    iCh2 = lst2;
    
    for idx = 1:size(iSrcDet,1)
        lwidth = 3;
        hCh(idx+ii) = line2(SD.SrcPos(iSrcDet(idx,1),:), SD.DetPos(iSrcDet(idx,2),:), [], gridsize);
        % Attach toggle callback to the selected channels for function on
        % second click
        set(hCh(idx+ii),'color',color(idx,:), 'ButtonDownFcn',sprintf('toggleLinesAxesSDG_ButtonDownFcn(gcbo,[%d],guidata(gcbo))',idx), 'linewidth',2);
        if ~isempty(iCh) && (~MeasListActMan(iCh2(idx)) & ~MeasListVis(iCh2(idx)))
            set(hCh(idx+ii),'linewidth',2, 'linestyle','-.');
        
        if ~isempty(iCh)
           
            if ~MeasListActMan(iCh2(idx))
                lstyle = '--'; 
            else
            if ~isempty(iCh) && ~MeasListActMan(iCh2(idx))
                set(hCh(idx+ii),'linewidth',2, 'linestyle','--');
                lstyle = '-';
            end
            if ~isempty(iCh) && ~MeasListVis(iCh2(idx))
                set(hCh(idx+ii),'linewidth',1, 'linestyle',':');
       
            if ~MeasListVis(iCh2(idx))
                lwidth = 1;
            else
                lwidth = 3;
            end
            
        end
        
        set(hCh(idx+ii),'linewidth', lwidth, 'linestyle', lstyle);
        
    end
    
end
maingui.axesSDG.handles.ch = hCh(hCh>0);

maingui.axesSDG.handles.ch = hCh;

% ADD SOURCE AND DETECTOR LABELS
hSD = zeros(nSrcs+nDets,1);
+6.19 KiB (86.1 KiB)

File changed.

No diff preview for this file type.

+1724 −1655
Original line number Diff line number Diff line
@@ -90,18 +90,16 @@ uipanelProcessingType_SelectionChangeFcn([]);
% ---------------------------------------------------------------------
function MainGUI_EnableDisableGUI(handles, val)

% Processing element panel
set(handles.listboxGroupTree, 'enable', val);
set(handles.listboxFilesErr, 'enable', val);
set(handles.radiobuttonProcTypeGroup, 'enable', val);
set(handles.radiobuttonProcTypeSubj, 'enable', val);
set(handles.radiobuttonProcTypeRun, 'enable', val);
set(handles.radiobuttonPlotRaw, 'enable', val);
set(handles.radiobuttonPlotOD,  'enable', val);
set(handles.radiobuttonPlotConc, 'enable', val);
set(handles.checkboxPlotHRF, 'enable', val);
set(handles.textStatus, 'enable', val);
set(handles.listboxPlotConc, 'enable', val);

% Plot window panel
set(handles.textPanLeftRight, 'enable', val);
set(handles.pushbuttonPanLeft, 'enable', val);
set(handles.pushbuttonPanRight, 'enable', val);
set(handles.pushbuttonPanLeft, 'enable', val);
@@ -112,11 +110,22 @@ set(handles.editFixRangeX, 'enable', val);
set(handles.checkboxFixRangeY, 'enable', val);
set(handles.editFixRangeY, 'enable', val);

% Plot type selected panel
set(handles.listboxPlotConc, 'enable', val);
set(handles.radiobuttonPlotRaw, 'enable', val);
set(handles.radiobuttonPlotOD,  'enable', val);
set(handles.radiobuttonPlotConc, 'enable', val);
set(handles.popupmenuAux, 'enable', val);
set(handles.checkboxPlotAux, 'enable', val);
set(handles.popupmenuConditions, 'enable', val);
set(handles.checkboxPlotHRF, 'enable', val);

% Motion artifact panel
set(handles.checkboxShowExcludedTimeManual, 'enable', val);
set(handles.checkboxShowExcludedTimeAuto, 'enable', val);
set(handles.checkboxShowExcludedTimeAutoByChannel, 'enable', val);
set(handles.checkboxExcludeTime, 'enable', val);
set(handles.pushbuttonResetExcludedTimeCh, 'enable', val);

% Control
set(handles.pushbuttonCalcProcStream, 'enable', val);
@@ -133,7 +142,29 @@ set(handles.menuItemResetGroupFolder, 'enable', val)



% ---------------------------------------------------------------------
function MainGUI_EnableDisablePlotEditMode(handles, val)

% Processing element panel
set(handles.listboxGroupTree, 'enable', val);
set(handles.listboxFilesErr, 'enable', val);
set(handles.radiobuttonProcTypeGroup, 'enable', val);
set(handles.radiobuttonProcTypeSubj, 'enable', val);
set(handles.radiobuttonProcTypeRun, 'enable', val);
set(handles.textStatus, 'enable', val);

% Control
set(handles.pushbuttonCalcProcStream, 'enable', val);
set(handles.pushbuttonProcStreamOptionsGUI, 'enable', val);
set(handles.checkboxApplyProcStreamEditToAll, 'enable', val);

% Menu
set(handles.ToolsMenu, 'enable', val);
set(handles.ViewMenu, 'enable', val);
set(handles.menuItemSaveGroup, 'enable', val);
set(handles.menuItemExport, 'enable', val);
set(handles.menuItemReset, 'enable', val);
set(handles.menuItemResetGroupFolder, 'enable', val)

% --------------------------------------------------------------------
function eventdata = MainGUI_OpeningFcn(hObject, eventdata, handles, varargin)
@@ -708,7 +739,6 @@ LaunchChildGuiFromMenu('ProcStreamEditGUI', hObject);




% --------------------------------------------------------------------
function menuItemDisplayPvalues_Callback(hObject, eventdata, handles)
LaunchChildGuiFromMenu('PvaluesDisplayGUI', hObject);
@@ -1453,12 +1483,20 @@ global maingui

hAxesData = maingui.axesData.handles.axes;

if get(hObject, 'value')==1
if isempty(maingui.axesSDG.iCh)  % Don't let user exclude if axesData isn't plotting anything
    errordlg('Select a channel before manually excluding time points.', 'No channels selected');
    set(hObject, 'value', 0);
    return; 
end

if get(hObject, 'value') == 1 % If in exclude time mode
    zoom off
    set(hAxesData,'ButtonDownFcn', 'MainGUI(''ExcludeTime_ButtonDownFcn'',gcbo,[],guidata(gcbo))');
    set(get(hAxesData,'children'), 'ButtonDownFcn', 'MainGUI(''ExcludeTime_ButtonDownFcn'',gcbo,[],guidata(gcbo))');
    MainGUI_EnableDisablePlotEditMode(handles, 'off');
else
    zoom on
    MainGUI_EnableDisablePlotEditMode(handles, 'on');
end
Display(handles, hObject);

@@ -1531,6 +1569,13 @@ Display(handles, hObject);



% --------------------------------------------------------------------
function ExcludeCh_ButtonDownFcn(hObject, eventdata, handles)
global maingui
disp('Exclude button down fcn');



% --------------------------------------------------------------------
function menuItemExportHRF_Callback(hObject, eventdata, handles)
global maingui
@@ -1653,3 +1698,27 @@ set(handles.MainGUI, 'units','characters', 'position',p);
set(handles.MainGUI, 'units',u0);



% -------------------------------------------------------------------------------
function pushbuttonResetExcludedTimeCh_Callback(hObject, eventdata, handles)
global maingui
if isa(maingui.dataTree.currElem, 'RunClass')
    ch = MenuBox('Are you sure you would like to re-enable all excluded channels and time points?',{'Yes','No'});
    if ch == 2
        return
    end
    maingui.dataTree.currElem.InitTincMan();
    iCh = maingui.axesSDG.iCh;
    iDataBlks =  maingui.dataTree.currElem.GetDataBlocksIdxs(iCh);
    for iBlk = 1:iDataBlks
        t = maingui.dataTree.currElem.GetTime(iBlk);
        maingui.dataTree.currElem.StimInclude(t, iBlk);
        maingui.dataTree.currElem.InitMlActMan(iBlk);
    end
    Display(handles, hObject);
else
    errordlg('Select a run to reset its excluded channels and time points.','No run selected');
end


Loading