import json
from typing import List, Union
import pandas as pd
from ..allele import AlleleParser
[docs]
def remove_HLA_prefix(coverage: dict) -> dict:
"""
Remove HLA- prefix from coverage
"""
new_coverage = dict()
for key, value in coverage.items():
key = key.replace("HLA-", "")
new_coverage[key] = value
return new_coverage
[docs]
def read_json(path: str) -> dict:
"""
Reads a json file and returns a dict
"""
file = open(path)
d = json.load(file)
file.close()
return d
[docs]
class Gene:
"""
This object holds the genes parsed from genotyping reports
"""
def __init__(self, name: str, calls: dict, allele_parser: AlleleParser, coverage: List[dict] = []):
self.name = name
self.coverage = pd.DataFrame(coverage)
self.calls = calls
self.allele_parser = allele_parser
self.alleles = list()
for alleles in self.calls.values():
parsed_calls = [str(self.allele_parser.parse(a)) for a in alleles]
self.alleles.extend(parsed_calls)
def __str__(self) -> str:
ret = {
"name": self.name,
"calls": self.calls,
}
if not self.coverage.empty:
ret["mean_cov"] = self.mean_coverage()
return str(ret)
[docs]
def mean_coverage(self) -> Union[float, None]:
"""
Get the mean coverage of exons from the gene
"""
if "mean_cov" not in self.coverage.columns:
return None
mean_cov = self.coverage["mean_cov"].mean()
return float(mean_cov)
[docs]
def asdict(self) -> dict:
"""
Convert this object into a dictionary
"""
return {
"gene": self.name,
"coverage": self.mean_coverage(),
}
[docs]
class Report:
def __init__(self, report: dict, allele_parser: AlleleParser):
self.sample = report["sample"]
self.allele_parser = allele_parser
self.__parse_genes__(
calls=report["calls"], coverage=report["coverage"])
def __parse_genes__(self, calls: dict, coverage: dict):
"""
Parses the genes from the report and adds them to
`self.genes`
"""
coverage = remove_HLA_prefix(coverage)
self.genes = list()
for gene in coverage.keys():
g = self.__parse_gene__(
name=gene, coverage=coverage[gene], calls=calls[gene]
)
self.genes.append(g)
def __parse_gene__(self, name: str, coverage: List[dict], calls: dict) -> Gene:
"""
Parses a single gene from the report.
"""
return Gene(name=name, coverage=coverage, calls=calls, allele_parser=self.allele_parser)
[docs]
def aslist(self) -> List[dict]:
"""
Convert the report into a list of dictionaries
"""
result = list()
for gene in self.genes:
d = gene.asdict()
d["sample"] = self.sample
result.append(d)
return result