annotate phe/variant/variant_factory.py @ 3:879d0f13a737 draft

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