d02f588754879c3308719a9000cc29d1990dbbec
[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
13 res_codes = [
14                 # 20 canonical amino acids
15                 ('CYS', 'C'), ('ASP', 'D'), ('SER', 'S'), ('GLN', 'Q'),
16                 ('LYS', 'K'), ('ILE', 'I'), ('PRO', 'P'), ('THR', 'T'),
17                 ('PHE', 'F'), ('ASN', 'N'), ('GLY', 'G'), ('HIS', 'H'),
18                 ('LEU', 'L'), ('ARG', 'R'), ('TRP', 'W'), ('ALA', 'A'),
19                 ('VAL', 'V'), ('GLU', 'E'), ('TYR', 'Y'), ('MET', 'M'),
20                 ('HSD', 'H'),('HSE', 'H'),('HSP', 'H'),
21                 ('HIE', 'H'), ('HID', 'H'),('HIP', 'H'),
22                 ('CYX', 'C'),
23                ]
24
25 three_to_one = dict(res_codes)
26
27 def seq_add_x(sequence):
28     if sequence[0] != 'G':
29         sequence='X'+sequence
30     if sequence[-1] != 'G':
31         sequence=sequence+'X'
32     set ='CDSQKIPTFNGHLRWAVEYMX'
33     sequence = ''.join([c for c in sequence if c in set])
34
35     return(sequence)    
36
37 def from_pdb(file):
38     sequence = []
39     ssbond = []
40     ssbond_ch = []
41     ires = []
42     chain_start = {}
43     chain_end = {}
44     unres_shift = {}
45     chain=[]
46     ichain=0
47     newchain = True
48     
49     for line in file:
50             if line[0:6] == 'COMPND' and line[11:17] == 'CHAIN:':
51               tmp=line[18:]
52               chain_=tmp.split(', ')
53               chain_[-1]=chain_[-1][0]
54               chain.extend(chain_)
55     
56             if line[0:6] == 'ATOM  ' and line[13:15] == 'CA':
57               aa = three_to_one.get(line[17:20])
58               i = int(line[22:26])
59               if newchain or i!=ires[-1]:
60                 sequence.append(aa)
61                 ires.append(i)
62                 if newchain:
63                  if len(chain)>0:
64                   chain_start[chain[ichain]]=i
65                  newchain = False
66             if line[0:3] == 'TER':
67               sequence.append('XX')
68               if len(chain)>0:
69                chain_end[chain[ichain]]=i
70               ichain=ichain+1
71               newchain = True
72             if line[0:6] == 'SSBOND':
73               b=[]
74               b.append(int(line[17:21]))
75               b.append(int(line[31:35]))
76               ssbond.append(b)
77               c = []
78               c.append((line[15:16]))
79               c.append((line[29:30]))
80               ssbond_ch.append(c)                                                                      
81             if line[0:3] == 'END':
82               break
83     while sequence[-1] == 'XX':
84             del sequence[-1]
85     if sequence[0] != 'G':
86             sequence.insert(0,'X')
87             ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
88     if sequence[-1] != 'G':
89             sequence.append('X')
90     seq=''.join(sequence)
91 #    if ires[0] != 1:
92 #            ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
93     i=0
94     for c in chain:
95       unres_shift[c]=i+chain_start[c]
96       i=i-(chain_end[c]-chain_start[c])-3
97     ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]     
98
99     return seq,json.dumps(ssbond)
100
101
102 @login_required
103 def index(request):
104     user = request.user
105     tasks = Task.objects.filter(owner=user).order_by('-created_date')
106     variable = ''
107     return render(request, "index.html", {
108             'tasks': tasks
109         })
110
111 @login_required
112 def add(request):
113     if request.method == 'POST':
114         form = TaskForm(request.POST)
115         if form.is_valid():
116             name = form.cleaned_data["name"]
117             user = request.user
118             task = Task(name=name,owner=user,ready=False)
119             task.save()
120             return redirect('add_min',task_id=task.id)
121     return redirect('/')
122
123 @login_required
124 def add_min(request,task_id):
125     task = get_object_or_404(Task, id=task_id)
126     if request.method == 'POST':
127      if '_example' in request.POST:
128         data= {'name':task.name,'pdbid':'1BDD'}
129         form = TaskForm_min(initial=data)     
130      else:
131         form = TaskForm_min(request.POST,request.FILES)
132         if form.is_valid():
133              task.name=form.cleaned_data["name"]
134              task.type="min"
135              pdbid=form.cleaned_data["pdbid"]
136
137              basename = str(task.owner)
138              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
139              task.jobdirname = "_".join([basename, suffix])
140
141              if pdbid:
142               os.mkdir(task.jobdirname)
143               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
144                      task.jobdirname+'/plik.pdb')     
145               task.pdbcode=pdbid
146              else:
147               task.myfile1=form.cleaned_data["file1"]
148
149              seq,task.ssbond=from_pdb(task.myfile1)
150              task.md_seq=""
151              for i in range(0,len(seq),40):
152                     task.md_seq=task.md_seq+seq[i:i+40]+" "
153
154              task.ready=True
155              
156              task.save()
157              if is_lazy_user(request.user):
158               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
159              else:
160               return redirect('/')
161     else:
162         data= {'name':task.name}
163         form = TaskForm_min(initial=data)
164     p_type='minimization'
165     basic_adv=True    
166     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
167
168 @login_required
169 def add_min_a(request,task_id):
170     task = get_object_or_404(Task, id=task_id)
171     if request.method == 'POST':
172      if '_example' in request.POST:
173         data= {'name':task.name,'pdbid':'1EI0'}
174         form = TaskForm_min_a(initial=data)     
175      else:
176         form = TaskForm_min_a(request.POST,request.FILES)
177         if form.is_valid():
178              task.name=form.cleaned_data["name"]
179              task.type="min"
180              task.min_choice=form.cleaned_data["min_choice"]
181              task.min_overlap=form.cleaned_data["min_overlap"]
182              task.min_searchsc=form.cleaned_data["min_searchsc"]
183              task.min_maxmin=form.cleaned_data["min_maxmin"]
184              task.min_maxfun=form.cleaned_data["min_maxfun"]
185              task.min_pdbout=form.cleaned_data["min_pdbout"]
186
187              basename = str(task.owner)
188              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
189              task.jobdirname = "_".join([basename, suffix])
190              
191              pdbid=form.cleaned_data["pdbid"]
192              if pdbid:
193               os.mkdir(task.jobdirname)
194               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
195                      task.jobdirname+'/plik.pdb')     
196               task.pdbcode=pdbid
197              else:
198               task.myfile1=form.cleaned_data["file1"]
199
200              task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
201              task.unres_ff=form.cleaned_data["unres_ff"]
202              task.boxx=form.cleaned_data["boxx"]
203              task.boxy=form.cleaned_data["boxy"]             
204              task.boxz=form.cleaned_data["boxz"]             
205
206              seq,task.ssbond=from_pdb(task.myfile1)
207              task.md_seq=""
208              for i in range(0,len(seq),40):
209                 task.md_seq=task.md_seq+seq[i:i+40]+" "
210                                                            
211              task.ready=True
212              
213              task.save()
214              if is_lazy_user(request.user):
215               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
216              else:
217               return redirect('/')
218     else:
219         data= {'name':task.name}
220         form = TaskForm_min_a(initial=data)
221     basic_adv=False
222     p_type='minimization - advanced options'
223     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
224
225 @login_required
226 def add_md(request,task_id):
227     task = get_object_or_404(Task, id=task_id)
228     if request.method == 'POST':
229      if '_example' in request.POST:
230         data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
231         'md_pdbref':True,'md_temp':250}
232         form = TaskForm_md(initial=data)     
233      else:
234         form = TaskForm_md(request.POST,request.FILES)
235         if form.is_valid():
236              task.name=form.cleaned_data["name"]
237              task.type="md"
238              task.md_seed=form.cleaned_data["md_seed"]
239              task.md_start=form.cleaned_data["md_start"]
240              task.md_temp=form.cleaned_data["md_temp"]
241              task.md_nstep=form.cleaned_data["md_nstep"]
242
243              basename = str(task.owner)
244              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
245              task.jobdirname = "_".join([basename, suffix])
246
247              pdbid=form.cleaned_data["pdbid"]
248              if pdbid:
249               os.mkdir(task.jobdirname)
250               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
251                      task.jobdirname+'/plik.pdb')     
252               task.pdbcode=pdbid
253              else:
254               task.myfile1=form.cleaned_data["file1"]
255              task.md_pdbref=form.cleaned_data["md_pdbref"]             
256
257              task.md_seq=""
258              if task.md_start == "pdbstart" or task.md_pdbref:
259                seq,task.ssbond=from_pdb(task.myfile1)
260              else:
261                seq=seq_add_x(form.cleaned_data["md_seq"])
262                        
263              for i in range(0,len(seq),40):
264                 task.md_seq=task.md_seq+seq[i:i+40]+" "
265              
266              if task.md_start != "pdbstart":
267                 task.ssbond=''
268
269              task.ready=True
270              
271              task.save()
272              if is_lazy_user(request.user):
273               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
274              else:
275               return redirect('/')
276     else:
277         data= {'name':task.name}
278         form = TaskForm_md(initial=data)
279     basic_adv=True
280     p_type='molecular dynamics'
281     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
282
283 @login_required
284 def add_md_a(request,task_id):
285     task = get_object_or_404(Task, id=task_id)
286     if request.method == 'POST':
287      if '_example' in request.POST:
288         data= {'name':task.name,'pdbid':'1FSD','md_start':'extconf',
289          'md_pdbref':True,'md_lang':'berendsen'}
290         form = TaskForm_md_a(initial=data)     
291      else:
292         form = TaskForm_md_a(request.POST,request.FILES)
293         if form.is_valid():
294              task.name=form.cleaned_data["name"]
295              task.type="md"
296
297              basename = str(task.owner)
298              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
299              task.jobdirname = "_".join([basename, suffix])
300
301              pdbid=form.cleaned_data["pdbid"]
302              if pdbid:
303               os.mkdir(task.jobdirname)
304               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
305                      task.jobdirname+'/plik.pdb')     
306               task.pdbcode=pdbid
307              else:
308               task.myfile1=form.cleaned_data["file1"]
309              task.md_start=form.cleaned_data["md_start"]
310              task.md_pdbref=form.cleaned_data["md_pdbref"]             
311
312              task.md_seq=""
313              if task.md_start == "pdbstart" or task.md_pdbref:
314                seq,task.ssbond=from_pdb(task.myfile1)
315              else:
316                seq=seq_add_x(form.cleaned_data["md_seq"])
317              for i in range(0,len(seq),40):
318                 task.md_seq=task.md_seq+seq[i:i+40]+" "
319
320              if task.md_start != "pdbstart":
321                 task.ssbond=''
322
323              task.md_seed=form.cleaned_data["md_seed"]
324
325              task.md_temp=form.cleaned_data["md_temp"]
326              task.md_nstep=form.cleaned_data["md_nstep"]
327              task.md_ntwe=form.cleaned_data["md_ntwe"]
328              task.md_ntwx=form.cleaned_data["md_ntwx"]
329              task.md_dt=form.cleaned_data["md_dt"]
330              task.md_lang=form.cleaned_data["md_lang"]
331              task.md_tau=form.cleaned_data["md_tau"]
332              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
333              task.md_mdpdb=form.cleaned_data["md_mdpdb"]
334              task.unres_ff=form.cleaned_data["unres_ff"]
335              task.boxx=form.cleaned_data["boxx"]
336              task.boxy=form.cleaned_data["boxy"]             
337              task.boxz=form.cleaned_data["boxz"]             
338
339              
340              task.ready=True
341              
342              task.save()
343              if is_lazy_user(request.user):
344               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
345              else:
346               return redirect('/')
347     else:
348         data= {'name':task.name}
349         form = TaskForm_md_a(initial=data)
350     basic_adv=False
351     p_type='molecular dynamics - advanced options'
352     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
353
354 @login_required
355 def add_remd(request,task_id):
356     task = get_object_or_404(Task, id=task_id)
357     if request.method == 'POST':
358      if '_example' in request.POST:
359         data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True}
360         form = TaskForm_remd(initial=data)     
361      else:
362         form = TaskForm_remd(request.POST,request.FILES)
363         if form.is_valid():
364              task.name=form.cleaned_data["name"]
365              task.type="remd"
366              task.md_start=form.cleaned_data["md_start"]
367
368              basename = str(task.owner)
369              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
370              task.jobdirname = "_".join([basename, suffix])
371
372              pdbid=form.cleaned_data["pdbid"]
373              if pdbid:
374               os.mkdir(task.jobdirname)
375               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
376                      task.jobdirname+'/plik.pdb')     
377               task.pdbcode=pdbid
378              else:
379               task.myfile1=form.cleaned_data["file1"]
380              task.md_pdbref=form.cleaned_data["md_pdbref"]
381              task.md_ntwx=task.remd_nstex 
382
383              task.md_seq=""
384              if task.md_start == "pdbstart" or task.md_pdbref:
385                seq,task.ssbond=from_pdb(task.myfile1)
386              else:
387                seq=seq_add_x(form.cleaned_data["md_seq"])
388              for i in range(0,len(seq),40):
389                 task.md_seq=task.md_seq+seq[i:i+40]+" "
390
391              if task.md_start != "pdbstart":
392                 task.ssbond=''
393
394              task.md_seed=form.cleaned_data["md_seed"]
395
396              task.md_nstep=form.cleaned_data["md_nstep"]
397
398
399              task.ready=True
400              
401              
402              task.save()
403              if is_lazy_user(request.user):
404               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
405              else:
406               return redirect('/')
407     else:
408         data= {'name':task.name}
409         form = TaskForm_remd(initial=data)
410     basic_adv=True
411     p_type='replica exchange molecular dynamics'
412     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
413
414 @login_required
415 def add_remd_a(request,task_id):
416     task = get_object_or_404(Task, id=task_id)
417     if request.method == 'POST':
418      if '_example' in request.POST:
419         data= {'name':task.name,'pdbid':'1E0G','md_pdbref':True,
420          'md_nstep':500000,'md_lang':'berendsen','unres_ff':'opt-wtfsa-2'}
421         form = TaskForm_remd_a(initial=data)     
422      else:
423         form = TaskForm_remd_a(request.POST,request.FILES)
424         if form.is_valid():
425              task.name=form.cleaned_data["name"]
426              task.type="remd"
427
428              basename = str(task.owner)
429              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
430              task.jobdirname = "_".join([basename, suffix])
431
432              pdbid=form.cleaned_data["pdbid"]
433              if pdbid:
434               os.mkdir(task.jobdirname)
435               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
436                      task.jobdirname+'/plik.pdb')     
437               task.pdbcode=pdbid
438              else:
439               task.myfile1=form.cleaned_data["file1"]
440              task.md_start=form.cleaned_data["md_start"]  
441              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
442
443              task.md_seq=""
444              if task.md_start == "pdbstart" or task.md_pdbref:
445                seq,task.ssbond=from_pdb(task.myfile1)
446              else:
447                seq=seq_add_x(form.cleaned_data["md_seq"])
448              for i in range(0,len(seq),40):
449                 task.md_seq=task.md_seq+seq[i:i+40]+" "
450
451              if task.md_start != "pdbstart":
452                 task.ssbond=''
453
454              task.md_seed=form.cleaned_data["md_seed"]
455              task.md_nstep=form.cleaned_data["md_nstep"]
456              task.md_dt=form.cleaned_data["md_dt"]
457              task.md_lang=form.cleaned_data["md_lang"]
458              task.md_tau=form.cleaned_data["md_tau"]
459              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
460              task.remd_nrep=form.cleaned_data["remd_nrep"]
461              task.remd_nstex=form.cleaned_data["remd_nstex"]
462              task.md_ntwx=form.cleaned_data["md_ntwx"]             
463              task.md_ntwe=form.cleaned_data["md_ntwe"]
464 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
465 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
466
467              task.boxx=form.cleaned_data["boxx"]
468              task.boxy=form.cleaned_data["boxy"]             
469              task.boxz=form.cleaned_data["boxz"]             
470
471              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
472              task.unres_ff=form.cleaned_data["unres_ff"]
473              
474              task.save()
475              return redirect('addmlist',task_id=task.id)
476     else:
477         data= {'name':task.name}
478         form = TaskForm_remd_a(initial=data)
479     basic_adv=False
480     p_type='replica exchange molecular dynamics - advanced options'
481     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
482
483 @login_required
484 def addmlist(request,task_id):
485     task = get_object_or_404(Task, id=task_id)
486     if request.method == 'POST':
487         form = TaskForm_list(task.remd_nrep,request.POST)
488         if form.is_valid():
489              task.remd_multi_t=form.cleaned_data["temperatures"]
490              task.remd_multi_m=form.cleaned_data["multiplexing"]             
491              task.ready=True
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       if task.unres_ff == 'E0LL2Y':
500         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
501         '["1", "1", "1", "1", "1", "1", "1", "1"]',
502         'temperatures':
503         '["270", "280", "290", "300", "310", "320", "330", "345"]'
504         }
505       else: 
506         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
507         '["1", "1", "1", "1", "1", "1", "1", "1"]',
508         'temperatures':
509         '["250", "260", "270", "280", "290", "300", "315", "330"]'
510         }
511       
512       form = TaskForm_list(task.remd_nrep,initial=data)
513     p_type='replica exchange molecular dynamics - advanced options'
514     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
515
516 @login_required
517 def details(request,task_id):
518     task = get_object_or_404(Task, id=task_id)
519     return render(request, "details.html",{'task':task})
520
521
522 def details1(request,user_id,task_id):
523     task = get_object_or_404(Task, id=task_id)
524     return render(request, "details1.html",{'task':task})
525
526
527 @login_required
528 def delete(request, task_id):
529     Task.objects.get(id=task_id).delete()
530     return redirect('/')
531
532 def refresh_done1(request, task_id):
533     task = get_object_or_404(Task, id=task_id)
534     user = task.owner
535     refresh_done0(task)
536
537     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
538     njob=0
539     nq=0
540     for line in proc.stdout:
541       if 'piasek4' in line:
542         if line.split()[1]=='test_server':
543           njob+=1
544           if line.split()[-2]=='Q':
545             nq+=1
546     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
547
548     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
549
550
551 @login_required
552 def refresh_done(request):
553     user = request.user
554     tasks = Task.objects.filter(owner=user).order_by('-created_date')
555     for task in tasks:
556       refresh_done0(task)
557
558     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
559     njob=0
560     nq=0
561     for line in proc.stdout:
562       if 'piasek4' in line:
563         if line.split()[1]=='test_server':
564           njob+=1
565           if line.split()[-2]=='Q':
566             nq+=1
567     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
568
569     if is_lazy_user(request.user):
570      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
571     else:
572      return render(request, "index.html", {
573                 'tasks': tasks ,
574                 'variable' : variable
575                         })
576
577       
578 def refresh_done0(task):
579       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
580          task.done=True
581
582          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
583
584            if task.type=='min' or task.type=='md':
585              text=""
586              for line in f:
587                if 'ETOT' in line:
588                   task.etot=line.split()[1]
589
590                if 'RMS deviation' in line:
591                   text=text+line
592                   i=1
593                   for line1 in f:
594                      text=text+line1
595                      i+=1
596                      if i>6:
597                        break
598                if 'Total wall' in line:
599                   text=text+line
600                   
601            elif task.type=='remd':
602              j=0
603              text="Acceptance for replica exchanges\n"
604              for line in f:
605                         
606                if 'ACC' in line:
607                     j+=1
608                     text=text+line
609                     if j==task.remd_nrep:
610                        j=1
611                        text="Acceptance for replica exchanges\n"+line
612
613                if 'Total wall' in line:
614                   text=text+line
615                        
616          task.results_text=text
617
618
619          if task.md_pdbref and task.type=='remd':
620          
621           for i in range(1,6):
622            try:
623             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
624                  line=f.readline()
625                  if i==1:
626                      task.remd_model1=' '.join(line.split()[-6:])
627                  elif i==2:
628                      task.remd_model2=' '.join(line.split()[-6:])
629                  elif i==3:
630                      task.remd_model3=' '.join(line.split()[-6:])
631                  elif i==4:
632                      task.remd_model4=' '.join(line.split()[-6:])
633                  elif i==5:
634                      task.remd_model5=' '.join(line.split()[-6:])
635            except EnvironmentError:
636             print 'file_wham_T*pdb open error'
637           for i in range(1,6):
638             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
639                text=''
640                for line in f:
641                  if 'RMSD of  the common residues=' in line:
642                    text=' RMSD='+line.split()[5]
643                  if 'TM-score    =' in line:
644                    text=text+' TMscore='+line.split()[2]
645                  if 'GDT-TS-score=' in line:
646                    text=text+' GDT_TS='+line.split()[1]
647                     
648                if i==1:
649                      task.remd_model1=task.remd_model1+text
650                elif i==2:
651                      task.remd_model2=task.remd_model2+text
652                elif i==3:
653                      task.remd_model3=task.remd_model3+text
654                elif i==4:
655                      task.remd_model4=task.remd_model4+text
656                elif i==5:
657                      task.remd_model5=task.remd_model5+text
658
659
660
661          if task.type=='remd':  
662           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
663
664            for line in f:
665              if 'sumprob' in line:
666                 i=0
667                 for line1 in f:
668                   i+=1
669                   if i>6:
670                        break
671                   if i==1:
672                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
673                   elif i==2:
674                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
675                   elif i==3:
676                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
677                   elif i==4:
678                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
679                   elif i==5:
680                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
681                      
682          
683
684          task.save()
685       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
686          if (task.type=='min'):
687            task.running =1
688          else:
689            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
690               line=''
691               for line in f:
692                 pass
693               if line != '':
694                 last = line.split()[0]
695               else:
696                 last = 0
697            task.running=int(1+int(last)*100.0/task.md_nstep)
698            if task.running>100:
699              task.running=100
700          task.save()
701
702     
703       return