Skip to main content

Utility Functions

Utility functions let you add Python logic to a workflow. They are defined in utils.py and are primarily used by map.json to compute values that cannot be expressed as simple string substitutions.

How Utility Functions Work

During map evaluation, Drona processes each mapping value in this order:

  1. Replaces form references like $fieldName with submitted values from the form.
  2. Executes function calls written as !functionName(...).
  3. Uses the function return value as part of the final mapping string.

Example

Suppose your schema.json defines form elements with names cores, time, and memory. Here's how to use a utility function to process these values:

File: map.json

{
"MODULE": "module load Matlab/$version",
"BATCH_OPTIONS": "!retrieve_batch_opts($cores, $time, $memory)"
}

File: utils.py

def retrieve_batch_opts(cores, time, memory):
"""
Builds SLURM batch options from form inputs.
Returns a string with formatted sbatch directives.
"""
hours = int(time)
mem_gb = int(memory)

# Validate and adjust GPU walltime limits
if cores > 48:
drona_add_warning(f"Requested {cores} cores exceeds limit. Reducing to 48.")
cores = 48

options = f"#SBATCH --ntasks={cores}\n"
options += f"#SBATCH --time={hours}:00:00\n"
options += f"#SBATCH --mem={mem_gb}G"

return options

When the researcher submits the form, Drona will:

  • Replace $cores, $time, and $memory with their form values (e.g., 16, 24, 64)
  • Call retrieve_batch_opts(16, 24, 64)
  • Use the returned string to replace [BATCH_OPTIONS] in template.txt and driver.sh

Function Call Syntax

Use ! prefix to call a function in map.json:

"PLACEHOLDER": "!function_name($form_variable, 'literal_string')"
  • $form_variable - Replaced with the value from a form field before the function is called
  • 'literal_string' - Passed as-is to the function
  • Multiple arguments are separated by commas

You can combine function calls with other text:

"JOB_COMMAND": "sbatch --account=$account !get_queue_name($partition) job.sh"

Drona Support Library

Drona provides a support library with functions to dynamically add additional files, mappings, and messages. Python functions defined in utils.py can call these support functions. These functions are automatically available (imported from packages/drona_utils/core.py).

FunctionDescription
drona_add_mapping(String, String)Dynamically adds or overrides a placeholder mapping. First string is the placeholder name, second string is the value.
drona_add_warning(String)Adds a warning message displayed to the researcher in the UI.
drona_add_error(String)Adds an error message displayed to the researcher in the UI.
drona_add_note(String)Adds an informational note displayed to the researcher in the UI.
drona_add_additional_file(String, String, Integer)Dynamically adds a file to the workflow. First parameter (required) is the filename. Second parameter (optional) is the preview tab name. Third parameter (optional) is the position in tabs; -1 excludes from preview.
note

Drona engine evaluates dynamic mappings (from drona_add_mapping) before evaluating static mappings from map.json. This means the value in a dynamic mapping can contain placeholders that will be replaced using map.json.

Adding Warnings

Warnings are useful to provide feedback to the researcher based on values entered in the form or to inform of potential issues.

if gpu == "PVC" and total_hours > (24*2):
drona_add_warning("Requested walltime "+walltime+" (hh:mm). Reducing to max of 48 hours in GPU/PVC queues")

Adding Additional Files

Additional files can be added dynamically depending on form inputs. Only the first parameter is required.

if gpu == "PVC":
drona_add_additional_file("pre_process_pvc.py", "PVC preprocess", 1)
else:
drona_add_additional_file("pre_process.py", "Regular preprocess", 1)

Best Practices

  • Keep functions deterministic and fast - Avoid network calls or heavy computation
  • Return strings for direct substitution into template placeholders
  • Use messages for feedback - Display errors/warnings to users with drona_add_error() and drona_add_warning() instead of embedding them in generated scripts
  • Use drona_add_mapping() sparingly - When one function needs to set multiple placeholders, it's cleaner than returning complex strings
  • Validate user input - Check for invalid values and provide helpful error messages
  • Document your functions - Add docstrings explaining parameters and return values

Texas A&M University High Performance Research Computing