From 0f2c8bc3241eca98b175ce97d5c3be80cbfe3e5e Mon Sep 17 00:00:00 2001 From: jweiser Date: Mon, 23 Feb 2026 20:41:08 -0500 Subject: [PATCH 1/6] adds filter for GO terms used by Plant instances only --- .../release/goupdate/GoTermsUpdater.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java b/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java index 7c7fbbe..61dd909 100644 --- a/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java +++ b/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java @@ -348,6 +348,7 @@ private int deleteFlaggedInstances(Map> goTermsFromF { action = "Automatic Deletion (no referrers)"; } + this.obsoleteAccessionPrinter.printRecord(instance.getDBID(), instance.getSchemClass().getName(), instance.getAttributeValue(ReactomeJavaConstants.accession), action, replacementGOTermAccession); goTermModifier.deleteGoInstance(goTermsFromFile, allGoInstances, this.deletionStringBuilder); deletedCount ++; @@ -397,7 +398,10 @@ private void processObsoleteGOTerm(Map> goTermsFromF consider = considerList != null && !considerList.isEmpty() ? "Consider: " + String.join(", ", considerList) : ""; String replacementTermString = replaceBy + consider; replacementTermString = replacementTermString.length() == 0 ? "N/A" : replacementTermString; - obsoleteAccessionPrinter.printRecord(inst.getDBID(), inst.getSchemClass().getName(), inst.getAttributeValue(ReactomeJavaConstants.accession), "Manual cleanup (referrers exist)", replacementTermString); + + if (!plantOnlyGOTerm(inst)) { + obsoleteAccessionPrinter.printRecord(inst.getDBID(), inst.getSchemClass().getName(), inst.getAttributeValue(ReactomeJavaConstants.accession), "Manual cleanup (referrers exist)", replacementTermString); + } } } catch (Exception e) @@ -617,4 +621,36 @@ private static void processEc2GoLine(String line, Map> goTo } } } + + private static boolean isPlantOnlyGOTerm(GKInstance goInstance) throws Exception { + List referrers = getReferrersFilteredByClass(goInstance, isNotGOEntity); + return referrers.stream().allMatch(referrer -> isPlantOnlyInstance(referrer)); + } + + private static boolean isPlantOnlyInstance(GKInstance instance) { + if (instance.getSchemClass().isa(ReactomeJavaConstants.CatalystActivity)) { + Collection reactionLikeEvents; + try { + reactionLikeEvents = instance.getReferers(ReactomeJavaConstants.catalystActivity); + } catch (Exception e) { + throw new RuntimeException("Unable to get referrers for CatalystActivity " + instance, e); + } + return reactionLikeEvents.stream().allMatch(reactionLikeEvent -> isPlantOnlyInstance(reactionLikeEvent)); + } + + List speciesInstances; + try { + speciesInstances = instance.getAttributeValuesList(ReactomeJavaConstants.species); + } catch (Exception e) { + throw new RuntimeException("Unable to get species instances for " + instance, e); + } + return speciesInstances.stream().allMatch(speciesInstance -> getPlantSpeciesDisplayNames().contains(speciesInstance.getDisplayName())); + } + + private static List getPlantSpeciesDisplayNames() { + return Arrays.asList( + "Arabidopsis thaliana", + "Oryza sativa" + ); + } } From 27f5f393a02856cf1c10f57a6807dcbd13f236e0 Mon Sep 17 00:00:00 2001 From: jweiser Date: Mon, 23 Feb 2026 22:09:51 -0500 Subject: [PATCH 2/6] bug fix - fixes incorrect method name call --- src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java b/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java index 61dd909..a824bd8 100644 --- a/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java +++ b/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java @@ -399,7 +399,7 @@ private void processObsoleteGOTerm(Map> goTermsFromF String replacementTermString = replaceBy + consider; replacementTermString = replacementTermString.length() == 0 ? "N/A" : replacementTermString; - if (!plantOnlyGOTerm(inst)) { + if (!isPlantOnlyGOTerm(inst)) { obsoleteAccessionPrinter.printRecord(inst.getDBID(), inst.getSchemClass().getName(), inst.getAttributeValue(ReactomeJavaConstants.accession), "Manual cleanup (referrers exist)", replacementTermString); } } From df7eab30730da68b47651976f3da35fc66a24ed1 Mon Sep 17 00:00:00 2001 From: jweiser Date: Mon, 23 Feb 2026 22:10:33 -0500 Subject: [PATCH 3/6] adds CSV printer for plant specific obsolete GO terms --- .../java/org/reactome/release/goupdate/GoTermsUpdater.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java b/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java index a824bd8..b5c50b6 100644 --- a/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java +++ b/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java @@ -43,6 +43,7 @@ class GoTermsUpdater private CSVPrinter newMFPrinter; private CSVPrinter obsoleteAccessionPrinter; + private CSVPrinter plantObsoleteAccessionPrinter; private CSVPrinter newGOTermsPrinter; private CSVPrinter replacedGOTermsPrinter; private CSVPrinter categoryMismatchPrinter; @@ -93,6 +94,7 @@ public GoTermsUpdater(MySQLAdaptor dba, List goLines, List ec2Go String dateString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")); this.newMFPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/new_molecular_functions_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO ID", "GO Term Name", "Definition") ); this.obsoleteAccessionPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/obsolete_GO_terms_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO Type", "Obsolete Term", "Suggested action", "New/replacement GO Terms") ); + this.plantObsoleteAccessionPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/plant_obsolete_GO_terms_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO Type", "Obsolete Term", "Suggested action", "New/replacement GO Terms") ); this.newGOTermsPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/new_GO_terms_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO Term Name", "GO Term ID", "GO Term Type", "Definition") ); this.categoryMismatchPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/category_mismatch_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO ID", "Category in Database", "Category in file") ); this.replacedGOTermsPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/replaced_GO_terms_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO Term Name", "Primary accession", "Primary Class", "DB_ID (Secondary; to be deleted)", "Secondary accession (to be deleted)", "Secondary Class", "Referrers to be automatically redirected to Primary accession") ); @@ -267,6 +269,7 @@ else if (goTermsFromFile.get(goID).containsKey(GoUpdateConstants.IS_OBSOLETE) && this.newGOTermsPrinter.close(); this.newMFPrinter.close(); this.obsoleteAccessionPrinter.close(); + this.plantObsoleteAccessionPrinter.close(); this.replacedGOTermsPrinter.close(); return mainOutput; @@ -401,6 +404,8 @@ private void processObsoleteGOTerm(Map> goTermsFromF if (!isPlantOnlyGOTerm(inst)) { obsoleteAccessionPrinter.printRecord(inst.getDBID(), inst.getSchemClass().getName(), inst.getAttributeValue(ReactomeJavaConstants.accession), "Manual cleanup (referrers exist)", replacementTermString); + } else { + plantObsoleteAccessionPrinter.printRecord(inst.getDBID(), inst.getSchemClass().getName(), inst.getAttributeValue(ReactomeJavaConstants.accession), "Manual cleanup (referrers exist)", replacementTermString); } } } From 22aebd0d9eb98e79c0ab391e19bf0020a3461e66 Mon Sep 17 00:00:00 2001 From: jweiser Date: Tue, 24 Feb 2026 00:26:10 -0500 Subject: [PATCH 4/6] filters out non-ReactionlikeEvent referrers of CatalystActivity --- .../release/goupdate/GoTermsUpdater.java | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java b/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java index b5c50b6..0f33ac4 100644 --- a/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java +++ b/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java @@ -4,13 +4,7 @@ import java.nio.file.Paths; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.regex.Matcher; @@ -634,22 +628,38 @@ private static boolean isPlantOnlyGOTerm(GKInstance goInstance) throws Exception private static boolean isPlantOnlyInstance(GKInstance instance) { if (instance.getSchemClass().isa(ReactomeJavaConstants.CatalystActivity)) { - Collection reactionLikeEvents; - try { - reactionLikeEvents = instance.getReferers(ReactomeJavaConstants.catalystActivity); - } catch (Exception e) { - throw new RuntimeException("Unable to get referrers for CatalystActivity " + instance, e); - } - return reactionLikeEvents.stream().allMatch(reactionLikeEvent -> isPlantOnlyInstance(reactionLikeEvent)); + return getReactionLikeEventReferrers(instance).stream().allMatch(reactionLikeEvent -> isPlantOnlyInstance(reactionLikeEvent)); } - List speciesInstances; + return getSpeciesInstances(instance) + .stream() + .allMatch(speciesInstance -> getPlantSpeciesDisplayNames().contains(speciesInstance.getDisplayName())); + } + + private static List getReactionLikeEventReferrers(GKInstance catalystActivityInstance) { + Collection referrers; + try { + referrers = catalystActivityInstance.getReferers(ReactomeJavaConstants.catalystActivity); + } catch (Exception e) { + throw new RuntimeException("Unable to get referrers for CatalystActivity " + catalystActivityInstance, e); + } + + if (referrers == null) { + return Collections.emptyList(); + } + + return referrers + .stream() + .filter(referrer -> referrer.getSchemClass().isa(ReactomeJavaConstants.ReactionlikeEvent)) + .collect(Collectors.toList()); + } + + private static List getSpeciesInstances(GKInstance instance) { try { - speciesInstances = instance.getAttributeValuesList(ReactomeJavaConstants.species); + return instance.getAttributeValuesList(ReactomeJavaConstants.species); } catch (Exception e) { throw new RuntimeException("Unable to get species instances for " + instance, e); } - return speciesInstances.stream().allMatch(speciesInstance -> getPlantSpeciesDisplayNames().contains(speciesInstance.getDisplayName())); } private static List getPlantSpeciesDisplayNames() { From 50bda5c00a0e49805214bea2eaa1bc8209a0442f Mon Sep 17 00:00:00 2001 From: jweiser Date: Tue, 24 Feb 2026 00:27:11 -0500 Subject: [PATCH 5/6] changes to general Exception for DuplicateReporter test --- .../java/org/reactome/release/goupdate/DuplicateReporterIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/reactome/release/goupdate/DuplicateReporterIT.java b/src/test/java/org/reactome/release/goupdate/DuplicateReporterIT.java index a251866..6e6749a 100644 --- a/src/test/java/org/reactome/release/goupdate/DuplicateReporterIT.java +++ b/src/test/java/org/reactome/release/goupdate/DuplicateReporterIT.java @@ -35,7 +35,7 @@ public void setup() throws SQLException @Test - public void testGetDuplicateAccessions() throws SQLException + public void testGetDuplicateAccessions() throws Exception { DuplicateReporter dupeReporter = new DuplicateReporter(adaptor); From 0f280b1c7299f1eac921803bcb3bce4b457dac81 Mon Sep 17 00:00:00 2001 From: jweiser Date: Tue, 24 Feb 2026 18:14:38 -0500 Subject: [PATCH 6/6] bug fix - swaps order of GO term accession and name in headers --- .../java/org/reactome/release/goupdate/GoTermsUpdater.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java b/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java index e61cedc..6421fe4 100644 --- a/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java +++ b/src/main/java/org/reactome/release/goupdate/GoTermsUpdater.java @@ -88,8 +88,8 @@ public GoTermsUpdater(MySQLAdaptor dba, List goLines, List ec2Go String dateString = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")); this.newMFPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/new_molecular_functions_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO ID", "GO Term Name", "Definition") ); - this.obsoleteAccessionPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/obsolete_GO_terms_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO Type", "Obsolete GO Term Name", "Obsolete GO Term Accession", "Suggested action", "New/replacement GO Terms") ); - this.plantObsoleteAccessionPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/plant_obsolete_GO_terms_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO Type", "Obsolete GO Term Name", "Obsolete GO Term Accession", "Suggested action", "New/replacement GO Terms") ); + this.obsoleteAccessionPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/obsolete_GO_terms_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO Type", "Obsolete GO Term Accession", "Obsolete GO Term Name", "Suggested action", "New/replacement GO Terms") ); + this.plantObsoleteAccessionPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/plant_obsolete_GO_terms_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO Type", "Obsolete GO Term Accession", "Obsolete GO Term Name", "Suggested action", "New/replacement GO Terms") ); this.newGOTermsPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/new_GO_terms_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO Term Name", "GO Term ID", "GO Term Type", "Definition") ); this.categoryMismatchPrinter = new CSVPrinter(Files.newBufferedWriter(Paths.get("reports/category_mismatch_"+dateString+".csv")), GO_REPORT_FORMAT.withHeader("DB_ID", "GO ID", "Category in Database", "Category in file") );