diff --git a/src/de/zbit/kegg/Translator.java b/src/de/zbit/kegg/Translator.java index 1696a0f..65d0618 100644 --- a/src/de/zbit/kegg/Translator.java +++ b/src/de/zbit/kegg/Translator.java @@ -35,6 +35,7 @@ import de.zbit.Launcher; import de.zbit.gui.GUIOptions; import de.zbit.io.FileTools; +import de.zbit.kegg.api.KeggInfos; import de.zbit.kegg.api.cache.KeggFunctionManagement; import de.zbit.kegg.api.cache.KeggInfoManagement; import de.zbit.kegg.ext.KEGGTranslatorPanelOptions; @@ -74,6 +75,13 @@ public class Translator extends Launcher { * like the browser cache). Must be loaded upon start and saved upon exit. */ public final static String cacheFunctionFileName = "keggfc.dat"; + + /** + * Adjusts a few methods in KEGGtranslator to generate an ouput for + * the path2models project if true. + *

PLESE ALWAYS KEEP THE DEFAULT, INITIAL VALUE TO FALSE! + */ + public static boolean path2models = false; /** * The {@link Logger} for this class. @@ -333,14 +341,9 @@ public void commandLineMode(AppConf appConf) { // Maybe adjust for path2models SBPreferences prefs = SBPreferences.getPreferencesFor(KEGGtranslatorCommandLineOnlyOptions.class); if (KEGGtranslatorCommandLineOnlyOptions.PATH2MODELS.getValue(props)) { - /* TODO: - * 1) Set the required options - * 2) Uncomment code in [KEGG] Pathway.java for 'getCompoundPreviewPicture()' - * 3) Activate additional KEGG COMPOUND 2 ChEBI mapping in KeggInfos.java ('getChebi()'-method) - */ + adjustForPath2Models(); } - // Make command-line options persistent prefs.restoreDefaults(); // This is just used as an empty prefs-template. try { @@ -359,6 +362,47 @@ public void commandLineMode(AppConf appConf) { } } + /** + * Adjusts the current KEGGtranslator instances to create an outout + * for the path2models project. + */ + public static void adjustForPath2Models() { + path2models = true; + KeggInfos.path2models = true; + /* + * 1) Set the required options + * 2) Uncomment code in [KEGG] Pathway.java for 'getCompoundPreviewPicture()' + * 3) Activate additional KEGG COMPOUND 2 ChEBI mapping in KeggInfos.java ('getChebi()'-method) + */ + + KEGGtranslatorOptions.AUTOCOMPLETE_REACTIONS.setDefaultValue(Boolean.TRUE); + KEGGtranslatorOptions.USE_GROUPS_EXTENSION.setDefaultValue(Boolean.FALSE); + KEGGtranslatorOptions.REMOVE_ORPHANS.setDefaultValue(Boolean.FALSE); + KEGGtranslatorOptions.REMOVE_WHITE_GENE_NODES.setDefaultValue(Boolean.TRUE); + KEGGtranslatorOptions.SHOW_FORMULA_FOR_COMPOUNDS.setDefaultValue(Boolean.FALSE); + KEGGtranslatorOptions.REMOVE_PATHWAY_REFERENCES.setDefaultValue(Boolean.TRUE); + KEGGtranslatorOptions.CELLDESIGNER_ANNOTATIONS.setDefaultValue(Boolean.FALSE); + KEGGtranslatorOptions.ADD_LAYOUT_EXTENSION.setDefaultValue(Boolean.TRUE); + KEGGtranslatorOptions.CHECK_ATOM_BALANCE.setDefaultValue(Boolean.FALSE); + + SBPreferences prefs = SBPreferences.getPreferencesFor(KEGGtranslatorOptions.class); + prefs.put(KEGGtranslatorOptions.AUTOCOMPLETE_REACTIONS, Boolean.TRUE); + prefs.put(KEGGtranslatorOptions.USE_GROUPS_EXTENSION, Boolean.FALSE); + prefs.put(KEGGtranslatorOptions.REMOVE_ORPHANS, Boolean.FALSE); + prefs.put(KEGGtranslatorOptions.REMOVE_WHITE_GENE_NODES, Boolean.TRUE); + prefs.put(KEGGtranslatorOptions.SHOW_FORMULA_FOR_COMPOUNDS, Boolean.FALSE); + prefs.put(KEGGtranslatorOptions.REMOVE_PATHWAY_REFERENCES, Boolean.TRUE); + prefs.put(KEGGtranslatorOptions.CELLDESIGNER_ANNOTATIONS, Boolean.FALSE); + prefs.put(KEGGtranslatorOptions.ADD_LAYOUT_EXTENSION, Boolean.TRUE); + prefs.put(KEGGtranslatorOptions.CHECK_ATOM_BALANCE, Boolean.FALSE); + + try { + prefs.flush(); + } catch (BackingStoreException e) { + log.log(Level.SEVERE, "Could not adjust KEGGtranslator options for path2models.", e); + } + } + /* * (non-Javadoc) * @see de.zbit.Launcher#getAppName() diff --git a/src/de/zbit/kegg/io/AbstractKEGGtranslator.java b/src/de/zbit/kegg/io/AbstractKEGGtranslator.java index 034cd42..4fafdb8 100644 --- a/src/de/zbit/kegg/io/AbstractKEGGtranslator.java +++ b/src/de/zbit/kegg/io/AbstractKEGGtranslator.java @@ -805,22 +805,36 @@ protected String NameToSId(String name) { * letter ::= �a�..�z�,�A�..�Z� digit ::= �0�..�9� idChar ::= letter | * digit | �_� SId ::= ( letter | �_� ) idChar* */ - String ret = ""; + String ret; if (name == null || name.trim().length() == 0) { ret = incrementSIdSuffix("SId"); SIds.add(ret); } else { name = name.trim(); + StringBuilder ret2 = new StringBuilder(name.length()+4); char c = name.charAt(0); + // Must start with letter or '_'. - if (!(isLetter(c) || c == '_')) ret = "SId_"; else ret = Character.toString(c); + if (!(isLetter(c) || c == '_')) { + ret2.append("SId_"); + } else { + ret2.append(c); + } + // May contain letters, digits or '_' for (int i = 1; i < name.length(); i++) { c = name.charAt(i); - if (c==' ') c='_'; // Replace spaces with "_" - if (isLetter(c) || Character.isDigit(c) || c == '_') ret += Character.toString(c); + if (c==' ') { + c='_'; // Replace spaces with "_" + } + + if (isLetter(c) || Character.isDigit(c) || c == '_') { + ret2.append(c); + } // else: skip invalid characters } + // Make unique + ret = ret2.toString(); if (SIds.contains(ret)) ret = incrementSIdSuffix(ret); SIds.add(ret); } diff --git a/src/de/zbit/kegg/io/KEGG2BioPAX.java b/src/de/zbit/kegg/io/KEGG2BioPAX.java index 72a2773..43946f5 100644 --- a/src/de/zbit/kegg/io/KEGG2BioPAX.java +++ b/src/de/zbit/kegg/io/KEGG2BioPAX.java @@ -91,6 +91,7 @@ import de.zbit.util.EscapeChars; import de.zbit.util.Species; import de.zbit.util.Utils; +import de.zbit.util.objectwrapper.ValuePair; /** * Abstract KEGG2BioPAX converter (also called KGML2BioPAX). This converter is @@ -311,7 +312,8 @@ public BioPAXElement createXRef(IdentifierDatabases db, String id, int type) { return xr; } - + + /** * Creates a biosource, corrsponding to the organism/species of * the input pathway p. @@ -901,7 +903,9 @@ public void createPhysicalEntities(Pathway p) { * {@link openControlledVocabulary} for level 2. */ protected BioPAXElement getInteractionVocuabulary(SubType st) { - String rfid = "#relation_subtype_" + st.getName(); + String formattedName = st.getName().trim().replace(' ', '_').replace("/", "_or_"); + + String rfid = "#relation_subtype_" + formattedName; BioPAXElement voc=null; if (level == BioPAXLevel.L3) { voc = (InteractionVocabulary) model.getByID(rfid); @@ -909,50 +913,69 @@ protected BioPAXElement getInteractionVocuabulary(SubType st) { voc = (openControlledVocabulary) model.getByID(rfid); } + // Term is not yet available => create it. if (voc==null) { + // Convert to a term that is a child of 'MI:0190' (Molecular Interaction Ontology) + ValuePair miTerm = SBOMapping.getMITerm(st.getName()); + String termName = miTerm!=null?miTerm.getA():null;//formattedName; if (level == BioPAXLevel.L3) { voc = model.addNew(InteractionVocabulary.class, rfid); pathwayComponentCreated(voc); - ((InteractionVocabulary)voc).addTerm(st.getName()); + if (termName!=null) { + ((InteractionVocabulary)voc).addTerm(termName); + } + ((InteractionVocabulary)voc).addComment(formattedName);// In all cases, add the original KEGG name } else if (level == BioPAXLevel.L2) { voc = model.addNew(openControlledVocabulary.class, rfid); pathwayComponentCreated(voc); - ((openControlledVocabulary)voc).addTERM(st.getName()); + if (termName!=null) { + ((openControlledVocabulary)voc).addTERM(termName); + } + ((openControlledVocabulary)voc).addCOMMENT(formattedName);// In all cases, add the original KEGG name } + + // Add additional XRefs to MI, SBO and GO + if (miTerm!=null && miTerm.getB()!=null && miTerm.getB()>0) { + BioPAXElement xr = createXRef(IdentifierDatabases.MI, Integer.toString(miTerm.getB()), 1); + addOntologyXRef(voc, xr, miTerm.getA()); + } int sbo = SBOMapping.getSBOTerm(st.getName()); if (sbo>0) { BioPAXElement xr = createXRef(IdentifierDatabases.SBO, Integer.toString(sbo), 1); - if (xr!=null) { - if (level == BioPAXLevel.L3) { - ((Xref) xr).addComment(st.getName()); - ((org.biopax.paxtools.model.level3.XReferrable) voc).addXref((Xref) xr); - } else if (level == BioPAXLevel.L2) { - ((xref) xr).addCOMMENT(st.getName()); - ((org.biopax.paxtools.model.level2.XReferrable) voc).addXREF((xref) xr); - } - } + addOntologyXRef(voc, xr, formattedName); } int go = SBOMapping.getGOTerm(st.getName()); if (go>0) { BioPAXElement xr = createXRef(IdentifierDatabases.GeneOntology, Integer.toString(go), 1); - if (xr!=null) { - if (level == BioPAXLevel.L3) { - ((Xref) xr).addComment(st.getName()); - ((org.biopax.paxtools.model.level3.XReferrable) voc).addXref((Xref) xr); - } else if (level == BioPAXLevel.L2) { - ((xref) xr).addCOMMENT(st.getName()); - ((org.biopax.paxtools.model.level2.XReferrable) voc).addXREF((xref) xr); - } - } + addOntologyXRef(voc, xr, formattedName); } } return voc; } + + + /** + * @param xReferrableBPelement + * @param xRef + * @param formattedName + */ + private void addOntologyXRef(BioPAXElement xReferrableBPelement, + BioPAXElement xRef, String formattedName) { + if (xRef!=null) { + if (level == BioPAXLevel.L3) { + ((Xref) xRef).addComment(formattedName); + ((org.biopax.paxtools.model.level3.XReferrable) xReferrableBPelement).addXref((Xref) xRef); + } else if (level == BioPAXLevel.L2) { + ((xref) xRef).addCOMMENT(formattedName); + ((org.biopax.paxtools.model.level2.XReferrable) xReferrableBPelement).addXREF((xref) xRef); + } + } + } /* (non-Javadoc) * @see de.zbit.kegg.io.KEGGtranslator#isGraphicalOutput() diff --git a/src/de/zbit/kegg/io/KEGG2BioPAX_level3.java b/src/de/zbit/kegg/io/KEGG2BioPAX_level3.java index 474a2ca..9d87419 100644 --- a/src/de/zbit/kegg/io/KEGG2BioPAX_level3.java +++ b/src/de/zbit/kegg/io/KEGG2BioPAX_level3.java @@ -187,7 +187,11 @@ public BioPAXElement addEntry(Entry entry, Pathway p) { if (fullName!=null) { ((Entity)element).setStandardName(fullName); // Graphics name } - ((Entity)element).setDisplayName(name); // Intelligent name + String displayName = name; + if (displayName.length()>20) { + displayName = displayName.substring(0, 16)+"..."; + } + ((Entity)element).setDisplayName(displayName); // Intelligent name // --- addDataSources(element); @@ -299,9 +303,14 @@ private void addDataSources(BioPAXElement element) { protected BioPAXElement createPathwayInstance(Pathway p) { pathway = model.addNew(org.biopax.paxtools.model.level3.Pathway.class, p.getName()); pathway.addAvailability(String.format("This file has been generated by %s version %s", System.getProperty("app.name"), System.getProperty("app.version"))); - pathway.addName(formatTextForHTMLnotes(p.getTitle())); - pathway.setDisplayName(formatTextForHTMLnotes(p.getTitle())); - pathway.setStandardName(formatTextForHTMLnotes(p.getTitle())); + String htmlName = formatTextForHTMLnotes(p.getTitle()); + pathway.addName(htmlName); + String displayName = htmlName; + if (displayName.length()>20) { + displayName = displayName.substring(0, 16)+"..."; + } + pathway.setDisplayName(displayName); + pathway.setStandardName(htmlName); // Parse Kegg Pathway information boolean isKEGGPathway = DatabaseIdentifiers.checkID(DatabaseIdentifiers.IdentifierDatabases.KEGG_Pathway, p.getNameForMIRIAM()); @@ -394,7 +403,11 @@ public BioPAXElement addKGMLReaction(Reaction r, Pathway p) { reaction.addName(r.getName()); - reaction.setDisplayName(r.getName()); + String displayName = r.getName(); + if (displayName.length()>20) { + displayName = displayName.substring(0, 16)+"..."; + } + reaction.setDisplayName(displayName); addDataSources(reaction); // Add all reaction components diff --git a/src/de/zbit/kegg/io/KEGG2jSBML.java b/src/de/zbit/kegg/io/KEGG2jSBML.java index fe3b908..d90ff62 100644 --- a/src/de/zbit/kegg/io/KEGG2jSBML.java +++ b/src/de/zbit/kegg/io/KEGG2jSBML.java @@ -915,7 +915,7 @@ public static void addMiriamURNs(Entry entry, SBase spec) { String ko_id_uc_t = ko_id.toUpperCase().trim(); if (ko_id_uc_t.startsWith("CPD:")) { // KEGG and ChEBI provide picture for compounds (e.g., "C00118"). - notes.append(Pathway.getCompoundPreviewPicture(ko_id_uc_t, infos)); + notes.append(Pathway.getCompoundPreviewPicture(ko_id_uc_t, infos, Translator.path2models)); } } if (entry.getType().equals(EntryType.map)) { diff --git a/src/de/zbit/kegg/io/SBOMapping.java b/src/de/zbit/kegg/io/SBOMapping.java index 2416cf4..382d4d0 100644 --- a/src/de/zbit/kegg/io/SBOMapping.java +++ b/src/de/zbit/kegg/io/SBOMapping.java @@ -30,6 +30,7 @@ import de.zbit.kegg.parser.pathway.ext.EntryExtended; import de.zbit.kegg.parser.pathway.ext.EntryTypeExtended; import de.zbit.util.StringUtil; +import de.zbit.util.objectwrapper.ValuePair; /** * This static class defines how to map from certain @@ -266,6 +267,62 @@ public static int getGOTerm(String subtype) { return ret; } + /** + * Convert to a MI-term that is a child of 'MI:0190' (Molecular Interaction (PSI-MI)). + * @param subtype + * @return {@link ValuePair} with the term name and integer id. Or NULL if + * no MI term is available that matches the given input {@link SubType}. + */ + public static ValuePair getMITerm(String subtype) { + if (subtype.equals(SubType.ASSOCIATION)) { + return new ValuePair("association", 914); //MI:0914 + } else if (subtype.equals(SubType.PHOSPHORYLATION)) { + return new ValuePair("phosphorylation reaction", 217); + } else if (subtype.equals(SubType.DEPHOSPHORYLATION)) { + return new ValuePair("dephosphorylation reaction", 203); + } else if (subtype.equals(SubType.UBIQUITINATION) || + subtype.equalsIgnoreCase("ubiquination")) { + return new ValuePair("ubiquitination reaction", 220); + } else if (subtype.equals(SubType.GLYCOSYLATION)) { + return new ValuePair("glycosylation reaction", 559); + } else if (subtype.equals(SubType.METHYLATION)) { + return new ValuePair("methylation reaction", 213); + } else if (subtype.equals(SubType.BINDING)) { + return new ValuePair("covalent binding", 195); + } else if (subtype.equals(SubType.BINDING_ASSOCIATION)) { + return new ValuePair("association", 914); + } else if (subtype.equals(SubType.COMPOUND) || + subtype.equals(SubType.HIDDEN_COMPOUND)) { + return new ValuePair("direct interaction", 407); + +// } else if (subtype.equals(SubType.DEPHOSPHORYLATION)) { +// return new ValuePair("dephosphorylation reaction", 203); +// } else if (subtype.equals(SubType.DEPHOSPHORYLATION)) { +// return new ValuePair("dephosphorylation reaction", 203); +// } else if (subtype.equals(SubType.DEPHOSPHORYLATION)) { +// return new ValuePair("dephosphorylation reaction", 203); +// } else if (subtype.equals(SubType.DEPHOSPHORYLATION)) { +// return new ValuePair("dephosphorylation reaction", 203); +// } else if (subtype.equals(SubType.DEPHOSPHORYLATION)) { +// return new ValuePair("dephosphorylation reaction", 203); + } + /* MISSING: + * EXPRESSION => positive genetic interaction / 935 + * ACTIVATION => positive genetic interaction / 935 + * REPRESSION => negative genetic interaction / 933 + * INHIBITION => negative genetic interaction / 933 + * + * DISSOCIATION + * INDIRECT_EFFECT + * MISSING_INTERACTION + * STATE_CHANGE + * + */ + + return null; + } + + /** * Formats an SBO term. E.g. "177" to "SBO:0000177".