source: orange-bioinformatics/server_update/updatemiRNA.py @ 1773:5e6e42c393a9

Revision 1773:5e6e42c393a9, 11.3 KB checked in by markotoplak, 12 months ago (diff)

Small changes to miRNA update scripts. Added title and tags to elements that were missing it.

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