//добавляет нули на границы заполненных областей 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]; } }
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 элементов которого //указывают на экстремумы пиков, которые выше порога и лежат внутри исследуемого диапазона }