public StudyVariableParam(StudyVariable[] studyVariables, bool reduced, CVLookUp cv, string name = null)
     : base(name)
 {
     _reduced = reduced;
     _cv = cv;
     _count = studyVariables.Length;
     Value = studyVariables;
     Default = studyVariables;
 }
        public StudyVariablePanel1(StudyVariable[] value)
        {
            _count = value.Length;

            MaxWidth = 750;

            InitializeComponent();

            Value = value;
        }
        public static SortedDictionary<string, MZTabColumn> createOptionalColumns(Section section,
                                                                                  StudyVariable studyVariable,
                                                                                  int offset)
        {
            SortedDictionary<string, MZTabColumn> columns = new SortedDictionary<string, MZTabColumn>();
            Section dataSection = Section.toDataSection(section);

            AbundanceColumn column = new AbundanceColumn(dataSection, Field.ABUNDANCE, studyVariable, offset);
            columns.Add(column.LogicPosition, column);
            column = new AbundanceColumn(dataSection, Field.ABUNDANCE_STDEV, studyVariable, offset);
            columns.Add(column.LogicPosition, column);
            column = new AbundanceColumn(dataSection, Field.ABUNDANCE_STD_ERROR, studyVariable, offset);
            columns.Add(column.LogicPosition, column);

            return columns;
        }
        private void addPeptideValue()
        {
            MsRun msRun1 = new MsRun(1);
            Assay assay1 = new Assay(1);
            Assay assay2 = new Assay(2);
            StudyVariable studyVariable1 = new StudyVariable(1);

            MZTabColumnFactory factory = MZTabColumnFactory.GetInstance(Section.Peptide_Header);
            factory.AddOptionalColumn(PeptideColumn.SEARCH_ENGINE_SCORE, msRun1);
            factory.AddAbundanceOptionalColumn(assay1);
            factory.AddAbundanceOptionalColumn(studyVariable1);
            factory.AddAbundanceOptionalColumn(assay2);
            factory.AddOptionalColumn(msRun1, "my_value", typeof (string));
            CVParam param = new CVParam("MS", "MS:1002217", "decoy peptide", null);
            factory.AddOptionalColumn(param, typeof (string));

            Metadata metadata = new Metadata();
            metadata.AddMsRunLocation(2, new Url("file://C:\\path\\to\\my\\file"));

            Console.WriteLine(factory);

            Peptide peptide = new Peptide(factory, metadata);

            peptide.Sequence = "KVPQVSTPTLVEVSR";
            peptide.Accession = "P02768";
            peptide.SetUnique("0");
            peptide.Database = "UniProtKB";
            peptide.DatabaseVersion = "2011_11";
            peptide.SetSearchEngine("[MS,MS:1001207,Mascot,]|[MS,MS:1001208,Sequest,]");
            peptide.SetBestSearchEngineScore("[MS,MS:1001155,Sequest:xcorr,2]");
            peptide.Reliability = Reliability.findReliability("3");
            peptide.SetModifications(
                "3[MS,MS:1001876, modification probability, 0.8]|4[MS,MS:1001876, modification probability, 0.2]-MOD:00412,8[MS,MS:1001876, modification probability, 0.3]-MOD:00412");
            peptide.AddRetentionTime(10.2);
            peptide.AddRetentionTimeWindow(1123.2);
            peptide.AddRetentionTimeWindow(1145.3);
            peptide.Charge = new Integer(2);
            peptide.MassToCharge = 1234.4;
            peptide.URI = new Uri("http://www.ebi.ac.uk/pride/link/to/peptide");
            peptide.SetSpectraRef("ms_run[2]:index=7|ms_run[2]:index=9");
            Console.WriteLine(peptide);
        }
Esempio n. 5
0
 public bool AddStudyVariableDescription(int id, string description)
 {
     StudyVariable studyVariable;
     if (!_studyVariableMap.ContainsKey(id)){
         studyVariable = new StudyVariable(id){Description = description};
         //TODO: add return value
         _studyVariableMap.Add(id, studyVariable);
         return true;
     }
     studyVariable = _studyVariableMap[id];
     studyVariable.Description = description;
     //TODO: Moved it to the upper if studyVariableMap.Add(id, studyVariable);
     return true;
 }
Esempio n. 6
0
 public bool AddStudyVariableAssay(int id, Assay assay)
 {
     StudyVariable studyVariable;
     if (!_studyVariableMap.ContainsKey(id)){
         studyVariable = new StudyVariable(id);
         studyVariable.AddAssay(assay.Id, assay);
         _studyVariableMap.Add(id, studyVariable);
         return true;
     }
     studyVariable = _studyVariableMap[id];
     studyVariable.AddAssay(assay.Id, assay);
     return true;
 }
Esempio n. 7
0
 public void AddStudyVariable(StudyVariable studyVariable)
 {
     _studyVariableMap.Add(studyVariable.Id, studyVariable);
 }
 public override void Clear()
 {
     Value = new StudyVariable[_count];
 }
        private IEnumerable<StudyVariable> SILAC(StudyVariable variable, string[] labels)
        {
            StudyVariable[] result = new StudyVariable[labels.Length];

            for (int i = 0; i < result.Length; i++) {
                result[i] = new StudyVariable(variable.Id);
                result[i].AddAllAssays(variable.AssayMap.Values.ToList());
                result[i].AddAllSamples(variable.SampleMap.Values.ToList());
                result[i].Description = String.Format("{0} {1}", labels[i], variable.Description);
            }

            return result;
        }
 /**
  * Add three {@link AbundanceColumn} into {@link AbundanceColumn}, {@link #optionalColumnMapping} and {@link #columnMapping} at one time.
  * The header like: {Section}_abundance_study_variable[1], {Section}_abundance_stdev_study_variable[1],
  * {Section}_abundance_std_error_study_variable[1].
  *
  * @see AbundanceColumn#createOptionalColumns(Section, StudyVariable, String)
  *
  * @param studyVariable SHOULD NOT empty.
  */
 public string AddAbundanceOptionalColumn(StudyVariable studyVariable)
 {
     SortedDictionary<string, MZTabColumn> columns =
         AbundanceColumn.createOptionalColumns(section, studyVariable,
                                                                     ParseColumnOrder(columnMapping.Last().Key));
     foreach (var column in columns){
         abundanceColumnMapping.Add(column.Key, column.Value);
         optionalColumnMapping.Add(column.Key, column.Value);
         columnMapping.Add(column.Key, column.Value);
     }
     return columns.Last().Key;
 }
Esempio n. 11
0
        private void addProteinValue()
        {
            MsRun msRun1 = new MsRun(1);
            MsRun msRun2 = new MsRun(2);
            Assay assay1 = new Assay(1);
            Assay assay2 = new Assay(2);
            StudyVariable studyVariable1 = new StudyVariable(1);

            MZTabColumnFactory factory = MZTabColumnFactory.GetInstance(Section.Protein_Header);
            factory.AddOptionalColumn(ProteinColumn.SEARCH_ENGINE_SCORE, msRun1);
            factory.AddOptionalColumn(ProteinColumn.NUM_PSMS, msRun1);
            factory.AddOptionalColumn(ProteinColumn.NUM_PEPTIDES_DISTINCT, msRun1);
            factory.AddOptionalColumn(ProteinColumn.NUM_PEPTIDES_UNIQUE, msRun1);
            factory.AddOptionalColumn(ProteinColumn.NUM_PSMS, msRun2);
            factory.AddOptionalColumn(ProteinColumn.NUM_PEPTIDES_DISTINCT, msRun2);

            factory.AddAbundanceOptionalColumn(assay1);
            factory.AddAbundanceOptionalColumn(studyVariable1);
            factory.AddAbundanceOptionalColumn(assay2);

            factory.AddOptionalColumn(assay1, "my_value", typeof (string));
            CVParam param = new CVParam("MS", "MS:1002217", "decoy peptide", null);
            factory.AddOptionalColumn(param, typeof (string));

            Console.WriteLine(factory);

            Protein protein = new Protein(factory);

            // set stable columns data.
            protein.Accession = "P12345";
            protein.Description = "Aspartate aminotransferase, mitochondrial";
            protein.SetTaxid("10116");
            protein.Species = "Rattus norvegicus (Rat)";
            protein.Database = "UniProtKB";
            protein.DatabaseVersion = "2011_11";
            protein.SetSearchEngine("[MS,MS:1001207,Mascot,]");
            protein.AddSearchEngine("[MS,MS:1001208,Sequest,]");
            protein.SetBestSearchEngineScore("[MS,MS:1001171,Mascot score,50]|[MS,MS:1001155,Sequest:xcorr,2]");
            protein.Reliability = Reliability.High;
            protein.SetAmbiguityMembers("P12347,P12348");
            protein.SetModifications("3|4|8-MOD:00412, 3|4|8-MOD:00412");
            protein.SetURI("http://www.ebi.ac.uk/pride/url/to/P12345");
            protein.SetGOTerms("GO:0006457|GO:0005759|GO:0005886|GO:0004069");
            protein.SetProteinCoverage("0.4");
            Console.WriteLine(protein);

            // set optional columns which have stable order.
            protein.setSearchEngineScore(msRun1, "[MS,MS:1001171,Mascot score,50]|[MS,MS:1001155,Sequest:xcorr,2]");
            protein.setNumPSMs(msRun1, 4);
            protein.setNumPSMs(msRun2, 2);
            protein.setNumPeptidesDistinct(msRun1, 3);
            protein.setNumPeptidesUnique(msRun1, 2);
            Console.WriteLine(protein);

            // set abundance columns
            protein.setAbundanceColumn(assay1, "0.4");
            protein.setAbundanceColumn(assay2, "0.2");

            protein.setAbundanceColumn(studyVariable1, "0.4");
            protein.setAbundanceStdevColumn(studyVariable1, "0.3");
            protein.setAbundanceStdErrorColumn(studyVariable1, "0.2");
            Console.WriteLine(protein);

            // set user defined optional columns
            protein.setOptionColumn(assay1, "my_value", "My value about assay[1]");
            protein.setOptionColumn(param, "TOM value");

            Console.WriteLine(protein);
        }
Esempio n. 12
0
        private void addSmallMoleculeValue()
        {
            MsRun msRun1 = new MsRun(1);
            Assay assay1 = new Assay(1);
            Assay assay2 = new Assay(2);
            StudyVariable studyVariable1 = new StudyVariable(1);

            MZTabColumnFactory factory = MZTabColumnFactory.GetInstance(Section.Small_Molecule);
            factory.AddAbundanceOptionalColumn(assay1);
            factory.AddAbundanceOptionalColumn(studyVariable1);
            factory.AddAbundanceOptionalColumn(assay2);
            factory.AddOptionalColumn(msRun1, "my_value", typeof (string));
            CVParam param = new CVParam("MS", "MS:1002217", "decoy peptide", null);
            factory.AddOptionalColumn(param, typeof (string));

            Metadata metadata = new Metadata();
            metadata.AddMsRunLocation(2, new Url("file://C:\\path\\to\\my\\file"));

            Console.WriteLine(factory);
            /*TODO: SmallMolecule sm = new SmallMolecule(factory, metadata);
            sm.setIdentifier("CID:00027395");
            sm.setChemicalFormula("C17H20N4O2");
            sm.setSmiles("C1=CC=C(C=C1)CCNC(=O)CCNNC(=O)C2=CC=NC=C2");
            sm.setInchiKey("QXBMEGUKVLFJAM-UHFFFAOYSA-N");
            sm.setDescription("N-(2-phenylethyl)-3-[2-(pyridine-4-carbonyl)hydrazinyl]propanamide");
            sm.setExpMassToCharge("1234.4");
            sm.setCalcMassToCharge("1234.5");
            sm.setCharge("2");
            sm.setRetentionTime("10.2|11.5");
            sm.setTaxid("10116");
            sm.setSpecies("Rattus norvegicus (Rat)");
            sm.setDatabase("UniProtKB");
            sm.setDatabaseVersion("2011_11");
            sm.setReliability("2");
            sm.setURI("http://www.ebi.ac.uk/pride/link/to/identification");
            sm.setSpectraRef("ms_run[2]:index=7|ms_run[2]:index=9");
            sm.setSearchEngine("[MS, MS:1001477, SpectraST,]");
            sm.setBestSearchEngineScore("[MS, MS:1001419, SpectraST:discriminant score F, 0.7]");
            sm.setModifications("CHEMMOD:+Na-H");

            Console.WriteLine(sm);*/
        }
        public StudyVariablePanel2(StudyVariable[] value)
        {
            HorizontalAlignment = HorizontalAlignment.Left;

            _count = value.Length;

            foreach (StudyVariable variable in value){
                if (variable.AssayMap != null){
                    foreach (var assay in variable.AssayMap.Values){
                        if (assay == null){
                            continue;
                        }
                        _assayText.Add(AssayToString(assay));
                        _assayList.Add(assay);
                    }
                }

                if (variable.SampleMap != null){
                    foreach (var sample in variable.SampleMap.Values){
                        if (sample == null){
                            continue;
                        }
                        _sampleText.Add(SampleToString(sample));
                        _sampleList.Add(sample);
                    }
                }
            }

            MaxWidth = 750;
            Width = MaxWidth;

            _sampleRefs = new MultiListSelectorControl{
                MinHeight = _count*Constants.height - 6,
                HorizontalAlignment = HorizontalAlignment.Stretch
            };
            _assayRefs = new MultiListSelectorControl{
                MinHeight = _count*Constants.height - 6,
                HorizontalAlignment = HorizontalAlignment.Stretch
            };

            InitializeComponent();

            Value = value;
        }
 /**
  * Add {@link CVParamOptionColumn} followed by study variable into {@link #optionalColumnMapping} and {@link #columnMapping}.
  * The header like: opt_study_variable[1]_cv_{accession}_{parameter name}
  *
  * @param studyVariable SHOULD NOT empty.
  * @param param SHOULD NOT empty.
  * @param columnType SHOULD NOT empty.
  */
 public string AddOptionalColumn(StudyVariable studyVariable, CVParam param, Type columnType)
 {
     MZTabColumn column = new CVParamOptionColumn(studyVariable, param, columnType,
                                                  ParseColumnOrder(columnMapping.Last().Key));
     return AddOptionColumn(column);
 }
 /**
   * Add {@link OptionColumn} followed by study variable into {@link #optionalColumnMapping} and {@link #columnMapping}.
   * The header like: opt_study_variable[1]_{name}
   *
   * @param studyVariable SHOULD NOT empty.
   * @param name SHOULD NOT empty.
   * @param columnType SHOULD NOT empty.
   */
 public string AddOptionalColumn(StudyVariable studyVariable, string name, Type columnType)
 {
     MZTabColumn column = new OptionColumn(studyVariable, name, columnType,
                                           ParseColumnOrder(columnMapping.Last().Key));
     return AddOptionColumn(column);
 }
Esempio n. 16
0
 public bool AddStudyVariableSample(int id, Sample sample)
 {
     StudyVariable studyVariable;
     if (!_studyVariableMap.ContainsKey(id)){
         studyVariable = new StudyVariable(id);
         studyVariable.AddSample(sample.Id, sample);
         _studyVariableMap.Add(id, studyVariable);
         return true;
     }
     studyVariable = _studyVariableMap[id];
     studyVariable.AddSample(sample.Id, sample);
     return true;
 }
Esempio n. 17
0
        protected void GetExperminetValues(IMatrixData summary, IMatrixData experimentalDesignTemplate,
                                           IMatrixData experiment, IMatrixData spectraRef, ref List<MsRunImpl> msruns,
                                           ref List<StudyVariable> studyvariables, ref List<Assay> assays,
                                           ref List<Sample> samples, ref List<Instrument> instruments)
        {
            if (msruns == null) {
                msruns = new List<MsRunImpl>();
            }

            if (studyvariables == null) {
                studyvariables = new List<StudyVariable>();
            }

            if (assays == null) {
                assays = new List<Assay>();
            }

            if (samples == null) {
                samples = new List<Sample>();
            }

            if (instruments == null) {
                instruments = new List<Instrument>();
            }

            #region parse experiment

            if (experiment != null) {
                int studyvarIndex = experiment.StringColumnNames.IndexOf(MetadataElement.STUDY_VARIABLE.Name);
                int assayIndex = experiment.StringColumnNames.IndexOf(MetadataElement.ASSAY.Name);
                int msrunIndex = experiment.StringColumnNames.IndexOf(MetadataElement.MS_RUN.Name);
                int sampleIndex = experiment.StringColumnNames.IndexOf(MetadataElement.SAMPLE.Name);

                Regex sampleRegex = new Regex(@"^([^\[]+) <([^;]*);([^;]*);([^;]*);([^;]*)>");
                Regex runRegex = new Regex(@"^([^\[]+) <([^;]*);([^;]*);([^;]*);([^;]*)>");
                Regex assayRegex = new Regex(@"^([^\[]+) <([^>]*)>");

                for (int row = 0; row < experiment.RowCount; row++) {
                    string studyvariableDescription = experiment.StringColumns[studyvarIndex][row];
                    string assayReagent = experiment.StringColumns[assayIndex][row];
                    string msrunText = experiment.StringColumns[msrunIndex][row];
                    string sampleDescription = experiment.StringColumns[sampleIndex][row];
                    Lib.Model.Param specie = null;
                    Lib.Model.Param tissue = null;
                    Lib.Model.Param cellType = null;
                    Lib.Model.Param disease = null;
                    IList<Lib.Model.Param> mod = new List<Lib.Model.Param>();

                    if (sampleDescription != null && sampleRegex.IsMatch(sampleDescription)) {
                        var match = sampleRegex.Match(sampleDescription);
                        sampleDescription = match.Groups[1].Value;

                        string temp = match.Groups[2].Value;
                        if (!String.IsNullOrEmpty(temp)) {
                            specie = cv.GetParam(temp, "NEWT");
                        }

                        temp = match.Groups[3].Value;
                        if (!String.IsNullOrEmpty(temp)) {
                            tissue = cv.GetParam(temp, "BTO");
                        }

                        temp = match.Groups[4].Value;
                        if (!String.IsNullOrEmpty(temp)) {
                            cellType = cv.GetParam(temp, "CL");
                        }

                        temp = match.Groups[5].Value;
                        if (!String.IsNullOrEmpty(temp)) {
                            disease = cv.GetParam(temp, "DOID");
                        }
                    }
                    if (assayRegex != null && assayRegex.IsMatch(assayReagent)) {
                        var match = assayRegex.Match(assayReagent);
                        string temp = match.Groups[2].Value;
                        if (!String.IsNullOrEmpty(temp)) {
                            foreach (var t in temp.Split(';')) {
                                mod.Add(cv.GetParam(t, "PRIDE"));
                            }
                        }

                        assayReagent = match.Groups[1].Value;
                    }

                    string filename = null;
                    string path = null;
                    Lib.Model.Param format = null;
                    Lib.Model.Param idformat = null;
                    Lib.Model.Param fragementaion = null;
                    if (runRegex != null && runRegex.IsMatch(msrunText)) {
                        var match = runRegex.Match(msrunText);
                        filename = match.Groups[1].Value;

                        string temp = match.Groups[2].Value;
                        if (!String.IsNullOrEmpty(temp)) {
                            path = temp;
                        }

                        temp = match.Groups[3].Value;
                        if (!String.IsNullOrEmpty(temp)) {
                            format = cv.GetParam(temp, "MS");
                        }

                        temp = match.Groups[4].Value;
                        if (!String.IsNullOrEmpty(temp)) {
                            idformat = cv.GetParam(temp, "MS");
                        }

                        temp = match.Groups[5].Value;
                        if (!String.IsNullOrEmpty(temp)) {
                            fragementaion = cv.GetParam(temp, "MS");
                        }
                    }

                    StudyVariable studyvariable;
                    if (!studyvariables.Any(x => x.Description.Equals(studyvariableDescription))) {
                        studyvariable = new StudyVariable(studyvariables.Count + 1) {
                            Description = studyvariableDescription
                        };
                        studyvariables.Add(studyvariable);
                    } else {
                        studyvariable = studyvariables.First(x => x.Description.Equals(studyvariableDescription));
                    }

                    Assay assay = new Assay(assays.Count + 1) {
                        QuantificationReagent = cv.GetParam(assayReagent, "PRIDE")
                    };

                    foreach (var m in mod) {
                        if (m == null) {
                            continue;
                        }
                        assay.addQuantificationMod(new AssayQuantificationMod(assay,
                                                                              assay.QuantificationModMap.Count + 1) {
                                                                                  Param = m
                                                                              });
                    }

                    assays.Add(assay);

                    MsRunImpl msrun;
                    if (!String.IsNullOrEmpty(filename) &&
                        !msruns.Any(x => x.Description != null && x.Description.Equals(filename))) {
                        msrun = new MsRunImpl(msruns.Count + 1) {
                            Format = format,
                            IdFormat = idformat,
                            FragmentationMethod = fragementaion
                        };

                        msruns.Add(msrun);
                        msrun.Location = new Url(String.IsNullOrEmpty(path) ? filename : Path.Combine(path, filename));
                    } else {
                        msrun = msruns.First(x => x.Description != null && x.Description.Equals(filename));
                    }

                    Sample sample;
                    if (!samples.Any(x => x.Description.Equals(sampleDescription))) {
                        sample = new Sample(samples.Count + 1) { Description = sampleDescription };
                        if (specie != null) {
                            sample.AddSpecies(specie);
                        }
                        if (tissue != null) {
                            sample.AddTissue(tissue);
                        }
                        if (cellType != null) {
                            sample.AddCellType(cellType);
                        }
                        if (disease != null) {
                            sample.AddDisease(disease);
                        }
                        samples.Add(sample);
                    } else {
                        sample = samples.First(x => x.Description.Equals(sampleDescription));
                    }

                    if (!studyvariable.AssayMap.ContainsKey(assay.Id)) {
                        studyvariable.AddAssay(assay);
                    }
                    if (!studyvariable.SampleMap.ContainsKey(sample.Id)) {
                        studyvariable.AddSample(sample);
                    }

                    assay.MsRun = msrun;
                    assay.Sample = sample;
                }
            }

            #endregion

            Dictionary<int, IList<string>> dictionary = new Dictionary<int, IList<string>>();

            #region parse experimentalDesign

            if (experimentalDesignTemplate != null) {
                string[] rawfiles = null;

                int index = Constants.GetKeywordIndex(experimentalDesign.rawfile,
                                                     experimentalDesignTemplate.StringColumnNames);
                if (index != -1) {
                    rawfiles = experimentalDesignTemplate.StringColumns[index];
                }

                string[] experimentNames = null;
                if (
                    (index =
                     Constants.GetKeywordIndex(experimentalDesign.variable,
                                              experimentalDesignTemplate.StringColumnNames)) !=
                    -1) {
                    experimentNames = experimentalDesignTemplate.StringColumns[index];
                } else if (
                      (index =
                       Constants.GetKeywordIndex(experimentalDesign.variable,
                                                experimentalDesignTemplate.CategoryColumnNames)) != -1) {
                    experimentNames = MzTabMatrixUtils.ConvertToStringArray(experimentalDesignTemplate.GetCategoryColumnAt(index));
                }

                if (rawfiles != null && experimentNames != null) {
                    for (int i = 0; i < rawfiles.Length && i < experimentNames.Length; i++) {
                        string name = experimentNames[i];
                        StudyVariable variable = studyvariables.FirstOrDefault(x => x.Description.Equals(name));
                        if (variable == null) {
                            variable = new StudyVariable(studyvariables.Count + 1) { Description = name };
                            studyvariables.Add(variable);
                        }

                        string rawfile = rawfiles[i];
                        MsRunImpl runImpl = msruns.FirstOrDefault(x => x.Description.Equals(rawfile));
                        if (runImpl == null) {
                            runImpl = new MsRunImpl(msruns.Count + 1) {
                                Location = new Url(rawfile),
                                Format = cv.GetParam("MS:1000563", "MS"),
                                IdFormat = cv.GetParam("MS:1000768", "MS")
                            };
                            msruns.Add(runImpl);
                        }

                        if (rawfile != null) {
                            if (!dictionary.ContainsKey(variable.Id)) {
                                dictionary.Add(variable.Id, new List<string>());
                            }
                            dictionary[variable.Id].Add(rawfile);
                        }
                    }
                } else {
                    Console.Out.WriteLine("Rawfiles " + rawfiles);
                    Console.Out.WriteLine("experimentNames " + experimentNames);
                    throw new Exception("Could not parse " + Matrix.ExperimentalDesign);
                }
            }

            #endregion

            #region add default samples from studyvariables

            if (studyvariables != null && studyvariables.Count > 0) {
                foreach (StudyVariable variable in studyvariables) {
                    string text = variable.Description;

                    Sample sample = samples.FirstOrDefault(x => text.Contains(x.Description));
                    if (sample == null) {
                        sample = new Sample(samples.Count + 1) { Description = text };
                        samples.Add(sample);
                    }
                    variable.AddSample(sample);
                }
            }

            #endregion

            #region parse summary

            if (summary != null) {
                int maxRow = msruns.Count;

                string multi = "1";
                string[] labels0 = null;
                int index;

                if ((index = Constants.GetKeywordIndex(Utils.summary.labels0, summary.StringColumnNames)) != -1) {
                    labels0 = summary.StringColumns[index];
                    multi = "1";
                } else if ((index = Constants.GetKeywordIndex(Utils.summary.labels0, summary.CategoryColumnNames)) !=
                           -1) {
                    labels0 = MzTabMatrixUtils.ConvertToStringArray(summary.GetCategoryColumnAt(index));
                    multi = "1";
                }

                string[] labels1 = null;
                if ((index = Constants.GetKeywordIndex(Utils.summary.labels1, summary.StringColumnNames)) != -1) {
                    labels1 = summary.StringColumns[index];
                    multi = "2";
                } else if ((index = Constants.GetKeywordIndex(Utils.summary.labels1, summary.CategoryColumnNames)) !=
                           -1) {
                    labels1 = MzTabMatrixUtils.ConvertToStringArray(summary.GetCategoryColumnAt(index));
                    multi = "2";
                }

                string[] labels2 = null;
                if ((index = Constants.GetKeywordIndex(Utils.summary.labels2, summary.StringColumnNames)) != -1) {
                    labels2 = summary.StringColumns[index];
                    multi = "3";
                } else if ((index = Constants.GetKeywordIndex(Utils.summary.labels2, summary.CategoryColumnNames)) !=
                           -1) {
                    labels2 = MzTabMatrixUtils.ConvertToStringArray(summary.GetCategoryColumnAt(index));
                    multi = "3";
                }

                string[] multiplicity;
                if ((index = Constants.GetKeywordIndex(Utils.summary.multiplicity, summary.StringColumnNames)) !=
                    -1) {
                    multiplicity = summary.StringColumns[index];
                    multiplicity = multiplicity.Where(x => !String.IsNullOrEmpty(x)).ToArray();
                } else if (
                      (index =
                       Constants.GetKeywordIndex(Utils.summary.multiplicity, summary.CategoryColumnNames)) !=
                      -1) {
                    multiplicity = MzTabMatrixUtils.ConvertToStringArray(summary.GetCategoryColumnAt(index));
                    multiplicity = multiplicity.Where(x => !String.IsNullOrEmpty(x)).ToArray();
                } else {
                    multiplicity = new string[maxRow];
                    for (int i = 0; i < multiplicity.Length; i++) {
                        multiplicity[i] = multi;
                    }
                }

                string[] labels;
                switch (multi) {
                    case "1":
                        labels = null;
                        break;
                    case "2":
                        labels = new[] { "L", "H" };
                        break;
                    case "3":
                        labels = new[] { "L", "H", "M" };
                        break;
                    default:
                        labels = null;
                        break;
                }

                if (labels != null) {
                    List<StudyVariable> list = new List<StudyVariable>();
                    Dictionary<int, IList<string>> dict = new Dictionary<int, IList<string>>();

                    foreach (StudyVariable studyVariable in studyvariables){
                        foreach (var variable in SILAC(studyVariable, labels)) {
                            IList<string> rawfile = null;
                            if (dictionary.ContainsKey(variable.Id)) {
                                rawfile = dictionary[variable.Id];
                            }

                            StudyVariable tmp = new StudyVariable(list.Count + 1){Description = variable.Description};
                            tmp.AddAllAssays(variable.AssayMap.Values.ToList());
                            tmp.AddAllSamples(variable.SampleMap.Values.ToList());

                            list.Add(tmp);

                            if (rawfile != null) {
                                if (!dict.ContainsKey(tmp.Id)) {
                                    dict.Add(tmp.Id, rawfile);
                                }
                            }
                        }
                    }
                    studyvariables = list;
                    dictionary = dict;
                }

                string[] rawfiles = null;
                if ((index = Constants.GetKeywordIndex(Utils.summary.rawfile, summary.StringColumnNames)) != -1) {
                    rawfiles = summary.StringColumns[index];
                    rawfiles = rawfiles.Where(x => !String.IsNullOrEmpty(x)).ToArray();
                } else if ((index = Constants.GetKeywordIndex(Utils.summary.rawfile, summary.CategoryColumnNames)) !=
                           -1) {
                    rawfiles = MzTabMatrixUtils.ConvertToStringArray(summary.GetCategoryColumnAt(index));
                    rawfiles = rawfiles.Where(x => !String.IsNullOrEmpty(x)).ToArray();
                }

                string[] orbitrapInstruments = new[] { "LTQ Orbitrap", "LTQ Orbitrap XL", "LTQ Orbitrap Velos", "LTQ Orbitrap Elite", "Q Exactive" };
                string[] instrument = null;
                if ((index = Constants.GetKeywordIndex(Utils.summary.instrument, summary.StringColumnNames)) != -1) {
                    instrument = summary.StringColumns[index];
                    instrument = instrument.Where(x => !String.IsNullOrEmpty(x)).ToArray();
                } else if ((index = Constants.GetKeywordIndex(Utils.summary.instrument, summary.CategoryColumnNames)) !=
                           -1) {
                    instrument = MzTabMatrixUtils.ConvertToStringArray(summary.GetCategoryColumnAt(index));
                    instrument = instrument.Where(x => !String.IsNullOrEmpty(x)).ToArray();
                }

                if (rawfiles != null) {
                    for (int i = 0; i < rawfiles.Length; i++) {
                        int id = assays.Count + 1;
                        string rawfile = rawfiles[i];

                        if (!dictionary.Values.Any(x => x.Contains(rawfile))) {
                            continue;
                        }

                        IList<StudyVariable> temp = new List<StudyVariable>();
                        foreach (var v in dictionary.Where(x => x.Value.Contains(rawfile))) {
                            temp.Add(studyvariables.FirstOrDefault(x => x.Id == v.Key));
                        }

                        StudyVariable variable1 = null;
                        StudyVariable variable2 = null;
                        StudyVariable variable3 = null;
                        if (temp != null) {
                            if (temp.Any()) {
                                variable1 = temp[0];
                            }
                            if (temp.Count() > 1) {
                                variable2 = temp[1];
                            }
                            if (temp.Count() > 2) {
                                variable3 = temp[2];
                            }
                        }

                        if (multiplicity[i].Equals("1")) {
                            #region Add assay for label free

                            Assay assay = new Assay(id) {
                                QuantificationReagent = cv.GetParam("Unlabeled sample", "PRIDE"),
                                MsRun = msruns[i]
                            };
                            if (variable1 != null) {
                                assay.Sample = variable1.SampleMap.Values.FirstOrDefault();
                                variable1.AddAssay(assay);
                            }
                            assays.Add(assay);

                            #endregion
                        } else if (multiplicity[i].Equals("2")) {
                            #region Add assays for Double SILAC labeling

                            Assay assay = new Assay(id) {
                                QuantificationReagent = cv.GetParam("SILAC light", "PRIDE"),
                                MsRun = msruns[i]
                            };
                            IList<AssayQuantificationMod> mods = MzTabMatrixUtils.GetQuantificationMod(labels0, i, assay);
                            if (mods != null) {
                                foreach (var m in mods) {
                                    assay.addQuantificationMod(m);
                                }
                            }
                            if (variable1 != null) {
                                assay.Sample = variable1.SampleMap.Values.FirstOrDefault();
                                variable1.AddAssay(assay);
                            }
                            assays.Add(assay);

                            assay = new Assay(id + 1) {
                                QuantificationReagent = cv.GetParam("SILAC heavy", "PRIDE"),
                                MsRun = msruns[i]
                            };
                            mods = MzTabMatrixUtils.GetQuantificationMod(labels1, i, assay);
                            if (mods != null) {
                                foreach (var m in mods) {
                                    assay.addQuantificationMod(m);
                                }
                            }
                            if (variable2 != null) {
                                assay.Sample = variable2.SampleMap.Values.FirstOrDefault();
                                variable2.AddAssay(assay);
                            }
                            assays.Add(assay);

                            #endregion
                        } else if (multiplicity[i].Equals("3")) {
                            #region Add assays for Triple SILAC labeling

                            Assay assay = new Assay(id) {
                                QuantificationReagent = cv.GetParam("SILAC light", "PRIDE"),
                                MsRun = msruns[i]
                            };
                            IList<AssayQuantificationMod> mods = MzTabMatrixUtils.GetQuantificationMod(labels0, i, assay);
                            if (mods != null) {
                                foreach (var m in mods) {
                                    assay.addQuantificationMod(m);
                                }
                            }
                            if (variable1 != null) {
                                assay.Sample = variable1.SampleMap.Values.FirstOrDefault();
                                variable1.AddAssay(assay);
                            }
                            assays.Add(assay);

                            assay = new Assay(id + 1) {
                                QuantificationReagent = cv.GetParam("SILAC medium", "PRIDE"),
                                MsRun = msruns[i]
                            };
                            mods = MzTabMatrixUtils.GetQuantificationMod(labels1, i, assay);
                            if (mods != null) {
                                foreach (var m in mods) {
                                    assay.addQuantificationMod(m);
                                }
                            }
                            if (variable2 != null) {
                                assay.Sample = variable2.SampleMap.Values.FirstOrDefault();
                                variable2.AddAssay(assay);
                            }
                            assays.Add(assay);

                            assay = new Assay(id + 2) {
                                QuantificationReagent = cv.GetParam("SILAC heavy", "PRIDE"),
                                MsRun = msruns[i]
                            };
                            mods = MzTabMatrixUtils.GetQuantificationMod(labels2, i, assay);
                            if (mods != null) {
                                foreach (var m in mods) {
                                    assay.addQuantificationMod(m);
                                }
                            }
                            if (variable3 != null) {
                                assay.Sample = variable3.SampleMap.Values.FirstOrDefault();
                                variable3.AddAssay(assay);
                            }
                            assays.Add(assay);

                            #endregion
                        }

                        if (instrument != null && !String.IsNullOrEmpty(instrument[i])) {
                            var tmp = new Instrument(instruments.Count + 1) { Name = cv.GetParam(instrument[i], "MS") };
                            if (orbitrapInstruments.Contains(instrument[i])) {
                                tmp.Source = cv.GetParam("electrospray ionization", "MS");
                                tmp.Analyzer = cv.GetParam("orbitrap", "MS");
                            }
                            instruments.Add(tmp);
                        }
                    }
                }
            }

            #endregion

            #region parse search

            Lib.Model.Param run_idFormat = cv.GetParam("MS:1000774", "MS");
            Lib.Model.Param run_format = cv.GetParam("Andromeda Peak list file", "MS");

            if (spectraRef != null && Constants.GetKeywordName(Utils.spectraRef.location, spectraRef.StringColumnNames) != null) {
                int colindex = Constants.GetKeywordIndex(Utils.spectraRef.location, spectraRef.StringColumnNames);
                string[] values =
                    ArrayUtils.UniqueValues(spectraRef.StringColumns[colindex]);

                for (int i = 0; i < values.Length; i++) {
                    Lib.Model.Param frag = null;
                    if (values[i].Contains("CID")) {
                        frag = cv.GetParam("MS:1000133", "MS");
                    } else if (values[i].Contains("HCD")) {
                        frag = cv.GetParam("MS:1000422", "MS");
                    }

                    msruns.Add(new MsRunImpl(msruns.Count + 1) {
                        IdFormat = run_idFormat,
                        Format = run_format,
                        FragmentationMethod = frag,
                        Location = new Url(values[i])
                    });
                }
            } else {
                msruns.Add(new MsRunImpl(msruns.Count + 1) {
                    IdFormat = run_idFormat,
                    Format = run_format
                });
            }

            #endregion
        }
        private void AddRow(List<string[]> matrix, List<string> columnnames, int row, MsRunImpl runImpl, Assay assay,
                            Sample sample, StudyVariable studyVariable, Instrument instrument)
        {
            string value = runImpl == null
                               ? ""
                               : string.Format(@"{0} <{1};{2};{3};{4}>", runImpl.Description, runImpl.FilePath,
                                               runImpl.Format == null ? "" : runImpl.Format.Name,
                                               runImpl.IdFormat == null ? "" : runImpl.IdFormat.Name,
                                               runImpl.FragmentationMethod == null
                                                   ? ""
                                                   : runImpl.FragmentationMethod.Name);
            matrix[columnnames.IndexOf(MetadataElement.MS_RUN.Name)][row] = value;

            value = assay == null
                        ? ""
                        : string.Format(@"{0} <{1}>", assay.QuantificationReagent.Name,
                                        StringUtils.Concat(";", ConvertToString(assay.QuantificationModMap)));
            matrix[columnnames.IndexOf(MetadataElement.ASSAY.Name)][row] = value;

            value = sample == null
                        ? ""
                        : string.Format(@"{0} <{1};{2};{3};{4}>", sample.Description,
                                        GetParamListString(sample.SpeciesList), GetParamListString(sample.TissueList),
                                        GetParamListString(sample.CellTypeList), GetParamListString(sample.DiseaseList));
            matrix[columnnames.IndexOf(MetadataElement.SAMPLE.Name)][row] = value;

            matrix[columnnames.IndexOf(MetadataElement.STUDY_VARIABLE.Name)][row] = studyVariable == null
                                                                                        ? ""
                                                                                        : studyVariable.Description;

            matrix[columnnames.IndexOf(MetadataElement.INSTRUMENT.Name)][row] = instrument == null
                                                                                    ? ""
                                                                                    : string.Format(
                                                                                        @"{0} <{1};{2};{3}>",
                                                                                        instrument.Name == null
                                                                                            ? ""
                                                                                            : instrument.Name.Name,
                                                                                        instrument.Analyzer == null
                                                                                            ? ""
                                                                                            : instrument.Analyzer.Name,
                                                                                        instrument.Detector == null
                                                                                            ? ""
                                                                                            : instrument.Detector.Name,
                                                                                        instrument.Source == null
                                                                                            ? ""
                                                                                            : instrument.Source.Name);
        }