Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 11:58:29

0001 from __future__ import print_function
0002 from __future__ import absolute_import
0003 import sys,os,time
0004 import subprocess
0005 from .tools import loadCmsProcess
0006 from .DTWorkflow import DTWorkflow
0007 from .DTTtrigWorkflow import DTttrigWorkflow
0008 from .DTVdriftWorkflow import DTvdriftWorkflow
0009 from .DTT0WireWorkflow import DTT0WireWorkflow
0010 import logging
0011 # setup logging
0012 log = logging.getLogger(__name__)
0013 
0014 
0015 class DTCalibrationWorker(object):
0016     """ This class serves as a top level helper to perform all available
0017         workflows. Additional workflow classes should use the naming scheme
0018         DT${WORKFLOWNAME}Workflow and implement a classmethod function add_parser_options.
0019     """
0020     available_workflows = ["ttrig","vdrift","T0Wire"]
0021     def __init__(self, options):
0022         self.options = options
0023         if not self.has_crab3_env:
0024             self.setup_crab_env()
0025 
0026     def run(self):
0027         # get class object dependent on workflow
0028         class_name = "DT" + self.options.workflow + "Workflow"
0029         workflow_class = eval(class_name)
0030         workflow_class_instance = workflow_class(self.options)
0031         workflow_class_instance.run()
0032         return workflow_class_instance.local_path
0033 
0034     @property
0035     def has_crab3_env(self):
0036         if not "/crabclient/3" in os.environ["PATH"]:
0037             return False
0038         return True
0039 
0040     def setup_crab_env(self):
0041         # following
0042         #http://.com/questions/3503719/emulating-bash-source-in-python
0043         command = ['bash', '-c', 'unset module;source /cvmfs/cms.cern.ch/crab3/crab.sh && env']
0044         proc = subprocess.Popen(command, executable = '/bin/bash', stdout = subprocess.PIPE)
0045 
0046         print('setting up crab')
0047         for line in proc.stdout:
0048           (key, _, value) = line.partition(b"=")
0049           os.environ[key.decode()] = value.decode().replace("\n","")
0050         for path in os.environ['PYTHONPATH'].split(':'):
0051             sys.path.append(path)
0052         proc.communicate()
0053 
0054     @classmethod
0055     def add_arguments(cls, parser):
0056         workflow_parser = DTWorkflow.add_parser_options(parser)
0057         for workflow in cls.available_workflows:
0058             class_name = "DT" + workflow + "Workflow"
0059             try:
0060                 workflow_class = eval( class_name )
0061                 workflow_class.add_parser_options(workflow_parser)
0062             except:
0063                 log.error("No class with name: %s exists but workflow exists in %s" %
0064                             (class_name, DTCalibrationWorker)
0065                          )
0066