Map<Integer, Map<Range, List<MassCandidate>>> massRanges = new HashMap<Integer, Map<Range, List<MassCandidate>>>();
for (List<MassCandidate> masses : massCandidates.values()) {
for (MassCandidate m : masses) {
int mass = m.getIonMass();
Range range = getRIWindow(m);
// Create a new HashMap entry with a simple Range Comparator if
// this is a new mass
if (!massRanges.containsKey(mass)) {
massRanges.put(mass,
new TreeMap<Range, List<MassCandidate>>(
new RangeComparator()));
totalScans += 2;
}
// Otherwise, search through all ranges
else {
Map<Range, List<MassCandidate>> map = massRanges.get(mass);
Iterator<Map.Entry<Range, List<MassCandidate>>> iter = map
.entrySet().iterator();
boolean matched = false;
while (iter.hasNext()) {
Map.Entry<Range, List<MassCandidate>> e = iter.next();
// If the range overlaps, remove the old key, extend it,
// and re-add the list with the new key
if (rangeOverlaps(e.getKey(), range)) {
List<MassCandidate> tmpList = e.getValue();
tmpList.add(m);
Range matchedRange = e.getKey();
map.remove(e.getKey());
matchedRange.extendRange(range);
map.put(matchedRange, tmpList);
matched = true;
break;
}
}
// If no match is found, add another range entry
if (!matched) {
List<MassCandidate> tmpList = new ArrayList<MassCandidate>();
tmpList.add(m);
massRanges.get(mass).put(range, tmpList);
}
}
}
processedScans++;
}
// Combine any possible overlapping ranges
for (Integer mass : massRanges.keySet()) {
Map<Range, List<MassCandidate>> map = massRanges.get(mass);
Range[] keys = map.keySet().toArray(new Range[map.size()]);
for (int i = 0; i < keys.length - 1;) {
if (rangeOverlaps(keys[i], keys[i + 1])) {
List<MassCandidate> tmpList = map.get(keys[i]);
tmpList.addAll(map.get(keys[i + 1]));
Range tmpRange = new Range(keys[i]);
tmpRange.extendRange(keys[i + 1]);
map.remove(keys[i]);
map.remove(keys[i + 1]);
map.put(tmpRange, tmpList);