docs: def store_psm_protein_relations(fn, header, pgdb, proteins):
      """Reads PSMs from file, extracts their proteins and peptides and passes
      them to a database backend in chunks.
      """
      # TODO do we need an OrderedDict or is regular dict enough?
      # Sorting for psm_id useful?
      allpsms = OrderedDict()
      last_id, psmids_to_store = None, set()
      store_soon = False
      for psm in tsvreader.generate_tsv_psms(fn, header):
          psm_id, prots = tsvreader.get_pepproteins(psm)
          prots = [x for x in prots if x in proteins]
          try:
              # In case the PSMs are presented unrolled
              allpsms[psm_id].extend(prots)
          except KeyError:
              allpsms[psm_id] = prots
          if len(psmids_to_store) % DB_STORE_CHUNK == 0:
              store_soon = True
          if store_soon and last_id != psm_id:
              pgdb.store_peptides_proteins(allpsms, psmids_to_store)
              store_soon = False
              psmids_to_store = set()
          psmids_to_store.add(psm_id)
          last_id = psm_id
      if len(psmids_to_store) > 0:
          pgdb.store_peptides_proteins(allpsms, psmids_to_store)
      pgdb.index_protein_peptides()
      return allpsms