Mercurial > repos > ulfschaefer > vcfs2fasta
comparison phe/variant/variant_factory.py @ 14:f72039c5faa4 draft
Uploaded
author | ulfschaefer |
---|---|
date | Wed, 16 Dec 2015 07:29:05 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
13:2e69ce9dca65 | 14:f72039c5faa4 |
---|---|
1 '''Classes and functions for working with variant callers. | |
2 | |
3 Created on 22 Sep 2015 | |
4 | |
5 @author: alex | |
6 ''' | |
7 import glob | |
8 import inspect | |
9 import logging | |
10 import os | |
11 import sys | |
12 | |
13 from phe.variant import VariantCaller | |
14 | |
15 def dynamic_caller_loader(): | |
16 """Fancy way of dynamically importing existing variant callers. | |
17 | |
18 Returns | |
19 ------- | |
20 dict: | |
21 Available variant callers dictionary. Keys are parameters that | |
22 can be used to call variants. | |
23 """ | |
24 | |
25 # We assume the caller are in the same directory as THIS file. | |
26 variants_dir = os.path.dirname(__file__) | |
27 variants_dir = os.path.abspath(variants_dir) | |
28 | |
29 # This is populated when the module is first imported. | |
30 avail_callers = {} | |
31 | |
32 # Add this directory to the syspath. | |
33 sys.path.insert(0, variants_dir) | |
34 | |
35 # Find all "py" files. | |
36 for caller_mod in glob.glob(os.path.join(variants_dir, "*.py")): | |
37 | |
38 # Derive name of the module where caller is. | |
39 caller_mod_file = os.path.basename(caller_mod) | |
40 | |
41 # Ignore __init__ file, only base class is there. | |
42 if caller_mod_file.startswith("__init__"): | |
43 continue | |
44 | |
45 # Import the module with a caller. | |
46 mod = __import__(caller_mod_file.replace(".pyc", "").replace(".py", "")) | |
47 | |
48 # Find all the classes contained in this module. | |
49 classes = inspect.getmembers(mod, inspect.isclass) | |
50 for cls_name, cls in classes: | |
51 # For each class, if it is a sublass of VariantCaller, add it. | |
52 if cls_name != "VariantCaller" and issubclass(cls, VariantCaller): | |
53 # The name is inherited and defined within each caller. | |
54 avail_callers[cls.name] = cls | |
55 | |
56 sys.path.remove(variants_dir) | |
57 | |
58 return avail_callers | |
59 | |
60 _avail_variant_callers = dynamic_caller_loader() | |
61 | |
62 def available_callers(): | |
63 """Return list of available variant callers.""" | |
64 return _avail_variant_callers.keys() | |
65 | |
66 def factory(variant=None, custom_options=None): | |
67 """Make an instance of a variant class. | |
68 | |
69 Parameters: | |
70 ----------- | |
71 variant: str, optional | |
72 Name of the variant class to instantiate. | |
73 custom_options: str, optional | |
74 Custom options to be passed directly to the implementing class. | |
75 | |
76 Returns: | |
77 -------- | |
78 :py:class:`phe.variant.VariantCaller`: | |
79 Instance of the :py:class:`phe.variant.VariantCaller` for given | |
80 variant name, or None if one couldn't be found. | |
81 """ | |
82 if variant is not None and isinstance(variant, str): | |
83 | |
84 variant = variant.lower() | |
85 if variant in _avail_variant_callers: | |
86 return _avail_variant_callers[variant](cmd_options=custom_options) | |
87 else: | |
88 logging.error("No implementation for %s mapper.") | |
89 return None | |
90 | |
91 logging.warn("Unknown parameters. Mapper could not be initialised.") | |
92 return None |