restart for md and remd
[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              task.md_total_steps=task.md_nstep
296
297              basename = str(task.owner)
298              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
299              task.jobdirname = "_".join([basename, suffix])
300
301              pdbid=form.cleaned_data["pdbid"]
302              if pdbid:
303               task.myfile1=load_pdbid(pdbid,task.jobdirname)
304               task.pdbcode=pdbid
305              else:
306               task.myfile1=form.cleaned_data["file1"]
307              task.md_pdbref=form.cleaned_data["md_pdbref"]             
308
309              task.md_seq=""
310              if task.md_start == "pdbstart" or task.md_pdbref:
311                seq,task.ssbond=from_pdb(task.myfile1)
312              else:
313                seq=seq_add_x(form.cleaned_data["md_seq"])
314                        
315              for i in range(0,len(seq),40):
316                 task.md_seq=task.md_seq+seq[i:i+40]+" "
317              
318              if task.md_start != "pdbstart":
319                 task.ssbond=''
320
321              if any(c.islower() for c in seq):
322               task.md_respa=False
323               task.damino=True
324
325              task.ready=True
326              
327              task.save()
328              if is_lazy_user(request.user):
329               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
330              else:
331               return redirect('/')
332     else:
333         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
334         form = TaskForm_md(initial=data)
335     basic_adv=True
336     p_type='molecular dynamics'
337     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
338
339 @login_required
340 def add_md_a(request,task_id):
341     task = get_object_or_404(Task, id=task_id)
342     if request.method == 'POST':
343      if '_example' in request.POST:
344         data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
345          'md_pdbref':True,'md_mdpdb':True,'md_seed':-39912345}
346         form = TaskForm_md_a(initial=data)     
347      else:
348         form = TaskForm_md_a(request.POST,request.FILES)
349         if form.is_valid():
350              task.name=form.cleaned_data["name"]
351              task.type="md"
352
353              basename = str(task.owner)
354              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
355              task.jobdirname = "_".join([basename, suffix])
356
357              pdbid=form.cleaned_data["pdbid"]
358              if pdbid:
359               task.myfile1=load_pdbid(pdbid,task.jobdirname)
360               task.pdbcode=pdbid
361              else:
362               task.myfile1=form.cleaned_data["file1"]
363              task.md_start=form.cleaned_data["md_start"]
364              task.md_pdbref=form.cleaned_data["md_pdbref"]             
365
366              task.md_seq=""
367              if task.md_start == "pdbstart" or task.md_pdbref:
368                seq,task.ssbond=from_pdb(task.myfile1)
369                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
370              else:
371                seq=seq_add_x(form.cleaned_data["md_seq"])
372                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
373
374              for i in range(0,len(seq),40):
375                 task.md_seq=task.md_seq+seq[i:i+40]+" "
376
377              if task.md_start != "pdbstart":
378                 task.ssbond=''
379
380              task.md_seed=form.cleaned_data["md_seed"]
381
382              task.md_temp=form.cleaned_data["md_temp"]
383              task.md_nstep=form.cleaned_data["md_nstep"]
384              task.md_total_steps=task.md_nstep
385              task.md_ntwe=form.cleaned_data["md_ntwe"]
386              task.md_ntwx=form.cleaned_data["md_ntwx"]
387              task.md_dt=form.cleaned_data["md_dt"]
388              task.md_lang=form.cleaned_data["md_lang"]
389              task.md_tau=form.cleaned_data["md_tau"]
390              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
391              task.md_mdpdb=form.cleaned_data["md_mdpdb"]
392              task.unres_ff=form.cleaned_data["unres_ff"]
393              task.md_respa=form.cleaned_data["md_respa"]             
394              if any(c.islower() for c in seq):
395               task.md_respa=False
396               task.damino=True
397              task.boxx=form.cleaned_data["boxx"]
398              task.boxy=form.cleaned_data["boxy"]             
399              task.boxz=form.cleaned_data["boxz"]             
400
401              
402              task.ready=True
403              
404              task.save()
405              if is_lazy_user(request.user):
406               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
407              else:
408               return redirect('/')
409     else:
410         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
411         form = TaskForm_md_a(initial=data)
412     basic_adv=False
413     p_type='molecular dynamics - advanced options'
414     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
415
416 @login_required
417 def add_remd(request,task_id):
418     task = get_object_or_404(Task, id=task_id)
419     if request.method == 'POST':
420      if '_example' in request.POST:
421         data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
422         form = TaskForm_remd(initial=data)     
423      else:
424         form = TaskForm_remd(request.POST,request.FILES)
425         if form.is_valid():
426              task.name=form.cleaned_data["name"]
427              task.type="remd"
428              task.md_start=form.cleaned_data["md_start"]
429
430              basename = str(task.owner)
431              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
432              task.jobdirname = "_".join([basename, suffix])
433
434              pdbid=form.cleaned_data["pdbid"]
435              if pdbid:
436               task.myfile1=load_pdbid(pdbid,task.jobdirname)
437               task.pdbcode=pdbid
438              else:
439               task.myfile1=form.cleaned_data["file1"]
440              task.md_pdbref=form.cleaned_data["md_pdbref"]
441              task.md_ntwx=task.remd_nstex 
442
443              task.md_seq=""
444              if task.md_start == "pdbstart" or task.md_pdbref:
445                seq,task.ssbond=from_pdb(task.myfile1)
446              else:
447                seq=seq_add_x(form.cleaned_data["md_seq"])
448              for i in range(0,len(seq),40):
449                 task.md_seq=task.md_seq+seq[i:i+40]+" "
450
451              if task.md_start != "pdbstart":
452                 task.ssbond=''
453
454              task.md_seed=form.cleaned_data["md_seed"]
455
456              task.md_nstep=form.cleaned_data["md_nstep"]
457              task.md_total_steps=task.md_nstep
458
459              if any(c.islower() for c in seq):
460               task.md_respa=False
461               task.damino=True
462
463
464              task.ready=True
465              
466              
467              task.save()
468              if is_lazy_user(request.user):
469               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
470              else:
471               return redirect('/')
472     else:
473         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
474         form = TaskForm_remd(initial=data)
475     basic_adv=True
476     p_type='replica exchange molecular dynamics'
477     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
478
479 @login_required
480 def add_remd_a(request,task_id):
481     from django.core.files.uploadedfile import UploadedFile
482     task = get_object_or_404(Task, id=task_id)
483     if request.method == 'POST':
484      if '_example' in request.POST:
485         data= {'name':task.name,'pdbid':'5G3Q:B','md_pdbref':True,
486          'md_nstep':2000000,'md_lang':'berendsen','unres_ff':'FF2','md_seed':-39912345,
487          'remd_cluter_temp':290,'md_2d':'--EEEEEEE------EEEEEE------EEEEEE------HHHHHHHHHHH---HHHHHHHHHHHHHHHHHHHHHHH---'}
488         form = TaskForm_remd_a(initial=data)    
489         task.example='casp12'
490         task.save() 
491      elif '_example_saxs' in request.POST:
492         data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
493          'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
494          'remd_cluter_temp':270, 
495          'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
496 """ 0.5     1.33868e-02
497  1.5     1.95880e-02
498  2.5     2.68896e-02
499  3.5     3.43737e-02
500  4.5     4.07099e-02
501  5.5     4.47875e-02
502  6.5     4.63486e-02
503  7.5     4.60514e-02
504  8.5     4.49130e-02
505  9.5     4.36744e-02
506 10.5     4.26085e-02
507 11.5     4.17464e-02
508 12.5     4.11217e-02
509 13.5     4.07835e-02
510 14.5     4.06776e-02
511 15.5     4.06060e-02
512 16.5     4.03241e-02
513 17.5     3.96655e-02
514 18.5     3.85756e-02
515 19.5     3.70537e-02
516 20.5     3.50982e-02
517 21.5     3.27236e-02
518 22.5     3.00046e-02
519 23.5     2.70643e-02
520 24.5     2.40044e-02
521 25.5     2.08595e-02
522 26.5     1.76342e-02
523 27.5     1.43802e-02
524 28.5     1.12281e-02
525 29.5     8.34574e-03
526 30.5     5.87354e-03
527 31.5     3.88732e-03
528 32.5     2.39755e-03
529 33.5     1.36323e-03
530 34.5     7.06686e-04
531 35.5     3.30592e-04
532 36.5     1.38359e-04"""}
533         form = TaskForm_remd_a(initial=data)     
534      elif '_example_saxs1' in request.POST:
535         data= {'name':task.name,'pdbid':'2KMS','md_pdbref':True,'md_start':'pdbstart',
536         'md_2d':'----EEEEEE-EEEEE-------EEEEEEEEE--EEEEEE-EEEE---EEEEEEEEE-----EEEEEEE-EEE-HHHHH-EEEE-EEEEEEEEE----EEEEEE---EEE-----',
537          'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
538          'remd_cluter_temp':280, 'min_maxfun':50,
539          'scal_rad':5.0,'wsaxs':1000.0,'saxs_data':
540 """0.7100E-00 0.2036E-03
541 0.1420E+01 0.4221E-03
542 0.2130E+01 0.6548E-03
543 0.2840E+01 0.9001E-03
544 0.3550E+01 0.1156E-02
545 0.4260E+01 0.1421E-02
546 0.4970E+01 0.1692E-02
547 0.5680E+01 0.1965E-02
548 0.6390E+01 0.2239E-02
549 0.7100E+01 0.2509E-02
550 0.7810E+01 0.2772E-02
551 0.8520E+01 0.3025E-02
552 0.9230E+01 0.3265E-02
553 0.9940E+01 0.3489E-02
554 0.1065E+02 0.3694E-02
555 0.1136E+02 0.3878E-02
556 0.1207E+02 0.4039E-02
557 0.1278E+02 0.4177E-02
558 0.1349E+02 0.4289E-02
559 0.1420E+02 0.4377E-02
560 0.1491E+02 0.4439E-02
561 0.1562E+02 0.4478E-02
562 0.1633E+02 0.4493E-02
563 0.1704E+02 0.4487E-02
564 0.1775E+02 0.4461E-02
565 0.1846E+02 0.4418E-02
566 0.1917E+02 0.4361E-02
567 0.1988E+02 0.4291E-02
568 0.2059E+02 0.4211E-02
569 0.2130E+02 0.4125E-02
570 0.2201E+02 0.4034E-02
571 0.2272E+02 0.3942E-02
572 0.2343E+02 0.3850E-02
573 0.2414E+02 0.3761E-02
574 0.2485E+02 0.3677E-02
575 0.2556E+02 0.3598E-02
576 0.2627E+02 0.3526E-02
577 0.2698E+02 0.3462E-02
578 0.2769E+02 0.3405E-02
579 0.2840E+02 0.3356E-02
580 0.2911E+02 0.3315E-02
581 0.2982E+02 0.3280E-02
582 0.3053E+02 0.3251E-02
583 0.3124E+02 0.3226E-02
584 0.3195E+02 0.3205E-02
585 0.3266E+02 0.3186E-02
586 0.3337E+02 0.3167E-02
587 0.3408E+02 0.3147E-02
588 0.3479E+02 0.3125E-02
589 0.3550E+02 0.3099E-02
590 0.3621E+02 0.3068E-02
591 0.3692E+02 0.3031E-02
592 0.3763E+02 0.2987E-02
593 0.3834E+02 0.2937E-02
594 0.3905E+02 0.2878E-02
595 0.3976E+02 0.2812E-02
596 0.4047E+02 0.2739E-02
597 0.4118E+02 0.2658E-02
598 0.4189E+02 0.2571E-02
599 0.4260E+02 0.2478E-02
600 0.4331E+02 0.2381E-02
601 0.4402E+02 0.2279E-02
602 0.4473E+02 0.2174E-02
603 0.4544E+02 0.2068E-02
604 0.4615E+02 0.1960E-02
605 0.4686E+02 0.1853E-02
606 0.4757E+02 0.1748E-02
607 0.4828E+02 0.1644E-02
608 0.4899E+02 0.1544E-02
609 0.4970E+02 0.1447E-02
610 0.5041E+02 0.1355E-02
611 0.5112E+02 0.1267E-02
612 0.5183E+02 0.1184E-02
613 0.5254E+02 0.1106E-02
614 0.5325E+02 0.1033E-02
615 0.5396E+02 0.9646E-03
616 0.5467E+02 0.9008E-03
617 0.5538E+02 0.8411E-03
618 0.5609E+02 0.7852E-03
619 0.5680E+02 0.7327E-03
620 0.5751E+02 0.6831E-03
621 0.5822E+02 0.6360E-03
622 0.5893E+02 0.5909E-03
623 0.5964E+02 0.5475E-03
624 0.6035E+02 0.5055E-03
625 0.6106E+02 0.4646E-03
626 0.6177E+02 0.4245E-03
627 0.6248E+02 0.3853E-03
628 0.6319E+02 0.3467E-03
629 0.6390E+02 0.3089E-03
630 0.6461E+02 0.2719E-03
631 0.6532E+02 0.2357E-03
632 0.6603E+02 0.2007E-03
633 0.6674E+02 0.1669E-03
634 0.6745E+02 0.1345E-03
635 0.6816E+02 0.1038E-03
636 0.6887E+02 0.7482E-04
637 0.6958E+02 0.4782E-04
638 0.7029E+02 0.2286E-04"""}
639         form = TaskForm_remd_a(initial=data)     
640      else:
641         form = TaskForm_remd_a(request.POST,request.FILES)
642         if form.is_valid():
643              task.name=form.cleaned_data["name"]
644              task.type="remd"
645
646              basename = str(task.owner)
647              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
648              task.jobdirname = "_".join([basename, suffix])
649
650              pdbid=form.cleaned_data["pdbid"]
651              if pdbid:
652               task.myfile1=load_pdbid(pdbid,task.jobdirname)
653               task.pdbcode=pdbid
654              else:
655               task.myfile1=form.cleaned_data["file1"]
656              task.md_start=form.cleaned_data["md_start"]  
657              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
658
659              task.md_seq=""
660              if task.md_start == "pdbstart" or task.md_pdbref:
661                seq,task.ssbond=from_pdb(task.myfile1)
662                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
663              else:
664                seq=seq_add_x(form.cleaned_data["md_seq"])
665                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
666
667              for i in range(0,len(seq),40):
668                 task.md_seq=task.md_seq+seq[i:i+40]+" "
669
670              if task.md_start != "pdbstart":
671                 task.ssbond=''
672
673              task.md_seed=form.cleaned_data["md_seed"]
674              task.md_nstep=form.cleaned_data["md_nstep"]
675              task.md_total_steps=task.md_nstep
676              task.md_dt=form.cleaned_data["md_dt"]
677              task.md_lang=form.cleaned_data["md_lang"]
678              task.md_tau=form.cleaned_data["md_tau"]
679              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
680              task.min_maxfun=form.cleaned_data["min_maxfun"]
681              task.remd_nrep=form.cleaned_data["remd_nrep"]
682              task.remd_nstex=form.cleaned_data["remd_nstex"]
683              task.md_ntwx=form.cleaned_data["md_ntwx"]             
684              task.md_ntwe=form.cleaned_data["md_ntwe"]
685              task.md_respa=form.cleaned_data["md_respa"]
686              if any(c.islower() for c in seq):
687               task.md_respa=False
688               task.damino=True
689              
690 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
691 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
692
693              task.boxx=form.cleaned_data["boxx"]
694              task.boxy=form.cleaned_data["boxy"]             
695              task.boxz=form.cleaned_data["boxz"]             
696
697              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
698              task.unres_ff=form.cleaned_data["unres_ff"]
699              
700              task.scal_rad = form.cleaned_data["scal_rad"]
701              task.saxs_data = form.cleaned_data["saxs_data"]
702              task.wsaxs = form.cleaned_data["wsaxs"]
703              
704              task.save()
705              return redirect('addmlist',task_id=task.id)
706     else:
707         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
708         form = TaskForm_remd_a(initial=data)
709     basic_adv=False
710     p_type='replica exchange molecular dynamics - advanced options'
711     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
712
713 @login_required
714 def add_dock(request,task_id):
715     task = get_object_or_404(Task, id=task_id)
716     if request.method == 'POST':
717      if '_example' in request.POST:
718         data= {'name':task.name,'pdbid':'1L2Y','md_seed':-39912345}
719         form = TaskForm_dock(initial=data)     
720      else:
721         form = TaskForm_dock(request.POST,request.FILES)
722         if form.is_valid():
723              task.name=form.cleaned_data["name"]
724              task.type="dock"
725
726              basename = str(task.owner)
727              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
728              task.jobdirname = "_".join([basename, suffix])
729
730              pdbid=form.cleaned_data["pdbid"]
731              if pdbid:
732               task.myfile1=load_pdbid(pdbid,task.jobdirname)
733               task.pdbcode=pdbid
734              else:
735               task.myfile1=form.cleaned_data["file1"]
736
737              pdbid2=form.cleaned_data["pdbid2"]
738              if pdbid2:
739               task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
740               task.pdbcode2=pdbid2
741              else:
742               task.myfile2=form.cleaned_data["file2"]
743
744              task.md_ntwx=task.remd_nstex 
745              task.md_start="pdbstart"
746              task.md_pdbref=True
747              task.md_respa=False
748              task.ssbond=""
749
750              task.md_seq=""
751
752              seq1,ssbond1=from_pdb(task.myfile1)
753              seq2,ssbond2=from_pdb(task.myfile2)
754              
755              if seq1[-1]=='X' and seq2[0]=='X':
756               seq=seq1+seq2
757              elif seq1[-1]!='X' and seq2[0]!='X':
758               seq=seq1+'XX'+seq2
759              else:
760               seq=seq1+'X'+seq2
761              
762              for i in range(0,len(seq),40):
763                 task.md_seq=task.md_seq+seq[i:i+40]+" "
764
765              task.md_seed=form.cleaned_data["md_seed"]
766
767              task.md_nstep=form.cleaned_data["md_nstep"]
768
769              if any(c.islower() for c in seq):
770               task.md_respa=False
771               task.damino=True
772
773
774              task.ready=True
775              
776              
777              task.save()
778              if is_lazy_user(request.user):
779               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
780              else:
781               return redirect('/')
782     else:
783         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
784         form = TaskForm_dock(initial=data)
785     basic_adv=True
786     p_type='docking'
787     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
788
789 @login_required
790 def add_dock_a(request,task_id):
791     task = get_object_or_404(Task, id=task_id)
792     if request.method == 'POST':
793      if '_example' in request.POST:
794         data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
795         form = TaskForm_remd(initial=data)     
796      else:
797         form = TaskForm_remd(request.POST,request.FILES)
798         if form.is_valid():
799              task.name=form.cleaned_data["name"]
800              task.type="remd"
801              task.md_start=form.cleaned_data["md_start"]
802
803              basename = str(task.owner)
804              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
805              task.jobdirname = "_".join([basename, suffix])
806
807              pdbid=form.cleaned_data["pdbid"]
808              if pdbid:
809               task.myfile1=load_pdbid(pdbid,task.jobdirname)
810               task.pdbcode=pdbid
811              else:
812               task.myfile1=form.cleaned_data["file1"]
813              task.md_pdbref=form.cleaned_data["md_pdbref"]
814              task.md_ntwx=task.remd_nstex 
815
816              task.md_seq=""
817              if task.md_start == "pdbstart" or task.md_pdbref:
818                seq,task.ssbond=from_pdb(task.myfile1)
819              else:
820                seq=seq_add_x(form.cleaned_data["md_seq"])
821              for i in range(0,len(seq),40):
822                 task.md_seq=task.md_seq+seq[i:i+40]+" "
823
824              if task.md_start != "pdbstart":
825                 task.ssbond=''
826
827              task.md_seed=form.cleaned_data["md_seed"]
828
829              task.md_nstep=form.cleaned_data["md_nstep"]
830
831              if any(c.islower() for c in seq):
832               task.md_respa=False
833               task.damino=True
834
835
836              task.ready=True
837              
838              
839              task.save()
840              if is_lazy_user(request.user):
841               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
842              else:
843               return redirect('/')
844     else:
845         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
846         form = TaskForm_remd(initial=data)
847     basic_adv=False
848     p_type='docking - advanced options'
849     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
850
851
852
853 @login_required
854 def addmlist(request,task_id):
855     task = get_object_or_404(Task, id=task_id)
856     if request.method == 'POST':
857         form = TaskForm_list(task.remd_nrep,request.POST)
858         if form.is_valid():
859              task.remd_multi_t=form.cleaned_data["temperatures"]
860              task.remd_multi_m=form.cleaned_data["multiplexing"]             
861              task.ready=True
862              
863              task.save()
864              if is_lazy_user(request.user):
865               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
866              else:
867               return redirect('/')
868     else:
869       if task.example == 'casp12':
870         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
871         '["2", "2", "2", "2", "2", "2", "2", "2"]',
872         'temperatures':
873         '["270", "280", "290", "300", "310", "320", "330", "340"]'
874         }
875       elif task.unres_ff == 'FF2':
876         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
877         '["1", "1", "1", "1", "1", "1", "1", "1"]',
878         'temperatures':
879         '["270", "280", "290", "300", "310", "320", "330", "345"]'
880         }
881       else: 
882         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
883         '["1", "1", "1", "1", "1", "1", "1", "1"]',
884         'temperatures':
885         '["250", "260", "270", "280", "290", "300", "315", "330"]'
886         }
887       
888       form = TaskForm_list(task.remd_nrep,initial=data)
889     p_type='replica exchange molecular dynamics - advanced options'
890     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
891
892 @login_required
893 def details(request,task_id):
894     task = get_object_or_404(Task, id=task_id)
895     return render(request, "details.html",{'task':task})
896
897
898 def details1(request,user_id,task_id):
899     task = get_object_or_404(Task, id=task_id)
900     return render(request, "details1.html",{'task':task})
901
902
903 @login_required
904 def delete(request, task_id):
905     Task.objects.get(id=task_id).delete()
906     return redirect('/')
907
908 @login_required
909 def restart(request, task_id):
910     task = get_object_or_404(Task, id=task_id)
911     if os.path.isfile(task.jobdirname+'/finished'):    
912       os.remove(task.jobdirname+'/finished')
913     task.running =1
914     task.done=False
915     task.md_total_steps = task.md_total_steps+task.md_nstep
916     task.save()
917     if task.type == 'md':
918       os.chdir(task.jobdirname)
919       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
920       os.chdir('..')
921     elif task.type == 'remd':
922       os.chdir(task.jobdirname)
923       tmp1=json.loads(task.remd_multi_m)
924       nreplicas=sum(map(int, tmp1))
925       with open('file_wham.inp','r') as f1, open ('file_wham.tmp','w') as f2:
926         for line in f1:
927           if 'rec_end=' in line:
928             rec=task.md_total_steps/task.md_ntwx
929             f2.write('nfile_cx=1 rec_start='+str(rec/10)
930                +' rec_end='+str(rec)+' totraj='+str(nreplicas)+'\n')
931           elif 'isampl=' in line:
932             if task.md_total_steps/task.md_ntwx*nreplicas<=8000:
933                 isampl=1
934             else:
935                 isampl=int(task.md_total_steps/task.md_ntwx*nreplicas/8000)
936             f2.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
937           else:
938             f2.write(line)
939       os.remove('file_wham.inp')
940       os.rename('file_wham.tmp','file_wham.inp')
941       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
942       os.chdir('..')
943     return redirect('/')
944
945
946 def refresh_done1(request, task_id):
947     task = get_object_or_404(Task, id=task_id)
948     user = task.owner
949     refresh_done0(task)
950
951     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
952     njob=0
953     nq=0
954     for line in proc.stdout:
955       if 'piasek4' in line:
956         if line.split()[1]=='test_server':
957           njob+=1
958           if line.split()[-2]=='Q':
959             nq+=1
960     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
961
962     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
963
964
965 @login_required
966 def refresh_done(request):
967     user = request.user
968     tasks = Task.objects.filter(owner=user).order_by('-created_date')
969     alldone = 1
970     for task in tasks:
971       refresh_done0(task)
972       if not task.done:
973          alldone=0
974
975     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
976     njob=0
977     nq=0
978     for line in proc.stdout:
979       if 'piasek4' in line:
980         if line.split()[1]=='test_server':
981           njob+=1
982           if line.split()[-2]=='Q':
983             nq+=1
984     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
985
986     if is_lazy_user(request.user):
987      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
988     else:
989      return render(request, "index.html", {
990                 'tasks': tasks ,
991                 'variable' : variable,
992                 'alldone': alldone
993                         })
994
995       
996 def refresh_done0(task):
997       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
998          task.done=True
999
1000          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1001
1002            if task.type=='min' or task.type=='md':
1003              text=""
1004              for line in f:
1005                if 'ETOT' in line:
1006                   task.etot=line.split()[1]
1007
1008                if 'RMS deviation' in line:
1009                   text=text+line
1010                   i=1
1011                   for line1 in f:
1012                      text=text+line1
1013                      i+=1
1014                      if i>6:
1015                        break
1016                if 'Total wall' in line:
1017                   text=text+line
1018                   
1019            elif task.type=='remd' or task.type=='dock':
1020              j=0
1021              text="Acceptance for replica exchanges and number of exchange attempts\n"
1022              for line in f:
1023                         
1024                if 'ACC' in line:
1025                     j+=1
1026                     text=text+' '.join(line.split()[2:])+"\n"
1027                     if j==task.remd_nrep:
1028                        j=1
1029                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
1030
1031                if 'Total wall' in line:
1032                   text=text+line
1033                        
1034          task.results_text=text
1035
1036
1037          if task.md_pdbref and task.type=='remd':
1038          
1039           for i in range(1,6):
1040            try:
1041             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
1042                  line=f.readline()
1043                  if i==1:
1044                      task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
1045                  elif i==2:
1046                      task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
1047                  elif i==3:
1048                      task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
1049                  elif i==4:
1050                      task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
1051                  elif i==5:
1052                      task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
1053            except EnvironmentError:
1054             print 'file_wham_T*pdb open error'
1055           for i in range(1,6):
1056             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
1057                text=''
1058                for line in f:
1059                  if 'RMSD of  the common residues=' in line:
1060                    text=' RMSD='+line.split()[5]
1061                  if 'TM-score    =' in line:
1062                    text=text+' TMscore='+line.split()[2]
1063                  if 'GDT-TS-score=' in line:
1064                    text=text+' GDT_TS='+line.split()[1]
1065                     
1066                if i==1:
1067                      task.remd_model1=task.remd_model1+text
1068                elif i==2:
1069                      task.remd_model2=task.remd_model2+text
1070                elif i==3:
1071                      task.remd_model3=task.remd_model3+text
1072                elif i==4:
1073                      task.remd_model4=task.remd_model4+text
1074                elif i==5:
1075                      task.remd_model5=task.remd_model5+text
1076
1077
1078
1079          if task.type=='remd':  
1080           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
1081
1082            for line in f:
1083              if 'sumprob' in line:
1084                 i=0
1085                 for line1 in f:
1086                   i+=1
1087                   if i>6:
1088                        break
1089                   if i==1:
1090                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
1091                   elif i==2:
1092                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
1093                   elif i==3:
1094                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
1095                   elif i==4:
1096                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
1097                   elif i==5:
1098                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
1099                      
1100          
1101
1102          task.save()
1103       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
1104          if (task.type=='min'):
1105            task.running =1
1106            with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1107               line=''
1108               for line in f:
1109                 pass
1110               if line != '':
1111                 last = line.split()[0]
1112               else:
1113                 last = 0
1114            try:
1115               task.running=int(1+int(last)*100.0/task.min_maxmin)
1116            except:
1117               pass
1118            if task.running>100:
1119               task.running=100
1120          else:
1121            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
1122               line=''
1123               for line in f:
1124                 pass
1125               if line != '':
1126                 last = line.split()[0]
1127               else:
1128                 last = 0
1129            task.running=int(1+int(last)*100.0/task.md_nstep)
1130            if task.running>100:
1131              task.running=100
1132          task.save()
1133
1134     
1135       return