code: def get_filtered_isovar_epitopes(self, epitopes, ic50_cutoff):
          
          mutant_binding_predictions = []
          for binding_prediction in epitopes:
              peptide = binding_prediction.peptide
              peptide_offset = binding_prediction.offset
              isovar_row = dict(binding_prediction.source_sequence_key)
              is_mutant = contains_mutant_residues(
                  peptide_start_in_protein=peptide_offset,
                  peptide_length=len(peptide),
                  mutation_start_in_protein=isovar_row["variant_aa_interval_start"],
                  mutation_end_in_protein=isovar_row["variant_aa_interval_end"])
              if is_mutant and binding_prediction.value <= ic50_cutoff:
                  mutant_binding_predictions.append(binding_prediction)
          return EpitopeCollection(mutant_binding_predictions)
docs: Mostly replicates topiary.build_epitope_collection_from_binding_predictions
  
          Note: topiary needs to do fancy stuff like subsequence_protein_offset + binding_prediction.offset
          in order to figure out whether a variant is in the peptide because it only has the variant's
          offset into the full protein; but isovar gives us the variant's offset into the protein subsequence
          (dictated by protein_sequence_length); so all we need to do is map that onto the smaller 8-11mer
          peptides generated by mhctools.