source: orange-bioinformatics/server_update/updatemiRNA.py @ 1719:6e8861564778

Revision 1719:6e8861564778, 11.9 KB checked in by markotoplak, 20 months ago (diff)

Fixed update scripts for MeSH, GO, HomoloGene, NCBI_geneinfo, OMIM, PPI. Moved wget to Orange.utils.

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