Source code for lineage.individual
"""Class for representing individuals within the `lineage` framework."""
import inspect
from snps import SNPs
from snps.utils import clean_str
[docs]
class Individual(SNPs):
"""Object used to represent and interact with an individual.
The ``Individual`` object maintains information about an individual. The object provides
methods for loading an individual's genetic data (SNPs) and normalizing it for use with the
`lineage` framework.
``Individual`` inherits from ``snps.SNPs``. See here for details about the ``SNPs`` object:
https://snps.readthedocs.io/en/latest/snps.html
"""
[docs]
def __init__(self, name, raw_data=(), **kwargs):
"""Initialize an ``Individual`` object.
Parameters
----------
name : str
name of the individual
raw_data : str, bytes, ``SNPs`` (or list or tuple thereof)
path(s) to file(s), bytes, or ``SNPs`` object(s) with raw genotype data
**kwargs
parameters to ``snps.SNPs`` and/or ``snps.SNPs.merge``
"""
self._name = name
init_args = self._get_defined_kwargs(SNPs, kwargs)
merge_args = self._get_defined_kwargs(SNPs.merge, kwargs)
super().__init__(**init_args)
# load raw data by merging `SNPs` objects into this object
if not isinstance(raw_data, list) and not isinstance(raw_data, tuple):
s = (
SNPs(raw_data, **init_args)
if not isinstance(raw_data, SNPs)
else raw_data
)
self.merge([s], **merge_args)
else:
for file in raw_data:
s = file
if not isinstance(file, SNPs):
s = SNPs(file, **init_args)
self.merge([s], **merge_args)
def _get_defined_kwargs(self, callable, kwargs):
sig = inspect.signature(callable)
return {k: kwargs[k] for k in kwargs if k in sig.parameters}
def __repr__(self):
return "Individual({!r})".format(self._name)
@property
def name(self):
"""Get this ``Individual``'s name.
Returns
-------
str
"""
return self._name
[docs]
def get_var_name(self):
return clean_str(self.name)