public void LoadData(IMatrixData matrixData, Parameters parameters, ProcessInfo processInfo)
 {
     PerseusLoadFileParam par = (PerseusLoadFileParam) parameters.GetParam("File");
     string filename = par.Filename;
     if (string.IsNullOrEmpty(filename)){
         processInfo.ErrString = "Please specify a filename";
         return;
     }
     if (!File.Exists(filename)){
         processInfo.ErrString = "File '" + filename + "' does not exist.";
         return;
     }
     string[] colNames;
     Dictionary<string, string[]> annotationRows = new Dictionary<string, string[]>();
     try{
         colNames = TabSep.GetColumnNames(filename, commentPrefix, commentPrefixExceptions, annotationRows);
     } catch (Exception){
         processInfo.ErrString = "Could not open the file '" + filename + "'. It is probably opened by another program.";
         return;
     }
     string[] colDescriptions = null;
     string[] colTypes = null;
     bool[] colVisible = null;
     if (annotationRows.ContainsKey("Description")){
         colDescriptions = annotationRows["Description"];
         annotationRows.Remove("Description");
     }
     if (annotationRows.ContainsKey("Type")){
         colTypes = annotationRows["Type"];
         annotationRows.Remove("Type");
     }
     if (annotationRows.ContainsKey("Visible")){
         string[] colVis = annotationRows["Visible"];
         colVisible = new bool[colVis.Length];
         for (int i = 0; i < colVisible.Length; i++){
             colVisible[i] = bool.Parse(colVis[i]);
         }
         annotationRows.Remove("Visible");
     }
     int[] eInds = par.ExpressionColumnIndices;
     int[] cInds = par.CategoryColumnIndices;
     int[] nInds = par.NumericalColumnIndices;
     int[] tInds = par.TextColumnIndices;
     int[] mInds = par.MultiNumericalColumnIndices;
     int[] allInds = ArrayUtils.Concat(new[]{eInds, cInds, nInds, tInds, mInds});
     Array.Sort(allInds);
     for (int i = 0; i < allInds.Length - 1; i++){
         if (allInds[i + 1] == allInds[i]){
             processInfo.ErrString = "Column '" + colNames[allInds[i]] + "' has been selected multiple times";
             return;
         }
     }
     string[] allColNames = ArrayUtils.SubArray(colNames, allInds);
     Array.Sort(allColNames);
     for (int i = 0; i < allColNames.Length - 1; i++){
         if (allColNames[i + 1].Equals(allColNames[i])){
             processInfo.ErrString = "Column name '" + allColNames[i] + "' occurs multiple times.";
             return;
         }
     }
     LoadData(colNames, colDescriptions, eInds, cInds, nInds, tInds, mInds, filename, matrixData, annotationRows,
         processInfo.Progress, processInfo.Status);
 }