001/* 002 * Copyright 2018 Leibniz-Institut für Analytische Wissenschaften – ISAS – e.V.. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package uk.ac.ebi.pride.jmztab2.model; 017 018import de.isas.mztab2.model.Assay; 019import de.isas.mztab2.model.IndexedElement; 020import de.isas.mztab2.model.StudyVariable; 021import java.util.SortedMap; 022import java.util.TreeMap; 023 024/** 025 * If the data exporter wishes to report only final results for 'Summary' files (i.e. following averaging over replicates), 026 * then these MUST be reported as quantitative values in the columns associated with the study_variable[1-n] (e.g. 027 * abundance_study_variable[1]). mzTab allows the reporting of abundance, standard deviation, and standard error 028 * for any study_variable. The unit of values in the abundance column MUST be specified in the metadata section of the mzTab file. 029 * The reported values SHOULD represent the final result of the performed data analysis. The exact meaning of the values will 030 * thus depend on the used analysis pipeline and quantitation method and is not expected to be comparable across multiple mzTab files. 031 * 032 * @author qingwei 033 * @author nilshoffmann 034 * @since 23/05/13 035 * 036 */ 037public class AbundanceColumn extends MZTabColumn { 038 public enum Field { 039 ABUNDANCE_ASSAY ("abundance_assay", Double.class, 1), 040 ABUNDANCE_STUDY_VARIABLE ("abundance_study_variable", Double.class, 2), 041 ABUNDANCE_VARIATION_STUDY_VARIABLE ("abundance_variation_study_variable", Double.class, 3); 042 043 private String name; 044 private Class columnType; 045 private int position; 046 047 Field(String name, Class columnType, int position) { 048 this.name = name; 049 this.columnType = columnType; 050 this.position = position; 051 } 052 053 @Override 054 public String toString() { 055 return name; 056 } 057 } 058 059 /** 060 * Generate a abundance column: 061 * The column header is: {Section}_{Field#name()}_{IndexedElement[id]} 062 * The column data type: {Field#columnType()} 063 * The column position: always most right side, calculated by offset. 064 */ 065 private AbundanceColumn(Section section, Field field, Object element, int offset) { 066 super(field.name, field.columnType, true, offset + field.position + ""); 067 setElement(element); 068 } 069 070 /** 071 * Generate a abundance optional column as measured in the given assay.The column header like 072 * protein_abundance_assay[1-n], the position always stay the most right of the tabled section, 073 * and the data type is Double. 074 * 075 * @param section SHOULD be {@link uk.ac.ebi.pride.jmztab2.model.Section#Protein}, {@link uk.ac.ebi.pride.jmztab2.model.Section#Peptide}, {@link uk.ac.ebi.pride.jmztab2.model.Section#PSM}, 076 * or {@link uk.ac.ebi.pride.jmztab2.model.Section#Small_Molecule}. 077 * @param assay SHOULD not be null. 078 * @param offset Normally the last column's position in header, {@link uk.ac.ebi.pride.jmztab2.model.MZTabColumnFactory#getColumnMapping()}, 079 * @return an abundance optional column as measured in the given assay. 080 */ 081 public static MZTabColumn createOptionalColumn(Section section, Assay assay, int offset) { 082 if (section.isComment() || section.isMetadata()) { 083 throw new IllegalArgumentException("Section should be Protein, Peptide, PSM or SmallMolecule."); 084 } 085 if (assay == null) { 086 throw new NullPointerException("Assay should not be null!"); 087 } 088 089 return new AbundanceColumn(Section.toDataSection(section), Field.ABUNDANCE_ASSAY, assay, offset); 090 } 091 092 /** 093 * Generate an abundance optional column as measured in the given study variable. 094 * The header can be one of abundance_study_variable[1], abundance_coeffvar_study_variable[1]. 095 * The position always stay the most right of the tabled section, and the data type is Double. 096 * 097 * @param section SHOULD be {@link uk.ac.ebi.pride.jmztab2.model.Section#Protein}, {@link uk.ac.ebi.pride.jmztab2.model.Section#Peptide}, {@link uk.ac.ebi.pride.jmztab2.model.Section#PSM}, 098 * or {@link uk.ac.ebi.pride.jmztab2.model.Section#Small_Molecule}. 099 * @param studyVariable SHOULD not be null. 100 * @param order position in header for the new columns {@link uk.ac.ebi.pride.jmztab2.model.MZTabColumnFactory#getColumnMapping()} 101 * @return an abundance optional column as measured in the given study variable. 102 * @param columnHeader a processed column header with abundance_ removed. 103 * 104 */ 105 public static SortedMap<String, MZTabColumn> createOptionalColumns(Section section, StudyVariable studyVariable, String columnHeader, String order) { 106 if (section.isComment() || section.isMetadata()) { 107 throw new IllegalArgumentException("Section should be Protein, Peptide, PSM, SmallMolecule, SmallMoleculeFeature or SmallMoleculeEvidence."); 108 } 109 if (studyVariable == null) { 110 throw new NullPointerException("Study Variable should not be null!"); 111 } 112 113 //In this case we know the real position in which the column need to star, so the offset is one less 114 int offset = new Integer(order)-1; 115 116 SortedMap<String, MZTabColumn> columns = new TreeMap<>(); 117 Section dataSection = Section.toDataSection(section); 118 119 AbundanceColumn column; 120 if(columnHeader.startsWith("study_variable")) { 121 column = new AbundanceColumn(dataSection, Field.ABUNDANCE_STUDY_VARIABLE, studyVariable, offset); 122 columns.put(column.getLogicPosition(), column); 123 } else if (columnHeader.startsWith("variation_study_variable")) { 124 column = new AbundanceColumn(dataSection, Field.ABUNDANCE_VARIATION_STUDY_VARIABLE, studyVariable, offset); 125 columns.put(column.getLogicPosition(), column); 126 } else { 127 throw new IllegalArgumentException("column header "+columnHeader+" is not allowed for abundance definition!"); 128 } 129 130 return columns; 131 } 132 133 /** 134 * <p>createOptionalColumns.</p> 135 * 136 * @param section a {@link uk.ac.ebi.pride.jmztab2.model.Section} object. 137 * @param studyVariable a {@link de.isas.mztab2.model.StudyVariable} object. 138 * @param lastOrder a {@link java.lang.Integer} object. 139 * @return a {@link java.util.SortedMap} object. 140 */ 141 public static SortedMap<String, MZTabColumn> createOptionalColumns(Section section, StudyVariable studyVariable, Integer lastOrder) { 142 if (section.isComment() || section.isMetadata()) { 143 throw new IllegalArgumentException("Section should be Protein, Peptide, PSM or SmallMolecule."); 144 } 145 if (studyVariable == null) { 146 throw new NullPointerException("Study Variable should not be null!"); 147 } 148 149 //In this case we know the real position in which the column need to star, so the offset is one less 150 151 SortedMap<String, MZTabColumn> columns = new TreeMap<>(); 152 Section dataSection = Section.toDataSection(section); 153 154 AbundanceColumn column; 155 column = new AbundanceColumn(dataSection, Field.ABUNDANCE_STUDY_VARIABLE, studyVariable, lastOrder); 156 columns.put(column.getLogicPosition(), column); 157 column = new AbundanceColumn(dataSection, Field.ABUNDANCE_VARIATION_STUDY_VARIABLE, studyVariable, lastOrder); 158 columns.put(column.getLogicPosition(), column); 159 160 return columns; 161 } 162}