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