//If XlSites is of same types private PsmCross XlSitesSame(Ms2ScanWithSpecificMass theScan, PsmCross psmCrossAlpha, PsmCross psmCrossBeta, CrosslinkerTypeClass crosslinker, int ind, int inx) { PsmCross psmCross = null; var xlPosAlpha = PsmCross.XlPosCal(psmCrossAlpha.compactPeptide, crosslinker.CrosslinkerModSites); var xlPosBeta = PsmCross.XlPosCal(psmCrossBeta.compactPeptide, crosslinker.CrosslinkerModSites); if (xlPosAlpha.Count() >= 1 && xlPosBeta.Count() >= 1) { PsmCross.XlLocalization(theScan, psmCrossAlpha, psmCrossBeta.compactPeptide.MonoisotopicMassIncludingFixedMods + crosslinker.TotalMass, crosslinker, ProductTypes, commonParameters.ProductMassTolerance, Charge_2_3, Charge_2_3_PrimeFragment, xlPosAlpha); PsmCross.XlLocalization(theScan, psmCrossBeta, psmCrossAlpha.compactPeptide.MonoisotopicMassIncludingFixedMods + crosslinker.TotalMass, crosslinker, ProductTypes, commonParameters.ProductMassTolerance, Charge_2_3, Charge_2_3_PrimeFragment, xlPosBeta); if (psmCrossAlpha.XLBestScore < psmCrossBeta.XLBestScore) { var swap = psmCrossAlpha; psmCrossAlpha = psmCrossBeta; psmCrossBeta = swap; } psmCrossAlpha.XlRank = new int[] { ind, inx }; psmCrossAlpha.XLTotalScore = psmCrossAlpha.XLBestScore + psmCrossBeta.XLBestScore; psmCrossAlpha.XLQvalueTotalScore = Math.Sqrt(psmCrossAlpha.XLBestScore) * psmCrossBeta.XLBestScore; psmCrossAlpha.BetaPsmCross = psmCrossBeta; if (crosslinker.Cleavable) { psmCrossAlpha.ParentIonMaxIntensityRanks.AddRange(psmCrossBeta.ParentIonMaxIntensityRanks); psmCrossAlpha.ParentIonExistNum += psmCrossBeta.ParentIonExistNum; } psmCrossAlpha.CrossType = PsmCrossType.Cross; psmCross = psmCrossAlpha; } return(psmCross); }
//Targetting function: to find two peptides that in the Top matched peptides private PsmCross FindCrosslinkedPeptide(Ms2ScanWithSpecificMass theScan, List <BestPeptideScoreNotch> theScanBestPeptide, int i) { List <PsmCross> bestPsmCrossList = new List <PsmCross>(); PsmCross bestPsmCross = null; string crosslinkerModSitesAll = new string((Crosslinker.CrosslinkerModSites + Crosslinker.CrosslinkerModSites2).ToCharArray().Distinct().ToArray()); for (int ind = 0; ind < theScanBestPeptide.Count; ind++) { //Single Peptide if (XLPrecusorSearchMode.Accepts(theScan.PrecursorMass, theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods) >= 0) { var productMasses = theScanBestPeptide[ind].BestPeptide.ProductMassesMightHaveDuplicatesAndNaNs(ProductTypes); Array.Sort(productMasses); double score = CalculatePeptideScoreOld(theScan.TheScan, commonParameters.ProductMassTolerance, productMasses, theScan.PrecursorMass, DissociationTypes, AddComplementaryIons, 0); var psmCrossSingle = new PsmCross(theScanBestPeptide[ind].BestPeptide, theScanBestPeptide[ind].BestNotch, score, i, theScan, commonParameters.DigestionParams); psmCrossSingle.XLTotalScore = psmCrossSingle.Score; psmCrossSingle.CrossType = PsmCrossType.Singe; bestPsmCrossList.Add(psmCrossSingle); } //Deadend Peptide else if (QuenchTris && XLPrecusorSearchMode.Accepts(theScan.PrecursorMass, theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods + Crosslinker.DeadendMassTris) >= 0) { var psmCrossEnd = new PsmCross(theScanBestPeptide[ind].BestPeptide, theScanBestPeptide[ind].BestNotch, theScanBestPeptide[ind].BestScore, i, theScan, commonParameters.DigestionParams); var xlPos = PsmCross.XlPosCal(psmCrossEnd.compactPeptide, crosslinkerModSitesAll); if (xlPos.Count() >= 1) { PsmCross.XlLocalization(theScan, psmCrossEnd, Crosslinker.DeadendMassTris, Crosslinker, ProductTypes, commonParameters.ProductMassTolerance, false, false, xlPos); psmCrossEnd.XLTotalScore = psmCrossEnd.XLBestScore; psmCrossEnd.CrossType = PsmCrossType.DeadEndTris; bestPsmCrossList.Add(psmCrossEnd); } } else if (QuenchH2O && XLPrecusorSearchMode.Accepts(theScan.PrecursorMass, theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods + Crosslinker.DeadendMassH2O) >= 0) { var psmCrossEnd = new PsmCross(theScanBestPeptide[ind].BestPeptide, theScanBestPeptide[ind].BestNotch, theScanBestPeptide[ind].BestScore, i, theScan, commonParameters.DigestionParams); var xlPos = PsmCross.XlPosCal(psmCrossEnd.compactPeptide, crosslinkerModSitesAll); if (xlPos.Count() >= 1) { PsmCross.XlLocalization(theScan, psmCrossEnd, Crosslinker.DeadendMassH2O, Crosslinker, ProductTypes, commonParameters.ProductMassTolerance, false, false, xlPos); psmCrossEnd.XLTotalScore = psmCrossEnd.XLBestScore; psmCrossEnd.CrossType = PsmCrossType.DeadEndH2O; bestPsmCrossList.Add(psmCrossEnd); } } else if (QuenchNH2 && XLPrecusorSearchMode.Accepts(theScan.PrecursorMass, theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods + Crosslinker.DeadendMassNH2) >= 0) { var psmCrossEnd = new PsmCross(theScanBestPeptide[ind].BestPeptide, theScanBestPeptide[ind].BestNotch, theScanBestPeptide[ind].BestScore, i, theScan, commonParameters.DigestionParams); var xlPos = PsmCross.XlPosCal(psmCrossEnd.compactPeptide, crosslinkerModSitesAll); if (xlPos.Count() >= 1) { PsmCross.XlLocalization(theScan, psmCrossEnd, Crosslinker.DeadendMassNH2, Crosslinker, ProductTypes, commonParameters.ProductMassTolerance, false, false, xlPos); psmCrossEnd.XLTotalScore = psmCrossEnd.XLBestScore; psmCrossEnd.CrossType = PsmCrossType.DeadEndNH2; bestPsmCrossList.Add(psmCrossEnd); } } //loop peptide else if (Crosslinker.LoopMass != 0 && XLPrecusorSearchMode.Accepts(theScan.PrecursorMass, theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods + Crosslinker.LoopMass) >= 0) { var psmCrossLoop = new PsmCross(theScanBestPeptide[ind].BestPeptide, theScanBestPeptide[ind].BestNotch, theScanBestPeptide[ind].BestScore, i, theScan, commonParameters.DigestionParams); var xlPos = PsmCross.XlPosCal(psmCrossLoop.compactPeptide, Crosslinker.CrosslinkerModSites); if (xlPos.Count() >= 2) { PsmCross.XlLocalizationForLoopCrosslink(theScan, psmCrossLoop, Crosslinker.LoopMass, Crosslinker, ProductTypes, commonParameters.ProductMassTolerance, xlPos); psmCrossLoop.XLTotalScore = psmCrossLoop.XLBestScore; psmCrossLoop.CrossType = PsmCrossType.Loop; bestPsmCrossList.Add(psmCrossLoop); } } //Cross-linked peptide else if (theScan.PrecursorMass - theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods >= 200) { var x = theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods; for (int inx = ind; inx < theScanBestPeptide.Count; inx++) { var y = theScanBestPeptide[inx].BestPeptide.MonoisotopicMassIncludingFixedMods; if (XLPrecusorSearchMode.Accepts(theScan.PrecursorMass, x + y + Crosslinker.TotalMass) >= 0) { var psmCrossAlpha = new PsmCross(theScanBestPeptide[ind].BestPeptide, theScanBestPeptide[ind].BestNotch, theScanBestPeptide[ind].BestScore, i, theScan, commonParameters.DigestionParams); var psmCrossBeta = new PsmCross(theScanBestPeptide[inx].BestPeptide, theScanBestPeptide[inx].BestNotch, theScanBestPeptide[inx].BestScore, i, theScan, commonParameters.DigestionParams); PsmCross psmCross = null; if (Crosslinker.CrosslinkerModSites == Crosslinker.CrosslinkerModSites2) { psmCross = XlSitesSame(theScan, psmCrossAlpha, psmCrossBeta, Crosslinker, ind, inx); } else { psmCross = XlSitesTwoDiff(theScan, psmCrossAlpha, psmCrossBeta, Crosslinker, ind, inx); } if (psmCross != null) { bestPsmCrossList.Add(psmCross); } } } } } if (bestPsmCrossList.Count != 0) { bestPsmCross = bestPsmCrossList.OrderByDescending(p => p.XLTotalScore).First(); if (bestPsmCrossList.Count > 1) { bestPsmCross.DScore = Math.Abs(bestPsmCrossList.First().XLTotalScore - bestPsmCrossList[1].XLTotalScore); } } return(bestPsmCross); }
//Targetting function: to find two peptides that in the Top matched peptides private PsmCross FindCrosslinkedPeptide(Ms2ScanWithSpecificMass theScan, List <BestPeptideScoreNotch> theScanBestPeptide, int i) { List <PsmCross> bestPsmCrossList = new List <PsmCross>(); PsmCross bestPsmCross = null; for (int ind = 0; ind < theScanBestPeptide.Count; ind++) { //Single Peptide if (XLPrecusorSearchMode.Accepts(theScan.PrecursorMass, theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods) >= 0) { var productMasses = theScanBestPeptide[ind].BestPeptide.ProductMassesMightHaveDuplicatesAndNaNs(lp); Array.Sort(productMasses); double score = CalculatePeptideScore(theScan.TheScan, CommonParameters.ProductMassTolerance, productMasses, theScan.PrecursorMass, dissociationTypes, addCompIons, 0); var psmCrossSingle = new PsmCross(theScanBestPeptide[ind].BestPeptide, theScanBestPeptide[ind].BestNotch, score, i, theScan); psmCrossSingle.XLTotalScore = psmCrossSingle.Score; psmCrossSingle.CrossType = PsmCrossType.Singe; bestPsmCrossList.Add(psmCrossSingle); } //Deadend Peptide else if (quench_Tris && XLPrecusorSearchMode.Accepts(theScan.PrecursorMass, theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods + crosslinker.DeadendMassTris) >= 0) { var psmCrossEnd = new PsmCross(theScanBestPeptide[ind].BestPeptide, theScanBestPeptide[ind].BestNotch, theScanBestPeptide[ind].BestScore, i, theScan); var xlPos = PsmCross.XlPosCal(psmCrossEnd.compactPeptide, crosslinker); if (xlPos.Count() >= 1) { PsmCross.XlLocalization(theScan, psmCrossEnd, crosslinker.DeadendMassTris, crosslinker, lp, CommonParameters.ProductMassTolerance, false, false, xlPos); psmCrossEnd.XLTotalScore = psmCrossEnd.XLBestScore; psmCrossEnd.CrossType = PsmCrossType.DeadEndTris; bestPsmCrossList.Add(psmCrossEnd); } } else if (quench_H2O && XLPrecusorSearchMode.Accepts(theScan.PrecursorMass, theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods + crosslinker.DeadendMassH2O) >= 0) { var psmCrossEnd = new PsmCross(theScanBestPeptide[ind].BestPeptide, theScanBestPeptide[ind].BestNotch, theScanBestPeptide[ind].BestScore, i, theScan); var xlPos = PsmCross.XlPosCal(psmCrossEnd.compactPeptide, crosslinker); if (xlPos.Count() >= 1) { PsmCross.XlLocalization(theScan, psmCrossEnd, crosslinker.DeadendMassH2O, crosslinker, lp, CommonParameters.ProductMassTolerance, false, false, xlPos); psmCrossEnd.XLTotalScore = psmCrossEnd.XLBestScore; psmCrossEnd.CrossType = PsmCrossType.DeadEndH2O; bestPsmCrossList.Add(psmCrossEnd); } } else if (quench_NH2 && XLPrecusorSearchMode.Accepts(theScan.PrecursorMass, theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods + crosslinker.DeadendMassNH2) >= 0) { var psmCrossEnd = new PsmCross(theScanBestPeptide[ind].BestPeptide, theScanBestPeptide[ind].BestNotch, theScanBestPeptide[ind].BestScore, i, theScan); var xlPos = PsmCross.XlPosCal(psmCrossEnd.compactPeptide, crosslinker); if (xlPos.Count() >= 1) { PsmCross.XlLocalization(theScan, psmCrossEnd, crosslinker.DeadendMassNH2, crosslinker, lp, CommonParameters.ProductMassTolerance, false, false, xlPos); psmCrossEnd.XLTotalScore = psmCrossEnd.XLBestScore; psmCrossEnd.CrossType = PsmCrossType.DeadEndNH2; bestPsmCrossList.Add(psmCrossEnd); } } //loop peptide else if (XLPrecusorSearchMode.Accepts(theScan.PrecursorMass, theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods + crosslinker.LoopMass) >= 0) { var psmCrossLoop = new PsmCross(theScanBestPeptide[ind].BestPeptide, theScanBestPeptide[ind].BestNotch, theScanBestPeptide[ind].BestScore, i, theScan); var xlPos = PsmCross.XlPosCal(psmCrossLoop.compactPeptide, crosslinker); if (xlPos.Count() >= 2) { PsmCross.XlLocalizationForLoopCrosslink(theScan, psmCrossLoop, crosslinker.LoopMass, crosslinker, lp, CommonParameters.ProductMassTolerance, xlPos); psmCrossLoop.XLTotalScore = psmCrossLoop.XLBestScore; psmCrossLoop.CrossType = PsmCrossType.Loop; bestPsmCrossList.Add(psmCrossLoop); } } //Cross-linked peptide else if (theScan.PrecursorMass - theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods >= 200) { var x = theScanBestPeptide[ind].BestPeptide.MonoisotopicMassIncludingFixedMods; for (int inx = ind; inx < theScanBestPeptide.Count; inx++) { var y = theScanBestPeptide[inx].BestPeptide.MonoisotopicMassIncludingFixedMods; if (XLPrecusorSearchMode.Accepts(theScan.PrecursorMass, x + y + crosslinker.TotalMass) >= 0 && PsmCross.XlPosCal(theScanBestPeptide[ind].BestPeptide, crosslinker).Count != 0 && PsmCross.XlPosCal(theScanBestPeptide[inx].BestPeptide, crosslinker).Count != 0) { var psmCrossAlpha = new PsmCross(theScanBestPeptide[ind].BestPeptide, theScanBestPeptide[ind].BestNotch, theScanBestPeptide[ind].BestScore, i, theScan); var psmCrossBeta = new PsmCross(theScanBestPeptide[inx].BestPeptide, theScanBestPeptide[inx].BestNotch, theScanBestPeptide[inx].BestScore, i, theScan); var xlPosAlpha = PsmCross.XlPosCal(psmCrossAlpha.compactPeptide, crosslinker); var xlPosBeta = PsmCross.XlPosCal(psmCrossBeta.compactPeptide, crosslinker); if (xlPosAlpha.Count() >= 1 && xlPosBeta.Count() >= 1) { PsmCross.XlLocalization(theScan, psmCrossAlpha, psmCrossBeta.compactPeptide.MonoisotopicMassIncludingFixedMods + crosslinker.TotalMass, crosslinker, lp, CommonParameters.ProductMassTolerance, charge_2_3, charge_2_3_PrimeFragment, xlPosAlpha); PsmCross.XlLocalization(theScan, psmCrossBeta, psmCrossAlpha.compactPeptide.MonoisotopicMassIncludingFixedMods + crosslinker.TotalMass, crosslinker, lp, CommonParameters.ProductMassTolerance, charge_2_3, charge_2_3_PrimeFragment, xlPosBeta); if (psmCrossAlpha.XLBestScore < psmCrossBeta.XLBestScore) { var swap = psmCrossAlpha; psmCrossAlpha = psmCrossBeta; psmCrossBeta = swap; } psmCrossAlpha.XlRank = new int[] { ind, inx }; psmCrossAlpha.XLTotalScore = psmCrossAlpha.XLBestScore + psmCrossBeta.XLBestScore; psmCrossAlpha.XLQvalueTotalScore = Math.Sqrt(psmCrossAlpha.XLBestScore) * psmCrossBeta.XLBestScore; psmCrossAlpha.BetaPsmCross = psmCrossBeta; if (crosslinker.Cleavable) { psmCrossAlpha.ParentIonMaxIntensityRanks.AddRange(psmCrossBeta.ParentIonMaxIntensityRanks); psmCrossAlpha.ParentIonExistNum += psmCrossBeta.ParentIonExistNum; } psmCrossAlpha.CrossType = PsmCrossType.Cross; bestPsmCrossList.Add(psmCrossAlpha); } } } } } if (bestPsmCrossList.Count != 0) { bestPsmCross = bestPsmCrossList.OrderByDescending(p => p.XLTotalScore).First(); if (bestPsmCrossList.Count > 1) { bestPsmCross.DScore = Math.Abs(bestPsmCrossList.First().XLTotalScore - bestPsmCrossList[1].XLTotalScore); } } return(bestPsmCross); }