1 from django import forms
2 from .models import Task
3 from .models import MIN_CHOICE
4 from .models import MD_START
5 from .models import MD_LANG
6 from .models import FF_CHOICE
13 line2 = ''.join([c for c in line if c in set])
15 msg='use only H,E,C or - letters'
18 def pdb_missing_res(file):
23 if line[0:6] == 'ATOM ' and line[13:15] == 'CA':
25 if ires and i==ires[-1]:
27 if newchain or i==ires[-1]+1:
31 msg = 'chain breaks between residues '+\
32 str(ires[-1])+' and '+str(i)+\
33 ', server cannot add missing residues to PDB file - please repair the structure using e.g. Modeller'
35 if line[0:3] == 'TER':
37 if line[0:3] == 'END':
42 class MultiWidgetBasic(forms.MultiWidget):
43 def __init__(self, count, attrs=None):
46 for i in range(self.count):
47 widgets.append(forms.TextInput())
48 super(MultiWidgetBasic, self).__init__(widgets, attrs)
50 template_name = 'multi.html'
52 def decompress(self, value):
54 return json.loads(value)
59 class MultiExampleField(forms.fields.MultiValueField):
60 def __init__(self, count, *args, **kwargs):
62 self.widget = MultiWidgetBasic(self.count)
64 for i in range(self.count):
65 list_fields.append(forms.fields.CharField(max_length=15))
66 super(MultiExampleField, self).__init__(list_fields, *args, **kwargs)
68 def compress(self, values):
69 ## compress list to single object
70 return json.dumps(values)
73 class TaskForm(forms.Form):
74 name = forms.CharField(max_length=20)
77 class TaskForm_min(forms.Form):
78 name = forms.CharField(max_length=20)
79 file1 = forms.FileField(label='Upload a PDB file',required=False,
80 help_text='continuous (without breaks) protein chains,use TER to divide chains')
81 pdbid = forms.CharField(min_length=4,max_length=4,required=False,
82 widget=forms.TextInput(attrs={'size':4, 'maxlength':4, 'title':'PDB code'}),
86 cleaned_data = super(TaskForm_min, self).clean()
88 pdbid = cleaned_data.get("pdbid")
89 file1 = cleaned_data.get("file1")
91 if not pdbid and not file1:
92 msg = 'provide pdb file or pdb code'
93 self.add_error('file1', msg)
96 test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
98 msg = 'wrong pdb code'
99 self.add_error('pdbid', msg)
101 msg=pdb_missing_res(test)
103 self.add_error('pdbid',msg)
107 msg=pdb_missing_res(file1)
109 self.add_error('file1',msg)
112 class TaskForm_min_a(forms.Form):
113 name = forms.CharField(max_length=20)
115 unres_ff = forms.ChoiceField(choices=FF_CHOICE,widget=forms.RadioSelect,
116 label='Force Field',initial='FF2')
117 # min_choice = forms.ChoiceField(choices=MIN_CHOICE,label='minimization algorithm')
118 min_overlap = forms.BooleanField(required=False,label='remove overlap')
119 min_searchsc = forms.BooleanField(required=False,label='MC for sidechain overlap')
120 min_maxmin = forms.IntegerField(label='MAXMIN',initial=10000,
121 help_text='maximum number of iterations')
122 min_maxfun = forms.IntegerField(label='MAXFUN',initial=15000,
123 help_text='maximum number of function evaluations')
124 file1 = forms.FileField(label='Upload a PDB file',required=False,
125 help_text='continuous (without breaks) protein chains,use TER to divide chains')
126 pdbid = forms.CharField(min_length=4,max_length=4,required=False,
127 widget=forms.TextInput(attrs={'size':4, 'maxlength':4, 'title':'PDB code'}),
130 min_unres_pdb = forms.BooleanField(required=False,label='uploaded input unres PDB',
131 help_text='(CA and CB atoms only, CB represents SC in UNRES)')
132 min_pdbout = forms.BooleanField(required=False,label='output PDB',initial='true')
133 boxx = forms.FloatField(label='Box X',initial=1000.0,
134 help_text='box x dimension')
135 boxy = forms.FloatField(label='Box Y',initial=1000.0,
136 help_text='box y dimension')
137 boxz = forms.FloatField(label='Box Z',initial=1000.0,
138 help_text='box z dimension')
141 cleaned_data = super(TaskForm_min_a, self).clean()
143 pdbid = cleaned_data.get("pdbid")
144 file1 = cleaned_data.get("file1")
146 if not pdbid and not file1:
147 msg = 'provide pdb file or pdb code'
148 self.add_error('file1', msg)
151 test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
153 msg = 'wrong pdb code'
154 self.add_error('pdbid', msg)
156 msg=pdb_missing_res(test)
158 self.add_error('pdbid',msg)
162 msg=pdb_missing_res(file1)
164 self.add_error('file1',msg)
167 class TaskForm_md(forms.Form):
168 name = forms.CharField(max_length=20)
170 md_start = forms.ChoiceField(choices=MD_START,widget=forms.RadioSelect,
171 label='starting structure',initial='extconf')
172 md_seq = forms.CharField(label='Sequence',
173 help_text='aminoacid sequence using one letter code<br>'+
174 'field is ignored when uploading starting/reference PDB file',
176 widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
177 file1 = forms.FileField(label='Upload a PDB file',required=False,
178 help_text='starting structure for pdbstart/reference structure')
179 pdbid = forms.CharField(min_length=4,max_length=4,required=False,
180 widget=forms.TextInput(attrs={'size':4, 'maxlength':4, 'title':'PDB code'}),
182 md_pdbref = forms.BooleanField(required=False,label='PDB reference structure')
183 md_temp = forms.FloatField(label='temperature',initial=300,
184 help_text='bath temperature')
185 md_nstep = forms.IntegerField(label='NSTEP',initial=200000,
186 help_text='total number of steps')
187 md_seed = forms.IntegerField(label='SEED',initial=-39912345,
188 help_text='seed for random number generator')
191 cleaned_data = super(TaskForm_md, self).clean()
193 md_start = cleaned_data.get("md_start")
194 file1 = cleaned_data.get("file1")
195 pdbid = cleaned_data.get("pdbid")
196 md_seq = cleaned_data.get("md_seq")
197 md_pdbref = cleaned_data.get("md_pdbref")
199 if md_start == 'pdbstart' and not (file1 or pdbid):
200 msg = 'pdbstart with no PDB file or code'
201 self.add_error('file1', msg)
203 if md_pdbref and not (file1 or pdbid):
204 msg = 'pdbref with no PDB file or code'
205 self.add_error('file1', msg)
208 if md_start != 'pdbstart' and not md_pdbref and not md_seq:
209 msg = 'extended/random chain with no sequence'
210 self.add_error('md_seq', msg)
213 test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
215 msg = 'wrong pdb code'
216 self.add_error('pdbid', msg)
218 msg=pdb_missing_res(test)
220 self.add_error('pdbid',msg)
224 msg=pdb_missing_res(file1)
226 self.add_error('file1',msg)
229 class TaskForm_md_a(forms.Form):
230 name = forms.CharField(max_length=20)
232 unres_ff = forms.ChoiceField(choices=FF_CHOICE,widget=forms.RadioSelect,
233 label='Force Field',initial='FF2')
234 md_start = forms.ChoiceField(choices=MD_START,widget=forms.RadioSelect,
235 label='starting structure',initial='extconf')
236 md_seq = forms.CharField(label='Sequence',
237 help_text='aminoacid sequence using one letter code<br>'+
238 'field is ignored when uploading starting/reference PDB file',
240 widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
241 md_2d = forms.CharField(label='Secondary structure restraints',
242 help_text='single letter code: H - helix, E - extended/beta, C or - no restraints',
244 widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
246 file1 = forms.FileField(label='Upload a PDB file',required=False,
247 help_text='starting structure for pdbstart/reference structure')
248 pdbid = forms.CharField(min_length=4,max_length=4,required=False,
249 widget=forms.TextInput(attrs={'size':4, 'maxlength':4, 'title':'PDB code'}),
251 md_pdbref = forms.BooleanField(required=False,label='PDB reference structure')
252 md_temp = forms.FloatField(label='temperature',initial=300,
253 help_text='bath temperature')
254 md_nstep = forms.IntegerField(label='NSTEP',initial=200000,
255 help_text='total number of steps')
256 md_seed = forms.IntegerField(label='SEED',initial=-39912345,
257 help_text='seed for random number generator')
259 md_ntwe = forms.IntegerField(label='NTWE',initial=1000,
260 help_text='write statfile every ntwe steps')
261 md_ntwx = forms.IntegerField(label='NTWX',initial=1000,
262 help_text='write trajectory every ntwe steps')
263 md_dt = forms.FloatField(label='DT',initial=0.2,
264 help_text='time step [mtu=48.9 fs]')
265 md_lang = forms.ChoiceField(choices=MD_LANG,label='thermostat')
266 md_tau = forms.FloatField(label='tau_bath',initial=1.0,
267 help_text='coupling to the thermal bath (Berendsen)')
268 md_scal_fric = forms.FloatField(label='scal_froc',initial=0.02,
269 help_text='scaling of the friction coefficients (Langevin)')
270 md_respa = forms.BooleanField(required=False,initial=True,label='RESPA')
271 md_mdpdb = forms.BooleanField(required=False,label='trajectory as PDB')
273 boxx = forms.FloatField(label='Box X',initial=1000.0,
274 help_text='box x dimension')
275 boxy = forms.FloatField(label='Box Y',initial=1000.0,
276 help_text='box y dimension')
277 boxz = forms.FloatField(label='Box Z',initial=1000.0,
278 help_text='box z dimension')
281 cleaned_data = super(TaskForm_md_a, self).clean()
283 md_start = cleaned_data.get("md_start")
284 file1 = cleaned_data.get("file1")
285 pdbid = cleaned_data.get("pdbid")
286 md_seq = cleaned_data.get("md_seq")
287 md_pdbref = cleaned_data.get("md_pdbref")
288 md_2d = cleaned_data.get("md_2d")
290 if md_start == 'pdbstart' and not (file1 or pdbid):
291 msg = 'pdbstart with no PDB file or code'
292 self.add_error('file1', msg)
294 if md_pdbref and not (file1 or pdbid):
295 msg = 'pdbref with no PDB file or code'
296 self.add_error('file1', msg)
299 if md_start != 'pdbstart' and not md_pdbref and not md_seq:
300 msg = 'extended/random chain with no sequence'
301 self.add_error('md_seq', msg)
304 test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
306 msg = 'wrong pdb code'
307 self.add_error('pdbid', msg)
309 msg=pdb_missing_res(test)
311 self.add_error('pdbid',msg)
315 msg=pdb_missing_res(file1)
317 self.add_error('file1',msg)
322 self.add_error('md_2d',msg)
324 class TaskForm_remd(forms.Form):
325 name = forms.CharField(max_length=20)
327 md_start = forms.ChoiceField(choices=MD_START,widget=forms.RadioSelect,
328 label='starting structure',initial='extconf')
329 md_seq = forms.CharField(label='Sequence',
330 help_text='aminoacid sequence using one letter code<br>'+
331 'field is ignored when uploading starting/reference PDB file',
333 widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
334 file1 = forms.FileField(label='Upload a PDB file',required=False,
335 help_text='starting structure for pdbstart/reference structure')
336 pdbid = forms.CharField(min_length=4,max_length=4,required=False,
337 widget=forms.TextInput(attrs={'size':4, 'maxlength':4, 'title':'PDB code'}),
339 md_pdbref = forms.BooleanField(required=False,label='PDB reference structure')
340 md_nstep = forms.IntegerField(label='NSTEP',initial=200000,
341 help_text='total number of steps')
342 md_seed = forms.IntegerField(label='SEED',initial=-39912345,
343 help_text='seed for random number generator')
346 cleaned_data = super(TaskForm_remd, self).clean()
348 md_start = cleaned_data.get("md_start")
349 file1 = cleaned_data.get("file1")
350 pdbid = cleaned_data.get("pdbid")
351 md_seq = cleaned_data.get("md_seq")
352 md_pdbref = cleaned_data.get("md_pdbref")
354 if md_start == 'pdbstart' and not (file1 or pdbid):
355 msg = 'pdbstart with no PDB file or code'
356 self.add_error('file1', msg)
358 if md_pdbref and not (file1 or pdbid):
359 msg = 'pdbref with no PDB file or code'
360 self.add_error('file1', msg)
362 if md_start != 'pdbstart' and not md_pdbref and not md_seq:
363 msg = 'extended/random chain with no sequence'
364 self.add_error('md_seq', msg)
367 test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
369 msg = 'wrong pdb code'
370 self.add_error('pdbid', msg)
372 msg=pdb_missing_res(test)
374 self.add_error('pdbid',msg)
378 msg=pdb_missing_res(file1)
380 self.add_error('file1',msg)
383 class TaskForm_remd_a(forms.Form):
384 name = forms.CharField(max_length=20)
386 unres_ff = forms.ChoiceField(choices=FF_CHOICE,widget=forms.RadioSelect,
387 label='Force Field',initial='FF2')
388 md_start = forms.ChoiceField(choices=MD_START,widget=forms.RadioSelect,
389 label='starting structure',initial='extconf')
390 md_seq = forms.CharField(label='Sequence',
391 help_text='aminoacid sequence using one letter code<br>'+
392 'field is ignored when uploading starting/reference PDB file',
394 widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
395 md_2d = forms.CharField(label='Secondary structure restraints',
396 help_text='single letter code: H - helix, E - extended/beta, C or - no restraints',
398 widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
399 file1 = forms.FileField(label='Upload a PDB file',required=False,
400 help_text='starting structure for pdbstart/reference structure')
401 pdbid = forms.CharField(min_length=4,max_length=4,required=False,
402 widget=forms.TextInput(attrs={'size':4, 'maxlength':4, 'title':'PDB code'}),
404 md_pdbref = forms.BooleanField(required=False,label='PDB reference structure')
405 md_nstep = forms.IntegerField(label='NSTEP',initial=200000,
406 help_text='total number of steps')
407 md_seed = forms.IntegerField(label='SEED',initial=-39912345,
408 help_text='seed for random number generator')
409 md_ntwe = forms.IntegerField(label='NTWE',initial=1000,
410 help_text='write statfile every ntwe steps')
411 md_dt = forms.FloatField(label='DT',initial=0.2,
412 help_text='time step [mtu = 48.9 fs]')
413 md_lang = forms.ChoiceField(choices=MD_LANG,label='thermostat')
414 md_tau = forms.FloatField(label='tau_bath',initial=1.0,
415 help_text='coupling to the thermal bath (Berendsen)')
416 md_scal_fric = forms.FloatField(label='scal_froc',initial=0.02,
417 help_text='scaling of the friction coefficients (Langevin)')
418 remd_nrep = forms.IntegerField(label='NREP',initial=8,
419 help_text='number of replicas')
420 remd_nstex = forms.IntegerField(label='NSTEX',initial=1000,
421 help_text='exchange and write trajectory every nstex steps')
422 md_ntwx = forms.IntegerField(label='NTWX',initial=1000,
423 help_text='write trajectory every ntwx steps')
424 remd_cluter_temp = forms.FloatField(label='TEMPER',
425 help_text='temperature for cluster analysis',initial=280)
426 # remd_traj1file = forms.BooleanField(required=False,label='single trajectory file',initial='true')
427 # remd_rest1file = forms.BooleanField(required=False,label='single restart file',initial='true')
429 md_respa = forms.BooleanField(required=False,initial=True,label='RESPA')
431 boxx = forms.FloatField(label='Box X',initial=1000.0,
432 help_text='box x dimension')
433 boxy = forms.FloatField(label='Box Y',initial=1000.0,
434 help_text='box y dimension')
435 boxz = forms.FloatField(label='Box Z',initial=1000.0,
436 help_text='box z dimension')
439 wsaxs = forms.FloatField(label='SAXS weight',initial=100.0,
440 help_text='weight for SAXS restraint term')
441 scal_rad = forms.FloatField(label='Scal_rad (SAXS)',initial=1.0,
442 help_text='downscaling factor of residue radii used in SAXS restraints')
443 saxs_data = forms.CharField(label='P(r) SAXS data',
444 help_text='distance distribution from SAXS, two columns: r and P(r)',
446 widget=forms.Textarea(attrs={'cols': 25, 'rows': 20}))
450 cleaned_data = super(TaskForm_remd_a, self).clean()
452 md_start = cleaned_data.get("md_start")
453 file1 = cleaned_data.get("file1")
454 pdbid = cleaned_data.get("pdbid")
455 md_seq = cleaned_data.get("md_seq")
456 md_pdbref = cleaned_data.get("md_pdbref")
457 md_2d = cleaned_data.get("md_2d")
459 if md_start == 'pdbstart' and not (file1 or pdbid):
460 msg = 'pdbstart with no PDB file or code'
461 self.add_error('file1', msg)
463 if md_pdbref and not (file1 or pdbid):
464 msg = 'pdbref with no PDB file or code'
465 self.add_error('file1', msg)
468 if md_start != 'pdbstart' and not md_pdbref and not md_seq:
469 msg = 'extended/random chain with no sequence'
470 self.add_error('md_seq', msg)
473 test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
475 msg = 'wrong pdb code'
476 self.add_error('pdbid', msg)
478 msg=pdb_missing_res(test)
480 self.add_error('pdbid',msg)
484 msg=pdb_missing_res(file1)
486 self.add_error('file1',msg)
491 self.add_error('md_2d',msg)
495 class TaskForm_list(forms.Form):
496 name = forms.CharField(max_length=20,disabled=True,required=False)
497 nrep = forms.IntegerField(disabled=True,required=False,label='NREP')
499 def __init__(self, count, *args, **kwargs):
500 super(TaskForm_list, self).__init__(*args, **kwargs)
502 self.fields['temperatures'] = MultiExampleField(self.count)
503 self.fields['multiplexing'] = MultiExampleField(self.count)