Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
import sys,os,time
import subprocess
from .tools import loadCmsProcess
from .DTWorkflow import DTWorkflow
from .DTTtrigWorkflow import DTttrigWorkflow
from .DTVdriftWorkflow import DTvdriftWorkflow
from .DTT0WireWorkflow import DTT0WireWorkflow
import logging
# setup logging
log = logging.getLogger(__name__)


class DTCalibrationWorker(object):
    """ This class serves as a top level helper to perform all available
        workflows. Additional workflow classes should use the naming scheme
        DT${WORKFLOWNAME}Workflow and implement a classmethod function add_parser_options.
    """
    available_workflows = ["ttrig","vdrift","T0Wire"]
    def __init__(self, options):
        self.options = options
        if not self.has_crab3_env:
            self.setup_crab_env()

    def run(self):
        # get class object dependent on workflow
        class_name = "DT" + self.options.workflow + "Workflow"
        workflow_class = eval(class_name)
        workflow_class_instance = workflow_class(self.options)
        workflow_class_instance.run()
        return workflow_class_instance.local_path

    @property
    def has_crab3_env(self):
        if not "/crabclient/3" in os.environ["PATH"]:
            return False
        return True

    def setup_crab_env(self):
        # following
        #http://.com/questions/3503719/emulating-bash-source-in-python
        command = ['bash', '-c', 'unset module;source /cvmfs/cms.cern.ch/crab3/crab.sh && env']
        proc = subprocess.Popen(command, executable = '/bin/bash', stdout = subprocess.PIPE)

        print('setting up crab')
        for line in proc.stdout:
          (key, _, value) = line.partition(b"=")
          os.environ[key.decode()] = value.decode().replace("\n","")
        for path in os.environ['PYTHONPATH'].split(':'):
            sys.path.append(path)
        proc.communicate()

    @classmethod
    def add_arguments(cls, parser):
        workflow_parser = DTWorkflow.add_parser_options(parser)
        for workflow in cls.available_workflows:
            class_name = "DT" + workflow + "Workflow"
            try:
                workflow_class = eval( class_name )
                workflow_class.add_parser_options(workflow_parser)
            except:
                log.error("No class with name: %s exists but workflow exists in %s" %
                            (class_name, DTCalibrationWorker)
                         )