bfbd0945fbde8d785b4f4abc321d6d8f27d4b0a5
[django_unres.git] / django_simple / todo / forms.py
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
7 import json
8 import urllib
9
10
11 class MultiWidgetBasic(forms.MultiWidget):
12     def __init__(self, count, attrs=None):
13         self.count=count
14         widgets = []
15         for i in range(self.count):
16            widgets.append(forms.TextInput())
17         super(MultiWidgetBasic, self).__init__(widgets, attrs)
18
19     template_name = 'multi.html'
20
21     def decompress(self, value):
22         if value:
23             return json.loads(value)
24         else:
25             return ['', '']
26
27
28 class MultiExampleField(forms.fields.MultiValueField):
29     def __init__(self, count, *args, **kwargs):
30         self.count=count
31         self.widget = MultiWidgetBasic(self.count)
32         list_fields = []
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)
36
37     def compress(self, values):
38         ## compress list to single object                                               
39         return json.dumps(values)
40
41
42 class TaskForm(forms.Form):
43     name = forms.CharField(max_length=20)
44
45
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'}),
52       label='or PDB code')                   
53
54      def clean(self):
55              cleaned_data = super(TaskForm_min, self).clean()
56
57              pdbid = cleaned_data.get("pdbid") 
58              file1 = cleaned_data.get("file1")
59               
60              if not pdbid and not file1:
61                 msg = 'provide pdb file or pdb code'
62                 self.add_error('file1', msg)
63               
64              if pdbid:
65                test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')     
66                if test.code != 200:
67                  msg = 'wrong pdb code'
68                  self.add_error('pdbid', msg)
69                test.close()
70             
71 class TaskForm_min_a(forms.Form):
72      name = forms.CharField(max_length=20)
73
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'}),
87       label='or PDB code')                   
88
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')
98
99      def clean(self):
100              cleaned_data = super(TaskForm_min_a, self).clean()
101
102              pdbid = cleaned_data.get("pdbid") 
103              file1 = cleaned_data.get("file1")
104               
105              if not pdbid and not file1:
106                 msg = 'provide pdb file or pdb code'
107                 self.add_error('file1', msg)
108               
109              if pdbid:
110                test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')     
111                if test.code != 200:
112                  msg = 'wrong pdb code'
113                  self.add_error('pdbid', msg)
114                test.close()
115
116
117 class TaskForm_md(forms.Form):
118      name = forms.CharField(max_length=20)
119
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',
125                      required=False,
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'}),
131       label='or 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')
139                   
140      def clean(self):
141              cleaned_data = super(TaskForm_md, self).clean()
142
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")
148               
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)
152
153              if md_pdbref and not (file1 or pdbid):
154                 msg = 'pdbref with no PDB file or code'
155                 self.add_error('file1', msg)
156
157
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)
161
162              if pdbid:
163                test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')     
164                if test.code != 200:
165                  msg = 'wrong pdb code'
166                  self.add_error('pdbid', msg)
167                test.close()
168
169                         
170 class TaskForm_md_a(forms.Form):
171      name = forms.CharField(max_length=20)
172
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',
180                      required=False,
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'}),
186       label='or 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')
194
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')
207
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')
214
215      def clean(self):
216              cleaned_data = super(TaskForm_md_a, self).clean()
217
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")
223               
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)
227
228              if md_pdbref and not (file1 or pdbid):
229                 msg = 'pdbref with no PDB file or code'
230                 self.add_error('file1', msg)
231
232
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)
236
237              if pdbid:
238                test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')     
239                if test.code != 200:
240                  msg = 'wrong pdb code'
241                  self.add_error('pdbid', msg)
242                test.close()
243
244
245 class TaskForm_remd(forms.Form):
246      name = forms.CharField(max_length=20)
247
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',
253                      required=False,
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'}),
259       label='or 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')
265                   
266      def clean(self):
267              cleaned_data = super(TaskForm_remd, self).clean()
268
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")
274               
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)
278
279              if md_pdbref and not (file1 or pdbid):
280                 msg = 'pdbref with no PDB file or code'
281                 self.add_error('file1', msg)
282
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)
286
287              if pdbid:
288                test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')     
289                if test.code != 200:
290                  msg = 'wrong pdb code'
291                  self.add_error('pdbid', msg)
292                test.close()
293
294                              
295 class TaskForm_remd_a(forms.Form):
296      name = forms.CharField(max_length=20)
297
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',
305                      required=False,
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'}),
311       label='or 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')
336
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')
343
344
345      def clean(self):
346              cleaned_data = super(TaskForm_remd_a, self).clean()
347
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")
353               
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)
357
358              if md_pdbref and not (file1 or pdbid):
359                 msg = 'pdbref with no PDB file or code'
360                 self.add_error('file1', msg)
361
362
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)
366
367              if pdbid:
368                test=urllib.urlopen('http://files.rcsb.org/download/'+pdbid+'.pdb')     
369                if test.code != 200:
370                  msg = 'wrong pdb code'
371                  self.add_error('pdbid', msg)
372                test.close()
373
374
375
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')
379
380     def __init__(self, count, *args, **kwargs):
381         super(TaskForm_list, self).__init__(*args, **kwargs)
382         self.count=count
383         self.fields['temperatures'] = MultiExampleField(self.count)
384         self.fields['multiplexing'] = MultiExampleField(self.count)        
385      
386
387