From f7e315806fb5b9b3262e37bc0422c8807017f050 Mon Sep 17 00:00:00 2001 From: Philip Wenig Date: Thu, 16 Jul 2026 12:22:35 +0200 Subject: [PATCH] Condense tandem MS data when multiple traces option is used. --- .../msd/model/support/TandemDataSupport.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/chemclipse/plugins/org.eclipse.chemclipse.msd.model/src/org/eclipse/chemclipse/msd/model/support/TandemDataSupport.java b/chemclipse/plugins/org.eclipse.chemclipse.msd.model/src/org/eclipse/chemclipse/msd/model/support/TandemDataSupport.java index 6bda62ad96..8d6edddeb5 100644 --- a/chemclipse/plugins/org.eclipse.chemclipse.msd.model/src/org/eclipse/chemclipse/msd/model/support/TandemDataSupport.java +++ b/chemclipse/plugins/org.eclipse.chemclipse.msd.model/src/org/eclipse/chemclipse/msd/model/support/TandemDataSupport.java @@ -25,12 +25,15 @@ import org.eclipse.chemclipse.model.core.support.HeaderField; import org.eclipse.chemclipse.model.support.ChromatogramSupport; import org.eclipse.chemclipse.model.support.HeaderUtil; +import org.eclipse.chemclipse.msd.model.core.AbstractIon; import org.eclipse.chemclipse.msd.model.core.IChromatogramMSD; import org.eclipse.chemclipse.msd.model.core.IIon; import org.eclipse.chemclipse.msd.model.core.IIonMSn; import org.eclipse.chemclipse.msd.model.core.IIonTransition; import org.eclipse.chemclipse.msd.model.core.IScanMSD; import org.eclipse.chemclipse.msd.model.implementation.ChromatogramMSD; +import org.eclipse.chemclipse.msd.model.implementation.IonMSn; +import org.eclipse.chemclipse.msd.model.implementation.IonTransition; import org.eclipse.chemclipse.msd.model.implementation.RegularMassSpectrum; import org.eclipse.chemclipse.support.text.ValueFormat; import org.eclipse.chemclipse.support.traces.TraceTandemMSD; @@ -118,12 +121,46 @@ public static List extractTandemData(IChromatogramMSD chromato enforceFullTimeRange = true; // needed to map all traces Map> scanIonsMap = new HashMap<>(); collectTraces(new ArrayList<>(traces), scanRangesMap, retentionTimes, scanIonsMap); + condenseTraces(scanIonsMap); createReferenceChromatogram(chromatograms, chromatogramMSD, retentionTimes, scanIonsMap, headerField, "Multiple Traces", enforceFullTimeRange); } return chromatograms; } + private static void condenseTraces(Map> scanIonsMap) { + + for(Map.Entry> entry : scanIonsMap.entrySet()) { + Map ionMap = new HashMap<>(); + List ions = entry.getValue(); + for(IIon ion : ions) { + if(ion instanceof IIonMSn ionMSn) { + IIonTransition ionTransition = ionMSn.getIonTransition(); + double parent = ionTransition.getQ1Ion(); + int daughter = AbstractIon.getIon(ionTransition.getQ3Ion()); + int collisionEnergy = (int)ionTransition.getCollisionEnergy(); + String tandemIdentifier = Double.toString(parent) + "_" + Integer.toString(daughter) + "_" + Integer.toString(collisionEnergy); + IIon ionMapped = ionMap.get(tandemIdentifier); + if(ionMapped == null) { + double filter1Resolution = ionTransition.getQ1Resolution(); + double filter3Resolution = ionTransition.getQ3Resolution(); + int transitionGroup = ionTransition.getTransitionGroup(); + IIonTransition ionTransitionCopy = new IonTransition(parent, daughter, collisionEnergy, filter1Resolution, filter3Resolution, transitionGroup); + ionMapped = new IonMSn(daughter, ion.getAbundance(), ionTransitionCopy); + ionMap.put(tandemIdentifier, ionMapped); + } else { + ionMapped.setAbundance(ionMapped.getAbundance() + ion.getAbundance()); + } + } + } + /* + * Clean Ions + */ + ions.clear(); + ions.addAll(ionMap.values()); + } + } + private static boolean matches(TraceTandemMSD trace, IIonMSn ion) { IIonTransition ionTransition = ion.getIonTransition();