UltraScan III
us_2dplot.cpp
Go to the documentation of this file.
1 
3 #include "us_2dplot.h"
4 #include "us_settings.h"
5 #include "us_license_t.h"
6 #include "us_math2.h"
7 #include "us_util.h"
8 #include "us_license.h"
9 #include "us_gui_settings.h"
10 #include "us_run_details2.h"
11 #include "us_passwd.h"
12 
14 
15 int main( int argc, char* argv[] )
16 {
17  QApplication application( argc, argv );
18 
19  #include "main1.inc"
20 
21  // License is OK. Start up.
22 
23  US_2dPlot w;
24  w.show();
25  return application.exec();
26 }
27 
29 {
30  unsigned int row = 0;
31  s_max = 10.0;
32  s_min = 1.0;
33  f_min = 1.0;
34  f_max = 4.0;
35  par1 = f_max;
36  par2 = f_min - f_max;
37  par3 = 1;
38  par4 = 0;
39  model = 1;
40 
41  resolution = 100; // start with 100 points in the s-domain
42 
43  setWindowTitle( tr( "2D Plot : Curves" ) );
44  setPalette( US_GuiSettings::frameColor() );
45 
46  QGridLayout* top = new QGridLayout( this );
47  top->setSpacing ( 2 );
48  top->setContentsMargins ( 2, 2, 2, 2 );
49 
50  QLabel* lbl_par1 = us_label( tr("Parameter 1:"), -1 );
51  top->addWidget( lbl_par1, row++, 0 );
52 
53  ct_par1 = new QwtCounter(this); // set parameter 1
54  ct_par1->setRange( -50, 50, 0.01 );
55  ct_par1->setValue( par1 );
56  ct_par1->setNumButtons( 3 );
57  connect (ct_par1, SIGNAL(valueChanged (double)), this, SLOT(update_par1(double)));
58  top->addWidget( ct_par1, row++, 0 );
59 
60  QLabel* lbl_par2 = us_label( tr("Parameter 2:"), -1 );
61  top->addWidget( lbl_par2, row++, 0 );
62 
63  ct_par2 = new QwtCounter(this); // set parameter 2
64  ct_par2->setRange( -50, 50, 0.01 );
65  ct_par2->setValue( par2 );
66  ct_par2->setNumButtons( 3 );
67  connect (ct_par2, SIGNAL(valueChanged (double)), this, SLOT(update_par2(double)));
68  top->addWidget( ct_par2, row++, 0 );
69 
70  QLabel* lbl_par3 = us_label( tr("Parameter 3:"), -1 );
71  top->addWidget( lbl_par3, row++, 0 );
72 
73  ct_par3 = new QwtCounter(this); // set parameter 3
74  ct_par3->setRange( -50, 50, 0.01 );
75  ct_par3->setValue( par3 );
76  ct_par3->setNumButtons( 3 );
77  connect (ct_par3, SIGNAL(valueChanged (double)), this, SLOT(update_par3(double)));
78  top->addWidget( ct_par3, row++, 0 );
79 
80  QLabel* lbl_par4 = us_label( tr("Parameter 4:"), -1 );
81  top->addWidget( lbl_par4, row++, 0 );
82 
83  ct_par4 = new QwtCounter(this); // set parameter 4
84  ct_par4->setRange( -50, 50, 0.01 );
85  ct_par4->setValue( par4 );
86  ct_par4->setNumButtons( 3 );
87  connect (ct_par4, SIGNAL(valueChanged (double)), this, SLOT(update_par4(double)));
88  top->addWidget( ct_par4, row++, 0 );
89 
90  QLabel* lbl_resolution = us_label( tr("S-value Resolution:"), -1 );
91  top->addWidget( lbl_resolution, row++, 0 );
92 
93  ct_resolution = new QwtCounter(this); // set s-value resolution
94  ct_resolution->setRange( -50, 50, 0.1 );
95  ct_resolution->setValue( resolution );
96  ct_resolution->setNumButtons( 3 );
97  connect (ct_resolution, SIGNAL(valueChanged (double)), this, SLOT(update_resolution(double)));
98  top->addWidget( ct_resolution, row++, 0 );
99 
100  QLabel* lbl_model = us_label( tr("Model #:"), -1 );
101  top->addWidget( lbl_model, row++, 0 );
102 
103  ct_model = new QwtCounter(this); // set s-value model
104  ct_model->setRange( 1, 3, 1 );
105  ct_model->setValue( model );
106  ct_model->setNumButtons( 1 );
107  connect (ct_model, SIGNAL(valueChanged (double)), this, SLOT(update_model(double)));
108  top->addWidget( ct_model, row++, 0 );
109 
110 
111  // Plot layout on right side of window
112  plot = new US_Plot( data_plot,
113  tr( "Function Plot" ),
114  tr( "sedimentation coefficient" ), tr( "f/f0" ) );
115 
116  data_plot->setMinimumSize( 700, 400 );
117  data_plot->enableAxis( QwtPlot::xBottom, true );
118  data_plot->enableAxis( QwtPlot::yLeft , true );
119  data_plot->setAxisScale( QwtPlot::xBottom, 0.2, 10.0 );
120  data_plot->setAxisAutoScale( QwtPlot::yLeft );
121 
122  top->addLayout( plot, 0, 1, 0, 1 );
123 
124  pb_calculate = us_pushbutton( tr( "Calculate" ) );
125  pb_calculate->setEnabled( true );
126  connect( pb_calculate, SIGNAL( clicked() ), SLOT( calculate() ) );
127  top->addWidget( pb_calculate, row++, 0 );
128 
129  QPushButton* pb_close = us_pushbutton( tr( "Close" ) );
130  connect( pb_close, SIGNAL( clicked() ), SLOT( close() ) );
131  top->addWidget( pb_close, row++, 0 );
132 
133  top->setColumnStretch( 0, 0 );
134  top->setColumnStretch( 1, 1 );
135 }
136 
138 {
139 
140  x .resize( resolution );
141  y .resize( resolution );
142  double inc = 1.0/resolution;
143 
144  for ( int i = 0; i < resolution; i++ )
145  {
146  x[ i ] = i * inc;
147  }
148  switch (model)
149  {
150  case 1:
151  {
152  for ( int i = 0; i < resolution; i++ )
153  {
154  y[ i ] = par1 + par2/(1.0 + par3 * x[ i ]);
155  }
156  break;
157  }
158  case 2:
159  {
160  for ( int i = 0; i < resolution; i++ )
161  {
162  y[ i ] = f_min + (f_max - f_min) * (0.5 * erf((x[i]-par2)/sqrt(2.0*par1)) + 0.5) ;
163  }
164  break;
165  }
166  case 3:
167  {
168  for ( int i = 0; i < resolution; i++ )
169  {
170  y[ i ] = f_max + (f_min - f_max) * (0.5 * erf((x[i]-par2)/sqrt(2.0*par1)) + 0.5);
171  }
172  break;
173  }
174  }
175  plot->btnZoom->setChecked( false );
176  data_plot->clear();
177  data_plot->replot();
178  QwtPlotCurve* c1;
179 
180  c1 = us_curve( data_plot, "1DSA Curve" );
181  c1->setData ( x.data(), y.data(), resolution);
182  c1->setStyle ( QwtPlotCurve::Lines );
183  c1->setPen ( QColor( Qt::yellow ) );
184 
185  data_plot->setAxisAutoScale( QwtPlot::xBottom );
186  data_plot->setAxisAutoScale( QwtPlot::yLeft );
187  data_plot->replot();
188 }
189 
190 void US_2dPlot::update_par1( double val )
191 {
192  par1 = val;
193  calculate();
194 }
195 
196 void US_2dPlot::update_par2( double val )
197 {
198  par2 = val;
199  calculate();
200 }
201 
202 void US_2dPlot::update_par3( double val )
203 {
204  par3 = val;
205  calculate();
206 }
207 
208 void US_2dPlot::update_par4( double val )
209 {
210  par4 = val;
211  calculate();
212 }
213 
214 void US_2dPlot::update_model( double val )
215 {
216  model = (int) val;
217  switch (model)
218  {
219  case 1:
220  {
221  par1 = 4;
222  par2 = -3;
223  par3 = 1;
224  ct_par1->setRange( -50, 50, 0.01 );
225  ct_par2->setRange( -50, 50, 0.01 );
226  ct_par3->setRange( -50, 50, 0.01 );
227  ct_par4->setRange( -50, 50, 0.01 );
228  break;
229  }
230  case 2: // error function
231  {
232  par1 = 0.001;
233  par2 = 0.5;
234  ct_par1->setRange( 0.001, 50, 0.001 );
235  ct_par2->setRange( 0.0, 1.0, 0.001 );
236  break;
237  }
238  case 3: // error function
239  {
240  par1 = 0.001;
241  par2 = 0.5;
242  ct_par1->setRange( 0.001, 50, 0.001 );
243  ct_par2->setRange( 0.0, 1.0, 0.001 );
244  break;
245  }
246  }
247  ct_par1->setValue( par1 );
248  ct_par2->setValue( par2 );
249  ct_par3->setValue( par3 );
250  ct_par4->setValue( par4 );
251 }
252 
254 {
255  resolution = val;
256 }