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