diff --git a/src/main/java/nl/wur/bif/pantools/pantools/Pantools.java b/src/main/java/nl/wur/bif/pantools/pantools/Pantools.java index 48003ad02979fe69de9d54bfdfab93751b7aa7f8..2edf53658d53a5bd4654b6fd4337891883e1c4c0 100644 --- a/src/main/java/nl/wur/bif/pantools/pantools/Pantools.java +++ b/src/main/java/nl/wur/bif/pantools/pantools/Pantools.java @@ -10,6 +10,7 @@ package nl.wur.bif.pantools.pantools; import nl.wur.bif.pantools.cli.Map; import nl.wur.bif.pantools.cli.*; import nl.wur.bif.pantools.pangenome.PangenomeGraph; +import nl.wur.bif.pantools.panva.panva_get_similarity.PanvaGetSimilarityCLI; import nl.wur.bif.pantools.utils.ConsoleInput; import nl.wur.bif.pantools.utils.Globals; import org.apache.commons.io.FileUtils; @@ -103,7 +104,8 @@ import static picocli.CommandLine.ScopeType.INHERIT; RetrieveRegions.class, MSA.class, Map.class, - ExportPangenome.class + ExportPangenome.class, + PanvaGetSimilarityCLI.class }) public class Pantools { @Parameters(descriptionKey = "database-path", index = "0", scope = INHERIT) diff --git a/src/main/java/nl/wur/bif/pantools/panva/panva_get_similarity/PanvaGetSimilarity.java b/src/main/java/nl/wur/bif/pantools/panva/panva_get_similarity/PanvaGetSimilarity.java new file mode 100644 index 0000000000000000000000000000000000000000..38f217f95da38ce42ebfdf7ec4613d51c9bbf9ce --- /dev/null +++ b/src/main/java/nl/wur/bif/pantools/panva/panva_get_similarity/PanvaGetSimilarity.java @@ -0,0 +1,62 @@ +package nl.wur.bif.pantools.panva.panva_get_similarity; + +import nl.wur.bif.pantools.utils.Globals; +import org.neo4j.graphdb.*; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import static nl.wur.bif.pantools.utils.Globals.mRNA_label; + +public class PanvaGetSimilarity { + private final GraphDatabaseService graphDb; + final BufferedWriter writer; + + public PanvaGetSimilarity(GraphDatabaseService graphDb, Path databaseDirectory) throws IOException { + this.graphDb = graphDb; + this.writer = createOutputWriter(databaseDirectory); + getSimilarity(); + } + + private BufferedWriter createOutputWriter(Path databaseDirectory) throws IOException { + final Path outputFile = databaseDirectory.resolve("panva").resolve("similarity_scores.csv"); + Files.createDirectories(outputFile.getParent()); + return new BufferedWriter(new FileWriter(outputFile.toFile())); + } + + private void getSimilarity() throws IOException { + writer.write("genome1,mRNA1,genome2,mRNA2,similarity\n"); + try (Transaction ignored = graphDb.beginTx()) { + final ResourceIterable<Relationship> relationships = graphDb.getAllRelationships(); + relationships.stream().iterator().forEachRemaining(this::readSimilarityScore); + } + writer.close(); + } + + private void readSimilarityScore(Relationship relationship) { + if (!relationship.isType(Globals.RelTypes.is_similar_to)) return; + final Node startNode = relationship.getStartNode(); + assert startNode.hasLabel(mRNA_label); + final Node endNode = relationship.getEndNode(); + assert endNode.hasLabel(mRNA_label); + final String startNodeId = (String) startNode.getProperty("id"); + final String endNodeId = (String) endNode.getProperty("id"); + final int startGenome = (int) startNode.getProperty("genome"); + final int endGenome = (int) endNode.getProperty("genome"); + final String similarity = String.valueOf((double) relationship.getProperty("similarity")); + try { + writer.write(String.join(",", + Integer.toString(startGenome), + startNodeId, + Integer.toString(endGenome), + endNodeId, + similarity)); + writer.write("\n"); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/nl/wur/bif/pantools/panva/panva_get_similarity/PanvaGetSimilarityCLI.java b/src/main/java/nl/wur/bif/pantools/panva/panva_get_similarity/PanvaGetSimilarityCLI.java new file mode 100644 index 0000000000000000000000000000000000000000..1b77f179a86fac0752c9c1f5cd394ccc1cd9439b --- /dev/null +++ b/src/main/java/nl/wur/bif/pantools/panva/panva_get_similarity/PanvaGetSimilarityCLI.java @@ -0,0 +1,39 @@ +package nl.wur.bif.pantools.panva.panva_get_similarity; + +import nl.wur.bif.pantools.cli.validation.BeanValidation; +import nl.wur.bif.pantools.pantools.Pantools; +import org.neo4j.graphdb.GraphDatabaseService; +import picocli.CommandLine.Model.CommandSpec; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.concurrent.Callable; + +import static nl.wur.bif.pantools.cli.validation.Constraints.*; +import static picocli.CommandLine.*; + +/** + * Command line interface for pantools panva_similarity_scores + * + * @author Robin van Esch, Wageningen University, the Netherlands + */ +@Command(name = "panva_get_similarity") +public class PanvaGetSimilarityCLI implements Callable<Integer> { + + @Spec CommandSpec spec; + + @ParentCommand + @GraphDatabase + private Pantools pantools; + + @Override + public Integer call() throws IOException { + pantools.createLogger(spec); + new BeanValidation().argValidation(spec, this); + pantools.setPangenomeGraph(); + final Path databaseDirectory = pantools.getDatabaseDirectory(); + final GraphDatabaseService graphDb = pantools.pangenomeGraph().getGraphDb(); + new PanvaGetSimilarity(graphDb, databaseDirectory); + return 0; + } +}