protected override void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { lock (syncLock) { Dictionary<string, string> inputVariableList = ((GadgetParameters)e.Argument).InputVariableList; //Stopwatch stopwatch = new Stopwatch(); //stopwatch.Start(); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToProcessingState)); this.Dispatcher.BeginInvoke(new SimpleCallback(ClearResults)); AddFreqGridDelegate addGrid = new AddFreqGridDelegate(AddFreqGrid); SetGridTextDelegate setText = new SetGridTextDelegate(SetGridText); AddGridRowDelegate addRow = new AddGridRowDelegate(AddGridRow); RenderFrequencyHeaderDelegate renderHeader = new RenderFrequencyHeaderDelegate(RenderFrequencyHeader); DrawFrequencyBordersDelegate drawBorders = new DrawFrequencyBordersDelegate(DrawOutputGridBorders); string freqVar = string.Empty; string weightVar = string.Empty; string strataVar = string.Empty; string crosstabVar = string.Empty; bool includeMissing = false; bool outcomeContinuous = false; bool showStrataSummaryOnly = false; if (inputVariableList.ContainsKey("freqvar")) { freqVar = inputVariableList["freqvar"]; } if (inputVariableList.ContainsKey("crosstabvar")) { crosstabVar = inputVariableList["crosstabvar"]; } if (inputVariableList.ContainsKey("weightvar")) { weightVar = inputVariableList["weightvar"]; } if (inputVariableList.ContainsKey("stratavar")) { strataVar = inputVariableList["stratavar"]; } if (inputVariableList.ContainsKey("includemissing")) { if (inputVariableList["includemissing"].Equals("true")) { includeMissing = true; } } if (inputVariableList.ContainsKey("stratasummaryonly")) { if (inputVariableList["stratasummaryonly"].Equals("true")) { showStrataSummaryOnly = true; } } if (inputVariableList.ContainsKey("treatoutcomeascontinuous")) { if (inputVariableList["treatoutcomeascontinuous"].Equals("true")) { outcomeContinuous = true; } } List<string> stratas = new List<string>(); if (!string.IsNullOrEmpty(strataVar)) { stratas.Add(strataVar); } try { GadgetOptions.GadgetStatusUpdate += new GadgetStatusUpdateHandler(requestUpdateStatus); GadgetOptions.GadgetCheckForCancellation += new GadgetCheckForCancellationHandler(checkForCancellation); if (this.DataFilters != null && this.DataFilters.Count > 0) { GadgetOptions.CustomFilter = this.DataFilters.GenerateDataFilterString(false); } else { GadgetOptions.CustomFilter = string.Empty; } bool runGroup = false; Dictionary<DataTable, List<DescriptiveStatistics>> stratifiedFrequencyTables = new Dictionary<DataTable, List<DescriptiveStatistics>>(); List<string> allGroupFields = DashboardHelper.GetAllGroupsAsList(); if (GadgetOptions.MainVariableNames != null && GadgetOptions.MainVariableNames.Count > 0) { Dictionary<DataTable, List<DescriptiveStatistics>> grpTables = new Dictionary<DataTable, List<DescriptiveStatistics>>(); foreach (string mainVariableName in GadgetOptions.MainVariableNames) { GadgetParameters newOptions = new GadgetParameters(GadgetOptions); newOptions.MainVariableNames = null; newOptions.MainVariableName = mainVariableName; grpTables = DashboardHelper.GenerateFrequencyTable(newOptions); foreach (KeyValuePair<DataTable, List<DescriptiveStatistics>> kvp in grpTables) { stratifiedFrequencyTables.Add(kvp.Key, kvp.Value); } } runGroup = true; } else if (allGroupFields.Contains(GadgetOptions.MainVariableName)) { Dictionary<DataTable, List<DescriptiveStatistics>> grpTables = new Dictionary<DataTable, List<DescriptiveStatistics>>(); foreach (string variableName in DashboardHelper.GetVariablesInGroup(GadgetOptions.MainVariableName)) { if (!allGroupFields.Contains(variableName) && DashboardHelper.TableColumnNames.ContainsKey(variableName)) { GadgetParameters newOptions = new GadgetParameters(GadgetOptions); newOptions.MainVariableNames = null; newOptions.MainVariableName = variableName; grpTables = DashboardHelper.GenerateFrequencyTable(newOptions); foreach (KeyValuePair<DataTable, List<DescriptiveStatistics>> kvp in grpTables) { stratifiedFrequencyTables.Add(kvp.Key, kvp.Value); } } } runGroup = true; } else { stratifiedFrequencyTables = DashboardHelper.GenerateFrequencyTable(GadgetOptions/*, freqVar, weightVar, stratas, crosstabVar, useAllPossibleValues, sortHighLow, includeMissing, false*/); runGroup = false; } if (runGroup) showStrataSummaryOnly = false; if (stratifiedFrequencyTables == null || stratifiedFrequencyTables.Count == 0) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), DashboardSharedStrings.GADGET_MSG_NO_DATA); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); return; } else if (worker.CancellationPending) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.DASHBOARD_GADGET_STATUS_OPERATION_CANCELLED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); //Debug.Print("Thread cancelled"); return; } else { string formatString = string.Empty; this.plusPlus = 0.0; this.plusMinus = 0.0; this.minusPlus = 0.0; this.minusMinus = 0.0; this.noCases = 0.0; this.extraCases = 0.0; this.noControls = 0.0; this.extraControls = 0.0; foreach (KeyValuePair<DataTable, List<DescriptiveStatistics>> tableKvp in stratifiedFrequencyTables) { SmartTable(tableKvp.Key); string strataValue = tableKvp.Key.TableName; double count = 0; foreach (DescriptiveStatistics ds in tableKvp.Value) { count = count + ds.observations; } if (count == 0 && stratifiedFrequencyTables.Count == 1) { // this is the only table and there are no records, so let the user know this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.NO_RECORDS_SELECTED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); return; } else if (count == 0) { continue; } DataTable frequencies = tableKvp.Key; if (YesValues.Count > 0 && NoValues.Count > 0) { frequencies = ApplyRowValueMappings(frequencies); frequencies = ApplyColumnValueMappings(frequencies); } if (frequencies.Rows.Count == 0) { continue; } if (outcomeContinuous) { if (frequencies.Columns.Count <= 128) { int min; int max; if (int.TryParse(frequencies.Columns[1].ColumnName, out min) && int.TryParse(frequencies.Columns[frequencies.Columns.Count - 1].ColumnName, out max)) { bool addedColumns = false; for (int i = min; i <= max; i++) { if (!frequencies.Columns.Contains(i.ToString())) { DataColumn newColumn = new DataColumn(i.ToString(), typeof(double)); newColumn.DefaultValue = 0; frequencies.Columns.Add(newColumn); addedColumns = true; } } if (addedColumns) { int ordinal = 1; for (int i = min; i <= max; i++) { if (frequencies.Columns.Contains(i.ToString())) { frequencies.Columns[i.ToString()].SetOrdinal(ordinal); ordinal++; } } } } } } this.Dispatcher.BeginInvoke(addGrid, strataVar, frequencies.TableName, crosstabVar, frequencies.Columns[0].ToString(), frequencies); } foreach (KeyValuePair<DataTable, List<DescriptiveStatistics>> tableKvp in stratifiedFrequencyTables) { if (runGroup) { freqVar = tableKvp.Key.Columns[0].ColumnName; } string strataValue = tableKvp.Key.TableName; double count = 0; foreach (DescriptiveStatistics ds in tableKvp.Value) { count = count + ds.observations; } if (count == 0) { continue; } DataTable frequencies = tableKvp.Key; if (YesValues.Count > 0 && NoValues.Count > 0) { frequencies = ApplyRowValueMappings(frequencies); frequencies = ApplyColumnValueMappings(frequencies); } if (frequencies.Rows.Count == 0) { continue; } string tableHeading = tableKvp.Key.TableName; if (stratifiedFrequencyTables.Count > 1) { tableHeading = freqVar; } this.Dispatcher.BeginInvoke(renderHeader, strataValue, tableHeading, frequencies.Columns); rowCount = 1; int[] totals = new int[frequencies.Columns.Count - 1]; columnCount = 1; DataRow[] SortedRows = new DataRow[frequencies.Rows.Count]; int rowcounter = 0; foreach (System.Data.DataRow row in frequencies.Rows) { SortedRows[rowcounter++] = row; if (!row[freqVar].Equals(DBNull.Value) || (row[freqVar].Equals(DBNull.Value) && includeMissing == true)) { this.Dispatcher.Invoke(addRow, strataValue, -1); string displayValue = row[freqVar].ToString(); if (DashboardHelper.IsUserDefinedColumn(freqVar)) { displayValue = DashboardHelper.GetFormattedOutput(freqVar, row[freqVar]); } else { if (DashboardHelper.IsUsingEpiProject && View.Fields[freqVar] is YesNoField) { if (row[freqVar].ToString().Equals("1")) displayValue = "Yes"; else if (row[freqVar].ToString().Equals("0")) displayValue = "No"; } else if (DashboardHelper.IsUsingEpiProject && View.Fields[freqVar] is DateField) { displayValue = string.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:d}", row[freqVar]); } else if (DashboardHelper.IsUsingEpiProject && View.Fields[freqVar] is TimeField) { displayValue = string.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:T}", row[freqVar]); } else { displayValue = DashboardHelper.GetFormattedOutput(freqVar, row[freqVar]); } } if (string.IsNullOrEmpty(displayValue)) { Configuration config = DashboardHelper.Config; displayValue = config.Settings.RepresentationOfMissing; } this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(displayValue, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Left, rowCount, 0, System.Windows.Visibility.Visible), FontWeights.Normal); int rowTotal = 0; columnCount = 1; foreach (DataColumn column in frequencies.Columns) { if (column.ColumnName.Equals(freqVar)) { continue; } this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(row[column.ColumnName].ToString(), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, columnCount, System.Windows.Visibility.Visible), FontWeights.Normal); columnCount++; int rowValue = 0; bool success = int.TryParse(row[column.ColumnName].ToString(), out rowValue); if (success) { totals[columnCount - 2] = totals[columnCount - 2] + rowValue; rowTotal = rowTotal + rowValue; } } this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(rowTotal.ToString(), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, columnCount, System.Windows.Visibility.Visible), FontWeights.Bold); rowCount++; } } double[] tableChiSq = Epi.Statistics.SingleMxN.CalcChiSq(SortedRows, false); double tableChiSqDF = (double)(SortedRows.Length - 1) * (SortedRows[0].ItemArray.Length - 2); double tableChiSqP = Epi.Statistics.SharedResources.PValFromChiSq(tableChiSq[0], tableChiSqDF); String disclaimer = ""; if (tableChiSq[1] == 1.0) disclaimer = SharedStrings.TABLES_CHI_SQUARE_NOT_VALID; this.Dispatcher.BeginInvoke(new AddChiSquareDelegate(RenderChiSquare), tableChiSq[0], tableChiSqDF, tableChiSqP, disclaimer, strataValue); this.Dispatcher.BeginInvoke(new AddGridFooterDelegate(RenderFrequencyFooter), strataValue, rowCount, totals); this.Dispatcher.BeginInvoke(drawBorders, strataValue); } } this.Dispatcher.BeginInvoke(new SimpleCallback(RenderFinish)); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); // check for existence of 2x2 table... if (rowCount == 3 && columnCount == 3) { } stratifiedFrequencyTables.Clear(); } catch (Exception ex) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), ex.Message); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } finally { //stopwatch.Stop(); //Debug.Print("Crosstab gadget took " + stopwatch.Elapsed.ToString() + " seconds to complete with " + dashboardHelper.RecordCount.ToString() + " records and the following filters:"); //Debug.Print(dashboardHelper.DataFilters.GenerateDataFilterString()); } } }
/// <summary> /// Handles the DoWorker event for the worker /// </summary> /// <param name="sender">Object that fired the event</param> /// <param name="e">.NET supplied event parameters</param> protected override void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { lock (syncLock) { Dictionary<string, string> inputVariableList = ((GadgetParameters)e.Argument).InputVariableList; Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToProcessingState)); this.Dispatcher.BeginInvoke(new SimpleCallback(ClearResults)); AddFreqGridDelegate addGrid = new AddFreqGridDelegate(AddFreqGrid); SetGridTextDelegate setText = new SetGridTextDelegate(SetGridText); AddGridRowDelegate addRow = new AddGridRowDelegate(AddGridRow); SetGridBarDelegate setBar = new SetGridBarDelegate(SetGridBar); RenderFrequencyHeaderDelegate renderHeader = new RenderFrequencyHeaderDelegate(RenderFrequencyHeader); DrawFrequencyBordersDelegate drawBorders = new DrawFrequencyBordersDelegate(DrawOutputGridBorders); string freqVar = GadgetOptions.MainVariableName; string weightVar = GadgetOptions.WeightVariableName; string strataVar = string.Empty; bool showConfLimits = false; bool showCumulativePercent = false; bool includeMissing = GadgetOptions.ShouldIncludeMissing; if (inputVariableList.ContainsKey("stratavar")) { strataVar = inputVariableList["stratavar"]; } if (inputVariableList.ContainsKey("showconflimits")) { if (inputVariableList["showconflimits"].Equals("true")) { showConfLimits = true; } } if (inputVariableList.ContainsKey("showcumulativepercent")) { if (inputVariableList["showcumulativepercent"].Equals("true")) { showCumulativePercent = true; } } List<string> stratas = new List<string>(); if (!string.IsNullOrEmpty(strataVar)) { stratas.Add(strataVar); } try { Configuration config = dashboardHelper.Config; string yesValue = config.Settings.RepresentationOfYes; string noValue = config.Settings.RepresentationOfNo; RequestUpdateStatusDelegate requestUpdateStatus = new RequestUpdateStatusDelegate(RequestUpdateStatusMessage); CheckForCancellationDelegate checkForCancellation = new CheckForCancellationDelegate(IsCancelled); GadgetOptions.GadgetStatusUpdate += new GadgetStatusUpdateHandler(requestUpdateStatus); GadgetOptions.GadgetCheckForCancellation += new GadgetCheckForCancellationHandler(checkForCancellation); if (this.DataFilters != null && this.DataFilters.Count > 0) { GadgetOptions.CustomFilter = this.DataFilters.GenerateDataFilterString(false); } else { GadgetOptions.CustomFilter = string.Empty; } Dictionary<DataTable, List<DescriptiveStatistics>> stratifiedFrequencyTables = dashboardHelper.GenerateFrequencyTable(GadgetOptions/*, freqVar, weightVar, stratas, string.Empty, useAllPossibleValues, sortHighLow, includeMissing, false*/); if (stratifiedFrequencyTables == null || stratifiedFrequencyTables.Count == 0) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), DashboardSharedStrings.GADGET_MSG_NO_DATA); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); return; } else if (worker.CancellationPending) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), DashboardSharedStrings.GADGET_MSG_OPERATION_CANCELLED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); return; } else { string formatString = string.Empty; foreach (KeyValuePair<DataTable, List<DescriptiveStatistics>> tableKvp in stratifiedFrequencyTables) { string strataValue = tableKvp.Key.TableName; double count = 0; foreach (DescriptiveStatistics ds in tableKvp.Value) { count = count + ds.observations; } if (count == 0 && stratifiedFrequencyTables.Count == 1) { // this is the only table and there are no records, so let the user know this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), DashboardSharedStrings.GADGET_MSG_NO_DATA); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); return; } else if (count == 0) { continue; } DataTable frequencies = tableKvp.Key; if (frequencies.Rows.Count == 0) { continue; } this.Dispatcher.BeginInvoke(addGrid, strataVar, frequencies.TableName); } foreach (KeyValuePair<DataTable, List<DescriptiveStatistics>> tableKvp in stratifiedFrequencyTables) { string strataValue = tableKvp.Key.TableName; double count = 0; foreach (DescriptiveStatistics ds in tableKvp.Value) { count = count + ds.observations; } if (count == 0) { continue; } DataTable frequencies = tableKvp.Key; if (frequencies.Rows.Count == 0) { continue; } string tableHeading = tableKvp.Key.TableName; if (stratifiedFrequencyTables.Count > 1) { tableHeading = freqVar;// +": " + strataVar + " = " + frequencies.TableName; } if (!showCumulativePercent) { this.Dispatcher.BeginInvoke(new SimpleCallback(HideCumulativePercent)); } if (!showConfLimits) { this.Dispatcher.BeginInvoke(new SimpleCallback(HideConfidenceIntervals)); } Field field = null; string columnType = string.Empty; foreach (DataRow fieldRow in dashboardHelper.FieldTable.Rows) { if (fieldRow["columnname"].Equals(freqVar)) { columnType = fieldRow["datatype"].ToString(); if (fieldRow["epifieldtype"] is Field) { field = fieldRow["epifieldtype"] as Field; } break; } } this.Dispatcher.BeginInvoke(renderHeader, strataValue, tableHeading); double AccumulatedTotal = 0; List<ConfLimit> confLimits = new List<ConfLimit>(); int rowCount = 1; foreach (System.Data.DataRow row in frequencies.Rows) { if (!row[freqVar].Equals(DBNull.Value) || (row[freqVar].Equals(DBNull.Value) && includeMissing == true)) { this.Dispatcher.Invoke(addRow, strataValue, 26); string displayValue = row[freqVar].ToString(); if (dashboardHelper.IsUserDefinedColumn(freqVar)) { displayValue = dashboardHelper.GetFormattedOutput(freqVar, row[freqVar]); } else { if (field != null && field is YesNoField) { if (row[freqVar].ToString().Equals("1")) displayValue = yesValue; else if (row[freqVar].ToString().Equals("0")) displayValue = noValue; } else if ((field != null && field is DateField) || (!dashboardHelper.DateColumnRequiresTime(frequencies, frequencies.Columns[0].ColumnName))) { displayValue = string.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:d}", row[freqVar]); } else if (field != null && field is TimeField) { displayValue = string.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:T}", row[freqVar]); } else { displayValue = dashboardHelper.GetFormattedOutput(freqVar, row[freqVar]); } } if (string.IsNullOrEmpty(displayValue)) { displayValue = config.Settings.RepresentationOfMissing; } double pct = 0; if (count > 0) pct = Convert.ToDouble(row["freq"]) / (count * 1.0); AccumulatedTotal += pct; if (count > 0) confLimits.Add(GetConfLimit(displayValue, Convert.ToDouble(row["freq"]), count)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(displayValue, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Left, rowCount, 0, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(row["freq"].ToString(), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 1, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(pct.ToString("P"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 2, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(AccumulatedTotal.ToString("P"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 3, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(confLimits[rowCount - 1].Lower.ToString("P"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 4, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(confLimits[rowCount - 1].Upper.ToString("P"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 5, Visibility.Visible)); this.Dispatcher.BeginInvoke(setBar, strataValue, rowCount, pct); rowCount++; } } this.Dispatcher.BeginInvoke(new AddGridFooterDelegate(RenderFrequencyFooter), strataValue, rowCount, (int)count); this.Dispatcher.BeginInvoke(drawBorders, strataValue); } stratifiedFrequencyTables.Clear(); } this.Dispatcher.BeginInvoke(new SimpleCallback(RenderFinish)); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } catch (Exception ex) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), ex.Message); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } finally { stopwatch.Stop(); Debug.Print("Frequency gadget took " + stopwatch.Elapsed.ToString() + " seconds to complete with " + dashboardHelper.RecordCount.ToString() + " records and the following filters:"); Debug.Print(dashboardHelper.DataFilters.GenerateDataFilterString()); } } }
/// <summary> /// Handles the DoWorker event for the worker /// </summary> /// <param name="sender">Object that fired the event</param> /// <param name="e">.NET supplied event parameters</param> protected override void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { lock (syncLock) { Dictionary<string, string> inputVariableList = ((GadgetParameters)e.Argument).InputVariableList; Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToProcessingState)); this.Dispatcher.BeginInvoke(new SimpleCallback(ClearResults)); AddOutputGridDelegate addGrid = new AddOutputGridDelegate(AddLineListGrid); SetGridTextDelegate setText = new SetGridTextDelegate(SetGridText); SetGridImageDelegate setImage = new SetGridImageDelegate(SetGridImage); AddGridRowDelegate addRow = new AddGridRowDelegate(AddGridRow); RenderFrequencyHeaderDelegate renderHeader = new RenderFrequencyHeaderDelegate(RenderFrequencyHeader); DrawFrequencyBordersDelegate drawBorders = new DrawFrequencyBordersDelegate(DrawFrequencyBorders); Configuration config = DashboardHelper.Config; string yesValue = config.Settings.RepresentationOfYes; string noValue = config.Settings.RepresentationOfNo; string groupVar = string.Empty; int maxRows = 50; bool exceededMaxRows = false; bool exceededMaxColumns = false; bool showLineColumn = true; bool showColumnHeadings = true; bool showNullLabels = true; if (GadgetOptions.StrataVariableNames.Count > 0) { groupVar = GadgetOptions.StrataVariableNames[0]; } if (inputVariableList.ContainsKey("maxcolumns")) { maxColumns = int.Parse(inputVariableList["maxcolumns"]); } if (inputVariableList.ContainsKey("maxrows")) { maxRows = int.Parse(inputVariableList["maxrows"]); } if (inputVariableList.ContainsKey("showcolumnheadings")) { showColumnHeadings = bool.Parse(inputVariableList["showcolumnheadings"]); } if (inputVariableList.ContainsKey("showlinecolumn")) { showLineColumn = bool.Parse(inputVariableList["showlinecolumn"]); } if (inputVariableList.ContainsKey("shownulllabels")) { showNullLabels = bool.Parse(inputVariableList["shownulllabels"]); } //System.Threading.Thread.Sleep(4000); // Artifically inflating process time to see how the 'loading' screen looks. TODO: REMOVE LATER if (IsHostedByEnter) { if (System.Windows.SystemParameters.IsSlowMachine == true) { maxColumns = 512; } else { maxColumns = 1024; } } else { int renderingTier = (RenderCapability.Tier >> 16); if (renderingTier >= 2) { maxColumns = 128; } else if (renderingTier >= 1) { maxColumns = 64; } else { maxColumns = 24; } if (System.Windows.SystemParameters.IsSlowMachine == true) { maxColumns = 24; } } List<string> stratas = new List<string>(); if (!string.IsNullOrEmpty(groupVar)) { stratas.Add(groupVar); } try { GadgetOptions.GadgetStatusUpdate += new GadgetStatusUpdateHandler(requestUpdateStatus); GadgetOptions.GadgetCheckForCancellation += new GadgetCheckForCancellationHandler(checkForCancellation); if (this.DataFilters != null) { GadgetOptions.CustomFilter = this.DataFilters.GenerateDataFilterString(false); } else { GadgetOptions.CustomFilter = string.Empty; } List<DataTable> lineListTables = DashboardHelper.GenerateLineList(GadgetOptions); if (lineListTables == null || lineListTables.Count == 0) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.NO_RECORDS_SELECTED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); Debug.Print("Line list thread cancelled"); return; } else if (lineListTables.Count == 1 && lineListTables[0].Rows.Count == 0) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.NO_RECORDS_SELECTED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); Debug.Print("Line list thread cancelled"); return; } else if (worker.CancellationPending) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.DASHBOARD_GADGET_STATUS_OPERATION_CANCELLED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); Debug.Print("Line list thread cancelled"); return; } else { string formatString = string.Empty; foreach (DataTable listTable in lineListTables) { string strataValue = listTable.TableName; if (listTable.Rows.Count == 0) { continue; } this.Dispatcher.BeginInvoke(addGrid, groupVar, listTable.TableName, listTable.Columns.Count); } SetGadgetStatusMessage(SharedStrings.DASHBOARD_GADGET_STATUS_DISPLAYING_OUTPUT); foreach (DataTable listTable in lineListTables) { string strataValue = listTable.TableName; if (listTable.Rows.Count == 0) { continue; } string tableHeading = listTable.TableName; if (lineListTables.Count > 1) { //tableHeading = freqVar; ??? } SetCustomColumnSort(listTable); this.Dispatcher.BeginInvoke(renderHeader, strataValue, tableHeading, listTable.Columns); rowCount = 1; if (listTable.Columns.Count == 0) { throw new ApplicationException("There are no columns to display in this list. If specifying a group variable, ensure the group variable contains data fields."); } int[] totals = new int[listTable.Columns.Count - 1]; columnCount = 1; foreach (System.Data.DataRow row in listTable.Rows) { this.Dispatcher.Invoke(addRow, strataValue, -1); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(rowCount.ToString(), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Stretch, TextAlignment.Center, rowCount, 0, Visibility.Visible), FontWeights.Normal); columnCount = 1; foreach (DataColumn column in listTable.Columns) { if (columnCount > maxColumns + 1) { exceededMaxColumns = true; break; } string displayValue = row[column.ColumnName].ToString(); if (DashboardHelper.IsUserDefinedColumn(column.ColumnName)) { displayValue = DashboardHelper.GetFormattedOutput(column.ColumnName, row[column.ColumnName]); } else { Field field = null; string columnType = string.Empty; foreach (DataRow fieldRow in DashboardHelper.FieldTable.Rows) { if (fieldRow["columnname"].Equals(column.ColumnName)) { columnType = fieldRow["datatype"].ToString(); if (fieldRow["epifieldtype"] is Field) { field = fieldRow["epifieldtype"] as Field; } break; } } if ((field != null && (field is YesNoField || field is CheckBoxField)) || column.DataType.ToString().Equals("System.Boolean")) { if (row[column.ColumnName].ToString().Equals("1") || row[column.ColumnName].ToString().ToLower().Equals("true")) displayValue = yesValue; else if (row[column.ColumnName].ToString().Equals("0") || row[column.ColumnName].ToString().ToLower().Equals("false")) displayValue = noValue; } else if ((field != null && field is DateField) || (!DashboardHelper.DateColumnRequiresTime(listTable, listTable.Columns[column.ColumnName].ColumnName))) { displayValue = string.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:d}", row[column.ColumnName]); } else if (field != null && field is TimeField) { displayValue = string.Format(System.Globalization.CultureInfo.CurrentCulture, "{0:T}", row[column.ColumnName]); } else { displayValue = DashboardHelper.GetFormattedOutput(column.ColumnName, row[column.ColumnName]); } } if (string.IsNullOrEmpty(displayValue)) { if (showNullLabels) { displayValue = config.Settings.RepresentationOfMissing; } else { displayValue = string.Empty; } } if (column.DataType.ToString().Equals("System.DateTime") || column.DataType.ToString().Equals("System.Int32") || column.DataType.ToString().Equals("System.Double") || column.DataType.ToString().Equals("System.Single")) { if (column.ColumnName.Equals("UniqueKey")) { this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(displayValue, new Thickness(8, 6, 8, 6), VerticalAlignment.Stretch, HorizontalAlignment.Stretch, TextAlignment.Right, rowCount, columnCount, Visibility.Collapsed), FontWeights.Normal); } else { this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(displayValue, new Thickness(8, 6, 8, 6), VerticalAlignment.Stretch, HorizontalAlignment.Stretch, TextAlignment.Right, rowCount, columnCount, Visibility.Visible), FontWeights.Normal); } } else if (column.DataType == typeof(byte[]) && displayValue != config.Settings.RepresentationOfMissing && IsHostedByEnter) { this.Dispatcher.BeginInvoke(setImage, strataValue, (byte[])row[column.ColumnName], new TextBlockConfig(displayValue, new Thickness(8, 6, 8, 6), VerticalAlignment.Stretch, HorizontalAlignment.Stretch, TextAlignment.Left, rowCount, columnCount, Visibility.Visible), FontWeights.Normal); } else { this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(displayValue, new Thickness(8, 6, 8, 6), VerticalAlignment.Stretch, HorizontalAlignment.Stretch, TextAlignment.Left, rowCount, columnCount, Visibility.Visible), FontWeights.Normal); } columnCount++; } rowCount++; if (rowCount > maxRows) { break; } } this.Dispatcher.BeginInvoke(drawBorders, strataValue); if (rowCount > maxRows) { exceededMaxRows = true; } } for(int i = 0; i < lineListTables.Count; i++) { lineListTables[i].Dispose(); } lineListTables.Clear(); } if (exceededMaxRows && exceededMaxColumns) { this.Dispatcher.BeginInvoke(new RenderFinishWithWarningDelegate(RenderFinishWithWarning), "Warning: Some rows and columns were not displayed due to gadget settings. Showing top " + maxRows.ToString() + " rows and top " + maxColumns.ToString() + " columns only."); } else if (exceededMaxColumns) { this.Dispatcher.BeginInvoke(new RenderFinishWithWarningDelegate(RenderFinishWithWarning), "Warning: Some columns were not displayed due to gadget settings. Showing top " + maxColumns.ToString() + " columns only."); } else if (exceededMaxRows) { this.Dispatcher.BeginInvoke(new RenderFinishWithWarningDelegate(RenderFinishWithWarning), string.Format(SharedStrings.DASHBOARD_GADGET_STATUS_ROW_LIMIT, maxRows.ToString())); } else { this.Dispatcher.BeginInvoke(new SimpleCallback(RenderFinish)); } // Now called after drawing all the borders. // this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } catch (Exception ex) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), ex.Message); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } finally { stopwatch.Stop(); Debug.Print("Line list gadget took " + stopwatch.Elapsed.ToString() + " seconds to complete with " + DashboardHelper.RecordCount.ToString() + " records and the following filters:"); Debug.Print(DashboardHelper.DataFilters.GenerateDataFilterString()); } } }
protected override void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { Configuration config = dashboardHelper.Config; Dictionary<string, string> setProperties = new Dictionary<string, string>(); setProperties.Add("BLabels", config.Settings.RepresentationOfYes + ";" + config.Settings.RepresentationOfNo + ";" + config.Settings.RepresentationOfMissing); // TODO: Replace Yes, No, Missing with global vars bool includeMissing = true; Dictionary<string, string> inputVariableList = GadgetOptions.InputVariableList; lock (syncLock) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToProcessingState)); this.Dispatcher.BeginInvoke(new SimpleCallback(ClearResults)); SetGridTextDelegate setText = new SetGridTextDelegate(SetGridText); AddGridRowDelegate addRow = new AddGridRowDelegate(AddGridRow); System.Collections.Generic.Dictionary<string, System.Data.DataTable> Freq_ListSet = new Dictionary<string, System.Data.DataTable>(); string customFilter = string.Empty; List<string> columnNames = new List<string>(); foreach (KeyValuePair<string, string> kvp in inputVariableList) { if (kvp.Key.ToLower().Equals("includemissing")) { includeMissing = bool.Parse(kvp.Value); } } foreach (KeyValuePair<string, string> kvp in inputVariableList) { if (kvp.Value.ToLower().Equals("unsorted") || kvp.Value.ToLower().Equals("dependvar") || kvp.Value.ToLower().Equals("weightvar") || kvp.Value.ToLower().Equals("matchvar")) { columnNames.Add(kvp.Key); if (!kvp.Value.ToLower().Equals("dependvar")) { customFilter = customFilter + StringLiterals.PARANTHESES_OPEN + StringLiterals.LEFT_SQUARE_BRACKET + kvp.Key + StringLiterals.RIGHT_SQUARE_BRACKET + StringLiterals.SPACE + "is not null" + StringLiterals.PARANTHESES_CLOSE + " AND "; } } else if (kvp.Value.ToLower().Equals("discrete")) { columnNames.Add(kvp.Key); customFilter = customFilter + StringLiterals.PARANTHESES_OPEN + StringLiterals.LEFT_SQUARE_BRACKET + kvp.Key + StringLiterals.RIGHT_SQUARE_BRACKET + StringLiterals.SPACE + "is not null" + StringLiterals.PARANTHESES_CLOSE + " AND "; } } if (includeMissing) { customFilter = string.Empty; } else { customFilter = customFilter.Remove(customFilter.Length - 4, 4); } try { lock (staticSyncLock) { DataTable regressTable = dashboardHelper.GenerateTable(columnNames, customFilter); RegressionResults results = new RegressionResults(); if (regressTable == null || regressTable.Rows.Count <= 0) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.NO_RECORDS_SELECTED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); Debug.Print("Thread stopped due to errors."); return; } else if (worker.CancellationPending) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.DASHBOARD_GADGET_STATUS_OPERATION_CANCELLED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); Debug.Print("Thread cancelled"); return; } else { StatisticsRepository.LogisticRegression logisticRegression = new StatisticsRepository.LogisticRegression(); results.regressionResults = logisticRegression.LogisticRegression(inputVariableList, regressTable); results.casesIncluded = results.regressionResults.casesIncluded; results.convergence = results.regressionResults.convergence; results.finalLikelihood = results.regressionResults.finalLikelihood; results.iterations = results.regressionResults.iterations; results.LRDF = results.regressionResults.LRDF; results.LRP = results.regressionResults.LRP; results.LRStatistic = results.regressionResults.LRStatistic; results.scoreDF = results.regressionResults.scoreDF; results.scoreP = results.regressionResults.scoreP; results.scoreStatistic = results.regressionResults.scoreStatistic; results.errorMessage = results.regressionResults.errorMessage.Replace("<tlt>", string.Empty).Replace("</tlt>", string.Empty); results.variables = new List<VariableRow>(); if (!string.IsNullOrEmpty(results.errorMessage)) { throw new ApplicationException(results.errorMessage); } if (results.regressionResults.variables != null) { foreach (StatisticsRepository.LogisticRegression.VariableRow vrow in results.regressionResults.variables) { VariableRow nrow = new VariableRow(); nrow.coefficient = vrow.coefficient; nrow.ci = vrow.ci; nrow.P = vrow.P; nrow.ninetyFivePercent = vrow.ninetyFivePercent; nrow.oddsRatio = vrow.oddsRatio; nrow.se = vrow.se; nrow.variableName = vrow.variableName; nrow.Z = vrow.Z; results.variables.Add(nrow); } this.Dispatcher.BeginInvoke(new SimpleCallback(RenderRegressionHeader)); int rowCount = 1; foreach (VariableRow row in results.variables) { this.Dispatcher.Invoke(addRow, grdRegress, 30); string displayValue = row.variableName; this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(displayValue, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Left, rowCount, 0, Visibility.Visible)); if (row.oddsRatio <= -9999) { this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig("*", new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 1, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig("*", new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 2, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig("*", new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 3, Visibility.Visible)); } else { this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.oddsRatio.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 1, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.ninetyFivePercent.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 2, Visibility.Visible)); if (row.ci > 1.0E12) { this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(">1.0E12", new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 3, Visibility.Visible)); } else { this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.ci.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 3, Visibility.Visible)); } } this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.coefficient.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 4, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.se.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 5, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.Z.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 6, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(row.P.ToString("F4"), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 7, Visibility.Visible)); rowCount++; } if (results.regressionResults.interactionOddsRatios != null) { this.Dispatcher.BeginInvoke(new SimpleCallback(RenderIORHeader)); rowCount = 1; foreach (StatisticsRepository.LogisticRegression.InteractionRow ir in results.regressionResults.interactionOddsRatios) { this.Dispatcher.Invoke(addRow, grdIOR, 30); this.Dispatcher.BeginInvoke(setText, grdIOR, new TextBlockConfig(ir.interactionName.ToString(), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Right, rowCount, 0, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdIOR, new TextBlockConfig(ir.oddsRatio.ToString(), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Right, rowCount, 1, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdIOR, new TextBlockConfig(ir.ninetyFivePercent.ToString(), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Right, rowCount, 2, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdIOR, new TextBlockConfig(ir.ci.ToString(), new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Right, rowCount, 3, Visibility.Visible)); rowCount++; } } this.Dispatcher.BeginInvoke(new SimpleCallback(DrawRegressionBorders)); } } this.Dispatcher.BeginInvoke(new RenderGridDelegate(RenderRegressionResults), results); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } } catch (Exception ex) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), ex.Message); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } finally { stopwatch.Stop(); Debug.Print("Logistic regression gadget took " + stopwatch.Elapsed.ToString() + " seconds to complete with " + dashboardHelper.RecordCount.ToString() + " records and the following filters:"); Debug.Print(dashboardHelper.DataFilters.GenerateDataFilterString()); //gridCells.singleTableResults = new StatisticsRepository.cTable().SigTable((double)gridCells.yyVal, (double)gridCells.ynVal, (double)gridCells.nyVal, (double)gridCells.nnVal, 0.95); } } }
protected override void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { //Stopwatch stopwatch = new Stopwatch(); //stopwatch.Start(); Dictionary <string, string> inputVariableList = GadgetOptions.InputVariableList; lock (syncLock) { this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToProcessingState)); this.Dispatcher.BeginInvoke(new SimpleCallback(ClearResults)); AddFreqGridDelegate addGrid = new AddFreqGridDelegate(AddFreqGrid); SetGridTextDelegate setText = new SetGridTextDelegate(SetGridText); AddGridRowDelegate addRow = new AddGridRowDelegate(AddGridRow); RenderFrequencyHeaderDelegate renderHeader = new RenderFrequencyHeaderDelegate(RenderFrequencyHeader); DrawFrequencyBordersDelegate drawBorders = new DrawFrequencyBordersDelegate(DrawOutputGridBorders); System.Collections.Generic.Dictionary <string, System.Data.DataTable> Freq_ListSet = new Dictionary <string, System.Data.DataTable>(); string freqVar = GadgetOptions.MainVariableName; string weightVar = GadgetOptions.WeightVariableName; string strataVar = string.Empty; if (GadgetOptions.StrataVariableNames != null && GadgetOptions.StrataVariableNames.Count > 0) { strataVar = GadgetOptions.StrataVariableNames[0]; } try { List <string> stratas = new List <string>(); if (!string.IsNullOrEmpty(strataVar)) { stratas.Add(strataVar); } DataTable dt = new DataTable(); bool booleanResults = false; int fields = -1; if (dashboardHelper.GetAllGroupsAsList().Contains(freqVar)) { dt = dashboardHelper.GenerateCombinedFrequencyTable(GadgetOptions, ref booleanResults); fields = dashboardHelper.GetVariablesInGroup(freqVar).Count; } else { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), "Something that should never fail has failed."); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); return; } if (dt == null || dt.Rows.Count == 0) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.NO_RECORDS_SELECTED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); return; } else if (worker.CancellationPending) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.DASHBOARD_GADGET_STATUS_OPERATION_CANCELLED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); Debug.Print("Combined frequency thread cancelled"); return; } else { string formatString = string.Empty; double count = Convert.ToDouble(dt.Compute("sum([count])", string.Empty)); //0; this.Dispatcher.BeginInvoke(addGrid, strataVar, string.Empty); string strataValue = dt.TableName; this.Dispatcher.BeginInvoke(renderHeader, strataValue, freqVar); //double AccumulatedTotal = 0; int rowCount = 1; int denominator = dashboardHelper.RecordCount; if (!booleanResults) { denominator = denominator * fields; } foreach (System.Data.DataRow row in dt.Rows) { if (!row["value"].Equals(DBNull.Value)) { this.Dispatcher.Invoke(addRow, strataValue, 26); string displayValue = row["value"].ToString(); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(displayValue, new Thickness(6, 0, 6, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Left, rowCount, 0, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(row["count"].ToString(), new Thickness(6, 0, 6, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 1, Visibility.Visible)); double pct = 0; if (count > 0) { pct = Convert.ToDouble(row["count"]) / (double)denominator; } //AccumulatedTotal += pct; this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(pct.ToString("P"), new Thickness(6, 0, 6, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 2, Visibility.Visible)); rowCount++; } } this.Dispatcher.BeginInvoke(new AddGridFooterDelegate(RenderFrequencyFooter), strataValue, denominator, fields, booleanResults); this.Dispatcher.BeginInvoke(drawBorders, strataValue); this.Dispatcher.BeginInvoke(new SimpleCallback(RenderFinish)); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } } catch (Exception ex) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), ex.Message); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } finally { //stopwatch.Stop(); //Debug.Print("Combined Frequency gadget took " + stopwatch.Elapsed.ToString() + " seconds to complete with " + dashboardHelper.RecordCount.ToString() + " records and the following filters:"); //Debug.Print(dashboardHelper.DataFilters.GenerateDataFilterString()); } } }
protected override void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { lock (syncLock) { Configuration config = DashboardHelper.Config; Dictionary<string, string> setProperties = new Dictionary<string, string>(); setProperties.Add("Intercept", "true"); setProperties.Add("P", 0.95.ToString()); setProperties.Add("BLabels", config.Settings.RepresentationOfYes + ";" + config.Settings.RepresentationOfNo + ";" + config.Settings.RepresentationOfMissing); // TODO: Replace Yes, No, Missing with global vars //Dictionary<string, string> inputVariableList = (Dictionary<string, string>)e.Argument; Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToProcessingState)); this.Dispatcher.BeginInvoke(new SimpleCallback(ClearResults)); SetGridTextDelegate setText = new SetGridTextDelegate(SetGridText); AddGridRowDelegate addRow = new AddGridRowDelegate(AddGridRow); //SetGridBarDelegate setBar = new SetGridBarDelegate(SetGridBar); System.Collections.Generic.Dictionary<string, System.Data.DataTable> Freq_ListSet = new Dictionary<string, System.Data.DataTable>(); //string customFilter = string.Empty; List<string> columnNames = new List<string>(); foreach (KeyValuePair<string, string> kvp in GadgetOptions.InputVariableList) { if (kvp.Value.ToLower().Equals("unsorted") || kvp.Value.ToLower().Equals("dependvar") || kvp.Value.ToLower().Equals("weightvar") || kvp.Value.ToLower().Equals("matchvar")) { columnNames.Add(kvp.Key); } else if (kvp.Value.ToLower().Equals("discrete")) { columnNames.Add(kvp.Key); } } try { lock (staticSyncLock) { RequestUpdateStatusDelegate requestUpdateStatus = new RequestUpdateStatusDelegate(RequestUpdateStatusMessage); CheckForCancellationDelegate checkForCancellation = new CheckForCancellationDelegate(IsCancelled); GadgetOptions.GadgetStatusUpdate += new GadgetStatusUpdateHandler(requestUpdateStatus); GadgetOptions.GadgetCheckForCancellation += new GadgetCheckForCancellationHandler(checkForCancellation); DataTable regressTable = DashboardHelper.GenerateTable(columnNames); RegressionResults results = new RegressionResults(); if (regressTable == null || regressTable.Rows.Count <= 0) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.NO_RECORDS_SELECTED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); Debug.Print("Thread stopped due to errors."); return; } else if (worker.CancellationPending) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.DASHBOARD_GADGET_STATUS_OPERATION_CANCELLED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); Debug.Print("Thread cancelled"); return; } else { StatisticsRepository.LinearRegression linearRegression = new StatisticsRepository.LinearRegression(); results.regressionResults = linearRegression.LinearRegression(GadgetOptions.InputVariableList, regressTable); results.correlationCoefficient = results.regressionResults.correlationCoefficient; results.regressionDf = results.regressionResults.regressionDf; results.regressionF = results.regressionResults.regressionF; results.regressionMeanSquare = results.regressionResults.regressionMeanSquare; results.regressionSumOfSquares = results.regressionResults.regressionSumOfSquares; results.residualsDf = results.regressionResults.residualsDf; results.residualsMeanSquare = results.regressionResults.residualsMeanSquare; results.residualsSumOfSquares = results.regressionResults.residualsSumOfSquares; results.totalDf = results.regressionResults.totalDf; results.totalSumOfSquares = results.regressionResults.totalSumOfSquares; results.errorMessage = results.regressionResults.errorMessage.Replace("<tlt>", string.Empty).Replace("</tlt>", string.Empty); if (!string.IsNullOrEmpty(results.errorMessage)) { throw new ApplicationException(results.errorMessage); } results.variables = new List<VariableRow>(); if (results.regressionResults.variables != null) { double tScore = 1.9; while (Epi.Statistics.SharedResources.PFromT(tScore, results.residualsDf) > 0.025) { tScore += 0.000001; } foreach (StatisticsRepository.LinearRegression.VariableRow vrow in results.regressionResults.variables) { VariableRow nrow = new VariableRow(); nrow.coefficient = vrow.coefficient; nrow.Ftest = vrow.Ftest; nrow.P = vrow.P; nrow.stdError = vrow.stdError; nrow.variableName = vrow.variableName; nrow.coefficientLower = nrow.coefficient - tScore * nrow.stdError; nrow.coefficientUpper = nrow.coefficient + tScore * nrow.stdError; results.variables.Add(nrow); } results.regressionFp = Epi.Statistics.SharedResources.PFromF(results.regressionF, results.regressionDf, results.residualsDf); this.Dispatcher.BeginInvoke(new SimpleCallback(RenderRegressionHeader)); int rowCount = 1; foreach (VariableRow row in results.variables) { this.Dispatcher.Invoke(addRow, grdRegress, 30); string displayValue = row.variableName; this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + displayValue + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Left, rowCount, 0, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + row.coefficient.ToString("F3") + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 1, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + row.coefficientLower.ToString("F3") + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 2, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + row.coefficientUpper.ToString("F3") + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 3, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + row.stdError.ToString("F3") + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 4, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + row.Ftest.ToString("F4") + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 5, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, grdRegress, new TextBlockConfig(StringLiterals.SPACE + row.P.ToString("F6") + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 6, Visibility.Visible)); rowCount++; } //this.Dispatcher.BeginInvoke(new AddGridFooterDelegate(RenderFrequencyFooter), rowCount, count); this.Dispatcher.BeginInvoke(new SimpleCallback(DrawRegressionBorders)); } } this.Dispatcher.BeginInvoke(new RenderGridDelegate(RenderRegressionResults), results); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } } catch (Exception ex) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), ex.Message); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } finally { stopwatch.Stop(); Debug.Print("Linear regression gadget took " + stopwatch.Elapsed.ToString() + " seconds to complete with " + DashboardHelper.RecordCount.ToString() + " records and the following filters:"); Debug.Print(DashboardHelper.DataFilters.GenerateDataFilterString()); } } //gridCells.singleTableResults = new StatisticsRepository.cTable().SigTable((double)gridCells.yyVal, (double)gridCells.ynVal, (double)gridCells.nyVal, (double)gridCells.nnVal, 0.95); }
protected override void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { //Stopwatch stopwatch = new Stopwatch(); //stopwatch.Start(); Dictionary<string, string> inputVariableList = GadgetOptions.InputVariableList; lock (syncLock) { this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToProcessingState)); this.Dispatcher.BeginInvoke(new SimpleCallback(ClearResults)); AddFreqGridDelegate addGrid = new AddFreqGridDelegate(AddFreqGrid); SetGridTextDelegate setText = new SetGridTextDelegate(SetGridText); AddGridRowDelegate addRow = new AddGridRowDelegate(AddGridRow); RenderFrequencyHeaderDelegate renderHeader = new RenderFrequencyHeaderDelegate(RenderFrequencyHeader); DrawFrequencyBordersDelegate drawBorders = new DrawFrequencyBordersDelegate(DrawOutputGridBorders); System.Collections.Generic.Dictionary<string, System.Data.DataTable> Freq_ListSet = new Dictionary<string, System.Data.DataTable>(); string freqVar = GadgetOptions.MainVariableName; string weightVar = GadgetOptions.WeightVariableName; string strataVar = string.Empty; if (GadgetOptions.StrataVariableNames != null && GadgetOptions.StrataVariableNames.Count > 0) { strataVar = GadgetOptions.StrataVariableNames[0]; } try { List<string> stratas = new List<string>(); if (!string.IsNullOrEmpty(strataVar)) { stratas.Add(strataVar); } DataTable dt = new DataTable(); bool booleanResults = false; int fields = -1; if (dashboardHelper.GetAllGroupsAsList().Contains(freqVar)) { dt = dashboardHelper.GenerateCombinedFrequencyTable(GadgetOptions, ref booleanResults); fields = dashboardHelper.GetVariablesInGroup(freqVar).Count; } else { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), "Something that should never fail has failed."); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); return; } if (dt == null || dt.Rows.Count == 0) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.NO_RECORDS_SELECTED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); return; } else if (worker.CancellationPending) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.DASHBOARD_GADGET_STATUS_OPERATION_CANCELLED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); Debug.Print("Combined frequency thread cancelled"); return; } else { string formatString = string.Empty; double count = Convert.ToDouble(dt.Compute("sum([count])", string.Empty)); //0; this.Dispatcher.BeginInvoke(addGrid, strataVar, string.Empty); string strataValue = dt.TableName; this.Dispatcher.BeginInvoke(renderHeader, strataValue, freqVar); //double AccumulatedTotal = 0; int rowCount = 1; int denominator = dashboardHelper.RecordCount; if (!booleanResults) { denominator = denominator * fields; } foreach (System.Data.DataRow row in dt.Rows) { if (!row["value"].Equals(DBNull.Value)) { this.Dispatcher.Invoke(addRow, strataValue, 26); string displayValue = row["value"].ToString(); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(displayValue, new Thickness(6, 0, 6, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Left, rowCount, 0, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(row["count"].ToString(), new Thickness(6, 0, 6, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 1, Visibility.Visible)); double pct = 0; if (count > 0) { pct = Convert.ToDouble(row["count"]) / (double)denominator; } //AccumulatedTotal += pct; this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(pct.ToString("P"), new Thickness(6, 0, 6, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 2, Visibility.Visible)); rowCount++; } } this.Dispatcher.BeginInvoke(new AddGridFooterDelegate(RenderFrequencyFooter), strataValue, denominator, fields, booleanResults); this.Dispatcher.BeginInvoke(drawBorders, strataValue); this.Dispatcher.BeginInvoke(new SimpleCallback(RenderFinish)); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } } catch (Exception ex) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), ex.Message); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } finally { //stopwatch.Stop(); //Debug.Print("Combined Frequency gadget took " + stopwatch.Elapsed.ToString() + " seconds to complete with " + dashboardHelper.RecordCount.ToString() + " records and the following filters:"); //Debug.Print(dashboardHelper.DataFilters.GenerateDataFilterString()); } } }
/// <summary> /// Handles the DoWorker event for the worker /// </summary> /// <param name="sender">Object that fired the event</param> /// <param name="e">.NET supplied event parameters</param> protected override void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { lock (syncLock) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToProcessingState)); this.Dispatcher.BeginInvoke(new SimpleCallback(ClearResults)); AddAnovaDelegate addAnova = new AddAnovaDelegate(AddAnova); AddMeansGridDelegate addGrid = new AddMeansGridDelegate(AddMeansGrid); SetGridTextDelegate setText = new SetGridTextDelegate(SetGridText); AddGridRowDelegate addRow = new AddGridRowDelegate(AddGridRow); RenderMeansHeaderDelegate renderHeader = new RenderMeansHeaderDelegate(RenderMeansHeader); DrawMeansBordersDelegate drawBorders = new DrawMeansBordersDelegate(DrawOutputGridBorders); GadgetOptions.ShouldIgnoreRowLimits = true; GadgetOptions.ShouldIncludeFullSummaryStatistics = true; string precisionFormat = "F4"; if (GadgetOptions.InputVariableList.ContainsKey("precision")) { precisionFormat = GadgetOptions.InputVariableList["precision"]; precisionFormat = "F" + precisionFormat; } string meansVar = GadgetOptions.MainVariableName; string weightVar = GadgetOptions.WeightVariableName; string strataVar = string.Empty; bool hasData = false; if (GadgetOptions.StrataVariableNames != null && GadgetOptions.StrataVariableNames.Count > 0) { strataVar = GadgetOptions.StrataVariableNames[0]; } bool showAnova = true; if (GadgetOptions.InputVariableList.ContainsKey("showanova")) { bool.TryParse(GadgetOptions.InputVariableList["showanova"], out showAnova); } string crosstabVar = GadgetOptions.CrosstabVariableName; if (string.IsNullOrEmpty(crosstabVar)) { GadgetOptions.InputVariableList.Add("NeedsOutputGrid", "false"); } else { GadgetOptions.InputVariableList.Add("NeedsOutputGrid", "true"); } List<string> stratas = new List<string>(); if (!string.IsNullOrEmpty(strataVar)) { stratas.Add(strataVar); } try { RequestUpdateStatusDelegate requestUpdateStatus = new RequestUpdateStatusDelegate(RequestUpdateStatusMessage); CheckForCancellationDelegate checkForCancellation = new CheckForCancellationDelegate(IsCancelled); GadgetOptions.GadgetStatusUpdate += new GadgetStatusUpdateHandler(requestUpdateStatus); GadgetOptions.GadgetCheckForCancellation += new GadgetCheckForCancellationHandler(checkForCancellation); if (this.DataFilters != null && this.DataFilters.Count > 0) { GadgetOptions.CustomFilter = this.DataFilters.GenerateDataFilterString(false); } else { GadgetOptions.CustomFilter = string.Empty; } Dictionary<DataTable, List<DescriptiveStatistics>> stratifiedFrequencyTables = DashboardHelper.GenerateFrequencyTable(GadgetOptions); if (stratifiedFrequencyTables == null || stratifiedFrequencyTables.Count == 0) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), DashboardSharedStrings.GADGET_MSG_NO_DATA); //this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); return; } else if (worker.CancellationPending) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.DASHBOARD_GADGET_STATUS_OPERATION_CANCELLED); //this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); Debug.Print("Thread cancelled"); return; } else { //bool useSpecialFormatting = false; string formatString = string.Empty; StrataCount = stratifiedFrequencyTables.Count; foreach (KeyValuePair<DataTable, List<DescriptiveStatistics>> tableKvp in stratifiedFrequencyTables) { string strataValue = tableKvp.Key.TableName; double count = 0; foreach (DescriptiveStatistics ds in tableKvp.Value) { count = count + ds.observations; } if (count == 0) { continue; } DataTable frequencies = tableKvp.Key; //dashboardHelper.GenerateFrequencyTable(freqVar, weightVar, out count); if (frequencies.Rows.Count == 0) { continue; } this.Dispatcher.BeginInvoke(addGrid, strataVar, frequencies.TableName); if (showAnova && tableKvp.Value[0].anovaPValue.HasValue) { this.Dispatcher.BeginInvoke(addAnova, strataValue, tableKvp.Value[0]); } } //if (GadgetStatusUpdate != null) //{ // this.Dispatcher.BeginInvoke(GadgetStatusUpdate, SharedStrings.DASHBOARD_GADGET_STATUS_DISPLAYING_OUTPUT); // System.Threading.Thread.Sleep(50); // necessary to prevent this message from overriding the 'no records selected' //} foreach (KeyValuePair<DataTable, List<DescriptiveStatistics>> tableKvp in stratifiedFrequencyTables) { string strataValue = tableKvp.Key.TableName; double count = 0; foreach (DescriptiveStatistics ds in tableKvp.Value) { count = count + ds.observations; } if (count == 0) { continue; } else { hasData = true; } DataTable frequencies = tableKvp.Key; //dashboardHelper.GenerateFrequencyTable(freqVar, weightVar, out count); if (frequencies.Rows.Count == 0) { continue; } string tableHeading = tableKvp.Key.TableName; if (!string.IsNullOrEmpty(crosstabVar)) { tableHeading = meansVar + " * " + crosstabVar;// +": " + frequencies.TableName; } this.Dispatcher.BeginInvoke(renderHeader, strataValue, tableHeading, crosstabVar); int rowCount = 1; foreach (System.Data.DataColumn column in frequencies.Columns) { if (worker.CancellationPending) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.DASHBOARD_GADGET_STATUS_OPERATION_CANCELLED); //this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); Debug.Print("Thread cancelled"); return; } string columnName = column.ColumnName; if (columnName.Equals("___sortvalue___")) { continue; } DescriptiveStatistics means = tableKvp.Value[rowCount - 1]; if (!columnName.ToLower().Equals(meansVar.ToLower())) { this.Dispatcher.Invoke(addRow, strataValue, 30); string displayValue = meansVar; if (tableKvp.Value.Count > 1) { displayValue = columnName; } string statsObs = means.observations.ToString(precisionFormat); string statsSum = Epi.SharedStrings.UNDEFINED; string statsMean = Epi.SharedStrings.UNDEFINED; string statsVar = Epi.SharedStrings.UNDEFINED; string statsStdDev = Epi.SharedStrings.UNDEFINED; string statsMin = Epi.SharedStrings.UNDEFINED; string statsMax = Epi.SharedStrings.UNDEFINED; string statsMedian = Epi.SharedStrings.UNDEFINED; string statsMode = Epi.SharedStrings.UNDEFINED; string statsQ1 = Epi.SharedStrings.UNDEFINED; string statsQ3 = Epi.SharedStrings.UNDEFINED; if (means.sum != null) statsSum = ((double)means.sum).ToString(precisionFormat); if (means.mean != null) statsMean = ((double)means.mean).ToString(precisionFormat); if (means.variance != null) statsVar = ((double)means.variance).ToString(precisionFormat); if (means.stdDev != null) statsStdDev = ((double)means.stdDev).ToString(precisionFormat); if (means.min != null) statsMin = ((double)means.min).ToString(precisionFormat); if (means.q1 != null) statsQ1 = ((double)means.q1).ToString(precisionFormat); if (means.median != null) statsMedian = ((double)means.median).ToString(precisionFormat); if (means.q3 != null) statsQ3 = ((double)means.q3).ToString(precisionFormat); if (means.max != null) statsMax = ((double)means.max).ToString(precisionFormat); if (means.mode != null) statsMode = ((double)means.mode).ToString(precisionFormat); if (statsObs.EndsWith("0") && (statsObs.Contains(".") || statsObs.Contains(","))) { statsObs = statsObs.TrimEnd('0').TrimEnd('.').TrimEnd(','); } if (statsSum.EndsWith("0") && (statsSum.Contains(".") || statsSum.Contains(","))) { statsSum = statsSum.TrimEnd('0').TrimEnd('.').TrimEnd(','); } this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(displayValue, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Left, TextAlignment.Left, rowCount, 0, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(statsObs, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 1, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(statsSum, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 2, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(statsMean, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 3, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(statsVar, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 4, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(statsStdDev, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 5, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(statsMin, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 6, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(statsQ1, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 7, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(statsMedian, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 8, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(statsQ3, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 9, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(statsMax, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 10, Visibility.Visible)); this.Dispatcher.BeginInvoke(setText, strataValue, new TextBlockConfig(statsMode, new Thickness(4, 0, 4, 0), VerticalAlignment.Center, HorizontalAlignment.Right, TextAlignment.Right, rowCount, 11, Visibility.Visible)); rowCount++; } } this.Dispatcher.BeginInvoke(drawBorders, strataValue); } } if (!hasData) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), DashboardSharedStrings.GADGET_MSG_NO_DATA); } else { this.Dispatcher.BeginInvoke(new SimpleCallback(RenderFinish)); } //this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } catch (Exception ex) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), ex.Message); //this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } stopwatch.Stop(); Debug.Print("Means gadget took " + stopwatch.Elapsed.ToString() + " seconds to complete with " + DashboardHelper.RecordCount.ToString() + " records and the following filters:"); Debug.Print(DashboardHelper.DataFilters.GenerateDataFilterString()); } }
/// <summary> /// Handles the DoWorker event for the worker /// </summary> /// <param name="sender">Object that fired the event</param> /// <param name="e">.NET supplied event parameters</param> private void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { lock (syncLock) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToProcessingState)); this.Dispatcher.BeginInvoke(new SimpleCallback(ClearResults)); AddLineListGridDelegate addGrid = new AddLineListGridDelegate(AddLineListGrid); SetGridTextDelegate setText = new SetGridTextDelegate(SetGridText); SetGridImageDelegate setImage = new SetGridImageDelegate(SetGridImage); AddGridRowDelegate addRow = new AddGridRowDelegate(AddGridRow); RenderFrequencyHeaderDelegate renderHeader = new RenderFrequencyHeaderDelegate(RenderFrequencyHeader); DrawFrequencyBordersDelegate drawBorders = new DrawFrequencyBordersDelegate(DrawFrequencyBorders); Configuration config = dashboardHelper.Config; string yesValue = config.Settings.RepresentationOfYes; string noValue = config.Settings.RepresentationOfNo; try { DataTable dictionaryTable = dashboardHelper.FieldTable.Copy(); foreach (KeyValuePair<string, string> kvp in dashboardHelper.TableColumnNames) { DataRow row = dictionaryTable.Rows.Find(kvp.Key); if(row == null) { dictionaryTable.Rows.Add(kvp.Key, kvp.Value); } } if (dashboardHelper.IsUsingEpiProject) { dictionaryTable.Columns.Add("Page", typeof(int)); dictionaryTable.Columns.Add("Tab", typeof(int)); dictionaryTable.Columns.Add("Prompt", typeof(string)); dictionaryTable.Columns.Add("Items", typeof(string)); foreach (DataRow fieldRow in dictionaryTable.Rows) { if (fieldRow["epifieldtype"] is RenderableField) { RenderableField renderableField = fieldRow["epifieldtype"] as RenderableField; fieldRow["Page"] = renderableField.Page.Position + 1; fieldRow["Tab"] = renderableField.TabIndex; fieldRow["Prompt"] = renderableField.PromptText; if (renderableField is GroupField) { GroupField groupField = renderableField as GroupField; fieldRow["Items"] = groupField.ChildFieldNames; } else if (renderableField is OptionField) { OptionField optionField = renderableField as OptionField; fieldRow["Items"] = optionField.GetOptionsString(); } } } dictionaryTable.Columns["columnname"].SetOrdinal(0); dictionaryTable.Columns["Prompt"].SetOrdinal(1); dictionaryTable.Columns["formname"].SetOrdinal(2); dictionaryTable.Columns["Page"].SetOrdinal(3); dictionaryTable.Columns["Tab"].SetOrdinal(4); dictionaryTable.Columns["datatype"].SetOrdinal(5); dictionaryTable.Columns["epifieldtype"].SetOrdinal(6); dictionaryTable.Columns["tablename"].SetOrdinal(7); dictionaryTable.Columns["Items"].SetOrdinal(8); } if (dictionaryTable == null || dictionaryTable.Rows.Count == 0) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), "There are no valid fields to display."); } else if (worker.CancellationPending) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), SharedStrings.DASHBOARD_GADGET_STATUS_OPERATION_CANCELLED); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); Debug.Print("Data dictionary thread cancelled"); return; } else { this.Dispatcher.BeginInvoke(addGrid, "", "", dictionaryTable.Columns.Count); string formatString = string.Empty; this.Dispatcher.BeginInvoke(renderHeader, "", "", dictionaryTable.Columns); int rowCount = 1; int columnCount = 1; foreach (System.Data.DataRow row in dictionaryTable.Rows) { bool isGroup = false; this.Dispatcher.Invoke(addRow, "", 30); this.Dispatcher.BeginInvoke(setText, "", new TextBlockConfig(StringLiterals.SPACE + rowCount.ToString() + StringLiterals.SPACE, new Thickness(2, 0, 2, 0), VerticalAlignment.Center, HorizontalAlignment.Center, rowCount, 0, Visibility.Visible), FontWeights.Normal); columnCount = 1; foreach (DataColumn column in dictionaryTable.Columns) { string displayValue = row[column.ColumnName].ToString(); if (column.ColumnName.Equals("epifieldtype")) { displayValue = displayValue.Replace("Epi.Fields.", ""); if (isGroup) { displayValue = "GroupField"; } } else if (column.ColumnName.Equals("columnname")) { isGroup = dashboardHelper.GetGroupFieldsAsList().Contains(displayValue); } this.Dispatcher.BeginInvoke(setText, "", new TextBlockConfig(displayValue, new Thickness(8, 8, 8, 8), VerticalAlignment.Center, HorizontalAlignment.Left, rowCount, columnCount, Visibility.Visible), FontWeights.Normal); columnCount++; } rowCount++; } this.Dispatcher.BeginInvoke(drawBorders, ""); } this.Dispatcher.BeginInvoke(new SimpleCallback(RenderFinish)); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } catch (Exception ex) { this.Dispatcher.BeginInvoke(new RenderFinishWithErrorDelegate(RenderFinishWithError), ex.Message); this.Dispatcher.BeginInvoke(new SimpleCallback(SetGadgetToFinishedState)); } finally { stopwatch.Stop(); Debug.Print("Data dictionary gadget took " + stopwatch.Elapsed.ToString() + " seconds to complete with " + dashboardHelper.RecordCount.ToString() + " records and the following filters:"); Debug.Print(dashboardHelper.DataFilters.GenerateDataFilterString()); } } }