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
5 from .models import Task
10 from lazysignup.decorators import allow_lazy_user
11 from lazysignup.utils import is_lazy_user
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'),
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'),
31 three_to_one = dict(res_codes)
33 def load_pdbid(pdbid,dirname):
36 file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
41 pdb_tmp=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
42 with open(dirname+'/plik.pdb', 'w') as outfile:
44 if line[0:6] == 'SSBOND' and line[15] == chain and line[29] == chain:
46 if line[0:6] == 'ATOM ' and line[21] == chain:
49 file=dirname+'/plik.pdb'
54 def seq_2d_from_pdb(seq_2d,seq):
57 seq_2d=seq_2d.replace('C', '-')
60 for i in range(0,len(seq)):
62 seq_2d_tmp=seq_2d_tmp+'-'
65 seq_2d_tmp=seq_2d_tmp+seq_2d[ii]
68 for i in range(0,len(seq_2d_tmp),40):
69 tmp=tmp+seq_2d_tmp[i:i+40]+" "
72 def seq_2d_add_x(seq_2d,seq,seq_form):
75 seq_2d=seq_2d[:len(seq_form)]
76 seq_2d=seq_2d.replace('C', '-')
77 if seq_form[0] !='X' and seq[0] == 'X':
79 if seq_form[-1] !='X' and seq[-1] == 'X':
81 seq_2d=seq_2d[:len(seq)]
83 for i in range(0,len(seq_2d),40):
84 tmp=tmp+seq_2d[i:i+40]+" "
87 def seq_add_x(sequence):
88 if sequence[0] != 'G' and sequence[0] != 'g' and sequence[0] != 'X':
90 if sequence[-1] != 'G' and sequence[-1] != 'g' and sequence[-1] != 'X':
92 set ='CDSQKIPTFNGHLRWAVEYMXcdsqkiptfnhlrwaveym'
93 sequence = ''.join([c for c in sequence if c in set])
109 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
110 aa = three_to_one.get(line[17:20])
113 if newchain or i!=ires[-1]:
118 chain_sorted.extend(ch)
120 if line[0:3] == 'TER' and i != '':
121 sequence.append('XX')
124 if line[0:6] == 'SSBOND':
126 b.append(int(line[17:21]))
127 b.append(int(line[31:35]))
130 c.append((line[15:16]))
131 c.append((line[29:30]))
133 if line[0:3] == 'END':
135 if not sequence[-1] == 'XX':
137 while sequence[-1] == 'XX':
139 if sequence[0] != 'G':
140 sequence.insert(0,'X')
141 ssbond=[ [e[0]+1,e[1]+1] for e in ssbond]
142 if sequence[-1] != 'G':
144 seq=''.join(sequence)
146 # ssbond=[ [e[0]-ires[0]+1,e[1]-ires[0]+1] for e in ssbond]
148 for c in chain_sorted:
149 unres_shift[c]=i+chain_start[c]
150 i=i-(chain_end[c]-chain_start[c])-3
151 ssbond=[ [e[0]-unres_shift[c[0]]+1,e[1]-unres_shift[c[1]]+1] for e,c in zip(ssbond,ssbond_ch)]
153 return seq,json.dumps(ssbond)
159 tasks = Task.objects.filter(owner=user).order_by('-created_date')
161 return render(request, "index.html", {
162 'tasks': tasks, 'alldone': 0
167 if request.method == 'POST':
168 form = TaskForm(request.POST)
170 name = form.cleaned_data["name"]
172 task = Task(name=name,owner=user,ready=False)
174 return redirect('add_min',task_id=task.id)
178 def add_min(request,task_id):
179 task = get_object_or_404(Task, id=task_id)
180 if request.method == 'POST':
181 if '_example' in request.POST:
182 data= {'name':task.name,'pdbid':'1BDD'}
183 form = TaskForm_min(initial=data)
185 form = TaskForm_min(request.POST,request.FILES)
187 task.name=form.cleaned_data["name"]
189 pdbid=form.cleaned_data["pdbid"]
191 basename = str(task.owner)
192 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
193 task.jobdirname = "_".join([basename, suffix])
196 task.myfile1=load_pdbid(pdbid,task.jobdirname)
199 task.myfile1=form.cleaned_data["file1"]
201 seq,task.ssbond=from_pdb(task.myfile1)
203 for i in range(0,len(seq),40):
204 task.md_seq=task.md_seq+seq[i:i+40]+" "
209 if is_lazy_user(request.user):
210 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
214 data= {'name':task.name}
215 form = TaskForm_min(initial=data)
216 p_type='minimization'
218 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
221 def add_min_a(request,task_id):
222 task = get_object_or_404(Task, id=task_id)
223 if request.method == 'POST':
224 if '_example' in request.POST:
225 data= {'name':task.name,'pdbid':'1EI0','unres_ff':'opt-wtfsa-2'}
226 form = TaskForm_min_a(initial=data)
228 form = TaskForm_min_a(request.POST,request.FILES)
230 task.name=form.cleaned_data["name"]
232 # task.min_choice=form.cleaned_data["min_choice"]
233 task.min_overlap=form.cleaned_data["min_overlap"]
234 task.min_searchsc=form.cleaned_data["min_searchsc"]
235 task.min_maxmin=form.cleaned_data["min_maxmin"]
236 task.min_maxfun=form.cleaned_data["min_maxfun"]
237 task.min_pdbout=form.cleaned_data["min_pdbout"]
239 basename = str(task.owner)
240 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
241 task.jobdirname = "_".join([basename, suffix])
243 pdbid=form.cleaned_data["pdbid"]
245 task.myfile1=load_pdbid(pdbid,task.jobdirname)
248 task.myfile1=form.cleaned_data["file1"]
250 task.min_unres_pdb=form.cleaned_data["min_unres_pdb"]
251 task.unres_ff=form.cleaned_data["unres_ff"]
252 task.boxx=form.cleaned_data["boxx"]
253 task.boxy=form.cleaned_data["boxy"]
254 task.boxz=form.cleaned_data["boxz"]
256 seq,task.ssbond=from_pdb(task.myfile1)
258 for i in range(0,len(seq),40):
259 task.md_seq=task.md_seq+seq[i:i+40]+" "
264 if is_lazy_user(request.user):
265 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
269 data= {'name':task.name}
270 form = TaskForm_min_a(initial=data)
272 p_type='minimization - advanced options'
273 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
276 def add_md(request,task_id):
277 task = get_object_or_404(Task, id=task_id)
278 if request.method == 'POST':
279 if '_example' in request.POST:
280 data= {'name':task.name,'pdbid':'1IGD','md_start':'pdbstart',
281 'md_pdbref':True,'md_temp':200,'md_seed':-39912345}
282 form = TaskForm_md(initial=data)
284 form = TaskForm_md(request.POST,request.FILES)
286 task.name=form.cleaned_data["name"]
288 task.md_seed=form.cleaned_data["md_seed"]
289 task.md_start=form.cleaned_data["md_start"]
290 task.md_temp=form.cleaned_data["md_temp"]
291 task.md_nstep=form.cleaned_data["md_nstep"]
293 basename = str(task.owner)
294 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
295 task.jobdirname = "_".join([basename, suffix])
297 pdbid=form.cleaned_data["pdbid"]
299 task.myfile1=load_pdbid(pdbid,task.jobdirname)
302 task.myfile1=form.cleaned_data["file1"]
303 task.md_pdbref=form.cleaned_data["md_pdbref"]
306 if task.md_start == "pdbstart" or task.md_pdbref:
307 seq,task.ssbond=from_pdb(task.myfile1)
309 seq=seq_add_x(form.cleaned_data["md_seq"])
311 for i in range(0,len(seq),40):
312 task.md_seq=task.md_seq+seq[i:i+40]+" "
314 if task.md_start != "pdbstart":
320 if is_lazy_user(request.user):
321 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
325 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
326 form = TaskForm_md(initial=data)
328 p_type='molecular dynamics'
329 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
332 def add_md_a(request,task_id):
333 task = get_object_or_404(Task, id=task_id)
334 if request.method == 'POST':
335 if '_example' in request.POST:
336 data= {'name':task.name,'pdbid':'1L2Y','md_start':'extconf',
337 'md_pdbref':True,'md_mdpdb':True,'md_seed':-39912345}
338 form = TaskForm_md_a(initial=data)
340 form = TaskForm_md_a(request.POST,request.FILES)
342 task.name=form.cleaned_data["name"]
345 basename = str(task.owner)
346 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
347 task.jobdirname = "_".join([basename, suffix])
349 pdbid=form.cleaned_data["pdbid"]
351 task.myfile1=load_pdbid(pdbid,task.jobdirname)
354 task.myfile1=form.cleaned_data["file1"]
355 task.md_start=form.cleaned_data["md_start"]
356 task.md_pdbref=form.cleaned_data["md_pdbref"]
359 if task.md_start == "pdbstart" or task.md_pdbref:
360 seq,task.ssbond=from_pdb(task.myfile1)
361 task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
363 seq=seq_add_x(form.cleaned_data["md_seq"])
364 task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])
366 for i in range(0,len(seq),40):
367 task.md_seq=task.md_seq+seq[i:i+40]+" "
369 if task.md_start != "pdbstart":
372 task.md_seed=form.cleaned_data["md_seed"]
374 task.md_temp=form.cleaned_data["md_temp"]
375 task.md_nstep=form.cleaned_data["md_nstep"]
376 task.md_ntwe=form.cleaned_data["md_ntwe"]
377 task.md_ntwx=form.cleaned_data["md_ntwx"]
378 task.md_dt=form.cleaned_data["md_dt"]
379 task.md_lang=form.cleaned_data["md_lang"]
380 task.md_tau=form.cleaned_data["md_tau"]
381 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
382 task.md_mdpdb=form.cleaned_data["md_mdpdb"]
383 task.unres_ff=form.cleaned_data["unres_ff"]
384 task.md_respa=form.cleaned_data["md_respa"]
385 task.boxx=form.cleaned_data["boxx"]
386 task.boxy=form.cleaned_data["boxy"]
387 task.boxz=form.cleaned_data["boxz"]
393 if is_lazy_user(request.user):
394 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
398 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
399 form = TaskForm_md_a(initial=data)
401 p_type='molecular dynamics - advanced options'
402 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
405 def add_remd(request,task_id):
406 task = get_object_or_404(Task, id=task_id)
407 if request.method == 'POST':
408 if '_example' in request.POST:
409 data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
410 form = TaskForm_remd(initial=data)
412 form = TaskForm_remd(request.POST,request.FILES)
414 task.name=form.cleaned_data["name"]
416 task.md_start=form.cleaned_data["md_start"]
418 basename = str(task.owner)
419 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
420 task.jobdirname = "_".join([basename, suffix])
422 pdbid=form.cleaned_data["pdbid"]
424 task.myfile1=load_pdbid(pdbid,task.jobdirname)
427 task.myfile1=form.cleaned_data["file1"]
428 task.md_pdbref=form.cleaned_data["md_pdbref"]
429 task.md_ntwx=task.remd_nstex
432 if task.md_start == "pdbstart" or task.md_pdbref:
433 seq,task.ssbond=from_pdb(task.myfile1)
435 seq=seq_add_x(form.cleaned_data["md_seq"])
436 for i in range(0,len(seq),40):
437 task.md_seq=task.md_seq+seq[i:i+40]+" "
439 if task.md_start != "pdbstart":
442 task.md_seed=form.cleaned_data["md_seed"]
444 task.md_nstep=form.cleaned_data["md_nstep"]
451 if is_lazy_user(request.user):
452 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
456 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
457 form = TaskForm_remd(initial=data)
459 p_type='replica exchange molecular dynamics'
460 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
463 def add_remd_a(request,task_id):
464 from django.core.files.uploadedfile import UploadedFile
465 task = get_object_or_404(Task, id=task_id)
466 if request.method == 'POST':
467 if '_example' in request.POST:
468 data= {'name':task.name,'pdbid':'5G3Q:B','md_pdbref':True,
469 'md_nstep':2000000,'md_lang':'berendsen','unres_ff':'FF2','md_seed':-39912345,
470 'remd_cluter_temp':290,'md_2d':'--EEEEEEE------EEEEEE------EEEEEE------HHHHHHHHHHH---HHHHHHHHHHHHHHHHHHHHHHH---'}
471 form = TaskForm_remd_a(initial=data)
472 task.example='casp12'
474 elif '_example_saxs' in request.POST:
475 data= {'name':task.name,'pdbid':'5UJQ','md_pdbref':True,
476 'md_nstep':200000,'md_lang':'langevin','unres_ff':'FF2','md_seed':-39912345,
477 'remd_cluter_temp':270,
478 'scal_rad':4.0,'wsaxs':100.0,'saxs_data':
516 form = TaskForm_remd_a(initial=data)
518 form = TaskForm_remd_a(request.POST,request.FILES)
520 task.name=form.cleaned_data["name"]
523 basename = str(task.owner)
524 suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
525 task.jobdirname = "_".join([basename, suffix])
527 pdbid=form.cleaned_data["pdbid"]
529 task.myfile1=load_pdbid(pdbid,task.jobdirname)
532 task.myfile1=form.cleaned_data["file1"]
533 task.md_start=form.cleaned_data["md_start"]
534 task.md_pdbref=form.cleaned_data["md_pdbref"]
537 if task.md_start == "pdbstart" or task.md_pdbref:
538 seq,task.ssbond=from_pdb(task.myfile1)
539 task.md_2d=seq_2d_from_pdb(form.cleaned_data["md_2d"],seq)
541 seq=seq_add_x(form.cleaned_data["md_seq"])
542 task.md_2d=seq_2d_add_x(form.cleaned_data["md_2d"],seq,form.cleaned_data["md_seq"])
544 for i in range(0,len(seq),40):
545 task.md_seq=task.md_seq+seq[i:i+40]+" "
547 if task.md_start != "pdbstart":
550 task.md_seed=form.cleaned_data["md_seed"]
551 task.md_nstep=form.cleaned_data["md_nstep"]
552 task.md_dt=form.cleaned_data["md_dt"]
553 task.md_lang=form.cleaned_data["md_lang"]
554 task.md_tau=form.cleaned_data["md_tau"]
555 task.md_scal_fric=form.cleaned_data["md_scal_fric"]
556 task.min_maxfun=form.cleaned_data["min_maxfun"]
557 task.remd_nrep=form.cleaned_data["remd_nrep"]
558 task.remd_nstex=form.cleaned_data["remd_nstex"]
559 task.md_ntwx=form.cleaned_data["md_ntwx"]
560 task.md_ntwe=form.cleaned_data["md_ntwe"]
561 task.md_respa=form.cleaned_data["md_respa"]
562 # task.remd_traj1file=form.cleaned_data["remd_traj1file"]
563 # task.remd_rest1file=form.cleaned_data["remd_rest1file"]
565 task.boxx=form.cleaned_data["boxx"]
566 task.boxy=form.cleaned_data["boxy"]
567 task.boxz=form.cleaned_data["boxz"]
569 task.remd_cluter_temp=form.cleaned_data["remd_cluter_temp"]
570 task.unres_ff=form.cleaned_data["unres_ff"]
572 task.scal_rad = form.cleaned_data["scal_rad"]
573 task.saxs_data = form.cleaned_data["saxs_data"]
574 task.wsaxs = form.cleaned_data["wsaxs"]
577 return redirect('addmlist',task_id=task.id)
579 data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
580 form = TaskForm_remd_a(initial=data)
582 p_type='replica exchange molecular dynamics - advanced options'
583 return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
586 def addmlist(request,task_id):
587 task = get_object_or_404(Task, id=task_id)
588 if request.method == 'POST':
589 form = TaskForm_list(task.remd_nrep,request.POST)
591 task.remd_multi_t=form.cleaned_data["temperatures"]
592 task.remd_multi_m=form.cleaned_data["multiplexing"]
596 if is_lazy_user(request.user):
597 return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')
601 if task.example == 'casp12':
602 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
603 '["2", "2", "2", "2", "2", "2", "2", "2"]',
605 '["270", "280", "290", "300", "310", "320", "330", "340"]'
607 elif task.unres_ff == 'FF2':
608 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
609 '["1", "1", "1", "1", "1", "1", "1", "1"]',
611 '["270", "280", "290", "300", "310", "320", "330", "345"]'
614 data= {'name':task.name,'nrep':task.remd_nrep,'multiplexing':
615 '["1", "1", "1", "1", "1", "1", "1", "1"]',
617 '["250", "260", "270", "280", "290", "300", "315", "330"]'
620 form = TaskForm_list(task.remd_nrep,initial=data)
621 p_type='replica exchange molecular dynamics - advanced options'
622 return render(request, 'edit_lista.html', {'form': form, 'task':task, 'p_type':p_type})
625 def details(request,task_id):
626 task = get_object_or_404(Task, id=task_id)
627 return render(request, "details.html",{'task':task})
630 def details1(request,user_id,task_id):
631 task = get_object_or_404(Task, id=task_id)
632 return render(request, "details1.html",{'task':task})
636 def delete(request, task_id):
637 Task.objects.get(id=task_id).delete()
640 def refresh_done1(request, task_id):
641 task = get_object_or_404(Task, id=task_id)
645 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
648 for line in proc.stdout:
649 if 'piasek4' in line:
650 if line.split()[1]=='test_server':
652 if line.split()[-2]=='Q':
654 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
656 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
660 def refresh_done(request):
662 tasks = Task.objects.filter(owner=user).order_by('-created_date')
669 proc = subprocess.Popen('/opt/torque/bin/qstat', stdout=subprocess.PIPE)
672 for line in proc.stdout:
673 if 'piasek4' in line:
674 if line.split()[1]=='test_server':
676 if line.split()[-2]=='Q':
678 variable='Idle jobs='+str(nq)+' Total jobs='+str(njob)
680 if is_lazy_user(request.user):
681 return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
683 return render(request, "index.html", {
685 'variable' : variable,
690 def refresh_done0(task):
691 if os.path.isfile(task.jobdirname+'/finished') and not task.done:
694 with open(task.jobdirname+'/file.out_GB000', 'r') as f:
696 if task.type=='min' or task.type=='md':
700 task.etot=line.split()[1]
702 if 'RMS deviation' in line:
710 if 'Total wall' in line:
713 elif task.type=='remd':
715 text="Acceptance for replica exchanges and number of exchange attempts\n"
720 text=text+' '.join(line.split()[2:])+"\n"
721 if j==task.remd_nrep:
723 text="Acceptance for replica exchanges and number of exchange attempts\n"+' '.join(line.split()[2:])+"\n"
725 if 'Total wall' in line:
728 task.results_text=text
731 if task.md_pdbref and task.type=='remd':
735 with open(task.jobdirname+'/file_wham_T'+str(int(task.remd_cluter_temp))+'K_000'+str(i)+'.pdb', 'r') as f:
738 task.remd_model1='Cluster1 '+' '.join(line.split()[-3:])
740 task.remd_model2='Cluster2 '+' '.join(line.split()[-3:])
742 task.remd_model3='Cluster3 '+' '.join(line.split()[-3:])
744 task.remd_model4='Cluster4 '+' '.join(line.split()[-3:])
746 task.remd_model5='Cluster5 '+' '.join(line.split()[-3:])
747 except EnvironmentError:
748 print 'file_wham_T*pdb open error'
750 with open(task.jobdirname+'/tmscore'+str(i)+'.out', 'r') as f:
753 if 'RMSD of the common residues=' in line:
754 text=' RMSD='+line.split()[5]
755 if 'TM-score =' in line:
756 text=text+' TMscore='+line.split()[2]
757 if 'GDT-TS-score=' in line:
758 text=text+' GDT_TS='+line.split()[1]
761 task.remd_model1=task.remd_model1+text
763 task.remd_model2=task.remd_model2+text
765 task.remd_model3=task.remd_model3+text
767 task.remd_model4=task.remd_model4+text
769 task.remd_model5=task.remd_model5+text
773 if task.type=='remd':
774 with open(task.jobdirname+'/file_cluster_clust.out_000', 'r') as f:
777 if 'sumprob' in line:
784 task.remd_model1=task.remd_model1+' Cluster1 probability= '+line1.split()[2]
786 task.remd_model2=task.remd_model2+' Cluster2 probability= '+line1.split()[2]
788 task.remd_model3=task.remd_model3+' Cluster3 probability= '+line1.split()[2]
790 task.remd_model4=task.remd_model4+' Cluster4 probability= '+line1.split()[2]
792 task.remd_model5=task.remd_model5+' Cluster5 probability= '+line1.split()[2]
797 elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
798 if (task.type=='min'):
801 with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
806 last = line.split()[0]
809 task.running=int(1+int(last)*100.0/task.md_nstep)