Changeset 2811


Ignore:
Timestamp:
Aug 14, 2019 2:48:40 PM (3 months ago)
Author:
gegorbet
Message:

density_match functionality close to complete, tho mmass,rh,ff0 magnitudes seem wrong

Location:
trunk/programs/us_density_match
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/programs/us_density_match/us_density_match.cpp

    r2808 r2811  
    8181   QLabel* lb_x_axis   = us_label( tr( "Plot X:" ) );
    8282           bg_x_axis   = new QButtonGroup( this );
     83   QGridLayout*  gl_x_s    = us_radiobutton( tr( "s"   ), rb_x_s,    false );
     84   QGridLayout*  gl_x_d    = us_radiobutton( tr( "D"   ), rb_x_d,    false );
     85   QGridLayout*  gl_x_vbar = us_radiobutton( tr( "vbar"), rb_x_vbar, false );
    8386   QGridLayout*  gl_x_mass = us_radiobutton( tr( "m.mass"   ), rb_x_mass, true  );
    8487   QGridLayout*  gl_x_ff0  = us_radiobutton( tr( "ff0" ), rb_x_ff0,  false );
    8588   QGridLayout*  gl_x_rh   = us_radiobutton( tr( "Rh"  ), rb_x_rh,   false );
    86    QGridLayout*  gl_x_vbar = us_radiobutton( tr( "vbar"), rb_x_vbar, false );
    87    QGridLayout*  gl_x_s    = us_radiobutton( tr( "s"   ), rb_x_s,    false );
    88    QGridLayout*  gl_x_d    = us_radiobutton( tr( "D"   ), rb_x_d,    false );
     89   bg_x_axis->addButton( rb_x_s,    ATTR_S );
     90   bg_x_axis->addButton( rb_x_d,    ATTR_D );
     91   bg_x_axis->addButton( rb_x_vbar, ATTR_V );
    8992   bg_x_axis->addButton( rb_x_mass, ATTR_W );
    9093   bg_x_axis->addButton( rb_x_ff0,  ATTR_K );
    9194   bg_x_axis->addButton( rb_x_rh,   ATTR_R );
    92    bg_x_axis->addButton( rb_x_vbar, ATTR_V );
    93    bg_x_axis->addButton( rb_x_s,    ATTR_S );
    94    bg_x_axis->addButton( rb_x_d,    ATTR_D );
     95   rb_x_s   ->setToolTip( tr( "Set X axis to Sedimentation Coefficient" ) );
     96   rb_x_d   ->setToolTip( tr( "Set X axis to Diffusion Coefficient"     ) );
     97   rb_x_vbar->setToolTip( tr( "Set X axis to Partial Specific Volume"   ) );
    9598   rb_x_mass->setToolTip( tr( "Set X axis to Molar Mass"                ) );
    9699   rb_x_ff0 ->setToolTip( tr( "Set X axis to Frictional Ratio"          ) );
    97100   rb_x_rh  ->setToolTip( tr( "Set X axis to Hydrodynamic Radius"       ) );
    98    rb_x_vbar->setToolTip( tr( "Set X axis to Partial Specific Volume"   ) );
    99    rb_x_s   ->setToolTip( tr( "Set X axis to Sedimentation Coefficient" ) );
    100    rb_x_d   ->setToolTip( tr( "Set X axis to Diffusion Coefficient"     ) );
    101101   rb_x_s   ->setChecked( true );
    102102   connect( bg_x_axis,  SIGNAL( buttonReleased( int ) ),
     
    167167   spec->addWidget( pb_save,       s_row++, 4, 1, 4 );
    168168   spec->addWidget( lb_x_axis,     s_row,   0, 1, 2 );
     169   spec->addLayout( gl_x_s,        s_row,   2, 1, 2 );
     170   spec->addLayout( gl_x_d,        s_row,   4, 1, 2 );
     171   spec->addLayout( gl_x_vbar,     s_row++, 6, 1, 2 );
    169172   spec->addLayout( gl_x_mass,     s_row,   2, 1, 2 );
    170173   spec->addLayout( gl_x_ff0,      s_row,   4, 1, 2 );
    171174   spec->addLayout( gl_x_rh,       s_row++, 6, 1, 2 );
    172    spec->addLayout( gl_x_vbar,     s_row,   2, 1, 2 );
    173    spec->addLayout( gl_x_s,        s_row,   4, 1, 2 );
    174    spec->addLayout( gl_x_d,        s_row++, 6, 1, 2 );
    175175   spec->addWidget( ck_savepl,     s_row,   0, 1, 4 );
    176176   spec->addWidget( ck_locsave,    s_row++, 4, 1, 4 );
     
    206206            this,           SLOT(  update_divis(  double ) ) );
    207207   connect( ct_boundaryPos, SIGNAL( valueChanged( double ) ),
     208            this,           SLOT(  update_divis(  double ) ) );
     209   connect( ct_smoothing,   SIGNAL( valueChanged( double ) ),
    208210            this,           SLOT(  update_divis(  double ) ) );
    209211
     
    399401   {
    400402      xx             = v_mmass.data();
    401       curvtitl       = tr( "Mmass_curve" );
     403      curvtitl       = tr( "mmass_curve" );
    402404      tstr          += tr( "Molar Mass" );
    403405   }
     
    406408      xx             = v_vbars.data();
    407409DbgLv(1) << "DaPl: v_vbars" << v_vbars;
    408       curvtitl       = tr( "Vbar_curve" );
     410      curvtitl       = tr( "vbar_curve" );
    409411      tstr          += tr( "Partial Specific Density" );
    410412   }
     
    425427   {
    426428      xx             = v_frats.data();
    427       curvtitl       = tr( "Ff0_curve" );
     429      curvtitl       = tr( "ff0_curve" );
    428430      tstr          += tr( "Frictional Ratio" );
    429431   }
     
    10601062      QString mdesc     = mdescs[ 0 ].section( mdescs[ 0 ].left( 1 ), 1, 1 );
    10611063      mdesc             = QString( mdesc ).left( 50 );
    1062       QString dinfo     = tr( "Run:\n  " ) + mdesc + "...\n\n"
     1064      QString dinfo     = alldis[ 0 ].run_name.section( ".", 0, -2 ) + "\n\n"
    10631065                        + tr( "  D2O Percent  Density  Label  MDescr.\n" );
    10641066
     
    12061208}
    12071209
    1208 // Generate the BF version of all distributions
     1210// Generate the BoundaryFraction version of all distributions
    12091211void US_Density_Match::build_bf_dists()
    12101212{
     
    12391241}
    12401242
    1241 // Generate the BF vectors
     1243// Generate the BoundaryFraction-associated vectors
    12421244void US_Density_Match::build_bf_vects()
    12431245{
     
    12781280      // Build vectors of s and D for this model
    12791281      for ( int jj = 0; jj < npoints; jj++ )
    1280       {  // Build s,D vectors for this model
     1282      {  // Append s,D values for each bf-point for this model
    12811283         v_sedcs[ ii ] << alldis[ ii ].bf_distro[ jj ].s;
    12821284         v_difcs[ ii ] << alldis[ ii ].bf_distro[ jj ].d;
     
    12861288DbgLv(1) << "BldVc:     di 0 1 k n" << v_difcs[ii][0] << v_difcs[ii][1]
    12871289 << v_difcs[ii][npoints-2] << v_difcs[ii][npoints-1];
     1290
     1291      if ( nsmoo > 1 )
     1292      {  // Apply gaussian smoothing to s and D vectors
     1293   US_Math2::gaussian_smoothing( v_sedcs[ ii ], nsmoo );
     1294         US_Math2::gaussian_smoothing( v_difcs[ ii ], nsmoo );
     1295      }
    12881296   }
    12891297DbgLv(1) << "BldVc: vdens" << v_dens;
     
    12971305      for ( int ii = 0; ii < ndists; ii++ )
    12981306      {  // Build sed coeffs vector across models
    1299          v_seds << alldis[ ii ].bf_distro[ jj ].s;
     1307         v_seds << v_sedcs[ ii ][ jj ];
    13001308      }
    13011309      double* xx       = v_seds.data();  // X is sed coeffs
     
    13211329   for ( int jj = 0; jj < npoints; jj++ )
    13221330   {
     1331      // *** Mi = si*R*T/(Di_avg*(1-vbari*rho))
    13231332      double sedco     = alldis[ 0 ].bf_distro[ jj ].s * 1.0e-13;
    13241333      double difco     = alldis[ 0 ].bf_distro[ jj ].d * 1.0e-7;
     
    13361345   for ( int jj = 0; jj < npoints; jj++ )
    13371346   {
     1347      // Mi*vbari/N = Volume of moleculei
     1348      // V=4/3 * pi*r_0^3    (3/(4*pi) *v)^1/3 = r_0
     1349      // f_0i = 6 * pi * eta * r_0i
     1350      // fi = RT/(N*Di)
     1351      // *** fi/f_0i
     1352      // *** ri = fi/(6 * pi * eta)   <-- hydrodynamic radius
    13381353      double difco     = alldis[ 0 ].bf_distro[ jj ].d * 1.0e-7;
    13391354      double frico     = R_GC * K20 / ( difco * AVOGADRO );
     
    13411356      v_hrads << hyrad;
    13421357   }
     1358DbgLv(1) << "BldVc: hr 0 1 k n" << v_hrads[0] << v_hrads[1]
     1359 << v_hrads[npoints-2] << v_hrads[npoints-1];
    13431360
    13441361   // Compute frictional ratio values and build the vector
    13451362   const double a_third = ( 1.0 / 3.0 );
     1363   double vol_fac       = ( 0.75 / M_PI );
    13461364   v_frats.clear();
    13471365   v_frats.reserve( npoints );
    13481366   for ( int jj = 0; jj < npoints; jj++ )
    13491367   {
     1368      // Mi*vbari/N = Volume of moleculei
     1369      // V=4/3 * pi*r_0^3    (3/(4*pi) *v)^1/3 = r_0
     1370      // f_0i = 6 * pi * eta * r_0i
     1371      // fi = RT/(N*Di)
     1372      // *** fi/f_0i
     1373      // *** ri = fi/(6 * pi * eta)   <-- hydrodynamic radius
    13501374      double difco     = alldis[ 0 ].bf_distro[ jj ].d * 1.0e-7;
    13511375      double vbari     = v_vbars[ jj ];
    1352       double rzero     = pow( ( ( 0.75 / M_PI ) * vbari ), a_third );
    1353       double frico     = R_GC * K20 / ( difco * AVOGADRO );
     1376//      double rzero     = pow( ( ( 0.75 / M_PI ) * vbari ), a_third );
     1377      double volum     = v_mmass[ jj ] * vbari / AVOGADRO;
     1378      double rzero     = pow( ( vol_fac * volum ), a_third );
     1379      double fcoef     = R_GC * K20 / ( difco * AVOGADRO );
    13541380      double fzero     = 6.0 * M_PI * VISC_20W * rzero;
    1355       double frrat     = frico / fzero;
    1356       v_frats << frrat;
    1357    }
     1381      double frati     = fcoef / fzero;
     1382      v_frats << frati;
     1383   }
     1384DbgLv(1) << "BldVc: fr 0 1 k n" << v_frats[0] << v_frats[1]
     1385 << v_frats[npoints-2] << v_frats[npoints-1];
    13581386
    13591387#if 0
     
    14121440}
    14131441
    1414 // Update structures and plot after division change
     1442// Set plot-type text suffix for a plot index
     1443QString US_Density_Match::ptype_text( int pltndx )
     1444{
     1445   QString t_text;
     1446
     1447   if      ( pltndx == ATTR_S )
     1448      t_text  = "s";
     1449   else if ( pltndx == ATTR_K )
     1450      t_text  = "ff0";
     1451   else if ( pltndx == ATTR_W )
     1452      t_text  = "mmass";
     1453   else if ( pltndx == ATTR_V )
     1454      t_text  = "vbar";
     1455   else if ( pltndx == ATTR_D )
     1456      t_text  = "d";
     1457   else if ( pltndx == ATTR_R )
     1458      t_text  = "rh";
     1459   else if ( pltndx == ATTR_F )
     1460      t_text  = "bf";
     1461
     1462   return t_text;
     1463}
     1464
     1465// Update structures and plot after division/percent/position change
    14151466void US_Density_Match::update_divis( double dval )
    14161467{
    14171468DbgLv(1) << "UpdDiv:" << dval;
    1418    build_bf_dists();
    1419    build_bf_vects();
    1420 }
    1421 
     1469   build_bf_dists();    // (Re-)build boundary fraction distributions
     1470   build_bf_vects();    // (Re-)build boundary fraction vectors
     1471   plot_data();         // Plot data
     1472}
     1473
  • trunk/programs/us_density_match/us_density_match.h

    r2808 r2811  
    182182      int  plot_x_select  ( void );
    183183      QString anno_title  ( int );
     184      QString ptype_text  ( int );
    184185
    185186      void help       ( void )
  • trunk/programs/us_density_match/us_model_params.cpp

    r2808 r2811  
    33#include "us_model_params.h"
    44#include "us_gui_settings.h"
     5#include "us_settings.h"
     6#define DbgLv(a) if(dbg_level>=a)qDebug()
    57
    68// Constructor:  remove-distributions dialog widget
     
    810    QWidget* p ) : US_WidgetsDialog( p, 0 ), distros( adistros )
    911{
     12   dbg_level       = US_Settings::us_debug();
     13   mainLayout      = new QGridLayout( this );
    1014   setObjectName( "US_ModelParams" );
    1115   setPalette( US_GuiSettings::frameColor() );
     
    1418   // Lay out the GUI
    1519   setWindowTitle( tr( "Distribution Parameters" ) );
    16 
    17    mainLayout      = new QGridLayout( this );
    1820
    1921   mainLayout->setSpacing        ( 2 );
     
    2729   pb_accept    = us_pushbutton( tr( "Accept"  ) );
    2830   pb_compute   = us_pushbutton( tr( "Compute Densities" ) );
    29 
     31   pb_accept ->setEnabled( false );
     32   pb_compute->setEnabled( false );
    3033
    3134   // Build lists of model parameters
     
    99102      mainLayout->addWidget( le_mlab, row,   3, 1, 2 );
    100103      mainLayout->addWidget( le_mdsc, row++, 5, 1, 3 );
    101    }
     104
     105      connect( le_d2op,    SIGNAL( textChanged( const QString& ) ),
     106               this,       SLOT(   lnedChanged( const QString& ) ) );
     107      connect( le_dens,    SIGNAL( textChanged( const QString& ) ),
     108               this,       SLOT(   lnedChanged( const QString& ) ) );
     109      connect( le_mlab,    SIGNAL( textChanged( const QString& ) ),
     110               this,       SLOT(   lnedChanged( const QString& ) ) );
     111   }
     112DbgLv(1) << "MP:main: model rows populated";
    102113
    103114   mainLayout ->addWidget( pb_help,    row,   0, 1, 1 );
     
    130141   int fwide = fm.width( QChar( '6' ) );
    131142   int lwide = fwide * ( maxdlen + 2 );
     143DbgLv(1) << "MP:main: fwide lwide" << fwide << lwide;
    132144
    133145   adjustSize();
     
    136148   resize( wwide, whigh );
    137149   qApp->processEvents();
    138 }
    139 
    140 // Private slot to react to a change in selections
    141 void US_ModelParams::d2opctChanged( int sel )
    142 {
    143 DbgLv(1) << "d2opctChanged:  sel" << sel;
    144    bool can_accept = false;
    145    // Enable buttons according to the present state of selection/removal
    146    pb_accept ->setEnabled( can_accept );
    147 }
    148 
    149 // Private slot to react to a change in selections
    150 void US_ModelParams::labelChanged( int sel )
    151 {
    152 DbgLv(1) << "labelChanged:  sel" << sel;
    153 }
    154 
     150DbgLv(1) << "MP:main: wwide whigh" << wwide << whigh;
     151}
    155152
    156153// Private slot to do the actual removal of distributions and close
     
    158155{
    159156DbgLv(1) << "accepted";
    160 #if 0
    161    if ( nd_selected > 0 )
    162    {  // Accept attempt with selections and no Remove clicked
    163       if ( QMessageBox::Yes == QMessageBox::warning( this,
    164               tr( "Outstanding Selections" ),
    165               tr( "You have selected distributions,\n"
    166                   "but did not click on the Remove button.\n"
    167                   "Do you want to remove the selected distributions?" ),
    168               QMessageBox::No | QMessageBox::Yes, QMessageBox::Yes ) )
    169       {  // If "Yes" to above, add current selections to the remove list
    170          remove();
    171       }
    172    }
    173 
    174    for ( int jj = nd_orig - 1; jj >= 0; jj-- )
    175    {  // Remove all entries in the original that are not in the current list
    176       QString mdesc = mdesc_orig[ jj ];
    177 
    178       if ( ! mdesc_list.contains( mdesc ) )
    179       {  // This original list item is to be removed from the passed list
    180          distros.removeAt( jj );
    181       }
    182    }
    183 #endif
    184 
    185157   QList< QObject* > ochilds  = this->children();
    186158DbgLv(1) << " acc: ochilds size" << ochilds.size();
     
    272244}
    273245
     246bool US_ModelParams::values_filled()
     247{
     248   QList< QObject* > ochilds  = this->children();
     249   int nzd2pc     = 0;
     250   int nad2pc     = 0;
     251   int nadens     = 0;
     252   int nalabs     = 0;
     253   QList< double > allden;
     254DbgLv(1) << " vlf: ochilds size" << ochilds.size();
     255
     256   for ( int jj = 0; jj < ochilds.size(); jj++ )
     257   {
     258      QObject* ochild = ochilds[ jj ];
     259      QString cname   = ochild->objectName();
     260      if ( cname.isEmpty() )  continue;
     261
     262      QLineEdit* lned = (QLineEdit*) ochild;
     263      QString pname   = cname.section( ":", 0, 0 );
     264      QString etext   = lned->text();
     265DbgLv(1) << " vlf:  jj" << jj << "etext" << etext << "pname" << pname;
     266
     267      if      ( pname == "D2OP" )
     268      {  // Count D2O percent values given
     269         if ( !etext.isEmpty() )
     270         {
     271            int pctval      = etext.toInt();
     272            if ( etext == "0" )
     273            {  // Zero percent:  bump counts
     274               nzd2pc++;
     275               nad2pc++;
     276DbgLv(1) << " vlf:    pctval" << pctval << "nzd2pc nad2pc" << nzd2pc << nad2pc;
     277            }
     278            else if ( pctval != 0 )
     279            {  // Non-zero numeric: bump percent count
     280               nad2pc++;
     281DbgLv(1) << " vlf:    pctval" << pctval << "nad2pc" << nad2pc;
     282            }
     283         }
     284      }
     285      else if ( pname == "DENS" )
     286      {  // Count densities given
     287         if ( !etext.isEmpty() )
     288         {
     289            double density  = etext.toDouble();
     290            if ( density > 0.0 )
     291            {  // Bump if non-empty, numeric; save unique values
     292               nadens++;
     293               if ( !allden.contains( density ) )
     294                  allden << density;
     295DbgLv(1) << " vlf:    density" << density << "nadens" << nadens;
     296            }
     297         }
     298      }
     299      else if ( pname == "MLAB" )
     300      {  // Count labels given
     301         if ( !etext.isEmpty() )
     302            nalabs++;
     303DbgLv(1) << " vlf:    nalabs" << nalabs;
     304      }
     305   }
     306DbgLv(1) << " vlf: nzd2pc nad2pc nadens nalabs" << nzd2pc << nad2pc << nadens << nalabs
     307 << "allden size" << allden.size();
     308
     309   // All model parameters are given if
     310   //  at least one zero-percent is given;
     311   //  percent,density,label counts equal row count;
     312   //  and number of unique densities equals row count.
     313   bool filled    = ( ( nzd2pc > 0 )  &&
     314                      ( nad2pc == nd_orig )  &&
     315                      ( nadens == nd_orig )  &&
     316                      ( nalabs == nd_orig )  &&
     317                      ( allden.size() == nadens ) );
     318DbgLv(1) << " vlf:   FILLED" << filled;
     319   pb_accept ->setEnabled( filled );  // If all filled, enable Accept button
     320
     321   return filled;
     322}
     323
     324// Return flag of whether all D2O percents have been given
     325bool US_ModelParams::all_percents()
     326{
     327   QList< QObject* > ochilds  = this->children();
     328   int nzd2pc     = 0;
     329   int nad2pc     = 0;
     330DbgLv(1) << " apc: ochilds size" << ochilds.size();
     331
     332   for ( int jj = 0; jj < ochilds.size(); jj++ )
     333   {  // Examine any D2O percent texts
     334      QObject* ochild = ochilds[ jj ];
     335      QString cname   = ochild->objectName();
     336      if ( cname.isEmpty() )  continue;
     337
     338      QString pname   = cname.section( ":", 0, 0 );
     339      QLineEdit* lned = (QLineEdit*) ochild;
     340      QString etext   = lned->text();
     341
     342      if      ( pname == "D2OP" )
     343      {
     344         if ( !etext.isEmpty() )
     345         {
     346            int pctval      = etext.toInt();
     347            if ( etext == "0" )
     348            {  // Count 0 percent and total percent
     349               nzd2pc++;
     350               nad2pc++;
     351            }
     352            else if ( pctval != 0 )
     353            {  // Count total non-empty percent values given
     354               nad2pc++;
     355            }
     356         }
     357      }
     358   }
     359DbgLv(1) << " apc: nzd2pc nad2pc" << nzd2pc << nad2pc;
     360
     361   // We have all needed if 0-percent exists and all percents given
     362   bool all_pc    = ( ( nzd2pc > 0 )  &&
     363                      ( nad2pc == nd_orig ) );
     364DbgLv(1) << " apc:   ALL-PC" << all_pc;
     365
     366   // If all percents given, enable Compute Densities button
     367   pb_compute->setEnabled( all_pc );
     368
     369   return all_pc;
     370}
     371
     372// Slot to handle change in lineEdit value in model rows
     373void US_ModelParams::lnedChanged( const QString& /*text*/ )
     374{
     375DbgLv(1) << " lnedChanged IN";
     376   // Determine if all boxes filled or all percents given
     377   //  and possibly enable "Accept" or "Compute Densities"
     378   bool filled    = values_filled();
     379   bool all_pc    = all_percents();
     380DbgLv(1) << " lnedChanged  filled all_pc" << filled << all_pc;
     381   return;
     382}
     383
  • trunk/programs/us_density_match/us_model_params.h

    r2806 r2811  
    4848   private slots:
    4949
    50       void d2opctChanged    ( int );
    51       void labelChanged     ( int );
    5250      void canceled         ( void );
    5351      void accepted         ( void );
    5452      void compute_densities( void );
     53      bool values_filled    ( void );
     54      bool all_percents     ( void );
     55      void lnedChanged      ( const QString& );
    5556      void help             ( void )
    5657      { showHelp.show_help( "dens_match_mparam.html" ); };
Note: See TracChangeset for help on using the changeset viewer.