示例#1
0
 public static IEnumerable <TItem> EnumRange <TItem>(IMzLiteArray <TItem> items, IndexRange range)
 {
     for (int i = range.Low; i <= range.Heigh; i++)
     {
         yield return(items[i]);
     }
 }
示例#2
0
        /// <summary>
        /// Extract a rt profile for specified target mass and rt range.
        /// Mz range peak aggregation is closest lock mz.
        /// </summary>
        /// <returns>
        /// Profile array with index corresponding to continous mass spectra over rt range and mz range given.
        /// </returns>
        public static Peak2D[] RtProfile(
            this IMzLiteDataReader dataReader,
            IMzLiteArray <RtIndexEntry> rtIndex,
            RangeQuery rtRange,
            RangeQuery mzRange)
        {
            if (dataReader == null)
            {
                throw new ArgumentNullException("dataReader");
            }
            if (rtIndex == null)
            {
                throw new ArgumentNullException("rtIndex");
            }

            var entries = rtIndex.Search(rtRange).ToArray();
            var profile = new Peak2D[entries.Length];

            for (int rtIdx = 0; rtIdx < entries.Length; rtIdx++)
            {
                var entry = entries[rtIdx];
                var peaks = dataReader.ReadSpectrumPeaks(entry).Peaks;
                var p     = peaks.MzSearch(mzRange)
                            .DefaultIfEmpty(new Peak1D(0, mzRange.LockValue))
                            .ClosestMz(mzRange.LockValue)
                            .AsPeak2D(entry.Rt);
                profile[rtIdx] = p;
            }
            return(profile);
        }
示例#3
0
 public static T[] ToCLRArray <T>(this IMzLiteArray <T> array)
 {
     T[] copy = new T[array.Length];
     for (int i = 0; i < array.Length; i++)
     {
         copy[i] = array[i];
     }
     return(copy);
 }
示例#4
0
        /// <summary>
        /// Get all peaks by rt range.
        /// </summary>
        public static IEnumerable <TPeak> RtSearch <TPeak>(
            this IMzLiteArray <TPeak> peaks,
            RangeQuery rtRange) where TPeak : Peak2D
        {
            if (peaks == null)
            {
                throw new ArgumentNullException("peaks");
            }

            return(BinarySearch.Search(peaks, rtRange, RtSearchCompare));
        }
示例#5
0
        /// <summary>
        /// Get all rt index entries by rt range.
        /// </summary>
        public static IEnumerable <RtIndexEntry> Search(
            this IMzLiteArray <RtIndexEntry> rti,
            RangeQuery rtRange)
        {
            if (rti == null)
            {
                throw new ArgumentNullException("rti");
            }

            return(BinarySearch.Search(rti, rtRange, RtSearchCompare));
        }
示例#6
0
        public static IEnumerable <TItem> Search <TItem, TQuery>(
            IMzLiteArray <TItem> items,
            TQuery query,
            Func <TItem, TQuery, int> searchCompare)
        {
            IndexRange result;

            if (Search(items, query, searchCompare, out result))
            {
                return(IndexRange.EnumRange(items, result));
            }
            else
            {
                return(Enumerable.Empty <TItem>());
            }
        }
示例#7
0
        public static bool Search <TItem, TQuery>(
            IMzLiteArray <TItem> items,
            TQuery query,
            Func <TItem, TQuery, int> searchCompare,
            out IndexRange result)
        {
            int lo = 0;
            int hi = items.Length - 1;

            while (lo <= hi)
            {
                int mid = lo + ((hi - lo) >> 1);

                int c = searchCompare(items[mid], query);

                if (c == 0)
                {
                    int resultLow   = mid;
                    int resultHeigh = mid;

                    // search tees low
                    for (int i = mid - 1; i >= 0; i--)
                    {
                        if (searchCompare(items[i], query) == 0)
                        {
                            resultLow = i;
                        }
                        else
                        {
                            break;
                        }
                    }

                    // search tees heigh
                    for (int i = mid + 1; i < items.Length; i++)
                    {
                        if (searchCompare(items[i], query) == 0)
                        {
                            resultHeigh = i;
                        }
                        else
                        {
                            break;
                        }
                    }

                    result = new IndexRange(resultLow, resultHeigh);
                    return(true);
                }

                if (c < 0)
                {
                    lo = mid + 1;
                }
                else
                {
                    hi = mid - 1;
                }
            }

            result = null;
            return(false);
        }