[us-commits] r2805 - trunk/programs/us_density_match

svn at svn.aucsolutions.com svn at svn.aucsolutions.com
Sat Aug 10 11:37:43 MDT 2019


Author: gegorbet
Date: 2019-08-10 17:37:42 +0000 (Sat, 10 Aug 2019)
New Revision: 2805

Modified:
   trunk/programs/us_density_match/us_density_match.cpp
   trunk/programs/us_density_match/us_density_match.h
Log:
some progress in functionality for new us_density_match

Modified: trunk/programs/us_density_match/us_density_match.cpp
===================================================================
--- trunk/programs/us_density_match/us_density_match.cpp	2019-08-08 01:00:11 UTC (rev 2804)
+++ trunk/programs/us_density_match/us_density_match.cpp	2019-08-10 17:37:42 UTC (rev 2805)
@@ -8,6 +8,7 @@
 #include "us_model.h"
 #include "us_license_t.h"
 #include "us_license.h"
+#include "us_solution_vals.h"
 #include "us_settings.h"
 #include "us_gui_settings.h"
 #include "us_gui_util.h"
@@ -17,15 +18,9 @@
 #include "us_passwd.h"
 #include "us_report.h"
 #include "us_constants.h"
+
 #define DbgLv(a) if(dbg_level>=a)qDebug()
-#if QT_VERSION < 0x050000
-#define setSamples(a,b,c) setData(a,b,c)
-#define setMinimum(a)     setMinValue(a)
-#define setMaximum(a)     setMaxValue(a)
-#endif
 
-#define PA_TMDIS_MS 0   // default Plotall time per distro in milliseconds
-
 // main program
 int main( int argc, char* argv[] )
 {
@@ -42,21 +37,21 @@
 
 // qSort LessThan method for S_Solute sort
 bool distro_lessthan( const S_Solute &solu1, const S_Solute &solu2 )
-{  // TRUE iff  (s1<s2) || (s1==s2 && k1<k2)
+{  // TRUE iff  (s1<s2) || (s1==s2 && d1<d2)
    return ( solu1.s < solu2.s ) ||
-          ( ( solu1.s == solu2.s ) && ( solu1.k < solu2.k ) );
+          ( ( solu1.s == solu2.s ) && ( solu1.d < solu2.d ) );
 }
 
 // US_Density_Match class constructor
 US_Density_Match::US_Density_Match() : US_Widgets()
 {
-   // set up the GUI
+   // Set up the GUI
 
    setWindowTitle( tr( "Density Matching" ) );
    setPalette( US_GuiSettings::frameColor() );
 
 
-   // primary layouts
+   // Primary layouts
    QHBoxLayout* main = new QHBoxLayout( this );
    QVBoxLayout* left = new QVBoxLayout();
    QGridLayout* spec = new QGridLayout();
@@ -70,7 +65,7 @@
    int s_row = 0;
    dbg_level = US_Settings::us_debug();
 DbgLv(1) << "MD: main: AA";
-   clean_etc_dir();
+//   clean_etc_dir();
 
    // Top banner
    QLabel* lb_info1      = us_banner( tr( "Model Selection Controls" ) );
@@ -94,62 +89,28 @@
             + tr( "    analysisID" ) );
    us_setReadOnly( te_distr_info, true );
 
-//   le_cmap_name  = us_lineedit(
-//         tr( "Default Color Map: w-cyan-magenta-red-black" ), -1, true );
-//   te_distr_info->setMaximumHeight( le_cmap_name->height() * 2 );
+   plot_x      = 0;
 
-           plot_x      = 0;
-           plot_y      = 1;
-#if 0
    QLabel* lb_x_axis   = us_label( tr( "Plot X:" ) );
-   QLabel* lb_y_axis   = us_label( tr( "Plot Y:" ) );
            bg_x_axis   = new QButtonGroup( this );
-           bg_y_axis   = new QButtonGroup( this );
-   QGridLayout*  gl_x_s    = us_radiobutton( tr( "s"   ), rb_x_s,    true  );
+   QGridLayout*  gl_x_mass = us_radiobutton( tr( "m.mass"   ), rb_x_mass, true  );
    QGridLayout*  gl_x_ff0  = us_radiobutton( tr( "ff0" ), rb_x_ff0,  false );
-   QGridLayout*  gl_x_mw   = us_radiobutton( tr( "mw"  ), rb_x_mw,   false );
+   QGridLayout*  gl_x_rh   = us_radiobutton( tr( "Rh"  ), rb_x_rh,   false );
    QGridLayout*  gl_x_vbar = us_radiobutton( tr( "vbar"), rb_x_vbar, false );
-   QGridLayout*  gl_x_D    = us_radiobutton( tr( "D"   ), rb_x_D,    false );
-   QGridLayout*  gl_x_f    = us_radiobutton( tr( "f"   ), rb_x_f,    false );
-   QGridLayout*  gl_y_s    = us_radiobutton( tr( "s"   ), rb_y_s,    false );
-   QGridLayout*  gl_y_ff0  = us_radiobutton( tr( "ff0" ), rb_y_ff0,  true  );
-   QGridLayout*  gl_y_mw   = us_radiobutton( tr( "mw"  ), rb_y_mw,   false );
-   QGridLayout*  gl_y_vbar = us_radiobutton( tr( "vbar"), rb_y_vbar, false );
-   QGridLayout*  gl_y_D    = us_radiobutton( tr( "D"   ), rb_y_D,    false );
-   QGridLayout*  gl_y_f    = us_radiobutton( tr( "f"   ), rb_y_f,    false );
-   bg_x_axis->addButton( rb_x_s,    ATTR_S );
+   QGridLayout*  gl_x_s    = us_radiobutton( tr( "s"   ), rb_x_s,    false );
+   bg_x_axis->addButton( rb_x_mass, ATTR_W );
    bg_x_axis->addButton( rb_x_ff0,  ATTR_K );
-   bg_x_axis->addButton( rb_x_mw,   ATTR_W );
+   bg_x_axis->addButton( rb_x_rh,   ATTR_R );
    bg_x_axis->addButton( rb_x_vbar, ATTR_V );
-   bg_x_axis->addButton( rb_x_D,    ATTR_D );
-   bg_x_axis->addButton( rb_x_f,    ATTR_F );
-   bg_y_axis->addButton( rb_y_s,    ATTR_S );
-   bg_y_axis->addButton( rb_y_ff0,  ATTR_K );
-   bg_y_axis->addButton( rb_y_mw,   ATTR_W );
-   bg_y_axis->addButton( rb_y_vbar, ATTR_V );
-   bg_y_axis->addButton( rb_y_D,    ATTR_D );
-   bg_y_axis->addButton( rb_y_f,    ATTR_F );
-   rb_x_s   ->setChecked( true  );
-   rb_y_s   ->setEnabled( false );
-   rb_y_ff0 ->setChecked( true  );
-   rb_x_ff0 ->setEnabled( false );
-   rb_x_s   ->setToolTip( tr( "Set X axis to Sedimentation Coefficient" ) );
+   bg_x_axis->addButton( rb_x_s,    ATTR_S );
+   rb_x_mass->setChecked( true  );
+   rb_x_mass->setToolTip( tr( "Set X axis to Molar Mass"                ) );
    rb_x_ff0 ->setToolTip( tr( "Set X axis to Frictional Ratio"          ) );
-   rb_x_mw  ->setToolTip( tr( "Set X axis to Molecular Weight"          ) );
+   rb_x_rh  ->setToolTip( tr( "Set X axis to Hydrodynamic Radius"       ) );
    rb_x_vbar->setToolTip( tr( "Set X axis to Partial Specific Volume"   ) );
-   rb_x_D   ->setToolTip( tr( "Set X axis to Diffusion Coefficient"     ) );
-   rb_x_f   ->setToolTip( tr( "Set X axis to Frictional Coefficient"    ) );
-   rb_y_s   ->setToolTip( tr( "Set Y axis to Sedimentation Coefficient" ) );
-   rb_y_ff0 ->setToolTip( tr( "Set Y axis to Frictional Ratio"          ) );
-   rb_y_mw  ->setToolTip( tr( "Set Y axis to Molecular Weight"          ) );
-   rb_y_vbar->setToolTip( tr( "Set Y axis to Partial Specific Volume"   ) );
-   rb_y_D   ->setToolTip( tr( "Set Y axis to Diffusion Coefficient"     ) );
-   rb_y_f   ->setToolTip( tr( "Set Y axis to Frictional Coefficient"    ) );
+   rb_x_s   ->setToolTip( tr( "Set X axis to Sedimentation Coefficient" ) );
    connect( bg_x_axis,  SIGNAL( buttonReleased( int ) ),
             this,       SLOT  ( select_x_axis ( int ) ) );
-   connect( bg_y_axis,  SIGNAL( buttonReleased( int ) ),
-            this,       SLOT  ( select_y_axis ( int ) ) );
-#endif
 
    pb_refresh    = us_pushbutton( tr( "Refresh Plot" ) );
    pb_refresh->setEnabled(  false );
@@ -168,13 +129,6 @@
 
    pb_prefilt    = us_pushbutton( tr( "Select PreFilter" ) );
 
-#if 0
-   pb_ldcolor    = us_pushbutton( tr( "Load Color File" ) );
-   pb_ldcolor->setEnabled( true );
-   connect( pb_ldcolor, SIGNAL( clicked() ),
-            this,       SLOT( load_color() ) );
-#endif
-
    le_prefilt    = us_lineedit( tr( "" ), -1, true );
    connect( pb_prefilt, SIGNAL( clicked() ),
             this,       SLOT( select_prefilt() ) );
@@ -204,92 +158,62 @@
    spec->addLayout( dkdb_cntrls,   s_row++, 0, 1, 8 );
    spec->addWidget( le_prefilt,    s_row++, 0, 1, 8 );
    spec->addWidget( pb_prefilt,    s_row++, 0, 1, 4 );
-   //spec->addWidget( pb_ldcolor,    s_row++, 4, 1, 4 );
    spec->addWidget( pb_lddistr,    s_row,   0, 1, 4 );
    spec->addWidget( pb_rmvdist,    s_row++, 4, 1, 4 );
    spec->addWidget( pb_refresh,    s_row,   0, 1, 4 );
    spec->addWidget( pb_reset,      s_row++, 4, 1, 4 );
-
-
+   spec->addWidget( lb_x_axis,     s_row,   0, 1, 2 );
+   spec->addLayout( gl_x_mass,     s_row,   2, 1, 2 );
+   spec->addLayout( gl_x_ff0,      s_row,   4, 1, 2 );
+   spec->addLayout( gl_x_rh,       s_row++, 6, 1, 2 );
+   spec->addLayout( gl_x_vbar,     s_row,   2, 1, 2 );
+   spec->addLayout( gl_x_s,        s_row++, 4, 1, 2 );
    spec->addWidget( ck_savepl,     s_row,   0, 1, 4 );
    spec->addWidget( ck_locsave,    s_row++, 4, 1, 4 );
-//   spec->addWidget( lb_curr_distr, s_row,   0, 1, 4 );
-//   spec->addWidget( ct_curr_distr, s_row++, 4, 1, 4 );
    spec->addWidget( te_distr_info, s_row,   0, 2, 8 ); s_row += 2;
-   //spec->addWidget( le_cmap_name,  s_row++, 0, 1, 8 );
-#if 0
-   spec->addWidget( lb_x_axis,     s_row,   0, 1, 2 );
-   spec->addLayout( gl_x_s,        s_row,   2, 1, 1 );
-   spec->addLayout( gl_x_ff0,      s_row,   3, 1, 1 );
-   spec->addLayout( gl_x_mw,       s_row,   4, 1, 1 );
-   spec->addLayout( gl_x_vbar,     s_row,   5, 1, 1 );
-   spec->addLayout( gl_x_D,        s_row,   6, 1, 1 );
-   spec->addLayout( gl_x_f,        s_row++, 7, 1, 1 );
-   spec->addWidget( lb_y_axis,     s_row,   0, 1, 2 );
-   spec->addLayout( gl_y_s,        s_row,   2, 1, 1 );
-   spec->addLayout( gl_y_ff0,      s_row,   3, 1, 1 );
-   spec->addLayout( gl_y_mw,       s_row,   4, 1, 1 );
-   spec->addLayout( gl_y_vbar,     s_row,   5, 1, 1 );
-   spec->addLayout( gl_y_D,        s_row,   6, 1, 1 );
-   spec->addLayout( gl_y_f,        s_row++, 7, 1, 1 );
-#endif
 
    // Set up analysis controls
    QLabel* lb_analysis     = us_banner( tr( "Analysis Controls"      ) );
+   QLabel* lb_boundPct     = us_label ( tr( "% of Boundary:"         ) );
+   QLabel* lb_boundPos     = us_label ( tr( "Boundary Position (%):" ) );
    QLabel* lb_smoothing    = us_label ( tr( "Data Smoothing:"        ) );
-   QLabel* lb_boundPercent = us_label ( tr( "% of Boundary:"         ) );
-   QLabel* lb_boundPos     = us_label ( tr( "Boundary Position (%):" ) );
-#if 0
-   lb_tolerance  = us_label( tr( "Back Diffusion Tolerance:" ) );
-   lb_tolerance->setAlignment( Qt::AlignVCenter | Qt::AlignLeft );
 
-   ct_tolerance  = us_counter( 3, 0.001, 1.0, 0.001 );
-   ct_tolerance->setSingleStep( 0.001 );
-   ct_tolerance->setEnabled( true );
-   connect( ct_tolerance, SIGNAL( valueChanged(   double ) ),
-            this,          SLOT(  update_bdtoler( double ) ) );
-#endif
-
-   lb_division   = us_label( tr( "Divisions:" ) );
+   lb_division     = us_label( tr( "Divisions:" ) );
    lb_division->setAlignment( Qt::AlignVCenter | Qt::AlignLeft );
 
-   ct_division   = us_counter( 3, 0, 100, 50 );
+   ct_division     = us_counter( 2, 0, 100, 50 );
    ct_division->setSingleStep( 1 );
    ct_division->setEnabled( true );
    connect( ct_division, SIGNAL( valueChanged(  double ) ),
             this,         SLOT(  update_divis(  double ) ) );
-   ct_smoothing  = us_counter( 2, 1, 100, 1 );
-   ct_boundaryPercent  = us_counter( 3, 10, 100, 1 );
-   ct_boundaryPos  = us_counter( 3, 0, 100, 1 );
+   ct_boundaryPct  = us_counter( 2, 10, 100, 1 );
+   ct_boundaryPos  = us_counter( 2, 0, 100, 1 );
+   ct_smoothing    = us_counter( 2, 1, 100, 1 );
 
-   ct_smoothing      ->setSingleStep(  1 );
-   ct_boundaryPercent->setSingleStep(  1 );
-   ct_boundaryPos    ->setSingleStep(  1 );
-   ct_smoothing      ->setValue(  1 );
-   ct_boundaryPercent->setValue( 90 );
-   ct_boundaryPos    ->setValue(  5 );
+   ct_boundaryPct->setSingleStep(  1 );
+   ct_boundaryPos->setSingleStep(  1 );
+   ct_smoothing  ->setSingleStep(  1 );
+   ct_boundaryPct->setValue( 90 );
+   ct_boundaryPos->setValue(  5 );
+   ct_smoothing  ->setValue(  1 );
 
    spec->addWidget( lb_analysis       , s_row++, 0, 1, 8 );
-//   spec->addWidget( lb_tolerance      , s_row,   0, 1, 4 );
-//   spec->addWidget( ct_tolerance      , s_row++, 4, 1, 4 );
    spec->addWidget( lb_division       , s_row,   0, 1, 4 );
    spec->addWidget( ct_division       , s_row++, 4, 1, 4 );
+   spec->addWidget( lb_boundPct       , s_row,   0, 1, 4 );
+   spec->addWidget( ct_boundaryPct    , s_row++, 4, 1, 4 );
+   spec->addWidget( lb_boundPos       , s_row,   0, 1, 4 );
+   spec->addWidget( ct_boundaryPos    , s_row++, 4, 1, 4 );
    spec->addWidget( lb_smoothing      , s_row,   0, 1, 4 );
    spec->addWidget( ct_smoothing      , s_row++, 4, 1, 4 );
-   spec->addWidget( lb_boundPercent   , s_row,   0, 1, 4 );
-   spec->addWidget( ct_boundaryPercent, s_row++, 4, 1, 4 );
-   spec->addWidget( lb_boundPos       , s_row,   0, 1, 4 );
-   spec->addWidget( ct_boundaryPos    , s_row++, 4, 1, 4 );
 
 
    spec->addWidget( pb_help,          ++s_row,   0, 1, 4 );
    spec->addWidget( pb_close,           s_row++, 4, 1, 4 );
 
    // Set up plot component window on right side
-   //xa_title    = anno_title( ATTR_S );
-   //ya_title    = anno_title( ATTR_K );
-   xa_title    = tr( "Sedimentation Coefficient x 1.e+13" );
-   ya_title    = tr( "Boundary Fraction" );
+   xa_title    = anno_title( ATTR_S );
+   ya_title    = anno_title( ATTR_F );
    QBoxLayout* plot = new US_Plot( data_plot, 
       tr( "Density Matching Data" ), xa_title, ya_title );
 
@@ -300,17 +224,11 @@
    data_plot->setAxisScale( QwtPlot::xBottom, -200.0, 200.0 );
    data_plot->setAxisScale( QwtPlot::yLeft,      0.0,   1.0 );
    data_plot->setCanvasBackground( Qt::white );
-#if 0
-   QwtText zTitle( "Partial Concentration" );
-   zTitle.setFont( QFont( US_GuiSettings::fontFamily(),
-      US_GuiSettings::fontSize(), QFont::Bold ) );
-   data_plot->setAxisTitle( QwtPlot::yRight, zTitle );
-#endif
 
    pick = new US_PlotPicker( data_plot );
    pick->setRubberBand( QwtPicker::RectRubberBand );
 
-   // put layouts together for overall layout
+   // Put layouts together for overall layout
    left->addLayout( spec );
    left->addStretch();
 
@@ -326,7 +244,6 @@
    latest     = true;
 
    // Set up variables and initial state of GUI
-
    reset();
 }
 
@@ -339,7 +256,6 @@
    need_save  = false;
 
    plot_x     = ATTR_S;
-   plot_y     = ATTR_K;
 //   resolu     = 90.0;
 //   ct_resolu->setRange( 1.0, 100.0 );
 //   ct_resolu->setSingleStep( 1.0 );
@@ -398,15 +314,7 @@
    ct_curr_distr->setEnabled( false );
 #endif
 
-   // default to white-cyan-magenta-red-black color map
-   colormap  = new QwtLinearColorMap( Qt::white, Qt::black );
-   colormap->addColorStop( 0.10, Qt::cyan );
-   colormap->addColorStop( 0.50, Qt::magenta );
-   colormap->addColorStop( 0.80, Qt::red );
-   cmapname  = tr( "Default Color Map: w-cyan-magenta-red-black" );
-
-   stop();
-   system.clear();
+   alldis.clear();
    pfilts.clear();
 //   pb_pltall ->setEnabled( false );
    pb_refresh->setEnabled( false );
@@ -417,7 +325,7 @@
 // plot the data
 void US_Density_Match::plot_data( void )
 {
-   int syssiz = system.size();
+   int syssiz = alldis.size();
 
    if ( syssiz < 1 )
       return;
@@ -430,54 +338,24 @@
       curr_distr     = qBound( curr_distr, 0, syssiz );
    }
 
-   zpcent   = ck_zpcent->isChecked();
+//   zpcent   = ck_zpcent->isChecked();
 
-   // Get current distro and (if need be) rebuild XY distro
-   DisSys* tsys   = (DisSys*)&system.at( curr_distr );
-   QList< S_Solute >* sol_d = &tsys->sk_distro;
+   // Get current distro and (if need be) rebuild BF distro
+   DisSys* tsys   = (DisSys*)&alldis.at( curr_distr );
+   QList< S_Solute >* sol_d = &tsys->in_distro;
 
-   build_xy_distro();
+   build_bf_distro();
 
-   if ( zpcent )
-   {
-      data_plot->setAxisTitle( QwtPlot::yRight,
-         tr( "Percent of Total Concentration" ) );
-      sol_d    = &tsys->xy_distro_zp;
-   }
-
-   else
-   {
-      data_plot->setAxisTitle( QwtPlot::yRight,
-         tr( "Partial Concentration" ) );
-      sol_d    = &tsys->xy_distro;
-   }
-
-   colormap = tsys->colormap;
-   cmapname = tsys->cmapname;
-
    QString tstr = tsys->run_name + "\n" + tsys->analys_name
                   + "\n" + tsys->method;
    data_plot->setTitle( tstr );
    data_plot->detachItems( QwtPlotItem::Rtti_PlotSpectrogram );
-   QColor bg   = colormap->color1();
+   QColor bg   = QColor( Qt::white );
    data_plot->setCanvasBackground( bg );
    int    csum = bg.red() + bg.green() + bg.blue();
    pick->setTrackerPen( QPen( csum > 600 ? QColor( Qt::black ) :
                                            QColor( Qt::white ) ) );
 
-   // Set up spectrogram data
-   QwtPlotSpectrogram* d_spectrogram = new QwtPlotSpectrogram();
-#if QT_VERSION < 0x050000
-   d_spectrogram->setData( US_SpectrogramData() );
-   d_spectrogram->setColorMap( *colormap );
-   US_SpectrogramData& spec_dat = (US_SpectrogramData&)d_spectrogram->data();
-#else
-   US_SpectrogramData* rdata = new US_SpectrogramData();
-   d_spectrogram->setData( rdata );
-//   d_spectrogram->setColorMap( (QwtColorMap*)colormap );
-   d_spectrogram->setColorMap( ColorMapCopy( colormap ) );
-   US_SpectrogramData& spec_dat = (US_SpectrogramData&)*(d_spectrogram->data());
-#endif
    QwtDoubleRect drect;
 
    if ( auto_sxy )
@@ -489,8 +367,8 @@
             ( plt_smax - plt_smin ), ( plt_kmax - plt_kmin ) );
    }
 
-   plt_zmin = zpcent ? 100.0 :  1e+8;
-   plt_zmax = zpcent ?   0.0 : -1e+8;
+   plt_zmin = 1e+8;
+   plt_zmax = -1e+8;
 
    if ( auto_scz )
    {  // Find Z min,max for current distribution
@@ -503,11 +381,10 @@
    }
    else
    {  // Find Z min,max for all distributions
-      for ( int ii = 0; ii < system.size(); ii++ )
+      for ( int ii = 0; ii < alldis.size(); ii++ )
       {
-         DisSys* tsys = (DisSys*)&system.at( ii );
-         QList< S_Solute >* sol_z  = zpcent ? &tsys->sk_distro_zp
-                                            : &tsys->sk_distro;
+         DisSys* tsys = (DisSys*)&alldis.at( ii );
+         QList< S_Solute >* sol_z  = &tsys->in_distro;
 
          for ( int jj = 0; jj < sol_z->size(); jj++ )
          {
@@ -518,18 +395,9 @@
       }
    }
 
-   spec_dat.setRastRanges( xreso, yreso, resolu, zfloor, drect );
-   spec_dat.setZRange( 0.0, plt_zmax );
-   spec_dat.setRaster( sol_d );
-
-   d_spectrogram->attach( data_plot );
-
-   // set color map and axis settings
-   QwtScaleWidget *rightAxis = data_plot->axisWidget( QwtPlot::yRight );
-   rightAxis->setColorBarEnabled( true );
-
+   // Set axis settings
    xa_title    = anno_title( plot_x );
-   ya_title    = anno_title( plot_y );
+   ya_title    = anno_title( ATTR_F );
    data_plot->setAxisTitle( QwtPlot::xBottom, xa_title );
    data_plot->setAxisTitle( QwtPlot::yLeft,   ya_title );
 
@@ -546,45 +414,26 @@
       data_plot->setAxisScale( QwtPlot::yLeft,   plt_kmin, plt_kmax, lStep );
    }
 
-#if QT_VERSION < 0x050000
-   rightAxis->setColorMap( QwtDoubleInterval( 0.0, plt_zmax ),
-      d_spectrogram->colorMap() );
-#else
-//   rightAxis->setColorMap( QwtInterval( plt_zmin, plt_zmax ),
-//      (QwtColorMap*)d_spectrogram->colorMap() );
-   rightAxis->setColorMap( QwtInterval( 0.0, plt_zmax ),
-                           ColorMapCopy( colormap ) );
-#endif
-//   data_plot->setAxisScale( QwtPlot::yRight,  plt_zmin, plt_zmax );
-   data_plot->setAxisScale( QwtPlot::yRight,  0.0, plt_zmax );
-
    data_plot->replot();
 
    //QString dtext = te_distr_info->toPlainText().section( "\n", 0, 1 );
    QString dtext  = tr( "Run:  " ) + tsys->run_name
          + " (" + tsys->method + ")\n    " + tsys->analys_name;
 
-   bool sv_plot = ck_savepl->isChecked()  &&
-                  ( ( looping  &&  !ck_conloop->isChecked() ) || !looping );
-DbgLv(2) << "(1) sv_plot" << sv_plot << "looping" << looping;
+   bool sv_plot = ck_savepl->isChecked();
+DbgLv(2) << "(1) sv_plot" << sv_plot;
 
 DbgLv(2) << "(3)   need_save sv_plot" << need_save << sv_plot;
    //if ( need_save  &&  sv_plot )
    if ( sv_plot )
    {  // Automatically save plot image in a PNG file
       const QString s_attrs[] = { "s", "ff0", "MW", "vbar", "D", "f" };
-#if QT_VERSION > 0x050000
       QPixmap plotmap = ((QWidget*)data_plot)->grab();
-#else
-      QSize pmsize    = data_plot->size();
-      QPixmap plotmap = QPixmap::grabWidget( data_plot, 0, 0,
-                                             pmsize.width(), pmsize.height() );
-#endif
 
       QString runid   = tsys->run_name.section( ".",  0, -2 );
       QString triple  = tsys->run_name.section( ".", -1, -1 );
       QString report  = QString( "pseudo3d_" ) + s_attrs[ plot_x ]
-         + "_" + s_attrs[ plot_y ];
+         + "_" + s_attrs[ ATTR_F ];
 
       QString ofdir   = US_Settings::reportDir() + "/" + runid;
       QDir dirof( ofdir );
@@ -644,32 +493,10 @@
    yreso  = dval;
 }
 
-void US_Density_Match::update_zfloor( double dval )
-{
-   zfloor = dval;
-}
-
 void US_Density_Match::update_curr_distr( double dval )
 {
    curr_distr   = qRound( dval ) - 1;
 DbgLv(1) << "upd_curr_distr" << curr_distr;
-
-   if ( curr_distr > (-1)  &&  curr_distr < system.size() )
-   {
-      DisSys* tsys = (DisSys*)&system.at( curr_distr );
-      cmapname     = tsys->cmapname;
-//      le_cmap_name->setText( cmapname );
-      colormap     = tsys->colormap;
-      if ( ! looping )
-         te_distr_info->setText( tr( "Run:  " ) + tsys->run_name
-            + " (" + tsys->method + ")\n    " + tsys->analys_name );
-   }
-
-   build_xy_distro();
-
-   set_limits();
-
-   plot_data();
 }
 
 void US_Density_Match::update_plot_smin( double dval )
@@ -712,28 +539,9 @@
    set_limits();
 }
 
-void US_Density_Match::select_conloop()
-{
-   cont_loop  = ck_conloop->isChecked();
-   DisSys* tsys   = (DisSys*)&system.at( curr_distr );
-   QString dtext  = tr( "Run:  " ) + tsys->run_name
-         + " (" + tsys->method + ")\n    " + tsys->analys_name;
-
-   if ( cont_loop )
-   {
-      pb_pltall->setText( tr( "Plot All Distros in a Loop" ) );
-      dtext          = dtext +
-         tr( "\nWith continuous loop, plot files are not saved." );
-   }
-   else
-      pb_pltall->setText( tr( "Plot All Distros" ) );
-
-   te_distr_info->setText( dtext );
-}
-
 void US_Density_Match::load_distro()
 {
-   // get a model description or set of descriptions for distribution data
+   // Get a model description or set of descriptions for distribution data
    QList< US_Model > models;
    QStringList       mdescs;
    bool              loadDB = dkdb_cntrls->db();
@@ -752,33 +560,30 @@
    need_save  = false;
 
    for ( int jj = 0; jj < models.count(); jj++ )
-   {  // load each selected distribution model
+   {  // Load each selected distribution model
       load_distro( models[ jj ], mdescs[ jj ] );
    }
 
-   curr_distr = system.size() - 1;
+   curr_distr = alldis.size() - 1;
    need_save  = ck_savepl->isChecked()  &&  !cont_loop;
-   ct_curr_distr->setEnabled( true );
-   ct_curr_distr->setValue( curr_distr + 1 );
    pb_rmvdist->setEnabled( models.count() > 0 );
 
-   update_curr_distr( (double)system.size() );
+   update_curr_distr( (double)alldis.size() );
 }
 
+// Create distributions from a loaded model
 void US_Density_Match::load_distro( US_Model model, QString mdescr )
 {
    DisSys      tsys;
-   S_Solute    sol_sk;
-   S_Solute    sol_xy;
+   S_Solute    sol_in;
+   S_Solute    sol_nm;
+   S_Solute    sol_bf;
+   QList< S_Solute >   wk_distro;
 
    model.update_coefficients();          // fill in any missing coefficients
 
-   QString mdesc = mdescr.section( mdescr.left( 1 ), 1, 1 );
+   QString mdesc     = mdescr.section( mdescr.left( 1 ), 1, 1 );
 
-   // load current colormap
-   tsys.colormap     = colormap;
-   tsys.cmapname     = cmapname;
-
    tsys.run_name     = mdesc.section( ".",  0, -3 );
    QString asys      = mdesc.section( ".", -2, -2 );
    tsys.analys_name  = asys.section( "_",  0, -4 ) + "_"
@@ -794,7 +599,6 @@
    }
    tsys.editGUID     = model.editGUID;
    tsys.plot_x       = plot_x;
-   tsys.plot_y       = plot_y;
 DbgLv(1) << "LD: method" << tsys.method << "mdesc" << mdesc;
 
    if ( tsys.method == "Manual"  ||  tsys.method == "CUSTOMGRID" )
@@ -807,134 +611,134 @@
 DbgLv(1) << "LD:  analys_name" << tsys.analys_name;
    }
 
+DbgLv(1) << "LD:  model:" << model.description;
    tsys.distro_type  = (int)model.analysis;
-   tsys.monte_carlo  = model.monteCarlo;
+   QString edir      = US_Settings::tmpDir();
+   QString efname    = tsys.run_name + ".xml";
 
-   if ( model.monteCarlo )
-   {  // Revisit setting if Monte Carlo
-      QString miter = mdescr.section( mdescr.left( 1 ), 6 );
-      int     kiter = miter.isEmpty() ? 0 : miter.toInt();
+   // Read in edit for this model
+   US_DataIO::EditedData edata;
+   US_DB2* dbP       = NULL;
 
-      if ( kiter < 2 )
-      {  // Turn off flag if not composite MC model (is individual MC)
-         tsys.monte_carlo = false;
-      }
+   if ( dkdb_cntrls->db() )
+   {  // Set up to read from database
+      US_Passwd pw;
+      dbP               = new US_DB2( pw.getPasswd() );
+      QStringList qry;
+      qry << "get_editID" << model.editGUID;
+      dbP->query( qry );
+      dbP->next();
+      QString editID    = dbP->value( 0 ).toString();
+      int idEdit        = editID.toInt();
+DbgLv(1) << "LD:   idEdit" << idEdit;
+      qry.clear();
+      qry << "get_editedData" << editID;
+      dbP->query( qry );
+      dbP->next();
+      int idRaw         = dbP->value( 0 ).toString().toInt();
+      efname            = dbP->value( 3 ).toString();
+DbgLv(1) << "LD:   edir" << edir;
+DbgLv(1) << "LD:   efname" << efname;
+      QString epath     = edir + "/" + efname;
+      QString rpath     = edir + "/" + efname.section( ".", 0, -7 ) + "."
+                          + efname.section( ".", -5, -2 ) + ".auc";
+
+      dbP->readBlobFromDB( epath, "download_editData", idEdit );
+      dbP->readBlobFromDB( rpath, "download_aucData",  idRaw );
    }
-      
 
+   // Read in edit
+   US_DataIO::loadData( edir, efname, edata );
+DbgLv(1) << "LD:  edata: desc run cell chan"
+ << edata.description << edata.runID << edata.cell << edata.channel;
+
+   // Now, get associated solution,buffer values
+   QString soluID;
+   QString cvbar20;
+   QString bdens;
+   QString bvisc;
+   QString cmprss;
+   QString bmanu;
+   QString errmsg;
+DbgLv(1) << "LD:  solvals CALL";
+   US_SolutionVals::values( dbP, &edata,
+      soluID, cvbar20, bdens, bvisc, cmprss, bmanu, errmsg );
+DbgLv(1) << "LD:  solval: bdens soluID errmsg"
+ << bdens << soluID << errmsg;
+
+   
    te_distr_info->setText( tr( "Run:  " ) + tsys.run_name
       + " (" + tsys.method + ")\n    " + tsys.analys_name );
-   plt_zmin_co = 1e+8;
-   plt_zmax_co = -1e+8;
-   plt_zmin_zp = 100.0;
-   plt_zmax_zp = 0.0;
    int nsolmc  = model.components.size();
 
-   // read in and set distribution s,k,c,... values
-   if ( tsys.distro_type != (int)US_Model::COFS )
+   // Read in and set distribution s,k,c,... values
+   double tot_conc = 0.0;
+
+   for ( int jj = 0; jj < nsolmc; jj++ )
    {
-      double tot_conc = 0.0;
+      sol_in.s  = model.components[ jj ].s * 1.0e13;
+      sol_in.k  = model.components[ jj ].f_f0;
+      sol_in.c  = model.components[ jj ].signal_concentration;
+      sol_in.w  = model.components[ jj ].mw;
+      sol_in.v  = model.components[ jj ].vbar20;
+      sol_in.d  = model.components[ jj ].D * 1.0e7;
+      sol_in.f  = model.components[ jj ].f;
 
-      for ( int jj = 0; jj < nsolmc; jj++ )
-      {
-         sol_sk.s  = model.components[ jj ].s * 1.0e13;
-         sol_sk.k  = model.components[ jj ].f_f0;
-         sol_sk.c  = model.components[ jj ].signal_concentration;
-         sol_sk.w  = model.components[ jj ].mw;
-         sol_sk.v  = model.components[ jj ].vbar20;
-         sol_sk.d  = model.components[ jj ].D * 1.0e7;
-         sol_sk.f  = model.components[ jj ].f;
+      tsys.in_distro << sol_in;
+      wk_distro << sol_in;
 
-         sol_xy    = sol_sk;
-         sol_xy.s  = ( plot_x == ATTR_S ) ? sol_sk.s : sol_xy.s;
-         sol_xy.s  = ( plot_x == ATTR_K ) ? sol_sk.k : sol_xy.s;
-         sol_xy.s  = ( plot_x == ATTR_W ) ? sol_sk.w : sol_xy.s;
-         sol_xy.s  = ( plot_x == ATTR_V ) ? sol_sk.v : sol_xy.s;
-         sol_xy.s  = ( plot_x == ATTR_D ) ? sol_sk.d : sol_xy.s;
-         sol_xy.s  = ( plot_x == ATTR_F ) ? sol_sk.f : sol_xy.s;
-         sol_xy.k  = ( plot_y == ATTR_S ) ? sol_sk.s : sol_xy.k;
-         sol_xy.k  = ( plot_y == ATTR_K ) ? sol_sk.k : sol_xy.k;
-         sol_xy.k  = ( plot_y == ATTR_W ) ? sol_sk.w : sol_xy.k;
-         sol_xy.k  = ( plot_y == ATTR_V ) ? sol_sk.v : sol_xy.k;
-         sol_xy.k  = ( plot_y == ATTR_D ) ? sol_sk.d : sol_xy.k;
-         sol_xy.k  = ( plot_y == ATTR_F ) ? sol_sk.f : sol_xy.k;
+      tot_conc += sol_in.c;
+if ( jj<3   ||  (jj+4)>nsolmc )
+ DbgLv(1) << "LD:    jj" << jj << "soli s,d,c,t"
+  << sol_in.s << sol_in.d << sol_in.c << tot_conc;
+   }
 
-         tsys.sk_distro << sol_sk;
-         tsys.xy_distro << sol_xy;
+   // Sort and reduce distributions, then normalize
+   sort_distro( wk_distro, true  );
 
-         plt_zmin_co = qMin( plt_zmin_co, sol_sk.c );
-         plt_zmax_co = qMax( plt_zmax_co, sol_sk.c );
-         tot_conc   += sol_sk.c;
-      }
-DbgLv(1) << "LD: zmin zmax totconc" << plt_zmin_co << plt_zmax_co << tot_conc;
+   tsys.nm_distro.clear();
+   int nsolin = tsys.in_distro.size();
+   int nsolnm = wk_distro.size();
+DbgLv(1) << "LD: totconc" << tot_conc << "nsolin nsolnm" << nsolin << nsolnm;
+   for ( int jj = 0; jj < nsolnm; jj++ )
+   {
+      sol_nm      = wk_distro[ jj ];
+      sol_nm.c   /= tot_conc;
+      tsys.nm_distro << sol_nm;
+if ( jj<3   ||  (jj+4)>nsolnm )
+ DbgLv(1) << "LD:    jj" << jj << "soln s,d,c"
+  << sol_nm.s << sol_nm.d << sol_nm.c;
+   }
+DbgLv(1) << "LD: nsolin nsolnm" << nsolin << nsolnm << tsys.nm_distro.size();
 
-      // sort and reduce distributions
-      sort_distro( tsys.sk_distro, false );
-      sort_distro( tsys.xy_distro, true  );
-      int nsolsk = tsys.sk_distro.size();
-      int nsolxy = tsys.xy_distro.size();
-DbgLv(1) << "LD: nsolsk nsolxy nsolmc" << nsolsk << nsolxy << nsolmc;
-      tsys.sk_distro_zp.clear();
-      tsys.xy_distro_zp.clear();
+   // Create version of distribution with boundary fraction
 
-      // Create Z-as-percentage version of distributions
+   wk_distro.clear();
+   double sum_co  = 0.0;
 
-      for ( int jj = 0; jj < nsolmc; jj++ )
-      {
-         double cozpc;
-
-         if ( jj < nsolsk )
-         {
-            sol_sk      = tsys.sk_distro[ jj ];
-            cozpc       = sol_sk.c * 100.0 / tot_conc;
-            sol_sk.c    = cozpc;
-            plt_zmin_zp = qMin( plt_zmin_zp, cozpc );
-            plt_zmax_zp = qMax( plt_zmax_zp, cozpc );
-            tsys.sk_distro_zp << sol_sk;
-         }
-
-         if ( jj < nsolxy )
-         {
-            sol_xy      = tsys.xy_distro[ jj ];
-            cozpc       = sol_xy.c * 100.0 / tot_conc;
-            sol_xy.c    = cozpc;
-            plt_zmin_zp = qMin( plt_zmin_zp, cozpc );
-            plt_zmax_zp = qMax( plt_zmax_zp, cozpc );
-            tsys.xy_distro_zp << sol_xy;
-         }
-      }
-DbgLv(1) << "LD: zminzp zmaxzp" << plt_zmin_zp << plt_zmax_zp;
+   for ( int jj = 0; jj < nsolnm; jj++ )
+   {
+      sol_nm      = tsys.nm_distro[ jj ];
+      sum_co     += sol_nm.c;
+      sol_bf      = sol_nm;
+      sol_bf.f    = sum_co;
+      wk_distro << sol_bf;
+if ( jj<3   ||  (jj+4)>nsolnm )
+ DbgLv(1) << "LD:    jj" << jj << "solb s,d,c,f"
+  << sol_bf.d << sol_bf.d << sol_bf.c << sol_bf.f;
    }
 
-   // update current distribution record
-   system.append( tsys );
-   int jd     = system.size();
-   curr_distr = jd - 1;
-   ct_curr_distr->setRange( 1.0, jd );
-   ct_curr_distr->setSingleStep( 1.0 );
-   ct_curr_distr->setValue( jd );
-   ct_curr_distr->setEnabled( true );
+   // Update current distribution record
+DbgLv(1) << "LD:  call alldis.append";
+   alldis.append( tsys );
+DbgLv(1) << "LD:   retn fr alldis.append";
 
+#if 0
    if ( auto_sxy )
    {
 DbgLv(1) << "LD:  auto_sxy call set_limits";
       set_limits();
-DbgLv(1) << "LD:  auto_sxy  rtn fr set_limits";
-      ct_plt_kmin->setEnabled( false );
-      ct_plt_kmax->setEnabled( false );
-      ct_plt_smin->setEnabled( false );
-      ct_plt_smax->setEnabled( false );
    }
-   else
-   {
-      plt_smin    = ct_plt_smin->value();
-      plt_smax    = ct_plt_smax->value();
-      plt_kmin    = ct_plt_kmin->value();
-      plt_kmax    = ct_plt_kmax->value();
-DbgLv(1) << "LD:  non-auto_sxy call set_limits";
-      set_limits();
-DbgLv(1) << "LD:  non-auto_sxy  rtn fr set_limits";
-   }
    data_plot->setAxisScale( QwtPlot::xBottom, plt_smin, plt_smax );
    data_plot->setAxisScale( QwtPlot::yLeft,   plt_kmin, plt_kmax );
 
@@ -946,53 +750,13 @@
       pb_pltall->setText( tr( "Plot All Distros in a Loop" ) );
    else
       pb_pltall->setText( tr( "Plot All Distros" ) );
+#endif
 DbgLv(1) << "LD: RETURN";
 }
 
-void US_Density_Match::load_color()
-{
-   QString filter = tr( "Color Map files (*cm-*.xml);;" )
-         + tr( "Any XML files (*.xml);;" )
-         + tr( "Any files (*)" );
-
-   // get an xml file name for the color map
-   QString fname = QFileDialog::getOpenFileName( this,
-      tr( "Load Color Map File" ),
-      US_Settings::etcDir(), filter, 0, 0 );
-
-   if ( fname.isEmpty() )
-      return;
-
-   // get the map from the file
-   QList< QColor > cmcolor;
-   QList< double > cmvalue;
-
-   US_ColorGradIO::read_color_steps( fname, cmcolor, cmvalue );
-   colormap  = new QwtLinearColorMap( cmcolor.first(), cmcolor.last() );
-
-   for ( int jj = 1; jj < cmvalue.size() - 1; jj++ )
-   {
-      colormap->addColorStop( cmvalue.at( jj ), cmcolor.at( jj ) );
-   }
-   QFileInfo fi( fname );
-   cmapname  = tr( "Color Map: " ) + fi.baseName();
-//   le_cmap_name->setText( cmapname );
-
-   // save the map information for the current distribution
-   if ( curr_distr < system.size() )
-   {
-      DisSys* tsys    = (DisSys*)&system.at( curr_distr );
-      tsys->colormap  = colormap;
-      tsys->cmapname  = cmapname;
-   }
-
-   plot_data();
-}
-
 // Start a loop of plotting all distros
 void US_Density_Match::plotall()
 {
-   looping    = true;
    pb_stopplt->setEnabled( true );
    curr_distr = 0;
    plot_data();
@@ -1000,19 +764,12 @@
 
    patm_id    = startTimer( patm_dlay );
 
-   if ( curr_distr == system.size() )
+   if ( curr_distr == alldis.size() )
       curr_distr--;
 
    need_save  = ck_savepl->isChecked()  &&  !cont_loop;
 }
 
-// Stop the distros-plotting loop
-void US_Density_Match::stop()
-{
-   looping    = false;
-   need_save  = ck_savepl->isChecked()  &&  !cont_loop;
-}
-
 void US_Density_Match::set_limits()
 {
    double smin = 1.0e30;
@@ -1022,23 +779,23 @@
    double sinc;
    double kinc;
    xa_title    = anno_title( plot_x );
-   ya_title    = anno_title( plot_y );
+   ya_title    = anno_title( ATTR_F );
 
    data_plot->setAxisTitle( QwtPlot::xBottom, xa_title );
    data_plot->setAxisTitle( QwtPlot::yLeft,   ya_title );
 
-   if ( system.size() < 1 )
+   if ( alldis.size() < 1 )
       return;
 
    // find min,max for X,Y distributions
-   for ( int ii = 0; ii < system.size(); ii++ )
+   for ( int ii = 0; ii < alldis.size(); ii++ )
    {
-      DisSys* tsys = (DisSys*)&system.at( ii );
+      DisSys* tsys = (DisSys*)&alldis.at( ii );
 
-      for ( int jj = 0; jj < tsys->xy_distro.size(); jj++ )
+      for ( int jj = 0; jj < tsys->nm_distro.size(); jj++ )
       {
-         double sval = tsys->xy_distro.at( jj ).s;
-         double kval = tsys->xy_distro.at( jj ).k;
+         double sval = tsys->nm_distro.at( jj ).s;
+         double kval = tsys->nm_distro.at( jj ).k;
          smin        = qMin( smin, sval );
          smax        = qMax( smax, sval );
          kmin        = qMin( kmin, kval );
@@ -1102,7 +859,7 @@
  << plt_kmin << plt_kmax;
 }
 
-// Sort distribution solute list by s,k values and optionally reduce
+// Sort distribution solute list by s,d values and optionally reduce
 void US_Density_Match::sort_distro( QList< S_Solute >& listsols,
       bool reduce )
 {
@@ -1132,7 +889,7 @@
       {     // loop to compare each entry to previous
           sol2    = *jj;         // solute entry
 
-          if ( sol1.s != sol2.s  ||  sol1.k != sol2.k )
+          if ( sol1.s != sol2.s  ||  sol1.d != sol2.d )
           {   // not a duplicate, so output to temporary list
              reduced.append( sol2 );
              jdup    = 0;
@@ -1141,8 +898,8 @@
           else
           {  // duplicate, so sum c value;
              sol2.c += sol1.c;   // sum c value
-             sol2.s  = ( sol1.s + sol2.s ) * 0.5;  // average s,k
-             sol2.k  = ( sol1.k + sol2.k ) * 0.5;
+             sol2.s  = ( sol1.s + sol2.s ) * 0.5;  // average s,d
+             sol2.d  = ( sol1.d + sol2.d ) * 0.5;
              reduced.replace( reduced.size() - 1, sol2 );
              kdup    = max( kdup, ++jdup );
           }
@@ -1169,51 +926,6 @@
    return;
 }
 
-void US_Density_Match::timerEvent( QTimerEvent *event )
-{
-   int tm_id  = event->timerId();
-
-   if ( tm_id != patm_id )
-   {  // if other than plot loop timer event, pass on to normal handler
-      QWidget::timerEvent( event );
-      return;
-   }
-
-   int syssiz = system.size();
-   int maxsiz = syssiz - 1;
-   int jdistr = curr_distr + 1;
-
-   if ( syssiz > 0  &&  looping )
-   {   // If still looping, plot the next distribution
-      if ( jdistr > maxsiz )
-      {  // If we have passed the end in looping, reset
-         jdistr     = 0;
-
-         if ( ! cont_loop )
-         {  // If not in continuous loop, turn off looping flag
-            jdistr     = curr_distr;
-            looping    = false;
-         }
-
-         else
-         {  // If in continuous loop, turn off save-plot flag
-            need_save  = false;
-         }
-      }
-      curr_distr = jdistr;
-      plot_data();
-   }
-
-   if ( curr_distr > maxsiz  ||  !looping )
-   {  // If past last distro or Stop clicked, stop the loop
-      killTimer( tm_id );
-      pb_stopplt->setEnabled( false );
-      curr_distr = ( curr_distr > maxsiz ) ? maxsiz : curr_distr;
-      need_save  = ck_savepl->isChecked()  &&  !cont_loop;
-   }
-   ct_curr_distr->setValue( curr_distr + 1 );
-}
-
 // Reset Disk_DB control whenever data source is changed in any dialog
 void US_Density_Match::update_disk_db( bool isDB )
 {
@@ -1256,11 +968,11 @@
 void US_Density_Match::remove_distro( void )
 {
 qDebug() << "Remove Distros";
-   US_RemoveModels rmvd( system );
+   US_RemoveModels rmvd( alldis );
 
    if ( rmvd.exec() == QDialog::Accepted )
    {
-      int jd     = system.size();
+      int jd     = alldis.size();
 
       if ( jd < 1 )
       {
@@ -1281,15 +993,34 @@
 // Select coordinate for horizontal axis
 void US_Density_Match::select_x_axis( int ival )
 {
+DbgLv(1) << "sel_x:  ival" << ival;
+#if 0
+   const QString xlabs[] = {   "mass", "f/f0",   "rh", "vbar",     "s" };
+   const double  xvlos[] = {     2e+4,   1.0,    2e+4,  0.60,      1.0 };
+   const double  xvhis[] = {     1e+5,   4.0,    1e+5,  0.80,     10.0 };
+   const double  xmins[] = {      0.0,   1.0,     0.0,  0.01, -10000.0 };
+   const double  xmaxs[] = {    1e+10,  50.0,   1e+10,  3.00,  10000.0 };
+   const double  xincs[] = {   1000.0,  0.01,  1000.0,  0.01,     0.01 };
+#endif
+
+   const QString xlabs[] = {      "s", "f/f0", "mass","vbar", "D", "f",  "r"   };
+   const double  xvlos[] = {      1.0,   1.0,    2e+4,  0.60, 1e-8, 1e-8, 1e-8 };
+   const double  xvhis[] = {     10.0,   4.0,    1e+5,  0.80, 1e-7, 1e-7, 1e-7 };
+   const double  xmins[] = { -10000.0,   1.0,     0.0,  0.01, 1e-9, 1e-9, 1e-9 };
+   const double  xmaxs[] = {  10000.0,  50.0,   1e+10,  3.00, 1e-5, 1e-5, 1e-4 };
+   const double  xincs[] = {     0.01,  0.01,  1000.0,  0.01, 1e-9, 1e-9, 1e-9 };
+#if 0
    const QString xlabs[] = {      "s", "f/f0",  "MW", "vbar", "D", "f"  };
    const double  xvlos[] = {      1.0,   1.0,   2e+4,  0.60, 1e-8, 1e-8 };
    const double  xvhis[] = {     10.0,   4.0,   1e+5,  0.80, 1e-7, 1e-7 };
    const double  xmins[] = { -10000.0,   1.0,    0.0,  0.01, 1e-9, 1e-9 };
    const double  xmaxs[] = {  10000.0,  50.0,  1e+10,  3.00, 1e-5, 1e-5 };
    const double  xincs[] = {     0.01,  0.01, 1000.0,  0.01, 1e-9, 1e-9 };
+#endif
 
    plot_x     = ival;
 
+#if 0
    lb_plt_smin->setText( tr( "Plot Limit " ) + xlabs[ plot_x ]
                        + tr( " Minimum:" ) );
    lb_plt_smax->setText( tr( "Plot Limit " ) + xlabs[ plot_x ]
@@ -1300,115 +1031,61 @@
    ct_plt_smax->setSingleStep( xincs[ plot_x ] );
    ct_plt_smin->setValue( xvlos[ plot_x ] );
    ct_plt_smax->setValue( xvhis[ plot_x ] );
+#endif
+DbgLv(1) << "sel_x:   lab vlos vhis xmin xmax xinc" << xlabs[plot_x]
+ << xvlos[plot_x] << xvhis[plot_x] << xmins[plot_x] << xmaxs[plot_x]
+ << xincs[plot_x];
 
-   rb_y_s   ->setEnabled( plot_x != ATTR_S );
-   rb_y_ff0 ->setEnabled( plot_x != ATTR_K );
-   rb_y_mw  ->setEnabled( plot_x != ATTR_W );
-   rb_y_vbar->setEnabled( plot_x != ATTR_V );
-   rb_y_D   ->setEnabled( plot_x != ATTR_D );
-   rb_y_f   ->setEnabled( plot_x != ATTR_F );
+   build_bf_distro();
 
-   build_xy_distro();
-
    set_limits();
 
    plot_data();
 }
 
-// Select coordinate for vertical axis
-void US_Density_Match::select_y_axis( int ival )
+// (Re-)generate the BF version of the current distribution
+void US_Density_Match::build_bf_distro()
 {
-   const QString ylabs[] = {      "s", "f/f0",  "MW", "vbar",    "D", "f"  };
-   const double  yvlos[] = {      1.0,   1.0,   2e+4,  0.60,     0.0, 1e-8 };
-   const double  yvhis[] = {     10.0,   4.0,   1e+5,  0.80,    30.0, 1e-7 };
-   const double  ymins[] = { -10000.0,   1.0,    0.0,  0.01,     0.0, 1e-9 };
-   const double  ymaxs[] = {  10000.0,  50.0,  1e+10,  3.00, 10000.0, 1e-5 };
-   const double  yincs[] = {     0.01,  0.01, 1000.0,  0.01,    0.01, 1e-9 };
-
-   plot_y     = ival;
-qDebug() << "select-y: plot_y" << plot_y;
-
-   lb_plt_kmin->setText( tr( "Plot Limit " ) + ylabs[ plot_y ]
-                       + tr( " Minimum:" ) );
-   lb_plt_kmax->setText( tr( "Plot Limit " ) + ylabs[ plot_y ]
-                       + tr( " Maximum:" ) );
-qDebug() << "  ylab" << ylabs[plot_y];
-   ct_plt_kmin->setRange( ymins[ plot_y ], ymaxs[ plot_y ] );
-   ct_plt_kmax->setRange( ymins[ plot_y ], ymaxs[ plot_y ] );
-   ct_plt_kmin->setSingleStep( yincs[ plot_y ] );
-   ct_plt_kmax->setSingleStep( yincs[ plot_y ] );
-   ct_plt_kmin->setValue( yvlos[ plot_y ] );
-   ct_plt_kmax->setValue( yvhis[ plot_y ] );
-qDebug() << "  yval-lo val-hi" << yvlos[plot_y] << yvhis[plot_y];
-
-   rb_x_s   ->setEnabled( plot_y != ATTR_S );
-   rb_x_ff0 ->setEnabled( plot_y != ATTR_K );
-   rb_x_mw  ->setEnabled( plot_y != ATTR_W );
-   rb_x_vbar->setEnabled( plot_y != ATTR_V );
-   rb_x_D   ->setEnabled( plot_y != ATTR_D );
-   rb_x_f   ->setEnabled( plot_y != ATTR_F );
-
-   build_xy_distro();
-
-   set_limits();
-
-   plot_data();
-}
-
-// Re-generate the XY version of the current distribution
-void US_Density_Match::build_xy_distro()
-{
-   if ( system.size() < 1 )
+   if ( alldis.size() < 1 )
       return;
-   DisSys* tsys     = (DisSys*)&system.at( curr_distr );
-   if ( tsys->plot_x == plot_x  && tsys->plot_y == plot_y )
+   DisSys* tsys     = (DisSys*)&alldis.at( curr_distr );
+   if ( tsys->plot_x == plot_x )
       return;
 
-   tsys->xy_distro.clear();
+   tsys->nm_distro.clear();
    tsys->plot_x     = plot_x;
-   tsys->plot_y     = plot_y;
    double tot_conc  = 0.0;
-   int    nsolsk    = tsys->sk_distro.size();
+   int    nsolin    = tsys->in_distro.size();
 
    // Create solute list with specified x,y
-   for ( int ii = 0; ii < nsolsk; ii++ )
+   for ( int ii = 0; ii < nsolin; ii++ )
    {
-      S_Solute sol_sk  = tsys->sk_distro[ ii ];
-      S_Solute sol_xy  = sol_sk;
+      S_Solute sol_in  = tsys->in_distro[ ii ];
+      S_Solute sol_nm  = sol_in;
 
-      sol_xy.s  = ( plot_x == ATTR_S ) ? sol_sk.s : sol_xy.s;
-      sol_xy.s  = ( plot_x == ATTR_K ) ? sol_sk.k : sol_xy.s;
-      sol_xy.s  = ( plot_x == ATTR_W ) ? sol_sk.w : sol_xy.s;
-      sol_xy.s  = ( plot_x == ATTR_V ) ? sol_sk.v : sol_xy.s;
-      sol_xy.s  = ( plot_x == ATTR_D ) ? sol_sk.d : sol_xy.s;
-      sol_xy.s  = ( plot_x == ATTR_F ) ? sol_sk.f : sol_xy.s;
-      sol_xy.k  = ( plot_y == ATTR_S ) ? sol_sk.s : sol_xy.k;
-      sol_xy.k  = ( plot_y == ATTR_K ) ? sol_sk.k : sol_xy.k;
-      sol_xy.k  = ( plot_y == ATTR_W ) ? sol_sk.w : sol_xy.k;
-      sol_xy.k  = ( plot_y == ATTR_V ) ? sol_sk.v : sol_xy.k;
-      sol_xy.k  = ( plot_y == ATTR_D ) ? sol_sk.d : sol_xy.k;
-      sol_xy.k  = ( plot_y == ATTR_F ) ? sol_sk.f : sol_xy.k;
-      tot_conc += sol_sk.c;
-      tsys->xy_distro << sol_xy;
+      sol_nm.s  = ( plot_x == ATTR_S ) ? sol_in.s : sol_nm.s;
+      sol_nm.s  = ( plot_x == ATTR_K ) ? sol_in.k : sol_nm.s;
+      sol_nm.s  = ( plot_x == ATTR_W ) ? sol_in.w : sol_nm.s;
+      sol_nm.s  = ( plot_x == ATTR_V ) ? sol_in.v : sol_nm.s;
+      sol_nm.s  = ( plot_x == ATTR_D ) ? sol_in.d : sol_nm.s;
+      sol_nm.s  = ( plot_x == ATTR_F ) ? sol_in.f : sol_nm.s;
+      tot_conc += sol_in.c;
+      tsys->nm_distro << sol_nm;
    }
 
    // Sort and possibly reduce XY distro
-   sort_distro( tsys->xy_distro, true );
+   sort_distro( tsys->nm_distro, true );
 
    // Create Z-as-percentage version of xy distribution
-   int    nsolxy = tsys->xy_distro.size();
-DbgLv(1) << "Bld: nsolsk nsolxy" << nsolsk << nsolxy;
-   tsys->xy_distro_zp.clear();
+   int    nsolnm = tsys->nm_distro.size();
+DbgLv(1) << "Bld: nsolin nsolnm" << nsolin << nsolnm;
 
-   for ( int ii = 0; ii < nsolxy; ii++ )
+   for ( int ii = 0; ii < nsolnm; ii++ )
    {
-      S_Solute sol_xy  = tsys->xy_distro[ ii ];
-      double cozpc     = sol_xy.c * 100.0 / tot_conc;
-      sol_xy.c         = cozpc;
-      plt_zmin_zp      = qMin( plt_zmin_zp, cozpc );
-      plt_zmax_zp      = qMax( plt_zmax_zp, cozpc );
+      S_Solute sol_nm  = tsys->nm_distro[ ii ];
+      sol_nm.c        /= tot_conc;
 
-      tsys->xy_distro_zp << sol_xy;
+      tsys->nm_distro << sol_nm;
    }
 }
 
@@ -1423,32 +1100,22 @@
    else if ( pltndx == ATTR_K )
       a_title  = tr( "Frictional Ratio f/f0" );
    else if ( pltndx == ATTR_W )
-      a_title  = tr( "Molecular Weight (Dalton)" );
+      a_title  = tr( "Molar Mass (Dalton)" );
    else if ( pltndx == ATTR_V )
       a_title  = tr( "Vbar at 20" ) + DEGC;
    else if ( pltndx == ATTR_D )
       a_title  = tr( "Diffusion Coefficient (1e-7)" );
+   else if ( pltndx == ATTR_R )
+      a_title  = tr( "Hydrodynamic Radius" );
    else if ( pltndx == ATTR_F )
-      a_title  = tr( "Frictional Coefficient" );
+      a_title  = tr( "Boundary Fraction" );
 
    return a_title;
 }
 
-// Make a ColorMap copy and return a pointer to the new ColorMap
-QwtLinearColorMap* US_Density_Match::ColorMapCopy( QwtLinearColorMap* colormap )
+// Update structures and plot after division change
+void US_Density_Match::update_divis( double dval )
 {
-   QVector< double >  cstops   = colormap->colorStops();
-   int                lstop    = cstops.count() - 1;
-   QwtInterval        csvals( 0.0, 1.0 );
-   QwtLinearColorMap* cmapcopy = new QwtLinearColorMap( colormap->color1(),
-                                                        colormap->color2() );
-
-   for ( int jj = 1; jj < lstop; jj++ )
-   {
-      QColor scolor = colormap->color( csvals, cstops[ jj ] );
-      cmapcopy->addColorStop( cstops[ jj ], scolor );
-   }
-
-   return cmapcopy;
+DbgLv(1) << "UpdDiv:" << dval;
 }
 

Modified: trunk/programs/us_density_match/us_density_match.h
===================================================================
--- trunk/programs/us_density_match/us_density_match.h	2019-08-08 01:00:11 UTC (rev 2804)
+++ trunk/programs/us_density_match/us_density_match.h	2019-08-10 17:37:42 UTC (rev 2805)
@@ -22,20 +22,19 @@
 //!< \brief Distribution structure
 typedef struct distro_sys
 {
-   QList< S_Solute >   sk_distro;
-   QList< S_Solute >   xy_distro;
-   QList< S_Solute >   sk_distro_zp;
-   QList< S_Solute >   xy_distro_zp;
-   QwtLinearColorMap*  colormap;
+   QList< S_Solute >   in_distro;      // Raw input distribution
+   QList< S_Solute >   nm_distro;      // Normalized concentration distro
+   QList< S_Solute >   bf_distro;      // Boundary fractions distro
    QString             run_name;
    QString             analys_name;
    QString             method;
-   QString             cmapname;
    QString             editGUID;
+   QString             solutionGUID;
+   QString             label;
    int                 distro_type;
    int                 plot_x;
-   int                 plot_y;
-   bool                monte_carlo;
+   int                 solutionID;
+   double              d2opct;
 } DisSys;
 
 //! \brief Less-than function for sorting distributions
@@ -52,7 +51,7 @@
 
    private:
 
-      enum attr_type { ATTR_S, ATTR_K, ATTR_W, ATTR_V, ATTR_D, ATTR_F };
+      enum attr_type { ATTR_S, ATTR_K, ATTR_W, ATTR_V, ATTR_D, ATTR_F, ATTR_R };
 
       QLabel*       lb_plt_smin;
       QLabel*       lb_plt_smax;
@@ -63,7 +62,6 @@
 
       QTextEdit*    te_distr_info;
 
-      QLineEdit*    le_cmap_name;
       QLineEdit*    le_prefilt;
 
       US_Help       showHelp;
@@ -81,15 +79,13 @@
       QwtCounter*   ct_tolerance;
       QwtCounter*   ct_division;
       QwtCounter*   ct_smoothing;
-      QwtCounter*   ct_boundaryPercent;
+      QwtCounter*   ct_boundaryPct;
       QwtCounter*   ct_boundaryPos;
 
       QwtPlot*      data_plot;
 
       QwtPlotPicker* pick;
 
-      QwtLinearColorMap* colormap;
-
       US_Disk_DB_Controls* dkdb_cntrls;
 
       QPushButton*  pb_pltall;
@@ -98,39 +94,28 @@
       QPushButton*  pb_reset;
       QPushButton*  pb_prefilt;
       QPushButton*  pb_lddistr;
-      QPushButton*  pb_ldcolor;
       QPushButton*  pb_help;
       QPushButton*  pb_close;
       QPushButton*  pb_rmvdist;
 
       QCheckBox*    ck_autosxy;
       QCheckBox*    ck_autoscz;
-      QCheckBox*    ck_conloop;
       QCheckBox*    ck_plot_sk;
       QCheckBox*    ck_plot_wk;
       QCheckBox*    ck_plot_sv;
       QCheckBox*    ck_plot_wv;
-      QCheckBox*    ck_zpcent;
       QCheckBox*    ck_savepl;
       QCheckBox*    ck_locsave;
 
-      QRadioButton* rb_x_s;
+      QRadioButton* rb_x_mass;
       QRadioButton* rb_x_ff0;
-      QRadioButton* rb_x_mw;
+      QRadioButton* rb_x_rh;
       QRadioButton* rb_x_vbar;
-      QRadioButton* rb_x_D;
-      QRadioButton* rb_x_f;
-      QRadioButton* rb_y_s;
-      QRadioButton* rb_y_ff0;
-      QRadioButton* rb_y_mw;
-      QRadioButton* rb_y_vbar;
-      QRadioButton* rb_y_D;
-      QRadioButton* rb_y_f;
+      QRadioButton* rb_x_s;
 
       QButtonGroup* bg_x_axis;
-      QButtonGroup* bg_y_axis;
 
-      QList< DisSys > system;
+      QList< DisSys > alldis;
 
       double        resolu;
       double        plt_smin;
@@ -139,10 +124,6 @@
       double        plt_kmax;
       double        plt_zmin;
       double        plt_zmax;
-      double        plt_zmin_zp;
-      double        plt_zmax_zp;
-      double        plt_zmin_co;
-      double        plt_zmax_co;
       double        s_range;
       double        k_range;
       double        xreso;
@@ -150,27 +131,20 @@
       double        zfloor;
 
       int           curr_distr;
-      int           init_solutes;
-      int           mc_iters;
       int           patm_id;
       int           patm_dlay;
       int           dbg_level;
       int           plot_x;
-      int           plot_y;
 
-      bool          cnst_vbar;
       bool          auto_sxy;
       bool          auto_scz;
       bool          cont_loop;
-      bool          looping;
       bool          need_save;
       bool          runsel;
       bool          latest;
-      bool          zpcent;
 
       QString       xa_title;
       QString       ya_title;
-      QString       cmapname;
       QString       mfilter;
 
       QStringList   pfilts;
@@ -180,7 +154,6 @@
       void update_resolu(     double );
       void update_xreso(      double );
       void update_yreso(      double );
-      void update_zfloor(     double );
       void update_curr_distr( double );
       void update_plot_smin(  double );
       void update_plot_smax(  double );
@@ -190,28 +163,21 @@
       void plot_data(      void );
       void select_autosxy( void );
       void select_autoscz( void );
-      void select_conloop( void );
       void update_disk_db( bool );
+      void update_divis  ( double );
       void select_prefilt( void );
       void load_distro(    void );
       void load_distro(    US_Model, QString );
-      void load_color(     void );
       void plotall(     void );
-      void stop(        void );
       void reset(       void );
       void set_limits(  void );
       void sort_distro( QList< S_Solute >&, bool );
       void remove_distro( void );
       void select_x_axis( int  );
-      void select_y_axis( int  );
-      void build_xy_distro( void );
+      void build_bf_distro( void );
       QString anno_title  ( int );
-      QwtLinearColorMap* ColorMapCopy( QwtLinearColorMap* );
 
       void help       ( void )
       { showHelp.show_help( "pseudo3d_combine.html" ); };
-
-   protected:
-      virtual void timerEvent( QTimerEvent *e );
 };
 #endif



More information about the us-commits mailing list