7a541dc12487ea465bf06a64f1fda173c09ab513
[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':
973         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
974         '["1", "1", "1", "1", "1", "1", "1", "1"]',
975         'temperatures':
976         '["270", "280", "290", "300", "310", "320", "330", "345"]'
977         }
978       else: 
979         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
980         '["1", "1", "1", "1", "1", "1", "1", "1"]',
981         'temperatures':
982         '["250", "260", "270", "280", "290", "300", "315", "330"]'
983         }
984       
985       form = TaskForm_list(task.remd_nrep,initial=data)
986     p_type='replica exchange molecular dynamics - advanced options'
987     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
988
989 @login_required
990 def details(request,task_id):
991     task = get_object_or_404(Task, id=task_id)
992     try:
993      remd_models=json.loads(task.remd_models)
994     except:
995      remd_models=[]
996      remd_models.append(task.remd_model1)
997      remd_models.append(task.remd_model2)
998      remd_models.append(task.remd_model3)
999      remd_models.append(task.remd_model4)
1000      remd_models.append(task.remd_model5)
1001     return render(request, "details.html",{'task':task,'remd_models':remd_models,'range':range(1,task.remd_cluster_n+1)})
1002
1003
1004 def details1(request,user_id,task_id):
1005     task = get_object_or_404(Task, id=task_id)
1006     try:
1007      remd_models=json.loads(task.remd_models)
1008     except:
1009      remd_models=[]
1010      remd_models.append(task.remd_model1)
1011      remd_models.append(task.remd_model2)
1012      remd_models.append(task.remd_model3)
1013      remd_models.append(task.remd_model4)
1014      remd_models.append(task.remd_model5)
1015     return render(request, "details1.html",{'task':task,'remd_models':remd_models,'range':range(1,task.remd_cluster_n+1)})
1016
1017
1018 @login_required
1019 def delete(request, task_id):
1020     Task.objects.get(id=task_id).delete()
1021     return redirect('/')
1022     
1023 @login_required
1024 def restart(request, task_id):
1025     task = get_object_or_404(Task, id=task_id)
1026     restart0(task)
1027     return redirect('/')
1028    
1029 def add_restart_inp():
1030     with open('file.inp','r') as f1, open ('file.inp.tmp','w') as f2:
1031         for line in f1:
1032           if 'reset_vel=' in line:
1033             f2.write('{:79}'.format('restart'+line[7:]))
1034           else:
1035             f2.write(line)
1036     os.remove('file.inp')
1037     os.rename('file.inp.tmp','file.inp')
1038     return 
1039     
1040 def restart0(task):    
1041     if os.path.isfile(task.jobdirname+'/finished'):    
1042       os.remove(task.jobdirname+'/finished')
1043     task.running =1
1044     task.done=False
1045     task.md_total_steps = task.md_total_steps+task.md_nstep
1046     task.save()
1047     if task.type == 'md':
1048       os.chdir(task.jobdirname)
1049       add_restart_inp()
1050       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
1051       os.chdir('..')
1052     elif task.type == 'remd' or task.type == 'dock':
1053       os.chdir(task.jobdirname)
1054       add_restart_inp()
1055       tmp1=json.loads(task.remd_multi_m)
1056       nreplicas=sum(map(int, tmp1))
1057       with open('file_wham.inp','r') as f1, open ('file_wham.tmp','w') as f2:
1058         for line in f1:
1059           if 'rec_end=' in line:
1060             rec=task.md_total_steps/task.md_ntwx
1061             f2.write('nfile_cx=1 rec_start='+str(rec/10)
1062                +' rec_end='+str(rec)+' totraj='+str(nreplicas)+'\n')
1063           elif 'isampl=' in line:
1064             if task.md_total_steps/task.md_ntwx*nreplicas<=8000:
1065                 isampl=1
1066             else:
1067                 isampl=int(task.md_total_steps/task.md_ntwx*nreplicas/8000)
1068             f2.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
1069           else:
1070             f2.write(line)
1071       os.remove('file_wham.inp')
1072       os.rename('file_wham.tmp','file_wham.inp')
1073       if task.type == 'dock':
1074         with open('pbs8.csh','r') as f1, open ('pbs8.tmp','w') as f2:
1075           for line in f1:
1076             if 'generator_v13' in line:
1077               f2.write('#'+line)
1078             else:
1079               f2.write(line)
1080         os.remove('pbs8.csh')
1081         os.rename('pbs8.tmp','pbs8.csh')
1082       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
1083       os.chdir('..')
1084     return
1085
1086 def restart1(request, user_id, task_id):
1087     task = get_object_or_404(Task, id=task_id)
1088     user = task.owner
1089     restart0(task)
1090     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1091     
1092
1093 def refresh_done1(request, task_id):
1094     task = get_object_or_404(Task, id=task_id)
1095     user = task.owner
1096     refresh_done0(task)
1097
1098     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1099     njob=0
1100     nq=0
1101     for line in proc.stdout:
1102       if 'piasek4' in line:
1103         if line.split()[1]=='test_server':
1104           njob+=1
1105           if line.split()[-2]=='Q':
1106             nq+=1
1107     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1108
1109     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1110
1111
1112 @login_required
1113 def refresh_done(request):
1114     user = request.user
1115     tasks = Task.objects.filter(owner=user).order_by('-created_date')
1116     tasks_count = Task.objects.filter(owner=user).count()
1117     alldone = 1
1118     for task in tasks:
1119       refresh_done0(task)
1120       if not task.done:
1121          alldone=0
1122
1123     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1124     njob=0
1125     nq=0
1126     for line in proc.stdout:
1127       if 'piasek4' in line:
1128         if line.split()[1]=='test_server':
1129           njob+=1
1130           if line.split()[-2]=='Q':
1131             nq+=1
1132     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1133
1134     if is_lazy_user(request.user):
1135      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1136     else:
1137      return render(request, "index.html", {
1138                 'tasks': tasks ,
1139                 'variable' : variable,
1140                 'alldone': alldone,
1141                 'tasks_count':tasks_count
1142                         })
1143
1144       
1145 def refresh_done0(task):
1146       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
1147          task.done=True
1148
1149          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1150
1151            if task.type=='min' or task.type=='md':
1152              text=""
1153              for line in f:
1154                if 'ETOT' in line:
1155                   task.etot=line.split()[1]
1156
1157                if 'RMS deviation' in line:
1158                   text=text+line
1159                   i=1
1160                   for line1 in f:
1161                      text=text+line1
1162                      i+=1
1163                      if i>6:
1164                        break
1165                if 'Total wall' in line:
1166                   text=text+line
1167                   
1168            elif task.type=='remd' or task.type=='dock':
1169              j=0
1170              text="Acceptance for replica exchanges and number of exchange attempts\n"
1171              for line in f:
1172                         
1173                if 'ACC' in line:
1174                     j+=1
1175                     text=text+' '.join(line.split()[2:])+"\n"
1176                     if j==task.remd_nrep:
1177                        j=1
1178                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
1179
1180                if 'Total wall' in line:
1181                   text=text+line
1182                        
1183          task.results_text=text
1184
1185
1186          remd_models=[]
1187          if task.md_pdbref and task.type=='remd' or task.type=='dock' and task.md_seq2 == '':
1188          
1189           for i in range(1,task.remd_cluster_n+1):
1190            try:
1191             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_'+str(i).zfill(4)+'.pdb', 'r') as f:
1192                  line=f.readline()
1193                  remd_models.append('Cluster'+str(i)+' '+' '.join(line.split()[-3:]))
1194            except EnvironmentError:
1195             print 'file_wham_T*pdb open error'
1196           for i in range(1,task.remd_cluster_n+1):
1197             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
1198                text=''
1199                for line in f:
1200                  if 'RMSD of  the common residues=' in line:
1201                    text=' RMSD='+line.split()[5]
1202                  if 'TM-score    =' in line:
1203                    text=text+' TMscore='+line.split()[2]
1204                  if 'GDT-TS-score=' in line:
1205                    text=text+' GDT_TS='+line.split()[1]
1206                     
1207                remd_models[i-1]=remd_models[i-1]+text
1208           
1209           if task.type=='dock':
1210            for i in range(1,task.remd_cluster_n+1):
1211             with open(task.jobdirname+'/dockq_'+str(i)+'.out', 'r') as f:
1212                text=''
1213                for line in f:
1214                  if 'Fnat' in line:
1215                    text=' Fnat='+line.split()[1]
1216                  if 'iRMS' in line:
1217                    text=text+' iRMS='+line.split()[1]
1218                  if 'LRMS' in line:
1219                    text=text+' LRMS='+line.split()[1]
1220                  if 'CAPRI' in line and not 'DockQ_CAPRI' in line:
1221                    text=text+' CAPRI='+line.split()[1]
1222                  if 'DockQ_CAPRI' in line:
1223                    text=text+' DockQ_CAPRI= '+line.split()[1]
1224                  if 'DockQ ' in line:
1225                    text=text+' DockQ='+line.split()[1]
1226
1227                remd_models[i-1]=remd_models[i-1]+text
1228 #               logger.warning("models %d %s" % (i,remd_models))
1229
1230          if task.type=='remd' or task.type=='dock':  
1231           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
1232
1233            for line in f:
1234              if 'sumprob' in line:
1235                 i=0
1236                 for line1 in f:
1237                   i+=1
1238                   if i>task.remd_cluster_n:
1239                        break
1240                   try:
1241                     remd_models[i-1]=remd_models[i-1]+' Cluster'+str(i)+' probability= '+line1.split()[-2]
1242                   except:
1243                     if len(line1.split())==4:
1244                      remd_models.append(' Cluster'+str(i)+' probability= '+line1.split()[-2])
1245                      
1246          task.remd_models=json.dumps(remd_models)
1247 #         logger.warning("models%s" % task.remd_models)
1248          task.save()
1249       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
1250          if (task.type=='min'):
1251            task.running =1
1252            with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1253               line=''
1254               for line in f:
1255                 pass
1256               if line != '':
1257                 last = line.split()[0]
1258               else:
1259                 last = 0
1260            try:
1261               task.running=int(1+int(last)*100.0/task.min_maxmin)
1262            except:
1263               pass
1264            if task.running>100:
1265               task.running=100
1266          else:
1267            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
1268               line=''
1269               for line in f:
1270                 pass
1271               if line != '':
1272                 last = line.split()[0]
1273               else:
1274                 last = 0
1275            task.running=int(1+int(last)*100.0/task.md_nstep)
1276            if task.running>100:
1277              task.running=100
1278          task.save()
1279
1280     
1281       return  
1282
1283 @login_required
1284 def zip_all_files(request, task_id):
1285     import os, zipfile
1286     from django.http import HttpResponse
1287     from wsgiref.util import FileWrapper
1288     from django.core.files.temp import NamedTemporaryFile
1289
1290     task = get_object_or_404(Task, id=task_id)
1291
1292     temp=NamedTemporaryFile()
1293     archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
1294     for (dirpath, dirnames, filenames) in os.walk(task.jobdirname):
1295        for file1 in filenames:
1296          archive.write(dirpath+"/"+file1,file1)
1297     archive.close()
1298     temp.seek(0)
1299     wrapper = FileWrapper(temp)
1300     response = HttpResponse(wrapper, content_type='application/zip')
1301     response['Content-Disposition'] = 'attachment; filename=all.zip'
1302     return response