Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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++;
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }