restart for lazyuser details1
[django_unres.git] / django_simple / todo / views.py
index 118de52..e1ac2b0 100644 (file)
@@ -30,23 +30,26 @@ res_codes = [
 
 three_to_one = dict(res_codes)
 
-def load_pdbid(pdbid,dirname):
-    os.mkdir(dirname)
+def load_pdbid(pdbid,dirname,filename='plik.pdb'):
+    if (not os.path.isdir(dirname)):
+       os.mkdir(dirname)
     if len(pdbid)==4:
        file,header=urllib.urlretrieve('http://files.rcsb.org/download/'+pdbid+'.pdb',
-                     dirname+'/plik.pdb')     
+                     dirname+'/'+filename)     
     else:
        chain=pdbid[5]
        pdbid=pdbid[:4]
        pdb_tmp=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
-       with open(dirname+'/plik.pdb', 'w') as outfile:
+       with open(dirname+'/'+filename, 'w') as outfile:
         for line in pdb_tmp:
           if line[0:6] == 'SSBOND' and line[15] == chain and line[29] == chain:
             outfile.write(line)
           if line[0:6] == 'ATOM  ' and line[21] == chain:
             outfile.write(line)
+          if line[0:6] == 'ENDMDL':
+            break
        pdb_tmp.close()
-       file=dirname+'/plik.pdb'
+       file=dirname+'/'+filename
        
     return(file)
 
@@ -289,6 +292,7 @@ def add_md(request,task_id):
              task.md_start=form.cleaned_data["md_start"]
              task.md_temp=form.cleaned_data["md_temp"]
              task.md_nstep=form.cleaned_data["md_nstep"]
+             task.md_total_steps=task.md_nstep
 
              basename = str(task.owner)
              suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
@@ -316,6 +320,7 @@ def add_md(request,task_id):
 
              if any(c.islower() for c in seq):
               task.md_respa=False
+              task.damino=True
 
              task.ready=True
              
@@ -376,6 +381,7 @@ def add_md_a(request,task_id):
 
              task.md_temp=form.cleaned_data["md_temp"]
              task.md_nstep=form.cleaned_data["md_nstep"]
+             task.md_total_steps=task.md_nstep
              task.md_ntwe=form.cleaned_data["md_ntwe"]
              task.md_ntwx=form.cleaned_data["md_ntwx"]
              task.md_dt=form.cleaned_data["md_dt"]
@@ -387,6 +393,7 @@ def add_md_a(request,task_id):
              task.md_respa=form.cleaned_data["md_respa"]             
              if any(c.islower() for c in seq):
               task.md_respa=False
+              task.damino=True
              task.boxx=form.cleaned_data["boxx"]
              task.boxy=form.cleaned_data["boxy"]             
              task.boxz=form.cleaned_data["boxz"]             
@@ -447,9 +454,11 @@ def add_remd(request,task_id):
              task.md_seed=form.cleaned_data["md_seed"]
 
              task.md_nstep=form.cleaned_data["md_nstep"]
+             task.md_total_steps=task.md_nstep
 
              if any(c.islower() for c in seq):
               task.md_respa=False
+              task.damino=True
 
 
              task.ready=True
@@ -663,6 +672,7 @@ def add_remd_a(request,task_id):
 
              task.md_seed=form.cleaned_data["md_seed"]
              task.md_nstep=form.cleaned_data["md_nstep"]
+             task.md_total_steps=task.md_nstep
              task.md_dt=form.cleaned_data["md_dt"]
              task.md_lang=form.cleaned_data["md_lang"]
              task.md_tau=form.cleaned_data["md_tau"]
@@ -675,6 +685,7 @@ def add_remd_a(request,task_id):
              task.md_respa=form.cleaned_data["md_respa"]
              if any(c.islower() for c in seq):
               task.md_respa=False
+              task.damino=True
              
 #             task.remd_traj1file=form.cleaned_data["remd_traj1file"]
 #             task.remd_rest1file=form.cleaned_data["remd_rest1file"]
@@ -700,6 +711,146 @@ def add_remd_a(request,task_id):
     return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
 
 @login_required
+def add_dock(request,task_id):
+    task = get_object_or_404(Task, id=task_id)
+    if request.method == 'POST':
+     if '_example' in request.POST:
+        data= {'name':task.name,'pdbid':'1L2Y','md_seed':-39912345}
+        form = TaskForm_dock(initial=data)     
+     else:
+        form = TaskForm_dock(request.POST,request.FILES)
+        if form.is_valid():
+             task.name=form.cleaned_data["name"]
+             task.type="dock"
+
+             basename = str(task.owner)
+             suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
+             task.jobdirname = "_".join([basename, suffix])
+
+             pdbid=form.cleaned_data["pdbid"]
+             if pdbid:
+              task.myfile1=load_pdbid(pdbid,task.jobdirname)
+              task.pdbcode=pdbid
+             else:
+              task.myfile1=form.cleaned_data["file1"]
+
+             pdbid2=form.cleaned_data["pdbid2"]
+             if pdbid2:
+              task.myfile2=load_pdbid(pdbid2,task.jobdirname,'plik2.pdb')
+              task.pdbcode2=pdbid2
+             else:
+              task.myfile2=form.cleaned_data["file2"]
+
+             task.md_ntwx=task.remd_nstex 
+             task.md_start="pdbstart"
+             task.md_pdbref=True
+             task.md_respa=False
+             task.ssbond=""
+
+             task.md_seq=""
+
+             seq1,ssbond1=from_pdb(task.myfile1)
+             seq2,ssbond2=from_pdb(task.myfile2)
+             
+             if seq1[-1]=='X' and seq2[0]=='X':
+              seq=seq1+seq2
+             elif seq1[-1]!='X' and seq2[0]!='X':
+              seq=seq1+'XX'+seq2
+             else:
+              seq=seq1+'X'+seq2
+             
+             for i in range(0,len(seq),40):
+                task.md_seq=task.md_seq+seq[i:i+40]+" "
+
+             task.md_seed=form.cleaned_data["md_seed"]
+
+             task.md_nstep=form.cleaned_data["md_nstep"]
+
+             if any(c.islower() for c in seq):
+              task.md_respa=False
+              task.damino=True
+
+
+             task.ready=True
+             
+             
+             task.save()
+             if is_lazy_user(request.user):
+              return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
+             else:
+              return redirect('/')
+    else:
+        data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
+        form = TaskForm_dock(initial=data)
+    basic_adv=True
+    p_type='docking'
+    return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
+
+@login_required
+def add_dock_a(request,task_id):
+    task = get_object_or_404(Task, id=task_id)
+    if request.method == 'POST':
+     if '_example' in request.POST:
+        data= {'name':task.name,'pdbid':'1L2Y','md_pdbref':True,'md_seed':-39912345}
+        form = TaskForm_remd(initial=data)     
+     else:
+        form = TaskForm_remd(request.POST,request.FILES)
+        if form.is_valid():
+             task.name=form.cleaned_data["name"]
+             task.type="remd"
+             task.md_start=form.cleaned_data["md_start"]
+
+             basename = str(task.owner)
+             suffix = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
+             task.jobdirname = "_".join([basename, suffix])
+
+             pdbid=form.cleaned_data["pdbid"]
+             if pdbid:
+              task.myfile1=load_pdbid(pdbid,task.jobdirname)
+              task.pdbcode=pdbid
+             else:
+              task.myfile1=form.cleaned_data["file1"]
+             task.md_pdbref=form.cleaned_data["md_pdbref"]
+             task.md_ntwx=task.remd_nstex 
+
+             task.md_seq=""
+             if task.md_start == "pdbstart" or task.md_pdbref:
+               seq,task.ssbond=from_pdb(task.myfile1)
+             else:
+               seq=seq_add_x(form.cleaned_data["md_seq"])
+             for i in range(0,len(seq),40):
+                task.md_seq=task.md_seq+seq[i:i+40]+" "
+
+             if task.md_start != "pdbstart":
+                task.ssbond=''
+
+             task.md_seed=form.cleaned_data["md_seed"]
+
+             task.md_nstep=form.cleaned_data["md_nstep"]
+
+             if any(c.islower() for c in seq):
+              task.md_respa=False
+              task.damino=True
+
+
+             task.ready=True
+             
+             
+             task.save()
+             if is_lazy_user(request.user):
+              return redirect('/details1/'+str(task.owner)+'/'+str(task.id)+'/')             
+             else:
+              return redirect('/')
+    else:
+        data= {'name':task.name,'md_seed':-random.randint(10000000,99999999)}
+        form = TaskForm_remd(initial=data)
+    basic_adv=False
+    p_type='docking - advanced options'
+    return render(request, 'edit.html', {'form': form, 'task':task, 'basic_adv':basic_adv, 'p_type':p_type})
+
+
+
+@login_required
 def addmlist(request,task_id):
     task = get_object_or_404(Task, id=task_id)
     if request.method == 'POST':
@@ -753,6 +904,54 @@ def details1(request,user_id,task_id):
 def delete(request, task_id):
     Task.objects.get(id=task_id).delete()
     return redirect('/')
+    
+@login_required
+def restart(request, task_id):
+    task = get_object_or_404(Task, id=task_id)
+    restart0(task)
+    return redirect('/')
+    
+def restart0(task):    
+    if os.path.isfile(task.jobdirname+'/finished'):    
+      os.remove(task.jobdirname+'/finished')
+    task.running =1
+    task.done=False
+    task.md_total_steps = task.md_total_steps+task.md_nstep
+    task.save()
+    if task.type == 'md':
+      os.chdir(task.jobdirname)
+      ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
+      os.chdir('..')
+    elif task.type == 'remd':
+      os.chdir(task.jobdirname)
+      tmp1=json.loads(task.remd_multi_m)
+      nreplicas=sum(map(int, tmp1))
+      with open('file_wham.inp','r') as f1, open ('file_wham.tmp','w') as f2:
+        for line in f1:
+          if 'rec_end=' in line:
+            rec=task.md_total_steps/task.md_ntwx
+            f2.write('nfile_cx=1 rec_start='+str(rec/10)
+               +' rec_end='+str(rec)+' totraj='+str(nreplicas)+'\n')
+          elif 'isampl=' in line:
+            if task.md_total_steps/task.md_ntwx*nreplicas<=8000:
+                isampl=1
+            else:
+                isampl=int(task.md_total_steps/task.md_ntwx*nreplicas/8000)
+            f2.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
+          else:
+            f2.write(line)
+      os.remove('file_wham.inp')
+      os.rename('file_wham.tmp','file_wham.inp')
+      ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)            
+      os.chdir('..')
+    return
+
+def restart1(request, user_id, task_id):
+    task = get_object_or_404(Task, id=task_id)
+    user = task.owner
+    restart0(task)
+    return redirect('/details1/'+str(user)+'/'+str(task.id)+'/')
+    
 
 def refresh_done1(request, task_id):
     task = get_object_or_404(Task, id=task_id)
@@ -827,7 +1026,7 @@ def refresh_done0(task):
                if 'Total wall' in line:
                   text=text+line
                   
-           elif task.type=='remd':
+           elif task.type=='remd' or task.type=='dock':
              j=0
              text="Acceptance for replica exchanges and number of exchange attempts\n"
              for line in f:
@@ -914,6 +1113,20 @@ def refresh_done0(task):
       elif os.path.isfile(task.jobdirname+'/file_GB000.stat') and not task.done:
          if (task.type=='min'):
            task.running =1
+           with open(task.jobdirname+'/file.out_GB000', 'r') as f:
+              line=''
+              for line in f:
+                pass
+              if line != '':
+                last = line.split()[0]
+              else:
+                last = 0
+           try:
+              task.running=int(1+int(last)*100.0/task.min_maxmin)
+           except:
+              pass
+           if task.running>100:
+              task.running=100
          else:
            with open(task.jobdirname+'/file_GB000.stat', 'r') as f:
               line=''