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
5 from .models import Task
10 from lazysignup.decorators import allow_lazy_user
11 from lazysignup.utils import is_lazy_user
16 logger = logging.getLogger(__name__)
19 # 20 canonical amino acids
20 ('CYS', 'C'), ('ASP', 'D'), ('SER', 'S'), ('GLN', 'Q'),
21 ('LYS', 'K'), ('ILE', 'I'), ('PRO', 'P'), ('THR', 'T'),
22 ('PHE', 'F'), ('ASN', 'N'), ('GLY', 'G'), ('HIS', 'H'),
23 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
24 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
25 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
26 ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
28 ('DCY', 'c'), ('DAS', 'd'), ('DSN', 's'), ('DGN', 'q'),
29 ('DLY', 'k'), ('DIL', 'i'), ('DPR', 'p'), ('DTH', 't'),
30 ('DPN', 'f'), ('DSG', 'n'), ('DHI', 'h'),
31 ('DLE', 'l'), ('DAR', 'r'), ('DTR', 'w'), ('DAL', 'a'),
32 ('DVA', 'v'), ('DGL', 'e'), ('DTY', 'y'), ('MED', 'm'),
35 three_to_one = dict(res_codes)
41 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
45 coord.append([x, y, z])
46 if line[0:3] == 'END':
51 for j in xrange(i+1,l):
54 d=(p1[0]-p2[0])**2 + (p1[1]-p2[1])**2 + (p1[2]-p2[2])**2
57 return math.sqrt(maxd)
60 def load_pdbid(pdbid,dirname,filename='plik.pdb'):
61 if (not os.path.isdir(dirname)):
64 file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
69 pdb_tmp=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
70 with open(dirname+'/'+filename, 'w') as outfile:
72 if line[0:6] == 'SSBOND' and line[15] == chain and line[29] == chain:
74 if line[0:6] == 'ATOM ' and line[21] == chain:
76 if line[0:6] == 'ENDMDL':
79 file=dirname+'/'+filename
84 def seq_2d_from_pdb(seq_2d,seq):
87 seq_2d=seq_2d.replace('C', '-')
90 for i in range(0,len(seq)):
92 seq_2d_tmp=seq_2d_tmp+'-'
95 seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
98 for i in range(0,len(seq_2d_tmp),40):
99 tmp=tmp+seq_2d_tmp[i:i+40]+" "
102 def seq_2d_add_x(seq_2d,seq,seq_form):
105 seq_2d=seq_2d[:len(seq_form)]
106 seq_2d=seq_2d.replace('C', '-')
107 if seq_form[0] !='X' and seq[0] == 'X':
109 if seq_form[-1] !='X' and seq[-1] == 'X':
111 seq_2d=seq_2d[:len(seq)]
113 for i in range(0,len(seq_2d),40):
114 tmp=tmp+seq_2d[i:i+40]+" "
117 def seq_add_x(sequence):
118 if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X':
119 sequence='X'+sequence
120 if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X':
121 sequence=sequence+'X'
122 set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym'
123 sequence = ''.join([c for c in sequence if c in set])
139 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
140 aa = three_to_one.get(line[17:20])
143 if newchain or i!=ires[-1]:
148 chain_sorted.extend(ch)
150 if line[0:3] == 'TER' and i != '':
151 sequence.append('XX')
154 if line[0:6] == 'SSBOND':
156 b.append(int(line[17:21]))
157 b.append(int(line[31:35]))
160 c.append((line[15:16]))
161 c.append((line[29:30]))
163 if line[0:3] == 'END':
165 if not sequence[-1] == 'XX':
167 while sequence[-1] == 'XX':
169 if sequence[0] != 'G':
170 sequence.insert(0,'X')
171 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
172 if sequence[-1] != 'G':
174 seq=''.join(sequence)
176 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
178 for c in chain_sorted:
179 unres_shift[c]=i+chain_start[c]
180 i=i-(chain_end[c]-chain_start[c])-3
181 ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]
183 return seq,json.dumps(ssbond)
189 tasks = Task.objects.filter(owner=user).order_by('-created_date')
191 tasks_count = Task.objects.filter(owner=user).count()
192 return render(request, "index.html", {
193 'tasks': tasks, 'alldone': 0, 'tasks_count':tasks_count
198 if request.method == 'POST':
199 form = TaskForm(request.POST)
201 name = form.cleaned_data["name"]
203 task = Task(name=name,owner=user,ready=False)
205 return redirect('add_min',task_id=task.id)
209 def add_min(request,task_id):
210 task = get_object_or_404(Task, id=task_id)
211 if request.method == 'POST':
212 if '_example' in request.POST:
213 data= {'name':task.name,'pdbid':'1BDD'}
214 form = TaskForm_min(initial=data)
216 form = TaskForm_min(request.POST,request.FILES)
218 task.name=form.cleaned_data["name"]
220 pdbid=form.cleaned_data["pdbid"]
222 basename = str(task.owner)
223 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
224 task.jobdirname = "_".join([basename, suffix])
227 task.myfile1=load_pdbid(pdbid,task.jobdirname)
230 task.myfile1=form.cleaned_data["file1"]
232 seq,task.ssbond=from_pdb(task.myfile1)
234 for i in range(0,len(seq),40):
235 task.md_seq=task.md_seq+seq[i:i+40]+" "
240 if is_lazy_user(request.user):
241 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
245 data= {'name':task.name}
246 form = TaskForm_min(initial=data)
247 p_type='minimization'
249 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
252 def add_min_a(request,task_id):
253 task = get_object_or_404(Task, id=task_id)
254 if request.method == 'POST':
255 if '_example' in request.POST:
256 data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
257 form = TaskForm_min_a(initial=data)
259 form = TaskForm_min_a(request.POST,request.FILES)
261 task.name=form.cleaned_data["name"]
263 # task.min_choice=form.cleaned_data["min_choice"]
264 task.min_overlap=form.cleaned_data["min_overlap"]
265 task.min_searchsc=form.cleaned_data["min_searchsc"]
266 task.min_maxmin=form.cleaned_data["min_maxmin"]
267 task.min_maxfun=form.cleaned_data["min_maxfun"]
268 task.min_pdbout=form.cleaned_data["min_pdbout"]
270 basename = str(task.owner)
271 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
272 task.jobdirname = "_".join([basename, suffix])
274 pdbid=form.cleaned_data["pdbid"]
276 task.myfile1=load_pdbid(pdbid,task.jobdirname)
279 task.myfile1=form.cleaned_data["file1"]
281 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
282 task.unres_ff=form.cleaned_data["unres_ff"]
283 task.boxx=form.cleaned_data["boxx"]
284 task.boxy=form.cleaned_data["boxy"]
285 task.boxz=form.cleaned_data["boxz"]
287 seq,task.ssbond=from_pdb(task.myfile1)
289 for i in range(0,len(seq),40):
290 task.md_seq=task.md_seq+seq[i:i+40]+" "
295 if is_lazy_user(request.user):
296 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
300 data= {'name':task.name}
301 form = TaskForm_min_a(initial=data)
303 p_type='minimization - advanced options'
304 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
307 def add_md(request,task_id):
308 task = get_object_or_404(Task, id=task_id)
309 if request.method == 'POST':
310 if '_example' in request.POST:
311 data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
312 'md_pdbref':True,'md_temp':200,'md_seed':-39912345}
313 form = TaskForm_md(initial=data)
315 form = TaskForm_md(request.POST,request.FILES)
317 task.name=form.cleaned_data["name"]
319 task.md_seed=form.cleaned_data["md_seed"]
320 task.md_start=form.cleaned_data["md_start"]
321 task.md_temp=form.cleaned_data["md_temp"]
322 task.md_nstep=form.cleaned_data["md_nstep"]
323 task.md_total_steps=task.md_nstep
324 if task.md_nstep<250000:
327 basename = str(task.owner)
328 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
329 task.jobdirname = "_".join([basename, suffix])
331 pdbid=form.cleaned_data["pdbid"]
333 task.myfile1=load_pdbid(pdbid,task.jobdirname)
336 task.myfile1=form.cleaned_data["file1"]
337 task.md_pdbref=form.cleaned_data["md_pdbref"]
340 if task.md_start == "pdbstart" or task.md_pdbref:
341 seq,task.ssbond=from_pdb(task.myfile1)
343 seq=seq_add_x(form.cleaned_data["md_seq"])
345 for i in range(0,len(seq),40):
346 task.md_seq=task.md_seq+seq[i:i+40]+" "
348 if task.md_start != "pdbstart":
351 if any(c.islower() for c in seq):
358 if is_lazy_user(request.user):
359 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
363 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
364 form = TaskForm_md(initial=data)
366 p_type='molecular dynamics'
367 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
370 def add_md_a(request,task_id):
371 task = get_object_or_404(Task, id=task_id)
372 if request.method == 'POST':
373 if '_example' in request.POST:
374 data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
375 'md_pdbref':True,'md_mdpdb':True,'md_seed':-39912345}
376 form = TaskForm_md_a(initial=data)
378 form = TaskForm_md_a(request.POST,request.FILES)
380 task.name=form.cleaned_data["name"]
383 basename = str(task.owner)
384 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
385 task.jobdirname = "_".join([basename, suffix])
387 pdbid=form.cleaned_data["pdbid"]
389 task.myfile1=load_pdbid(pdbid,task.jobdirname)
392 task.myfile1=form.cleaned_data["file1"]
393 task.md_start=form.cleaned_data["md_start"]
394 task.md_pdbref=form.cleaned_data["md_pdbref"]
397 if task.md_start == "pdbstart" or task.md_pdbref:
398 seq,task.ssbond=from_pdb(task.myfile1)
399 task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
401 seq=seq_add_x(form.cleaned_data["md_seq"])
402 task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])
404 for i in range(0,len(seq),40):
405 task.md_seq=task.md_seq+seq[i:i+40]+" "
407 if task.md_start != "pdbstart":
410 task.md_seed=form.cleaned_data["md_seed"]
412 task.md_temp=form.cleaned_data["md_temp"]
413 task.md_nstep=form.cleaned_data["md_nstep"]
414 task.md_total_steps=task.md_nstep
415 task.md_ntwe=form.cleaned_data["md_ntwe"]
416 task.md_ntwx=form.cleaned_data["md_ntwx"]
417 task.md_dt=form.cleaned_data["md_dt"]
418 task.md_lang=form.cleaned_data["md_lang"]
419 task.md_tau=form.cleaned_data["md_tau"]
420 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
421 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
422 task.unres_ff=form.cleaned_data["unres_ff"]
423 task.md_respa=form.cleaned_data["md_respa"]
424 if any(c.islower() for c in seq):
427 task.boxx=form.cleaned_data["boxx"]
428 task.boxy=form.cleaned_data["boxy"]
429 task.boxz=form.cleaned_data["boxz"]
435 if is_lazy_user(request.user):
436 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
440 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
441 form = TaskForm_md_a(initial=data)
443 p_type='molecular dynamics - advanced options'
444 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
447 def add_remd(request,task_id):
448 task = get_object_or_404(Task, id=task_id)
449 if request.method == 'POST':
450 if '_example' in request.POST:
451 data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
452 form = TaskForm_remd(initial=data)
454 form = TaskForm_remd(request.POST,request.FILES)
456 task.name=form.cleaned_data["name"]
458 task.md_start=form.cleaned_data["md_start"]
460 basename = str(task.owner)
461 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
462 task.jobdirname = "_".join([basename, suffix])
464 pdbid=form.cleaned_data["pdbid"]
466 task.myfile1=load_pdbid(pdbid,task.jobdirname)
469 task.myfile1=form.cleaned_data["file1"]
470 task.md_pdbref=form.cleaned_data["md_pdbref"]
471 task.md_ntwx=task.remd_nstex
474 if task.md_start == "pdbstart" or task.md_pdbref:
475 seq,task.ssbond=from_pdb(task.myfile1)
477 seq=seq_add_x(form.cleaned_data["md_seq"])
478 for i in range(0,len(seq),40):
479 task.md_seq=task.md_seq+seq[i:i+40]+" "
481 if task.md_start != "pdbstart":
484 task.md_seed=form.cleaned_data["md_seed"]
486 task.md_nstep=form.cleaned_data["md_nstep"]
487 task.md_total_steps=task.md_nstep
489 if any(c.islower() for c in seq):
498 if is_lazy_user(request.user):
499 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
503 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
504 form = TaskForm_remd(initial=data)
506 p_type='replica exchange molecular dynamics'
507 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
510 def add_remd_a(request,task_id):
511 from django.core.files.uploadedfile import UploadedFile
512 task = get_object_or_404(Task, id=task_id)
513 if request.method == 'POST':
514 if '_example' in request.POST:
515 data= {'name':task.name,'pdbid':'5G3Q:B','md_pdbref':True,
516 'md_nstep':2000000,'md_lang':'berendsen','unres_ff':'FF2','md_seed':-39912345,
517 'remd_cluter_temp':290,'md_2d':'--EEEEEEE------EEEEEE------EEEEEE------HHHHHHHHHHH---HHHHHHHHHHHHHHHHHHHHHHH---'}
518 form = TaskForm_remd_a(initial=data)
519 task.example='casp12'
521 elif '_example_saxs' in request.POST:
522 data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
523 'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
524 'remd_cluter_temp':270,
525 'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
563 form = TaskForm_remd_a(initial=data)
564 elif '_example_saxs1' in request.POST:
565 data= {'name':task.name,'pdbid':'2KMS','md_pdbref':True,'md_start':'pdbstart',
566 'md_2d':'----EEEEEE-EEEEE-------EEEEEEEEE--EEEEEE-EEEE---EEEEEEEEE-----EEEEEEE-EEE-HHHHH-EEEE-EEEEEEEEE----EEEEEE---EEE-----',
567 'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
568 'remd_cluter_temp':280, 'min_maxfun':50,
569 'scal_rad':5.0,'wsaxs':1000.0,'saxs_data':
570 """0.7100E-00 0.2036E-03
571 0.1420E+01 0.4221E-03
572 0.2130E+01 0.6548E-03
573 0.2840E+01 0.9001E-03
574 0.3550E+01 0.1156E-02
575 0.4260E+01 0.1421E-02
576 0.4970E+01 0.1692E-02
577 0.5680E+01 0.1965E-02
578 0.6390E+01 0.2239E-02
579 0.7100E+01 0.2509E-02
580 0.7810E+01 0.2772E-02
581 0.8520E+01 0.3025E-02
582 0.9230E+01 0.3265E-02
583 0.9940E+01 0.3489E-02
584 0.1065E+02 0.3694E-02
585 0.1136E+02 0.3878E-02
586 0.1207E+02 0.4039E-02
587 0.1278E+02 0.4177E-02
588 0.1349E+02 0.4289E-02
589 0.1420E+02 0.4377E-02
590 0.1491E+02 0.4439E-02
591 0.1562E+02 0.4478E-02
592 0.1633E+02 0.4493E-02
593 0.1704E+02 0.4487E-02
594 0.1775E+02 0.4461E-02
595 0.1846E+02 0.4418E-02
596 0.1917E+02 0.4361E-02
597 0.1988E+02 0.4291E-02
598 0.2059E+02 0.4211E-02
599 0.2130E+02 0.4125E-02
600 0.2201E+02 0.4034E-02
601 0.2272E+02 0.3942E-02
602 0.2343E+02 0.3850E-02
603 0.2414E+02 0.3761E-02
604 0.2485E+02 0.3677E-02
605 0.2556E+02 0.3598E-02
606 0.2627E+02 0.3526E-02
607 0.2698E+02 0.3462E-02
608 0.2769E+02 0.3405E-02
609 0.2840E+02 0.3356E-02
610 0.2911E+02 0.3315E-02
611 0.2982E+02 0.3280E-02
612 0.3053E+02 0.3251E-02
613 0.3124E+02 0.3226E-02
614 0.3195E+02 0.3205E-02
615 0.3266E+02 0.3186E-02
616 0.3337E+02 0.3167E-02
617 0.3408E+02 0.3147E-02
618 0.3479E+02 0.3125E-02
619 0.3550E+02 0.3099E-02
620 0.3621E+02 0.3068E-02
621 0.3692E+02 0.3031E-02
622 0.3763E+02 0.2987E-02
623 0.3834E+02 0.2937E-02
624 0.3905E+02 0.2878E-02
625 0.3976E+02 0.2812E-02
626 0.4047E+02 0.2739E-02
627 0.4118E+02 0.2658E-02
628 0.4189E+02 0.2571E-02
629 0.4260E+02 0.2478E-02
630 0.4331E+02 0.2381E-02
631 0.4402E+02 0.2279E-02
632 0.4473E+02 0.2174E-02
633 0.4544E+02 0.2068E-02
634 0.4615E+02 0.1960E-02
635 0.4686E+02 0.1853E-02
636 0.4757E+02 0.1748E-02
637 0.4828E+02 0.1644E-02
638 0.4899E+02 0.1544E-02
639 0.4970E+02 0.1447E-02
640 0.5041E+02 0.1355E-02
641 0.5112E+02 0.1267E-02
642 0.5183E+02 0.1184E-02
643 0.5254E+02 0.1106E-02
644 0.5325E+02 0.1033E-02
645 0.5396E+02 0.9646E-03
646 0.5467E+02 0.9008E-03
647 0.5538E+02 0.8411E-03
648 0.5609E+02 0.7852E-03
649 0.5680E+02 0.7327E-03
650 0.5751E+02 0.6831E-03
651 0.5822E+02 0.6360E-03
652 0.5893E+02 0.5909E-03
653 0.5964E+02 0.5475E-03
654 0.6035E+02 0.5055E-03
655 0.6106E+02 0.4646E-03
656 0.6177E+02 0.4245E-03
657 0.6248E+02 0.3853E-03
658 0.6319E+02 0.3467E-03
659 0.6390E+02 0.3089E-03
660 0.6461E+02 0.2719E-03
661 0.6532E+02 0.2357E-03
662 0.6603E+02 0.2007E-03
663 0.6674E+02 0.1669E-03
664 0.6745E+02 0.1345E-03
665 0.6816E+02 0.1038E-03
666 0.6887E+02 0.7482E-04
667 0.6958E+02 0.4782E-04
668 0.7029E+02 0.2286E-04"""}
669 form = TaskForm_remd_a(initial=data)
671 form = TaskForm_remd_a(request.POST,request.FILES)
673 task.name=form.cleaned_data["name"]
676 basename = str(task.owner)
677 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
678 task.jobdirname = "_".join([basename, suffix])
680 pdbid=form.cleaned_data["pdbid"]
682 task.myfile1=load_pdbid(pdbid,task.jobdirname)
685 task.myfile1=form.cleaned_data["file1"]
686 task.md_start=form.cleaned_data["md_start"]
687 task.md_pdbref=form.cleaned_data["md_pdbref"]
690 if task.md_start == "pdbstart" or task.md_pdbref:
691 seq,task.ssbond=from_pdb(task.myfile1)
692 task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
694 seq=seq_add_x(form.cleaned_data["md_seq"])
695 task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])
697 for i in range(0,len(seq),40):
698 task.md_seq=task.md_seq+seq[i:i+40]+" "
700 if task.md_start != "pdbstart":
703 task.md_seed=form.cleaned_data["md_seed"]
704 task.md_nstep=form.cleaned_data["md_nstep"]
705 task.md_total_steps=task.md_nstep
706 task.md_dt=form.cleaned_data["md_dt"]
707 task.md_lang=form.cleaned_data["md_lang"]
708 task.md_tau=form.cleaned_data["md_tau"]
709 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
710 task.min_maxfun=form.cleaned_data["min_maxfun"]
711 task.remd_nrep=form.cleaned_data["remd_nrep"]
712 task.remd_nstex=form.cleaned_data["remd_nstex"]
713 task.md_ntwx=form.cleaned_data["md_ntwx"]
714 task.md_ntwe=form.cleaned_data["md_ntwe"]
715 task.md_respa=form.cleaned_data["md_respa"]
716 if any(c.islower() for c in seq):
720 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
721 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
723 task.boxx=form.cleaned_data["boxx"]
724 task.boxy=form.cleaned_data["boxy"]
725 task.boxz=form.cleaned_data["boxz"]
727 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
728 task.unres_ff=form.cleaned_data["unres_ff"]
730 task.scal_rad = form.cleaned_data["scal_rad"]
731 task.saxs_data = form.cleaned_data["saxs_data"]
732 task.wsaxs = form.cleaned_data["wsaxs"]
735 return redirect('addmlist',task_id=task.id)
737 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
738 form = TaskForm_remd_a(initial=data)
740 p_type='replica exchange molecular dynamics - advanced options'
741 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
744 def add_dock(request,task_id):
745 task = get_object_or_404(Task, id=task_id)
746 if request.method == 'POST':
747 if '_example' in request.POST:
748 data= {'name':task.name,'pdbid':'1BON:A','pdbid2':'1BON:B','md_seed':-12396738,'md_nstep':500000}
749 form = TaskForm_dock(initial=data)
751 form = TaskForm_dock(request.POST,request.FILES)
753 task.name=form.cleaned_data["name"]
756 basename = str(task.owner)
757 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
758 task.jobdirname = "_".join([basename, suffix])
760 pdbid=form.cleaned_data["pdbid"]
762 task.myfile1=load_pdbid(pdbid,task.jobdirname)
765 task.myfile1=form.cleaned_data["file1"]
767 pdbid2=form.cleaned_data["pdbid2"]
769 task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
771 seq2,ssbond2=from_pdb(task.myfile2)
773 task.myfile2=form.cleaned_data["file2"]
775 seq2=seq_add_x(form.cleaned_data["md_seq"])
778 seq2,ssbond2=from_pdb(task.myfile2)
780 task.md_ntwx=task.remd_nstex
781 task.md_start="pdbstart"
782 task.remd_multi_m='["3", "3", "3", "3", "3", "3", "3", "3"]'
783 if task.md_seq2 =='':
787 task.dock_peptide=form.cleaned_data["dock_peptide"]
791 seq1,ssbond1=from_pdb(task.myfile1)
794 if seq1[-1]=='X' and seq2[0]=='X':
796 elif seq1[-1]!='X' and seq2[0]!='X':
801 for i in range(0,len(seq),40):
802 task.md_seq=task.md_seq+seq[i:i+40]+" "
804 task.md_seed=form.cleaned_data["md_seed"]
806 task.md_nstep=form.cleaned_data["md_nstep"]
807 task.md_total_steps=task.md_nstep
809 if any(c.islower() for c in seq):
813 box1=dock_box(task.myfile1)
815 box2=dock_box(task.myfile2)
817 box2=len(task.md_seq2)*2.0
818 task.boxx=(box1+box2)*1.2+20
819 task.boxy=(box1+box2)*1.2+20
820 task.boxz=(box1+box2)*1.2+20
827 if is_lazy_user(request.user):
828 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
832 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
833 form = TaskForm_dock(initial=data)
836 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
839 def add_dock_a(request,task_id):
840 task = get_object_or_404(Task, id=task_id)
841 if request.method == 'POST':
842 if '_example' in request.POST:
843 data= {'name':task.name,'pdbid':'2HPL:A','md_seq':'DDLYG','dock_peptide':True,'md_seed':-39912345,'md_nstep':600000}
844 form = TaskForm_dock_a(initial=data)
845 task.example='dock_peptide'
848 form = TaskForm_dock_a(request.POST,request.FILES)
850 task.name=form.cleaned_data["name"]
853 basename = str(task.owner)
854 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
855 task.jobdirname = "_".join([basename, suffix])
857 pdbid=form.cleaned_data["pdbid"]
859 task.myfile1=load_pdbid(pdbid,task.jobdirname)
862 task.myfile1=form.cleaned_data["file1"]
864 pdbid2=form.cleaned_data["pdbid2"]
866 task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
868 seq2,ssbond2=from_pdb(task.myfile2)
870 task.myfile2=form.cleaned_data["file2"]
872 seq2=seq_add_x(form.cleaned_data["md_seq"])
875 seq2,ssbond2=from_pdb(task.myfile2)
878 task.md_ntwx=task.remd_nstex
879 task.md_start="pdbstart"
880 if task.md_seq2 =='':
884 task.dock_peptide=form.cleaned_data["dock_peptide"]
888 seq1,ssbond1=from_pdb(task.myfile1)
890 if seq1[-1]=='X' and seq2[0]=='X':
892 elif seq1[-1]!='X' and seq2[0]!='X':
897 for i in range(0,len(seq),40):
898 task.md_seq=task.md_seq+seq[i:i+40]+" "
900 task.md_seed=form.cleaned_data["md_seed"]
902 task.md_nstep=form.cleaned_data["md_nstep"]
903 task.md_total_steps=task.md_nstep
905 task.md_dt=form.cleaned_data["md_dt"]
906 task.md_lang=form.cleaned_data["md_lang"]
907 task.md_tau=form.cleaned_data["md_tau"]
908 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
909 task.min_maxfun=form.cleaned_data["min_maxfun"]
910 task.remd_nrep=form.cleaned_data["remd_nrep"]
911 task.remd_nstex=form.cleaned_data["remd_nstex"]
912 task.md_ntwx=form.cleaned_data["md_ntwx"]
913 task.md_ntwe=form.cleaned_data["md_ntwe"]
915 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
916 task.remd_cluster_n=form.cleaned_data["remd_cluster_n"]
917 task.unres_ff=form.cleaned_data["unres_ff"]
919 if any(c.islower() for c in seq):
923 box1=dock_box(task.myfile1)
925 box2=dock_box(task.myfile2)
927 box2=len(task.md_seq2)*2.0
928 task.boxx=(box1+box2)*1.2+20
929 task.boxy=(box1+box2)*1.2+20
930 task.boxz=(box1+box2)*1.2+20
933 return redirect('addmlist',task_id=task.id)
936 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
937 form = TaskForm_dock_a(initial=data)
939 p_type='docking - advanced options'
940 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
945 def addmlist(request,task_id):
946 task = get_object_or_404(Task, id=task_id)
947 if request.method == 'POST':
948 form = TaskForm_list(task.remd_nrep,request.POST)
950 task.remd_multi_t=form.cleaned_data["temperatures"]
951 task.remd_multi_m=form.cleaned_data["multiplexing"]
955 if is_lazy_user(request.user):
956 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
960 if task.example == 'casp12':
961 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
962 '["2", "2", "2", "2", "2", "2", "2", "2"]',
964 '["270", "280", "290", "300", "310", "320", "330", "340"]'
966 elif task.example == 'dock_peptide':
967 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
968 '["4", "8", "4", "4", "4", "4", "4", "4"]',
970 '["270", "280", "290", "300", "310", "320", "330", "345"]'
972 elif task.unres_ff == 'FF2' and task.type=="dock":
973 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
974 '["3", "3", "3", "3", "3", "3", "3", "3"]',
976 '["270", "280", "290", "300", "310", "320", "330", "345"]'
978 elif task.unres_ff == 'opt-wtfsa-2' and task.type=="dock":
979 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
980 '["3", "3", "3", "3", "3", "3", "3", "3"]',
982 '["250", "260", "270", "280", "290", "300", "315", "330"]'
984 elif task.unres_ff == 'FF2':
985 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
986 '["1", "1", "1", "1", "1", "1", "1", "1"]',
988 '["270", "280", "290", "300", "310", "320", "330", "345"]'
991 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
992 '["1", "1", "1", "1", "1", "1", "1", "1"]',
994 '["250", "260", "270", "280", "290", "300", "315", "330"]'
997 form = TaskForm_list(task.remd_nrep,initial=data)
998 p_type='replica exchange molecular dynamics - advanced options'
999 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
1002 def details(request,task_id):
1003 task = get_object_or_404(Task, id=task_id)
1005 remd_models=json.loads(task.remd_models)
1008 remd_models.append(task.remd_model1)
1009 remd_models.append(task.remd_model2)
1010 remd_models.append(task.remd_model3)
1011 remd_models.append(task.remd_model4)
1012 remd_models.append(task.remd_model5)
1013 return render(request, "details.html",{'task':task,'remd_models':remd_models,'range':range(1,task.remd_cluster_n+1)})
1016 def details1(request,user_id,task_id):
1017 task = get_object_or_404(Task, id=task_id)
1019 remd_models=json.loads(task.remd_models)
1022 remd_models.append(task.remd_model1)
1023 remd_models.append(task.remd_model2)
1024 remd_models.append(task.remd_model3)
1025 remd_models.append(task.remd_model4)
1026 remd_models.append(task.remd_model5)
1027 return render(request, "details1.html",{'task':task,'remd_models':remd_models,'range':range(1,task.remd_cluster_n+1)})
1031 def delete(request, task_id):
1032 Task.objects.get(id=task_id).delete()
1033 return redirect('/')
1036 def restart(request, task_id):
1037 task = get_object_or_404(Task, id=task_id)
1039 return redirect('/')
1041 def add_restart_inp():
1042 with open('file.inp','r') as f1, open ('file.inp.tmp','w') as f2:
1044 if 'reset_vel=' in line:
1045 f2.write('{:79}'.format('restart'+line[7:]))
1048 os.remove('file.inp')
1049 os.rename('file.inp.tmp','file.inp')
1053 if os.path.isfile(task.jobdirname+'/finished'):
1054 os.remove(task.jobdirname+'/finished')
1057 task.md_total_steps = task.md_total_steps+task.md_nstep
1059 if task.type == 'md':
1060 os.chdir(task.jobdirname)
1062 ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
1064 elif task.type == 'remd' or task.type == 'dock':
1065 os.chdir(task.jobdirname)
1067 tmp1=json.loads(task.remd_multi_m)
1068 nreplicas=sum(map(int, tmp1))
1069 with open('file_wham.inp','r') as f1, open ('file_wham.tmp','w') as f2:
1071 if 'rec_end=' in line:
1072 rec=task.md_total_steps/task.md_ntwx
1073 f2.write('nfile_cx=1 rec_start='+str(rec/10)
1074 +' rec_end='+str(rec)+' totraj='+str(nreplicas)+'\n')
1075 elif 'isampl=' in line:
1076 if task.md_total_steps/task.md_ntwx*nreplicas<=8000:
1079 isampl=int(task.md_total_steps/task.md_ntwx*nreplicas/8000)
1080 f2.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
1083 os.remove('file_wham.inp')
1084 os.rename('file_wham.tmp','file_wham.inp')
1085 if task.type == 'dock':
1086 with open('pbs8.csh','r') as f1, open ('pbs8.tmp','w') as f2:
1088 if 'generator_v13' in line:
1092 os.remove('pbs8.csh')
1093 os.rename('pbs8.tmp','pbs8.csh')
1094 ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
1098 def restart1(request, user_id, task_id):
1099 task = get_object_or_404(Task, id=task_id)
1102 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1105 def refresh_done1(request, task_id):
1106 task = get_object_or_404(Task, id=task_id)
1110 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1113 for line in proc.stdout:
1114 if 'piasek4' in line:
1115 if line.split()[1]=='test_server':
1117 if line.split()[-2]=='Q':
1119 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1121 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1125 def refresh_done(request):
1127 tasks = Task.objects.filter(owner=user).order_by('-created_date')
1128 tasks_count = Task.objects.filter(owner=user).count()
1135 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1138 for line in proc.stdout:
1139 if 'piasek4' in line:
1140 if line.split()[1]=='test_server':
1142 if line.split()[-2]=='Q':
1144 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1146 if is_lazy_user(request.user):
1147 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1149 return render(request, "index.html", {
1151 'variable' : variable,
1153 'tasks_count':tasks_count
1157 def refresh_done0(task):
1158 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
1161 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1163 if task.type=='min' or task.type=='md':
1167 task.etot=line.split()[1]
1169 if 'RMS deviation' in line:
1177 if 'Total wall' in line:
1180 elif task.type=='remd' or task.type=='dock':
1182 text="Acceptance for replica exchanges and number of exchange attempts\n"
1187 text=text+' '.join(line.split()[2:])+"\n"
1188 if j==task.remd_nrep:
1190 text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
1192 if 'Total wall' in line:
1195 task.results_text=text
1199 if task.md_pdbref and task.type=='remd' or task.type=='dock' and task.md_seq2 == '':
1201 for i in range(1,task.remd_cluster_n+1):
1203 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_'+str(i).zfill(4)+'.pdb', 'r') as f:
1205 remd_models.append('Cluster'+str(i)+' '+' '.join(line.split()[-3:]))
1206 except EnvironmentError:
1207 print 'file_wham_T*pdb open error'
1208 for i in range(1,task.remd_cluster_n+1):
1209 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
1212 if 'RMSD of the common residues=' in line:
1213 text=' RMSD='+line.split()[5]
1214 if 'TM-score =' in line:
1215 text=text+' TMscore='+line.split()[2]
1216 if 'GDT-TS-score=' in line:
1217 text=text+' GDT_TS='+line.split()[1]
1219 remd_models[i-1]=remd_models[i-1]+text
1221 if task.type=='dock':
1222 for i in range(1,task.remd_cluster_n+1):
1223 with open(task.jobdirname+'/dockq_'+str(i)+'.out', 'r') as f:
1227 text=' Fnat='+line.split()[1]
1229 text=text+' iRMS='+line.split()[1]
1231 text=text+' LRMS='+line.split()[1]
1232 if 'CAPRI' in line and not 'DockQ_CAPRI' in line:
1233 text=text+' CAPRI='+line.split()[1]
1234 if 'DockQ_CAPRI' in line:
1235 text=text+' DockQ_CAPRI= '+line.split()[1]
1236 if 'DockQ ' in line:
1237 text=text+' DockQ='+line.split()[1]
1239 remd_models[i-1]=remd_models[i-1]+text
1240 # logger.warning("models %d %s" % (i,remd_models))
1242 if task.type=='remd' or task.type=='dock':
1243 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
1246 if 'sumprob' in line:
1250 if i>task.remd_cluster_n:
1253 remd_models[i-1]=remd_models[i-1]+' Cluster'+str(i)+' probability= '+line1.split()[-2]
1255 if len(line1.split())==4:
1256 remd_models.append(' Cluster'+str(i)+' probability= '+line1.split()[-2])
1258 task.remd_models=json.dumps(remd_models)
1259 # logger.warning("models%s" % task.remd_models)
1261 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
1262 if (task.type=='min'):
1264 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1269 last = line.split()[0]
1273 task.running=int(1+int(last)*100.0/task.min_maxmin)
1276 if task.running>100:
1279 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
1284 last = line.split()[0]
1287 task.running=int(1+int(last)*100.0/task.md_nstep)
1288 if task.running>100:
1296 def zip_all_files(request, task_id):
1298 from django.http import HttpResponse
1299 from wsgiref.util import FileWrapper
1300 from django.core.files.temp import NamedTemporaryFile
1302 task = get_object_or_404(Task, id=task_id)
1304 temp=NamedTemporaryFile()
1305 archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
1306 for (dirpath, dirnames, filenames) in os.walk(task.jobdirname):
1307 for file1 in filenames:
1308 archive.write(dirpath+"/"+file1,file1)
1311 wrapper = FileWrapper(temp)
1312 response = HttpResponse(wrapper, content_type='application/zip')
1313 response['Content-Disposition'] = 'attachment; filename=all.zip'