Unverified Commit 14305eef authored by jayd1860's avatar jayd1860 Committed by GitHub
Browse files

Fix tCCA issues related to new BIDS format support (#130)

* v1.36.0

-- Fix issues with building and running Homer3 executable.
-- Add logging of Homer3 input arguments.
-- Fix a performance issue in fullpath.m discovered when loading large data set.

* v1.36.1

-- Fix another issue in executable of not finding data files in subject folder.

* v1.36.2

-- Fix for error loading SNIRF aux.name field didn't work for ALL cases. Added code in HDF5 transpose code to handle all cases.
-- Added error handling in AuxClass

* -- Fix syncSubmodules attempted syncing with empty submodule

* v1.36.3

-- Sync with latest changes to shared libraries in AV (v2.19.3)

* v1.36.4

-- Fix bug (in FuncCallClass.m) where saved proc stream parameter values not being loaded correctly - instead default values are loaded.
-- Subject level tcca user function hmrS_tCCA.m needs an update to do it's job of moving tcca filter files to subject derived data folder in homerOutput.
-- Fix broken version check in checkForHomerUpdates.m by converting getVernum output to a cell array as expected by the function. Also avoid setCurrentLocation not working on some versions of MacOS
-- Fix occasional failure of data display in MainGUI when clicking on channels in the SDG axes.
-- Minor corrections of comments in ProcStreamEditGUI.m

* v1.36.5

-- Sync datatree with latest changes in AtlasViewer v2.19.5

* v1.36.6

-- Changes to make tCCA processing work with BIDS sessions. Fix bugs in hmrE_CalcAvg.m session level averaging that generated incorrect results in tCCA processing (which requires at least 2 runs per session)
-- Do some code clean up in hmrR_GLM.m, fix error when flagNuisanceRMethod==3 (meaning use tCCA regression) but there's no rcMap, remove obsolete code.
-- Fix another issue with saved parameters in ProcStreamEditGUI.m this time when they are loaded from config file (previous fix was when saving to config file)
-- Fix issue with aux checkbox being disabled in MainGUI (aux is present in run and the first time run is selected aux checkbox is enabled). Aux checkbox becomes disabled after selecting subject processing, then run again.
-- Add another BIDS-like directory structure format in DataFilesClass.m to list of formats recognized and loaded by DataTree.
-- Add IsDataValid method to DataClass.m - used in session level averaging user function.
-- Some minor code formatting in ProcStreamClass.m and FindUserFuncDir.m.
-- Minor GUI changes: pushbutton label changes in ProcStreamEditGUI.fig and slightly different font sizes in setGuiFonts.m for GUI uicontrol objects with non-alphanumeric strings.

* v1.36.7  -- Change to how data set is loaded when no sessions folder are present. Assume runs under subject without session folder are part of the same session instead of each run having its own session. This will avoid problems with tCCA where it is impoertant to have mutiple runs, first being resting state.

* v1.36.8  -- Fix repeatedly running Homer3 with tCCA proc stream works first time but subsequent times generates error in hmrE_CalcAvg.m
parent 5db986c0
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -190,6 +190,13 @@ classdef DataFilesClass < handle
                ['nirs/*.', obj.filetype];
                }
                                
                %%%% 10. BIDS-like folder structure without nirs sub-folder
                {
                'sub-*';
                'ses-*';
                ['*.', obj.filetype];
                }
                                
                };
        end
        
@@ -470,6 +477,9 @@ classdef DataFilesClass < handle
                if  o.GetError() < 0
                    obj.logger.Write('DataFilesClass.ErrorCheck:   FAILED error check - %s will not be added to data set\n', filename);
                    errorIdxs = [errorIdxs, ii]; %#ok<AGROW>
                elseif  contains(o.GetErrorMsg(), 'WARNING: ''data'' corrupt and unusable')                    
                    obj.logger.Write('DataFilesClass.ErrorCheck:   WARNING data is unusable - %s will not be added to data set\n', filename);
                    errorIdxs = [errorIdxs, ii]; %#ok<AGROW>
                else
                    dataflag = true;
                end
+556 −556
Original line number Diff line number Diff line
@@ -194,8 +194,8 @@ classdef FileClass < matlab.mixin.Copyable
            %       R2.ext          ==>  [G1,  sub_R2,  ses_sub_R2,  R2]
            %       R3.ext          ==>  [G1,  sub_R3,  ses_sub_R3,  R3]
            if obj.IsFile && length(parts)==1 && length(subparts)==1
                subjName = ['sub_', fname];
                sessName = ['ses_', subjName];
                subjName = ['sub-', fname];
                sessName = ['ses-', subjName];
                runName  = obj.name;
            end

@@ -212,7 +212,7 @@ classdef FileClass < matlab.mixin.Copyable
            %       S3_R3.ext       ==>  [G1,  S2,  ses_S2_R3,  R3]
            if obj.IsFile && length(parts)==1 && length(subparts)==2
                subjName = subparts{1};
                sessName = ['ses_', subjName, '_', fname];
                sessName = ['ses-', subjName, '_', subjName];
                runName  = obj.name;
            end
            
@@ -261,7 +261,7 @@ classdef FileClass < matlab.mixin.Copyable
                subjName = obj.name;
            elseif obj.IsFile && length(parts)==2
                subjName = parts{1};
                sessName = [subjName, '/ses-', fname];
                sessName = [subjName, '/ses-', subjName];
                runName  = obj.name;
            end
            
+454 −80
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
            %   obj = NirsClass()
            %   obj = NirsClass(filename);
            %   obj = NirsClass(filename, dataStorageScheme);
            %   obj = NirsClass(SD);
            %   obj = NirsClass(SD, dataStorageScheme);
            %
            %
            % Example 1:
@@ -57,14 +59,29 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
            if nargin==0
                return;
            end
            if nargin==2
                obj.SetDataStorageScheme(varargin{2});
            end
            
            % Else we have at least 1 input arg
            if isa(varargin{1}, 'NirsClass')
                obj.Copy(varargin{1});
                return;
            elseif isstruct(varargin{1})
                if isfield(varargin{1}, 'd') && isfield(varargin{1}, 'SD')
                    obj.CopyStruct(varargin{1})                    
                elseif isfield(varargin{1}, 'DetPos') && isfield(varargin{1}, 'SrcPos')
                    obj.CopyProbe(varargin{1})
                end
            elseif isa(varargin{1}, 'SnirfClass')
                obj.ConvertSnirf(varargin{1});
            end

            if ~ischar(varargin{1}) && nargin==1
                obj.ErrorCheck();
                return
            end
            
            if nargin==2
                obj.SetDataStorageScheme(varargin{2});
            end
            
            filename = varargin{1};
            if ~exist('filename','var') || ~exist(filename,'file')
                obj = NirsClass.empty();
@@ -76,6 +93,7 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
            if strcmpi(obj.GetDataStorageScheme(), 'memory')
                obj.Load(filename);
            end
            obj.ErrorCheck();
        end
        
        
@@ -83,7 +101,7 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        function Initialize(obj)
            Initialize@AcqDataClass(obj);
            
            obj.SD        = struct([]);
            obj.SD        = obj.InitProbe();
            obj.t         = [];
            obj.s         = [];
            obj.d         = [];
@@ -99,6 +117,7 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
                '''SD'' is invalid.'
                '''aux'' is invalid.'
                '''s'' is invalid.'
                'WARNING: ''data'' corrupt and unusable'                
                'error unknown.'
                };
            
@@ -162,7 +181,6 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
            catch
                
                
                
            end
            warning('on', 'MATLAB:load:variableNotFound');
            
@@ -186,8 +204,9 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        % ---------------------------------------------------------
        function err = LoadTime(obj, fdata, err)
            if nargin == 1
                fdata.t = load(obj.GetFilename(),'-mat', 't');
                fdata = load(obj.GetFilename(),'-mat', 't');
                err = 0;
                return
            elseif nargin == 2
                err = 0;
            end
@@ -211,7 +230,7 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        % ---------------------------------------------------------
        function err = LoadProbeMeasList(obj, fdata, err)
            if isproperty(fdata,'SD')
                obj.SetSD(fdata.SD);
                obj.CopyProbe(fdata.SD);
                if isempty(obj.SD) && err == 0
                    err = -4;
                end
@@ -285,21 +304,136 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        
        
        % ---------------------------------------------------------
        function SaveMat(obj, fname, ~)
        function SaveMat(obj, fname, options)
            if ~exist('fname','var') || isempty(fname)
                fname = '';
            end
            if ~exist('options','var') || isempty(options)
                options = 'normal';
            end
            if isempty(fname)
                fname = obj.GetFilename();
            end
            
            SD        = obj.SD; %#ok<*NASGU,*PROPLC>
            s         = obj.s;
            CondNames = obj.CondNames;
            [str, fields] = obj.Properties2String();
            for ii = 1:length(fields)
                eval( sprintf('%s = obj.%s;', fields{ii}, fields{ii}) );
            end
            
            if ~ispathvalid(fname)
                p = fileparts(fname);
                if ~isempty(p) && ~ispathvalid(p, 'dir')
                    mkdir(p);
                end
                eval( sprintf('save(fname, ''-mat'', %s)', str) );
            elseif optionExists(options, 'normal')
                save(fname, '-mat', '-append', 'SD','s','CondNames');
            elseif optionExists(options, 'overwrite')
                eval( sprintf('save(fname, ''-mat'', %s)', str) );
            end
        end
        

        
        % -------------------------------------------------------
        function b = ProbeEqual(obj, obj2)
            b = false;
                        
            fields{1} = propnames(obj.SD);
            fields{2} = propnames(obj2.SD);
            
            fieldsToExclude = { ...
                'MeasListAct'; ...
                'SrcMap'; ...
                };
            
            for kk = 1:length(fields)
                for jj = 1:length(fields{kk})
                    field = fields{kk}{jj};
                    
                    % Skip excluded fields
                    if ~isempty(find(strcmp(fieldsToExclude, field))) %#ok<EFIND>
                        continue;
                    end                    
                    
                    % Now compare field
                    if ~isfield(obj.SD,field) || ~isfield(obj2.SD,field)
                        return;
                    end
                    if eval( sprintf('~strcmp(class(obj.SD.%s), class(obj2.SD.%s))', field, field) )
                        return;
                    end
                    if eval( sprintf('length(obj.SD.%s) ~= length(obj2.SD.%s)', field, field) )
                        return;
                    end
                    EPS = 1.0e-10; %#ok<NASGU>
                    if eval( sprintf('iscell(obj.SD.%s)', field) )
                        N = eval( sprintf('length(obj.SD.%s(:))', field) );
                        for ii = 1:N
                            if eval( sprintf('length(obj.SD.%s{ii}(:)) ~= length(obj2.SD.%s{ii}(:))', field, field) )
                                return;
                            end
                            if eval( sprintf('~all(obj.SD.%s{ii}(:) == obj2.SD.%s{ii}(:))', field, field) )
                                return;
                            end
                        end
                    elseif eval( sprintf('isstruct(obj.SD.%s)', field) )
                        if eval( sprintf('~isempty(comp_struct(obj.SD.%s, obj2.SD.%s))', field, field) )
                            return;
                        end
                    else
                        if eval( sprintf('~all( (obj.SD.%s(:) - obj2.SD.%s(:)) < EPS )', field, field) )
                            return;
                        end
                    end
                end
            end
            b = true;
        end
        
        
        
        % -------------------------------------------------------
        function B = eq(obj, obj2)
            B = false;
            
            if length(obj.t) ~= length(obj2.t)
                return;
            end
            if ~all(obj.t == obj2.t)
                return;
            end
            
            if length(obj.d) ~= length(obj2.d)
                return;
            end
            if ~all(obj.d(:) == obj2.d(:))
                return;
            end
            
            if ~obj.ProbeEqual(obj2)
                return;
            end
            
            if length(obj.s) ~= length(obj2.s)
                return;
            end
            if ~all(obj.s(:) == obj2.s(:))
                return;
            end
            
            if length(obj.aux) ~= length(obj2.aux)
                return;
            end
            if ~all(obj.aux(:) == obj2.aux(:))
                return;
            end
            
            B = true;
        end
        
        
        
        % ---------------------------------------------------------
        function err = Copy(obj, obj2)
            err=0;
@@ -444,11 +578,6 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
            val = obj.t;
        end
        
        % ---------------------------------------------------------
        function SetSD(obj, val)
            obj.SD = val;            
        end
        
        % ---------------------------------------------------------
        function val = GetSD(obj)
            val = obj.SD;
@@ -470,9 +599,24 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        end
        
        % ---------------------------------------------------------
        function val = GetAux(obj)
        function val = GetAux(obj, options)
            if ~exist('options','var')
                options = 'struct';
            end
            if optionExists(options, 'matrix')
                val = obj.aux;
            else
                structtype = struct('name','', 'dataTimeSeries',[]);
                val = struct(structtype([]));
                for ii = 1:size(obj.aux,2)
                    val(ii).name = num2str(ii);
                    val(ii).time = obj.t;
                    val(ii).dataTimeSeries = obj.aux(:,ii);
                end
            end
        end
        
        
        
        % ---------------------------------------------------------
        function SetCondNames(obj, val)
@@ -509,12 +653,6 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        end
        
        
        % ---------------------------------------------------------
        function SetSDG(obj, SD)
            obj.SD = SD;
        end
        
        
        % ---------------------------------------------------------
        function ml = GetMeasList(obj, iBlk)
            ml = obj.SD.MeasList;
@@ -629,6 +767,10 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        
        % ----------------------------------------------------------------------------------
        function SD = Get_SD(obj)
            SD = [];
            if ~obj.IsProbeValid()
                return;
            end
            SD = obj.SD;
        end
        
@@ -799,6 +941,238 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
            nbytes = nbytes + sizeof(obj.CondNames);
        end

        
        
        % ----------------------------------------------------------------------------------
        function landmarks = InitLandmarks(obj)
            landmarks = struct('pos',[], 'labels',{{}});
        end
        
        
        % ----------------------------------------------------------------------------------
        function SD = InitProbe(obj)
            SD = struct(...
                'Lambda',[], ...
                'SrcPos',[], ...
                'DetPos',[], ...
                'DummyPos',[], ...
                'SrcPos3D',[], ...
                'DetPos3D',[], ...
                'DummyPos3D',[], ...
                'SrcGrommetType',{{}}, ...
                'DetGrommetType',{{}}, ...
                'DummyGrommetType',{{}}, ...
                'SrcGrommetRot',[], ...
                'DetGrommetRot',[], ...
                'DummyGrommetRot',[], ...
                'nDummys',0, ...
                'Landmarks',obj.InitLandmarks(), ...
                'Landmarks2D',obj.InitLandmarks(), ...
                'Landmarks3D',obj.InitLandmarks(), ...
                'MeasList',[], ...
                'MeasListAct',[], ...
                'SpringList',[], ...
                'AnchorList',[], ...
                'SrcMap',[], ...
                'SpatialUnit','', ...
                'xmin',0, ...
                'xmax',0, ...
                'ymin',0, ...
                'ymax',0, ...
                'auxChannels',[] ...
                );
        end
        
        
        
        % ----------------------------------------------------------------------------------
        function b = IsProbeValid(obj)
            b = false;
            if ~isfield(obj.SD, 'SrcPos')
                return;
            end
            if ~isfield(obj.SD, 'DetPos')
                return;
            end
            if ~isfield(obj.SD, 'MeasList')
                return;
            end
            if ~isfield(obj.SD, 'Lambda')
                return;
            end
            if isempty(obj.SD.SrcPos)
                return;
            end
            if isempty(obj.SD.DetPos)
                return;
            end
            if isempty(obj.SD.MeasList)
                return;
            end
            if isempty(obj.SD.Lambda)
                return;
            end
            b = true;
        end
        
        
        
        % ----------------------------------------------------------------------------------
        function b = IsValid(obj)
            b = ~obj.IsEmpty();
        end
        
        
        
        % ----------------------------------------------------------------------------------
        function b = CopyProbe(obj, SD)            
            fields = propnames(obj.SD);
            for ii = 1:length(fields)
                if eval( sprintf('isfield(SD, ''%s'')', fields{ii}) )
                    eval( sprintf('obj.SD.%s = SD.%s;', fields{ii}, fields{ii}) );
                end
            end
        end
        
        
        % ----------------------------------------------------------------------------------
        function b = CopyStruct(obj, s)            
            fields = propnames(obj);
            for ii = 1:length(fields)
                if eval( sprintf('isfield(s, ''%s'')', fields{ii}) )
                    if strcmp(fields{ii}, 'SD')
                        obj.CopyProbe(s.SD);
                    else
                        eval( sprintf('obj.%s = s.%s;', fields{ii}, fields{ii}) );
                    end
                end
            end
        end

        
        
        % ----------------------------------------------------------------------------------
        function ConvertSnirfProbe(obj, snirf)
            obj.SD.Lambda = snirf.probe.wavelengths;
            obj.SD.SrcPos = snirf.probe.sourcePos2D;
            obj.SD.DetPos = snirf.probe.detectorPos2D;
            obj.SD.SrcPos3D = snirf.probe.sourcePos3D;
            obj.SD.DetPos3D = snirf.probe.detectorPos3D;
            obj.SD.MeasList = snirf.GetMeasList();
            obj.SD.SpatialUnit = snirf.GetLengthUnit();
            obj.SD.Landmarks.pos        = snirf.probe.landmarkPos2D;
            obj.SD.Landmarks2D.pos      = snirf.probe.landmarkPos2D;
            obj.SD.Landmarks3D.pos      = snirf.probe.landmarkPos3D;
            obj.SD.Landmarks.labels     = snirf.probe.landmarkLabels;
            obj.SD.Landmarks2D.labels   = snirf.probe.landmarkLabels;
            obj.SD.Landmarks3D.labels   = snirf.probe.landmarkLabels;
        end
        
        
        % ----------------------------------------------------------------------------------
        function ConvertSnirfData(obj, snirf)
            obj.d = snirf.data(1).dataTimeSeries;
            obj.t = snirf.data(1).time;
        end
        
        
        % ----------------------------------------------------------------------------------
        function ConvertSnirfStim(obj, snirf)
            obj.s = zeros(length(obj.t), length(snirf.stim));
            for ii = 1:length(snirf.stim)
                k = round(nearest_point(obj.t, snirf.stim(ii).data(:,1)));
                for jj = 1:length(k)
                    if k(jj) == 0
                        k(jj) = 1;
                    end
                    if k(jj) > length(obj.t)
                        k(jj) = length(obj.t);
                    end
                    obj.s(k(jj),ii) = 1;
                end
                obj.CondNames{ii} = snirf.stim(ii).name;
            end
        end
        
        
        % ----------------------------------------------------------------------------------
        function ConvertSnirfAux(obj, snirf)
            obj.aux = zeros(length(obj.t), length(snirf.aux));
            for ii = 1:length(snirf.aux)
                obj.aux(:,ii) = snirf.aux(ii).dataTimeSeries;
            end
        end
        
        
        % ----------------------------------------------------------------------------------
        function ConvertSnirf(obj, snirf)
            obj.ConvertSnirfProbe(snirf);
            obj.d = snirf.data(1).dataTimeSeries;
            obj.t = snirf.data(1).time;
            obj.ConvertSnirfStim(snirf);
            obj.ConvertSnirfAux(snirf);
        end

        
        
        % ----------------------------------------------------------------------------------        
        function ErrorCheck(obj)
            if isempty(obj)
                return
            end
            if isempty(obj.SD.SrcGrommetType)
                for ii = 1:size(obj.SD.SrcPos,1)
                    obj.SD.SrcGrommetType{ii} = 'none';
                end
            end
            
            if isempty(obj.SD.DetGrommetType)
                for ii = 1:size(obj.SD.DetPos,1)
                    obj.SD.DetGrommetType{ii} = 'none';
                end
            end
            
            if isempty(obj.SD.DummyGrommetType)
                for ii = 1:size(obj.SD.DummyPos,1)
                    obj.SD.DummyGrommetType{ii} = 'none';
                end
            end
            
            if isempty(obj.SD.SrcGrommetRot)
                for ii = 1:size(obj.SD.SrcPos,1)
                    obj.SD.SrcGrommetRot(ii) = 0;
                end
            end
            
            if isempty(obj.SD.DetGrommetRot)
                for ii = 1:size(obj.SD.DetPos,1)
                    obj.SD.DetGrommetRot(ii) = 0;
                end
            end
            
            if isempty(obj.SD.DummyGrommetRot)
                for ii = 1:size(obj.SD.DummyPos,1)
                    obj.SD.DummyGrommetRot(ii) = 0;
                end
            end
            
        end
        
        
        % ----------------------------------------------------------------
        function [str, fields] = Properties2String(obj)
            str = '';
            fields = propnames(obj);
            for ii = 1:length(fields)
                if isempty(str)
                    str = sprintf('''%s''', fields{ii});
                else
                    str = sprintf('%s, ''%s''', str, fields{ii});
                end
            end
        end
        
        
    end
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+50 −11
Original line number Diff line number Diff line
@@ -52,12 +52,18 @@ classdef DataClass < FileLoadSaveClass
            elseif nargin==1
                if isa(varargin{1}, 'DataClass')
                    obj.Copy(varargin{1});
                elseif isa(varargin{1}, 'NirsClass')
                elseif NirsClass(varargin{1}).IsValid()
                    obj.dataTimeSeries = varargin{1}.d;
                    obj.time = varargin{1}.t;
                    for ii = 1:size(varargin{1}.ml,1)
                        obj.measurementList(end+1) = MeasListClass(varargin{1}.ml(ii,:));
                    end
                elseif NirsClass(varargin{1}).IsProbeValid()
                    obj.dataTimeSeries = zeros(2, size(varargin{1}.MeasList,1));
                    obj.time = zeros(2,1);
                    for ii = 1:size(varargin{1}.MeasList,1)
                        obj.measurementList(end+1) = MeasListClass(varargin{1}.MeasList(ii,:));
                    end
                elseif isa(varargin{1}, 'char')
                    obj.SetFilename(varargin{1});
                    obj.Load();
@@ -130,6 +136,12 @@ classdef DataClass < FileLoadSaveClass
            try
                % Open group
                [gid, fid] = HDF5_GroupOpen(fileobj, location);
                if isstruct(gid)
                    if gid.double < 0 
                        err = -1;
                        return 
                    end
                end                
                
                obj.dataTimeSeries  = HDF5_DatasetLoad(gid, 'dataTimeSeries');
                obj.time            = HDF5_DatasetLoad(gid, 'time');
@@ -237,16 +249,35 @@ classdef DataClass < FileLoadSaveClass
        
        % -------------------------------------------------------
        function b = IsEmpty(obj)
            b = false;
            if isempty(obj)
            b = true;
            if isempty(obj)
                return;
            end
            if isempty(obj.dataTimeSeries) || isempty(obj.time) || isempty(obj.measurementList)
                b = true;
                return;
            end
            if isempty(obj.measurementList)
                return;
            end
            b = false;
        end
        
        
        % -------------------------------------------------------
        function b = IsDataValid(obj, iMeas)
            b = false;
            if ~exist('iMeas','var')
                iMeas = 1:length(obj.measurementList);
            end            
            if all(isnan(obj.dataTimeSeries(:)))
                return;
            end
            for ii = iMeas
                if any(isnan(obj.dataTimeSeries(:, iMeas)))
                    return;
                end
            end
            b = true;
        end
        
        
@@ -257,18 +288,26 @@ classdef DataClass < FileLoadSaveClass
            end
            if ismember('dataTimeSeries',params)
            if obj.IsEmpty()
                err = -1;
                    err = -2;
                    return;
            end
            if size(obj.dataTimeSeries,1) ~= length(obj.time)
                err = -1;
                    err = -3;
            end
            if size(obj.dataTimeSeries,2) ~= length(obj.measurementList)
                err = -1;
                    err = -4;
            end
                if all(obj.dataTimeSeries==0)
                    err = 5;
                end
        end
            if ismember('time',params)
                if isempty(obj.time)
                    err = -1;
                    err = -6;
                    return;
                end
                if all(obj.time==0)
                    err = 7;
                end
            end
        end
+25 −13

File changed.

Preview size limit exceeded, changes collapsed.

Loading