source: orange-bioinformatics/server_update/updatemiRNA.py @ 1721:921b3780c6cc

Revision 1721:921b3780c6cc, 11.1 KB checked in by markotoplak, 20 months ago (diff)

Moved common functionality of the server files update scripts to a separate file.

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