source: web/IbidasAtomicServicesTemp.py @ 241

Last change on this file since 241 was 241, checked in by pvkouteren, 11 years ago

Added transfac methods, removed bogus methods.

File size: 16.8 KB
Line 
1''' SOAP specific '''
2from soaplib.service import soapmethod
3from soaplib.serializers.primitive import *
4#from model.ibidasitem import IbidasItem
5from model.IbidasSerializers import *
6from IbidasMessage import IbidasMessage
7import time
8import config
9from container import postgres
10import web.IbidasMessage
11from modules.statistics.Hypergeometric import Hypergeometric
12
13class IbidasAtomicServices:
14    """
15    The IbidasAtomicServices class provides a number of services which can be
16    called from either SOAP or XMLRPC without the need for any session
17    information.
18    """
19    def __init__(self):
20        _ConfigDefault = {
21            "database.name":                "ibidas_test",
22            "database.user":                "bla",
23            "database.password":            "bla",
24            "database.host":                "127.0.0.1",
25            "database.port":                "5432",
26        }
27
28        iconfig = config.loadConfig('ibidas.ini',_ConfigDefault)
29        self.cd = postgres.openConnection(iconfig['database.host'],\
30                    iconfig['database.port'],iconfig['database.name'],\
31                    iconfig['database.user'],iconfig['database.password']).getConSet()
32
33    """
34    Helper functions
35    """
36
37    def _tableToSerializer(self, table):
38        objects = []
39        containerobject = getattr(self.cd, table)
40        fields = containerobject.fields.name().tolist()
41        for i in range(len(containerobject)):
42            object = web.IbidasMessage.name_types['ibidas'+table]()
43            for field in fields:
44                setattr(object, field, getattr(containerobject[i], field)())
45            objects.append(object)
46        return objects
47   
48    def _tablecontainerToSerializer(self, containerobject, table):
49        objects = []
50        fields = containerobject.fields.name().tolist()
51        print "fields = " + str(fields)
52        print "containerobject = " + str(containerobject)
53        for i in range(len(containerobject)):
54            print "length of containerobject is " + str(len(containerobject))
55            #try:
56            object = web.IbidasMessage.name_types['ibidas'+table]()
57            print "object = " + str(object)
58            print "created new serializer for " + table
59            for field in fields:
60                print str(containerobject[i])
61                print "field: " + str(field) + " -> " + str(getattr(containerobject[i], field))
62                setattr(object, field, getattr(containerobject[i], field)())
63                print "just set attribute " + str(field) + " for this object to " + str(getattr(containerobject[i], field))
64            objects.append(object)
65            #except e:
66            #    print "caught exception??"
67            #    pass # table doesn't exist in name_types (e.g. set_pg_group)
68        print "returning objects. Objects = " + str(objects)
69        return objects
70
71    def _getItemIDs(self, ts):
72        return self.cd.item[_.display_name.within(*ts)].select(_.item_id)().tolist()
73   
74    def _loadTransfac(self):
75        if not hasattr(self, 'transfac'):
76            from parsers.transfac import TransfacFactorParser, TransfacGeneParser, TransfacSiteParser
77            self.transfac = {}
78            # load factors
79            transfac_dir = '/Users/patrick/Documents/Workspace/ibidas/data/transfac/'
80            tfp = TransfacFactorParser(transfac_dir + 'factor.dat')
81            tfp.parse(toCont = True)
82            self.transfac['factor'] = tfp
83           
84            tgp = TransfacGeneParser(transfac_dir + 'gene.dat')
85            tgp.parse(toCont = True)
86            self.transfac['gene'] = tgp
87           
88            tsp = TransfacSiteParser(transfac_dir + 'site.dat')
89            tsp.parse(toCont = True)
90            self.transfac['site'] = tsp
91           
92   
93    """
94    Test
95    """
96
97    @soapmethod(_returns=String)
98    def foo(self):
99        """ Function to test the connection, returns a string. (Guess which..) """
100        time.sleep(5)
101        return "bar"
102         
103    """
104    General
105    """
106   
107    @soapmethod(_returns=Array(IbidasSet))
108    def listDatasets(self):
109        """ Return a list of all available datasets in Ibidas """
110        return self._tableToSerializer('set')
111   
112    @soapmethod(Integer,_returns=IbidasMessage)
113    def getDataset(self, id):
114        """ Return all data associated with a particular set """
115        im = IbidasMessage()
116        for tabledata in self.cd._getTables():
117            print "table = " + tabledata['name']
118            containerobject = getattr(self.cd, tabledata['name'])
119            print "containerobject: " + str(containerobject)
120            if tabledata['name'] == 'set':
121                data = self._tablecontainerToSerializer(containerobject[_.set_id == id], tabledata['name'])
122            elif tabledata['name'] == 'set_pg_group':
123                # discard this one
124                data = []
125            else:
126                data = self._tablecontainerToSerializer(containerobject[_.source_id == id], tabledata['name'])
127            for dt in data:
128                print "adding " + str(dt) + " to message"
129                im.add(dt)
130        #print "Gathered message"
131        print str(im) 
132        return im
133   
134    @soapmethod(Array(String), String, String, _returns=Array(Array(String)))
135    def convert(self, id_list, type_in, type_out):
136        """ Convert a list of identifiers to a list of desired identifiers """
137        result = []
138        for identifier in id_list:
139            i_id = self.cd.item_prop_accession[_.value == identifier].select(_.item_id)()
140            if isinstance(i_id, int):
141                i_res = self.cd.item_prop_accession[_.item_id == i_id].select(_.value)()
142                identifiers = i_res.tolist()
143            else:
144                identifiers = []
145            result.append(identifiers)
146        return result
147   
148    @soapmethod(Array(String), _returns=Array(Integer))
149    def getIbidasIDs(self, names):
150        """ Return the IbidasItem identifiers for display names """
151        print "names: " + str(names)
152        return self._getItemIDs(names)
153         
154           
155    """
156    MSigDB
157    """
158     
159    @soapmethod(Array(String), _returns=Array(Array(String)))
160    def getMSigDBGroups(self, gene_list):
161        """ Get the MSigDB groups of the genes in the provided list """
162        result = []
163        for gene_id in gene_list:
164            g_res = self.cd.item_prop_term.join(self.cd.item, 'item_id', 'item_id').join(self.cd.term, 'term_id', 'term_id')[_.display_name == gene_id].select('identifier')()
165            if isinstance(g_res, str):
166                # we have only one result
167                a_res = [g_res]
168            else:
169                a_res = g_res.tolist()
170            result.append(a_res)
171        return result
172   
173    @soapmethod(Array(String), _returns=Array(Array(String)))
174    def getMSigDBGroupGenes(self, group_list):
175        """ Get the MSigDB genes of the groups in the provided list """
176        result = []
177        for group_id in group_list:
178            g_res = self.cd.item_prop_term.join(self.cd.item, 'item_id', 'item_id').join(self.cd.term, 'term_id', 'term_id')[_.identifier == group_id].select('display_name')()
179            if isinstance(g_res, str):
180                # we have only one result
181                a_res = [g_res]
182            else:
183                a_res = g_res.tolist()
184            result.append(a_res)
185        return result
186   
187    @soapmethod(Integer, _returns=Array(String))
188    def getMSigDBCategoryGenes(self, category_id):
189        """ Get all genes from a particular MSigDB category """
190        result = []
191        g_res = self.cd.item_prop_term.join(self.cd.item, 'item_id', 'item_id').join(self.cd.term, 'term_id', 'term_id')[_.identifier.like("c"+str(category_id)+":%")].select('display_name')()
192        return g_res
193 
194    """
195    By DB
196    """
197   
198    @soapmethod(Array(String), Array(String), String, Float, _returns=Boolean)
199    def geneEnrichmentTestByDB(self, top, back, reference, threshold):
200        """ Returns whether a geneset is enriched """
201        result = self.hypergeometricTestByDB(top, back, reference)
202        return result < threshold
203   
204    @soapmethod(Array(String), Array(String), String, _returns=Float)
205    def hypergeometricTestByDB(self, top, back, reference):
206        """ Returns the value of the gene enrichment (hypergeometric) test """
207        #print "calculateGeneEnrichment(" + str(top) + ", " + str(back) + ", " + str(reference) + ")"
208        top_ids  = self._getItemIDs(top)
209        #print "top_ids: " + str(top_ids)
210        back_ids = self._getItemIDs(back)
211        #print "back_ids: " + str(back_ids)
212        set_id = self.cd.set[_.name.like(reference)].select(_.set_id)()
213        #print "set_id: " + str(set_id)
214        set_ids = self.cd.item_prop_term[_.source_id == set_id].select(_.item_id)().tolist()
215        h = Hypergeometric(top_ids, back_ids, set_ids)
216        return h.calculate()
217   
218    @soapmethod(Array(String), Array(String), String, Float, _returns=Array(Integer))
219    def returnEnrichedGenesByDB(self, top, back, reference, threshold):
220        """ Returns a list of IbidasItem IDs if they are enriched """
221        if self.geneEnrichmentTestByDB(top, back, reference, threshold):
222            return self.getIbidasIDs(top)
223        else:
224            return None
225   
226    @soapmethod(Array(Array(String)), Array(Array(String)), Array(String), Float, _returns=Array(Array(Array(Boolean))))
227    def geneEnrichmentTestsByDBs(self, tops, backs, references, threshold):
228        """ Do multiple enrichment tests with multiple lists and multiple backgrounds on multiple reference sets """
229        tbsrs = []
230        for top in tops:   
231            tbrs = []
232            for back in backs:
233                reference_array = []
234                for reference in references:
235                    reference_array.append(self.geneEnrichmentTestByDB(top, back, reference, threshold))
236                tbrs.append(reference_array)
237            tbsrs.append(tbrs)
238        return tbsrs
239   
240    """
241    By List
242    """
243   
244    @soapmethod(Array(String), Array(String), Array(String), Float, _returns=Boolean)
245    def geneEnrichmentTestByList(self, top, back, reference, threshold):
246        """ Returns whether a geneset is enriched """
247        result = self.hypergeometricTestByList(top, back, reference)
248        return result < threshold
249   
250    @soapmethod(Array(String), Array(String), Array(String), _returns=Float)
251    def hypergeometricTestByList(self, top, back, reference):
252        """ Returns the value of the hypergeometric test """
253        print "reference is " + str(reference)
254        top_ids = self._getItemIDs(top)
255        print "top_ids: " + str(top_ids)       
256        back_ids = self._getItemIDs(back)
257        print "back_ids: " + str(back_ids)
258        ref_ids = self._getItemIDs(reference)
259        print "ref_ids: " + str(ref_ids)
260        h = Hypergeometric(top_ids, back_ids, ref_ids)
261        return h.calculate()
262       
263    @soapmethod(Array(Array(String)), Array(Array(String)), Array(Array(String)), Float, _returns=Array(Array(Array(Boolean))))
264    def geneEnrichmentTestsByLists(self, tops, backs, references, threshold):
265        """ Do multiple enrichment tests with multiple lists and multiple backgrounds on multiple reference sets """
266        tbsrs = []
267        for top in tops:   
268            tbrs = []
269            for back in backs:
270                reference_array = []
271                for reference in references:
272                    reference_array.append(self.geneEnrichmentTestByList(top, back, reference, threshold))
273                tbrs.append(reference_array)
274            tbsrs.append(tbrs)
275        return tbsrs
276             
277    @soapmethod(Array(String), Array(String), Array(String), Float, _returns=Array(Integer))
278    def returnEnrichedGenesByList(self, top, back, reference, threshold):
279        """ Returns a list of IbidasItem IDs if they are enriched """
280        if self.geneEnrichmentTestByList(top, back, reference, threshold):
281            return self.getIbidasIDs(top)
282        else:
283            return None
284       
285       
286       
287       
288    """
289    Transfac services??
290    """
291   
292    @soapmethod(String, _returns=Array(String))
293    def getTransfacGeneID(self, gene):
294        """ Return a transfac gene ID """
295        self._loadTransfac()
296        tg = self.transfac['gene']
297        res = tg.accessions[_.accession == gene].select('ac_id')()
298        if isinstance(res, basestring):
299            return [res]
300        else:
301            return list(set(res.tolist()))
302   
303    @soapmethod(Array(String), _returns=Array(String))
304    def getEncodedFactorIDs(self, genes):
305        """ Return the transcription factor IDs which are encoded by particular genes """
306        self._loadTransfac()
307        tg = self.transfac['gene']
308        res = tg.encoded_factors[_.gene_id.within(*genes)].select('tf_id')()
309        if isinstance(res, basestring):
310            return [res]
311        else:
312            return list(set(res.tolist()))
313   
314    @soapmethod(String, _returns=Array(String))
315    def getTransfacFactorID(self, factor):
316        """ Return a transfac factor ID """
317        self._loadTransfac()
318        tf = self.transfac['factor']
319        return list(set(tf.accessions[_.accession == factor].select('ac_id')().tolist()))
320   
321    @soapmethod(Array(String), _returns=Array(String))
322    def getTFsBindingsiteIDs(self,tfs):
323        """ Return the bindingsites of the input transcription factors """
324        self._loadTransfac()
325        tf = self.transfac['factor']
326        return list(set(tf.bindingsites[_.TF_id.within(*tfs)].select('site')().tolist()))
327   
328    @soapmethod(Array(String), _returns=Array(String))
329    def getGenesByBindingsite(self, sites):
330        """ Return the genes by binding site ID """
331        self._loadTransfac()
332        ts = self.transfac['site']
333        return list(set(ts.accessions[_.ac_id.within(*sites)].select('accession')().tolist()))
334   
335    @soapmethod(Array(String), _returns=Array(String))
336    def getGenesByTransfacAccessions(self, acs):
337        """ Return genes by TRANSFAC accessions """
338        self._loadTransfac()
339        tg = self.transfac['gene']
340        return list(set(tg.accessions[_.ac_id.within(*acs)].select('accession')().tolist()))
341   
342    @soapmethod(String, _returns=Array(String))
343    def getTranscriptionFactorsOfGene_old(self, gene):
344        """ Return a list of transcription factors for a gene """
345        # Get the gene identifiers
346        gene_ids = self.getTransfacGeneID(gene)
347        # Get the transcription factor this
348        encoded_factor_ids = self.getEncodedFactorIDs(gene_ids)
349        binding_site_ids = self.getTFsBindingsiteIDs(encoded_factor_ids)
350        res_gene_ids = self.getGenesByBindingsite(binding_site_ids)
351        res_gene_names = self.getGenesByTransfacAccessions(res_gene_ids)
352        return res_gene_names
353   
354    def _getGeneBindingsites(self, gene_ids):
355        self._loadTransfac()
356        ts = self.transfac['site']
357        res = ts.accessions[_.accession.within(*gene_ids)].select('ac_id')()
358        if isinstance(res, basestring):
359            return [res]
360        else:
361            return list(set(res))
362   
363    def _getBindingTFs(self, bindingsite_ids):
364        self._loadTransfac()
365        tf = self.transfac['factor']
366        res = tf.bindingsites[_.site.within(*bindingsite_ids)].select('TF_id')()
367        if isinstance(res, basestring):
368            return [res]
369        else:
370            return list(set(res))
371   
372    def _getEncodingGenes(self, tf_ids):
373        self._loadTransfac()
374        tf = self.transfac['factor']
375        res = tf.encoding_genes[_.TF_id.within(*tf_ids)].select('gene')()
376        if isinstance(res, basestring):
377            return [res]
378        else:
379            return list(set(res))
380       
381    def _getTransfacGeneAccessions(self, gene_ids):
382        self._loadTransfac()
383        tg = self.transfac['gene']
384        res = tg.accessions[_.ac_id.within(*gene_ids)].select('accession')()
385        if isinstance(res, basestring):
386            return [res]
387        else:
388            return list(set(res))
389   
390    @soapmethod(String, _returns=Array(String))
391    def getTranscriptionFactorsOfGene(self, gene):
392        """ Return a list of transcription factors for a gene """
393        gene_ids = []
394        bindingsite_ids = []
395        binding_tf_ids = []
396        res_gene_ids = []
397        res_gene_acc = []
398        # Get the gene identifiers
399        gene_ids = self.getTransfacGeneID(gene)
400        print "gene_ids: " + str(gene_ids)
401        # Get the bindingsites of this gene
402        bindingsite_ids = self._getGeneBindingsites(gene_ids)
403        print "bindingsite_ids: " + str(bindingsite_ids)
404        # Get TFs binding to this bindingsite
405        binding_tf_ids = self._getBindingTFs(bindingsite_ids)
406        print "binding_tf_ids: " + str(binding_tf_ids)
407        # Get genes these TFs encode for
408        res_gene_ids = self._getEncodingGenes(binding_tf_ids)
409        print "res_gene_ids: " + str(res_gene_ids)
410        # Get the gene accessions
411        res_gene_acc = self._getTransfacGeneAccessions(res_gene_ids)
412        print "res_gene_acc: " + str(res_gene_acc)
413        return res_gene_acc
414       
Note: See TracBrowser for help on using the repository browser.