source: orange-bioinformatics/server_update/updatemiRNA.py @ 1830:e965b42c34c6

Revision 1830:e965b42c34c6, 11.5 KB checked in by Flashpoint <vid.flashpoint@…>, 10 months ago (diff)

Added short names to miRNA Orange server files

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