public void SingleFileMatching(object FileIDObj) { int FileID = (FileIDObj as IntArg).Arg; //создаем список из MGFFile File = Files[FileID]; List <MGFMatched> Matches = new List <MGFMatched>(); MGFMatched M; for (int i = 0; i < File.Spectra.Count; i++) { M = new MGFMatched(File.Spectra[i]); M.Index = i; M.Origin = FileID; Matches.Add(M); } //сортируем список по массам Matches.Sort(new MGFMatched.MatchedByMass()); // пробегаемся по списку и матчим тех кто в пределах массы for (int i = 0; i < Matches.Count; i++) { //отступаем int First; for (First = i; First >= 0; First--) { double Diff = (Math.Abs(Matches[First].Spectrum.mz - Matches[i].Spectrum.mz) / Math.Max(Matches[First].Spectrum.mz, Matches[i].Spectrum.mz)) * 1000000.0; if (Diff > PPMs) { break; } } First++; for (int j = First; j < Matches.Count; j++) { if (i == j) { continue; } if (Matches[i].Matched.Contains(Matches[j].Index) || Matches[j].Matched.Contains(Matches[i].Index)) { continue; } double Diff = (Math.Abs(Matches[First].Spectrum.mz - Matches[j].Spectrum.mz) / Math.Max(Matches[First].Spectrum.mz, Matches[j].Spectrum.mz)) * 1000000.0; if (Diff > PPMs) { break; } MGFMatched IM = Matches[i]; MGFMatched JM = Matches[j]; int R = Match(ref IM, ref JM); if (R > 0) { IM.Matched.Add(JM.Index); } if (R < 0) { JM.Matched.Add(IM.Index); } } } //Вытаскиваем за головку дерева. самые интенсивные - остальных уничтожаем Matches.Sort(new MGFMatched.MatchedByWeight()); for (int i = 0; i < Matches.Count; i++) { if (Matches[i].Matched == null) { continue; } for (int j = i; j < Matches.Count; j++) { if (Matches[j].Matched == null) { continue; } if (Matches[i].Matched.Contains(Matches[j].Index)) { Matches[i].Matched.AddRange(Matches[j].Matched); Matches[j].Matched = null; } } } for (int i = Matches.Count - 1; i >= 0; i--) { if (Matches[i].Matched == null) { Matches.RemoveAt(i); } } MatchedFiles[FileID] = Matches; lock (ForCountLock){ ExecCount++; } return; }
public void HorizontalMatching(object RTObj) { //границы поиска - в критической секции double RT = (RTObj as DoubleArg).Arg; int OperUpper = 0, OperLower = 0, SearchUpper = 0, SearchLower = 0; lock (Limits){ if (RT - RTMin <= 0.0) { SearchLower = 1; } if (RT == 0.0) { OperLower = 1; } if (RT + RTMin > MaxRT) { OperUpper = Merged.Count - 1; } if (RT + RTMin + RTMin > MaxRT) { SearchUpper = Merged.Count - 1; } for (int i = 0; i < Merged.Count; i++) { if (SearchLower == 0 && Merged[i] != null && Merged[i].Spectrum.RT > RT - RTMin) { SearchLower = i; } if (OperLower == 0 && Merged[i] != null && Merged[i].Spectrum.RT > RT) { OperLower = i; } if (OperUpper == 0 && Merged[i] != null && Merged[i].Spectrum.RT > RT + RTMin) { OperUpper = i - 1; } if (SearchUpper == 0 && Merged[i] != null && Merged[i].Spectrum.RT > RT + RTMin + RTMin) { SearchUpper = i - 1; break; } } } for (int i = OperLower; i < OperUpper; i++) { if (Merged[i] == null) { continue; } for (int j = SearchLower; j < SearchUpper; j++) { if (Merged[j] == null) { continue; } if (i == j) { continue; } MGFMatched Mi = Merged[i]; MGFMatched Mj = Merged[j]; int m = Match(ref Mi, ref Mj); if (m == 0) { continue; } if (m > 0) { Merged[i].InterMatched.Add(Merged[j]); Merged[i].InterMatched.AddRange(Merged[j].InterMatched); Merged[j].InterMatched = null; Merged[j] = null; } else { Merged[j].InterMatched.Add(Merged[i]); Merged[j].InterMatched.AddRange(Merged[i].InterMatched); Merged[i].InterMatched = null; Merged[i] = null; break; } } } lock (ForCountLock){ ExecCount++; } }
public int Match(ref MGFMatched First, ref MGFMatched Second) { //проверка по массе родительского иона double F = (First.Spectrum.mz - 1.0078) * First.Spectrum.Charge; double S = (Second.Spectrum.mz - 1.0078) * Second.Spectrum.Charge; double Diff = (Math.Abs(F - S) / Math.Max(F, S)) * 1000000.0; if (Diff > PPMs) { return(0); } //проверка по retention time Diff = (Math.Max(First.Spectrum.RT, Second.Spectrum.RT) / 100) * RTPerc + RTMin; if (Math.Abs(First.Spectrum.RT - Second.Spectrum.RT) > Diff) { return(0); } //проверка по совпадению фрагментов int toCompF, toCompS; if (MISignals > 0 && MISignals < First.Spectrum.Data.Count) { toCompF = MISignals; } else { toCompF = First.Spectrum.Data.Count; } if (MISignals > 0 && MISignals < Second.Spectrum.Data.Count) { toCompS = MISignals; } else { toCompS = Second.Spectrum.Data.Count; } int Count = 0; for (int i = 0; i < toCompF; i++) { for (int j = 0; j < toCompS; j++) { if (Math.Abs(First.Spectrum.Data[i].Mass - Second.Spectrum.Data[j].Mass) < MS2Acc) { Count++; } } } if (Count < FrMatch) { return(0); } //Замер интенсивностей if (First.Weight > Second.Weight) { return(1); } else { return(-1); } }