diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/attributes/ExtractPathways.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/attributes/ExtractPathways.java new file mode 100644 index 0000000000000000000000000000000000000000..fdac9589509d4e8b93c263aed3c0e0b96269673d --- /dev/null +++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/attributes/ExtractPathways.java @@ -0,0 +1,99 @@ +package fr.inrae.toulouse.metexplore.met4j_toolbox.attributes; + +import fr.inrae.toulouse.metexplore.met4j_core.biodata.*; +import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection; +import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.JsbmlReader; +import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.Met4jSbmlReaderException; +import fr.inrae.toulouse.metexplore.met4j_io.jsbml.writer.JsbmlWriter; +import fr.inrae.toulouse.metexplore.met4j_io.jsbml.writer.Met4jSbmlWriterException; +import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication; +import org.kohsuke.args4j.Option; + +import java.io.IOException; + +public class ExtractPathways extends AbstractMet4jApplication { + + @Option(name = "-i", usage = "input SBML file", required = true) + public String inputPath = null; + + @Option(name = "-o", usage = "output SBML file", required = true) + public String outputPath = null; + + @Option(name = "-p", usage = "pathway identifiers, separated by \"+\" sign if more than one", required = true) + public String pathwayId = null; + + public static void main(String[] args) throws IOException, Met4jSbmlReaderException, Met4jSbmlWriterException { + + ExtractPathways app = new ExtractPathways(); + + app.parseArguments(args); + + app.run(); + + } + + + public void run() throws IOException, Met4jSbmlReaderException, Met4jSbmlWriterException { + //read smbl + JsbmlReader reader = new JsbmlReader(this.inputPath); + BioNetwork network = reader.read(); + System.out.println("Number of reactions in original network: "+network.getReactionsView().size()); + System.out.println("Number of species in original network: "+network.getMetabolitesView().size()); + System.out.println("Number of genes in original network: "+network.getGenesView().size()); + + + //get all reactions & metabolites + BioCollection<BioReaction> reactions = new BioCollection<>(network.getReactionsView()); + BioCollection<BioMetabolite> metabolites = new BioCollection<>(network.getMetabolitesView()); + BioCollection<BioGene> genes = new BioCollection<>(network.getGenesView()); + + //get pathways + BioCollection<BioPathway> pathways = new BioCollection<>(); + for(String id : pathwayId.split("\\+")){ + BioPathway pathway = network.getPathwaysView().get(id); + if(pathway!=null){ + pathways.add(pathway); + System.out.println("Number of reactions in pathway "+pathway.getName()+" ("+id+"): "+network.getReactionsFromPathways(pathway).size()); + System.out.println("Number of species in pathway "+pathway.getName()+" ("+id+"): "+network.getMetabolitesFromPathway(pathway).size()); + System.out.println("Number of genes in pathway "+pathway.getName()+" ("+id+"): "+network.getGenesFromPathways(pathway).size()); + }else{ + System.out.println("Error: Pathway "+id+" not found in network, please check sbml file."); + } + } + + //remove pathway's reactions and metabolites from list + BioCollection<BioReaction> pathwaysReactions = network.getReactionsFromPathways(pathways); + reactions.removeAll(pathwaysReactions); + metabolites.removeAll(network.getMetabolitesFromReactions(pathwaysReactions)); + genes.removeAll(network.getGenesFromReactions(pathwaysReactions)); + + //remove remaining reactions + network.removeOnCascade(reactions); + network.removeOnCascade(metabolites); + network.removeOnCascade(genes); + System.out.println("Number of reactions in network: "+network.getReactionsView().size()); + System.out.println("Number of species in network: "+network.getMetabolitesView().size()); + System.out.println("Number of genes in network: "+network.getGenesView().size()); + + //export network + JsbmlWriter w = new JsbmlWriter(outputPath, network); + w.write(); + System.err.println("network exported."); + return; + } + + @Override + public String getLabel() { + return this.getClass().getSimpleName(); + } + + @Override + public String getLongDescription() { + return "\"Extract pathway(s) from GSMN: From a SBML file, Create a sub-network SBML file including only a selection of pathways"; + } + + @Override + public String getShortDescription() { + return "Extract pathway(s) from GSMN"; + } +} diff --git a/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/attributes/ExtractSbmlAnnot.java b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/attributes/ExtractSbmlAnnot.java new file mode 100644 index 0000000000000000000000000000000000000000..34a659f176949b4e6c7d7a10784dc0cf425e443f --- /dev/null +++ b/met4j-toolbox/src/main/java/fr/inrae/toulouse/metexplore/met4j_toolbox/attributes/ExtractSbmlAnnot.java @@ -0,0 +1,120 @@ +package fr.inrae.toulouse.metexplore.met4j_toolbox.attributes; + +import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioEntity; +import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioNetwork; +import fr.inrae.toulouse.metexplore.met4j_core.biodata.BioRef; +import fr.inrae.toulouse.metexplore.met4j_core.biodata.collection.BioCollection; +import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.JsbmlReader; +import fr.inrae.toulouse.metexplore.met4j_io.jsbml.reader.Met4jSbmlReaderException; +import fr.inrae.toulouse.metexplore.met4j_toolbox.generic.AbstractMet4jApplication; +import org.kohsuke.args4j.Option; + +import java.io.FileWriter; +import java.io.IOException; +import java.util.*; + +public class ExtractSbmlAnnot extends AbstractMet4jApplication { + + @Option(name = "-i", usage = "input SBML file", required = true) + public String inputPath = null; + + @Option(name = "-o", usage = "output file path", required = true) + public String outputPath = null; + + enum entity { METABOLITE,REACTION,GENE} + + @Option(name="-export", usage = "the type of entity to extract annotation, either metabolite, reaction, or gene", required = true) + public entity export; + + @Option(name="-db", usage = "name of the referenced database to export annotations from, as listed in notes or identifiers.org base uri", required = true) + public String db; + + @Option(name="-uniq", usage = "keep only one identifier if multiple are referenced for the same entity", required = false) + public Boolean uniq = false; + + @Option(name="-skip", usage = "Skip entities without the selected annotations, by default output them with NA value", required = false) + public Boolean skip = false; + + public String sep = "\t"; + + + public static void main(String[] args) throws IOException, Met4jSbmlReaderException { + + ExtractSbmlAnnot app = new ExtractSbmlAnnot(); + + app.parseArguments(args); + + app.run(); + + } + + private void run() throws IOException, Met4jSbmlReaderException { + //open file + FileWriter fw = new FileWriter(outputPath); + + //read smbl + JsbmlReader reader = new JsbmlReader(this.inputPath); + BioNetwork network = reader.read(); + + BioCollection<? extends BioEntity> entities = new BioCollection<>(); + if(export==entity.METABOLITE){ + entities=network.getMetabolitesView(); + }else if(export==entity.REACTION){ + entities=network.getReactionsView(); + }else if(export==entity.GENE){ + entities=network.getGenesView(); + } + + //write header + fw.write(export.name()+sep+db.toUpperCase()+"\n"); + + //export annotations + //keep track of successful export + int i = 0; + for(BioEntity e : entities){ + + Set<BioRef> refSet = e.getRefs(db); + if(refSet!=null){ + i+=1; + if(uniq)refSet= new HashSet<BioRef>(Arrays.asList(refSet.iterator().next())); + for(BioRef ref : refSet){ + StringBuffer sb = new StringBuffer(); + sb.append(e.getId()); + sb.append(sep); + sb.append(ref.getId()); + sb.append("\n"); + fw.write(sb.toString()); + } + }else if(!skip){ + StringBuffer sb = new StringBuffer(); + sb.append(e.getId()); + sb.append(sep); + sb.append("NA\n"); + fw.write(sb.toString()); + } + + } + fw.close(); + System.out.println("annotations found for "+i+"/"+entities.size()+" "+export.name().toLowerCase()+((i>1)?"s":"")); + + } + + @Override + public String getLabel() { + return this.getClass().getSimpleName(); + } + + @Override + public String getLongDescription() { + return "Extract databases' references from SBML annotations or notes. " + + "The references are exported as a tabulated file with one column with the SBML compound, " + + "reaction or gene identifiers, and one column with the corresponding database identifier." + + "The name of the targeted database need to be provided under the same form than the one used " + + "in the notes field or the identifiers.org uri"; + } + + @Override + public String getShortDescription() { + return "Extract databases' references from SBML annotations or notes."; + } +}