code: def _get_other_cols(row: StructExpression) -> List[Column]:
      assert check_argument_types()
  
      other_cols = []
      if "cm_position" in row and row.cm_position.dtype == tfloat64:
          other_cols.append(fx.col("cm_position").alias("position"))
      if "qual" in row and row.qual.dtype == tfloat64:
          # -10 qual means missing
          other_cols.append(
              fx.expr("if(qual = -10, null, qual)").alias("qual")
          )
      # [] filters means PASS, null filters means missing
      if "filters" in row and row.filters.dtype == tset(tstr):
          other_cols.append(
              fx.expr(
                  "if(size(filters) = 0, array('PASS'), filters)"
              ).alias("filters")
          )
      # Rename info.* columns to INFO_*
      if "info" in row and isinstance(row.info.dtype, tstruct):
          for f in row.info:
              other_cols.append(
                  fx.col(f"`info.{f}`").alias(f"INFO_{f}")
              )
  
      assert check_return_type(other_cols)
      return other_cols
  
file_path: glow/python/glow/hail/functions.py
imports: import hail
  from hail import MatrixTable
  from hail.expr.expressions.typed_expressions import StructExpression
  from hail.expr.types import tarray, tbool, tcall, tfloat64, tint, tlocus, tset, tstr, tstruct
  from pyspark.sql import Column, DataFrame
  import pyspark.sql.functions
  from typing import List, NoReturn, Optional
  from typeguard import check_argument_types, check_return_type
label_desc: Use image node_id 4 for calling a global function with example usage: _get_other_cols(row) and returns: other_cols