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