code: def parse_cigar_string(cigar_str):
      """Parse a cigar string into a list of cigar units.
  
      For example, if cigar_str is 150M2S, this function will return:
  
      [
        CigarUnit(operation=ALIGNMENT_MATCH, operation_length=150),
        CigarUnit(operation=SOFT_CLIP, operation_length=2)
      ]
  
      Args:
        cigar_str: str containing a valid cigar.
  
      Returns:
        list[cigar_pb2.CigarUnit].
  
      Raises:
        ValueError: If cigar_str isn't a well-formed CIGAR.
      """
      if not cigar_str:
          raise ValueError("cigar_str cannot be empty")
      if not VALID_CIGAR_RE.match(cigar_str):
          raise ValueError(
              "Malformed CIGAR string {}".format(cigar_str)
          )
      parts = CIGAR_STR_SPLITTER_RE.finditer(cigar_str)
      return [to_cigar_unit(part.group(1)) for part in parts]
  
file_path: deepvariant/third_party/nucleus/util/cigar.py
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import re
  import six
  from third_party.nucleus.protos import cigar_pb2
label_desc: Use image node_id 2 for calling a global function with example usage: parse_cigar_string(cigar_str) and returns: unknown