docs: def _convert(self, chain_id, residue_id, from_scheme, to_scheme):
          '''The actual 'private' conversion function.'''
  
          # There are 12 valid combinations but rather than write them all out explicitly, we will use recursion, sacrificing speed for brevity
          if from_scheme == 'rosetta':
              atom_id = self.rosetta_to_atom_sequence_maps.get(chain_id, {})[residue_id]
              if to_scheme == 'atom':
                  return atom_id
              else:
                  return self._convert(chain_id, atom_id, 'atom', to_scheme)
          if from_scheme == 'atom':
              if to_scheme == 'rosetta':
                  return self.atom_to_rosetta_sequence_maps.get(chain_id, {})[residue_id]
              else:
                  seqres_id = self.atom_to_seqres_sequence_maps.get(chain_id, {})[residue_id]
                  if to_scheme == 'seqres':
                      return seqres_id
                  return self.convert(chain_id, seqres_id, 'seqres', to_scheme)
          if from_scheme == 'seqres':
              if to_scheme == 'uniparc':
                  return self.seqres_to_uniparc_sequence_maps.get(chain_id, {})[residue_id]
              else:
                  atom_id = self.seqres_to_atom_sequence_maps.get(chain_id, {})[residue_id]
                  if to_scheme == 'atom':
                      return atom_id
                  return self.convert(chain_id, atom_id, 'atom', to_scheme)
          if from_scheme == 'uniparc':
              seqres_id = self.uniparc_to_seqres_sequence_maps.get(chain_id, {})[residue_id]
              if to_scheme == 'seqres':
                  return seqres_id
              else:
                  return self._convert(chain_id, seqres_id, 'seqres', to_scheme)
  
          raise Exception("We should never reach this line.")