docs: def parse_mmcif_header(infile):
      """Parse a couple important fields from the mmCIF file format with some manual curation of ligands.
  
      If you want full access to the mmCIF file just use the MMCIF2Dict class in Biopython.
  
      Args:
          infile: Path to mmCIF file
  
      Returns:
          dict: Dictionary of parsed header
  
      """
      from Bio.PDB.MMCIF2Dict import MMCIF2Dict
  
      newdict = {}
      try:
          mmdict = MMCIF2Dict(infile)
      except ValueError as e:
          log.exception(e)
          return newdict
  
      chemical_ids_exclude = ['HOH']
      chemical_types_exclude = ['l-peptide linking','peptide linking']
  
      if '_struct.title' in mmdict:
          newdict['pdb_title'] = mmdict['_struct.title']
      else:
          log.debug('{}: No title field'.format(infile))
  
      if '_struct.pdbx_descriptor' in mmdict:
          newdict['description'] = mmdict['_struct.pdbx_descriptor']
      else:
          log.debug('{}: no description field'.format(infile))
  
      if '_pdbx_database_status.recvd_initial_deposition_date' in mmdict:
          newdict['date'] = mmdict['_pdbx_database_status.recvd_initial_deposition_date']
      elif '_database_PDB_rev.date' in mmdict:
          newdict['date'] = mmdict['_database_PDB_rev.date']
      else:
          log.debug('{}: no date field'.format(infile))
  
      if '_exptl.method' in mmdict:
          newdict['experimental_method'] = mmdict['_exptl.method']
      else:
          log.debug('{}: no experimental method field'.format(infile))
  
      # TODO: refactor how to get resolutions based on experimental method
      if '_refine.ls_d_res_high' in mmdict:
          try:
              if isinstance(mmdict['_refine.ls_d_res_high'], list):
                  newdict['resolution'] = [float(x) for x in mmdict['_refine.ls_d_res_high']]
              else:
                  newdict['resolution'] = float(mmdict['_refine.ls_d_res_high'])
          except:
              try:
                  newdict['resolution'] = float(mmdict['_em_3d_reconstruction.resolution'])
              except:
                  log.debug('{}: no resolution field'.format(infile))
      else:
          log.debug('{}: no resolution field'.format(infile))
  
      if '_chem_comp.id' in mmdict:
          chemicals_filtered = ssbio.utils.filter_list_by_indices(mmdict['_chem_comp.id'],
                                                              ssbio.utils.not_find(mmdict['_chem_comp.type'],
                                                                             chemical_types_exclude,
                                                                             case_sensitive=False))
          chemicals_fitered = ssbio.utils.filter_list(chemicals_filtered, chemical_ids_exclude, case_sensitive=True)
          newdict['chemicals'] = chemicals_fitered
      else:
          log.debug('{}: no chemical composition field'.format(infile))
  
      if '_entity_src_gen.pdbx_gene_src_scientific_name' in mmdict:
          newdict['taxonomy_name'] = mmdict['_entity_src_gen.pdbx_gene_src_scientific_name']
      else:
          log.debug('{}: no organism field'.format(infile))
  
      return newdict