Skip to content

Commit

Permalink
Merge branch '53-remove-isclosingafterparsing-from-de-unijena-bioinf-…
Browse files Browse the repository at this point in the history
…babelms-parser-and-allow-for-multiple-calls' into 'master'

Resolve "Remove `isClosingAfterParsing` from `de.unijena.bioinf.babelms.Parser` and allow for multiple calls to parse"

Closes #53

See merge request bright-giant/sirius/sirius-libs!28
  • Loading branch information
Markus Fleischauer committed Jan 11, 2024
2 parents b706b87 + 41e1b5d commit ef07ed0
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 49 deletions.
35 changes: 9 additions & 26 deletions io/src/main/java/de/unijena/bioinf/babelms/GenericParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -81,30 +81,25 @@ public void close() {
}

BufferedReader reader = r;
T elem = parse(reader, source);
T nextElement = parse(reader, source);

@Override
public boolean hasNext() {
if (elem == null) tryclose(); //for reader without any element
if (nextElement == null) tryclose(); //for reader without any element
return reader != null;
}

@Override
public T next() {
T mem = elem;
T current = nextElement;
try {
if (parser.isClosingAfterParsing()) {
reader = null;
elem = null;
return mem;
}
elem = parse(reader, source);
nextElement = parse(reader, source);
} catch (IOException e) {
tryclose();
throw new RuntimeException(e);
}
if (elem == null) tryclose();
return mem;
if (nextElement == null) tryclose();
return current;
}

private void tryclose() {
Expand Down Expand Up @@ -135,25 +130,13 @@ public CloseableIterator<T> parseFromPathIterator(Path file) throws IOException


public List<T> parseFromFile(File file) throws IOException {
BufferedReader reader = null;
final URI source = file.toURI();
try {
reader = FileUtils.ensureBuffering(new FileReader(file));
final ArrayList<T> list = new ArrayList<>();
T elem = parse(reader,source);
if (parser.isClosingAfterParsing()) {
list.add(elem);
} else {
while (elem != null) {
list.add(elem);
elem = parse(reader, source);
}
}
try (BufferedReader reader = FileUtils.ensureBuffering(new FileReader(file))) {
List<T> list = new ArrayList<>();
parseIterator(reader, source).forEachRemaining(list::add);
return list;
} catch (IOException e) {
throw new IOException("Error while parsing " + file.getName(), e);
} finally {
if (reader != null) reader.close();
}
}

Expand Down
5 changes: 0 additions & 5 deletions io/src/main/java/de/unijena/bioinf/babelms/Parser.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,4 @@ public interface Parser<T> {
* @throws IOException if an IO error happens
*/
T parse(BufferedReader reader, URI source) throws IOException;

default boolean isClosingAfterParsing() {
return false;
}

}
23 changes: 10 additions & 13 deletions io/src/main/java/de/unijena/bioinf/babelms/json/FTJsonReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ public class FTJsonReader implements Parser<FTree> {

protected final HashMap<String, MolecularFormula> formulaCache;

private Reader consumedReader = null;

public FTJsonReader() {
this.formulaCache = new HashMap<>();
}
Expand All @@ -82,17 +84,16 @@ public FTree treeFromJsonString(String reader, URI source) throws IOException {
return treeFromJson(new StringReader(reader), source);
}

@Override
public boolean isClosingAfterParsing() {
return true;
}

public FTree treeFromJson(Reader reader, URI source) throws IOException {
if (reader == consumedReader) {
return null;
}
final JsonNode docRoot = new ObjectMapper().readTree(reader);
consumedReader = reader;
return treeFromJson(docRoot, source);
}

public FTree treeFromJson(@NotNull final JsonNode docRoot, @Nullable URI source) throws IOException {
public FTree treeFromJson(@NotNull final JsonNode docRoot, @Nullable URI source) {
final DescriptorRegistry registry = DescriptorRegistry.getInstance();
double score = 0d;
double scoreBoost = 0d;
Expand Down Expand Up @@ -138,9 +139,7 @@ public FTree treeFromJson(@NotNull final JsonNode docRoot, @Nullable URI source)
incomingLossMap.put(bInfo, loss);
byId = true;
}
} catch (UnsupportedOperationException e) {

}
} catch (UnsupportedOperationException ignored) {}

if (!byId) {
//this is for backwards compatibility, from now on we use ids to map
Expand All @@ -155,7 +154,7 @@ public FTree treeFromJson(@NotNull final JsonNode docRoot, @Nullable URI source)
}


final ArrayDeque<Fragment> stack = new ArrayDeque<Fragment>();
final ArrayDeque<Fragment> stack = new ArrayDeque<>();
stack.push(tree.getRoot());
while (!stack.isEmpty()) {
final Fragment u = stack.pollFirst();
Expand Down Expand Up @@ -260,9 +259,7 @@ private FragmentInfo getRootInfo(JsonNode
if (fragmentInfo == null) throw new RuntimeException("Cannot determine root fragment");
return fragmentInfo;
}
} catch (UnsupportedOperationException e) {

}
} catch (UnsupportedOperationException ignored) {}

//this is for backwards compatibility, from now on we use ids to map
final MolecularFormula f = formula(rootElement.asText());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

package de.unijena.bioinf.babelms.json;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.unijena.bioinf.ChemistryBase.ms.Ms2Experiment;
Expand All @@ -33,12 +34,16 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayDeque;
import java.util.List;
import java.util.Queue;

@Slf4j
public class JsonExperimentParserDispatcher implements Parser<Ms2Experiment> {

private final List<JsonExperimentParser> parsers;
private BufferedReader consumedReader;
private Queue<JsonNode> nextRoots;

public JsonExperimentParserDispatcher() {
this.parsers = List.of(
Expand All @@ -49,7 +54,31 @@ public JsonExperimentParserDispatcher() {

@Override
public Ms2Experiment parse(BufferedReader reader, URI source) throws IOException {
if (reader == consumedReader) {
if (nextRoots == null || nextRoots.isEmpty()) {
return null;
} else {
return parseNextRoot(source);
}
}

JsonNode root = new ObjectMapper().readTree(reader);
consumedReader = reader;

if (root.isArray()) {
nextRoots = new ArrayDeque<>();
root.forEach(nextRoots::add);
return parseNextRoot(source);
}
return parseRoot(root, source);
}

private Ms2Experiment parseNextRoot(URI source) throws JsonProcessingException {
JsonNode root = nextRoots.remove();
return parseRoot(root, source);
}

public Ms2Experiment parseRoot(JsonNode root, URI source) throws JsonProcessingException {
for (JsonExperimentParser parser : parsers) {
if (parser.canParse(root)) {
Ms2Experiment experiment = parser.parse(root);
Expand All @@ -60,9 +89,4 @@ public Ms2Experiment parse(BufferedReader reader, URI source) throws IOException
log.warn("Could not parse an experiment from json " + source);
return null;
}

@Override
public boolean isClosingAfterParsing() {
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,16 @@
import de.unijena.bioinf.ChemistryBase.chem.InChI;
import de.unijena.bioinf.ChemistryBase.chem.Smiles;
import de.unijena.bioinf.ChemistryBase.ms.*;
import de.unijena.bioinf.babelms.MsExperimentParser;
import de.unijena.bioinf.babelms.ParserTestUtils;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Objects;

import static de.unijena.bioinf.babelms.ParserTestUtils.loadExperiment;
import static org.junit.jupiter.api.Assertions.assertEquals;
Expand Down Expand Up @@ -69,4 +74,15 @@ public void testParseSpectrum() throws IOException {
assertEquals(940.25, experiment.getIonMass(), 1e-9);
assertEquals("splash10-00dl-0000011189-7d4b9e412ca92d989b2d", experiment.getAnnotation(Splash.class).orElseThrow().getSplash());
}

@Test
public void testRootArray() throws IOException {
File input = new File(Objects.requireNonNull(ParserTestUtils.class.getClassLoader().getResource("gnps/spectrum_array.json")).getFile());
List<Ms2Experiment> experiments = new MsExperimentParser().getParser(input).parseFromFile(input);

assertEquals(3, experiments.size());
assertEquals(1.0, experiments.get(0).getIonMass());
assertEquals(2.0, experiments.get(1).getIonMass());
assertEquals(3.0, experiments.get(2).getIonMass());
}
}
23 changes: 23 additions & 0 deletions io/src/test/resources/gnps/spectrum_array.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
[
{
"n_peaks": 1,
"peaks": [[1,1]],
"precursor_charge": 0,
"precursor_mz": 1,
"splash": ""
},
{
"n_peaks": 1,
"peaks": [[1,1]],
"precursor_charge": 0,
"precursor_mz": 2,
"splash": ""
},
{
"n_peaks": 1,
"peaks": [[1,1]],
"precursor_charge": 0,
"precursor_mz": 3,
"splash": ""
}
]

0 comments on commit ef07ed0

Please sign in to comment.