7045a7c242abe8f2d7fdbdae1be40572ddd1af88
[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':'1E0G','md_pdbref':True,
468          'md_nstep':500000,'md_lang':'berendsen','unres_ff':'opt-wtfsa-2',
469          'remd_cluter_temp':280}
470         form = TaskForm_remd_a(initial=data)     
471      elif '_example_saxs' in request.POST:
472         data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
473          'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2',
474          'remd_cluter_temp':270, 
475          'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
476 """ 0.5     1.33868e-02
477  1.5     1.95880e-02
478  2.5     2.68896e-02
479  3.5     3.43737e-02
480  4.5     4.07099e-02
481  5.5     4.47875e-02
482  6.5     4.63486e-02
483  7.5     4.60514e-02
484  8.5     4.49130e-02
485  9.5     4.36744e-02
486 10.5     4.26085e-02
487 11.5     4.17464e-02
488 12.5     4.11217e-02
489 13.5     4.07835e-02
490 14.5     4.06776e-02
491 15.5     4.06060e-02
492 16.5     4.03241e-02
493 17.5     3.96655e-02
494 18.5     3.85756e-02
495 19.5     3.70537e-02
496 20.5     3.50982e-02
497 21.5     3.27236e-02
498 22.5     3.00046e-02
499 23.5     2.70643e-02
500 24.5     2.40044e-02
501 25.5     2.08595e-02
502 26.5     1.76342e-02
503 27.5     1.43802e-02
504 28.5     1.12281e-02
505 29.5     8.34574e-03
506 30.5     5.87354e-03
507 31.5     3.88732e-03
508 32.5     2.39755e-03
509 33.5     1.36323e-03
510 34.5     7.06686e-04
511 35.5     3.30592e-04
512 36.5     1.38359e-04"""}
513         form = TaskForm_remd_a(initial=data)     
514      else:
515         form = TaskForm_remd_a(request.POST,request.FILES)
516         if form.is_valid():
517              task.name=form.cleaned_data["name"]
518              task.type="remd"
519
520              basename = str(task.owner)
521              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
522              task.jobdirname = "_".join([basename, suffix])
523
524              pdbid=form.cleaned_data["pdbid"]
525              if pdbid:
526               task.myfile1=load_pdbid(pdbid,task.jobdirname)
527               task.pdbcode=pdbid
528              else:
529               task.myfile1=form.cleaned_data["file1"]
530              task.md_start=form.cleaned_data["md_start"]  
531              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
532
533              task.md_seq=""
534              if task.md_start == "pdbstart" or task.md_pdbref:
535                seq,task.ssbond=from_pdb(task.myfile1)
536                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
537              else:
538                seq=seq_add_x(form.cleaned_data["md_seq"])
539                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
540
541              for i in range(0,len(seq),40):
542                 task.md_seq=task.md_seq+seq[i:i+40]+" "
543
544              if task.md_start != "pdbstart":
545                 task.ssbond=''
546
547              task.md_seed=form.cleaned_data["md_seed"]
548              task.md_nstep=form.cleaned_data["md_nstep"]
549              task.md_dt=form.cleaned_data["md_dt"]
550              task.md_lang=form.cleaned_data["md_lang"]
551              task.md_tau=form.cleaned_data["md_tau"]
552              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
553              task.remd_nrep=form.cleaned_data["remd_nrep"]
554              task.remd_nstex=form.cleaned_data["remd_nstex"]
555              task.md_ntwx=form.cleaned_data["md_ntwx"]             
556              task.md_ntwe=form.cleaned_data["md_ntwe"]
557              task.md_respa=form.cleaned_data["md_respa"]
558 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
559 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
560
561              task.boxx=form.cleaned_data["boxx"]
562              task.boxy=form.cleaned_data["boxy"]             
563              task.boxz=form.cleaned_data["boxz"]             
564
565              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
566              task.unres_ff=form.cleaned_data["unres_ff"]
567              
568              task.scal_rad = form.cleaned_data["scal_rad"]
569              task.saxs_data = form.cleaned_data["saxs_data"]
570              task.wsaxs = form.cleaned_data["wsaxs"]
571              
572              task.save()
573              return redirect('addmlist',task_id=task.id)
574     else:
575         data= {'name':task.name}
576         form = TaskForm_remd_a(initial=data)
577     basic_adv=False
578     p_type='replica exchange molecular dynamics - advanced options'
579     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
580
581 @login_required
582 def addmlist(request,task_id):
583     task = get_object_or_404(Task, id=task_id)
584     if request.method == 'POST':
585         form = TaskForm_list(task.remd_nrep,request.POST)
586         if form.is_valid():
587              task.remd_multi_t=form.cleaned_data["temperatures"]
588              task.remd_multi_m=form.cleaned_data["multiplexing"]             
589              task.ready=True
590              
591              task.save()
592              if is_lazy_user(request.user):
593               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
594              else:
595               return redirect('/')
596     else:
597       if task.unres_ff == 'FF2':
598         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
599         '["1", "1", "1", "1", "1", "1", "1", "1"]',
600         'temperatures':
601         '["270", "280", "290", "300", "310", "320", "330", "345"]'
602         }
603       else: 
604         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
605         '["1", "1", "1", "1", "1", "1", "1", "1"]',
606         'temperatures':
607         '["250", "260", "270", "280", "290", "300", "315", "330"]'
608         }
609       
610       form = TaskForm_list(task.remd_nrep,initial=data)
611     p_type='replica exchange molecular dynamics - advanced options'
612     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
613
614 @login_required
615 def details(request,task_id):
616     task = get_object_or_404(Task, id=task_id)
617     return render(request, "details.html",{'task':task})
618
619
620 def details1(request,user_id,task_id):
621     task = get_object_or_404(Task, id=task_id)
622     return render(request, "details1.html",{'task':task})
623
624
625 @login_required
626 def delete(request, task_id):
627     Task.objects.get(id=task_id).delete()
628     return redirect('/')
629
630 def refresh_done1(request, task_id):
631     task = get_object_or_404(Task, id=task_id)
632     user = task.owner
633     refresh_done0(task)
634
635     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
636     njob=0
637     nq=0
638     for line in proc.stdout:
639       if 'piasek4' in line:
640         if line.split()[1]=='test_server':
641           njob+=1
642           if line.split()[-2]=='Q':
643             nq+=1
644     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
645
646     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
647
648
649 @login_required
650 def refresh_done(request):
651     user = request.user
652     tasks = Task.objects.filter(owner=user).order_by('-created_date')
653     alldone = 1
654     for task in tasks:
655       refresh_done0(task)
656       if not task.done:
657          alldone=0
658
659     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
660     njob=0
661     nq=0
662     for line in proc.stdout:
663       if 'piasek4' in line:
664         if line.split()[1]=='test_server':
665           njob+=1
666           if line.split()[-2]=='Q':
667             nq+=1
668     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
669
670     if is_lazy_user(request.user):
671      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
672     else:
673      return render(request, "index.html", {
674                 'tasks': tasks ,
675                 'variable' : variable,
676                 'alldone': alldone
677                         })
678
679       
680 def refresh_done0(task):
681       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
682          task.done=True
683
684          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
685
686            if task.type=='min' or task.type=='md':
687              text=""
688              for line in f:
689                if 'ETOT' in line:
690                   task.etot=line.split()[1]
691
692                if 'RMS deviation' in line:
693                   text=text+line
694                   i=1
695                   for line1 in f:
696                      text=text+line1
697                      i+=1
698                      if i>6:
699                        break
700                if 'Total wall' in line:
701                   text=text+line
702                   
703            elif task.type=='remd':
704              j=0
705              text="Acceptance for replica exchanges and number of exchange attempts\n"
706              for line in f:
707                         
708                if 'ACC' in line:
709                     j+=1
710                     text=text+' '.join(line.split()[2:])+"\n"
711                     if j==task.remd_nrep:
712                        j=1
713                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
714
715                if 'Total wall' in line:
716                   text=text+line
717                        
718          task.results_text=text
719
720
721          if task.md_pdbref and task.type=='remd':
722          
723           for i in range(1,6):
724            try:
725             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
726                  line=f.readline()
727                  if i==1:
728                      task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
729                  elif i==2:
730                      task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
731                  elif i==3:
732                      task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
733                  elif i==4:
734                      task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
735                  elif i==5:
736                      task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
737            except EnvironmentError:
738             print 'file_wham_T*pdb open error'
739           for i in range(1,6):
740             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
741                text=''
742                for line in f:
743                  if 'RMSD of  the common residues=' in line:
744                    text=' RMSD='+line.split()[5]
745                  if 'TM-score    =' in line:
746                    text=text+' TMscore='+line.split()[2]
747                  if 'GDT-TS-score=' in line:
748                    text=text+' GDT_TS='+line.split()[1]
749                     
750                if i==1:
751                      task.remd_model1=task.remd_model1+text
752                elif i==2:
753                      task.remd_model2=task.remd_model2+text
754                elif i==3:
755                      task.remd_model3=task.remd_model3+text
756                elif i==4:
757                      task.remd_model4=task.remd_model4+text
758                elif i==5:
759                      task.remd_model5=task.remd_model5+text
760
761
762
763          if task.type=='remd':  
764           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
765
766            for line in f:
767              if 'sumprob' in line:
768                 i=0
769                 for line1 in f:
770                   i+=1
771                   if i>6:
772                        break
773                   if i==1:
774                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
775                   elif i==2:
776                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
777                   elif i==3:
778                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
779                   elif i==4:
780                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
781                   elif i==5:
782                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
783                      
784          
785
786          task.save()
787       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
788          if (task.type=='min'):
789            task.running =1
790          else:
791            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
792               line=''
793               for line in f:
794                 pass
795               if line != '':
796                 last = line.split()[0]
797               else:
798                 last = 0
799            task.running=int(1+int(last)*100.0/task.md_nstep)
800            if task.running>100:
801              task.running=100
802          task.save()
803
804     
805       return