Commit 24fee309 authored by Jay Dubb's avatar Jay Dubb
Browse files

v1.20.5

-- Update MetaDataTagsClass to agree with latest SNIRF spec adding new required field FrequencyUnit.
-- Instead of formatVersion use metaDataTags required field FrequencyUnit to determine whether old SnirfDataSet is being loaded.
-- Update probe to match latest Spec, add landmarkPos3D and it's alias landmarkPos, sourcePos3D and detectorPos3D, aliases sourcePos and detectorPos to stand for sourcePos2D and detectorPos2D
-- Allow both /nirs and /nirs1, /nirs2, etc to be root HDF5 groups of multiple SNIRF subject datasets.
-- Update GroupClass version because groupResults should change when acquired data format changes
parent b71f10e1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@ end
try
    gid = H5G.open(fid, location);
catch
    gid = -1;
    gid.double = -1;
end

+24 −0
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@ classdef MetaDataTagsClass < FileLoadSaveClass
            obj.tags.MeasurementTime = datestr(now,'hh:mm:ss');
            obj.tags.LengthUnit = 'mm';
            obj.tags.TimeUnit = 'unknown';
            obj.tags.FrequencyUnit = 'unknown';
            obj.tags.AppName  = 'snirf-homer3';
            obj.tags.SnirfDraft = '3';
            
            if nargin==1
                obj.filename = varargin{1};
@@ -56,6 +59,8 @@ classdef MetaDataTagsClass < FileLoadSaveClass
            %%%%%%%%%%%% Ready to load from file

            try
                % Reset tags
                obj.tags = struct();
                
                % Open group
                [gid, fid] = HDF5_GroupOpen(fileobj, location);
@@ -68,6 +73,9 @@ classdef MetaDataTagsClass < FileLoadSaveClass
                
                HDF5_GroupClose(fileobj, gid, fid);

                % Detect old or invalid metadatatag data
                assert(obj.IsValid());
                
            catch
                
                err = -1;
@@ -102,6 +110,22 @@ classdef MetaDataTagsClass < FileLoadSaveClass
        end
        
        
        
        % -------------------------------------------------------
        function b = IsValid(obj)
            b = false;
            
            % Use latest required fields to determine if we're loading old
            % metaDataTag format version of SNIRF spec
            if ~isproperty(obj.tags, 'FrequencyUnit')
                return;
            end
            
            b = true;
        end

        
        
        % -------------------------------------------------------
        function B = eq(obj, obj2)
            B = false;
+45 −3
Original line number Diff line number Diff line
@@ -5,6 +5,9 @@ classdef ProbeClass < FileLoadSaveClass
        wavelengthsEmission
        sourcePos2D
        detectorPos2D
        landmarkPos2D
        sourcePos3D
        detectorPos3D
        frequencies
        timeDelay
        timeDelayWidth
@@ -13,6 +16,7 @@ classdef ProbeClass < FileLoadSaveClass
        correlationTimeDelayWidth
        sourceLabels
        detectorLabels
        landmarkLabels
    end
    
    
@@ -31,6 +35,8 @@ classdef ProbeClass < FileLoadSaveClass
                    obj.wavelengthsEmission  = [];
                    obj.sourcePos2D  = SD.SrcPos;
                    obj.detectorPos2D  = SD.DetPos;
                    obj.sourcePos3D  = [];
                    obj.detectorPos3D  = [];
                    obj.frequencies  = 1;
                    obj.timeDelay  = 0;
                    obj.timeDelayWidth  = 0;
@@ -52,6 +58,8 @@ classdef ProbeClass < FileLoadSaveClass
                obj.wavelengthsEmission  = [];
                obj.sourcePos2D  = [];
                obj.detectorPos2D  = [];
                obj.sourcePos3D  = [];
                obj.detectorPos3D  = [];
                obj.frequencies  = 1;
                obj.timeDelay  = 0;
                obj.timeDelayWidth  = 0;
@@ -77,6 +85,21 @@ classdef ProbeClass < FileLoadSaveClass

        
        
        % -------------------------------------------------------
        function BackwardCompatibility(obj)
            if isempty(obj.sourcePos2D)
                obj.sourcePos2D   = HDF5_DatasetLoad(gid, 'sourcePos', [], '2D');
            end
            if isempty(obj.detectorPos2D)
                obj.detectorPos2D = HDF5_DatasetLoad(gid, 'detectorPos', [], '2D');
            end
            if isempty(obj.landmarkPos2D)
                obj.landmarkPos2D = HDF5_DatasetLoad(gid, 'landmarkPos', [], '2D');
            end
        end

        
        
        % -------------------------------------------------------
        function err = LoadHdf5(obj, fileobj, location)
            err = 0;
@@ -113,6 +136,9 @@ classdef ProbeClass < FileLoadSaveClass
                obj.wavelengthsEmission       = HDF5_DatasetLoad(gid, 'wavelengthsEmission');
                obj.sourcePos2D               = HDF5_DatasetLoad(gid, 'sourcePos2D', [], '2D');
                obj.detectorPos2D             = HDF5_DatasetLoad(gid, 'detectorPos2D', [], '2D');
                obj.landmarkPos2D             = HDF5_DatasetLoad(gid, 'landmarkPos2D', [], '2D');
                obj.sourcePos3D               = HDF5_DatasetLoad(gid, 'sourcePos3D', [], '2D');
                obj.detectorPos3D             = HDF5_DatasetLoad(gid, 'detectorPos3D', [], '2D');
                obj.frequencies               = HDF5_DatasetLoad(gid, 'frequencies');
                obj.timeDelay                 = HDF5_DatasetLoad(gid, 'timeDelay');
                obj.timeDelayWidth            = HDF5_DatasetLoad(gid, 'timeDelayWidth');
@@ -121,6 +147,7 @@ classdef ProbeClass < FileLoadSaveClass
                obj.correlationTimeDelayWidth = HDF5_DatasetLoad(gid, 'correlationTimeDelayWidth');
                obj.sourceLabels              = HDF5_DatasetLoad(gid, 'sourceLabels', obj.sourceLabels);
                obj.detectorLabels            = HDF5_DatasetLoad(gid, 'detectorLabels', obj.detectorLabels);
                obj.landmarkLabels            = HDF5_DatasetLoad(gid, 'landmarkLabels', obj.landmarkLabels);
                                
                % Close group
                HDF5_GroupClose(fileobj, gid, fid);
@@ -136,6 +163,7 @@ classdef ProbeClass < FileLoadSaveClass
        end

        
        
        % -------------------------------------------------------
        function SaveHdf5(obj, fileobj, location)
            % Arg 1
@@ -251,6 +279,20 @@ classdef ProbeClass < FileLoadSaveClass
            end
        end
        
        
        % ----------------------------------------------------------------------------------
        function b = IsEmpty(obj)
            b = true;
            if isempty(obj.wavelengths)
                return;
            end
            if isempty(obj.sourcePos2D) && isempty(obj.detectorPos2D) && ...
                    isempty(obj.sourcePos3D) && isempty(obj.detectorPos3D) 
                return;
            end
            b = false;
        end
        
    end
    
end
+71 −16
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
        fid
        gid
        location
        nirsdatanum
        nirs_tb;        
    end
    
@@ -64,7 +65,7 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
            %
             
            % Initialize properties from SNIRF spec 
            obj.formatVersion = '1.1';
            obj.formatVersion = '1.0';
            obj.metaDataTags   = MetaDataTagsClass().empty();
            obj.data           = DataClass().empty();
            obj.stim           = StimClass().empty();
@@ -73,6 +74,7 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
            
            % Set class properties NOT part of the SNIRF format
            obj.fileformat = 'hdf5';
            obj.nirsdatanum = 1;
            obj.location = '/nirs';
            
            % See if we're loading .nirs data format
@@ -91,7 +93,6 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
            % because of all the variations of calling this class constructor but 
            % there should be a simpler way to do this 
            
            % The basic 5 of a .nirs format in a struct
            if nargin==1 || (nargin==2 && isa(varargin{2}, 'double'))
                if isa(varargin{1}, 'SnirfClass')
                    obj.Copy(varargin{1});
@@ -100,7 +101,12 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
                
                if ischar(varargin{1})
                    obj.filename = varargin{1};
                    if nargin==2
                        obj.nirsdatanum = varargin{2};
                    end
                    obj.Load(varargin{1});
                    
                % The basic 5 of a .nirs format in a struct
                elseif isstruct(varargin{1}) || isa(varargin{1}, 'NirsClass')
                    tfactors = 1;    % Debug simulation parameter
                    if nargin==2
@@ -229,6 +235,40 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
        end
        
        
        
        % -------------------------------------------------------
        function err = SetLocation(obj)
            err = 0;
            gid1 = HDF5_GroupOpen(obj.fid, sprintf('%s%d', obj.location, obj.nirsdatanum));
            gid2 = HDF5_GroupOpen(obj.fid, obj.location);
            
            if gid1.double > 0
                obj.location = sprintf('%s%d', obj.location, obj.nirsdatanum);
                return;
            elseif gid2.double > 0
                return;
            end
            err = -1;
        end
        
        
        

        % -------------------------------------------------------        
        function err = LoadFormatVersion(obj)
            err = 0;
            formatVersionFile = HDF5_DatasetLoad(obj.gid, 'formatVersion'); %#ok<*PROPLC>
            formatVersionFile = str2double(formatVersionFile);
            formatVersionCurr = str2double(obj.formatVersion);
            if formatVersionFile < formatVersionCurr
                fprintf('Warning: Current SNIRF version is %0.1f. Cannot load older version (%0.1f) file. Backward compatibility not yet implemented ...\n', formatVersionCurr, formatVersionFile)
                err = -2;
                return
            end
        end
        
        
        
        % -------------------------------------------------------
        function err = LoadMetaDataTags(obj, fileobj)
            err = 0;
@@ -294,6 +334,7 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
        end
        
        
        
        % -------------------------------------------------------
        function err = LoadAux(obj, fileobj)
            err = 0;
@@ -315,6 +356,7 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
        end
        
        
        
        % -------------------------------------------------------
        function err = LoadHdf5(obj, fileobj, ~)
            err = 0;
@@ -343,30 +385,43 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
                % Open group
                [obj.gid, obj.fid] = HDF5_GroupOpen(fileobj, '/');
                
                if obj.SetLocation() < 0
                    err = -1;
                    return
                end
                
                %%%% Load formatVersion
                formatVersionFile = HDF5_DatasetLoad(obj.gid, 'formatVersion'); %#ok<*PROPLC>
                formatVersionFile = str2double(formatVersionFile);
                formatVersionCurr = str2double(obj.formatVersion); 
                if formatVersionFile < formatVersionCurr
                    fprintf('Warning: Current SNIRF version is %0.1f. Cannot load older version (%0.1f) file. Backward compatibility not yet implemented ...\n', formatVersionCurr, formatVersionFile)
                if obj.LoadFormatVersion() < 0
                    err = -2;
                    return 
                    return;
                end
                
                %%%% Load metaDataTags
                obj.LoadMetaDataTags(obj.fid);
                if obj.LoadMetaDataTags(obj.fid) < 0
                    err = -3;
                    return;
                end
                
                %%%% Load data
                obj.LoadData(obj.fid);
                if obj.LoadData(obj.fid) < 0
                    err = -4;
                end
                
                %%%% Load stim
                obj.LoadStim(obj.fid);
                if obj.LoadStim(obj.fid)
                    err = -5;
                end
                
                %%%% Load probe
                obj.LoadProbe(obj.fid);
                if obj.LoadProbe(obj.fid)
                    err = -6;
                end
                
                %%%% Load aux
                obj.LoadAux(obj.fid);
                if obj.LoadAux(obj.fid)
                    err = -7;
                end
                    
            
                % Close group
                HDF5_GroupClose(fileobj, obj.gid, obj.fid);
@@ -1072,10 +1127,10 @@ classdef SnirfClass < AcqDataClass & FileLoadSaveClass
            if isempty(obj)
                return;
            end
            if isempty(obj.data)
            if isempty(obj.data) || (isa(obj.data, 'DataClass') && obj.data(1).IsEmpty())
                return;
            end
            if isempty(obj.probe)
            if isempty(obj.data) || (isa(obj.probe, 'ProbeClass') && obj.probe.IsEmpty())
                return;
            end
            b = false;
+2 −2
Original line number Diff line number Diff line
@@ -266,8 +266,8 @@ if __name__ == "__main__":
    if len(sys.argv) > 1:
        filenames[0] =  sys.argv[1]
    else:
        filenames = glob.glob('../../../../snirf-samples/basic/*.snirf')
        # filenames = glob.glob('./Examples/*.snirf')
        # filenames = glob.glob('../../../../snirf-samples/basic/*.snirf')
        filenames = glob.glob('./Examples/*.snirf')

    for ii in range(0, len(filenames)):
        sys.stdout.write('======================================================================\n')
Loading