# ----------------------------------------
# Standard Constants
# ----------------------------------------
# these can be overwritten on the command line

OBO=http://purl.obolibrary.org/obo
OIO=http://www.geneontology.org/formats/oboInOwl\#
RDFS=http://www.w3.org/2000/01/rdf-schema#
SKOS=http://www.w3.org/2004/02/skos/core\#
EFO=http://www.ebi.ac.uk/efo
ONT=mondo
ONTURI=$(OBO)/$(ONT)
ONTBASE=$(ONT)-base
SRC=$(ONT)-edit.obo
RELEASEDIR=../../target/
ROBOT= robot
OWLTOOLS= owltools
USECAT= --use-catalog
SPARQLDIR = ../sparql

CONSTRUCTS= embedded-definition
INCLUDES_OWL = $(patsubst %,include-%.owl,$(CONSTRUCTS))
ISODATE:=`date +%Y-%m-%d`

FMTS = obo owl json

obo-filter-axiom-header = grep -v ^owl-axioms:

OWL2OBO = robot convert -i $< -o $@.tmp.obo && grep -v ^owl-axioms: $@.tmp.obo > $@

PV_CC0 = http://purl.org/dc/terms/license https://creativecommons.org/publicdomain/zero/1.0/

# In converting to obo format, everything is assumed to have an OBO prefix.
# This perl corrects this.
# Longer term we need to eliminate passing through obo and/or fix the owlapi implementation to respect prefixes
FIX_URI_EXPR = 's@$(OBO)/EFO_@http://www.ebi.ac.uk/efo/EFO_@g; s@$(OBO)/UMLS_@http://linkedlifedata.com/resource/umls/id/@g'

# EFO uses different properties. The following command can be used on owltools
EFO2OBO_OPTS = --rename-entity $(EFO)/definition $(OBO)/IAO_0000115 \
           --rename-entity $(EFO)/reason_for_obsolescence $(RDFS)comment \
           --rename-entity $(EFO)/alternative_term $(OIO)hasExactSynonym\
           --rename-entity $(OBO)/ECO_0000218 $(OIO)source

# EFO uses different prefixes in xrefs. We replace these with the following perl
# intended to be used within a perl -npe loop.
# In future we should use a more robust translation
EFO2OBO_PERL = 's@NCIt:@NCIT:@; s@MSH:@MESH:@; s@SNOMEDCT:@SCTID:@;'

# ----------------------------------------
# Top-level targets
# ----------------------------------------

all: test all_artefacts

# ----------------------------------------
# Artefacts
# ----------------------------------------
ONTOLOGY_IMPORTS = uberon cl go pato ro hp mf oba ncbitaxon chebi envo ncit hgnc foodon
IMPORT_ROOTS = $(patsubst %, imports/%_import, $(ONTOLOGY_IMPORTS)) imports/equivalencies
IMPORT_FILES = $(foreach n,$(IMPORT_ROOTS), $(n).owl $(n).obo $(n).json)  imports/axioms.owl
IMPORT_FILES_OWL = $(foreach n,$(IMPORT_ROOTS), $(n).owl)  imports/axioms.owl

SUBSETS = mondo-minimal
SUBSET_ROOTS = $(patsubst %, subsets/%, $(SUBSETS))
SUBSET_FILES = $(foreach n,$(SUBSET_ROOTS), $(n).owl $(n).obo $(n).json)

REPORTS = basic-report class-count-by-prefix edges xrefs obsoletes obsoletion-candidates synonyms class-stats root-classes superclass-count
REPORT_ARGS = $(foreach V,$(REPORTS),-s $(SPARQLDIR)/$V.sparql reports/$V.tmp.tsv)
MAIN_REPORT_FILES = $(foreach V, $(REPORTS), reports/$V.tsv)
ADDITIONAL_REPORT_FILES = reports/semantic-xref-pairs.tsv
#ADDITIONAL_REPORT_FILES = reports/release/mondo-obo-report.yaml reports/release/mondo-owl-report.yaml reports/release/semantic-xref-pairs.tsv
REPORT_FILES = $(MAIN_REPORT_FILES) $(ADDITIONAL_REPORT_FILES)


MAIN_PRODUCTS = $(ONT) $(ONT)-base
MAIN_FILES = $(foreach n,$(MAIN_PRODUCTS), $(n).owl $(n).obo $(n).json)
ARTEFACTS = \
  $(IMPORT_FILES) \
  $(MAIN_FILES) \
  $(REPORT_FILES) \
  $(SUBSET_FILES)

ASSETS = $(MAIN_FILES) $(SUBSET_FILES) ../../README.md

list_main_files:
	echo $(MAIN_FILES)

list_artefacts:
	echo $(ARTEFACTS)
	du -sh $(ARTEFACTS)
%-DU: 
	@test -f $* && du -sh $* || echo "MISSING" $*


all_artefacts: all_reports $(ARTEFACTS)

# ----------------------------------------
# Tests
# ----------------------------------------

#all: test all_imports all_reports all_equivalencies all_subsets imports/equivalencies.obo $(ONT).owl $(ONT).obo $(ONT).json pre/$(ONT).owl pre/$(ONT).obo pre/$(ONT).json extid/$(ONT).owl extid/$(ONT).obo extid/$(ONT).json $(ONT)-merged.owl

test: roundtrip.obo debug.owl mondo-edit.owl sparql_test_edit sparql_test_main_owl sparql_test_main_obo test_nomerge


# ----------------------------------------
# Staging releases
# ----------------------------------------

prepare_release: $(ARTEFACTS)
	rsync -R $^ ../../target
	rsync -R $^ ../..
	cp ../../Changes.md ../../target

prepare_release_direct: 
	rsync -R $(ARTEFACTS) ../../target
	rsync -R $(ARTEFACTS) ../..
	cp ../../Changes.md ../../target

all_includes: $(INCLUDES_OWL)

#OSF_UPLOAD = $(HOME)/repos/osf-cli/venv/bin/osf -p 2qk53 upload
#osf_upload: prepare_release osf_upload_direct
#osf_upload_direct:
#	cd ../.. && $(OSF_UPLOAD) -f -r target/ current/ && $(OSF_UPLOAD) -f -r target/ releases/$(ISODATE)

list_assets:
	ls -alt $(ASSETS)
	echo $(GHVERSION)

check_version_set:
	@test $(GHVERSION)

# e.g. make deploy_release GHVERSION=v2018-10-26
deploy_release: deploy_assets_direct deploy_assets_current

deploy_assets_direct:
	@test $(GHVERSION)
	ls -alt $(ASSETS)
	../utils/make-release-assets.py -c --release $(GHVERSION) $(ASSETS)

deploy_assets_current:
	ls -alt $(ASSETS)
	../utils/make-release-assets.py -c -f --release current $(ASSETS)

# ----------------------------------------
# Main release targets
# ----------------------------------------

ANN = annotate -V $(ONTURI)/releases/`date +%Y-%m-%d`/$@.owl

filtered.obo: $(SRC)
	perl -ne 'print unless (m@^xref: (Orphanet|OMIM|DOID|EFO|NCIT|SCTID|MESH|UMLS):@ && !(m@equivalent@i))' $< | grep -v '^property_value: confidence' | grep -v '^property_value: excluded_subClassOf' | egrep -v 'relationship: disease_has_basis_in_dysfunction_of (hgnc|HGNC|NCBIGene):' > $@.tmp && mv $@.tmp $@
#egrep -v 'MONDO:(subClassOf|superClassOf|relatedTo)' $< > $@

skos.ttl: $(SRC)
	../utils/mk-skos.pl $< > $@

# this appears to be problematic. not all declarations are restored on a save.
#REMOVE_DECLARATIONS = --remove-axioms -t Declaration
REMOVE_DECLARATIONS=

# necessary to remove stray declarations induced by obo2owl;
# we remove declaration axioms for ALL classes;
# all necessary ones are implicitly added back when converting back to OWL
# see: https://github.com/owlcs/owlapi/pull/761
filtered.owl: filtered.obo skos.ttl
	owltools --use-catalog $< $(REMOVE_DECLARATIONS) skos.ttl --merge-support-ontologies -o $@


# perform reasoning on source
# PREVIOUS: SKIP FOR NOW: assume pre-asserted, but run reasoner to check
# note: robot will protect redundant annotated axioms
reasoned.owl: filtered.owl 
	$(ROBOT) reason -T true -x true -X true -i $< -r ELK relax reduce -p false -r ELK $(ANN) -o $@

# merged = reasoned + equivalencies
# TODO: rename this -plus-equivs
merged.owl: reasoned.owl imports/equivalencies.owl
	owltools --use-catalog $^ --merge-support-ontologies -o $@



# PRE-RELEASES: MONDO IDs primary
#
# by default we use Elk to perform a reason-relax-reduce chain
# after that we annotate the ontology with the release versionInfo
$(ONT).owl: merged.owl
	$(ROBOT) annotate -i $< -V $(ONTURI)/releases/`date +%Y-%m-%d`/$(ONT).owl -o $@

# obo is self-contained
$(ONT).obo: reasoned.owl
	owltools --use-catalog $< --remove-imports-declarations --remove-dangling -o -f obo --no-check $@.tmp && $(obo-filter-axiom-header) $@.tmp > $@
$(ONT).json: $(ONT).owl
	owltools --use-catalog $< -o -f json  $(ONT).json.tmp && mv $(ONT).json.tmp $@
#	$(ROBOT) convert -i $< -f json -o $(ONT).json.tmp && mv $(ONT).json.tmp $@

#$(ONT)-atomic.owl: $(ONT).owl
#	owltools --use-catalog $< --remove-imports-declarations --set-ontology-id $(OBO)/$(ONT)/$@ -o $@.tmp && mv $@.tmp $@

# Component module.
# we remove imports and merge in additional assertions
# note: typically component is not pre-reasoned, but this is compex for mondo.
$(ONT)-base.owl: reasoned.owl
	$(OWLTOOLS) --use-catalog $< $(patsubst %,--remove-import-declaration $(OBO)/$(ONT)/imports/%_import.owl, $(ONTOLOGY_IMPORTS))  --merge-imports-closure $(REMOVE_DECLARATIONS) --set-ontology-id $(OBO)/$(ONT)/$@ -o $@.tmp && mv $@.tmp $@

$(ONT)-base.obo: $(ONT)-base.owl
	$(OWL2OBO)
$(ONT)-base.json: $(ONT)-base.owl
	robot convert -i $< -o $@.tmp.json && mv $@.tmp.json $@


$(ONT)-merged.owl: $(ONT).owl
	owltools --use-catalog $< --merge-imports-closure --set-ontology-id $(OBO)/$(ONT)/$@ -o $@.tmp && mv $@.tmp $@

#pre/$(ONT).%: $(ONT).%
#	$(ROBOT) annotate -i $< -V $(ONTURI)/pre/$(ONT).owl -o $@
#pre/$(ONT).json: $(ONT).owl
#	$(ROBOT) annotate -i $< -V $(ONTURI)/pre/$(ONT).owl -o $@

# CURRENT RELEASES: map back to clique leaders
#extid/mondo.owl: mondo.owl
#	owltools --use-catalog $< --reasoner elk --merge-equivalence-sets -s NCIT 20 -s Orphanet 10 -s OMIM 8 -s EFO 6 -s DOID 5 -s MESH 4 -s MONDO 1 --remove-dangling -o $@

#extid/mondo.obo: extid/mondo.owl
#	owltools --use-catalog $< --remove-imports-declarations --remove-dangling -o -f obo --no-check $@.tmp && $(obo-filter-axiom-header) $@.tmp > $@

#$(ONT)-basic.owl: $(ONT).owl
#	owltools --use-catalog $< --remove-imports-declarations --remove-dangling -o $@
#$(ONT)-basic.obo: $(ONT)-basic.owl
#	owltools --use-catalog $<  -o -f obo $(ONT).obo.tmp && mv $(ONT).obo.tmp $@

%.json: %.owl
	owltools --use-catalog $< -o -f json  $@.json.tmp && mv $@.json.tmp $@
#	$(ROBOT) convert -i $< -f json -o $(ONT).json.tmp && mv $(ONT).json.tmp $@

# ensure that inference including equivalencies does not result in merging any classes in MONDO.
# if this fails, the resolution is to look for two MONDO classes with equivalence to the same external class
test_nomerge: mondo.owl
	owltools  --log-error --use-catalog $< --reasoner elk --merge-equivalence-sets -P MONDO -s MONDO 100 --remove-dangling -o $@


# ----------------------------------------
# Inference comparison
# ----------------------------------------
filtered-nr.obo: filtered.owl
	robot relax -i $< reduce -p false -r ELK annotate -O $(OBO)/mondo/$@ -o $@.owl && owltools --use-catalog $@.owl --remove-axiom-annotations -o -f obo --no-check $@.tmp && grep -v ^owl-axioms $@.tmp | obo-grep.pl -r MONDO: - > $@

filtered-nr-reasoned.obo: filtered.owl
	robot relax -i $< reduce -p false -r ELK reason -r ELK annotate -O $(OBO)/mondo/$@ -o $@.owl && owltools --use-catalog $@.owl --remove-axiom-annotations -o -f obo --no-check $@.tmp && grep -v ^owl-axioms $@.tmp | obo-grep.pl -r MONDO: - > $@

reports/reasoner-diff.obo: filtered-nr.obo filtered-nr-reasoned.obo
	obo-simple-diff.pl -l $^ > $@

# ----------------------------------------
# CC-0 MINIMAL
# ----------------------------------------
all_subsets: subsets/mondo-minimal.obo subsets/mondo-minimal.owl subsets/mondo-minimal.json

TRIM_MINIMAL = --remove-imports-declarations --remove-abox --remove-axiom-annotations --remove-annotation-assertions -l -r -p $(OIO)hasDbXref -p $(SKOS)exactMatch  -p $(SKOS)narrowMatch   -p $(SKOS)relatedMatch  -p $(SKOS)broadMatch 
subsets/mondo-minimal.owl: mondo-base.owl imports/equivalencies.owl
	owltools --use-catalog $< $(TRIM_MINIMAL) imports/equivalencies.owl --merge-support-ontologies --set-ontology-id $(OBO)/mondo/$@ -o $@.tmp.owl &&\
	robot annotate -R -i $@.tmp.owl -o $@.tmp2.owl &&\
	owltools $@.tmp2.owl --add-ontology-annotation $(PV_CC0) -o $@

subsets/%.json: subsets/%.owl
	robot convert -i $< -o $@

subsets/%.obo: subsets/%.owl
	robot convert -i $< -o $@.tmp.obo && grep -v ^owl-axioms: $@.tmp.obo > $@ && rm $@.tmp.obo


# ----------------------------------------
# DOSDP Modules
# ----------------------------------------
all_mods: modules/disease_by_location.owl

modules/%.tsv: modules/%.csv
	csv2tsv.py $< $@

modules/%.owl: modules/%.tsv
	dosdp-tools  --obo-prefixes --ontology=../ontology/mondo-edit.obo  --template=../patterns/$*.yaml --outfile=$@ generate --infile=$<


# ----------------------------------------
# Import modules
# ----------------------------------------
# Most ontologies are modularly constructed using portions of other ontologies
# These live in the imports/ folder
# These can be regenerated with make all_imports 

ONTOLOGY_IMPORTS_OWL = $(patsubst %, imports/%_import.owl, $(ONTOLOGY_IMPORTS))
ONTOLOGY_IMPORTS_OBO = $(patsubst %, imports/%_import.obo, $(ONTOLOGY_IMPORTS))
ONTOLOGY_IMPORTS_OWL_ROOTS = $(patsubst %, imports/%_import.owl-roots.tsv, $(ONTOLOGY_IMPORTS))

# Make this target to regenerate ALL
all_imports: all_imports_owl all_imports_obo  all_imports_owl_roots
all_imports_owl: $(ONTOLOGY_IMPORTS_OWL)
all_imports_owl_roots: $(ONTOLOGY_IMPORTS_OWL_ROOTS)
all_imports_obo: $(ONTOLOGY_IMPORTS_OBO)

# Use ROBOT, driven entirely by terms lists NOT from source ontology
imports/%_import.owl: mirror/%.owl imports/%_terms.txt
	ROBOT_JAVA_ARGS=-Xmx10G $(ROBOT) extract -i $< -T imports/$*_terms.txt --method BOT -O $(ONTURI)/$@ -o $@.tmp.owl && robot reason -i $@.tmp.owl && mv $@.tmp.owl $@
.PRECIOUS: imports/%_import.owl

# we use owltools for making the obo file until: https://github.com/ontodev/robot/issues/64
imports/%_import.obo: imports/%_import.owl
	$(OWLTOOLS) $(USECAT) $< -o -f obo --no-check $@.tmp && grep -v ^owl-axioms $@.tmp > $@

edit-merged.owl: $(SRC)
	robot merge -c true -i $< -o $@
imports/seed.txt: edit-merged.owl
	robot query -f tsv -i $< -s ../sparql/classes.sparql $@.tmp && perl -npe 's@^\<@@;s@>$$@@' $@.tmp | sort -u > $@

imports/%_terms.txt: imports/seed.txt
	grep -hi $* $< $@ | sort -u  > $@.tmp && mv $@.tmp $@

# ----------------------------------------
# Release
# ----------------------------------------
# copy from staging area (this directory) to top-level
release: $(ONT).owl $(ONT).obo
	cp $^ $(RELEASEDIR) && cp imports/* $(RELEASEDIR)/imports

mondo-lastbuild.owl:
	curl -L -s $(OBO)/mondo.owl > $@.tmp && mv $@.tmp $@
mondo-lastbuild.obo: 
	curl -L -s $(OBO)/mondo.obo > $@.tmp && mv $@.tmp $@
#mondo-diff.md: mondo-lastbuild.owl 
#	owljs-diff -o $@ $< mondo.owl
mondo-diff.txt: mondo-lastbuild.obo
	obo-simple-diff.pl $< mondo.obo >  $@.tmp && mv $@.tmp $@

# ----------------------------------------
# Editing
# ----------------------------------------

td:
	echo $(ISODATE)
# NOTE: no longer removes redundant
INF: mondo-edit.obo
	owltools --use-catalog  mondo-edit.obo --assert-inferred-subclass-axioms --always-assert-super-classes --keepRedundant --markIsInferred --merge-axiom-annotations -o -f obo $@.tmp && grep -v ^owl-axioms $@.tmp | perl -npe 's@is_inferred="true"@source="OWLReasoner:Elk-$(ISODATE)"@' | egrep -v '^relationship:.*is_inferred' | obo-grep.pl --neg -r 'id: (UBERON|CL|ENVO|NCBITaxon|HP|PATO|CHEBI):' -  > $@

# normalize obo file
# note we use owltools-compat to ensure standard ordering
NORM: mondo-edit.obo
	owltools --use-catalog  mondo-edit.obo --merge-axiom-annotations -o -f obo $@.norm && robot convert -i $@.norm -o $@.tmp.obo && mv $@.tmp.obo $@

# tests roundtripping
roundtrip.obo: mondo-edit.obo
	owltools --use-catalog  mondo-edit.obo -o -f obo $@.tmp && mv $@.tmp $@



NEWAXTEST: mondo-edit.owl new.owl
#	owltools --use-catalog  $^ --merge-support-ontologies --run-reasoner -r elk -u -m z.owl -o $@
	owltools --use-catalog  $^ --merge-support-ontologies --assert-inferred-subclass-axioms --always-assert-super-classes --markIsInferred --removeRedundant  --merge-axiom-annotations -o -f obo $@.tmp && grep -v ^owl-axioms $@.tmp | egrep -v '^relationship:.*is_inferred' | obo-grep.pl --neg -r 'id: (UBERON|CL|ENVO|NCBITaxon|HP|PATO|CHEBI):' -  > $@

# ----------------------------------------
# Sparql queries: Q/C
# ----------------------------------------

# these live in the ../sparql directory, and have suffix -violation.sparql
# adding the name here will make the violation check live
CORE_CHECKS =     subclass-cycle equivalent-classes trailing-whitespace owldef-self-reference xref-syntax nolabels undeclared-synonym-type undeclared-subset same-label 
EDIT_CHECKS =     $(CORE_CHECKS)
MAIN_OWL_CHECKS = $(CORE_CHECKS) no-superclass
MAIN_OBO_CHECKS = $(CORE_CHECKS) no-superclass

QSRC = $(SRC)-noimports.owl

$(QSRC): $(SRC)
	owltools --use-catalog $< --remove-imports-declarations -o $@

# run all violation checks on edit file
sparql_test_edit: $(QSRC)
	robot verify -i $< --queries $(foreach V,$(EDIT_CHECKS),$(SPARQLDIR)/$V-violation.sparql) -O reports/edit/ && touch $@

sparql_test_main_owl: $(ONT).owl
	robot verify -i $< --queries $(foreach V,$(MAIN_OWL_CHECKS),$(SPARQLDIR)/$V-violation.sparql) -O reports/edit/ && touch $@

sparql_test_main_obo: $(ONT).obo
	robot verify -i $< --queries $(foreach V,$(MAIN_OBO_CHECKS),$(SPARQLDIR)/$V-violation.sparql) -O reports/edit/ && touch $@


PL2SPARQL = ../plq/pq-mondo
../sparql/%.sparql:
	 $(PL2SPARQL) -v  "$*" > $@.tmp && mv $@.tmp $@

reports/pql-%.tsv: mondo-edit.owl
	 $(PL2SPARQL) -f tsv -v -i $< -e -l "$*" > $@.tmp && mv $@.tmp $@

reports/bg-%.tsv: 
	 $(PL2SPARQL) -f tsv -l "$*" > $@.tmp && mv $@.tmp $@

reports/$(Q)-pqlx-$(Ont).tsv: mondo-edit.owl
	 $(PL2SPARQL) -f tsv -v -i $< -i mirror/$(Ont).owl -e -l "$(Q)" > $@.tmp && mv $@.tmp $@

reports/pq-%.tsv: mondo-edit.owl
	 $(PL2SPARQL) -f tsv -v -i $< -e  "$*" > $@.tmp && mv $@.tmp $@

reports/equiv-obs-%.tsv:
	pl2sparql -e -A void.ttl -i mondo_edit -i equivs -i mirror/$*.owl -c ../plq/mondo_queries.pro -l equivalent_to_deprecated > $@
reports/equiv-replaced-by-%.tsv:
	pl2sparql -e -A void.ttl -i mondo_edit -i equivs -i mirror/$*.owl -c ../plq/mondo_queries.pro -l equivalent_to_replaced_by > $@

reports/proxy-merge.tsv: mondo.owl
	./mq -i all proxy_merge -f tsv -l > $@.tmp && sort -u $@.tmp > $@
#	pl2sparql -f tsv -A void.ttl -e -i all -c ../plq/proxy_merge.pro proxy_merge > $@.tmp && mv $@.tmp $@

# the main OWL file will have 'pseudo-roots' caused by the fact that external classes
# are referenced; restrict the report to those with labels
%.owl-roots.tsv: %.owl
	robot query -f tsv -i $< -s $(SPARQLDIR)/root-labeled-classes.sparql $@
%.obo-roots.tsv: %.obo
	robot query -f tsv -i $< -s $(SPARQLDIR)/root-classes.sparql $@

prefixes: mondo-edit.obo
	grep ^xref $< | cut -f2 -d : | count-occ.pl

# ----------------------------------------
# Sparql queries: Reports
# ----------------------------------------


all_reports: all_reports_1 fix_reports

all_reports_1: mondo.owl $(ADDITIONAL_REPORT_FILES)
	robot query -f tsv -i $< $(REPORT_ARGS) && touch $@

# Will be retired when we have https://github.com/ontodev/robot/issues/176
fix_reports: $(foreach V, $(REPORTS), fix-report-$V)
fix-report-%:
	../utils/tidy-sparql-output.pl reports/$*.tmp.tsv > reports/$*.tsv


# TODO: remove hacky script once we improve robot output: https://github.com/ontodev/robot/issues/176
reports-edit/%.tsv: $(SRC) $(SPARQLDIR)/%.sparql
	robot query -f tsv -i $< -s $(SPARQLDIR)/$*.sparql $@.tmp && ../utils/tidy-sparql-output.pl $@.tmp > $@

reports/%.tsv: mondo.owl
	robot query -f tsv -i $< -s $(SPARQLDIR)/$*.sparql $@.tmp && ../utils/tidy-sparql-output.pl $@.tmp > $@

# TODO: replace with sparql
reports/semantic-xref-pairs.tsv: d2p.pro mondo-base.obo
	blip-findall -i mondo-base.obo -i $< -i ../../scratch/mondo-ncit-finding.pro -consult ../utils/xreftbl_maker.pro xrefrow/5 -no_pred > $@

RR=$(HOME)/repos/rctauber/robot/bin/robot report --fail-on none
reports/edit/report.tsv: $(SRC)
	$(RR) -i $<  -o $@.tmp && mv $@.tmp $@ || mv $@.tmp $@
reports/release/mondo-obo-report.tsv: mondo.obo
	$(RR) -i $<  -o $@.tmp && mv $@.tmp $@ || mv $@.tmp $@

reports/release/mondo-owl-report.tsv: mondo.owl
	$(RR) -i $<  -o $@.tmp && mv $@.tmp $@ || mv $@.tmp $@

%-report.tsv: %
	$(RR) -i $<  -o $@.tmp && mv $@.tmp $@ || mv $@.tmp $@

common_map.tsv:
	blip-findall -debug index -goal ix -i imports/equivalencies.obo -i d2p.pro  -r mondoe -c ../utils/all_genetic.pro common_to_mondo/2 -label -no_pred -use_tabs | cut -f1,3,4 > $@

# ----------------------------------------
# Sparql constructs
# ----------------------------------------

# generate includes from sparql CONSTRUCT queries;
# these can then be merged in to the main ontology
#include-%.owl: ../sparql/construct-%.sparql $(SRC)
#	robot merge -i $(SRC) query -c $< $@.tmp.ttl -f ttl && robot annotate -i $@.tmp.ttl -O $(OBO)/mondo/$@ -o $@

imports/external_definitions.owl: ../sparql/construct-embedded-definition.sparql $(SRC)
	robot merge -i $(SRC) query -c $< $@.tmp.ttl -f ttl && robot annotate -i $@.tmp.ttl -O $(OBO)/mondo/$@ -o $@

FIX_URIS_IN_PLACE = perl -pi -ne $(FIX_URI_EXPR)

all_equivalencies: imports/equivalencies.owl  imports/equivalencies.obo imports/equivalencies.json
imports/equivalencies.owl: ../sparql/construct-ecs-from-xrefs.sparql $(SRC)
	robot merge -i $(SRC) query -c $< $@.tmp.ttl -f ttl && $(FIX_URIS_IN_PLACE)  $@.tmp.ttl && robot annotate -i $@.tmp.ttl -a $(PV_CC0) -O $(OBO)/mondo/$@ -o $@
imports/equivalencies.obo: imports/equivalencies.owl
	robot convert -i $< -o $@

clean_imports: $(patsubst %, clean-mirror-%, $(ONTOLOGY_IMPORTS))
clean-mirror-%: 
	test -f mirror/%.owl && rm mirror/%.owl || echo 'no mirror file'

#imports/equivalencies.owl: $(SRC)
#	../utils/xrefs2axioms.pl $< > $@.tmp && owltools $@.tmp -o $@

# ----------------------------------------
# Merge constructs
# ----------------------------------------
mondo-premerge-%.owl: mondo.owl mirror/%.owl
	owltools --use-catalog $^ --merge-support-ontologies -o $@.tmp && mv $@.tmp $@

mondo-plus-%.owl: mondo-premerge-%.owl
	owltools --use-catalog $< --reasoner elk --merge-equivalence-sets -P MONDO -s MONDO 100 --remove-dangling -o $@.tmp && mv $@.tmp $@

mondo-compat-%: mondo.owl mirror/%.owl
	owltools --use-catalog $^ --add-imports-from-supports --run-reasoner -r elk -u -m $@-debug.owl && touch $@


# ----------------------------------------
# External ontologies
# ----------------------------------------

XD = gard ncit-disease obo_orphanet icd10 doid medgen-disease-extract snomed mesh
XD_OWL = $(patsubst %, mirror/%.owl, $(XD))
mirror/xdisease-all.owl: $(patsubst %, mirror/%.owl, $(XD))
	owltools $^ --merge-support-ontologies -o $@

mirror/xdisease-labels.owl: mirror/xdisease-all.owl
	robot query --format ttl -c ../sparql/construct-labels.sparql $@ -i $<

mirror/labels:  $(patsubst %, mirror/%-labels.owl, $(XD))
mirror/%-labels.owl: mirror/%.owl
	robot query --format ttl -c ../sparql/construct-labels.sparql $@ -i $<

mirror/%-raw.owl: mirror/%.owl
	$(OWLTOOLS) $< --remove-axioms-about -v 

mirror/omim-src.ttl: 
	wget --no-check-certificate http://data.monarchinitiative.org/ttl/omim.ttl -O $@
.PRECIOUS: mirror/omim.ttl

mirror/omim-src.owl: mirror/omim-src.ttl
	owltools $< --set-ontology-id $(OBO)/mondo/$@ -o $@
mirror/omim-src.obo: mirror/omim-src.owl
	owltools $< -o -f obo $@.tmp && grep -v ^owl-axioms $@.tmp | ../utils/fix-omim.pl  > $@

mirror/omim.obo: mirror/omim-src.obo
	obo-grep.pl --neg -r '(equivalent_to|is_a: SO|property_value: RO:0002524)' $< | obo-grep.pl -r 'id: OMIM' -   > $@.tmp && mv $@.tmp $@
mirror/omim.owl: mirror/omim.obo
	owltools $< -o $@



trigger-mirror:
	touch $@

# clone remote ontology locally, perfoming some excision of relations and annotations
mirror/%.owl: 
	$(OWLTOOLS) $(OBO)/$*.owl --remove-annotation-assertions -l -s -d -r --remove-dangling-annotations --remove-axiom-annotations  -o $@
.PRECIOUS: mirror/%.owl

mirror/ncbitaxon.owl: 
	wget --no-check-certificate $(OBO)/ncbitaxon.obo -O $@.tmp && mv $@.tmp $@ && touch $@
.PRECIOUS: mirror/ncbitaxon.owl

# hp.owl currently contains many stray root classes
mirror/hp.obo: 
	wget --no-check-certificate $(OBO)/hp.obo -O $@.tmp && mv $@.tmp $@ && touch $@
.PRECIOUS: mirror/hp.obo
mirror/hp.owl:  mirror/hp.obo
	$(OWLTOOLS) $< -o $@.tmp && mv $@.tmp $@
.PRECIOUS: mirror/hp.owl

mirror/chebi.owl: 
	wget --no-check-certificate $(OBO)/chebi.obo -O $@.tmp.obo && owltools $@.tmp.obo --remove-annotation-assertions -l -s -d --remove-dangling-annotations --remove-axiom-annotations  -o $@ && touch $@
.PRECIOUS: mirror/chebi.owl

mirror/mfoem.owl: 
	$(OWLTOOLS) $(OBO)/mfoem.owl --remove-annotation-assertions -l -s -d --make-subset-by-properties -f BFO:0000050 // --remove-dangling-annotations  -o $@
.PRECIOUS: mirror/mfoem.owl

# we have to roundtrip some ontologies through obo for obscure reasons see https://github.com/monarch-initiative/mondo/issues/237
mirror/doid.owl:
	wget --no-check-certificate $(OBO)/doid.owl -O doid1.owl && owltools doid1.owl -o -f obo doid1.obo && owltools doid1.obo -o $@


mirror/neoplasm-core.owl:
	wget --no-check-certificate $(OBO)/ncit/neoplasm-core.owl -O $@ && touch $@

mirror/ncit.owl:
	wget --no-check-certificate $(OBO)/ncit.owl -O $@ && touch $@

mirror/cl.owl:
	wget --no-check-certificate $(OBO)/cl/cl-base.owl -O $@ && touch $@

mirror/ncit-disease.uris: mirror/ncit.owl
	robot query -i $< -s ../sparql/ncit-subclass-of-disease.sparql $@

mirror/ncit-disease.ids: mirror/ncit-disease.uris
	perl -npe 's@http://purl.obolibrary.org/obo/NCIT_@NCIT:@' $< > $@

# Make a disease subset; ensure axioms are relaxed
mirror/ncit-disease.owl: mirror/ncit.owl mirror/ncit-disease.uris
	robot extract -i $< -T mirror/ncit-disease.uris --method BOT relax -o $@

mirror/ncit-%-xrefs.ttl: mirror/ncit.owl
	robot query -c ../sparql/construct-$*-xrefs-from-ncit.sparql $@ -i $<

mirror/merge-ncit-xrefs.owl: mirror/ncit.owl mirror/ncit-icdo-xrefs.ttl mirror/ncit-umls-xrefs.ttl
	owltools $^ --merge-support-ontologies -o $@

mirror/ncit-disease.obo: mirror/ncit-disease.owl
	owltools $< -o -f obo $@
#	robot convert -i $< -o $@

mirror/rdo.obo:
	wget  --no-check-certificate ftp://ftp.rgd.mcw.edu/pub/ontology/disease/RDO.obo -O $@ && touch $@

mirror/medgen-disease-extract.owl: mirror/medgen-disease-extract.obo
	owltools $< -o $@.tmp && perl -npe $(FIX_URI_EXPR) $@.tmp > $@

mirror/dipper-%.ttl:
	wget --no-check-certificate https://data.monarchinitiative.org/ttl/$*.ttl -O $@.tmp && perl -npe 's@http://www.genenames.org/cgi-bin/gene_symbol_report\\?hgnc_id=@http://identifiers.org/hgnc/@g' $@.tmp > $@

mirror/dipper-%.obo: mirror/dipper-%.ttl
	robot convert -i $< -o $@.tmp.obo && grep -v ^owl-axioms $@.tmp.obo > $@

mirror/hgnc.owl: mirror/dipper-hgnc.ttl
	robot query --format ttl -c ../sparql/construct-hgnc.sparql $@ -i $<
#	robot query construct
#	owltools $< --remove-axioms -t EquivalentClasses -o $@
#	owltools $< --remove-dangling -o $@
#	owltools $< --merge-equivalence-sets -s http://identifiers.org/hgnc/ 20 -o $@


mirror/omia.ttl: 
	wget --no-check-certificate http://data.monarchinitiative.org/ttl/omia.ttl -O $@ && touch $@
.PRECIOUS: mirror/omia.ttl

mirror/omia-1.owl: mirror/omia.ttl
	owltools $< --set-ontology-id $(OBO)/mondo/$@ -o $@
.PRECIOUS: mirror/omia-1.owl

mirror/omia-2.obo: mirror/omia-1.owl
	owltools $< -o -f obo $@.tmp && grep -v ^owl-axioms $@.tmp | grep -v ^property_value | perl -npe 's@xref: OMIM:@relationship: RO:HOM0000001 OMIM:@' | perl -npe 's@is_a: MESH:@relationship: RO:HOM0000001 MESH:@' | obo-grep.pl --neg -r 'id: http' - | ../utils/fix-omia-names.pl > $@.tmp.obo && robot reduce -i $@.tmp.obo -o $@

mirror/omia.owl: mirror/omia-2.obo imports/equivalencies.owl
	owltools $^ --add-imports-from-supports --reasoner elk --merge-equivalence-sets -s MONDO 20 --remove-imports-declarations  -o $@

mirror/omia.obo: mirror/omia.owl
	owltools --use-catalog $< -o -f obo $@

mirror/efo-src.owl:
	wget --no-check-certificate http://www.ebi.ac.uk/efo/efo.owl -O $@ && touch $@

mirror/efo.owl: mirror/efo-src.owl
	owltools $< $(EFO2OBO_OPTS) -o $@.tmp && perl -npe $(EFO2OBO_PERL) $@.tmp > $@

mirror/efo.obo: mirror/efo.owl
	owltools $< -o -f obo --no-check $@.tmp && perl ../utils/fix-efo.pl $@.tmp > $@

mirror/efo-disease.uris: mirror/efo.owl
	robot query -i $< -s ../sparql/efo-subclass-of-disease.sparql $@

# Make a disease subset; ensure axioms are relaxed
mirror/efo-disease.owl: mirror/efo.owl mirror/efo-disease.uris
	robot extract -i $< -T mirror/efo-disease.uris --method BOT relax -o $@

mirror/efo-disease.obo: mirror/efo-disease.owl
	owltools $< -o -f obo --no-check $@.tmp && perl ../utils/fix-efo.pl $@.tmp > $@

# ----------------------------------------
# Indirect inferences
# ----------------------------------------
imports/indirect.owl: mondo-edit.obo
	robot reason -r elk -i $< query  --format ttl  -c ../sparql/construct-indirect-subclass-of.sparql $@
imports/tag-indirect.owl: mondo-edit.obo
	robot reason -r elk -i $< query  --format ttl  -c ../sparql/construct-tag-indirect-subclass-of.sparql $@


# ----------------------------------------
# Rewritten ext axioms
# ----------------------------------------

compare_all: compare_all_nd compare_all_d
compare_all_nd: $(patsubst %, compare/axioms-%-nd.obo, $(XD))
compare_all_d: $(patsubst %, compare/axioms-%-d.obo, $(XD))

# Generates synonym from labels
compare/lsyns-%.owl: mirror/%.owl
	robot query -i $<  --format ttl -c ../sparql/construct-related-synonym-from-label.sparql $@
.PRECIOUS: compare/lsyns-%.owl

# Merges in the syns generated as above step
compare/%-plus-lsyns.owl: mirror/%.owl compare/lsyns-%.owl
	owltools $^ --merge-support-ontologies -o $@
.PRECIOUS: compare/%-plus-lsyns.owl

# logical merge, no duplicate axioms
compare/axioms-%-nd.owl: compare/%-plus-lsyns.owl mondo-edit.obo
	owltools --use-catalog mondo-edit.obo --copy-axioms -l -m imports/equivalencies.owl -s $< -n --set-ontology-id $(OBO)/mondo/$@ -o $@
.PRECIOUS: compare/axioms-%.owl

# duplicate axioms, for provenance tagging
compare/axioms-%-d.owl: compare/%-plus-lsyns.owl mondo-edit.obo
	owltools --use-catalog mondo-edit.obo --copy-axioms -I -D -m imports/equivalencies.owl -s $< -n --set-ontology-id $(OBO)/mondo/$@ -o $@
.PRECIOUS: compare/axioms-%.owl

# bring in strictly new literals in annotation axioms
compare/ann-axioms-%-new.owl: compare/%-plus-lsyns.owl mondo-edit.obo
	owltools --use-catalog mondo-edit.obo --copy-axioms -x -m imports/equivalencies.owl -s $< -n --set-ontology-id $(OBO)/mondo/$@ -o $@
.PRECIOUS: compare/axioms-%.owl

compare/ann-axioms-ncit-disease-new.owl: mirror/ncit-disease.owl mondo-edit.obo
	owltools --use-catalog mondo-edit.obo --copy-axioms -x -m imports/equivalencies.owl -s $< -n --set-ontology-id $(OBO)/mondo/$@ -o $@
.PRECIOUS: compare/axioms-%.owl

# all axioms
compare/axioms-%-all.owl: compare/%-plus-lsyns.owl mondo-edit.obo
	owltools --use-catalog mondo-edit.obo --copy-axioms -d -m imports/equivalencies.owl -s $< -n --set-ontology-id $(OBO)/mondo/$@ -o $@
.PRECIOUS: compare/axioms-%.owl

# tag axioms that are asserted but could be inferred
compare/entailed.obo: mondo-edit.obo
	owltools --use-catalog $< --remove-axiom-annotations --reasoner elk --silence-elk --tag-entailed-axioms --set-ontology-id $(OBO)/mondo/$@ -o -f obo $@.tmp && perl -npe 's@{source="direct"}@{source="MONDO:Redundant"}@' $@.tmp > $@

compare/entailed-isa.obo: compare/entailed.obo
	obo-filter-tags.pl -t is_a -t id  | obo-grep.pl -r is_a - | grep -v ^import > $@

compare/unique-isa.tsv: compare/entailed-isa.owl
	 ./mq -i $< report unique_isa > $@

compare/main.obo: mondo-edit.obo
	owltools --use-catalog $< --remove-axiom-annotations  --set-ontology-id $(OBO)/mondo/$@ -o -f obo $@.tmp && perl -npe 's@{source="direct"}@{source="MONDO:Redundant"}@' $@.tmp > $@

#compare/axioms-%.owl:
#	owltools --use-catalog mondo-edit.obo --copy-axioms -l -d -m imports/equivalencies.owl -s mirror/$*.owl -n --set-ontology-id $(OBO)/mondo/$@ -o $@
#.PRECIOUS: compare/axioms-%.owl


compare/axioms-%.obo: compare/axioms-%.owl
	owltools $< -o -f obo --no-check $@
compare/ann-axioms-%.obo: compare/ann-axioms-%.owl
	owltools $< -o -f obo --no-check $@

# construct an OWL file that expresses the fact that every child term must be distinct from its superclas
# C1 SubClassOf P ==> exists C2 : C2 subClassOf P, C1 DisjointWith C2
disjoint_sibs.owl: $(SRC)
	robot query --format ttl -c ../sparql/construct-disjoint-siblings.sparql $@ -i $<

testcombo-%: mondo-edit.obo disjoint_sibs.owl imports/equivalencies.owl mirror/%.owl disjoint_sibs.owl
	owltools --use-catalog  $^ --merge-support-ontologies --run-reasoner -r elk -u -m compare/bad-$*.owl

debug.owl: mondo-edit.obo disjoint_sibs.owl imports/equivalencies.owl
	owltools --no-logging --use-catalog  $^ --merge-support-ontologies --run-reasoner -r elk -u -m $@ | grep -v ^INFERENCE
debug2.owl: mondo-edit.obo disjoint_sibs.owl imports/equivalencies.owl
	owltools --use-catalog  $^ --merge-support-ontologies --reasoner elk --merge-equivalence-sets -s MONDO 100 --run-reasoner -r elk -u -m $@ | grep -v ^INFERENCE

debug-prod.owl: mondo.owl disjoint_sibs.owl imports/equivalencies.owl
	owltools --use-catalog  $^ --merge-support-ontologies --run-reasoner -r elk -u -m $@ | grep -v ^INFERENCE

# ----------------------------------------
# Lexical mapping
# ----------------------------------------

# align against self (*not* external ontologies)
mappings.tsv: mondo.json
	ontobio-lexmap.py $< > $@.tmp && mv $@.tmp $@ && perl -pi -ne 's@http://purl.obolibrary.org/obo/MONDO_@MONDO:@g' $@

%-mappings.tsv: mondo.json mirror/%.json
	ontobio-lexmap.py $^ -u unmapped-$@ > $@.tmp && mv $@.tmp $@

hp-mappings.tsv: mondo.json
	ontobio-lexmap.py hp $< > $@.tmp && mv $@.tmp $@

mesh-mappings.tsv: mondo.json mesh.json
	ontobio-lexmap.py $^ > $@.tmp && mv $@.tmp $@

gard-mappings.tsv: mondo-edit.json gard.json
	ontobio-lexmap.py $^ -u unmapped-$@ > $@.tmp && mv $@.tmp $@

medgen-mappings.tsv: mondo-edit.json mirror/medgen-disease-extract.obo
	ontobio-lexmap.py -v -e $^ -u unmapped-$@ > $@.tmp && mv $@.tmp $@

neoplasm-mappings.tsv: mondo-edit.json neoplasm-core.json
	ontobio-lexmap.py -v -e $^ -u unmapped-$@ > $@.tmp && mv $@.tmp $@
ncit-mappings.tsv: mondo-edit.json mirror/ncit-disease.json
	ontobio-lexmap.py -v -e $^ -u unmapped-$@ > $@.tmp && mv $@.tmp $@

ptable-%.tsv: %-mappings.tsv
	cat $< | p.df  'df[df.right_novel==True]' 'df[["left", "right","pr_subClassOf","pr_superClassOf","pr_equivalentTo","pr_other"]]' -o csv -i tsv | grep -v '^"left' | grep MONDO > $@.tmp && csv2tsv.py $@.tmp $@

%-mappings-best.tsv: %-mappings.tsv
	cat $< | p.df  'df[["left", "left_label", "right", "right_label", "reciprocal_score"]]' -o csv -i tsv | grep -v '^"left' | grep MONDO > $@.tmp && mv $@.tmp $@

%-mappings-filtered.tsv: %-mappings.tsv
	cat $< | p.df  'df[df.reciprocal_score==4]' 'df[df.left_match_type=="label"]' 'df[df.right_match_type=="label"]' 'df[["left", "left_label", "right", "right_label"]]'  -i tsv -o tsv  > $@.tmp && mv $@.tmp $@


unlikely.md: linked-rpt.md
	./unlikely-axiom-report.pl $< | head -200 > $@

modules/equiv-xrefs.obo: mondo-edit.obo
	obo-filter-tags.pl -t id -t xref $<   | egrep '^($$|\[Term|id:|xref:.*equivalentTo)' > $@

mim2gene_medgen:
	wget ftp://ftp.ncbi.nih.gov/gene/DATA/mim2gene_medgen && touch $@

# g2g
mim2gene.txt:
	curl -L -s https://omim.org/static/omim/data/mim2gene.txt  > $@.tmp && mv $@.tmp $@

diseases_to_genes.txt:
	curl -L -s http://compbio.charite.de/jenkins/job/hpo.annotations.monthly/lastSuccessfulBuild/artifact/annotation/diseases_to_genes.txt > $@.tmp && mv $@.tmp $@

omim2medgen.obo: mim2gene_medgen
	grep phenotype $<  | cut -f1,5 | perl -npe 's@^@OMIM:@;s@\t@\tUMLS:@' | grep UMLS:C | tbl2obolinks.pl --rel xref --source NCBI:mim2gene_medline - > $@

# NEW: uses rdf_matcher
# **IMPORTANT*: remember to clear tmp/ dir for fresh start
# mondo_queries requires for prefixes
all_unique.tsv:
	rdfmatch -p MONDO -l -c  ../plq/mondo_queries.pro  -X tmp -A void.ttl -f tsv -v -i all -i skos.ttl unique_match > $@

lexrules-%.pro:
	test -d tmp-$* || mkdir -p tmp-$*
	rdfmatch --ontA MONDO --ontB $(shell echo $* | tr a-z A-Z) -l -c  ../plq/mondo_queries.pro  -X tmp-$* -A void.ttl -f tsv -v -i mondo_edit -i equivs -i mirror/$*.owl -i skos.ttl learn > $@
.PRECIOUS: lexrules-%.pro

match-%.tsv: lexrules-%.pro
	rdfmatch -p MONDO -l -c  ../plq/mondo_queries.pro  -X tmp-$* -A void.ttl -f tsv -v -i mondo_edit -i equivs -i mirror/$*.owl -i skos.ttl classify $< > $@

all_unique_fresh: clean_tmp all_unique.tsv
clean_tmp:
	rm tmp/*

# ----------------------------------------
# Metaclasses
# ----------------------------------------
disorder-by-%.tsv: mondo-edit.obo
	blip-findall -r uberonp -r cell -r go -i $< "class_cdef(C,cdef('MONDO:0000001',[disease_has_location=A])),subclassRT(A,'$(subst _,:,$*)')" -select C-A -no_pred -use_tabs -label > $@.tmp && sort -u $@.tmp > $@

disorder-by-anatomical-region.tsv: disorder-by-UBERON_0000475.tsv
	cp $< $@
disorder-by-anatomical-system.tsv: disorder-by-UBERON_0000467.tsv
	cp $< $@
disorder-by-cell.tsv: disorder-by-CL_0000000.tsv
	cp $< $@

# ----------------------------------------
# Anns
# ----------------------------------------
phenotype_annotation.tab:
	wget http://compbio.charite.de/jenkins/job/hpo.annotations/lastStableBuild/artifact/misc/phenotype_annotation.tab -O $@ && touch $@

phenotype_annotation_nu.tab:
	wget http://compbio.charite.de/jenkins/job/hpo.annotations.2018/lastSuccessfulBuild/artifact/misc_2018/phenotype.hpoa -O $@ && touch $@

g2p.tsv:
	wget http://compbio.charite.de/jenkins/job/hpo.annotations.monthly/lastStableBuild/artifact/annotation/ALL_SOURCES_ALL_FREQUENCIES_genes_to_phenotype.txt -O $@ && touch $@

d2p.tsv: phenotype_annotation.tab
	../utils/phenotab2tbl.pl $< > $@

# ----------------------------------------
# Hacky
# ----------------------------------------

mondox.obo: mondo-edit.obo
	perl -npe 's@source="MONDO:(equivalentto|subclassof|superclassof|other|relatedto)@semantics="MONDO:$$1@i' $< > $@

check: mondo-edit.obo
	$(HOME)/repos/go-ontology/src/util/check-obo-for-standard-release.pl --disable-xrf-abbs-check $<

mondo-edit.owl: mondo-edit.obo
	robot convert -i $< -o $@

d2taxon-wd.tsv:
	pq-wd -f tsv  "has_cause(D,T),doid_id(D,DX),ncbitaxon_id(T,TX)" "x(DX,TX)" > $@.tmp && perl -npe 's@\t@\tNCBITaxon:@' $@.tmp > $@

d2symp-wd.tsv:
	pq-wd -f tsv  "symptoms(D,S),doid_id(D,DX),umls_id(S,SX),enlabel(S,SN)" "x(DX,SX,SN)" > $@.tmp && perl -npe 's@\tC@\tUMLS:C@' $@.tmp > $@

# ----------------------------------------
# Kboom
# ----------------------------------------

# new
weights.tsv:
	pl2sparql -f tsv -e -i mondo-edit.owl  -c ../plq/kboom_weights.pro w > $@

weights-mg.tsv:
	pl2sparql -f tsv -e -i mondo-edit.owl -i mirror/medgen-disease-extract.owl  -c ../plq/kboom_weights.pro w > $@

ptable.tsv: weights.tsv
	../utils/softmax-weights.py $< > $@

#ptable.tsv: mondo-edit.obo
#	../utils/xrefs2ptable.pl $< > $@.tmp && mv $@.tmp $@

seed.owl: mondo-edit.obo ext.obo
	owltools --use-catalog $^ --remove-imports-declarations --merge-support-ontologies -o $@

#seed-ncit.owl: mondo-edit.obo imports/equivalencies-ncit.obo neoplasm-core-nd.obo
#	owltools --use-catalog $^ --remove-imports-declarations --merge-support-ontologies -o $@
seed-ncit.owl: mondo-edit.obo imports/equivalencies.owl mirror/ncit-disease.owl
	owltools --use-catalog $^ --remove-imports-declarations --merge-support-ontologies --remove-disjoints -o $@

ext.obo: ptable.tsv
	perl -ne '($$goo, $$x) = split;print "$$x\t$$x\n"' $< | tbl2obo.pl  > $@

bridge.owl: ptable.tsv seed.owl
	kboom --experimental  --splitSize 50 --max 4 -m linked-rpt.md -j linked-rpt.json -n -o $@ -t $^

bridge-%.owl: ptable-%.tsv seed-%.owl
	kboom --experimental  --splitSize 50 --max 6 -m linked-rpt-$*.md -j linked-rpt-$*.json -n -o $@ -t $^

# ----------------------------------------
# HACK: extraction
# ----------------------------------------
v-%.png:
	tbl2p -p id $* > $*.pro && \
	blip ontol-query -r mondoeq -r mondo -r medic -r snomed_tidy -r icd10 -r neoplasm -r ordop -r disease -consult extract.pro -i $*.pro -query "id(X),q(X,ID)" -to obo > v-$*.obo && \
	owltools v-$*.obo --remove-dangling -o -f obo v-$*-trim.obo && \
	blip ontol-subset -u ontol_config_do -i v-$*-trim.obo -idfile $* -down 5 -to png > $@

../../scratch/mondo-ncit-finding.tsv:
	blip-findall -i imports/equivalencies.obo  -i mondo.obo -r neoplasm "(R='NCIT:R115';R='NCIT:R108'),parent(X,R,Y),equivalent_class(M,X)" -select "x(M,Y)" -no_pred -label -use_tabs  > $@.tmp && sort -u $@.tmp > $@

#../../scratch/mondo-ncit-finding.tsv:


# ----------------------------------------
# TEST
# ----------------------------------------

ncit-eq.obo: ncit-kboom-curated.obo
	perl -npe 's@\{@{source="MONDO:equivalentTo", @' $< > $@

# ----------------------------------------
# BLAZEGRAPH
# ----------------------------------------
# (experimental)
#
# For query and reporting purposes, it is useful to have a blazegraph
# instance containing mondo plus external ontologies.
#
# The blazegraph instance can run as a docker container

BGVERSION = 2.1.4
BGPORT=8921
bg: bg-run pause bg-load

# folder to stage OWL to be loaded into BG
bg-data:
	mkdir $@

# sync data folder; mondo + external ontologies
bg-sync: mondo.owl  $(XD_OWL)
	rm bg-data/* && cp $^ bg-data

# start up a docker image with blazegraph and local configuration
bg-run: bg-data
	docker run --name blazegraph -d -p $(BGPORT):8080 -v $(PWD)/blazegraph/RWStore.properties:/RWStore.properties -v $(PWD)/bg-data/:/data lyrasis/blazegraph:$(BGVERSION)

pause:
	sleep 1

bg-load: bg-data bg-sync bg-load-direct

bg-load-direct:
	curl -X POST --data-binary @blazegraph/dataloader.txt   --header 'Content-Type:text/plain'   http://localhost:$(BGPORT)/bigdata/dataloader

bg-stop:
	docker kill blazegraph; docker rm blazegraph

bg-clean:
	rm bg-data/*

succeed:
	echo make succeeded
