123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508 |
- % Launch the MATLAB EASY console
- % Updated 240727 Bryan C Roessler to improve file operations and portability
- function varargout = EASYconsole(varargin)
- global easyDir
- global projectName
- global projectScansDir
- global easyResultsDir
- global easyProjectName
- global fotosResultsDir
- global figsResultsDir
- global pointMapsResultsDir
- global pointMapsFile
- global printResultsDir
- global matDir
- global matFile
- global drugMediaFile
- global masterPlateFile
- global mpdmFile
- global userName
- global srchRange
- global searchRangeFile
- % Initialize some variables from matlab
- easyPath=which(mfilename);
- [easyDir,easyFileName]=fileparts(easyPath);
- easyDir=fullfile(easyDir);
- [parentDir, ~]=fileparts(easyDir);
- parentDir=fullfile(parentDir); % ../easy/apps
- userName=getenv('USER');
- dt=datetime;
- todayStr=char(dt, 'yyyyMMdd'); % This should match the parent workflow script 'hardcode'
- outDir=fullfile(parentDir, '..','..', 'out'); % This should match the parent workflow script 'hardcode'
- debug=1;
- if debug
- disp('Running in debug mode');
- disp('Initialized variables:');
- whos;
- end
- fprintf('This script name: %s\n', easyFileName);
- % Allow EASY_DIR env to override hardcoded default EASY directory
- if ~isempty(getenv('EASY_DIR'))
- ed=fullfile(getenv('EASY_DIR'));
- if ~strcmp(easyDir, ed) % sanity check
- disp("WARNING: EASY_DIR does not match this script's hardcoded EASY location");
- disp("This is probably OK but this pathway is not well-tested");
- easyDir=ed;
- end
- fprintf('Using EASY script directory: %s from environment variable EASY_DIR\n', easyDir);
- else
- fprintf('Using EASY script directory: %s from hardcoded default\n', easyDir);
- end
- whos
- % Set projectScansDir intelligently
- if ~isempty(getenv('PROJECT_SCANS_DIR'))
- projectScansDir=fullfile(getenv('PROJECT_SCANS_DIR'));
- if exist(projectScansDir, 'dir')
- fprintf('Using scans directory: %s from environment variable PROJECT_SCANS_DIR\n', projectScansDir);
- disp('This usually indicates that we are in module mode');
- else
- disp('WARNING: PROJECT_SCANS_DIR does not exist');
- end
- elseif ~isempty(getenv('PROJECT_NAME')) % for standalone mode
- projectName=getenv('PROJECT_NAME');
- projectScansDir=fullfile(parentDir, '..', '..', 'scans', projectName);
- fprintf('Using project path: %s from environment variable PROJECT\n', projectScansDir);
- disp('This usually indicates that we are in standalone mode');
- else
- % TODO Lots of hardcoded logic, this TODO is just a reminder to change this block
- % when changing EASY and other variables in the parent script
- fprintf('WARNING: Running in standalone mode without PROJECT or PROJECT_SCANS_DIR environment variables (not recommended)\n');
- fprintf('Beginning parent scans directory search\n');
- dirsToScan={
- fullfile(parentDir, '..', '..', 'scans')
- fullfile(parentDir, '..', '..', 'ExpJobs')
- fullfile('mnt','data','scans')
- fullfile('mnt','data', 'ExpJobs')
- fullfile(parentDir, '..', '..', 'templates', 'scans-demo')
- };
- for i=1:length(dirsToScan)
- d=dirsToScan(i);
- d=char(d);
- if exist(d, 'dir')
- matchedDirs={};
- subDirs=dir(d);
- pattern='^\d{6}_.*_.*';
- for i=1:length(subDirs)
- if ~isempty(strmatch(subDirs(i).name, pattern))
- matchedDirs{end+1}=subDirs(i).name;
- end
- end
- whos
- if ~isempty(matchedDirs)
- fprintf('Using scansDir %s\n', char(d));
- end
- fprintf('Scanning inside %s for a project directory\n', d);
- sortedMatchedDirs=sortrows(matchedDirs);
- projectScansDir=fullfile(sortedMatchedDirs{end}); % select the latest dir (by date prefix)
- fprintf('Using project scans directory: %s\n', char(projectScansDir));
- break
- end
- end
- end
- % Get the name of the project
- [~, projectName]=fileparts(projectScansDir);
- % Set the run-specific EASY output directory
- if ~isempty(getenv('EASY_RESULTS_DIR'))
- easyResultsDir=fullfile(getenv('EASY_RESULTS_DIR'));
- fprintf('Using output directory: %s from environment variable EASY_RESULTS_DIR\n', easyResultsDir);
- else
- easyProjectName=strcat(todayStr, '_',userName, '_', projectName);
- easyResultsDir=fullfile(parentDir, '..', '..', 'out', projectName, 'easy', easyProjectName);
- if exist(easyResultsDir, 'dir')
- fprintf('WARNING: EASY results dir %s already exists\n', easyResultsDir);
- disp('Files in this directory may be overwritten')
- fprintf('Using output directory: %s\n', easyResultsDir);
- end
- end
- % Get the name of the EASY project
- if ~isempty(getenv('EASY_PROJECT_NAME'))
- easyProjectName=getenv('EASY_PROJECT_NAME');
- else
- [~, easyProjectName]=fileparts(easyResultsDir);
- end
- % User sanity check and warning
- if ~isempty(getenv('PROJECT_USER'))
- if ~strcmp(getenv('PROJECT_USER'), userName)
- disp("WARNING: PROJECT_USER does not match the current namespace");
- end
- end
- if ~isempty(getenv('MASTER_PLATE_FILE'))
- masterPlateFile=fullfile(getenv('MASTER_PLATE_FILE'));
- fprintf('Using drug media file: %s from environment variable MASTER_PLATE_FILE\n', masterPlateFile);
- else % try to find MasterPlate_ file on our own
- mp=fullfile(easyResultsDir, strcat('MasterPlate_', projectName,'.xlsx'));
- if exist(mp, 'file')
- masterPlateFile=mp;
- fprintf('Using master plate file: %s from internal logic\n', masterPlateFile);
- else
- fprintf('WARNING: Could not find MasterPlate file: %s\n', mp);
- fprintf('WARNING: Have you created a MasterPlate_ file in %s', easyResultsDir);
- end
- end
- if ~isempty(getenv('DRUG_MEDIA_FILE'))
- drugMediaFile=fullfile(getenv('DRUG_MEDIA_FILE'));
- fprintf('Using drug media file: %s from environment variable DRUG_MEDIA_FILE\n', drugMediaFile);
- else
- dm=fullfile(easyResultsDir, strcat('DrugMedia_', projectName,'.xlsx'));
- if exist(dm, 'file')
- drugMediaFile=dm;
- fprintf('Using drug media file: %s from internal logic\n', drugMediaFile);
- else
- fprintf('WARNING: Have you created a DrugMedia_ file in %s?\n', easyResultsDir);
- end
- end
- matDir=fullfile(easyResultsDir, 'matResults');
- matFile=fullfile(matDir,easyProjectName,'.mat');
- mpdmFile=fullfile(matDir,'MPDM.mat');
- printResultsDir=fullfile(easyResultsDir,'PrintResults');
- fotosResultsDir=fullfile(easyResultsDir,'Fotos');
- figsResultsDir=fullfile(easyResultsDir,'figs');
- pointMapsResultsDir=fullfile(easyResultsDir,'PTmats');
- pointMapsFile=fullfile(pointMapsResultsDir,'NImParameters.mat');
- oldPointMapsFile=fullfile(pointMapsResultsDir,'ImParameters.mat');
- searchRangeFile=fullfile(fotosResultsDir,'CSearchRange.mat');
-
- % Decent time to print some helpful vars
- if debug
- disp('Vars at end of main loop:')
- whos;
- end
- % This can be removed, I think it should add the previous search range?
- % Might be nice feature but can remove if it causes issues
- % We are using searchRangeNum to hold old CSrchRange value(s)
- if exist(searchRangeFile, 'file')
- searchRangeNum=load(searchRangeFile);
- end
- % Add easyDir to the MATLAB path
- % I have not idea if this is necessary or works but theoretically should
- % reduce directory scoping issues when calling scripts w/o a path
- addpath(easyDir);
- % 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
- % 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 projectScansDir
- % 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;
- % Pulled this out of the opening function
- % Seems better to wait until we have our vars set though?
- if exist('projectScansDir','var') && ~isempty(projectScansDir)
- set(fhconsole,'Name', sprintf('EASYconsole - %s', projectScansDir));
- else
- set(fhconsole,'Name','EASYconsole - No Active Experiment.')
- end
- end
- % EASYconsole output
- % 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 matDir
- global matFile
- global easyResultsDir
- global easyProjectName
- global fhconsole
- global scan
- global userName
- global todayStr
- % Create a new experiment
- try
- questdlg('Name the file and navigate to the directory with the image folders.','File Creation','OK', struct('Default','OK','Interpreter','tex'));
- [matfile,easyResultsDir]=uiputfile('.mat');
- inputFileName=strrep(inputFile,'.mat','');
-
- [~, projectName]=fileparts(easyResultsDir);
- % Set paths
- matDir=fullfile(easyResultsDir,'matResults');
- matFile=fullfile(matDir, projectName, '.mat');
-
- % Added for 'parfor global' to preallocate 'scan' structure
- nlist=dir(fullfile(projectScansDir,'*'));
- 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'};
- 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
- fprintf('ERROR: %s\n', ME.message);
- end
- % set the title for fhconsole depending on existence
- if exist('easyResultsDir','var') && ~isempty(easyResultsDir)
- set(fhconsole,'Name',sprintf('EASYconsole - %s', easyResultsDir));
- else
- set(fhconsole,'Name','EASYconsole - Master Plate directory not selected.');
- end
- end
- % Load a previous experiment
- function LoadDatFile_Callback(~, ~, ~)
- global matDir
- global matFile
- global projectName
- global easyResultsDir
- global easyProjectName
- global easyPath
- global fhconsole
- try
- questdlg('Load results .mat from ../out/project/','File Creation','OK', struct('Default','OK','Interpreter','tex'));
- [matDir,matFile]=uigetfile('.mat','Open Experiment folder and data storage .mat file name','MultiSelect','off');
- load(matFile);
- easyResultsDir=fullfile(matDir,'..');
- [~, projectName]=fileparts(easyResultsDir);
- projectScansDir=fullfile(easyResultsDir, '..', '..', 'scans', projectName);
- % TODO this is pretty hacky and needs something more explicit
- if isfolder(fullfile(matDir, '..','..','1')) % If Inovation Vrobot Then
- if load(pointMapsFile);
- elseif load(fullfile(easyPath,'NImParameters.mat')); % hardcoded default
- elseif load(fullfile(pointMapsResultsDir,'ImParameters.mat'));
- elseif load(fullfile(easyPath,'ImParameters.mat'));
- else
- disp("Could not load the ImParameters.mat file");
- end
- else
- disp('WARNING: cannot find project scans');
- 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
- end
- clear scan
- if exist('easyResultsDir','var') && ~isempty(easyResultsDir)
- fhconsole=gcf;
- set(fhconsole,'Name',sprintf('EASYconsole - %s', easyResultsDir));
- else
- set(fhconsole,'Name','EASYconsole - Exp. Analysis NOT selected.');
- end
- end
- % Callbacks
- % 'Run' in the dropdown menu
- function run_Callback(~, ~, ~)
- end
- function runPlateMapPintool_Callback(~, ~, ~)
- try
- NImapPT
- catch
- EASYconsole
- end
- end
- function NImCFcombo_Callback(~, ~, ~)
- try
- par4Gbl_Main8c
- EASYconsole
- catch
- EASYconsole
- end
- end
- function runPlateImAnal_Callback(~, ~, ~)
- try
- NImStartupOnly
- catch
- EASYconsole
- end
- end
- function PlateCFit_Callback(~, ~, ~)
- % global matFile % TODO BCR not sure if needed
- try
- NCstart
- catch
- EASYconsole
- end
- end
- function GenPrintouts_Callback(~, ~, ~)
- end
- function uploadExcelMP2DB_Callback(~, ~, ~)
- end
- function runDMPexcel_Callback(~, ~, ~)
- try
- DMPexcel2mat
- catch
- EASYconsole
- end
- end
- function runResults_DBcombo_Callback(~, ~, ~)
- try
- DgenResults
- catch ME
- fprintf('Error in DgenResults: %s\n', ME.message);
- EASYconsole
- end
- end
- function Tools_Callback(~, ~, ~)
- end
- function runOverlayPlots_Callback(~, ~, ~)
- try
- DoverlayPlots2
- EASYconsole
- catch
- EASYconsole
- end
- end
- function runFotoStrip_Callback(~, ~, ~)
- try
- F_NImStartup_CentCir
- EASYconsole
- catch
- EASYconsole
- end
- end
- function runDisplayFig_Callback(~, ~, ~)
- try
- UfigDisplay
- catch
- EASYconsole
- end
- end
- function runViewParameters_Callback(~, ~, ~)
- try
- catch
- EASYconsole
- end
- end
- function QkviewN_Callback(~, ~, ~)
- try
- QkviewImages
- catch
- EASYconsole
- end
- end
- function CFdisplay_Callback(~, ~, ~)
- try
- NCsingleDisplay
- EASYconsole
- catch
- EASYconsole
- end
- end
|