diff --git a/chemclipse/plugins/org.eclipse.chemclipse.msd.converter.supplier.mzml/src/org/eclipse/chemclipse/msd/converter/supplier/mzml/io/ChromatogramReaderVersion10.java b/chemclipse/plugins/org.eclipse.chemclipse.msd.converter.supplier.mzml/src/org/eclipse/chemclipse/msd/converter/supplier/mzml/io/ChromatogramReaderVersion10.java index 9576cf8c74..bf4e0a0298 100644 --- a/chemclipse/plugins/org.eclipse.chemclipse.msd.converter.supplier.mzml/src/org/eclipse/chemclipse/msd/converter/supplier/mzml/io/ChromatogramReaderVersion10.java +++ b/chemclipse/plugins/org.eclipse.chemclipse.msd.converter.supplier.mzml/src/org/eclipse/chemclipse/msd/converter/supplier/mzml/io/ChromatogramReaderVersion10.java @@ -19,16 +19,16 @@ import org.apache.commons.lang3.tuple.Pair; import org.eclipse.chemclipse.converter.io.AbstractChromatogramReader; +import org.eclipse.chemclipse.converter.l10n.ConverterMessages; import org.eclipse.chemclipse.logging.core.Logger; import org.eclipse.chemclipse.model.core.IChromatogramOverview; import org.eclipse.chemclipse.msd.converter.io.IChromatogramMSDReader; import org.eclipse.chemclipse.msd.converter.supplier.mzml.converter.model.IVendorChromatogram; import org.eclipse.chemclipse.msd.converter.supplier.mzml.converter.model.VendorChromatogram; +import org.eclipse.chemclipse.msd.converter.supplier.mzml.converter.model.VendorIon; import org.eclipse.chemclipse.msd.model.core.IChromatogramMSD; import org.eclipse.chemclipse.msd.model.core.IIonTransition; -import org.eclipse.chemclipse.msd.model.core.IIonTransitionGroup; -import org.eclipse.chemclipse.msd.model.core.IIonTransitionSettings; -import org.eclipse.chemclipse.msd.model.core.IStandaloneMassSpectrum; +import org.eclipse.chemclipse.msd.model.core.IRegularMassSpectrum; import org.eclipse.chemclipse.msd.model.core.MassSpectrumType; import org.eclipse.chemclipse.msd.model.implementation.IonTransition; import org.eclipse.chemclipse.msd.model.implementation.VendorMassSpectrum; @@ -49,6 +49,7 @@ import org.eclipse.chemclipse.xxd.converter.supplier.mzml.model.v10.SampleType; import org.eclipse.chemclipse.xxd.converter.supplier.mzml.model.v10.ScanType; import org.eclipse.chemclipse.xxd.converter.supplier.mzml.model.v10.SoftwareType; +import org.eclipse.chemclipse.xxd.converter.supplier.mzml.model.v10.SpectrumDescriptionType; import org.eclipse.chemclipse.xxd.converter.supplier.mzml.model.v10.SpectrumType; import org.eclipse.core.runtime.IProgressMonitor; import org.xml.sax.SAXException; @@ -63,38 +64,17 @@ public class ChromatogramReaderVersion10 extends AbstractChromatogramReader impl public IChromatogramOverview readOverview(File file, IProgressMonitor monitor) throws IOException { IVendorChromatogram chromatogram = null; - double[] retentionTimes = null; - double[] intensities = null; - // try { chromatogram = new VendorChromatogram(); MzMLType mzML = XmlReader10.getMzML(file); - RunType run = mzML.getRun(); - for(ChromatogramType chromatogramType : run.getChromatogramList().getChromatogram()) { - if(chromatogramType.getId().equals("TIC")) { - if(chromatogramType.getCvParam().stream().anyMatch(n -> n.getAccession().equals("MS:1000235") && n.getName().equals("total ion current chromatogram"))) { - for(BinaryDataArrayType binaryDataArrayType : chromatogramType.getBinaryDataArrayList().getBinaryDataArray()) { - Pair binaryData = BinaryReader10.parseBinaryData(binaryDataArrayType); - if(binaryData.getKey().equals("time")) { - retentionTimes = binaryData.getValue(); - } else if(binaryData.getKey().equals("intensity")) { - intensities = binaryData.getValue(); - } - } - } - } - } - XmlMassSpectrumReader.addIons(intensities, retentionTimes, chromatogram); + readTIC(mzML.getRun(), chromatogram); } catch(JAXBException e) { logger.warn(e); } catch(SAXException e) { logger.warn(e); } catch(ParserConfigurationException e) { logger.warn(e); - } catch(DataFormatException e) { - logger.warn(e); } - // return chromatogram; } @@ -102,118 +82,218 @@ public IChromatogramOverview readOverview(File file, IProgressMonitor monitor) t public IChromatogramMSD read(File file, IProgressMonitor monitor) throws IOException { IVendorChromatogram chromatogram = null; - double[] intensities = null; - double[] mzs = null; - // try { chromatogram = new VendorChromatogram(); chromatogram.setFile(file); - // MzMLType mzML = XmlReader10.getMzML(file); - for(ParamGroupType contact : mzML.getFileDescription().getContact()) { - for(CVParamType cvParam : contact.getCvParam()) { - if(chromatogram.getOperator().isEmpty()) { - chromatogram.setOperator(cvParam.getValue()); - } else { - chromatogram.setOperator(String.join(", ", chromatogram.getOperator(), cvParam.getValue())); - } - } + readContact(mzML, chromatogram); + readSample(mzML, chromatogram); + readInstrument(mzML, chromatogram); + readEditHistory(mzML, chromatogram); + readSpectrum(mzML.getRun(), chromatogram, monitor); + } catch(ParserConfigurationException e) { + logger.warn(e); + } catch(SAXException e) { + logger.warn(e); + } catch(JAXBException e) { + logger.warn(e); + } + return chromatogram; + } + + private IRegularMassSpectrum readMassSpectrum(SpectrumType spectrum) { + + IRegularMassSpectrum massSpectrum = new VendorMassSpectrum(); + for(CVParamType cvParam : spectrum.getCvParam()) { + if(cvParam.getAccession().equals("MS:1000127") && cvParam.getName().equals("centroid spectrum")) { + massSpectrum.setMassSpectrumType(MassSpectrumType.CENTROID); + } else if(cvParam.getAccession().equals("MS:1000128") && cvParam.getName().equals("profile spectrum")) { + massSpectrum.setMassSpectrumType(MassSpectrumType.PROFILE); } - SampleListType sampleList = mzML.getSampleList(); - if(sampleList != null) { - for(SampleType sample : sampleList.getSample()) { - chromatogram.setSampleName(sample.getName()); - } + if(cvParam.getAccession().equals("MS:1000511") && cvParam.getName().equals("ms level")) { + short msLevel = Short.parseShort(cvParam.getValue()); + massSpectrum.setMassSpectrometer(msLevel); + } + } + return massSpectrum; + } + + private void readSpectrum(RunType run, IVendorChromatogram chromatogram, IProgressMonitor monitor) { + + monitor.beginTask(ConverterMessages.readScans, run.getSpectrumList().getCount().intValue()); + for(SpectrumType spectrum : run.getSpectrumList().getSpectrum()) { + ScanType scanType = spectrum.getSpectrumDescription().getScan(); + if(scanType == null) { + continue; } - for(InstrumentConfigurationType instrument : mzML.getInstrumentConfigurationList().getInstrumentConfiguration()) { - for(CVParamType cvParam : instrument.getCvParam()) { - if(cvParam.getAccession().equals("MS:1000554")) { - chromatogram.setInstrument(cvParam.getName()); + IRegularMassSpectrum massSpectrum = readMassSpectrum(spectrum); + setRetentionTime(scanType, massSpectrum); + readIons(spectrum, massSpectrum, chromatogram); + chromatogram.addScan(massSpectrum); + monitor.worked(1); + } + } + + private double getSelectedIon(SpectrumDescriptionType spectrumDescription) { + + if(spectrumDescription.getPrecursorList() != null) { + for(PrecursorType precursorType : spectrumDescription.getPrecursorList().getPrecursor()) { + for(ParamGroupType paramGroupType : precursorType.getSelectedIonList().getSelectedIon()) { + for(CVParamType cvParam : paramGroupType.getCvParam()) { + if(cvParam.getAccession().equals("MS:1000744") && cvParam.getName().equals("selected ion m/z")) { + return Double.parseDouble(cvParam.getValue()); + } } } } - for(DataProcessingType dataProcessing : mzML.getDataProcessingList().getDataProcessing()) { - SoftwareType software = (SoftwareType)dataProcessing.getSoftwareRef(); - for(ProcessingMethodType processingMethod : dataProcessing.getProcessingMethod()) { - for(CVParamType cvParam : processingMethod.getCvParam()) { - String operation = cvParam.getName(); - String editor = software.getId(); - chromatogram.getEditHistory().add(new EditInformation(operation, editor)); + } + return 0; + } + + private double getSelectedIonPeakIntensity(SpectrumDescriptionType spectrumDescription) { + + if(spectrumDescription.getPrecursorList() != null) { + for(PrecursorType precursorType : spectrumDescription.getPrecursorList().getPrecursor()) { + for(ParamGroupType paramGroupType : precursorType.getSelectedIonList().getSelectedIon()) { + for(CVParamType cvParam : paramGroupType.getCvParam()) { + if(cvParam.getAccession().equals("MS:1000042") && cvParam.getName().equals("peak intensity")) { + return Double.parseDouble(cvParam.getValue()); + } } } } - RunType run = mzML.getRun(); - for(SpectrumType spectrum : run.getSpectrumList().getSpectrum()) { - IStandaloneMassSpectrum massSpectrum = new VendorMassSpectrum(); - for(CVParamType cvParam : spectrum.getCvParam()) { - if(cvParam.getAccession().equals("MS:1000127") && cvParam.getName().equals("centroid spectrum")) { - massSpectrum.setMassSpectrumType(MassSpectrumType.CENTROID); - } else if(cvParam.getAccession().equals("MS:1000128") && cvParam.getName().equals("profile spectrum")) { - massSpectrum.setMassSpectrumType(MassSpectrumType.PROFILE); - } - if(cvParam.getAccession().equals("MS:1000511") && cvParam.getName().equals("ms level")) { - short msLevel = Short.parseShort(cvParam.getValue()); - massSpectrum.setMassSpectrometer(msLevel); + } + return 0; + } + + private double getCollisionEnergy(SpectrumDescriptionType spectrumDescription) { + + if(spectrumDescription.getPrecursorList() != null) { + for(PrecursorType precursorType : spectrumDescription.getPrecursorList().getPrecursor()) { + for(CVParamType cvParam : precursorType.getActivation().getCvParam()) { + if(cvParam.getAccession().equals("MS:1000045") && cvParam.getName().equals("collision energy")) { + return Double.parseDouble(cvParam.getValue()); } } - ScanType scanType = spectrum.getSpectrumDescription().getScan(); - if(scanType == null) { - continue; + } + } + return 0; + } + + private void readIons(SpectrumType spectrum, IRegularMassSpectrum massSpectrum, IVendorChromatogram chromatogram) { + + double[] intensities = null; + double[] mzs = null; + for(BinaryDataArrayType binaryDataArrayType : spectrum.getBinaryDataArrayList().getBinaryDataArray()) { + try { + Pair binaryData = BinaryReader10.parseBinaryData(binaryDataArrayType); + if(binaryData.getKey().equals("m/z")) { + mzs = binaryData.getValue(); + } else if(binaryData.getKey().equals("intensity")) { + intensities = binaryData.getValue(); } - for(CVParamType cvParam : scanType.getCvParam()) { - if(cvParam.getAccession().equals("MS:1000016") && cvParam.getName().equals("scan time")) { - int multiplicator = XmlReader10.getTimeMultiplicator(cvParam); - int retentionTime = Math.round(Float.parseFloat(cvParam.getValue()) * multiplicator); - massSpectrum.setRetentionTime(retentionTime); - } + } catch(DataFormatException e) { + logger.error(e); + } + } + SpectrumDescriptionType spectrumDescription = spectrum.getSpectrumDescription(); + double selectedIon = getSelectedIon(spectrumDescription); + massSpectrum.setPrecursorIon(selectedIon); + massSpectrum.setPrecursorBasePeak(getSelectedIonPeakIntensity(spectrumDescription)); + double collisionEnergy = getCollisionEnergy(spectrumDescription); + int ions = Math.min(mzs.length, intensities.length); + for(int i = 0; i < ions; i++) { + if(selectedIon != 0) { + IIonTransition ionTransition = new IonTransition(selectedIon, mzs[i], collisionEnergy, 1, 1, 0); + massSpectrum.addIon(new VendorIon(mzs[i], (float)intensities[i], ionTransition), false); + chromatogram.getIonTransitionSettings().getIonTransitions().add(ionTransition); + } else { + massSpectrum.addIon(new VendorIon(mzs[i], (float)intensities[i]), false); + } + } + } + + private void setRetentionTime(ScanType scanType, IRegularMassSpectrum massSpectrum) { + + for(CVParamType cvParam : scanType.getCvParam()) { + if(cvParam.getAccession().equals("MS:1000016") && cvParam.getName().equals("scan time")) { + int multiplicator = XmlReader10.getTimeMultiplicator(cvParam); + int retentionTime = Math.round(Float.parseFloat(cvParam.getValue()) * multiplicator); + massSpectrum.setRetentionTime(retentionTime); + } + } + } + + private void readEditHistory(MzMLType mzML, IVendorChromatogram chromatogram) { + + for(DataProcessingType dataProcessing : mzML.getDataProcessingList().getDataProcessing()) { + SoftwareType software = (SoftwareType)dataProcessing.getSoftwareRef(); + for(ProcessingMethodType processingMethod : dataProcessing.getProcessingMethod()) { + for(CVParamType cvParam : processingMethod.getCvParam()) { + String operation = cvParam.getName(); + String editor = software.getId(); + chromatogram.getEditHistory().add(new EditInformation(operation, editor)); } - if(massSpectrum.isTandemMS()) { - IIonTransitionSettings ionTransitionSettings = chromatogram.getIonTransitionSettings(); - IIonTransitionGroup ionTransitionGroup = ionTransitionSettings.get(0); - for(PrecursorType precursorType : spectrum.getSpectrumDescription().getPrecursorList().getPrecursor()) { - double selectedIon = 0; - double selectedIonPeakIntensity = 0; - for(ParamGroupType paramGroupType : precursorType.getSelectedIonList().getSelectedIon()) { - for(CVParamType cvParam : paramGroupType.getCvParam()) { - if(cvParam.getAccession().equals("MS:1000744") && cvParam.getName().equals("selected ion m/z")) { - selectedIon = Double.parseDouble(cvParam.getValue()); - } - if(cvParam.getAccession().equals("MS:1000042") && cvParam.getName().equals("peak intensity")) { - selectedIonPeakIntensity = Double.parseDouble(cvParam.getValue()); - } - } - } - double collisionEnergy = 0; - for(CVParamType cvParam : precursorType.getActivation().getCvParam()) { - if(cvParam.getAccession().equals("MS:1000045") && cvParam.getName().equals("collision energy")) { - collisionEnergy = Double.parseDouble(cvParam.getValue()); + } + } + } + + private void readTIC(RunType run, IVendorChromatogram chromatogram) { + + double[] retentionTimes = null; + double[] intensities = null; + for(ChromatogramType chromatogramType : run.getChromatogramList().getChromatogram()) { + if(chromatogramType.getId().equals("TIC")) { + if(chromatogramType.getCvParam().stream().anyMatch(n -> n.getAccession().equals("MS:1000235") && n.getName().equals("total ion current chromatogram"))) { + for(BinaryDataArrayType binaryDataArrayType : chromatogramType.getBinaryDataArrayList().getBinaryDataArray()) { + try { + Pair binaryData = BinaryReader10.parseBinaryData(binaryDataArrayType); + if(binaryData.getKey().equals("time")) { + retentionTimes = binaryData.getValue(); + } else if(binaryData.getKey().equals("intensity")) { + intensities = binaryData.getValue(); } + } catch(DataFormatException e) { + logger.warn(e); } - IIonTransition ionTransition = new IonTransition(selectedIon, selectedIonPeakIntensity, 0, 0, collisionEnergy, 0, 0, 0); - ionTransitionGroup.add(ionTransition); } } - for(BinaryDataArrayType binaryDataArrayType : spectrum.getBinaryDataArrayList().getBinaryDataArray()) { - Pair binaryData = BinaryReader10.parseBinaryData(binaryDataArrayType); - if(binaryData.getKey().equals("m/z")) { - mzs = binaryData.getValue(); - } else if(binaryData.getKey().equals("intensity")) { - intensities = binaryData.getValue(); - } + } + } + XmlMassSpectrumReader.addTotalIntensities(intensities, retentionTimes, chromatogram); + } + + private void readContact(MzMLType mzML, IVendorChromatogram chromatogram) { + + for(ParamGroupType contact : mzML.getFileDescription().getContact()) { + for(CVParamType cvParam : contact.getCvParam()) { + if(chromatogram.getOperator().isEmpty()) { + chromatogram.setOperator(cvParam.getValue()); + } else { + chromatogram.setOperator(String.join(", ", chromatogram.getOperator(), cvParam.getValue())); + } + } + } + } + + private void readSample(MzMLType mzML, IVendorChromatogram chromatogram) { + + SampleListType sampleList = mzML.getSampleList(); + if(sampleList != null) { + for(SampleType sample : sampleList.getSample()) { + chromatogram.setSampleName(sample.getName()); + } + } + } + + private void readInstrument(MzMLType mzML, IVendorChromatogram chromatogram) { + + for(InstrumentConfigurationType instrument : mzML.getInstrumentConfigurationList().getInstrumentConfiguration()) { + for(CVParamType cvParam : instrument.getCvParam()) { + if(cvParam.getAccession().equals("MS:1000554")) { + chromatogram.setInstrument(cvParam.getName()); } - XmlMassSpectrumReader.addIons(intensities, mzs, massSpectrum); - chromatogram.addScan(massSpectrum); } - } catch(DataFormatException e) { - logger.warn(e); - } catch(ParserConfigurationException e) { - logger.warn(e); - } catch(SAXException e) { - logger.warn(e); - } catch(JAXBException e) { - logger.warn(e); } - // - return chromatogram; } } diff --git a/chemclipse/plugins/org.eclipse.chemclipse.msd.converter.supplier.mzml/src/org/eclipse/chemclipse/msd/converter/supplier/mzml/io/ChromatogramReaderVersion110.java b/chemclipse/plugins/org.eclipse.chemclipse.msd.converter.supplier.mzml/src/org/eclipse/chemclipse/msd/converter/supplier/mzml/io/ChromatogramReaderVersion110.java index 72fce2dc99..ef71152b1c 100644 --- a/chemclipse/plugins/org.eclipse.chemclipse.msd.converter.supplier.mzml/src/org/eclipse/chemclipse/msd/converter/supplier/mzml/io/ChromatogramReaderVersion110.java +++ b/chemclipse/plugins/org.eclipse.chemclipse.msd.converter.supplier.mzml/src/org/eclipse/chemclipse/msd/converter/supplier/mzml/io/ChromatogramReaderVersion110.java @@ -19,15 +19,15 @@ import org.apache.commons.lang3.tuple.Pair; import org.eclipse.chemclipse.converter.io.AbstractChromatogramReader; +import org.eclipse.chemclipse.converter.l10n.ConverterMessages; import org.eclipse.chemclipse.logging.core.Logger; import org.eclipse.chemclipse.model.core.IChromatogramOverview; import org.eclipse.chemclipse.msd.converter.io.IChromatogramMSDReader; import org.eclipse.chemclipse.msd.converter.supplier.mzml.converter.model.IVendorChromatogram; import org.eclipse.chemclipse.msd.converter.supplier.mzml.converter.model.VendorChromatogram; +import org.eclipse.chemclipse.msd.converter.supplier.mzml.converter.model.VendorIon; import org.eclipse.chemclipse.msd.model.core.IChromatogramMSD; import org.eclipse.chemclipse.msd.model.core.IIonTransition; -import org.eclipse.chemclipse.msd.model.core.IIonTransitionGroup; -import org.eclipse.chemclipse.msd.model.core.IIonTransitionSettings; import org.eclipse.chemclipse.msd.model.core.IRegularMassSpectrum; import org.eclipse.chemclipse.msd.model.core.MassSpectrumType; import org.eclipse.chemclipse.msd.model.implementation.IonTransition; @@ -43,6 +43,7 @@ import org.eclipse.chemclipse.xxd.converter.supplier.mzml.model.v110.PrecursorType; import org.eclipse.chemclipse.xxd.converter.supplier.mzml.model.v110.RunType; import org.eclipse.chemclipse.xxd.converter.supplier.mzml.model.v110.ScanType; +import org.eclipse.chemclipse.xxd.converter.supplier.mzml.model.v110.SpectrumListType; import org.eclipse.chemclipse.xxd.converter.supplier.mzml.model.v110.SpectrumType; import org.eclipse.core.runtime.IProgressMonitor; import org.xml.sax.SAXException; @@ -57,37 +58,17 @@ public class ChromatogramReaderVersion110 extends AbstractChromatogramReader imp public IChromatogramOverview readOverview(File file, IProgressMonitor monitor) throws IOException { IVendorChromatogram chromatogram = null; - double[] retentionTimes = null; - double[] intensities = null; - // try { chromatogram = new VendorChromatogram(); MzMLType mzML = XmlReader110.getMzML(file); MetadataReader110.readMetadata(mzML, chromatogram); - RunType run = mzML.getRun(); - for(ChromatogramType chromatogramType : run.getChromatogramList().getChromatogram()) { - if(chromatogramType.getId().equals("TIC")) { - if(chromatogramType.getCvParam().stream().anyMatch(n -> n.getAccession().equals("MS:1000235") && n.getName().equals("total ion current chromatogram"))) { - for(BinaryDataArrayType binaryDataArrayType : chromatogramType.getBinaryDataArrayList().getBinaryDataArray()) { - Pair binaryData = BinaryReader110.parseBinaryData(binaryDataArrayType); - if(binaryData.getKey().equals("time")) { - retentionTimes = binaryData.getValue(); - } else if(binaryData.getKey().equals("intensity")) { - intensities = binaryData.getValue(); - } - } - } - } - } - XmlMassSpectrumReader.addIons(intensities, retentionTimes, chromatogram); + readTIC(mzML.getRun(), chromatogram); } catch(JAXBException e) { logger.warn(e); } catch(SAXException e) { logger.warn(e); } catch(ParserConfigurationException e) { logger.warn(e); - } catch(DataFormatException e) { - logger.warn(e); } return chromatogram; } @@ -96,84 +77,165 @@ public IChromatogramOverview readOverview(File file, IProgressMonitor monitor) t public IChromatogramMSD read(File file, IProgressMonitor monitor) throws IOException { IVendorChromatogram chromatogram = null; - double[] intensities = null; - double[] mzs = null; - // try { chromatogram = new VendorChromatogram(); chromatogram.setFile(file); - // MzMLType mzML = XmlReader110.getMzML(file); MetadataReader110.readMetadata(mzML, chromatogram); - RunType run = mzML.getRun(); - for(SpectrumType spectrum : run.getSpectrumList().getSpectrum()) { - IRegularMassSpectrum massSpectrum = new VendorMassSpectrum(); - for(CVParamType cvParam : spectrum.getCvParam()) { - if(cvParam.getAccession().equals("MS:1000127") && cvParam.getName().equals("centroid spectrum")) { - massSpectrum.setMassSpectrumType(MassSpectrumType.CENTROID); - } else if(cvParam.getAccession().equals("MS:1000128") && cvParam.getName().equals("profile spectrum")) { - massSpectrum.setMassSpectrumType(MassSpectrumType.PROFILE); - } - if(cvParam.getAccession().equals("MS:1000511") && cvParam.getName().equals("ms level")) { - short msLevel = Short.parseShort(cvParam.getValue()); - massSpectrum.setMassSpectrometer(msLevel); + readSpectrum(mzML.getRun(), chromatogram, monitor); + } catch(ParserConfigurationException e) { + logger.warn(e); + } catch(SAXException e) { + logger.warn(e); + } catch(JAXBException e) { + logger.warn(e); + } + return chromatogram; + } + + private void readTIC(RunType run, IVendorChromatogram chromatogram) { + + double[] retentionTimes = null; + double[] intensities = null; + for(ChromatogramType chromatogramType : run.getChromatogramList().getChromatogram()) { + if(chromatogramType.getId().equals("TIC")) { + if(chromatogramType.getCvParam().stream().anyMatch(n -> n.getAccession().equals("MS:1000235") && n.getName().equals("total ion current chromatogram"))) { + for(BinaryDataArrayType binaryDataArrayType : chromatogramType.getBinaryDataArrayList().getBinaryDataArray()) { + try { + Pair binaryData = BinaryReader110.parseBinaryData(binaryDataArrayType); + if(binaryData.getKey().equals("time")) { + retentionTimes = binaryData.getValue(); + } else if(binaryData.getKey().equals("intensity")) { + intensities = binaryData.getValue(); + } + } catch(DataFormatException e) { + logger.warn(e); + } } } - for(ScanType scanType : spectrum.getScanList().getScan()) { - for(CVParamType cvParam : scanType.getCvParam()) { - if(cvParam.getAccession().equals("MS:1000016") && cvParam.getName().equals("scan start time")) { - float multiplicator = XmlReader110.getTimeMultiplicator(cvParam); - int retentionTime = Math.round(Float.parseFloat(cvParam.getValue()) * multiplicator); - massSpectrum.setRetentionTime(retentionTime); + } + } + XmlMassSpectrumReader.addTotalIntensities(intensities, retentionTimes, chromatogram); + } + + private void readSpectrum(RunType run, IVendorChromatogram chromatogram, IProgressMonitor monitor) { + + SpectrumListType spectrumList = run.getSpectrumList(); + monitor.beginTask(ConverterMessages.readScans, spectrumList.getCount().intValue()); + for(SpectrumType spectrum : run.getSpectrumList().getSpectrum()) { + IRegularMassSpectrum massSpectrum = readMassSpectrum(spectrum); + setRetentionTime(spectrum, massSpectrum); + readIons(spectrum, massSpectrum, chromatogram); + chromatogram.addScan(massSpectrum); + monitor.worked(1); + } + } + + private void setRetentionTime(SpectrumType spectrum, IRegularMassSpectrum massSpectrum) { + + for(ScanType scanType : spectrum.getScanList().getScan()) { + for(CVParamType cvParam : scanType.getCvParam()) { + if(cvParam.getAccession().equals("MS:1000016") && cvParam.getName().equals("scan start time")) { + float multiplicator = XmlReader110.getTimeMultiplicator(cvParam); + int retentionTime = Math.round(Float.parseFloat(cvParam.getValue()) * multiplicator); + massSpectrum.setRetentionTime(retentionTime); + } + } + } + } + + private double getSelectedIon(SpectrumType spectrum) { + + if(spectrum.getPrecursorList() != null) { + for(PrecursorType precursorType : spectrum.getPrecursorList().getPrecursor()) { + for(ParamGroupType paramGroupType : precursorType.getSelectedIonList().getSelectedIon()) { + for(CVParamType cvParam : paramGroupType.getCvParam()) { + if(cvParam.getAccession().equals("MS:1000744") && cvParam.getName().equals("selected ion m/z")) { + return Double.parseDouble(cvParam.getValue()); } } } - if(massSpectrum.isTandemMS()) { - IIonTransitionSettings ionTransitionSettings = chromatogram.getIonTransitionSettings(); - IIonTransitionGroup ionTransitionGroup = ionTransitionSettings.get(0); - for(PrecursorType precursorType : spectrum.getPrecursorList().getPrecursor()) { - double selectedIon = 0; - double selectedIonPeakIntensity = 0; - for(ParamGroupType paramGroupType : precursorType.getSelectedIonList().getSelectedIon()) { - for(CVParamType cvParam : paramGroupType.getCvParam()) { - if(cvParam.getAccession().equals("MS:1000744") && cvParam.getName().equals("selected ion m/z")) { - selectedIon = Double.parseDouble(cvParam.getValue()); - } - if(cvParam.getAccession().equals("MS:1000042") && cvParam.getName().equals("peak intensity")) { - selectedIonPeakIntensity = Double.parseDouble(cvParam.getValue()); - } - } - } - double collisionEnergy = 0; - for(CVParamType cvParam : precursorType.getActivation().getCvParam()) { - if(cvParam.getAccession().equals("MS:1000045") && cvParam.getName().equals("collision energy")) { - collisionEnergy = Double.parseDouble(cvParam.getValue()); - } + } + } + return 0; + } + + private double getSelectedIonPeakIntensity(SpectrumType spectrum) { + + if(spectrum.getPrecursorList() != null) { + for(PrecursorType precursorType : spectrum.getPrecursorList().getPrecursor()) { + for(ParamGroupType paramGroupType : precursorType.getSelectedIonList().getSelectedIon()) { + for(CVParamType cvParam : paramGroupType.getCvParam()) { + if(cvParam.getAccession().equals("MS:1000042") && cvParam.getName().equals("peak intensity")) { + return Double.parseDouble(cvParam.getValue()); } - IIonTransition ionTransition = new IonTransition(selectedIon, selectedIonPeakIntensity, 0, 0, collisionEnergy, 0, 0, 0); - ionTransitionGroup.add(ionTransition); } } - for(BinaryDataArrayType binaryDataArrayType : spectrum.getBinaryDataArrayList().getBinaryDataArray()) { - Pair binaryData = BinaryReader110.parseBinaryData(binaryDataArrayType); - if(binaryData.getKey().equals("m/z")) { - mzs = binaryData.getValue(); - } else if(binaryData.getKey().equals("intensity")) { - intensities = binaryData.getValue(); + } + } + return 0; + } + + private double getCollisionEnergy(SpectrumType spectrum) { + + if(spectrum.getPrecursorList() != null) { + for(PrecursorType precursorType : spectrum.getPrecursorList().getPrecursor()) { + for(CVParamType cvParam : precursorType.getActivation().getCvParam()) { + if(cvParam.getAccession().equals("MS:1000045") && cvParam.getName().equals("collision energy")) { + return Double.parseDouble(cvParam.getValue()); } } - XmlMassSpectrumReader.addIons(intensities, mzs, massSpectrum); - chromatogram.addScan(massSpectrum); } - } catch(DataFormatException e) { - logger.warn(e); - } catch(ParserConfigurationException e) { - logger.warn(e); - } catch(SAXException e) { - logger.warn(e); - } catch(JAXBException e) { - logger.warn(e); } - return chromatogram; + return 0; + } + + private void readIons(SpectrumType spectrum, IRegularMassSpectrum massSpectrum, IVendorChromatogram chromatogram) { + + double[] intensities = null; + double[] mzs = null; + for(BinaryDataArrayType binaryDataArrayType : spectrum.getBinaryDataArrayList().getBinaryDataArray()) { + try { + Pair binaryData = BinaryReader110.parseBinaryData(binaryDataArrayType); + if(binaryData.getKey().equals("m/z")) { + mzs = binaryData.getValue(); + } else if(binaryData.getKey().equals("intensity")) { + intensities = binaryData.getValue(); + } + } catch(DataFormatException e) { + logger.error(e); + } + } + double selectedIon = getSelectedIon(spectrum); + massSpectrum.setPrecursorIon(selectedIon); + massSpectrum.setPrecursorBasePeak(getSelectedIonPeakIntensity(spectrum)); + double collisionEnergy = getCollisionEnergy(spectrum); + int ions = Math.min(mzs.length, intensities.length); + for(int i = 0; i < ions; i++) { + if(selectedIon != 0) { + IIonTransition ionTransition = new IonTransition(selectedIon, mzs[i], collisionEnergy, 1, 1, 0); + massSpectrum.addIon(new VendorIon(mzs[i], (float)intensities[i], ionTransition), false); + chromatogram.getIonTransitionSettings().getIonTransitions().add(ionTransition); + } else { + massSpectrum.addIon(new VendorIon(mzs[i], (float)intensities[i]), false); + } + } + } + + private IRegularMassSpectrum readMassSpectrum(SpectrumType spectrum) { + + IRegularMassSpectrum massSpectrum = new VendorMassSpectrum(); + for(CVParamType cvParam : spectrum.getCvParam()) { + if(cvParam.getAccession().equals("MS:1000127") && cvParam.getName().equals("centroid spectrum")) { + massSpectrum.setMassSpectrumType(MassSpectrumType.CENTROID); + } else if(cvParam.getAccession().equals("MS:1000128") && cvParam.getName().equals("profile spectrum")) { + massSpectrum.setMassSpectrumType(MassSpectrumType.PROFILE); + } + if(cvParam.getAccession().equals("MS:1000511") && cvParam.getName().equals("ms level")) { + short msLevel = Short.parseShort(cvParam.getValue()); + massSpectrum.setMassSpectrometer(msLevel); + } + } + return massSpectrum; } } diff --git a/chemclipse/plugins/org.eclipse.chemclipse.msd.converter.supplier.mzml/src/org/eclipse/chemclipse/msd/converter/supplier/mzml/io/XmlMassSpectrumReader.java b/chemclipse/plugins/org.eclipse.chemclipse.msd.converter.supplier.mzml/src/org/eclipse/chemclipse/msd/converter/supplier/mzml/io/XmlMassSpectrumReader.java index d2b5fada79..13d6b87f70 100644 --- a/chemclipse/plugins/org.eclipse.chemclipse.msd.converter.supplier.mzml/src/org/eclipse/chemclipse/msd/converter/supplier/mzml/io/XmlMassSpectrumReader.java +++ b/chemclipse/plugins/org.eclipse.chemclipse.msd.converter.supplier.mzml/src/org/eclipse/chemclipse/msd/converter/supplier/mzml/io/XmlMassSpectrumReader.java @@ -23,7 +23,7 @@ private XmlMassSpectrumReader() { } - public static void addIons(double[] intensities, double[] retentionTimes, IVendorChromatogram chromatogram) { + public static void addTotalIntensities(double[] intensities, double[] retentionTimes, IVendorChromatogram chromatogram) { int tic = Math.min(retentionTimes.length, intensities.length); for(int i = 0; i < tic; i++) {