EASYconsole.m rewrite

This commit is contained in:
2024-07-26 02:53:58 -04:00
parent 7d621c96ac
commit 3f1cd6ef0e

View File

@@ -3,24 +3,107 @@
% Updated 240724 Bryan C Roessler to improve file operations and portability % Updated 240724 Bryan C Roessler to improve file operations and portability
% %
function varargout = EASYconsole(varargin) function varargout = EASYconsole(varargin)
% initialize global variables for function EASYconsole global startDir
%global ExpOutmat global easyDir
%global ExpPath global easySuffix
%global fhconsole global scansDir
%global resDir global easyResultsDir
global wCodeDir global easyResultsDirName
%global ImParMat global matDir
global matFile
global userName
wCodeDir=pwd; % Initialize some variables from matlab
startDir=pwd;
easyPath=which(mfilename);
[easyDir,easy_filename]=fileparts(easyPath);
easyDir=fullfile(easyDir)
[parentDir, ~]=fileparts(easyDir);
userName=system('whoami');
% changing directory to wCodeDir % Set scansDir intelligently (project scans directory)
% returnStartDir % Allow users to specify a PROJECT=/mnt/data/ExpJobs/Job directory to analyze with EASY
% This better enables running the new EASY in standalone mode
if exist('PROJECT', 'env')
scansDir=get_env('PROJECT');
disp(strcat('Using project path: ', scansDir, ' from environment variable PROJECT'));
disp('This usually indicates that we are in standalone mode');
elseif exist('SCANS_DIR', 'env')
scansDir=get_env('SCANS_DIR');
disp(strcat('Using scans directory: ', scansDir, ' from environment variable SCANS_DIR'));
disp('This usually indicates that we are in module mode');
else
scansDir=fullfile(parentDir,'ExpJobs'); % relative to easy script dir
disp(strcat('Using scans directory: ', scansDir, ' from hardcoded default'));
disp('This usually indicates that we are in standalone mode');
end
disp(getenv('SCANS_DIR')); % If we don't have the EASY_SUFFIX from the module, generate it from scanDir
if exist('EASY_SUFFIX', 'env')
easySuffix=get_env('EASY_SUFFIX');
else
[dirName, ~]=fileparts(scansDir);
[date, userNameScans, easySuffix]=strsplit(dirName, '_');
% The following is handled by the workflow script that calls this module
% Reimplementing here for stand-alone mode
% While the easySuffix directory exists, increment by one and try again
if exist(easySuffix, 'dir')
oldSuffix=easySuffix
while exist(easySuffix, 'dir')
count=1;
easySuffix=strcat(oldSuffix,'.', num2str(count));
end
end
% Might as well check this too
if userName ~= userNameScans
disp('WARNING: userName does not match userNameScans');
disp("This usually means that you are attempting to run an EASY analysis on another user's project data scans");
end
% For happiness
if datestr(now, 'yyyymmdd') == date
disp("Early bird gets the worm")
end
end
%% GUI INTERFACE DESIGN %% % Helpful variables for running in workflow mode that I'll probably have to reimplement in matlab anyways for standalone mode
% beginning of GUI formation & design, see help GUI or help GUIDE in if exist('EASY_DIR','env')
% command window for more information EASY_DIR=fullfile(get_env('EASY_DIR'))
if easyDir ~= EASY_DIR % sanity check
disp("WARNING: EASY_DIR does not match this script's default EASY location");
easyDir=EASY_DIR
end
disp(strcat('Using EASY script directory: ', easyDir, ' from environment variable EASY_DIR'));
else
disp(strcat('Using EASY script directory: ', easyDir, ' from hardcoded default'));
end
if exist('EASY_RESULTS_DIR', 'env')
easyResultsDir=fullfile(get_env('EASY_RESULTS_DIR'));
disp(strcat('Using project prefix: ', easyResultsDir, ' from environment variable EASY_RESULTS_DIR'))
else
easyResultsDirName=strcat('Results_',datestr(now, 'yyyymmdd'),'_',easySuffix);
easyResultsDir=fullfile(scansDir,easyResultsDirName);
scansDir=fullfile(parent_dir,'ExpJobs') % relative to easy script dir
disp(strcat('Using project prefix: ', PROJECT_PREFIX, ' from environment variable PROJECT_PREFIX'))
end
if exist('PROJECT_USER', 'env')
if get_env('PROJECT_USER') ~= userName % sanity check
disp("WARNING: PROJECT_USER does not match the current namespace");
end
end
matDir=fullfile(easyResultsDir,'matResults');
matFile=fullfile(matDir,strcat(easyResultsDirName,'.mat'));
% Play around with making some common variables from our input data
% resDirName=fullfile(SCANS_DIR,'Results',strcat(datestr(now, 'yyyymmdd'),'_', PROJECT_SUFFIX);
% resDir=fullfile(SCANS_DIR,resDirName);
% ExpOutmat=fullfile(matDir,strcat(datestr(now,29),newExpfile));
% ExpPath=fullfile(newExppath);
% ExpFile=fullfile(matDir,)
% GUI interface design
gui_Singleton=1; gui_Singleton=1;
gui_State=struct('gui_Name', mfilename, ... gui_State=struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ... 'gui_Singleton', gui_Singleton, ...
@@ -39,21 +122,15 @@ function varargout = EASYconsole(varargin)
end end
end end
% To remove?
% Try to enter WCodeDir % Try to enter
function returnStartDir function returnStartDir
global wCodeDir global
try try
cd(wCodeDir) cd(SCANS_DIR)
catch catch
msgbox('Failed to enter selected default directory so starting search at root.'); msgbox('Failed to enter the project directory so starting search from where we started.');
if ispc cd(start_dir)
cd('C:\');
elseif (isunix || ismac)
cd('/mnt/data');
else
msgbox('Unknown platform')
end
end end
end end
@@ -65,11 +142,8 @@ end
% handles--structure with handles and user data (see GUIDATA) % handles--structure with handles and user data (see GUIDATA)
% varargin--input arguments to EASYconsole (see VARARGIN) % varargin--input arguments to EASYconsole (see VARARGIN)
function EASYconsole_OpeningFcn(hObject, ~, handles, varargin) function EASYconsole_OpeningFcn(hObject, ~, handles, varargin)
%global ExpOutmat
%global ExpPath
global fhconsole global fhconsole
global resDir global easyResultsDir
%global ImParMat
% Choose default command line output for EASYconsole % Choose default command line output for EASYconsole
handles.output = hObject; handles.output = hObject;
@@ -82,15 +156,18 @@ function EASYconsole_OpeningFcn(hObject, ~, handles, varargin)
set(fhconsole,'Toolbar','none'); set(fhconsole,'Toolbar','none');
fhconsole=gcf; fhconsole=gcf;
if exist('resDir','var')&&~isempty(resDir) % BCR this is set in the global function so I think we're good here
set(fhconsole,'Name',strcat('EASYconsole- ',char(resDir))); % easyResultsDirName=strcat('Results',datestr(now, 'yyyymmdd'),newExpfilePref);
if exist('easyResultsDir','var') && ~isempty(easyResultsDir)
set(fhconsole,'Name',strcat('EASYconsole- ',char(easyResultsDir)));
else else
set(fhconsole,'Name','EASYconsole -Exp. Analysis NOT selected.') set(fhconsole,'Name','EASYconsole -Exp. Analysis NOT selected.')
end end
end end
%% EASYconsole OUTPUT FUNCTION %% % EASYconsole OUTPUT FUNCTION %%
% Outputs from this function are returned to the command line. % Outputs from this function are returned to the command line.
% varargout--cell array for returning output args (see VARARGOUT); % varargout--cell array for returning output args (see VARARGOUT);
% hObject--handle to figure % hObject--handle to figure
@@ -114,34 +191,32 @@ end
% New Experiment Button Interface % New Experiment Button Interface
function NewExpDat_Callback(~, ~, ~) function NewExpDat_Callback(~, ~, ~)
global newExpfile
global newExppath
global SWnewExp global SWnewExp
global ExpOutmat
global ExpPath
global matDir global matDir
global resDir global matFile
global easyResultsDir
global easyResultsDirName
global fhconsole global fhconsole
global scan global scan
global userName
% put all users on same working directory
%returnStartDir
% Create a new experiment % Create a new experiment
try try
questdlg('\fontsize{20} NAME the file and NAVIGATE to the directory with the image folders.','File Creation','OK', struct('Default','OK','Interpreter','tex')); questdlg('\fontsize{20} NAME the file and NAVIGATE to the directory with the image folders.','File Creation','OK', struct('Default','OK','Interpreter','tex'));
[newExpfile,newExppath] = uiputfile(' .mat'); [inputFile,inputPath]=uiputfile('.mat');
SWnewExp=1; SWnewExp=1;
inputFileName=strrep(inputFile,'.mat','');
easyResultsDirName=strcat('Results_',datestr(now,'yyyymmdd'),'_',userName,'_',inputFileName);
% Set paths % Set paths
newExpfilePref= strrep(newExpfile,'.mat',''); scansDir=fullfile(inputPath);
resDir=fullfile(newExppath,resDirName); easyResultsDir=fullfile(scansDir,easyResultsDirName);
matDir=fullfile(newExppath,resDirName,'matResults'); matDir=fullfile(easyResultsDir,'matResults');
ExpOutmat=fullfile(matDir,strcat(datestr(now,29),newExpfile)); matFile=fullfile(matDir,strcat(datestr(now,'yyyymmdd'),'_',userName,'_',inputFile));
ExpPath=fullfile(newExppath);
%***Added for 'parfor global' to preallocate 'scan' structure 20-0123***** %***Added for 'parfor global' to preallocate 'scan' structure 20-0123*****
nlist=dir(fullfile(ExpPath,'*')); nlist=dir(fullfile(scansDir,'*'));
nnn=0; nnn=0;
for n=1:size(nlist,1) for n=1:size(nlist,1)
if (~isempty(str2num(nlist(n).name))) if (~isempty(str2num(nlist(n).name)))
@@ -154,38 +229,38 @@ function NewExpDat_Callback(~, ~, ~)
scanMax=max(str2double(sl)); scanMax=max(str2double(sl));
clear scan; clear scan;
scan(scanMax)=struct(); % changed for parfor global 20_0118 scan(scanMax)=struct(); % changed for parfor global 20_0118
save(ExpOutmat,'scan') save(matFile,'scan')
% BCR rewrote these but moved the functionality into the main workflow script % create supporting dirs
% % create supporting dirs % this is also in the workflow script but here for standalone mode
% dirs = {'PrintResults', 'CFfigs', 'Fotos', 'Fotos/BkUp'}; dirs = {'PrintResults', 'CFfigs', 'Fotos', 'Fotos/BkUp'};
% for i = 1:length(dirs) for i = 1:length(dirs)
% d = dirs{i}; d = dirs{i};
% if ~exist(fullfile(ExpPath, resDirName, d), 'dir') if ~exist(fullfile(easyResultsDir, d), 'dir')
% mkdir(fullfile(ExpPath, resDirName, d)); mkdir(fullfile(easyResultsDir, d));
% end end
% end end
% % templateDirs are stored in the easy template directory % templateDirs are stored in the easy template directory
% templates = {'figs', 'PTmats'} templates = {'figs', 'PTmats'}
% for i = 1:length(templates) for i = 1:length(templates)
% d = dirs{i}; d = dirs{i};
% if ~exist(fullfile(ExpPath, resDirName, d), 'dir') if ~exist(fullfile(easyResultsDir, d), 'dir')
% copyfile((fullfile(wCodeDir,d)), (fullfile(ExpPath,resDirName,d))); copyfile((fullfile(,d)), (fullfile(easyResultsDir,d)));
% end end
% end end
clear sbdg % reduce possible retention of a previous job sdbg clear sbdg % reduce possible retention of a previous job sdbg
sbdg= cell(1,scanMax); sbdg= cell(1,scanMax);
save((fullfile(resDir,'Fotos','Nbdg')),'sbdg'); save((fullfile(easyResultsDir,'Fotos','Nbdg')),'sbdg');
catch ME catch ME
% returnStartDir % returnStartDir
disp('Error Creating a New Experiment') disp('Error Creating a New Experiment')
end end
% set the title for fhconsole depending on existence % set the title for fhconsole depending on existence
if exist('resDir','var')&&~isempty(resDir) if exist('easyResultsDir','var')&&~isempty(easyResultsDir)
set(fhconsole,'Name',strcat('EASYconsole- ',char(resDir))) set(fhconsole,'Name',strcat('EASYconsole- ',char(easyResultsDir)))
else else
set(fhconsole,'Name','EASYconsole -Exp. Analysis NOT selected.') set(fhconsole,'Name','EASYconsole -Exp. Analysis NOT selected.')
end end
@@ -194,78 +269,65 @@ end
% Load a previous experiment % Load a previous experiment
function LoadDatFile_Callback(~, ~, ~) function LoadDatFile_Callback(~, ~, ~)
global openExpfile
global openExppath
global SWnewExp global SWnewExp
global ExpOutmat
global ExpPath
global matDir global matDir
global resDir global matFile
global easyResultsDir
global easyPath
global fhconsole global fhconsole
%global ImParMat %global ImParMat
% TODO this entire try block needs work
try try
% TODO this whole block is highly questionable
questdlg('\fontsize{20} Load file from ExpJobs/YourJob/YourResults/matResults','File Creation','OK', struct('Default','OK','Interpreter','tex')); questdlg('\fontsize{20} Load file from ExpJobs/YourJob/YourResults/matResults','File Creation','OK', struct('Default','OK','Interpreter','tex'));
[openExpfile,openExppath] = uigetfile('.mat','Open Experiment folder and data storage .mat file name','MultiSelect','off'); [inputFile,inputPath]=uigetfile('.mat','Open Experiment folder and data storage .mat file name','MultiSelect','off');
SWnewExp=0; SWnewExp=0;
ExpOutmat= fullfile(openExppath,openExpfile); matDir=fullfile(inputPath)
load(ExpOutmat); matFile=fullfile(inputPath,inputFile);
resdir=fullfile('../',openExppath) load(matFile);
ExpPath=fullfile('../../',openExppath) easyResultsDir=fullfile(matDir,'..')
scansDir=fullfile(matDir,'..', '..')
if isfolder(fullfile(openExppath, '..','..','1')) %If Inovation Vrobot Then if isfolder(fullfile(matDir, '..','..','1')) % If Inovation Vrobot Then
if exist(fullfile(resDir,'PTmats','NImParameters.mat'), 'file') if exist(fullfile(easyResultsDir,'PTmats','NImParameters.mat'), 'file')
load(fullfile(resDir,'PTmats','NImParameters.mat')); load(fullfile(easyResultsDir,'PTmats','NImParameters.mat'));
else else
curDir=pwd; load(fullfile(easyPath,'NImParameters.mat'));
returnStartDir
load NImParameters.mat
cd(curDir)
end end
else % If Epson 10Plate Scans Then> else % If Epson 10Plate Scans Then>
if exist(fullfile(resDir,'PTmats','ImParameters.mat'), 'file') if exist(fullfile(easyResultsDir,'PTmats','ImParameters.mat'), 'file')
load(fullfile(resDir,'PTmats','ImParameters.mat')); load(fullfile(easyResultsDir,'PTmats','ImParameters.mat'));
else else
curDir=pwd; load(fullfile(easyPath,'ImParameters.mat'));
returnStartDir
load ImParameters.mat
cd(curDir)
end end
end end
mkdir(fullfile(openExppath,'\BkUp')); mkdir(fullfile(matDir,'BkUp'));
% create supporting dirs
% dirs = {'PrintResults', 'figs', 'CFfigs', 'PTmats', 'Fotos'}
% for i = 1:length(dirs)
% d = dirs{i}
% if ~exist(fullfile(resDir, d), 'dir')
% mkdir(fullfile(resDir, d));
% end
% end
% Create supporting dirs
dirs = {'PrintResults', 'figs', 'CFfigs', 'PTmats', 'Fotos'}
for i = 1:length(dirs)
d = dirs{i}
if ~exist(fullfile(easyResultsDir, d), 'dir')
mkdir(fullfile(easyResultsDir, d));
end
end
catch catch
returnStartDir returnStartDir
end end
clear scan clear scan
if exist('resDir','var')&&~isempty(resDir) if exist('easyResultsDir','var') && ~isempty(easyResultsDir)
fhconsole=gcf; fhconsole=gcf;
set(fhconsole,'Name',strcat('EASYconsole- ',char(resDir))) set(fhconsole,'Name',strcat('EASYconsole- ',char(easyResultsDir)))
else else
set(fhconsole,'Name','EASYconsole -Exp. Analysis NOT selected.') set(fhconsole,'Name','EASYconsole -Exp. Analysis NOT selected.')
end end
end end
%% CALLBACKS %% %% CALLBACKS %%
% callback for the 'Run' in the dropdown menu % callback for the 'Run' in the dropdown menu
function run_Callback(~, ~, ~) function run_Callback(~, ~, ~)
end end
function runPlateMapPintool_Callback(~, ~, ~) function runPlateMapPintool_Callback(~, ~, ~)
@@ -296,7 +358,7 @@ function runPlateImAnal_Callback(~, ~, ~)
end end
function PlateCFit_Callback(~, ~, ~) function PlateCFit_Callback(~, ~, ~)
%global ExpOutmat % global matFile % TODO BCR not sure if needed
try try
NCstart NCstart
catch ME catch ME
@@ -311,7 +373,6 @@ function uploadExcelMP2DB_Callback(~, ~, ~)
end end
function runDMPexcel_Callback(~, ~, ~) function runDMPexcel_Callback(~, ~, ~)
global ExpPath
try try
DMPexcel2mat_2024winLinix %DMPexcel2mat_2023winLinix DMPexcel2mat_2024winLinix %DMPexcel2mat_2023winLinix
catch ME catch ME
@@ -321,13 +382,11 @@ function runDMPexcel_Callback(~, ~, ~)
end end
function runResults_DBcombo_Callback(~, ~, ~) function runResults_DBcombo_Callback(~, ~, ~)
try try
DgenResults240430 %similar but semicolons removed to restore so cmdLine display info. DgenResults240430 %similar but semicolons removed to restore so cmdLine display info.
%Dgen241010qhtcp %par4global -convert 1x1cell of 384cells to be like previous 1x384 cells CFparameter %Dgen241010qhtcp %par4global -convert 1x1cell of 384cells to be like previous 1x384 cells CFparameter
catch ME catch ME
disp('Error in DgenResults240430') disp('Error in DgenResults240430')
returnStartDir
EASYconsole EASYconsole
end end
end end
@@ -340,7 +399,6 @@ function runOverlayPlots_Callback(~, ~, ~)
DoverlayPlots2 DoverlayPlots2
EASYconsole EASYconsole
catch ME catch ME
returnStartDir
EASYconsole EASYconsole
end end
end end
@@ -350,7 +408,6 @@ function runFotoStrip_Callback(~, ~, ~)
F_NImStartup_CentCir F_NImStartup_CentCir
EASYconsole EASYconsole
catch ME catch ME
returnStartDir
EASYconsole EASYconsole
end end
end end
@@ -359,7 +416,6 @@ function runDisplayFig_Callback(~, ~, ~)
try try
UfigDisplay UfigDisplay
catch ME catch ME
returnStartDir
EASYconsole EASYconsole
end end
end end
@@ -367,7 +423,6 @@ end
function runViewParameters_Callback(~, ~, ~) function runViewParameters_Callback(~, ~, ~)
try try
catch ME catch ME
returnStartDir
EASYconsole EASYconsole
end end
end end
@@ -376,7 +431,6 @@ function QkviewN_Callback(~, ~, ~)
try try
QkviewImages QkviewImages
catch ME catch ME
returnStartDir
EASYconsole EASYconsole
end end
end end
@@ -384,10 +438,8 @@ end
function CFdisplay_Callback(~, ~, ~) function CFdisplay_Callback(~, ~, ~)
try try
NCsingleDisplay NCsingleDisplay
returnStartDir
EASYconsole EASYconsole
catch ME catch ME
returnStartDir
EASYconsole EASYconsole
end end
end end