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
11 class MultiWidgetBasic(forms.MultiWidget):
12 def __init__(self, count, attrs=None):
15 for i in range(self.count):
16 widgets.append(forms.TextInput())
17 super(MultiWidgetBasic, self).__init__(widgets, attrs)
19 template_name = 'multi.html'
21 def decompress(self, value):
23 return json.loads(value)
28 class MultiExampleField(forms.fields.MultiValueField):
29 def __init__(self, count, *args, **kwargs):
31 self.widget = MultiWidgetBasic(self.count)
33 for i in range(self.count):
34 list_fields.append(forms.fields.CharField(max_length=15))
35 super(MultiExampleField, self).__init__(list_fields, *args, **kwargs)
37 def compress(self, values):
38 ## compress list to single object
39 return json.dumps(values)
42 class TaskForm(forms.Form):
43 name = forms.CharField(max_length=20)
46 class TaskForm_min(forms.Form):
47 name = forms.CharField(max_length=20)
48 file1 = forms.FileField(label='Upload a PDB file',required=False,
49 help_text='continuous (without breaks) protein chains,use TER to divide chains')
50 pdbid = forms.CharField(min_length=4,max_length=4,required=False,
51 widget=forms.TextInput(attrs={'size':4, 'maxlength':4, 'title':'PDB code'}),
55 cleaned_data = super(TaskForm_min, self).clean()
57 pdbid = cleaned_data.get("pdbid")
58 file1 = cleaned_data.get("file1")
60 if not pdbid and not file1:
61 msg = 'provide pdb file or pdb code'
62 self.add_error('file1', msg)
65 test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
67 msg = 'wrong pdb code'
68 self.add_error('pdbid', msg)
71 class TaskForm_min_a(forms.Form):
72 name = forms.CharField(max_length=20)
74 unres_ff = forms.ChoiceField(choices=FF_CHOICE,widget=forms.RadioSelect,
75 label='Force Field',initial='E0LL2Y')
76 min_choice = forms.ChoiceField(choices=MIN_CHOICE,label='minimization algorithm')
77 min_overlap = forms.BooleanField(required=False,label='remove overlap')
78 min_searchsc = forms.BooleanField(required=False,label='MC for sidechain overlap')
79 min_maxmin = forms.IntegerField(label='MAXMIN',initial=10000,
80 help_text='maximum number of iterations')
81 min_maxfun = forms.IntegerField(label='MAXFUN',initial=15000,
82 help_text='maximum number of function evaluations')
83 file1 = forms.FileField(label='Upload a PDB file',required=False,
84 help_text='continuous (without breaks) protein chains,use TER to divide chains')
85 pdbid = forms.CharField(min_length=4,max_length=4,required=False,
86 widget=forms.TextInput(attrs={'size':4, 'maxlength':4, 'title':'PDB code'}),
89 min_unres_pdb = forms.BooleanField(required=False,label='uploaded input unres PDB',
90 help_text='(CA and CB atoms only, CB represents SC in UNRES)')
91 min_pdbout = forms.BooleanField(required=False,label='output PDB',initial='true')
92 boxx = forms.FloatField(label='Box X',initial=1000.0,
93 help_text='box x dimension')
94 boxy = forms.FloatField(label='Box Y',initial=1000.0,
95 help_text='box y dimension')
96 boxz = forms.FloatField(label='Box Z',initial=1000.0,
97 help_text='box z dimension')
100 cleaned_data = super(TaskForm_min_a, self).clean()
102 pdbid = cleaned_data.get("pdbid")
103 file1 = cleaned_data.get("file1")
105 if not pdbid and not file1:
106 msg = 'provide pdb file or pdb code'
107 self.add_error('file1', msg)
110 test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
112 msg = 'wrong pdb code'
113 self.add_error('pdbid', msg)
117 class TaskForm_md(forms.Form):
118 name = forms.CharField(max_length=20)
120 md_start = forms.ChoiceField(choices=MD_START,widget=forms.RadioSelect,
121 label='starting structure',initial='extconf')
122 md_seq = forms.CharField(label='Sequence',
123 help_text='aminoacid sequence using one letter code<br>'+
124 'field is ignored when uploading starting/reference PDB file',
126 widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
127 file1 = forms.FileField(label='Upload a PDB file',required=False,
128 help_text='starting structure for pdbstart/reference structure')
129 pdbid = forms.CharField(min_length=4,max_length=4,required=False,
130 widget=forms.TextInput(attrs={'size':4, 'maxlength':4, 'title':'PDB code'}),
132 md_pdbref = forms.BooleanField(required=False,label='PDB reference structure')
133 md_temp = forms.FloatField(label='temperature',initial=300,
134 help_text='bath temperature')
135 md_nstep = forms.IntegerField(label='NSTEP',initial=200000,
136 help_text='total number of steps')
137 md_seed = forms.IntegerField(label='SEED',initial=-39912345,
138 help_text='seed for random number generator')
141 cleaned_data = super(TaskForm_md, self).clean()
143 md_start = cleaned_data.get("md_start")
144 file1 = cleaned_data.get("file1")
145 pdbid = cleaned_data.get("pdbid")
146 md_seq = cleaned_data.get("md_seq")
147 md_pdbref = cleaned_data.get("md_pdbref")
149 if md_start == 'pdbstart' and not (file1 or pdbid):
150 msg = 'pdbstart with no PDB file or code'
151 self.add_error('file1', msg)
153 if md_pdbref and not (file1 or pdbid):
154 msg = 'pdbref with no PDB file or code'
155 self.add_error('file1', msg)
158 if md_start != 'pdbstart' and not md_pdbref and not md_seq:
159 msg = 'extended/random chain with no sequence'
160 self.add_error('md_seq', msg)
163 test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
165 msg = 'wrong pdb code'
166 self.add_error('pdbid', msg)
170 class TaskForm_md_a(forms.Form):
171 name = forms.CharField(max_length=20)
173 unres_ff = forms.ChoiceField(choices=FF_CHOICE,widget=forms.RadioSelect,
174 label='Force Field',initial='E0LL2Y')
175 md_start = forms.ChoiceField(choices=MD_START,widget=forms.RadioSelect,
176 label='starting structure',initial='extconf')
177 md_seq = forms.CharField(label='Sequence',
178 help_text='aminoacid sequence using one letter code<br>'+
179 'field is ignored when uploading starting/reference PDB file',
181 widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
182 file1 = forms.FileField(label='Upload a PDB file',required=False,
183 help_text='starting structure for pdbstart/reference structure')
184 pdbid = forms.CharField(min_length=4,max_length=4,required=False,
185 widget=forms.TextInput(attrs={'size':4, 'maxlength':4, 'title':'PDB code'}),
187 md_pdbref = forms.BooleanField(required=False,label='PDB reference structure')
188 md_temp = forms.FloatField(label='temperature',initial=300,
189 help_text='bath temperature')
190 md_nstep = forms.IntegerField(label='NSTEP',initial=200000,
191 help_text='total number of steps')
192 md_seed = forms.IntegerField(label='SEED',initial=-39912345,
193 help_text='seed for random number generator')
195 md_ntwe = forms.IntegerField(label='NTWE',initial=1000,
196 help_text='write statfile every ntwe steps')
197 md_ntwx = forms.IntegerField(label='NTWX',initial=1000,
198 help_text='write trajectory every ntwe steps')
199 md_dt = forms.FloatField(label='DT',initial=0.2,
200 help_text='time step [mtu]')
201 md_lang = forms.ChoiceField(choices=MD_LANG,label='thermostat')
202 md_tau = forms.FloatField(label='tau_bath',initial=1.0,
203 help_text='coupling to the thermal bath (Berendsen)')
204 md_scal_fric = forms.FloatField(label='scal_froc',initial=0.02,
205 help_text='scaling of the friction coefficients (Langevin)')
206 md_mdpdb = forms.BooleanField(required=False,label='trajectory as PDB')
208 boxx = forms.FloatField(label='Box X',initial=1000.0,
209 help_text='box x dimension')
210 boxy = forms.FloatField(label='Box Y',initial=1000.0,
211 help_text='box y dimension')
212 boxz = forms.FloatField(label='Box Z',initial=1000.0,
213 help_text='box z dimension')
216 cleaned_data = super(TaskForm_md_a, self).clean()
218 md_start = cleaned_data.get("md_start")
219 file1 = cleaned_data.get("file1")
220 pdbid = cleaned_data.get("pdbid")
221 md_seq = cleaned_data.get("md_seq")
222 md_pdbref = cleaned_data.get("md_pdbref")
224 if md_start == 'pdbstart' and not (file1 or pdbid):
225 msg = 'pdbstart with no PDB file or code'
226 self.add_error('file1', msg)
228 if md_pdbref and not (file1 or pdbid):
229 msg = 'pdbref with no PDB file or code'
230 self.add_error('file1', msg)
233 if md_start != 'pdbstart' and not md_pdbref and not md_seq:
234 msg = 'extended/random chain with no sequence'
235 self.add_error('md_seq', msg)
238 test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
240 msg = 'wrong pdb code'
241 self.add_error('pdbid', msg)
245 class TaskForm_remd(forms.Form):
246 name = forms.CharField(max_length=20)
248 md_start = forms.ChoiceField(choices=MD_START,widget=forms.RadioSelect,
249 label='starting structure',initial='extconf')
250 md_seq = forms.CharField(label='Sequence',
251 help_text='aminoacid sequence using one letter code<br>'+
252 'field is ignored when uploading starting/reference PDB file',
254 widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
255 file1 = forms.FileField(label='Upload a PDB file',required=False,
256 help_text='starting structure for pdbstart/reference structure')
257 pdbid = forms.CharField(min_length=4,max_length=4,required=False,
258 widget=forms.TextInput(attrs={'size':4, 'maxlength':4, 'title':'PDB code'}),
260 md_pdbref = forms.BooleanField(required=False,label='PDB reference structure')
261 md_nstep = forms.IntegerField(label='NSTEP',initial=200000,
262 help_text='total number of steps')
263 md_seed = forms.IntegerField(label='SEED',initial=-39912345,
264 help_text='seed for random number generator')
267 cleaned_data = super(TaskForm_remd, self).clean()
269 md_start = cleaned_data.get("md_start")
270 file1 = cleaned_data.get("file1")
271 pdbid = cleaned_data.get("pdbid")
272 md_seq = cleaned_data.get("md_seq")
273 md_pdbref = cleaned_data.get("md_pdbref")
275 if md_start == 'pdbstart' and not (file1 or pdbid):
276 msg = 'pdbstart with no PDB file or code'
277 self.add_error('file1', msg)
279 if md_pdbref and not (file1 or pdbid):
280 msg = 'pdbref with no PDB file or code'
281 self.add_error('file1', msg)
283 if md_start != 'pdbstart' and not md_pdbref and not md_seq:
284 msg = 'extended/random chain with no sequence'
285 self.add_error('md_seq', msg)
288 test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
290 msg = 'wrong pdb code'
291 self.add_error('pdbid', msg)
295 class TaskForm_remd_a(forms.Form):
296 name = forms.CharField(max_length=20)
298 unres_ff = forms.ChoiceField(choices=FF_CHOICE,widget=forms.RadioSelect,
299 label='Force Field',initial='E0LL2Y')
300 md_start = forms.ChoiceField(choices=MD_START,widget=forms.RadioSelect,
301 label='starting structure',initial='extconf')
302 md_seq = forms.CharField(label='Sequence',
303 help_text='aminoacid sequence using one letter code<br>'+
304 'field is ignored when uploading starting/reference PDB file',
306 widget=forms.Textarea(attrs={'cols': 70, 'rows': 2}))
307 file1 = forms.FileField(label='Upload a PDB file',required=False,
308 help_text='starting structure for pdbstart/reference structure')
309 pdbid = forms.CharField(min_length=4,max_length=4,required=False,
310 widget=forms.TextInput(attrs={'size':4, 'maxlength':4, 'title':'PDB code'}),
312 md_pdbref = forms.BooleanField(required=False,label='PDB reference structure')
313 md_nstep = forms.IntegerField(label='NSTEP',initial=200000,
314 help_text='total number of steps')
315 md_seed = forms.IntegerField(label='SEED',initial=-39912345,
316 help_text='seed for random number generator')
317 md_ntwe = forms.IntegerField(label='NTWE',initial=1000,
318 help_text='write statfile every ntwe steps')
319 md_dt = forms.FloatField(label='DT',initial=0.2,
320 help_text='time step [mtu]')
321 md_lang = forms.ChoiceField(choices=MD_LANG,label='thermostat')
322 md_tau = forms.FloatField(label='tau_bath',initial=1.0,
323 help_text='coupling to the thermal bath (Berendsen)')
324 md_scal_fric = forms.FloatField(label='scal_froc',initial=0.02,
325 help_text='scaling of the friction coefficients (Langevin)')
326 remd_nrep = forms.IntegerField(label='NREP',initial=8,
327 help_text='number of replicas')
328 remd_nstex = forms.IntegerField(label='NSTEX',initial=1000,
329 help_text='exchange and write trajectory every nstex steps')
330 md_ntwx = forms.IntegerField(label='NTWX',initial=1000,
331 help_text='write trajectory every ntwx steps')
332 remd_cluter_temp = forms.FloatField(label='TEMPER',
333 help_text='temperature for cluster analysis',initial=280)
334 # remd_traj1file = forms.BooleanField(required=False,label='single trajectory file',initial='true')
335 # remd_rest1file = forms.BooleanField(required=False,label='single restart file',initial='true')
337 boxx = forms.FloatField(label='Box X',initial=1000.0,
338 help_text='box x dimension')
339 boxy = forms.FloatField(label='Box Y',initial=1000.0,
340 help_text='box y dimension')
341 boxz = forms.FloatField(label='Box Z',initial=1000.0,
342 help_text='box z dimension')
346 cleaned_data = super(TaskForm_remd_a, 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)
363 if md_start != 'pdbstart' and not md_pdbref and not md_seq:
364 msg = 'extended/random chain with no sequence'
365 self.add_error('md_seq', msg)
368 test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')
370 msg = 'wrong pdb code'
371 self.add_error('pdbid', msg)
376 class TaskForm_list(forms.Form):
377 name = forms.CharField(max_length=20,disabled=True,required=False)
378 nrep = forms.IntegerField(disabled=True,required=False,label='NREP')
380 def __init__(self, count, *args, **kwargs):
381 super(TaskForm_list, self).__init__(*args, **kwargs)
383 self.fields['temperatures'] = MultiExampleField(self.count)
384 self.fields['multiplexing'] = MultiExampleField(self.count)