dock adv initial multiplex 3
[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 import logging
14
15 logging.basicConfig()
16 logger = logging.getLogger(__name__)
17
18 res_codes = [
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'),
27                 ('CYX', 'C'),
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'),                
33                ]
34
35 three_to_one = dict(res_codes)
36
37 def dock_box(file):
38    import math
39    coord = list()
40    for line in file:
41             if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
42               x=float(line[30:38])
43               y=float(line[38:46])
44               z=float(line[46:54])
45               coord.append([x, y, z])
46             if line[0:3] == 'END':
47               break
48    maxd=0
49    l=len(coord)
50    for i in xrange(l):
51       for j in xrange(i+1,l):
52         p1=coord[i]
53         p2=coord[j]
54         d=(p1[0]-p2[0])**2 + (p1[1]-p2[1])**2 + (p1[2]-p2[2])**2
55         if d > maxd:
56           maxd=d
57    return math.sqrt(maxd)
58
59
60 def load_pdbid(pdbid,dirname,filename='plik.pdb'):
61     if (not os.path.isdir(dirname)):
62        os.mkdir(dirname)
63     if len(pdbid)==4:
64        file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
65                      dirname+'/'+filename)     
66     else:
67        chain=pdbid[5]
68        pdbid=pdbid[:4]
69        pdb_tmp=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
70        with open(dirname+'/'+filename, 'w') as outfile:
71         for line in pdb_tmp:
72           if line[0:6] == 'SSBOND' and line[15] == chain and line[29] == chain:
73             outfile.write(line)
74           if line[0:6] == 'ATOM  ' and line[21] == chain:
75             outfile.write(line)
76           if line[0:6] == 'ENDMDL':
77             break
78        pdb_tmp.close()
79        file=dirname+'/'+filename
80        
81     return(file)
82
83
84 def seq_2d_from_pdb(seq_2d,seq):
85     if seq_2d =='':
86       return(seq_2d)
87     seq_2d=seq_2d.replace('C', '-')
88     seq_2d_tmp=''
89     ii=0
90     for i in range(0,len(seq)):
91       if seq[i]=='X':
92          seq_2d_tmp=seq_2d_tmp+'-'
93       else:
94          if len(seq_2d)>ii:
95             seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
96             ii+=1
97     tmp=''
98     for i in range(0,len(seq_2d_tmp),40):
99       tmp=tmp+seq_2d_tmp[i:i+40]+" "
100     return(tmp)
101
102 def seq_2d_add_x(seq_2d,seq,seq_form):
103     if seq_2d =='':
104       return(seq_2d)
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':
108       seq_2d='-'+seq_2d
109     if seq_form[-1] !='X' and seq[-1] == 'X':
110       seq_2d=seq_2d+'-'
111     seq_2d=seq_2d[:len(seq)]
112     tmp=''
113     for i in range(0,len(seq_2d),40):
114       tmp=tmp+seq_2d[i:i+40]+" "
115     return(tmp)
116
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])
124
125     return(sequence)    
126
127 def from_pdb(file):
128     sequence = []
129     ssbond = []
130     ssbond_ch = []
131     ires = []
132     chain_start = {}
133     chain_end = {}
134     unres_shift = {}
135     chain_sorted=[]
136     newchain = True
137     i=''
138     for line in file:
139             if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
140               aa = three_to_one.get(line[17:20])
141               i = int(line[22:26])
142               ch = line[21:22]
143               if newchain or i!=ires[-1]:
144                 sequence.append(aa)
145                 ires.append(i)
146                 if newchain:
147                  chain_start[ch]=i
148                  chain_sorted.extend(ch)
149                  newchain = False
150             if line[0:3] == 'TER' and i != '':
151               sequence.append('XX')
152               chain_end[ch]=i
153               newchain = True
154             if line[0:6] == 'SSBOND':
155               b=[]
156               b.append(int(line[17:21]))
157               b.append(int(line[31:35]))
158               ssbond.append(b)
159               c = []
160               c.append((line[15:16]))
161               c.append((line[29:30]))
162               ssbond_ch.append(c)                                                                      
163             if line[0:3] == 'END':
164               break
165     if not sequence[-1] == 'XX':
166             chain_end[ch]=i
167     while sequence[-1] == 'XX':
168             del sequence[-1]
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':
173             sequence.append('X')
174     seq=''.join(sequence)
175 #    if ires[0] != 1:
176 #            ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
177     i=0
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)]     
182
183     return seq,json.dumps(ssbond)
184
185
186 @login_required
187 def index(request):
188     user = request.user
189     tasks = Task.objects.filter(owner=user).order_by('-created_date')
190     variable = ''
191     tasks_count = Task.objects.filter(owner=user).count()
192     return render(request, "index.html", {
193             'tasks': tasks, 'alldone': 0, 'tasks_count':tasks_count
194         })
195
196 @login_required
197 def add(request):
198     if request.method == 'POST':
199         form = TaskForm(request.POST)
200         if form.is_valid():
201             name = form.cleaned_data["name"]
202             user = request.user
203             task = Task(name=name,owner=user,ready=False)
204             task.save()
205             return redirect('add_min',task_id=task.id)
206     return redirect('/')
207
208 @login_required
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)     
215      else:
216         form = TaskForm_min(request.POST,request.FILES)
217         if form.is_valid():
218              task.name=form.cleaned_data["name"]
219              task.type="min"
220              pdbid=form.cleaned_data["pdbid"]
221
222              basename = str(task.owner)
223              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
224              task.jobdirname = "_".join([basename, suffix])
225
226              if pdbid:
227               task.myfile1=load_pdbid(pdbid,task.jobdirname)
228               task.pdbcode=pdbid
229              else:
230               task.myfile1=form.cleaned_data["file1"]
231
232              seq,task.ssbond=from_pdb(task.myfile1)
233              task.md_seq=""
234              for i in range(0,len(seq),40):
235                     task.md_seq=task.md_seq+seq[i:i+40]+" "
236
237              task.ready=True
238              
239              task.save()
240              if is_lazy_user(request.user):
241               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
242              else:
243               return redirect('/')
244     else:
245         data= {'name':task.name}
246         form = TaskForm_min(initial=data)
247     p_type='minimization'
248     basic_adv=True    
249     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
250
251 @login_required
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)     
258      else:
259         form = TaskForm_min_a(request.POST,request.FILES)
260         if form.is_valid():
261              task.name=form.cleaned_data["name"]
262              task.type="min"
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"]
269
270              basename = str(task.owner)
271              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
272              task.jobdirname = "_".join([basename, suffix])
273              
274              pdbid=form.cleaned_data["pdbid"]
275              if pdbid:
276               task.myfile1=load_pdbid(pdbid,task.jobdirname)
277               task.pdbcode=pdbid
278              else:
279               task.myfile1=form.cleaned_data["file1"]
280
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"]             
286
287              seq,task.ssbond=from_pdb(task.myfile1)
288              task.md_seq=""
289              for i in range(0,len(seq),40):
290                 task.md_seq=task.md_seq+seq[i:i+40]+" "
291                                                            
292              task.ready=True
293              
294              task.save()
295              if is_lazy_user(request.user):
296               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
297              else:
298               return redirect('/')
299     else:
300         data= {'name':task.name}
301         form = TaskForm_min_a(initial=data)
302     basic_adv=False
303     p_type='minimization - advanced options'
304     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
305
306 @login_required
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)     
314      else:
315         form = TaskForm_md(request.POST,request.FILES)
316         if form.is_valid():
317              task.name=form.cleaned_data["name"]
318              task.type="md"
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:
325                  task.md_ntwx=100
326
327              basename = str(task.owner)
328              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
329              task.jobdirname = "_".join([basename, suffix])
330
331              pdbid=form.cleaned_data["pdbid"]
332              if pdbid:
333               task.myfile1=load_pdbid(pdbid,task.jobdirname)
334               task.pdbcode=pdbid
335              else:
336               task.myfile1=form.cleaned_data["file1"]
337              task.md_pdbref=form.cleaned_data["md_pdbref"]             
338
339              task.md_seq=""
340              if task.md_start == "pdbstart" or task.md_pdbref:
341                seq,task.ssbond=from_pdb(task.myfile1)
342              else:
343                seq=seq_add_x(form.cleaned_data["md_seq"])
344                        
345              for i in range(0,len(seq),40):
346                 task.md_seq=task.md_seq+seq[i:i+40]+" "
347              
348              if task.md_start != "pdbstart":
349                 task.ssbond=''
350
351              if any(c.islower() for c in seq):
352               task.md_respa=False
353               task.damino=True
354
355              task.ready=True
356              
357              task.save()
358              if is_lazy_user(request.user):
359               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
360              else:
361               return redirect('/')
362     else:
363         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
364         form = TaskForm_md(initial=data)
365     basic_adv=True
366     p_type='molecular dynamics'
367     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
368
369 @login_required
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)     
377      else:
378         form = TaskForm_md_a(request.POST,request.FILES)
379         if form.is_valid():
380              task.name=form.cleaned_data["name"]
381              task.type="md"
382
383              basename = str(task.owner)
384              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
385              task.jobdirname = "_".join([basename, suffix])
386
387              pdbid=form.cleaned_data["pdbid"]
388              if pdbid:
389               task.myfile1=load_pdbid(pdbid,task.jobdirname)
390               task.pdbcode=pdbid
391              else:
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"]             
395
396              task.md_seq=""
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)
400              else:
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"])               
403
404              for i in range(0,len(seq),40):
405                 task.md_seq=task.md_seq+seq[i:i+40]+" "
406
407              if task.md_start != "pdbstart":
408                 task.ssbond=''
409
410              task.md_seed=form.cleaned_data["md_seed"]
411
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):
425               task.md_respa=False
426               task.damino=True
427              task.boxx=form.cleaned_data["boxx"]
428              task.boxy=form.cleaned_data["boxy"]             
429              task.boxz=form.cleaned_data["boxz"]             
430
431              
432              task.ready=True
433              
434              task.save()
435              if is_lazy_user(request.user):
436               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
437              else:
438               return redirect('/')
439     else:
440         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
441         form = TaskForm_md_a(initial=data)
442     basic_adv=False
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})
445
446 @login_required
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)     
453      else:
454         form = TaskForm_remd(request.POST,request.FILES)
455         if form.is_valid():
456              task.name=form.cleaned_data["name"]
457              task.type="remd"
458              task.md_start=form.cleaned_data["md_start"]
459
460              basename = str(task.owner)
461              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
462              task.jobdirname = "_".join([basename, suffix])
463
464              pdbid=form.cleaned_data["pdbid"]
465              if pdbid:
466               task.myfile1=load_pdbid(pdbid,task.jobdirname)
467               task.pdbcode=pdbid
468              else:
469               task.myfile1=form.cleaned_data["file1"]
470              task.md_pdbref=form.cleaned_data["md_pdbref"]
471              task.md_ntwx=task.remd_nstex 
472
473              task.md_seq=""
474              if task.md_start == "pdbstart" or task.md_pdbref:
475                seq,task.ssbond=from_pdb(task.myfile1)
476              else:
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]+" "
480
481              if task.md_start != "pdbstart":
482                 task.ssbond=''
483
484              task.md_seed=form.cleaned_data["md_seed"]
485
486              task.md_nstep=form.cleaned_data["md_nstep"]
487              task.md_total_steps=task.md_nstep
488
489              if any(c.islower() for c in seq):
490               task.md_respa=False
491               task.damino=True
492
493
494              task.ready=True
495              
496              
497              task.save()
498              if is_lazy_user(request.user):
499               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
500              else:
501               return redirect('/')
502     else:
503         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
504         form = TaskForm_remd(initial=data)
505     basic_adv=True
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})
508
509 @login_required
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'
520         task.save() 
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':
526 """ 0.5     1.33868e-02
527  1.5     1.95880e-02
528  2.5     2.68896e-02
529  3.5     3.43737e-02
530  4.5     4.07099e-02
531  5.5     4.47875e-02
532  6.5     4.63486e-02
533  7.5     4.60514e-02
534  8.5     4.49130e-02
535  9.5     4.36744e-02
536 10.5     4.26085e-02
537 11.5     4.17464e-02
538 12.5     4.11217e-02
539 13.5     4.07835e-02
540 14.5     4.06776e-02
541 15.5     4.06060e-02
542 16.5     4.03241e-02
543 17.5     3.96655e-02
544 18.5     3.85756e-02
545 19.5     3.70537e-02
546 20.5     3.50982e-02
547 21.5     3.27236e-02
548 22.5     3.00046e-02
549 23.5     2.70643e-02
550 24.5     2.40044e-02
551 25.5     2.08595e-02
552 26.5     1.76342e-02
553 27.5     1.43802e-02
554 28.5     1.12281e-02
555 29.5     8.34574e-03
556 30.5     5.87354e-03
557 31.5     3.88732e-03
558 32.5     2.39755e-03
559 33.5     1.36323e-03
560 34.5     7.06686e-04
561 35.5     3.30592e-04
562 36.5     1.38359e-04"""}
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)     
670      else:
671         form = TaskForm_remd_a(request.POST,request.FILES)
672         if form.is_valid():
673              task.name=form.cleaned_data["name"]
674              task.type="remd"
675
676              basename = str(task.owner)
677              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
678              task.jobdirname = "_".join([basename, suffix])
679
680              pdbid=form.cleaned_data["pdbid"]
681              if pdbid:
682               task.myfile1=load_pdbid(pdbid,task.jobdirname)
683               task.pdbcode=pdbid
684              else:
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"]                        
688
689              task.md_seq=""
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)
693              else:
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"])               
696
697              for i in range(0,len(seq),40):
698                 task.md_seq=task.md_seq+seq[i:i+40]+" "
699
700              if task.md_start != "pdbstart":
701                 task.ssbond=''
702
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):
717               task.md_respa=False
718               task.damino=True
719              
720 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
721 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
722
723              task.boxx=form.cleaned_data["boxx"]
724              task.boxy=form.cleaned_data["boxy"]             
725              task.boxz=form.cleaned_data["boxz"]             
726
727              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
728              task.unres_ff=form.cleaned_data["unres_ff"]
729              
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"]
733              
734              task.save()
735              return redirect('addmlist',task_id=task.id)
736     else:
737         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
738         form = TaskForm_remd_a(initial=data)
739     basic_adv=False
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})
742
743 @login_required
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)     
750      else:
751         form = TaskForm_dock(request.POST,request.FILES)
752         if form.is_valid():
753              task.name=form.cleaned_data["name"]
754              task.type="dock"
755
756              basename = str(task.owner)
757              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
758              task.jobdirname = "_".join([basename, suffix])
759
760              pdbid=form.cleaned_data["pdbid"]
761              if pdbid:
762               task.myfile1=load_pdbid(pdbid,task.jobdirname)
763               task.pdbcode=pdbid
764              else:
765               task.myfile1=form.cleaned_data["file1"]
766
767              pdbid2=form.cleaned_data["pdbid2"]
768              if pdbid2:
769               task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
770               task.pdbcode2=pdbid2
771               seq2,ssbond2=from_pdb(task.myfile2)
772              else:
773               task.myfile2=form.cleaned_data["file2"]
774               if not task.myfile2:
775                 seq2=seq_add_x(form.cleaned_data["md_seq"])
776                 task.md_seq2=seq2
777               else:
778                 seq2,ssbond2=from_pdb(task.myfile2)
779
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 =='':  
784                task.md_pdbref=True
785              task.md_respa=False
786              task.ssbond=""
787              task.dock_peptide=form.cleaned_data["dock_peptide"]
788
789              task.md_seq=""
790
791              seq1,ssbond1=from_pdb(task.myfile1)
792
793              
794              if seq1[-1]=='X' and seq2[0]=='X':
795               seq=seq1+seq2
796              elif seq1[-1]!='X' and seq2[0]!='X':
797               seq=seq1+'XX'+seq2
798              else:
799               seq=seq1+'X'+seq2
800              
801              for i in range(0,len(seq),40):
802                 task.md_seq=task.md_seq+seq[i:i+40]+" "
803
804              task.md_seed=form.cleaned_data["md_seed"]
805
806              task.md_nstep=form.cleaned_data["md_nstep"]
807              task.md_total_steps=task.md_nstep
808
809              if any(c.islower() for c in seq):
810               task.md_respa=False
811               task.damino=True
812
813              box1=dock_box(task.myfile1)
814              if task.myfile2:
815               box2=dock_box(task.myfile2)
816              else:
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
821              
822              task.ready=True
823
824              
825              
826              task.save()
827              if is_lazy_user(request.user):
828               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
829              else:
830               return redirect('/')
831     else:
832         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
833         form = TaskForm_dock(initial=data)
834     basic_adv=True
835     p_type='docking'
836     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
837
838 @login_required
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'
846         task.save()
847      else:
848         form = TaskForm_dock_a(request.POST,request.FILES)
849         if form.is_valid():
850              task.name=form.cleaned_data["name"]
851              task.type="dock"
852
853              basename = str(task.owner)
854              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
855              task.jobdirname = "_".join([basename, suffix])
856
857              pdbid=form.cleaned_data["pdbid"]
858              if pdbid:
859               task.myfile1=load_pdbid(pdbid,task.jobdirname)
860               task.pdbcode=pdbid
861              else:
862               task.myfile1=form.cleaned_data["file1"]
863               
864              pdbid2=form.cleaned_data["pdbid2"]
865              if pdbid2:
866               task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
867               task.pdbcode2=pdbid2
868               seq2,ssbond2=from_pdb(task.myfile2)
869              else:
870               task.myfile2=form.cleaned_data["file2"]
871               if not task.myfile2:
872                 seq2=seq_add_x(form.cleaned_data["md_seq"])
873                 task.md_seq2=seq2
874               else:
875                 seq2,ssbond2=from_pdb(task.myfile2)
876               
877
878              task.md_ntwx=task.remd_nstex 
879              task.md_start="pdbstart"
880              if task.md_seq2 =='':
881                task.md_pdbref=True
882              task.md_respa=False
883              task.ssbond=""
884              task.dock_peptide=form.cleaned_data["dock_peptide"]
885               
886              task.md_seq=""
887
888              seq1,ssbond1=from_pdb(task.myfile1)
889              
890              if seq1[-1]=='X' and seq2[0]=='X':
891               seq=seq1+seq2
892              elif seq1[-1]!='X' and seq2[0]!='X':
893               seq=seq1+'XX'+seq2
894              else:
895               seq=seq1+'X'+seq2
896              
897              for i in range(0,len(seq),40):
898                 task.md_seq=task.md_seq+seq[i:i+40]+" "
899
900              task.md_seed=form.cleaned_data["md_seed"]
901
902              task.md_nstep=form.cleaned_data["md_nstep"]
903              task.md_total_steps=task.md_nstep
904              
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"]
914
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"]
918
919              if any(c.islower() for c in seq):
920               task.md_respa=False
921               task.damino=True
922
923              box1=dock_box(task.myfile1)
924              if task.myfile2:
925               box2=dock_box(task.myfile2)
926              else:
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
931
932              task.save()
933              return redirect('addmlist',task_id=task.id)
934
935     else:
936         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
937         form = TaskForm_dock_a(initial=data)
938     basic_adv=False
939     p_type='docking - advanced options'
940     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
941
942
943
944 @login_required
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)
949         if form.is_valid():
950              task.remd_multi_t=form.cleaned_data["temperatures"]
951              task.remd_multi_m=form.cleaned_data["multiplexing"]             
952              task.ready=True
953              
954              task.save()
955              if is_lazy_user(request.user):
956               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
957              else:
958               return redirect('/')
959     else:
960       if task.example == 'casp12':
961         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
962         '["2", "2", "2", "2", "2", "2", "2", "2"]',
963         'temperatures':
964         '["270", "280", "290", "300", "310", "320", "330", "340"]'
965         }
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"]',
969         'temperatures':
970         '["270", "280", "290", "300", "310", "320", "330", "345"]'
971         }
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"]',
975         'temperatures':
976         '["270", "280", "290", "300", "310", "320", "330", "345"]'
977         }
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"]',
981         'temperatures':
982         '["250", "260", "270", "280", "290", "300", "315", "330"]'
983         }
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"]',
987         'temperatures':
988         '["270", "280", "290", "300", "310", "320", "330", "345"]'
989         }
990       else: 
991         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
992         '["1", "1", "1", "1", "1", "1", "1", "1"]',
993         'temperatures':
994         '["250", "260", "270", "280", "290", "300", "315", "330"]'
995         }
996       
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})
1000
1001 @login_required
1002 def details(request,task_id):
1003     task = get_object_or_404(Task, id=task_id)
1004     try:
1005      remd_models=json.loads(task.remd_models)
1006     except:
1007      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)})
1014
1015
1016 def details1(request,user_id,task_id):
1017     task = get_object_or_404(Task, id=task_id)
1018     try:
1019      remd_models=json.loads(task.remd_models)
1020     except:
1021      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)})
1028
1029
1030 @login_required
1031 def delete(request, task_id):
1032     Task.objects.get(id=task_id).delete()
1033     return redirect('/')
1034     
1035 @login_required
1036 def restart(request, task_id):
1037     task = get_object_or_404(Task, id=task_id)
1038     restart0(task)
1039     return redirect('/')
1040    
1041 def add_restart_inp():
1042     with open('file.inp','r') as f1, open ('file.inp.tmp','w') as f2:
1043         for line in f1:
1044           if 'reset_vel=' in line:
1045             f2.write('{:79}'.format('restart'+line[7:]))
1046           else:
1047             f2.write(line)
1048     os.remove('file.inp')
1049     os.rename('file.inp.tmp','file.inp')
1050     return 
1051     
1052 def restart0(task):    
1053     if os.path.isfile(task.jobdirname+'/finished'):    
1054       os.remove(task.jobdirname+'/finished')
1055     task.running =1
1056     task.done=False
1057     task.md_total_steps = task.md_total_steps+task.md_nstep
1058     task.save()
1059     if task.type == 'md':
1060       os.chdir(task.jobdirname)
1061       add_restart_inp()
1062       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
1063       os.chdir('..')
1064     elif task.type == 'remd' or task.type == 'dock':
1065       os.chdir(task.jobdirname)
1066       add_restart_inp()
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:
1070         for line in f1:
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:
1077                 isampl=1
1078             else:
1079                 isampl=int(task.md_total_steps/task.md_ntwx*nreplicas/8000)
1080             f2.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
1081           else:
1082             f2.write(line)
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:
1087           for line in f1:
1088             if 'generator_v13' in line:
1089               f2.write('#'+line)
1090             else:
1091               f2.write(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)            
1095       os.chdir('..')
1096     return
1097
1098 def restart1(request, user_id, task_id):
1099     task = get_object_or_404(Task, id=task_id)
1100     user = task.owner
1101     restart0(task)
1102     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1103     
1104
1105 def refresh_done1(request, task_id):
1106     task = get_object_or_404(Task, id=task_id)
1107     user = task.owner
1108     refresh_done0(task)
1109
1110     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1111     njob=0
1112     nq=0
1113     for line in proc.stdout:
1114       if 'piasek4' in line:
1115         if line.split()[1]=='test_server':
1116           njob+=1
1117           if line.split()[-2]=='Q':
1118             nq+=1
1119     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1120
1121     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1122
1123
1124 @login_required
1125 def refresh_done(request):
1126     user = request.user
1127     tasks = Task.objects.filter(owner=user).order_by('-created_date')
1128     tasks_count = Task.objects.filter(owner=user).count()
1129     alldone = 1
1130     for task in tasks:
1131       refresh_done0(task)
1132       if not task.done:
1133          alldone=0
1134
1135     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1136     njob=0
1137     nq=0
1138     for line in proc.stdout:
1139       if 'piasek4' in line:
1140         if line.split()[1]=='test_server':
1141           njob+=1
1142           if line.split()[-2]=='Q':
1143             nq+=1
1144     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1145
1146     if is_lazy_user(request.user):
1147      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1148     else:
1149      return render(request, "index.html", {
1150                 'tasks': tasks ,
1151                 'variable' : variable,
1152                 'alldone': alldone,
1153                 'tasks_count':tasks_count
1154                         })
1155
1156       
1157 def refresh_done0(task):
1158       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
1159          task.done=True
1160
1161          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1162
1163            if task.type=='min' or task.type=='md':
1164              text=""
1165              for line in f:
1166                if 'ETOT' in line:
1167                   task.etot=line.split()[1]
1168
1169                if 'RMS deviation' in line:
1170                   text=text+line
1171                   i=1
1172                   for line1 in f:
1173                      text=text+line1
1174                      i+=1
1175                      if i>6:
1176                        break
1177                if 'Total wall' in line:
1178                   text=text+line
1179                   
1180            elif task.type=='remd' or task.type=='dock':
1181              j=0
1182              text="Acceptance for replica exchanges and number of exchange attempts\n"
1183              for line in f:
1184                         
1185                if 'ACC' in line:
1186                     j+=1
1187                     text=text+' '.join(line.split()[2:])+"\n"
1188                     if j==task.remd_nrep:
1189                        j=1
1190                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
1191
1192                if 'Total wall' in line:
1193                   text=text+line
1194                        
1195          task.results_text=text
1196
1197
1198          remd_models=[]
1199          if task.md_pdbref and task.type=='remd' or task.type=='dock' and task.md_seq2 == '':
1200          
1201           for i in range(1,task.remd_cluster_n+1):
1202            try:
1203             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_'+str(i).zfill(4)+'.pdb', 'r') as f:
1204                  line=f.readline()
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:
1210                text=''
1211                for line in 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]
1218                     
1219                remd_models[i-1]=remd_models[i-1]+text
1220           
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:
1224                text=''
1225                for line in f:
1226                  if 'Fnat' in line:
1227                    text=' Fnat='+line.split()[1]
1228                  if 'iRMS' in line:
1229                    text=text+' iRMS='+line.split()[1]
1230                  if 'LRMS' in line:
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]
1238
1239                remd_models[i-1]=remd_models[i-1]+text
1240 #               logger.warning("models %d %s" % (i,remd_models))
1241
1242          if task.type=='remd' or task.type=='dock':  
1243           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
1244
1245            for line in f:
1246              if 'sumprob' in line:
1247                 i=0
1248                 for line1 in f:
1249                   i+=1
1250                   if i>task.remd_cluster_n:
1251                        break
1252                   try:
1253                     remd_models[i-1]=remd_models[i-1]+' Cluster'+str(i)+' probability= '+line1.split()[-2]
1254                   except:
1255                     if len(line1.split())==4:
1256                      remd_models.append(' Cluster'+str(i)+' probability= '+line1.split()[-2])
1257                      
1258          task.remd_models=json.dumps(remd_models)
1259 #         logger.warning("models%s" % task.remd_models)
1260          task.save()
1261       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
1262          if (task.type=='min'):
1263            task.running =1
1264            with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1265               line=''
1266               for line in f:
1267                 pass
1268               if line != '':
1269                 last = line.split()[0]
1270               else:
1271                 last = 0
1272            try:
1273               task.running=int(1+int(last)*100.0/task.min_maxmin)
1274            except:
1275               pass
1276            if task.running>100:
1277               task.running=100
1278          else:
1279            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
1280               line=''
1281               for line in f:
1282                 pass
1283               if line != '':
1284                 last = line.split()[0]
1285               else:
1286                 last = 0
1287            task.running=int(1+int(last)*100.0/task.md_nstep)
1288            if task.running>100:
1289              task.running=100
1290          task.save()
1291
1292     
1293       return  
1294
1295 @login_required
1296 def zip_all_files(request, task_id):
1297     import os, zipfile
1298     from django.http import HttpResponse
1299     from wsgiref.util import FileWrapper
1300     from django.core.files.temp import NamedTemporaryFile
1301
1302     task = get_object_or_404(Task, id=task_id)
1303
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)
1309     archive.close()
1310     temp.seek(0)
1311     wrapper = FileWrapper(temp)
1312     response = HttpResponse(wrapper, content_type='application/zip')
1313     response['Content-Disposition'] = 'attachment; filename=all.zip'
1314     return response