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
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'),
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'),
31 three_to_one = dict(res_codes)
33 def load_pdbid(pdbid,dirname,filename='plik.pdb'):
34 if (not os.path.isdir(dirname)):
37 file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
42 pdb_tmp=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
43 with open(dirname+'/'+filename, 'w') as outfile:
45 if line[0:6] == 'SSBOND' and line[15] == chain and line[29] == chain:
47 if line[0:6] == 'ATOM ' and line[21] == chain:
49 if line[0:6] == 'ENDMDL':
52 file=dirname+'/'+filename
57 def seq_2d_from_pdb(seq_2d,seq):
60 seq_2d=seq_2d.replace('C', '-')
63 for i in range(0,len(seq)):
65 seq_2d_tmp=seq_2d_tmp+'-'
68 seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
71 for i in range(0,len(seq_2d_tmp),40):
72 tmp=tmp+seq_2d_tmp[i:i+40]+" "
75 def seq_2d_add_x(seq_2d,seq,seq_form):
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':
82 if seq_form[-1] !='X' and seq[-1] == 'X':
84 seq_2d=seq_2d[:len(seq)]
86 for i in range(0,len(seq_2d),40):
87 tmp=tmp+seq_2d[i:i+40]+" "
90 def seq_add_x(sequence):
91 if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X':
93 if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X':
95 set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym'
96 sequence = ''.join([c for c in sequence if c in set])
112 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
113 aa = three_to_one.get(line[17:20])
116 if newchain or i!=ires[-1]:
121 chain_sorted.extend(ch)
123 if line[0:3] == 'TER' and i != '':
124 sequence.append('XX')
127 if line[0:6] == 'SSBOND':
129 b.append(int(line[17:21]))
130 b.append(int(line[31:35]))
133 c.append((line[15:16]))
134 c.append((line[29:30]))
136 if line[0:3] == 'END':
138 if not sequence[-1] == 'XX':
140 while sequence[-1] == 'XX':
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':
147 seq=''.join(sequence)
149 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
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)]
156 return seq,json.dumps(ssbond)
162 tasks = Task.objects.filter(owner=user).order_by('-created_date')
164 tasks_count = Task.objects.filter(owner=user).count()
165 return render(request, "index.html", {
166 'tasks': tasks, 'alldone': 0, 'tasks_count':tasks_count
171 if request.method == 'POST':
172 form = TaskForm(request.POST)
174 name = form.cleaned_data["name"]
176 task = Task(name=name,owner=user,ready=False)
178 return redirect('add_min',task_id=task.id)
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)
189 form = TaskForm_min(request.POST,request.FILES)
191 task.name=form.cleaned_data["name"]
193 pdbid=form.cleaned_data["pdbid"]
195 basename = str(task.owner)
196 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
197 task.jobdirname = "_".join([basename, suffix])
200 task.myfile1=load_pdbid(pdbid,task.jobdirname)
203 task.myfile1=form.cleaned_data["file1"]
205 seq,task.ssbond=from_pdb(task.myfile1)
207 for i in range(0,len(seq),40):
208 task.md_seq=task.md_seq+seq[i:i+40]+" "
213 if is_lazy_user(request.user):
214 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
218 data= {'name':task.name}
219 form = TaskForm_min(initial=data)
220 p_type='minimization'
222 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
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)
232 form = TaskForm_min_a(request.POST,request.FILES)
234 task.name=form.cleaned_data["name"]
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"]
243 basename = str(task.owner)
244 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
245 task.jobdirname = "_".join([basename, suffix])
247 pdbid=form.cleaned_data["pdbid"]
249 task.myfile1=load_pdbid(pdbid,task.jobdirname)
252 task.myfile1=form.cleaned_data["file1"]
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"]
260 seq,task.ssbond=from_pdb(task.myfile1)
262 for i in range(0,len(seq),40):
263 task.md_seq=task.md_seq+seq[i:i+40]+" "
268 if is_lazy_user(request.user):
269 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
273 data= {'name':task.name}
274 form = TaskForm_min_a(initial=data)
276 p_type='minimization - advanced options'
277 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
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)
288 form = TaskForm_md(request.POST,request.FILES)
290 task.name=form.cleaned_data["name"]
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:
300 basename = str(task.owner)
301 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
302 task.jobdirname = "_".join([basename, suffix])
304 pdbid=form.cleaned_data["pdbid"]
306 task.myfile1=load_pdbid(pdbid,task.jobdirname)
309 task.myfile1=form.cleaned_data["file1"]
310 task.md_pdbref=form.cleaned_data["md_pdbref"]
313 if task.md_start == "pdbstart" or task.md_pdbref:
314 seq,task.ssbond=from_pdb(task.myfile1)
316 seq=seq_add_x(form.cleaned_data["md_seq"])
318 for i in range(0,len(seq),40):
319 task.md_seq=task.md_seq+seq[i:i+40]+" "
321 if task.md_start != "pdbstart":
324 if any(c.islower() for c in seq):
331 if is_lazy_user(request.user):
332 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
336 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
337 form = TaskForm_md(initial=data)
339 p_type='molecular dynamics'
340 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
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)
351 form = TaskForm_md_a(request.POST,request.FILES)
353 task.name=form.cleaned_data["name"]
356 basename = str(task.owner)
357 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
358 task.jobdirname = "_".join([basename, suffix])
360 pdbid=form.cleaned_data["pdbid"]
362 task.myfile1=load_pdbid(pdbid,task.jobdirname)
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"]
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)
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"])
377 for i in range(0,len(seq),40):
378 task.md_seq=task.md_seq+seq[i:i+40]+" "
380 if task.md_start != "pdbstart":
383 task.md_seed=form.cleaned_data["md_seed"]
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):
400 task.boxx=form.cleaned_data["boxx"]
401 task.boxy=form.cleaned_data["boxy"]
402 task.boxz=form.cleaned_data["boxz"]
408 if is_lazy_user(request.user):
409 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
413 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
414 form = TaskForm_md_a(initial=data)
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})
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)
427 form = TaskForm_remd(request.POST,request.FILES)
429 task.name=form.cleaned_data["name"]
431 task.md_start=form.cleaned_data["md_start"]
433 basename = str(task.owner)
434 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
435 task.jobdirname = "_".join([basename, suffix])
437 pdbid=form.cleaned_data["pdbid"]
439 task.myfile1=load_pdbid(pdbid,task.jobdirname)
442 task.myfile1=form.cleaned_data["file1"]
443 task.md_pdbref=form.cleaned_data["md_pdbref"]
444 task.md_ntwx=task.remd_nstex
447 if task.md_start == "pdbstart" or task.md_pdbref:
448 seq,task.ssbond=from_pdb(task.myfile1)
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]+" "
454 if task.md_start != "pdbstart":
457 task.md_seed=form.cleaned_data["md_seed"]
459 task.md_nstep=form.cleaned_data["md_nstep"]
460 task.md_total_steps=task.md_nstep
462 if any(c.islower() for c in seq):
471 if is_lazy_user(request.user):
472 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
476 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
477 form = TaskForm_remd(initial=data)
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})
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'
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':
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)
644 form = TaskForm_remd_a(request.POST,request.FILES)
646 task.name=form.cleaned_data["name"]
649 basename = str(task.owner)
650 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
651 task.jobdirname = "_".join([basename, suffix])
653 pdbid=form.cleaned_data["pdbid"]
655 task.myfile1=load_pdbid(pdbid,task.jobdirname)
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"]
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)
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"])
670 for i in range(0,len(seq),40):
671 task.md_seq=task.md_seq+seq[i:i+40]+" "
673 if task.md_start != "pdbstart":
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):
693 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
694 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
696 task.boxx=form.cleaned_data["boxx"]
697 task.boxy=form.cleaned_data["boxy"]
698 task.boxz=form.cleaned_data["boxz"]
700 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
701 task.unres_ff=form.cleaned_data["unres_ff"]
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"]
708 return redirect('addmlist',task_id=task.id)
710 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
711 form = TaskForm_remd_a(initial=data)
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})
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':'1BON:A','pdbid2':'1BON:B','md_seed':-12396738,'md_nstep':500000}
722 form = TaskForm_dock(initial=data)
724 form = TaskForm_dock(request.POST,request.FILES)
726 task.name=form.cleaned_data["name"]
729 basename = str(task.owner)
730 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
731 task.jobdirname = "_".join([basename, suffix])
733 pdbid=form.cleaned_data["pdbid"]
735 task.myfile1=load_pdbid(pdbid,task.jobdirname)
738 task.myfile1=form.cleaned_data["file1"]
740 pdbid2=form.cleaned_data["pdbid2"]
742 task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
745 task.myfile2=form.cleaned_data["file2"]
747 task.md_ntwx=task.remd_nstex
748 task.md_start="pdbstart"
749 task.remd_multi_m='["3", "3", "3", "3", "3", "3", "3", "3"]'
756 seq1,ssbond1=from_pdb(task.myfile1)
757 seq2,ssbond2=from_pdb(task.myfile2)
759 if seq1[-1]=='X' and seq2[0]=='X':
761 elif seq1[-1]!='X' and seq2[0]!='X':
766 for i in range(0,len(seq),40):
767 task.md_seq=task.md_seq+seq[i:i+40]+" "
769 task.md_seed=form.cleaned_data["md_seed"]
771 task.md_nstep=form.cleaned_data["md_nstep"]
772 task.md_total_steps=task.md_nstep
774 if any(c.islower() for c in seq):
783 if is_lazy_user(request.user):
784 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
788 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
789 form = TaskForm_dock(initial=data)
792 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
795 def add_dock_a(request,task_id):
796 task = get_object_or_404(Task, id=task_id)
797 if request.method == 'POST':
798 if '_example' in request.POST:
799 data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
800 form = TaskForm_dock_a(initial=data)
802 form = TaskForm_dock_a(request.POST,request.FILES)
804 task.name=form.cleaned_data["name"]
807 basename = str(task.owner)
808 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
809 task.jobdirname = "_".join([basename, suffix])
811 pdbid=form.cleaned_data["pdbid"]
813 task.myfile1=load_pdbid(pdbid,task.jobdirname)
816 task.myfile1=form.cleaned_data["file1"]
818 pdbid2=form.cleaned_data["pdbid2"]
820 task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
823 task.myfile2=form.cleaned_data["file2"]
825 task.md_ntwx=task.remd_nstex
826 task.md_start="pdbstart"
833 seq1,ssbond1=from_pdb(task.myfile1)
834 seq2,ssbond2=from_pdb(task.myfile2)
836 if seq1[-1]=='X' and seq2[0]=='X':
838 elif seq1[-1]!='X' and seq2[0]!='X':
843 for i in range(0,len(seq),40):
844 task.md_seq=task.md_seq+seq[i:i+40]+" "
846 task.md_seed=form.cleaned_data["md_seed"]
848 task.md_nstep=form.cleaned_data["md_nstep"]
849 task.md_total_steps=task.md_nstep
851 task.md_dt=form.cleaned_data["md_dt"]
852 task.md_lang=form.cleaned_data["md_lang"]
853 task.md_tau=form.cleaned_data["md_tau"]
854 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
855 task.min_maxfun=form.cleaned_data["min_maxfun"]
856 task.remd_nrep=form.cleaned_data["remd_nrep"]
857 task.remd_nstex=form.cleaned_data["remd_nstex"]
858 task.md_ntwx=form.cleaned_data["md_ntwx"]
859 task.md_ntwe=form.cleaned_data["md_ntwe"]
861 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
862 task.unres_ff=form.cleaned_data["unres_ff"]
864 if any(c.islower() for c in seq):
869 return redirect('addmlist',task_id=task.id)
872 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
873 form = TaskForm_dock_a(initial=data)
875 p_type='docking - advanced options'
876 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
881 def addmlist(request,task_id):
882 task = get_object_or_404(Task, id=task_id)
883 if request.method == 'POST':
884 form = TaskForm_list(task.remd_nrep,request.POST)
886 task.remd_multi_t=form.cleaned_data["temperatures"]
887 task.remd_multi_m=form.cleaned_data["multiplexing"]
891 if is_lazy_user(request.user):
892 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
896 if task.example == 'casp12':
897 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
898 '["2", "2", "2", "2", "2", "2", "2", "2"]',
900 '["270", "280", "290", "300", "310", "320", "330", "340"]'
902 elif task.unres_ff == 'FF2':
903 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
904 '["1", "1", "1", "1", "1", "1", "1", "1"]',
906 '["270", "280", "290", "300", "310", "320", "330", "345"]'
909 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
910 '["1", "1", "1", "1", "1", "1", "1", "1"]',
912 '["250", "260", "270", "280", "290", "300", "315", "330"]'
915 form = TaskForm_list(task.remd_nrep,initial=data)
916 p_type='replica exchange molecular dynamics - advanced options'
917 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
920 def details(request,task_id):
921 task = get_object_or_404(Task, id=task_id)
922 return render(request, "details.html",{'task':task})
925 def details1(request,user_id,task_id):
926 task = get_object_or_404(Task, id=task_id)
927 return render(request, "details1.html",{'task':task})
931 def delete(request, task_id):
932 Task.objects.get(id=task_id).delete()
936 def restart(request, task_id):
937 task = get_object_or_404(Task, id=task_id)
941 def add_restart_inp():
942 with open('file.inp','r') as f1, open ('file.inp.tmp','w') as f2:
944 if 'reset_vel=' in line:
945 f2.write('{:79}'.format('restart'+line[7:]))
948 os.remove('file.inp')
949 os.rename('file.inp.tmp','file.inp')
953 if os.path.isfile(task.jobdirname+'/finished'):
954 os.remove(task.jobdirname+'/finished')
957 task.md_total_steps = task.md_total_steps+task.md_nstep
959 if task.type == 'md':
960 os.chdir(task.jobdirname)
962 ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
964 elif task.type == 'remd':
965 os.chdir(task.jobdirname)
967 tmp1=json.loads(task.remd_multi_m)
968 nreplicas=sum(map(int, tmp1))
969 with open('file_wham.inp','r') as f1, open ('file_wham.tmp','w') as f2:
971 if 'rec_end=' in line:
972 rec=task.md_total_steps/task.md_ntwx
973 f2.write('nfile_cx=1 rec_start='+str(rec/10)
974 +' rec_end='+str(rec)+' totraj='+str(nreplicas)+'\n')
975 elif 'isampl=' in line:
976 if task.md_total_steps/task.md_ntwx*nreplicas<=8000:
979 isampl=int(task.md_total_steps/task.md_ntwx*nreplicas/8000)
980 f2.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
983 os.remove('file_wham.inp')
984 os.rename('file_wham.tmp','file_wham.inp')
985 ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
989 def restart1(request, user_id, task_id):
990 task = get_object_or_404(Task, id=task_id)
993 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
996 def refresh_done1(request, task_id):
997 task = get_object_or_404(Task, id=task_id)
1001 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1004 for line in proc.stdout:
1005 if 'piasek4' in line:
1006 if line.split()[1]=='test_server':
1008 if line.split()[-2]=='Q':
1010 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1012 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1016 def refresh_done(request):
1018 tasks = Task.objects.filter(owner=user).order_by('-created_date')
1019 tasks_count = Task.objects.filter(owner=user).count()
1026 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1029 for line in proc.stdout:
1030 if 'piasek4' in line:
1031 if line.split()[1]=='test_server':
1033 if line.split()[-2]=='Q':
1035 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1037 if is_lazy_user(request.user):
1038 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1040 return render(request, "index.html", {
1042 'variable' : variable,
1044 'tasks_count':tasks_count
1048 def refresh_done0(task):
1049 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
1052 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1054 if task.type=='min' or task.type=='md':
1058 task.etot=line.split()[1]
1060 if 'RMS deviation' in line:
1068 if 'Total wall' in line:
1071 elif task.type=='remd' or task.type=='dock':
1073 text="Acceptance for replica exchanges and number of exchange attempts\n"
1078 text=text+' '.join(line.split()[2:])+"\n"
1079 if j==task.remd_nrep:
1081 text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
1083 if 'Total wall' in line:
1086 task.results_text=text
1089 if task.md_pdbref and task.type=='remd' or task.type=='dock':
1091 for i in range(1,6):
1093 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
1096 task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
1098 task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
1100 task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
1102 task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
1104 task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
1105 except EnvironmentError:
1106 print 'file_wham_T*pdb open error'
1107 for i in range(1,6):
1108 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
1111 if 'RMSD of the common residues=' in line:
1112 text=' RMSD='+line.split()[5]
1113 if 'TM-score =' in line:
1114 text=text+' TMscore='+line.split()[2]
1115 if 'GDT-TS-score=' in line:
1116 text=text+' GDT_TS='+line.split()[1]
1119 task.remd_model1=task.remd_model1+text
1121 task.remd_model2=task.remd_model2+text
1123 task.remd_model3=task.remd_model3+text
1125 task.remd_model4=task.remd_model4+text
1127 task.remd_model5=task.remd_model5+text
1129 if task.type=='dock':
1130 for i in range(1,6):
1131 with open(task.jobdirname+'/dockq_'+str(i)+'.out', 'r') as f:
1135 text=' Fnat='+line.split()[1]
1137 text=text+' iRMS='+line.split()[1]
1139 text=text+' LRMS='+line.split()[1]
1141 text=text+' CAPRI='+line.split()[1]
1142 if 'DockQ_CAPRI' in line:
1143 text=text+' DockQ_CAPRI='+line.split()[1]
1144 if 'DockQ ' in line:
1145 text=text+' DockQ='+line.split()[1]
1148 task.remd_model1=task.remd_model1+text
1150 task.remd_model2=task.remd_model2+text
1152 task.remd_model3=task.remd_model3+text
1154 task.remd_model4=task.remd_model4+text
1156 task.remd_model5=task.remd_model5+text
1159 if task.type=='remd' or task.type=='dock':
1160 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
1163 if 'sumprob' in line:
1170 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[-2]
1172 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[-2]
1174 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[-2]
1176 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[-2]
1178 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[-2]
1183 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
1184 if (task.type=='min'):
1186 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1191 last = line.split()[0]
1195 task.running=int(1+int(last)*100.0/task.min_maxmin)
1198 if task.running>100:
1201 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
1206 last = line.split()[0]
1209 task.running=int(1+int(last)*100.0/task.md_nstep)
1210 if task.running>100:
1218 def zip_all_files(request, task_id):
1220 from django.http import HttpResponse
1221 from wsgiref.util import FileWrapper
1222 from django.core.files.temp import NamedTemporaryFile
1224 task = get_object_or_404(Task, id=task_id)
1226 temp=NamedTemporaryFile()
1227 archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
1228 for (dirpath, dirnames, filenames) in os.walk(task.jobdirname):
1229 for file1 in filenames:
1230 archive.write(dirpath+"/"+file1,file1)
1233 wrapper = FileWrapper(temp)
1234 response = HttpResponse(wrapper, content_type='application/zip')
1235 response['Content-Disposition'] = 'attachment; filename=all.zip'