diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/ResultDataSetUploader.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/ResultDataSetUploader.java index f1dab90537912830a7cb38ee7efb55c6db4d58e2..6fd8124b255111c2814e3237da66b3fb1f82f0cb 100644 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/ResultDataSetUploader.java +++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/ResultDataSetUploader.java @@ -48,12 +48,15 @@ import ch.systemsx.cisd.openbis.etlserver.phosphonetx.dto.Sequence; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Group; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.GroupIdentifier; +import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.ProbabilityToFDRCalculator; /** * @author Franz-Josef Elmer */ class ResultDataSetUploader extends AbstractHandler { + private static final double MAX_FALSE_DISCOVERY_RATE = 0.1; + static final String PARAMETER_TYPE_ABUNDANCE = "abundance"; private final Connection connection; @@ -214,7 +217,7 @@ class ResultDataSetUploader extends AbstractHandler Long databaseID = dataSet.getDatabaseID(); AbundanceHandler abundanceHandler = new AbundanceHandler(openbisService, dao, groupIdentifier, experiment); - createProbabilityToFDRMapping(dataSetID, summary); + ProbabilityToFDRCalculator calculator = createProbabilityToFDRMapping(dataSetID, summary); List<ProteinGroup> proteinGroups = summary.getProteinGroups(); for (ProteinGroup proteinGroup : proteinGroups) { @@ -225,7 +228,10 @@ class ResultDataSetUploader extends AbstractHandler Protein protein = proteins.get(0); try { - addProtein(protein, dataSetID, databaseID, abundanceHandler); + if (calculator.calculateFDR(protein.getProbability()) <= MAX_FALSE_DISCOVERY_RATE) + { + addProtein(protein, dataSetID, databaseID, abundanceHandler); + } } catch (Exception e) { logException(e, "protein", protein.getName()); @@ -354,8 +360,9 @@ class ResultDataSetUploader extends AbstractHandler return null; } - private void createProbabilityToFDRMapping(long dataSetID, ProteinSummary summary) + private ProbabilityToFDRCalculator createProbabilityToFDRMapping(long dataSetID, ProteinSummary summary) { + ProbabilityToFDRCalculator calculator = new ProbabilityToFDRCalculator(); Object[] s = summary.getSummaryHeader().getProgramDetails().getSummary(); if (s != null) { @@ -369,9 +376,10 @@ class ResultDataSetUploader extends AbstractHandler { double probability = proteinSummaryDataFilter.getMinProbability(); double fdr = proteinSummaryDataFilter.getFalsePositiveErrorRate(); + calculator.add(probability, fdr); dao.createProbabilityToFDRMapping(dataSetID, probability, fdr); } - return; + return calculator; } } } diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/server/business/ErrorModel.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/server/business/ErrorModel.java index f56b067d2a5c5790ea1ff38cd26b6519bb143a47..8e0db8c265559f615adf2de9049d657fd69bb51f 100644 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/server/business/ErrorModel.java +++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/server/business/ErrorModel.java @@ -16,16 +16,14 @@ package ch.systemsx.cisd.openbis.plugin.phosphonetx.server.business; -import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import net.lemnik.eodsql.DataSet; import ch.systemsx.cisd.openbis.plugin.phosphonetx.server.dataaccess.IPhosphoNetXDAOFactory; import ch.systemsx.cisd.openbis.plugin.phosphonetx.server.dataaccess.IProteinQueryDAO; +import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.ProbabilityToFDRCalculator; import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.dto.IdentifiedProtein; import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.dto.ProbabilityFDRMapping; import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.dto.ProteinReferenceWithProbability; @@ -35,63 +33,6 @@ import ch.systemsx.cisd.openbis.plugin.phosphonetx.shared.dto.ProteinReferenceWi */ class ErrorModel { - private static final class ProbabilityToFDRCalculator - { - private static final class MappingEntry implements Comparable<MappingEntry> - { - private final double probability; - - private final double fdr; - - MappingEntry(double probability, double fdr) - { - this.probability = probability; - this.fdr = fdr; - } - - public int compareTo(MappingEntry that) - { - return probability < that.probability ? -1 : (probability > that.probability ? 1 - : 0); - } - - @Override - public String toString() - { - return probability + " = " + fdr; - } - } - - private final List<MappingEntry> mappingEntries = new ArrayList<MappingEntry>(); - - void add(double probability, double falseDiscoveryRate) - { - mappingEntries.add(new MappingEntry(probability, falseDiscoveryRate)); - } - - void init() - { - Collections.sort(mappingEntries); - } - - double calculateFDR(double probability) - { - int index = Collections.binarySearch(mappingEntries, new MappingEntry(probability, 0)); - if (index >= 0) - { - return mappingEntries.get(index).fdr; - } - // calculate by linear interpolation - int index1 = -index - 1; - int index0 = index1 - 1; - assert index0 >= 0; - MappingEntry m0 = mappingEntries.get(index0); - MappingEntry m1 = mappingEntries.get(index1); - double scale = (m1.fdr - m0.fdr) / (m1.probability - m0.probability); - return m0.fdr + scale * (probability - m0.probability); - } - } - private final Map<Long, ProbabilityToFDRCalculator> calculators = new HashMap<Long, ProbabilityToFDRCalculator>(); diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/shared/ProbabilityToFDRCalculator.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/shared/ProbabilityToFDRCalculator.java new file mode 100644 index 0000000000000000000000000000000000000000..c443ae58ae2754f332fdaa69ee8b13264deec49c --- /dev/null +++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/shared/ProbabilityToFDRCalculator.java @@ -0,0 +1,79 @@ +/* + * Copyright 2009 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.plugin.phosphonetx.shared; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + + +public final class ProbabilityToFDRCalculator +{ + private static final class MappingEntry implements Comparable<ProbabilityToFDRCalculator.MappingEntry> + { + private final double probability; + + private final double fdr; + + MappingEntry(double probability, double fdr) + { + this.probability = probability; + this.fdr = fdr; + } + + public int compareTo(ProbabilityToFDRCalculator.MappingEntry that) + { + return probability < that.probability ? -1 : (probability > that.probability ? 1 + : 0); + } + + @Override + public String toString() + { + return probability + " = " + fdr; + } + } + + private final List<ProbabilityToFDRCalculator.MappingEntry> mappingEntries = new ArrayList<ProbabilityToFDRCalculator.MappingEntry>(); + + public void add(double probability, double falseDiscoveryRate) + { + mappingEntries.add(new MappingEntry(probability, falseDiscoveryRate)); + } + + public void init() + { + Collections.sort(mappingEntries); + } + + public double calculateFDR(double probability) + { + int index = Collections.binarySearch(mappingEntries, new MappingEntry(probability, 0)); + if (index >= 0) + { + return mappingEntries.get(index).fdr; + } + // calculate by linear interpolation + int index1 = -index - 1; + int index0 = index1 - 1; + assert index0 >= 0; + ProbabilityToFDRCalculator.MappingEntry m0 = mappingEntries.get(index0); + ProbabilityToFDRCalculator.MappingEntry m1 = mappingEntries.get(index1); + double scale = (m1.fdr - m0.fdr) / (m1.probability - m0.probability); + return m0.fdr + scale * (probability - m0.probability); + } +} \ No newline at end of file