Skip to content
Snippets Groups Projects
Commit 0ca782e1 authored by felmer's avatar felmer
Browse files

LMS-2174 feeding database with modification fractions

SVN: 20652
parent 287afffe
No related branches found
No related tags found
No related merge requests found
Showing
with 428 additions and 110 deletions
......@@ -16,11 +16,9 @@
package ch.systemsx.cisd.openbis.etlserver.phosphonetx;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Experiment;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Sample;
/**
*
* Abstract super class of classes using {@link IProtDAO}.
*
* @author Franz-Josef Elmer
*/
......@@ -32,17 +30,5 @@ abstract class AbstractHandler
{
this.dao = dao;
}
protected Sample getOrCreateSample(Experiment experiment, String samplePermID)
{
Sample sample = dao.tryToGetSampleByPermID(samplePermID);
if (sample == null)
{
sample = new Sample();
sample.setPermID(samplePermID);
sample.setId(dao.createSample(experiment.getId(), samplePermID));
}
return sample;
}
}
/*
* Copyright 2011 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.etlserver.phosphonetx;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import ch.rinn.restrictions.Private;
import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Experiment;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Sample;
import ch.systemsx.cisd.openbis.generic.shared.dto.ListSamplesByPropertyCriteria;
import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.CommonConstants;
/**
* Abstract super class of classes getting or creating {@link Sample} instances.
*
* @author Franz-Josef Elmer
*/
abstract class AbstractSampleHandler extends AbstractHandler
{
@Private
static final String MZXML_FILENAME = "MZXML_FILENAME";
protected static final class SampleOrError
{
Sample sample;
String error;
}
protected final IEncapsulatedOpenBISService openbisService;
protected final ExperimentIdentifier experimentIdentifier;
private final SpaceIdentifier space;
private final Experiment experiment;
private final Map<String, SampleOrError> samplesOrErrors = new HashMap<String, SampleOrError>();
AbstractSampleHandler(IEncapsulatedOpenBISService openbisService, IProtDAO dao,
ExperimentIdentifier experimentIdentifier, Experiment experiment)
{
super(dao);
this.openbisService = openbisService;
this.experimentIdentifier = experimentIdentifier;
this.experiment = experiment;
String databaseInstanceCode = experimentIdentifier.getDatabaseInstanceCode();
space = new SpaceIdentifier(databaseInstanceCode, CommonConstants.MS_DATA_SPACE);
}
protected SampleOrError getOrCreateSampleOrError(String sampleName)
{
SampleOrError sampleOrError = samplesOrErrors.get(sampleName);
if (sampleOrError == null)
{
// first we look for a sample in space MS_DATA
SampleIdentifier sampleIdentifier = new SampleIdentifier(space, sampleName);
ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample =
openbisService.tryGetSampleWithExperiment(sampleIdentifier);
sampleOrError = new SampleOrError();
if (sample != null)
{
sampleOrError.sample = getOrCreateSample(sample.getPermId());
} else
{
// second we look for a sample in same space as search experiment with
// a property specified by 'sampleName'
String spaceCode = experimentIdentifier.getSpaceCode();
List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample> list =
openbisService.listSamplesByCriteria(new ListSamplesByPropertyCriteria(
MZXML_FILENAME, sampleName, spaceCode, null));
if (list == null || list.size() == 0)
{
sampleOrError.error = "an unidentified sample: " + sampleName;
} else if (list.size() > 1)
{
sampleOrError.error =
"a not uniquely specified sample (" + list.size()
+ " samples are found): " + sampleName;
} else
{
sample = list.get(0);
sampleOrError.sample = getOrCreateSample(sample.getPermId());
}
}
if (sample != null)
{
handleSample(sampleName, sample);
}
samplesOrErrors.put(sampleName, sampleOrError);
}
return sampleOrError;
}
private Sample getOrCreateSample(String samplePermID)
{
Sample sample = dao.tryToGetSampleByPermID(samplePermID);
if (sample == null)
{
sample = new Sample();
sample.setPermID(samplePermID);
sample.setId(dao.createSample(experiment.getId(), samplePermID));
}
return sample;
}
protected abstract void handleSample(String parameterName,
ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample);
}
......@@ -16,11 +16,6 @@
package ch.systemsx.cisd.openbis.etlserver.phosphonetx;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import ch.rinn.restrictions.Private;
import ch.systemsx.cisd.common.exceptions.UserFailureException;
import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Experiment;
......@@ -28,51 +23,23 @@ import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Parameter;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Sample;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
import ch.systemsx.cisd.openbis.generic.shared.dto.ListSamplesByPropertyCriteria;
import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.basic.CommonConstants;
/**
* Handler of {@link Parameter} objects of type 'abundance'.
*
* @author Franz-Josef Elmer
*/
class AbundanceHandler extends AbstractHandler
class AbundanceHandler extends AbstractSampleHandler
{
@Private
static final String MZXML_FILENAME = "MZXML_FILENAME";
private static final class SampleOrError
{
Sample sample;
String error;
}
private final IEncapsulatedOpenBISService openbisService;
private final ExperimentIdentifier experimentIdentifier;
private final SpaceIdentifier msData;
private final Experiment experiment;
private final Map<String, SampleOrError> samplesOrErrors = new HashMap<String, SampleOrError>();
private final SampleType sampleType;
AbundanceHandler(IEncapsulatedOpenBISService openbisService, IProtDAO dao,
ExperimentIdentifier experimentIdentifier, Experiment experiment)
{
super(dao);
this.openbisService = openbisService;
this.experimentIdentifier = experimentIdentifier;
this.experiment = experiment;
msData =
new SpaceIdentifier(experimentIdentifier.getDatabaseInstanceCode(),
CommonConstants.MS_DATA_SPACE);
super(openbisService, dao, experimentIdentifier, experiment);
sampleType = new SampleType();
sampleType.setCode(Constants.SEARCH_SAMPLE_TYPE);
}
......@@ -91,59 +58,9 @@ class AbundanceHandler extends AbstractHandler
}
}
@SuppressWarnings("deprecation")
private Sample getOrCreateSample(String parameterName, String proteinName)
{
SampleOrError sampleOrError = samplesOrErrors.get(parameterName);
if (sampleOrError == null)
{
// first we look for a sample in space MS_DATA
SampleIdentifier sampleIdentifier = new SampleIdentifier(msData, parameterName);
ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample =
openbisService.tryGetSampleWithExperiment(sampleIdentifier);
sampleOrError = new SampleOrError();
if (sample != null)
{
sampleOrError.sample = getOrCreateSample(experiment, sample.getPermId());
} else
{
// second we look for a sample in same space as search experiment with
// a property specified by 'parameterName'
String spaceCode = experimentIdentifier.getSpaceCode();
List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample> list =
openbisService.listSamplesByCriteria(new ListSamplesByPropertyCriteria(
MZXML_FILENAME, parameterName, spaceCode, null));
if (list == null || list.size() == 0)
{
sampleOrError.error = "an unidentified sample: " + parameterName;
} else if (list.size() > 1)
{
sampleOrError.error =
"a not uniquely specified sample (" + list.size()
+ " samples are found): " + parameterName;
} else
{
sample = list.get(0);
sampleOrError.sample = getOrCreateSample(experiment, sample.getPermId());
}
}
if (sample != null)
{
NewSample searchSample = new NewSample();
searchSample.setSampleType(sampleType);
SpaceIdentifier spaceIdentifier =
new SpaceIdentifier(experimentIdentifier.getDatabaseInstanceCode(),
experimentIdentifier.getSpaceCode());
SampleIdentifier identifier =
new SampleIdentifier(spaceIdentifier, parameterName + "_"
+ experimentIdentifier.getExperimentCode());
searchSample.setIdentifier(identifier.toString());
searchSample.setExperimentIdentifier(experimentIdentifier.toString());
searchSample.setParentIdentifier(sample.getIdentifier());
openbisService.registerSample(searchSample, null);
}
samplesOrErrors.put(parameterName, sampleOrError);
}
SampleOrError sampleOrError = getOrCreateSampleOrError(parameterName);
if (sampleOrError.error != null)
{
throw new UserFailureException("Protein '" + proteinName
......@@ -151,4 +68,23 @@ class AbundanceHandler extends AbstractHandler
}
return sampleOrError.sample;
}
@Override
@SuppressWarnings("deprecation")
protected void handleSample(String parameterName,
ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample)
{
NewSample searchSample = new NewSample();
searchSample.setSampleType(sampleType);
SpaceIdentifier spaceIdentifier =
new SpaceIdentifier(experimentIdentifier.getDatabaseInstanceCode(),
experimentIdentifier.getSpaceCode());
SampleIdentifier identifier =
new SampleIdentifier(spaceIdentifier, parameterName + "_"
+ experimentIdentifier.getExperimentCode());
searchSample.setIdentifier(identifier.toString());
searchSample.setExperimentIdentifier(experimentIdentifier.toString());
searchSample.setParentIdentifier(sample.getIdentifier());
openbisService.registerSample(searchSample, null);
}
}
......@@ -73,8 +73,8 @@ public interface IProtDAO extends BaseQuery
@Select("insert into modified_peptides (pept_id, nterm_mass, cterm_mass) values (?{1}, ?{2}, ?{3}) returning id")
public long createModifiedPeptide(long peptideID, double nTermMass, double cTermMass);
@Update("insert into modifications (mope_id, pos, mass) values (?{1}, ?{2}, ?{3})")
public void createModification(long modPeptideID, int position, double mass);
@Select("insert into modifications (mope_id, pos, mass) values (?{1}, ?{2}, ?{3}) returning id")
public long createModification(long modPeptideID, int position, double mass);
@Select("select * from protein_references where accession_number = ?{1}")
public ProteinReference tryToGetProteinReference(String accessionNumber);
......@@ -99,4 +99,7 @@ public interface IProtDAO extends BaseQuery
@Update("insert into abundances (prot_id, samp_id, value) values (?{1}, ?{2}, ?{3})")
public void createAbundance(long proteinID, long sampleID, double value);
@Update("insert into modification_fractions (modi_id, samp_id, fraction) values (?{1}, ?{2}, ?{3})")
public void createModificationFraction(long modID, long sampleID, double fraction);
}
/*
* Copyright 2011 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.etlserver.phosphonetx;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.AminoAcidMass;
/**
* Data class keeping data extracted from a peptide <parameter> element of type 'modification'.
*
*
* @author Franz-Josef Elmer
*/
final class ModificationFraction
{
private final String sample;
private final double fraction;
private final AminoAcidMass aminoAcidMass;
ModificationFraction(String sample, String value)
{
this.sample = sample;
String[] parts = value.split(":");
if (parts.length != 3)
{
throw exception(value, "Three parts separated by ':' expected.");
}
aminoAcidMass = new AminoAcidMass();
try
{
aminoAcidMass.setPosition(Integer.parseInt(parts[0]));
} catch (NumberFormatException ex)
{
throw exception(value, "Position part isn't an integer number: " + parts[0]);
}
try
{
aminoAcidMass.setMass(Double.parseDouble(parts[1]));
} catch (NumberFormatException ex)
{
throw exception(value, "Mass part isn't a floating-point number: " + parts[1]);
}
try
{
fraction = Double.parseDouble(parts[2]);
} catch (NumberFormatException ex)
{
throw exception(value, "Fraction part isn't a floating-point number: " + parts[2]);
}
}
private IllegalArgumentException exception(String value, String message)
{
return new IllegalArgumentException("Peptide parameter value [" + value
+ "] for sample '" + sample + "' is invalid: " + message);
}
public String getSample()
{
return sample;
}
public AminoAcidMass getAminoAcidMass()
{
return aminoAcidMass;
}
public double getFraction()
{
return fraction;
}
}
\ No newline at end of file
/*
* Copyright 2011 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.etlserver.phosphonetx;
import java.util.List;
import ch.systemsx.cisd.common.exceptions.UserFailureException;
import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Experiment;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Sample;
import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
/**
* Handler of modification fractions.
*
* @author Franz-Josef Elmer
*/
class ModificationFractionHandler extends AbstractSampleHandler
{
public ModificationFractionHandler(IEncapsulatedOpenBISService openbisService, IProtDAO dao,
ExperimentIdentifier experimentIdentifier, Experiment experiment)
{
super(openbisService, dao, experimentIdentifier, experiment);
}
@Override
protected void handleSample(String parameterName,
ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample sample)
{
// Do nothing
}
public void addModificationFractions(String peptideSequence, long modID,
List<ModificationFraction> modificationFractions)
{
for (ModificationFraction modificationFraction : modificationFractions)
{
Sample sample = getOrCreateSample(modificationFraction.getSample(), peptideSequence);
double fraction = modificationFraction.getFraction();
dao.createModificationFraction(modID, sample.getId(), fraction);
}
}
private Sample getOrCreateSample(String sampleName, String peptideSequence)
{
SampleOrError sampleOrError = getOrCreateSampleOrError(sampleName);
if (sampleOrError.error != null)
{
throw new UserFailureException("Protein '" + peptideSequence
+ "' has an abundance value for " + sampleOrError.error);
}
return sampleOrError.sample;
}
}
......@@ -18,8 +18,12 @@ package ch.systemsx.cisd.openbis.etlserver.phosphonetx;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import net.lemnik.eodsql.QueryTool;
......@@ -45,6 +49,7 @@ import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.ProteinProphetDetails;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.ProteinReference;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.ProteinSummary;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.ProteinSummaryDataFilter;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Sample;
import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Sequence;
import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.ProbabilityToFDRCalculator;
......@@ -59,6 +64,8 @@ class ResultDataSetUploader extends AbstractHandler
private static final double MAX_FALSE_DISCOVERY_RATE = 0.1;
static final String PARAMETER_TYPE_ABUNDANCE = "abundance";
static final String PARAMETER_TYPE_MODIFICATION = "modification";
private final Connection connection;
......@@ -198,6 +205,9 @@ class ResultDataSetUploader extends AbstractHandler
Long databaseID = dataSet.getDatabaseID();
AbundanceHandler abundanceHandler =
new AbundanceHandler(openbisService, dao, experimentIdentifier, experiment);
ModificationFractionHandler modificationFractionHandler =
new ModificationFractionHandler(openbisService, dao, experimentIdentifier,
experiment);
ProbabilityToFDRCalculator calculator = createProbabilityToFDRMapping(dataSetID, summary);
List<ProteinGroup> proteinGroups = summary.getProteinGroups();
for (ProteinGroup proteinGroup : proteinGroups)
......@@ -211,7 +221,8 @@ class ResultDataSetUploader extends AbstractHandler
{
if (calculator.calculateFDR(protein.getProbability()) <= MAX_FALSE_DISCOVERY_RATE)
{
addProtein(protein, dataSetID, databaseID, abundanceHandler);
addProtein(protein, dataSetID, databaseID, abundanceHandler,
modificationFractionHandler);
}
} catch (Exception e)
{
......@@ -236,7 +247,8 @@ class ResultDataSetUploader extends AbstractHandler
}
private void addProtein(Protein protein, long dataSetID, Long databaseID,
AbundanceHandler abundanceHandler)
AbundanceHandler abundanceHandler,
ModificationFractionHandler modificationFractionHandler)
{
long proteinID = dao.createProtein(dataSetID, protein.getProbability());
for (Parameter parameter : protein.getParameters())
......@@ -252,7 +264,7 @@ class ResultDataSetUploader extends AbstractHandler
{
try
{
addPeptide(proteinID, peptide);
addPeptide(proteinID, peptide, modificationFractionHandler);
peptideSequences.add(peptide.getSequence());
} catch (Exception e)
{
......@@ -266,7 +278,8 @@ class ResultDataSetUploader extends AbstractHandler
}
}
private void addPeptide(long proteinID, Peptide peptide)
private void addPeptide(long proteinID, Peptide peptide,
ModificationFractionHandler modificationFractionHandler)
{
String peptideSequence = peptide.getSequence();
int charge = peptide.getCharge();
......@@ -282,6 +295,54 @@ class ResultDataSetUploader extends AbstractHandler
logException(e, "modification", modification.toString());
}
}
List<ModificationFraction> modificationFractions = extractModificationFractions(peptide);
if (modificationFractions.isEmpty())
{
return;
}
long modPeptideID = dao.createModifiedPeptide(peptideID, 0, 0);
Map<AminoAcidMass, List<ModificationFraction>> map =
groupByPositionAndMass(modificationFractions);
Set<Entry<AminoAcidMass, List<ModificationFraction>>> entrySet = map.entrySet();
for (Entry<AminoAcidMass, List<ModificationFraction>> entry : entrySet)
{
AminoAcidMass positionAndMass = entry.getKey();
long modID = createModification(modPeptideID, positionAndMass);
List<ModificationFraction> list = entry.getValue();
modificationFractionHandler.addModificationFractions(peptideSequence, modID, list);
}
}
private Map<AminoAcidMass, List<ModificationFraction>> groupByPositionAndMass(
List<ModificationFraction> modificationFractions)
{
Map<AminoAcidMass, List<ModificationFraction>> result =
new HashMap<AminoAcidMass, List<ModificationFraction>>();
for (ModificationFraction modificationFraction : modificationFractions)
{
AminoAcidMass positionAndMass = modificationFraction.getAminoAcidMass();
List<ModificationFraction> list = result.get(positionAndMass);
if (list == null)
{
list = new ArrayList<ModificationFraction>();
result.put(positionAndMass, list);
}
list.add(modificationFraction);
}
return result;
}
private List<ModificationFraction> extractModificationFractions(Peptide peptide)
{
List<ModificationFraction> result = new ArrayList<ModificationFraction>();
for (Parameter parameter : peptide.getParameters())
{
if (PARAMETER_TYPE_MODIFICATION.equals(parameter.getType()))
{
result.add(new ModificationFraction(parameter.getName(), parameter.getValue()));
}
}
return result;
}
private void addPeptideModification(long peptideID, PeptideModification modification)
......@@ -292,12 +353,16 @@ class ResultDataSetUploader extends AbstractHandler
List<AminoAcidMass> aminoAcidMasses = modification.getAminoAcidMasses();
for (AminoAcidMass aminoAcidMass : aminoAcidMasses)
{
double mass = aminoAcidMass.getMass();
int position = aminoAcidMass.getPosition();
dao.createModification(modPeptideID, position, mass);
createModification(modPeptideID, aminoAcidMass);
}
}
private long createModification(long modPeptideID, AminoAcidMass aminoAcidMass)
{
return dao.createModification(modPeptideID, aminoAcidMass.getPosition(),
aminoAcidMass.getMass());
}
private void createIdentifiedProtein(long proteinID, Set<String> peptideSequences,
Long databaseID, ProteinAnnotation annotation, boolean primary)
{
......@@ -380,4 +445,16 @@ class ResultDataSetUploader extends AbstractHandler
}
throw new UserFailureException("Missing Protein Prophet details.");
}
protected Sample getOrCreateSample(Experiment experiment, String samplePermID)
{
Sample sample = dao.tryToGetSampleByPermID(samplePermID);
if (sample == null)
{
sample = new Sample();
sample.setPermID(samplePermID);
sample.setId(dao.createSample(experiment.getId(), samplePermID));
}
return sample;
}
}
......@@ -48,6 +48,27 @@ public class AminoAcidMass
this.mass = mass;
}
@Override
public boolean equals(Object obj)
{
if (obj == this)
{
return true;
}
if (obj instanceof AminoAcidMass == false)
{
return false;
}
AminoAcidMass that = (AminoAcidMass) obj;
return this.position == that.position && this.mass == that.mass;
}
@Override
public int hashCode()
{
return (int) (37 * position + mass);
}
@Override
public String toString()
{
......
......@@ -38,6 +38,7 @@ public class Peptide
private int charge;
private double initialProbability;
private double weight;
private List<Parameter> parameters = new ArrayList<Parameter>();
private List<PeptideModification> modifications = new ArrayList<PeptideModification>();
@XmlAttribute(name = "peptide_sequence", required = true)
......@@ -95,6 +96,17 @@ public class Peptide
this.modifications = modifications;
}
@XmlElement(name = "parameter", namespace = Constants.NAMESPACE)
public final List<Parameter> getParameters()
{
return parameters;
}
public final void setParameters(List<Parameter> parameters)
{
this.parameters = parameters;
}
@Override
public String toString()
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment