61d5b618223d8be3864a5eb2beb3d9af34a8bb54
[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','unres_ff':'opt-wtfsa-2'}
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':200}
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':'1L2Y','md_start':'extconf',
289          'md_pdbref':True,'md_mdpdb':True}
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          'remd_cluter_temp':280}
422         form = TaskForm_remd_a(initial=data)     
423      else:
424         form = TaskForm_remd_a(request.POST,request.FILES)
425         if form.is_valid():
426              task.name=form.cleaned_data["name"]
427              task.type="remd"
428
429              basename = str(task.owner)
430              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
431              task.jobdirname = "_".join([basename, suffix])
432
433              pdbid=form.cleaned_data["pdbid"]
434              if pdbid:
435               os.mkdir(task.jobdirname)
436               task.myfile1,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
437                      task.jobdirname+'/plik.pdb')     
438               task.pdbcode=pdbid
439              else:
440               task.myfile1=form.cleaned_data["file1"]
441              task.md_start=form.cleaned_data["md_start"]  
442              task.md_pdbref=form.cleaned_data["md_pdbref"]                        
443
444              task.md_seq=""
445              if task.md_start == "pdbstart" or task.md_pdbref:
446                seq,task.ssbond=from_pdb(task.myfile1)
447              else:
448                seq=seq_add_x(form.cleaned_data["md_seq"])
449              for i in range(0,len(seq),40):
450                 task.md_seq=task.md_seq+seq[i:i+40]+" "
451
452              if task.md_start != "pdbstart":
453                 task.ssbond=''
454
455              task.md_seed=form.cleaned_data["md_seed"]
456              task.md_nstep=form.cleaned_data["md_nstep"]
457              task.md_dt=form.cleaned_data["md_dt"]
458              task.md_lang=form.cleaned_data["md_lang"]
459              task.md_tau=form.cleaned_data["md_tau"]
460              task.md_scal_fric=form.cleaned_data["md_scal_fric"]
461              task.remd_nrep=form.cleaned_data["remd_nrep"]
462              task.remd_nstex=form.cleaned_data["remd_nstex"]
463              task.md_ntwx=form.cleaned_data["md_ntwx"]             
464              task.md_ntwe=form.cleaned_data["md_ntwe"]
465 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
466 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
467
468              task.boxx=form.cleaned_data["boxx"]
469              task.boxy=form.cleaned_data["boxy"]             
470              task.boxz=form.cleaned_data["boxz"]             
471
472              task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
473              task.unres_ff=form.cleaned_data["unres_ff"]
474              
475              task.save()
476              return redirect('addmlist',task_id=task.id)
477     else:
478         data= {'name':task.name}
479         form = TaskForm_remd_a(initial=data)
480     basic_adv=False
481     p_type='replica exchange molecular dynamics - advanced options'
482     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
483
484 @login_required
485 def addmlist(request,task_id):
486     task = get_object_or_404(Task, id=task_id)
487     if request.method == 'POST':
488         form = TaskForm_list(task.remd_nrep,request.POST)
489         if form.is_valid():
490              task.remd_multi_t=form.cleaned_data["temperatures"]
491              task.remd_multi_m=form.cleaned_data["multiplexing"]             
492              task.ready=True
493              
494              task.save()
495              if is_lazy_user(request.user):
496               return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')              
497              else:
498               return redirect('/')
499     else:
500       if task.unres_ff == 'E0LL2Y':
501         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
502         '["1", "1", "1", "1", "1", "1", "1", "1"]',
503         'temperatures':
504         '["270", "280", "290", "300", "310", "320", "330", "345"]'
505         }
506       else: 
507         data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
508         '["1", "1", "1", "1", "1", "1", "1", "1"]',
509         'temperatures':
510         '["250", "260", "270", "280", "290", "300", "315", "330"]'
511         }
512       
513       form = TaskForm_list(task.remd_nrep,initial=data)
514     p_type='replica exchange molecular dynamics - advanced options'
515     return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
516
517 @login_required
518 def details(request,task_id):
519     task = get_object_or_404(Task, id=task_id)
520     return render(request, "details.html",{'task':task})
521
522
523 def details1(request,user_id,task_id):
524     task = get_object_or_404(Task, id=task_id)
525     return render(request, "details1.html",{'task':task})
526
527
528 @login_required
529 def delete(request, task_id):
530     Task.objects.get(id=task_id).delete()
531     return redirect('/')
532
533 def refresh_done1(request, task_id):
534     task = get_object_or_404(Task, id=task_id)
535     user = task.owner
536     refresh_done0(task)
537
538     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
539     njob=0
540     nq=0
541     for line in proc.stdout:
542       if 'piasek4' in line:
543         if line.split()[1]=='test_server':
544           njob+=1
545           if line.split()[-2]=='Q':
546             nq+=1
547     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
548
549     return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
550
551
552 @login_required
553 def refresh_done(request):
554     user = request.user
555     tasks = Task.objects.filter(owner=user).order_by('-created_date')
556     for task in tasks:
557       refresh_done0(task)
558
559     proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
560     njob=0
561     nq=0
562     for line in proc.stdout:
563       if 'piasek4' in line:
564         if line.split()[1]=='test_server':
565           njob+=1
566           if line.split()[-2]=='Q':
567             nq+=1
568     variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
569
570     if is_lazy_user(request.user):
571      return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
572     else:
573      return render(request, "index.html", {
574                 'tasks': tasks ,
575                 'variable' : variable
576                         })
577
578       
579 def refresh_done0(task):
580       if os.path.isfile(task.jobdirname+'/finished') and not task.done:
581          task.done=True
582
583          with open(task.jobdirname+'/file.out_GB000', 'r') as f:
584
585            if task.type=='min' or task.type=='md':
586              text=""
587              for line in f:
588                if 'ETOT' in line:
589                   task.etot=line.split()[1]
590
591                if 'RMS deviation' in line:
592                   text=text+line
593                   i=1
594                   for line1 in f:
595                      text=text+line1
596                      i+=1
597                      if i>6:
598                        break
599                if 'Total wall' in line:
600                   text=text+line
601                   
602            elif task.type=='remd':
603              j=0
604              text="Acceptance for replica exchanges and number of exchange attempts\n"
605              for line in f:
606                         
607                if 'ACC' in line:
608                     j+=1
609                     text=text+' '.join(line.split()[2:])+"\n"
610                     if j==task.remd_nrep:
611                        j=1
612                        text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
613
614                if 'Total wall' in line:
615                   text=text+line
616                        
617          task.results_text=text
618
619
620          if task.md_pdbref and task.type=='remd':
621          
622           for i in range(1,6):
623            try:
624             with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
625                  line=f.readline()
626                  if i==1:
627                      task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
628                  elif i==2:
629                      task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
630                  elif i==3:
631                      task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
632                  elif i==4:
633                      task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
634                  elif i==5:
635                      task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
636            except EnvironmentError:
637             print 'file_wham_T*pdb open error'
638           for i in range(1,6):
639             with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
640                text=''
641                for line in f:
642                  if 'RMSD of  the common residues=' in line:
643                    text=' RMSD='+line.split()[5]
644                  if 'TM-score    =' in line:
645                    text=text+' TMscore='+line.split()[2]
646                  if 'GDT-TS-score=' in line:
647                    text=text+' GDT_TS='+line.split()[1]
648                     
649                if i==1:
650                      task.remd_model1=task.remd_model1+text
651                elif i==2:
652                      task.remd_model2=task.remd_model2+text
653                elif i==3:
654                      task.remd_model3=task.remd_model3+text
655                elif i==4:
656                      task.remd_model4=task.remd_model4+text
657                elif i==5:
658                      task.remd_model5=task.remd_model5+text
659
660
661
662          if task.type=='remd':  
663           with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
664
665            for line in f:
666              if 'sumprob' in line:
667                 i=0
668                 for line1 in f:
669                   i+=1
670                   if i>6:
671                        break
672                   if i==1:
673                      task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
674                   elif i==2:
675                      task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
676                   elif i==3:
677                      task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
678                   elif i==4:
679                      task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
680                   elif i==5:
681                      task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
682                      
683          
684
685          task.save()
686       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
687          if (task.type=='min'):
688            task.running =1
689          else:
690            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
691               line=''
692               for line in f:
693                 pass
694               if line != '':
695                 last = line.split()[0]
696               else:
697                 last = 0
698            task.running=int(1+int(last)*100.0/task.md_nstep)
699            if task.running>100:
700              task.running=100
701          task.save()
702
703     
704       return