Exemple #1
0
        //добавляет нули на границы заполненных областей
        void AddNulls()
        {
            Quanty.MZData[] Added = new Quanty.MZData[Data.Length * 2];
            //ищем разрывы
            int    i, Count = 0;
            double Diff = 0.1;

            //первая точка
            if (Data[0].Intensity > 0)
            {
                Added[0].Intensity = 0;
                Added[0].Mass      = Data[0].Mass - (Data[1].Mass - Data[0].Mass);
                Count++;
            }
            //все средние точки
            for (i = 0; i < Data.Length - 1; i++)
            {
                Added[Count] = Data[i];
                Count++;
                //если разрыв
                if (Data[i + 1].Mass - Data[i].Mass > Diff * 1.5)
                {
                    //добавляенми две точки - после и до разрыва
                    if (Data[i].Intensity > 0)
                    {
                        Added[Count].Intensity = 0;
                        Added[Count].Mass      = Data[i].Mass + Diff;
                        Count++;
                    }
                    if (Data[i + 1].Intensity > 0)
                    {
                        Added[Count].Intensity = 0;
                        Added[Count].Mass      = Data[i + 1].Mass - (Data[i + 2].Mass - Data[i + 1].Mass);
                        Count++;
                    }
                }
                else
                {
                    Diff = Data[i + 1].Mass - Data[i].Mass;
                }
            }
            //последняя точка
            if (Data[i].Intensity > 0)
            {
                Added[Count].Intensity = 0;
                Added[Count].Mass      = Data[i].Mass + Diff;
                Count++;
            }
            Data = new Quanty.MZData[Count + 1];

            for (i = 0; i < Count; i++)
            {
                Data[i] = Added[i];
            }
        }
        void NoiseLevelDetect(bool bDetect)
        {
            //Ищем все эктремумы

            int i,j,Count=0,DCount,DefeatedCount;
            double Sum = 0,Avg;
            double nMax=0;

            Quanty.MZData[] Extrems = new Quanty.MZData[Data.Length];
            ExtremInd = new int[Data.Length];
            //если объем данных вырос - увеличиваем объем памяти

               //При расчете порога используем данные всего масс-спектра, независимо от диапазона
               for(j=1; j<=Data.Length-2 ; j++)
               {
              if (Data[j].Intensity > Data[j-1].Intensity &&
                  Data[j].Intensity >=Data[j+1].Intensity &&
                  (bDetect || Data[j].Intensity > NoiseLevel))
              {
                 Extrems[Count]=Data[j];
                 if(Data[j].Intensity > nMax) nMax=Data[j].Intensity;
                 ExtremInd[Count]=j;
                 Sum+=Data[j].Intensity;
                 Count++;
              }
               }
               ExtremCount=Count;
               DCount = Count;

               if(bDetect)
               {
                //Удаляем шумовые экстремумы
                //шумовым экстремумом считаетсям экстремум чей уровень не превышает
                //средний уровень шумового экстремума болеее чем в три раза
                //сначала определяем средний уровень всех экстремумов
                //потом удаляем из выборки все нешумовые
                //потом повторяем процесс для всех оставшихся
                //делаем проходы пока не удалим последний нештатный экстремум
                do {
                    //Определяем средний уровень
                    //!!Что это!!
                    Avg = (Sum/DCount)*NoiseRate;
                    //выкидываем пики не превышающие этот уровень
                    DefeatedCount = 0;
                    for ( j=0 ; j<Count ; j++ ) {
                        if (Extrems[j].Intensity > Avg){
                            Extrems[j].Intensity = 0.0;
                            DefeatedCount++;
                        }
                    }
                    DCount=0;
                    //Определяем новую среднюю величину экстремума
                    for ( j=0,Sum=0 ; j<Count ; j++ ) {
                        if (Extrems[j].Intensity != 0){
                            Sum+=Extrems[j].Intensity;
                            DCount++;
                        }
                    }
                }
                while (DefeatedCount>0);
                NoiseLevel = Avg;
               }

               //сдвигаем в начало массива экстремумы, которые выше порога и внутри диапазона

               int[] ExtremBuf = new int[Count - DCount];
               Count=0;
               for(i=0;i<ExtremCount;i++){
               if(Data[ExtremInd[i]].Intensity > NoiseLevel)  {
                   ExtremInd[Count]=ExtremInd[i]; Count++;
               }
               }
               ExtremCount=Count;

               //По окончании у имеется массив ExtremInd[i], первые ExtremCount элементов которого
               //указывают на экстремумы пиков, которые выше порога и лежат внутри исследуемого диапазона
        }
        //добавляет нули на границы заполненных областей
        void AddNulls()
        {
            Quanty.MZData[] Added = new Quanty.MZData[Data.Length*2];
            //ищем разрывы
            int i, Count = 0;
            double Diff = 0.1;
            //первая точка
            if (Data[0].Intensity > 0){
                Added[0].Intensity = 0;
                Added[0].Mass = Data[0].Mass-(Data[1].Mass-Data[0].Mass);
                Count++;
            }
            //все средние точки
            for (i = 0; i < Data.Length-1 ; i++ ){
                Added[Count] = Data[i];
                Count++;
                //если разрыв
                if (Data[i+1].Mass - Data[i].Mass > Diff*1.5){
                    //добавляенми две точки - после и до разрыва
                    if (Data[i].Intensity > 0 ){
                        Added[Count].Intensity = 0;
                        Added[Count].Mass = Data[i].Mass+Diff;
                        Count++;
                    }
                    if (Data[i+1].Intensity > 0 ){
                        Added[Count].Intensity = 0;
                        Added[Count].Mass = Data[i+1].Mass - (Data[i+2].Mass - Data[i+1].Mass);
                        Count++;
                    }
                }else{
                    Diff = Data[i+1].Mass - Data[i].Mass;
                }
            }
            //последняя точка
            if (Data[i].Intensity > 0){
                Added[Count].Intensity = 0;
                Added[Count].Mass = Data[i].Mass+Diff;
                Count++;
            }
            Data = new Quanty.MZData[Count+1];

            for ( i = 0 ; i<Count ; i++ ){
                Data[i] = Added[i];
            }
        }
Exemple #4
0
        void NoiseLevelDetect(bool bDetect)
        {
            //Ищем все эктремумы

            int    i, j, Count = 0, DCount, DefeatedCount;
            double Sum = 0, Avg;
            double nMax = 0;

            Quanty.MZData[] Extrems = new Quanty.MZData[Data.Length];
            ExtremInd = new int[Data.Length];
            //если объем данных вырос - увеличиваем объем памяти

            //При расчете порога используем данные всего масс-спектра, независимо от диапазона
            for (j = 1; j <= Data.Length - 2; j++)
            {
                if (Data[j].Intensity > Data[j - 1].Intensity &&
                    Data[j].Intensity >= Data[j + 1].Intensity &&
                    (bDetect || Data[j].Intensity > NoiseLevel))
                {
                    Extrems[Count] = Data[j];
                    if (Data[j].Intensity > nMax)
                    {
                        nMax = Data[j].Intensity;
                    }
                    ExtremInd[Count] = j;
                    Sum += Data[j].Intensity;
                    Count++;
                }
            }
            ExtremCount = Count;
            DCount      = Count;

            if (bDetect)
            {
                //Удаляем шумовые экстремумы
                //шумовым экстремумом считаетсям экстремум чей уровень не превышает
                //средний уровень шумового экстремума болеее чем в три раза
                //сначала определяем средний уровень всех экстремумов
                //потом удаляем из выборки все нешумовые
                //потом повторяем процесс для всех оставшихся
                //делаем проходы пока не удалим последний нештатный экстремум
                do
                {
                    //Определяем средний уровень
                    //!!Что это!!
                    Avg = (Sum / DCount) * NoiseRate;
                    //выкидываем пики не превышающие этот уровень
                    DefeatedCount = 0;
                    for (j = 0; j < Count; j++)
                    {
                        if (Extrems[j].Intensity > Avg)
                        {
                            Extrems[j].Intensity = 0.0;
                            DefeatedCount++;
                        }
                    }
                    DCount = 0;
                    //Определяем новую среднюю величину экстремума
                    for (j = 0, Sum = 0; j < Count; j++)
                    {
                        if (Extrems[j].Intensity != 0)
                        {
                            Sum += Extrems[j].Intensity;
                            DCount++;
                        }
                    }
                }while (DefeatedCount > 0);
                NoiseLevel = Avg;
            }

            //сдвигаем в начало массива экстремумы, которые выше порога и внутри диапазона

            int[] ExtremBuf = new int[Count - DCount];
            Count = 0;
            for (i = 0; i < ExtremCount; i++)
            {
                if (Data[ExtremInd[i]].Intensity > NoiseLevel)
                {
                    ExtremInd[Count] = ExtremInd[i]; Count++;
                }
            }
            ExtremCount = Count;

            //По окончании у имеется массив ExtremInd[i], первые ExtremCount элементов которого
            //указывают на экстремумы пиков, которые выше порога и лежат внутри исследуемого диапазона
        }