docs: def map_uniprot_resnum_to_pdb(uniprot_resnum, chain_id, sifts_file):
      """Map a UniProt residue number to its corresponding PDB residue number.
  
      This function requires that the SIFTS file be downloaded,
      and also a chain ID (as different chains may have different mappings).
  
      Args:
          uniprot_resnum (int): integer of the residue number you'd like to map
          chain_id (str): string of the PDB chain to map to
          sifts_file (str): Path to the SIFTS XML file
  
      Returns:
          (tuple): tuple containing:
  
              mapped_resnum (int): Mapped residue number
              is_observed (bool): Indicates if the 3D structure actually shows the residue
  
      """
      # Load the xml with lxml
      parser = etree.XMLParser(ns_clean=True)
      tree = etree.parse(sifts_file, parser)
      root = tree.getroot()
  
      my_pdb_resnum = None
  
      # TODO: "Engineered_Mutation is also a possible annotation, need to figure out what to do with that
      my_pdb_annotation = False
  
      # Find the right chain (entities in the xml doc)
      ent = './/{http://www.ebi.ac.uk/pdbe/docs/sifts/eFamily.xsd}entity'
      for chain in root.findall(ent):
          # TODO: IMPORTANT - entityId is not the chain ID!!! it is just in alphabetical order!
          if chain.attrib['entityId'] == chain_id:
              # Find the "crossRefDb" tag that has the attributes dbSource="UniProt" and  dbResNum="your_resnum_here"
              # Then match it to the crossRefDb dbResNum that has the attribute dbSource="PDBresnum"
  
              # Check if uniprot + resnum even exists in the sifts file (it won't if the pdb doesn't contain the residue)
              ures = './/{http://www.ebi.ac.uk/pdbe/docs/sifts/eFamily.xsd}crossRefDb[@dbSource="UniProt"][@dbResNum="%s"]' % uniprot_resnum
              my_uniprot_residue = chain.findall(ures)
              if len(my_uniprot_residue) == 1:
                  # Get crossRefDb dbSource="PDB"
                  parent = my_uniprot_residue[0].getparent()
                  pres = './/{http://www.ebi.ac.uk/pdbe/docs/sifts/eFamily.xsd}crossRefDb[@dbSource="PDB"]'
                  my_pdb_residue = parent.findall(pres)
                  my_pdb_resnum = int(my_pdb_residue[0].attrib['dbResNum'])
  
                  # Get <residueDetail dbSource="PDBe" property="Annotation">
                  # Will be Not_Observed if it is not seen in the PDB
                  anno = './/{http://www.ebi.ac.uk/pdbe/docs/sifts/eFamily.xsd}residueDetail[@dbSource="PDBe"][@property="Annotation"]'
                  my_pdb_annotation = parent.findall(anno)
                  if len(my_pdb_annotation) == 1:
                      my_pdb_annotation = my_pdb_annotation[0].text
                      if my_pdb_annotation == 'Not_Observed':
                          my_pdb_annotation = False
                  else:
                      my_pdb_annotation = True
              else:
                  return None, False
  
      return my_pdb_resnum, my_pdb_annotation