Rafal's code for NMR restraints
[django_unres.git] / django_simple / todo / jobfiles.py
1 import logging
2
3 from django.db.models.signals import post_save, post_delete
4 from django.dispatch import receiver
5 from .models import Task
6 import os
7 import shutil
8 import subprocess
9 import json
10 from string import Template
11 import textwrap
12
13 logging.basicConfig()
14 logger = logging.getLogger(__name__)
15
16 def seq_2d_xx(line,seq):
17    line=line.replace(" ","")
18    lista=list(line)
19    for ii in range(0,len(line)):
20     if seq[ii]=='X':
21       if ii>0:
22             lista[ii-1]='-'
23       if ii+1<len(line):
24             lista[ii+1]='-'
25    return("".join(lista)) 
26
27 def seq_2d_write(line):
28    line=line.replace(" ", "")
29    out='{:d}\n{:6.1f}\n'.format(len(line),50.0)
30    for i in range(1,4):
31      out=out+'{:5d}{:8.3f}{:8.3f}\n'.format(i,0.0,180.0)
32    for ii in range(1,len(line)-2):
33      i+=1
34      if line[ii:ii+2]=='HH':
35        out=out+'{:5d}{:8.3f}{:8.3f}\n'.format(i,50.0,20.0)
36      elif line[ii:ii+2]=='EE':
37        out=out+'{:5d}{:8.3f}{:8.3f}\n'.format(i,180.0,40.0)
38      else:
39        out=out+'{:5d}{:8.3f}{:8.3f}\n'.format(i,0.0,180.0)
40    return(out)
41
42 def seq_2d_write_50(line):
43    line=line.replace(" ", "")
44    out='{:d}\n'.format(len(line))
45    for i in range(1,4):
46      out=out+'{:5d}{:8.3f}{:8.3f}{:8.3f}\n'.format(i,0.0,180.0,50.0)
47    for ii in range(1,len(line)-2):
48      i+=1
49      if line[ii:ii+2]=='HH':
50        out=out+'{:5d}{:8.3f}{:8.3f}{:8.3f}\n'.format(i,50.0,20.0,50.0)
51      elif line[ii:ii+2]=='EE':
52        out=out+'{:5d}{:8.3f}{:8.3f}{:8.3f}\n'.format(i,180.0,40.0,50.0)
53      else:
54        out=out+'{:5d}{:8.3f}{:8.3f}{:8.3f}\n'.format(i,0.0,180.0,50.0)     
55    return(out)
56
57 def write_ssbond(ssbond):
58    list=[]
59    if ssbond!='':
60      ssbond=json.loads(ssbond)
61      for e in ssbond:
62            list.append(e[0])
63            list.append(e[1])
64      list_sorted=sorted(list)
65      
66    if len(list)>0:
67        return str(len(list))+' '+' '.join(map(str,list_sorted))+'\n'+\
68             str(len(ssbond))+' '+' '.join(map(str,list))+'\n'
69    else: 
70        return '0\n'
71
72
73 @receiver(post_save, sender=Task)
74 def write_on_task_save(sender, instance, **kwargs):
75    if instance.ready and not instance.done and instance.running==0 and instance.pbsjob=='':
76      if (not os.path.isdir(instance.jobdirname)):
77         os.mkdir(instance.jobdirname)
78 #     os.chdir(instance.jobdirname)
79  
80
81
82 #md=Template('nstep=$nstep ntwe=100  ntwx=100   dt=0.20 damax=10.0 lang=1'+
83 #   't_bath=300 reset_vel=0 respa ntime_split=1 maxtime_split=512 mdpdb')
84 #wrapper = textwrap.TextWrapper(width=70)
85 #word_list = wrapper.wrap(text=md.substitute(nstep=str(nstep)))
86
87      if  instance.unres_ff =='FF2':
88       w="""WSC=1.00000 WSCP=1.23315 WELEC=0.84476 WBOND=1.00000 WANG=0.62954              &
89 WSCLOC=0.10554 WTOR=1.34316 WTORD=1.26571 WCORRH=0.19212 WCORR5=0.00000        &
90 WCORR6=0.00000 WEL_LOC=0.37357 WTURN3=1.40323 WTURN4=0.64673 WTURN6=0.00000    &
91 WVDWPP=0.23173 WHPB=1.00000 WSCCOR=0.25                                        &
92 CUTOFF=7.00000 WCORR4=0.00000"""
93      elif  instance.unres_ff =='NEWCT-9P':
94       w="""WSC=0.81230 WSCP=1.20420 WELEC=0.87690 WBOND=1.00000 WANG=1.97730              &
95 WSCLOC=0.063657 WTOR=1.41540 WTORD=0.00000 WCORRH=0.00000 WCORR5=0.00000       &
96 WCORR6=0.00000 WEL_LOC=0.036638 WTURN3=1.45110 WTURN4=0.00000 WTURN6=0.00000   &
97 WSCCOR=0.00000 WVDWPP=0.33393 WHPB=1.00000 WSCP14=0.00000                      &
98 CUTOFF=7.00000 WCORR4=0.00000"""
99      else:
100       w="""WSC=0.82686 WSCP=0.96947 WELEC=0.79373 WBOND=1.00000 WANG=0.46542              &
101 WSCLOC=0.07969 WTOR=0.81684 WTORD=0.67806 WCORRH=0.00000 WCORR5=0.00000        &
102 WCORR6=0.00000 WEL_LOC=0.71100 WTURN3=2.30298 WTURN4=0.86517 WTURN6=0.00000    &
103 WSCCOR=0.14577 WVDWPP=0.17781 WHPB=1.00000 WSCP14=0.00000                      &
104 CUTOFF=7.00000 WCORR4=0.00000"""
105      
106
107      with open(instance.jobdirname+'/file.inp','w') as f:
108        f.write(instance.name + ' UNRES server job'+ '\n')
109
110        if instance.type == 'min' :
111
112           control_line = 'SEED='+str(instance.md_seed)+' ' \
113              + instance.min_choice \
114              + ' pdbstart pdbref ' \
115              + ' BOXX='+str(instance.boxx) \
116              + ' BOXY='+str(instance.boxy) \
117              + ' BOXZ='+str(instance.boxz) +' '
118           if not instance.min_overlap:
119             control_line = control_line+'overlap '
120           if not instance.min_searchsc:
121             control_line = control_line+'nosearchsc '
122           if instance.min_pdbout:
123             control_line = control_line+'pdbout '
124           if instance.min_unres_pdb:
125             control_line = control_line+'unres_pdb '
126           if instance.unres_ff =='NEWCT-9P':
127             control_line = control_line+'tormode=2 '
128             
129           type_line = 'print_min_ini print_min_res print_min_stat'\
130             +' MAXMIN='+str(instance.min_maxmin)\
131             +' MAXFUN='+str(instance.min_maxfun)
132            
133
134        seq=instance.md_seq.replace(" ","")
135        dimen3=len(seq)
136        if dimen3>1:
137           if seq[0]=='X':
138             dimen3-=1
139           if seq[-1]=='X':
140             dimen3-=1
141   
142        nogly ='CDSQKIPTFNHLRWAVEYMcdsqkiptfnhlrwaveym'
143        seq2 = ''.join([c for c in seq if c in nogly])
144   
145        dimen3=(dimen3+len(seq2))*3
146          
147             
148        if instance.type == 'md' :
149           control_line = 'SEED='+str(instance.md_seed)+' '\
150            +instance.md_start +' md one_letter'\
151            + ' BOXX='+str(instance.boxx) \
152            + ' BOXY='+str(instance.boxy) \
153            + ' BOXZ='+str(instance.boxz) +' '
154
155           if instance.md_pdbref:
156              control_line = control_line+'pdbref '
157              
158 #---v
159           if instance.use_nmr:
160             control_line = control_line+' constr_dist=12 '
161 #---^
162           if instance.unres_ff =='NEWCT-9P':
163             control_line = control_line+'tormode=2 cart'
164             
165           type_line = '        reset_vel=0'\
166              +' t_bath='+str(instance.md_temp)\
167              +' nstep='+str(instance.md_nstep)\
168              +' ntwe='+str(instance.md_ntwe)\
169              +' ntwx='+str(instance.md_ntwx)\
170              +' dt='+str(instance.md_dt)
171           if instance.md_lang == 'langevin':
172             type_line = type_line + ' lang=1 '
173             type_line = type_line + 'scal_fric='+str(instance.md_scal_fric)
174           if instance.md_lang == 'berendsen':
175             type_line = type_line + ' lang=0 tbf '
176             type_line = type_line + 'tau_bath='+str(instance.md_tau)
177           if instance.md_respa:
178             type_line = type_line + ' respa '
179           if instance.md_mdpdb:
180             type_line = type_line + ' mdpdb '
181
182        if instance.type == 'remd' or instance.type == 'dock':
183           control_line = 'SEED='+str(instance.md_seed)+' '\
184            +instance.md_start +' re one_letter'\
185            + ' BOXX='+str(instance.boxx) \
186            + ' BOXY='+str(instance.boxy) \
187            + ' BOXZ='+str(instance.boxz) +' '
188           
189           if instance.type == 'dock':
190              control_line = control_line+'CONSTR_HOMOL=24 '             
191            
192           if instance.md_pdbref:
193              control_line = control_line+'pdbref '
194              
195           if instance.unres_ff =='NEWCT-9P':
196             control_line = control_line+'tormode=2 cart'
197 #---v
198           if instance.use_nmr:
199             control_line = control_line+' constr_dist=12 '
200 #---^
201           
202           cntrl_saxs=''
203           if instance.saxs_data != '':
204              lines=instance.saxs_data.split('\n')
205              nsaxs=0
206              for line in lines:
207               if len(line.split())==2:
208                nsaxs+=1 
209              cntrl_saxs=' nsaxs='+str(nsaxs)+' scal_rad='+str(instance.scal_rad) 
210              control_line += cntrl_saxs             
211             
212           type_line = '        reset_vel='+ str(instance.remd_nstex)\
213              +' nstep='+str(instance.md_nstep)\
214              +' ntwe='+str(instance.md_ntwe)\
215              +' ntwx='+str(instance.md_ntwx)\
216              +' dt='+str(instance.md_dt)
217           if instance.md_lang == 'langevin':
218             type_line = type_line + ' lang=1 '
219             type_line = type_line + 'scal_fric='+str(instance.md_scal_fric)
220           if instance.md_lang == 'berendsen':
221             type_line = type_line + ' lang=0 tbf '
222             type_line = type_line + 'tau_bath='+str(instance.md_tau)
223           if instance.md_respa:
224             type_line = type_line + ' respa '
225 #          if instance.md_mdpdb:
226 #            type_line = type_line + ' mdpdb '
227           
228           type_line2 = 'nrep='+str(instance.remd_nrep) \
229              +' nstex='+str(instance.remd_nstex) \
230              +' tlist mlist sync nsyn='+str(instance.remd_nstex)\
231              +' traj1file  rest1file TRAJCACHE=200'
232
233        if instance.md_start == 'pdbstart':
234              type_line = type_line + ' preminim cart'
235
236        wrapper = textwrap.TextWrapper(width=70)
237
238        word_list = wrapper.wrap(text=control_line)
239        for element in word_list[:-1]:
240            f.write('{:79}'.format(element)+'&\n')
241        f.write(word_list[-1]+'\n')
242
243        word_list = wrapper.wrap(text=type_line)
244        for element in word_list[:-1]:
245            f.write('{:79}'.format(element)+'&\n')
246        f.write(word_list[-1]+'\n')
247           
248        if instance.md_start == 'pdbstart' and instance.unres_ff !='NEWCT-9P':
249         if instance.type == 'remd' or instance.type == 'dock':
250          f.write('print_min_ini print_min_res print_min_stat maxfun='+
251            str(instance.min_maxfun)+'\n')
252         else:
253          f.write('print_min_ini print_min_res print_min_stat\n')
254
255        
256        if instance.type == 'remd' or instance.type == 'dock':
257           word_list = wrapper.wrap(text=type_line2)
258           for element in word_list[:-1]:
259               f.write('{:79}'.format(element)+'&\n')
260           f.write(word_list[-1]+'\n')
261
262           tmp1=json.loads(instance.remd_multi_t)
263           string1=" "
264           word_list = wrapper.wrap(text=string1.join(tmp1))
265           for element in word_list[:-1]:
266               f.write('{:79}'.format(element)+'&\n')
267           f.write(word_list[-1]+'\n')
268
269           tmp1=json.loads(instance.remd_multi_m)
270           string1=" "
271           word_list = wrapper.wrap(text=string1.join(tmp1))
272           for element in word_list[:-1]:
273               f.write('{:79}'.format(element)+'&\n')
274           f.write(word_list[-1]+'\n')
275        
276        if instance.saxs_data != '':
277          w+=' wsaxs='+str(instance.wsaxs)
278        f.write(w+'\n')
279
280
281        if instance.type == 'min' or instance.md_start == 'pdbstart':
282           if instance.type == 'dock':
283             f.write('plik1ter.pdb\n')
284           else:  
285             f.write('plik.pdb\n')
286           f.write(write_ssbond(instance.ssbond))
287           if instance.md_2d == '':
288             f.write('0\n')
289           else:
290            if instance.unres_ff =='NEWCT-9P':
291             f.write(seq_2d_write_50(seq_2d_xx(instance.md_2d,seq)))
292            else:
293             f.write(seq_2d_write(seq_2d_xx(instance.md_2d,seq)))
294         
295        if instance.type == 'dock':
296           f.write('HOMOL_DIST=0.1    HOMOL_ANGLE=1.0 HOMOL_THETA=1.0 HOMOL_SCD=1.0 DIST_CUT=15.0  &\n')
297           f.write('READ2SIGMA START_FROM_MODELS\n')
298           for i in range(1,10):
299            f.write('model0'+str(i)+'.pdb\n')
300           for i in range(10,25):
301            f.write('model'+str(i)+'.pdb\n')
302
303        if instance.type == 'md' and instance.md_start != 'pdbstart':
304
305           if instance.md_pdbref:
306              f.write('plik.pdb\n')
307           f.write(str(len(seq))+'\n')
308           for i in range(0,len(seq),80):
309              f.write(seq[i:i+80]+'\n')
310           f.write('0\n')
311           if instance.md_2d == '':
312             f.write('0\n')
313           else:
314            if instance.unres_ff =='NEWCT-9P':
315             f.write(seq_2d_write_50(seq_2d_xx(instance.md_2d,seq)))
316            else:
317             f.write(seq_2d_write(seq_2d_xx(instance.md_2d,seq)))
318 #---v
319           if instance.use_nmr:
320             f.write('ndist='+repr(instance.linijek_nmr)+' restr_type=12 scal_peak=')
321             f.write(repr(instance.nmr_scal)+' fordepth_peak='+repr(instance.nmr_fordepth))
322             f.write(' slope_peak='+repr(instance.nmr_slope)+'\n')
323             if (instance.myfile3=='files/N1008_AmbiR-trunc.txt'):
324               fnmr = open(instance.jobdirname+'/../files/N1008_AmbiR-trunc.txt', 'r')
325               for linmr in fnmr:
326                    f.write(linmr)
327               fnmr.close()
328             else:
329               fnmr = open(instance.jobdirname+'/plik3.nmr', 'r')
330               for linmr in fnmr:
331                   f.write(linmr)
332               fnmr.close()
333 #---^
334
335
336        if instance.type == 'remd' and instance.md_start != 'pdbstart':
337
338           if instance.md_pdbref:
339              f.write('plik.pdb\n')             
340           f.write(str(len(seq))+'\n')
341           for i in range(0,len(seq),80):
342              f.write(seq[i:i+80]+'\n')
343           f.write('0\n')
344           if instance.md_2d == '':
345             f.write('0\n')
346           else:
347            if instance.unres_ff =='NEWCT-9P':
348             f.write(seq_2d_write_50(seq_2d_xx(instance.md_2d,seq)))
349            else:
350             f.write(seq_2d_write(seq_2d_xx(instance.md_2d,seq)))
351 #---v
352           if instance.use_nmr:
353             f.write('ndist='+repr(instance.linijek_nmr)+' restr_type=12 scal_peak=')
354             f.write(repr(instance.nmr_scal)+' fordepth_peak='+repr(instance.nmr_fordepth))
355             f.write(' slope_peak='+repr(instance.nmr_slope)+'\n')
356             if (instance.myfile3=='files/N1008_AmbiR-trunc.txt'):
357               fnmr = open(instance.jobdirname+'/../files/N1008_AmbiR-trunc.txt', 'r')
358               for linmr in fnmr:
359                    f.write(linmr)
360               fnmr.close()
361             else:
362               fnmr = open(instance.jobdirname+'/plik3.nmr', 'r')
363               for linmr in fnmr:
364                    f.write(linmr)
365               fnmr.close()
366 #---^
367
368
369        if instance.saxs_data != '':
370              lines=instance.saxs_data.split('\n')
371              for line in lines:
372               tmp=line.split()
373               if len(tmp)==2:
374                f.write(tmp[0]+' '+tmp[1]+'\n') 
375        
376         
377      if instance.type == 'min':
378       os.chdir(instance.jobdirname)
379       if  instance.unres_ff =='FF2':
380         shutil.copy('../files/pbs.csh','.')
381       elif instance.unres_ff =='NEWCT-9P':
382         shutil.copy('../files/pbs_newct-9p.csh','pbs.csh')
383       else:
384         shutil.copy('../files/pbs_new.csh','pbs.csh')
385       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
386       os.chdir('..')
387      elif instance.type == 'md':
388       os.chdir(instance.jobdirname)
389       if  instance.unres_ff =='FF2':
390         f1 = open('../files/pbs_md.csh', 'r')
391       elif instance.unres_ff =='NEWCT-9P':
392         f1 = open('../files/pbs_md_newct-9p.csh', 'r')
393       else:
394         f1 = open('../files/pbs_md_new.csh', 'r') 
395       f2 = open('pbs.csh', 'w')
396       for line in f1:
397            f2.write(line.replace('$dimen3',str(dimen3)+' '+str(instance.md_temp) ))
398       f1.close()
399       f2.close()  
400
401       f1 = open('file.seq', 'w')
402       for i in range(0,len(seq),80):
403              f1.write(seq[i:i+80]+'\n')
404       f1.write('\n')       
405       f1.close()
406
407       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)      
408       os.chdir('..')
409      else:
410 # instance.type == 'remd'
411       tmp1=json.loads(instance.remd_multi_m)
412       nreplicas=sum(map(int, tmp1))
413 # hardcoded for 4 core nodes with FGPROC=2
414       nodes=int(nreplicas*2/4)
415       reszta = nreplicas*2-nodes*4
416       if reszta == 0 :
417         pbs = '#PBS -l nodes='+str(nodes)+':ppn=4'
418       else:
419         pbs = '#PBS -l nodes='+str(nodes)+':ppn=4+1:ppn='+str(reszta)
420         
421       tmp_ss=''
422       if instance.ssbond!='':
423         ix=[]
424         ii=0
425         for i in range(0,len(seq)):
426            if seq[i]=='X':
427               ii=ii+1
428            ix.append(ii)
429         l=[]
430         ss=json.loads(instance.ssbond)
431         for e in ss:
432            l.append(e[0]-ix[e[0]])
433            l.append(e[1]-ix[e[1]])
434         tmp_ss=' '.join(map(str,l))
435
436       os.chdir(instance.jobdirname)
437       if  instance.unres_ff =='FF2':
438         f1 = open('../files/pbs8.csh', 'r')
439       elif instance.unres_ff =='NEWCT-9P':
440         f1 = open('../files/pbs8_newct-9p.csh', 'r')
441       else:
442         f1 = open('../files/pbs8_new.csh', 'r')
443       f2 = open('pbs8.csh', 'w')
444       for line in f1:
445           if '#PBS -l nodes=4:ppn=4' in line:
446            f2.write(line.replace('#PBS -l nodes=4:ppn=4', pbs))
447           elif '$ssbond' in line:
448            f2.write(line.replace('$ssbond',tmp_ss))
449           elif 'cd $PBS_O_WORKDIR' in line and instance.type == 'dock':
450             f2.write(line)
451             if instance.md_seq2 !='':
452              f2.write("""setenv FGPROCS 2
453 setenv POT GB
454 setenv PREFIX file2
455 setenv OUT1FILE YES
456 /users2/local/mpich2-1.4.1p1_intel/bin/mpirun -machinefile $PBS_NODEFILE -np 2 $UNRES_BIN
457 /users2/local/pulchra306/pulchra -q -g file2_MD000.pdb
458 cat file2_MD000.rebuilt.pdb |grep -v TER |grep -v END > tmp_plik2.pdb
459 /users2/local/mmtsb/perl/convpdb.pl -renumber 1 -out generic tmp_plik2.pdb > act.rebuilt.pdb
460 /users2/local/scwrl4/Scwrl4 -h -i act.rebuilt.pdb -o plik2.pdb
461 rm tmp_plik2.pdb act.rebuilt.pdb\n""")
462             if instance.dock_peptide:
463              f2.write('../files/generator_v13 plik.pdb plik2.pdb 1 \n')
464             else:
465              f2.write('../files/generator_v13 plik.pdb plik2.pdb 0 \n')
466             f2.write("sed '/END/q' plik.pdb |grep ATOM > plik1ter.pdb \n")
467             f2.write("echo TER >>  plik1ter.pdb \n")
468             f2.write("sed '/END/q' plik2.pdb |grep ATOM >> plik1ter.pdb \n")            
469           else:
470            tmp1=json.loads(instance.remd_multi_t)
471            f2.write(line.replace('$temperatures','"'+" ".join(tmp1)+'" '+str(nreplicas)))
472       f1.close()
473       f2.close()
474
475       f1 = open('file.seq', 'w')
476       for i in range(0,len(seq),80):
477              f1.write(seq[i:i+80]+'\n')
478       f1.write('\n')       
479       f1.close()
480       
481       os.chdir('..')  
482
483 # write wham & cluster input
484       with open(instance.jobdirname+'/file_wham.inp','w') as f:
485           if instance.md_nstep/instance.md_ntwx*nreplicas<=8000:
486               isampl=1
487           else:
488               isampl=int(instance.md_nstep/instance.md_ntwx*nreplicas/8000)
489 #---v
490           if instance.use_nmr:
491                f.write('{:79}'.format('with_dist_constr constr_dist=12')+'&\n')
492 #---^
493           f.write('{:79}'.format(' isampl='+str(isampl))+'&\n')
494           if instance.md_pdbref:
495             f.write('{:79}'.format('SEED='+str(instance.md_seed)+
496                ' einicheck=1 rescale=2 delta=0.02 cxfile classify')+'&\n')
497           else:    
498             f.write('{:79}'.format('SEED='+str(instance.md_seed)+
499               ' einicheck=1 rescale=2 delta=0.02 cxfile')+'&\n')
500           if instance.md_2d != '':
501                f.write('{:79}'.format(' WITH_DIHED_CONSTR')+'&\n')
502           if instance.type == 'dock':
503                f.write('{:79}'.format(' n_ene=19 CONSTR_HOMOL=24')+'&\n')
504           if instance.unres_ff =='NEWCT-9P':
505                f.write('{:79}'.format('tormode=2 ')+'&\n')
506           f.write('BOXX='+str(instance.boxx)+' BOXY='+str(instance.boxy)+
507                     ' BOXZ='+str(instance.boxz)+cntrl_saxs +'\n')
508                  
509           f.write('nres='+str(len(seq))+' one_letter\n')
510           for i in range(0,len(seq),80):
511              f.write(seq[i:i+80]+'\n')
512
513           f.write(write_ssbond(instance.ssbond))
514
515 #---v
516           if instance.use_nmr:
517             f.write('ndist='+repr(instance.linijek_nmr)+' restr_type=12 scal_peak=')
518             f.write(repr(instance.nmr_scal)+' fordepth_peak='+repr(instance.nmr_fordepth))
519             f.write(' slope_peak='+repr(instance.nmr_slope)+'\n')
520             if (instance.myfile3=='files/N1008_AmbiR-trunc.txt'):
521               fnmr = open(instance.jobdirname+'/../files/N1008_AmbiR-trunc.txt', 'r')
522               for linmr in fnmr:
523                    f.write(linmr)
524               fnmr.close()
525             else:
526               fnmr = open(instance.jobdirname+'/plik3.nmr', 'r')
527               for linmr in fnmr:
528                    f.write(linmr)
529               fnmr.close()
530 #---^
531
532           if instance.type == 'dock':
533             f.write('HOMOL_DIST=0.1    HOMOL_ANGLE=1.0 HOMOL_THETA=1.0 HOMOL_SCD=1.0 DIST_CUT=15.0  &\n')
534             f.write('READ2SIGMA \n')
535             for i in range(1,10):
536               f.write('model0'+str(i)+'.pdb\n')
537             for i in range(10,25):
538               f.write('model'+str(i)+'.pdb\n')
539
540           if instance.md_2d != '':
541              f.write(seq_2d_write_50(seq_2d_xx(instance.md_2d,seq)))
542
543           if instance.saxs_data != '':
544              saxs_r=[]
545              saxs_P=[]
546              saxs_norm=0
547              r_last=None
548              fsaxs = open(instance.jobdirname+'/saxs.data', 'w')
549              lines=instance.saxs_data.split('\n')
550              for line in lines:
551               tmp=line.split()
552               if len(tmp)==2:
553                f.write(tmp[0]+' '+tmp[1]+'\n')
554                saxs_r.append(tmp[0])
555                saxs_P.append(float(tmp[1]))
556                if r_last==None:
557                   r_last=float(tmp[0])
558                else:
559                   saxs_norm += float(tmp[1])*(float(tmp[0])-r_last)
560                   r_last=float(tmp[0])
561              for r,p in zip(saxs_r,saxs_P):
562                fsaxs.write('{} {}\n'.format(r,p/saxs_norm)) 
563              fsaxs.close()
564
565           f.write(w+'\n')
566           f.write('\n')
567           f.write('nt='+str(instance.remd_nrep)+' replica read_iset\n')
568           tmp1=json.loads(instance.remd_multi_t)
569           for element in tmp1:
570               f.write('nr=1 temp='+element+' fi=0.0 0.0 0.0 0.0 0.0\n')
571               f.write('kh= 0.0 Q0=0.0\n')
572           rec=instance.md_nstep/instance.md_ntwx
573           f.write('nfile_cx=1 rec_start='+str(rec/10)
574                   +' rec_end='+str(rec)+' totraj='+str(nreplicas)+'\n')
575           f.write('file_MD000\n')
576           if instance.md_pdbref:
577              f.write('pdbref\n')
578              if instance.type == 'dock':
579               f.write('plik1ter.pdb\n')
580              else:
581               f.write('plik.pdb\n')
582
583            
584       with open(instance.jobdirname+'/file_cluster.inp','w') as f:
585           f.write(instance.name + ' UNRES server job'+ '\n')
586           f.write('{:79}'.format('nres='+str(len(seq))
587              +' one_letter rescale=2 PRINT_CART PDBOUT=1 iopt=1'
588              +' temper='+str(instance.remd_cluter_temp)
589              +' nclust='+str(instance.remd_cluster_n))+'&\n')
590           if instance.md_2d != '':
591                f.write('{:79}'.format(' WITH_DIHED_CONSTR')+'&\n')
592 #---v
593           if instance.use_nmr:
594             f.write('{:79}'.format('constr_dist=12 ')+'&\n')
595 #---^
596           if instance.type == 'dock':
597                f.write('{:79}'.format(' CONSTR_HOMOL=24')+'&\n')
598           if instance.unres_ff =='NEWCT-9P':
599                f.write('{:79}'.format('tormode=2 ')+'&\n')
600           f.write('BOXX='+str(instance.boxx)+' BOXY='+str(instance.boxy)+
601                   ' BOXZ='+str(instance.boxz)+cntrl_saxs +'\n')
602           f.write(w+'\n')
603           for i in range(0,len(seq),80):
604              f.write(seq[i:i+80]+'\n')
605           f.write(write_ssbond(instance.ssbond))
606
607 #---v
608           if instance.use_nmr:
609             f.write('ndist='+repr(instance.linijek_nmr)+' restr_type=12 scal_peak=')
610             f.write(repr(instance.nmr_scal)+' fordepth_peak='+repr(instance.nmr_fordepth))
611             f.write(' slope_peak='+repr(instance.nmr_slope)+'\n')
612             if (instance.myfile3=='files/N1008_AmbiR-trunc.txt'):
613               fnmr = open(instance.jobdirname+'/../files/N1008_AmbiR-trunc.txt', 'r')
614               for linmr in fnmr:
615                    f.write(linmr)
616               fnmr.close()
617             else:
618               fnmr = open(instance.jobdirname+'/plik3.nmr', 'r')
619               for linmr in fnmr:
620                    f.write(linmr)
621               fnmr.close()
622 #---^
623
624           if instance.type == 'dock':
625             f.write('HOMOL_DIST=0.1    HOMOL_ANGLE=1.0 HOMOL_THETA=1.0 HOMOL_SCD=1.0 DIST_CUT=15.0  &\n')
626             f.write('READ2SIGMA \n')
627             for i in range(1,10):
628               f.write('model0'+str(i)+'.pdb\n')
629             for i in range(10,25):
630               f.write('model'+str(i)+'.pdb\n')
631           if instance.md_2d != '':
632              f.write(seq_2d_write_50(seq_2d_xx(instance.md_2d,seq)))
633           if instance.saxs_data != '':
634              lines=instance.saxs_data.split('\n')
635              for line in lines:
636               tmp=line.split()
637               if len(tmp)==2:
638                f.write(tmp[0]+' '+tmp[1]+'\n') 
639       
640       if instance.type == 'dock' and instance.md_seq2 != '':
641          with open(instance.jobdirname+'/file2.inp','w') as f:
642            f.write(instance.name + ' chain2 random start'+ '\n')
643            control_line = 'SEED='+str(instance.md_seed)+' '\
644             +'rand_conf md one_letter'\
645             + ' BOXX=1000 BOXY=1000 BOXZ=1000 '
646            
647            if instance.unres_ff =='NEWCT-9P':
648              control_line = control_line+'tormode=2 cart'
649            
650            type_line = '        reset_vel=0'\
651              +' t_bath=300'\
652              +' nstep=100000'\
653              +' ntwe=10000'\
654              +' ntwx=100000'\
655              +' dt=0.2 lang=1 scal_fric=0.02 respa mdpdb '
656
657            wrapper = textwrap.TextWrapper(width=70)
658            word_list = wrapper.wrap(text=control_line)
659            for element in word_list[:-1]:
660              f.write('{:79}'.format(element)+'&\n')
661            f.write(word_list[-1]+'\n')
662
663            word_list = wrapper.wrap(text=type_line)
664            for element in word_list[:-1]:
665              f.write('{:79}'.format(element)+'&\n')
666            f.write(word_list[-1]+'\n')
667            
668            f.write(w+'\n')
669            
670            seq=instance.md_seq2.replace(" ","")
671            f.write(str(len(seq))+'\n')
672            for i in range(0,len(seq),80):
673              f.write(seq[i:i+80]+'\n')
674            f.write('0\n')
675            f.write('0\n')
676           
677       
678       os.chdir(instance.jobdirname)  
679       ret_code = subprocess.Popen(' /opt/torque/bin/qsub pbs8.csh', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
680       os.chdir('..')
681       
682      output = str(ret_code.communicate()[0])
683      output=output.strip()
684      if output=='':
685        output='error'
686      logger.warning("PBS \"%s\" " % output)
687      instance.pbsjob = output
688      instance.save()
689      
690 #     print ret_code.stdout.readlines()
691      logger.warning("Dir \"%s\" has been saved." % instance.jobdirname)
692      
693 @receiver(post_delete, sender=Task)
694 def delete_on_task_del(sender, instance, **kwargs):     
695    if instance.jobdirname:
696       if os.path.isdir(instance.jobdirname):
697          if not instance.done:
698            ret_code_qdel = subprocess.Popen(' /opt/torque/bin/qdel '+str(instance.pbsjob), shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
699            output = str(ret_code_qdel.communicate()[0])
700            output=output.strip()
701            logger.warning("PBS qdel \"%s\" " % instance.pbsjob)
702            logger.warning("QDEL \"%s\" " % output)
703          shutil.rmtree(instance.jobdirname)
704          logger.warning("Dir \"%s\" has been rm." % instance.jobdirname)         
705