\(\renewcommand\AA{\unicode{x212B}}\)

Progress Reporting

For long running algorithms it is often desirable to provide a mechanism of reporting progress to the user. In MantidWorkbench, this is done via the progress bar within the box that lists the available algorithms.

To add this mechanism to a Python algorithm you use the Progress class, e.g.

def PyExec(self):
    endrange = 100000

    # Create a Progress object that covers the progress
    # of the whole algorithm (start=0.0,end=1.0) and will
    # report a maximum of endrange times
    prog_reporter = Progress(self, start=0.0, end=1.0,
                             nreports=endrange)
    for i in range(0, endrange):
        prog_reporter.report("Processing")

Each time the report is called it can be passed an optional message and this will update the progress bar in MantidWorkbench.

By default, the progress is incremented by a single unit when report is called. The current value can be set using a variant of report, e.g.

def PyExec(self):
    endrange = 100000

    # Create a Progress object that covers the progress
    # of the whole algorithm (start=0.0, end=1.0)
    # and will report a maximum of endrange times
    prog_reporter = Progress(self, start=0.0, end=1.0,
                    nreports=endrange)
    for i in range(0, endrange/2):
        prog_reporter.report("Processing half")

    # Move progress to end
    prog_reporter.report(endrange, "Done")

It is also possible to step the progress in different increments using reportIncrement, e.g. to step the reporting up by 5 “units”:

def PyExec(self):
    endrange = 100000

    # Create a Progress object that covers the progress
    # of the whole algorithm (start=0.0,end=1.0)
    # and will report a maximum of endrange times
    prog_reporter = Progress(self, start=0.0, end=1.0,
                    nreports=endrange)
    for i in range(0, endrange):
        if i % 5 == 0:
            prog_reporter.reportIncrement(5, "Processing")

Cancellation

MantidWorkbench allows a cancellation request to be sent to a running algorithm. An algorithm must be coded to stop itself if a request has been made. This comes for free if you implement progress reporting as each report call checks whether it should be be cancelled and stops if it should.