T0882 example in advanced MREMD, checking of residue names in pdb
[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
13 res_codes = [
14                 # 20 canonical amino acids
15                 ('CYS', 'C'), ('ASP', 'D'), ('SER', 'S'), ('GLN', 'Q'),
16                 ('LYS', 'K'), ('ILE', 'I'), ('PRO', 'P'), ('THR', 'T'),
17                 ('PHE', 'F'), ('ASN', 'N'), ('GLY', 'G'), ('HIS', 'H'),
18                 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
19                 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
20                 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
21                 ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
22                 ('CYX', 'C'),
23                 ('DCY', 'c'), ('DAS', 'd'), ('DSN', 's'), ('DGN', 'q'),
24                 ('DLY', 'k'), ('DIL', 'i'), ('DPR', 'p'), ('DTH', 't'),
25                 ('DPN', 'f'), ('DSG', 'n'), ('DHI', 'h'),
26                 ('DLE', 'l'), ('DAR', 'r'), ('DTR', 'w'), ('DAL', 'a'),
27                 ('DVA', 'v'), ('DGL', 'e'), ('DTY', 'y'), ('MED', 'm'),                
28                ]
29
30 three_to_one = dict(res_codes)
31
32 def load_pdbid(pdbid,dirname):
33     os.mkdir(dirname)
34     if len(pdbid)==4:
35        file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
36                      dirname+'/plik.pdb')     
37     else:
38        chain=pdbid[5]
39        pdbid=pdbid[:4]
40        pdb_tmp=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
41        with open(dirname+'/plik.pdb', 'w') as outfile:
42         for line in pdb_tmp:
43           if line[0:6] == 'SSBOND' and line[15] == chain and line[29] == chain:
44             outfile.write(line)
45           if line[0:6] == 'ATOM  ' and line[21] == chain:
46             outfile.write(line)
47        pdb_tmp.close()
48        file=dirname+'/plik.pdb'
49        
50     return(file)
51
52
53 def seq_2d_from_pdb(seq_2d,seq):
54     if seq_2d =='':
55       return(seq_2d)
56     seq_2d=seq_2d.replace('C', '-')
57     seq_2d_tmp=''
58     ii=0
59     for i in range(0,len(seq)):
60       if seq[i]=='X':
61          seq_2d_tmp=seq_2d_tmp+'-'
62       else:
63          if len(seq_2d)>ii:
64             seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
65             ii+=1
66     tmp=''
67     for i in range(0,len(seq_2d_tmp),40):
68       tmp=tmp+seq_2d_tmp[i:i+40]+" "
69     return(tmp)
70
71 def seq_2d_add_x(seq_2d,seq,seq_form):
72     if seq_2d =='':
73       return(seq_2d)
74     seq_2d=seq_2d[:len(seq_form)]
75     seq_2d=seq_2d.replace('C', '-')
76     if seq_form[0] !='X' and seq[0] == 'X':
77       seq_2d='-'+seq_2d
78     if seq_form[-1] !='X' and seq[-1] == 'X':
79       seq_2d=seq_2d+'-'
80     seq_2d=seq_2d[:len(seq)]
81     tmp=''
82     for i in range(0,len(seq_2d),40):
83       tmp=tmp+seq_2d[i:i+40]+" "
84     return(tmp)
85
86 def seq_add_x(sequence):
87     if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X':
88         sequence='X'+sequence
89     if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X':
90         sequence=sequence+'X'
91     set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym'
92     sequence = ''.join([c for c in sequence if c in set])
93
94     return(sequence)    
95
96 def from_pdb(file):
97     sequence = []
98     ssbond = []
99     ssbond_ch = []
100     ires = []
101     chain_start = {}
102     chain_end = {}
103     unres_shift = {}
104     chain_sorted=[]
105     newchain = True
106     
107     for line in file:
108             if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
109               aa = three_to_one.get(line[17:20])
110               i = int(line[22:26])
111               ch = line[21:22]
112               if newchain or i!=ires[-1]:
113                 sequence.append(aa)
114                 ires.append(i)
115                 if newchain:
116                  chain_start[ch]=i
117                  chain_sorted.extend(ch)
118                  newchain = False
119             if line[0:3] == 'TER':
120               sequence.append('XX')
121               chain_end[ch]=i
122               newchain = True
123             if line[0:6] == 'SSBOND':
124               b=[]
125               b.append(int(line[17:21]))
126               b.append(int(line[31:35]))
127               ssbond.append(b)
128               c = []
129               c.append((line[15:16]))
130               c.append((line[29:30]))
131               ssbond_ch.append(c)                                                                      
132             if line[0:3] == 'END':
133               break
134     if not sequence[-1] == 'XX':
135             chain_end[ch]=i
136     while sequence[-1] == 'XX':
137             del sequence[-1]
138     if sequence[0] != 'G':
139             sequence.insert(0,'X')
140             ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
141     if sequence[-1] != 'G':
142             sequence.append('X')
143     seq=''.join(sequence)
144 #    if ires[0] != 1:
145 #            ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
146     i=0
147     for c in chain_sorted:
148       unres_shift[c]=i+chain_start[c]
149       i=i-(chain_end[c]-chain_start[c])-3
150     ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]     
151
152     return seq,json.dumps(ssbond)
153
154
155 @login_required
156 def index(request):
157     user = request.user
158     tasks = Task.objects.filter(owner=user).order_by('-created_date')
159     variable = ''
160     return render(request, "index.html", {
161             'tasks': tasks, 'alldone': 0
162         })
163
164 @login_required
165 def add(request):
166     if request.method == 'POST':
167         form = TaskForm(request.POST)
168         if form.is_valid():
169             name = form.cleaned_data["name"]
170             user = request.user
171             task = Task(name=name,owner=user,ready=False)
172             task.save()
173             return redirect('add_min',task_id=task.id)
174     return redirect('/')
175
176 @login_required
177 def add_min(request,task_id):
178     task = get_object_or_404(Task, id=task_id)
179     if request.method == 'POST':
180      if '_example' in request.POST:
181         data= {'name':task.name,'pdbid':'1BDD'}
182         form = TaskForm_min(initial=data)     
183      else:
184         form = TaskForm_min(request.POST,request.FILES)
185         if form.is_valid():
186              task.name=form.cleaned_data["name"]
187              task.type="min"
188              pdbid=form.cleaned_data["pdbid"]
189
190              basename = str(task.owner)
191              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
192              task.jobdirname = "_".join([basename, suffix])
193
194              if pdbid:
195               task.myfile1=load_pdbid(pdbid,task.jobdirname)
196               task.pdbcode=pdbid
197              else:
198               task.myfile1=form.cleaned_data["file1"]
199
200              seq,task.ssbond=from_pdb(task.myfile1)
201              task.md_seq=""
202              for i in range(0,len(seq),40):
203                     task.md_seq=task.md_seq+seq[i:i+40]+" "
204
205              task.ready=True
206              
207              task.save()
208              if is_lazy_user(request.user):
209               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
210              else:
211               return redirect('/')
212     else:
213         data= {'name':task.name}
214         form = TaskForm_min(initial=data)
215     p_type='minimization'
216     basic_adv=True    
217     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
218
219 @login_required
220 def add_min_a(request,task_id):
221     task = get_object_or_404(Task, id=task_id)
222     if request.method == 'POST':
223      if '_example' in request.POST:
224         data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
225         form = TaskForm_min_a(initial=data)     
226      else:
227         form = TaskForm_min_a(request.POST,request.FILES)
228         if form.is_valid():
229              task.name=form.cleaned_data["name"]
230              task.type="min"
231 #             task.min_choice=form.cleaned_data["min_choice"]
232              task.min_overlap=form.cleaned_data["min_overlap"]
233              task.min_searchsc=form.cleaned_data["min_searchsc"]
234              task.min_maxmin=form.cleaned_data["min_maxmin"]
235              task.min_maxfun=form.cleaned_data["min_maxfun"]
236              task.min_pdbout=form.cleaned_data["min_pdbout"]
237
238              basename = str(task.owner)
239              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
240              task.jobdirname = "_".join([basename, suffix])
241              
242              pdbid=form.cleaned_data["pdbid"]
243              if pdbid:
244               task.myfile1=load_pdbid(pdbid,task.jobdirname)
245               task.pdbcode=pdbid
246              else:
247               task.myfile1=form.cleaned_data["file1"]
248
249              task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
250              task.unres_ff=form.cleaned_data["unres_ff"]
251              task.boxx=form.cleaned_data["boxx"]
252              task.boxy=form.cleaned_data["boxy"]             
253              task.boxz=form.cleaned_data["boxz"]             
254
255              seq,task.ssbond=from_pdb(task.myfile1)
256              task.md_seq=""
257              for i in range(0,len(seq),40):
258                 task.md_seq=task.md_seq+seq[i:i+40]+" "
259                                                            
260              task.ready=True
261              
262              task.save()
263              if is_lazy_user(request.user):
264               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
265              else:
266               return redirect('/')
267     else:
268         data= {'name':task.name}
269         form = TaskForm_min_a(initial=data)
270     basic_adv=False
271     p_type='minimization - advanced options'
272     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
273
274 @login_required
275 def add_md(request,task_id):
276     task = get_object_or_404(Task, id=task_id)
277     if request.method == 'POST':
278      if '_example' in request.POST:
279         data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
280         'md_pdbref':True,'md_temp':200}
281         form = TaskForm_md(initial=data)     
282      else:
283         form = TaskForm_md(request.POST,request.FILES)
284         if form.is_valid():
285              task.name=form.cleaned_data["name"]
286              task.type="md"
287              task.md_seed=form.cleaned_data["md_seed"]
288              task.md_start=form.cleaned_data["md_start"]
289              task.md_temp=form.cleaned_data["md_temp"]
290              task.md_nstep=form.cleaned_data["md_nstep"]
291
292              basename = str(task.owner)
293              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
294              task.jobdirname = "_".join([basename, suffix])
295
296              pdbid=form.cleaned_data["pdbid"]
297              if pdbid:
298               task.myfile1=load_pdbid(pdbid,task.jobdirname)
299               task.pdbcode=pdbid
300              else:
301               task.myfile1=form.cleaned_data["file1"]
302              task.md_pdbref=form.cleaned_data["md_pdbref"]             
303
304              task.md_seq=""
305              if task.md_start == "pdbstart" or task.md_pdbref:
306                seq,task.ssbond=from_pdb(task.myfile1)
307              else:
308                seq=seq_add_x(form.cleaned_data["md_seq"])
309                        
310              for i in range(0,len(seq),40):
311                 task.md_seq=task.md_seq+seq[i:i+40]+" "
312              
313              if task.md_start != "pdbstart":
314                 task.ssbond=''
315
316              task.ready=True
317              
318              task.save()
319              if is_lazy_user(request.user):
320               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
321              else:
322               return redirect('/')
323     else:
324         data= {'name':task.name}
325         form = TaskForm_md(initial=data)
326     basic_adv=True
327     p_type='molecular dynamics'
328     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
329
330 @login_required
331 def add_md_a(request,task_id):
332     task = get_object_or_404(Task, id=task_id)
333     if request.method == 'POST':
334      if '_example' in request.POST:
335         data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
336          'md_pdbref':True,'md_mdpdb':True}
337         form = TaskForm_md_a(initial=data)     
338      else:
339         form = TaskForm_md_a(request.POST,request.FILES)
340         if form.is_valid():
341              task.name=form.cleaned_data["name"]
342              task.type="md"
343
344              basename = str(task.owner)
345              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
346              task.jobdirname = "_".join([basename, suffix])
347
348              pdbid=form.cleaned_data["pdbid"]
349              if pdbid:
350               task.myfile1=load_pdbid(pdbid,task.jobdirname)
351               task.pdbcode=pdbid
352              else:
353               task.myfile1=form.cleaned_data["file1"]
354              task.md_start=form.cleaned_data["md_start"]
355              task.md_pdbref=form.cleaned_data["md_pdbref"]             
356
357              task.md_seq=""
358              if task.md_start == "pdbstart" or task.md_pdbref:
359                seq,task.ssbond=from_pdb(task.myfile1)
360                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
361              else:
362                seq=seq_add_x(form.cleaned_data["md_seq"])
363                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
364
365              for i in range(0,len(seq),40):
366                 task.md_seq=task.md_seq+seq[i:i+40]+" "
367
368              if task.md_start != "pdbstart":
369                 task.ssbond=''
370
371              task.md_seed=form.cleaned_data["md_seed"]
372
373              task.md_temp=form.cleaned_data["md_temp"]
374              task.md_nstep=form.cleaned_data["md_nstep"]
375              task.md_ntwe=form.cleaned_data["md_ntwe"]
376              task.md_ntwx=form.cleaned_data["md_ntwx"]
377              task.md_dt=form.cleaned_data["md_dt"]
378              task.md_lang=form.cleaned_data["md_lang"]
379              task.md_tau=form.cleaned_data["md_tau"]
380              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
381              task.md_mdpdb=form.cleaned_data["md_mdpdb"]
382              task.unres_ff=form.cleaned_data["unres_ff"]
383              task.md_respa=form.cleaned_data["md_respa"]             
384              task.boxx=form.cleaned_data["boxx"]
385              task.boxy=form.cleaned_data["boxy"]             
386              task.boxz=form.cleaned_data["boxz"]             
387
388              
389              task.ready=True
390              
391              task.save()
392              if is_lazy_user(request.user):
393               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
394              else:
395               return redirect('/')
396     else:
397         data= {'name':task.name}
398         form = TaskForm_md_a(initial=data)
399     basic_adv=False
400     p_type='molecular dynamics - advanced options'
401     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
402
403 @login_required
404 def add_remd(request,task_id):
405     task = get_object_or_404(Task, id=task_id)
406     if request.method == 'POST':
407      if '_example' in request.POST:
408         data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True}
409         form = TaskForm_remd(initial=data)     
410      else:
411         form = TaskForm_remd(request.POST,request.FILES)
412         if form.is_valid():
413              task.name=form.cleaned_data["name"]
414              task.type="remd"
415              task.md_start=form.cleaned_data["md_start"]
416
417              basename = str(task.owner)
418              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
419              task.jobdirname = "_".join([basename, suffix])
420
421              pdbid=form.cleaned_data["pdbid"]
422              if pdbid:
423               task.myfile1=load_pdbid(pdbid,task.jobdirname)
424               task.pdbcode=pdbid
425              else:
426               task.myfile1=form.cleaned_data["file1"]
427              task.md_pdbref=form.cleaned_data["md_pdbref"]
428              task.md_ntwx=task.remd_nstex 
429
430              task.md_seq=""
431              if task.md_start == "pdbstart" or task.md_pdbref:
432                seq,task.ssbond=from_pdb(task.myfile1)
433              else:
434                seq=seq_add_x(form.cleaned_data["md_seq"])
435              for i in range(0,len(seq),40):
436                 task.md_seq=task.md_seq+seq[i:i+40]+" "
437
438              if task.md_start != "pdbstart":
439                 task.ssbond=''
440
441              task.md_seed=form.cleaned_data["md_seed"]
442
443              task.md_nstep=form.cleaned_data["md_nstep"]
444
445
446              task.ready=True
447              
448              
449              task.save()
450              if is_lazy_user(request.user):
451               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
452              else:
453               return redirect('/')
454     else:
455         data= {'name':task.name}
456         form = TaskForm_remd(initial=data)
457     basic_adv=True
458     p_type='replica exchange molecular dynamics'
459     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
460
461 @login_required
462 def add_remd_a(request,task_id):
463     from django.core.files.uploadedfile import UploadedFile
464     task = get_object_or_404(Task, id=task_id)
465     if request.method == 'POST':
466      if '_example' in request.POST:
467         data= {'name':task.name,'pdbid':'5G3Q:B','md_pdbref':True,
468          'md_nstep':2000000,'md_lang':'berendsen','unres_ff':'FF2',
469          'remd_cluter_temp':290,'md_2d':'--EEEEEEE------EEEEEE------EEEEEE------HHHHHHHHHHH---HHHHHHHHHHHHHHHHHHHHHHH---'}
470         form = TaskForm_remd_a(initial=data)    
471         task.example='casp12'
472         task.save() 
473      elif '_example_saxs' in request.POST:
474         data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
475          'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2',
476          'remd_cluter_temp':270, 
477          'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
478 """ 0.5     1.33868e-02
479  1.5     1.95880e-02
480  2.5     2.68896e-02
481  3.5     3.43737e-02
482  4.5     4.07099e-02
483  5.5     4.47875e-02
484  6.5     4.63486e-02
485  7.5     4.60514e-02
486  8.5     4.49130e-02
487  9.5     4.36744e-02
488 10.5     4.26085e-02
489 11.5     4.17464e-02
490 12.5     4.11217e-02
491 13.5     4.07835e-02
492 14.5     4.06776e-02
493 15.5     4.06060e-02
494 16.5     4.03241e-02
495 17.5     3.96655e-02
496 18.5     3.85756e-02
497 19.5     3.70537e-02
498 20.5     3.50982e-02
499 21.5     3.27236e-02
500 22.5     3.00046e-02
501 23.5     2.70643e-02
502 24.5     2.40044e-02
503 25.5     2.08595e-02
504 26.5     1.76342e-02
505 27.5     1.43802e-02
506 28.5     1.12281e-02
507 29.5     8.34574e-03
508 30.5     5.87354e-03
509 31.5     3.88732e-03
510 32.5     2.39755e-03
511 33.5     1.36323e-03
512 34.5     7.06686e-04
513 35.5     3.30592e-04
514 36.5     1.38359e-04"""}
515         form = TaskForm_remd_a(initial=data)     
516      else:
517         form = TaskForm_remd_a(request.POST,request.FILES)
518         if form.is_valid():
519              task.name=form.cleaned_data["name"]
520              task.type="remd"
521
522              basename = str(task.owner)
523              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
524              task.jobdirname = "_".join([basename, suffix])
525
526              pdbid=form.cleaned_data["pdbid"]
527              if pdbid:
528               task.myfile1=load_pdbid(pdbid,task.jobdirname)
529               task.pdbcode=pdbid
530              else:
531               task.myfile1=form.cleaned_data["file1"]
532              task.md_start=form.cleaned_data["md_start"]  
533              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
534
535              task.md_seq=""
536              if task.md_start == "pdbstart" or task.md_pdbref:
537                seq,task.ssbond=from_pdb(task.myfile1)
538                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
539              else:
540                seq=seq_add_x(form.cleaned_data["md_seq"])
541                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
542
543              for i in range(0,len(seq),40):
544                 task.md_seq=task.md_seq+seq[i:i+40]+" "
545
546              if task.md_start != "pdbstart":
547                 task.ssbond=''
548
549              task.md_seed=form.cleaned_data["md_seed"]
550              task.md_nstep=form.cleaned_data["md_nstep"]
551              task.md_dt=form.cleaned_data["md_dt"]
552              task.md_lang=form.cleaned_data["md_lang"]
553              task.md_tau=form.cleaned_data["md_tau"]
554              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
555              task.remd_nrep=form.cleaned_data["remd_nrep"]
556              task.remd_nstex=form.cleaned_data["remd_nstex"]
557              task.md_ntwx=form.cleaned_data["md_ntwx"]             
558              task.md_ntwe=form.cleaned_data["md_ntwe"]
559              task.md_respa=form.cleaned_data["md_respa"]
560 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
561 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
562
563              task.boxx=form.cleaned_data["boxx"]
564              task.boxy=form.cleaned_data["boxy"]             
565              task.boxz=form.cleaned_data["boxz"]             
566
567              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
568              task.unres_ff=form.cleaned_data["unres_ff"]
569              
570              task.scal_rad = form.cleaned_data["scal_rad"]
571              task.saxs_data = form.cleaned_data["saxs_data"]
572              task.wsaxs = form.cleaned_data["wsaxs"]
573              
574              task.save()
575              return redirect('addmlist',task_id=task.id)
576     else:
577         data= {'name':task.name}
578         form = TaskForm_remd_a(initial=data)
579     basic_adv=False
580     p_type='replica exchange molecular dynamics - advanced options'
581     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
582
583 @login_required
584 def addmlist(request,task_id):
585     task = get_object_or_404(Task, id=task_id)
586     if request.method == 'POST':
587         form = TaskForm_list(task.remd_nrep,request.POST)
588         if form.is_valid():
589              task.remd_multi_t=form.cleaned_data["temperatures"]
590              task.remd_multi_m=form.cleaned_data["multiplexing"]             
591              task.ready=True
592              
593              task.save()
594              if is_lazy_user(request.user):
595               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
596              else:
597               return redirect('/')
598     else:
599       if task.example == 'casp12':
600         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
601         '["2", "2", "2", "2", "2", "2", "2", "2"]',
602         'temperatures':
603         '["270", "280", "290", "300", "310", "320", "330", "340"]'
604         }
605       elif task.unres_ff == 'FF2':
606         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
607         '["1", "1", "1", "1", "1", "1", "1", "1"]',
608         'temperatures':
609         '["270", "280", "290", "300", "310", "320", "330", "345"]'
610         }
611       else: 
612         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
613         '["1", "1", "1", "1", "1", "1", "1", "1"]',
614         'temperatures':
615         '["250", "260", "270", "280", "290", "300", "315", "330"]'
616         }
617       
618       form = TaskForm_list(task.remd_nrep,initial=data)
619     p_type='replica exchange molecular dynamics - advanced options'
620     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
621
622 @login_required
623 def details(request,task_id):
624     task = get_object_or_404(Task, id=task_id)
625     return render(request, "details.html",{'task':task})
626
627
628 def details1(request,user_id,task_id):
629     task = get_object_or_404(Task, id=task_id)
630     return render(request, "details1.html",{'task':task})
631
632
633 @login_required
634 def delete(request, task_id):
635     Task.objects.get(id=task_id).delete()
636     return redirect('/')
637
638 def refresh_done1(request, task_id):
639     task = get_object_or_404(Task, id=task_id)
640     user = task.owner
641     refresh_done0(task)
642
643     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
644     njob=0
645     nq=0
646     for line in proc.stdout:
647       if 'piasek4' in line:
648         if line.split()[1]=='test_server':
649           njob+=1
650           if line.split()[-2]=='Q':
651             nq+=1
652     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
653
654     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
655
656
657 @login_required
658 def refresh_done(request):
659     user = request.user
660     tasks = Task.objects.filter(owner=user).order_by('-created_date')
661     alldone = 1
662     for task in tasks:
663       refresh_done0(task)
664       if not task.done:
665          alldone=0
666
667     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
668     njob=0
669     nq=0
670     for line in proc.stdout:
671       if 'piasek4' in line:
672         if line.split()[1]=='test_server':
673           njob+=1
674           if line.split()[-2]=='Q':
675             nq+=1
676     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
677
678     if is_lazy_user(request.user):
679      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
680     else:
681      return render(request, "index.html", {
682                 'tasks': tasks ,
683                 'variable' : variable,
684                 'alldone': alldone
685                         })
686
687       
688 def refresh_done0(task):
689       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
690          task.done=True
691
692          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
693
694            if task.type=='min' or task.type=='md':
695              text=""
696              for line in f:
697                if 'ETOT' in line:
698                   task.etot=line.split()[1]
699
700                if 'RMS deviation' in line:
701                   text=text+line
702                   i=1
703                   for line1 in f:
704                      text=text+line1
705                      i+=1
706                      if i>6:
707                        break
708                if 'Total wall' in line:
709                   text=text+line
710                   
711            elif task.type=='remd':
712              j=0
713              text="Acceptance for replica exchanges and number of exchange attempts\n"
714              for line in f:
715                         
716                if 'ACC' in line:
717                     j+=1
718                     text=text+' '.join(line.split()[2:])+"\n"
719                     if j==task.remd_nrep:
720                        j=1
721                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
722
723                if 'Total wall' in line:
724                   text=text+line
725                        
726          task.results_text=text
727
728
729          if task.md_pdbref and task.type=='remd':
730          
731           for i in range(1,6):
732            try:
733             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
734                  line=f.readline()
735                  if i==1:
736                      task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
737                  elif i==2:
738                      task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
739                  elif i==3:
740                      task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
741                  elif i==4:
742                      task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
743                  elif i==5:
744                      task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
745            except EnvironmentError:
746             print 'file_wham_T*pdb open error'
747           for i in range(1,6):
748             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
749                text=''
750                for line in f:
751                  if 'RMSD of  the common residues=' in line:
752                    text=' RMSD='+line.split()[5]
753                  if 'TM-score    =' in line:
754                    text=text+' TMscore='+line.split()[2]
755                  if 'GDT-TS-score=' in line:
756                    text=text+' GDT_TS='+line.split()[1]
757                     
758                if i==1:
759                      task.remd_model1=task.remd_model1+text
760                elif i==2:
761                      task.remd_model2=task.remd_model2+text
762                elif i==3:
763                      task.remd_model3=task.remd_model3+text
764                elif i==4:
765                      task.remd_model4=task.remd_model4+text
766                elif i==5:
767                      task.remd_model5=task.remd_model5+text
768
769
770
771          if task.type=='remd':  
772           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
773
774            for line in f:
775              if 'sumprob' in line:
776                 i=0
777                 for line1 in f:
778                   i+=1
779                   if i>6:
780                        break
781                   if i==1:
782                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
783                   elif i==2:
784                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
785                   elif i==3:
786                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
787                   elif i==4:
788                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
789                   elif i==5:
790                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
791                      
792          
793
794          task.save()
795       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
796          if (task.type=='min'):
797            task.running =1
798          else:
799            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
800               line=''
801               for line in f:
802                 pass
803               if line != '':
804                 last = line.split()[0]
805               else:
806                 last = 0
807            task.running=int(1+int(last)*100.0/task.md_nstep)
808            if task.running>100:
809              task.running=100
810          task.save()
811
812     
813       return