/// <summary> /// Возвращает статус возможности слияния. /// </summary> /// <returns>0 - можно сливать, 1 - a идёт до b, -1 - a идёт после b</returns> public static int GetMergeStatus(MergedNarrowPeak a, MergedNarrowPeak b) { if (a.Chr != b.Chr) return (int)b.Chr - (int)a.Chr > 0 ? 1 : -1; if (a.StartPos >= b.EndPos) return -1; if (b.StartPos >= a.EndPos) return 1; if (a.StartPos >= b.StartPos && a.EndPos <= b.EndPos) return 0; if (b.StartPos >= a.StartPos && b.EndPos <= a.EndPos) return 0; if (Math.Min(Math.Abs(a.StartPos - b.StartPos), Math.Abs(b.EndPos - a.EndPos)) < Math.Min(a.Size, b.Size)/5) return 0; return b.StartPos > a.StartPos ? 1 : -1; }
public static MergedNarrowPeak Merge(MergedNarrowPeak a, MergedNarrowPeak b) { Debug.Assert(a.Chr == b.Chr); var start = (int)Math.Round((a.StartPos * (long)a.Count + b.StartPos * (long)b.Count) / (double)(a.Count + b.Count)); var end = (int)Math.Round((a.EndPos * (long)a.Count + b.EndPos * (long)b.Count) / (double)(a.Count + b.Count)); var minStart = Math.Min(a.StartPosMin, b.StartPosMin); var maxStart = Math.Max(a.StartPosMax, b.StartPosMax); var minEnd = Math.Min(a.EndPosMin, b.EndPosMin); var maxEnd = Math.Max(a.EndPosMax, b.EndPosMax); return new MergedNarrowPeak(a.Chr, start, end, a.Values1.ConcatArray(b.Values1), a.Values2.ConcatArray(b.Values2), minStart, maxStart, minEnd, maxEnd, a.CellIds.ConcatArray(b.CellIds)); }
public Region(MergedNarrowPeak peak) { Chr = peak.Chr; Start = peak.StartPosMin; Size = peak.EndPosMax - Start; }