source: orange/install-scripts/orngServer/serverUpdateScripts/updatemiRNA.py @ 6538:a5f65d7f0b2c

Revision 6538:a5f65d7f0b2c, 11.8 KB checked in by Mitar <Mitar@…>, 4 years ago (diff)

Made XPM version of the icon 32x32.

Line 
1
2import urllib
3import re
4import pylab
5import random
6import os
7import math
8import locale
9import gzip
10import StringIO
11import sys
12from getopt import getopt
13import zipfile
14
15import obiTaxonomy as tax
16import orngServerFiles
17import orngEnviron
18
19def fastprint(filename,mode,what):
20   
21    file = open(filename,mode)
22    file.write(what)
23    file.close()
24   
25
26def sendMail(subject):
27   
28    toaddr = "rsberex@yahoo.it"
29    fromaddr = "orange@fri.uni-lj.si";
30    msg = "From: %s\r\nTo: %s\r\nSubject: %s" % (fromaddr, toaddr, subject)
31    try:
32        import smtplib
33        s = smtplib.SMTP('212.235.188.18', 25)
34        s.sendmail(fromaddr, toaddr, msg)
35        s.quit()
36    except Exception, ex:
37        print "Failed to send error report due to:", ex
38
39       
40def format_checker(content):
41   
42    if len(re.findall('(ID.*?)ID',content.replace('\n',''))):       
43        return True
44    else:
45        sendMail('Uncorrect format of miRBase data-file.')       
46        return False
47
48   
49def get_intoFiles(path, data_webPage):
50   
51    sections = data_webPage.split('//\n')
52    sections.pop()
53   
54    files = []
55    os.system('rm %s/*_sections.txt' % path)
56   
57    for s in sections:
58        org = str(re.findall('ID\s*(\S*)\s*standard;',s.split('\n')[0])[0]).split('-')[0]
59        fastprint(os.path.join(path,'%s_sections.txt' % org),'a',s+'//\n')
60       
61        if not('%s_sections.txt' % org) in files:
62            files.append('%s_sections.txt' % org)
63           
64    content = '\n'.join(list(set(files)))   
65    fastprint(os.path.join(path,'fileList.txt'),'w',content)
66           
67    return os.path.join(path,'fileList.txt')
68   
69           
70       
71def miRNA_info(path,object,org_name):
72   
73    address = os.path.join(path,'%s' % object)
74    prefix = str(re.findall('(\S*)_sections\.txt',object)[0])
75   
76    try:
77        data_webPage = urllib.urlopen(address).read()
78    except IOError:
79        print "miRNA_info Error: Check the web-address."
80   
81    if data_webPage == []:
82        sendMail('Cannot read %s ' % address)
83    else:
84        format_checker(data_webPage)
85           
86        print 'I have read: %s' % address
87        sections = data_webPage.split('//\n')
88        sections.pop()
89        print 'Sections found: ', str(len(sections))
90           
91        num_s = 0
92       
93        ### files to write       
94        fastprint(os.path.join(path,'%s_premiRNA.txt' % prefix),'w','preID'+'\t'+'preACC'+'\t'+'preSQ'+'\t'+'matACCs'+'\t'+'pubIDs'+'\t'+'clusters'+'\t'+'web_addr'+'\n')
95        fastprint(os.path.join(path,'%s_matmiRNA.txt' % prefix),'w','matID'+'\t'+'matACC'+'\t'+'matSQ'+'\t'+'pre_forms'+'\t'+'targets'+'\n')
96       
97        dictG = {}
98        dictP = {}
99           
100        for s in sections:
101            num_s = num_s+1
102            print 'section: ', num_s, '/', str(len(sections)),
103                           
104            pubIDs = []
105            matIDs = ''
106            matACCs = ''
107            preSQ=[]
108           
109            my_ids =[]
110            my_accs=[]
111            my_locs=[] # if it's [61..81] you have to take from 60 to 81.
112           
113            rows = s.split('\n')
114               
115            for r in rows:
116               
117                if r[0:2] == 'ID':
118                    preID = str(re.findall('ID\s*(\S*)\s*standard;',r)[0])
119                    print preID
120                       
121                elif r[0:2] == 'AC':
122                    preACC = str(re.findall('AC\s*(\S*);',r)[0])
123                    web_addr = 'http://www.mirbase.org/cgi-bin/mirna_entry.pl?acc=%s' % preACC
124                       
125                elif r[0:2] == 'RX' and not(re.findall('RX\s*PUBMED;\s(\d*).',r)==[]):
126                    pubIDs.append(str(re.findall('RX\s*PUBMED;\s(\d*).',r)[0]))
127                           
128                elif r[0:2]=='FT' and not(re.findall('FT\s*miRNA\s*(\d{1,}\.\.\d{1,})',r)==[]):
129                    loc_mat = str(re.findall('FT\s*miRNA\s*(\d{1,}\.\.\d{1,})',r)[0])
130                       
131                    if not(loc_mat==[]):
132                         my_locs.append(loc_mat)
133               
134                elif r[0:2]=='FT' and not(re.findall('FT\s*/accession="(MIMAT[0-9]*)"', r)==[]):
135                     mat_acc = str(re.findall('FT\s*/accession="(MIMAT[0-9]*)"', r)[0])
136                       
137                     if matACCs == '':
138                         matACCs = mat_acc
139                     else:
140                         matACCs = matACCs + ',' + mat_acc
141                           
142                     if not(mat_acc == []):
143                         my_accs.append(mat_acc)   
144                               
145                elif r[0:2]=='FT' and not(re.findall('FT\s*/product="(\S*)"', r)==[]):
146                     mat_id = str(re.findall('FT\s*/product="(\S*)"', r)[0])
147                       
148                     if matIDs == '':
149                         matIDs = mat_id
150                     else:
151                         matIDs = matIDs + ',' + mat_id     
152                       
153                     if not(mat_id == []):
154                         my_ids.append(mat_id)
155                                         
156                elif r[0:2]=='SQ':
157           
158                     preSQ_INFO = str(re.findall('SQ\s*(.*other;)', r)[0])
159                     seq = 'on'
160           
161                elif r[0:2]=='  ' and seq == 'on':
162                     preSQ.append(str(re.findall('\s*([a-z\s]*)\s*\d*',r)[0]).replace(' ',''))
163                     
164            ### cluster search
165            clusters = ''
166            try:
167                mirna_page = urllib.urlopen('http://www.mirbase.org/cgi-bin/mirna_entry.pl?acc=%s' % preACC).read()
168            except IOError:
169                print "miRNA_info Error: Check the address for the miRNA page."
170                pass
171           
172            clust_check = re.findall('<td class="\S*">(Clustered miRNAs)</td>',mirna_page)
173               
174            if clust_check != [] and str(clust_check[0]) == 'Clustered miRNAs':   
175                 clusters = ','.join(re.findall('<td><a href="/cgi-bin/mirna_entry.pl\?acc=MI\d*">(\S*?)</a></td>',mirna_page))
176                     
177            if clusters == '':
178                clusters = 'None'
179           
180            ### before printing:       
181            if pubIDs == []:
182                 pubIDs = 'None'
183            else:
184                pubIDs = ','.join(pubIDs)
185           
186            preSQ = ''.join(preSQ)
187           
188            fastprint(os.path.join(path,'%s_premiRNA.txt' % prefix),'a',preID+'\t'+preACC+'\t'+preSQ+'\t'+matACCs+'\t'+pubIDs+'\t'+clusters+'\t'+web_addr+'\n')
189               
190            for tup in zip(my_ids, my_accs, my_locs):
191               
192                [start,stop] = tup[2].split('..')
193               
194                if not(tup[0] in dictG):
195                    dictG[tup[0]]=[]
196               
197                dictG[tup[0]] = [tup[1],preSQ[int(start)-1:int(stop)]]
198               
199                if not(tup[0] in dictP):
200                    dictP[tup[0]]=[]
201               
202                dictP[tup[0]].append(preID)
203               
204        for k,v in dictG.items():               
205            pre_forms = ','.join(dictP[k]) 
206           
207            ### targets
208            targets = 'None'
209            if k in TargetScanLib:
210                targets = ','.join(TargetScanLib[k])
211           
212            fastprint(os.path.join(path,'%s_matmiRNA.txt' % prefix),'a',k+'\t'+v[0]+'\t'+v[1]+'\t'+pre_forms+'\t'+targets+'\n')
213       
214           
215        return [os.path.join(path,'%s_matmiRNA.txt' % prefix), os.path.join(path,'%s_premiRNA.txt' % prefix)]
216
217
218
219##############################################################################################################################################################
220##############################################################################################################################################################
221
222opt = dict(getopt(sys.argv[1:], "u:p:", ["user=", "password="])[0])
223
224username = opt.get("-u", opt.get("--user", "username"))
225password = opt.get("-p", opt.get("--password", "password"))
226
227path = os.path.join(orngEnviron.bufferDir, "tmp_miRNA")
228print 'path: ', path
229
230serverFiles = orngServerFiles.ServerFiles(username, password)
231
232try:
233    os.mkdir(path)
234except OSError:
235    pass
236
237
238org_taxo = [tax.name(id) for id in tax.common_taxids()]
239
240### targets library from TargetScan
241try:
242    tarscan_url = 'http://www.targetscan.org//vert_50//vert_50_data_download/Conserved_Site_Context_Scores.txt.zip'
243   
244    zf = zipfile.ZipFile(StringIO.StringIO(urllib.urlopen(tarscan_url).read()))
245    arch = zf.read(zf.namelist()[0]).split('\n')[1:]
246    arch.pop()
247    mirnas = [a.split('\t')[3] for a in arch]
248    gene_ids = [a.split('\t')[1] for a in arch]
249   
250    TargetScanLib = {}
251    for m,t in zip(mirnas,gene_ids):
252        if not(m in TargetScanLib):
253            TargetScanLib[m] = []
254        if not(t in TargetScanLib[m]):           
255            TargetScanLib[m].append(t)
256except IOError:
257    sendMail('Targets not found on: %s' % tarscan_url)   
258
259### miRNA library form miRBase
260print "\nBuilding miRNA library..."
261address = 'ftp://mirbase.org/pub/mirbase/CURRENT/miRNA.dat.gz'
262flag = 1
263try:
264    data_webPage = gzip.GzipFile(fileobj=StringIO.StringIO(urllib.urlopen(address).read())).read()   
265except IOError:
266    flag = 0
267    sendMail('Database file of miRNAs not found on: %s' % address)
268     
269       
270if flag:
271    orgs_des = dict(zip([re.findall('ID\s*(\S{3,4})-\S*\s*standard;',l)[0] for l in data_webPage.split('\n') if l[0:2]=='ID'],[re.findall('DE\s*(.*)\s\S*.*\sstem[\s|-]loop',l)[0] for l in data_webPage.split('\n') if l[0:2]=='DE']))
272   
273    file_org = get_intoFiles(path,data_webPage)
274   
275    miRNA_path = os.path.join(path,'miRNA.txt')
276    print 'miRNA file path: %s' % miRNA_path
277    premiRNA_path = os.path.join(path,'premiRNA.txt')
278    print 'pre-miRNA file path: %s' % premiRNA_path
279   
280    fastprint(miRNA_path,'w','matID'+'\t'+'matACC'+'\t'+'matSQ'+'\t'+'pre_forms'+'\t'+'targets'+'\n')
281    fastprint(premiRNA_path,'w','preID'+'\t'+'preACC'+'\t'+'preSQ'+'\t'+'matACCs'+'\t'+'pubIDs'+'\t'+'clusters'+'\t'+'web_addr'+'\n')
282   
283    for fx in [l.rstrip() for l in open(file_org).readlines()]:
284        if orgs_des[fx.split('_')[0]] in org_taxo:
285           
286            end_files = miRNA_info(path, fx,orgs_des[fx.split('_')[0]])
287           
288            for filename in end_files:
289                print "Now reading %s..." % filename           
290                org = re.findall('/(\S{3,4})_\S{3}miRNA\.txt',filename)[0]
291                type_file = re.findall(org+'_(\S*)miRNA\.txt',filename)[0]
292                label = re.findall('/(\S{3,4}_\S{3}miRNA?)\.txt',filename)[0]
293               
294                if type_file == 'mat':
295                    serverFiles.upload("miRNA", label, filename, title="miRNA: %s mature form" % org, tags=["tag1", "tag2"])
296                    serverFiles.unprotect("miRNA", label)
297                    print '%s mat uploaded' % org
298                   
299                    for file_line in open(filename).readlines()[1:]:
300                        fastprint(miRNA_path,'a',file_line)                 
301                   
302                elif type_file == 'pre':
303                    serverFiles.upload("miRNA", label, filename, title="miRNA: %s pre-form" % org, tags=["tag1", "tag2"])
304                    serverFiles.unprotect("miRNA", label)
305                    print '%s pre uploaded' % org
306                   
307                    for file_line in open(filename).readlines()[1:]:
308                        fastprint(premiRNA_path,'a',file_line)
309                       
310                else:
311                    print 'Check the label.'
312   
313    serverFiles.upload("miRNA", "miRNA.txt", miRNA_path)
314    serverFiles.unprotect("miRNA", "miRNA.txt")
315    print '\nmiRNA.txt uploaded'
316   
317    serverFiles.upload("miRNA", "premiRNA.txt", premiRNA_path)
318    serverFiles.unprotect("miRNA", "premiRNA.txt")
319    print 'premiRNA.txt uploaded\n'
320else:
321    print "Check the address of miRNA file on %s" % address
322
323               
324           
325
326
327
328   
Note: See TracBrowser for help on using the repository browser.