Пример #1
0
        public void ComputeSequenceRangeGroupingMetrics(SequenceRangeGrouping srg)
        {
            groups = 0L;
            ranges = 0L;
            bases = 0L;

            foreach (string id in srg.GroupIDs)
            {
                ++groups;
                ranges += srg.GetGroup(id).Count;
                foreach (SequenceRange sr in srg.GetGroup(id))
                {
                    bases += sr.Length;
                }
            }
            return;
        }
Пример #2
0
        /// <summary>
        /// Formats and writes the query region (Output of Merge/Subtract/Intersect) operations
        /// </summary>
        /// <param name="resultWorkbook">
        /// Workbook to which Range has to be written
        /// </param>
        /// <param name="resultSheetname">New worksheet name</param>
        /// <param name="resultGroup">Output group</param>
        /// <param name="groupsData">
        /// Complete input groups information
        /// Contains individual Group, sheet and addresses of ISequenceRange
        /// </param>
        private void WriteSequenceRange(
            Workbook resultWorkbook,
            string resultSheetname,
            SequenceRangeGrouping resultGroup,
            Dictionary<SequenceRangeGrouping, GroupData> groupsData,
            bool showMetadata,
            bool showBasePairCount)
        {
            if (resultGroup.GroupIDs.Count() > 0)
            {
                int baseRowIndex = 2, baseColumnIndex = 2;
                int dataRowIndex = 0, dataColumnIndex = 0;
                int totalColumnCount = 0;
                object[,] values;
                List<string> hyperlinks = null;
                List<ISequenceRange> resultSequenceRanges = null;
                Dictionary<SequenceRangeGrouping, Dictionary<string, int>> groupSheetIndices = null;
                Dictionary<int, Tuple<SequenceRangeGrouping, bool, List<ISequenceRange>>> columnData = null;
                Dictionary<ISequenceRange, string> rangedata = null;
                Dictionary<SequenceRangeGrouping, SequenceRangeGrouping> allSheetData = null;
                Dictionary<SequenceRangeGrouping, int> allSheetCount = null;
                SequenceRangeGrouping groupToMerge = null;
                SequenceRangeGrouping referenceGroup = null;
                SequenceRangeGrouping queryGroup = null;
                SequenceRangeGrouping sheetGroup = null;
                int sheetCount = 0;
                Range activeRange = null;

                var resultWorksheet =
                    resultWorkbook.Worksheets.Add(
                        Type.Missing,
                        resultWorkbook.Worksheets.get_Item(resultWorkbook.Worksheets.Count),
                        Type.Missing,
                        Type.Missing) as Worksheet;
                ((_Worksheet)resultWorksheet).Activate();
                Globals.ThisAddIn.Application.ActiveWindow.Zoom = ZoomLevel;

                resultWorksheet.Name = resultSheetname;
                activeRange = resultWorksheet.get_Range(GetColumnString(baseColumnIndex) + baseRowIndex, Type.Missing);

                rangedata = groupsData.Values.Select(gd => gd.Metadata) // Get the Metadata
                    .SelectMany(sd => sd.Values).ToList() // Get the Dictionary
                    .SelectMany(rd => rd).ToList().ToDictionary(k => k.Key, v => v.Value); // Convert to dictionary

                groupSheetIndices = new Dictionary<SequenceRangeGrouping, Dictionary<string, int>>();
                baseRowIndex = this.WriteSequenceRangeHeader(
                    resultWorksheet,
                    groupSheetIndices,
                    groupsData,
                    baseRowIndex,
                    baseColumnIndex,
                    ref totalColumnCount,
                    showMetadata,
                    showBasePairCount);
                totalColumnCount -= (baseColumnIndex - 1);

                foreach (string resultGroupKey in resultGroup.GroupIDs)
                {
                    resultSequenceRanges = resultGroup.GetGroup(resultGroupKey);
                    dataRowIndex = 0;
                    values = new object[resultSequenceRanges.Count, totalColumnCount];
                    activeRange = resultWorksheet.get_Range(
                        GetColumnString(baseColumnIndex) + baseRowIndex,
                        Missing.Value);
                    activeRange = activeRange.get_Resize(resultSequenceRanges.Count, totalColumnCount);

                    foreach (ISequenceRange resultSequenceRange in resultSequenceRanges)
                    {
                        referenceGroup = null;
                        queryGroup = null;
                        dataColumnIndex = 0;
                        allSheetData = new Dictionary<SequenceRangeGrouping, SequenceRangeGrouping>();
                        allSheetCount = new Dictionary<SequenceRangeGrouping, int>();

                        values[dataRowIndex, dataColumnIndex] = resultSequenceRange.ID;
                        dataColumnIndex++;
                        values[dataRowIndex, dataColumnIndex] = resultSequenceRange.Start;
                        dataColumnIndex++;
                        values[dataRowIndex, dataColumnIndex] = resultSequenceRange.End;
                        dataColumnIndex++;

                        if (showMetadata)
                        {
                            for (int index = 3; index < rangeHeaders.Count; index++)
                            {
                                values[dataRowIndex, dataColumnIndex] = ExtractRangeMetadata(
                                    resultSequenceRange,
                                    rangeHeaders[index]);
                                dataColumnIndex++;
                            }
                        }

                        columnData = PrepareSequenceRowRange(
                            groupsData,
                            groupSheetIndices,
                            rangedata,
                            resultSequenceRange);

                        foreach (var columnGroup in columnData)
                        {
                            if (showBasePairCount)
                            {
                                // Get the parent ranges for Group's range in a column
                                groupToMerge = new SequenceRangeGrouping(columnGroup.Value.Item3);
                                if (1 < columnGroup.Value.Item3.Count)
                                {
                                    groupToMerge = groupToMerge.MergeOverlaps(0, false);
                                }

                                // Render data for Group's range in a column
                                values[dataRowIndex, columnGroup.Key] =
                                    groupToMerge.GroupRanges.Sum(sr => sr.End - sr.Start);
                                values[dataRowIndex, columnGroup.Key + 1] = columnGroup.Value.Item3.Count;
                            }
                            else
                            {
                                values[dataRowIndex, columnGroup.Key] = columnGroup.Value.Item3.Count;
                            }

                            // Let the hyperlink added
                            hyperlinks = new List<string>();
                            foreach (ISequenceRange range in columnGroup.Value.Item3)
                            {
                                hyperlinks.AddRange(rangedata[range].Split(','));
                            }

                            this.ShowHyperlink(
                                hyperlinks,
                                activeRange,
                                columnGroup.Key,
                                dataRowIndex,
                                showBasePairCount);

                            if (showBasePairCount)
                            {
                                // Calculate data for all group
                                if (allSheetData.TryGetValue(columnGroup.Value.Item1, out sheetGroup))
                                {
                                    allSheetData[columnGroup.Value.Item1] = sheetGroup.MergeOverlaps(
                                        groupToMerge,
                                        0,
                                        false);
                                }
                                else
                                {
                                    allSheetData[columnGroup.Value.Item1] = groupToMerge;
                                }

                                // Build up reference & query groups (later get common range using this)
                                if (columnGroup.Value.Item2)
                                {
                                    if (null == referenceGroup)
                                    {
                                        referenceGroup = groupToMerge;
                                    }
                                    else
                                    {
                                        referenceGroup = referenceGroup.MergeOverlaps(groupToMerge, 0, false);
                                    }
                                }
                                else
                                {
                                    if (null == queryGroup)
                                    {
                                        queryGroup = groupToMerge;
                                    }
                                    else
                                    {
                                        queryGroup = queryGroup.MergeOverlaps(groupToMerge, 0, false);
                                    }
                                }
                            }

                            // Calculate range count for all group
                            if (allSheetCount.TryGetValue(columnGroup.Value.Item1, out sheetCount))
                            {
                                allSheetCount[columnGroup.Value.Item1] += columnGroup.Value.Item3.Count;
                            }
                            else
                            {
                                allSheetCount[columnGroup.Value.Item1] = columnGroup.Value.Item3.Count;
                            }
                        }

                        // Render all columns in SequenceRangeGrouping
                        foreach (var allData in allSheetCount)
                        {
                            dataColumnIndex = groupSheetIndices[allData.Key].Values.Min() - (showBasePairCount ? 2 : 1);
                            if (showBasePairCount)
                            {
                                values[dataRowIndex, dataColumnIndex] =
                                    allSheetData[allData.Key].GroupRanges.Sum(sr => sr.End - sr.Start);
                                dataColumnIndex++;
                            }
                            values[dataRowIndex, dataColumnIndex] = allData.Value;
                        }

                        if (showBasePairCount)
                        {
                            // Render common column in SequenceRangeGrouping
                            if (null != referenceGroup && null != queryGroup)
                            {
                                referenceGroup = referenceGroup.Intersect(
                                    queryGroup,
                                    0,
                                    IntersectOutputType.OverlappingPiecesOfIntervals,
                                    false);
                                values[dataRowIndex, totalColumnCount - 1] =
                                    referenceGroup.GroupRanges.Sum(sr => sr.End - sr.Start);
                            }
                            else
                            {
                                values[dataRowIndex, totalColumnCount - 1] = 0;
                            }
                        }

                        dataRowIndex++;
                    }

                    activeRange.set_Value(Missing.Value, values);

                    baseRowIndex += dataRowIndex;
                }

                resultWorksheet.Columns.AutoFit();
                this.NormalizeColumWidths(resultWorksheet.UsedRange);
                this.EnableAllControls();
            }
            else
            {
                MessageBox.Show(
                    Resources.NO_RESULT,
                    Resources.CAPTION,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Information);
            }
        }
Пример #3
0
        /// <summary>
        /// Method to validate parent seq ranges in result.
        /// </summary>
        /// <param name="resultSeqRange">Result seq range group.</param>
        /// <param name="refSeqRange">Reference seq range group.</param>
        /// <param name="querySeqRange">Query seq range group.</param>
        /// <param name="isParentSeqRangeRequired">Flag to indicate whether result should contain parent seq ranges or not.</param>
        /// <returns>Returns true if the parent seq ranges are valid; otherwise returns false.</returns>
        private static bool ValidateParentSeqRange(SequenceRangeGrouping resultSeqRange, SequenceRangeGrouping refSeqRange,
            SequenceRangeGrouping querySeqRange, bool isParentSeqRangeRequired)
        {
            IList<ISequenceRange> refSeqRangeList = new List<ISequenceRange>();
            IList<ISequenceRange> querySeqRangeList = new List<ISequenceRange>();

            foreach (string groupid in resultSeqRange.GroupIDs)
            {
                if (refSeqRange != null)
                {
                    refSeqRangeList = refSeqRange.GetGroup(groupid);
                }

                if (querySeqRange != null)
                {
                    querySeqRangeList = querySeqRange.GetGroup(groupid);
                }


                foreach (ISequenceRange resultRange in resultSeqRange.GetGroup(groupid))
                {
                    if (!isParentSeqRangeRequired)
                    {
                        if (resultRange.ParentSeqRanges.Count != 0)
                        {
                            return false;
                        }
                    }
                    else
                    {

                        int refCount = refSeqRangeList.Where(R => resultRange.ParentSeqRanges.Contains(R)).Count();
                        int queryCount = querySeqRangeList.Where(R => resultRange.ParentSeqRanges.Contains(R)).Count();


                        if (refCount + queryCount != resultRange.ParentSeqRanges.Count)
                        {
                            return false;
                        }
                    }
                }
            }

            return true;
        }
Пример #4
0
        /// <summary>
        /// Write source sequence ranges to the given workbook in a new sheet
        /// </summary>
        /// <param name="sourceSequenceRanges">Source sequence ranges</param>
        /// <param name="sheetName">Name to be given for the new sheet</param>
        /// <param name="targetWorkbook">Workbook in which the sheet has to be added</param>
        /// <returns>Newly created sheet with source data.</returns>
        private static Worksheet DisplaySourceData(SequenceRangeGrouping sourceSequenceRanges, string sheetName, Workbook targetWorkbook)
        {
            //create new sheet
            Worksheet outputSheet = targetWorkbook.Sheets.Add(Type.Missing, targetWorkbook.Sheets[targetWorkbook.Sheets.Count], 1, XlSheetType.xlWorksheet);
            outputSheet.Name = sheetName;

            targetWorkbook.Application.ScreenUpdating = false;
            targetWorkbook.Application.EnableEvents = false;

            try
            {
                // write the header
                outputSheet.Range["A1", "C1"].Value2 = BedHeaders;

                // write bed data
                int currentRow = 2;
                foreach (string groupID in sourceSequenceRanges.GroupIDs)
                {
                    Range outputRange = WriteSequenceRangeAt(outputSheet.Cells[currentRow, 1], sourceSequenceRanges.GetGroup(groupID), false);
                    currentRow += outputRange.Rows.Count;
                }

                outputSheet.UsedRange.Columns.AutoFit();
            }
            finally
            {
                targetWorkbook.Application.ScreenUpdating = true;
                targetWorkbook.Application.EnableEvents = true;
            }

            return outputSheet;
        }
Пример #5
0
        /// <summary>
        /// This method will dump the region overlap data to a sheet in the NodeXL workbook.
        /// </summary>
        /// <param name="outputSheet">Sheet to which the data should be dumped to</param>
        /// <param name="srgOnly_A">Only A</param>
        /// <param name="srgOnly_B">Only A</param>
        /// <param name="srgOnly_AB">Only A</param>
        /// <returns>Worksheet after writing data</returns>
        private static Worksheet WriteOverlapData(Worksheet outputSheet, SequenceRangeGrouping srgOnly_A, SequenceRangeGrouping srgOnly_B, SequenceRangeGrouping srgOnly_AB)
        {
            outputSheet.Application.ScreenUpdating = false;
            outputSheet.Application.EnableEvents = false;
            List<ISequenceRange> seqs_AList = null;
            List<ISequenceRange> seqs_BList = null;
            List<ISequenceRange> seqs_ABList = null;
            int dataStartRow = 7;
            int currentRow;
            try
            {
                // write the header
                outputSheet.Range["A2"].Value2 = Resources.RegionsCountLabel;
                outputSheet.Range["A3"].Value2 = Resources.BasePairsCountLabel;
                outputSheet.Range["A4"].Value2 = Resources.PerOfBasePairsInRegionLabel;
                outputSheet.Range["D1"].Value2 = Resources.OnlyA;
                outputSheet.Range["E1"].Value2 = Resources.OnlyB;
                outputSheet.Range["F1"].Value2 = Resources.OnlyAB;
                outputSheet.Range["G1"].Value2 = Resources.Total;

                outputSheet.Range["A6", "F6"].Value2 = BedHeadersForTwoInput;
                outputSheet.Range["A6", "F6"].Cells.Borders[XlBordersIndex.xlEdgeBottom].Weight = XlBorderWeight.xlThin;
                outputSheet.Range["A1", "F1"].Cells.HorizontalAlignment = XlHAlign.xlHAlignCenter;
                outputSheet.Range["A6", "F6"].Cells.HorizontalAlignment = XlHAlign.xlHAlignCenter;
                currentRow = dataStartRow;

                // Get all groupID's in all ranges
                List<string> groupIDs = new List<string>();
                groupIDs.AddRange(srgOnly_A.GroupIDs);
                groupIDs.AddRange(srgOnly_B.GroupIDs);
                groupIDs.AddRange(srgOnly_AB.GroupIDs);

                int prevRow = dataStartRow;

                // Display all overlap data
                foreach (string groupID in groupIDs.Distinct())
                {
                    seqs_AList = srgOnly_A.GetGroup(groupID);
                    seqs_BList = srgOnly_B.GetGroup(groupID);
                    seqs_ABList = srgOnly_AB.GetGroup(groupID);

                    if (seqs_AList == null) seqs_AList = new List<ISequenceRange>();
                    if (seqs_BList == null) seqs_BList = new List<ISequenceRange>();
                    if (seqs_ABList == null) seqs_ABList = new List<ISequenceRange>();

                    int indexA = 0;
                    int indexB = 0;
                    int indexAB = 0;

                    object[,] output = new object[seqs_AList.Count + seqs_BList.Count + seqs_ABList.Count, 6];

                    while (indexA < seqs_AList.Count || indexB < seqs_BList.Count || indexAB < seqs_ABList.Count)
                    {
                        ISequenceRange a = indexA < seqs_AList.Count ? seqs_AList[indexA] : null;
                        ISequenceRange b = indexB < seqs_BList.Count ? seqs_BList[indexB] : null;
                        ISequenceRange ab = indexAB < seqs_ABList.Count ? seqs_ABList[indexAB] : null;

                        ISequenceRange range = GetSmallestSeqRangeToDisplay(a, b, ab);

                        if (range == null)
                        {
                            indexA++;
                            indexB++;
                            indexAB++;

                            continue;
                        }

                        output[currentRow - prevRow, 0] = range.ID;
                        output[currentRow - prevRow, 1] = range.Start;
                        output[currentRow - prevRow, 2] = range.End;

                        if (range == a)
                        {
                            // display
                            output[currentRow - prevRow, 3] = Math.Abs(range.End - range.Start);
                            indexA++;
                        }
                        else if (range == b)
                        {
                            // display
                            output[currentRow - prevRow, 4] = Math.Abs(range.End - range.Start);
                            indexB++;
                        }
                        else
                        {
                            // display
                            output[currentRow - prevRow, 5] = Math.Abs(range.End - range.Start);
                            indexAB++;
                        }

                        currentRow++;
                    }

                    outputSheet.Range["A" + prevRow.ToString(), "F" + (currentRow -1).ToString()].Value2 = output;
                    prevRow = currentRow;
                }

                string formula = string.Format(CultureInfo.InvariantCulture, CountFormulaFormat, "D", dataStartRow, "D", currentRow - 1);
                outputSheet.Range["D2"].Formula = formula;
                formula = string.Format(CultureInfo.InvariantCulture, CountFormulaFormat, "E", dataStartRow, "E", currentRow - 1);
                outputSheet.Range["E2"].Formula = formula;
                formula = string.Format(CultureInfo.InvariantCulture, CountFormulaFormat, "F", dataStartRow, "F", currentRow - 1);
                outputSheet.Range["F2"].Formula = formula;
                formula = string.Format(CultureInfo.InvariantCulture, SumFormulaFormat, "D", 2, "F", 2);
                outputSheet.Range["G2"].Formula = formula;

                formula = string.Format(CultureInfo.InvariantCulture, SumFormulaFormat, "D", dataStartRow, "D", currentRow - 1);
                outputSheet.Range["D3"].Formula = formula;
                formula = string.Format(CultureInfo.InvariantCulture, SumFormulaFormat, "E", dataStartRow, "E", currentRow - 1);
                outputSheet.Range["E3"].Formula = formula;
                formula = string.Format(CultureInfo.InvariantCulture, SumFormulaFormat, "F", dataStartRow, "F", currentRow - 1);
                outputSheet.Range["F3"].Formula = formula;
                formula = string.Format(CultureInfo.InvariantCulture, SumFormulaFormat, "D", 3, "F", 3);
                outputSheet.Range["G3"].Formula = formula;

                outputSheet.Range["D4"].Formula = "=D3/G3";
                outputSheet.Range["E4"].Formula = "=E3/G3";
                outputSheet.Range["F4"].Formula = "=F3/G3";
                formula = string.Format(CultureInfo.InvariantCulture, SumFormulaFormat, "D", 4, "F", 4);
                outputSheet.Range["G4"].Formula = formula;
                outputSheet.Range["D4", "G4"].Cells.NumberFormat = "0.00%";

                outputSheet.UsedRange.Columns.AutoFit();
            }
            finally
            {
                outputSheet.Application.ScreenUpdating = true;
                outputSheet.Application.EnableEvents = true;
            }

            return outputSheet;
        }
Пример #6
0
        /// <summary>
        /// Display Sequence range grops
        /// </summary>
        /// <param name="seqRangeGrops">Sequence Ranges grops</param>
        private static void DisplaySequenceRange(SequenceRangeGrouping seqRangeGrop)
        {
            IEnumerable<string> rangeGroupIds = seqRangeGrop.GroupIDs;
            string rangeID = string.Empty;

            // Display Sequence Ranges
            Console.Write("\r\nChromosome\t\tStart\tEnd");

            foreach (string groupID in rangeGroupIds)
            {
                rangeID = groupID;

                // Get SequenceRangeIds.
                List<ISequenceRange> rangeList = seqRangeGrop.GetGroup(rangeID);

                foreach (ISequenceRange seqRange in rangeList)
                {
                    Console.Write("\n{0}\t\t\t{1}\t{2}", seqRange.ID.ToString(),
                        seqRange.Start.ToString(), seqRange.End.ToString());

                }
            }

        }
Пример #7
0
        // default printing of SequenceRangeGrouping
        //
        public static void SequenceRangeGroupingToString(SequenceRangeGrouping srg, string name)
        {
            Console.Error.Write("[{0}] : SeqeuenceRangeGrouping: ", name);
            var srgm = new SequenceRangeGroupingMetrics(srg);
            Console.Error.WriteLine("{0}, {1}, {2}", srgm.groups, srgm.ranges, srgm.bases);

            foreach (string id in srg.GroupIDs)
            {
                Console.Error.WriteLine("--GroupID: {0}, {1}", id, srg.GetGroup(id).Count());
                ListSequenceRangeToString(srg.GetGroup(id));
            }
            Console.Error.WriteLine();
        }