Skip to content

Commit 27f438c

Browse files
committed
Zero-length mz data fix
1 parent fcbc8db commit 27f438c

File tree

4 files changed

+85
-34
lines changed

4 files changed

+85
-34
lines changed

Writer/MgfSpectrumWriter.cs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,14 +198,23 @@ public override void Write(IRawDataPlus rawFile, int firstScanNumber, int lastSc
198198
}
199199
else // Otherwise take segmented (low res) scan data
200200
{
201-
// If the spectrum is profile perform centroiding
202-
var segmentedScan = scanEvent.ScanData == ScanDataType.Profile
203-
? Scan.ToCentroid(scan).SegmentedScan
204-
: scan.SegmentedScan;
205-
206-
masses = segmentedScan.Positions;
207-
raw_masses = (double[])masses.Clone();
208-
intensities = segmentedScan.Intensities;
201+
if (scan.SegmentedScan.PositionCount > 0)
202+
{
203+
// If the spectrum is profile perform centroiding
204+
var segmentedScan = scanEvent.ScanData == ScanDataType.Profile
205+
? Scan.ToCentroid(scan).SegmentedScan
206+
: scan.SegmentedScan;
207+
208+
masses = segmentedScan.Positions;
209+
raw_masses = (double[])masses.Clone();
210+
intensities = segmentedScan.Intensities;
211+
}
212+
else
213+
{
214+
masses = Array.Empty<double>();
215+
raw_masses = Array.Empty<double>();
216+
intensities = Array.Empty<double>();
217+
}
209218
}
210219
}
211220
else // Use the segmented data as is
@@ -238,6 +247,11 @@ public override void Write(IRawDataPlus rawFile, int firstScanNumber, int lastSc
238247
}
239248
}
240249
}
250+
else
251+
{
252+
Log.WarnFormat("Spectrum {0} has no m/z data", scanNumber);
253+
ParseInput.NewWarn();
254+
}
241255

242256
Writer.WriteLine("END IONS");
243257

Writer/MzMlSpectrumWriter.cs

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,21 +1494,30 @@ private SpectrumType ConstructMSSpectrum(int scanNumber)
14941494
basePeakMass = scan.ScanStatistics.BasePeakMass;
14951495
basePeakIntensity = scan.ScanStatistics.BasePeakIntensity;
14961496

1497-
// If the spectrum is profile perform centroiding
1498-
var segmentedScan = scanEvent.ScanData == ScanDataType.Profile
1499-
? Scan.ToCentroid(scan).SegmentedScan
1500-
: scan.SegmentedScan;
1501-
1502-
masses = segmentedScan.Positions;
1503-
raw_masses = (double[]) masses.Clone();
1504-
intensities = segmentedScan.Intensities;
1505-
1506-
if (segmentedScan.PositionCount > 0)
1497+
if (scan.SegmentedScan.PositionCount > 0)
1498+
{
1499+
// If the spectrum is profile perform centroiding
1500+
var segmentedScan = scanEvent.ScanData == ScanDataType.Profile
1501+
? Scan.ToCentroid(scan).SegmentedScan
1502+
: scan.SegmentedScan;
1503+
1504+
masses = segmentedScan.Positions;
1505+
raw_masses = (double[])masses.Clone();
1506+
intensities = segmentedScan.Intensities;
1507+
1508+
if (segmentedScan.PositionCount > 0)
1509+
{
1510+
//Sort masses
1511+
Array.Sort(masses);
1512+
lowestObservedMz = segmentedScan.Positions[0];
1513+
highestObservedMz = segmentedScan.Positions[segmentedScan.PositionCount - 1];
1514+
}
1515+
}
1516+
else
15071517
{
1508-
//Sort masses
1509-
Array.Sort(masses);
1510-
lowestObservedMz = segmentedScan.Positions[0];
1511-
highestObservedMz = segmentedScan.Positions[segmentedScan.PositionCount - 1];
1518+
masses = Array.Empty<double>();
1519+
intensities = Array.Empty<double>();
1520+
raw_masses = Array.Empty<double>();
15121521
}
15131522
}
15141523
}
@@ -1538,6 +1547,7 @@ private SpectrumType ConstructMSSpectrum(int scanNumber)
15381547

15391548
basePeakMass = scan.ScanStatistics.BasePeakMass;
15401549
basePeakIntensity = scan.ScanStatistics.BasePeakIntensity;
1550+
15411551
masses = scan.SegmentedScan.Positions;
15421552
raw_masses = (double[])masses.Clone();
15431553
intensities = scan.SegmentedScan.Intensities;
@@ -1623,6 +1633,12 @@ private SpectrumType ConstructMSSpectrum(int scanNumber)
16231633
// Set the spectrum default array length
16241634
spectrum.defaultArrayLength = masses.Length;
16251635

1636+
if (masses.Length == 0)
1637+
{
1638+
Log.WarnFormat("Spectrum {0} has no m/z data", scanNumber);
1639+
ParseInput.NewWarn();
1640+
}
1641+
16261642
var massesBinaryData =
16271643
new BinaryDataArrayType
16281644
{

Writer/ParquetSpectrumWriter.cs

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -260,13 +260,21 @@ private List<MzParquet> ReadScan(IRawDataPlus raw, int scanNumber)
260260
}
261261
else // otherwise take the segmented (low res) scan
262262
{
263-
// If the spectrum is profile perform centroiding
264-
var segmentedScan = scanEvent.ScanData == ScanDataType.Profile
265-
? Scan.ToCentroid(scan).SegmentedScan
266-
: scan.SegmentedScan;
263+
if (scan.SegmentedScan.PositionCount > 0)
264+
{
265+
// If the spectrum is profile perform centroiding
266+
var segmentedScan = scanEvent.ScanData == ScanDataType.Profile
267+
? Scan.ToCentroid(scan).SegmentedScan
268+
: scan.SegmentedScan;
267269

268-
masses = segmentedScan.Positions;
269-
intensities = segmentedScan.Intensities;
270+
masses = segmentedScan.Positions;
271+
intensities = segmentedScan.Intensities;
272+
}
273+
else
274+
{
275+
masses = Array.Empty<double>();
276+
intensities = Array.Empty<double>();
277+
}
270278
}
271279
}
272280
else // use the segmented data as is
@@ -275,6 +283,11 @@ private List<MzParquet> ReadScan(IRawDataPlus raw, int scanNumber)
275283
intensities = scan.SegmentedScan.Intensities;
276284
}
277285

286+
if (masses.Length == 0 || intensities.Length == 0)
287+
{
288+
Log.WarnFormat("Spectrum {0} has no m/z data", scanNumber);
289+
}
290+
278291
List<MzParquet> scanData = new List<MzParquet>(masses.Length);
279292
// Add a row to parquet file for every m/z value in this scan
280293
for (int i = 0; i < masses.Length; i++)

Writer/SpectrumWriter.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -243,12 +243,20 @@ public static IReaction GetReaction(IScanEvent scanEvent, int scanNumber)
243243
else
244244
{
245245
var scanEvent = rawFile.GetScanEventForScanNumber(precursorScanNumber);
246-
var centroidedScan = scanEvent.ScanData == ScanDataType.Profile //only centroid profile spectra
247-
? Scan.ToCentroid(scan).SegmentedScan
248-
: scan.SegmentedScan;
249-
250-
masses = centroidedScan.Positions;
251-
intensities = centroidedScan.Intensities;
246+
if (scan.SegmentedScan.PositionCount > 0)
247+
{
248+
var centroidedScan = scanEvent.ScanData == ScanDataType.Profile //only centroid profile spectra
249+
? Scan.ToCentroid(scan).SegmentedScan
250+
: scan.SegmentedScan;
251+
252+
masses = centroidedScan.Positions;
253+
intensities = centroidedScan.Intensities;
254+
}
255+
else
256+
{
257+
masses = Array.Empty<double>();
258+
intensities = Array.Empty<double>();
259+
}
252260
}
253261
}
254262

0 commit comments

Comments
 (0)