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