code: def curate_pileup(channels: List[np.ndarray]) -> PileupCuration:
      """Runs all automated curation functions and outputs categorical tags.
  
      The following values are possible for each descriptor:
      * base_quality: GOOD (>5% low quality) or BAD.
      * mapping_quality: GOOD (<5% low quality) or BAD.
      * strand_biased: BIASED (p-value < 0.05) or GOOD.
      * diff_category: MANY_DIFFS (>1% differences), NEARBY_VARIANTS (5+ variants),
      or FEW_DIFFS otherwise.
      * read_support: LOW (<=30%), HALF (30-80%), ALL (>80%).
  
      The thresholds were all set by trying to match human curation.
  
      Args:
          channels: A list of DeepVariant channels.
  
      Returns:
          A PileupCuration NamedTuple.
      """
  
      return PileupCuration(
          base_quality=BaseQuality.GOOD
          if fraction_low_base_quality(channels) < 0.05
          else BaseQuality.BAD,
          mapping_quality=MappingQuality.GOOD
          if fraction_reads_with_low_mapq(channels) < 0.05
          else MappingQuality.BAD,
          strand_bias=StrandBias.BIASED
          if pvalue_for_strand_bias(channels) < 0.05
          else StrandBias.GOOD,
          diff_category=describe_diff(channels),
          read_support=describe_read_support(channels),
      )
  
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import enum
  import math
  from typing import List, NamedTuple, Tuple
  from etils import epath
  from IPython import display
  import numpy
  from PIL import Image
  from PIL import ImageDraw
  from third_party.nucleus.protos import variants_pb2
label_desc: Use image node_id 29 for calling a global function with example usage: curate_pileup(channels) and returns: PileupCuration