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