8ad50605a3dd3dbec10f7cb3a698101a8c17bb98
[django_unres.git] / django_simple / todo / views.py
1 from django.contrib.auth.decorators import login_required
2 from django.shortcuts import redirect, render, get_object_or_404
3 from django.contrib.auth.models import User
4 from .forms import *
5 from .models import Task
6 import datetime
7 import os
8 import subprocess
9 import json
10 from lazysignup.decorators import allow_lazy_user
11 from lazysignup.utils import is_lazy_user
12 import random
13
14 res_codes = [
15                 # 20 canonical amino acids
16                 ('CYS', 'C'), ('ASP', 'D'), ('SER', 'S'), ('GLN', 'Q'),
17                 ('LYS', 'K'), ('ILE', 'I'), ('PRO', 'P'), ('THR', 'T'),
18                 ('PHE', 'F'), ('ASN', 'N'), ('GLY', 'G'), ('HIS', 'H'),
19                 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
20                 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
21                 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
22                 ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
23                 ('CYX', 'C'),
24                 ('DCY', 'c'), ('DAS', 'd'), ('DSN', 's'), ('DGN', 'q'),
25                 ('DLY', 'k'), ('DIL', 'i'), ('DPR', 'p'), ('DTH', 't'),
26                 ('DPN', 'f'), ('DSG', 'n'), ('DHI', 'h'),
27                 ('DLE', 'l'), ('DAR', 'r'), ('DTR', 'w'), ('DAL', 'a'),
28                 ('DVA', 'v'), ('DGL', 'e'), ('DTY', 'y'), ('MED', 'm'),                
29                ]
30
31 three_to_one = dict(res_codes)
32
33 def load_pdbid(pdbid,dirname,filename='plik.pdb'):
34     if (not os.path.isdir(dirname)):
35        os.mkdir(dirname)
36     if len(pdbid)==4:
37        file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
38                      dirname+'/'+filename)     
39     else:
40        chain=pdbid[5]
41        pdbid=pdbid[:4]
42        pdb_tmp=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
43        with open(dirname+'/'+filename, 'w') as outfile:
44         for line in pdb_tmp:
45           if line[0:6] == 'SSBOND' and line[15] == chain and line[29] == chain:
46             outfile.write(line)
47           if line[0:6] == 'ATOM  ' and line[21] == chain:
48             outfile.write(line)
49           if line[0:6] == 'ENDMDL':
50             break
51        pdb_tmp.close()
52        file=dirname+'/'+filename
53        
54     return(file)
55
56
57 def seq_2d_from_pdb(seq_2d,seq):
58     if seq_2d =='':
59       return(seq_2d)
60     seq_2d=seq_2d.replace('C', '-')
61     seq_2d_tmp=''
62     ii=0
63     for i in range(0,len(seq)):
64       if seq[i]=='X':
65          seq_2d_tmp=seq_2d_tmp+'-'
66       else:
67          if len(seq_2d)>ii:
68             seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
69             ii+=1
70     tmp=''
71     for i in range(0,len(seq_2d_tmp),40):
72       tmp=tmp+seq_2d_tmp[i:i+40]+" "
73     return(tmp)
74
75 def seq_2d_add_x(seq_2d,seq,seq_form):
76     if seq_2d =='':
77       return(seq_2d)
78     seq_2d=seq_2d[:len(seq_form)]
79     seq_2d=seq_2d.replace('C', '-')
80     if seq_form[0] !='X' and seq[0] == 'X':
81       seq_2d='-'+seq_2d
82     if seq_form[-1] !='X' and seq[-1] == 'X':
83       seq_2d=seq_2d+'-'
84     seq_2d=seq_2d[:len(seq)]
85     tmp=''
86     for i in range(0,len(seq_2d),40):
87       tmp=tmp+seq_2d[i:i+40]+" "
88     return(tmp)
89
90 def seq_add_x(sequence):
91     if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X':
92         sequence='X'+sequence
93     if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X':
94         sequence=sequence+'X'
95     set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym'
96     sequence = ''.join([c for c in sequence if c in set])
97
98     return(sequence)    
99
100 def from_pdb(file):
101     sequence = []
102     ssbond = []
103     ssbond_ch = []
104     ires = []
105     chain_start = {}
106     chain_end = {}
107     unres_shift = {}
108     chain_sorted=[]
109     newchain = True
110     i=''
111     for line in file:
112             if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
113               aa = three_to_one.get(line[17:20])
114               i = int(line[22:26])
115               ch = line[21:22]
116               if newchain or i!=ires[-1]:
117                 sequence.append(aa)
118                 ires.append(i)
119                 if newchain:
120                  chain_start[ch]=i
121                  chain_sorted.extend(ch)
122                  newchain = False
123             if line[0:3] == 'TER' and i != '':
124               sequence.append('XX')
125               chain_end[ch]=i
126               newchain = True
127             if line[0:6] == 'SSBOND':
128               b=[]
129               b.append(int(line[17:21]))
130               b.append(int(line[31:35]))
131               ssbond.append(b)
132               c = []
133               c.append((line[15:16]))
134               c.append((line[29:30]))
135               ssbond_ch.append(c)                                                                      
136             if line[0:3] == 'END':
137               break
138     if not sequence[-1] == 'XX':
139             chain_end[ch]=i
140     while sequence[-1] == 'XX':
141             del sequence[-1]
142     if sequence[0] != 'G':
143             sequence.insert(0,'X')
144             ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
145     if sequence[-1] != 'G':
146             sequence.append('X')
147     seq=''.join(sequence)
148 #    if ires[0] != 1:
149 #            ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
150     i=0
151     for c in chain_sorted:
152       unres_shift[c]=i+chain_start[c]
153       i=i-(chain_end[c]-chain_start[c])-3
154     ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]     
155
156     return seq,json.dumps(ssbond)
157
158
159 @login_required
160 def index(request):
161     user = request.user
162     tasks = Task.objects.filter(owner=user).order_by('-created_date')
163     variable = ''
164     return render(request, "index.html", {
165             'tasks': tasks, 'alldone': 0
166         })
167
168 @login_required
169 def add(request):
170     if request.method == 'POST':
171         form = TaskForm(request.POST)
172         if form.is_valid():
173             name = form.cleaned_data["name"]
174             user = request.user
175             task = Task(name=name,owner=user,ready=False)
176             task.save()
177             return redirect('add_min',task_id=task.id)
178     return redirect('/')
179
180 @login_required
181 def add_min(request,task_id):
182     task = get_object_or_404(Task, id=task_id)
183     if request.method == 'POST':
184      if '_example' in request.POST:
185         data= {'name':task.name,'pdbid':'1BDD'}
186         form = TaskForm_min(initial=data)     
187      else:
188         form = TaskForm_min(request.POST,request.FILES)
189         if form.is_valid():
190              task.name=form.cleaned_data["name"]
191              task.type="min"
192              pdbid=form.cleaned_data["pdbid"]
193
194              basename = str(task.owner)
195              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
196              task.jobdirname = "_".join([basename, suffix])
197
198              if pdbid:
199               task.myfile1=load_pdbid(pdbid,task.jobdirname)
200               task.pdbcode=pdbid
201              else:
202               task.myfile1=form.cleaned_data["file1"]
203
204              seq,task.ssbond=from_pdb(task.myfile1)
205              task.md_seq=""
206              for i in range(0,len(seq),40):
207                     task.md_seq=task.md_seq+seq[i:i+40]+" "
208
209              task.ready=True
210              
211              task.save()
212              if is_lazy_user(request.user):
213               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
214              else:
215               return redirect('/')
216     else:
217         data= {'name':task.name}
218         form = TaskForm_min(initial=data)
219     p_type='minimization'
220     basic_adv=True    
221     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
222
223 @login_required
224 def add_min_a(request,task_id):
225     task = get_object_or_404(Task, id=task_id)
226     if request.method == 'POST':
227      if '_example' in request.POST:
228         data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
229         form = TaskForm_min_a(initial=data)     
230      else:
231         form = TaskForm_min_a(request.POST,request.FILES)
232         if form.is_valid():
233              task.name=form.cleaned_data["name"]
234              task.type="min"
235 #             task.min_choice=form.cleaned_data["min_choice"]
236              task.min_overlap=form.cleaned_data["min_overlap"]
237              task.min_searchsc=form.cleaned_data["min_searchsc"]
238              task.min_maxmin=form.cleaned_data["min_maxmin"]
239              task.min_maxfun=form.cleaned_data["min_maxfun"]
240              task.min_pdbout=form.cleaned_data["min_pdbout"]
241
242              basename = str(task.owner)
243              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
244              task.jobdirname = "_".join([basename, suffix])
245              
246              pdbid=form.cleaned_data["pdbid"]
247              if pdbid:
248               task.myfile1=load_pdbid(pdbid,task.jobdirname)
249               task.pdbcode=pdbid
250              else:
251               task.myfile1=form.cleaned_data["file1"]
252
253              task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
254              task.unres_ff=form.cleaned_data["unres_ff"]
255              task.boxx=form.cleaned_data["boxx"]
256              task.boxy=form.cleaned_data["boxy"]             
257              task.boxz=form.cleaned_data["boxz"]             
258
259              seq,task.ssbond=from_pdb(task.myfile1)
260              task.md_seq=""
261              for i in range(0,len(seq),40):
262                 task.md_seq=task.md_seq+seq[i:i+40]+" "
263                                                            
264              task.ready=True
265              
266              task.save()
267              if is_lazy_user(request.user):
268               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
269              else:
270               return redirect('/')
271     else:
272         data= {'name':task.name}
273         form = TaskForm_min_a(initial=data)
274     basic_adv=False
275     p_type='minimization - advanced options'
276     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
277
278 @login_required
279 def add_md(request,task_id):
280     task = get_object_or_404(Task, id=task_id)
281     if request.method == 'POST':
282      if '_example' in request.POST:
283         data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
284         'md_pdbref':True,'md_temp':200,'md_seed':-39912345}
285         form = TaskForm_md(initial=data)     
286      else:
287         form = TaskForm_md(request.POST,request.FILES)
288         if form.is_valid():
289              task.name=form.cleaned_data["name"]
290              task.type="md"
291              task.md_seed=form.cleaned_data["md_seed"]
292              task.md_start=form.cleaned_data["md_start"]
293              task.md_temp=form.cleaned_data["md_temp"]
294              task.md_nstep=form.cleaned_data["md_nstep"]
295
296              basename = str(task.owner)
297              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
298              task.jobdirname = "_".join([basename, suffix])
299
300              pdbid=form.cleaned_data["pdbid"]
301              if pdbid:
302               task.myfile1=load_pdbid(pdbid,task.jobdirname)
303               task.pdbcode=pdbid
304              else:
305               task.myfile1=form.cleaned_data["file1"]
306              task.md_pdbref=form.cleaned_data["md_pdbref"]             
307
308              task.md_seq=""
309              if task.md_start == "pdbstart" or task.md_pdbref:
310                seq,task.ssbond=from_pdb(task.myfile1)
311              else:
312                seq=seq_add_x(form.cleaned_data["md_seq"])
313                        
314              for i in range(0,len(seq),40):
315                 task.md_seq=task.md_seq+seq[i:i+40]+" "
316              
317              if task.md_start != "pdbstart":
318                 task.ssbond=''
319
320              if any(c.islower() for c in seq):
321               task.md_respa=False
322               task.damino=True
323
324              task.ready=True
325              
326              task.save()
327              if is_lazy_user(request.user):
328               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
329              else:
330               return redirect('/')
331     else:
332         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
333         form = TaskForm_md(initial=data)
334     basic_adv=True
335     p_type='molecular dynamics'
336     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
337
338 @login_required
339 def add_md_a(request,task_id):
340     task = get_object_or_404(Task, id=task_id)
341     if request.method == 'POST':
342      if '_example' in request.POST:
343         data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
344          'md_pdbref':True,'md_mdpdb':True,'md_seed':-39912345}
345         form = TaskForm_md_a(initial=data)     
346      else:
347         form = TaskForm_md_a(request.POST,request.FILES)
348         if form.is_valid():
349              task.name=form.cleaned_data["name"]
350              task.type="md"
351
352              basename = str(task.owner)
353              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
354              task.jobdirname = "_".join([basename, suffix])
355
356              pdbid=form.cleaned_data["pdbid"]
357              if pdbid:
358               task.myfile1=load_pdbid(pdbid,task.jobdirname)
359               task.pdbcode=pdbid
360              else:
361               task.myfile1=form.cleaned_data["file1"]
362              task.md_start=form.cleaned_data["md_start"]
363              task.md_pdbref=form.cleaned_data["md_pdbref"]             
364
365              task.md_seq=""
366              if task.md_start == "pdbstart" or task.md_pdbref:
367                seq,task.ssbond=from_pdb(task.myfile1)
368                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
369              else:
370                seq=seq_add_x(form.cleaned_data["md_seq"])
371                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
372
373              for i in range(0,len(seq),40):
374                 task.md_seq=task.md_seq+seq[i:i+40]+" "
375
376              if task.md_start != "pdbstart":
377                 task.ssbond=''
378
379              task.md_seed=form.cleaned_data["md_seed"]
380
381              task.md_temp=form.cleaned_data["md_temp"]
382              task.md_nstep=form.cleaned_data["md_nstep"]
383              task.md_ntwe=form.cleaned_data["md_ntwe"]
384              task.md_ntwx=form.cleaned_data["md_ntwx"]
385              task.md_dt=form.cleaned_data["md_dt"]
386              task.md_lang=form.cleaned_data["md_lang"]
387              task.md_tau=form.cleaned_data["md_tau"]
388              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
389              task.md_mdpdb=form.cleaned_data["md_mdpdb"]
390              task.unres_ff=form.cleaned_data["unres_ff"]
391              task.md_respa=form.cleaned_data["md_respa"]             
392              if any(c.islower() for c in seq):
393               task.md_respa=False
394               task.damino=True
395              task.boxx=form.cleaned_data["boxx"]
396              task.boxy=form.cleaned_data["boxy"]             
397              task.boxz=form.cleaned_data["boxz"]             
398
399              
400              task.ready=True
401              
402              task.save()
403              if is_lazy_user(request.user):
404               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
405              else:
406               return redirect('/')
407     else:
408         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
409         form = TaskForm_md_a(initial=data)
410     basic_adv=False
411     p_type='molecular dynamics - advanced options'
412     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
413
414 @login_required
415 def add_remd(request,task_id):
416     task = get_object_or_404(Task, id=task_id)
417     if request.method == 'POST':
418      if '_example' in request.POST:
419         data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
420         form = TaskForm_remd(initial=data)     
421      else:
422         form = TaskForm_remd(request.POST,request.FILES)
423         if form.is_valid():
424              task.name=form.cleaned_data["name"]
425              task.type="remd"
426              task.md_start=form.cleaned_data["md_start"]
427
428              basename = str(task.owner)
429              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
430              task.jobdirname = "_".join([basename, suffix])
431
432              pdbid=form.cleaned_data["pdbid"]
433              if pdbid:
434               task.myfile1=load_pdbid(pdbid,task.jobdirname)
435               task.pdbcode=pdbid
436              else:
437               task.myfile1=form.cleaned_data["file1"]
438              task.md_pdbref=form.cleaned_data["md_pdbref"]
439              task.md_ntwx=task.remd_nstex 
440
441              task.md_seq=""
442              if task.md_start == "pdbstart" or task.md_pdbref:
443                seq,task.ssbond=from_pdb(task.myfile1)
444              else:
445                seq=seq_add_x(form.cleaned_data["md_seq"])
446              for i in range(0,len(seq),40):
447                 task.md_seq=task.md_seq+seq[i:i+40]+" "
448
449              if task.md_start != "pdbstart":
450                 task.ssbond=''
451
452              task.md_seed=form.cleaned_data["md_seed"]
453
454              task.md_nstep=form.cleaned_data["md_nstep"]
455
456              if any(c.islower() for c in seq):
457               task.md_respa=False
458               task.damino=True
459
460
461              task.ready=True
462              
463              
464              task.save()
465              if is_lazy_user(request.user):
466               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
467              else:
468               return redirect('/')
469     else:
470         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
471         form = TaskForm_remd(initial=data)
472     basic_adv=True
473     p_type='replica exchange molecular dynamics'
474     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
475
476 @login_required
477 def add_remd_a(request,task_id):
478     from django.core.files.uploadedfile import UploadedFile
479     task = get_object_or_404(Task, id=task_id)
480     if request.method == 'POST':
481      if '_example' in request.POST:
482         data= {'name':task.name,'pdbid':'5G3Q:B','md_pdbref':True,
483          'md_nstep':2000000,'md_lang':'berendsen','unres_ff':'FF2','md_seed':-39912345,
484          'remd_cluter_temp':290,'md_2d':'--EEEEEEE------EEEEEE------EEEEEE------HHHHHHHHHHH---HHHHHHHHHHHHHHHHHHHHHHH---'}
485         form = TaskForm_remd_a(initial=data)    
486         task.example='casp12'
487         task.save() 
488      elif '_example_saxs' in request.POST:
489         data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
490          'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
491          'remd_cluter_temp':270, 
492          'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
493 """ 0.5     1.33868e-02
494  1.5     1.95880e-02
495  2.5     2.68896e-02
496  3.5     3.43737e-02
497  4.5     4.07099e-02
498  5.5     4.47875e-02
499  6.5     4.63486e-02
500  7.5     4.60514e-02
501  8.5     4.49130e-02
502  9.5     4.36744e-02
503 10.5     4.26085e-02
504 11.5     4.17464e-02
505 12.5     4.11217e-02
506 13.5     4.07835e-02
507 14.5     4.06776e-02
508 15.5     4.06060e-02
509 16.5     4.03241e-02
510 17.5     3.96655e-02
511 18.5     3.85756e-02
512 19.5     3.70537e-02
513 20.5     3.50982e-02
514 21.5     3.27236e-02
515 22.5     3.00046e-02
516 23.5     2.70643e-02
517 24.5     2.40044e-02
518 25.5     2.08595e-02
519 26.5     1.76342e-02
520 27.5     1.43802e-02
521 28.5     1.12281e-02
522 29.5     8.34574e-03
523 30.5     5.87354e-03
524 31.5     3.88732e-03
525 32.5     2.39755e-03
526 33.5     1.36323e-03
527 34.5     7.06686e-04
528 35.5     3.30592e-04
529 36.5     1.38359e-04"""}
530         form = TaskForm_remd_a(initial=data)     
531      elif '_example_saxs1' in request.POST:
532         data= {'name':task.name,'pdbid':'2KMS','md_pdbref':True,'md_start':'pdbstart',
533         'md_2d':'----EEEEEE-EEEEE-------EEEEEEEEE--EEEEEE-EEEE---EEEEEEEEE-----EEEEEEE-EEE-HHHHH-EEEE-EEEEEEEEE----EEEEEE---EEE-----',
534          'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
535          'remd_cluter_temp':280, 'min_maxfun':50,
536          'scal_rad':5.0,'wsaxs':1000.0,'saxs_data':
537 """0.7100E-00 0.2036E-03
538 0.1420E+01 0.4221E-03
539 0.2130E+01 0.6548E-03
540 0.2840E+01 0.9001E-03
541 0.3550E+01 0.1156E-02
542 0.4260E+01 0.1421E-02
543 0.4970E+01 0.1692E-02
544 0.5680E+01 0.1965E-02
545 0.6390E+01 0.2239E-02
546 0.7100E+01 0.2509E-02
547 0.7810E+01 0.2772E-02
548 0.8520E+01 0.3025E-02
549 0.9230E+01 0.3265E-02
550 0.9940E+01 0.3489E-02
551 0.1065E+02 0.3694E-02
552 0.1136E+02 0.3878E-02
553 0.1207E+02 0.4039E-02
554 0.1278E+02 0.4177E-02
555 0.1349E+02 0.4289E-02
556 0.1420E+02 0.4377E-02
557 0.1491E+02 0.4439E-02
558 0.1562E+02 0.4478E-02
559 0.1633E+02 0.4493E-02
560 0.1704E+02 0.4487E-02
561 0.1775E+02 0.4461E-02
562 0.1846E+02 0.4418E-02
563 0.1917E+02 0.4361E-02
564 0.1988E+02 0.4291E-02
565 0.2059E+02 0.4211E-02
566 0.2130E+02 0.4125E-02
567 0.2201E+02 0.4034E-02
568 0.2272E+02 0.3942E-02
569 0.2343E+02 0.3850E-02
570 0.2414E+02 0.3761E-02
571 0.2485E+02 0.3677E-02
572 0.2556E+02 0.3598E-02
573 0.2627E+02 0.3526E-02
574 0.2698E+02 0.3462E-02
575 0.2769E+02 0.3405E-02
576 0.2840E+02 0.3356E-02
577 0.2911E+02 0.3315E-02
578 0.2982E+02 0.3280E-02
579 0.3053E+02 0.3251E-02
580 0.3124E+02 0.3226E-02
581 0.3195E+02 0.3205E-02
582 0.3266E+02 0.3186E-02
583 0.3337E+02 0.3167E-02
584 0.3408E+02 0.3147E-02
585 0.3479E+02 0.3125E-02
586 0.3550E+02 0.3099E-02
587 0.3621E+02 0.3068E-02
588 0.3692E+02 0.3031E-02
589 0.3763E+02 0.2987E-02
590 0.3834E+02 0.2937E-02
591 0.3905E+02 0.2878E-02
592 0.3976E+02 0.2812E-02
593 0.4047E+02 0.2739E-02
594 0.4118E+02 0.2658E-02
595 0.4189E+02 0.2571E-02
596 0.4260E+02 0.2478E-02
597 0.4331E+02 0.2381E-02
598 0.4402E+02 0.2279E-02
599 0.4473E+02 0.2174E-02
600 0.4544E+02 0.2068E-02
601 0.4615E+02 0.1960E-02
602 0.4686E+02 0.1853E-02
603 0.4757E+02 0.1748E-02
604 0.4828E+02 0.1644E-02
605 0.4899E+02 0.1544E-02
606 0.4970E+02 0.1447E-02
607 0.5041E+02 0.1355E-02
608 0.5112E+02 0.1267E-02
609 0.5183E+02 0.1184E-02
610 0.5254E+02 0.1106E-02
611 0.5325E+02 0.1033E-02
612 0.5396E+02 0.9646E-03
613 0.5467E+02 0.9008E-03
614 0.5538E+02 0.8411E-03
615 0.5609E+02 0.7852E-03
616 0.5680E+02 0.7327E-03
617 0.5751E+02 0.6831E-03
618 0.5822E+02 0.6360E-03
619 0.5893E+02 0.5909E-03
620 0.5964E+02 0.5475E-03
621 0.6035E+02 0.5055E-03
622 0.6106E+02 0.4646E-03
623 0.6177E+02 0.4245E-03
624 0.6248E+02 0.3853E-03
625 0.6319E+02 0.3467E-03
626 0.6390E+02 0.3089E-03
627 0.6461E+02 0.2719E-03
628 0.6532E+02 0.2357E-03
629 0.6603E+02 0.2007E-03
630 0.6674E+02 0.1669E-03
631 0.6745E+02 0.1345E-03
632 0.6816E+02 0.1038E-03
633 0.6887E+02 0.7482E-04
634 0.6958E+02 0.4782E-04
635 0.7029E+02 0.2286E-04"""}
636         form = TaskForm_remd_a(initial=data)     
637      else:
638         form = TaskForm_remd_a(request.POST,request.FILES)
639         if form.is_valid():
640              task.name=form.cleaned_data["name"]
641              task.type="remd"
642
643              basename = str(task.owner)
644              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
645              task.jobdirname = "_".join([basename, suffix])
646
647              pdbid=form.cleaned_data["pdbid"]
648              if pdbid:
649               task.myfile1=load_pdbid(pdbid,task.jobdirname)
650               task.pdbcode=pdbid
651              else:
652               task.myfile1=form.cleaned_data["file1"]
653              task.md_start=form.cleaned_data["md_start"]  
654              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
655
656              task.md_seq=""
657              if task.md_start == "pdbstart" or task.md_pdbref:
658                seq,task.ssbond=from_pdb(task.myfile1)
659                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
660              else:
661                seq=seq_add_x(form.cleaned_data["md_seq"])
662                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
663
664              for i in range(0,len(seq),40):
665                 task.md_seq=task.md_seq+seq[i:i+40]+" "
666
667              if task.md_start != "pdbstart":
668                 task.ssbond=''
669
670              task.md_seed=form.cleaned_data["md_seed"]
671              task.md_nstep=form.cleaned_data["md_nstep"]
672              task.md_dt=form.cleaned_data["md_dt"]
673              task.md_lang=form.cleaned_data["md_lang"]
674              task.md_tau=form.cleaned_data["md_tau"]
675              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
676              task.min_maxfun=form.cleaned_data["min_maxfun"]
677              task.remd_nrep=form.cleaned_data["remd_nrep"]
678              task.remd_nstex=form.cleaned_data["remd_nstex"]
679              task.md_ntwx=form.cleaned_data["md_ntwx"]             
680              task.md_ntwe=form.cleaned_data["md_ntwe"]
681              task.md_respa=form.cleaned_data["md_respa"]
682              if any(c.islower() for c in seq):
683               task.md_respa=False
684               task.damino=True
685              
686 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
687 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
688
689              task.boxx=form.cleaned_data["boxx"]
690              task.boxy=form.cleaned_data["boxy"]             
691              task.boxz=form.cleaned_data["boxz"]             
692
693              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
694              task.unres_ff=form.cleaned_data["unres_ff"]
695              
696              task.scal_rad = form.cleaned_data["scal_rad"]
697              task.saxs_data = form.cleaned_data["saxs_data"]
698              task.wsaxs = form.cleaned_data["wsaxs"]
699              
700              task.save()
701              return redirect('addmlist',task_id=task.id)
702     else:
703         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
704         form = TaskForm_remd_a(initial=data)
705     basic_adv=False
706     p_type='replica exchange molecular dynamics - advanced options'
707     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
708
709 @login_required
710 def add_dock(request,task_id):
711     task = get_object_or_404(Task, id=task_id)
712     if request.method == 'POST':
713      if '_example' in request.POST:
714         data= {'name':task.name,'pdbid':'1L2Y','md_seed':-39912345}
715         form = TaskForm_dock(initial=data)     
716      else:
717         form = TaskForm_dock(request.POST,request.FILES)
718         if form.is_valid():
719              task.name=form.cleaned_data["name"]
720              task.type="dock"
721
722              basename = str(task.owner)
723              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
724              task.jobdirname = "_".join([basename, suffix])
725
726              pdbid=form.cleaned_data["pdbid"]
727              if pdbid:
728               task.myfile1=load_pdbid(pdbid,task.jobdirname)
729               task.pdbcode=pdbid
730              else:
731               task.myfile1=form.cleaned_data["file1"]
732
733              pdbid2=form.cleaned_data["pdbid2"]
734              if pdbid2:
735               task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
736               task.pdbcode2=pdbid2
737              else:
738               task.myfile2=form.cleaned_data["file2"]
739
740              task.md_ntwx=task.remd_nstex 
741              task.md_start="pdbstart"
742              task.md_pdbref=True
743              task.md_respa=False
744              task.ssbond=""
745
746              task.md_seq=""
747
748              seq1,ssbond1=from_pdb(task.myfile1)
749              seq2,ssbond2=from_pdb(task.myfile2)
750              
751              if seq1[-1]=='X' and seq2[0]=='X':
752               seq=seq1+seq2
753              elif seq1[-1]!='X' and seq2[0]!='X':
754               seq=seq1+'XX'+seq2
755              else:
756               seq=seq1+'X'+seq2
757              
758              for i in range(0,len(seq),40):
759                 task.md_seq=task.md_seq+seq[i:i+40]+" "
760
761              task.md_seed=form.cleaned_data["md_seed"]
762
763              task.md_nstep=form.cleaned_data["md_nstep"]
764
765              if any(c.islower() for c in seq):
766               task.md_respa=False
767               task.damino=True
768
769
770              task.ready=True
771              
772              
773              task.save()
774              if is_lazy_user(request.user):
775               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
776              else:
777               return redirect('/')
778     else:
779         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
780         form = TaskForm_dock(initial=data)
781     basic_adv=True
782     p_type='docking'
783     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
784
785 @login_required
786 def add_dock_a(request,task_id):
787     task = get_object_or_404(Task, id=task_id)
788     if request.method == 'POST':
789      if '_example' in request.POST:
790         data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
791         form = TaskForm_remd(initial=data)     
792      else:
793         form = TaskForm_remd(request.POST,request.FILES)
794         if form.is_valid():
795              task.name=form.cleaned_data["name"]
796              task.type="remd"
797              task.md_start=form.cleaned_data["md_start"]
798
799              basename = str(task.owner)
800              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
801              task.jobdirname = "_".join([basename, suffix])
802
803              pdbid=form.cleaned_data["pdbid"]
804              if pdbid:
805               task.myfile1=load_pdbid(pdbid,task.jobdirname)
806               task.pdbcode=pdbid
807              else:
808               task.myfile1=form.cleaned_data["file1"]
809              task.md_pdbref=form.cleaned_data["md_pdbref"]
810              task.md_ntwx=task.remd_nstex 
811
812              task.md_seq=""
813              if task.md_start == "pdbstart" or task.md_pdbref:
814                seq,task.ssbond=from_pdb(task.myfile1)
815              else:
816                seq=seq_add_x(form.cleaned_data["md_seq"])
817              for i in range(0,len(seq),40):
818                 task.md_seq=task.md_seq+seq[i:i+40]+" "
819
820              if task.md_start != "pdbstart":
821                 task.ssbond=''
822
823              task.md_seed=form.cleaned_data["md_seed"]
824
825              task.md_nstep=form.cleaned_data["md_nstep"]
826
827              if any(c.islower() for c in seq):
828               task.md_respa=False
829               task.damino=True
830
831
832              task.ready=True
833              
834              
835              task.save()
836              if is_lazy_user(request.user):
837               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
838              else:
839               return redirect('/')
840     else:
841         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
842         form = TaskForm_remd(initial=data)
843     basic_adv=False
844     p_type='docking - advanced options'
845     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
846
847
848
849 @login_required
850 def addmlist(request,task_id):
851     task = get_object_or_404(Task, id=task_id)
852     if request.method == 'POST':
853         form = TaskForm_list(task.remd_nrep,request.POST)
854         if form.is_valid():
855              task.remd_multi_t=form.cleaned_data["temperatures"]
856              task.remd_multi_m=form.cleaned_data["multiplexing"]             
857              task.ready=True
858              
859              task.save()
860              if is_lazy_user(request.user):
861               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
862              else:
863               return redirect('/')
864     else:
865       if task.example == 'casp12':
866         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
867         '["2", "2", "2", "2", "2", "2", "2", "2"]',
868         'temperatures':
869         '["270", "280", "290", "300", "310", "320", "330", "340"]'
870         }
871       elif task.unres_ff == 'FF2':
872         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
873         '["1", "1", "1", "1", "1", "1", "1", "1"]',
874         'temperatures':
875         '["270", "280", "290", "300", "310", "320", "330", "345"]'
876         }
877       else: 
878         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
879         '["1", "1", "1", "1", "1", "1", "1", "1"]',
880         'temperatures':
881         '["250", "260", "270", "280", "290", "300", "315", "330"]'
882         }
883       
884       form = TaskForm_list(task.remd_nrep,initial=data)
885     p_type='replica exchange molecular dynamics - advanced options'
886     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
887
888 @login_required
889 def details(request,task_id):
890     task = get_object_or_404(Task, id=task_id)
891     return render(request, "details.html",{'task':task})
892
893
894 def details1(request,user_id,task_id):
895     task = get_object_or_404(Task, id=task_id)
896     return render(request, "details1.html",{'task':task})
897
898
899 @login_required
900 def delete(request, task_id):
901     Task.objects.get(id=task_id).delete()
902     return redirect('/')
903
904 def refresh_done1(request, task_id):
905     task = get_object_or_404(Task, id=task_id)
906     user = task.owner
907     refresh_done0(task)
908
909     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
910     njob=0
911     nq=0
912     for line in proc.stdout:
913       if 'piasek4' in line:
914         if line.split()[1]=='test_server':
915           njob+=1
916           if line.split()[-2]=='Q':
917             nq+=1
918     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
919
920     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
921
922
923 @login_required
924 def refresh_done(request):
925     user = request.user
926     tasks = Task.objects.filter(owner=user).order_by('-created_date')
927     alldone = 1
928     for task in tasks:
929       refresh_done0(task)
930       if not task.done:
931          alldone=0
932
933     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
934     njob=0
935     nq=0
936     for line in proc.stdout:
937       if 'piasek4' in line:
938         if line.split()[1]=='test_server':
939           njob+=1
940           if line.split()[-2]=='Q':
941             nq+=1
942     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
943
944     if is_lazy_user(request.user):
945      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
946     else:
947      return render(request, "index.html", {
948                 'tasks': tasks ,
949                 'variable' : variable,
950                 'alldone': alldone
951                         })
952
953       
954 def refresh_done0(task):
955       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
956          task.done=True
957
958          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
959
960            if task.type=='min' or task.type=='md':
961              text=""
962              for line in f:
963                if 'ETOT' in line:
964                   task.etot=line.split()[1]
965
966                if 'RMS deviation' in line:
967                   text=text+line
968                   i=1
969                   for line1 in f:
970                      text=text+line1
971                      i+=1
972                      if i>6:
973                        break
974                if 'Total wall' in line:
975                   text=text+line
976                   
977            elif task.type=='remd' or task.type=='dock':
978              j=0
979              text="Acceptance for replica exchanges and number of exchange attempts\n"
980              for line in f:
981                         
982                if 'ACC' in line:
983                     j+=1
984                     text=text+' '.join(line.split()[2:])+"\n"
985                     if j==task.remd_nrep:
986                        j=1
987                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
988
989                if 'Total wall' in line:
990                   text=text+line
991                        
992          task.results_text=text
993
994
995          if task.md_pdbref and task.type=='remd':
996          
997           for i in range(1,6):
998            try:
999             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
1000                  line=f.readline()
1001                  if i==1:
1002                      task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
1003                  elif i==2:
1004                      task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
1005                  elif i==3:
1006                      task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
1007                  elif i==4:
1008                      task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
1009                  elif i==5:
1010                      task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
1011            except EnvironmentError:
1012             print 'file_wham_T*pdb open error'
1013           for i in range(1,6):
1014             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
1015                text=''
1016                for line in f:
1017                  if 'RMSD of  the common residues=' in line:
1018                    text=' RMSD='+line.split()[5]
1019                  if 'TM-score    =' in line:
1020                    text=text+' TMscore='+line.split()[2]
1021                  if 'GDT-TS-score=' in line:
1022                    text=text+' GDT_TS='+line.split()[1]
1023                     
1024                if i==1:
1025                      task.remd_model1=task.remd_model1+text
1026                elif i==2:
1027                      task.remd_model2=task.remd_model2+text
1028                elif i==3:
1029                      task.remd_model3=task.remd_model3+text
1030                elif i==4:
1031                      task.remd_model4=task.remd_model4+text
1032                elif i==5:
1033                      task.remd_model5=task.remd_model5+text
1034
1035
1036
1037          if task.type=='remd':  
1038           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
1039
1040            for line in f:
1041              if 'sumprob' in line:
1042                 i=0
1043                 for line1 in f:
1044                   i+=1
1045                   if i>6:
1046                        break
1047                   if i==1:
1048                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
1049                   elif i==2:
1050                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
1051                   elif i==3:
1052                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
1053                   elif i==4:
1054                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
1055                   elif i==5:
1056                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
1057                      
1058          
1059
1060          task.save()
1061       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
1062          if (task.type=='min'):
1063            task.running =1
1064            with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1065               line=''
1066               for line in f:
1067                 pass
1068               if line != '':
1069                 last = line.split()[0]
1070               else:
1071                 last = 0
1072            try:
1073               task.running=int(1+int(last)*100.0/task.min_maxmin)
1074            except:
1075               pass
1076            if task.running>100:
1077               task.running=100
1078          else:
1079            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
1080               line=''
1081               for line in f:
1082                 pass
1083               if line != '':
1084                 last = line.split()[0]
1085               else:
1086                 last = 0
1087            task.running=int(1+int(last)*100.0/task.md_nstep)
1088            if task.running>100:
1089              task.running=100
1090          task.save()
1091
1092     
1093       return