TEST(settings_types, DoubleList) { DoubleList l; { ASSERT_TRUE(l.set_default("0.0,1.1,2.2,3.3,4.4,5.5")); ASSERT_TRUE(l.is_default()); ASSERT_EQ(6, l.size()); for (int i = 0; i < l.size(); ++i) { ASSERT_EQ(double(i)+double(i)/10., l.values()[i]); } ASSERT_STREQ("0.0,1.1,2.2,3.3,4.4,5.5", l.get_value()); } { ASSERT_TRUE(l.set_value("0.01234567891011, 666.6")); ASSERT_FALSE(l.is_default()); ASSERT_EQ(2, l.size()); ASSERT_DOUBLE_EQ(0.01234567891011, l.values()[0]); ASSERT_EQ(666.6, l.values()[1]); // FIXME(BM) string printing to not enough decimal places! EXPECT_STREQ("0.01234567891011,666.6", l.get_value()); } }
void XQuestResultXMLFile::writeXQuestXML(String out_file, String base_name, const std::vector< PeptideIdentification >& peptide_ids, const std::vector< std::vector< OPXLDataStructs::CrossLinkSpectrumMatch > >& all_top_csms, const PeakMap& spectra, String precursor_mass_tolerance_unit, String fragment_mass_tolerance_unit, double precursor_mass_tolerance, double fragment_mass_tolerance, double fragment_mass_tolerance_xlinks, String cross_link_name, double cross_link_mass_light, DoubleList cross_link_mass_mono_link, String in_fasta, String in_decoy_fasta, StringList cross_link_residue1, StringList cross_link_residue2, double cross_link_mass_iso_shift, String enzyme_name, Size missed_cleavages) { String spec_xml_name = base_name + "_matched"; std::cout << "Writing xquest.xml to " << out_file << std::endl; std::ofstream xml_file; xml_file.open(out_file.c_str(), std::ios::trunc); // XML Header xml_file << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl; xml_file << "<?xml-stylesheet type=\"text/xsl\" href=\"\"?>" << std::endl; DateTime time= DateTime::now(); String timestring = time.getDate() + " " + time.getTime(); String mono_masses; if (cross_link_mass_mono_link.size() > 1) { for (Size k = 0; k < cross_link_mass_mono_link.size()-1; ++k) { mono_masses += String(cross_link_mass_mono_link[k]) + ", "; } mono_masses += cross_link_mass_mono_link[cross_link_mass_mono_link.size()-1]; } String aarequired1, aarequired2; for (Size k= 0; k < cross_link_residue1.size()-1; ++k) { aarequired1 += cross_link_residue1[k] + ","; } aarequired1 += cross_link_residue1[cross_link_residue1.size()-1]; for (Size k= 0; k < cross_link_residue2.size()-1; ++k) { aarequired2 += cross_link_residue2[k] + ","; } aarequired2 += cross_link_residue2[cross_link_residue2.size()-1]; xml_file << "<xquest_results xquest_version=\"OpenPepXL 1.0\" date=\"" << timestring << "\" author=\"Eugen Netz, Timo Sachsenberg\" tolerancemeasure_ms1=\"" << precursor_mass_tolerance_unit << "\" tolerancemeasure_ms2=\"" << fragment_mass_tolerance_unit << "\" ms1tolerance=\"" << precursor_mass_tolerance << "\" ms2tolerance=\"" << fragment_mass_tolerance << "\" xlink_ms2tolerance=\"" << fragment_mass_tolerance_xlinks << "\" crosslinkername=\"" << cross_link_name << "\" xlinkermw=\"" << cross_link_mass_light << "\" monolinkmw=\"" << mono_masses << "\" database=\"" << in_fasta << "\" database_dc=\"" << in_decoy_fasta << "\" xlinktypes=\"1111\" AArequired1=\"" << aarequired1 << "\" AArequired2=\"" << aarequired2 << "\" cp_isotopediff=\"" << cross_link_mass_iso_shift << "\" enzyme_name=\"" << enzyme_name << "\" outputpath=\"" << spec_xml_name << "\" Iontag_charges_for_index=\"1\" missed_cleavages=\"" << missed_cleavages << "\" ntermxlinkable=\"0\" CID_match2ndisotope=\"1" << "\" variable_mod=\"TODO\" nocutatxlink=\"1\" xcorrdelay=\"5\" >" << std::endl; for (std::vector< std::vector< OPXLDataStructs::CrossLinkSpectrumMatch > >::const_iterator top_csms_spectrum = all_top_csms.begin(); top_csms_spectrum != all_top_csms.end(); ++top_csms_spectrum) { std::vector< OPXLDataStructs::CrossLinkSpectrumMatch > top_vector = (*top_csms_spectrum); if (top_vector.empty()) { continue; } // Spectrum Data, for each spectrum Size scan_index_light = top_vector[0].scan_index_light; Size scan_index_heavy = scan_index_light; if (cross_link_mass_iso_shift > 0) { scan_index_heavy = top_vector[0].scan_index_heavy; } const PeakSpectrum& spectrum_light = spectra[scan_index_light]; double precursor_charge = spectrum_light.getPrecursors()[0].getCharge(); double precursor_mz = spectrum_light.getPrecursors()[0].getMZ(); double precursor_rt = spectrum_light.getRT(); double precursor_mass = precursor_mz * static_cast<double>(precursor_charge) - static_cast<double>(precursor_charge) * Constants::PROTON_MASS_U; double precursor_mz_heavy = spectra[scan_index_heavy].getPrecursors()[0].getMZ(); double precursor_rt_heavy = spectra[scan_index_heavy].getRT(); // print information about new peak to file (starts with <spectrum_search..., ends with </spectrum_search> String spectrum_light_name = base_name + ".light." + scan_index_light; String spectrum_heavy_name = base_name + ".heavy." + scan_index_heavy; String spectrum_name = spectrum_light_name + String("_") + spectrum_heavy_name; String rt_scans = String(precursor_rt) + ":" + String(precursor_rt_heavy); String mz_scans = String(precursor_mz) + ":" + String(precursor_mz_heavy); // Mean ion intensity (light spectrum, TODO add heavy spectrum?) double mean_intensity= 0; if (cross_link_mass_iso_shift > 0) { for (SignedSize j = 0; j < static_cast<SignedSize>(spectrum_light.size()); ++j) mean_intensity += spectrum_light[j].getIntensity(); for (SignedSize j = 0; j < static_cast<SignedSize>(spectra[scan_index_heavy].size()); ++j) mean_intensity += spectra[scan_index_heavy][j].getIntensity(); mean_intensity = mean_intensity / (spectrum_light.size() + spectra[scan_index_heavy].size()); } else { for (SignedSize j = 0; j < static_cast<SignedSize>(spectrum_light.size()); ++j) mean_intensity += spectrum_light[j].getIntensity(); mean_intensity = mean_intensity / spectrum_light.size(); } xml_file << "<spectrum_search spectrum=\"" << spectrum_name << "\" mean_ionintensity=\"" << mean_intensity << "\" ionintensity_stdev=\"" << "TODO" << "\" addedMass=\"" << "TODO" << "\" iontag_ncandidates=\"" << "TODO" << "\" apriori_pmatch_common=\"" << "TODO" << "\" apriori_pmatch_xlink=\"" << "TODO" << "\" ncommonions=\"" << "TODO" << "\" nxlinkions=\"" << "TODO" << "\" mz_precursor=\"" << precursor_mz << "\" scantype=\"" << "light_heavy" << "\" charge_precursor=\"" << precursor_charge << "\" Mr_precursor=\"" << precursor_mass << "\" rtsecscans=\"" << rt_scans << "\" mzscans=\"" << mz_scans << "\" >" << std::endl; for (std::vector< OPXLDataStructs::CrossLinkSpectrumMatch>::const_iterator top_csm = top_csms_spectrum->begin(); top_csm != top_csms_spectrum->end(); ++top_csm) { String xltype = "monolink"; String structure = top_csm->cross_link.alpha.toUnmodifiedString(); String letter_first = structure.substr(top_csm->cross_link.cross_link_position.first, 1); double weight = top_csm->cross_link.alpha.getMonoWeight() + top_csm->cross_link.cross_linker_mass; int alpha_pos = top_csm->cross_link.cross_link_position.first + 1; int beta_pos = top_csm->cross_link.cross_link_position.second + 1; String topology = String("a") + alpha_pos; String id = structure + String("-") + letter_first + alpha_pos + String("-") + static_cast<int>(top_csm->cross_link.cross_linker_mass); if (top_csm->cross_link.getType() == OPXLDataStructs::CROSS) { xltype = "xlink"; structure += "-" + top_csm->cross_link.beta.toUnmodifiedString(); topology += String("-b") + beta_pos; weight += top_csm->cross_link.beta.getMonoWeight(); id = structure + "-" + topology; } else if (top_csm->cross_link.getType() == OPXLDataStructs::LOOP) { xltype = "intralink"; topology += String("-b") + beta_pos; String letter_second = structure.substr(top_csm->cross_link.cross_link_position.second, 1); id = structure + String("-") + letter_first + alpha_pos + String("-") + letter_second + beta_pos; } // Error calculation double cl_mz = (weight + (static_cast<double>(precursor_charge) * Constants::PROTON_MASS_U)) / static_cast<double>(precursor_charge); double error = precursor_mz - cl_mz; double rel_error = (error / cl_mz) / 1e-6; PeptideIdentification pep_id = peptide_ids[top_csm->peptide_id_index]; std::vector< PeptideHit > pep_hits = pep_id.getHits(); String prot_alpha = pep_hits[0].getPeptideEvidences()[0].getProteinAccession(); if (pep_hits[0].getPeptideEvidences().size() > 1) { for (Size i = 1; i < pep_hits[0].getPeptideEvidences().size(); ++i) { prot_alpha = prot_alpha + "," + pep_hits[0].getPeptideEvidences()[i].getProteinAccession(); } } String prot_beta = ""; if (pep_hits.size() > 1) { prot_beta= pep_hits[1].getPeptideEvidences()[0].getProteinAccession(); if (pep_hits[1].getPeptideEvidences().size() > 1) { for (Size i = 1; i < pep_hits[1].getPeptideEvidences().size(); ++i) { prot_alpha = prot_alpha + "," + pep_hits[1].getPeptideEvidences()[i].getProteinAccession(); } } } // Hit Data, for each cross-link to Spectrum Hit (e.g. top 5 per spectrum) xml_file << "<search_hit search_hit_rank=\"" <<top_csm->rank << "\" id=\"" << id << "\" type=\"" << xltype << "\" structure=\"" << structure << "\" seq1=\"" << top_csm->cross_link.alpha.toUnmodifiedString() << "\" seq2=\"" << top_csm->cross_link.beta.toUnmodifiedString() << "\" prot1=\"" << prot_alpha << "\" prot2=\"" << prot_beta << "\" topology=\"" << topology << "\" xlinkposition=\"" << (top_csm->cross_link.cross_link_position.first+1) << "," << (top_csm->cross_link.cross_link_position.second+1) << "\" Mr=\"" << weight << "\" mz=\"" << cl_mz << "\" charge=\"" << precursor_charge << "\" xlinkermass=\"" << top_csm->cross_link.cross_linker_mass << "\" measured_mass=\"" << precursor_mass << "\" error=\"" << error << "\" error_rel=\"" << rel_error << "\" xlinkions_matched=\"" << (top_csm->matched_xlink_alpha + top_csm->matched_xlink_beta) << "\" backboneions_matched=\"" << (top_csm->matched_common_alpha + top_csm->matched_common_beta) << "\" weighted_matchodds_mean=\"" << "TODO" << "\" weighted_matchodds_sum=\"" << "TODO" << "\" match_error_mean=\"" << "TODO" << "\" match_error_stdev=\"" << "TODO" << "\" xcorrx=\"" << top_csm->xcorrx_max << "\" xcorrb=\"" << top_csm->xcorrc_max << "\" match_odds=\"" <<top_csm->match_odds << "\" prescore=\"" << top_csm->pre_score << "\" prescore_alpha=\"" << "TODO" << "\" prescore_beta=\"" << "TODO" << "\" match_odds_alphacommon=\"" << "TODO" << "\" match_odds_betacommon=\"" << "TODO" << "\" match_odds_alphaxlink=\"" << "TODO" << "\" match_odds_betaxlink=\"" << "TODO" << "\" num_of_matched_ions_alpha=\"" << (top_csm->matched_common_alpha + top_csm->matched_xlink_alpha) << "\" num_of_matched_ions_beta=\"" << (top_csm->matched_common_beta + top_csm->matched_xlink_beta) << "\" num_of_matched_common_ions_alpha=\"" << top_csm->matched_common_alpha << "\" num_of_matched_common_ions_beta=\"" << top_csm->matched_common_beta << "\" num_of_matched_xlink_ions_alpha=\"" << top_csm->matched_xlink_alpha << "\" num_of_matched_xlink_ions_beta=\"" << top_csm->matched_xlink_beta << "\" xcorrall=\"" << "TODO" << "\" TIC=\"" << top_csm->percTIC << "\" TIC_alpha=\"" << "TODO" << "\" TIC_beta=\"" << "TODO" << "\" wTIC=\"" << top_csm->wTIC << "\" intsum=\"" << top_csm->int_sum * 100 << "\" apriori_match_probs=\"" << "TODO" << "\" apriori_match_probs_log=\"" << "TODO" << "\" HyperCommon=\"" << top_csm->HyperCommon << "\" HyperXLink=\"" << top_csm->HyperXlink << "\" HyperAlpha=\"" << top_csm->HyperAlpha << "\" HyperBeta=\"" << top_csm->HyperBeta << "\" HyperBoth=\"" << top_csm->HyperBoth << "\" PScoreCommon=\"" << top_csm->PScoreCommon << "\" PScoreXLink=\"" << top_csm->PScoreXlink << "\" PScoreAlpha=\"" << top_csm->PScoreAlpha << "\" PScoreBeta=\"" << top_csm->PScoreBeta << "\" PScoreBoth=\"" << top_csm->PScoreBoth << "\" series_score_mean=\"" << "TODO" << "\" annotated_spec=\"" << "" << "\" score=\"" << top_csm->score << "\" >" << std::endl; xml_file << "</search_hit>" << std::endl; } // Closing tag for Spectrum xml_file << "</spectrum_search>" << std::endl; } // Closing tag for results (end of file) xml_file << "</xquest_results>" << std::endl; xml_file.close(); return; }
bool Pattern::Match(const DoubleTimeList::const_iterator& current, const DoubleTimeList::const_iterator& end) const { DoubleTimeList points; size_t positionCount = Size(); auto cit = current; size_t i = 0; while(i < positionCount && cit != end) { points.push_back(DoubleTimePoint((*cit).value, i++)); cit++; } if (i < positionCount) { // points not enough for matching return false; } // sort the points by value struct PointCompare { bool operator() (DoubleTimePoint p1,DoubleTimePoint p2) { return p1.value < p2.value; } } compareObj; std::sort(points.begin(), points.end(), compareObj); // check each groups auto gcit = groups_.begin(); auto pcit = points.begin(); double max_in_last_group = -DBL_MAX; while(gcit != groups_.end() && pcit != points.end()) { PointsGroup group = *gcit; DoubleList values; // check fixed delta double delta = std::fabs(((*pcit).value - max_in_last_group) / ((*pcit).value + max_in_last_group)); if (delta < fixed_delta_) return false; // make sure points in the group size_t i = 0; size_t group_size = group.Size(); while (i < group_size && pcit != points.end()) { if (!group.In((int)(*pcit).position)) return false; values.push_back((*pcit).value); pcit++; i++; } // check adjacent for AdjacentGroup if (group.IsAdjacentGroup()) { if (!group.CheckAdjacence(&values)) return false; } max_in_last_group = values[values.size() - 1]; gcit++; } return true; }
TEST_EQUAL(intlist[0], 1) TEST_EQUAL(intlist[1], 22) TEST_EQUAL(intlist[2], 333) TEST_EQUAL(p2.getValue("intlist2").valueType(),DataValue::INT_LIST) intlist = p2.getValue("intlist2"); TEST_EQUAL(intlist.size(),0) TEST_EQUAL(p2.getValue("intlist3").valueType(),DataValue::INT_LIST) intlist = p2.getValue("intlist3"); TEST_EQUAL(intlist.size(),1) TEST_EQUAL(intlist[0],1) TEST_EQUAL(p2.getValue("doublelist").valueType(), DataValue::DOUBLE_LIST) DoubleList doublelist = p2.getValue("doublelist"); TEST_EQUAL(doublelist.size(),3); TEST_EQUAL(doublelist[0], 1.22) TEST_EQUAL(doublelist[1], 2.33) TEST_EQUAL(doublelist[2], 4.55) TEST_EQUAL(p2.getValue("doublelist2").valueType(),DataValue::DOUBLE_LIST) doublelist = p2.getValue("doublelist2"); TEST_EQUAL(doublelist.size(),0) TEST_EQUAL(p2.getValue("doublelist3").valueType(),DataValue::DOUBLE_LIST) doublelist = p2.getValue("doublelist3"); TEST_EQUAL(doublelist.size(),1) TEST_EQUAL(doublelist[0],1.4) END_SECTION