/// <summary>
        /// This will be called from the plot forms. thus the reason to be public
        /// </summary>
        /// <param name="mclsPCA"></param>
        public void PlotPCA(clsPCAplotPar mclsPCA)
        {
            if (mtabControlData.Controls.Count == 0)
            {
                return;
            }

            #region Hook Threading Events
            m_BackgroundWorker.DoWork += m_BackgroundWorker_GeneratePlots;
            m_BackgroundWorker.RunWorkerCompleted += m_BackgroundWorker_PCAPlotCompleted;
            #endregion

            var mfrmPCA = new frmPCAplotPar(mclsPCA);
            if (mhtDatasets.ContainsKey("Factors"))
            {
                var mclsFactors = mhtDatasets["Factors"];
                if ((mclsFactors.mDTable.Columns.Count - 1) == mclsPCA.Datasets.Count)
                    mfrmPCA.PopulateFactorComboBox = clsDataTable.DataTableRows(mclsFactors.mDTable);
                else
                    mfrmPCA.PopulateFactorComboBox = null;
            }
            else
                mfrmPCA.PopulateFactorComboBox = null;

            if (mfrmPCA.ShowDialog() == DialogResult.OK)
            {
                mclsPCApar = mfrmPCA.clsPCApar;
                var mclsRplots = new clsRplotData(mclsPCApar.Rcmd, "PCA");

                m_BackgroundWorker.RunWorkerAsync(mclsRplots);
                mfrmShowProgress.Message = "Generating PCA Plots ...";
                mfrmShowProgress.ShowDialog();
            }

            #region Unhook Threading Events
            m_BackgroundWorker.DoWork -= m_BackgroundWorker_GeneratePlots;
            m_BackgroundWorker.RunWorkerCompleted -= m_BackgroundWorker_PCAPlotCompleted;
            #endregion
        }
        private void menuItemPCAPlot_Click(object sender, EventArgs e)
        {
            var mclsSelected = (clsDatasetTreeNode)ctltreeView.SelectedNode.Tag;

            if (!ValidateNodeIsSelected(mclsSelected))
            {
                return;
            }

            if (!ValidateIsPlottable(mclsSelected, 2))
            {
                return;
            }

            mclsPCApar = new clsPCAplotPar();
            var datasetNameInR = mclsSelected.mstrRdatasetName;

            mclsPCApar.tempFile = mRTempFilePath;
            mclsPCApar.Rdataset = datasetNameInR;
            mclsPCApar.Datasets = clsDataTable.DataTableColumns(mclsSelected.mDTable, datasetNameInR);
            mclsPCApar.mstrDatasetName = mclsSelected.mstrDataText;

            PlotPCA(mclsPCApar);
        }