From 2545eff4ab89736f3d69e08e600a8a79a829835c Mon Sep 17 00:00:00 2001 From: Bryan Roessler Date: Thu, 1 Aug 2024 16:06:47 -0400 Subject: [PATCH] Some header work --- workflow/apps/matlab/easy/DMPexcel2mat.m | 87 ++++++++++++------------ workflow/apps/matlab/easy/EASYconsole.m | 3 +- workflow/qhtcp-workflow | 78 +++++++++++++++------ 3 files changed, 99 insertions(+), 69 deletions(-) diff --git a/workflow/apps/matlab/easy/DMPexcel2mat.m b/workflow/apps/matlab/easy/DMPexcel2mat.m index ee5c280e..d245599e 100755 --- a/workflow/apps/matlab/easy/DMPexcel2mat.m +++ b/workflow/apps/matlab/easy/DMPexcel2mat.m @@ -30,55 +30,52 @@ if ~exist(masterPlateFile, 'file') || isempty(masterPlateFile) % This can be silent, not really an error end - for i=1:5 % give users 5 chances to get it right - try - % For standalone mode - % GUI input for selecting a MasterPlate Excel file - questdlg('Select MasterPlate Directory (containing DrugMedia_ & MasterPlate_ files)','Directory Selection','OK',... - struct('Default','OK','Interpreter','tex')) - dirToScan=uigetdir(); - files=dir(dirToScan); - mpFiles={files(strncmp(files.name, 'MasterPlate_', 12)).name}; - if isempty(mpFiles) - throw(MException('MATLAB:dir', 'No MasterPlate_ files in directory')) - end - % this sorts by date (newest first) - [~, sortedIndices]=sort(datenum({files(strncmp(mpFiles.name, 'MasterPlate_', 12)).date}), 'descend'); - sortedFiles=mpFiles{sortedIndices}; - masterPlateFile=sortedFiles{1}; - disp('Using newest MasterPlate file: ', masterPlateFile, ', skipping directory selection'); - break - catch ME - h=msgbox(ME.message, 'Error', 'error'); - disp('Rerunning directory selection'); - % I don't know what else we'll need to do here + + try + % For standalone mode + % GUI input for selecting a MasterPlate Excel file + questdlg('Select MasterPlate Directory (containing DrugMedia_ & MasterPlate_ files)','Directory Selection','OK',... + struct('Default','OK','Interpreter','tex')) + dirToScan=uigetdir(); + files=dir(dirToScan); + mpFiles={files(strncmp(files.name, 'MasterPlate_', 12)).name}; + if isempty(mpFiles) + throw(MException('MATLAB:dir', 'No MasterPlate_ files in directory')) end + % this sorts by date (newest first) + [~, sortedIndices]=sort(datenum({files(strncmp(mpFiles.name, 'MasterPlate_', 12)).date}), 'descend'); + sortedFiles=mpFiles{sortedIndices}; + masterPlateFile=sortedFiles{1}; + disp('Using newest MasterPlate file: ', masterPlateFile, ', skipping directory selection'); + break + catch ME + h=msgbox(ME.message, 'Error', 'error'); + disp('Rerunning directory selection'); + % I don't know what else we'll need to do here end else - for i=1:5 % give users 5 chances to get it right - try - % For standalone mode - % GUI input for selecting a MasterPlate Excel file - questdlg('Select MasterPlate Directory (containing DrugMedia_ & MasterPlate_ files)','Directory Selection','OK',... - struct('Default','OK','Interpreter','tex')) - dirToScan=uigetdir(); - files=dir(dirToScan); - mpFiles={files(strncmp(files.name, 'MasterPlate_', 12)).name}; - if isempty(mpFiles) - throw (MException('MATLAB:dir', 'No MasterPlate_ files in directory')); - end - % this sorts by date (newest first) - [~, sortedIndices]=sort(datenum({files(strncmp(mpFiles.name, 'MasterPlate_', 12)).date}), 'descend'); - sortedFiles=mpFiles{sortedIndices}; - masterPlateFile=sortedFiles{1}; - disp('Using newest MasterPlate file: ', masterPlateFile, ', skipping directory selection'); - break - catch ME - h=msgbox(ME.message, 'Error', 'error'); - uiwait(h); - disp('Rerunning directory selection'); - % I don't know what else we'll need to do here + try + % For standalone mode + % GUI input for selecting a MasterPlate Excel file + questdlg('Select MasterPlate Directory (containing DrugMedia_ & MasterPlate_ files)','Directory Selection','OK',... + struct('Default','OK','Interpreter','tex')) + dirToScan=uigetdir(); + files=dir(dirToScan); + mpFiles={files(strncmp(files.name, 'MasterPlate_', 12)).name}; + if isempty(mpFiles) + throw (MException('MATLAB:dir', 'No MasterPlate_ files in directory')); end + % this sorts by date (newest first) + [~, sortedIndices]=sort(datenum({files(strncmp(mpFiles.name, 'MasterPlate_', 12)).date}), 'descend'); + sortedFiles=mpFiles{sortedIndices}; + masterPlateFile=sortedFiles{1}; + disp('Using newest MasterPlate file: ', masterPlateFile, ', skipping directory selection'); + break + catch ME + h=msgbox(ME.message, 'Error', 'error'); + uiwait(h); + disp('Rerunning directory selection'); + % I don't know what else we'll need to do here end end else diff --git a/workflow/apps/matlab/easy/EASYconsole.m b/workflow/apps/matlab/easy/EASYconsole.m index 9ce839a5..7e4543dd 100644 --- a/workflow/apps/matlab/easy/EASYconsole.m +++ b/workflow/apps/matlab/easy/EASYconsole.m @@ -448,8 +448,7 @@ end function runResults_DBcombo_Callback(~, ~, ~) try - DgenResults %similar but semicolons removed to restore so cmdLine display info. - %Dgen241010qhtcp %par4global -convert 1x1cell of 384cells to be like previous 1x384 cells CFparameter + DgenResults catch ME fprintf('Error in DgenResults: %s\n', ME.message); EASYconsole diff --git a/workflow/qhtcp-workflow b/workflow/qhtcp-workflow index 3997aec3..0ec18353 100755 --- a/workflow/qhtcp-workflow +++ b/workflow/qhtcp-workflow @@ -299,11 +299,46 @@ print_header() { EOF - cat <<-EOF - Available modules: ${ALL_MODULES[*]} - Available submodules: ${ALL_SUBMODULES[*]} - EOF - + echo "Using scans directory: $SCANS_DIR" + echo "Change the SCANS_DIR environment variable to override" + echo "Example: SCANS_DIR=/path/to/scans ./qhtcp-workflow" + echo "" + echo "Using output directory: $OUT_DIR" + echo "Change the out_DIR environment variable to override" + echo "Example: SCANS_DIR=/path/to/scans OUT_DIR=/path/to/out ./qhtcp-workflow" + echo "" + + shopt -s nullglob + projects=("$SCANS_DIR"/*/) + shopt -u nullglob + + echo "Available Projects:" + for i in "${!projects[@]}"; do + printf "%d. %s\n" "$((i+1))" "${projects[i]}" + done + + echo "Available Modules:" + for i in "${!ALL_MODULES[@]}"; do + printf "%d. %s\n" "$((i+1))" "${ALL_MODULES[i]}" + done + echo "" + echo "Available Submodules:" + for i in "${!ALL_SUBMODULES[@]}"; do + printf "%d. %s\n" "$((i+1))" "${ALL_SUBMODULES[i]}" + done + + last_index=$(( ${#ALL_MODULES} - 1 )) + read -r -p "Enter a comma deliminated list of modules to run: " response1 + IFS=',' read -ra MODULES <<< "$response1" + + last_index=$(( ${#ALL_SUBMODULES} - 1 )) + read -r -p "Enter the item number to select EASY results directory, default ($last_index): " response2 + IFS=',' read -ra SUBMODULES <<< "$response2" + + # cat <<-EOF + # Available modules: ${ALL_MODULES[*]} + # Available submodules: ${ALL_SUBMODULES[*]} + # EOF } @@ -618,13 +653,13 @@ easy() { script="$EASY_DIR/EASYconsole.m" # Prompt user for suffix - echo "Using default EASY results directory: $EASY_RESULTS_DIR" - ((YES)) || read -r -p "Enter a custom suffix and/or hit enter to use the default (no suffix): " EASY_SUFFIX + echo "Using EASY results directory: $EASY_RESULTS_DIR" + ((YES)) || read -r -p "Enter a custom suffix and/or hit enter to use the default directory (no suffix): " EASY_SUFFIX [[ -n $EASY_SUFFIX ]] && EASY_RESULTS_DIR+="_$EASY_SUFFIX" # This dirname is separate from the project's so multiple EASY results can be generated declare -gx EASY_PROJECT_NAME="${EASY_RESULTS_DIR##*/}" - debug "EASY results output name: $EASY_PROJECT_NAME" + debug "EASY results project name: $EASY_PROJECT_NAME" # Backup and create EASY results dirs [[ -d $EASY_RESULTS_DIR ]] && backup "$EASY_RESULTS_DIR" @@ -1498,19 +1533,19 @@ documentation() { main() { debug "Running: ${FUNCNAME[0]}" "$@" - # Where are we + # Some global vars SCRIPT=$(realpath -s "${BASH_SOURCE[0]}") SCRIPT_DIR=$(dirname "$SCRIPT") - - print_header - - # Global directory variables - declare -g TEMPLATES_DIR="$SCRIPT_DIR/templates" APPS_DIR="$SCRIPT_DIR/apps" - DATE="$(date +%Y%m%d)" # change in EASYconsole.m to match - # scans_heirarchy=("./scans" "/mnt/data/scans" "/mnt/data/ExpJobs" "./scans") - local scans_heirarchy=( "$SCANS_DIR" "./scans" "/mnt/data/scans" "./scans") # TODO change back for production, avoid actual scan dirs during testing + TEMPLATES_DIR="$SCRIPT_DIR/templates" + PROJECT_USER="$(whoami)" + DATE="$(date +%Y%m%d)" # change in EASYconsole.m to match 'hardcode' + # Find a scans directory + # TODO change back for production, avoid actual scan dirs during testing + # local scans_heirarchy=("./scans" "/mnt/data/scans" "/mnt/data/ExpJobs" "./scans") + local scans_heirarchy=( "$SCANS_DIR" "./scans" "/mnt/data/scans" "./scans") + [[ -z $SCANS_DIR ]] && for d in "${scans_heirarchy[@]}"; do if [[ -d $d ]]; then declare -g SCANS_DIR="$d" @@ -1525,10 +1560,8 @@ main() { exit 1; fi fi - echo "Using scans directory: $SCANS_DIR" - echo "Change the SCANS environment variable to override" - echo "Example: SCANS=/path/to/scans ./qhtcp-workflow" + # Find an output directory local out_heirarchy=("$(dirname "$SCANS_DIR")/out" "$SCRIPT_DIR/out" "/mnt/data/out") for d in "${out_heirarchy[@]}"; do if [[ -d $d ]]; then @@ -1545,17 +1578,18 @@ main() { debug "mkdir $SCRIPT_DIR/out" mkdir "$SCRIPT_DIR/out" else - err "No output directory, but attempting to continue..." + err "No output directory, attempting to continue..." fi fi # Set the automatic project directory prefix - PROJECT_USER="$(whoami)" PROJECT_PREFIX="${DATE}_${PROJECT_USER}" # reversed these so easier to sort and parse date sanitize_pn() { [[ $1 =~ [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_.+_.+ ]]; } # sanitizer regex for prefix declare -a PROJECTS=() # this array will hold all of the projects for this run + print_header + parse_input "$@" # parse arguments with getopt # Prompt user for the PROJECT if we still don't have one