11363558ebf8717b6bc580e104680f4635d0d481
[django_unres.git] / django_simple / todo / views.py
1 from django.contrib.auth.decorators import login_required
2 from django.shortcuts import redirect, render, get_object_or_404
3 from django.contrib.auth.models import User
4 from .forms import *
5 from .models import Task
6 import datetime
7 import os
8 import subprocess
9 import json
10 from lazysignup.decorators import allow_lazy_user
11 from lazysignup.utils import is_lazy_user
12 import random
13
14 res_codes = [
15                 # 20 canonical amino acids
16                 ('CYS', 'C'), ('ASP', 'D'), ('SER', 'S'), ('GLN', 'Q'),
17                 ('LYS', 'K'), ('ILE', 'I'), ('PRO', 'P'), ('THR', 'T'),
18                 ('PHE', 'F'), ('ASN', 'N'), ('GLY', 'G'), ('HIS', 'H'),
19                 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
20                 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
21                 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
22                 ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
23                 ('CYX', 'C'),
24                 ('DCY', 'c'), ('DAS', 'd'), ('DSN', 's'), ('DGN', 'q'),
25                 ('DLY', 'k'), ('DIL', 'i'), ('DPR', 'p'), ('DTH', 't'),
26                 ('DPN', 'f'), ('DSG', 'n'), ('DHI', 'h'),
27                 ('DLE', 'l'), ('DAR', 'r'), ('DTR', 'w'), ('DAL', 'a'),
28                 ('DVA', 'v'), ('DGL', 'e'), ('DTY', 'y'), ('MED', 'm'),                
29                ]
30
31 three_to_one = dict(res_codes)
32
33 def dock_box(file):
34    import math
35    coord = list()
36    for line in file:
37             if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
38               x=float(line[30:38])
39               y=float(line[38:46])
40               z=float(line[46:54])
41               coord.append([x, y, z])
42             if line[0:3] == 'END':
43               break
44    maxd=0
45    l=len(coord)
46    for i in xrange(l):
47       for j in xrange(i+1,l):
48         p1=coord[i]
49         p2=coord[j]
50         d=(p1[0]-p2[0])**2 + (p1[1]-p2[1])**2 + (p1[2]-p2[2])**2
51         if d > maxd:
52           maxd=d
53    return math.sqrt(maxd)
54
55
56 def load_pdbid(pdbid,dirname,filename='plik.pdb'):
57     if (not os.path.isdir(dirname)):
58        os.mkdir(dirname)
59     if len(pdbid)==4:
60        file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
61                      dirname+'/'+filename)     
62     else:
63        chain=pdbid[5]
64        pdbid=pdbid[:4]
65        pdb_tmp=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
66        with open(dirname+'/'+filename, 'w') as outfile:
67         for line in pdb_tmp:
68           if line[0:6] == 'SSBOND' and line[15] == chain and line[29] == chain:
69             outfile.write(line)
70           if line[0:6] == 'ATOM  ' and line[21] == chain:
71             outfile.write(line)
72           if line[0:6] == 'ENDMDL':
73             break
74        pdb_tmp.close()
75        file=dirname+'/'+filename
76        
77     return(file)
78
79
80 def seq_2d_from_pdb(seq_2d,seq):
81     if seq_2d =='':
82       return(seq_2d)
83     seq_2d=seq_2d.replace('C', '-')
84     seq_2d_tmp=''
85     ii=0
86     for i in range(0,len(seq)):
87       if seq[i]=='X':
88          seq_2d_tmp=seq_2d_tmp+'-'
89       else:
90          if len(seq_2d)>ii:
91             seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
92             ii+=1
93     tmp=''
94     for i in range(0,len(seq_2d_tmp),40):
95       tmp=tmp+seq_2d_tmp[i:i+40]+" "
96     return(tmp)
97
98 def seq_2d_add_x(seq_2d,seq,seq_form):
99     if seq_2d =='':
100       return(seq_2d)
101     seq_2d=seq_2d[:len(seq_form)]
102     seq_2d=seq_2d.replace('C', '-')
103     if seq_form[0] !='X' and seq[0] == 'X':
104       seq_2d='-'+seq_2d
105     if seq_form[-1] !='X' and seq[-1] == 'X':
106       seq_2d=seq_2d+'-'
107     seq_2d=seq_2d[:len(seq)]
108     tmp=''
109     for i in range(0,len(seq_2d),40):
110       tmp=tmp+seq_2d[i:i+40]+" "
111     return(tmp)
112
113 def seq_add_x(sequence):
114     if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X':
115         sequence='X'+sequence
116     if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X':
117         sequence=sequence+'X'
118     set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym'
119     sequence = ''.join([c for c in sequence if c in set])
120
121     return(sequence)    
122
123 def from_pdb(file):
124     sequence = []
125     ssbond = []
126     ssbond_ch = []
127     ires = []
128     chain_start = {}
129     chain_end = {}
130     unres_shift = {}
131     chain_sorted=[]
132     newchain = True
133     i=''
134     for line in file:
135             if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
136               aa = three_to_one.get(line[17:20])
137               i = int(line[22:26])
138               ch = line[21:22]
139               if newchain or i!=ires[-1]:
140                 sequence.append(aa)
141                 ires.append(i)
142                 if newchain:
143                  chain_start[ch]=i
144                  chain_sorted.extend(ch)
145                  newchain = False
146             if line[0:3] == 'TER' and i != '':
147               sequence.append('XX')
148               chain_end[ch]=i
149               newchain = True
150             if line[0:6] == 'SSBOND':
151               b=[]
152               b.append(int(line[17:21]))
153               b.append(int(line[31:35]))
154               ssbond.append(b)
155               c = []
156               c.append((line[15:16]))
157               c.append((line[29:30]))
158               ssbond_ch.append(c)                                                                      
159             if line[0:3] == 'END':
160               break
161     if not sequence[-1] == 'XX':
162             chain_end[ch]=i
163     while sequence[-1] == 'XX':
164             del sequence[-1]
165     if sequence[0] != 'G':
166             sequence.insert(0,'X')
167             ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
168     if sequence[-1] != 'G':
169             sequence.append('X')
170     seq=''.join(sequence)
171 #    if ires[0] != 1:
172 #            ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
173     i=0
174     for c in chain_sorted:
175       unres_shift[c]=i+chain_start[c]
176       i=i-(chain_end[c]-chain_start[c])-3
177     ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]     
178
179     return seq,json.dumps(ssbond)
180
181
182 @login_required
183 def index(request):
184     user = request.user
185     tasks = Task.objects.filter(owner=user).order_by('-created_date')
186     variable = ''
187     tasks_count = Task.objects.filter(owner=user).count()
188     return render(request, "index.html", {
189             'tasks': tasks, 'alldone': 0, 'tasks_count':tasks_count
190         })
191
192 @login_required
193 def add(request):
194     if request.method == 'POST':
195         form = TaskForm(request.POST)
196         if form.is_valid():
197             name = form.cleaned_data["name"]
198             user = request.user
199             task = Task(name=name,owner=user,ready=False)
200             task.save()
201             return redirect('add_min',task_id=task.id)
202     return redirect('/')
203
204 @login_required
205 def add_min(request,task_id):
206     task = get_object_or_404(Task, id=task_id)
207     if request.method == 'POST':
208      if '_example' in request.POST:
209         data= {'name':task.name,'pdbid':'1BDD'}
210         form = TaskForm_min(initial=data)     
211      else:
212         form = TaskForm_min(request.POST,request.FILES)
213         if form.is_valid():
214              task.name=form.cleaned_data["name"]
215              task.type="min"
216              pdbid=form.cleaned_data["pdbid"]
217
218              basename = str(task.owner)
219              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
220              task.jobdirname = "_".join([basename, suffix])
221
222              if pdbid:
223               task.myfile1=load_pdbid(pdbid,task.jobdirname)
224               task.pdbcode=pdbid
225              else:
226               task.myfile1=form.cleaned_data["file1"]
227
228              seq,task.ssbond=from_pdb(task.myfile1)
229              task.md_seq=""
230              for i in range(0,len(seq),40):
231                     task.md_seq=task.md_seq+seq[i:i+40]+" "
232
233              task.ready=True
234              
235              task.save()
236              if is_lazy_user(request.user):
237               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
238              else:
239               return redirect('/')
240     else:
241         data= {'name':task.name}
242         form = TaskForm_min(initial=data)
243     p_type='minimization'
244     basic_adv=True    
245     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
246
247 @login_required
248 def add_min_a(request,task_id):
249     task = get_object_or_404(Task, id=task_id)
250     if request.method == 'POST':
251      if '_example' in request.POST:
252         data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
253         form = TaskForm_min_a(initial=data)     
254      else:
255         form = TaskForm_min_a(request.POST,request.FILES)
256         if form.is_valid():
257              task.name=form.cleaned_data["name"]
258              task.type="min"
259 #             task.min_choice=form.cleaned_data["min_choice"]
260              task.min_overlap=form.cleaned_data["min_overlap"]
261              task.min_searchsc=form.cleaned_data["min_searchsc"]
262              task.min_maxmin=form.cleaned_data["min_maxmin"]
263              task.min_maxfun=form.cleaned_data["min_maxfun"]
264              task.min_pdbout=form.cleaned_data["min_pdbout"]
265
266              basename = str(task.owner)
267              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
268              task.jobdirname = "_".join([basename, suffix])
269              
270              pdbid=form.cleaned_data["pdbid"]
271              if pdbid:
272               task.myfile1=load_pdbid(pdbid,task.jobdirname)
273               task.pdbcode=pdbid
274              else:
275               task.myfile1=form.cleaned_data["file1"]
276
277              task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
278              task.unres_ff=form.cleaned_data["unres_ff"]
279              task.boxx=form.cleaned_data["boxx"]
280              task.boxy=form.cleaned_data["boxy"]             
281              task.boxz=form.cleaned_data["boxz"]             
282
283              seq,task.ssbond=from_pdb(task.myfile1)
284              task.md_seq=""
285              for i in range(0,len(seq),40):
286                 task.md_seq=task.md_seq+seq[i:i+40]+" "
287                                                            
288              task.ready=True
289              
290              task.save()
291              if is_lazy_user(request.user):
292               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
293              else:
294               return redirect('/')
295     else:
296         data= {'name':task.name}
297         form = TaskForm_min_a(initial=data)
298     basic_adv=False
299     p_type='minimization - advanced options'
300     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
301
302 @login_required
303 def add_md(request,task_id):
304     task = get_object_or_404(Task, id=task_id)
305     if request.method == 'POST':
306      if '_example' in request.POST:
307         data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
308         'md_pdbref':True,'md_temp':200,'md_seed':-39912345}
309         form = TaskForm_md(initial=data)     
310      else:
311         form = TaskForm_md(request.POST,request.FILES)
312         if form.is_valid():
313              task.name=form.cleaned_data["name"]
314              task.type="md"
315              task.md_seed=form.cleaned_data["md_seed"]
316              task.md_start=form.cleaned_data["md_start"]
317              task.md_temp=form.cleaned_data["md_temp"]
318              task.md_nstep=form.cleaned_data["md_nstep"]
319              task.md_total_steps=task.md_nstep
320              if task.md_nstep<250000:
321                  task.md_ntwx=100
322
323              basename = str(task.owner)
324              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
325              task.jobdirname = "_".join([basename, suffix])
326
327              pdbid=form.cleaned_data["pdbid"]
328              if pdbid:
329               task.myfile1=load_pdbid(pdbid,task.jobdirname)
330               task.pdbcode=pdbid
331              else:
332               task.myfile1=form.cleaned_data["file1"]
333              task.md_pdbref=form.cleaned_data["md_pdbref"]             
334
335              task.md_seq=""
336              if task.md_start == "pdbstart" or task.md_pdbref:
337                seq,task.ssbond=from_pdb(task.myfile1)
338              else:
339                seq=seq_add_x(form.cleaned_data["md_seq"])
340                        
341              for i in range(0,len(seq),40):
342                 task.md_seq=task.md_seq+seq[i:i+40]+" "
343              
344              if task.md_start != "pdbstart":
345                 task.ssbond=''
346
347              if any(c.islower() for c in seq):
348               task.md_respa=False
349               task.damino=True
350
351              task.ready=True
352              
353              task.save()
354              if is_lazy_user(request.user):
355               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
356              else:
357               return redirect('/')
358     else:
359         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
360         form = TaskForm_md(initial=data)
361     basic_adv=True
362     p_type='molecular dynamics'
363     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
364
365 @login_required
366 def add_md_a(request,task_id):
367     task = get_object_or_404(Task, id=task_id)
368     if request.method == 'POST':
369      if '_example' in request.POST:
370         data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
371          'md_pdbref':True,'md_mdpdb':True,'md_seed':-39912345}
372         form = TaskForm_md_a(initial=data)     
373      else:
374         form = TaskForm_md_a(request.POST,request.FILES)
375         if form.is_valid():
376              task.name=form.cleaned_data["name"]
377              task.type="md"
378
379              basename = str(task.owner)
380              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
381              task.jobdirname = "_".join([basename, suffix])
382
383              pdbid=form.cleaned_data["pdbid"]
384              if pdbid:
385               task.myfile1=load_pdbid(pdbid,task.jobdirname)
386               task.pdbcode=pdbid
387              else:
388               task.myfile1=form.cleaned_data["file1"]
389              task.md_start=form.cleaned_data["md_start"]
390              task.md_pdbref=form.cleaned_data["md_pdbref"]             
391
392              task.md_seq=""
393              if task.md_start == "pdbstart" or task.md_pdbref:
394                seq,task.ssbond=from_pdb(task.myfile1)
395                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
396              else:
397                seq=seq_add_x(form.cleaned_data["md_seq"])
398                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
399
400              for i in range(0,len(seq),40):
401                 task.md_seq=task.md_seq+seq[i:i+40]+" "
402
403              if task.md_start != "pdbstart":
404                 task.ssbond=''
405
406              task.md_seed=form.cleaned_data["md_seed"]
407
408              task.md_temp=form.cleaned_data["md_temp"]
409              task.md_nstep=form.cleaned_data["md_nstep"]
410              task.md_total_steps=task.md_nstep
411              task.md_ntwe=form.cleaned_data["md_ntwe"]
412              task.md_ntwx=form.cleaned_data["md_ntwx"]
413              task.md_dt=form.cleaned_data["md_dt"]
414              task.md_lang=form.cleaned_data["md_lang"]
415              task.md_tau=form.cleaned_data["md_tau"]
416              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
417              task.md_mdpdb=form.cleaned_data["md_mdpdb"]
418              task.unres_ff=form.cleaned_data["unres_ff"]
419              task.md_respa=form.cleaned_data["md_respa"]             
420              if any(c.islower() for c in seq):
421               task.md_respa=False
422               task.damino=True
423              task.boxx=form.cleaned_data["boxx"]
424              task.boxy=form.cleaned_data["boxy"]             
425              task.boxz=form.cleaned_data["boxz"]             
426
427              
428              task.ready=True
429              
430              task.save()
431              if is_lazy_user(request.user):
432               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
433              else:
434               return redirect('/')
435     else:
436         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
437         form = TaskForm_md_a(initial=data)
438     basic_adv=False
439     p_type='molecular dynamics - advanced options'
440     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
441
442 @login_required
443 def add_remd(request,task_id):
444     task = get_object_or_404(Task, id=task_id)
445     if request.method == 'POST':
446      if '_example' in request.POST:
447         data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
448         form = TaskForm_remd(initial=data)     
449      else:
450         form = TaskForm_remd(request.POST,request.FILES)
451         if form.is_valid():
452              task.name=form.cleaned_data["name"]
453              task.type="remd"
454              task.md_start=form.cleaned_data["md_start"]
455
456              basename = str(task.owner)
457              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
458              task.jobdirname = "_".join([basename, suffix])
459
460              pdbid=form.cleaned_data["pdbid"]
461              if pdbid:
462               task.myfile1=load_pdbid(pdbid,task.jobdirname)
463               task.pdbcode=pdbid
464              else:
465               task.myfile1=form.cleaned_data["file1"]
466              task.md_pdbref=form.cleaned_data["md_pdbref"]
467              task.md_ntwx=task.remd_nstex 
468
469              task.md_seq=""
470              if task.md_start == "pdbstart" or task.md_pdbref:
471                seq,task.ssbond=from_pdb(task.myfile1)
472              else:
473                seq=seq_add_x(form.cleaned_data["md_seq"])
474              for i in range(0,len(seq),40):
475                 task.md_seq=task.md_seq+seq[i:i+40]+" "
476
477              if task.md_start != "pdbstart":
478                 task.ssbond=''
479
480              task.md_seed=form.cleaned_data["md_seed"]
481
482              task.md_nstep=form.cleaned_data["md_nstep"]
483              task.md_total_steps=task.md_nstep
484
485              if any(c.islower() for c in seq):
486               task.md_respa=False
487               task.damino=True
488
489
490              task.ready=True
491              
492              
493              task.save()
494              if is_lazy_user(request.user):
495               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
496              else:
497               return redirect('/')
498     else:
499         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
500         form = TaskForm_remd(initial=data)
501     basic_adv=True
502     p_type='replica exchange molecular dynamics'
503     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
504
505 @login_required
506 def add_remd_a(request,task_id):
507     from django.core.files.uploadedfile import UploadedFile
508     task = get_object_or_404(Task, id=task_id)
509     if request.method == 'POST':
510      if '_example' in request.POST:
511         data= {'name':task.name,'pdbid':'5G3Q:B','md_pdbref':True,
512          'md_nstep':2000000,'md_lang':'berendsen','unres_ff':'FF2','md_seed':-39912345,
513          'remd_cluter_temp':290,'md_2d':'--EEEEEEE------EEEEEE------EEEEEE------HHHHHHHHHHH---HHHHHHHHHHHHHHHHHHHHHHH---'}
514         form = TaskForm_remd_a(initial=data)    
515         task.example='casp12'
516         task.save() 
517      elif '_example_saxs' in request.POST:
518         data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
519          'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
520          'remd_cluter_temp':270, 
521          'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
522 """ 0.5     1.33868e-02
523  1.5     1.95880e-02
524  2.5     2.68896e-02
525  3.5     3.43737e-02
526  4.5     4.07099e-02
527  5.5     4.47875e-02
528  6.5     4.63486e-02
529  7.5     4.60514e-02
530  8.5     4.49130e-02
531  9.5     4.36744e-02
532 10.5     4.26085e-02
533 11.5     4.17464e-02
534 12.5     4.11217e-02
535 13.5     4.07835e-02
536 14.5     4.06776e-02
537 15.5     4.06060e-02
538 16.5     4.03241e-02
539 17.5     3.96655e-02
540 18.5     3.85756e-02
541 19.5     3.70537e-02
542 20.5     3.50982e-02
543 21.5     3.27236e-02
544 22.5     3.00046e-02
545 23.5     2.70643e-02
546 24.5     2.40044e-02
547 25.5     2.08595e-02
548 26.5     1.76342e-02
549 27.5     1.43802e-02
550 28.5     1.12281e-02
551 29.5     8.34574e-03
552 30.5     5.87354e-03
553 31.5     3.88732e-03
554 32.5     2.39755e-03
555 33.5     1.36323e-03
556 34.5     7.06686e-04
557 35.5     3.30592e-04
558 36.5     1.38359e-04"""}
559         form = TaskForm_remd_a(initial=data)     
560      elif '_example_saxs1' in request.POST:
561         data= {'name':task.name,'pdbid':'2KMS','md_pdbref':True,'md_start':'pdbstart',
562         'md_2d':'----EEEEEE-EEEEE-------EEEEEEEEE--EEEEEE-EEEE---EEEEEEEEE-----EEEEEEE-EEE-HHHHH-EEEE-EEEEEEEEE----EEEEEE---EEE-----',
563          'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
564          'remd_cluter_temp':280, 'min_maxfun':50,
565          'scal_rad':5.0,'wsaxs':1000.0,'saxs_data':
566 """0.7100E-00 0.2036E-03
567 0.1420E+01 0.4221E-03
568 0.2130E+01 0.6548E-03
569 0.2840E+01 0.9001E-03
570 0.3550E+01 0.1156E-02
571 0.4260E+01 0.1421E-02
572 0.4970E+01 0.1692E-02
573 0.5680E+01 0.1965E-02
574 0.6390E+01 0.2239E-02
575 0.7100E+01 0.2509E-02
576 0.7810E+01 0.2772E-02
577 0.8520E+01 0.3025E-02
578 0.9230E+01 0.3265E-02
579 0.9940E+01 0.3489E-02
580 0.1065E+02 0.3694E-02
581 0.1136E+02 0.3878E-02
582 0.1207E+02 0.4039E-02
583 0.1278E+02 0.4177E-02
584 0.1349E+02 0.4289E-02
585 0.1420E+02 0.4377E-02
586 0.1491E+02 0.4439E-02
587 0.1562E+02 0.4478E-02
588 0.1633E+02 0.4493E-02
589 0.1704E+02 0.4487E-02
590 0.1775E+02 0.4461E-02
591 0.1846E+02 0.4418E-02
592 0.1917E+02 0.4361E-02
593 0.1988E+02 0.4291E-02
594 0.2059E+02 0.4211E-02
595 0.2130E+02 0.4125E-02
596 0.2201E+02 0.4034E-02
597 0.2272E+02 0.3942E-02
598 0.2343E+02 0.3850E-02
599 0.2414E+02 0.3761E-02
600 0.2485E+02 0.3677E-02
601 0.2556E+02 0.3598E-02
602 0.2627E+02 0.3526E-02
603 0.2698E+02 0.3462E-02
604 0.2769E+02 0.3405E-02
605 0.2840E+02 0.3356E-02
606 0.2911E+02 0.3315E-02
607 0.2982E+02 0.3280E-02
608 0.3053E+02 0.3251E-02
609 0.3124E+02 0.3226E-02
610 0.3195E+02 0.3205E-02
611 0.3266E+02 0.3186E-02
612 0.3337E+02 0.3167E-02
613 0.3408E+02 0.3147E-02
614 0.3479E+02 0.3125E-02
615 0.3550E+02 0.3099E-02
616 0.3621E+02 0.3068E-02
617 0.3692E+02 0.3031E-02
618 0.3763E+02 0.2987E-02
619 0.3834E+02 0.2937E-02
620 0.3905E+02 0.2878E-02
621 0.3976E+02 0.2812E-02
622 0.4047E+02 0.2739E-02
623 0.4118E+02 0.2658E-02
624 0.4189E+02 0.2571E-02
625 0.4260E+02 0.2478E-02
626 0.4331E+02 0.2381E-02
627 0.4402E+02 0.2279E-02
628 0.4473E+02 0.2174E-02
629 0.4544E+02 0.2068E-02
630 0.4615E+02 0.1960E-02
631 0.4686E+02 0.1853E-02
632 0.4757E+02 0.1748E-02
633 0.4828E+02 0.1644E-02
634 0.4899E+02 0.1544E-02
635 0.4970E+02 0.1447E-02
636 0.5041E+02 0.1355E-02
637 0.5112E+02 0.1267E-02
638 0.5183E+02 0.1184E-02
639 0.5254E+02 0.1106E-02
640 0.5325E+02 0.1033E-02
641 0.5396E+02 0.9646E-03
642 0.5467E+02 0.9008E-03
643 0.5538E+02 0.8411E-03
644 0.5609E+02 0.7852E-03
645 0.5680E+02 0.7327E-03
646 0.5751E+02 0.6831E-03
647 0.5822E+02 0.6360E-03
648 0.5893E+02 0.5909E-03
649 0.5964E+02 0.5475E-03
650 0.6035E+02 0.5055E-03
651 0.6106E+02 0.4646E-03
652 0.6177E+02 0.4245E-03
653 0.6248E+02 0.3853E-03
654 0.6319E+02 0.3467E-03
655 0.6390E+02 0.3089E-03
656 0.6461E+02 0.2719E-03
657 0.6532E+02 0.2357E-03
658 0.6603E+02 0.2007E-03
659 0.6674E+02 0.1669E-03
660 0.6745E+02 0.1345E-03
661 0.6816E+02 0.1038E-03
662 0.6887E+02 0.7482E-04
663 0.6958E+02 0.4782E-04
664 0.7029E+02 0.2286E-04"""}
665         form = TaskForm_remd_a(initial=data)     
666      else:
667         form = TaskForm_remd_a(request.POST,request.FILES)
668         if form.is_valid():
669              task.name=form.cleaned_data["name"]
670              task.type="remd"
671
672              basename = str(task.owner)
673              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
674              task.jobdirname = "_".join([basename, suffix])
675
676              pdbid=form.cleaned_data["pdbid"]
677              if pdbid:
678               task.myfile1=load_pdbid(pdbid,task.jobdirname)
679               task.pdbcode=pdbid
680              else:
681               task.myfile1=form.cleaned_data["file1"]
682              task.md_start=form.cleaned_data["md_start"]  
683              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
684
685              task.md_seq=""
686              if task.md_start == "pdbstart" or task.md_pdbref:
687                seq,task.ssbond=from_pdb(task.myfile1)
688                task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
689              else:
690                seq=seq_add_x(form.cleaned_data["md_seq"])
691                task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])               
692
693              for i in range(0,len(seq),40):
694                 task.md_seq=task.md_seq+seq[i:i+40]+" "
695
696              if task.md_start != "pdbstart":
697                 task.ssbond=''
698
699              task.md_seed=form.cleaned_data["md_seed"]
700              task.md_nstep=form.cleaned_data["md_nstep"]
701              task.md_total_steps=task.md_nstep
702              task.md_dt=form.cleaned_data["md_dt"]
703              task.md_lang=form.cleaned_data["md_lang"]
704              task.md_tau=form.cleaned_data["md_tau"]
705              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
706              task.min_maxfun=form.cleaned_data["min_maxfun"]
707              task.remd_nrep=form.cleaned_data["remd_nrep"]
708              task.remd_nstex=form.cleaned_data["remd_nstex"]
709              task.md_ntwx=form.cleaned_data["md_ntwx"]             
710              task.md_ntwe=form.cleaned_data["md_ntwe"]
711              task.md_respa=form.cleaned_data["md_respa"]
712              if any(c.islower() for c in seq):
713               task.md_respa=False
714               task.damino=True
715              
716 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
717 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
718
719              task.boxx=form.cleaned_data["boxx"]
720              task.boxy=form.cleaned_data["boxy"]             
721              task.boxz=form.cleaned_data["boxz"]             
722
723              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
724              task.unres_ff=form.cleaned_data["unres_ff"]
725              
726              task.scal_rad = form.cleaned_data["scal_rad"]
727              task.saxs_data = form.cleaned_data["saxs_data"]
728              task.wsaxs = form.cleaned_data["wsaxs"]
729              
730              task.save()
731              return redirect('addmlist',task_id=task.id)
732     else:
733         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
734         form = TaskForm_remd_a(initial=data)
735     basic_adv=False
736     p_type='replica exchange molecular dynamics - advanced options'
737     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
738
739 @login_required
740 def add_dock(request,task_id):
741     task = get_object_or_404(Task, id=task_id)
742     if request.method == 'POST':
743      if '_example' in request.POST:
744         data= {'name':task.name,'pdbid':'1BON:A','pdbid2':'1BON:B','md_seed':-12396738,'md_nstep':500000}
745         form = TaskForm_dock(initial=data)     
746      else:
747         form = TaskForm_dock(request.POST,request.FILES)
748         if form.is_valid():
749              task.name=form.cleaned_data["name"]
750              task.type="dock"
751
752              basename = str(task.owner)
753              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
754              task.jobdirname = "_".join([basename, suffix])
755
756              pdbid=form.cleaned_data["pdbid"]
757              if pdbid:
758               task.myfile1=load_pdbid(pdbid,task.jobdirname)
759               task.pdbcode=pdbid
760              else:
761               task.myfile1=form.cleaned_data["file1"]
762
763              pdbid2=form.cleaned_data["pdbid2"]
764              if pdbid2:
765               task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
766               task.pdbcode2=pdbid2
767               seq2,ssbond2=from_pdb(task.myfile2)
768              else:
769               task.myfile2=form.cleaned_data["file2"]
770               if not task.myfile2:
771                 seq2=seq_add_x(form.cleaned_data["md_seq"])
772                 task.md_seq2=seq2
773               else:
774                 seq2,ssbond2=from_pdb(task.myfile2)
775
776              task.md_ntwx=task.remd_nstex 
777              task.md_start="pdbstart"
778              task.remd_multi_m='["3", "3", "3", "3", "3", "3", "3", "3"]'
779              if task.md_seq2 =='':  
780                task.md_pdbref=True
781              task.md_respa=False
782              task.ssbond=""
783              task.dock_peptide=form.cleaned_data["dock_peptide"]
784
785              task.md_seq=""
786
787              seq1,ssbond1=from_pdb(task.myfile1)
788
789              
790              if seq1[-1]=='X' and seq2[0]=='X':
791               seq=seq1+seq2
792              elif seq1[-1]!='X' and seq2[0]!='X':
793               seq=seq1+'XX'+seq2
794              else:
795               seq=seq1+'X'+seq2
796              
797              for i in range(0,len(seq),40):
798                 task.md_seq=task.md_seq+seq[i:i+40]+" "
799
800              task.md_seed=form.cleaned_data["md_seed"]
801
802              task.md_nstep=form.cleaned_data["md_nstep"]
803              task.md_total_steps=task.md_nstep
804
805              if any(c.islower() for c in seq):
806               task.md_respa=False
807               task.damino=True
808
809              box1=dock_box(task.myfile1)
810              if task.myfile2:
811               box2=dock_box(task.myfile2)
812              else:
813               box2=len(task.md_seq2)*2.0
814              task.boxx=(box1+box2)*1.2+20
815              task.boxy=(box1+box2)*1.2+20
816              task.boxz=(box1+box2)*1.2+20
817              
818              task.ready=True
819
820              
821              
822              task.save()
823              if is_lazy_user(request.user):
824               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
825              else:
826               return redirect('/')
827     else:
828         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
829         form = TaskForm_dock(initial=data)
830     basic_adv=True
831     p_type='docking'
832     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
833
834 @login_required
835 def add_dock_a(request,task_id):
836     task = get_object_or_404(Task, id=task_id)
837     if request.method == 'POST':
838      if '_example' in request.POST:
839         data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
840         form = TaskForm_dock_a(initial=data)     
841      else:
842         form = TaskForm_dock_a(request.POST,request.FILES)
843         if form.is_valid():
844              task.name=form.cleaned_data["name"]
845              task.type="dock"
846
847              basename = str(task.owner)
848              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
849              task.jobdirname = "_".join([basename, suffix])
850
851              pdbid=form.cleaned_data["pdbid"]
852              if pdbid:
853               task.myfile1=load_pdbid(pdbid,task.jobdirname)
854               task.pdbcode=pdbid
855              else:
856               task.myfile1=form.cleaned_data["file1"]
857               
858              pdbid2=form.cleaned_data["pdbid2"]
859              if pdbid2:
860               task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
861               task.pdbcode2=pdbid2
862              else:
863               task.myfile2=form.cleaned_data["file2"]
864
865              task.md_ntwx=task.remd_nstex 
866              task.md_start="pdbstart"
867              task.md_pdbref=True
868              task.md_respa=False
869              task.ssbond=""
870              task.dock_peptide=form.cleaned_data["dock_peptide"]
871               
872              task.md_seq=""
873
874              seq1,ssbond1=from_pdb(task.myfile1)
875              seq2,ssbond2=from_pdb(task.myfile2)
876              
877              if seq1[-1]=='X' and seq2[0]=='X':
878               seq=seq1+seq2
879              elif seq1[-1]!='X' and seq2[0]!='X':
880               seq=seq1+'XX'+seq2
881              else:
882               seq=seq1+'X'+seq2
883              
884              for i in range(0,len(seq),40):
885                 task.md_seq=task.md_seq+seq[i:i+40]+" "
886
887              task.md_seed=form.cleaned_data["md_seed"]
888
889              task.md_nstep=form.cleaned_data["md_nstep"]
890              task.md_total_steps=task.md_nstep
891              
892              task.md_dt=form.cleaned_data["md_dt"]
893              task.md_lang=form.cleaned_data["md_lang"]
894              task.md_tau=form.cleaned_data["md_tau"]
895              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
896              task.min_maxfun=form.cleaned_data["min_maxfun"]
897              task.remd_nrep=form.cleaned_data["remd_nrep"]
898              task.remd_nstex=form.cleaned_data["remd_nstex"]
899              task.md_ntwx=form.cleaned_data["md_ntwx"]             
900              task.md_ntwe=form.cleaned_data["md_ntwe"]
901
902              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
903              task.unres_ff=form.cleaned_data["unres_ff"]
904
905              if any(c.islower() for c in seq):
906               task.md_respa=False
907               task.damino=True
908
909              box1=dock_box(task.myfile1)
910              box2=dock_box(task.myfile2)
911              task.boxx=(box1+box2)*1.2+20
912              task.boxy=(box1+box2)*1.2+20
913              task.boxz=(box1+box2)*1.2+20
914
915              task.save()
916              return redirect('addmlist',task_id=task.id)
917
918     else:
919         data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
920         form = TaskForm_dock_a(initial=data)
921     basic_adv=False
922     p_type='docking - advanced options'
923     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
924
925
926
927 @login_required
928 def addmlist(request,task_id):
929     task = get_object_or_404(Task, id=task_id)
930     if request.method == 'POST':
931         form = TaskForm_list(task.remd_nrep,request.POST)
932         if form.is_valid():
933              task.remd_multi_t=form.cleaned_data["temperatures"]
934              task.remd_multi_m=form.cleaned_data["multiplexing"]             
935              task.ready=True
936              
937              task.save()
938              if is_lazy_user(request.user):
939               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
940              else:
941               return redirect('/')
942     else:
943       if task.example == 'casp12':
944         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
945         '["2", "2", "2", "2", "2", "2", "2", "2"]',
946         'temperatures':
947         '["270", "280", "290", "300", "310", "320", "330", "340"]'
948         }
949       elif task.unres_ff == 'FF2':
950         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
951         '["1", "1", "1", "1", "1", "1", "1", "1"]',
952         'temperatures':
953         '["270", "280", "290", "300", "310", "320", "330", "345"]'
954         }
955       else: 
956         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
957         '["1", "1", "1", "1", "1", "1", "1", "1"]',
958         'temperatures':
959         '["250", "260", "270", "280", "290", "300", "315", "330"]'
960         }
961       
962       form = TaskForm_list(task.remd_nrep,initial=data)
963     p_type='replica exchange molecular dynamics - advanced options'
964     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
965
966 @login_required
967 def details(request,task_id):
968     task = get_object_or_404(Task, id=task_id)
969     return render(request, "details.html",{'task':task})
970
971
972 def details1(request,user_id,task_id):
973     task = get_object_or_404(Task, id=task_id)
974     return render(request, "details1.html",{'task':task})
975
976
977 @login_required
978 def delete(request, task_id):
979     Task.objects.get(id=task_id).delete()
980     return redirect('/')
981     
982 @login_required
983 def restart(request, task_id):
984     task = get_object_or_404(Task, id=task_id)
985     restart0(task)
986     return redirect('/')
987    
988 def add_restart_inp():
989     with open('file.inp','r') as f1, open ('file.inp.tmp','w') as f2:
990         for line in f1:
991           if 'reset_vel=' in line:
992             f2.write('{:79}'.format('restart'+line[7:]))
993           else:
994             f2.write(line)
995     os.remove('file.inp')
996     os.rename('file.inp.tmp','file.inp')
997     return 
998     
999 def restart0(task):    
1000     if os.path.isfile(task.jobdirname+'/finished'):    
1001       os.remove(task.jobdirname+'/finished')
1002     task.running =1
1003     task.done=False
1004     task.md_total_steps = task.md_total_steps+task.md_nstep
1005     task.save()
1006     if task.type == 'md':
1007       os.chdir(task.jobdirname)
1008       add_restart_inp()
1009       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
1010       os.chdir('..')
1011     elif task.type == 'remd':
1012       os.chdir(task.jobdirname)
1013       add_restart_inp()
1014       tmp1=json.loads(task.remd_multi_m)
1015       nreplicas=sum(map(int, tmp1))
1016       with open('file_wham.inp','r') as f1, open ('file_wham.tmp','w') as f2:
1017         for line in f1:
1018           if 'rec_end=' in line:
1019             rec=task.md_total_steps/task.md_ntwx
1020             f2.write('nfile_cx=1 rec_start='+str(rec/10)
1021                +' rec_end='+str(rec)+' totraj='+str(nreplicas)+'\n')
1022           elif 'isampl=' in line:
1023             if task.md_total_steps/task.md_ntwx*nreplicas<=8000:
1024                 isampl=1
1025             else:
1026                 isampl=int(task.md_total_steps/task.md_ntwx*nreplicas/8000)
1027             f2.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
1028           else:
1029             f2.write(line)
1030       os.remove('file_wham.inp')
1031       os.rename('file_wham.tmp','file_wham.inp')
1032       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
1033       os.chdir('..')
1034     return
1035
1036 def restart1(request, user_id, task_id):
1037     task = get_object_or_404(Task, id=task_id)
1038     user = task.owner
1039     restart0(task)
1040     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1041     
1042
1043 def refresh_done1(request, task_id):
1044     task = get_object_or_404(Task, id=task_id)
1045     user = task.owner
1046     refresh_done0(task)
1047
1048     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1049     njob=0
1050     nq=0
1051     for line in proc.stdout:
1052       if 'piasek4' in line:
1053         if line.split()[1]=='test_server':
1054           njob+=1
1055           if line.split()[-2]=='Q':
1056             nq+=1
1057     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1058
1059     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1060
1061
1062 @login_required
1063 def refresh_done(request):
1064     user = request.user
1065     tasks = Task.objects.filter(owner=user).order_by('-created_date')
1066     tasks_count = Task.objects.filter(owner=user).count()
1067     alldone = 1
1068     for task in tasks:
1069       refresh_done0(task)
1070       if not task.done:
1071          alldone=0
1072
1073     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
1074     njob=0
1075     nq=0
1076     for line in proc.stdout:
1077       if 'piasek4' in line:
1078         if line.split()[1]=='test_server':
1079           njob+=1
1080           if line.split()[-2]=='Q':
1081             nq+=1
1082     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
1083
1084     if is_lazy_user(request.user):
1085      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
1086     else:
1087      return render(request, "index.html", {
1088                 'tasks': tasks ,
1089                 'variable' : variable,
1090                 'alldone': alldone,
1091                 'tasks_count':tasks_count
1092                         })
1093
1094       
1095 def refresh_done0(task):
1096       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
1097          task.done=True
1098
1099          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1100
1101            if task.type=='min' or task.type=='md':
1102              text=""
1103              for line in f:
1104                if 'ETOT' in line:
1105                   task.etot=line.split()[1]
1106
1107                if 'RMS deviation' in line:
1108                   text=text+line
1109                   i=1
1110                   for line1 in f:
1111                      text=text+line1
1112                      i+=1
1113                      if i>6:
1114                        break
1115                if 'Total wall' in line:
1116                   text=text+line
1117                   
1118            elif task.type=='remd' or task.type=='dock':
1119              j=0
1120              text="Acceptance for replica exchanges and number of exchange attempts\n"
1121              for line in f:
1122                         
1123                if 'ACC' in line:
1124                     j+=1
1125                     text=text+' '.join(line.split()[2:])+"\n"
1126                     if j==task.remd_nrep:
1127                        j=1
1128                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
1129
1130                if 'Total wall' in line:
1131                   text=text+line
1132                        
1133          task.results_text=text
1134
1135
1136          if task.md_pdbref and task.type=='remd' or task.type=='dock' and task.md_seq2 == '':
1137          
1138           for i in range(1,6):
1139            try:
1140             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
1141                  line=f.readline()
1142                  if i==1:
1143                      task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
1144                  elif i==2:
1145                      task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
1146                  elif i==3:
1147                      task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
1148                  elif i==4:
1149                      task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
1150                  elif i==5:
1151                      task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
1152            except EnvironmentError:
1153             print 'file_wham_T*pdb open error'
1154           for i in range(1,6):
1155             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
1156                text=''
1157                for line in f:
1158                  if 'RMSD of  the common residues=' in line:
1159                    text=' RMSD='+line.split()[5]
1160                  if 'TM-score    =' in line:
1161                    text=text+' TMscore='+line.split()[2]
1162                  if 'GDT-TS-score=' in line:
1163                    text=text+' GDT_TS='+line.split()[1]
1164                     
1165                if i==1:
1166                      task.remd_model1=task.remd_model1+text
1167                elif i==2:
1168                      task.remd_model2=task.remd_model2+text
1169                elif i==3:
1170                      task.remd_model3=task.remd_model3+text
1171                elif i==4:
1172                      task.remd_model4=task.remd_model4+text
1173                elif i==5:
1174                      task.remd_model5=task.remd_model5+text
1175           
1176           if task.type=='dock':
1177            for i in range(1,6):
1178             with open(task.jobdirname+'/dockq_'+str(i)+'.out', 'r') as f:
1179                text=''
1180                for line in f:
1181                  if 'Fnat' in line:
1182                    text=' Fnat='+line.split()[1]
1183                  if 'iRMS' in line:
1184                    text=text+' iRMS='+line.split()[1]
1185                  if 'LRMS' in line:
1186                    text=text+' LRMS='+line.split()[1]
1187                  if 'CAPRI' in line and not 'DockQ_CAPRI' in line:
1188                    text=text+' CAPRI='+line.split()[1]
1189                  if 'DockQ_CAPRI' in line:
1190                    text=text+' DockQ_CAPRI= '+line.split()[1]
1191                  if 'DockQ ' in line:
1192                    text=text+' DockQ='+line.split()[1]
1193
1194                if i==1:
1195                      task.remd_model1=task.remd_model1+text
1196                elif i==2:
1197                      task.remd_model2=task.remd_model2+text
1198                elif i==3:
1199                      task.remd_model3=task.remd_model3+text
1200                elif i==4:
1201                      task.remd_model4=task.remd_model4+text
1202                elif i==5:
1203                      task.remd_model5=task.remd_model5+text
1204
1205
1206          if task.type=='remd' or task.type=='dock':  
1207           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
1208
1209            for line in f:
1210              if 'sumprob' in line:
1211                 i=0
1212                 for line1 in f:
1213                   i+=1
1214                   if i>6:
1215                        break
1216                   if i==1:
1217                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[-2]
1218                   elif i==2:
1219                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[-2]
1220                   elif i==3:
1221                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[-2]
1222                   elif i==4:
1223                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[-2]
1224                   elif i==5:
1225                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[-2]
1226                      
1227          
1228
1229          task.save()
1230       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
1231          if (task.type=='min'):
1232            task.running =1
1233            with open(task.jobdirname+'/file.out_GB000', 'r') as f:
1234               line=''
1235               for line in f:
1236                 pass
1237               if line != '':
1238                 last = line.split()[0]
1239               else:
1240                 last = 0
1241            try:
1242               task.running=int(1+int(last)*100.0/task.min_maxmin)
1243            except:
1244               pass
1245            if task.running>100:
1246               task.running=100
1247          else:
1248            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
1249               line=''
1250               for line in f:
1251                 pass
1252               if line != '':
1253                 last = line.split()[0]
1254               else:
1255                 last = 0
1256            task.running=int(1+int(last)*100.0/task.md_nstep)
1257            if task.running>100:
1258              task.running=100
1259          task.save()
1260
1261     
1262       return  
1263
1264 @login_required
1265 def zip_all_files(request, task_id):
1266     import os, zipfile
1267     from django.http import HttpResponse
1268     from wsgiref.util import FileWrapper
1269     from django.core.files.temp import NamedTemporaryFile
1270
1271     task = get_object_or_404(Task, id=task_id)
1272
1273     temp=NamedTemporaryFile()
1274     archive = zipfile.ZipFile(temp, 'w', zipfile.ZIP_DEFLATED)
1275     for (dirpath, dirnames, filenames) in os.walk(task.jobdirname):
1276        for file1 in filenames:
1277          archive.write(dirpath+"/"+file1,file1)
1278     archive.close()
1279     temp.seek(0)
1280     wrapper = FileWrapper(temp)
1281     response = HttpResponse(wrapper, content_type='application/zip')
1282     response['Content-Disposition'] = 'attachment; filename=all.zip'
1283     return response