From 69e3f4ea65a32107d7f6d52b60413b2277616398 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Mon, 13 Jun 2022 19:05:47 -0700 Subject: [PATCH 1/9] GIssue 550 - display replicates in sequence coverage map view --- src/org/labkey/targetedms/TargetedMSController.java | 10 +++++++++- src/org/labkey/targetedms/parser/Replicate.java | 12 ++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/org/labkey/targetedms/TargetedMSController.java b/src/org/labkey/targetedms/TargetedMSController.java index a015d424c..f51289290 100644 --- a/src/org/labkey/targetedms/TargetedMSController.java +++ b/src/org/labkey/targetedms/TargetedMSController.java @@ -4894,9 +4894,17 @@ public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, Targe { int seqId = group.getSequenceId().intValue(); List peptideCharacteristics = new ArrayList<>(PeptideManager.getPeptideCharacteristic(group.getId())); + List replicates = ReplicateManager.getReplicatesForRun(run.getRunId()); + List msReplicates = new ArrayList<>(); + replicates.forEach(replicate -> { + var rep = new org.labkey.api.ms.Replicate(); + rep.setName(replicate.getName()); + rep.setId(replicate.getId()); + msReplicates.add(rep); + }); ProteinService proteinService = ProteinService.get(); - WebPartView sequenceView = proteinService.getProteinCoverageView(seqId, peptideCharacteristics, 100, true, group.getAccession()); + WebPartView sequenceView = proteinService.getProteinCoverageViewWithSettings(seqId, peptideCharacteristics, msReplicates, 100, true, group.getAccession()); sequenceView.setTitle("Sequence Coverage"); sequenceView.enableExpandCollapse("SequenceCoverage", false); diff --git a/src/org/labkey/targetedms/parser/Replicate.java b/src/org/labkey/targetedms/parser/Replicate.java index aa052f3a8..cc01feb67 100644 --- a/src/org/labkey/targetedms/parser/Replicate.java +++ b/src/org/labkey/targetedms/parser/Replicate.java @@ -23,6 +23,7 @@ */ public class Replicate extends AnnotatedEntity { + private long _id; private long _runId; private String _name; @@ -36,6 +37,17 @@ public class Replicate extends AnnotatedEntity private List _sampleFileList; + @Override + public long getId() + { + return _id; + } + + @Override + public void setId(long id) + { + _id = id; + } public long getRunId() { From 088d62442ddb529ecc9acb74d2e0373123d3116e Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Wed, 15 Jun 2022 18:27:36 -0700 Subject: [PATCH 2/9] Update intensity and cscore values with replicate selection --- .../targetedms/TargetedMSController.java | 16 +++++++++++++--- .../passport/PassportController.java | 2 +- .../targetedms/query/PeptideManager.java | 19 +++++++++++++++++-- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/org/labkey/targetedms/TargetedMSController.java b/src/org/labkey/targetedms/TargetedMSController.java index f51289290..8c61395f2 100644 --- a/src/org/labkey/targetedms/TargetedMSController.java +++ b/src/org/labkey/targetedms/TargetedMSController.java @@ -2384,6 +2384,7 @@ public static class ChromatogramForm extends AbstractChartForm private boolean _update; private Long _chromInfoId; private Long _highlightChromInfoId; + private long _replicateId; public ChromatogramForm() { @@ -2400,6 +2401,15 @@ public void setId(long id) _id = id; } + public long getReplicateId() + { + return _replicateId; + } + + public void setReplicateId(long replicateId) + { + _replicateId = replicateId; + } public String getReplicatesFilter() { @@ -4746,7 +4756,7 @@ public ModelAndView getView(final ChromatogramForm form, BindException errors) // Peptide group details VBox result = new VBox(); - Integer peptideCount = addProteinSummaryViews(result, group, _run, getUser(), getContainer()); + Integer peptideCount = addProteinSummaryViews(result, group, _run, form.getReplicateId()); GroupChromatogramsTableInfo tableInfo = new GroupChromatogramsTableInfo(new TargetedMSSchema(getUser(), getContainer()), form); ChromatogramsDataRegion chromatogramRegion = new ChromatogramsDataRegion(getViewContext(), tableInfo, @@ -4879,7 +4889,7 @@ private QueryView createViewWithNoContainerFilterOptions(QuerySettings settings, return result; } - public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, TargetedMSRun run, User user, Container container) + public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, TargetedMSRun run, @Nullable Long replicateId) { Integer peptideCount = TargetedMSManager.getPeptideGroupPeptideCount(run, group.getId()); boolean proteomics = peptideCount != null && peptideCount.intValue() > 0; @@ -4893,7 +4903,7 @@ public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, Targe if (group.getSequenceId() != null) { int seqId = group.getSequenceId().intValue(); - List peptideCharacteristics = new ArrayList<>(PeptideManager.getPeptideCharacteristic(group.getId())); + List peptideCharacteristics = new ArrayList<>(PeptideManager.getPeptideCharacteristic(group.getId(), replicateId)); List replicates = ReplicateManager.getReplicatesForRun(run.getRunId()); List msReplicates = new ArrayList<>(); replicates.forEach(replicate -> { diff --git a/src/org/labkey/targetedms/passport/PassportController.java b/src/org/labkey/targetedms/passport/PassportController.java index 0c1a2e90f..bb13a1abd 100644 --- a/src/org/labkey/targetedms/passport/PassportController.java +++ b/src/org/labkey/targetedms/passport/PassportController.java @@ -149,7 +149,7 @@ public ModelAndView getView(ProteinForm form, BindException errors) throws IOExc VBox result = new VBox(); PeptideGroup group = PeptideGroupManager.getPeptideGroup(getContainer(), _protein.getPepGroupId()); _run = TargetedMSManager.getRun(group.getRunId()); - TargetedMSController.addProteinSummaryViews(result, group, _run, getUser(), getContainer()); + TargetedMSController.addProteinSummaryViews(result, group, _run, null); if (beforeAfter) { diff --git a/src/org/labkey/targetedms/query/PeptideManager.java b/src/org/labkey/targetedms/query/PeptideManager.java index d4159d88c..31788af85 100644 --- a/src/org/labkey/targetedms/query/PeptideManager.java +++ b/src/org/labkey/targetedms/query/PeptideManager.java @@ -15,6 +15,7 @@ package org.labkey.targetedms.query; +import org.jetbrains.annotations.Nullable; import org.labkey.api.cache.CacheLoader; import org.labkey.api.cache.CacheManager; import org.labkey.api.data.Container; @@ -28,6 +29,7 @@ import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.Set; /** @@ -94,11 +96,11 @@ public static Collection getPeptidesForGroup(long peptideGroupId) return new SqlSelector(TargetedMSManager.getSchema(), sql).getArrayList(Peptide.class); } - public static List getPeptideCharacteristic(long peptideGroupId) + public static List getPeptideCharacteristic(long peptideGroupId, @Nullable Long replicateId) { var sqlDialect = TargetedMSManager.getSqlDialect(); var pgLog10Intensity = "LOG(" + sqlDialect.getNumericCast(new SQLFragment("MAX(X.Intensity)")).getSQL() + ")"; - var sqlServerLog10Intensity = "LOG10(MAX(X.Intensity))"; + var sqlServerLog10Intensity = "CASE WHEN MAX(X.Intensity) IS NOT NULL AND MAX(X.Intensity) != 0 THEN LOG10(MAX(X.Intensity)) ELSE 0 END "; var pgConfidenceValueToRound = "-LOG(" + sqlDialect.getNumericCast(new SQLFragment("MAX(X.Confidence)")).getSQL() + ")"; var pgLog10Confidence = "ROUND(" + sqlDialect.getNumericCast(new SQLFragment(pgConfidenceValueToRound)).getSQL() + ",4)"; var sqlServerLog10Confidence = "ROUND(-LOG10(MAX(X.Confidence)),4)"; @@ -115,10 +117,23 @@ public static List getPeptideCharacteristic(long peptideG sql.append(" ON gm.id = pep.Id"); sql.append(" INNER JOIN ").append(TargetedMSManager.getTableInfoSampleFile(), "sf"); sql.append(" ON sf.Id = pci.SampleFileId"); + if (!Objects.equals(replicateId, Long.valueOf(0))) + { + sql.append(" INNER JOIN ").append(TargetedMSManager.getTableInfoReplicate(), "rep"); + sql.append(" ON rep.Id = sf.ReplicateId"); + } sql.append(" WHERE gm.PeptideGroupId=? "); + if (!Objects.equals(replicateId, Long.valueOf(0))) + { + sql.append(" AND rep.Id=? "); + } sql.append(" GROUP BY pep.Sequence,pci.SampleFileId ) X "); sql.append(" GROUP BY X.Sequence"); sql.add(peptideGroupId); + if (!Objects.equals(replicateId, Long.valueOf(0))) + { + sql.add(replicateId); + } return new SqlSelector(TargetedMSManager.getSchema(), sql).getArrayList(PeptideCharacteristic.class); } From ce6e36d610d9c2fb06ac928787a26be9ebf67d78 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Mon, 20 Jun 2022 17:45:04 -0700 Subject: [PATCH 3/9] handle null values in intensity, display confidence rank --- src/org/labkey/targetedms/TargetedMSController.java | 2 +- src/org/labkey/targetedms/query/PeptideManager.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/org/labkey/targetedms/TargetedMSController.java b/src/org/labkey/targetedms/TargetedMSController.java index 8c61395f2..32b19572a 100644 --- a/src/org/labkey/targetedms/TargetedMSController.java +++ b/src/org/labkey/targetedms/TargetedMSController.java @@ -4914,7 +4914,7 @@ public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, Targe }); ProteinService proteinService = ProteinService.get(); - WebPartView sequenceView = proteinService.getProteinCoverageViewWithSettings(seqId, peptideCharacteristics, msReplicates, 100, true, group.getAccession()); + WebPartView sequenceView = proteinService.getProteinCoverageViewWithSettings(seqId, peptideCharacteristics, 100, true, group.getAccession(), msReplicates); sequenceView.setTitle("Sequence Coverage"); sequenceView.enableExpandCollapse("SequenceCoverage", false); diff --git a/src/org/labkey/targetedms/query/PeptideManager.java b/src/org/labkey/targetedms/query/PeptideManager.java index 31788af85..a7154e8d3 100644 --- a/src/org/labkey/targetedms/query/PeptideManager.java +++ b/src/org/labkey/targetedms/query/PeptideManager.java @@ -107,7 +107,9 @@ public static List getPeptideCharacteristic(long peptideG var log10IntensitySql = sqlDialect.isPostgreSQL() ? pgLog10Intensity : sqlServerLog10Intensity; var log10ConfidenceSql = sqlDialect.isPostgreSQL() ? pgLog10Confidence : sqlServerLog10Confidence; SQLFragment sql = new SQLFragment("SELECT X.Sequence, " + log10IntensitySql + " AS Intensity, " + log10ConfidenceSql + " AS Confidence FROM "); - sql.append("(SELECT pep.Sequence, SUM(TotalArea) AS Intensity, MAX(qvalue) AS Confidence FROM "); + sql.append("(SELECT pep.Sequence,"); + sql.append(" CASE WHEN SUM(TotalArea) IS NULL OR SUM(TotalArea) < 1 THEN 1 ELSE SUM(TotalArea) END AS Intensity, "); + sql.append(" MAX(qvalue) AS Confidence FROM "); sql.append(TargetedMSManager.getTableInfoPrecursorChromInfo(), "pci"); sql.append(" INNER JOIN ").append(TargetedMSManager.getTableInfoGeneralPrecursor(), "p"); sql.append(" ON p.Id = pci.PrecursorId"); From 5e76e9584f1ce35878dec57910612d20c600a33c Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Sun, 26 Jun 2022 18:48:23 -0700 Subject: [PATCH 4/9] stacked peptide forms --- .../targetedms/TargetedMSController.java | 25 ++++++++-- .../passport/PassportController.java | 2 +- .../targetedms/query/PeptideManager.java | 46 ++++++++++++++++++- 3 files changed, 67 insertions(+), 6 deletions(-) diff --git a/src/org/labkey/targetedms/TargetedMSController.java b/src/org/labkey/targetedms/TargetedMSController.java index 50f5c6268..1fb602401 100644 --- a/src/org/labkey/targetedms/TargetedMSController.java +++ b/src/org/labkey/targetedms/TargetedMSController.java @@ -249,6 +249,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; @@ -2385,6 +2386,7 @@ public static class ChromatogramForm extends AbstractChartForm private Long _chromInfoId; private Long _highlightChromInfoId; private long _replicateId; + private String _peptideForm; public ChromatogramForm() { @@ -2596,6 +2598,16 @@ public void setChromInfoId(Long chromInfoId) { _chromInfoId = chromInfoId; } + + public String getPeptideForm() + { + return _peptideForm; + } + + public void setPeptideForm(String peptideForm) + { + _peptideForm = Objects.requireNonNullElse(peptideForm, "combined"); + } } @@ -4756,7 +4768,7 @@ public ModelAndView getView(final ChromatogramForm form, BindException errors) // Peptide group details VBox result = new VBox(); - Integer peptideCount = addProteinSummaryViews(result, group, _run, form.getReplicateId()); + Integer peptideCount = addProteinSummaryViews(result, group, _run, form.getReplicateId(), form._peptideForm.equalsIgnoreCase("stacked")); GroupChromatogramsTableInfo tableInfo = new GroupChromatogramsTableInfo(new TargetedMSSchema(getUser(), getContainer()), form); ChromatogramsDataRegion chromatogramRegion = new ChromatogramsDataRegion(getViewContext(), tableInfo, @@ -4889,7 +4901,7 @@ private QueryView createViewWithNoContainerFilterOptions(QuerySettings settings, return result; } - public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, TargetedMSRun run, @Nullable Long replicateId) + public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, TargetedMSRun run, @Nullable Long replicateId, boolean showModifiedPeptides) { Integer peptideCount = TargetedMSManager.getPeptideGroupPeptideCount(run, group.getId()); boolean proteomics = peptideCount != null && peptideCount.intValue() > 0; @@ -4903,7 +4915,12 @@ public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, Targe if (group.getSequenceId() != null) { int seqId = group.getSequenceId().intValue(); - List peptideCharacteristics = new ArrayList<>(PeptideManager.getPeptideCharacteristic(group.getId(), replicateId)); + List combinedPeptideCharacteristics = new ArrayList<>(PeptideManager.getCombinedPeptideCharacteristics(group.getId(), replicateId)); + List modifiedPeptideCharacteristics = Collections.emptyList(); + if (showModifiedPeptides) + { + modifiedPeptideCharacteristics = new ArrayList<>(PeptideManager.getModifiedPeptideCharacteristics(group.getId(), replicateId)); + } List replicates = ReplicateManager.getReplicatesForRun(run.getRunId()); List msReplicates = new ArrayList<>(); replicates.forEach(replicate -> { @@ -4914,7 +4931,7 @@ public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, Targe }); ProteinService proteinService = ProteinService.get(); - WebPartView sequenceView = proteinService.getProteinCoverageViewWithSettings(seqId, peptideCharacteristics, 100, true, group.getAccession(), msReplicates); + WebPartView sequenceView = proteinService.getProteinCoverageViewWithSettings(seqId, combinedPeptideCharacteristics, 100, true, group.getAccession(), msReplicates, modifiedPeptideCharacteristics); sequenceView.setTitle("Sequence Coverage"); sequenceView.enableExpandCollapse("SequenceCoverage", false); diff --git a/src/org/labkey/targetedms/passport/PassportController.java b/src/org/labkey/targetedms/passport/PassportController.java index bb13a1abd..c9b561a83 100644 --- a/src/org/labkey/targetedms/passport/PassportController.java +++ b/src/org/labkey/targetedms/passport/PassportController.java @@ -149,7 +149,7 @@ public ModelAndView getView(ProteinForm form, BindException errors) throws IOExc VBox result = new VBox(); PeptideGroup group = PeptideGroupManager.getPeptideGroup(getContainer(), _protein.getPepGroupId()); _run = TargetedMSManager.getRun(group.getRunId()); - TargetedMSController.addProteinSummaryViews(result, group, _run, null); + TargetedMSController.addProteinSummaryViews(result, group, _run, null, false); if (beforeAfter) { diff --git a/src/org/labkey/targetedms/query/PeptideManager.java b/src/org/labkey/targetedms/query/PeptideManager.java index a7154e8d3..135f683ee 100644 --- a/src/org/labkey/targetedms/query/PeptideManager.java +++ b/src/org/labkey/targetedms/query/PeptideManager.java @@ -96,7 +96,7 @@ public static Collection getPeptidesForGroup(long peptideGroupId) return new SqlSelector(TargetedMSManager.getSchema(), sql).getArrayList(Peptide.class); } - public static List getPeptideCharacteristic(long peptideGroupId, @Nullable Long replicateId) + public static List getCombinedPeptideCharacteristics(long peptideGroupId, @Nullable Long replicateId) { var sqlDialect = TargetedMSManager.getSqlDialect(); var pgLog10Intensity = "LOG(" + sqlDialect.getNumericCast(new SQLFragment("MAX(X.Intensity)")).getSQL() + ")"; @@ -139,6 +139,50 @@ public static List getPeptideCharacteristic(long peptideG return new SqlSelector(TargetedMSManager.getSchema(), sql).getArrayList(PeptideCharacteristic.class); } + public static List getModifiedPeptideCharacteristics(long peptideGroupId, @Nullable Long replicateId) + { + var sqlDialect = TargetedMSManager.getSqlDialect(); + var pgLog10Intensity = "LOG(" + sqlDialect.getNumericCast(new SQLFragment("MAX(X.Intensity)")).getSQL() + ")"; + var sqlServerLog10Intensity = "CASE WHEN MAX(X.Intensity) IS NOT NULL AND MAX(X.Intensity) != 0 THEN LOG10(MAX(X.Intensity)) ELSE 0 END "; + var pgConfidenceValueToRound = "-LOG(" + sqlDialect.getNumericCast(new SQLFragment("MAX(X.Confidence)")).getSQL() + ")"; + var pgLog10Confidence = "ROUND(" + sqlDialect.getNumericCast(new SQLFragment(pgConfidenceValueToRound)).getSQL() + ",4)"; + var sqlServerLog10Confidence = "ROUND(-LOG10(MAX(X.Confidence)),4)"; + var log10IntensitySql = sqlDialect.isPostgreSQL() ? pgLog10Intensity : sqlServerLog10Intensity; + var log10ConfidenceSql = sqlDialect.isPostgreSQL() ? pgLog10Confidence : sqlServerLog10Confidence; + SQLFragment sql = new SQLFragment("SELECT X.Sequence, X.PeptideModifiedSequence AS ModifiedSequence, X.StartIndex, X.EndIndex ,"); + sql.append(log10IntensitySql + " AS Intensity, " + log10ConfidenceSql + " AS Confidence FROM "); + sql.append("(SELECT pep.Sequence, pep.PeptideModifiedSequence, pep.StartIndex, pep.EndIndex, "); + sql.append(" CASE WHEN SUM(TotalArea) IS NULL OR SUM(TotalArea) < 1 THEN 1 ELSE SUM(TotalArea) END AS Intensity, "); + sql.append(" MAX(qvalue) AS Confidence FROM "); + sql.append(TargetedMSManager.getTableInfoPrecursorChromInfo(), "pci"); + sql.append(" INNER JOIN ").append(TargetedMSManager.getTableInfoGeneralPrecursor(), "p"); + sql.append(" ON p.Id = pci.PrecursorId"); + sql.append(" INNER JOIN ").append(TargetedMSManager.getTableInfoPeptide(),"pep"); + sql.append(" ON p.GeneralMoleculeId = pep.Id"); + sql.append(" INNER JOIN ").append(TargetedMSManager.getTableInfoGeneralMolecule(),"gm"); + sql.append(" ON gm.id = pep.Id"); + sql.append(" INNER JOIN ").append(TargetedMSManager.getTableInfoSampleFile(), "sf"); + sql.append(" ON sf.Id = pci.SampleFileId"); + if (!Objects.equals(replicateId, Long.valueOf(0))) + { + sql.append(" INNER JOIN ").append(TargetedMSManager.getTableInfoReplicate(), "rep"); + sql.append(" ON rep.Id = sf.ReplicateId"); + } + sql.append(" WHERE gm.PeptideGroupId=? "); + if (!Objects.equals(replicateId, Long.valueOf(0))) + { + sql.append(" AND rep.Id=? "); + } + sql.append(" GROUP BY pep.Sequence,pci.SampleFileId, pep.PeptideModifiedSequence, pep.StartIndex, pep.EndIndex ) X "); + sql.append(" GROUP BY X.Sequence, X.PeptideModifiedSequence, X.StartIndex, X.EndIndex "); + sql.add(peptideGroupId); + if (!Objects.equals(replicateId, Long.valueOf(0))) + { + sql.add(replicateId); + } + return new SqlSelector(TargetedMSManager.getSchema(), sql).getArrayList(PeptideCharacteristic.class); + } + public static Double getMinRetentionTime(long peptideId) { SQLFragment sql = new SQLFragment("SELECT MIN(preci.MinStartTime) FROM "); From c66aaac0160dcfd682e052ca6d301ef480fc14c7 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Sun, 26 Jun 2022 19:37:48 -0700 Subject: [PATCH 5/9] fix for single peptide --- src/org/labkey/targetedms/TargetedMSController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/org/labkey/targetedms/TargetedMSController.java b/src/org/labkey/targetedms/TargetedMSController.java index 1fb602401..fc29b54af 100644 --- a/src/org/labkey/targetedms/TargetedMSController.java +++ b/src/org/labkey/targetedms/TargetedMSController.java @@ -4768,7 +4768,8 @@ public ModelAndView getView(final ChromatogramForm form, BindException errors) // Peptide group details VBox result = new VBox(); - Integer peptideCount = addProteinSummaryViews(result, group, _run, form.getReplicateId(), form._peptideForm.equalsIgnoreCase("stacked")); + var showModifiedPeptides = form._peptideForm != null && form._peptideForm.equalsIgnoreCase("stacked"); + Integer peptideCount = addProteinSummaryViews(result, group, _run, form.getReplicateId(), showModifiedPeptides); GroupChromatogramsTableInfo tableInfo = new GroupChromatogramsTableInfo(new TargetedMSSchema(getUser(), getContainer()), form); ChromatogramsDataRegion chromatogramRegion = new ChromatogramsDataRegion(getViewContext(), tableInfo, From 459a99db4da327fe3d7aac782ae6d49ba1e054d0 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Mon, 27 Jun 2022 15:05:45 -0700 Subject: [PATCH 6/9] finish peptide details --- src/org/labkey/targetedms/query/PeptideManager.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/org/labkey/targetedms/query/PeptideManager.java b/src/org/labkey/targetedms/query/PeptideManager.java index 135f683ee..67edd3054 100644 --- a/src/org/labkey/targetedms/query/PeptideManager.java +++ b/src/org/labkey/targetedms/query/PeptideManager.java @@ -106,8 +106,9 @@ public static List getCombinedPeptideCharacteristics(long var sqlServerLog10Confidence = "ROUND(-LOG10(MAX(X.Confidence)),4)"; var log10IntensitySql = sqlDialect.isPostgreSQL() ? pgLog10Intensity : sqlServerLog10Intensity; var log10ConfidenceSql = sqlDialect.isPostgreSQL() ? pgLog10Confidence : sqlServerLog10Confidence; - SQLFragment sql = new SQLFragment("SELECT X.Sequence, " + log10IntensitySql + " AS Intensity, " + log10ConfidenceSql + " AS Confidence FROM "); - sql.append("(SELECT pep.Sequence,"); + SQLFragment sql = new SQLFragment("SELECT X.Sequence, " + log10IntensitySql + " AS Intensity, " + log10ConfidenceSql + " AS Confidence, "); + sql.append(" MAX(X.Intensity) AS RawIntensity, MAX(X.Confidence) AS RawConfidence, X.StartIndex, X.EndIndex FROM "); + sql.append("(SELECT pep.Sequence, pep.StartIndex, pep.EndIndex, "); sql.append(" CASE WHEN SUM(TotalArea) IS NULL OR SUM(TotalArea) < 1 THEN 1 ELSE SUM(TotalArea) END AS Intensity, "); sql.append(" MAX(qvalue) AS Confidence FROM "); sql.append(TargetedMSManager.getTableInfoPrecursorChromInfo(), "pci"); @@ -129,8 +130,8 @@ public static List getCombinedPeptideCharacteristics(long { sql.append(" AND rep.Id=? "); } - sql.append(" GROUP BY pep.Sequence,pci.SampleFileId ) X "); - sql.append(" GROUP BY X.Sequence"); + sql.append(" GROUP BY pep.Sequence,pci.SampleFileId, pep.StartIndex, pep.EndIndex ) X "); + sql.append(" GROUP BY X.Sequence, X.StartIndex, X.EndIndex "); sql.add(peptideGroupId); if (!Objects.equals(replicateId, Long.valueOf(0))) { @@ -150,7 +151,8 @@ public static List getModifiedPeptideCharacteristics(long var log10IntensitySql = sqlDialect.isPostgreSQL() ? pgLog10Intensity : sqlServerLog10Intensity; var log10ConfidenceSql = sqlDialect.isPostgreSQL() ? pgLog10Confidence : sqlServerLog10Confidence; SQLFragment sql = new SQLFragment("SELECT X.Sequence, X.PeptideModifiedSequence AS ModifiedSequence, X.StartIndex, X.EndIndex ,"); - sql.append(log10IntensitySql + " AS Intensity, " + log10ConfidenceSql + " AS Confidence FROM "); + sql.append(log10IntensitySql + " AS Intensity, " + log10ConfidenceSql + " AS Confidence, "); + sql.append(" MAX(X.Intensity) AS RawIntensity, MAX(X.Confidence) AS RawConfidence FROM "); sql.append("(SELECT pep.Sequence, pep.PeptideModifiedSequence, pep.StartIndex, pep.EndIndex, "); sql.append(" CASE WHEN SUM(TotalArea) IS NULL OR SUM(TotalArea) < 1 THEN 1 ELSE SUM(TotalArea) END AS Intensity, "); sql.append(" MAX(qvalue) AS Confidence FROM "); From 7daacc2f6592ffff231cc216f1534c28dd8a1970 Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Sat, 2 Jul 2022 19:49:31 -0700 Subject: [PATCH 7/9] code review feedback changes --- src/org/labkey/targetedms/TargetedMSController.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/org/labkey/targetedms/TargetedMSController.java b/src/org/labkey/targetedms/TargetedMSController.java index fc29b54af..356d4dc15 100644 --- a/src/org/labkey/targetedms/TargetedMSController.java +++ b/src/org/labkey/targetedms/TargetedMSController.java @@ -4917,11 +4917,8 @@ public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, Targe { int seqId = group.getSequenceId().intValue(); List combinedPeptideCharacteristics = new ArrayList<>(PeptideManager.getCombinedPeptideCharacteristics(group.getId(), replicateId)); - List modifiedPeptideCharacteristics = Collections.emptyList(); - if (showModifiedPeptides) - { - modifiedPeptideCharacteristics = new ArrayList<>(PeptideManager.getModifiedPeptideCharacteristics(group.getId(), replicateId)); - } + List modifiedPeptideCharacteristics = new ArrayList<>(PeptideManager.getModifiedPeptideCharacteristics(group.getId(), replicateId));; + List replicates = ReplicateManager.getReplicatesForRun(run.getRunId()); List msReplicates = new ArrayList<>(); replicates.forEach(replicate -> { From fffa1475685b845665dd387c7ee286065965098e Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Sun, 3 Jul 2022 12:30:59 -0700 Subject: [PATCH 8/9] display modifier table in peptide details in combined peptides --- src/org/labkey/targetedms/TargetedMSController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/org/labkey/targetedms/TargetedMSController.java b/src/org/labkey/targetedms/TargetedMSController.java index 73df051d3..ddad78d6e 100644 --- a/src/org/labkey/targetedms/TargetedMSController.java +++ b/src/org/labkey/targetedms/TargetedMSController.java @@ -4768,8 +4768,8 @@ public ModelAndView getView(final ChromatogramForm form, BindException errors) // Peptide group details VBox result = new VBox(); - var showModifiedPeptides = form._peptideForm != null && form._peptideForm.equalsIgnoreCase("stacked"); - Integer peptideCount = addProteinSummaryViews(result, group, _run, form.getReplicateId(), showModifiedPeptides); + var showStackedPeptides = form._peptideForm != null && form._peptideForm.equalsIgnoreCase("stacked"); + Integer peptideCount = addProteinSummaryViews(result, group, _run, form.getReplicateId(), showStackedPeptides); GroupChromatogramsTableInfo tableInfo = new GroupChromatogramsTableInfo(new TargetedMSSchema(getUser(), getContainer()), form); ChromatogramsDataRegion chromatogramRegion = new ChromatogramsDataRegion(getViewContext(), tableInfo, @@ -4902,7 +4902,7 @@ private QueryView createViewWithNoContainerFilterOptions(QuerySettings settings, return result; } - public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, TargetedMSRun run, @Nullable Long replicateId, boolean showModifiedPeptides) + public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, TargetedMSRun run, @Nullable Long replicateId, boolean showStackedPeptides) { Integer peptideCount = TargetedMSManager.getPeptideGroupPeptideCount(run, group.getId()); boolean proteomics = peptideCount != null && peptideCount.intValue() > 0; @@ -4929,7 +4929,7 @@ public static Integer addProteinSummaryViews(VBox box, PeptideGroup group, Targe }); ProteinService proteinService = ProteinService.get(); - WebPartView sequenceView = proteinService.getProteinCoverageViewWithSettings(seqId, combinedPeptideCharacteristics, 100, true, group.getAccession(), msReplicates, modifiedPeptideCharacteristics); + WebPartView sequenceView = proteinService.getProteinCoverageViewWithSettings(seqId, combinedPeptideCharacteristics, 100, true, group.getAccession(), msReplicates, modifiedPeptideCharacteristics, showStackedPeptides); sequenceView.setTitle("Sequence Coverage"); sequenceView.enableExpandCollapse("SequenceCoverage", false); From eb43fda92d961067f5914d972bb0dae051d3612b Mon Sep 17 00:00:00 2001 From: ankurjuneja Date: Mon, 4 Jul 2022 16:48:26 -0700 Subject: [PATCH 9/9] code review changes --- .../targetedms/TargetedMSController.java | 2 +- .../targetedms/query/PeptideManager.java | 61 ++++++++++--------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/org/labkey/targetedms/TargetedMSController.java b/src/org/labkey/targetedms/TargetedMSController.java index ddad78d6e..e9931da2d 100644 --- a/src/org/labkey/targetedms/TargetedMSController.java +++ b/src/org/labkey/targetedms/TargetedMSController.java @@ -2606,7 +2606,7 @@ public String getPeptideForm() public void setPeptideForm(String peptideForm) { - _peptideForm = Objects.requireNonNullElse(peptideForm, "combined"); + _peptideForm = Objects.requireNonNullElse(peptideForm, PeptideCharacteristic.COMBINED_PEPTIDE); } } diff --git a/src/org/labkey/targetedms/query/PeptideManager.java b/src/org/labkey/targetedms/query/PeptideManager.java index 67edd3054..274ebcf5e 100644 --- a/src/org/labkey/targetedms/query/PeptideManager.java +++ b/src/org/labkey/targetedms/query/PeptideManager.java @@ -22,6 +22,7 @@ import org.labkey.api.data.DatabaseCache; import org.labkey.api.data.SQLFragment; import org.labkey.api.data.SqlSelector; +import org.labkey.api.data.dialect.SqlDialect; import org.labkey.api.protein.PeptideCharacteristic; import org.labkey.targetedms.TargetedMSManager; import org.labkey.targetedms.parser.GeneralMoleculeChromInfo; @@ -96,17 +97,27 @@ public static Collection getPeptidesForGroup(long peptideGroupId) return new SqlSelector(TargetedMSManager.getSchema(), sql).getArrayList(Peptide.class); } + private static String appendLog10IntensitySql(SqlDialect sqlDialect) + { + var pgLog10Intensity = " CASE WHEN MAX(X.Intensity) IS NOT NULL AND MAX(X.Intensity) != 0 THEN LOG(" + sqlDialect.getNumericCast(new SQLFragment("MAX(X.Intensity)")).getSQL() + ") ELSE 0 END "; + var sqlServerLog10Intensity = " CASE WHEN MAX(X.Intensity) IS NOT NULL AND MAX(X.Intensity) != 0 THEN LOG10(MAX(X.Intensity)) ELSE 0 END "; + return sqlDialect.isPostgreSQL() ? pgLog10Intensity : sqlServerLog10Intensity; + } + + private static String appendLog10ConfidenceSql(SqlDialect sqlDialect) + { + var pgConfidenceValueToRound = " CASE WHEN MAX(X.Confidence) IS NOT NULL AND MAX(X.Confidence) != 0 THEN -LOG(" + sqlDialect.getNumericCast(new SQLFragment("MAX(X.Confidence)")).getSQL() + ") ELSE 0 END "; + var pgLog10Confidence = "ROUND(" + sqlDialect.getNumericCast(new SQLFragment(pgConfidenceValueToRound)).getSQL() + ",4)"; + var sqlServerLog10Confidence = " CASE WHEN MAX(X.Confidence) IS NOT NULL AND MAX(X.Confidence) != 0 THEN ROUND(-LOG10(MAX(X.Confidence)),4) ELSE 0 END "; + return sqlDialect.isPostgreSQL() ? pgLog10Confidence : sqlServerLog10Confidence; + } + public static List getCombinedPeptideCharacteristics(long peptideGroupId, @Nullable Long replicateId) { + var shouldFilterAndGroupByReplicate = null != replicateId && !Objects.equals(replicateId, Long.valueOf(0)); var sqlDialect = TargetedMSManager.getSqlDialect(); - var pgLog10Intensity = "LOG(" + sqlDialect.getNumericCast(new SQLFragment("MAX(X.Intensity)")).getSQL() + ")"; - var sqlServerLog10Intensity = "CASE WHEN MAX(X.Intensity) IS NOT NULL AND MAX(X.Intensity) != 0 THEN LOG10(MAX(X.Intensity)) ELSE 0 END "; - var pgConfidenceValueToRound = "-LOG(" + sqlDialect.getNumericCast(new SQLFragment("MAX(X.Confidence)")).getSQL() + ")"; - var pgLog10Confidence = "ROUND(" + sqlDialect.getNumericCast(new SQLFragment(pgConfidenceValueToRound)).getSQL() + ",4)"; - var sqlServerLog10Confidence = "ROUND(-LOG10(MAX(X.Confidence)),4)"; - var log10IntensitySql = sqlDialect.isPostgreSQL() ? pgLog10Intensity : sqlServerLog10Intensity; - var log10ConfidenceSql = sqlDialect.isPostgreSQL() ? pgLog10Confidence : sqlServerLog10Confidence; - SQLFragment sql = new SQLFragment("SELECT X.Sequence, " + log10IntensitySql + " AS Intensity, " + log10ConfidenceSql + " AS Confidence, "); + + SQLFragment sql = new SQLFragment("SELECT X.Sequence, " + appendLog10IntensitySql(sqlDialect) + " AS Intensity, " + appendLog10ConfidenceSql(sqlDialect) + " AS Confidence, "); sql.append(" MAX(X.Intensity) AS RawIntensity, MAX(X.Confidence) AS RawConfidence, X.StartIndex, X.EndIndex FROM "); sql.append("(SELECT pep.Sequence, pep.StartIndex, pep.EndIndex, "); sql.append(" CASE WHEN SUM(TotalArea) IS NULL OR SUM(TotalArea) < 1 THEN 1 ELSE SUM(TotalArea) END AS Intensity, "); @@ -120,38 +131,30 @@ public static List getCombinedPeptideCharacteristics(long sql.append(" ON gm.id = pep.Id"); sql.append(" INNER JOIN ").append(TargetedMSManager.getTableInfoSampleFile(), "sf"); sql.append(" ON sf.Id = pci.SampleFileId"); - if (!Objects.equals(replicateId, Long.valueOf(0))) + if (shouldFilterAndGroupByReplicate) { sql.append(" INNER JOIN ").append(TargetedMSManager.getTableInfoReplicate(), "rep"); sql.append(" ON rep.Id = sf.ReplicateId"); } sql.append(" WHERE gm.PeptideGroupId=? "); - if (!Objects.equals(replicateId, Long.valueOf(0))) + sql.add(peptideGroupId); + if (shouldFilterAndGroupByReplicate) { sql.append(" AND rep.Id=? "); + sql.add(replicateId); } sql.append(" GROUP BY pep.Sequence,pci.SampleFileId, pep.StartIndex, pep.EndIndex ) X "); sql.append(" GROUP BY X.Sequence, X.StartIndex, X.EndIndex "); - sql.add(peptideGroupId); - if (!Objects.equals(replicateId, Long.valueOf(0))) - { - sql.add(replicateId); - } return new SqlSelector(TargetedMSManager.getSchema(), sql).getArrayList(PeptideCharacteristic.class); } public static List getModifiedPeptideCharacteristics(long peptideGroupId, @Nullable Long replicateId) { + var shouldFilterAndGroupByReplicate = null != replicateId && !Objects.equals(replicateId, Long.valueOf(0)); var sqlDialect = TargetedMSManager.getSqlDialect(); - var pgLog10Intensity = "LOG(" + sqlDialect.getNumericCast(new SQLFragment("MAX(X.Intensity)")).getSQL() + ")"; - var sqlServerLog10Intensity = "CASE WHEN MAX(X.Intensity) IS NOT NULL AND MAX(X.Intensity) != 0 THEN LOG10(MAX(X.Intensity)) ELSE 0 END "; - var pgConfidenceValueToRound = "-LOG(" + sqlDialect.getNumericCast(new SQLFragment("MAX(X.Confidence)")).getSQL() + ")"; - var pgLog10Confidence = "ROUND(" + sqlDialect.getNumericCast(new SQLFragment(pgConfidenceValueToRound)).getSQL() + ",4)"; - var sqlServerLog10Confidence = "ROUND(-LOG10(MAX(X.Confidence)),4)"; - var log10IntensitySql = sqlDialect.isPostgreSQL() ? pgLog10Intensity : sqlServerLog10Intensity; - var log10ConfidenceSql = sqlDialect.isPostgreSQL() ? pgLog10Confidence : sqlServerLog10Confidence; + SQLFragment sql = new SQLFragment("SELECT X.Sequence, X.PeptideModifiedSequence AS ModifiedSequence, X.StartIndex, X.EndIndex ,"); - sql.append(log10IntensitySql + " AS Intensity, " + log10ConfidenceSql + " AS Confidence, "); + sql.append(appendLog10IntensitySql(sqlDialect) + " AS Intensity, " + appendLog10ConfidenceSql(sqlDialect) + " AS Confidence, "); sql.append(" MAX(X.Intensity) AS RawIntensity, MAX(X.Confidence) AS RawConfidence FROM "); sql.append("(SELECT pep.Sequence, pep.PeptideModifiedSequence, pep.StartIndex, pep.EndIndex, "); sql.append(" CASE WHEN SUM(TotalArea) IS NULL OR SUM(TotalArea) < 1 THEN 1 ELSE SUM(TotalArea) END AS Intensity, "); @@ -165,23 +168,21 @@ public static List getModifiedPeptideCharacteristics(long sql.append(" ON gm.id = pep.Id"); sql.append(" INNER JOIN ").append(TargetedMSManager.getTableInfoSampleFile(), "sf"); sql.append(" ON sf.Id = pci.SampleFileId"); - if (!Objects.equals(replicateId, Long.valueOf(0))) + if (shouldFilterAndGroupByReplicate) { sql.append(" INNER JOIN ").append(TargetedMSManager.getTableInfoReplicate(), "rep"); sql.append(" ON rep.Id = sf.ReplicateId"); } sql.append(" WHERE gm.PeptideGroupId=? "); - if (!Objects.equals(replicateId, Long.valueOf(0))) + sql.add(peptideGroupId); + if (shouldFilterAndGroupByReplicate) { sql.append(" AND rep.Id=? "); + sql.add(replicateId); } sql.append(" GROUP BY pep.Sequence,pci.SampleFileId, pep.PeptideModifiedSequence, pep.StartIndex, pep.EndIndex ) X "); sql.append(" GROUP BY X.Sequence, X.PeptideModifiedSequence, X.StartIndex, X.EndIndex "); - sql.add(peptideGroupId); - if (!Objects.equals(replicateId, Long.valueOf(0))) - { - sql.add(replicateId); - } + return new SqlSelector(TargetedMSManager.getSchema(), sql).getArrayList(PeptideCharacteristic.class); }