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