HOME/Articles/

python_example

Article Outline

Example Python program python_example.py For Python version 2.x. To test your Python version use:

python --version

Modules

  • import sys
  • import argparse
  • import json
  • import requests

Classes

  • class Usage(argparse.Action):
  • class DGIAPI:

Methods

  • def call(self, parser, namespace, values, option_string=None):
  • def parse_args():
  • def init(self, args):
  • def run_workflow(self):
  • def create_request(self):
  • def post_request(self):
  • def print_response(self):

Code

Python example

#!/usr/bin/env python

#This example uses the 'requests' library
#To install requests:
#   sudo pip install requests
#If you don't have pip:
#   see http://www.pip-installer.org/en/latest/installing.html
#       or
#   wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
#   sudo python get-pip.py

import sys
import argparse
import json
import requests

class Usage(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        print "Usage Examples:"
        print "python python_example.py --help"
        print "python python_example.py --genes='FLT3'"
        print "python python_example.py --genes='FLT3,EGFR,KRAS'"
        print "python python_example.py --genes='FLT3,EGFR' --interaction_sources='TALC,TEND'"
        print "python python_example.py --genes='FLT3,EGFR' --gene_categories='KINASE'"
        print "python python_example.py --genes='FLT3,EGFR' --interaction_types='inhibitor'"
        print "python python_example.py --genes='FLT3,EGFR' --source_trust_levels='Expert curated'"
        print "python python_example.py --genes='FLT3,EGFR' --antineoplastic_only"
        print "python python_example.py --genes='FLT3,EGFR,KRAS' --interaction_sources='TALC,TEND,MyCancerGenome' --gene_categories='KINASE' --interaction_types='inhibitor' --antineoplastic_only"
        sys.exit(0)

def parse_args():
    parser = argparse.ArgumentParser(description = "A Python example for using the DGIdb API", epilog = "For complete API documentation refer to http://dgidb.genome.wustl.edu/api")
    parser.add_argument("-g", "--genes", help="list of gene symbols(required). Use official Entrez symbols for best results", dest="genes", required = True)
    parser.add_argument("-is", "--interaction_sources", help="Limit results to those from particular data sources. e.g. 'DrugBank', 'PharmGKB', 'TALC', 'TEND', 'TTD', 'MyCancerGenome')", dest="interaction_sources")
    parser.add_argument("-it", "--interaction_types", help="Limit results to interactions with drugs that have a particular mechanism of action. e.g. 'inhibitor', 'antibody', etc", dest="interaction_types")
    parser.add_argument("-gc", "--gene_categories", help="Limit results to genes with a particular druggable gene type. e.g. 'KINASE', 'ION CHANNEL', etc", dest="gene_categories")
    parser.add_argument("-stl", "--source_trust_levels", help="Limit results based on trust level of the interaction source. e.g. 'Expert curated' or 'Non-curated", dest = "source_trust_levels")
    parser.add_argument("-ano", "--antineoplastic_only", help="Limit results to anti-cancer drugs only", dest="antineoplastic_only", action = 'store_true')
    parser.add_argument("-u", "--usage", action = Usage, type=bool)
    return parser.parse_args()

class DGIAPI:
    'API Example class for DGI API.'
    domain = 'http://dgidb.genome.wustl.edu/'
    api_path = '/api/v1/interactions.json'
    def __init__(self, args):
        self.genes = args.genes
        self.interaction_sources = args.interaction_sources
        self.interaction_types = args.interaction_types
        self.gene_categories = args.gene_categories
        self.source_trust_levels = args.source_trust_levels
        self.antineoplastic_only = args.antineoplastic_only
    def run_workflow(self):
        self.create_request()
        self.post_request()
        self.print_response()
    def create_request(self):
        self.request = "http://dgidb.genome.wustl.edu/api/v1/interactions.json?genes=FLT1&drug_types=antineoplastic&interaction_sources=TALC"
        self.payload = {}
        if(self.genes):
            self.payload['genes'] = self.genes
        if(self.interaction_sources):
            self.payload['interaction_sources'] = self.interaction_sources
        if(self.gene_categories):
            self.payload['gene_categories'] = self.gene_categories
        if(self.interaction_types):
            self.payload['interaction_types'] = self.interaction_types
        if(self.source_trust_levels):
            self.payload['source_trust_levels'] = self.source_trust_levels
        if(self.antineoplastic_only):
            self.payload['drug_types'] = 'antineoplastic'
    def post_request(self):
        self.request = DGIAPI.domain + DGIAPI.api_path
        self.response = requests.post(self.request, data = self.payload)
    def print_response(self):
        response = json.loads(self.response.content)
        matches = response['matchedTerms']
        for match in matches:
            print "gene_name\tdrug_name\tinteraction_type\tsource\tgene_categories"
            gene = match['geneName']
            categories = match['geneCategories']
            categories.sort()
            joined_categories = ",".join(categories)
            for interaction in match['interactions']:
                source = interaction['source']
                drug = interaction['drugName']
                interaction_type = interaction['interactionType']
                print gene + "\t" + drug + "\t" + interaction_type + "\t" + source + "\t" + joined_categories.lower()
        for unmatched in response['unmatchedTerms']:
            print "Unmatched search term: " + unmatched['searchTerm']
            print "Possible suggestions: " + ",".join(unmatched['suggestions'])

if __name__ == '__main__':
    args = parse_args()
    da = DGIAPI(args)
    da.run_workflow()