source: web/IbidasAtomicServicesTemp.py @ 234

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

Added Hypergeometric test to statistics module and AtomicServices?
Added array operations to modules
Modified source file builders to obtain numpy path from config file

File size: 9.4 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    def _tableToSerializer(self, table):
34        objects = []
35        containerobject = getattr(self.cd, table)
36        fields = containerobject.fields.name().tolist()
37        for i in range(len(containerobject)):
38            object = web.IbidasMessage.name_types['ibidas'+table]()
39            for field in fields:
40                setattr(object, field, getattr(containerobject[i], field)())
41            objects.append(object)
42        return objects
43   
44    def _tablecontainerToSerializer(self, containerobject, table):
45        objects = []
46        fields = containerobject.fields.name().tolist()
47        print "fields = " + str(fields)
48        print "containerobject = " + str(containerobject)
49        for i in range(len(containerobject)):
50            print "length of containerobject is " + str(len(containerobject))
51            #try:
52            object = web.IbidasMessage.name_types['ibidas'+table]()
53            print "object = " + str(object)
54            print "created new serializer for " + table
55            for field in fields:
56                print str(containerobject[i])
57                print "field: " + str(field) + " -> " + str(getattr(containerobject[i], field))
58                setattr(object, field, getattr(containerobject[i], field)())
59                print "just set attribute " + str(field) + " for this object to " + str(getattr(containerobject[i], field))
60            objects.append(object)
61            #except e:
62            #    print "caught exception??"
63            #    pass # table doesn't exist in name_types (e.g. set_pg_group)
64        print "returning objects. Objects = " + str(objects)
65        return objects
66
67    @soapmethod(_returns=String)
68    def testConnection(self):
69        """Function to test the connection, returns a string."""
70        #print "Called testConnection!"
71        time.sleep(5)
72        return "blablablabla"
73   
74    @soapmethod(String,_returns=String)
75    def say_hello_once(self, name):
76        """ Say hello once. """
77        return "Hello " + name
78
79    @soapmethod(String,Integer,_returns=Array(String))
80    def say_hello(self,name,times):
81        """ Function to say hello a couple of times to someone. """
82        results = []
83        for i in range(0,times):
84            results.append('Hello, %s'%name)
85        return results
86   
87    @soapmethod(_returns=IbidasItem)
88    def returnTestItem(self):
89        """ Get a user-defined IbidasItem serializer """
90        ii = IbidasItem(item_id=1, source_id=1, display_name="test", type_id=1)
91        return ii
92   
93    @soapmethod(_returns=IbidasTerm)
94    def returnTestTerm(self):
95        """ Get a user-defined IbidasTerm serializer """
96        it = IbidasTerm(source_id=1,term_id=1,identifier="Test",name="Test",description="Test")
97        return it
98   
99    @soapmethod(_returns=IbidasMessage)
100    def returnTestMessage(self):
101        """ Get a user-defined IbidasMessage serializer """
102        item = self.returnTestItem()
103        term = self.returnTestTerm()
104        im = IbidasMessage()
105        im.add(item)
106        im.add(term)
107        return im
108   
109    @soapmethod(Array(IbidasItem), IbidasTerm, _returns=IbidasMessage)
110    def addItemsAndTerm(self, items, term):
111        """ Return a Message with some items and a term """
112        im = IbidasMessage()
113        for item in items:
114            im.add(item)
115        im.add(term)
116        return im
117       
118    @soapmethod(IbidasItem, IbidasTerm, _returns=IbidasMessage)
119    def addItemAndTerm(self, item, term):
120        """ Return a Message with some items and a term """
121        im = IbidasMessage()
122        im.add(item)
123        im.add(term)
124        return im
125         
126    ''' More serious methods '''
127   
128    @soapmethod(_returns=Array(IbidasSet))
129    def listDatasets(self):
130        """ Return a list of all available datasets in Ibidas """
131        return self._tableToSerializer('set')
132   
133    @soapmethod(Integer,_returns=IbidasMessage)
134    def getDataset(self, id):
135        """ Return all data associated with a particular set """
136        im = IbidasMessage()
137        for tabledata in self.cd._getTables():
138            print "table = " + tabledata['name']
139            containerobject = getattr(self.cd, tabledata['name'])
140            print "containerobject: " + str(containerobject)
141            if tabledata['name'] == 'set':
142                data = self._tablecontainerToSerializer(containerobject[_.set_id == id], tabledata['name'])
143            elif tabledata['name'] == 'set_pg_group':
144                # discard this one
145                data = []
146            else:
147                data = self._tablecontainerToSerializer(containerobject[_.source_id == id], tabledata['name'])
148            for dt in data:
149                print "adding " + str(dt) + " to message"
150                im.add(dt)
151        #print "Gathered message"
152        print str(im) 
153        return im
154   
155    @soapmethod(Array(String), String, String, _returns=Array(Array(String)))
156    def convert(self, id_list, type_in, type_out):
157        """ Convert a list of identifiers to a list of desired identifiers """
158        result = []
159        for identifier in id_list:
160            i_id = self.cd.item_prop_accession[_.value == identifier].select(_.item_id)()
161            if isinstance(i_id, int):
162                i_res = self.cd.item_prop_accession[_.item_id == i_id].select(_.value)()
163                identifiers = i_res.tolist()
164            else:
165                identifiers = []
166            result.append(identifiers)
167        return result
168           
169    @soapmethod(Array(String), _returns=Array(Array(String)))
170    def getMSigDBGroups(self, gene_list):
171        """ Get the MSigDB groups of the genes in the provided list """
172        result = []
173        for gene_id in gene_list:
174            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')()
175            if isinstance(g_res, str):
176                # we have only one result
177                a_res = [g_res]
178            else:
179                a_res = g_res.tolist()
180            result.append(a_res)
181        return result
182   
183    @soapmethod(Array(String), _returns=Array(Array(String)))
184    def getMSigDBGroupGenes(self, group_list):
185        """ Get the MSigDB genes of the groups in the provided list """
186        result = []
187        for group_id in group_list:
188            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')()
189            if isinstance(g_res, str):
190                # we have only one result
191                a_res = [g_res]
192            else:
193                a_res = g_res.tolist()
194            result.append(a_res)
195        return result
196   
197    def _getItemIDs(self, ts):
198        return self.cd.item[_.display_name.within(*ts)].select(_.item_id)().tolist()
199   
200    @soapmethod(Array(String), Array(String), String, Float, _returns=Boolean)
201    def geneEnrichmentTest(self, top, back, reference, threshold):
202        """ Returns whether a geneset is enriched """
203        result = self.calculateGeneEnrichment(top, back, reference)
204        return result < threshold
205   
206    @soapmethod(Array(String), Array(String), String, _returns=Float)
207    def calculateGeneEnrichment(self, top, back, reference):
208        """ Returns the value of the gene enrichment (hypergeometric) test """
209        top_ids  = self._getItemIDs(top)
210        back_ids = self._getItemIDs(back)
211        set_id = self.cd.set[_.name == reference].select(_.set_id)()
212        set_ids = self.cd.item_prop_term[_.source_id == set_id].select(_.item_id)().tolist()
213        h = Hypergeometric(top_ids, back_ids, set_ids)
214        return h.calculate()
215   
216    @soapmethod(Array(Array(String)), Array(Array(String)), Array(String), Float, _returns=Array(Array(Array(Boolean))))
217    def geneEnrichmentTests(self, tops, backs, references, threshold):
218        """ Do multiple enrichment tests with multiple lists and multiple backgrounds on multiple reference sets """
219        tbsrs = []
220        for top in tops:   
221            tbrs = []
222            for back in backs:
223                reference_array = []
224                for reference in references:
225                    reference_array.append(self.geneEnrichmentTest(top, back, reference, threshold))
226                tbrs.append(reference_array)
227            tbsrs.append(tbrs)
228        return tbsrs
229                   
Note: See TracBrowser for help on using the repository browser.