% Launch the MATLAB EASY console % % Updated 240724 Bryan C Roessler to improve file operations and portability % function varargout = EASYconsole(varargin) global startDir global easyDir global easySuffix global scansDir global easyResultsDir global easyResultsDirName global matDir global matFile global userName % Initialize some variables from matlab startDir=pwd; easyPath=which(mfilename); [easyDir,easyFileName]=fileparts(easyPath); easyDir=fullfile(easyDir) [parentDir, ~]=fileparts(easyDir); userName=system('whoami'); disp(strcat('This script name: ', easyFileName)) % 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 % 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 % 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 % Now that we have easyDir let's add it to the path just to be safe % TODO I have no idea if this is necessary or effective but we'll see % I could image it would reduce some weird matlab errors? addpath(easyDir); 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, ... 'gui_OpeningFcn', @EASYconsole_OpeningFcn, ... 'gui_OutputFcn', @EASYconsole_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback=str2func(varargin{1}); end if nargout [varargout{1:nargout}]=gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end end % To remove? % Try to enter % function returnStartDir % global scansDir % global startDir % try % cd(scansDir) % catch % msgbox('Failed to enter the project directory so starting search from where we started.'); % cd(startDir) % end % end % GUI % Easyconcole_OpeningFcn executes just before the EASYconsole GUI is made visible. % This function has no output args, see OutputFcn. % hObject--handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles--structure with handles and user data (see GUIDATA) % varargin--input arguments to EASYconsole (see VARARGIN) function EASYconsole_OpeningFcn(hObject, ~, handles, varargin) global fhconsole global easyResultsDir % Choose default command line output for EASYconsole handles.output = hObject; % Update handles structure guidata(hObject, handles); %Figure header, Toolbar, etc. Setup fhconsole=gcf; set(fhconsole,'Toolbar','none'); fhconsole=gcf; % 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 %% % Outputs from this function are returned to the command line. % varargout--cell array for returning output args (see VARARGOUT); % hObject--handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles--structure with handles and user data (see GUIDATA) function varargout = EASYconsole_OutputFcn(~, ~, handles) % Get default command line output from handles structure varargout{1} = handles.output; end %% CONSOLE BUTTON INTERFACES %% % File Button Interface function FileMenu_Callback(~, ~, ~) %returnStartDir end % Load Experiment Button Interface function LoadExp_Callback(~, ~, ~) %returnStartDir end % New Experiment Button Interface function NewExpDat_Callback(~, ~, ~) global SWnewExp global matDir global matFile global easyResultsDir global easyResultsDirName global fhconsole global scan 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')); [inputFile,inputPath]=uiputfile('.mat'); SWnewExp=1; inputFileName=strrep(inputFile,'.mat',''); easyResultsDirName=strcat('Results_',datestr(now,'yyyymmdd'),'_',userName,'_',inputFileName); % Set paths 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(scansDir,'*')); nnn=0; for n=1:size(nlist,1) if (~isempty(str2num(nlist(n).name))) nnn=nnn+1; PnumLst(nnn)= (str2num(nlist(n).name)); sl(nnn,1)={(nlist(n).name)}; end end scanSize=size(sl,1); scanMax=max(str2double(sl)); clear scan; scan(scanMax)=struct(); % changed for parfor global 20_0118 save(matFile,'scan') % 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(easyResultsDir, d), 'dir') copyfile((fullfile(easyDir,d)), (fullfile(easyResultsDir,d))); end end clear sbdg % reduce possible retention of a previous job sdbg sbdg= cell(1,scanMax); 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('easyResultsDir','var')&&~isempty(easyResultsDir) set(fhconsole,'Name',strcat('EASYconsole- ',char(easyResultsDir))) else set(fhconsole,'Name','EASYconsole -Exp. Analysis NOT selected.') end end % Load a previous experiment function LoadDatFile_Callback(~, ~, ~) global SWnewExp global matDir global matFile global easyResultsDir global easyPath global fhconsole %global ImParMat try questdlg('\fontsize{20} Load file from ExpJobs/YourJob/YourResults/matResults','File Creation','OK', struct('Default','OK','Interpreter','tex')); [inputFile,inputPath]=uigetfile('.mat','Open Experiment folder and data storage .mat file name','MultiSelect','off'); SWnewExp=0; matDir=fullfile(inputPath) matFile=fullfile(inputPath,inputFile); load(matFile); easyResultsDir=fullfile(matDir,'..') scansDir=fullfile(matDir,'..', '..') if isfolder(fullfile(matDir, '..','..','1')) % If Inovation Vrobot Then if exist(fullfile(easyResultsDir,'PTmats','NImParameters.mat'), 'file') load(fullfile(easyResultsDir,'PTmats','NImParameters.mat')); else load(fullfile(easyPath,'NImParameters.mat')); end else % If Epson 10Plate Scans Then> if exist(fullfile(easyResultsDir,'PTmats','ImParameters.mat'), 'file') load(fullfile(easyResultsDir,'PTmats','ImParameters.mat')); else load(fullfile(easyPath,'ImParameters.mat')); 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 end clear scan if exist('easyResultsDir','var') && ~isempty(easyResultsDir) fhconsole=gcf; 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(~, ~, ~) try NImapPT catch ME EASYconsole end end function NImCFcombo_Callback(~, ~, ~) try par4Gbl_Main8c catch EASYconsole end end function runPlateImAnal_Callback(~, ~, ~) try NImStartupOnly catch ME EASYconsole end end function PlateCFit_Callback(~, ~, ~) % global matFile % TODO BCR not sure if needed try NCstart catch ME end end function GenPrintouts_Callback(~, ~, ~) end function uploadExcelMP2DB_Callback(~, ~, ~) end function runDMPexcel_Callback(~, ~, ~) try % DMPexcel2mat_2024winLinix %DMPexcel2mat_2023winLinix DMPexcel2mat % TODO Can't find above so using what I have available catch ME EASYconsole end 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(strcat('Error in DgenResults240430: ', ME.message)) EASYconsole end end function Tools_Callback(~, ~, ~) end function runOverlayPlots_Callback(~, ~, ~) try DoverlayPlots2 EASYconsole catch ME EASYconsole end end function runFotoStrip_Callback(~, ~, ~) try F_NImStartup_CentCir EASYconsole catch ME EASYconsole end end function runDisplayFig_Callback(~, ~, ~) try UfigDisplay catch ME EASYconsole end end function runViewParameters_Callback(~, ~, ~) try catch ME EASYconsole end end function QkviewN_Callback(~, ~, ~) try QkviewImages catch ME EASYconsole end end function CFdisplay_Callback(~, ~, ~) try NCsingleDisplay EASYconsole catch ME EASYconsole end end