Commit cec54469 authored by jayd1860's avatar jayd1860
Browse files

v1.40.0

-- Fix major issue with incorrect sorting of data and measurement list.
-- Change unit tests to include wavelength when scrambling channel order. Also make scrambling for unit tests an option
parent 8af7176b
Loading
Loading
Loading
Loading
+171 −48
Original line number Diff line number Diff line
@@ -168,7 +168,7 @@ classdef DataClass < FileLoadSaveClass
                
                % Close group
                HDF5_GroupClose(fileobj, gid, fid);
            catch ME
            catch
                err = -1;
            end
            
@@ -212,7 +212,7 @@ classdef DataClass < FileLoadSaveClass
                                   
                % Close group
                HDF5_GroupClose(fileobj, gid, fid);
            catch ME
            catch
                err = -1;
            end
            
@@ -333,7 +333,10 @@ classdef DataClass < FileLoadSaveClass
        
        
        % ---------------------------------------------------------
        function ml = GetMeasList(obj)
        function ml = GetMeasList(obj, options)
            if ~exist('options', 'var')
                options = '';
            end
            % Preallocate for speed 
            ml = ones(length(obj.measurementList), 4);
            
@@ -355,22 +358,35 @@ classdef DataClass < FileLoadSaveClass
            
            % Remove unused rows that were pre-allocated
            ml(ii+1:end,:) = [];

            % Sort according to wavelength
            ml = sortrows(ml,4);
            if strcmp(options, 'reshape')
                ml = sortrows(ml);
            end            
        end
        
        
        
        % ---------------------------------------------------------
        function ml = GetMeasListSrcDetPairs(obj)
        function ml = GetMeasListSrcDetPairs(obj, options)
            if ~exist('options', 'var')
                options = '';
            end
            ml = zeros(0, 2);
            jj=1;
            for ii=1:length(obj.measurementList)
                if isempty(find(ml(:,1)==obj.measurementList(ii).GetSourceIndex() & ml(:,2)==obj.measurementList(ii).GetDetectorIndex()))
                    ml(jj,:) = [obj.measurementList(ii).GetSourceIndex(), obj.measurementList(ii).GetDetectorIndex()];
                if isempty(find(ml(:,1) == obj.measurementList(ii).sourceIndex & ml(:,2) == obj.measurementList(ii).detectorIndex))
                    ml(jj,:) = [obj.measurementList(ii).sourceIndex, obj.measurementList(ii).detectorIndex];
                    jj=jj+1;
                end
            end
            if strcmp(options, 'reshape')
                ml = sortrows(ml);
            end
        end
        
        
        % ---------------------------------------------------------
        function ml = GetMeasurementList(obj)
            ml = obj.measurementList;
        end
        
        
@@ -400,9 +416,11 @@ classdef DataClass < FileLoadSaveClass
        end
        
        
        
        % ---------------------------------------------------------
        function d = GetDataTimeSeries(obj, options)
        function [d, order] = GetDataTimeSeries(obj, options)
            d = [];
            order = [];
            if ~exist('options','var') || isempty(options)
                options = '';
            end
@@ -414,51 +432,155 @@ classdef DataClass < FileLoadSaveClass
                return
            end
                      
            % Get information for each ch in d matrix
            dataTypeLabels = {};
            srcDetPairs = zeros(0,2);
            srcs = zeros(0,2);
            dets = zeros(0,2);
            conditions = [];
            wavelengths = [];
            hh=1; jj=1; kk=1; ll=1;
            hh=1; jj=1; kk=1; ll=1; mm=1;
            for ii = 1:length(obj.measurementList)
                if ~ismember(obj.measurementList(ii).GetDataTypeLabel(), dataTypeLabels)
                    dataTypeLabels{hh} = obj.measurementList(ii).GetDataTypeLabel();
                if ~ismember(obj.measurementList(ii).dataTypeLabel, dataTypeLabels) && ~isempty(obj.measurementList(ii).dataTypeLabel)
                    dataTypeLabels{hh} = obj.measurementList(ii).dataTypeLabel; %#ok<*AGROW>
                    hh=hh+1;
                end
                if isempty(find(srcDetPairs(:,1)==obj.measurementList(ii).GetSourceIndex() & srcDetPairs(:,2)==obj.measurementList(ii).GetDetectorIndex()))
                    srcDetPairs(jj,:) = [obj.measurementList(ii).GetSourceIndex(), obj.measurementList(ii).GetDetectorIndex()];
                if isempty(find(srcs == obj.measurementList(ii).GetSourceIndex()))
                    srcs(jj) = obj.measurementList(ii).GetSourceIndex();
                    jj=jj+1;
                end
                if ~ismember(obj.measurementList(ii).GetCondition(), conditions)
                    conditions(kk) = obj.measurementList(ii).GetCondition();
                if isempty(find(dets == obj.measurementList(ii).GetDetectorIndex())) %#ok<*EFIND>
                    dets(kk) = obj.measurementList(ii).GetDetectorIndex();
                    kk=kk+1;
                end
                if ~ismember(obj.measurementList(ii).GetWavelengthIndex(), wavelengths)
                    wavelengths(ll) = obj.measurementList(ii).GetWavelengthIndex();
                if ~ismember(obj.measurementList(ii).GetCondition(), conditions) && obj.measurementList(ii).GetCondition() > 0
                    conditions(ll) = obj.measurementList(ii).GetCondition();
                    ll=ll+1;
                end
                if ~ismember(obj.measurementList(ii).GetWavelengthIndex(), wavelengths) && obj.measurementList(ii).GetWavelengthIndex()>0
                    wavelengths(mm) = obj.measurementList(ii).GetWavelengthIndex();
                    mm=mm+1;
                end
            end
            
            hbTypes         = {'hbo','hbr','hbt'};
            nWavelengths    = length(wavelengths);
            nDataTypeLabels = length(dataTypeLabels);
            nCond           = length(conditions);
            ml              = obj.GetMeasListSrcDetPairs('reshape');
            
            kk = 1;
            if nWavelengths > 0 && nCond == 0
                
                for iWl = 1:nWavelengths
                    for iS = 1:length(srcs)
                        for iD = 1:length(dets)
                            
                            for ii = 1:length(obj.measurementList)
                                if obj.measurementList(ii).sourceIndex == iS && ...
                                   obj.measurementList(ii).detectorIndex == iD &&  ...
                                   obj.measurementList(ii).wavelengthIndex == iWl
                                    
                                    iSrcDetPair = find(ml(:,1)==iS & ml(:,2)==iD);
                                    d(:, iWl, iSrcDetPair) = obj.dataTimeSeries(:,ii); %#ok<*FNDSB>
                                    
                                    
                                    order(kk) = ii;
                                    kk = kk+1;
                                    break;

                                end
                                
                            end
                        end
                    end
                end
                
            elseif nWavelengths > 0 && nCond > 0 
                
                for iWl = 1:nWavelengths
                    for iS = 1:length(srcs)
                        for iD = 1:length(dets)
                            for iCond = 1:nCond
                            
                                for ii = 1:length(obj.measurementList)
                                    if obj.measurementList(ii).sourceIndex == iS && ...
                                       obj.measurementList(ii).detectorIndex == iD &&  ...
                                       obj.measurementList(ii).wavelengthIndex == iWl && ...
                                       obj.measurementList(ii).dataTypeIndex == iCond
                                        
                                        iSrcDetPair = find(ml(:,1)==iS & ml(:,2)==iD);
                                        d(:, iWl, iSrcDetPair, iCond) = obj.dataTimeSeries(:,ii);
                                        
                                        order(kk) = ii;
                                        kk = kk+1;
                                        break;

                                    end
                                end
                                
                            end     
                        end
                    end
                end
                
            elseif nDataTypeLabels > 0 && nCond == 0 
                
                for iHbType = 1:length(hbTypes)
                    for iS = 1:length(srcs)
                        for iD = 1:length(dets)
                            
                            for ii = 1:length(obj.measurementList)
                                if obj.measurementList(ii).sourceIndex == iS && ...
                                   obj.measurementList(ii).detectorIndex == iD && ...
                                   ~isempty(strfind(lower(obj.measurementList(ii).dataTypeLabel), hbTypes{iHbType}))

                                    iSrcDetPair = find(ml(:,1)==iS & ml(:,2)==iD);
                                    d(:, iHbType, iSrcDetPair) = obj.dataTimeSeries(:,ii);

                                    order(kk) = ii;
                                    kk = kk+1;                                    
                                    break;

                                end

                            end
                            
                        end
                    end
            dim1 = length(obj.dataTimeSeries(:,1));
            if all(wavelengths(:)~=0) && all(conditions(:)==0)
                dim2 = length(wavelengths(:)) * size(srcDetPairs,1);
                dim3 = 1;
                dim4 = 1;
            elseif all(wavelengths(:)~=0) && all(conditions(:)~=0)
                dim2 = length(wavelengths(:)) * size(srcDetPairs,1);
                dim3 = length(conditions(:));
                dim4 = 1;
            elseif all(wavelengths(:)==0) && all(conditions(:)==0)
                dim2 = length(dataTypeLabels);
                dim3 = size(srcDetPairs,1);
                dim4 = 1;
            elseif all(wavelengths(:)==0) && all(conditions(:)~=0)
                dim2 = length(dataTypeLabels);
                dim3 = size(srcDetPairs,1);
                dim4 = length(conditions(:));
                end
            d = reshape(obj.dataTimeSeries, dim1, dim2, dim3, dim4);
                
            elseif nDataTypeLabels > 0 && nCond > 0 
                
                for iHbType = 1:length(hbTypes)
                    for iS = 1:length(srcs)
                        for iD = 1:length(dets)
                            for iCond = 1:nCond
                            
                                for ii = 1:length(obj.measurementList)
                                    if obj.measurementList(ii).sourceIndex == iS && ...
                                       obj.measurementList(ii).detectorIndex == iD &&  ...
                                       ~isempty(strfind(lower(obj.measurementList(ii).dataTypeLabel), hbTypes{iHbType})) && ...
                                       obj.measurementList(ii).dataTypeIndex == iCond
                                        
                                        iSrcDetPair = find(ml(:,1)==iS & ml(:,2)==iD);
                                        d(:, iHbType, iSrcDetPair, iCond) = obj.dataTimeSeries(:,ii);
                                        
                                        order(kk) = ii;
                                        kk = kk+1;
                                        break;

                                    end
                                end
                                
                            end     
                        end
                    end
                end
                
            end
            
        end
        
        
        
        % ---------------------------------------------------------
        function SetDataTimeSeries(obj, val)
@@ -469,6 +591,7 @@ classdef DataClass < FileLoadSaveClass
        end
        
        
        
        % ---------------------------------------------------------
        function SetTime(obj, val, datacheck)
            if ~exist('val','var')
+16 −0
Original line number Diff line number Diff line
@@ -979,6 +979,22 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
        end
        
        
        % ---------------------------------------------------------
        function ml = GetMeasurementList(obj, iBlk)
            ml = [];
            if ~exist('iBlk','var') || isempty(iBlk)
                iBlk = 1;
            end
            if iBlk>length(obj.data)
                return;
            end
            for ii = 1:length(iBlk)
                ml = [ml; obj.data(ii).measurementList];
            end
        end
        
        
        
        % ---------------------------------------------------------
        function datamat = GetDataTimeSeries(obj, options, iBlk)
            datamat = [];
+77 −0
Original line number Diff line number Diff line
@@ -1422,6 +1422,83 @@ classdef ProcStreamClass < handle
        end
        
        
        % ---------------------------------------------------------
        function ml = GetMeasurementList(obj, options, iBlk)
            ml = [];
            if ~exist('options','var')
                options = 'conc';
            end
            if ~exist('iBlk','var') || isempty(iBlk)
                iBlk = 1;
            end
            for ii = 1:length(iBlk)
                switch(lower(options))
                    case 'od'
                        if ii <= length(obj.output.dod)
                            ml = [ml; obj.output.dod(ii).measurementList];
                        end
                    case {'conc','hb','hbo','hbr','hbt'}
                        if ii <= length(obj.output.dc)
                            ml = [ml; obj.output.dc(ii).measurementList];
                        end
                    case {'od hrf','od_hrf'}
                        if ii <= length(obj.output.dodAvg)
                            ml = [ml; obj.output.dodAvg(ii).measurementList];
                        end
                    case {'hb hrf','conc hrf','hb_hrf','conc_hrf'}
                        if ii <= length(obj.output.dcAvg)
                            ml = [ml; obj.output.dcAvg(ii).measurementList];
                        end
                end
            end
        end
        
                
        
        % ---------------------------------------------------------
        function t = GetTHRF(obj, iBlk)
            t = [];
            if ~exist('iBlk','var') || isempty(iBlk)
                iBlk = 1;
            end
            t = obj.output.tHRF;
        end
        
        
        
        % ---------------------------------------------------------
        function dataTimeSeries = GetDataTimeSeries(obj, options, iBlk)
            dataTimeSeries = [];
            if ~exist('options','var')
                options = 'conc';
            end
            if ~exist('iBlk','var') || isempty(iBlk)
                iBlk = 1;
            end
            for ii = 1:length(iBlk)
                switch(lower(options))
                    case 'od'
                        if ii <= length(obj.output.dod)
                            dataTimeSeries = [dataTimeSeries, obj.output.dod(ii).dataTimeSeries];
                        end
                    case {'conc','hb','hbo','hbr','hbt'}
                        if ii <= length(obj.output.dc)
                            dataTimeSeries = [dataTimeSeries; obj.output.dc(ii).dataTimeSeries];
                        end
                    case {'od hrf','od_hrf'}
                        if ii <= length(obj.output.dodAvg)
                            dataTimeSeries = [dataTimeSeries; obj.output.dodAvg(ii).dataTimeSeries];
                        end
                    case {'hb hrf','conc hrf','hb_hrf','conc_hrf'}
                        if ii <= length(obj.output.dcAvg)
                            dataTimeSeries = [dataTimeSeries; obj.output.dcAvg(ii).dataTimeSeries];
                        end
                end
            end
        end
        
                
        
        % ----------------------------------------------------------------------------------
        function SetTincMan(obj, val, iBlk)
            if ~exist('iBlk','var')
+18 −8
Original line number Diff line number Diff line
classdef RunClass < TreeNodeClass
       
    properties % (Access = private)
        acquired;
    end
    
    methods
                
        % ----------------------------------------------------------------------------------
@@ -396,7 +392,11 @@ classdef RunClass < TreeNodeClass
            if ~exist('iBlk','var') || isempty(iBlk)
                iBlk = 1;
            end
            if isempty(options) || strcmp(options, 'reshape')
                d = obj.acquired.GetDataTimeSeries(options, iBlk);
            else
                d = obj.GetDataTimeSeries@TreeNodeClass(options, iBlk);
            end
        end
        
        
@@ -447,11 +447,16 @@ classdef RunClass < TreeNodeClass
            obj.procStream.input.SetMeasListVis(ones(size(ch, 1), 1));
        end
            
        
        
        % ----------------------------------------------------------------------------------
        function ch = GetMeasList(obj, iBlk)
        function ch = GetMeasList(obj, options, iBlk)
            if ~exist('iBlk','var') || isempty(iBlk)
                iBlk=1;
            end
            if ~exist('options','var')
                options = '';
            end
            
            ch = struct('MeasList',[], 'MeasListVis',[], 'MeasListActMan',[], 'MeasListActAuto',[]);
            
@@ -466,6 +471,11 @@ classdef RunClass < TreeNodeClass
                ch.MeasListActAuto = ones(size(ch.MeasList,1),1);
            end
            ch.MeasListAct     = bitand(ch.MeasListActMan, ch.MeasListActMan);
            if strcmp(options,'reshape')
                [ch.MeasList, order] = sortrows(ch.MeasList);
                ch.MeasListActMan = ch.MeasListActMan(order);
                ch.MeasListActAuto = ch.MeasListActAuto(order);
            end
        end

        
+83 −12
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ classdef TreeNodeClass < handle
        iRun;
        iFile;
        children;
        acquired;
        procStream;
        err;
        CondNames;
@@ -47,6 +48,7 @@ classdef TreeNodeClass < handle
            
            obj.type = '';
            obj.procStream = ProcStreamClass();
            obj.acquired = [];
            obj.err = 0;
            obj.CondNames = {};
            obj.path = filesepStandard(pwd);            
@@ -559,12 +561,81 @@ classdef TreeNodeClass < handle
        end
        
        
        % ----------------------------------------------------------------------------------
        function ch = GetMeasList(obj, iBlk)
        % ---------------------------------------------------------
        function ml = GetMeasurementList(obj, options, iBlk)
            ml = [];
            if ~exist('options','var')
                options = 'RAW';
            end
            if ~exist('iBlk','var') || isempty(iBlk)
                iBlk = 1;
            end
            for ii = 1:length(iBlk)
                switch(lower(options))
                    case 'raw'
                        if isempty(obj.acquired)
                            continue
                        end
                        ml = [ml; obj.acquired.GetMeasurementList(ii)]; %#ok<*AGROW>
                    case 'od'
                        ml = [ml; obj.procStream.GetMeasurementList('od',ii)];
                    case {'conc','hb','hbo','hbr','hbt'}
                        ml = [ml; obj.procStream.GetMeasurementList('conc',ii)];
                    case {'od hrf','od_hrf'}
                        ml = [ml; obj.procStream.GetMeasurementList('od hrf',ii)];
                    case {'hb hrf','conc hrf','hb_hrf','conc_hrf'}
                        ml = [ml; obj.procStream.GetMeasurementList('conc hrf',ii)];
                end
            end
        end
        
        
        
        % ---------------------------------------------------------
        function [d, t] = GetDataTimeSeries(obj, options, iBlk)
            d = [];
            t = [];            
            if ~exist('options','var')
                options = 'RAW';
            end
            if ~exist('iBlk','var') || isempty(iBlk)
                iBlk = 1;
            end
            for ii = 1:length(iBlk)
                switch(lower(options))
                    case 'raw'
                        if isempty(obj.acquired)
                            continue
                        end
                        d = [d, obj.acquired.GetDataTimeSeries(ii)]; %#ok<*AGROW>
                        t = [t; obj.GetTime(ii)];
                    case 'od'
                        d = [d, obj.procStream.GetDataTimeSeries('od',ii)];
                        t = [t; obj.GetTime(ii)];
                    case {'conc','hb','hbo','hbr','hbt'}
                        d = [d, obj.procStream.GetDataTimeSeries('conc',ii)];
                        t = [t; obj.GetTime(ii)];
                    case {'od hrf','od_hrf'}
                        d = [d, obj.procStream.GetDataTimeSeries('od hrf',ii)];
                        t = [t; obj.procStream.GetTHRF(ii)];
                    case {'hb hrf','conc hrf','hb_hrf','conc_hrf'}
                        d = [d, obj.procStream.GetDataTimeSeries('conc hrf',ii)];
                        t = [t; obj.procStream.GetTHRF(ii)];
                end
            end
        end
        
        
        
        % ----------------------------------------------------------------------------------
        function ch = GetMeasList(obj, options, iBlk)
            ch = [];
            if ~exist('options','var')
                options = '';
            end
            if ~exist('iBlk','var')
                iBlk = 1;
            end
            for ii = 1:length(obj.children)
                if isempty(ch)
                    ch = obj.children(ii).GetMeasList(iBlk);
@@ -578,9 +649,15 @@ classdef TreeNodeClass < handle
                    end
                end
            end
            if strcmp(options,'reshape')
                [ch.MeasList, order] = sortrows(ch.MeasList);
                ch.MeasListActMan = ch.MeasListActMan(order);
                ch.MeasListActAuto = ch.MeasListActAuto(order);
            end
        end

        
        
        % ----------------------------------------------------------------------------------
        function SetMeasListVis(obj, chVis, iBlk)
            if ~exist('chVis','var')
@@ -773,12 +850,6 @@ classdef TreeNodeClass < handle
        end
        
        
        % ----------------------------------------------------------------------------------
        function d = GetDataTimeSeries(~, ~, ~)
            d = [];
        end

        
        % ----------------------------------------------------------------------------------
        function t = GetTime(~, ~)
            t = [];
@@ -895,7 +966,7 @@ classdef TreeNodeClass < handle
            procStreamFunctionsExportFilenames = findTypeFiles([obj.path, obj.outputDirname], fmt);            
            for ii = 1:length(procStreamFunctionsExportFilenames)
                [~, fname, ext] = fileparts(procStreamFunctionsExportFilenames{ii});
                fname = [fname, ext]; %#ok<AGROW>
                fname = [fname, ext];
                if ~strcmp(fname(end-length(suffix)+1 : end), suffix)
                    continue;
                end
Loading