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)); }
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); }
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()); }
protected bool Equals(IsolationRange other) { return(Start.Equals(other.Start) && End.Equals(other.End)); }
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()); }