Skip to content

Commit

Permalink
Merge pull request #26 from mcwdsi/update-labels
Browse files Browse the repository at this point in the history
Update Labels
  • Loading branch information
jamesaoverton authored Jun 14, 2024
2 parents b092a5b + 3194082 commit 655f8ed
Show file tree
Hide file tree
Showing 11 changed files with 62,240 additions and 62,033 deletions.
31 changes: 26 additions & 5 deletions src/ontology/dron.Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,29 @@ $(TMPDIR)/dron.db: $(SCRIPTSDIR)/create-dron-tables.sql $(SCRIPTSDIR)/load-dron-
rm -f $@
sqlite3 $@ < $<
sqlite3 $@ < $(word 2,$^)

# Load ChEBI into SQLite using LDTab.
$(TMPDIR)/chebi.db: $(SCRIPTSDIR)/prefix.tsv $(TMPDIR)/mirror-chebi.owl | $(TMPDIR)/ldtab.jar
$(eval DB=$@)
rm -f $@
$(LDTAB) init $(DB) --table chebi
$(LDTAB) prefix $(DB) $<
$(LDTAB) import $(DB) $(word 2,$^) --table chebi
sqlite3 $(DB) "CREATE INDEX idx_chebi_subject ON chebi(subject)"
sqlite3 $(DB) "CREATE INDEX idx_chebi_predicate ON chebi(predicate)"
sqlite3 $(DB) "CREATE INDEX idx_chebi_object ON chebi(object)"

# Create a SQLite database for RxNorm and load data from tmp/rxnorm/*.RRF.
$(TMPDIR)/rxnorm.db: $(SCRIPTSDIR)/create-rxnorm-tables.sql $(SCRIPTSDIR)/load-rxnorm-tables.sql $(SCRIPTSDIR)/index-rxnorm-tables.sql | $(TMPDIR)/
rm -f $@
sqlite3 $@ < $<
sqlite3 $@ < $(word 2,$^) 2> /dev/null
sqlite3 $@ < $(word 3,$^)

.PHONY: update-labels
update-labels: $(TMPDIR)/dron.db $(TMPDIR)/chebi.db $(TMPDIR)/rxnorm.db $(SCRIPTSDIR)/update-labels.sql $(SCRIPTSDIR)/save-dron-tables.sql
sqlite3 < $(word 4,$^)
cd $(TEMPLATEDIR) && sqlite3 ../ontology/$< < ../ontology/$(word 5,$^)

# Convert DrOn template tables to LDTab format tables.
$(TMPDIR)/ldtab.db: $(TMPDIR)/dron.db $(SCRIPTSDIR)/prefix.tsv $(SCRIPTSDIR)/convert-dron-ldtab.sql | $(TMPDIR)/ldtab.jar
Expand Down Expand Up @@ -76,7 +99,7 @@ $(TMPDIR)/reverse/:
$(TMPDIR)/reverse/dron-%.owl: components.bk/dron-%.owl | $(TMPDIR)/reverse/
$(ROBOT) convert -i $< -o $@

$(TMPDIR)/reverse.db: $(SCRIPTSDIR)/prefix.tsv $(SCRIPTSDIR)/create-dron-tables.sql $(SCRIPTSDIR)/convert-ldtab-dron.sql $(SCRIPTSDIR)/save-dron-tables.sql $(TMPDIR)/reverse/dron-ingredient.owl $(TMPDIR)/reverse/dron-rxnorm.owl $(TMPDIR)/reverse/dron-ndc.owl | $(TMPDIR)/ldtab.jar
$(TMPDIR)/reverse.db: $(SCRIPTSDIR)/prefix.tsv $(SCRIPTSDIR)/create-dron-tables.sql $(SCRIPTSDIR)/convert-ldtab-dron.sql $(TMPDIR)/reverse/dron-ingredient.owl $(TMPDIR)/reverse/dron-rxnorm.owl $(TMPDIR)/reverse/dron-ndc.owl | $(TMPDIR)/ldtab.jar
$(eval DB=$@)
rm -f $(DB)
$(LDTAB) init $(DB) --table dron_ingredient
Expand All @@ -89,11 +112,9 @@ $(TMPDIR)/reverse.db: $(SCRIPTSDIR)/prefix.tsv $(SCRIPTSDIR)/create-dron-tables.
$(LDTAB) import $(DB) --table dron_ndc $(TMPDIR)/reverse/dron-ndc.owl

.PHONY: reverse
reverse: $(TMPDIR)/reverse.db
# Convert LDTab tables to DrOn templates
sqlite3 $(DB) < $(word 3,$^)
reverse: $(TMPDIR)/reverse.db $(SCRIPTSDIR)/save-dron-tables.sql
# Save template tables to TSV
cd $(TMPDIR)/reverse/ && sqlite3 ../../$(DB) < ../../$(word 4,$^)
cd $(TMPDIR)/reverse/ && sqlite3 ../../$< < ../../$(word 2,$^)
# Copy to src/templates/
cp $(TMPDIR)/reverse/*.tsv $(TEMPLATEDIR)

Expand Down
67 changes: 67 additions & 0 deletions src/scripts/create-rxnorm-tables.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
-- Create RxNorm tables in a SQLite database.
-- Adapted from their scripts/mysql/Table_scripts_mysql_rxn.sql

-- DROP TABLE IF EXISTS RXNCONSO;
CREATE TABLE RXNCONSO
(
RXCUI varchar(8) NOT NULL,
LAT varchar (3) DEFAULT 'ENG' NOT NULL,
TS varchar (1),
LUI varchar(8),
STT varchar (3),
SUI varchar (8),
ISPREF varchar (1),
RXAUI varchar(8) NOT NULL,
SAUI varchar (50),
SCUI varchar (50),
SDUI varchar (50),
SAB varchar (20) NOT NULL,
TTY varchar (20) NOT NULL,
CODE varchar (50) NOT NULL,
STR varchar (3000) NOT NULL,
SRL varchar (10),
SUPPRESS varchar (1),
CVF varchar(50)
)
;

-- DROP TABLE IF EXISTS RXNSAT;
CREATE TABLE RXNSAT
(
RXCUI varchar(8) ,
LUI varchar(8),
SUI varchar(8),
RXAUI varchar(9),
STYPE varchar (50),
CODE varchar (50),
ATUI varchar(11),
SATUI varchar (50),
ATN varchar (1000) NOT NULL,
SAB varchar (20) NOT NULL,
ATV varchar (4000),
SUPPRESS varchar (1),
CVF varchar (50)
)
;

-- DROP TABLE IF EXISTS RXNREL;
CREATE TABLE RXNREL
(
RXCUI1 varchar(8) ,
RXAUI1 varchar(8),
STYPE1 varchar(50),
REL varchar(4) ,
RXCUI2 varchar(8) ,
RXAUI2 varchar(8),
STYPE2 varchar(50),
RELA varchar(100) ,
RUI varchar(10),
SRUI varchar(50),
SAB varchar(20) NOT NULL,
SL varchar(1000),
DIR varchar(1),
RG varchar(10),
SUPPRESS varchar(1),
CVF varchar(50)
)
;
25 changes: 25 additions & 0 deletions src/scripts/fetch-rxnorm.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/bin/sh

RXNORM=${1:?Please enter an RxNorm_full version: MMDDYYY}
UMLS_APIKEY=${UMLS_APIKEY:-2}
UMLS_APIKEY=${UMLS_APIKEY:?Please provide a UMLS API key https://uts.nlm.nih.gov/uts/edit-profile}

fail() {
echo "ERROR: $@"
exit 1
}

ROOT=$(git rev-parse --show-toplevel) || fail "Not a git repository"
DIR="${ROOT}/src/ontology/tmp/rxnorm"
FILE="${DIR}/RxNorm_full_${RXNORM}.zip"

mkdir -p "${DIR}" || fail "Could not create ${DIR}"

echo "Downloading RxNorm_full_${RXNORM}"
curl -L -o "${FILE}" --fail-with-body \
"https://uts-ws.nlm.nih.gov/download?url=https://download.nlm.nih.gov/umls/kss/rxnorm/RxNorm_full_${RXNORM}.zip&apiKey=${UMLS_APIKEY}" \
|| fail "Could not download ${FILE}"

echo "Extracting RRF files to ${DIR}/"
unzip -j -d "${DIR}" "${FILE}" rrf/* \
|| fail "Could not unzip ${FILE}"
32 changes: 32 additions & 0 deletions src/scripts/index-rxnorm-tables.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
-- Create RxNorm tables in a SQLite database.
-- Adapted from their scripts/mysql/Table_scripts_mysql_rxn.sql

DROP INDEX IF EXISTS IDX_RXNCONSO_RXCUI;
CREATE INDEX IDX_RXNCONSO_RXCUI ON RXNCONSO(RXCUI);

DROP INDEX IF EXISTS IDX_RXNCONSO_RXAUI;
CREATE INDEX IDX_RXNCONSO_RXAUI ON RXNCONSO(RXAUI);

DROP INDEX IF EXISTS IDX_RXNCONSO_SAB;
CREATE INDEX IDX_RXNCONSO_SAB ON RXNCONSO(SAB);

DROP INDEX IF EXISTS IDX_RXNSAT_RXCUI;
CREATE INDEX IDX_RXNSAT_RXCUI ON RXNSAT(RXCUI);

DROP INDEX IF EXISTS IDX_RXNSAT_SAB;
CREATE INDEX IDX_RXNSAT_SAB ON RXNSAT(SAB);

DROP INDEX IF EXISTS IDX_RXNREL_RXCUI1;
CREATE INDEX IDX_RXNREL_RXCUI1 ON RXNREL(RXCUI1);

DROP INDEX IF EXISTS IDX_RXNREL_RXCUI2;
CREATE INDEX IDX_RXNREL_RXCUI2 ON RXNREL(RXCUI2);

DROP INDEX IF EXISTS IDX_RXNREL_RXAUI1;
CREATE INDEX IDX_RXNREL_RXAUI1 ON RXNREL(RXAUI1);

DROP INDEX IF EXISTS IDX_RXNREL_RXAUI2;
CREATE INDEX IDX_RXNREL_RXAUI2 ON RXNREL(RXAUI2);

DROP INDEX IF EXISTS IDX_RXNREL_RELA;
CREATE INDEX IDX_RXNREL_RELA ON RXNREL(RELA);
10 changes: 10 additions & 0 deletions src/scripts/load-rxnorm-tables.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
-- Load RxNorm RRF tables into SQLite.

PRAGMA foreign_keys = ON;

.mode csv
.separator |

.import tmp/rxnorm/RXNCONSO.RRF RXNCONSO
.import tmp/rxnorm/RXNSAT.RRF RXNSAT
.import tmp/rxnorm/RXNREL.RRF RXNREL
1 change: 1 addition & 0 deletions src/scripts/prefix.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ xsd http://www.w3.org/2001/XMLSchema#
rdfs http://www.w3.org/2000/01/rdf-schema#
dcterms http://purl.org/dc/terms/
obo http://purl.obolibrary.org/obo/
oio http://www.geneontology.org/formats/oboInOwl#
BFO http://purl.obolibrary.org/obo/BFO_
CHEBI http://purl.obolibrary.org/obo/CHEBI_
DRON http://purl.obolibrary.org/obo/DRON_
Expand Down
51 changes: 51 additions & 0 deletions src/scripts/update-labels.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
ATTACH 'tmp/dron.db' AS dron;
ATTACH 'tmp/chebi.db' AS chebi;
ATTACH 'tmp/rxnorm.db' AS rxnorm;

-- Update labels from ChEBI.
UPDATE dron.ingredient AS d
SET label = c.object
FROM chebi.chebi AS c
WHERE d.curie LIKE 'CHEBI:%'
AND d.curie = c.subject
AND c.predicate = 'rdfs:label'
AND d.label != c.object;

-- Update ingredient labels from RxNorm
UPDATE dron.ingredient AS d
SET label = r.STR
FROM rxnorm.RXNCONSO AS r
WHERE d.curie LIKE 'DRON:%'
AND d.rxcui = r.RXCUI
AND r.SAB = 'RXNORM'
AND r.TTY = 'IN';

-- clinical_drug_form
CREATE INDEX IF NOT EXISTS dron.clinical_drug_form_rxcui
ON clinical_drug_form(rxcui);
UPDATE dron.clinical_drug_form AS d
SET label = r.STR
FROM rxnorm.RXNCONSO AS r
WHERE d.rxcui = r.RXCUI
AND r.SAB = 'RXNORM'
AND r.TTY = 'SCDF';

-- clinical_drug
CREATE INDEX IF NOT EXISTS dron.clinical_drug_rxcui
ON clinical_drug(rxcui);
UPDATE dron.clinical_drug AS d
SET label = r.STR
FROM rxnorm.RXNCONSO AS r
WHERE d.rxcui = r.RXCUI
AND r.SAB = 'RXNORM'
AND r.TTY = 'SCD';

-- branded_drug
CREATE INDEX IF NOT EXISTS dron.branded_drug_rxcui
ON branded_drug(rxcui);
UPDATE dron.branded_drug AS d
SET label = r.STR
FROM rxnorm.RXNCONSO AS r
WHERE d.rxcui = r.RXCUI
AND r.SAB = 'RXNORM'
AND r.TTY = 'SBD';
Loading

0 comments on commit 655f8ed

Please sign in to comment.