void OpenSwathDataAccessHelper::convertTargetedPeptide(const TargetedExperiment::Peptide& pep, OpenSwath::LightPeptide & p) { OpenSwath::LightModification m; OpenMS::ModificationsDB* mod_db = OpenMS::ModificationsDB::getInstance(); p.id = pep.id; if (!pep.rts.empty()) { p.rt = pep.rts[0].getCVTerms()["MS:1000896"][0].getValue().toString().toDouble(); } p.charge = pep.getChargeState(); p.sequence = pep.sequence; p.peptide_group_label = pep.getPeptideGroupLabel(); p.protein_refs.clear(); if (!pep.protein_refs.empty()) { p.protein_refs.insert( p.protein_refs.begin(), pep.protein_refs.begin(), pep.protein_refs.end() ); } // Mapping of peptide modifications { OpenMS::AASequence aa_sequence = TargetedExperimentHelper::getAASequence(pep); if ( !aa_sequence.getNTerminalModification().empty()) { ResidueModification rmod = mod_db->getTerminalModification(aa_sequence.getNTerminalModification(), ResidueModification::N_TERM); m.location = -1; m.unimod_id = rmod.getUniModAccession(); p.modifications.push_back(m); } if ( !aa_sequence.getCTerminalModification().empty()) { ResidueModification rmod = mod_db->getTerminalModification(aa_sequence.getCTerminalModification(), ResidueModification::C_TERM); m.location = boost::numeric_cast<int>(aa_sequence.size()); m.unimod_id = rmod.getUniModAccession(); p.modifications.push_back(m); } for (Size i = 0; i != aa_sequence.size(); i++) { if (aa_sequence[i].isModified()) { // search the residue in the modification database (if the sequence is valid, we should find it) ResidueModification rmod = mod_db->getModification(aa_sequence.getResidue(i).getOneLetterCode(), aa_sequence.getResidue(i).getModification(), ResidueModification::ANYWHERE); m.location = boost::numeric_cast<int>(i); m.unimod_id = rmod.getUniModAccession(); p.modifications.push_back(m); } } } // transition_exp.peptides.push_back(p); }
void MRMDecoy::generateDecoys(OpenMS::TargetedExperiment& exp, OpenMS::TargetedExperiment& dec, String method, String decoy_tag, double identity_threshold, int max_attempts, double mz_threshold, double mz_shift, bool exclude_similar, double similarity_threshold, bool remove_CNterminal_mods, double precursor_mass_shift, std::vector<String> fragment_types, std::vector<size_t> fragment_charges, bool enable_specific_losses, bool enable_unspecific_losses, bool remove_unannotated, int round_decPow) { MRMIonSeries mrmis; MRMDecoy::PeptideVectorType peptides, decoy_peptides; MRMDecoy::ProteinVectorType proteins, decoy_proteins; MRMDecoy::TransitionVectorType decoy_transitions; for (Size i = 0; i < exp.getProteins().size(); i++) { OpenMS::TargetedExperiment::Protein protein = exp.getProteins()[i]; protein.id = decoy_tag + protein.id; proteins.push_back(protein); } std::vector<String> exclusion_peptides; // Go through all peptides and apply the decoy method to the sequence // (pseudo-reverse, reverse or shuffle). Then set the peptides and proteins of the decoy // experiment. for (Size pep_idx = 0; pep_idx < exp.getPeptides().size(); ++pep_idx) { OpenMS::TargetedExperiment::Peptide peptide = exp.getPeptides()[pep_idx]; // continue if the peptide has C/N terminal modifications and we should exclude them if (remove_CNterminal_mods && MRMDecoy::has_CNterminal_mods(peptide)) {continue; } peptide.id = decoy_tag + peptide.id; OpenMS::String original_sequence = peptide.sequence; if (!peptide.getPeptideGroupLabel().empty()) { peptide.setPeptideGroupLabel(decoy_tag + peptide.getPeptideGroupLabel()); } if (method == "pseudo-reverse") { peptide = MRMDecoy::pseudoreversePeptide(peptide); } else if (method == "reverse") { peptide = MRMDecoy::reversePeptide(peptide); } else if (method == "shuffle") { peptide = MRMDecoy::shufflePeptide(peptide, identity_threshold, -1, max_attempts); } for (Size prot_idx = 0; prot_idx < peptide.protein_refs.size(); ++prot_idx) { peptide.protein_refs[prot_idx] = decoy_tag + peptide.protein_refs[prot_idx]; } if (MRMDecoy::AASequenceIdentity(original_sequence, peptide.sequence) > identity_threshold) { if (!exclude_similar) { std::cout << "Target sequence: " << original_sequence << " Decoy sequence: " << peptide.sequence << " Sequence identity: " << MRMDecoy::AASequenceIdentity(original_sequence, peptide.sequence) << " Identity threshold: " << identity_threshold << std::endl; throw Exception::IllegalArgument(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, "AA Sequences are too similar. Either decrease identity_threshold and increase max_attempts for the shuffle method or set flag exclude_similar."); } else { exclusion_peptides.push_back(peptide.id); } } peptides.push_back(peptide); } dec.setPeptides(peptides); // temporary set peptides, overwrite later again! // hash of the peptide reference containing all transitions MRMDecoy::PeptideTransitionMapType peptide_trans_map; for (Size i = 0; i < exp.getTransitions().size(); i++) { peptide_trans_map[exp.getTransitions()[i].getPeptideRef()].push_back(&exp.getTransitions()[i]); } Size progress = 0; startProgress(0, exp.getTransitions().size(), "Creating decoys"); for (MRMDecoy::PeptideTransitionMapType::iterator pep_it = peptide_trans_map.begin(); pep_it != peptide_trans_map.end(); ++pep_it) { String peptide_ref = pep_it->first; String decoy_peptide_ref = decoy_tag + pep_it->first; // see above, the decoy peptide id is computed deterministically from the target id const TargetedExperiment::Peptide target_peptide = exp.getPeptideByRef(peptide_ref); // continue if the peptide has C/N terminal modifications and we should exclude them if (remove_CNterminal_mods && MRMDecoy::has_CNterminal_mods(target_peptide)) {continue;} const TargetedExperiment::Peptide decoy_peptide = dec.getPeptideByRef(decoy_peptide_ref); OpenMS::AASequence target_peptide_sequence = TargetedExperimentHelper::getAASequence(target_peptide); OpenMS::AASequence decoy_peptide_sequence = TargetedExperimentHelper::getAASequence(decoy_peptide); int decoy_charge = 1; int target_charge = 1; if (decoy_peptide.hasCharge()) {decoy_charge = decoy_peptide.getChargeState();} if (target_peptide.hasCharge()) {target_charge = target_peptide.getChargeState();} MRMIonSeries::IonSeries decoy_ionseries = mrmis.getIonSeries(decoy_peptide_sequence, decoy_charge, fragment_types, fragment_charges, enable_specific_losses, enable_unspecific_losses, round_decPow); MRMIonSeries::IonSeries target_ionseries = mrmis.getIonSeries(target_peptide_sequence, target_charge, fragment_types, fragment_charges, enable_specific_losses, enable_unspecific_losses, round_decPow); for (Size i = 0; i < pep_it->second.size(); i++) { setProgress(++progress); const ReactionMonitoringTransition tr = *(pep_it->second[i]); if (!tr.isDetectingTransition() || tr.getDecoyTransitionType() == ReactionMonitoringTransition::DECOY) { continue; } ReactionMonitoringTransition decoy_tr = tr; // copy the target transition decoy_tr.setNativeID(decoy_tag + tr.getNativeID()); decoy_tr.setDecoyTransitionType(ReactionMonitoringTransition::DECOY); decoy_tr.setPrecursorMZ(tr.getPrecursorMZ() + precursor_mass_shift); // fix for TOPPView: Duplicate precursor MZ is not displayed. // determine the current annotation for the target ion and then select // the appropriate decoy ion for this target transition std::pair<String, double> targetion = mrmis.annotateIon(target_ionseries, tr.getProductMZ(), mz_threshold); std::pair<String, double> decoyion = mrmis.getIon(decoy_ionseries, targetion.first); if (method == "shift") { decoy_tr.setProductMZ(decoyion.second + mz_shift); } else { decoy_tr.setProductMZ(decoyion.second); } decoy_tr.setPeptideRef(decoy_tag + tr.getPeptideRef()); if (decoyion.second > 0) { if (similarity_threshold >= 0) { if (std::fabs(tr.getProductMZ() - decoy_tr.getProductMZ()) < similarity_threshold) { if (!exclude_similar) { throw Exception::IllegalArgument(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, "Fragment ions are too similar. Either decrease similarity_threshold or set flag exclude_similar."); } else { exclusion_peptides.push_back(decoy_tr.getPeptideRef()); } } } decoy_transitions.push_back(decoy_tr); } else { if (remove_unannotated) { exclusion_peptides.push_back(decoy_tr.getPeptideRef()); } else { throw Exception::IllegalArgument(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, "Decoy fragment ion for target fragment ion " + String(targetion.first) + " of peptide " + target_peptide_sequence.toString() + " with precursor charge " + String(target_peptide.getChargeState()) + " could not be mapped. Please check whether it is a valid ion and enable losses or removal of terminal modifications if necessary. Skipping of unannotated target assays is available as last resort."); } } } // end loop over transitions } // end loop over peptides endProgress(); MRMDecoy::TransitionVectorType filtered_decoy_transitions; for (MRMDecoy::TransitionVectorType::iterator tr_it = decoy_transitions.begin(); tr_it != decoy_transitions.end(); ++tr_it) { if (std::find(exclusion_peptides.begin(), exclusion_peptides.end(), tr_it->getPeptideRef()) == exclusion_peptides.end()) { filtered_decoy_transitions.push_back(*tr_it); } } dec.setTransitions(filtered_decoy_transitions); std::vector<String> protein_ids; for (Size i = 0; i < peptides.size(); ++i) { TargetedExperiment::Peptide peptide = peptides[i]; // Check if peptide has any transitions left if (std::find(exclusion_peptides.begin(), exclusion_peptides.end(), peptide.id) == exclusion_peptides.end()) { decoy_peptides.push_back(peptide); for (Size j = 0; j < peptide.protein_refs.size(); ++j) { protein_ids.push_back(peptide.protein_refs[j]); } } else { LOG_DEBUG << "[peptide] Skipping " << peptide.id << std::endl; } } for (Size i = 0; i < proteins.size(); ++i) { OpenMS::TargetedExperiment::Protein protein = proteins[i]; // Check if protein has any peptides left if (find(protein_ids.begin(), protein_ids.end(), protein.id) != protein_ids.end()) { decoy_proteins.push_back(protein); } else { LOG_DEBUG << "[protein] Skipping " << protein.id << std::endl; } } dec.setPeptides(decoy_peptides); dec.setProteins(decoy_proteins); }