def summarize_analysis( *args, **kwargs) -> Tuple[Optional[Sample], Counter[Id], Counter[Id], Scores]: """ Summarize for a cross-analysis (to be usually called in parallel!). """ # Recover input and parameters analysis: str = args[0] ontology: Ontology = kwargs['ontology'] # TODO: Delete the following comment lines in a future release # including = ontology.including # See comment below for the reason # excluding = ontology.excluding # in/excluding are not used anymore counts: Dict[Sample, Counter[Id]] = kwargs['counts'] scores: Dict[Sample, Dict[Id, Score]] = kwargs['scores'] samples: List[Sample] = kwargs['samples'] output: io.StringIO = io.StringIO(newline='') # Declare/define variables summary_counts: Counter[Id] = col.Counter() summary_acc: Counter[Id] = col.Counter() summary_score: Scores = Scores({}) summary: Optional[Sample] = None output.write(gray('Summary for ') + analysis + gray('... ')) target_samples: List[Sample] = [ smpl for smpl in samples if smpl.startswith(analysis) ] assert len(target_samples) >= 1, \ red('ERROR! ') + analysis + gray(' has no samples to summarize!') for smpl in target_samples: summary_counts += counts[smpl] summary_score.update(scores[smpl]) tree = TaxTree() tree.grow(ontology=ontology, counts=summary_counts, scores=summary_score) tree.subtract() tree.shape() summary_counts.clear() summary_score.clear() # Avoid including/excluding here as get_taxa is not as 'clever' as allin1 # and taxa are already included/excluded in the derived samples tree.get_taxa(counts=summary_counts, accs=summary_acc, scores=summary_score) summary_counts = +summary_counts # remove counts <= 0 if summary_counts: # Avoid returning empty sample (summary would be None) summary = Sample(f'{analysis}_{STR_SUMMARY}') output.write( gray('(') + cyan(f'{len(target_samples)}') + gray(' samples)') + green(' OK!\n')) else: output.write(yellow(' VOID\n')) # Print output and return print(output.getvalue(), end='') sys.stdout.flush() return summary, summary_counts, summary_acc, summary_score
def summarize_analysis( *args, **kwargs) -> Tuple[Sample, Counter[Id], Counter[Id], Scores]: """ Summarize for a cross-analysis (to be usually called in parallel!). """ # Recover input and parameters analysis: str = args[0] ontology: Ontology = kwargs['ontology'] including = ontology.including excluding = ontology.excluding counts: Dict[Sample, Counter[Id]] = kwargs['counts'] scores: Dict[Sample, Dict[Id, Score]] = kwargs['scores'] samples: List[Sample] = kwargs['samples'] output: io.StringIO = io.StringIO(newline='') # Declare/define variables summary_counts: Counter[Id] = Counter() summary_acc: Counter[Id] = Counter() summary_score: Scores = Scores({}) summary: Sample = None output.write(gray('Summary for ') + analysis + gray('... ')) target_samples: List[Sample] = [ smpl for smpl in samples if smpl.startswith(analysis) ] assert len(target_samples) >= 1, \ red('ERROR! ') + analysis + gray(' has no samples to summarize!') for smpl in target_samples: summary_counts += counts[smpl] summary_score.update(scores[smpl]) tree = TaxTree() tree.grow(ontology=ontology, counts=summary_counts, scores=summary_score) tree.subtract() tree.shape() summary_counts.clear() summary_score.clear() tree.get_taxa(counts=summary_counts, accs=summary_acc, scores=summary_score, include=including, exclude=excluding) summary_counts = +summary_counts # remove counts <= 0 if summary_counts: # Avoid returning empty sample (summary would be None) summary = Sample(f'{analysis}_{STR_SUMMARY}') output.write( gray('(') + cyan(f'{len(target_samples)}') + gray(' samples)') + green(' OK!\n')) else: output.write(yellow(' VOID\n')) # Print output and return print(output.getvalue(), end='') sys.stdout.flush() return summary, summary_counts, summary_acc, summary_score