Initial Commit with 4.2 Version of Drug Bank Data
This commit is contained in:
commit
4c4c9dace8
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,92 @@
|
|||
package drugs
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"github.com/sahilm/fuzzy"
|
||||
"io/ioutil"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type DrugInteraction struct {
|
||||
ID string
|
||||
}
|
||||
|
||||
type PathWay struct {
|
||||
ID string
|
||||
Drugs []string
|
||||
}
|
||||
|
||||
type Salt struct {
|
||||
ID string
|
||||
Name string
|
||||
}
|
||||
|
||||
type DrugDatabase struct {
|
||||
drugs []DrugInfo
|
||||
index map[string]int
|
||||
keys []string
|
||||
}
|
||||
|
||||
type Classification struct {
|
||||
Description string
|
||||
DirectParent string
|
||||
Kingdom string
|
||||
SuperClass string
|
||||
Class string
|
||||
SubClass string
|
||||
}
|
||||
|
||||
type DrugInfo struct {
|
||||
ID string
|
||||
Name string
|
||||
DrugType string
|
||||
HalfLife string
|
||||
Description string
|
||||
Classification Classification
|
||||
Indication string
|
||||
Toxicity string
|
||||
MechanismOfAction string
|
||||
Pharmacodynamics string
|
||||
Absorption string
|
||||
Interactions []DrugInteraction
|
||||
Salts []Salt
|
||||
Groups map[string]bool
|
||||
Pathways []PathWay
|
||||
}
|
||||
|
||||
func (dd * DrugDatabase) generateIndex() {
|
||||
dd.index = make(map[string]int)
|
||||
for i,drug := range dd.drugs {
|
||||
dd.index[strings.ToLower(drug.ID)] = i
|
||||
dd.index[strings.ToLower(drug.Name)] = i
|
||||
dd.keys = append(dd.keys, strings.ToLower(drug.ID))
|
||||
dd.keys = append(dd.keys, strings.ToLower(drug.Name))
|
||||
}
|
||||
}
|
||||
|
||||
func (dd * DrugDatabase) Lookup(query string) (DrugInfo) {
|
||||
index,ok := dd.index[strings.ToLower(query)]
|
||||
if ok {
|
||||
return dd.drugs[index]
|
||||
}
|
||||
matches := fuzzy.Find(query, dd.keys)
|
||||
for _,match := range matches {
|
||||
return dd.drugs[dd.index[match.Str]]
|
||||
}
|
||||
return DrugInfo{}
|
||||
}
|
||||
|
||||
func LoadDatabaseJSON(path string) DrugDatabase {
|
||||
data,err := ioutil.ReadFile(path)
|
||||
if err == nil {
|
||||
var db []DrugInfo
|
||||
err := json.Unmarshal(data, &db)
|
||||
if err == nil {
|
||||
var ddb DrugDatabase
|
||||
ddb.drugs = db
|
||||
ddb.generateIndex()
|
||||
return ddb
|
||||
}
|
||||
}
|
||||
return DrugDatabase{}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package drugs
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestQueryDatabase(t *testing.T) {
|
||||
drugsdb := LoadDatabase("./drugbank.xml")
|
||||
t.Logf("Query by ID: %v", drugsdb.QueryDatabaseByID("DB00083"))
|
||||
t.Logf("Query by ID: %v", drugsdb.QueryDatabaseByName("Ibuprofen"))
|
||||
for i := 50; i < 60; i++ {
|
||||
t.Logf("Query by Name: %v", drugsdb.QueryDatabaseByIndex(i))
|
||||
}
|
||||
}
|
||||
|
||||
func TestQueryJson(t *testing.T) {
|
||||
ddb := LoadDatabaseJSON("./drugs.4.2.db")
|
||||
t.Logf("Query by ID: %v", ddb.Lookup("DB00083"))
|
||||
t.Logf("Query by ID: %v", ddb.Lookup("ibupren"))
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
module git.openprivacy.ca/sarah/sigil/cmd/sigilbot/drugs
|
||||
|
||||
go 1.12
|
||||
|
||||
require (
|
||||
github.com/antchfx/xmlquery v1.1.0
|
||||
github.com/antchfx/xpath v1.1.0 // indirect
|
||||
github.com/sahilm/fuzzy v0.1.0
|
||||
golang.org/x/net v0.0.0-20191027233614-53de4c7853b5 // indirect
|
||||
)
|
|
@ -0,0 +1,12 @@
|
|||
github.com/antchfx/xmlquery v1.1.0 h1:vj0kZ1y3Q6my4AV+a9xbWrMYzubw+84zuiKgvfV8vb8=
|
||||
github.com/antchfx/xmlquery v1.1.0/go.mod h1:/+CnyD/DzHRnv2eRxrVbieRU/FIF6N0C+7oTtyUtCKk=
|
||||
github.com/antchfx/xpath v1.1.0 h1:mJTvYpiHvxNQRD4Lbfin/FodHVCHh2a5KrOFr4ZxMOI=
|
||||
github.com/antchfx/xpath v1.1.0/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
|
||||
github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI=
|
||||
github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/net v0.0.0-20191027233614-53de4c7853b5 h1:IX2aat8xHKk1JAYuDPcTTEMfRaGQh2eHrTcrlp3KJi0=
|
||||
golang.org/x/net v0.0.0-20191027233614-53de4c7853b5/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
@ -0,0 +1,96 @@
|
|||
package drugs
|
||||
|
||||
import (
|
||||
"github.com/antchfx/xmlquery"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
|
||||
func LoadDatabase(path string) XMLDrugsDatabase {
|
||||
f, err := os.Open(path)
|
||||
if err == nil {
|
||||
doc, err := xmlquery.Parse(f)
|
||||
if err == nil {
|
||||
return XMLDrugsDatabase{doc}
|
||||
}
|
||||
}
|
||||
return XMLDrugsDatabase{}
|
||||
}
|
||||
|
||||
|
||||
func populate_druginfo(node *xmlquery.Node) (di DrugInfo) {
|
||||
di.ID = node.SelectElement("drugbank-id").InnerText()
|
||||
di.Name = node.SelectElement("name").InnerText()
|
||||
di.HalfLife = node.SelectElement("half-life").InnerText()
|
||||
di.Description = node.SelectElement("description").InnerText()
|
||||
di.Indication = node.SelectElement("indication").InnerText()
|
||||
di.Pharmacodynamics = node.SelectElement("pharmacodynamics").InnerText()
|
||||
di.Toxicity = node.SelectElement("toxicity").InnerText()
|
||||
di.Absorption = node.SelectElement("absorption").InnerText()
|
||||
di.MechanismOfAction = node.SelectElement("mechanism-of-action").InnerText()
|
||||
|
||||
interactions := node.SelectElement("drug-interactions").SelectElements("drug-interaction")
|
||||
for _, interaction := range interactions {
|
||||
di.Interactions = append(di.Interactions, DrugInteraction{interaction.SelectElement("drugbank-id").InnerText()})
|
||||
}
|
||||
|
||||
di.DrugType = node.SelectAttr("type")
|
||||
|
||||
classification := node.SelectElement("classification")
|
||||
if classification != nil {
|
||||
di.Classification = Classification{
|
||||
classification.SelectElement("description").InnerText(),
|
||||
classification.SelectElement("direct-parent").InnerText(),
|
||||
classification.SelectElement("kingdom").InnerText(),
|
||||
classification.SelectElement("superclass").InnerText(),
|
||||
classification.SelectElement("class").InnerText(),
|
||||
classification.SelectElement("subclass").InnerText()}
|
||||
}
|
||||
groups := node.SelectElement("groups").SelectElements("group")
|
||||
di.Groups = make(map[string]bool)
|
||||
for _, group := range groups {
|
||||
di.Groups[group.InnerText()] = true
|
||||
}
|
||||
|
||||
salts := node.SelectElement("salts").SelectElements("salt")
|
||||
for _, salt := range salts {
|
||||
di.Salts = append(di.Salts, Salt{salt.SelectElement("drugbank-id").InnerText(),
|
||||
salt.SelectElement("name").InnerText()})
|
||||
}
|
||||
|
||||
pathways := node.SelectElement("pathways").SelectElements("pathway")
|
||||
for _, pathway := range pathways {
|
||||
pathwaysdrugs := []string{}
|
||||
drugs := pathway.SelectElement("drugs").SelectElements("drug")
|
||||
for _,drug := range drugs {
|
||||
pathwaysdrugs = append(pathwaysdrugs, drug.SelectElement("drugbank-id").InnerText())
|
||||
}
|
||||
di.Pathways = append(di.Pathways, PathWay{pathway.SelectElement("smpdb-id").InnerText(), pathwaysdrugs})
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
type XMLDrugsDatabase struct {
|
||||
root *xmlquery.Node
|
||||
}
|
||||
|
||||
func (dd XMLDrugsDatabase) QueryDatabaseByID(ID string) (di DrugInfo) {
|
||||
result := xmlquery.FindOne(dd.root, "//drugbank/drug[./drugbank-id='"+ID+"']")
|
||||
return populate_druginfo(result)
|
||||
}
|
||||
|
||||
func (dd XMLDrugsDatabase) QueryDatabaseByIndex(index int) (di DrugInfo) {
|
||||
result := xmlquery.FindOne(dd.root, "//drugbank/drug["+strconv.Itoa(index)+"]")
|
||||
return populate_druginfo(result)
|
||||
}
|
||||
|
||||
func (dd XMLDrugsDatabase) QueryDatabaseByName(name string) (di DrugInfo) {
|
||||
result := xmlquery.Find(dd.root, "//drugbank/drug[./name='"+name+"']")
|
||||
if len(result) < 1 {
|
||||
return
|
||||
}
|
||||
return populate_druginfo(result[0])
|
||||
}
|
Loading…
Reference in New Issue