Skip to content

Commit

Permalink
Set ion precursors correctly.
Browse files Browse the repository at this point in the history
  • Loading branch information
Mailaender committed Oct 16, 2024
1 parent 78e0f1d commit 48d001e
Show file tree
Hide file tree
Showing 3 changed files with 343 additions and 201 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -63,157 +64,236 @@ 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<String, double[]> 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;
}

@Override
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<String, double[]> 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<String, double[]> 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<String, double[]> binaryData = BinaryReader10.parseBinaryData(binaryDataArrayType);
if(binaryData.getKey().equals("m/z")) {
mzs = binaryData.getValue();
} else if(binaryData.getKey().equals("intensity")) {
intensities = binaryData.getValue();
}
}
}
XmlMassSpectrumReader.addTotalSignals(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;
}
}
Loading

0 comments on commit 48d001e

Please sign in to comment.