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

Merging development into master for upcoming release (#82)



* v1.32.4

-- Fix some bugs in path utils functions
-- More improvements in build/installation process

* Update probe class to save and load 3D landmarks

* Update probe class to work with old SD files

* v1.32.4

-- Copy versoin number for Homer3 from AV

* -- Fix small bug in setpaths(0) paths removal

* CCA shrinkage back on

* Update hmrR_PreprocessIntensity_Negative.m

quick fix on negative value check

* v1.32.5

-- Fix issue with tCCA user functions not being loaded into function registry
-- Set data tree structure display in MainGUI to include the group name display unconditionally. In some instances the group name did not show if the all subjects had only one run.

* Update hmrR_PreprocessIntensity_Negative.m

Function to include zero values.

* v1.32.5

-- Sync DataTree and Utils with AtlasViewer

* v1.32.7

-- Add more robust error checking to exclude .snirf files that can't load DataClass.m
-- Add better error checking to DataClass and MeasListClass

* Create shared code and submodule references to DataTree and Utils (#74)

* -- Move DataTree and some Utils functions to independent submodules used by AtlasViewer and Homer3

* Add config file to DataTree and ability to load mutiple config files to config utility

Add config file to DataTree and ability to load mutiple config files to config utility

* Relink submodule references from jayd1860 to BUNPC

* Fix submodule download not working on linux when initializing repo with setpaths. Needed to disable git certificate verification when executing 'git submodule update' from matlab

* -- Add tool to setpaths to be able to download submodules without having git installed.

* -- Change code to setpaths not to initialize submodules every toime it is run. Add option to 'update' submodules to get latest changes.

* ISSUE_TEMPLATE folder (#77)

* Fix setpaths issue on MAC where the initialization of submodules causes setpaths to hang waiting for user to press ENTER because the system command running 'git branch' executes in its own shell. Setting the TERM=ansi seems to fix this issue.

* -- Add .gitignore file to simplify and clatrify git status output

* -- In previous commit didn't entirely fix issue with setpaths waiting for user input on MAC. Need to parse and remove garbage output correctly too

* Just use Snirf style GetAux to display aux data (#75)

* -- Set origin of submodules to be same as parent repo to follow paradigm of submodules and parent repo being one code (#78)

-- Fix submodule download in setpaths without git not working because setpaths options are not parsed correctly.
-- Clean up and remove obsolete files

* -- Fix issue in setpaths when attempting to download submodules using the non-git method. Assumtion that Github creates empty folder as placeholders for submodules when downloading using the "Download ZIP" option is not always true. Sometimes it creates empty folder, somtimes it doesn't. So isemptyFolder doesn't work when folder is not created. Added code to create empty submodule folder placeholder when it is missing.

-- Clean up: remove more obsolete files

* -- Fix typo

* -- Fix issue with setpaths submodules when there's a partial submodules download because of a previous error then need to clean uo submodule folders so there's no garbage in there then retry downloading.

* -- Greatly simplify and make it more straighfoward the setpaths process.
-- Add .numberfiles to submodules and check during setpaths process to make sure an incomplete download is detected and triggers a clean download.

* -- Fix setpaths error exception on linux and mac because ls([pathname, '*.m']) works differently on those platform than on Windows when there are NO files matching the specified pattern. Use dir instead of ls to fix this.
-- Fix multiple issues in submodule downloading using non-git method.
-- When user click cancel in response to download fail dialog, quit rather than retry.
-- Add search paths ONLY for the submodules that were successfully installed
-- Fix typos in dialog failed download message

* -- a) Fix setpaths bug in removeFolderContents.m on linux and MAC because the delimiter for path string is ':' not ';' as it is on Winodws. b) On linux the gitSetBranch.m used to get latest branch revis

* Fix setpaths('update') not working.

* -- Fix problems in setpaths with creating new submodule branches

-- Fix issue in setpaths with non-git submodule download and install.
   a) Fix some bugs and typos preventing correct download.
   b) Clean up and delete downloaded submodules files which are no longer needed after installation like the zip file and initial unzipped folder
   c) Clarify input dialog message and try to guess and or suggest the correct branch that matches parent repo

-- Add exception handling to setpaths. in case of error return to original folder

-- Add comprehensive help comments to setpaths describing it's use

* -- Don't add current app twice. Check app include list to see if it already has been added to search paths

* Glm fixes (#80)

- GLM docs fixes

- Convolve HRFs with stim duration before export

* -- In setpaths exclude more folders to avoid problems and headaches with unexpected matlab behavior because of inclusion of weird .m files from a build of AV. So for instance exclude *.app and *_install folders which contain a large amount of files which should never be included in matlab search paths.
-- Add ability to findDotMFolders to exclude folders based on wildcard patterns rather than only explicit names. This allows exclusion of many folders that fit a pattern without having to explicitly list ALL of them
-- Fix several bugs in the build for MAC
-- Finally fixed the requirement that you have to run MAC installation specifically from ~/Downloads/homer3_install. Added code to makesetup.pl to create a more intelligent setup.command which does not depend on execution from a specific folder.

* -- Fix build not working because need to copy ALL config files to installation folder
-- Improve launch performance by changing config file access to global variable

Co-authored-by: default avatarjayd1860 <jayd1860@gmail.com>
Co-authored-by: default avatarsreekanthkura7 <sreekanth.kura7@gmail.com>
Co-authored-by: default avatarMeryem Ayse Yucel <49535526+mayucel@users.noreply.github.com>
Co-authored-by: default avatarJay Dubb <jdubb@scc1.bu.edu>
Co-authored-by: default avatarstephen scott tucker <sstucker@bu.edu>
Co-authored-by: default avatarJay Dubb <jayd1860@github.com>
parent 170e4563
Loading
Loading
Loading
Loading

.gitignore

0 → 100644
+4 −0
Original line number Diff line number Diff line
*.log
LastCheckForUpdates.dat
FuncRegistry/UserFunctions/Registry.mat
*.snirf

.gitmodules

0 → 100644
+8 −0
Original line number Diff line number Diff line
[submodule "Utils/Shared"]
	path = Utils/Shared
	url = https://github.com/BUNPC/Utils
	branch = development
[submodule "DataTree"]
	path = DataTree
	url = https://github.com/BUNPC/DataTree
	branch = development
+0 −31
Original line number Diff line number Diff line

% Processing Stream Config File # 
processOpt_default.cfg

% Regression Test Active # true, false
false

% Include Archived User Functions # Yes, No
No

% Default Processing Stream Style # SNIRF, NIRS
SNIRF

% Logging # On, Off
On

% Check For Updates # on, off
on

% Data Storage Scheme # files, memory
files

% Auto Save Acquisition Files # No, Yes
No

% Group Data Loading Warnings # don't ask again, ask every time
don't ask again

% Stim Edit GUI Save Warnings # don't ask again, ask every time
don't ask again

% Output Folder Name # 
homerOutput

% Output File Name # 
groupResults.mat

% Fix File Name Conflicts # don't ask again, ask every time
ask every time

% END
Original line number Diff line number Diff line
Subproject commit 25e07119db1607bd4d5d7ae440dbde310e1dd6a6
+0 −255
Original line number Diff line number Diff line
classdef AcqDataClass < matlab.mixin.Copyable
       
    properties (Access = private)
        logger
    end
    properties (Access = public)
        errmsgs
    end
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % These methods must be implemented in any derived class
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    methods(Abstract)
        
        % ---------------------------------------------------------
        objnew    = GetFormatVersion(obj, options);

        % ---------------------------------------------------------
        val       = GetFormatVersionString(obj);
   
        % ---------------------------------------------------------
        t         = GetTime(obj, iBlk)
       
        % ---------------------------------------------------------
        datamat   = GetDataTimeSeries(obj, options, iBlk)
        
        % ---------------------------------------------------------
        SD        = GetSDG(obj,option)

        % ---------------------------------------------------------
        srcpos    = GetSrcPos(obj,option)

        % ---------------------------------------------------------
        detpos    = GetDetPos(obj,option)
        
        % ---------------------------------------------------------
        ml        = GetMeasList(obj, iBlk)


        % ---------------------------------------------------------
        wls       = GetWls(obj)
        
        % ---------------------------------------------------------
        SetStims_MatInput(obj, s, t, CondNames)
        
        % ---------------------------------------------------------
        s         = GetStims(obj, t)

        % ---------------------------------------------------------
        CondNames = GetConditions(obj)


        % ---------------------------------------------------------
        SetConditions(obj, CondNames)
        
        % ---------------------------------------------------------
        aux       = GetAuxiliary(obj)
        
        % ---------------------------------------------------------
        SetStimDuration(obj, icond, duration);
        
        % ---------------------------------------------------------
        duration = GetStimDuration(obj, icond);
        
        % ---------------------------------------------------------
        n = GetDataBlocksNum(obj);

        % ---------------------------------------------------------
        [iDataBlks, ich] = GetDataBlocksIdxs(obj, ich);
        
        % ---------------------------------------------------------
        objnew = CopyMutable(obj, options);

    end
    
    
    methods
        
        % -------------------------------------------------------
        function Initialize(obj)
            global logger
            obj.logger = InitLogger(logger);
        end
        
        
        % -------------------------------------------------------
        function err = Error(obj)
            err = obj.GetError();
        end
        
        
        % ---------------------------------------------------------
        function msg = GetErrorMsg(obj)
            msg = '';
            if isempty(obj)
                msg = 'AcqDataClass object is empty';
                return;
            end
            if isempty(obj.errmsgs)
                return;
            end
            if ~obj.GetError()
                return;
            end
            msg = obj.errmsgs{abs(obj.GetError())};
        end
        
        
        % -------------------------------------------------------
        function FreeMemory(obj, filename)
            if ~exist('filename','var')
                filename = '';
            end
            if isempty(filename)
                return;
            end            
            obj.Initialize();
        end
        
        
        % ---------------------------------------------------------
        function bbox = GetSdgBbox(obj)
            bbox = [];
            
            optpos = [obj.GetSrcPos('2D'); obj.GetDetPos('2D')];
            if isempty(optpos)
                return
            end
            
            xmax = max(optpos(:,1));
            ymax = max(optpos(:,2));

            xmin = min(optpos(:,1));
            ymin = min(optpos(:,2));
            
            width = xmax-xmin;
            height = ymax-ymin;
            
            if width==0
                width = 1;
            end
            if height==0
                height = 1;
            end
            
            px = width * 0.05; 
            py = height * 0.05; 

            bbox = [xmin-px, xmax+px, ymin-py, ymax+py];
        end
        
        
        % ----------------------------------------------------------------------------------
        function varval = GetVar(obj, varname)
            if ismethod(obj,['Get_', varname])
                varval = eval( sprintf('obj.Get_%s()', varname) );
            elseif ismethod(obj,['Get', varname])
                varval = eval( sprintf('obj.Get%s()', varname) );
            elseif isproperty(obj, varname)
                varval = eval( sprintf('obj.%s', varname) );
            else
                varval = [];
            end
            
            % If varval is a class object with an IsEmpty() method and length of varval is one or 
            % less, then use it determine whether it's valid. If not, return empty as if it were 
            % really empty. This is useful when we want to copy only part of an object to save on space. 
            % For instance to reconstruct nirs style 's' variable from a SNIRF stim object we need the t 
            % property from a SNIRF data container, but we only need that one property not the whole thing
            % so we initilize only the t property. We don't want this partially initialized data object 
            % to be found (by GetVar) and used directly in the proc stream processing, we only want to use 
            % indirectly to retrieve s from stim. So we do this check to see if it's valid. It won't be 
            % since it's only partially initialized.
            if isa(varval, 'handle') && ismethod(varval,'IsEmpty')
                if length(varval)==1 && varval(1).IsEmpty()
                    varval = [];
                end
            end
        end
        
        
        % ----------------------------------------------------------------------------------
        function t = GetTimeCombined(obj)
            % Function combines the time vectors for all data blocks into one time vectors. 
            t = obj.GetTime(1);
            tStart = t(1);
            tEnd   = t(end);
            tStep  = mean(diff(t));
            
            nBlks = obj.GetDataBlocksNum();
            for iBlk=2:nBlks
                t = obj.GetTime(iBlk);
                if t(1) < tStart
                    tStart = t(1);
                end
                if t(end) > tEnd
                    tEnd = t(end);
                end
                if mean(diff(t)) < tStep
                    tStep = mean(diff(t));
                end
            end
            t = tStart:tStep:tEnd;            
        end
        
                
        % ----------------------------------------------------------------------------------
        function data = GetStimData(~, ~)
            data = [];
        end
        
        
        % ----------------------------------------------------------------------------------
        function val = GetStimDataLabels(~, ~)
            val = {};
        end
                        
        
        % ----------------------------------------------------------------------------------
        function b = equal(obj, obj2)
            b = true;
            if isempty(obj.GetFilename)
                return;
            end
            if isempty(obj2.GetFilename)
                return;
            end
            [~, fname1, ext1] = fileparts(obj.GetFilename);
            [~, fname2, ext2] = fileparts(obj2.GetFilename);            
            if ~strcmpi([fname1, ext1], [fname2, ext2])
                b = false;
            end
        end
        
        
        % ----------------------------------------------------------------------------------
        function status = Mismatch(obj, obj2)
            status = 0;
            msg = {};
            if ~exist('obj2','var')
                return;
            end
            if ~obj.equal(obj2)
                [~, fname, ext] = fileparts(obj.GetFilename);
                msg{1} = sprintf('WARNING: The acquisition file "%s" does not match the derived data in this group folder. ', [fname, ext]);
                msg{2} = sprintf('Are you sure this acquisition file belongs in this group folder?');
                obj.logger.Write([msg{:}])
            end
        end
        
        
        
    end
    
end
Loading