30 theads <<
"Type" <<
"Label" <<
"SubType" <<
"Source"
31 <<
"Children\nDB, Local" <<
"Descendants\nDB, Local";
34 tw_recs->setHeaderLabels( theads );
37 tw_recs->setObjectName( QString(
"tree-widget" ) );
38 tw_recs->setAutoFillBackground(
true );
44 QList< QTreeWidgetItem* > listi =
tw_recs->findItems(
45 c1str, Qt::MatchExactly | Qt::MatchWrap | Qt::MatchRecursive, 0 );
47 DbgLv(1) <<
"DT: togl_exp str show" << c1str << show;
48 for (
int ii = 0; ii < listi.size(); ii++ )
49 listi.at( ii )->setExpanded( show );
69 QTreeWidgetItem* pitems[4];
85 progress->setMaximum(
ncrecs );
86 progress->setValue ( 0 );
88 for (
int ii = 0; ii <
ncrecs; ii++ )
106 else if ( ityp == 2 )
111 else if ( ityp == 3 )
116 else if ( ityp == 4 )
128 else if ( isDba && !isLoc )
138 else if ( ityp == 2 )
143 else if ( ityp == 3 )
148 else if ( ityp == 4 )
167 QString cont1 =
cdesc.
contents.section(
" ", 0, 1 ).simplified();
168 QString cont2 =
cdesc.
contents.section(
" ", 2, 4 ).simplified();
173 DbgLv(1) <<
"CONFLICT cont1 cont2" << cont1 << cont2;
182 else if ( ityp == 2 )
187 else if ( ityp == 3 )
192 else if ( ityp == 4 )
208 nchdb = nchlo = ndedb = ndelo = 0;
216 for (
int jj = ( ii + 1 ); jj <
ncrecs; jj++ )
229 bool child = ( ( ddesc.
recType - ityp ) == 1 );
231 ndedb += ( isDba ) ? 1 : 0;
232 nchdb += ( isDba && child ) ? 1 : 0;
233 ndelo += ( isLoc ) ? 1 : 0;
234 nchlo += ( isLoc && child ) ? 1 : 0;
237 anch = ( ityp < 4 ) ?
238 QString(
"%1, %2" ).arg( nchdb ).arg( nchlo ) :
"";
239 ande = ( ityp < 3 ) ?
240 QString(
"%1, %2" ).arg( ndedb ).arg( ndelo ) :
"";
242 QTreeWidgetItem* item;
243 int wiutype = (int)QTreeWidgetItem::UserType + ii;
245 cvals << rtyp << labl << subt << rsrc << anch << ande;
249 item =
new QTreeWidgetItem(
tw_recs, cvals, wiutype );
254 item =
new QTreeWidgetItem( pitems[ ityp - 2 ], cvals, wiutype );
257 pitems[ ityp - 1 ] = item;
259 for (
int jj = 0; jj <
ntcols; jj++ )
261 item->setForeground( jj, fbru );
262 item->setBackground( jj, bbru );
265 progress->setValue( ii + 1 );
266 qApp->processEvents();
272 for (
int jj = 0; jj <
ntcols; jj++ )
274 tw_recs->resizeColumnToContents( jj );
287 int irow = item->type() - (int)QTreeWidgetItem::UserType;
291 for (
int ii = 0; ii < nsel; ii++ )
293 QTreeWidgetItem* jitem =
selitems[ ii ];
294 int jrow = jitem->type() - (int)QTreeWidgetItem::UserType;
295 irow = qMin( irow, jrow );
299 DbgLv(2) <<
" context_menu row" << irow+1;
301 DbgLv(2) <<
" context_menu RTN setCurrent";
303 DbgLv(2) <<
" context_menu RTN current_datadesc";
305 QString tupload = tr(
" upload record to DB" );
306 QString tdnload = tr(
" download record to local" );
307 QString tdbasrm = tr(
" remove branch from DB" );
308 QString tloclrm = tr(
" remove branch from local" );
309 QString tbothrm = tr(
" remove branch from both" );
310 QString tshdeta = tr(
" show record details" );
314 tupload.replace( tr(
"record" ), tr(
"branches" ) );
315 tdnload.replace( tr(
"record" ), tr(
"branches" ) );
316 tdbasrm.replace( tr(
"branch" ), tr(
"branches" ) );
317 tloclrm.replace( tr(
"branch" ), tr(
"branches" ) );
318 tbothrm.replace( tr(
"branch" ), tr(
"branches" ) );
319 tshdeta.replace( tr(
"record" ), tr(
"records" ) );
324 tupload.replace( tr(
"record" ), tr(
"descendants" ) );
325 tupload.replace( tr(
"branches" ), tr(
"descendants" ) );
326 tdnload.replace( tr(
"record" ), tr(
"descendants" ) );
327 tdnload.replace( tr(
"branches" ), tr(
"descendants" ) );
328 tdbasrm.replace( tr(
"branches" ), tr(
"descendants" ) );
329 tdbasrm.replace( tr(
"branch" ), tr(
"descendants" ) );
330 tloclrm.replace( tr(
"branches" ), tr(
"descendants" ) );
331 tloclrm.replace( tr(
"branch" ), tr(
"descendants" ) );
332 tbothrm.replace( tr(
"branches" ), tr(
"descendants" ) );
333 tbothrm.replace( tr(
"branch" ), tr(
"descendants" ) );
336 QMenu* cmenu =
new QMenu();
337 QAction* aupload =
new QAction( tupload,
parentw );
338 QAction* adnload =
new QAction( tdnload,
parentw );
339 QAction* adbasrm =
new QAction( tdbasrm,
parentw );
340 QAction* aloclrm =
new QAction( tloclrm,
parentw );
341 QAction* abothrm =
new QAction( tbothrm,
parentw );
342 QAction* ashdeta =
new QAction( tshdeta,
parentw );
344 cmenu->addAction( aupload );
345 cmenu->addAction( adnload );
346 cmenu->addAction( adbasrm );
347 cmenu->addAction( aloclrm );
348 cmenu->addAction( abothrm );
349 cmenu->addAction( ashdeta );
350 DbgLv(2) <<
" context_menu RTN addAction";
352 connect( aupload, SIGNAL( triggered() ),
354 connect( adnload, SIGNAL( triggered() ),
356 connect( adbasrm, SIGNAL( triggered() ),
358 connect( aloclrm, SIGNAL( triggered() ),
360 connect( abothrm, SIGNAL( triggered() ),
362 connect( ashdeta, SIGNAL( triggered() ),
369 aupload->setEnabled(
false );
370 aloclrm->setEnabled(
false );
371 abothrm->setEnabled(
false );
376 adnload->setEnabled(
false );
377 adbasrm->setEnabled(
false );
378 abothrm->setEnabled(
false );
393 aupload->setEnabled(
false );
396 DbgLv(2) <<
" context_menu CALL cmenu exec";
397 cmenu->exec( QCursor::pos() );
404 QString fileexts = tr(
"Text,Log files (*.txt *.log);;" )
405 + tr(
"All files (*)" );
407 tr(
"Data Tree Columns --\n\n" ) +
408 tr(
" \"Type\" : Type of data set record -\n" ) +
409 tr(
" \"Raw\", \"Edited\", \"Model\" or \"Noise\".\n") +
410 tr(
" \"Label\" : Short description of specific record.\n" ) +
411 tr(
" \"SubType\" : Record-specific type (e.g. \"2DSA\", \"TI\").\n")+
412 tr(
" \"Source\" : Location/state (see color legend below)-\n" ) +
413 tr(
" \"DB\" (Blue, database); \n" ) +
414 tr(
" \"Local\" (Brown, local disk); \n" ) +
415 tr(
" \"In Sync\" (Green, both, consistent); \n" ) +
416 tr(
" \"Conflict\" (Red, both, inconsistent); \n" ) +
417 tr(
" \"dummy\" (Gray, missing parent filler).\n") +
418 tr(
" \"Children : Number of Children of this row\n" ) +
419 tr(
" DB, Local\" from Database, Local-disk.\n" ) +
420 tr(
" \"Descendants : Number of Descendants of this row\n" ) +
421 tr(
" DB, Local\" from Database, Local-disk.\n\n" ) +
422 tr(
"Tree Row Color Legend --\n\n" ) +
423 tr(
" Blue : This record exists for database only.\n" ) +
424 tr(
" Brown : This record exists for local disk only.\n" ) +
425 tr(
" Green : This record exists and is consistent\n" ) +
426 tr(
" for both database and local.\n" ) +
427 tr(
" Red : This record exists for both, but is inconsistent.\n")+
428 tr(
" Gray : This record is a filler for a missing parent.\n\n" ) +
429 tr(
"Tree Entry Processes --\n\n" ) +
430 tr(
" A right-mouse-button click on any cell of a row pops up\n" ) +
431 tr(
" a context menu with actions to take for the record.\n" ) +
432 tr(
" Menu items will only be enabled if the action is\n" ) +
433 tr(
" appropriate for the particular record shown in the row.\n" ) +
434 tr(
" Possible actions are:\n" ) +
435 tr(
" \"upload to DB\"\n" ) +
436 tr(
" -> Upload this local record to the database;\n" ) +
437 tr(
" \"download to local\"\n" ) +
438 tr(
" -> Download this DB record to local disk.\n" ) +
439 tr(
" \"remove from DB\"\n" ) +
440 tr(
" -> Remove this record from the database.\n" ) +
441 tr(
" \"remove from local\"\n" ) +
442 tr(
" > Remove this record from local disk.\n" ) +
443 tr(
" \"remove both\"\n" ) +
444 tr(
" -> Remove this record from both DB and local.\n" ) +
445 tr(
" \"show details\"\n" ) +
446 tr(
" -> Pop up a text dialog with details about the record.\n" ) +
447 tr(
"Detailed Help --\n\n" ) +
448 tr(
" Click on the \"Help\" button for standard documentation,\n" ) +
449 tr(
" including sample images and details on all GUI elements.\n" );
452 editd->setWindowTitle( tr(
"Data Sets Tree Help and Legend" ) );
453 editd->move( QCursor::pos() + QPoint( 200, 200 ) );
454 editd->resize( 600, 500 );
457 editd->
e->setText( mtext );
465 QString item_exs = tr(
"Local disk only" );
466 QString item_act = tr(
"DB create" );
467 DbgLv(2) <<
"ITEM Upload";
468 int irow =
tw_item->type() - (int)QTreeWidgetItem::UserType;
474 item_exs = tr(
"both DB and Local" );
475 item_act = tr(
"DB replace" );
480 msgBox.setWindowTitle( item_act );
481 msgBox.setTextFormat( Qt::RichText );
482 msgBox.setText(
action_text( item_exs, item_act ) );
483 msgBox.addButton( QMessageBox::No );
484 msgBox.addButton( QMessageBox::Yes );
485 msgBox.setDefaultButton( QMessageBox::No );
487 if ( msgBox.exec() == QMessageBox::Yes )
489 DbgLv(2) <<
" ITEM ACTION: YES";
497 DbgLv(2) <<
" ITEM ACTION: NO";
507 QString item_exs = tr(
"Database only" );
508 QString item_act = tr(
"Local file create" );
509 DbgLv(2) <<
"ITEM Download";
510 int irow =
tw_item->type() - (int)QTreeWidgetItem::UserType;
516 item_exs = tr(
"both DB and Local" );
517 item_act = tr(
"Local file replace" );
522 msgBox.setWindowTitle( item_act );
523 msgBox.setTextFormat( Qt::RichText );
524 msgBox.setText(
action_text( item_exs, item_act ) );
525 msgBox.addButton( QMessageBox::No );
526 msgBox.addButton( QMessageBox::Yes );
527 msgBox.setDefaultButton( QMessageBox::No );
529 if ( msgBox.exec() == QMessageBox::Yes )
531 DbgLv(2) <<
" ITEM ACTION: YES";
539 DbgLv(2) <<
" ITEM ACTION: NO";
547 DbgLv(2) <<
"ITEM Remove from DB";
548 QString item_exs = tr(
"Database only" );
549 QString item_act = tr(
"DB-only remove" );
551 int irow =
tw_item->type() - (int)QTreeWidgetItem::UserType;
557 msgBox.setWindowTitle( item_act );
558 msgBox.setTextFormat( Qt::RichText );
559 msgBox.setText(
action_text( item_exs, item_act ) );
560 msgBox.addButton( QMessageBox::No );
561 msgBox.addButton( QMessageBox::Yes );
562 msgBox.setDefaultButton( QMessageBox::No );
564 if ( msgBox.exec() == QMessageBox::Yes )
566 DbgLv(2) <<
" ITEM ACTION: YES";
574 DbgLv(2) <<
" ITEM ACTION: NO";
582 DbgLv(2) <<
"ITEM Remove from Local";
583 QString item_exs = tr(
"Local disk only" );
584 QString item_act = tr(
"Local-only remove" );
586 int irow =
tw_item->type() - (int)QTreeWidgetItem::UserType;
592 msgBox.setWindowTitle( item_act );
593 msgBox.setTextFormat( Qt::RichText );
594 msgBox.setText(
action_text( item_exs, item_act ) );
595 msgBox.addButton( QMessageBox::No );
596 msgBox.addButton( QMessageBox::Yes );
597 msgBox.setDefaultButton( QMessageBox::No );
599 if ( msgBox.exec() == QMessageBox::Yes )
601 DbgLv(2) <<
" ITEM ACTION: YES";
609 DbgLv(2) <<
" ITEM ACTION: NO";
617 DbgLv(2) <<
"ITEM Remove Both DB and Local";
618 QString item_exs = tr(
"both DB and Local" );
619 QString item_act = tr(
"DB+Local remove" );
621 int irow =
tw_item->type() - (int)QTreeWidgetItem::UserType;
627 msgBox.setWindowTitle( item_act );
628 msgBox.setTextFormat( Qt::RichText );
629 msgBox.setText(
action_text( item_exs, item_act ) );
630 msgBox.addButton( QMessageBox::No );
631 msgBox.addButton( QMessageBox::Yes );
632 msgBox.setDefaultButton( QMessageBox::No );
634 if ( msgBox.exec() == QMessageBox::Yes )
636 DbgLv(2) <<
" ITEM ACTION: YES";
644 DbgLv(2) <<
" ITEM ACTION: NO";
658 const char* rtyps[] = {
"RawData",
"EditedData",
"Model",
"Noise" };
659 QString fileexts = tr(
"Text,Log files (*.txt *.log)"
661 int irow =
tw_item->type() - (int)QTreeWidgetItem::UserType;
662 DbgLv(2) <<
"DT: i_details row" << irow;
668 tr(
"Data Tree Item at Row %1 -- \n\n" ).arg( irow ) +
669 tr(
" Type : %1 (%2)\n" )
678 tr(
" File Directory : " )
680 tr(
" File Name : " )
693 QString cont1 =
cdesc.
contents.section(
" ", 0, 1 ).simplified();
694 QString cont2 =
cdesc.
contents.section(
" ", 2, 4 ).simplified();
696 tr(
" Content Checks : " ) + cont1 +
"\n" +
707 QString fname1=tmpdir+
"/model1d.xml";
708 QString fname2=tmpdir+
"/model2f.xml";
709 model1.write(fname1);
710 model2.
write(fname2);
711 QString fname3=tmpdir+
"/model3d.xml";
712 QString fname4=tmpdir+
"/model4f.xml";
713 model1.update_coefficients();
715 model1.write(fname3);
716 model2.
write(fname4);
723 editd->setWindowTitle( tr(
"Data Tree Entry Details" ) );
724 editd->move( QCursor::pos() + QPoint( 100, 100 ) );
725 editd->resize( 720, 360 );
728 editd->
e->setText( mtext );
735 const char* rtyps[] = {
"RawData",
"EditedData",
"Model",
"Noise" };
736 QString fileexts = tr(
"Text,Log files (*.txt *.log)"
744 int krow =
selrows[ nsrows - 1 ];
745 krow = ( narows > 0 ) ?
actrows[ narows - 1 ] : krow;
746 DbgLv(2) <<
"DT: i_details row" << irow;
751 tr(
"Data Tree Items from Rows %1 to %2 -- \n\n" )
752 .arg( irow ).arg( krow ) +
753 tr(
" Type (first) : %1\n" ).arg( rtyps[
cdesc.
recType - 1 ] ) +
756 tr(
" File Directory : " )
758 tr(
" File Name : " )
760 tr(
" Type (last) : %1\n" ).arg( rtyps[ kdesc.
recType - 1 ] ) +
761 tr(
" Description : " ) + kdesc.
description +
"\n" +
762 tr(
" DB record ID : %1\n" ).arg( kdesc.
recordID ) +
763 tr(
" File Directory : " )
764 + kdesc.
filename.section(
"/", 0, -2 ) +
"\n" +
765 tr(
" File Name : " )
766 + kdesc.
filename.section(
"/", -1, -1 ) +
"\n" +
767 tr(
" Total Selected Records : " ) + QString::number( nsrows ) +
"\n" +
768 tr(
" Total Action Records : " ) + QString::number( narows ) +
"\n" +
769 tr(
" Total Raw Selections : " ) + QString::number( nrrows ) +
"\n";
773 editd->setWindowTitle( tr(
"Data Tree Entries Details" ) );
774 editd->move( QCursor::pos() + QPoint( 100, 100 ) );
775 editd->resize( 760, 320 );
778 editd->
e->setText( mtext );
785 const char* rtyps[] = {
"RawData",
"EditedData",
"Model",
"Noise" };
786 int sizert =
sizeof( rtyps ) /
sizeof( rtyps[ 0 ] );
788 if ( recType > 0 && recType <= sizert )
790 item_act = QString( rtyps[ recType - 1 ] ) +
" " + item_act;
797 QString lines = (
selitems.size() == 1 )
798 ? tr(
"This item exists on %1.<br>"
799 "Are you sure you want to proceed with a %2?<ul>" )
800 .arg( exstext ).arg( acttext )
801 : tr(
"These items exists on %1.<br>"
802 "Are you sure you want to proceed with %2s?<ul>" )
803 .arg( exstext ).arg( acttext );
805 tr(
"<li><b>No </b> to cancel the action;</li>"
806 "<li><b>Yes</b> to proceed with the action.</li></ul>" );
819 lb_status->setText( tr(
"\"%1\" Success!" ).arg( item_act ) );
825 item_act + tr(
" *ERROR*!" ),
826 tr(
"The \"%1\" action had an error: %2" )
827 .arg( item_act ).arg( stat )
829 lb_status->setText( tr(
"\"%1\" ERROR!" ).arg( item_act ) );
835 lb_status->setText( tr(
"\"%1\" Cancelled!" ).arg( item_act ) );
842 QString hexn = QString().sprintf(
"0x%3.3x", istate );
844 QString flags =
"NOSTAT";
847 flags = flags +
"|REC_DB";
850 flags = flags +
"|REC_LO";
853 flags = flags +
"|PAR_DB";
856 flags = flags +
"|PAR_LO";
859 flags = flags +
"|DETAIL";
862 flags = flags +
"|CONSIS";
865 flags = flags +
"|ALL_OK";
867 if ( flags !=
"NOSTAT" )
868 flags = flags.mid( 7, 999 );
870 return "(" + hexn +
") " + flags;
877 DbgLv(1) <<
"ITEM do_actions" << narows << item_exs << item_act;
880 bool frDB = item_exs.contains(
"Datab" )
881 || item_exs.contains(
"DB " );
882 bool frLoc = item_exs.contains(
"Local" );
883 bool frBoth = item_exs.contains(
"both" );
884 frDB = frBoth ?
true : frDB;
885 frLoc = frBoth ?
true : frLoc;
886 bool dnLoad = item_act.contains(
"Local file " );
887 bool upLoad = item_act.contains(
"DB create" )
888 || item_act.contains(
"DB replace" );
889 bool remove = item_act.contains(
"remove" );
893 if (
remove && frDB )
898 for (
int jj = 0; jj < narows; jj++ )
903 DbgLv(1) <<
"RMV_REC: irow ityp lrtyp" << irow << ityp << lrtyp;
915 DbgLv(1) <<
"RMV_REC: karows stat1" << karows << stat1;
927 if (
remove && frLoc )
929 for (
int ii = 4; ii > 1; ii-- )
931 for (
int jj = 0; jj < narows; jj++ )
937 if ( ityp != ii )
continue;
952 for (
int ii = 2; ii < 5; ii++ )
954 for (
int jj = 0; jj < narows; jj++ )
960 if ( ityp != ii )
continue;
977 stlabel->setText( tr(
"Downloading records to local disk..." ) );
978 progress->setMaximum( narows );
979 progress->setValue ( 0 );
981 for (
int ii = 2; ii < 5; ii++ )
983 for (
int jj = 0; jj < narows; jj++ )
989 if ( ityp != ii )
continue;
998 progress->setValue( ++ndown );
1000 qDebug() <<
"DT: DwnLd: ii" << ii <<
"time" << timer.elapsed();
1004 if ( naerrs > 0 && naerrs < narows )
1021 for (
int ii = 0; ii < nsrows; ii++ )
1025 DbgLv(1) <<
"acrow: nsrows" << nsrows;
1028 for (
int ii = 0; ii < nsrows; ii++ )
1033 DbgLv(1) <<
"acrow: irow ityp" << irow << ityp;
1039 for (
int jrow = ( irow + 1 ); jrow <
ncrecs; jrow++ )
1043 DbgLv(1) <<
"acrow: jrow jtyp" << jrow << ddesc.
recType;
1047 if (
selrows.contains( jrow ) )
1062 bool differs =
true;
1063 const double dtoler = 5.0e-5;
1070 double difmax = 0.0;
1072 int dst = dmodel.
load( QString::number( ddesc.
recordID ), dbP );
1081 DbgLv(1) <<
" CONFLICT? dst fst differs" << dst << fst << differs;
1082 if ( dmodel == fmodel )
1098 for (
int ii = 0; ii < dmodel.
components.size(); ii++ )
1106 double valmin = qMin( dcvalu, fcvalu );
1107 valmin = ( valmin == 0.0 ) ? dtoler : valmin;
1108 double difrat = qAbs( dcvalu - fcvalu ) / valmin;
1109 difmax = qMax( difrat, difmax );
1113 valmin = qMin( dcvalu, fcvalu );
1114 valmin = ( valmin == 0.0 ) ? dtoler : valmin;
1115 difrat = qAbs( dcvalu - fcvalu ) / valmin;
1116 difmax = qMax( difrat, difmax );
1118 dcvalu = qAbs( dcomp->
vbar20 );
1119 fcvalu = qAbs( fcomp->
vbar20 );
1120 valmin = qMin( dcvalu, fcvalu );
1121 valmin = ( valmin == 0.0 ) ? dtoler : valmin;
1122 difrat = qAbs( dcvalu - fcvalu ) / valmin;
1123 difmax = qMax( difrat, difmax );
1125 dcvalu = qAbs( dcomp->
mw );
1126 fcvalu = qAbs( fcomp->
mw );
1127 valmin = qMin( dcvalu, fcvalu );
1128 valmin = ( valmin == 0.0 ) ? dtoler : valmin;
1129 difrat = qAbs( dcvalu - fcvalu ) / valmin;
1130 difmax = qMax( difrat, difmax );
1132 dcvalu = qAbs( dcomp->
s );
1133 fcvalu = qAbs( fcomp->
s );
1134 valmin = qMin( dcvalu, fcvalu );
1135 valmin = ( valmin == 0.0 ) ? dtoler : valmin;
1136 difrat = qAbs( dcvalu - fcvalu ) / valmin;
1137 difmax = qMax( difrat, difmax );
1139 dcvalu = qAbs( dcomp->
D );
1140 fcvalu = qAbs( fcomp->
D );
1141 valmin = qMin( dcvalu, fcvalu );
1142 valmin = ( valmin == 0.0 ) ? dtoler : valmin;
1143 difrat = qAbs( dcvalu - fcvalu ) / valmin;
1144 difmax = qMax( difrat, difmax );
1145 DbgLv(1) <<
" CONFLICT? D dcv fcv dr" << dcvalu << fcvalu << difrat;
1147 dcvalu = qAbs( dcomp->
f_f0 );
1148 fcvalu = qAbs( fcomp->
f_f0 );
1149 valmin = qMin( dcvalu, fcvalu );
1150 valmin = ( valmin == 0.0 ) ? dtoler : valmin;
1151 difrat = qAbs( dcvalu - fcvalu ) / valmin;
1152 difmax = qMax( difrat, difmax );
1156 differs = ( difmax > dtoler );
1157 DbgLv(1) <<
" CONFLICT? model difmax differs" << difmax << differs;
1167 double difmax = 0.0;
1169 int dst = dnoise.
load( QString::number( ddesc.
recordID ), dbP );
1178 if ( dnoise == fnoise )
1181 else if ( ( dnoise.
type == fnoise.
type ) &&
1189 for (
int ii = 0; ii < dnoise.
values.size(); ii++ )
1191 double dnvalu = qAbs( dnoise.
values[ ii ] );
1192 double fnvalu = qAbs( fnoise.
values[ ii ] );
1193 double valmin = qMin( dnvalu, fnvalu );
1194 valmin = ( valmin == 0.0 ) ? dtoler : valmin;
1195 double difrat = qAbs( dnvalu - fnvalu ) / valmin;
1196 difmax = qMax( difrat, difmax );
1199 differs = ( difmax > dtoler );
1200 DbgLv(1) <<
" CONFLICT? model difmax differs" << difmax << differs;