private static void ProcessDataCreate(IDataWithAnnotationRows mdata, Parameters param)
        {
            string name = param.GetParam <string>("Row name").Value;

            string[][] groupCol = new string[mdata.ColumnCount][];
            for (int i = 0; i < mdata.ColumnCount; i++)
            {
                string ename = mdata.ColumnNames[i];
                string value = param.GetParam <string>(ename).Value;
                groupCol[i] = value.Length > 0 ? value.Split(';') : new string[0];
            }
            mdata.AddCategoryRow(name, name, groupCol);
        }
        private static void ProcessDataCreateFromGoupNames(IDataWithAnnotationRows mdata, Parameters param,
                                                           ProcessInfo processInfo)
        {
            var name = param.GetParam <string>("Name").Value;
            ParameterWithSubParams <int> scwsp = param.GetParamWithSubParams <int>("Pattern");
            Parameters spar        = scwsp.GetSubParameters();
            string     regexString = "";
            string     replacement = "";

            switch (scwsp.Value)
            {
            case 0:
            case 1:
            case 2:
                regexString = GetSelectableRegexes()[scwsp.Value][1];
                break;

            case 3:
                regexString = spar.GetParam <string>("Regex").Value;
                break;

            case 4:
                regexString = spar.GetParam <string>("Regex").Value;
                replacement = spar.GetParam <string>("Replace with").Value;
                break;
            }
            Regex regex;

            try {
                regex = new Regex(regexString);
            } catch (ArgumentException) {
                processInfo.ErrString = "The regular expression you provided has invalid syntax.";
                return;
            }
            List <string[]> groupNames = new List <string[]>();

            foreach (string sampleName in mdata.ColumnNames)
            {
                string groupName = scwsp.Value < 4
                                        ? regex.Match(sampleName).Groups[1].Value
                                        : regex.Replace(sampleName, replacement);
                if (string.IsNullOrEmpty(groupName))
                {
                    groupName = sampleName;
                }
                groupNames.Add(new[] { groupName });
            }
            mdata.AddCategoryRow(name, "", groupNames.ToArray());
        }
        private static string ProcessDataReadFromFile(IDataWithAnnotationRows mdata, Parameters param)
        {
            Parameter <string> fp       = param.GetParam <string>("Input file");
            string             filename = fp.Value;

            string[] colNames;
            try {
                colNames = TabSep.GetColumnNames(filename, '\t');
            } catch (Exception) {
                return("Could not open file " + filename + ". It maybe open in another program.");
            }
            int nameIndex = GetNameIndex(colNames);

            if (nameIndex < 0)
            {
                return("Error: the file has to contain a column called 'Name'.");
            }
            if (colNames.Length < 2)
            {
                return("Error: the file does not contain a grouping column.");
            }
            string[] nameCol             = TabSep.GetColumn(colNames[nameIndex], filename, '\t');
            Dictionary <string, int> map = ArrayUtils.InverseMap(nameCol);

            for (int i = 0; i < colNames.Length; i++)
            {
                if (i == nameIndex)
                {
                    continue;
                }
                string     groupName = colNames[i];
                string[]   groupCol  = TabSep.GetColumn(groupName, filename, '\t');
                string[][] newCol    = new string[mdata.ColumnCount][];
                for (int j = 0; j < newCol.Length; j++)
                {
                    string colName = mdata.ColumnNames[j];
                    if (!map.ContainsKey(colName))
                    {
                        newCol[j] = new string[0];
                        continue;
                    }
                    int    ind   = map[colName];
                    string group = groupCol[ind] ?? "";
                    group = group.Trim();
                    if (string.IsNullOrEmpty(group))
                    {
                        newCol[j] = new string[0];
                    }
                    else
                    {
                        string[] w = group.Split(';');
                        Array.Sort(w);
                        for (int k = 0; k < w.Length; k++)
                        {
                            w[k] = w[k].Trim();
                        }
                        newCol[j] = w;
                    }
                }
                mdata.AddCategoryRow(groupName, groupName, newCol);
            }
            return(null);
        }
 private static void SetAnnotationRows(IDataWithAnnotationRows result, IDataWithAnnotationRows mdata1,
                                       IDataWithAnnotationRows mdata2)
 {
     result.CategoryRowNames.Clear();
     result.CategoryRowDescriptions.Clear();
     result.ClearCategoryRows();
     result.NumericRowNames.Clear();
     result.NumericRowDescriptions.Clear();
     result.NumericRows.Clear();
     string[] allCatNames = ArrayUtils.Concat(mdata1.CategoryRowNames, mdata2.CategoryRowNames);
     allCatNames             = ArrayUtils.UniqueValues(allCatNames);
     result.CategoryRowNames = new List <string>();
     string[] allCatDescriptions = new string[allCatNames.Length];
     for (int i = 0; i < allCatNames.Length; i++)
     {
         allCatDescriptions[i] = GetDescription(allCatNames[i], mdata1.CategoryRowNames, mdata2.CategoryRowNames,
                                                mdata1.CategoryRowDescriptions, mdata2.CategoryRowDescriptions);
     }
     result.CategoryRowDescriptions = new List <string>();
     for (int index = 0; index < allCatNames.Length; index++)
     {
         string     t           = allCatNames[index];
         string[][] categoryRow = new string[mdata1.ColumnCount + mdata2.ColumnCount][];
         for (int j = 0; j < categoryRow.Length; j++)
         {
             categoryRow[j] = new string[0];
         }
         int ind1 = mdata1.CategoryRowNames.IndexOf(t);
         if (ind1 >= 0)
         {
             string[][] c1 = mdata1.GetCategoryRowAt(ind1);
             for (int j = 0; j < c1.Length; j++)
             {
                 categoryRow[j] = c1[j];
             }
         }
         int ind2 = mdata2.CategoryRowNames.IndexOf(t);
         if (ind2 >= 0)
         {
             string[][] c2 = mdata2.GetCategoryRowAt(ind2);
             for (int j = 0; j < c2.Length; j++)
             {
                 categoryRow[mdata1.ColumnCount + j] = c2[j];
             }
         }
         result.AddCategoryRow(allCatNames[index], allCatDescriptions[index], categoryRow);
     }
     string[] allNumNames = ArrayUtils.Concat(mdata1.NumericRowNames, mdata2.NumericRowNames);
     allNumNames            = ArrayUtils.UniqueValues(allNumNames);
     result.NumericRowNames = new List <string>(allNumNames);
     string[] allNumDescriptions = new string[allNumNames.Length];
     for (int i = 0; i < allNumNames.Length; i++)
     {
         allNumDescriptions[i] = GetDescription(allNumNames[i], mdata1.NumericRowNames, mdata2.NumericRowNames,
                                                mdata1.NumericRowDescriptions, mdata2.NumericRowDescriptions);
     }
     result.NumericRowDescriptions = new List <string>(allNumDescriptions);
     foreach (string t in allNumNames)
     {
         double[] numericRow = new double[mdata1.ColumnCount + mdata2.ColumnCount];
         for (int j = 0; j < numericRow.Length; j++)
         {
             numericRow[j] = double.NaN;
         }
         int ind1 = mdata1.NumericRowNames.IndexOf(t);
         if (ind1 >= 0)
         {
             double[] c1 = mdata1.NumericRows[ind1];
             for (int j = 0; j < c1.Length; j++)
             {
                 numericRow[j] = c1[j];
             }
         }
         int ind2 = mdata2.NumericRowNames.IndexOf(t);
         if (ind2 >= 0)
         {
             double[] c2 = mdata2.NumericRows[ind2];
             for (int j = 0; j < c2.Length; j++)
             {
                 numericRow[mdata1.ColumnCount + j] = c2[j];
             }
         }
         result.NumericRows.Add(numericRow);
     }
 }