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