def stop_visualization(app, visualizerFile, optOnly=False):
    """
    Clean visualization tasks from the visualizerFile
    It basically terminates all the running/pending tasks from the visualizerFile
    When optOnly==True, if only terminates the running/pending tasks that was started from plot options changing requests
    NOTE: error should be handled by the caller

    @type app: Celery application
    @param app: Celery application instance
    @type visualizerFile: string
    @param visualizerFile: name of the visualizationStatus file that stores the visualization manager/task id's and its updated status
    @type optOnly: bool
    @param optOnly: flag indicating whether only terminates the running/pending tasks that was started from plot options changing requests
    """
    # return if visualizerFile has been generated yet
    if not os.path.isfile(visualizerFile):
        return

    # extract previously saved visualization status
    visualizationManager_preState = {}
    visualizationTask_preState = {}
    pattern_visMgr = re.compile(
        r"Visualization manager \(id: ([^\s]+), options: (.+)\) status: ([A-Z]+)\n"
    )
    pattern_visTsk = re.compile(
        r"Visualization task \(id: ([^\s]+), options: (.+), file: ([^\s]+)\) status: ([A-Z]+)\n"
    )
    for line in open(visualizerFile).readlines():
        if pattern_visMgr.match(line):
            (mid, moptions, mstate) = pattern_visMgr.match(line).groups()
            visualizationManager_preState[mid] = (mstate, moptions)
        if pattern_visTsk.match(line):
            (tid, toptions, tfile,
             tstate) = pattern_visTsk.match(line).groups()
            visualizationTask_preState[tid] = (tstate, tfile)

    # if the visualizationManager was not found
    if not visualizationManager_preState:
        # raise an exception because this should never happend
        raise RuntimeError

    # for each visualization manager (with or without options)
    for mid, (mstate, moptions) in visualizationManager_preState.items():

        # skip visualization for None options when requested
        if optOnly and moptions == 'None': continue

        # get the current visualization manager status
        visMgr_state = AsyncResult(mid).state

        # collect the current visualization task information when necessary
        visualizationTask_info = {}
        if visMgr_state in ['PROGRESS', 'SUCCESS']:
            visualizationTask_info = AsyncResult(mid).result

        # kill the visualization manager if possible
        if visMgr_state in ['PENDING', 'STARTED', 'PROGRESS']:
            revoke(mid, terminate=True)

        # kill the visualization tasks if any
        for (visualizationTask_id,
             plotManifestFileName) in visualizationTask_info.iteritems():
            visTsk_state = AsyncResult(visualizationTask_id).state
            if visTsk_state in ['PENDING', 'STARTED']:
                revoke(visualizationTask_id, terminate=True)
def update_visualization(app, visualizerFile):
    """
    Update the visualizerFile
        and the plot menifest file when a visualization task is done
    NOTE: error should be handled by the caller

    @type app: Celery application
    @param app: Celery application instance
    @type visualizerFile: string
    @param visualizerFile: name of the visualizationStatus file that stores the visualization manager/task id's and its updated status
    """
    # return if visualizerFile has been generated yet
    if not os.path.isfile(visualizerFile):
        return

    # extract previously saved visualization status and update times information
    visualizationManager_preState = {}
    visualizationTask_preState = {}
    updateTimes = None
    pattern_visMgr = re.compile(
        r"Visualization manager \(id: ([^\s]+), options: (.+)\) status: ([A-Z]+)\n"
    )
    pattern_visTsk = re.compile(
        r"Visualization task \(id: ([^\s]+), options: (.+), file: ([^\s]+)\) status: ([A-Z]+)\n"
    )
    pattern_updateTimes = re.compile(r"Update times: ([0-9]+)\n")
    for line in open(visualizerFile).readlines():
        if pattern_visMgr.match(line):
            (mid, moptions, mstate) = pattern_visMgr.match(line).groups()
            visualizationManager_preState[mid] = (mstate, moptions)
        if pattern_visTsk.match(line):
            (tid, toptions, tfile,
             tstate) = pattern_visTsk.match(line).groups()
            visualizationTask_preState[tid] = (tstate, tfile)
        if pattern_updateTimes.match(line):
            updateTimes = pattern_updateTimes.match(line).groups()[0]
            updateTimes = locale.atoi(updateTimes)

    # if the visualizationManager was not found
    if not visualizationManager_preState or updateTimes is None:
        # raise an exception because this should never happend
        raise RuntimeError

    # clear the visualization status file
    open(visualizerFile, 'w').close()
    fout = open(visualizerFile, 'a')

    # for each visualization manager (with or without options)
    for mid, (mstate, moptions) in visualizationManager_preState.items():

        # get the visualizationManger state
        visMgr_asyncResult = AsyncResult(mid)
        visMgr_result = visMgr_asyncResult.result
        if isinstance(visMgr_result,
                      collections.Iterable) and 'state' in visMgr_result:
            visMgr_state = visMgr_result['state']
        else:
            visMgr_state = visMgr_asyncResult.state

        # save the visualization manager status in visualizationStatus file
        fout.write("Visualization manager (id: %s, options: %s) status: %s\n" %
                   (mid, moptions, visMgr_state))

        # if the visualization manager is pending, failed, or timeout
        #    or the visualization manager is an unkown status other than finishd or in progress
        if visMgr_state in [
                'PENDING', 'FAILURE', 'RETRY', 'REVOKED', 'TIMEOUT',
                'ALREADYRUNNING'
        ] or visMgr_state not in ['PROGRESS', 'SUCCESS']:
            # break, because there will be no further update for visualization status
            break

        # collect the current visualization task information
        visualizationTask_info = AsyncResult(mid).result

        # update the plot menifest files for the completed visualization tasks
        session_dir = os.path.dirname(visualizerFile)

        # loop over the submitted visualization tasks
        for (visualizationTask_id,
             plotManifestFileName) in visualizationTask_info.iteritems():

            # get the visualizationTask task state and internal result
            visTsk_state, visTsk_internal_result = None, None
            visTsk_asyncResult = AsyncResult(visualizationTask_id)
            visTsk_result = visTsk_asyncResult.result
            if isinstance(visTsk_result,
                          collections.Iterable) and 'state' in visTsk_result:
                visTsk_state = visTsk_result['state']
                if 'result' in visTsk_result:
                    visTsk_internal_result = visTsk_result['result']
            else:
                visTsk_state = visTsk_asyncResult.state

            # if this visualization task was not previously submitted
            #    and it succeeded and returned internal result (plotManifestFileName, plotManifestFile_content)
            if visualizationTask_id not in visualizationTask_preState and visTsk_state == 'SUCCESS' and visTsk_internal_result:
                # save the plot menifest file
                (plotManifestFileName,
                 plotManifestFile_content) = visTsk_internal_result
                plotManifestFile = os.path.join(session_dir,
                                                plotManifestFileName)
                if (not os.path.isfile(plotManifestFile)):
                    open(plotManifestFile, 'w').write(plotManifestFile_content)
            # save this visualization task status in visualizationStatus file
            fout.write(
                "Visualization task (id: %s, options: %s, file: %s) status: %s\n"
                % (visualizationTask_id, moptions, plotManifestFileName,
                   visTsk_state))

    # save the update times information
    fout.write("Update times: %s\n" % (updateTimes + 1))

    # close visualization state file
    fout.close()