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
%
function varargout = EASYconsole(varargin)
% initialize global variables for function EASYconsole
%global ExpOutmat
%global ExpPath
%global fhconsole
%global resDir
global wCodeDir
%global ImParMat
global startDir
global easyDir
global easySuffix
global scansDir
global easyResultsDir
global easyResultsDirName
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
% returnStartDir
% Set scansDir intelligently (project scans directory)
% 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 %%
% beginning of GUI formation & design, see help GUI or help GUIDE in
% command window for more information
% Helpful variables for running in workflow mode that I'll probably have to reimplement in matlab anyways for standalone mode
if exist('EASY_DIR','env')
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_State=struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
@@ -39,21 +122,15 @@ function varargout = EASYconsole(varargin)
end
end
% Try to enter WCodeDir
% To remove?
% Try to enter
function returnStartDir
global wCodeDir
global
try
cd(wCodeDir)
cd(SCANS_DIR)
catch
msgbox('Failed to enter selected default directory so starting search at root.');
if ispc
cd('C:\');
elseif (isunix || ismac)
cd('/mnt/data');
else
msgbox('Unknown platform')
end
msgbox('Failed to enter the project directory so starting search from where we started.');
cd(start_dir)
end
end
@@ -65,11 +142,8 @@ end
% handles--structure with handles and user data (see GUIDATA)
% varargin--input arguments to EASYconsole (see VARARGIN)
function EASYconsole_OpeningFcn(hObject, ~, handles, varargin)
%global ExpOutmat
%global ExpPath
global fhconsole
global resDir
%global ImParMat
global easyResultsDir
% Choose default command line output for EASYconsole
handles.output = hObject;
@@ -82,15 +156,18 @@ function EASYconsole_OpeningFcn(hObject, ~, handles, varargin)
set(fhconsole,'Toolbar','none');
fhconsole=gcf;
if exist('resDir','var')&&~isempty(resDir)
set(fhconsole,'Name',strcat('EASYconsole- ',char(resDir)));
% BCR this is set in the global function so I think we're good here
% easyResultsDirName=strcat('Results',datestr(now, 'yyyymmdd'),newExpfilePref);
if exist('easyResultsDir','var') && ~isempty(easyResultsDir)
set(fhconsole,'Name',strcat('EASYconsole- ',char(easyResultsDir)));
else
set(fhconsole,'Name','EASYconsole -Exp. Analysis NOT selected.')
end
end
%% EASYconsole OUTPUT FUNCTION %%
% EASYconsole OUTPUT FUNCTION %%
% Outputs from this function are returned to the command line.
% varargout--cell array for returning output args (see VARARGOUT);
% hObject--handle to figure
@@ -114,34 +191,32 @@ end
% New Experiment Button Interface
function NewExpDat_Callback(~, ~, ~)
global newExpfile
global newExppath
global SWnewExp
global ExpOutmat
global ExpPath
global matDir
global resDir
global matFile
global easyResultsDir
global easyResultsDirName
global fhconsole
global scan
% put all users on same working directory
%returnStartDir
global userName
% Create a new experiment
try
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;
inputFileName=strrep(inputFile,'.mat','');
easyResultsDirName=strcat('Results_',datestr(now,'yyyymmdd'),'_',userName,'_',inputFileName);
% Set paths
newExpfilePref= strrep(newExpfile,'.mat','');
resDir=fullfile(newExppath,resDirName);
matDir=fullfile(newExppath,resDirName,'matResults');
ExpOutmat=fullfile(matDir,strcat(datestr(now,29),newExpfile));
ExpPath=fullfile(newExppath);
scansDir=fullfile(inputPath);
easyResultsDir=fullfile(scansDir,easyResultsDirName);
matDir=fullfile(easyResultsDir,'matResults');
matFile=fullfile(matDir,strcat(datestr(now,'yyyymmdd'),'_',userName,'_',inputFile));
%***Added for 'parfor global' to preallocate 'scan' structure 20-0123*****
nlist=dir(fullfile(ExpPath,'*'));
nlist=dir(fullfile(scansDir,'*'));
nnn=0;
for n=1:size(nlist,1)
if (~isempty(str2num(nlist(n).name)))
@@ -154,38 +229,38 @@ function NewExpDat_Callback(~, ~, ~)
scanMax=max(str2double(sl));
clear scan;
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
% dirs = {'PrintResults', 'CFfigs', 'Fotos', 'Fotos/BkUp'};
% for i = 1:length(dirs)
% d = dirs{i};
% if ~exist(fullfile(ExpPath, resDirName, d), 'dir')
% mkdir(fullfile(ExpPath, resDirName, d));
% end
% end
% create supporting dirs
% this is also in the workflow script but here for standalone mode
dirs = {'PrintResults', 'CFfigs', 'Fotos', 'Fotos/BkUp'};
for i = 1:length(dirs)
d = dirs{i};
if ~exist(fullfile(easyResultsDir, d), 'dir')
mkdir(fullfile(easyResultsDir, d));
end
end
% % templateDirs are stored in the easy template directory
% templates = {'figs', 'PTmats'}
% for i = 1:length(templates)
% d = dirs{i};
% if ~exist(fullfile(ExpPath, resDirName, d), 'dir')
% copyfile((fullfile(wCodeDir,d)), (fullfile(ExpPath,resDirName,d)));
% end
% end
% templateDirs are stored in the easy template directory
templates = {'figs', 'PTmats'}
for i = 1:length(templates)
d = dirs{i};
if ~exist(fullfile(easyResultsDir, d), 'dir')
copyfile((fullfile(,d)), (fullfile(easyResultsDir,d)));
end
end
clear sbdg % reduce possible retention of a previous job sdbg
sbdg= cell(1,scanMax);
save((fullfile(resDir,'Fotos','Nbdg')),'sbdg');
save((fullfile(easyResultsDir,'Fotos','Nbdg')),'sbdg');
catch ME
% returnStartDir
disp('Error Creating a New Experiment')
end
% set the title for fhconsole depending on existence
if exist('resDir','var')&&~isempty(resDir)
set(fhconsole,'Name',strcat('EASYconsole- ',char(resDir)))
if exist('easyResultsDir','var')&&~isempty(easyResultsDir)
set(fhconsole,'Name',strcat('EASYconsole- ',char(easyResultsDir)))
else
set(fhconsole,'Name','EASYconsole -Exp. Analysis NOT selected.')
end
@@ -194,78 +269,65 @@ end
% Load a previous experiment
function LoadDatFile_Callback(~, ~, ~)
global openExpfile
global openExppath
global SWnewExp
global ExpOutmat
global ExpPath
global matDir
global resDir
global matFile
global easyResultsDir
global easyPath
global fhconsole
%global ImParMat
% TODO this entire try block needs work
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'));
[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;
ExpOutmat= fullfile(openExppath,openExpfile);
load(ExpOutmat);
resdir=fullfile('../',openExppath)
ExpPath=fullfile('../../',openExppath)
matDir=fullfile(inputPath)
matFile=fullfile(inputPath,inputFile);
load(matFile);
easyResultsDir=fullfile(matDir,'..')
scansDir=fullfile(matDir,'..', '..')
if isfolder(fullfile(openExppath, '..','..','1')) %If Inovation Vrobot Then
if exist(fullfile(resDir,'PTmats','NImParameters.mat'), 'file')
load(fullfile(resDir,'PTmats','NImParameters.mat'));
if isfolder(fullfile(matDir, '..','..','1')) % If Inovation Vrobot Then
if exist(fullfile(easyResultsDir,'PTmats','NImParameters.mat'), 'file')
load(fullfile(easyResultsDir,'PTmats','NImParameters.mat'));
else
curDir=pwd;
returnStartDir
load NImParameters.mat
cd(curDir)
load(fullfile(easyPath,'NImParameters.mat'));
end
else % If Epson 10Plate Scans Then>
if exist(fullfile(resDir,'PTmats','ImParameters.mat'), 'file')
load(fullfile(resDir,'PTmats','ImParameters.mat'));
if exist(fullfile(easyResultsDir,'PTmats','ImParameters.mat'), 'file')
load(fullfile(easyResultsDir,'PTmats','ImParameters.mat'));
else
curDir=pwd;
returnStartDir
load ImParameters.mat
cd(curDir)
load(fullfile(easyPath,'ImParameters.mat'));
end
end
mkdir(fullfile(openExppath,'\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
mkdir(fullfile(matDir,'BkUp'));
% 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
returnStartDir
end
clear scan
if exist('resDir','var')&&~isempty(resDir)
if exist('easyResultsDir','var') && ~isempty(easyResultsDir)
fhconsole=gcf;
set(fhconsole,'Name',strcat('EASYconsole- ',char(resDir)))
set(fhconsole,'Name',strcat('EASYconsole- ',char(easyResultsDir)))
else
set(fhconsole,'Name','EASYconsole -Exp. Analysis NOT selected.')
end
end
%% CALLBACKS %%
% callback for the 'Run' in the dropdown menu
function run_Callback(~, ~, ~)
end
function runPlateMapPintool_Callback(~, ~, ~)
@@ -296,7 +358,7 @@ function runPlateImAnal_Callback(~, ~, ~)
end
function PlateCFit_Callback(~, ~, ~)
%global ExpOutmat
% global matFile % TODO BCR not sure if needed
try
NCstart
catch ME
@@ -311,7 +373,6 @@ function uploadExcelMP2DB_Callback(~, ~, ~)
end
function runDMPexcel_Callback(~, ~, ~)
global ExpPath
try
DMPexcel2mat_2024winLinix %DMPexcel2mat_2023winLinix
catch ME
@@ -321,13 +382,11 @@ function runDMPexcel_Callback(~, ~, ~)
end
function runResults_DBcombo_Callback(~, ~, ~)
try
DgenResults240430 %similar but semicolons removed to restore so cmdLine display info.
%Dgen241010qhtcp %par4global -convert 1x1cell of 384cells to be like previous 1x384 cells CFparameter
catch ME
disp('Error in DgenResults240430')
returnStartDir
EASYconsole
end
end
@@ -340,7 +399,6 @@ function runOverlayPlots_Callback(~, ~, ~)
DoverlayPlots2
EASYconsole
catch ME
returnStartDir
EASYconsole
end
end
@@ -350,7 +408,6 @@ function runFotoStrip_Callback(~, ~, ~)
F_NImStartup_CentCir
EASYconsole
catch ME
returnStartDir
EASYconsole
end
end
@@ -359,7 +416,6 @@ function runDisplayFig_Callback(~, ~, ~)
try
UfigDisplay
catch ME
returnStartDir
EASYconsole
end
end
@@ -367,7 +423,6 @@ end
function runViewParameters_Callback(~, ~, ~)
try
catch ME
returnStartDir
EASYconsole
end
end
@@ -376,7 +431,6 @@ function QkviewN_Callback(~, ~, ~)
try
QkviewImages
catch ME
returnStartDir
EASYconsole
end
end
@@ -384,10 +438,8 @@ end
function CFdisplay_Callback(~, ~, ~)
try
NCsingleDisplay
returnStartDir
EASYconsole
catch ME
returnStartDir
EASYconsole
end
end