d38312f539f334e1290069472cd3739cf985e45e
[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     restart0(task)
912     return redirect('/')
913    
914 def add_restart_inp():
915     with open('file.inp','r') as f1, open ('file.inp.tmp','w') as f2:
916         for line in f1:
917           if 'reset_vel=' in line:
918             f2.write('{:79}'.format('restart'+line[7:]))
919           else:
920             f2.write(line)
921     os.remove('file.inp')
922     os.rename('file.inp.tmp','file.inp')
923     return 
924     
925 def restart0(task):    
926     if os.path.isfile(task.jobdirname+'/finished'):    
927       os.remove(task.jobdirname+'/finished')
928     task.running =1
929     task.done=False
930     task.md_total_steps = task.md_total_steps+task.md_nstep
931     task.save()
932     if task.type == 'md':
933       os.chdir(task.jobdirname)
934       add_restart_inp()
935       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
936       os.chdir('..')
937     elif task.type == 'remd':
938       os.chdir(task.jobdirname)
939       add_restart_inp()
940       tmp1=json.loads(task.remd_multi_m)
941       nreplicas=sum(map(int, tmp1))
942       with open('file_wham.inp','r') as f1, open ('file_wham.tmp','w') as f2:
943         for line in f1:
944           if 'rec_end=' in line:
945             rec=task.md_total_steps/task.md_ntwx
946             f2.write('nfile_cx=1 rec_start='+str(rec/10)
947                +' rec_end='+str(rec)+' totraj='+str(nreplicas)+'\n')
948           elif 'isampl=' in line:
949             if task.md_total_steps/task.md_ntwx*nreplicas<=8000:
950                 isampl=1
951             else:
952                 isampl=int(task.md_total_steps/task.md_ntwx*nreplicas/8000)
953             f2.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
954           else:
955             f2.write(line)
956       os.remove('file_wham.inp')
957       os.rename('file_wham.tmp','file_wham.inp')
958       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
959       os.chdir('..')
960     return
961
962 def restart1(request, user_id, task_id):
963     task = get_object_or_404(Task, id=task_id)
964     user = task.owner
965     restart0(task)
966     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
967     
968
969 def refresh_done1(request, task_id):
970     task = get_object_or_404(Task, id=task_id)
971     user = task.owner
972     refresh_done0(task)
973
974     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
975     njob=0
976     nq=0
977     for line in proc.stdout:
978       if 'piasek4' in line:
979         if line.split()[1]=='test_server':
980           njob+=1
981           if line.split()[-2]=='Q':
982             nq+=1
983     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
984
985     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
986
987
988 @login_required
989 def refresh_done(request):
990     user = request.user
991     tasks = Task.objects.filter(owner=user).order_by('-created_date')
992     alldone = 1
993     for task in tasks:
994       refresh_done0(task)
995       if not task.done:
996          alldone=0
997
998     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
999     njob=0
1000     nq=0
1001     for line in proc.stdout:
1002       if 'piasek4' in line:
1003         if line.split()[1]=='test_server':
1004           njob+=1
1005           if line.split()[-2]=='Q':
1006             nq+=1
1007     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1008
1009     if is_lazy_user(request.user):
1010      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1011     else:
1012      return render(request, "index.html", {
1013                 'tasks': tasks ,
1014                 'variable' : variable,
1015                 'alldone': alldone
1016                         })
1017
1018       
1019 def refresh_done0(task):
1020       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
1021          task.done=True
1022
1023          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1024
1025            if task.type=='min' or task.type=='md':
1026              text=""
1027              for line in f:
1028                if 'ETOT' in line:
1029                   task.etot=line.split()[1]
1030
1031                if 'RMS deviation' in line:
1032                   text=text+line
1033                   i=1
1034                   for line1 in f:
1035                      text=text+line1
1036                      i+=1
1037                      if i>6:
1038                        break
1039                if 'Total wall' in line:
1040                   text=text+line
1041                   
1042            elif task.type=='remd' or task.type=='dock':
1043              j=0
1044              text="Acceptance for replica exchanges and number of exchange attempts\n"
1045              for line in f:
1046                         
1047                if 'ACC' in line:
1048                     j+=1
1049                     text=text+' '.join(line.split()[2:])+"\n"
1050                     if j==task.remd_nrep:
1051                        j=1
1052                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
1053
1054                if 'Total wall' in line:
1055                   text=text+line
1056                        
1057          task.results_text=text
1058
1059
1060          if task.md_pdbref and task.type=='remd':
1061          
1062           for i in range(1,6):
1063            try:
1064             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
1065                  line=f.readline()
1066                  if i==1:
1067                      task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
1068                  elif i==2:
1069                      task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
1070                  elif i==3:
1071                      task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
1072                  elif i==4:
1073                      task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
1074                  elif i==5:
1075                      task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
1076            except EnvironmentError:
1077             print 'file_wham_T*pdb open error'
1078           for i in range(1,6):
1079             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
1080                text=''
1081                for line in f:
1082                  if 'RMSD of  the common residues=' in line:
1083                    text=' RMSD='+line.split()[5]
1084                  if 'TM-score    =' in line:
1085                    text=text+' TMscore='+line.split()[2]
1086                  if 'GDT-TS-score=' in line:
1087                    text=text+' GDT_TS='+line.split()[1]
1088                     
1089                if i==1:
1090                      task.remd_model1=task.remd_model1+text
1091                elif i==2:
1092                      task.remd_model2=task.remd_model2+text
1093                elif i==3:
1094                      task.remd_model3=task.remd_model3+text
1095                elif i==4:
1096                      task.remd_model4=task.remd_model4+text
1097                elif i==5:
1098                      task.remd_model5=task.remd_model5+text
1099
1100
1101
1102          if task.type=='remd':  
1103           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
1104
1105            for line in f:
1106              if 'sumprob' in line:
1107                 i=0
1108                 for line1 in f:
1109                   i+=1
1110                   if i>6:
1111                        break
1112                   if i==1:
1113                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
1114                   elif i==2:
1115                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
1116                   elif i==3:
1117                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
1118                   elif i==4:
1119                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
1120                   elif i==5:
1121                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
1122                      
1123          
1124
1125          task.save()
1126       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
1127          if (task.type=='min'):
1128            task.running =1
1129            with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1130               line=''
1131               for line in f:
1132                 pass
1133               if line != '':
1134                 last = line.split()[0]
1135               else:
1136                 last = 0
1137            try:
1138               task.running=int(1+int(last)*100.0/task.min_maxmin)
1139            except:
1140               pass
1141            if task.running>100:
1142               task.running=100
1143          else:
1144            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
1145               line=''
1146               for line in f:
1147                 pass
1148               if line != '':
1149                 last = line.split()[0]
1150               else:
1151                 last = 0
1152            task.running=int(1+int(last)*100.0/task.md_nstep)
1153            if task.running>100:
1154              task.running=100
1155          task.save()
1156
1157     
1158       return