Skip to content

Commit f616cda

Browse files
committed
#316 - Combined Mass Spectrum
Further improvements are requires to enable mean and median calculations.
1 parent f157fca commit f616cda

15 files changed

+99
-177
lines changed

chemclipse/plugins/org.eclipse.chemclipse.msd.model/src/org/eclipse/chemclipse/msd/model/noise/Calculator.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2010, 2019 Lablicate GmbH.
2+
* Copyright (c) 2010, 2020 Lablicate GmbH.
33
*
44
* All rights reserved. This
55
* program and the accompanying materials are made available under the terms of
@@ -25,7 +25,6 @@
2525
import org.eclipse.chemclipse.msd.model.core.support.IMarkedIons;
2626
import org.eclipse.chemclipse.msd.model.exceptions.FilterException;
2727
import org.eclipse.chemclipse.msd.model.support.CombinedMassSpectrumCalculator;
28-
import org.eclipse.chemclipse.msd.model.support.ICombinedMassSpectrumCalculator;
2928
import org.eclipse.chemclipse.msd.model.xic.IExtractedIonSignal;
3029
import org.eclipse.chemclipse.msd.model.xic.IExtractedIonSignals;
3130
import org.eclipse.chemclipse.numeric.statistics.Calculations;
@@ -53,7 +52,7 @@ public Calculator() {
5352
*/
5453
public ICombinedMassSpectrum getNoiseMassSpectrum(List<ICombinedMassSpectrum> noiseMassSpectra, IMarkedIons ionsToPreserve, IProgressMonitor monitor) {
5554

56-
ICombinedMassSpectrumCalculator combinedMassSpectrumCalculator = new CombinedMassSpectrumCalculator();
55+
CombinedMassSpectrumCalculator combinedMassSpectrumCalculator = new CombinedMassSpectrumCalculator();
5756
/*
5857
* Iterate through all given noise mass spectra.
5958
*/
@@ -126,7 +125,7 @@ private List<INoiseSegment> calculateNoiseSegments(List<IAnalysisSegment> analys
126125
* with the segment. The noise segment will be stored in the
127126
* noise segment list.
128127
*/
129-
ICombinedMassSpectrumCalculator combinedMassSpectrumCalculator = calculatorSupport.getCombinedMassSpectrumCalculator(analysisSegment, extractedIonSignals);
128+
CombinedMassSpectrumCalculator combinedMassSpectrumCalculator = calculatorSupport.getCombinedMassSpectrumCalculator(analysisSegment, extractedIonSignals);
130129
ICombinedMassSpectrum noiseMassSpectrum = calculatorSupport.getNoiseMassSpectrum(combinedMassSpectrumCalculator, ionsToPreserve, monitor);
131130
INoiseSegment noiseSegment = new NoiseSegment(analysisSegment, noiseMassSpectrum);
132131
noiseSegments.add(noiseSegment);

chemclipse/plugins/org.eclipse.chemclipse.msd.model/src/org/eclipse/chemclipse/msd/model/noise/CalculatorSupport.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2010, 2019 Lablicate GmbH.
2+
* Copyright (c) 2010, 2020 Lablicate GmbH.
33
*
44
* All rights reserved. This
55
* program and the accompanying materials are made available under the terms of
@@ -29,7 +29,6 @@
2929
import org.eclipse.chemclipse.msd.model.implementation.CombinedMassSpectrum;
3030
import org.eclipse.chemclipse.msd.model.implementation.Ion;
3131
import org.eclipse.chemclipse.msd.model.support.CombinedMassSpectrumCalculator;
32-
import org.eclipse.chemclipse.msd.model.support.ICombinedMassSpectrumCalculator;
3332
import org.eclipse.chemclipse.msd.model.xic.IExtractedIonSignal;
3433
import org.eclipse.chemclipse.msd.model.xic.IExtractedIonSignals;
3534
import org.eclipse.core.runtime.IProgressMonitor;
@@ -61,10 +60,10 @@ public boolean acceptSegment(double[] values, double mean) {
6160
*
6261
* @return
6362
*/
64-
public ICombinedMassSpectrumCalculator getCombinedMassSpectrumCalculator(IAnalysisSegment analysisSegment, IExtractedIonSignals extractedIonSignals) {
63+
public CombinedMassSpectrumCalculator getCombinedMassSpectrumCalculator(IAnalysisSegment analysisSegment, IExtractedIonSignals extractedIonSignals) {
6564

6665
IExtractedIonSignal extractedIonSignal;
67-
ICombinedMassSpectrumCalculator combinedMassSpectrumCalculator = new CombinedMassSpectrumCalculator();
66+
CombinedMassSpectrumCalculator combinedMassSpectrumCalculator = new CombinedMassSpectrumCalculator();
6867
for(int scan = analysisSegment.getStartScan(); scan <= analysisSegment.getStopScan(); scan++) {
6968
try {
7069
extractedIonSignal = extractedIonSignals.getExtractedIonSignal(scan);
@@ -83,7 +82,7 @@ public ICombinedMassSpectrumCalculator getCombinedMassSpectrumCalculator(IAnalys
8382

8483
public static ICombinedMassSpectrum getCombinedMassSpectrum(IExtractedIonSignals extractedIonSignals, IScanRange range) {
8584

86-
ICombinedMassSpectrumCalculator combinedMassSpectrumCalculator = new CombinedMassSpectrumCalculator();
85+
CombinedMassSpectrumCalculator combinedMassSpectrumCalculator = new CombinedMassSpectrumCalculator();
8786
for(int scan = range.getStartScan(); scan <= range.getStopScan(); scan++) {
8887
try {
8988
IExtractedIonSignal extractedIonSignal = extractedIonSignals.getExtractedIonSignal(scan);
@@ -100,7 +99,7 @@ public static ICombinedMassSpectrum getCombinedMassSpectrum(IExtractedIonSignals
10099
float abundance;
101100
ICombinedMassSpectrum noiseMassSpectrum = new CombinedMassSpectrum();
102101
IIon noiseIon;
103-
Map<Integer, Double> ions = combinedMassSpectrumCalculator.getValues();
102+
Map<Integer, Double> ions = combinedMassSpectrumCalculator.getValuesIntensities();
104103
for(Integer ion : ions.keySet()) {
105104
/*
106105
* Check the abundance.
@@ -121,7 +120,7 @@ public static ICombinedMassSpectrum getCombinedMassSpectrum(IExtractedIonSignals
121120
/*
122121
* Returns a combined mass spectrum.
123122
*/
124-
public ICombinedMassSpectrum getNoiseMassSpectrum(ICombinedMassSpectrumCalculator combinedMassSpectrumCalculator, IMarkedIons ionsToPreserve, IProgressMonitor monitor) {
123+
public ICombinedMassSpectrum getNoiseMassSpectrum(CombinedMassSpectrumCalculator combinedMassSpectrumCalculator, IMarkedIons ionsToPreserve, IProgressMonitor monitor) {
125124

126125
/*
127126
* Remove the ions to preserve.
@@ -138,7 +137,7 @@ public ICombinedMassSpectrum getNoiseMassSpectrum(ICombinedMassSpectrumCalculato
138137
float abundance;
139138
ICombinedMassSpectrum noiseMassSpectrum = new CombinedMassSpectrum();
140139
IIon noiseIon;
141-
Map<Integer, Double> ions = combinedMassSpectrumCalculator.getValues();
140+
Map<Integer, Double> ions = combinedMassSpectrumCalculator.getValuesIntensities();
142141
for(Integer ion : ions.keySet()) {
143142
/*
144143
* Check the abundance.
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2008, 2018 Lablicate GmbH.
2+
* Copyright (c) 2008, 2020 Lablicate GmbH.
33
*
44
* All rights reserved.
55
* This program and the accompanying materials are made available under the
@@ -11,6 +11,7 @@
1111
*******************************************************************************/
1212
package org.eclipse.chemclipse.msd.model.support;
1313

14+
import java.util.ArrayList;
1415
import java.util.Collections;
1516
import java.util.HashMap;
1617
import java.util.List;
@@ -20,41 +21,38 @@
2021
import org.eclipse.chemclipse.msd.model.core.AbstractIon;
2122
import org.eclipse.chemclipse.msd.model.core.IIon;
2223
import org.eclipse.chemclipse.msd.model.core.support.IMarkedIons;
24+
import org.eclipse.chemclipse.numeric.statistics.Calculations;
2325

24-
public class CombinedMassSpectrumCalculator implements ICombinedMassSpectrumCalculator {
26+
public class CombinedMassSpectrumCalculator {
2527

26-
private Map<Integer, Double> combinedMassSpectrum;
28+
private Map<Integer, List<Double>> combinedMassSpectrum = new HashMap<Integer, List<Double>>();
2729

28-
public CombinedMassSpectrumCalculator() {
29-
combinedMassSpectrum = new HashMap<Integer, Double>();
30-
}
31-
32-
@Override
33-
public void addIon(double ion, float abundance) {
30+
public void addIon(double ion, double abundance) {
3431

3532
/*
3633
* If the abundance is zero, do nothing and return.
3734
*/
38-
if(abundance == 0.0f) {
35+
if(abundance == 0.0d) {
3936
return;
4037
}
4138
int key = AbstractIon.getIon(ion);
4239
/*
4340
* Add the abundance if still a ion exists, otherwise still add the ion.
4441
*/
45-
if(combinedMassSpectrum.containsKey(key)) {
46-
combinedMassSpectrum.put(key, combinedMassSpectrum.get(key) + abundance);
47-
} else {
48-
combinedMassSpectrum.put(key, (double)abundance);
42+
List<Double> intensities = combinedMassSpectrum.get(key);
43+
if(intensities == null) {
44+
intensities = new ArrayList<Double>();
45+
combinedMassSpectrum.put(key, intensities);
4946
}
47+
intensities.add(abundance);
5048
}
5149

52-
@Override
5350
public void addIons(List<IIon> ions, IMarkedIons excludedIons) {
5451

5552
if(ions == null || excludedIons == null) {
5653
return;
5754
}
55+
//
5856
Set<Integer> excludedIonsNominal = excludedIons.getIonsNominal();
5957
for(IIon ion : ions) {
6058
if(!excludedIonsNominal.contains(ion.getIon())) {
@@ -63,39 +61,39 @@ public void addIons(List<IIon> ions, IMarkedIons excludedIons) {
6361
}
6462
}
6563

66-
@Override
6764
public void removeIon(double ion) {
6865

6966
int key = AbstractIon.getIon(ion);
7067
combinedMassSpectrum.remove(key);
7168
}
7269

73-
@Override
7470
public void removeIons(IMarkedIons excludedIons) {
7571

7672
for(Integer ion : excludedIons.getIonsNominal()) {
7773
combinedMassSpectrum.remove(ion);
7874
}
7975
}
8076

81-
@Override
8277
public double getAbundance(double ion) {
8378

84-
double result = 0.0d;
8579
int key = AbstractIon.getIon(ion);
86-
if(combinedMassSpectrum.containsKey(key)) {
87-
result = combinedMassSpectrum.get(key);
88-
}
89-
return result;
80+
return calculateSumIntensity(combinedMassSpectrum.get(key));
9081
}
9182

92-
@Override
93-
public Map<Integer, Double> getValues() {
83+
public Map<Integer, List<Double>> getValues() {
9484

9585
return combinedMassSpectrum;
9686
}
9787

98-
@Override
88+
public Map<Integer, Double> getValuesIntensities() {
89+
90+
Map<Integer, Double> map = new HashMap<>();
91+
for(Integer key : combinedMassSpectrum.keySet()) {
92+
map.put(key, calculateSumIntensity(combinedMassSpectrum.get(key)));
93+
}
94+
return map;
95+
}
96+
9997
public void normalize(float normalizationFactor) {
10098

10199
/*
@@ -107,15 +105,38 @@ public void normalize(float normalizationFactor) {
107105
/*
108106
* If max is zero it doesn't even make sense to go further on.
109107
*/
110-
double max = Collections.max(combinedMassSpectrum.values());
108+
double max = Collections.max(getValuesIntensities().values());
111109
if(max == 0.0d) {
112110
return;
113111
}
112+
//
114113
double correlationFactor = normalizationFactor / max;
115-
double value;
116114
for(Integer key : combinedMassSpectrum.keySet()) {
117-
value = correlationFactor * combinedMassSpectrum.get(key);
118-
combinedMassSpectrum.put(key, value);
115+
List<Double> adjustedIntensities = new ArrayList<>();
116+
for(double intensity : combinedMassSpectrum.get(key)) {
117+
adjustedIntensities.add(correlationFactor * intensity);
118+
}
119+
combinedMassSpectrum.put(key, adjustedIntensities);
120+
}
121+
}
122+
123+
public double calculateSumIntensity(List<Double> intensities) {
124+
125+
double sum = 0.0d;
126+
if(intensities != null) {
127+
int size = intensities.size();
128+
double[] values = new double[size];
129+
for(int i = 0; i < size; i++) {
130+
values[i] = intensities.get(i);
131+
}
132+
/*
133+
* Add an option here to calculate the sum,
134+
* mean or median signal.
135+
*/
136+
sum = Calculations.getSum(values);
137+
// sum = Calculations.getMean(values);
138+
// sum = Calculations.getMedian(values);
119139
}
140+
return sum;
120141
}
121142
}

chemclipse/plugins/org.eclipse.chemclipse.msd.model/src/org/eclipse/chemclipse/msd/model/support/FilterSupport.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public static IScanMSD getCombinedMassSpectrum(IChromatogramSelectionMSD chromat
5151
IChromatogramMSD chromatogram = chromatogramSelection.getChromatogram();
5252
int startScan = chromatogram.getScanNumber(chromatogramSelection.getStartRetentionTime());
5353
int stopScan = chromatogram.getScanNumber(chromatogramSelection.getStopRetentionTime());
54-
ICombinedMassSpectrumCalculator massSpectrumCalculator = new CombinedMassSpectrumCalculator();
54+
CombinedMassSpectrumCalculator massSpectrumCalculator = new CombinedMassSpectrumCalculator();
5555
/*
5656
* Merge all selected scans.<br/> All scan intensities will be added.
5757
* Afterwards, they will be normalized.<br/> It would be also possible
@@ -88,7 +88,7 @@ public static IScanMSD getCombinedMassSpectrum(IScanMSD massSpectrum1, IScanMSD
8888
* If one of the mass spectra is null, take only the valid one to calculate the normalized mass spectrum.
8989
*/
9090
excludedIons = validateExcludedIons(excludedIons);
91-
ICombinedMassSpectrumCalculator massSpectrumCalculator = new CombinedMassSpectrumCalculator();
91+
CombinedMassSpectrumCalculator massSpectrumCalculator = new CombinedMassSpectrumCalculator();
9292
//
9393
if(massSpectrum1 == null) {
9494
addIonsToCalculator(massSpectrum2, excludedIons, massSpectrumCalculator, useNormalize);
@@ -104,7 +104,7 @@ public static IScanMSD getCombinedMassSpectrum(IScanMSD massSpectrum1, IScanMSD
104104
return getMassSpectrum(massSpectrumCalculator, useNormalize);
105105
}
106106

107-
private static void addIonsToCalculator(IScanMSD massSpectrum, IMarkedIons excludedIons, ICombinedMassSpectrumCalculator massSpectrumCalculator, boolean useNormalize) {
107+
private static void addIonsToCalculator(IScanMSD massSpectrum, IMarkedIons excludedIons, CombinedMassSpectrumCalculator massSpectrumCalculator, boolean useNormalize) {
108108

109109
IScanMSD massSpectrumCalculated = getCalculatedMassSpectrum(massSpectrum, excludedIons, useNormalize);
110110
massSpectrumCalculator.addIons(massSpectrumCalculated.getIons(), excludedIons);
@@ -125,7 +125,7 @@ public static IScanMSD getCalculatedMassSpectrum(IScanMSD massSpectrum, IMarkedI
125125
}
126126
excludedIons = validateExcludedIons(excludedIons);
127127
//
128-
ICombinedMassSpectrumCalculator massSpectrumCalculator = new CombinedMassSpectrumCalculator();
128+
CombinedMassSpectrumCalculator massSpectrumCalculator = new CombinedMassSpectrumCalculator();
129129
massSpectrumCalculator.addIons(massSpectrum.getIons(), excludedIons);
130130
return getMassSpectrum(massSpectrumCalculator, useNormalize);
131131
}
@@ -153,12 +153,12 @@ private static IMarkedIons validateExcludedIons(IMarkedIons excludedIons) {
153153
* @param massSpectrumCalculator
154154
* @return IMassSpectrum
155155
*/
156-
private static IScanMSD getMassSpectrum(ICombinedMassSpectrumCalculator massSpectrumCalculator, boolean useNormalize) {
156+
private static IScanMSD getMassSpectrum(CombinedMassSpectrumCalculator massSpectrumCalculator, boolean useNormalize) {
157157

158158
if(useNormalize) {
159159
massSpectrumCalculator.normalize(NORMALIZATION_FACTOR);
160160
}
161-
Map<Integer, Double> ions = massSpectrumCalculator.getValues();
161+
Map<Integer, Double> ions = massSpectrumCalculator.getValuesIntensities();
162162
return getMassSpectrum(ions);
163163
}
164164

chemclipse/plugins/org.eclipse.chemclipse.msd.model/src/org/eclipse/chemclipse/msd/model/support/ICombinedMassSpectrumCalculator.java

Lines changed: 0 additions & 83 deletions
This file was deleted.

0 commit comments

Comments
 (0)