Time triggers

In this section we show an alternative to time-based attributes, using time triggers. The following suite based generated variables are available for time-based triggers. (In ecflow_ui, select a suite, then look at the variables tab)

  • DD: day of the month

  • DOW: day of the week, 0-6, where 0 is Sunday

  • DOY: day of the year

  • ECF_DATE: YYYYMMDD year, month, day format. This has the same format as repeat date.

  • MM: month 01-12

  • TIME: HHMM

  • YYYY: year

These time-based variables on the suite, use the suites calendar. The suites calendar can be configured with the clock attribute.

Here are examples of time attributes and the corresponding trigger examples.

time 23:00                  # trigger :TIME == 2300
date 1.*.*                  # trigger :DD == 1
day monday                  # trigger :DOW == 1

The ‘:’ means a search for the variable up the node tree.

Triggers can also use AND/OR logic and the full range of operators <,>,<=,>=

Listing 35 Time attributes
task t1
    day monday
    time 13:00
Listing 36 time based trigger
task t1
    trigger :DOW == 1 and :TIME >= 1300
Listing 37 combination
task t1
    day monday
    trigger :TIME >= 1300

Warning

It should be noted that relative time( time +00:01) are not possible with time-based triggers, and time series are more problematic.

Text

Let us modify the previous definition file for family f2.

For brevity, we have omitted the previous family f1

# Definition of the suite test
suite test
    edit ECF_INCLUDE "$HOME/course"  # replace '$HOME' with the path to your home directory
    edit ECF_HOME    "$HOME/course"

    family f2
        edit SLEEP 20
        task t1
            trigger :ECF_DATE ==20200720 and :TIME >= 1000
        task t2
            trigger :DOW == 4 and :TIME >= 1300
        task t3
            trigger :DD == 1 and :TIME >= 1200
        task t4
            trigger (:DOW == 1 and :TIME >= 1300) or (:DOW == 5 and :TIME >= 1000)
        task t5
            trigger :TIME == 0002              # 2 minutes past midnight
    endfamily
endsuite

Python

For brevity, we have left out family f1. In python this would be:

Listing 38 $HOME/course/test.py
import os
from ecflow import (
    Defs,
    Suite,
    Family,
    Task,
    Edit,
    Trigger,
    Complete,
    Event,
    Meter,
    Time,
    Day,
    Date,
    Edit,
)


def create_family_f2():
    return Family(
        "f2",
        Edit(SLEEP=20),
        Task("t1", Trigger(":ECF_DATE ==20200720 and :TIME >= 1000")),
        Task("t2", Trigger(":DOW == 4 and :TIME >= 1300")),
        Task("t3", Trigger(":DD == 1 and :TIME >= 1200")),
        Task(
            "t4",
            Trigger("(:DOW == 1 and :TIME >= 1300) or (:DOW == 5 and :TIME >= 1000)"),
        ),
        Task("t5", Trigger(":TIME == 0002")),
    )


print("Creating suite definition")
home = os.path.join(os.getenv("HOME"), "course")
defs = Defs(Suite("test", Edit(ECF_INCLUDE=home, ECF_HOME=home), create_family_f2()))
print(defs)

print("Checking job creation: .ecf -> .job0")
print(defs.check_job_creation())

print("Checking trigger expressions")
errors = defs.check()
assert len(errors) == 0, errors

print("Saving definition to file 'test.def'")
defs.save_as_defs("test.def")

What to do

  1. Make the changes to the suite definition file

  2. Replace the suite.

    Python: python3 test.py ; python3 client.py
    Text: ecflow_client --suspend=/test ;  ecflow_client --replace=/test test.def
  3. ecFlowUI has a special window to explain why a task is queued. Select a queued task and click on the ‘Why tab’

  4. Vary the time triggers so that all task runs