2025-01-08 15:14:06 +00:00
|
|
|
import csv
|
|
|
|
from os import PathLike
|
2025-01-17 16:56:52 +00:00
|
|
|
from typing import AsyncIterable, Mapping, Sequence, Union
|
2025-01-08 15:14:06 +00:00
|
|
|
|
2025-01-22 18:24:04 +00:00
|
|
|
from autobigsst.engine.data.structures.mlst import Allele, MLSTProfile
|
2025-01-08 15:14:06 +00:00
|
|
|
|
|
|
|
|
2025-01-08 21:32:10 +00:00
|
|
|
def dict_loci_alleles_variants_from_loci(alleles_map: Mapping[str, Sequence[Allele]]):
|
2025-01-09 21:44:28 +00:00
|
|
|
result_dict: dict[str, Union[list[str], str]] = {}
|
2025-01-08 15:14:06 +00:00
|
|
|
for loci, alleles in alleles_map.items():
|
2025-01-09 21:44:28 +00:00
|
|
|
if len(alleles) == 1:
|
|
|
|
result_dict[loci] = alleles[0].allele_variant
|
2025-01-17 16:56:52 +00:00
|
|
|
else:
|
2025-01-17 17:04:22 +00:00
|
|
|
result_locis = list()
|
2025-01-17 16:56:52 +00:00
|
|
|
for allele in alleles:
|
|
|
|
result_locis.append(allele.allele_variant)
|
|
|
|
result_dict[loci] = result_locis
|
2025-01-08 15:14:06 +00:00
|
|
|
return result_dict
|
|
|
|
|
|
|
|
|
2025-01-09 17:27:15 +00:00
|
|
|
async def write_mlst_profiles_as_csv(mlst_profiles_iterable: AsyncIterable[tuple[str, Union[MLSTProfile, None]]], handle: Union[str, bytes, PathLike[str], PathLike[bytes]]) -> Sequence[str]:
|
|
|
|
failed = list()
|
2025-01-08 15:14:06 +00:00
|
|
|
with open(handle, "w", newline='') as filehandle:
|
2025-01-08 21:32:10 +00:00
|
|
|
header = None
|
|
|
|
writer: Union[csv.DictWriter, None] = None
|
|
|
|
async for name, mlst_profile in mlst_profiles_iterable:
|
2025-01-09 17:27:15 +00:00
|
|
|
if mlst_profile is None:
|
|
|
|
failed.append(name)
|
|
|
|
continue
|
2025-01-08 21:32:10 +00:00
|
|
|
if writer is None:
|
2025-01-09 07:39:18 +00:00
|
|
|
header = ["id", "st", "clonal-complex", *mlst_profile.alleles.keys()]
|
2025-01-08 21:32:10 +00:00
|
|
|
writer = csv.DictWriter(filehandle, fieldnames=header)
|
|
|
|
writer.writeheader()
|
2025-01-08 15:14:06 +00:00
|
|
|
row_dictionary = {
|
|
|
|
"st": mlst_profile.sequence_type,
|
|
|
|
"clonal-complex": mlst_profile.clonal_complex,
|
2025-01-08 21:32:10 +00:00
|
|
|
"id": name,
|
|
|
|
**dict_loci_alleles_variants_from_loci(mlst_profile.alleles)
|
2025-01-08 15:14:06 +00:00
|
|
|
}
|
2025-01-09 17:27:15 +00:00
|
|
|
writer.writerow(rowdict=row_dictionary)
|
|
|
|
return failed
|