random SEED value in forms
[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      else:
518         form = TaskForm_remd_a(request.POST,request.FILES)
519         if form.is_valid():
520              task.name=form.cleaned_data["name"]
521              task.type="remd"
522
523              basename = str(task.owner)
524              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
525              task.jobdirname = "_".join([basename, suffix])
526
527              pdbid=form.cleaned_data["pdbid"]
528              if pdbid:
529               task.myfile1=load_pdbid(pdbid,task.jobdirname)
530               task.pdbcode=pdbid
531              else:
532               task.myfile1=form.cleaned_data["file1"]
533              task.md_start=form.cleaned_data["md_start"]  
534              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
535
536              task.md_seq=""
537              if task.md_start == "pdbstart" or task.md_pdbref:
538                seq,task.ssbond=from_pdb(task.myfile1)
539                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
540              else:
541                seq=seq_add_x(form.cleaned_data["md_seq"])
542                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
543
544              for i in range(0,len(seq),40):
545                 task.md_seq=task.md_seq+seq[i:i+40]+" "
546
547              if task.md_start != "pdbstart":
548                 task.ssbond=''
549
550              task.md_seed=form.cleaned_data["md_seed"]
551              task.md_nstep=form.cleaned_data["md_nstep"]
552              task.md_dt=form.cleaned_data["md_dt"]
553              task.md_lang=form.cleaned_data["md_lang"]
554              task.md_tau=form.cleaned_data["md_tau"]
555              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
556              task.min_maxfun=form.cleaned_data["min_maxfun"]
557              task.remd_nrep=form.cleaned_data["remd_nrep"]
558              task.remd_nstex=form.cleaned_data["remd_nstex"]
559              task.md_ntwx=form.cleaned_data["md_ntwx"]             
560              task.md_ntwe=form.cleaned_data["md_ntwe"]
561              task.md_respa=form.cleaned_data["md_respa"]
562 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
563 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
564
565              task.boxx=form.cleaned_data["boxx"]
566              task.boxy=form.cleaned_data["boxy"]             
567              task.boxz=form.cleaned_data["boxz"]             
568
569              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
570              task.unres_ff=form.cleaned_data["unres_ff"]
571              
572              task.scal_rad = form.cleaned_data["scal_rad"]
573              task.saxs_data = form.cleaned_data["saxs_data"]
574              task.wsaxs = form.cleaned_data["wsaxs"]
575              
576              task.save()
577              return redirect('addmlist',task_id=task.id)
578     else:
579         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
580         form = TaskForm_remd_a(initial=data)
581     basic_adv=False
582     p_type='replica exchange molecular dynamics - advanced options'
583     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
584
585 @login_required
586 def addmlist(request,task_id):
587     task = get_object_or_404(Task, id=task_id)
588     if request.method == 'POST':
589         form = TaskForm_list(task.remd_nrep,request.POST)
590         if form.is_valid():
591              task.remd_multi_t=form.cleaned_data["temperatures"]
592              task.remd_multi_m=form.cleaned_data["multiplexing"]             
593              task.ready=True
594              
595              task.save()
596              if is_lazy_user(request.user):
597               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
598              else:
599               return redirect('/')
600     else:
601       if task.example == 'casp12':
602         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
603         '["2", "2", "2", "2", "2", "2", "2", "2"]',
604         'temperatures':
605         '["270", "280", "290", "300", "310", "320", "330", "340"]'
606         }
607       elif task.unres_ff == 'FF2':
608         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
609         '["1", "1", "1", "1", "1", "1", "1", "1"]',
610         'temperatures':
611         '["270", "280", "290", "300", "310", "320", "330", "345"]'
612         }
613       else: 
614         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
615         '["1", "1", "1", "1", "1", "1", "1", "1"]',
616         'temperatures':
617         '["250", "260", "270", "280", "290", "300", "315", "330"]'
618         }
619       
620       form = TaskForm_list(task.remd_nrep,initial=data)
621     p_type='replica exchange molecular dynamics - advanced options'
622     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
623
624 @login_required
625 def details(request,task_id):
626     task = get_object_or_404(Task, id=task_id)
627     return render(request, "details.html",{'task':task})
628
629
630 def details1(request,user_id,task_id):
631     task = get_object_or_404(Task, id=task_id)
632     return render(request, "details1.html",{'task':task})
633
634
635 @login_required
636 def delete(request, task_id):
637     Task.objects.get(id=task_id).delete()
638     return redirect('/')
639
640 def refresh_done1(request, task_id):
641     task = get_object_or_404(Task, id=task_id)
642     user = task.owner
643     refresh_done0(task)
644
645     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
646     njob=0
647     nq=0
648     for line in proc.stdout:
649       if 'piasek4' in line:
650         if line.split()[1]=='test_server':
651           njob+=1
652           if line.split()[-2]=='Q':
653             nq+=1
654     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
655
656     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
657
658
659 @login_required
660 def refresh_done(request):
661     user = request.user
662     tasks = Task.objects.filter(owner=user).order_by('-created_date')
663     alldone = 1
664     for task in tasks:
665       refresh_done0(task)
666       if not task.done:
667          alldone=0
668
669     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
670     njob=0
671     nq=0
672     for line in proc.stdout:
673       if 'piasek4' in line:
674         if line.split()[1]=='test_server':
675           njob+=1
676           if line.split()[-2]=='Q':
677             nq+=1
678     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
679
680     if is_lazy_user(request.user):
681      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
682     else:
683      return render(request, "index.html", {
684                 'tasks': tasks ,
685                 'variable' : variable,
686                 'alldone': alldone
687                         })
688
689       
690 def refresh_done0(task):
691       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
692          task.done=True
693
694          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
695
696            if task.type=='min' or task.type=='md':
697              text=""
698              for line in f:
699                if 'ETOT' in line:
700                   task.etot=line.split()[1]
701
702                if 'RMS deviation' in line:
703                   text=text+line
704                   i=1
705                   for line1 in f:
706                      text=text+line1
707                      i+=1
708                      if i>6:
709                        break
710                if 'Total wall' in line:
711                   text=text+line
712                   
713            elif task.type=='remd':
714              j=0
715              text="Acceptance for replica exchanges and number of exchange attempts\n"
716              for line in f:
717                         
718                if 'ACC' in line:
719                     j+=1
720                     text=text+' '.join(line.split()[2:])+"\n"
721                     if j==task.remd_nrep:
722                        j=1
723                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
724
725                if 'Total wall' in line:
726                   text=text+line
727                        
728          task.results_text=text
729
730
731          if task.md_pdbref and task.type=='remd':
732          
733           for i in range(1,6):
734            try:
735             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
736                  line=f.readline()
737                  if i==1:
738                      task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
739                  elif i==2:
740                      task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
741                  elif i==3:
742                      task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
743                  elif i==4:
744                      task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
745                  elif i==5:
746                      task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
747            except EnvironmentError:
748             print 'file_wham_T*pdb open error'
749           for i in range(1,6):
750             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
751                text=''
752                for line in f:
753                  if 'RMSD of  the common residues=' in line:
754                    text=' RMSD='+line.split()[5]
755                  if 'TM-score    =' in line:
756                    text=text+' TMscore='+line.split()[2]
757                  if 'GDT-TS-score=' in line:
758                    text=text+' GDT_TS='+line.split()[1]
759                     
760                if i==1:
761                      task.remd_model1=task.remd_model1+text
762                elif i==2:
763                      task.remd_model2=task.remd_model2+text
764                elif i==3:
765                      task.remd_model3=task.remd_model3+text
766                elif i==4:
767                      task.remd_model4=task.remd_model4+text
768                elif i==5:
769                      task.remd_model5=task.remd_model5+text
770
771
772
773          if task.type=='remd':  
774           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
775
776            for line in f:
777              if 'sumprob' in line:
778                 i=0
779                 for line1 in f:
780                   i+=1
781                   if i>6:
782                        break
783                   if i==1:
784                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
785                   elif i==2:
786                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
787                   elif i==3:
788                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
789                   elif i==4:
790                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
791                   elif i==5:
792                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
793                      
794          
795
796          task.save()
797       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
798          if (task.type=='min'):
799            task.running =1
800          else:
801            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
802               line=''
803               for line in f:
804                 pass
805               if line != '':
806                 last = line.split()[0]
807               else:
808                 last = 0
809            task.running=int(1+int(last)*100.0/task.md_nstep)
810            if task.running>100:
811              task.running=100
812          task.save()
813
814     
815       return