ecFlow's documentation is now on readthedocs!
A meter is very similar to an event.
Instead of being a boolean value (on/off), it can take a range of integer values.
Other tasks are then triggered when the meter reaches a certain value.
Like events, meter‘s have names and a task can have several of them.
   

Ecf Script

We will create new tasks (t5, t6, and t7) that will be triggered
when the meter in task t1 reaches certain values.
To notify ecflow_server, the task ( t1 in the example below) must call
the ecflow_client –meter. This is also one of the child command‘s.


$HOME/course/f1/t1.ecf
%include <head.h>
echo "I will now sleep for %SLEEP% seconds"
sleep %SLEEP%
n=1
while [[ $n -le 100 ]]               # Loop 100 times
do
   sleep 1                           # Wait a short time
   ecflow_client --meter=progress $n # Notify ecFlow
   (( n = $n + 1 ))
done
%include <tail.h>

Text

# 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 f1
     edit SLEEP 20
     task t1
         meter progress 1 100 90
     task t2
         trigger t1 eq complete
         event a
         event b
     task t3
         trigger t2:a
     task t4
         trigger t2 eq complete
         complete t2:b
     task t5
         trigger t1:progress ge 30
     task t6
         trigger t1:progress ge 60
     task t7
         trigger t1:progress ge 90
 endfamily
endsuite

Python

$HOME/course/test.py
import os
from ecflow import Defs,Suite,Family,Task,Edit,Trigger,Complete,Event,Meter

def create_family_f1():
    return Family("f1",
                Edit(SLEEP=20),
                Task("t1", Meter("progress", 1, 100, 90)),
                Task("t2", Trigger("t1 == complete"), Event("a"), Event("b")),
                Task("t3", Trigger("t2:a")),
                Task("t4", Trigger("t2 == complete"), Complete("t2:b")),
                Task("t5", Trigger("t1:progress ge 30")),
                Task("t6", Trigger("t1:progress ge 60")),
                Task("t7", Trigger("t1:progress ge 90")))  
        
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_f1()))
print(defs) 

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

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

What to do

  1. Edit the definition file or python to add the modifications.
  2. Edit t1.ecf to call ecflow_client –meter
  3. Copy t4.ecf to t5.ecf, t6.ecf and t7.ecf
  4. Replace the suite
    python: python3 test.py ; python3 client.py
    text:      ecflow_client --suspend=/test   ; ecflow_client --replace=/test  test.def
  5. Observe the tasks in ecflow_ui
  6. See the triggers by selecting progress and clicking on the Triggers icon.
  7. Move the mouse pointer over progress icon, then with the right mouse button, choose Edit...
  8. Modify the value of the meter.
       

1 Comment

  1. Alternative styles

    import os
    import ecflow  
    
    def create_family_f1():
        f1 = ecflow.Family("f1") 
        f1.add_variable("SLEEP", 20)
        f1.add_task("t1").add_meter("progress", 1, 100, 90)
        
        t2 = f1.add_task("t2")  
        t2.add_trigger("t1 eq complete") 
        t2.add_event("a")
        t2.add_event("b")
        
        f1.add_task("t3").add_trigger("t2:a")  
        
        t4 = f1.add_task("t4")
        t4.add_trigger("t2 eq complete")  
        t4.add_complete("t2:b") 
         
        f1.add_task("t5").add_trigger("t1:progress ge 30")  
        f1.add_task("t6").add_trigger("t1:progress ge 60")  
        f1.add_task("t7").add_trigger("t1:progress ge 90") 
        return f1 
       
    print("Creating suite definition")  
    defs = ecflow.Defs()
    suite = defs.add_suite("test")
    suite.add_variable("ECF_INCLUDE", os.path.join(os.getenv("HOME"), "course"))
    suite.add_variable("ECF_HOME",    os.path.join(os.getenv("HOME"), "course"))
    suite.add_family( create_family_f1() )
    print(defs)
    
    print("Checking job creation: .ecf -> .job0")   
    print(defs.check_job_creation())
    
    print("Checking trigger expressions")
    print(defs.check())
    
    print("Saving definition to file 'test.def'")
    defs.save_as_defs("test.def")
    
    print("Replace suite /test in the server")
    defs.test.replace_on_server()
    import os
    from ecflow import *
    
    home = os.path.join(os.getenv("HOME"), "course")
    def create_family_f1():
        f1 = Family("f1") + Edit(SLEEP=20)
        f1 += [ Task("t{0}".format(i)) for i in range(1,8)]
        f1.t1 += Meter("progress", 1, 100, 90) 
        f1.t2 += [ Trigger(["t1"]), Event("a"), Event("b") ]
        f1.t3 += Trigger("t2:a")
        f1.t4 += [ Trigger(["t2"]),Complete("t2:b") ]
        f1.t5 += Trigger("t1:progress ge 30")  
        f1.t6 += Trigger("t1:progress ge 60")  
        f1.t7 += Trigger("t1:progress ge 90")  
        return f1
            
    print("Creating suite definition") 
    defs = Defs() + (Suite("test") + Edit(ECF_INCLUDE=home,ECF_HOME=home))
    defs.test += create_family_f1()
    
    print(defs)
    print("Checking job creation: .ecf -> .job0")  
    print(defs.check_job_creation())
    print("Saving definition to file 'test.def'")
    defs.save_as_defs("test.def")
    
    print("Replace suite /test in the server")
    defs.test.replace_on_server()