Skip to content

Commit e4c1920

Browse files
vagishanickshulman
andauthored
Set qcTraceName on ChromatogramGroupId (#982)
* Set qcTraceName on ChromatogramGroupId. * Fix error importing Skyline documents with Spectrum Filters (#921) "Spectrum Filter" gets parsed from the Skyline document light:heavy ratios are not calculated for precursors that have a spectrum filter The spectrum filter is used when deciding which chromatogram to read from the .skyd file for a particular precursor. # Conflicts: # src/org/labkey/targetedms/parser/ChromatogramGroupId.java * Added constructor for ChromatogramGroupId that takes both qcTraceName and spectrumFilter. --------- Co-authored-by: nickshulman <[email protected]>
1 parent d886075 commit e4c1920

File tree

13 files changed

+394
-19
lines changed

13 files changed

+394
-19
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ALTER TABLE targetedms.GeneralPrecursor
2+
ADD COLUMN SpectrumFilter BYTEA;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE targetedms.GeneralPrecursor ADD SpectrumFilter VARBINARY(MAX);

resources/schemas/targetedms.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@
438438
<column columnName="Modified">
439439
<formatString>DateTime</formatString>
440440
</column>
441+
<column columnName="SpectrumFilter" />
441442
</columns>
442443
</table>
443444
<table tableDbType="TABLE" tableName="MoleculePrecursor">

src/org/labkey/targetedms/SkylineDocImporter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1521,6 +1521,8 @@ else if (generalMolecule instanceof Molecule molecule)
15211521
{
15221522
if (precursor.getIsotopeLabelId() != numLabelId)
15231523
continue;
1524+
if (precursor.getSpectrumFilter() != null)
1525+
continue;
15241526

15251527
PrecursorAreaRatio pRatio = areaRatioCalculator.getPrecursorAreaRatio(sampleFile.getId(),
15261528
precursor,

src/org/labkey/targetedms/TargetedMSModule.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
import org.labkey.targetedms.folderImport.QCFolderWriterFactory;
7070
import org.labkey.targetedms.parser.Protein;
7171
import org.labkey.targetedms.parser.SampleFile;
72+
import org.labkey.targetedms.parser.SpectrumFilter;
7273
import org.labkey.targetedms.parser.skyaudit.SkylineAuditLogParser;
7374
import org.labkey.targetedms.passport.PassportController;
7475
import org.labkey.targetedms.pipeline.TargetedMSPipelineProvider;
@@ -222,7 +223,7 @@ public String getName()
222223
@Override
223224
public Double getSchemaVersion()
224225
{
225-
return 24.004;
226+
return 24.005;
226227
}
227228

228229
@Override
@@ -668,7 +669,8 @@ public Set<Class> getUnitTests()
668669
TargetedMSController.TestCase.class,
669670
PrecursorManager.TestCase.class,
670671
CrossLinkedPeptideInfo.TestCase.class,
671-
Protein.TestCase.class
672+
Protein.TestCase.class,
673+
SpectrumFilter.TestCase.class
672674
);
673675
}
674676

src/org/labkey/targetedms/parser/ChromatogramGroupId.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,32 @@
1515
*/
1616
package org.labkey.targetedms.parser;
1717

18+
import org.apache.commons.lang3.StringUtils;
1819
import org.labkey.targetedms.parser.proto.ChromatogramGroupDataOuterClass;
1920

2021
import java.util.ArrayList;
2122
import java.util.List;
23+
import java.util.stream.Collectors;
2224

2325
public class ChromatogramGroupId
2426
{
2527
private Target _target;
2628
private String _qcTraceName;
29+
private SpectrumFilter _spectrumFilter;
2730

2831
private ChromatogramGroupId()
2932
{
3033
}
31-
public ChromatogramGroupId(Target target)
34+
public ChromatogramGroupId(Target target, String qcTraceName, SpectrumFilter spectrumFilter)
3235
{
3336
_target = target;
37+
_qcTraceName = StringUtils.isEmpty(qcTraceName) ? null : qcTraceName;
38+
_spectrumFilter = spectrumFilter;
39+
}
40+
41+
public ChromatogramGroupId(Target target, SpectrumFilter spectrumFilter)
42+
{
43+
this(target, null, spectrumFilter);
3444
}
3545

3646
public Target getTarget()
@@ -43,6 +53,11 @@ public String getQcTraceName()
4353
return _qcTraceName;
4454
}
4555

56+
public SpectrumFilter getSpectrumFilter()
57+
{
58+
return _spectrumFilter;
59+
}
60+
4661
public static ChromatogramGroupId forQcTraceName(String qcTraceName)
4762
{
4863
ChromatogramGroupId chromatogramGroupId = new ChromatogramGroupId();
@@ -55,14 +70,24 @@ public static List<ChromatogramGroupId> fromProtos(ChromatogramGroupDataOuterCla
5570
List<Target> targets = new ArrayList<>();
5671
// Make one-based lookups easy
5772
targets.add(null);
73+
74+
List<SpectrumFilter.FilterClause> filterClauses = new ArrayList<>();
75+
5876
for (ChromatogramGroupDataOuterClass.ChromatogramGroupIdsProto.Target target : proto.getTargetsList())
5977
{
6078
targets.add(new Target(target));
6179
}
80+
for (ChromatogramGroupDataOuterClass.ChromatogramGroupIdsProto.SpectrumFilter spectrumFilter : proto.getFiltersList())
81+
{
82+
filterClauses.add(SpectrumFilter.FilterClause.fromProtocolMessage(spectrumFilter));
83+
}
6284
List<ChromatogramGroupId> list = new ArrayList<>();
6385
for (ChromatogramGroupDataOuterClass.ChromatogramGroupIdsProto.ChromatogramGroupId chromatogramGroupId : proto.getChromatogramGroupIdsList())
6486
{
65-
list.add(new ChromatogramGroupId(targets.get(chromatogramGroupId.getTargetIndex())));
87+
SpectrumFilter spectrumFilter = SpectrumFilter.fromFilterClauses(
88+
chromatogramGroupId.getFilterIndexesList().stream()
89+
.map(filterClauses::get).collect(Collectors.toList())).orElse(null);
90+
list.add(new ChromatogramGroupId(targets.get(chromatogramGroupId.getTargetIndex()), chromatogramGroupId.getQcTraceName(), spectrumFilter));
6691
}
6792
return list;
6893
}

src/org/labkey/targetedms/parser/GeneralPrecursor.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public class GeneralPrecursor<TransitionType extends GeneralTransition> extends
3838
private Double _explicitCcsSqa;
3939
private Double _explicitCompensationVoltage;
4040
private Double _precursorConcentration;
41+
private byte[] _spectrumFilter;
4142

4243
public long getGeneralMoleculeId()
4344
{
@@ -213,4 +214,14 @@ public void setPrecursorConcentration(Double precursorConcentration)
213214
{
214215
_precursorConcentration = precursorConcentration;
215216
}
217+
218+
public byte[] getSpectrumFilter()
219+
{
220+
return _spectrumFilter;
221+
}
222+
223+
public void setSpectrumFilter(byte[] spectrumFilter)
224+
{
225+
_spectrumFilter = spectrumFilter;
226+
}
216227
}

src/org/labkey/targetedms/parser/PeakAreaRatioCalculator.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@ public void init(Map<SkylineDocImporter.SampleFileKey, SampleFile> skylineIdSamp
5858

5959
for(Precursor precursor: _peptide.getPrecursorList())
6060
{
61+
if (precursor.getSpectrumFilter() != null)
62+
{
63+
// Ideally, ratios would be calculated separately between Precursors with the same Spectrum Filter.
64+
// However, we only store one ratio in the database for each Peptide, so we just skip precursors
65+
// which have a Spectrum Filter.
66+
continue;
67+
}
6168
for(PrecursorChromInfo precursorChromInfo : precursor.getChromInfoList())
6269
{
6370
if(precursorChromInfo.isOptimizationPeak())

src/org/labkey/targetedms/parser/SkylineBinaryParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ public ChromatogramGroupId getTextId(ChromGroupHeaderInfo chromGroupHeaderInfo)
383383
{
384384
return null;
385385
}
386-
return new ChromatogramGroupId(target);
386+
return new ChromatogramGroupId(target, null);
387387
}
388388

389389
public String getFilePath(ChromGroupHeaderInfo chromGroupHeaderInfo) {

src/org/labkey/targetedms/parser/SkylineDocumentParser.java

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.labkey.targetedms.parser;
1818

1919
import com.google.common.collect.Iterables;
20+
import com.google.protobuf.InvalidProtocolBufferException;
2021
import org.apache.commons.io.FilenameUtils;
2122
import org.apache.commons.lang3.StringUtils;
2223
import org.apache.logging.log4j.Logger;
@@ -63,6 +64,7 @@
6364
import java.util.LinkedList;
6465
import java.util.List;
6566
import java.util.Map;
67+
import java.util.Objects;
6668
import java.util.concurrent.atomic.AtomicInteger;
6769
import java.util.function.Function;
6870
import java.util.regex.Pattern;
@@ -157,6 +159,7 @@ public class SkylineDocumentParser implements AutoCloseable
157159
private static final String CHARGE = "charge" ;
158160
public static final String TRANSITION_DATA = "transition_data";
159161
private static final String LINKED_FRAGMENT_ION = "linked_fragment_ion";
162+
private static final String SPECTRUM_FILTER = "spectrum_filter";
160163

161164
private static final double MIN_SUPPORTED_VERSION = 1.2;
162165
public static final double MAX_SUPPORTED_VERSION = 23.1;
@@ -1860,7 +1863,7 @@ private MoleculePrecursor readMoleculePrecursor(XMLStreamReader reader, Molecule
18601863
String charge = reader.getAttributeValue(null, CHARGE);
18611864
if(null != charge)
18621865
moleculePrecursor.setCharge(Integer.parseInt(charge));
1863-
1866+
List<SpectrumFilter.FilterClause> spectrumFilterClauses = new ArrayList<>();
18641867
while(reader.hasNext())
18651868
{
18661869
int evtType = reader.next();
@@ -1879,8 +1882,11 @@ else if (XmlUtil.isStartElement(reader, evtType, ANNOTATION))
18791882
annotations.add(readAnnotation(reader, new PrecursorAnnotation()));
18801883
else if (XmlUtil.isStartElement(reader, evtType, NOTE))
18811884
moleculePrecursor.setNote(readNote(reader));
1885+
else if (XmlUtil.isStartElement(reader, evtType, SPECTRUM_FILTER))
1886+
spectrumFilterClauses.add(SpectrumFilter.FilterClause.parse(reader));
18821887
}
1883-
1888+
moleculePrecursor.setSpectrumFilter(SpectrumFilter.fromFilterClauses(spectrumFilterClauses)
1889+
.map(SpectrumFilter::toByteArray).orElse(null));
18841890
List<ChromGroupHeaderInfo> chromatograms = tryLoadChromatogram(moleculeTransitionList, molecule, moleculePrecursor, _matchTolerance);
18851891
populateChromInfoChromatograms(moleculePrecursor, chromatograms);
18861892

@@ -2035,7 +2041,7 @@ private Precursor readPrecursor(XMLStreamReader reader, Peptide peptide, boolean
20352041
precursor.setExplicitCcsSqa(XmlUtil.readDoubleAttribute(reader, "explicit_ccs_sqa"));
20362042
precursor.setExplicitCompensationVoltage(XmlUtil.readDoubleAttribute(reader, "explicit_compensation_voltage"));
20372043
precursor.setPrecursorConcentration(XmlUtil.readDoubleAttribute(reader, "precursor_concentration"));
2038-
2044+
List<SpectrumFilter.FilterClause> spectrumFilterClauses = new ArrayList<>();
20392045
while (reader.hasNext()) {
20402046

20412047
int evtType = reader.next();
@@ -2083,8 +2089,15 @@ else if (XmlUtil.isStartElement(reader, evtType, NOTE))
20832089
{
20842090
precursor.setNote(readNote(reader));
20852091
}
2092+
else if (XmlUtil.isStartElement(reader, evtType, SPECTRUM_FILTER))
2093+
{
2094+
spectrumFilterClauses.add(SpectrumFilter.FilterClause.parse(reader));
2095+
}
20862096
}
20872097

2098+
precursor.setSpectrumFilter(SpectrumFilter.fromFilterClauses(spectrumFilterClauses)
2099+
.map(SpectrumFilter::toByteArray).orElse(null));
2100+
20882101
// Boolean type annotations are not listed in the .sky file if their value was false.
20892102
// We would still like to store them in the database.
20902103
List<String> missingBooleanAnnotations = _dataSettings.getMissingBooleanAnnotations(annotations,
@@ -3113,7 +3126,6 @@ public List<SampleFileChromInfo> getSampleFileChromInfos(Map<String, SampleFile>
31133126
{
31143127
return Collections.emptyList();
31153128
}
3116-
int traceMetricIndex = 1;
31173129
for (ChromGroupHeaderInfo chromatogram : _binaryParser.getChromatograms())
31183130
{
31193131
// Sample-scoped chromatograms have a magic precursor MZ value
@@ -3145,14 +3157,7 @@ public List<SampleFileChromInfo> getSampleFileChromInfos(Map<String, SampleFile>
31453157
ChromatogramGroupId chromatogramGroupId = _binaryParser.getTextId(chromatogram);
31463158
if (chromatogramGroupId != null)
31473159
{
3148-
if (chromatogramGroupId.getQcTraceName() == null && chromatogram.getFlagValues().contains(ChromGroupHeaderInfo.FlagValues.extracted_qc_trace))
3149-
{
3150-
info.setTextId("QC Trace " + traceMetricIndex++);
3151-
}
3152-
else
3153-
{
3154-
info.setTextId(chromatogramGroupId.getQcTraceName());
3155-
}
3160+
info.setTextId(chromatogramGroupId.getQcTraceName());
31563161
}
31573162
info.setChromatogramFormat(chromatogram.getChromatogramBinaryFormat().ordinal());
31583163
info.setChromatogramOffset(chromatogram.getLocationPoints());
@@ -3204,8 +3209,24 @@ private List<ChromGroupHeaderInfo> tryLoadChromatogram(
32043209
ChromGroupHeaderInfo chrom = _binaryParser.getChromatograms()[i++];
32053210
// Sequence matching for extracted chromatogram data added in v1.5
32063211
ChromatogramGroupId chromTextId = _binaryParser.getTextId(chrom);
3207-
if (chromTextId != null && !molecule.targetMatches(chromTextId.getTarget()))
3208-
continue;
3212+
if (chromTextId != null)
3213+
{
3214+
if (!molecule.targetMatches(chromTextId.getTarget()))
3215+
continue;
3216+
try
3217+
{
3218+
SpectrumFilter spectrumFilter = SpectrumFilter.fromByteArray(precursor.getSpectrumFilter());
3219+
if (!Objects.equals(spectrumFilter, chromTextId.getSpectrumFilter()))
3220+
{
3221+
continue;
3222+
}
3223+
}
3224+
catch (InvalidProtocolBufferException e)
3225+
{
3226+
_log.warn("Error parsing spectrum filter {}", e);
3227+
return Collections.emptyList();
3228+
}
3229+
}
32093230

32103231
// If explicit retention time info is available, use that to discard obvious mismatches
32113232
if (explicitRT == null || !chrom.excludesTime(explicitRT))

0 commit comments

Comments
 (0)