diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..93671487c9 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,11 @@ +# Uberon code owners (Guardians of the main branch) +# GitHub documentation about CODEOWNERS file - https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners + +* @anitacaron +*.yaml @matentzn +*Makefile @gouttegd +*uberon.Makefile @gouttegd @matentzn @anitacaron + + +#docs/* action@github.com +#docs/* actions-user diff --git a/.github/workflows/qc.yml b/.github/workflows/qc.yml index b9eac23aff..64342f751e 100644 --- a/.github/workflows/qc.yml +++ b/.github/workflows/qc.yml @@ -19,7 +19,7 @@ jobs: ontology_qc: # The type of runner that the job will run on runs-on: ubuntu-latest - container: obolibrary/odkfull:dev + container: obolibrary/odkfull:v1.4.1 # Steps represent a sequence of tasks that will be executed as part of the job steps: diff --git a/docs/uberon-editor-sop.md b/docs/uberon-editor-sop.md index fe803b05f4..239bfc3643 100644 --- a/docs/uberon-editor-sop.md +++ b/docs/uberon-editor-sop.md @@ -91,7 +91,10 @@ ORCID identifiers may also be used when the only available source for an asserti **Technical details of adding a cross-reference using Protégé**: -For CURIEs and ORCIDs: In the "Create Annotation" window, select the annotation property **database_cross_reference**. +For CURIEs, ORCIDs: In the "Create Annotation" window, select the annotation property [**database_cross_reference**](http://www.geneontology.org/formats/oboInOwl#hasDbXref). +For adding URLs to text definitions or synonyms: In the "Create Annotation" window, select the annotation property [**database_cross_reference**](http://www.geneontology.org/formats/oboInOwl#hasDbXref). +For adding URLs to axioms that are NOT text definitions or synonyms: In the "Create Annotation" window, select the annotation property [**source**](http://www.geneontology.org/formats/oboInOwl#source). + For CURIEs: Enter the CURIE, using the [bioregistry OBO context](https://bioregistry.io/context/obo) prefix ([link to prefixmap](https://github.com/biopragmatics/bioregistry/blob/main/exports/contexts/obo.context.jsonld)), as a Value on the "Literal" tab. Leave Datatype empty. @@ -99,12 +102,12 @@ In cases where more than one CURIE is available for a resource, either is accept For ORCIDs: Enter the ORCID as an IRI in the IRI field on the "IRI Editor" tab, for example `https://orcid.org/0000-0002-7356-1779`. -For URLs: In the "Create Annotation" window, select the annotation property **'see also'** (`rdfs:seeAlso`). Enter the URL as a literal string. DO NOT use database_cross_reference with a value that is a URL. Note: In OWL-based files (like cl-edit.owl), Datatype `xsd:anyURI` is also selected; however, in OBO-based files (like uberon-edit.obo) these always become strings, so no selection needs to be made for Datatype in Uberon. Datatype selection is planned to be implemented in a future OBO revision, and updates can be checked at https://github.com/owlcollab/oboformat/issues/128. +For URLs: Enter the URL as a literal string. Note: In OWL-based files (like cl-edit.owl), Datatype `xsd:anyURI` is also selected; however, in OBO-based files (like uberon-edit.obo) these always become strings, so no selection needs to be made for Datatype in Uberon. Datatype selection is planned to be implemented in a future OBO revision, and updates can be checked at https://github.com/owlcollab/oboformat/issues/128. +NOTE: URLs should be avoided when a cross-reference with a CURIE is otherwise available. -To restate, in all cases above except ORCIDs, the values are entered as literal strings. An ORCID MUST BE entered as an IRI. -The above instructions apply whether the cross-reference is added to another annotation (e.g., annotating a text defintion or comment) or adding to the overall class (i.e., not an annotation of another annotation). +To restate, in all cases above except ORCIDs, the values are entered as literal strings. An ORCID MUST BE entered as an IRI. ## Synonyms diff --git a/src/ontology/Makefile b/src/ontology/Makefile index 7d418de3af..2b8579b732 100644 --- a/src/ontology/Makefile +++ b/src/ontology/Makefile @@ -42,7 +42,7 @@ REPORT_FAIL_ON = ERROR REPORT_LABEL = REPORT_PROFILE_OPTS = --profile $(ROBOT_PROFILE) OBO_FORMAT_OPTIONS = -SPARQL_VALIDATION_CHECKS = equivalent-classes owldef-self-reference illegal-annotation-property taxon-range orcid-contributor obsolete-replaced_by xrefs-mesh-pattern label-synonym-polysemy +SPARQL_VALIDATION_CHECKS = equivalent-classes owldef-self-reference illegal-annotation-property taxon-range orcid-contributor obsolete-replaced_by xrefs-mesh-pattern label-synonym-polysemy id-format SPARQL_EXPORTS = basic-report ODK_VERSION_MAKEFILE = v1.4.1 @@ -62,7 +62,7 @@ PATTERN_RELEASE_FILES= $(PATTERNDIR)/definitions.owl $(PATTERNDIR)/pattern. FORMATS = $(sort owl obo json owl) FORMATS_INCL_TSV = $(sort $(FORMATS) tsv) -RELEASE_ARTEFACTS = $(sort $(ONT)-base $(ONT)-full $(ONT)-simple $(ONT)-basic ext basic composite-metazoan composite-metazoan-basic composite-vertebrate composite-vertebrate-basic common-anatomy ) +RELEASE_ARTEFACTS = $(sort $(ONT)-base $(ONT)-full $(ONT)-simple $(ONT)-basic basic composite-metazoan composite-metazoan-basic composite-vertebrate composite-vertebrate-basic common-anatomy ) # ---------------------------------------- # Top-level targets @@ -668,12 +668,6 @@ $(ONT)-basic.json: $(ONT)-basic.owl $(ROBOT) annotate --input $< --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ convert --check false -f json -o $@.tmp.json &&\ mv $@.tmp.json $@ -ext.obo: ext.owl - $(ROBOT) convert --input $< --check false -f obo $(OBO_FORMAT_OPTIONS) -o $@.tmp.obo && grep -v ^owl-axioms $@.tmp.obo > $@ && rm $@.tmp.obo -ext.json: ext.owl - $(ROBOT) annotate --input $< --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ - convert --check false -f json -o $@.tmp.json &&\ - mv $@.tmp.json $@ basic.obo: basic.owl $(ROBOT) convert --input $< --check false -f obo $(OBO_FORMAT_OPTIONS) -o $@.tmp.obo && grep -v ^owl-axioms $@.tmp.obo > $@ && rm $@.tmp.obo basic.json: basic.owl @@ -781,9 +775,6 @@ $(ONT)-basic.owl: $(EDIT_PREPROCESSED) $(OTHER_SRC) $(SIMPLESEED) $(KEEPRELATION reduce -r ELK \ $(SHARED_ROBOT_COMMANDS) annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) --output $@.tmp.owl && mv $@.tmp.owl $@ -ext.owl: - echo "ERROR: You have configured a custom release artefact ($@); this release artefact needs to be define in uberon.Makefile!" && false - basic.owl: echo "ERROR: You have configured a custom release artefact ($@); this release artefact needs to be define in uberon.Makefile!" && false diff --git a/src/ontology/bridge/collected-drosophila.owl b/src/ontology/bridge/collected-drosophila.owl index ef1daac11f..07ffa831ef 100644 --- a/src/ontology/bridge/collected-drosophila.owl +++ b/src/ontology/bridge/collected-drosophila.owl @@ -32,6 +32,6 @@ - + diff --git a/src/ontology/uberon-edit.obo b/src/ontology/uberon-edit.obo index b61a3dc354..e44124d3ca 100644 --- a/src/ontology/uberon-edit.obo +++ b/src/ontology/uberon-edit.obo @@ -8749,8 +8749,7 @@ xref: VHOG:0000098 xref: Wikipedia:Endocrine_system xref: XAO:0000158 xref: ZFA:0001158 -intersection_of: UBERON:0015203 ! non-connected functional system -intersection_of: capable_of GO:0050886 ! endocrine process +is_a: UBERON:0015203 ! non-connected functional system disjoint_from: UBERON:0000990 ! reproductive system disjoint_from: UBERON:0001004 ! respiratory system disjoint_from: UBERON:0001007 ! digestive system @@ -73141,6 +73140,7 @@ name: hindlimb skin def: "A zone of skin that is part of a hindlimb [Automatically generated definition]." [OBOL:automatic] synonym: "hind limb skin" EXACT [OBOL:automatic] synonym: "lower limb skin" EXACT [FMA:23102] +synonym: "lower limb skin" EXACT [https://orcid.org/0000-0002-0819-0473] synonym: "skin of hind limb" EXACT [OBOL:automatic] synonym: "skin of hindlimb" EXACT [OBOL:automatic] synonym: "skin of lower extremity" EXACT [OBOL:automatic] @@ -135200,13 +135200,14 @@ id: UBERON:0010002 name: pulmonary neuroendocrine body def: "Corpuscular, organoid structures composed of PNECs, found as distinctive innervated clusters only within intrapulmonary airways, where they appear concentrated at airway branch points; NEBs reach from the basement membrane to the airway lumen and are thought to function as oxygen sensors." [MP:0010921] subset: pheno_slim -synonym: "NEB" EXACT [MP:0010921] +synonym: "NEB" RELATED ABBREVIATION [MP:0010921] synonym: "pulmonary neuroepithelial body" EXACT [MP:0010921] xref: EMAPA:37943 {source="MA:th"} is_a: UBERON:0000061 {source="MP"} ! anatomical structure relationship: contributes_to_morphology_of UBERON:0000115 ! lung epithelium -relationship: has_part CL:0000165 ! neuroendocrine cell +relationship: has_part CL:1000223 ! lung neuroendocrine cell relationship: part_of UBERON:0000115 ! lung epithelium +relationship: part_of UBERON:8600018 ! neuroendocrine system [Term] id: UBERON:0010005 @@ -136304,8 +136305,9 @@ subset: pheno_slim synonym: "neuroendocrine system gland" EXACT [] xref: MA:0000720 intersection_of: UBERON:0002368 ! endocrine gland -intersection_of: part_of UBERON:0001016 ! nervous system +intersection_of: part_of UBERON:8600018 ! neuroendocrine system relationship: has_part CL:0000165 ! neuroendocrine cell +relationship: overlaps UBERON:0001016 ! nervous system [Term] id: UBERON:0010134 @@ -182190,8 +182192,8 @@ intersection_of: capable_of GO:0050976 ! detection of mechanical stimulus involv id: UBERON:0035017 name: nociceptor nerve ending def: "A peripheral terminal of a peripheral, afferent sensory pain receptor cell that is sensitive to injury or pain, usually caused by extreme thermal exposures, mechanical forces, or other noxious stimuli. The nociceptor nerve ending innervates target tissue and transduces noxious stimuli to the central nervous system via some axon(s)." [MESH:D009619] -synonym: "nociceptor" RELATED [] {http://www.w3.org/2000/01/rdf-schema#seeAlso="https://meshb.nlm.nih.gov/record/ui?ui=D009619"} -synonym: "pain receptor" RELATED [] {http://www.w3.org/2000/01/rdf-schema#seeAlso="https://meshb.nlm.nih.gov/record/ui?ui=D009619"} +synonym: "nociceptor" RELATED [https://meshb.nlm.nih.gov/record/ui?ui=D009619] +synonym: "pain receptor" RELATED [https://meshb.nlm.nih.gov/record/ui?ui=D009619] xref: MESH:D009619 intersection_of: UBERON:0012451 ! sensory receptor intersection_of: capable_of GO:0050966 ! detection of mechanical stimulus involved in sensory perception of pain @@ -219066,12 +219068,11 @@ relationship: only_in_taxon NCBITaxon:50557 ! Insecta [Term] id: UBERON:60005380 -name: insect pharynx -def: "Section of the insect foregut anterior to the esophagus." [FBbt:00005380, http://orcid.org/0000-0002-6601-2165] -xref: FBbt:00005380 -is_a: UBERON:0004921 {source="FBbt"} ! subdivision of digestive tract -is_a: UBERON:0006562 {notes="parent may be obsoleted"} ! pharynx -relationship: part_of UBERON:0003929 {source="FBbt"} ! digestive tract epithelium +name: obsolete insect pharynx +comment: Obsoleted because the ID was minted incorrectly. +property_value: term_tracker_item "https://github.com/obophenotype/uberon/issues/3051" xsd:anyURI +is_obsolete: true +replaced_by: UBERON:6005380 [Term] id: UBERON:6001055 @@ -220223,6 +220224,15 @@ synonym: "margin" BROAD [] is_a: UBERON:6007284 ! insect region of integument relationship: part_of UBERON:0000984 ! imaginal disc-derived wing +[Term] +id: UBERON:6005380 +name: insect pharynx +def: "Section of the insect foregut anterior to the esophagus." [FBbt:00005380, http://orcid.org/0000-0002-6601-2165] +xref: FBbt:00005380 +is_a: UBERON:0004921 {source="FBbt"} ! subdivision of digestive tract +is_a: UBERON:0006562 {note="parent may be obsoleted"} ! pharynx +relationship: part_of UBERON:0003929 {source="FBbt"} ! digestive tract epithelium + [Term] id: UBERON:6005393 name: insect embryonic/larval integumentary system @@ -224024,6 +224034,7 @@ synonym: "anterior crural region" EXACT [FMA:24985] synonym: "anterior leg region" EXACT [FMA:24985] synonym: "anterior region of leg" EXACT [FMA:24985] synonym: "front of the lower leg" EXACT [https://orcid.org/0000-0002-0819-0473] +synonym: "pretibial" RELATED [https://en.wiktionary.org/wiki/pretibial] synonym: "shin" EXACT [FMA:24985] xref: FMA:24985 is_a: UBERON:0000061 ! anatomical structure @@ -224208,6 +224219,51 @@ relationship: dc-contributor https://orcid.org/0000-0002-0819-0473 relationship: located_in UBERON:0002371 ! bone marrow property_value: dcterms-date "2023-06-26T13:48:30Z" xsd:dateTime +[Term] +id: UBERON:8480068 +name: saphenous vein smooth muscle tissue +def: "A portion of smooth muscle tissue that is part of a saphenous vein." [https://orcid.org/0000-0002-0819-0473] +intersection_of: UBERON:0001135 ! smooth muscle tissue +intersection_of: part_of UBERON:0007318 ! saphenous vein +relationship: dc-contributor https://orcid.org/0000-0002-0819-0473 +property_value: dcterms-date "2023-08-31T11:41:09Z" xsd:dateTime + +[Term] +id: UBERON:8480071 +name: skin of lobe of tail +def: "A zone of skin that is part of the lobe tail." [https://orcid.org/0000-0002-0819-0473] +synonym: "fluke skin" NARROW [PMID:21959845] +intersection_of: UBERON:0000014 ! zone of skin +intersection_of: part_of UBERON:0013131 ! lobe of tail +relationship: dc-contributor https://orcid.org/0000-0002-0819-0473 +property_value: dcterms-date "2023-08-29T09:37:23Z" xsd:dateTime + +[Term] +id: UBERON:8480072 +name: skin of shin +def: "A zone of skin on the front hindlimb zeugopod." [https://orcid.org/0000-0002-0819-0473] +intersection_of: UBERON:0000014 ! zone of skin +intersection_of: part_of UBERON:8480049 ! front hindlimb zeugopod +relationship: dc-contributor https://orcid.org/0000-0002-0819-0473 +property_value: dcterms-date "2023-08-29T09:47:32Z" xsd:dateTime + +[Term] +id: UBERON:8480073 +name: skin of scapula region +def: "A zone of skin that is above the scapula in the upper back region." [https://orcid.org/0000-0002-0819-0473] +is_a: UBERON:0009015 ! upper back skin +relationship: dc-contributor https://orcid.org/0000-0002-0819-0473 +property_value: dcterms-date "2023-08-29T09:53:33Z" xsd:dateTime + +[Term] +id: UBERON:8480074 +name: skin of gonad +def: "A zone of skin part of some gonad." [https://orcid.org/0000-0002-0819-0473] +intersection_of: UBERON:0000014 ! zone of skin +intersection_of: part_of UBERON:0000991 ! gonad +relationship: dc-contributor https://orcid.org/0000-0002-0819-0473 +property_value: dcterms-date "2023-08-29T10:24:24Z" xsd:dateTime + [Term] id: UBERON:8500000 name: cranial temporal line @@ -224440,6 +224496,18 @@ relationship: dc-contributor https://orcid.org/0000-0002-9185-3994 relationship: part_of UBERON:0000101 ! lobe of lung property_value: dcterms-date "2023-07-20T12:43:29Z" xsd:dateTime +[Term] +id: UBERON:8600018 +name: neuroendocrine system +def: "A regulatory system of the body that integrates the nervous system and the endocrine system. This system is formed by specialized neuroendocrine cells located mainly in the nervous system and neuroendocrine glands. However, they can also be found as either single cells or small clusters of cells dispersed throughout the surface epithelium of different tissues. The neuroendocrine system functions through the release of neurotransmitters and neurohormones, enabling communication between the endocrine and nervous systems to govern vitally important processes that include growth, reproduction, metabolism and energy homeostasis, electrolyte and water balance, and responses to stress." [doi:10.1016/B978-0-12-375097-6.10001-0, PMID:15481802, PMID:17003257, PMID:25905254, Wikipedia:endocrinology] +comment: In vertebrates, the hypothalamic-pituitary-target organ axis (H-P axis), the autonomic nervous system (ANS) and the diffuse neuroendocrine or APUD system contribute to the neuroendocrine system. {xref="PMID:15481802"} +synonym: "NES" RELATED ABBREVIATION [PMID:15481802] +is_a: UBERON:0000467 ! anatomical system +relationship: dc-contributor https://orcid.org/0000-0001-6677-8489 +relationship: overlaps UBERON:0000949 ! endocrine system +relationship: overlaps UBERON:0001016 ! nervous system +property_value: dcterms-date "2023-08-29T10:49:45Z" xsd:dateTime + [Typedef] id: aboral_to name: aboral to diff --git a/src/ontology/uberon-odk.yaml b/src/ontology/uberon-odk.yaml index b92074799d..bebd93a379 100644 --- a/src/ontology/uberon-odk.yaml +++ b/src/ontology/uberon-odk.yaml @@ -20,7 +20,6 @@ release_artefacts: - full - simple - basic - - custom-ext - custom-basic - custom-composite-metazoan - custom-composite-metazoan-basic @@ -109,6 +108,7 @@ robot_report: - obsolete-replaced_by - xrefs-mesh-pattern - label-synonym-polysemy + - id-format custom_sparql_exports: - basic-report owltools_memory: '20G' diff --git a/src/ontology/uberon.Makefile b/src/ontology/uberon.Makefile index 977aed2358..803292caac 100644 --- a/src/ontology/uberon.Makefile +++ b/src/ontology/uberon.Makefile @@ -19,76 +19,98 @@ RELEASE = $(URIBASE)/uberon/releases/$(TODAY) QELK = --silence-elk PART_OF = BFO_0000050 -BASICRELS = BFO:0000050 RO:0002202 immediate_transformation_of transformation_of -RELSIM = BFO:0000050 RO:0002202 immediate_transformation_of -TAXON_GCI_RELS = RO:0002202 RO:0002496 RO:0002497 BFO:0000051 - all: uberon-qc echo "make $@ succeeded..." + # ---------------------------------------- # COMMANDS # ---------------------------------------- -##MAKEOBO= owltools $< --remove-axiom-annotations -o -f obo $@.tmp1 && grep -v ^property_value: $@.tmp1 | grep -v ^owl-axioms: > $@.tmp && obo2obo $@.tmp -o $@ +# FIXME: Is a custom OBO generation rule needed? +# https://github.com/obophenotype/uberon/issues/3014 MAKEOBO= $(OWLTOOLS) $< --add-obo-shorthand-to-properties -o -f obo --no-check $@.tmp1 && grep -v ^property_value: $@.tmp1 | perl -npe 's@relationship: dc-@property_value: dc-@' | grep -v ^owl-axioms: > $@.tmp && mv $@.tmp $@ -MAKEJSON= $(OWLTOOLS) $< --add-obo-shorthand-to-properties -o -f json $@.tmp && mv $@.tmp $@ -MAKEYAML= $(OWLTOOLS) $< --add-obo-shorthand-to-properties -o -f yaml $@.tmp && mv $@.tmp $@ - -# ---------------------------------------- -# TRAVIS TOP LEVEL TARGETS -# ---------------------------------------- - -# This OWLTools call is designed for running in travis; does not clog stdout -ELKRUN= $(OWLTOOLS) $< $(QELK) --run-reasoner -r elk -u > $@.tmp || (tail -1000 $@.tmp && exit -1) && (tail -1000 $@.tmp && mv $@.tmp $@) -# materialize takes too long on travis -#travis_test: ttest-uberon ttest-ext ttest-tax -# TODO Current travis test does nearly nothing. NICO replace by standard qc tests -travis_test: $(TMPDIR)/is_ok - -ttest-uberon: uberon.owl $(REPORTDIR)/bfo-check.txt - $(ELKRUN) - -ttest-ext: ext.owl - $(ELKRUN) - -ttest-tax: $(TMPDIR)/uberon-edit-plus-tax-equivs.owl - $(ELKRUN) # ---------------------------------------- -# PREP: catalog +# XML CATALOG # ---------------------------------------- - $(CATALOG_DYNAMIC): - echo "From this day (12 March 2021) forward, $(CATALOG_DYNAMIC) is maintained manually. If you must updated it, plus run 'make update_dynamic_catalog'. Please review the diff carefully as some entries (like ro_import.owl) are omitted by the process." + @echo "From this day (12 March 2021) forward, $(CATALOG_DYNAMIC) is maintained" + @echo "manually. If you must update it, run 'make update_dynamic_catalog'." + @echo "Please review the diff carefully as some entries may be omitted." .PHONY: update_dynamic_catalog update_dynamic_catalog: - echo "STRONG WARNING: You are updating the dynamic catalog. Note that this is done on the basis of a previous run of the pipeline, so all files are expected to be available. Do not do this if you dont know what you are doing." - $(SCRIPTSDIR)/make-catalog.pl uberon.owl ext.owl mirror/ncbitaxon.owl imports/*_import.owl mirror/ro.owl imports/local-*owl $(BRIDGEDIR)/*owl $(TMPDIR)/allen-*.obo $(TMPDIR)/developmental-stage-ontologies/src/ssso-merged.obo > $@.tmp && mv $@.tmp $@ - -# ---------------------------------------- -# STEP 0: checks -# ---------------------------------------- -# NOTE: these are bypassed by travis for now, as some rely on ad-hoc perl + @echo "WARNING: You are updating the dynamic catalog. Note that this is done on" + @echo "WARNING: the basis of a previous run of WARNING: the pipeline, so all" + @echo "WARNING: files are expected to be available. Do not do this if you dont" + @echo "WARNING: know what you are doing." + $(SCRIPTSDIR)/make-catalog.pl uberon.owl mirror/ncbitaxon.owl imports/*_import.owl \ + mirror/ro.owl imports/local-*owl $(BRIDGEDIR)/*owl $(TMPDIR)/allen-*.obo \ + $(TMPDIR)/developmental-stage-ontologies/src/ssso-merged.obo > $@.tmp && \ + mv $@.tmp $@ + + +# ---------------------------------------- +# TESTS/QC +# ---------------------------------------- +# This section defines the composition of the test suites (i.e., which +# checks are performed). The checks themselves are defined elsewhere in +# this Makefile (mostly in the REPORTS section further below). + +# This target is invoked as part of the automated CI workflow. +# To include a specific check/report in the CI workflow, add it +# to the pre-requisites here. +test: $(REPORTDIR)/basic-allcycles \ + $(REPORTDIR)/bfo-check.txt \ + $(REPORTDIR)/taxon-constraint-check.txt \ + $(REPORTDIR)/uberon-edit-xp-check \ + obocheck \ + test_obo_serialisation \ + test_obsolete \ + test_owlaxioms + +# The other targets are manually triggered. +# 'checks' is a subset of 'uberon-qc'. +checks: $(REPORTDIR)/bfo-check.txt \ + $(REPORTDIR)/uberon-edit-obscheck.txt \ + $(REPORTDIR)/uberon-edit-xp-check \ + $(REPORTDIR)/uberon-obscheck.txt \ + $(REPORTDIR)/uberon-orphans \ + $(REPORTDIR)/uberon.obo-OWL-check + +uberon-qc: checks \ + quick-bridge-checks \ + bridge-checks \ + extra-full-bridge-checks \ + $(REPORTDIR)/basic-allcycles \ + $(REPORTDIR)/basic-orphans \ + $(REPORTDIR)/composite-metazoan-dv.txt \ + $(REPORTDIR)/taxon-constraint-check.txt \ + $(REPORTDIR)/uberon-dv.txt \ + $(REPORTDIR)/uberon-orphans \ + $(REPORTDIR)/stages + cat $(REPORTDIR)/uberon-orphans \ + $(REPORTDIR)/uberon-edit-obscheck.txt \ + $(REPORTDIR)/uberon-edit-xp-check \ + $(REPORTDIR)/uberon-orphans \ + $(REPORTDIR)/uberon-dv.txt \ + $(REPORTDIR)/composite-metazoan-dv.txt + +quick-qc: $(REPORTDIR)/uberon-edit-obscheck.txt + cat $(REPORTDIR)/uberon-edit-obscheck.txt -checks: $(REPORTDIR)/uberon-edit-xp-check $(REPORTDIR)/uberon-edit-obscheck.txt \ - $(REPORTDIR)/bfo-check.txt \ - $(REPORTDIR)/uberon.obo-OWL-check \ - $(REPORTDIR)/uberon-obscheck.txt \ - $(REPORTDIR)/uberon-orphans \ - $(REPORTDIR)/uberon-synclash +.PHONY: checks uberon-qc quick-qc -test: $(REPORTDIR)/uberon-edit-xp-check reports/bfo-check.txt # ---------------------------------------- -# STEP 1: pre-processing +# BUILDING UBERON ITSELF # ---------------------------------------- -# Merge the edit file file with imports, component of disjointness axioms, -# and list of contributors, then expand macros. +# Step 1: Preprocessing. We Merge the edit file file with imports, +# disjointness axioms, and list of contributors, then expand macros. # FIXME: Need explanation for not expanding RO:0002175 specifically. $(OWLSRC): $(SRC) $(COMPONENTSDIR)/disjoint_union_over.ofn $(REPORTDIR)/$(SRC)-gocheck $(REPORTDIR)/$(SRC)-iconv @echo "STRONG WARNING: issues/contributor.owl needs to be manually updated." @@ -98,250 +120,43 @@ $(OWLSRC): $(SRC) $(COMPONENTSDIR)/disjoint_union_over.ofn $(REPORTDIR)/$(SRC)-g expand --no-expand-term http://purl.obolibrary.org/obo/RO_0002175 \ -o $@ -$(TMPDIR)/NORMALIZE.obo: $(SRC) - $(ROBOT) convert -i $< -o $@.tmp.obo && mv $@.tmp.obo $@ - -# ---------------------------------------- -# STEP 2: preparing core release, and merging with phenoscape edit file -# ---------------------------------------- - -# tmp/core.owl is imported by phenoscape-ext.owl; the two together make up the complete ontology -tmp/core.owl: $(SRC) - $(OWLTOOLS) $< -o -f ofn $(TMPDIR)/$@ &&\ - $(ROBOT) merge -i $(TMPDIR)/$@ --collapse-import-closure false annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) convert -f ofn -o $@ - -# A portion of uberon is maintained in a separate github repo - we merge that in here -# as part of the release -# TODO @cmungall questiosn we need this. Bring it into the main one. Talk to Wasila to bring into uberon proper (merge in uberon-edit) -# FIXED apparently our base does not contain phenoscape-ext!! (It does, through unreasoned) -#$(TMPDIR)/phenoscape-ext-src.owl: $(SRC) -# wget --no-check-certificate https://raw.githubusercontent.com/obophenotype/uberon-phenoscape-ext/master/phenoscape-ext.owl -O $@ && touch $@ - -# including the imports would lead to circularity, so we remove these here -#$(COMPONENTSDIR)/phenoscape-ext.owl: $(TMPDIR)/phenoscape-ext-src.owl tmp/core.owl -# owltools $(UCAT) $< --remove-imports-declarations -o -f functional $@ - -# Not used anywhere so commenting out -#$(TMPDIR)/phenoscape_homology.owl: -# wget --no-check-certificate https://raw.githubusercontent.com/phenoscape/phenoscape-ontologies/master/demo/phenoscape_homology.owl -O $@ - -## MERGED UNREASONED ONTOLOGY -## -## TODO - restore Disjoints. _ OLD NOTE. DELETE? -## TODO - get rid of declarations and inferred subclass axioms for other ontology classes _OLD NOTE. DELETE? - -# TODO - Make uberon-bridge-to-bfo.owl a component. BUT it needs to stay in the bridges directory! -$(TMPDIR)/unreasoned.owl: $(OWLSRC) $(BRIDGEDIR)/uberon-bridge-to-bfo.owl # $(COMPONENTSDIR)/phenoscape-ext.owl - $(OWLTOOLS) $^ --merge-support-ontologies -o -f functional $@ - -# First pass at making base module -# Currently this will be missing the temporary reflexivity axioms. -# should this include downward-injected axioms, e.g on ZFA? -#uberon-base.owl: $(TMPDIR)/unreasoned.owl -# $(OWLTOOLS) $< --remove-imports-declarations --remove-axioms -t Declaration --set-ontology-id -v $(RELEASE)/$@ $(URIBASE)/uberon/$@ -o $@.tmp && mv $@.tmp $@ - -# TODO document collected-* pattern (import files see http://uberon.github.io/downloads.html#multiont) -# ---------------------------------------- -# STEP 3: Perform reasoning and create release ext.owl file -# ---------------------------------------- - -# ext.owl is the release file that includes full imports and inter-ontology axioms -#ext.owl: $(TMPDIR)/materialized.owl -# $(ROBOT) reason -i $< -r elk relax reduce -r elk annotate --ontology-iri $(URIBASE)/uberon/$@ -V $(RELEASE)/$@ -o $@ - -## TESTING - NEW -$(TMPDIR)/is_ok: $(TMPDIR)/materialized.owl - $(OWLTOOLS) $< --run-reasoner -r elk -u > $@.tmp && mv $@.tmp $@ - -# somewhat awkward: we temporarily inject reflexivity axioms -# **Hacking_Feb_2022** Notes start here -# Background: -## This ends up in the release file, reflexivity_axioms.owl temp merge as consistency QC -## This is only a QC. Rationale - this would catch some errors because expands part disjointness () -## **Hacking_Feb_2022** TODO - rewrite as as expansions from annotation axioms using SPARQL. Expanded axioms --> component (as for taxon restrictions). - -TMP_REFL=$(COMPONENTSDIR)/reflexivity_axioms.owl +# Step 2: Reasoning. +# For the temporary injection of property chains, see +# DEVELOPS_FROM_CHAIN=$(COMPONENTSDIR)/develops-from-chains.owl -# see https://github.com/obophenotype/uberon/issues/2381 - -$(TMPDIR)/materialized.owl: $(TMPDIR)/unreasoned.owl $(TMP_REFL) - $(ROBOT) merge -i $< -i $(DEVELOPS_FROM_CHAIN) --collapse-import-closure false \ - relax \ - materialize -T $(CONFIGDIR)/basic_properties.txt -r elk \ - reason -r elk --exclude-duplicate-axioms true --equivalent-classes-allowed asserted-only \ - unmerge -i $(TMP_REFL) \ - unmerge -i $(DEVELOPS_FROM_CHAIN) \ - annotate -O $(URIBASE)/uberon/materialized.owl -V $(RELEASE)/materialized.owl -o $@ 2>&1 > $@.LOG -.PRECIOUS: $(TMPDIR)/materialized.owl - -# Used directly by Bgee, see https://github.com/obophenotype/uberon/issues/1501 -ext.owl: $(TMPDIR)/materialized.owl - $(ROBOT) annotate -i $< --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) -o $@ 2>&1 > $(TMPDIR)/$@.LOG - -# ---------------------------------------- -# STEP 4: Create uberon.owl and .obo -# ---------------------------------------- - -# tmp/merged.owl is now the flattening of ext.owl -# TODO: do we need this intermediate step? Used for subsets -tmp/merged.owl: ext.owl - $(OWLTOOLS) $< --merge-import-closure --set-ontology-id -v $(RELEASE)/$@ $(URIBASE)/uberon/$@ -o $(TMPDIR)/$@ &&\ - $(ROBOT) merge -i $(TMPDIR)/$@ --collapse-import-closure false annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) -o $@ - -# strip imports and dangling references -# owltools $(UCAT) $< --remove-imports-declarations --remove-dangling --set-ontology-id -v $(RELEASE)/$@ $(URIBASE)/$@ -o $@ - -uberon.owl: ext.owl - $(ROBOT) merge -i $< annotate -O $(URIBASE)/$@ -V $(RELEASE)/$@ -o $@ - +uberon.owl: $(OWLSRC) $(BRIDGEDIR)/uberon-bridge-to-bfo.owl $(DEVELOPS_FROM_CHAIN) + $(ROBOT) merge -i $(OWLSRC) -i $(BRIDGEDIR)/uberon-bridge-to-bfo.owl \ + -i $(DEVELOPS_FROM_CHAIN) \ + relax \ + materialize -T $(CONFIGDIR)/basic_properties.txt -r elk \ + reason -r elk --exclude-duplicate-axioms true \ + --equivalent-classes-allowed asserted-only \ + unmerge -i $(DEVELOPS_FROM_CHAIN) \ + annotate -O $(URIBASE)/$@ -V $(RELEASE)/$@ -o $@ + +# Step 2.1: Generating other formats. # also do OE check here uberon.obo: uberon.owl $(MAKEOBO) .PRECIOUS: uberon.obo -uberon.yaml: uberon.owl - $(MAKEYAML) -.PRECIOUS: uberon.yaml - uberon.json.gz: uberon.json gzip -c $< > $@.tmp && mv $@.tmp $@ .PRECIOUS: uberon.json.gz # ---------------------------------------- -# STEP 5: Create basic subset -# ---------------------------------------- - -basic.owl: uberon-basic.owl - $(ROBOT) merge -i $< annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) -o $@ - -basic.obo: basic.owl - $(MAKEOBO) - - - -#subsets/efo-slim.owl: basic.owl -# owltools $(UCAT) $< --extract-ontology-subset --subset efo_slim --iri $(URIBASE)/uberon/$@ -o $@ -#subsets/efo-slim.obo: subsets/efo-slim.owl -# $(MAKEOBO) -subsets/cumbo.owl: basic.owl - $(OWLTOOLS) $< --extract-ontology-subset --subset cumbo --iri $(URIBASE)/uberon/$@ -o $@ -subsets/cumbo.obo: subsets/cumbo.owl - $(MAKEOBO) - - -#TEMPORARY - we will later -#supercheck.owl: $(TMPDIR)/unreasoned.owl -# owltools $(UCAT) $< $(COMPONENTSDIR)/phenoscape-ext.owl --merge-support-ontologies --expand-macros --assert-inferred-subclass-axioms --useIsInferred -o -f functional $@ - -# ---------------------------------------- -# STEP 6: Create common anatomy subset -# ---------------------------------------- - -common-anatomy.owl: $(ONT).owl - $(OWLTOOLS) $< --extract-ontology-subset --fill-gaps --subset common_anatomy -o $@.tmp.owl && mv $@.tmp.owl $@ &&\ - $(ROBOT) annotate --input $@ --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) -o $@.tmp.owl && mv $@.tmp.owl $@ -.PRECIOUS: common-anatomy.owl - - - -# ---------------------------------------- -# IMPORTS +# MIRRORS # ---------------------------------------- -# imports can be built independently of the main release. -# (although pre-processing of the source is done first) -# -# The typical pipeline (see uberon-qc) is to first make imports, then the rest of the release - -# merge BSPO into RO -# get rid of it -mirror/bspo.owl: mirror-bspo | $(MIRRORDIR) - if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(ROBOT) merge -I $(URIBASE)/bspo/bspo-base.owl -o $@.tmp.owl && mv $@.tmp.owl $@; fi -.PRECIOUS: mirror/bspo.owl - -# Probably no reason to merge them first -# --add-obo-shorthand-to-properties: remove this to add mappings into remove -mirror/ro.owl: mirror/bspo.owl mirror-ro | $(MIRRORDIR) - if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) $(URIBASE)/ro.owl $< --merge-support-ontologies --merge-imports-closure --add-obo-shorthand-to-properties -o $@ && touch $@; fi - -imports/envo_import.owl: - echo "ERROR $@ IMPORT CURRENTLY BLOCKED BECAUSE BROKEN UPSTREAM." - -############ - -# This goal here is needed as a new _intermediate_ for mirrors that need to be fixed -# by hacking into their OBO format representations. -$(TMPDIR)/mirror-%.obo: mirror-% | $(TMPDIR) - if [ $(IMP) = true ] && [ $(MIR) = true ]; then $(ROBOT) convert --input $(TMPDIR)/mirror-$*.owl --check false -f obo $(OBO_FORMAT_OPTIONS) -o $@.tmp.obo && grep -v ^owl-axioms $@.tmp.obo > $@ && rm $@.tmp.obo; fi - -# Filter only EMAPA classes -# EMAPA using a list flat ids for stages, these are mapped to MmusDv ids by fix-emapa-stages.pl -# It would be useful to make a combined stage ontology, but than make it filterable by species (subsets) -$(TMPDIR)/fixed-emapa.obo: $(TMPDIR)/mirror-emapa.obo - if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(SCRIPTSDIR)/obo-grep.pl -r 'id: EMAPA' $< | $(SCRIPTSDIR)/fix-emapa-stages.pl > $@; fi - -# stages must be mapped to MmusDv -# We should add releate targets to stage ontology repo makefile. -# Most stage ontologies in the stage ontology do not have PURls -# We not to review the stage repo, in particular make sure that ontologies like ZFS are updated correctly -$(TMPDIR)/developmental-stage-ontologies/src/mmusdv/mmusdv.obo: $(TMPDIR)/update-stages - test -f $@ - -mirror/emapa.owl: $(TMPDIR)/fixed-emapa.obo $(TMPDIR)/developmental-stage-ontologies/src/mmusdv/mmusdv.obo - if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) $(TMPDIR)/fixed-emapa.obo $(TMPDIR)/developmental-stage-ontologies/src/mmusdv/mmusdv.obo --merge-support-ontologies -o -f ofn $@; fi +# We add OBO shorthands to the RO mirror before merging it with the other mirrors +# FIXME: https://github.com/obophenotype/uberon/issues/3016 +mirror/ro.owl: mirror-ro | $(MIRRORDIR) + if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(OWLTOOLS) $(TMPDIR)/mirror-ro.owl --add-obo-shorthand-to-properties -o $@ ; fi -# https://github.com/obophenotype/uberon/issues/423#issuecomment-43425949 - -# TODO: We should fix that upstream -# They are using too strict relationships, which are here replaced by more general ones -$(TMPDIR)/fixed-zfa.obo: $(TMPDIR)/mirror-zfa.obo - if [ $(MIR) = true ] && [ $(IMP) = true ]; then perl -npe 's@RO:0002488@RO:0002496@;s@RO:0002492@RO:0002497@' $< > $@; fi - -mirror/zfa.owl: $(TMPDIR)/fixed-zfa.obo - if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) $< -o -f ofn $@; fi - -$(TMPDIR)/fixed-ehdaa2.obo: $(TMPDIR)/mirror-ehdaa2.obo | $(SCRIPTSDIR)/obo-grep.pl $(SCRIPTSDIR)/fix-ehdaa2-stages.pl - if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(SCRIPTSDIR)/obo-grep.pl -r 'id: (EHDAA2|AEO)' $< | $(SCRIPTSDIR)/fix-ehdaa2-stages.pl | grep -v ^alt_id > $@; fi - -mirror/%.obo: mirror/%.owl - if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(MAKEOBO); fi - -# https://raw.githubusercontent.com/cmungall/human-developmental-anatomy-ontology/uberon/src/ontology/ehdaa2-edit.obo -# There was a period when Jonathan sent OBO files to Chris -# Jonathan has "essentially" seeded the ownership? Double check -#mirror/ehdaa2.owl: -# if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) https://raw.githubusercontent.com/cmungall/human-developmental-anatomy-ontology/uberon/src/ontology/ehdaa2-edit.obo -o -f ofn $@; fi - -#CMUNGALL_OBO_SCRIPTS=https://raw.githubusercontent.com/cmungall/obo-scripts/master/ -#$(SCRIPTSDIR)/%.pl: -# wget $(CMUNGALL_OBO_SCRIPTS)/$*.pl -O $@ && chmod +x $@ -#.PRECIOUS: $(SCRIPTSDIR)/%.pl - -# These ones are not on Chris script servers so recycling old ones -# $(SCRIPTSDIR)/check-obo-for-standard-release.pl \ -# $(SCRIPTSDIR)/expand-dbxref-literals.pl \ -# $(SCRIPTSDIR)/expand-idspaces.pl \ -# $(SCRIPTSDIR)/fix-ehdaa2-stages.pl \ -# $(SCRIPTSDIR)/make-bridge-ontologies-from-xrefs.pl \ -# $(SCRIPTSDIR)/allen-json2obo.pl \ -# cp $(SCRIPTSDIR)/util/$(shell basename $@) $@ && chmod +x $@ - -# We use the branch here: https://github.com/cmungall/human-developmental-anatomy-ontology/tree/uberon -# this has some necessary changes, e.g. https://github.com/cmungall/human-developmental-anatomy-ontology/issues/1 - - -# Note: mirrors are now generated on demand -##mirror-%.owl: $(SRC) - -#local-NIF_GrossAnatomy.obo: merged.obo -# wget http://ontology.neuinfo.org/NIF/BiomaterialEntities/NIF-GrossAnatomy.owl -O cached-$@.owl && perl -pi -ne 's@http://ontology.neuinfo.org/NIF/BiomaterialEntities/NIF-GrossAnatomy.owl#@$(URIBASE)/NIF_GrossAnatomy_@g' cached-$@.owl && owltools cached-$@.owl -o -f obo $@ - - -#################################### -### Local Ontology dependencies #### -#################################### -# these are hacked mirrors +# All the following mirrors are needed, not for imports, but for +# Uberon-specific pipelines (especially the composite-* stuff). +# That's why they are not handled by the ODK-generated Makefile. ## ONTOLOGY: ceph .PHONY: mirror-ceph @@ -351,7 +166,6 @@ mirror-ceph: | $(TMPDIR) $(ROBOT) convert -i $(MIRRORDIR)/ceph.owl -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi - ## ONTOLOGY: cteno .PHONY: mirror-cteno .PRECIOUS: $(MIRRORDIR)/cteno.owl @@ -360,7 +174,6 @@ mirror-cteno: | $(TMPDIR) $(ROBOT) convert -i $(MIRRORDIR)/cteno.owl -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi - ## ONTOLOGY: ehdaa2 .PHONY: mirror-ehdaa2 .PRECIOUS: $(MIRRORDIR)/ehdaa2.owl @@ -368,7 +181,6 @@ mirror-ehdaa2: | $(TMPDIR) if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(ROBOT) convert -I https://raw.githubusercontent.com/cmungall/human-developmental-anatomy-ontology/uberon/src/ontology/ehdaa2-edit.obo -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi - ## ONTOLOGY: emapa .PHONY: mirror-emapa .PRECIOUS: $(MIRRORDIR)/emapa.owl @@ -377,7 +189,6 @@ mirror-emapa: | $(TMPDIR) $(ROBOT) convert -i $(MIRRORDIR)/emapa.owl -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi - ## ONTOLOGY: fbbt .PHONY: mirror-fbbt .PRECIOUS: $(MIRRORDIR)/fbbt.owl @@ -386,7 +197,6 @@ mirror-fbbt: | $(TMPDIR) $(ROBOT) convert -i $(MIRRORDIR)/fbbt.owl -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi - ## ONTOLOGY: fbdv .PHONY: mirror-fbdv .PRECIOUS: $(MIRRORDIR)/fbdv.owl @@ -395,7 +205,6 @@ mirror-fbdv: | $(TMPDIR) $(ROBOT) convert -i $(MIRRORDIR)/fbdv.owl -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi - ## ONTOLOGY: ma .PHONY: mirror-ma .PRECIOUS: $(MIRRORDIR)/ma.owl @@ -404,7 +213,6 @@ mirror-ma: | $(TMPDIR) $(ROBOT) convert -i $(MIRRORDIR)/ma.owl -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi - ## ONTOLOGY: poro .PHONY: mirror-poro .PRECIOUS: $(MIRRORDIR)/poro.owl @@ -413,7 +221,6 @@ mirror-poro: | $(TMPDIR) $(ROBOT) convert -i $(MIRRORDIR)/poro.owl -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi - ## ONTOLOGY: wbbt .PHONY: mirror-wbbt .PRECIOUS: $(MIRRORDIR)/wbbt.owl @@ -422,7 +229,6 @@ mirror-wbbt: | $(TMPDIR) $(ROBOT) convert -i $(MIRRORDIR)/wbbt.owl -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi - ## ONTOLOGY: wbls .PHONY: mirror-wbls .PRECIOUS: $(MIRRORDIR)/wbls.owl @@ -431,7 +237,6 @@ mirror-wbls: | $(TMPDIR) $(ROBOT) convert -i $(MIRRORDIR)/wbls.owl -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi - ## ONTOLOGY: xao .PHONY: mirror-xao .PRECIOUS: $(MIRRORDIR)/xao.owl @@ -440,7 +245,6 @@ mirror-xao: | $(TMPDIR) $(ROBOT) convert -i $(MIRRORDIR)/xao.owl -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi - ## ONTOLOGY: zfa .PHONY: mirror-zfa .PRECIOUS: $(MIRRORDIR)/zfa.owl @@ -449,7 +253,6 @@ mirror-zfa: | $(TMPDIR) $(ROBOT) convert -i $(MIRRORDIR)/zfa.owl -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi - ## ONTOLOGY: caro .PHONY: mirror-caro .PRECIOUS: $(MIRRORDIR)/caro.owl @@ -458,26 +261,57 @@ mirror-caro: | $(TMPDIR) $(ROBOT) convert -i $(MIRRORDIR)/caro.owl -o $@.tmp.owl &&\ mv $@.tmp.owl $(TMPDIR)/$@.owl; fi -# FEDERATED ONTOLOGY MIRRORING -# TODO removed disjoint axioms from poro, see https://github.com/obophenotype/uberon/issues/1799 -imports/local-poro.owl: - if [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) $(URIBASE)/poro.owl --merge-imports-closure --remove-axioms -t DisjointClasses --remove-equivalent-to-nothing-axioms --remove-annotation-assertions -l -s -d -o $@; fi -imports/local-cteno.owl: - if [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) $(URIBASE)/cteno.owl --remove-import-declaration $(URIBASE)/uberon/ext.owl --merge-imports-closure --remove-annotation-assertions -l -s -d -o $@; fi -imports/local-ceph.owl: - if [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) $(URIBASE)/ceph.owl --remove-import-declaration $(URIBASE)/ceph/imports/uberon_import.owl --merge-imports-closure --remove-annotation-assertions -l -s -d -o $@; fi +# Some mirrors need corrections before they can be used by the +# composite-* pipelines and currently these corrections are done by +# hacking the OBO representation of the original ontologies. +# Here we create OBO versions of the original mirrors as needed... +$(TMPDIR)/mirror-%.obo: mirror-% | $(TMPDIR) + if [ $(IMP) = true ] && [ $(MIR) = true ]; then \ + $(ROBOT) convert -i $(TMPDIR)/mirror-$*.owl \ + --check false -f obo $(OBO_FORMAT_OPTIONS) \ + -o $@.tmp.obo && \ + grep -v ^owl-axioms $@.tmp.obo > $@ && \ + rm $@.tmp.obo ; \ + fi + +# ... and now we can joyfully hack them! +# Hacked mirror 1: EMAPA +# This hack is used to re-generate imports/local-emapa.owl, but this +# never happens automatically. It is not part of the normal imports +# pipeline, so it is not invoked when doing a refresh-imports. +# The corresponding rules are invoked during the release process (as +# prerequisites of the composite-* pipeline), but normally both MIR and +# IMP are false at this point, so no commands are executed. The rules +# themselves are necessary to trigger the cloning of the +# developmental-stage-ontologies repository, though. +# Step 1: Map EMAPA stage IDs to MmusDv +$(TMPDIR)/fixed-emapa.obo: $(TMPDIR)/mirror-emapa.obo + if [ $(MIR) = true ] && [ $(IMP) = true ]; then \ + $(SCRIPTSDIR)/obo-grep.pl -r 'id: EMAPA' $< | \ + $(SCRIPTSDIR)/fix-emapa-stages.pl > $@; \ + fi + +# Step 2: Merge with MmusDv to create the final, fixed mirror +mirror/emapa.owl: $(TMPDIR)/fixed-emapa.obo $(TMPDIR)/update-stages + if [ $(MIR) = true ] && [ $(IMP) = true ]; then \ + $(ROBOT) merge -i $(TMPDIR)/fixed-emapa.obo \ + -i $(TMPDIR)/developmental-stage-ontologies/src/mmusdv/mmusdv.obo \ + convert -f ofn -o $@ ; \ + fi -# NON-ORTHOGONAL ONTOLOGY MIRRORING -## Devloper notes: Local files are used for a bunch of quality checks, and the composite file -## Not anywhere in normal uberon. +# ---------------------------------------- +# "LOCAL" IMPORTS +# ---------------------------------------- + +# The following imports are used in Uberon-specific pipelines. They are +# *not* updated as part of the refresh-imports pipeline. In fact, they +# are normally never updated automatically, since Uberon-specific +# pipelines are typically run with IMP set to false. -## Map legacy OBO-format ObjectProperties to their BFO/RO intended equivalent -## a mirror is just a mirror, and local-mirror is a file with all that wrangling needed to message it into the right form. local- files are needed in composite file generation. -## -## TODO: many ontologies may have fixed their legacy properties -## TODO: Shouldnt bridge generation be a depenency for this goal? eg $(BRIDGEDIR)/uberon-bridge-to-caro.owl -# Probably renaming local- to composite, as all of the local stuff is used for composite +# Map legacy OBO-format object properties to their BFO/RO equivalent +# FIXME: this may no longer be needed for some of these imports +# (https://github.com/obophenotype/uberon/issues/3017) imports/local-%.owl: mirror/%.owl if [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) $< $(BRIDGEDIR)/uberon-bridge-to-caro.owl $(BRIDGEDIR)/cl-bridge-to-caro.owl --rename-entities-via-equivalent-classes --repair-relations \ --rename-entity $(URIBASE)/$*#develops_in $(URIBASE)/RO_0002203 \ @@ -498,422 +332,408 @@ imports/local-%.owl: mirror/%.owl --rename-entity $(URIBASE)/$*#constitutional_part_of $(URIBASE)/BFO_0000050\ --remove-axioms -t DisjointClasses --remove-axioms -t ObjectPropertyRange --remove-axioms -t ObjectPropertyDomain --remove-annotation-assertions -l -s -d -o -f ofn $@; fi -imports/local-%.obo: imports/local-%.owl - if [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) $< -o -f obo $@; fi - -#seed.tsv: $(TMPDIR)/seed.owl -# owltools $(USECAT) --extract- - -# Import module for RO -# if [ $(MIR) = true ] && [ $(IMP) = true ]; then command; fi -# No TBox; use an OP seed that is derived from a separate sparql query -tmp/ro_seed.txt: imports/ro_terms.txt reports/uberon-edit-object-properties.csv - cat $^ | sort | uniq > $@ - -imports/ro_import.owl: mirror/ro.owl $(TMPDIR)/seed.owl tmp/ro_seed.txt - if [ $(IMP) = true ]; then $(ROBOT) extract -i $< -m BOT -T tmp/ro_seed.txt --individuals exclude annotate -O $(ONTBASE)/$@ -a $(DC)/title "Relations Ontology Module for Uberon" -o $@.tmp.owl && $(OWLTOOLS_NO_CAT) $@.tmp.owl --remove-tbox --remove-annotation-assertions -l -d -r -p http://purl.obolibrary.org/obo/OMO_0002000 -o $@; fi - -imports/pato_import.owl: mirror/pato.owl imports/pato_terms_combined.txt - if [ $(IMP) = true ]; then $(ROBOT) query -i $< --update ../sparql/preprocess-module.ru \ - extract -T imports/pato_terms_combined.txt --force true --copy-ontology-annotations true --individuals include --method BOT \ - remove --select "" \ - remove --select "" \ - query --update ../sparql/inject-subset-declaration.ru --update ../sparql/postprocess-module.ru \ - annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) --output $@.tmp.owl && mv $@.tmp.owl $@; fi - -imports/nbo_import.owl: mirror/nbo.owl imports/nbo_terms_combined.txt - if [ $(IMP) = true ]; then $(ROBOT) query -i $< --update ../sparql/preprocess-module.ru \ - extract -T imports/nbo_terms_combined.txt --force true --copy-ontology-annotations true --individuals include --method BOT \ - remove --select "" \ - remove --select "" \ - query --update ../sparql/inject-subset-declaration.ru --update ../sparql/postprocess-module.ru \ - annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) --output $@.tmp.owl && mv $@.tmp.owl $@; fi - -imports/fbbt_import.owl: mirror/fbbt.owl imports/fbbt_terms_combined.txt - if [ $(IMP) = true ]; then $(ROBOT) query -i $< --update ../sparql/preprocess-module.ru \ - extract -T imports/fbbt_terms_combined.txt --force true --copy-ontology-annotations true --individuals include --method BOT \ - query --update ../sparql/inject-subset-declaration.ru --update ../sparql/postprocess-module.ru --update $(SPARQLDIR)/remove_axioms.ru \ - annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) --output $@.tmp.owl && mv $@.tmp.owl $@; fi - -# CL - take **everything** -imports/cl_import.owl: $(TMPDIR)/cl-core.obo $(OWLSRC) - if [ $(IMP) = true ]; then $(OWLTOOLS) $< --set-ontology-id -v $(RELEASE)/$@ $(ONTBASE)/$@ -o $@; fi - -%_import.obo: %_import.owl - if [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) $< --add-obo-shorthand-to-properties -o -f obo --no-check $@; fi +# These imports don't need the object property mapping, but still +# require some specific axiom-removal +# FIXME: check whether this is really still required +# (https://github.com/obophenotype/uberon/issues/3017) +imports/local-poro.owl: + if [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) $(URIBASE)/poro.owl --merge-imports-closure --remove-axioms -t DisjointClasses --remove-equivalent-to-nothing-axioms --remove-annotation-assertions -l -s -d -o $@; fi +imports/local-cteno.owl: + if [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) $(URIBASE)/cteno.owl --remove-import-declaration $(URIBASE)/uberon/ext.owl --merge-imports-closure --remove-annotation-assertions -l -s -d -o $@; fi +imports/local-ceph.owl: + if [ $(IMP) = true ]; then $(OWLTOOLS_NO_CAT) $(URIBASE)/ceph.owl --remove-import-declaration $(URIBASE)/ceph/imports/uberon_import.owl --merge-imports-closure --remove-annotation-assertions -l -s -d -o $@; fi -# ---------------------------------------- -# MARKDOWN EXPORT -# ---------------------------------------- -markdown: - $(OWLTOOLS) ext.owl --merge-imports-closure --ontology-to-markdown md +# Allen imports # ---------------------------------------- -# REPORTS -# ---------------------------------------- -Drerio = NCBITaxon:7955 -Xenopus = NCBITaxon:8353 -Human = NCBITaxon:9606 -Dmel = NCBITaxon:7227 -##RPT_TAXA_ARGS = -gp BFO:0000050 -gf $(Drerio) $(Xenopus) $(Human) $(Dmel) -RPT_TAXA_ARGS = -#RPT_STAGE_RELS = RO:0002488 RO:0002492 RO:0002496 RO:0002497 -RPT_STAGE_RELS = RO:0002496 RO:0002497 +# Those imports are custom-generated from data exported from the Allen +# institute's brain-map.org. -#%-classes.tsv: %.owl -# owljs-tableify -R "RO_0002202,transformation of,in taxon,existence starts during,existence ends during" -c -o $@ $< -## owljs-tableify -R "develops from,in taxon,existence_starts_during,existence ends during" -c -o $@ $< +ALLENS = dmba hba dhba pba mba +allen_all: $(patsubst %,$(TMPDIR)/allen-%.obo,$(ALLENS)) -#%-parents.tsv: %-part-parents.tsv %-dev-parents.tsv %-tax-parents.tsv %-stage-parents.tsv %-function-parents.tsv -# echo done +$(TMPDIR)/allen-dmba.json: | $(TMPDIR) + wget https://api.brain-map.org/api/v2/structure_graph_download/17.json -O $@ +$(TMPDIR)/allen-hba.json: | $(TMPDIR) + wget https://api.brain-map.org/api/v2/structure_graph_download/10.json -O $@ +$(TMPDIR)/allen-dhba.json: | $(TMPDIR) + wget https://api.brain-map.org/api/v2/structure_graph_download/16.json -O $@ +$(TMPDIR)/allen-pba.json: | $(TMPDIR) + wget https://api.brain-map.org/api/v2/structure_graph_download/8.json -O $@ -reports/%-part-of-parents.tsv: %.owl - $(OWLTOOLS) $< --reasoner elk --reasoner mexr --log-error --export-parents -p BFO:0000050 $(RPT_TAXA_ARGS) -o $@.tmp && mv $@.tmp $@ -.PRECIOUS: reports/%-part-of-parents.tsv -reports/%-has-part-parents.tsv: %.owl - $(OWLTOOLS) $< --reasoner elk --reasoner mexr --log-error --export-parents -p BFO:0000051 $(RPT_TAXA_ARGS) -o $@.tmp && mv $@.tmp $@ -.PRECIOUS: reports/%-has-part-parents.tsv -reports/%-dev-parents.tsv: %.owl - $(OWLTOOLS) $< --reasoner elk --reasoner mexr --export-parents -p RO:0002202 RO:0002494 -o $@.tmp && mv $@.tmp $@ -.PRECIOUS: reports/%-dev-parents.tsv -reports/%-tax-parents.tsv: %.owl - $(OWLTOOLS) $< --reasoner elk --reasoner mexr --export-parents -p RO:0002162 -o $@.tmp && mv $@.tmp $@ -.PRECIOUS: reports/%-tax-parents.tsv -reports/%-stage-parents.tsv: %.owl - $(OWLTOOLS) $< --reasoner elk --reasoner mexr --log-error --export-parents -p $(RPT_STAGE_RELS) $(RPT_TAXA_ARGS) -o $@.tmp && mv $@.tmp $@ -.PRECIOUS: reports/%-stage-parents.tsv -reports/%-function-parents.tsv: %.owl - $(OWLTOOLS) $< --reasoner elk --reasoner mexr --export-parents -p RO:0002328 -o $@.tmp && mv $@.tmp $@ -.PRECIOUS: reports/%-function-parents.tsv +$(TMPDIR)/allen-mba.json: | $(TMPDIR) + wget https://api.brain-map.org/api/v2/structure_graph_download/1.json -O $@ -reports/uberon-%.csv: uberon.owl ../sparql/%.sparql - $(ROBOT) query -i $< --query ../sparql/$*.sparql $@.tmp && $(SCRIPTSDIR)/curiefy-purls.pl $@.tmp > $@ && rm $@.tmp +$(TMPDIR)/allen-%.obo: $(TMPDIR)/allen-%.json $(SCRIPTSDIR)/allen-json2obo.pl + $(SCRIPTSDIR)/allen-json2obo.pl $< > $@ -reports/uberon-edit-%.csv: $(OWLSRC) ../sparql/%.sparql - $(ROBOT) query -i $< --query ../sparql/$*.sparql $@.tmp && $(SCRIPTSDIR)/curiefy-purls.pl $@.tmp > $@ && rm $@.tmp +ALLEN_UNSATS=--term DHBA:146035008 --term DHBA:146035004 --term DHBA:146035012 +$(TMPDIR)/allen-dhba.obo: $(TMPDIR)/allen-dhba.json $(SCRIPTSDIR)/allen-json2obo.pl + $(SCRIPTSDIR)/allen-json2obo.pl $< > $@ + $(ROBOT) remove -i $@ --prefix "DHBA: http://purl.obolibrary.org/obo/DHBA_" \ + $(ALLEN_UNSATS) --axioms logical \ + -o $@.tmp.obo && mv $@.tmp.obo $@ -# nh-% : no -homology relations -# -# match pattern for any relation to be filtered out -XSPECIES_RE = -m '/(RO_0002158|evolved_from)/' -nh-%.obo: composite-%.owl - $(OWLTOOLS) $< -o -f obo --no-check $@.tmp && egrep -v 'relationship: (homologous_to|evolved_from)' $@.tmp > $@ -nh-%.owl: nh-%.obo - $(OWLTOOLS) $< -o $@.tmp && mv $@.tmp $@ +# ---------------------------------------- +# UNRELEASED PRODUCTS +# ---------------------------------------- +# This section is intended to regroup rules that create files that are +# not generated during a normal pipeline and that are never released, +# but that someone may want to explicitly generate locally. This does +# not include unreleased *reports* and *views/subsets*. +# Markdown export +markdown: + $(OWLTOOLS) uberon.owl --merge-imports-closure --ontology-to-markdown md -#nh-human.owl: composite-human.owl -# owljs-grep -v $(XSPECIES_RE) -o $@ $< -#nh-mouse.owl: composite-mouse.owl -# owljs-grep -v $(XSPECIES_RE) -o $@ $< +# nh-%: Composite product with no "homology" relation +# ---------------------------------------- +nh-%.obo: composite-%.obo + egrep -v 'relationship: (homologous_to|evolved_from)' $< > $@ -#nh-zebrafish.owl: composite-zfa.owl -# owljs-grep -v $(XSPECIES_RE) -o $@ $< +nh-%.owl: mh-%.obo + $(ROBOT) convert -i $< --check false -f obo -o $@ -#nh-xenopus.owl: composite-xenopus.owl -# owljs-grep -v $(XSPECIES_RE) -o $@ $< -#nh-drosophila.owl: composite-fbbt.owl -# owljs-grep -v $(XSPECIES_RE) -o $@ $< +# Extract taxon constraints (experimental, for propagation to GO?) +# ---------------------------------------- +$(TMPDIR)/uberon-taxon-constraints.obo: $(SRC) + $(SCRIPTSDIR)/obo-filter-relationships.pl -t only_in_taxon -t never_in_taxon $< | \ + $(SCRIPTSDIR)/obo-filter-tags.pl -t id -t name -t relationship - | \ + $(SCRIPTSDIR)/obo-grep.pl --noheader -r relationship: - > $@.tmp && \ + cat $@.tmp $(COMPONENTSDIR)/taxon_relations.obo > $@ -#nh-nematode.owl: composite-wbbt.owl -# owljs-grep -v $(XSPECIES_RE) -o $@ $< +$(TMPDIR)/uberon-taxon-constraints.owl: $(TMPDIR)/uberon-taxon-constraints.obo + $(OWLTOOLS) $< --expand-macros -o $@ -# run the reasoner, set to remove unsatisfiable classes (ie those not in the species specified in the context) -#ext-taxon-axioms.owl -# mouse xenopus human +# %-xf: Product without "non-subclass cross-references"? +%-xf.obo: %.obo + egrep -v '^xref: (OpenCyc|http)' $< > $@ -# We need to add CL terms to the seed as well, because CL terms also go into the slim.. -tmp/simple-slim-seed.txt: $(SRCMERGED) $(SIMPLESEED) - $(ROBOT) query -f csv -i $< --query ../sparql/cl_terms.sparql $@.tmp &&\ - cat $@.tmp $(SIMPLESEED) | sort | uniq > $@ -subsets/%-view.owl: ext.owl contexts/context-%.owl tmp/simple-slim-seed.txt - $(OWLTOOLS) ext.owl contexts/context-$*.owl --merge-support-ontologies --merge-imports-closure $(QELK) --run-reasoner -r elk -x -o -f ofn $@.tmp.owl &&\ - $(ROBOT) reason --input $@.tmp.owl --reasoner ELK --equivalent-classes-allowed all --exclude-tautologies structural \ - unmerge -i contexts/context-$*.owl \ - relax \ - remove --axioms equivalent \ - relax \ - filter --term-file tmp/simple-slim-seed.txt --select "annotations ontology anonymous self" --trim true --signature true \ - reduce -r ELK \ - query --update ../sparql/inject-subset-declaration.ru \ - annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ - convert -f ofn -o $@.tmp.owl && mv $@.tmp.owl $@ -.PRECIOUS: subsets/%-view.owl +# %-noext: Product with only UBERON terms +# (if you need this, consider using uberon-base instead) +%-noext.obo: %.obo + $(SCRIPTSDIR)/obo-grep.pl -r 'id: UBERON:' $< > $@.tmp && mv $@.tmp $@ -# $(OWLTOOLS) $< --extract-ontology-subset --fill-gaps --subset $* -o $@.tmp.owl && mv $@.tmp.owl $@ &&\ -# subsets/xenopus-view.owl: ext.owl contexts/context-xenopus.owl -# $(OWLTOOLS) $^ --merge-support-ontologies --merge-imports-closure $(QELK) --set-ontology-id $(URIBASE)/$@ --run-reasoner -r elk -x +# %-names: Complete list of all term names in a product +%-names.txt: %.obo + grep ^name: $< | grep -v obsolete | perl -npe 's@name: @@' > $@.tmp && sort -u $@.tmp > $@ -#subsets/human-view.owl: ext.owl contexts/context-human.owl -# $(OWLTOOLS) $^ --merge-support-ontologies --merge-imports-closure $(QELK) --set-ontology-id $(URIBASE)/$@ --run-reasoner -r elk -x -o -f ofn $@ -subsets/metazoan-view.owl: basic.owl - cp $< $@ +# uberon-nif-merged: Uberon merged with the NIF Gross Anatomy +# FIXME: currently broken, and of dubious usefulness +# (https://github.com/obophenotype/uberon/issues/3018) +# ---------------------------------------- +$(TMPDIR)/NIF-GrossAnatomy-src.owl: + wget http://ontology.neuinfo.org/NIF/BiomaterialEntities/NIF-GrossAnatomy.owl -O $@ -#subsets/%-view.obo: subsets/%-view.owl -# owltools $(UCAT) $< -o -f obo --no-check $@.tmp && grep -v ^owl $@.tmp > $@ +$(TMPDIR)/NIF-GrossAnatomy.owl: $(TMPDIR)/NIF-GrossAnatomy-src.owl + perl -npe 's@http://ontology.neuinfo.org/NIF/BiomaterialEntities/NIF-GrossAnatomy.owl#@http://purl.obolibrary.org/obo/NIF_GrossAnatomy_@g' $< > $@ -# note: drosophila too slow.... -#RPT_SPECIES = human mouse zebrafish xenopus -RPT_SPECIES = human mouse xenopus metazoan +$(TMPDIR)/NIF-GrossAnatomy-orig.obo: $(TMPDIR)/NIF-GrossAnatomy.owl + $(ROBOT) convert -i $< --check false -f obo -o $@ -reports/stages: $(patsubst %,reports/stages-%-report.tsv,$(RPT_SPECIES)) - echo done -reports/parts: $(patsubst %,reports/part-%-report.tsv,$(RPT_SPECIES)) - echo done +$(TMPDIR)/NIF-GrossAnatomy.obo: $(TMPDIR)/NIF-GrossAnatomy-orig.obo + $(SCRIPTSDIR)/fix-nif-ga.pl $< > $@ -reports/stages-%-report.tsv: subsets/%-view.owl - $(OWLTOOLS) $< --reasoner mexr --export-parents -p $(RPT_STAGE_RELS) -o $@.tmp && mv $@.tmp $@ +uberon-nif-merged.owl: uberon.owl $(TMPDIR)/NIF-GrossAnatomy.obo $(BRIDGEDIR)/uberon-bridge-to-nif_gross_anatomy.owl + $(OWLTOOLS) $^ --merge-support-ontologies \ + --reasoner elk --merge-equivalent-classes -f -t UBERON -o $@.tmp && \ + grep -v ' $@ -# experimental.... +uberon-nif-merged.obo: uberon-nif-merged.owl + $(ROBOT) convert -i $< --check false -f obo -o $@ -branches: reports/branches-nerve.png reports/branches-artery.png # ---------------------------------------- -# EXTRACT TCs +# REPORTS # ---------------------------------------- +# This section regroup all rules that create reports. Not all of those +# reports are released, and not all are automatically generated as part +# of the normal pipeline. +# Reports of closest inferred parent through object properties. +# For an object property REL, such a report gives for every class C the +# closest class P such as "C is_a REL some P" holds. +# ---------------------------------------- -# experimental: for propagation to GO -$(TMPDIR)/uberon-taxon-constraints.obo: $(SRC) - $(SCRIPTSDIR)/obo-filter-relationships.pl -t only_in_taxon -t never_in_taxon $< | $(SCRIPTSDIR)/obo-filter-tags.pl -t id -t name -t relationship - | $(SCRIPTSDIR)/obo-grep.pl --noheader -r relationship: - > $@.tmp && cat $@.tmp $(COMPONENTSDIR)/taxon-relations.obo > $@ - -$(TMPDIR)/uberon-taxon-constraints.owl: $(TMPDIR)/uberon-taxon-constraints.obo - $(OWLTOOLS) $< --expand-macros -o $@ +RPT_TAXA_ARGS = +RPT_STAGE_RELS = RO:0002496 RO:0002497 -# ---------------------------------------- -# SYNTACTIC CHECKS -# ---------------------------------------- +reports/%-part-of-parents.tsv: %.owl + $(OWLTOOLS) $< --reasoner elk --reasoner mexr --log-error --export-parents -p BFO:0000050 $(RPT_TAXA_ARGS) -o $@.tmp && mv $@.tmp $@ +.PRECIOUS: reports/%-part-of-parents.tsv -# mostly for checking OBO files -# the outputs of these targets are not consumed, used only for diagnostics +reports/%-has-part-parents.tsv: %.owl + $(OWLTOOLS) $< --reasoner elk --reasoner mexr --log-error --export-parents -p BFO:0000051 $(RPT_TAXA_ARGS) -o $@.tmp && mv $@.tmp $@ +.PRECIOUS: reports/%-has-part-parents.tsv -%.obo-allchecks: $(REPORTDIR)/%.obo-OWL-check $(REPORTDIR)/%.obo-gocheck $(REPORTDIR)/%.obo-iconv +reports/%-dev-parents.tsv: %.owl + $(OWLTOOLS) $< --reasoner elk --reasoner mexr --export-parents -p RO:0002202 RO:0002494 -o $@.tmp && mv $@.tmp $@ +.PRECIOUS: reports/%-dev-parents.tsv -# check OBO-Edit can parse the .obo output -# @Deprecated -#%.obo-OE-check: %.obo -# obo2obo -o $@ $< +reports/%-tax-parents.tsv: %.owl + $(OWLTOOLS) $< --reasoner elk --reasoner mexr --export-parents -p RO:0002162 -o $@.tmp && mv $@.tmp $@ +.PRECIOUS: reports/%-tax-parents.tsv -# check OWLAPI can parse the .obo output -$(REPORTDIR)/%.obo-OWL-check: %.obo - $(OWLTOOLS) $< +reports/%-stage-parents.tsv: %.owl + $(OWLTOOLS) $< --reasoner elk --reasoner mexr --log-error --export-parents -p $(RPT_STAGE_RELS) $(RPT_TAXA_ARGS) -o $@.tmp && mv $@.tmp $@ +.PRECIOUS: reports/%-stage-parents.tsv -# test any file for non UTF-8 characters -$(REPORTDIR)/%-iconv: % - iconv -f UTF-8 -t UTF-8 $< > $@ +reports/%-function-parents.tsv: %.owl + $(OWLTOOLS) $< --reasoner elk --reasoner mexr --export-parents -p RO:0002328 -o $@.tmp && mv $@.tmp $@ +.PRECIOUS: reports/%-function-parents.tsv -# run subset of syntax and structure checks used by GO -# (see .travis.yml for dependencies) +# Similar to %-stage-parent above, but limited to a view +reports/stages-%-report.tsv: subsets/%-view.owl + $(OWLTOOLS) $< --reasoner mexr --export-parents -p $(RPT_STAGE_RELS) -o $@.tmp && mv $@.tmp $@ -DISABLE= multiply-labeled-edge valid-id-space isa-incomplete ascii-check has-definition bad-pmid ontology-declaration-check referenced-id-syntax-check owl-axiom-check is-symmetric-check -$(REPORTDIR)/%.obo-gocheck: %.obo $(TMPDIR)/GO.xrf_abbs | $(SCRIPTSDIR)/check-obo-for-standard-release.pl - $(SCRIPTSDIR)/check-obo-for-standard-release.pl --xref-abbs $(TMPDIR)/GO.xrf_abbs $(patsubst %,--disable-%,$(DISABLE)) $< > $@.tmp && mv $@.tmp $@ +# Similar to %-part-of-parents above, but limited to a view +reports/part-%-report.tsv: subsets/%-view.owl + $(OWLTOOLS) $< --reasoner mexr --export-parents -p BFO:0000050 -o $@.tmp && mv $@.tmp $@ -$(TMPDIR)/GO.xrf_abbs: $(SRC) - wget http://geneontology.org/doc/GO.xrf_abbs -O $@ && touch $@ +# Generate the two reports above for a set of views # ---------------------------------------- -# Taxonomy and external AO validation -# ---------------------------------------- +RPT_SPECIES = human mouse xenopus metazoan -# first generate a merged ontology consisting of -# * core uberon -# * external-disjoints.owl -# * species anatomy bridge axioms -# This can be used to reveal both internal inconsistencies within uberon, and the improper linking of a species AO class to an uberon class with a taxon constraint -$(TMPDIR)/uberon-edit-plus-tax-equivs.owl: $(OWLSRC) $(TMPDIR)/external-disjoints.owl $(TMPDIR)/bridges $(CATALOG_DYNAMIC) - $(OWLTOOLS_CAT_DYNAMIC) $< $(TMPDIR)/external-disjoints.owl `ls $(BRIDGEDIR)/uberon-bridge-to-*.owl | grep -v emap.owl` --merge-support-ontologies -o -f ofn $@ -.PRECIOUS: $(TMPDIR)/uberon-edit-plus-tax-equivs.owl +reports/stages: $(patsubst %,reports/stages-%-report.tsv,$(RPT_SPECIES)) -# uberon bridges to mba and dmba are now manually curated and generated in https://github.com/obophenotype/ABA_Uberon/tree/new_bridge -# Note: the bridges are generated in new_bridge branch - this might change in the future, if it breaks here, please check ABA_Uberon repo to make sure that the new bridges are appropriately linked -# This will be replaced by a build function after migration from ABA_uberon repo, see: https://github.com/obophenotype/uberon/issues/2537 +reports/parts: $(patsubst %,reports/part-%-report.tsv,$(RPT_SPECIES)) -UBERON_BRIDGE_MBA = "https://raw.githubusercontent.com/obophenotype/ABA_Uberon/master/src/ontology/new-bridges/new-uberon-bridge-to-mba.owl" -$(BRIDGEDIR)/uberon-bridge-to-mba.owl: $(SRC) - if [ $(BRI) = true ]; then $(ROBOT) annotate -I $(UBERON_BRIDGE_MBA) --ontology-iri $(ONTBASE)/$@ -o $@; fi -$(BRIDGEDIR)/uberon-bridge-to-mba.obo: $(BRIDGEDIR)/uberon-bridge-to-mba.owl - if [ $(BRI) = true ]; then $(ROBOT) convert --input $(BRIDGEDIR)/uberon-bridge-to-mba.owl --output $@; fi -UBERON_BRIDGE_DMBA = "https://raw.githubusercontent.com/obophenotype/ABA_Uberon/master/src/ontology/new-bridges/new-uberon-bridge-to-dmba.owl" -$(BRIDGEDIR)/uberon-bridge-to-dmba.owl: $(SRC) - if [ $(BRI) = true ]; then $(ROBOT) annotate -I $(UBERON_BRIDGE_DMBA) --ontology-iri $(ONTBASE)/$@ -o $@; fi -$(BRIDGEDIR)/uberon-bridge-to-dmba.obo: $(BRIDGEDIR)/uberon-bridge-to-dmba.owl - if [ $(BRI) = true ]; then $(ROBOT) convert --input $(BRIDGEDIR)/uberon-bridge-to-dmba.owl --output $@; fi +# Various reports obtained by applying a SPARQL query +# ---------------------------------------- +reports/uberon-%.csv: uberon.owl ../sparql/%.sparql + $(ROBOT) query -i $< --query ../sparql/$*.sparql $@.tmp && $(SCRIPTSDIR)/curiefy-purls.pl $@.tmp > $@ && rm $@.tmp -# see above -$(REPORTDIR)/taxon-constraint-check.txt: $(TMPDIR)/uberon-edit-plus-tax-equivs.owl $(CATALOG_DYNAMIC) - $(OWLTOOLS_CAT_DYNAMIC) $< $(QELK) --run-reasoner -r elk -u > $@.tmp && mv $@.tmp $@ - #echo "STRONG WARNING: Skipped $@." - -# BRIDGE CHECKS. -# these can be used to validate on a per-bridge file basis. There are a variety of flavours: -# -# * quick bridge tests ignore the axioms in the external ontology (but include the bridge axioms themselves) -# * standard bridge tests use the logical axioms in the external ontology -# * full bridge tests do the above using the constructed ext ontology -# * extra full bridge tests also throw in the set of all pending disjoints. Only 'gold star' external ontologies will pass this. -# -# note at this time we don't expect all full-bridge tests to pass. This is because the disjointness axioms are -# very strong and even seemingly minor variations in representation across ontologies can lead to unsatisfiable classes -# -## CHECK_AO_LIST = ma emapa ehdaa2 zfa xao fbbt wbbt -## CHECK_AO_LIST = ma emapa zfa xao fbbt wbbt wbls -##### CHECK_AO_LIST = ma emapa zfa xao fbbt wbls : Add MA back to list when this is solved; https://sourceforge.net/p/obo/mouse-anatomy-requests/94/ - -# gold glub -EXTRA_FULL_CHECK_AO_LIST = caro +# Same, but for the (preprocessed) -edit file rather than the main product +reports/uberon-edit-%.csv: $(OWLSRC) ../sparql/%.sparql + $(ROBOT) query -i $< --query ../sparql/$*.sparql $@.tmp && $(SCRIPTSDIR)/curiefy-purls.pl $@.tmp > $@ && rm $@.tmp -# silver club -FULL_CHECK_AO_LIST = $(EXTRA_FULL_CHECK_AO_LIST) wbls wbbt +# Same as the first rule above, but IDs are not CURIEfied +reports/%.csv: ../sparql/%.sparql uberon.owl + $(ROBOT) merge -i $< query -s $< $@ -f csv -# premier execs -CHECK_AO_LIST = $(FULL_CHECK_AO_LIST) -# economy -QUICK_CHECK_AO_LIST = $(CHECK_AO_LIST) fbbt zfa xao fma ma emapa bfo +# OBO checks (checks that requires an input file in OBO format) +# ---------------------------------------- +%.obo-allchecks: $(REPORTDIR)/%.obo-OWL-check $(REPORTDIR)/%.obo-gocheck $(REPORTDIR)/%.obo-iconv -quick-bridge-checks: $(patsubst %,$(REPORTDIR)/quick-bridge-check-%.txt,$(FULL_CHECK_AO_LIST)) -bridge-checks: $(patsubst %,$(REPORTDIR)/bridge-check-%.txt,$(CHECK_AO_LIST)) -full-bridge-checks: $(patsubst %,$(REPORTDIR)/full-bridge-check-%.txt,$(CHECK_AO_LIST)) -extra-full-bridge-checks: $(patsubst %,$(REPORTDIR)/extra-full-bridge-check-%.txt,$(EXTRA_FULL_CHECK_AO_LIST)) +# Check that an OBO-formatted product can be parsed back by the OWL API +$(REPORTDIR)/%.obo-OWL-check: %.obo + $(ROBOT) merge -i $< -##$(REPORTDIR)/bfo-check.txt: $(TMPDIR)/uberon-edit-plus-tax-equivs.owl -# TODO @cmungall: worth fixing! -# TODO @matentzn: use ROBOT merge instead and dump debug modules.. -$(REPORTDIR)/bfo-check.txt: $(OWLSRC) mirror/ro.owl mirror/bfo.owl - $(ROBOT) merge -i $(OWLSRC) -I $(URIBASE)/bfo.owl -I $(URIBASE)/ro.owl -i $(BRIDGEDIR)/uberon-bridge-to-bfo.owl reason --reasoner ELK --equivalent-classes-allowed asserted-only +# Check for non UTF-8 characters +$(REPORTDIR)/%-iconv: % + iconv -f UTF-8 -t UTF-8 $< > $@ -bfo-basic-check.txt: basic.owl $(CATALOG_DYNAMIC) - $(OWLTOOLS_CAT_DYNAMIC) $(URIBASE)/bfo.owl $< $(BRIDGEDIR)/uberon-bridge-to-bfo.owl --merge-support-ontologies $(QELK) --run-reasoner -r elk -u > $@.tmp && mv $@.tmp $@ +# Run a subset of the syntax and structure checks used by GO +DISABLED_GO_CHECKS = multiply-labeled-edge \ + valid-id-space \ + isa-incomplete \ + ascii-check \ + has-definition \ + bad-pmid \ + ontology-declaration-check \ + referenced-id-syntax-check \ + owl-axiom-check \ + is-symmetric-check \ + xrf-abbs-check +$(REPORTDIR)/%.obo-gocheck: %.obo | $(SCRIPTSDIR)/check-obo-for-standard-release.pl + $(SCRIPTSDIR)/check-obo-for-standard-release.pl \ + $(patsubst %,--disable-%,$(DISABLED_GO_CHECKS)) $< > $@.tmp && mv $@.tmp $@ + +# Check for orphans +$(REPORTDIR)/%-orphans: %.obo + $(SCRIPTSDIR)/obo-grep.pl --neg -r "(is_a|intersection_of|is_obsolete):" $< | \ + $(SCRIPTSDIR)/obo-grep.pl -r Term - | \ + $(SCRIPTSDIR)/obo-grep.pl --neg -r "id: UBERON:(0001062|0000000)" - | \ + $(SCRIPTSDIR)/obo-grep.pl -r Term - > $@.tmp && \ + (egrep '^(id|name):' $@.tmp > $@ || echo ok) -# A quick bridge check uses only uberon plus taxon constraints plus bridging axioms, *not* the axioms in the source ontology itself -$(REPORTDIR)/quick-bridge-check-%.txt: $(TMPDIR)/uberon-edit-plus-tax-equivs.owl $(TMPDIR)/bridges $(TMPDIR)/external-disjoints.owl imports/local-%.owl $(CATALOG_DYNAMIC) - $(OWLTOOLS_CAT_DYNAMIC) $(URIBASE)/$*.owl $(BRIDGEDIR)/uberon-bridge-to-$*.owl --merge-support-ontologies $(QELK) --run-reasoner -r elk -u > $@.tmp && mv $@.tmp $@ +# Syntactick check on intersection_of definitions +$(REPORTDIR)/%-xp-check: %.obo + $(SCRIPTSDIR)/obo-check-xps.pl $< > $@ 2> $@.err || (echo "problems" && exit 1) -aaa: - make IMP=false PAT=false MIR=false $(REPORTDIR)/quick-bridge-check-caro.txt +# Check for use of obsoleted terms +$(REPORTDIR)/%-obscheck.txt: %.obo + (($(SCRIPTSDIR)/obo-map-ids.pl --ignore-self-refs --use-consider --use-replaced_by $< $<) > /dev/null) 2>&1 > $@ -# A bridge check uses uberon (no TCs) plus external ontology and the bridge -$(REPORTDIR)/bridge-check-%.owl: uberon.owl $(TMPDIR)/bridges $(TMPDIR)/external-disjoints.owl imports/local-%.owl $(CATALOG_DYNAMIC) - $(OWLTOOLS_CAT_DYNAMIC) $< imports/local-$*.owl $(BRIDGEDIR)/uberon-bridge-to-$*.owl $(TMPDIR)/external-disjoints.owl --merge-support-ontologies -o -f ofn $@ -.PRECIOUS: $(REPORTDIR)/bridge-check-%.owl -$(REPORTDIR)/bridge-check-%.txt: $(REPORTDIR)/bridge-check-%.owl $(CATALOG_DYNAMIC) - $(OWLTOOLS_CAT_DYNAMIC) $< $(QELK) --run-reasoner -r elk -u > $@.tmp && mv $@.tmp $@ +.PHONY: obocheck +obocheck: + fastobo-validator uberon-edit.obo -$(REPORTDIR)/expl-bridge-check-%.txt: $(REPORTDIR)/bridge-check-%.owl $(CATALOG_DYNAMIC) - $(OWLTOOLS_CAT_DYNAMIC) $< $(QELK) --run-reasoner -r elk -u -e > $@.tmp && mv $@.tmp $@ +.PHONY: test_obo_serialisation +test_obo_serialisation: + $(ROBOT) convert -i $(SRC) -f obo -o $(TMPDIR)/uberon_make_sure_serialisable_as_obo.obo -# A full bridge check uses ext plus external ontology and the bridge -$(REPORTDIR)/full-bridge-check-%.txt: ext.owl $(TMPDIR)/bridges $(TMPDIR)/external-disjoints.owl $(CATALOG_DYNAMIC) - $(OWLTOOLS_CAT_DYNAMIC) --no-debug $< $(URIBASE)/$*.owl $(BRIDGEDIR)/uberon-bridge-to-$*.owl $(TMPDIR)/external-disjoints.owl --merge-support-ontologies $(QELK) --run-reasoner -r elk -u -m $(REPORTDIR)/debug-full-bridge-check-$*.owl > $@.tmp && mv $@.tmp $@ +.PHONY: test_obsolete +test_obsolete: + ! grep "! obsolete" uberon-edit.obo -# TODO @cmungall says: worth fixing -$(REPORTDIR)/full-bridge-check-caro.txt: | $(CATALOG_DYNAMIC) - echo "STRONG WARNING $@ currently set to NOT FAIL because of unsatisfiable classes!" - $(OWLTOOLS_CAT_DYNAMIC) --no-debug $< $(URIBASE)/$*.owl $(BRIDGEDIR)/uberon-bridge-to-$*.owl $(TMPDIR)/external-disjoints.owl --merge-support-ontologies $(QELK) --run-reasoner -r elk -u -m $(REPORTDIR)/debug-full-bridge-check-$*.owl > $@ || true +.PHONY: test_owlaxioms +test_owlaxioms: + ! grep "owl-axioms: " uberon-edit.obo -# TODO @cmungall says: worth fixing -$(REPORTDIR)/full-bridge-check-wbls.txt: | $(CATALOG_DYNAMIC) - echo "STRONG WARNING $@ currently set to NOT FAIL because of unsatisfiable classes!" - $(OWLTOOLS_CAT_DYNAMIC) --no-debug $< $(URIBASE)/$*.owl $(BRIDGEDIR)/uberon-bridge-to-$*.owl $(TMPDIR)/external-disjoints.owl --merge-support-ontologies $(QELK) --run-reasoner -r elk -u -m $(REPORTDIR)/debug-full-bridge-check-$*.owl > $@ || true -# TODO @cmungall says: worth fixing -$(REPORTDIR)/full-bridge-check-wbbt.txt: | $(CATALOG_DYNAMIC) - echo "STRONG WARNING $@ currently set to NOT FAIL because of unsatisfiable classes!" - $(OWLTOOLS_CAT_DYNAMIC) --no-debug $< $(URIBASE)/$*.owl $(BRIDGEDIR)/uberon-bridge-to-$*.owl $(TMPDIR)/external-disjoints.owl --merge-support-ontologies $(QELK) --run-reasoner -r elk -u -m $(REPORTDIR)/debug-full-bridge-check-$*.owl > $@ || true +# Cycle detection checks +# ---------------------------------------- -# As above, but include pending disjoints. This is a very strict check and we don't expect this to pass for lots of ssAOs. -$(REPORTDIR)/extra-full-bridge-check-%.txt: ext.owl imports/local-%.owl $(BRIDGEDIR)/uberon-bridge-to-%.owl $(COMPONENTSDIR)/pending-disjoints.obo $(TMPDIR)/external-disjoints.owl $(CATALOG_DYNAMIC) - $(OWLTOOLS_CAT_DYNAMIC) --no-debug $^ --merge-support-ontologies $(QELK) --run-reasoner -r elk -u $(ROPTS) > $@.tmp && mv $@.tmp $@ +$(REPORTDIR)/%-cycles: %.obo + $(OWLTOOLS) --no-debug $< --list-cycles -f > $@ -# TODO @cmungall says: worth fixing -$(REPORTDIR)/extra-full-bridge-check-caro.txt: | $(CATALOG_DYNAMIC) - echo "STRONG WARNING $@ currently set to NOT FAIL because of unsatisfiable classes!" - $(OWLTOOLS_CAT_DYNAMIC) --no-debug $^ --merge-support-ontologies $(QELK) --run-reasoner -r elk -u $(ROPTS) > $@ || true +src-cycles: + $(OWLTOOLS) $(SRC) --list-cycles -f $(TMPDIR)/testcycles.tmp +$(REPORTDIR)/%-allcycles: %.owl + $(OWLTOOLS) --no-debug $< --list-cycles -f > $@ + +$(REPORTDIR)/basic-allcycles: basic.owl + $(OWLTOOLS) --no-debug $< --list-cycles -f > $@ + + +# Other checks +# ---------------------------------------- + +# List of terms cross-referenced to one of Uberon's "life cycle" terms $(REPORTDIR)/life-cycle-xrefs.txt: $(SPARQLDIR)/life-cycle-xrefs.sparql $(TMPDIR)/seed.obo $(ROBOT) reason -i $(TMPDIR)/seed.obo query --use-graphs true --query $< $@.tmp.tsv sed -e '/?xref/d' -e 's/"//g' <$@.tmp.tsv >$@ && rm $@.tmp.tsv -# @Deprecated -$(REPORTDIR)/core-bridge-check-%.txt: tmp/core.owl $(TMPDIR)/bridges $(TMPDIR)/external-disjoints.owl $(CATALOG_DYNAMIC) - $(OWLTOOLS_CAT_DYNAMIC) --no-debug $< $(URIBASE)/$*.owl $(BRIDGEDIR)/uberon-bridge-to-$*.owl $(TMPDIR)/external-disjoints.owl --merge-support-ontologies $(QELK) --run-reasoner -r elk -u > $@.tmp && mv $@.tmp $@ +# Disjoint violations +$(REPORTDIR)/%-dv.txt: %.owl + $(OWLTOOLS) --no-debug $< $(QELK) --run-reasoner -r elk -u > $@.tmp && grep UNSAT $@.tmp > $@ -# for debugging: -$(TMPDIR)/ext-merged-%.owl: ext.owl $(TMPDIR)/bridges $(TMPDIR)/external-disjoints.owl $(CATALOG_DYNAMIC) - $(OWLTOOLS_CAT_DYNAMIC) $< $(URIBASE)/$*.owl $(BRIDGEDIR)/uberon-bridge-to-$*.owl $(TMPDIR)/external-disjoints.owl --merge-imports-closure --merge-support-ontologies -o $@ -.PRECIOUS: $(TMPDIR)/ext-merged-%.owl -# check for dangling classes -# TODO: add to Oort +# ---------------------------------------- +# BRIDGE CHECKS +# ---------------------------------------- -merged.obo: tmp/merged.owl - $(ROBOT) convert -i $< --check false -o $@.tmp.obo && mv $@.tmp.obo $@ +# Overall "all-bridge" check +# ---------------------------------------- -$(REPORTDIR)/%-orphans: %.obo - $(SCRIPTSDIR)/obo-grep.pl --neg -r "(is_a|intersection_of|is_obsolete):" $< | $(SCRIPTSDIR)/obo-grep.pl -r Term - | $(SCRIPTSDIR)/obo-grep.pl --neg -r "id: UBERON:(0001062|0000000)" - | $(SCRIPTSDIR)/obo-grep.pl -r Term - > $@.tmp && (egrep '^(id|name):' $@.tmp > $@ || echo ok) +# The disjointness axioms are maintained in a OBO file, but the checks +# below use an OWL version. +$(TMPDIR)/external-disjoints.owl: components/external-disjoints.obo + $(ROBOT) convert -i $< -f owl -o $@ +.PRECIOUS: $(TMPDIR)/external-disjoints.owl +# We create a merged ontology consisting of +# (1) Uberon itself; +# (2) the external-disjoints component; +# (3) all the bridges to Uberon (except the EMAP bridge, which should +# probably be removed entirely from the repo anyway). +# This can be used to reveal both internal inconsistencies within +# Uberon, and the improper linking of a species AO class to an Uberon +# class with a taxon constraints. +ALL_UBERON_BRIDGES=$(shell ls $(BRIDGEDIR)/uberon-bridge-to-*.owl | grep -v emap.owl) +$(TMPDIR)/uberon-edit-plus-tax-equivs.owl: $(OWLSRC) $(TMPDIR)/external-disjoints.owl $(TMPDIR)/bridges + $(ROBOT) merge -i $< -i $(TMPDIR)/external-disjoints.owl \ + $(foreach bridge, $(ALL_UBERON_BRIDGES), -i $(bridge)) \ + convert -f ofn -o $@ +.PRECIOUS: $(TMPDIR)/uberon-edit-plus-tax-equivs.owl +$(REPORTDIR)/taxon-constraint-check.txt: $(TMPDIR)/uberon-edit-plus-tax-equivs.owl + $(ROBOT) reason -i $< -r ELK > $@ -# TODO: add to Oort -$(REPORTDIR)/%-xp-check: %.obo - $(SCRIPTSDIR)/obo-check-xps.pl $< > $@ 2> $@.err || (echo "problems" && exit 1) -# See: http://douroucouli.wordpress.com/2012/07/03/45/ -# Deleted sas per discussion with @cmungall -#depictions.omn: $(SRC) -# $(SCRIPTSDIR)/mk-image-ont.pl $< > $@ -#depictions.owl: depictions.omn -# owltools $< -o file://`pwd`/$@ - -QC_FILES = checks\ - $(TMPDIR)/bridges\ - quick-bridge-checks\ - bridge-checks\ - full-bridge-checks\ - extra-full-bridge-checks\ - $(REPORTDIR)/taxon-constraint-check.txt\ - $(REPORTDIR)/basic-allcycles\ - $(REPORTDIR)/basic-orphans\ - $(REPORTDIR)/merged-orphans\ - $(REPORTDIR)/ext-obscheck.txt\ - $(REPORTDIR)/uberon-dv.txt\ - $(REPORTDIR)/composite-metazoan-dv.txt\ - reports/stages - -test: $(REPORTDIR)/taxon-constraint-check.txt #$(REPORTDIR)/bridge-check-caro.txt - -uberon-qc: $(QC_FILES) - cat $(REPORTDIR)/merged-orphans $(REPORTDIR)/uberon-edit-obscheck.txt $(REPORTDIR)/uberon-edit-xp-check.err $(REPORTDIR)/uberon-orphans $(REPORTDIR)/uberon-synclash $(REPORTDIR)/uberon-dv.txt $(REPORTDIR)/composite-metazoan-dv.txt +# Individual bridge checks +# ---------------------------------------- -# Disjoint violations -$(REPORTDIR)/%-dv.txt: %.owl - $(OWLTOOLS) --no-debug $< $(QELK) --run-reasoner -r elk -u > $@.tmp && grep UNSAT $@.tmp > $@ +# There are three flavours of bridge checks (see below). Here we define +# whhich bridges are subjected to which checks. +EXTRA_FULL_CHECK_AO_LIST = caro +CHECK_AO_LIST = $(EXTRA_FULL_CHECK_AO_LIST) wbls wbbt +QUICK_CHECK_AO_LIST = $(CHECK_AO_LIST) fbbt zfa xao fma ma emapa bfo + +quick-bridge-checks: $(foreach ao, $(QUICK_CHECK_AO_LIST), $(REPORTDIR)/quick-bridge-check-$(ao).txt) +bridge-checks: $(foreach ao, $(CHECK_AO_LIST), $(REPORTDIR)/bridge-check-$(ao).txt) +extra-full-bridge-checks: $(foreach ao, $(EXTRA_FULL_CHECK_AO_LIST), $(REPORTDIR)/extra-full-bridge-check-$(ao).txt) + + +# A quick bridge check uses only uberon plus taxon constraints plus +# bridging axioms, *not* the axioms in the source ontology itself. +$(REPORTDIR)/quick-bridge-check-%.txt: uberon.owl $(TMPDIR)/external-disjoints.owl $(TMPDIR)/bridges + $(ROBOT) merge -i $< -i $(TMPDIR)/external-disjoints.owl \ + -i $(BRIDGEDIR)/uberon-bridge-to-$*.owl \ + reason -r ELK > $@ + + +# A (standard) bridge check uses uberon, the taxon constraints, the +# bridge itself, and the corresponding external ontology. +# For this check, we separate the production of the merged ontology +# from the production of the report. +# 1. The merge +$(REPORTDIR)/bridge-check-%.owl: uberon.owl $(TMPDIR)/external-disjoints.owl $(TMPDIR)/bridges $(IMPORTDIR)/local-%.owl + $(ROBOT) merge -i $< -i $(TMPDIR)/external-disjoints.owl \ + -i $(BRIDGEDIR)/uberon-bridge-to-$*.owl \ + -i $(IMPORTDIR)/local-$*.owl \ + convert -f ofn -o $@ +.PRECIOUS: $(REPORTDIR)/bridge-check-%.owl -# TODO - need closure for taxslim too -$(REPORTDIR)/%-obscheck.txt: %.obo - (($(SCRIPTSDIR)/obo-map-ids.pl --ignore-self-refs --use-consider --use-replaced_by $< $<) > /dev/null) 2>&1 > $@ +# 2. The reasoner's report (this is the actual check) +$(REPORTDIR)/bridge-check-%.txt: $(REPORTDIR)/bridge-check-%.owl + $(ROBOT) reason -i $< -r ELK > $@ + +# 3. The reasoner's explanations for any unsats +# (only generated on request, not part of the check) +$(REPORTDIR)/expl-bridge-check-%.txt: $(REPORTDIR)/bridge-check-%.owl + $(ROBOT) explain -i $< -M unsatisfiability -u all -r ELK -e $@ + + +# An extra-full bridge check is the same as a standard bridge check, but +# includes pending disjoints. This is a very strict check and we don't +# expect it to pass for lots of taxon-specific ontologies. +$(REPORTDIR)/extra-full-bridge-check-%.txt: $(REPORTDIR)/bridge-check-%.owl $(COMPONENTSDIR)/pending-disjoints.obo + $(ROBOT) merge $(foreach prereq, $^, -i $(prereq)) \ + reason -r ELK > $@ + + +# BFO bridge checks +# ---------------------------------------- +# BFO needs special treatment because we don't have a "local-bfo.owl" or +# a "local-ro.owl" mirror as we do for the taxons-specific ontologies; +# and since these checks are typically run with MIR=false, they would +# fail using the rules above because mirror/bfo.owl and mirror/ro.owl +# would be nowhere to be found. So here we load these external +# ontologies from their online locations. + +$(REPORTDIR)/bfo-check.txt: $(OWLSRC) $(BRIDGEDIR)/uberon-bridge-to-bfo.owl + $(ROBOT) merge -i $< -i $(BRIDGEDIR)/uberon-bridge-to-bfo.owl \ + -I $(URIBASE)/bfo.owl -I $(URIBASE)/ro.owl \ + reason -r ELK --equivalent-classes-allowed asserted-only > $@ + +# Similar to above, but with the basic product and without RO +$(REPORTDIR)/bfo-basic-check.txt: basic.owl $(BRIDGEDIR)/uberon-bridge-to-bfo.owl + $(ROBOT) merge -i $< -i $(BRIDGEDIR)/uberon-bridge-to-bfo.owl \ + -I $(URIBASE)/bfo.owl \ + reason -r ELK > $@ # ---------------------------------------- -# SUBSETS +# SUBSETS & VIEWS # ---------------------------------------- -# System-specific subsets -#PA = phenoscape-vocab/phenoscape-anatomy.obo +# Create a seed from the standard (ODK-generated) Uberon seed to which +# we add CL terms. This seed is used by several subsets below. +tmp/simple-slim-seed.txt: $(SRCMERGED) $(SIMPLESEED) + $(ROBOT) query -f csv -i $< --query ../sparql/cl_terms.sparql $@.tmp && \ + cat $@.tmp $(SIMPLESEED) | sort | uniq > $@ + + +# System-specific subsets +# ---------------------------------------- TERM_nephron := UBERON:0001285 TERM_musculoskeletal := UBERON:0002204 @@ -930,24 +750,16 @@ TERM_renal := UBERON:0001008 TERM_appendicular := UBERON:0002091 TERM_life_cycle_stage := UBERON:0000105 -#SYSTEMS = musculoskeletal excretory nephron reproductive digestive nervous sensory immune circulatory pulmonary cranial renal appendicular - -#all_subsets: all_systems subsets/life-stages-composite.obo subsets/life-stages-core.obo subsets/life-stages-core.owl -#all_systems: all_systems_obo all_systems_owl all_systems_json all_systems_tsv -#all_systems_obo: $(patsubst %,subsets/%-minimal.obo,$(SYSTEMS)) -#all_systems_owl: $(patsubst %,subsets/%-minimal.owl,$(SYSTEMS)) -#all_systems_tsv: $(patsubst %,subsets/%-minimal.tsv,$(SYSTEMS)) -#all_systems_json: $(patsubst %,subsets/%-minimal.json,$(SYSTEMS)) - +# Subset generation command +SUBSETCMD=$(OWLTOOLS) $< --reasoner-query -r elk -d "$(PART_OF) some $(TERM_ID)" --reasoner-query $(TERM_ID) --make-ontology-from-results $(URIBASE)/uberon/$@ -o $@ 2>&1 > $@.LOG -subsets/merged-partonomy.owl: tmp/merged.owl +# Source file for all the subsets generated below +subsets/merged-partonomy.owl: uberon.owl $(ROBOT) remove --input $< --axioms "equivalent disjoint type abox" \ - remove --exclude-term BFO:0000050 --select "object-properties" \ - -o $@ + remove --exclude-term BFO:0000050 --select "object-properties" \ + -o $@ .PRECIOUS: subsets/merged-partonomy.owl -SUBSETCMD=$(OWLTOOLS) $< --reasoner-query -r elk -d "$(PART_OF) some $(TERM_ID)" --reasoner-query $(TERM_ID) --make-ontology-from-results $(URIBASE)/uberon/$@ -o $@ 2>&1 > $@.LOG - subsets/appendicular-minimal.owl: subsets/merged-partonomy.owl $(eval TERM_ID := $(TERM_appendicular)) $(SUBSETCMD) @@ -1004,784 +816,470 @@ subsets/life-stages-minimal.owl: subsets/merged-partonomy.owl $(eval TERM_ID := $(TERM_life_cycle_stage)) $(SUBSETCMD) -#subsets/%-minimal.owl: subsets/merged-partonomy.owl -# $(eval TERM_ID := $(TERM_$*)) -# owltools $< --reasoner-query -r elk -d "$(PART_OF) some $(TERM_ID)" --reasoner-query $(TERM_ID) --make-ontology-from-results $(URIBASE)/uberon/$@ -o $@ 2>&1 > $@.LOG -#.PRECIOUS: subsets/%-minimal.owl - -#subsets/%-minimal.obo: subsets/%-minimal.owl -# $(ROBOT) convert -i $< --check false -o $@.tmp.obo && mv $@.tmp.obo $@ -#subsets/%-minimal.json: subsets/%-minimal.owl -# $(ROBOT) convert -i $< --check false -o $@.tmp.json && mv $@.tmp.json $@ -#subsets/%-minimal.tsv: subsets/%-minimal.owl -# $(ROBOT) export -i $< -c "ID|label|SYNONYMS" -e $@.tmp && mv $@.tmp $@ - # TODO: need to add subclass axioms for all intersections -subsets/musculoskeletal-full.obo: tmp/merged.owl - $(OWLTOOLS) $< --reasoner-query -r elk -d -c $(URIBASE)/uberon/$@ "$(PART_OF) some UBERON_0002204" -o -f obo file://`pwd`/$@ --reasoner-dispose +subsets/musculoskeletal-full.obo: uberon.owl + $(OWLTOOLS) $< --reasoner-query -r elk -d -c $(URIBASE)/uberon/$@ \ + "$(PART_OF) some UBERON_0002204" \ + -o -f obo file://`pwd`/$@ --reasoner-dispose subsets/vertebrate-head.obo: composite-vertebrate.owl - $(OWLTOOLS) $< --reasoner-query -r elk -d "$(PART_OF) some UBERON_0000033" --make-ontology-from-results $(URIBASE)/uberon/$@ -o -f obo --no-check $@ --reasoner-dispose 2>&1 > $@.LOG - -# TODO - switch to purls for OWL once released -subsets/subsets/life-stages-mammal.owl: subsets/life-stages-core.owl $(TMPDIR)/developmental-stage-ontologies/src/mmusdv/mmusdv.obo $(TMPDIR)/developmental-stage-ontologies/src/hsapdv/hsapdv.obo - $(OWLTOOLS) $< $(TMPDIR)/developmental-stage-ontologies/src/mmusdv/mmusdv.obo $(TMPDIR)/developmental-stage-ontologies/src/hsapdv/hsapdv.obo --merge-support-ontologies -o file://`pwd`/$@ - -#subsets/life-stages.obo: uberon.owl -#subsets/life-stages.obo: composite-metazoan.obo -subsets/life-stages-composite.owl: composite-metazoan.owl - $(ROBOT) query --input $< --update $(SPARQLDIR)/inject-life-stages-subset.ru --update $(SPARQLDIR)/inject-subset-declaration.ru --output $@.tmp.owl && mv $@.tmp.owl $@ &&\ - $(OWLTOOLS) $@ --extract-ontology-subset --fill-gaps --subset life_stage -o $@.tmp.owl && mv $@.tmp.owl $@ &&\ - $(ROBOT) annotate --input $@ --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) -o $@.tmp.owl && mv $@.tmp.owl $@ - -subsets/life-stages-core.obo: uberon.owl - $(OWLTOOLS) $< --reasoner-query -r elk -l 'life cycle stage' --make-ontology-from-results $(URIBASE)/uberon/$@ --add-ontology-annotation $(DC)/description "Life cycle stage subset of uberon core (generic stages only)" -o -f obo $@ --reasoner-dispose 2>&1 > $@.LOG -subsets/life-stages-core.owl: uberon.owl - $(OWLTOOLS) $< --reasoner-query -r elk -l 'life cycle stage' --make-ontology-from-results $(URIBASE)/uberon/$@ --add-ontology-annotation $(DC)/description "Life cycle stage subset of uberon core (generic stages only)" -o file://`pwd`/$@ --reasoner-dispose 2>&1 > $@.LOG - -subsets/immaterial.obo: tmp/merged.owl - $(OWLTOOLS) $< --reasoner-query -r elk -d UBERON_0000466 --make-ontology-from-results $(URIBASE)/uberon/$@ -o -f obo $@ --reasoner-dispose 2>&1 > $@.LOG - -# -#subsets/%.owl: subsets/%.obo -# owltools $< -o $@.tmp && mv $@.tmp $@ - - -# ---------------------------------------- -# HISTORIC/LEGACY, NEEDS PRESERVED -# ---------------------------------------- - -# get rid of non subclass xrefs -%-xf.obo: %.obo - egrep -v '^xref: (OpenCyc|http)' $< > $@ - -# used for (obsolete) disjointness checks - -# historic -#%-with-isa.obo: %-xf.obo -# blip -i $*.obo -u ontol_manifest_has_subclass_from_xref io-convert -to obo -o $@ -#.PRECIOUS: %-with-isa.obo - -# for now we use a simplified set of relations, as this is geared towards analysis -#subsets/uberon-with-isa-for-%.obo: uberon.obo -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip-ddb -i $< -u ontol_manifest_has_subclass_from_selected_xref -u ontol_management -goal "set_selected_idspaces('$*'),retractall(ontol_db:disjoint_from(_,_)),delete_relation_usage_except([develops_from,part_of,continuous_with,capable_of])" io-convert -to obo -o $@ -#.PRECIOUS: %-with-isa.obo - -#uberon-isa-to-%.obo: uberon.obo -# $(SCRIPTSDIR)/obo-grep.pl -r '^id: $*' $< > $@ - - -# @Dep -#other-bridges: tmp/merged.owl -# owltools $< --extract-bridge-ontologies -d tmp -s uberon -x -o -f obo $(TMPDIR)/minimal.obo - -# ---------------------------------------- -# CL (to be replaced) -# ---------------------------------------- - -# core: the full ontology, excluding external classes, but including references to these -# TODO: use --make-subset-by-properties -# note: requires symlink to cl directory -$(TMPDIR)/cl-core.obo: $(SRC) - $(OWLTOOLS) $(URIBASE)/cl.owl --make-subset-by-properties -n BFO:0000050 BFO:0000051 RO:0002202 RO:0002215 --remove-external-classes -k CL --remove-dangling --remove-axiom-annotations --remove-imports-declarations -o -f obo --no-check $@ -#$(TMPDIR)/cl-core.obo: cell-ontology/cl.obo -# $(SCRIPTSDIR)/obo-grep.pl -r 'id: CL:' $< | grep -v ^intersection_of | grep -v ^disjoint | grep -v ^equivalent | grep -v ^owl-axioms | (obo-filter-relationships.pl -t part_of -t capable_of -t develops_from - && cat develops_from.obo part_of.obo has_part.obo capable_of.obo) > $@ - -# TODO - this may replace the above BUT need to preserve dangling axioms -cl-core-new.obo: cell-ontology/cl.obo - $(OWLTOOLS) $< --make-subset-by-properties BFO:0000050 RO:0002202 RO:0002215 // --remove-axioms -t DisjointClasses -o -f obo $@ - -# this is required for bridging axioms; ZFA inverts the usual directionality -# TODO review directionality!!! -$(TMPDIR)/cl-zfa-xrefs.obo: mirror/zfa.owl - if [ $(MIR) = true ] && [ $(IMP) = true ]; then $(ROBOT) query -i $< --query ../sparql/zfa-xrefs-to-cl.sparql $@_xrefs_to_zfa.tsv &&\ - cat $@_xrefs_to_zfa.tsv | tail -n +2 | $(SCRIPTSDIR)/tbl2obolinks.pl --rel xref - > $@.tmp && mv $@.tmp $@; fi - - - #blip-findall -r ZFA "entity_xref(Z,C),id_idspace(C,'CL')" -select C-Z -use_tabs -no_pred | $(SCRIPTSDIR)/tbl2obolinks.pl --rel xref > $@ - -#cl-core.owl: $(TMPDIR)/cl-core.obo -# $(MAKEOBO) -# #obolib-obo2owl --allow-dangling $< -o $@ - -# ---------------------------------------- -# OBO-BASIC CHECKS -# ---------------------------------------- - -# NOTE: we should be able to replace these with oort now -# TODO @matentzn remove cycle. We need to check basic for cycles ideally in basic file. High priority. Maybe ontobio. -$(REPORTDIR)/%-cycles: %.obo - $(OWLTOOLS) --no-debug $< --list-cycles -f > $@ - #blip-findall -i $< "subclass_cycle/2" -label > $@ - -src-cycles: - $(OWLTOOLS) $(SRC) --list-cycles -f $(TMPDIR)/testcyles.tmp - -$(REPORTDIR)/%-allcycles: %.owl - $(OWLTOOLS) --no-debug $< --list-cycles -f > $@ - -# TODO @matentzn make ticket with report -$(REPORTDIR)/basic-allcycles: basic.owl - $(OWLTOOLS) --no-debug $< --list-cycles -f > $@ - -test: $(REPORTDIR)/basic-allcycles - -#%-synclash: %.obo -# blip-findall -u query_obo -i $< "same_label_as(X,Y,A,B,C),X@ $@ -# TODO @matentzn - like mondo, make sure that there are no label/exact syn clashes, use ROBOT -$(REPORTDIR)/%-synclash: %.obo - echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ - #blip-findall -u query_obo -i $< "same_label_as(X,Y,A,B,C),X@ $@ - -# ---------------------------------------- -# COMPOSITE STAGES -# ---------------------------------------- - -$(TMPDIR)/update-stages: $(SRC) | $(TMPDIR) - rm -rf $(TMPDIR)/developmental-stage-ontologies && \ - cd $(TMPDIR) && \ - git clone https://github.com/obophenotype/developmental-stage-ontologies.git - -CSTAGES := $(filter-out %bridge-to-uberon.obo, $(wildcard $(TMPDIR)/developmental-stage-ontologies/*/*-uberon.obo)) -#CSTAGES := $(wildcard $(TMPDIR)/developmental-stage-ontologies/*/*-uberon.obo) + $(OWLTOOLS) $< --reasoner-query -r elk -d "$(PART_OF) some UBERON_0000033" \ + --make-ontology-from-results $(URIBASE)/uberon/$@ \ + -o -f obo --no-check $@ --reasoner-dispose 2>&1 > $@.LOG -#merged-stages.obo: $(OWLSRC) -# owltools $(filter-out %-uberon.obo, $(wildcard $(TMPDIR)/developmental-stage-ontologies/*/*.obo)) -o -f obo $@ - -# "entity_xref_idspace(X,U,'UBERON')" -no_pred -label -select U-X -# this is a basic xref query, all xrefs TO an uberon ID. The TSV output is col1:UberonID col2:speciesSpecificStageTermID -$(TMPDIR)/developmental-stage-ontologies/src/ssso-merged.obo: $(TMPDIR)/update-stages - test -f $@ - -$(TMPDIR)/merged-stages-xrefs.obo: $(TMPDIR)/developmental-stage-ontologies/src/ssso-merged.obo - $(ROBOT) query -i $(TMPDIR)/developmental-stage-ontologies/src/ssso-merged.obo --query ../sparql/xrefs-to-uberon.sparql $@_xrefs_to_uberon.tsv - cat $@_xrefs_to_uberon.tsv | tail -n +2 | $(SCRIPTSDIR)/tbl2obolinks.pl -k --rel xref - > $@.tmp && mv $@.tmp $@ -$(TMPDIR)/composite-stages.obo: $(TMPDIR)/merged-stages-xrefs.obo $(TMPDIR)/update-stages - $(OWLTOOLS_NO_CAT) $(CSTAGES) $(TMPDIR)/merged-stages-xrefs.obo --merge-support-ontologies -o -f obo --no-check $@ - -# ---------------------------------------- -# COMPOSITE ANATOMY: PREPROCESSING -# ---------------------------------------- - -composites: composite-metazoan.obo composite-vertebrate.obo - - - -# ---------------------------------------- -# COMPOSITE ANATOMY: BUILDING +# Life stages subsets # ---------------------------------------- -#.PHONY: dependencies -#dependencies: -# apt-get install -y libjson-perl - -# many external ontologies do not adhere to all uberon constraints -$(TMPDIR)/ext-weak.owl: ext.owl | $(TMPDIR) - $(OWLTOOLS) $< --merge-imports-closure --remove-axioms -t DisjointClasses --remove-equivalent-to-nothing-axioms -o $@ - -MBASE = $(TMPDIR)/ext-weak.owl $(TMPDIR)/bridges imports/local-ma.owl imports/local-ehdaa2.owl imports/local-emapa.owl imports/local-xao.owl \ - imports/local-zfa.owl imports/local-fbbt.owl imports/local-fbdv.owl \ - imports/local-wbbt.owl imports/local-wbls.owl imports/local-ceph.owl \ - imports/local-cteno.owl imports/local-poro.owl $(TMPDIR)/allen-mba.obo $(TMPDIR)/allen-pba.obo $(TMPDIR)/allen-hba.obo \ - $(TMPDIR)/allen-dmba.obo $(TMPDIR)/allen-dhba.obo uberon.owl - -# A subset of OPs will be turned into taxon GCIs - -MERGESPECIES =\ - --merge-species-ontology -s 'mouse' -t NCBITaxon:10090 -q $(TAXON_GCI_RELS) \ - --merge-species-ontology -s 'human' -t NCBITaxon:9606 -q $(TAXON_GCI_RELS) \ - --merge-species-ontology -s 'primate' -t NCBITaxon:9443 \ - --merge-species-ontology -s 'Xenopus' -t NCBITaxon:8353 \ - --merge-species-ontology -s 'Danio' -t NCBITaxon:7954 \ - --merge-species-ontology -s 'Drosophila' -t NCBITaxon:7227 \ - --merge-species-ontology -s 'C elegans' -t NCBITaxon:6237 \ - -MERGE_EQSETS = --merge-equivalence-sets -s UBERON 10 -s CL 9 -s CARO 5 -l UBERON 10 -l CL 9 -d UBERON 10 -d CL 9 - -MAKESPMERGE= --catalog-xml $(CATALOG)\ - --map-ontology-iri $(URIBASE)/uberon.owl $(TMPDIR)/ext-weak.owl\ - --map-ontology-iri $(URIBASE)/fma.owl $(COMPONENTSDIR)/null.owl\ - --map-ontology-iri $(URIBASE)/uberon/bridge/uberon-bridge-to-fma.owl $(COMPONENTSDIR)/null.owl\ - $(URIBASE)/uberon/$(BRIDGEDIR)/collected-$*.owl - -# --merge-imports-closure - -# bundled: collect all ontologies and do a basic (non-species) import closure merge -# primarily for testing: not released -bundled-%.owl: $(MBASE) - $(OWLTOOLS) $(MAKESPMERGE) --merge-import-closure -o -f ofn $@ -.PRECIOUS: $(TMPDIR)/unreasoned-composite-%.owl - -# stage1 of composite build: do a species merge, but no additional reasoning -#$(TMPDIR)/unreasoned-composite-%.owl: $(MBASE) -# OWLTOOLS_MEMORY=12G owltools $(MAKESPMERGE) --merge-import-closure --reasoner elk $(MERGESPECIES) $(MERGE_EQSETS) -o -f ofn $@ -#.PRECIOUS: $(TMPDIR)/unreasoned-composite-%.owl - -$(TMPDIR)/merged-composite-%.owl: $(MBASE) - $(OWLTOOLS) $(MAKESPMERGE) --merge-import-closure -o -f ofn $@ -.PRECIOUS: $(TMPDIR)/merged-composite-%.owl - -# This step removes the logical axioms of a -# handful of around 5 classes which are unsatisfiable from SSAOs. -$(TMPDIR)/stripped-composite-%.owl: $(TMPDIR)/merged-composite-%.owl - $(ROBOT) remove -i $< -T unsats.txt --axioms logical -o $@ - -$(TMPDIR)/unreasoned-composite-%.owl: $(TMPDIR)/stripped-composite-%.owl - $(OWLTOOLS) $< --reasoner elk $(MERGESPECIES) $(MERGE_EQSETS) -o -f ofn $@ -.PRECIOUS: $(TMPDIR)/unreasoned-composite-%.owl - -#explain: -# $(ROBOT) explain -i $(TMPDIR)/unreasoned-composite-metazoan.owl --reasoner ELK -M unsatisfiability --unsatisfiable all --explanation unsat_all_explanation.md - - -# stage 2 (final) of composite build: reason -composite-%.owl: $(TMPDIR)/unreasoned-composite-%.owl - $(ROBOT) reason -r ELK -i $< --equivalent-classes-allowed all relax reduce -r ELK annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) -o $@.tmp.owl && mv $@.tmp.owl $@ -.PRECIOUS: composite-%.owl - -# composute obo is made from owl -composite-%.obo: composite-%.owl - $(OWLTOOLS) $< --add-obo-shorthand-to-properties --set-ontology-id -v $(RELEASE)/$@ $(ONTBASE)/$@ -o -f obo --no-check $@.tmp && grep -v ^owl-axioms: $@.tmp > $@ - -## **Hacking_Feb_2022** This still needs fixing. Needed by Begee: # Used directly by Bgee, see https://github.com/obophenotype/uberon/issues/1501 -## This makes a composite of Uberon + various subontologies but does so in a clever way that avoids building a lattic-ey ontology. -### **Hacking_Feb_2022** TODO: the details of this need to be documented (in an earlier step - OWLtools does the important work - building unreasoned-composite-%.owl & upstream. -composite-metazoan.owl: $(TMPDIR)/unreasoned-composite-metazoan.owl - $(ROBOT) reason -r ELK -i $< --equivalent-classes-allowed all relax reduce -r ELK annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) -o $@.tmp.owl && mv $@.tmp.owl $@ -.PRECIOUS: composite-%.owl - -## **Hacking_Feb_2022** TODO Ditch this goal. No longer needed by BeGee -composite-vertebrate.owl: $(TMPDIR)/unreasoned-composite-vertebrate.owl - $(ROBOT) reason -r ELK -i $< --equivalent-classes-allowed all relax reduce -r ELK annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) -o $@.tmp.owl && mv $@.tmp.owl $@ -.PRECIOUS: composite-vertebrate.owl - -composite-metazoan-last-release.owl: - wget http://svn.code.sf.net/p/obo/svn/uberon/releases/2020-09-16/composite-metazoan.owl -O $@ - -reports/release-diff-composite.txt: composite-metazoan-last-release.owl composite-metazoan.owl - $(ROBOT) diff --left composite-metazoan-last-release.owl --right composite-metazoan.owl -o $@ - -.PHONY: composite-diff -composite-diff: reports/release-diff-composite.txt - -composite-metazoan-basic.owl: composite-metazoan.owl - $(OWLTOOLS) $< --extract-mingraph --remove-axiom-annotations --make-subset-by-properties -f $(BASICRELS) --set-ontology-id $(URIBASE)/uberon/composite-metazoan-basic.owl -o -f obo --no-check $@.tmp && mv $@.tmp $@.tmp2 && grep -v '^owl-axioms:' $@.tmp2 > $@ &&\ - $(ROBOT) annotate -i $@ --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) convert --check false -f owl -o $@.tmp.owl && mv $@.tmp.owl $@ - -composite-vertebrate-basic.owl: composite-vertebrate.owl - $(OWLTOOLS) $< --extract-mingraph --remove-axiom-annotations --make-subset-by-properties -f $(BASICRELS) --set-ontology-id $(URIBASE)/uberon/composite-metazoan-basic.owl -o -f obo --no-check $@.tmp && mv $@.tmp $@.tmp2 && grep -v '^owl-axioms:' $@.tmp2 > $@ &&\ - $(ROBOT) annotate -i $@ --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) convert --check false -f owl -o $@.tmp.owl && mv $@.tmp.owl $@ - -# ---------------------------------------- -# TAXON MODULES -# ---------------------------------------- - -all_taxmods: $(TAXMODSDIR)/uberon-taxmod-amniote.obo $(TAXMODSDIR)/uberon-taxmod-euarchontoglires.obo -#all_taxmods: uberon-taxmod-amniote.obo uberon-taxmod-aves.obo uberon-taxmod-euarchontoglires.obo - -# ELK DOES NOT COMPLETE -#uberon-taxmod-aves.owl: uberon-taxmod-8782.owl -# cp $< $@ - -$(TAXMODSDIR)/uberon-taxmod-euarchontoglires.owl: $(TMPDIR)/uberon-taxmod-314146.owl - cp $< $@ -$(TAXMODSDIR)/uberon-taxmod-amniote.owl: $(TMPDIR)/uberon-taxmod-32524.owl - cp $< $@ -$(TAXMODSDIR)/uberon-taxmod-human.owl: $(TMPDIR)/uberon-taxmod-9606.owl - cp $< $@ - -#$(TAXMODSDIR)/uberon-taxmod-annelid.owl: $(TMPDIR)/uberon-taxmod-6340.owl -# cp $< $@ - -subsets/%-basic.owl: $(TAXMODSDIR)/uberon-taxmod-%.owl tmp/simple-slim-seed.txt - $(ROBOT) reason --input $< --reasoner ELK --equivalent-classes-allowed all --exclude-tautologies structural \ - relax \ - remove --axioms equivalent \ - relax \ - filter --term-file tmp/simple-slim-seed.txt --select "annotations ontology anonymous self" --trim true --signature true \ - reduce -r ELK \ - query --update ../sparql/inject-subset-declaration.ru \ - annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ - convert -f ofn -o $@.tmp.owl && mv $@.tmp.owl $@ -.PRECIOUS: subsets/%-basic.owl - -$(TAXMODSDIR)/uberon-taxmod-%.obo: $(TAXMODSDIR)/uberon-taxmod-%.owl - $(OWLTOOLS) $< --remove-imports-declarations -o -f obo --no-check $@.tmp && grep -v ^owl $@.tmp > $@ - -# added --allowEquivalencies, see https://github.com/geneontology/go-ontology/issues/12926 -$(TMPDIR)/uberon-taxmod-%.owl: ext.owl - $(OWLTOOLS) $< --reasoner elk --make-species-subset --perform-macro-expansion false -t NCBITaxon:$* --assert-inferred-subclass-axioms --allowEquivalencies --useIsInferred --remove-dangling --set-ontology-id $(URIBASE)/uberon/subsets/$@ -o $@ 2>&1 > $@.log -#uberon-taxmod-%.owl: uberon-taxmod-%.ids -# blip-ddb -u ontol_db -r uberonp -format "tbl(ids)" -i $< -goal "forall((class(C),\+ids(C)),delete_class(C)),remove_dangling_facts" io-convert -to obo > $@ -# blip ontol-query -r uberonp -format "tbl(ids)" -i $< -to obo -query "ids(ID)" > $@.tmp && grep -v ^disjoint_from $@.tmp | grep -v 'relationship: spatially_disjoint' > $@ -.PRECIOUS: $(TMPDIR)/uberon-taxmod-%.owl - - -#taxtable.txt: $(SRC) -# owltools $< --make-class-taxon-matrix --query-taxa external/ncbitaxon-subsets/taxslim.obo -o z NCBITaxon:9606 NCBITaxon:7955 - - - -# ---------------------------------------- -# BRIDGES -# ---------------------------------------- - -# Download the FBbt mapping file -.PHONY: $(TMPDIR)/fbbt-mappings.sssom.tsv -$(TMPDIR)/fbbt-mappings.sssom.tsv: - if [ $(IMP) = true ]; then wget -O $@ http://purl.obolibrary.org/obo/fbbt/fbbt-mappings.sssom.tsv ; fi - -# Attempt to update the canonical FBbt mapping file from a freshly downloaded one -# (no update if the downloaded file is absent or identical to the one we already have) -mappings/fbbt-mappings.sssom.tsv: $(TMPDIR)/fbbt-mappings.sssom.tsv - if [ -f $< ]; then if ! cmp $< $@ ; then cat $< > $@ ; fi ; fi - -# Generate cross-references from the FBbt mapping file -$(COMPONENTSDIR)/mappings.owl: mappings/fbbt-mappings.sssom.tsv ../scripts/sssom2xrefs.awk - awk -f ../scripts/sssom2xrefs.awk $< > $@ - -# seed.owl is never released - it is used to seed module extraction -$(TMPDIR)/seed.owl: $(OWLSRC) $(TMPDIR)/cl-core.obo # $(COMPONENTSDIR)/phenoscape-ext.owl - $(OWLTOOLS) $(OWLSRC) $(TMPDIR)/cl-core.obo --merge-support-ontologies -o -f functional $@ - -# this is used for xrefs for bridge files -# The mappings component is forcefully merged, because the -# make-bridge-ontologies-from-xrefs.pl script, which will make use -# of the generated seed.obo file, has no understanding of imports. -$(TMPDIR)/seed.obo: $(SRC) - $(OWLTOOLS) $< \ - --merge-import http://purl.obolibrary.org/obo/uberon/components/mappings.owl \ - -o -f obo --no-check $@.tmp && \ - $(SCRIPTSDIR)/obo-grep.pl --neg -r is_obsolete $@.tmp > $@ - -#BRIDGESRC_OBO = $(SRC) $(TMPDIR)/cl-with-xrefs.obo -$(BRIDGEDIR)/uberon-bridge-to-nifstd.obo: $(SRC) - $(SCRIPTSDIR)/xref-to-equiv.pl uberon/$(BRIDGEDIR)/uberon-bridge-to-nifstd http://uri.neuinfo.org/nif/nifstd/ $< > $@.tmp && mv $@.tmp $@ -$(BRIDGEDIR)/%.owl: $(BRIDGEDIR)/%.obo - $(OWLTOOLS) $< --remove-annotation-assertions -o $@ - -make-bridge-ontologies-from-xrefs.pl: - cp $(SCRIPTSDIR)/make-bridge-ontologies-from-xrefs.pl $@ - -CUSTOM_BRIDGES = $(BRIDGEDIR)/uberon-bridge-to-mba.owl $(BRIDGEDIR)/uberon-bridge-to-dmba.owl $(BRIDGEDIR)/uberon-bridge-to-mba.obo $(BRIDGEDIR)/uberon-bridge-to-dmba.obo - -$(TMPDIR)/bridges: $(TMPDIR)/seed.obo $(TMPDIR)/cl-with-xrefs.obo $(TMPDIR)/cl-zfa-xrefs.obo $(BRIDGEDIR)/uberon-bridge-to-nifstd.owl make-bridge-ontologies-from-xrefs.pl $(REPORTDIR)/life-cycle-xrefs.txt $(CUSTOM_BRIDGES) - if [ $(BRI) = true ]; then cd $(BRIDGEDIR) && perl ../make-bridge-ontologies-from-xrefs.pl -l ../$(REPORTDIR)/life-cycle-xrefs.txt ../$(TMPDIR)/seed.obo && perl ../make-bridge-ontologies-from-xrefs.pl -l ../$(REPORTDIR)/life-cycle-xrefs.txt -b cl ../$(TMPDIR)/cl-with-xrefs.obo ../$(TMPDIR)/cl-zfa-xrefs.obo && cd .. && touch $@; fi - -$(TMPDIR)/cl-with-xrefs.obo: $(TMPDIR)/cl-core.obo $(SCRIPTSDIR)/expand-idspaces.pl - if [ $(BRI) = true ]; then egrep '^(idspace|treat-)' $(SRC) > $@.tmp && cat $< >> $@.tmp && $(SCRIPTSDIR)/expand-idspaces.pl $@.tmp > $@; fi - -# TODO @cmungall EMAP is dead, we can get rid of that. Rip out EMAP xrefs? -# TODO check not imported in collected (@matentzn) -$(BRIDGEDIR)/uberon-bridge-to-emap.obo: mapping_EMAP_to_EMAPA.txt $(TMPDIR)/update-stages - echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ - #blip ontol-query -r emapa -r emap -consult util/emap_to_cdef.pro -i $< -i uberon.obo -i $(TMPDIR)/developmental-stage-ontologies/src/mmusdv/mmusdv.obo -query "mapping_EMAP_to_EMAPA(ID,_,_)" -to obo | perl -npe 's/OBO_REL://' > $@.tmp && $(SCRIPTSDIR)/emap-to-cdef-add-hdr.pl $@.tmp > $@ -.PRECIOUS: $(BRIDGEDIR)/uberon-bridge-to-emap.obo -$(BRIDGEDIR)/uberon-bridge-to-emap.owl: $(BRIDGEDIR)/uberon-bridge-to-emap.obo - $(MAKEOBO) - -$(BRIDGEDIR)/uberon-ext-bridge-to-zfa.obo: $(BRIDGEDIR)/ext-xref.obo make-bridge-ontologies-from-xrefs.pl $(REPORTDIR)/life-cycle-xrefs.txt - cd bridge && ../make-bridge-ontologies-from-xrefs.pl -l ../$(REPORTDIR)/life-cycle-xrefs.txt -b uberon-ext ext-xref.obo - -# see #157 -# TODO @matentzn dont spend much time but perhaps make ticket -ext-xref-conflict.obo: - echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ - #blip-findall -r pext -r ZFA -i pe/tao-obsoletions.obo "entity_xref(Z,T),entity_replaced_by(T,U),\+id_idspace(Z,'UBERON'),id_idspace(U,'UBERON'),entity_xref(U,Zx),id_idspace(Zx,'ZFA'),Zx\=Z" -select "x(U,Z,Zx)" -label > $@ - -ext-xref-conflict2.obo: - echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ - #blip-findall -r pext -r ZFA -i pe/tao-obsoletions.obo "entity_xref(Z,T),entity_replaced_by(T,U),\+id_idspace(Z,'UBERON'),id_idspace(U,'UBERON'),entity_xref(Ux,Z),id_idspace(Ux,'UBERON'),Ux\=U" -select "x(U,Z,Ux)" -label > $@ - -.PHONY: release-diff -release-diff: - cd diffs && make all - -# ---------------------------------------- -# RELEASE DEPLOYMENT -# ---------------------------------------- - -#RELDIR=../.. - -DEPLOY_GH=true - -.PHONY: uberon -uberon: - $(MAKE) prepare_release IMP=false PAT=false BRI=true CLEANFILES=tmp/merged-uberon-edit.obo - $(MAKE) copy_additional_files # Probably not needed anymore now that we put everything on GitHub - $(MAKE) release-diff - if [ $(DEPLOY_GH) = true ]; then $(MAKE) deploy_release GHVERSION="v$(TODAY)"; fi - - -.PHONY: copy_additional_files -copy_additional_files: - rm -rf ../../bridge - mkdir -p ../../bridge - cp $(TMPDIR)/external-disjoints.owl ../../bridge/ ;\ - cp $(COMPONENTSDIR)/external-disjoints.obo ../../bridge/ - # TODO @matentzn. Verify removal of following - # cp composite-brain.{obo,owl} $(RELDIR) ;\ - -FILTER_OUT=../patterns/definitions.owl ../patterns/pattern.owl reports/uberon-edit.obo-obo-report.tsv -MAIN_FILES_RELEASE = $(foreach n, $(filter-out $(FILTER_OUT), $(RELEASE_ASSETS)), ../../$(n)) - -deploy_release: - @test $(GHVERSION) - ls -alt $(MAIN_FILES_RELEASE) - gh release create $(GHVERSION) --notes "TBD." --title "$(GHVERSION)" --draft $(MAIN_FILES_RELEASE) --generate-notes - -#S3CMD = s3cmd -c ~/.s3cfg.go-push --acl-public --reduced-redundancy - -# see https://github.com/obophenotype/uberon/issues/1551 -# we now use S3 directly - -#deploy: deploy-main deploy-top -# -#deploy-main: -# $(S3CMD) sync $(RELDIR)/ s3://bbop-ontologies/uberon/ -#deploy-top: -# $(S3CMD) sync $(RELDIR)/uberon.{obo,owl,json} s3://bbop-ontologies/ - - - -# ---------------------------------------- -# RELEASE -# ---------------------------------------- -#mirror/aao.obo: -# wget $(URIBASE)/aao.obo -O $@ - - -# See: http://code.google.com/p/caro2/issues/detail?id=10 -$(BRIDGEDIR)/fbbt-nd.obo: mirror/fbbt.obo - grep -v ^disjoint $< | perl -npe 's@^ontology: fbbt@ontology: uberon/fbbt-nd@' > $@.tmp && $(OWLTOOLS) $@.tmp -o -f obo $@ - -# TODO @matentzn revive -$(BRIDGEDIR)/caro-bridge-to-zfa.obo: - echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ - #blip-findall -r uberonp -consult util/caro_equiv.pro "ec(C,Z,'ZFA')" -select C-Z -no_pred | $(SCRIPTSDIR)/tbl2obolinks.pl --rel equivalent_to - > $@ - -# TODO @matentzn revive -$(BRIDGEDIR)/caro-bridge-to-xao.obo: - echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ - #blip-findall -r uberonp -consult util/caro_equiv.pro "ec(C,Z,'XAO')" -select C-Z -no_pred | $(SCRIPTSDIR)/tbl2obolinks.pl --rel equivalent_to - > $@ - - - -# /////////////////////// -# /////////////////////// -# /// odds and ends //// -# /////////////////////// -# /////////////////////// - -# ---------------------------------------- -# OTHER -# ---------------------------------------- - -# Removed in accordance with discussion with @cmungall -#xrefs/uberon-to-umls.tbl: uberon.obo -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip-findall -r NCITA -i $< "entity_xref(U,X),inst_sv(X,'\"UMLS_CUI\"',C,_)" -select U-C -no_pred -label -use_tabs > $@.tmp && mv $@.tmp $@ - -# Removed in accordance with discussion with @cmungall -#xrefs/uberon-to-umls.obo: uberon.obo -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip-findall -r NCITA -i $< "entity_xref(U,X),inst_sv(X,'\"UMLS_CUI\"',C,_),atom_concat('UMLS:',C,CX)" -select U-CX -no_pred -use_tabs | $(SCRIPTSDIR)/tbl2obolinks.pl --rel xref > $@.tmp && mv $@.tmp $@ - -# Removed in accordance with discussion with @cmungall -#xrefs/uberon-to-umls-merged.obo: xrefs/uberon-to-umls.obo -# obo-merge-tags.pl -t xref $(SRC) $< > $@ && diff -u $@ $(SRC) || echo +# TODO - switch to purls for OWL once released +subsets/life-stages-mammal.owl: subsets/life-stages-core.owl $(TMPDIR)/developmental-stage-ontologies/src/mmusdv/mmusdv.obo $(TMPDIR)/developmental-stage-ontologies/src/hsapdv/hsapdv.obo + $(ROBOT) merge $(foreach input, $^, -i $(input)) -o $@ +subsets/life-stages-composite.owl: composite-metazoan.owl + $(ROBOT) query --input $< \ + --update $(SPARQLDIR)/inject-life-stages-subset.ru \ + --update $(SPARQLDIR)/inject-subset-declaration.ru \ + --output $@.tmp.owl && mv $@.tmp.owl $@ &&\ + $(OWLTOOLS) $@ --extract-ontology-subset --fill-gaps --subset life_stage \ + -o $@.tmp.owl && mv $@.tmp.owl $@ && \ + $(ROBOT) annotate --input $@ --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ + -o $@.tmp.owl && mv $@.tmp.owl $@ +subsets/life-stages-core.obo: uberon.owl + $(OWLTOOLS) $< --reasoner-query -r elk -l 'life cycle stage' \ + --make-ontology-from-results $(URIBASE)/uberon/$@ \ + --add-ontology-annotation $(DC)/description "Life cycle stage subset of uberon core (generic stages only)" \ + -o -f obo $@ --reasoner-dispose 2>&1 > $@.LOG -# OBO-Format Hacking -# We got rid of this as per discussion with @cmungall -# Way that the way comments are tagged were up to date -#%-cmt.obo: %.obo -# obo-add-comments.pl -t xref -t intersection_of $(SRC) animal_gross_anatomy/*/*.obo ../cell_type/cell.obo ../caro/caro.obo MIAA.obo animal_gross_anatomy/*/*/*.obo ~/cvs/fma-conversion/fma2/fma2.obo gemina_anatomy.obo birnlex_anatomy.obo NIF-GrossAnatomy.obo hao.obo HOG.obo efo_anat.obo $< > $@ +subsets/life-stages-core.owl: uberon.owl + $(OWLTOOLS) $< --reasoner-query -r elk -l 'life cycle stage' \ + --make-ontology-from-results $(URIBASE)/uberon/$@ \ + --add-ontology-annotation $(DC)/description "Life cycle stage subset of uberon core (generic stages only)" \ + -o file://`pwd`/$@ --reasoner-dispose 2>&1 > $@.LOG -# We got rid of this as per discussion with @cmungall -#caloha.obo: -# wget ftp://ftp.nextprot.org/pub/current_release/controlled_vocabularies/caloha.obo -O $@ -# We got rid of this as per discussion with @cmungall -#xcaloha.obo: caloha.obo -# perl -npe 's/TS\-/CALOHA:TS\-/g' $< > $@ +# Taxon subsets +# ---------------------------------------- -# We got rid of this as per discussion with @cmungall -#uberon-new-mp.obo: -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# blip -u query_anatomy -i $(SRC) -r cell -r EMAPA -r mammalian_phenotype -r mammalian_phenotype_xp -r fma_downcase -r NIFGA -r zebrafish_anatomy -r mouse_anatomy findall uberon_mpxp_write > $@ +all_taxmods: $(TAXMODSDIR)/uberon-taxmod-amniote.obo $(TAXMODSDIR)/uberon-taxmod-euarchontoglires.obo -#uberon-new-hp.obo: -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip -u query_anatomy -i $(SRC) -r cell -r human_phenotype -r human_phenotype_xp -r NIFGA -r zebrafish_anatomy -r mouse_anatomy -r EMAPA -goal "uberon_mpxp_write,halt" > $@ +$(TAXMODSDIR)/uberon-taxmod-euarchontoglires.owl: $(TMPDIR)/uberon-taxmod-314146.owl + cp $< $@ -#uberon-new-go.obo: -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip -u query_anatomy -i $(SRC) -r cell -r go -r goxp/biological_process_xp_uber_anatomy -r NIFGA -r zebrafish_anatomy -r mouse_anatomy -r EMAPA -r goxp/biological_process_xp_fly_anatomy -r goxp/biological_process_xp_plant_anatomy -r goxp/biological_process_xp_zebrafish_anatomy -goal "uberon_goxp_write,halt" > $@ +$(TAXMODSDIR)/uberon-taxmod-amniote.owl: $(TMPDIR)/uberon-taxmod-32524.owl + cp $< $@ -#cl-new-go.obo: -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip -u query_anatomy -i $(SRC) -r cell -r go -r goxp/biological_process_xp_uber_anatomy -r goxp/biological_process_xp_cell -r zebrafish_anatomy -r mouse_anatomy -r EMAPA -r goxp/biological_process_xp_fly_anatomy -r goxp/biological_process_xp_plant_anatomy -r goxp/biological_process_xp_zebrafish_anatomy -goal "cl_goxp_write,halt" > $@ +$(TAXMODSDIR)/uberon-taxmod-human.owl: $(TMPDIR)/uberon-taxmod-9606.owl + cp $< $@ -#uberon-defs-from-mp.obo: -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip -u query_anatomy -i $(SRC) -r mammalian_phenotype -goal "uberon_mpxp_write_defs,halt" > $@ +subsets/%-basic.owl: $(TAXMODSDIR)/uberon-taxmod-%.owl tmp/simple-slim-seed.txt + $(ROBOT) reason --input $< \ + --reasoner ELK --equivalent-classes-allowed all --exclude-tautologies structural \ + relax \ + remove --axioms equivalent \ + relax \ + filter --term-file tmp/simple-slim-seed.txt \ + --select "annotations ontology anonymous self" --trim true --signature true \ + reduce -r ELK \ + query --update ../sparql/inject-subset-declaration.ru \ + annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ + convert -f ofn -o $@.tmp.owl && mv $@.tmp.owl $@ +.PRECIOUS: subsets/%-basic.owl -#%.xrefcount: %.obo -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ - #blip -i $< -u ontol_db findall -label '(class(C),setof_count(X,class_xref(C,X),Num))' -select 'C-Num' | sort -k3 -n > $@ +$(TAXMODSDIR)/uberon-taxmod-%.obo: $(TAXMODSDIR)/uberon-taxmod-%.owl + $(OWLTOOLS) $< --remove-imports-declarations -o -f obo --no-check $@.tmp && grep -v ^owl $@.tmp > $@ -#caloha-not-in-uberon.txt: -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip-findall -consult util/ubxref.pro -i uberon.obo -r caloha "class(X),atom_concat('TS-',_,X),\+ubxref(_,X)" -select X -label +# added --allowEquivalencies, see https://github.com/geneontology/go-ontology/issues/12926 +$(TMPDIR)/uberon-taxmod-%.owl: uberon.owl + $(OWLTOOLS) $< --reasoner elk --make-species-subset --perform-macro-expansion false -t NCBITaxon:$* \ + --assert-inferred-subclass-axioms --allowEquivalencies --useIsInferred --remove-dangling \ + --set-ontology-id $(URIBASE)/uberon/subsets/$@ -o $@ 2>&1 > $@.log +.PRECIOUS: $(TMPDIR)/uberon-taxmod-%.owl -# kill till here +# Other subsets # ---------------------------------------- -# Neurolex -# ---------------------------------------- -# We got rid of this as per discussion with @cmungall -#nlx-%.owl: $(TMPDIR)/nlx_stage_all.rdf -# owltools --catalog-xml catalog-nlx.xml $< --abox-to-tbox --reasoner-query -r elk -d -l "$*" -c $(URIBASE)/nlx/neuron -o $@ -# owltools --catalog-xml catalog-nlx.xml $< --reasoner-query -r elk -d -l "$*" --abox-to-tbox --make-ontology-from-results $(URIBASE)/nlx/neuron.owl -o $@ -# ---------------------------------------- -# Rules -# ---------------------------------------- -# We got rid of this as per discussion with @cmungall -#ipo.obo: uberon.obo - #blip-findall -i $< -consult util/partof.pro new_part_of/2 -label -no_pred -use_tabs | sort -u | $(SCRIPTSDIR)/tbl2obolinks.pl --rel part_of --source reference_0000032 - > $@ +# Basic subset +# FIXME: https://github.com/obophenotype/uberon/issues/3013 +basic.owl: uberon-basic.owl + $(ROBOT) merge -i $< annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) -o $@ -# ---------------------------------------- -# REPORTING -# ---------------------------------------- +basic.obo: basic.owl + $(MAKEOBO) -# DOCS -# We got rid of this as per discussion with @cmungall -#relation_table.txt: -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip-findall -r uberon -consult util/relation_report.pro "row(R)" -select R > relation_table.txt +# Cumbo subset +subsets/cumbo.owl: basic.owl + $(OWLTOOLS) $< --extract-ontology-subset --subset cumbo --iri $(URIBASE)/uberon/$@ -o $@ -# number of uses of each relation. -# We got rid of this as per discussion with @cmungall -#%-relstats: %.obo -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip-findall -r uberon "aggregate(count,X-T,parent(X,R,T),Num)" -select "R-Num" -no_pred | | sort -nk2 > $@ +subsets/cumbo.obo: subsets/cumbo.owl + $(MAKEOBO) -#%-el.owl: %.owl -# makeElWithoutReasoning.sh -i `pwd`/$< -o `pwd`/$@ +# Common anatony subset +common-anatomy.owl: $(ONT).owl + $(OWLTOOLS) $< --extract-ontology-subset --fill-gaps --subset common_anatomy \ + -o $@.tmp.owl && mv $@.tmp.owl $@ && \ + $(ROBOT) annotate --input $@ --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ + -o $@.tmp.owl && mv $@.tmp.owl $@ +.PRECIOUS: common-anatomy.owl -# ---------------------------------------- -# SPELLCHECK -# ---------------------------------------- +subsets/immaterial.obo: uberon.owl + $(OWLTOOLS) $< --reasoner-query -r elk -d UBERON_0000466 \ + --make-ontology-from-results $(URIBASE)/uberon/$@ \ + -o -f obo $@ --reasoner-dispose 2>&1 > $@.LOG -# notes: -# to add to a dict -# yes a | aspell check --home-dir . obo-syntax.html -# -# setting --home-dir to . will cause the dictionary .aspell.en.pws in this directory to be used +subsets/metazoan-view.owl: basic.owl + cp $< $@ -# interactive -ispellcheck: $(SRC)-ispellcheck +# The first step is a simple "merge+reason", but it still requires +# Owltools because ROBOT has no equivalent to the -x option to simply +# ignore unsatisfiable classes without erroring out. +subsets/%-view.owl: uberon.owl contexts/context-%.owl tmp/simple-slim-seed.txt + $(OWLTOOLS) uberon.owl contexts/context-$*.owl --merge-support-ontologies --merge-imports-closure \ + $(QELK) --run-reasoner -r elk -x -o -f ofn $@.tmp.owl && \ + $(ROBOT) reason --input $@.tmp.owl \ + --reasoner ELK --equivalent-classes-allowed all --exclude-tautologies structural \ + unmerge -i contexts/context-$*.owl \ + relax \ + remove --axioms equivalent \ + relax \ + filter --term-file tmp/simple-slim-seed.txt \ + --select "annotations ontology anonymous self" --trim true --signature true \ + reduce -r ELK \ + query --update ../sparql/inject-subset-declaration.ru \ + annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ + convert -f ofn -o $@.tmp.owl && mv $@.tmp.owl $@ +.PRECIOUS: subsets/%-view.owl -# batch -spellcheck: $(SRC)-spellcheck +%-partview.owl: %.owl + $(OWLTOOLS) $< --remove-subset grouping_class --remove-subset upper_level \ + --bpvo --reflexive --prefix "" --suffix " part" -r elk -p BFO:0000050 --replace \ + --set-ontology-id $(URIBASE)/uberon/$@ -o -f ttl $@ -# TODO: @cmungall likes this -> unix spell check we need a solution for all of OBO (ROBOT) -# IF does not work, remove from here. -# Nico says: Makes too much noise. Future work +%-exprview.owl: %.owl + $(OWLTOOLS) $< $(URIBASE)/ro.owl --merge-support-ontologies \ + --remove-subset grouping_class --remove-subset upper_level \ + --bpvo --prefix " expressed in" --suffix "" -r elk -p BFO:0000050 --replace \ + --set-ontology-id $(URIBASE)/uberon/$@ -o -f ttl $@ -.PHONY: aspell -aspell: - apt-get install -y aspell +%-homolview.owl: %.owl + $(OWLTOOLS) $< $(URIBASE)/ro.owl homologous-to-part-of.obo --merge-support-ontologies \ + --remove-subset grouping_class --remove-subset upper_level \ + --bpvo --prefix " expressed in" --suffix "" -r elk -p UBREL:0002000 --replace \ + --set-ontology-id $(URIBASE)/uberon/$@ -o -f ttl $@ -%-spellcheck: % | aspell - cat $< | aspell -a check --home-dir . -%-ispellcheck: % | aspell - aspell check --home-dir . $< # ---------------------------------------- -# wikipedia +# COMPOSITE STAGES # ---------------------------------------- -#%-wikipedia.xrefs: %.obo -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #(blip -i $< -u web_fetch_wikipedia -u query_anatomy findall class_wikipage/2 > $@) 2>&1 > $@.err - -#%-wikipedia.pro: %-wikipedia.xrefs -# ./wikitbl2defxref.pl $< | tbl2p > $@ - -#%-wikipedia.merge: %-wikipedia.xrefs -# ./wikitbl2defxref.pl $< | cut -f2,3 | $(SCRIPTSDIR)/tbl2obolinks.pl --rel xref > $@ +$(TMPDIR)/update-stages: $(SRC) | $(TMPDIR) + rm -rf $(TMPDIR)/developmental-stage-ontologies && \ + cd $(TMPDIR) && \ + git clone https://github.com/obophenotype/developmental-stage-ontologies.git -#nif_anatomy.obo: -# blip -i http://ontology.neuinfo.org/NIF/BiomaterialEntities/NIF-GrossAnatomy.owl -f thea2_owl -import_all io-convert -to obo -u ontol_manifest_metadata_from_nif_via_thea -o $@.tmp && ./downcase-obo.pl $@.tmp > $@ +$(TMPDIR)/developmental-stage-ontologies/src/ssso-merged.obo: $(TMPDIR)/update-stages + test -f $@ -#nif_subcellular.obo: -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip -i http://ontology.neuinfo.org/NIF/BiomaterialEntities/NIF-Subcellular.owl -f thea2_owl -import_all io-convert -to obo -u ontol_manifest_metadata_from_nif_via_thea -o $@.tmp && ./nif-downcase-obo.pl $@.tmp > $@ +$(TMPDIR)/merged-stages-xrefs.obo: $(TMPDIR)/developmental-stage-ontologies/src/ssso-merged.obo + $(ROBOT) query -i $(TMPDIR)/developmental-stage-ontologies/src/ssso-merged.obo \ + --query ../sparql/xrefs-to-uberon.sparql $@_xrefs_to_uberon.tsv + cat $@_xrefs_to_uberon.tsv | tail -n +2 | \ + $(SCRIPTSDIR)/tbl2obolinks.pl -k --rel xref - > $@.tmp && mv $@.tmp $@ + +$(TMPDIR)/composite-stages.obo: $(TMPDIR)/merged-stages-xrefs.obo + $(ROBOT) merge -i tmp/developmental-stage-ontologies/src/ssso-merged-uberon.obo \ + -i $(TMPDIR)/merged-stages-xrefs.obo \ + convert -f obo --check false -o $@ + + +# ---------------------------------------- +# COMPOSITE ANATOMY +# ---------------------------------------- +# Warning: you are entering the composite pipeline, the lair of Uberon's +# final boss; now would be a good time to save your progression before +# going any further. + +# All the dependencies used to create the entire composite-metazoan: +# - "weakened" Uberon (as created below); +# - the bridges to the external ontologies; +# - the external ontologies themselves. +MBASE = $(TMPDIR)/ext-weak.owl \ + $(TMPDIR)/bridges \ + $(IMPORTDIR)/local-ceph.owl \ + $(IMPORTDIR)/local-cteno.owl \ + $(IMPORTDIR)/local-ehdaa2.owl \ + $(IMPORTDIR)/local-emapa.owl \ + $(IMPORTDIR)/local-fbbt.owl \ + $(IMPORTDIR)/local-fbdv.owl \ + $(IMPORTDIR)/local-ma.owl \ + $(IMPORTDIR)/local-poro.owl \ + $(IMPORTDIR)/local-wbbt.owl \ + $(IMPORTDIR)/local-wbls.owl \ + $(IMPORTDIR)/local-xao.owl \ + $(IMPORTDIR)/local-zfa.owl \ + $(TMPDIR)/allen-dhba.obo \ + $(TMPDIR)/allen-dmba.obo \ + $(TMPDIR)/allen-hba.obo \ + $(TMPDIR)/allen-mba.obo \ + $(TMPDIR)/allen-pba.obo + + +# Step 1: Create a "weakened" version of Uberon stripped of all +# disjointness axioms, because many external ontologies do not adhere to +# all uberon constraints +$(TMPDIR)/ext-weak.owl: uberon.owl | $(TMPDIR) + $(OWLTOOLS) $< --merge-imports-closure --remove-axioms -t DisjointClasses \ + --remove-equivalent-to-nothing-axioms -o $@ + +# Step 2: A simple merge without additional reasoning +# Hack: We redirect some IRIs to make sure that: +# - we really use the weakened version of Uberon; +# - we do _not_ merge FMA and its bridge. +$(TMPDIR)/merged-composite-%.owl: $(MBASE) $(TMPDIR)/update-stages + $(OWLTOOLS) --catalog-xml $(CATALOG) \ + --map-ontology-iri $(URIBASE)/uberon.owl $(TMPDIR)/ext-weak.owl \ + --map-ontology-iri $(URIBASE)/fma.owl $(COMPONENTSDIR)/null.owl \ + --map-ontology-iri $(URIBASE)/uberon/bridge/uberon-bridge-to-fma.owl $(COMPONENTSDIR)/null.owl \ + $(BRIDGEDIR)/collected-$*.owl \ + --merge-import-closure \ + -o -f ofn $@ +.PRECIOUS: $(TMPDIR)/merged-composite-%.owl -#nif_cell.obo: -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip -i http://ontology.neuinfo.org/NIF/BiomaterialEntities/NIF-Cell.owl -f thea2_owl -import_all io-convert -to obo -u ontol_manifest_metadata_from_nif_via_thea -o $@.tmp && ./nif-downcase-obo.pl $@.tmp > $@ +# Step 2.5: Remove the logical axioms of a handful of around 5 classes +# which are unsatisfiable from SSAOs. +$(TMPDIR)/stripped-composite-%.owl: $(TMPDIR)/merged-composite-%.owl + $(ROBOT) remove -i $< -T unsats.txt --axioms logical -o $@ -#mapping_EMAP_to_EMAPA.txt: -# wget ftp://lausanne.isb-sib.ch/pub/databases/Bgee/general/mapping_EMAP_to_EMAPA.txt -# TODO EMAP is long enpough dead remove from makefile -mapping_EMAP_to_EMAPA.txt: - wget ftp://ftp.hgu.mrc.ac.uk/pub/MouseAtlas/Anatomy/EMAP-EMAPA.txt -O $@ +# Step 3: We use some Owltools deep magic to merge equivalent classes +# between Uberon/CL and the taxon-specific ontologies. +# This is the core part of the pipeline. For more details about what it +# does, please see the description of a "composite" ontology: +# - +# and Owltools' source code, especially the following classes: +# - +# - +TAXON_GCI_RELS = RO:0002202 RO:0002496 RO:0002497 BFO:0000051 +$(TMPDIR)/unreasoned-composite-%.owl: $(TMPDIR)/stripped-composite-%.owl + $(OWLTOOLS) $< \ + --reasoner elk \ + --merge-species-ontology -s 'mouse' -t NCBITaxon:10090 -q $(TAXON_GCI_RELS) \ + --merge-species-ontology -s 'human' -t NCBITaxon:9606 -q $(TAXON_GCI_RELS) \ + --merge-species-ontology -s 'primate' -t NCBITaxon:9443 \ + --merge-species-ontology -s 'Xenopus' -t NCBITaxon:8353 \ + --merge-species-ontology -s 'Danio' -t NCBITaxon:7954 \ + --merge-species-ontology -s 'Drosophila' -t NCBITaxon:7227 \ + --merge-species-ontology -s 'C elegans' -t NCBITaxon:6237 \ + --merge-equivalence-sets -s UBERON 10 -s CL 9 -s CARO 5 \ + -l UBERON 10 -l CL 9 \ + -d UBERON 10 -d CL 9 \ + -o -f ofn $@ +.PRECIOUS: $(TMPDIR)/unreasoned-composite-%.owl -# e.g. raw_similarity_annotations.tsv +# Step 3: Standard reasoning step +composite-%.owl: $(TMPDIR)/unreasoned-composite-%.owl + $(ROBOT) reason -i $< -r ELK --equivalent-classes-allowed all \ + relax \ + reduce -r ELK \ + annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ + -o $@.tmp.owl && mv $@.tmp.owl $@ +.PRECIOUS: composite-%.owl -#ASA=raw_similarity_annotations -#asa-%.tsv: -# wget --no-check-certificate https://raw.githubusercontent.com/BgeeDB/anatomical-similarity-annotations/master/release/$*.tsv -O $@ -# cp $(HOME)/repos/cmungall/anatomical-similarity-annotations/release/$@ $@ -# ^^^ use this when forking is required +# ODK insanity: This rule is EXACTLY the same as the rule above, +# composite-metazoan does not require any special treatment compared to +# the other composite-% products. But because the ODK-generated Makefile +# defines a non-implicit rule with that target, we MUST override it with +# a non-implicit rule -- the implicit rule above is not enough. So we +# have no other choice but to duplicate the rule. Note to future +# maintainers: any change to "step 3" rule above MUST be replicated in +# this rule as well! +composite-metazoan.owl: $(TMPDIR)/unreasoned-composite-metazoan.owl + $(ROBOT) reason -i $< -r ELK --equivalent-classes-allowed all \ + relax \ + reduce -r ELK \ + annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ + -o $@.tmp.owl && mv $@.tmp.owl $@ -#homology.jsonld: asa-$(ASA).tsv $(SCRIPTSDIR)/sim2jsonld.pl -# $(SCRIPTSDIR)/sim2jsonld.pl $< > $@ +# Likewise. +composite-vertebrate.owl: $(TMPDIR)/unreasoned-composite-vertebrate.owl + $(ROBOT) reason -i $< -r ELK --equivalent-classes-allowed all \ + relax \ + reduce -r ELK \ + annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ + -o $@.tmp.owl && mv $@.tmp.owl $@ + +# Step 3.1: OBO version +# Here again we are overriding the standard OWL-to-OBO rules set forth +# by the ODK (https://github.com/obophenotype/uberon/issues/3014) +composite-%.obo: composite-%.owl + $(OWLTOOLS) $< --add-obo-shorthand-to-properties \ + --set-ontology-id -v $(RELEASE)/$@ $(ONTBASE)/$@ \ + -o -f obo --no-check $@.tmp && \ + grep -v ^owl-axioms: $@.tmp > $@ -#homology.ttl: homology.jsonld -# riot -q $< > $@ +# Some special products derived from the products generated above +# ---------------------------------------- +BASICRELS = BFO:0000050 RO:0002202 immediate_transformation_of transformation_of -#homology.owl: homology.ttl homology-relations.owl -# owltools $(UCAT) $^ --merge-support-ontologies -o $@ +composite-metazoan-basic.owl: composite-metazoan.owl + $(OWLTOOLS) $< --extract-mingraph --remove-axiom-annotations \ + --make-subset-by-properties -f $(BASICRELS) \ + -o -f obo --no-check $@.tmp && \ + grep -v '^owl-axioms:' $@.tmp > $@ && \ + $(ROBOT) annotate -i $@ --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ + convert --check false -f owl -o $@.tmp && \ + mv $@.tmp $@ -#simil%.pro: simil%.tsv -# $(SCRIPTSDIR)/sim2pro.pl $< | tbl2p > $@.tmp && mv $@.tmp $@ +composite-vertebrate-basic.owl: composite-vertebrate.owl + $(OWLTOOLS) $< --extract-mingraph --remove-axiom-annotations \ + --make-subset-by-properties -f $(BASICRELS) \ + -o -f obo --no-check $@.tmp && \ + grep -v '^owl-axioms:' $@.tmp > $@ && \ + $(ROBOT) annotate -i $@ --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \ + convert --check false -f owl -o $@.tmp && \ + mv $@.tmp $@ +# Helper commands for composite-* stuff # ---------------------------------------- -# VIEWS -# ---------------------------------------- -%-partview.owl: %.owl - $(OWLTOOLS) $< --remove-subset grouping_class --remove-subset upper_level --bpvo --reflexive --prefix "" --suffix " part" -r elk -p BFO:0000050 --replace --set-ontology-id $(URIBASE)/uberon/$@ -o -f ttl $@ -## owltools $< --bpvo --prefix "" --suffix " part" -r elk -p BFO:0000050 --set-ontology-id $(URIBASE)/uberon/$@ -o $@ - -%-exprview.owl: %.owl - $(OWLTOOLS) $< $(URIBASE)/ro.owl --merge-support-ontologies --remove-subset grouping_class --remove-subset upper_level --bpvo --prefix " expressed in" --suffix "" -r elk -p BFO:0000050 --replace --set-ontology-id $(URIBASE)/uberon/$@ -o -f ttl $@ -%-homolview.owl: %.owl - $(OWLTOOLS) $< $(URIBASE)/ro.owl homologous-to-part-of.obo --merge-support-ontologies --remove-subset grouping_class --remove-subset upper_level --bpvo --prefix " expressed in" --suffix "" -r elk -p UBREL:0002000 --replace --set-ontology-id $(URIBASE)/uberon/$@ -o -f ttl $@ +# Create a diff with the latest released version +$(TMPDIR)/composite-metazoan-last-release.owl: + wget https://github.com/obophenotype/uberon/releases/latest/download/composite-metazoan.owl -O $@ +reports/release-diff-composite.txt: $(TMPDIR)/composite-metazoan-last-release.owl composite-metazoan.owl + $(ROBOT) diff --left composite-metazoan-last-release.owl --right composite-metazoan.owl -o $@ -# ---------------------------------------- -# TEXT MINING -# ---------------------------------------- +.PHONY: composite-diff +composite-diff: reports/release-diff-composite.txt -#%-matches.tbl: %.txt -# blip-findall -debug index -index "metadata_nlp:entity_label_token_list_stemmed(1,0,0,0)" -u metadata_nlp -i $< -r cell -r uberon "$*(X),label_full_parse(X,true,S)" -select "m(X,S)" -label > $@ -# ---------------------------------------- -# DBPEDIA -# ---------------------------------------- +# Saves someone the hassle of typing 'make composite-metazoan.obo composite-vertebrate.obo' +composites: composite-metazoan.obo composite-vertebrate.obo -#ma2ncitx.obo: ma2ncit.obo -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip-findall -r MA -i $< -r NCITA "class_xref(M,MX),atom_concat('ncithesaurus:',X,MX),inst_sv(C,_P,X,_)" -select "M-C" -no_pred -label -use_tabs | sort -u | $(SCRIPTSDIR)/tbl2obolinks.pl --rel xref - > $@ # ---------------------------------------- -# BTO +# BRIDGES # ---------------------------------------- -#bto-anat.obo: -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip ontol-query -r brenda -index "ontol_db:parentT(1,-,1)" -query "parentT(ID,'BTO:0000042'),\+((class(X,N),atom_concat(_,'cell line',N),parentT(ID,X)))" -to obo > $@ - +# Generating cross-refs with FBbt from SSSOM # ---------------------------------------- -# ABA -# ---------------------------------------- - -ALLENS = dmba hba dhba pba mba +# Download the FBbt mapping file +.PHONY: $(TMPDIR)/fbbt-mappings.sssom.tsv +$(TMPDIR)/fbbt-mappings.sssom.tsv: + if [ $(IMP) = true ]; then wget -O $@ http://purl.obolibrary.org/obo/fbbt/fbbt-mappings.sssom.tsv ; fi +# Attempt to update the canonical FBbt mapping file from a freshly downloaded one +# (no update if the downloaded file is absent or identical to the one we already have) +mappings/fbbt-mappings.sssom.tsv: $(TMPDIR)/fbbt-mappings.sssom.tsv + if [ -f $< ]; then if ! cmp $< $@ ; then cat $< > $@ ; fi ; fi -# TODO Review this ABA has been removed!! especially bridges/aba.owl -# @cmungall aba was replaced by mba -#aba.obo: ABA-src.obo -# $(SCRIPTSDIR)/make-aba-part-ofs.pl $< > $@ -#$(BRIDGEDIR)/aba.owl: aba.obo -# owltools $< -o file://`pwd`/$@ +# Generate cross-references from the FBbt mapping file +$(COMPONENTSDIR)/mappings.owl: mappings/fbbt-mappings.sssom.tsv ../scripts/sssom2xrefs.awk + awk -f ../scripts/sssom2xrefs.awk $< > $@ -allen_all: $(patsubst %,$(TMPDIR)/allen-%.obo,$(ALLENS)) -$(TMPDIR)/allen-dmba.json: | $(TMPDIR) - wget https://api.brain-map.org/api/v2/structure_graph_download/17.json -O $@ -$(TMPDIR)/allen-hba.json: | $(TMPDIR) - wget https://api.brain-map.org/api/v2/structure_graph_download/10.json -O $@ -$(TMPDIR)/allen-dhba.json: | $(TMPDIR) - wget https://api.brain-map.org/api/v2/structure_graph_download/16.json -O $@ -$(TMPDIR)/allen-pba.json: | $(TMPDIR) - wget https://api.brain-map.org/api/v2/structure_graph_download/8.json -O $@ -$(TMPDIR)/allen-mba.json: | $(TMPDIR) - wget https://api.brain-map.org/api/v2/structure_graph_download/1.json -O $@ -$(TMPDIR)/allen-%.obo: $(TMPDIR)/allen-%.json $(SCRIPTSDIR)/allen-json2obo.pl - $(SCRIPTSDIR)/allen-json2obo.pl $< > $@ +# Prepare Uberon and CL sources +# ---------------------------------------- +# Uberon: We need to forcefully merge the mappings component generated +# from the FBbt mappings so that the FBbt cross-references will be +# visible to the bridge-generating script. +$(TMPDIR)/seed.obo: $(SRC) $(COMPONENTSDIR)/mappings.owl + $(ROBOT) merge -i $< -i $(COMPONENTSDIR)/mappings.owl --collapse-import-closure false \ + convert -f obo --check false -o $@.tmp && \ + $(SCRIPTSDIR)/obo-grep.pl --neg -r is_obsolete $@.tmp > $@ -UNSATS=--term DHBA:146035008 --term DHBA:146035004 --term DHBA:146035012 -$(TMPDIR)/allen-dhba.obo: $(TMPDIR)/allen-dhba.json $(SCRIPTSDIR)/allen-json2obo.pl - $(SCRIPTSDIR)/allen-json2obo.pl $< > $@ - $(ROBOT) remove -i $@ --prefix "DHBA: http://purl.obolibrary.org/obo/DHBA_" $(UNSATS) --axioms logical -o $@.tmp.obo && mv $@.tmp.obo $@ +# CL (step 1): We take the full ontology, excluding external classes, +# but including references to those +$(TMPDIR)/cl-core.obo: $(SRC) + $(OWLTOOLS) $(URIBASE)/cl.owl \ + --make-subset-by-properties -n BFO:0000050 BFO:0000051 RO:0002202 RO:0002215 \ + --remove-external-classes -k CL \ + --remove-dangling --remove-axiom-annotations --remove-imports-declarations \ + -o -f obo --no-check $@ + +# CL: (step 2): We add the header tags that the bridge-generating script +# is relying upon +$(TMPDIR)/cl-with-xrefs.obo: $(TMPDIR)/cl-core.obo $(SCRIPTSDIR)/expand-idspaces.pl + if [ $(BRI) = true ]; then \ + egrep '^(idspace|treat-)' $(SRC) > $@.tmp && \ + cat $< >> $@.tmp && \ + $(SCRIPTSDIR)/expand-idspaces.pl $@.tmp > $@; \ + fi + +# ZFA requires special treatment because most xrefs between CL and ZFA +# are on the ZFA side, so they need to be extracted and inverted before +# we can generate the ZFA bridges out of them. +# FIXME: This is currently broken: the step below does not extract +# anything, which is probably why the CL-to-ZFA bridge is almost empty +# (https://github.com/obophenotype/uberon/issues/1813) +$(TMPDIR)/cl-zfa-xrefs.obo: mirror/zfa.owl + if [ $(MIR) = true ] && [ $(IMP) = true ]; then \ + $(ROBOT) query -i $< --query ../sparql/zfa-xrefs-to-cl.sparql $@_xrefs_to_zfa.tsv && \ + cat $@_xrefs_to_zfa.tsv | tail -n +2 | \ + $(SCRIPTSDIR)/tbl2obolinks.pl --rel xref - > $@.tmp && mv $@.tmp $@; \ + fi + + +# Building the bridges +# ---------------------------------------- +# Most bridges are built here, by a script that extracts xrefs from +# the source files prepared above and derives the bridges from them. +$(TMPDIR)/bridges: $(TMPDIR)/seed.obo $(TMPDIR)/cl-with-xrefs.obo $(TMPDIR)/cl-zfa-xrefs.obo $(REPORTDIR)/life-cycle-xrefs.txt $(CUSTOM_BRIDGES) + if [ $(BRI) = true ]; then \ + cd $(BRIDGEDIR) && \ + perl ../../scripts/make-bridge-ontologies-from-xrefs.pl -l ../$(REPORTDIR)/life-cycle-xrefs.txt ../$(TMPDIR)/seed.obo && \ + perl ../../scripts/make-bridge-ontologies-from-xrefs.pl -l ../$(REPORTDIR)/life-cycle-xrefs.txt -b cl ../$(TMPDIR)/cl-with-xrefs.obo ../$(TMPDIR)/cl-zfa-xrefs.obo && \ + cd .. && touch $@; \ + fi + +# The above script creates OBO bridges, turn them to OWL +$(BRIDGEDIR)/%.owl: $(BRIDGEDIR)/%.obo + $(OWLTOOLS) $< --remove-annotation-assertions -o $@ -# TODO @cmungall commented out needs discussion -#$(TMPDIR)/external-brain.obo: $(patsubst %,$(TMPDIR)/allen-%.obo, $(ALLENS)) aba.obo $(TMPDIR)/nlx-ns-part-dn.obo -# owltools $^ --merge-support-ontologies -o -f obo --no-check $@ +# Special bridges # ---------------------------------------- -# NIF -# ---------------------------------------- -NIF = -$(TMPDIR)/NIF-GrossAnatomy-src.owl: - wget http://ontology.neuinfo.org/NIF/BiomaterialEntities/NIF-GrossAnatomy.owl -O $@ -$(TMPDIR)/NIF-GrossAnatomy.owl: $(TMPDIR)/NIF-GrossAnatomy-src.owl - perl -npe 's@http://ontology.neuinfo.org/NIF/BiomaterialEntities/NIF-GrossAnatomy.owl#@http://purl.obolibrary.org/obo/NIF_GrossAnatomy_@g' $< > $@ -# perl -npe 's@http://ontology.neuinfo.org/NIF/BiomaterialEntities/NIF-GrossAnatomy.owl#@http://purl.obolibrary.org/obo/NIF_GrossAnatomy:@g' $< > $@ +# All bridges that are not generated by the xref-based script. -$(TMPDIR)/NIF-GrossAnatomy-orig.obo: $(TMPDIR)/NIF-GrossAnatomy.owl - $(OWLTOOLS) $< -o -f obo $@ -$(TMPDIR)/NIF-GrossAnatomy.obo: $(TMPDIR)/NIF-GrossAnatomy-orig.obo - $(SCRIPTSDIR)/fix-nif-ga.pl $< > $@ +CUSTOM_BRIDGES = $(BRIDGEDIR)/uberon-bridge-to-mba.obo \ + $(BRIDGEDIR)/uberon-bridge-to-dmba.obo \ + $(BRIDGEDIR)/uberon-bridge-to-nifstd.owl -uberon-nif-combined.owl: uberon.owl - $(OWLTOOLS) $< $(BRIDGEDIR)/uberon-bridge-to-nif_grossanatomy.owl $(TMPDIR)/NIF-GrossAnatomy.owl --merge-support-ontologies -o $@ +$(BRIDGEDIR)/uberon-bridge-to-nifstd.obo: $(SRC) + $(SCRIPTSDIR)/xref-to-equiv.pl uberon/$(BRIDGEDIR)/uberon-bridge-to-nifstd http://uri.neuinfo.org/nif/nifstd/ $< > $@.tmp && mv $@.tmp $@ -#uberon-nif-combined.obo: uberon.obo -# obo-cat.pl uberon.obo $(BRIDGEDIR)/uberon-bridge-to-nif_grossanatomy.obo ~/cvs/pkb-owl/ontology.neuinfo.org/NIF/BiomaterialEntities/NIF-GrossAnatomy.obo > $@ -# TODO maybe we dont need nif-c anymore -uberon-nif-merged.owl: uberon-nif-combined.obo - $(OWLTOOLS) $< --reasoner elk --merge-equivalent-classes -f -t UBERON -o $@.tmp && grep -v ' $@ -# owltools $< --reasoner elk --remove-axioms -t DisjointClasses --merge-equivalent-classes -a -t UBERON -o $@.tmp && grep -v ' $@ +# Bridges to MBA and DMBA are now manually curated and generated in +# https://github.com/obophenotype/ABA_Uberon/tree/new_bridge. +# Note: the bridges are generated in new_bridge branch - this might +# change in the future, if it breaks here, please check ABA_Uberon repo +# to make sure that the new bridges are appropriately linked. +UBERON_BRIDGE_MBA = "https://raw.githubusercontent.com/obophenotype/ABA_Uberon/master/src/ontology/new-bridges/new-uberon-bridge-to-mba.owl" +UBERON_BRIDGE_DMBA = "https://raw.githubusercontent.com/obophenotype/ABA_Uberon/master/src/ontology/new-bridges/new-uberon-bridge-to-dmba.owl" -uberon-nif-merged.obo: uberon-nif-merged.owl - $(OWLTOOLS) $< -o -f obo --no-check $@ +$(BRIDGEDIR)/uberon-bridge-to-mba.owl: $(SRC) + if [ $(BRI) = true ]; then $(ROBOT) annotate -I $(UBERON_BRIDGE_MBA) --ontology-iri $(ONTBASE)/$@ -o $@; fi +$(BRIDGEDIR)/uberon-bridge-to-mba.obo: $(BRIDGEDIR)/uberon-bridge-to-mba.owl + if [ $(BRI) = true ]; then $(ROBOT) convert --input $(BRIDGEDIR)/uberon-bridge-to-mba.owl --output $@; fi -# ---------------------------------------- -# UTIL -# ---------------------------------------- -# TODO @cmungall KEEP IT AS REMINDER -#util/ubermacros.el: -# echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ -# #blip-findall -r ro -r go -r pato -r pext -r mondo -r taxslim -r mondo_edit -consult util/write_ubermacros.pro w > $@.tmp && sort -u $@.tmp > $@ +$(BRIDGEDIR)/uberon-bridge-to-dmba.owl: $(SRC) + if [ $(BRI) = true ]; then $(ROBOT) annotate -I $(UBERON_BRIDGE_DMBA) --ontology-iri $(ONTBASE)/$@ -o $@; fi -%-noext.obo: %.obo - $(SCRIPTSDIR)/obo-grep.pl -r 'id: UBERON:' $< > $@.tmp && mv $@.tmp $@ +$(BRIDGEDIR)/uberon-bridge-to-dmba.obo: $(BRIDGEDIR)/uberon-bridge-to-dmba.owl + if [ $(BRI) = true ]; then $(ROBOT) convert --input $(BRIDGEDIR)/uberon-bridge-to-dmba.owl --output $@; fi -%-names.txt: %.obo - grep ^name: $< | grep -v obsolete | perl -npe 's@name: @@' > $@.tmp && sort -u $@.tmp > $@ # ---------------------------------------- -# ROBOT PATTERNS AND TEMPLATES +# COMPONENTS # ---------------------------------------- -$(COMPONENTSDIR)/in-subset.owl: $(SRC) $(TEMPLATEDIR)/in-subset.template.tsv +$(COMPONENTSDIR)/in-subset.owl: $(SRC) $(TEMPLATEDIR)/in-subset.template.tsv $(ROBOT) template --template $(TEMPLATEDIR)/in-subset.template.tsv \ - annotate --ontology-iri $(ONTBASE)/$@ --output $(COMPONENTSDIR)/in-subset.owl + annotate --ontology-iri $(ONTBASE)/$@ \ + --output $(COMPONENTSDIR)/in-subset.owl $(COMPONENTSDIR)/vasculature_class.owl: $(TEMPLATEDIR)/vasculature_class.owl $(ROBOT) merge -i $< annotate --ontology-iri $(ONTBASE)/$@ --output $@ @@ -1800,92 +1298,104 @@ $(TMPDIR)/hra_depiction_3d_images.owl: $(COMPONENTSDIR)/hra_depiction_3d_images.owl: $(TMPDIR)/hra_depiction_3d_images.owl $(ROBOT) merge -i $< annotate --ontology-iri $(ONTBASE)/$@ --output $@ + # ---------------------------------------- -# DEAD SIMPLE DESIGN PATTERNS +# RELEASE DEPLOYMENT # ---------------------------------------- -MODDIR=modules -#PATTERNDIR=patterns -MODS = luminal_space_of gland_duct gland_acinus endochondral_bone endochondral_cartilage +DEPLOY_GH=true + +.PHONY: uberon +uberon: + $(MAKE) prepare_release IMP=false PAT=false BRI=true CLEANFILES=tmp/merged-uberon-edit.obo + $(MAKE) copy_additional_files # Probably not needed anymore now that we put everything on GitHub + $(MAKE) release-diff + if [ $(DEPLOY_GH) = true ]; then $(MAKE) deploy_release GHVERSION="v$(TODAY)"; fi -# OWL->CSV -PSRC = $(SRC) +.PHONY: copy_additional_files +copy_additional_files: + rm -rf ../../bridge + mkdir -p ../../bridge + cp $(TMPDIR)/external-disjoints.owl ../../bridge/ ;\ + cp $(COMPONENTSDIR)/external-disjoints.obo ../../bridge/ +FILTER_OUT=../patterns/definitions.owl ../patterns/pattern.owl reports/uberon-edit.obo-obo-report.tsv +MAIN_FILES_RELEASE = $(foreach n, $(filter-out $(FILTER_OUT), $(RELEASE_ASSETS)), ../../$(n)) -# NEW: reverse engineer using patternizer -patternizer: - pl2sparql -e -c patterns/patternizer_conf.pl -A void.ttl -i ext doall +deploy_release: + @test $(GHVERSION) + ls -alt $(MAIN_FILES_RELEASE) + gh release create $(GHVERSION) --notes "TBD." --title "$(GHVERSION)" --draft $(MAIN_FILES_RELEASE) --generate-notes -# reverse engineer CSV from uberon axioms and DOSDPs -# TODO @cmungall nico leave as reminder -modules/%.csv: $(PSRC) - echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ - #blip-findall -i $< -r pext -u odputil -i $(PATTERNDIR)/uberon_patterns.pro "write_tuple($*)" > $@.tmp && mv $@.tmp $@ -.PRECIOUS: modules/%.csv +.PHONY: release-diff +release-diff: + cd diffs && make all -modules/new-%.csv: $(PSRC) - echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ - #blip-findall -i $< -r pext -u odputil -i $(PATTERNDIR)/uberon_patterns.pro "write_tuple($*)" > $@.tmp && mv $@.tmp $@ -.PRECIOUS: modules/%.csv -# currently, the pattern source is prolog - generate dosdp yaml from this -$(PATTERNDIR)/%.yaml: patterns/uberon_patterns.pro - echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ - #blip-findall -r uberonp -u odputil -i $(PATTERNDIR)/uberon_patterns.pro "write_yaml($*),fail" > $@.tmp && mv $@.tmp $@ -.PRECIOUS: $(PATTERNDIR)/%.yaml +# ---------------------------------------- +# UTILITY COMMANDS +# ---------------------------------------- -# compare ldef with lexical aspect -modules/conflict_analysis.tsv: - echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ - #blip-findall -i $(SRC) -r pext -u odputil -i patterns/uberon_patterns.pro conflicting_tuple_from_ldef/4 -label -no_pred -use_tabs > $@.tmp && mv $@.tmp $@ +# Spellchecking +# ---------------------------------------- -# some patterns are paired: check for missing members of pairs -modules/missing.txt: - echo "STRONG WARNING: $@ skipped, because there is no more blip." && touch $@ - #blip-findall -i $(SRC) -r pext -u odputil -i $(PATTERNDIR)/uberon_patterns.pro "nomatch/3" -label -no_pred > $@ +# Interactive spell check +ispellcheck: $(SRC)-ispellcheck +# Batch mode spell check +spellcheck: $(SRC)-spellcheck +# Warning: this won't work with future ODK version where workflows are +# run without root privileges by default! +.PHONY: aspell +aspell: + apt-get install -y aspell -all_modules: all_modules_omn all_modules_owl all_modules_obo all_modules_new -all_modules_owl: $(patsubst %, $(MODDIR)/%.owl, $(MODS)) -all_modules_omn: $(patsubst %, $(MODDIR)/%.omn, $(MODS)) -all_modules_obo: $(patsubst %, $(MODDIR)/%.obo, $(MODS)) -all_modules_new: $(patsubst %, $(MODDIR)/%-new.obo, $(MODS)) +%-spellcheck: % | aspell + cat $< | aspell -a check --home-dir . -$(MODDIR)/%.omn: $(MODDIR)/%.csv $(PATTERNDIR)/%.yaml - apply-pattern.py -s label -P curie_map.yaml -b http://purl.obolibrary.org/obo/ -i $< -p $(PATTERNDIR)/$*.yaml -G $(MODDIR)/$*-gci.owl > $@.tmp && mv $@.tmp $@ +%-ispellcheck: % | aspell + aspell check --home-dir . $< -#$(MODDIR)/%-gci.owl: $(MODDIR)/%.omn -# need to go via RDF due to OWLAPI bug -$(MODDIR)/%.rdf: $(MODDIR)/%.omn $(MODDIR)/%-gci.owl - $(OWLTOOLS) $^ --merge-support-ontologies --set-ontology-id $(URIBASE)/uberon/$@ -o $@ +# OBO format tricks +# ---------------------------------------- +.PHONY: roundtrip_obo +roundtrip_obo: $(SRC) + $(ROBOT) convert -i $< -o $(TMPDIR)/roundtrip.obo.tmp.obo && \ + mv $(TMPDIR)/roundtrip.obo.tmp.obo $(TMPDIR)/roundtrip.obo && \ + diff -i $< $(TMPDIR)/roundtrip.obo -$(MODDIR)/%.owl: $(MODDIR)/%.rdf - $(OWLTOOLS) $< -o -f ofn $@ +$(TMPDIR)/NORMALIZE.obo: $(SRC) + $(ROBOT) convert -i $< -o $@.tmp.obo && mv $@.tmp.obo $@ -$(MODDIR)/%.obo: $(MODDIR)/%.owl - $(OWLTOOLS) $< -o -f obo $@.tmp && grep -v ^owl-axioms $@.tmp > $@ +.PHONY: normalize +normalize: $(TMPDIR)/NORMALIZE.obo + mv $< $(SRC) + echo "WARNING: $(SRC) has been overwritten! Please carefully check your diff before you commit!" -$(MODDIR)/%-new.obo: $(MODDIR)/%.owl $(OWLSRC) - $(OWLTOOLS) $^ --diff -f obo -s -u --o1r $@ --o2r $(MODDIR)/%-missing.obo +# Cleaning up # ---------------------------------------- -# SPARQL -# ---------------------------------------- -reports/%.csv: ../sparql/%.sparql uberon.owl - $(ROBOT) merge -i $< query -s $< $@ -f csv +clean_uberon: + rm -rf ./*.tmp + rm -rf ./*.tmp1 + rm -rf ./*.tmp2 + rm -rf ./composite-* + rm -rf ./merged_collect* + rm -rf ./uberon-full.* + rm -rf ./uberon-base.* + rm -f uberon.owl uberon.obo BUILDLOGUBERON.txt unsat_all_explanation.md -# ---------------------------------------- -# BLAZEGRAPH -# ---------------------------------------- +clean: clean_uberon -############################################# -############ Nico hacks ##################### -$(TMPDIR)/external-disjoints.owl: components/external-disjoints.obo - $(ROBOT) convert -i $< -f owl -o $@ -.PRECIOUS: $(TMPDIR)/external-disjoints.owl +# ---------------------------------------- +# PURGATORY +# ---------------------------------------- +# Everything that does not belong to any of the sections above. +# May include both actually useful stuff and stuff that nobody +# remembers why it was written in the first place. TEMPLATESDIR=templates @@ -1923,43 +1433,12 @@ reports/robot_release_diff.md: $(TMPDIR)/$(ONT)-obo.obo $(TMPDIR)/$(ONT)-obo-mai feature_diff: reports/robot_main_diff.md -######################## -#### Utility commands ## - -.PHONY: quick-qc -quick-qc: tmp/core.owl $(REPORTDIR)/uberon-edit-obscheck.txt - cat $(REPORTDIR)/uberon-edit-obscheck.txt - -.PHONY: roundtrip_obo -roundtrip_obo: $(SRC) - $(ROBOT) convert -i $< -o $(TMPDIR)/roundtrip.obo.tmp.obo && mv $(TMPDIR)/roundtrip.obo.tmp.obo $(TMPDIR)/roundtrip.obo && diff -i $< $(TMPDIR)/roundtrip.obo - -.PHONY: normalize -normalize: $(TMPDIR)/NORMALIZE.obo - mv $< $(SRC) - echo "WARNING: $(SRC) has been overwritten! Please carefully check your diff before you commit!" - -clean_uberon: - rm -rf ./*.tmp - rm -rf ./*.tmp1 - rm -rf ./*.tmp2 - rm -rf ./composite-* - rm -rf ./merged_collect* - rm -rf ./uberon-full.* - rm -rf ./uberon-base.* - rm -f uberon.owl uberon.obo tmp/core.owl BUILDLOGUBERON.txt unsat_all_explanation.md - rm -f ext.owl - -clean: clean_uberon explain: $(ROBOT) explain --input $(TMPDIR)/unreasoned-composite-metazoan.owl --reasoner ELK \ --axiom "'Nucleus raphe obscurus' EquivalentTo: 'nucleus raphe obscurus'" \ --explanation $(TMPDIR)/explanation.md -#uberon_edit-xp-check basic-allcycles uberon_edit-obscheck.txt: -# echo "skipping $@" - unsat: $(TMPDIR)/bundled-metazoan.owl_unsat.ofn $(TMPDIR)/cl_mondo_merged.owl_unsat.ofn $(TMPDIR)/%_unsat.ofn: % @@ -1972,10 +1451,6 @@ cl_mondo_merged.owl: $(ROBOT) merge -i uberon.owl -I $(URIBASE)/cl.owl -o $@ -#### Temporary exclusions - -reports/composite-metazoan-dv.txt: - echo "ERROR ERROR WARNING ERROR: $@ currently fails!" && touch $@ OLDLOCATION=http://svn.code.sf.net/p/obo/svn/uberon/releases/2020-09-16 diffr-%: @@ -1998,7 +1473,6 @@ normalise_release_serialisation_ofn: normalise_release_serialisation_rdfmxml: sh ../scripts/normalisation/norm_rdfxml.sh ../../basic.owl - sh ../scripts/normalisation/norm_rdfxml.sh ../../ext.owl sh ../scripts/normalisation/norm_rdfxml.sh ../../uberon-base.owl sh ../scripts/normalisation/norm_rdfxml.sh ../../src/ontology/imports/caro_import.owl src/ontology/imports/fbbt_import.owl sh ../scripts/normalisation/norm_rdfxml.sh ../../src/ontology/subsets/amniote-basic.owl @@ -2047,28 +1521,6 @@ normalise_release: normalise_robot: .FORCE $(ROBOT) convert -i $(SRC) -f obo --check false -o $(SRC) -test_obo_serialisation: - $(ROBOT) convert -i $(SRC) -f obo -o $(TMPDIR)/uberon_make_sure_serialisable_as_obo.obo - -test: test_obo_serialisation - -.PHONY: obocheck -obocheck: - fastobo-validator uberon-edit.obo -test: obocheck - -.PHONY: test_obsolete -test_obsolete: - ! grep "! obsolete" uberon-edit.obo - -test: test_obsolete - -.PHONY: test_owlaxioms -test_owlaxioms: - ! grep "owl-axioms: " uberon-edit.obo - -test: test_owlaxioms - docs/releases.md: uberon-odk.yaml echo "All the things to generate the release.md file and the sep. pages for each release." # Amazing: only generate links to release artefacts if they truly exist: @@ -2084,7 +1536,7 @@ select_uberon_two_constraints: $(ROBOT) query -i $(SRC) --query ../sparql/select_uberon_two_constraints.sparql $@.tsv explain_humans: - $(ROBOT) merge -i ../../ext.owl -i contexts/context-human.owl explain --reasoner ELK --axiom "'nose' SubClassOf owl:Nothing" --explanation $@.md + $(ROBOT) merge -i ../../uberon.owl -i contexts/context-human.owl explain --reasoner ELK --axiom "'nose' SubClassOf owl:Nothing" --explanation $@.md explain_humans_all: - $(ROBOT) merge -i ../../ext.owl -i contexts/context-human.owl explain --reasoner ELK -M unsatisfiability --unsatisfiable random:10 --explanation $@.md + $(ROBOT) merge -i ../../uberon.owl -i contexts/context-human.owl explain --reasoner ELK -M unsatisfiability --unsatisfiable random:10 --explanation $@.md diff --git a/src/sparql/id-format-violation.sparql b/src/sparql/id-format-violation.sparql new file mode 100644 index 0000000000..2adeb2d7f6 --- /dev/null +++ b/src/sparql/id-format-violation.sparql @@ -0,0 +1,10 @@ +PREFIX owl: +PREFIX rdf: +PREFIX rdfs: + +SELECT ?cls WHERE { + ?cls a owl:Class . + FILTER (strstarts(str(?cls), "http://purl.obolibrary.org/obo/UBERON_") && + ! regex(str(?cls), "^http://purl.obolibrary.org/obo/UBERON_[0-9]{7}$")) + FILTER NOT EXISTS { ?cls owl:deprecated ?v } +}