UltraScan III
us_predict2.cpp
Go to the documentation of this file.
1 #include "us_predict2.h"
3 #include "us_gui_settings.h"
4 #include "us_constants.h"
5 #include "us_model.h"
6 #include "us_buffer_gui.h"
7 #include "us_analyte_gui.h"
8 #include "us_constants.h"
9 #include "us_solution_gui.h"
10 #include "us_choice.h"
11 
13 {
14  model = SED_DIFF;
15 
16  d.density = DENS_20W;
19  d.vbar = d.vbar20;
20 
21  setWindowTitle( tr( "Predict f and axial ratios for 4 basic shapes" ) );
22  setPalette( US_GuiSettings::frameColor() );
23 
24  QGridLayout* main = new QGridLayout( this );
25  main->setSpacing ( 2 );
26  main->setContentsMargins ( 2, 2, 2, 2 );
27 
28  int row = 0;
29 
30  QGridLayout* controls = new QGridLayout;
31  int c_row = 0;
32 
33  QLabel* lb_density = us_label( tr( "Density (20w)" ) );
34  controls->addWidget( lb_density, c_row, 0 );
35 
37  le_density->setText( QString::number( DENS_20W, 'f', 4 ) );
38  us_setReadOnly( le_density, true );
39  controls->addWidget( le_density, c_row++, 1 );
40 
41  QLabel* lb_viscosity = us_label( tr( "Viscosity (20w)" ) );
42  controls->addWidget( lb_viscosity, c_row, 0 );
43 
45  le_viscosity->setText( QString::number( VISC_20W , 'f', 4 ) );
47  controls->addWidget( le_viscosity, c_row++, 1 );
48 
49  QPushButton* pb_vbar = us_pushbutton( tr( "vbar (20 " ) + DEGC + ")" );
50  connect( pb_vbar, SIGNAL( clicked() ), SLOT( get_peptide() ) );
51  controls->addWidget( pb_vbar, c_row, 0 );
52 
53  le_vbar = us_lineedit();
54  le_vbar->setText( QString::number( TYPICAL_VBAR, 'f', 4 ) );
55  connect( le_vbar, SIGNAL( textChanged( const QString& ) ),
56  SLOT ( vbar ( const QString& ) ) );
57  controls->addWidget( le_vbar, c_row++, 1 );
58 
59  QLabel* lb_temperature = us_label( tr( "Temperature (" ) + DEGC + "):" );
60  controls->addWidget( lb_temperature, c_row, 0 );
61 
62  QLineEdit* le_temperature = us_lineedit();
63  le_temperature->setText( QString::number( NORMAL_TEMP, 'f', 1 ) );
64  us_setReadOnly( le_temperature, true );
65  controls->addWidget( le_temperature, c_row++, 1 );
66 
67  QLabel* lb_info = us_label( tr( "Select a Parameter Combination:" ) );
68  controls->addWidget( lb_info, c_row++, 0, 1, 2 );
69 
70  lb_param1 = us_label( tr( "Sed. Coefficient:" ) );
71  controls->addWidget( lb_param1, c_row, 0 );
72 
74  connect( le_param1, SIGNAL( textChanged ( const QString& ) ),
75  SLOT ( update_param1( const QString& ) ) );
76  controls->addWidget( le_param1, c_row++, 1 );
77 
78  lb_param2 = us_label( tr( "Diff. Coefficient:" ) );
79  controls->addWidget( lb_param2, c_row, 0 );
80 
82  connect( le_param2, SIGNAL( textChanged ( const QString& ) ),
83  SLOT ( update_param2( const QString& ) ) );
84  controls->addWidget( le_param2, c_row++, 1 );
85 
86  main->addLayout( controls, row, 0, 7, 1 );
87 
88  // Labels
89  QLabel* lb_model = us_label( tr( "Model:" ) );
90  main->addWidget( lb_model, row, 2 );
91 
92  QLabel* lb_a = us_label( tr( "a (<span>&Aring;</span>)" ) );
93  lb_a->setAlignment( Qt::AlignCenter );
94  main->addWidget( lb_a, row, 3 );
95 
96  QLabel* lb_b = us_label( tr( "b (<span>&Aring;</span>)" ) );
97  lb_b->setAlignment( Qt::AlignCenter );
98  main->addWidget( lb_b, row, 4 );
99 
100  QLabel* lb_ab = us_label( tr( "a/b" ) );
101  lb_ab->setAlignment( Qt::AlignCenter );
102  main->addWidget( lb_ab, row++, 5 );
103 
104  // Prolate
105  QLabel* lb_prolate = us_label( tr( "Prolate:" ) );
106  main->addWidget( lb_prolate, row, 2 );
107 
109  us_setReadOnly( le_prolate_a, true );
110  main->addWidget( le_prolate_a, row, 3 );
111 
113  us_setReadOnly( le_prolate_b, true );
114  main->addWidget( le_prolate_a, row, 3 );
115  main->addWidget( le_prolate_b, row, 4 );
116 
118  us_setReadOnly( le_prolate_ab, true );
119  main->addWidget( le_prolate_ab, row++, 5 );
120 
121  // Oblage
122  QLabel* lb_oblate = us_label( tr( "Oblate:" ) );
123  main->addWidget( lb_oblate, row, 2 );
124 
126  us_setReadOnly( le_oblate_a, true );
127  main->addWidget( le_oblate_a, row, 3 );
128 
130  us_setReadOnly( le_oblate_b, true );
131  main->addWidget( le_oblate_b, row, 4 );
132 
134  us_setReadOnly( le_oblate_ab, true );
135  main->addWidget( le_oblate_ab, row++, 5 );
136 
137  // Long Rod
138  QLabel* lb_rod = us_label( tr( "Long Rod:" ) );
139  main->addWidget( lb_rod, row, 2 );
140 
141  le_rod_a = us_lineedit();
142  us_setReadOnly( le_rod_a, true );
143  main->addWidget( le_rod_a, row, 3 );
144 
145  le_rod_b = us_lineedit();
146  us_setReadOnly( le_rod_b, true );
147  main->addWidget( le_rod_b, row, 4 );
148 
150  us_setReadOnly( le_rod_ab, true );
151  main->addWidget( le_rod_ab, row++, 5 );
152 
153  // Misc items
154 
155  QLabel* lb_fCoef = us_label( tr( "Frict. Coefficient:" ) );
156  main->addWidget( lb_fCoef, row, 2 );
157 
158  le_fCoef = us_lineedit();
159  us_setReadOnly( le_fCoef, true );
160  main->addWidget( le_fCoef, row, 3 );
161 
162  QLabel* lb_r0 = us_label( tr( "R0 (Sphere):" ) );
163  main->addWidget( lb_r0, row, 4 );
164 
165  le_r0 = us_lineedit();
166  us_setReadOnly( le_r0, true );
167  main->addWidget( le_r0, row++, 5 );
168 
169  lb_param3 = us_label( tr( "Molecular Weight:" ) );
170  main->addWidget( lb_param3, row, 2 );
171 
173  us_setReadOnly( le_param3, true );
174  main->addWidget( le_param3, row, 3 );
175 
176  QLabel* lb_f0 = us_label( tr( "f0 (Sphere):" ) );
177  main->addWidget( lb_f0, row, 4 );
178 
179  le_f0 = us_lineedit();
180  us_setReadOnly( le_f0, true );
181  main->addWidget( le_f0, row++, 5 );
182 
183  QLabel* lb_volume = us_label( tr( "Volume (&Aring;<sup>3</sup>):" ) );
184  main->addWidget( lb_volume, row, 2 );
185 
187  us_setReadOnly( le_volume, true );
188  main->addWidget( le_volume, row, 3 );
189 
190  QLabel* lb_ff0 = us_label( tr( "f/f0:" ) );
191  main->addWidget( lb_ff0, row, 4 );
192 
193  le_ff0 = us_lineedit();
194  us_setReadOnly( le_ff0, true );
195  main->addWidget( le_ff0, row++, 5 );
196 
197  // Button rows
198 
199  QGridLayout* buttons = new QGridLayout;
200  int b_row = 0;
201 
203  tr( "Molecular Weight + Sedimentation Coeff." ) );
204  connect( pb_mw_s, SIGNAL( clicked() ), SLOT( do_mw_s() ) );
205  buttons->addWidget( pb_mw_s, b_row, 0 );
206 
208  tr( "Molecular Weight + Diffusion Coeff." ) );
209  connect( pb_mw_d, SIGNAL( clicked() ), SLOT( do_mw_d() ) );
210  buttons->addWidget( pb_mw_d, b_row, 1 );
211 
213  tr( "Sedimentation Coeff. + Diffusion Coeff." ) );
214  connect( pb_s_d, SIGNAL( clicked() ), SLOT( do_s_d() ) );
215  buttons->addWidget( pb_s_d, b_row++, 2 );
216 
217  QPushButton* pb_reset = us_pushbutton( tr( "Update" ) );
218  connect( pb_reset, SIGNAL( clicked() ), SLOT( update() ) );
219  buttons->addWidget( pb_reset, b_row, 0 );
220 
221  QPushButton* pb_help = us_pushbutton( tr( "Help" ) );
222  connect( pb_help, SIGNAL( clicked() ), SLOT( help() ) );
223  buttons->addWidget( pb_help, b_row, 1 );
224 
225  QPushButton* pb_accept = us_pushbutton( tr( "Close" ) );
226  connect( pb_accept, SIGNAL( clicked() ), SLOT( close() ) );
227  buttons->addWidget( pb_accept, b_row++, 2 );
228 
229  row = 8;
230  main->addLayout( buttons, row, 0, 1, 6 );
231 }
232 
234 {
236  le_param1->clear();
237  le_param2->clear();
238 
239  sed_coeff = 0.0;
240  mw = 0.0;
241 
242  lb_param1->setText( tr( "Molecular Weight:" ) );
243  lb_param2->setText( tr( "Sed. Coefficient:" ) );
244  lb_param3->setText( tr( "Diff. Coefficient:" ) );
245 
246  QPalette p = US_GuiSettings::pushbColor();
247  pb_mw_d->setPalette( p );
248  pb_s_d ->setPalette( p );
249 
250  p.setColor( QPalette::Button, Qt::darkGreen );
251  pb_mw_s->setPalette( p );
252 }
253 
255 {
257  le_param1->clear();
258  le_param2->clear();
259 
260  diff_coeff = 0.0;
261  mw = 0.0;
262 
263  lb_param1->setText( tr( "Molecular Weight:" ) );
264  lb_param2->setText( tr( "Diff. Coefficient:" ) );
265  lb_param3->setText( tr( "Sed. Coefficient:" ) );
266 
267  QPalette p = US_GuiSettings::pushbColor();
268  pb_s_d ->setPalette( p );
269  pb_mw_s->setPalette( p );
270 
271  p.setColor( QPalette::Button, Qt::darkGreen );
272  pb_mw_d->setPalette( p );
273 }
274 
276 {
277  model = SED_DIFF;
278  le_param1->clear();
279  le_param2->clear();
280 
281  sed_coeff = 0.0;
282  diff_coeff = 0.0;
283 
284  lb_param1->setText( tr( "Sed. Coefficient:" ) );
285  lb_param2->setText( tr( "Diff. Coefficient:" ) );
286  lb_param3->setText( tr( "Molecular Weight:" ) );
287 
288  QPalette p = US_GuiSettings::pushbColor();
289  pb_mw_d->setPalette( p );
290  pb_mw_s->setPalette( p );
291 
292  p.setColor( QPalette::Button, Qt::darkGreen );
293  pb_s_d ->setPalette( p );
294 }
295 
297 {
298  if ( le_param1->text().toDouble() == 0.0 ||
299  le_param2->text().toDouble() == 0.0 )
300  {
301  le_prolate_a ->clear();
302  le_prolate_b ->clear();
303  le_prolate_ab->clear();
304  le_oblate_a ->clear();
305  le_oblate_b ->clear();
306  le_oblate_ab ->clear();
307  le_rod_a ->clear();
308  le_rod_b ->clear();
309  le_rod_ab ->clear();
310  le_fCoef ->clear();
311  le_f0 ->clear();
312  le_r0 ->clear();
313  le_volume ->clear();
314  le_ff0 ->clear();
315  le_param3 ->clear();
316  return;
317  }
318 
320  double vol_per_molecule;
321  double rad_sphere;
322  double f0;
323  double frict_coeff = 0.0;
324 
325  sc.vbar20 = d.vbar20;
326  sc.mw = 0.0;
327  sc.s = 0.0;
328  sc.D = 0.0;
329  sc.f = 0.0;
330  sc.f_f0 = 0.0;
331 
332  if ( model == MW_SEDIMENTATION )
333  {
334  if ( mw == 0.0 ) return;
335  if ( sed_coeff == 0.0 ) return;
336 
337  sc.mw = mw;
338  sc.s = sed_coeff;
339 
341 
342  diff_coeff = sc.D;
343  frict_coeff = sc.f;
344 
345  le_param3->setText( QString::number( diff_coeff, 'e', 4 ) );
346  }
347 
348  if ( model == MW_DIFFUSION )
349  {
350  if ( mw == 0.0 ) return;
351  if ( diff_coeff == 0.0 ) return;
352 
353  sc.mw = mw;
354  sc.D = diff_coeff;
355 
357 
358  sed_coeff = sc.s;
359  frict_coeff = sc.f;
360 
361  le_param3->setText( QString::number( sed_coeff, 'e', 4 ) );
362  }
363 
364  if ( model == SED_DIFF )
365  {
366  if ( sed_coeff == 0.0 ) return;
367  if ( diff_coeff == 0.0 ) return;
368 
369  sc.s = sed_coeff;
370  sc.D = diff_coeff;
371 
373 
374  mw = sc.mw;
375  frict_coeff = sc.f;
376 
377  le_param3->setText( QString::number( mw, 'e', 4 ) );
378  }
379 
380  vol_per_molecule = d.vbar * mw / AVOGADRO;
381  rad_sphere = pow( vol_per_molecule * 0.75 / M_PI, 1.0 / 3.0 );
382 
383  double ff0 = sc.f_f0;
384  double r0 = rad_sphere * 1.0e+08;
385  f0 = frict_coeff / ff0;
386 
387  if ( ! check_valid( ff0 ) )
388  {
389  return;
390  }
391 
392  // Recalculate volume to put into cubic angstroms:
393  vol_per_molecule = 4.0 * M_PI / 3.0 * pow( r0, 3.0 );
394 
395  le_fCoef ->setText( QString::number( frict_coeff, 'e', 4 ) );
396  le_r0 ->setText( QString::number( r0, 'e', 4 ) );
397  le_f0 ->setText( QString::number( f0, 'e', 4 ) );
398  le_volume->setText( QString::number( vol_per_molecule, 'e', 4 ) );
399  le_ff0 ->setText( QString::number( ff0, 'f', 4 ) );
400 
401  // prolate ellipsoid
402  double ratio = root( PROLATE, ff0 );
403  double ap = r0 * pow( ratio, 2.0 / 3.0 );
404  double bp = ap / ratio;
405 
406  le_prolate_a ->setText( QString::number( ap, 'e', 4 ) );
407  le_prolate_b ->setText( QString::number( bp, 'e', 4 ) );
408  le_prolate_ab->setText( QString::number( ratio, 'e', 4 ) );
409 
410  // oblate ellipsoid
411  ratio = root( OBLATE, ff0 );
412  double bo = r0 / pow( ratio, 2.0 / 3.0 );
413  double ao = ratio * bo;
414  le_oblate_a ->setText( QString::number( ao, 'e', 4 ) );
415  le_oblate_b ->setText( QString::number( bo, 'e', 4 ) );
416  le_oblate_ab->setText( QString::number( ratio, 'e', 4 ) );
417 
418  // long rod
419  if ( ff0 > 1.32 )
420  {
421  ratio = root( ROD, ff0 );
422  double br = r0 * pow( 2.0 / ( 3.0 * ratio ), 1.0 / 3.0 );
423  double ar = ratio * br;
424  le_rod_a ->setText( QString::number( ar, 'e', 4 ) );
425  le_rod_b ->setText( QString::number( br, 'e', 4 ) );
426  le_rod_ab->setText( QString::number( ratio, 'e', 4 ) );
427  }
428  else
429  {
430  le_rod_a ->setText( "f/f0 < 1.32, n/a" );
431  le_rod_b ->setText( "f/f0 < 1.32, n/a" );
432  le_rod_ab->setText( "f/f0 < 1.32, n/a" );
433  }
434 }
435 
436 bool US_Predict2::check_valid( double f_f0 )
437 {
438  if ( f_f0 < 1.0 )
439  {
440  //QMessageBox::information( this,
441  // tr( "Attention:" ),
442  // tr( "This model is physically impossible!\n"
443  // "The f/f0 ratio (%1) is less than 1." ).arg( f_f0 ) );
444 
445  /*
446  sed_coeff = 0.0;
447  diff_coeff = 0.0;
448  mw = 0.0;
449 
450  le_param1->clear();
451  le_param2->clear();
452  */
453  le_prolate_a ->clear();
454  le_prolate_b ->clear();
455  le_prolate_ab->clear();
456  le_oblate_a ->clear();
457  le_oblate_b ->clear();
458  le_oblate_ab ->clear();
459  le_rod_a ->clear();
460  le_rod_b ->clear();
461  le_rod_ab ->clear();
462  le_fCoef ->clear();
463  le_f0 ->clear();
464  le_r0 ->clear();
465  le_volume ->clear();
466  le_param3 ->clear();
467  le_ff0 ->setText( QString::number( f_f0, 'f', 4 ) + " !!!!" );
468 
469  return false;
470  }
471 
472  return true;
473 }
474 
484 double US_Predict2::root( int shape, double goal )
485 {
486  double test;
487  double x = 2500.0; // half-way point
488  double x1 = 1.1; // lower range limit;
489  double x2 = 5000.0; // upper range limit
490  double xdiff = 1.0;
491 
492  if ( shape == PROLATE )
493  {
494  do
495  {
496  test = goal - pow( x, -1.0 / 3.0 ) * sqrt( sq( x ) - 1.0 ) /
497  log( x + sqrt( sq( x ) - 1.0 ) );
498 
499  // Iterate until the difference between subsequent x value evaluations is
500  // too small to be relevant
501 
502  // Note: this test is only valid for monotone increasing functional
503  // values! If the difference between the goal and the test value is
504  // negative, then the x value was too high. We then adjust the top
505  // (x2) limit. Otherwise, we adjust the lower limit:
506 
507  if ( test < 0.0 )
508  x2 = x;
509  else
510  x1 = x;
511 
512  // We adjust the new test x-value by adding half the stepsize from the
513  // last step to the lower limit:
514 
515  xdiff = ( x2 - x1 ) / 2.0;
516  x = x1 + xdiff;
517 
518  } while ( fabs( xdiff / x ) > 1.0e-4 );
519  }
520 
521  else if ( shape == OBLATE )
522  {
523  do
524  {
525  test = goal - sqrt( sq( x ) - 1.0 ) /
526  ( pow( x, 2.0 / 3.0 ) * atan( sqrt( sq( x ) - 1.0 ) ) );
527 
528  // Note: this test is only valid for monotone increasing functional
529  // values! If the difference between the goal and the test value is
530  // negative, then the x value was too high. We then adjust the top
531  // (x2) limit. Otherwise, we adjust the lower limit:
532 
533  if ( test < 0.0 )
534  x2 = x;
535  else
536  x1 = x;
537 
538  // We adjust the new test x-value by adding half the stepsize from the
539  // last step to the lower limit:
540 
541  xdiff = ( x2 - x1 ) / 2.0;
542  x = x1 + xdiff;
543 
544  } while ( fabs( xdiff / x ) > 1.0e-4 );
545  }
546 
547  else if ( shape == ROD )
548  {
549  x1 = 6.0; // lower range limit
550  x = 2497.0; // half-way point
551 
552  do
553  {
554  test = goal - pow( 2.0 / 3.0, 1.0 / 3.0 ) * pow( x, 2.0 / 3.0 ) /
555  ( log( 2.0 * x ) - 0.3 );
556 
557  // Note: this test is only valid for monotone increasing functional
558  // values! If the difference between the goal and the testvalue is
559  // negative, then the x value was too high. We then adjust the top
560  // (x2) limit:
561 
562  if ( test < 0.0 )
563  x2 = x;
564 
565  // Otherwise, we adjust the lower limit:
566 
567  else
568  x1 = x;
569 
570  // We adjust the new test x-value by adding half the stepsize from the
571  // last step to the lower limit:
572 
573  xdiff = ( x2 - x1 ) / 2.0;
574  x = x1 + xdiff;
575 
576  } while ( fabs( xdiff / x ) > 1.0e-4 );
577  }
578 
579  return x;
580 }
581 
582 void US_Predict2::update_param1( const QString& s )
583 {
584  if ( model == SED_DIFF )
585  sed_coeff = s.toDouble();
586  else
587  mw = s.toDouble();
588 
589  update();
590 }
591 
592 void US_Predict2::update_param2( const QString& s )
593 {
594  if ( model == MW_SEDIMENTATION )
595  sed_coeff = s.toDouble();
596  else
597  diff_coeff = s.toDouble();
598 
599  update();
600 }
601 
602 void US_Predict2::density( const QString& s )
603 {
604  d.density = s.toDouble();
605  update();
606 }
607 
608 void US_Predict2::viscosity( const QString& s )
609 {
610  d.viscosity = s.toDouble();
611  update();
612 }
613 
614 void US_Predict2::vbar( const QString& s )
615 {
616  d.vbar20 = s.toDouble();
617  d.vbar = d.vbar;
618  update();
619 }
620 
621 void US_Predict2::degC( const QString& s )
622 {
623  temperature = s.toDouble();
624  update();
625 }
626 
628 {
629  if ( model == None || le_param1->text().toDouble() == 0.0
630  || le_param2->text().toDouble() == 0.0 )
631  {
632  QMessageBox::information( this,
633  tr( "Attention" ),
634  tr( "Select a parameter combination and define\n"
635  "those parameters first.") );
636  return;
637  }
638 
639  US_BufferGui* buffer_dialog = new US_BufferGui( true );
640  connect( buffer_dialog, SIGNAL( valueChanged ( double, double ) ),
641  SLOT ( update_buffer( double, double ) ) );
642  buffer_dialog->setWindowTitle( tr( "Buffer Calculation" ) );
643  buffer_dialog->exec();
644 }
645 
646 void US_Predict2::update_buffer( double density, double viscosity )
647 {
648  d.density = density;
650 
651  le_density ->setText( QString::number( density, 'f', 4 ) );
652  le_viscosity->setText( QString::number( viscosity, 'f', 4 ) );
653 
654  update();
655 }
656 
658 {
659 #if 0
660  if ( model == None || le_param1->text().toDouble() == 0.0
661  || le_param2->text().toDouble() == 0.0 )
662  {
663  QMessageBox::information( this,
664  tr( "Attention" ),
665  tr( "Select a parameter combination and define\n"
666  "those parameters first.") );
667  return;
668  }
669 #endif
670 
671  US_AnalyteGui* dialog = new US_AnalyteGui( true );
672  connect( dialog, SIGNAL( valueChanged( US_Analyte ) ),
673  SLOT ( update_vbar ( US_Analyte ) ) );
674  dialog->setWindowTitle( tr( "VBar Calculation" ) );
675  dialog->exec();
676 }
677 
679 {
680  d.vbar = analyte.vbar20;
681  le_vbar ->setText( QString::number( d.vbar, 'f', 4 ) );
682 
683  update();
684 }
685 
687 {
688  if ( model == None || le_param1->text().toDouble() == 0.0
689  || le_param2->text().toDouble() == 0.0 )
690  {
691  QMessageBox::information( this,
692  tr( "Attention" ),
693  tr( "Select a parameter combination and define\n"
694  "those parameters first.") );
695  return;
696  }
697 
698  US_SolutionGui* dialog = new US_SolutionGui( 1, 1, true );
699  connect( dialog, SIGNAL( updateSolutionGuiSelection( US_Solution ) ),
700  SLOT ( update_solution ( US_Solution ) ) );
701  dialog->setWindowTitle( tr( "VBar Calculation" ) );
702  dialog->exec();
703 }
704 
706 {
707  d.density = solution.buffer.density;
708  d.viscosity = solution.buffer.viscosity;
709 
710  le_density ->setText( QString::number( d.density, 'f', 4 ) );
711  le_viscosity->setText( QString::number( d.viscosity, 'f', 4 ) );
712 
713  US_Analyte analyte;
714 
715  if ( solution.analyteInfo.size() == 0 )
716  {
717  QMessageBox::warning( this,
718  tr( "No Analyte" ),
719  tr( "There is no analyte in the solution" ) );
720  return;
721  }
722  else if ( solution.analyteInfo.size() == 1 )
723  {
724  analyte = solution.analyteInfo[ 0 ].analyte;
725  d.vbar= analyte.vbar20;;
726  le_vbar->setText( QString::number( d.vbar, 'f', 4 ) );
727  }
728  else
729  {
730  US_Choice* dialog = new US_Choice( solution );
731  connect( dialog, SIGNAL( choice( int ) ),
732  SLOT ( choose( int ) ) );
733  dialog->exec();
734  qApp->processEvents();
735 
736  analyte = solution.analyteInfo[ analyte_number ].analyte;
737  d.vbar= analyte.vbar20;;
738  le_vbar->setText( QString::number( d.vbar, 'f', 4 ) );
739  }
740 
741  if ( model == MW_DIFFUSION || model == MW_SEDIMENTATION )
742  {
743  le_param1->setText( QString::number( analyte.mw, 'e', 4 ) );
744  }
745 
746  update();
747 }
748 
749 void US_Predict2::choose( int value )
750 {
751  analyte_number = value;
752 }