Exemplo n.º 1
0
        private bool HasOverlappingRanges(IsolationRange range, IEnumerable <IsolationRange> rangesFirstHalf)
        {
            bool   seenLesser = false, seenGreater = false, leftOverlap = false, rightOverlap = false;
            double middleOfRange = (range.Start + range.End) / 2;

            foreach (var rangeCheck in rangesFirstHalf)
            {
                if (rangeCheck.Start < range.Start)
                {
                    seenLesser = true;
                    if (Math.Abs(middleOfRange - rangeCheck.End) <= 0.1)
                    {
                        leftOverlap = true;
                    }
                }
                if (rangeCheck.End > range.End)
                {
                    seenGreater = true;
                    if (Math.Abs(middleOfRange - rangeCheck.Start) <= 0.1)
                    {
                        rightOverlap = true;
                    }
                }
            }
            return((leftOverlap && rightOverlap) ||
                   (leftOverlap && !seenGreater) ||
                   (rightOverlap && !seenLesser));
        }
Exemplo n.º 2
0
        private IList <IsolationRange> ReadIsolationRangesFromFiles(IProgressMonitor progressMonitor)
        {
            var             isolationRangesResult = new IsolationRange[0];
            IProgressStatus status = new ProgressStatus();

            for (int i = 0; i < _dataSources.Length; i++)
            {
                var dataSource = _dataSources[i];
                progressMonitor.UpdateProgress(status = status.ChangeMessage(string.Format(Resources.IsolationSchemeReader_ReadIsolationRangesFromFiles_Reading_isolation_scheme_from__0_, dataSource)).ChangePercentComplete(i * 100 / _dataSources.Length));

                isolationRangesResult = ReadIsolationRanges(dataSource, isolationRangesResult);
            }

            progressMonitor.UpdateProgress(status.Complete());

            return(isolationRangesResult);
        }
Exemplo n.º 3
0
        private IsolationRange[] ReadIsolationRanges(MsDataFileUri dataSource, IsolationRange[] isolationRanges)
        {
            var    dictRangeCounts = isolationRanges.ToDictionary(r => r, r => 0);
            var    listRanges = new List <IsolationRange>(isolationRanges);
            double minStart = double.MaxValue, maxStart = double.MinValue;

            string path    = dataSource.GetFilePath();
            bool   isPasef = Equals(DataSourceUtil.GetSourceType(new DirectoryInfo(path)), DataSourceUtil.TYPE_BRUKER);

            using (var dataFile = new MsDataFileImpl(path, simAsSpectra: true))
            {
                int lookAheadCount = Math.Min(MAX_MULTI_CYCLE, dataFile.SpectrumCount);
                for (int i = 0; i < lookAheadCount; i++)
                {
                    if (dataFile.GetMsLevel(i) != 2)
                    {
                        continue;
                    }

                    var spectrum = dataFile.GetSpectrum(i);
                    isPasef = isPasef && spectrum.IonMobilities != null;
                    foreach (var precursor in spectrum.Precursors)
                    {
                        if (!precursor.IsolationWindowLower.HasValue || !precursor.IsolationWindowUpper.HasValue)
                        {
                            throw new IOException(string.Format(Resources.EditIsolationSchemeDlg_ReadIsolationRanges_Missing_isolation_range_for_the_isolation_target__0__m_z_in_the_file__1_, precursor.IsolationWindowTargetMz, dataSource));
                        }
                        double start = precursor.IsolationWindowTargetMz.Value - precursor.IsolationWindowLower.Value;
                        double end   = precursor.IsolationWindowTargetMz.Value + precursor.IsolationWindowUpper.Value;
                        var    range = new IsolationRange(start, end);
                        int    count;
                        if (!dictRangeCounts.TryGetValue(range, out count))
                        {
                            count = 0;
                            dictRangeCounts.Add(range, count);
                            listRanges.Add(range);
                        }
                        if (count == 2)
                        {
                            // Repeating for the third time
                            i = lookAheadCount;
                            break;
                        }
                        dictRangeCounts[range] = count + 1;
                        minStart = Math.Min(minStart, range.Start);
                        maxStart = Math.Max(maxStart, range.Start);
                    }
                }
            }
            if (dictRangeCounts.Values.Any(c => c == 1))
            {
                if (dictRangeCounts.Count > 2)
                {
                    // Sometime demux of overlapping schemes leaves wings that repeat only every other cycle
                    RemoveRangeSingleton(minStart, dictRangeCounts, listRanges);
                    RemoveRangeSingleton(maxStart, dictRangeCounts, listRanges);
                }

                if (dictRangeCounts.Values.Any(c => c == 1))
                {
                    throw new IOException(string.Format(Resources.EditIsolationSchemeDlg_ReadIsolationRanges_No_repeating_isolation_scheme_found_in__0_, dataSource));
                }
            }
            // diaPASEF comes in out of order and will be misinterpreted unless ordered
            // Multiplexing, however, requires that the acquired order by maintained
            if (isPasef)
            {
                listRanges.Sort((r1, r2) => r1.Start.CompareTo(r2.Start));
            }
            return(listRanges.ToArray());
        }
Exemplo n.º 4
0
 protected bool Equals(IsolationRange other)
 {
     return(Start.Equals(other.Start) && End.Equals(other.End));
 }
Exemplo n.º 5
0
        private IsolationRange[] ReadIsolationRanges(MsDataFileUri dataSource, IsolationRange[] isolationRanges)
        {
            var    dictRangeCounts = isolationRanges.ToDictionary(r => r, r => 0);
            var    listRanges = new List <IsolationRange>(isolationRanges);
            double minStart = double.MaxValue, maxStart = double.MinValue;

            using (var dataFile = new MsDataFileImpl(dataSource.GetFilePath(), simAsSpectra: true))
            {
                int lookAheadCount = Math.Min(MAX_MULTI_CYCLE, dataFile.SpectrumCount);
                for (int i = 0; i < lookAheadCount; i++)
                {
                    if (dataFile.GetMsLevel(i) != 2)
                    {
                        continue;
                    }

                    var spectrum = dataFile.GetSpectrum(i);
                    foreach (var precursor in spectrum.Precursors)
                    {
                        if (!precursor.IsolationWindowLower.HasValue || !precursor.IsolationWindowUpper.HasValue)
                        {
                            throw new IOException(string.Format(Resources.EditIsolationSchemeDlg_ReadIsolationRanges_Missing_isolation_range_for_the_isolation_target__0__m_z_in_the_file__1_, precursor.IsolationWindowTargetMz, dataSource));
                        }
                        double start = precursor.IsolationWindowTargetMz.Value - precursor.IsolationWindowLower.Value;
                        double end   = precursor.IsolationWindowTargetMz.Value + precursor.IsolationWindowUpper.Value;
                        var    range = new IsolationRange(start, end);
                        int    count;
                        if (!dictRangeCounts.TryGetValue(range, out count))
                        {
                            count = 0;
                            dictRangeCounts.Add(range, count);
                            listRanges.Add(range);
                        }
                        if (count == 2)
                        {
                            // Repeating for the third time
                            i = lookAheadCount;
                            break;
                        }
                        dictRangeCounts[range] = count + 1;
                        minStart = Math.Min(minStart, range.Start);
                        maxStart = Math.Max(maxStart, range.Start);
                    }
                }
            }
            if (dictRangeCounts.Values.Any(c => c == 1))
            {
                if (dictRangeCounts.Count > 2)
                {
                    // Sometime demux of overlapping schemes leaves wings that repeat only every other cycle
                    RemoveRangeSingleton(minStart, dictRangeCounts, listRanges);
                    RemoveRangeSingleton(maxStart, dictRangeCounts, listRanges);
                }

                if (dictRangeCounts.Values.Any(c => c == 1))
                {
                    throw new IOException(string.Format(Resources.EditIsolationSchemeDlg_ReadIsolationRanges_No_repeating_isolation_scheme_found_in__0_, dataSource));
                }
            }
            return(listRanges.ToArray());
        }