Unverified Commit 448762b7 authored by jayd1860's avatar jayd1860 Committed by GitHub
Browse files

Merge v1.72.0: Fix for ar_glm_final.m stepwise error in GLM and fix for...

Merge v1.72.0:  Fix for ar_glm_final.m stepwise error in GLM and fix for export of proc stream mlActMan (#162)

Merge v1.72.0: Fix for ar_glm_final.m stepwise error in GLM and fix for export of proc stream mlActMan
parent 40bb3ca8
Loading
Loading
Loading
Loading
+115 −3
Original line number Diff line number Diff line
@@ -388,7 +388,7 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
                            return;
                        end
                    else
                        if eval( sprintf('~all( (obj.SD.%s(:) - obj2.SD.%s(:)) < EPS )', field, field) )
                        if eval( sprintf('~all( abs(obj.SD.%s(:) - obj2.SD.%s(:)) < EPS )', field, field) )
                            return;
                        end
                    end
@@ -1033,6 +1033,7 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        end
        
        
        
        % ----------------------------------------------------------------------------------
        function SD = InitProbe(obj)
            SD = struct(...
@@ -1049,7 +1050,6 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
                'SrcGrommetRot',[], ...
                'DetGrommetRot',[], ...
                'DummyGrommetRot',[], ...
                'nDummys',0, ...
                'Landmarks',obj.InitLandmarks(), ...
                'Landmarks2D',obj.InitLandmarks(), ...
                'Landmarks3D',obj.InitLandmarks(), ...
@@ -1069,6 +1069,59 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        
        
        
        % ----------------------------------------------------------------------------------
        function SetProbeSpatialUnit(obj, spatialUnitNew)
            scaling = 1;            
            if strcmpi(spatialUnitNew,'mm')
                if strcmpi(obj.SD.SpatialUnit,'cm')
                scaling = 10;
                end
            elseif strcmpi(spatialUnitNew,'cm')
                if strcmpi(obj.SD.SpatialUnit,'mm')
                scaling = 1/10;
            end            
            else
                spatialUnitNew = '';
            end
            obj.SD.SpatialUnit = spatialUnitNew;
            obj.SD.SrcPos = obj.SD.SrcPos * scaling;
            obj.SD.DetPos = obj.SD.DetPos * scaling;
            obj.SD.DummyPos = obj.SD.DummyPos * scaling;
            if size(obj.SD.SpringList,2)==3
                lst = find(obj.SD.SpringList(:,3)~=-1);
                obj.SD.SpringList(lst,3) = obj.SD.SpringList(lst,3) * scaling;
            end
            obj.SD.Landmarks.pos = obj.SD.Landmarks.pos * scaling;
            obj.SD.Landmarks3D.pos = obj.SD.Landmarks3D.pos * scaling;
            obj.SD.Landmarks2D.pos = obj.SD.Landmarks2D.pos * scaling;
        end
        
        
        
        % ----------------------------------------------------------------------------------
        function FixProbeSpatialUnit(obj)        
            if isempty(obj.SD.SpatialUnit)
                q = MenuBox('Spatial units not provided in probe data. Please specify spatial units of the optode coordinates?', ...
                    {'mm','cm',sprintf('do not know')});
                if q==1
                    obj.SD.SpatialUnit = 'mm';
                elseif q==2
                    obj.SD.SpatialUnit = 'cm';
                elseif q==3
                    obj.SD.SpatialUnit = '';
                end
            end
            if ~strcmpi(obj.SD.SpatialUnit,'mm')
                q = MenuBox(sprintf('This probe uses ''%s'' units for probe coordinates. We recommend converting to ''mm'' units, to be consistent with Homer. Do you want to convert probe coordinates from %s to mm?', ...
                    obj.SD.SpatialUnit), {'YES','NO'}, 'upperleft');
                if q==1
                    obj.SetProbeSpatialUnit('mm')       
                end
            end
        end
        
        
        
        % ----------------------------------------------------------------------------------
        function b = IsProbeValid(obj)
            b = false;
@@ -1113,11 +1166,70 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
            fields = propnames(obj.SD);
            for ii = 1:length(fields)
                if eval( sprintf('isfield(SD, ''%s'')', fields{ii}) )
                    if eval( sprintf('strcmp(class(obj.SD.%s), class(SD.%s))', fields{ii}, fields{ii}) )
                    eval( sprintf('obj.SD.%s = SD.%s;', fields{ii}, fields{ii}) );
                    elseif eval( sprintf('isnumeric(obj.SD.%s)  &&  iscell(SD.%s)', fields{ii}, fields{ii}) )
                        if eval( sprintf('~isempty(SD.%s)', fields{ii}) )
                            eval( sprintf('obj.SD.%s = cell2array(SD.%s);', fields{ii}, fields{ii}) );
                end
                    elseif eval( sprintf('isscalar(obj.SD.%s)  &&  isscalar(SD.%s)', fields{ii}, fields{ii}) )
                        eval( sprintf('obj.SD.%s = SD.%s;', fields{ii}, fields{ii}) );
                    end
                end
            end
            
            % Fill in any fields that don't conform to standard SD data structure 
            
            % SrcGrommetType
            d1 = size(obj.SD.SrcPos,1) - length(obj.SD.SrcGrommetType);
            if d1 > 0
                obj.SD.SrcGrommetType(end+1:end+d1) = repmat({'none'}, d1, 1);
            end
            
            % SrcGrommetRot
            d2 = size(obj.SD.SrcPos,1) - length(obj.SD.SrcGrommetRot);
            if d2 > 0
                obj.SD.SrcGrommetRot(end+1:end+d2) = zeros(d2,1);
            end
            
            % DetGrommetType
            d1 = size(obj.SD.DetPos,1) - length(obj.SD.DetGrommetType);
            if d1 > 0
                obj.SD.DetGrommetType(end+1:end+d1) = repmat({'none'}, d1, 1);
            end
            
            % DetGrommetRot
            d2 = size(obj.SD.DetPos,1) - length(obj.SD.DetGrommetRot);
            if d2 > 0
                obj.SD.DetGrommetRot(end+1:end+d2) = zeros(d2,1);
            end

            % DummyGrommetType
            d1 = size(obj.SD.DummyPos,1) - length(obj.SD.DummyGrommetType);
            if d1 > 0
                obj.SD.DummyGrommetType(end+1:end+d1) = repmat({'none'}, d1, 1);
            end
            
            % DummyGrommetRot
            d2 = size(obj.SD.DummyPos,1) - length(obj.SD.DummyGrommetRot);
            if d2 > 0
                obj.SD.DummyGrommetRot(end+1:end+d2) = zeros(d2,1);
            end 
                                    
            % MesListAct
            if size(obj.SD.MeasListAct,1) < size(obj.SD.MeasList,1)
                d = size(obj.SD.MeasListAct,1) - size(obj.SD.MeasList,1);
                if d < 0
                    obj.SD.MeasListAct(end+1:end+abs(d)) = ones(abs(d),1);
                elseif d>1
                    obj.SD.MeasListAct(end-d:end) = [];
                end
        end
        
        end
        
        
        
        
        % -------------------------------------------------------
        function CopyStim(obj, obj2)
@@ -1127,7 +1239,7 @@ classdef NirsClass < AcqDataClass & FileLoadSaveClass
        
        
        % ----------------------------------------------------------------------------------
        function b = CopyStruct(obj, s)            
        function CopyStruct(obj, s)            
            fields = propnames(obj);
            for ii = 1:length(fields)
                if eval( sprintf('isfield(s, ''%s'')', fields{ii}) )
+3 −0
Original line number Diff line number Diff line
@@ -771,6 +771,9 @@ classdef DataClass < FileLoadSaveClass
                ml = obj.measurementList;
                ml(order) = ml;
            end
            if contains(options, 'reshape')
                ml = measurementListSDpairs;
            end

            obj.SimulateErrors(d);
        end
+5 −5
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ classdef MetaDataTagsClass < FileLoadSaveClass
            obj.tags.LengthUnit = 'mm';
            obj.tags.TimeUnit = 'unknown';
            obj.tags.FrequencyUnit = 'unknown';
            obj.tags.AppName  = 'snirf-homer3';
            obj.tags.AppName  = 'homer3-DataTree';

            if nargin==1 && ~isempty(varargin{1})
                obj.SetFilename(varargin{1});
+28 −14
Original line number Diff line number Diff line
@@ -20,6 +20,10 @@ classdef ProbeClass < FileLoadSaveClass
        landmarkLabels
    end
    
    properties (Access = private)
        scaling
    end
    
    
    
    methods
@@ -28,11 +32,13 @@ classdef ProbeClass < FileLoadSaveClass
        function obj = ProbeClass(varargin)
            % Set class properties not part of the SNIRF format
            obj.SetFileFormat('hdf5');
            obj.scaling = 1;            
            
            % Set SNIRF fomat properties
            if nargin>0
                if isstruct(varargin{1})
                    SD = varargin{1};
                    n = NirsClass(varargin{1});
                    SD = n.SD;
                    obj.wavelengths = SD.Lambda;
                    obj.wavelengthsEmission  = [];
                    if isfield(SD,'SrcPos2D') &  ~isempty(SD.SrcPos2D)
@@ -250,18 +256,16 @@ classdef ProbeClass < FileLoadSaveClass
            end
            
            % Arg3
            scaling = 1;
            if exist('LengthUnit','var')
                if strcmpi(LengthUnit,'m')
                    scaling = 1000;
                elseif strcmpi(LengthUnit,'cm')
                    scaling = 10;
                % Figure out the scaling factor to multiple by to get the coorinates to be in mm units
                if strcmpi(LengthUnit,'m')  % meter units
                    obj.scaling = 100;
                elseif strcmpi(LengthUnit,'cm')  % centimeter units
                    obj.scaling = 10;
                end
            end
            
            

              
            % Error checking            
            if ~isempty(fileobj) && ischar(fileobj)
                obj.SetFilename(fileobj);
@@ -280,12 +284,12 @@ classdef ProbeClass < FileLoadSaveClass
                % Load datasets
                obj.wavelengths               = HDF5_DatasetLoad(gid, 'wavelengths');
                obj.wavelengthsEmission       = HDF5_DatasetLoad(gid, 'wavelengthsEmission');
                obj.sourcePos2D               = HDF5_DatasetLoad(gid, 'sourcePos2D', [], '2D')*scaling;
                obj.detectorPos2D             = HDF5_DatasetLoad(gid, 'detectorPos2D', [], '2D')*scaling;
                obj.landmarkPos2D             = HDF5_DatasetLoad(gid, 'landmarkPos2D', [], '2D')*scaling;
                obj.sourcePos3D               = HDF5_DatasetLoad(gid, 'sourcePos3D', [], '3D')*scaling;
                obj.detectorPos3D             = HDF5_DatasetLoad(gid, 'detectorPos3D', [], '3D')*scaling;
                obj.landmarkPos3D             = HDF5_DatasetLoad(gid, 'landmarkPos3D', [], '2D')*scaling;
                obj.sourcePos2D               = HDF5_DatasetLoad(gid, 'sourcePos2D', [], '2D') * obj.scaling;
                obj.detectorPos2D             = HDF5_DatasetLoad(gid, 'detectorPos2D', [], '2D') * obj.scaling;
                obj.landmarkPos2D             = HDF5_DatasetLoad(gid, 'landmarkPos2D', [], '2D') * obj.scaling;
                obj.sourcePos3D               = HDF5_DatasetLoad(gid, 'sourcePos3D', [], '3D') * obj.scaling;
                obj.detectorPos3D             = HDF5_DatasetLoad(gid, 'detectorPos3D', [], '3D') * obj.scaling;
                obj.landmarkPos3D             = HDF5_DatasetLoad(gid, 'landmarkPos3D', [], '2D') * obj.scaling;
                obj.frequencies               = HDF5_DatasetLoad(gid, 'frequencies');
                obj.timeDelays                 = HDF5_DatasetLoad(gid, 'timeDelays');
                obj.timeDelayWidths            = HDF5_DatasetLoad(gid, 'timeDelayWidths');
@@ -350,6 +354,16 @@ classdef ProbeClass < FileLoadSaveClass
                H5F.close(fid);
            end 
            
            % Multiple all coordinates by reciprocal of scaling factor when saving to get the 
            % coordinates back to original.
            obj.sourcePos2D    = obj.sourcePos2D / obj.scaling;
            obj.detectorPos2D  = obj.detectorPos2D / obj.scaling;
            obj.landmarkPos2D  = obj.landmarkPos2D / obj.scaling;
            obj.sourcePos3D    = obj.sourcePos3D / obj.scaling;
            obj.detectorPos3D  = obj.detectorPos3D / obj.scaling;
            obj.landmarkPos3D  = obj.landmarkPos3D / obj.scaling;
            
            % Now save
            hdf5write_safe(fileobj, [location, '/wavelengths'], obj.wavelengths, 'array');
            hdf5write_safe(fileobj, [location, '/wavelengthsEmission'], obj.wavelengthsEmission, 'array');
            hdf5write_safe(fileobj, [location, '/sourcePos2D'], obj.sourcePos2D, 'array');
+0 −1
Original line number Diff line number Diff line
@@ -516,7 +516,6 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
            LengthUnit = obj.metaDataTags.Get('LengthUnit');
            obj.probe = ProbeClass();
            err = obj.probe.LoadHdf5(fileobj, [obj.location, '/probe'], LengthUnit);
            obj.metaDataTags.Set('LengthUnit','mm');
            
            % This is a required field. If it's empty means the whole snirf object is bad
            if isempty(obj.probe)
Loading