UltraScan III
us_select_runs.cpp
Go to the documentation of this file.
1 
3 #include "us_select_runs.h"
4 #include "us_settings.h"
5 #include "us_gui_settings.h"
6 #include "us_matrix.h"
7 #include "us_investigator.h"
8 #include "us_passwd.h"
9 #include "us_db2.h"
10 #include "us_dataIO.h"
11 #include "us_util.h"
12 #include "us_editor.h"
13 #include "us_constants.h"
14 
15 // Main constructor with flags for edit, latest-edit and local-data
16 
17 US_SelectRuns::US_SelectRuns( bool dbase, QStringList& runIDs )
18  : US_WidgetsDialog( 0, 0 ), runIDs( runIDs )
19 {
20  sel_db = dbase;
21 
22  setWindowTitle( tr( "Select Run(s) as Models Pre-Filter (%1)" )
23  .arg( sel_db ? "DB" : "Local" ) );
24  setPalette ( US_GuiSettings::frameColor() );
25  setMinimumSize( 480, 300 );
26 
27  // Main layout
28  QVBoxLayout* main = new QVBoxLayout( this );
29  main->setContentsMargins( 2, 2, 2, 2 );
30  main->setSpacing ( 2 );
31 
32  // Top layout: buttons and fields above list widget
33  QGridLayout* top = new QGridLayout;
34  int ddstate = sel_db ? US_Disk_DB_Controls::DB
36 
37  dkdb_cntrls = new US_Disk_DB_Controls( ddstate );
38  connect( dkdb_cntrls, SIGNAL( changed ( bool ) ),
39  this, SLOT ( update_disk_db( bool ) ) );
40 
41  pb_invest = us_pushbutton( tr( "Select Investigator" ) );
42  QString invnum = QString::number( US_Settings::us_inv_ID() ) + ": ";
43  QString invusr = US_Settings::us_inv_name();
44  le_invest = us_lineedit( invnum + invusr, 0, true );
45  connect( pb_invest, SIGNAL( clicked() ),
46  SLOT ( get_person() ) );
47 
48  // Search line
49  QLabel* lb_filtdata = us_label( tr( "Search" ) );
51 
52  int row = 0;
53  top->addLayout( dkdb_cntrls, row++, 0, 1, 4 );
54  top->addWidget( pb_invest, row, 0, 1, 2 );
55  top->addWidget( le_invest, row++, 2, 1, 2 );
56  top->addWidget( lb_filtdata, row, 0, 1, 1 );
57  top->addWidget( le_dfilter, row++, 1, 1, 3 );
58 
59  connect( le_dfilter, SIGNAL( textChanged( const QString& ) ),
60  SLOT ( search ( const QString& ) ) );
61 
62  main->addLayout( top );
63 
65 
66  QStringList headers;
67  headers << "Run" << "Date" << "dbID" << "Label";
68  tw_data = new QTableWidget( 20, 4, this );
69  tw_data->setFrameStyle ( QFrame::NoFrame );
70  tw_data->setPalette ( US_GuiSettings::editColor() );
71  tw_data->setFont ( font );
72  tw_data->setSelectionMode ( QAbstractItemView::ExtendedSelection );
73  tw_data->setSelectionBehavior( QAbstractItemView::SelectRows );
74  tw_data->setHorizontalHeaderLabels( headers );
75  tw_data->verticalHeader()->hide();
76  tw_data->setShowGrid ( false );
77  tw_data->setColumnWidth( 0, 250 );
78  tw_data->setColumnWidth( 1, 100 );
79  tw_data->setColumnWidth( 2, 50 );
80  tw_data->setColumnWidth( 3, 350 );
81 
82  main->addWidget( tw_data );
83 
84  // Button Row
85  QHBoxLayout* buttons = new QHBoxLayout;
86 
87  QPushButton* pb_help = us_pushbutton( tr( "Help" ) );
88  connect( pb_help, SIGNAL( clicked() ), SLOT( help() ) );
89  buttons->addWidget( pb_help );
90 
91  QPushButton* pb_cancel = us_pushbutton( tr( "Cancel" ) );
92  connect( pb_cancel, SIGNAL( clicked() ), SLOT( cancelled() ) );
93  buttons->addWidget( pb_cancel );
94 
95  QPushButton* pb_accept = us_pushbutton( tr( "Select PreFilter(s)" ) );
96  connect( pb_accept, SIGNAL( clicked() ), SLOT( accepted() ) );
97  buttons->addWidget( pb_accept );
98 
99  main->addLayout( buttons );
100 
101  // List from disk or db source
102  list_data();
103  resize( 720, 360 );
104 }
105 
106 void US_SelectRuns::search( const QString& search_string )
107 {
108  bool have_search = ! search_string.isEmpty();
109  QFont tw_font( US_Widgets::fixedFont().family(),
111  QFontMetrics* fm = new QFontMetrics( tw_font );
112  int rowht = fm->height() + 2;
113  tw_data->clearContents();
114  tw_data->setSortingEnabled( false );
115 
116  for ( int ii = 0; ii < rlabels.size(); ii++ )
117  {
118  QTableWidgetItem* twi;
119  QString runID = rlabels.at( ii );
120 
121  if ( have_search &&
122  ! runID.contains( search_string, Qt::CaseInsensitive ) )
123  continue;
124 
125  twi = new QTableWidgetItem( runID );
126  twi->setFlags( twi->flags() ^ Qt::ItemIsEditable );
127  tw_data->setItem ( ii, 0, twi );
128  twi = new QTableWidgetItem( runmap[ runID ].date );
129  twi->setFlags( twi->flags() ^ Qt::ItemIsEditable );
130  tw_data->setItem ( ii, 1, twi );
131  twi = new QTableWidgetItem( runmap[ runID ].DB_id );
132  twi->setFlags( twi->flags() ^ Qt::ItemIsEditable );
133  tw_data->setItem ( ii, 2, twi );
134  twi = new QTableWidgetItem( runmap[ runID ].label );
135  twi->setFlags( twi->flags() ^ Qt::ItemIsEditable );
136  tw_data->setItem ( ii, 3, twi );
137 
138  tw_data->setRowHeight( ii, rowht );
139  }
140 
141  tw_data->setSortingEnabled( true );
142  tw_data->sortByColumn( 1, Qt::DescendingOrder );
143  tw_data->resizeColumnsToContents();
144  tw_data->adjustSize();
145  int twwid = size().width() - 4;
146  int twhgt = qMax( height(), tw_data->size().height() );
147  tw_data->resize( twwid, twhgt );
148  qApp->processEvents();
149 }
150 
151 // List data choices (from db or disk)
153 {
154  QFont tw_font( US_Widgets::fixedFont().family(),
156  QFontMetrics* fm = new QFontMetrics( tw_font );
157  int rowht = fm->height() + 2;
158  runmap .clear();
159  rlabels.clear();
160 
161  if ( sel_db ) // Scan database data
162  {
163  scan_dbase_run();
164  }
165  else // Scan local disk data
166  {
167  scan_local_run();
168  }
169 
170  tw_data->clearContents();
171 
172  if ( rlabels.size() == 0 )
173  {
174  QString clabel = tr( "No data found." );
175  tw_data->setItem ( 0, 0, new QTableWidgetItem( clabel ) );
176  return;
177  }
178 
179  tw_data->setSortingEnabled( false );
180  tw_data->setRowCount( rlabels.size() );
181 
182  for ( int ii = 0; ii < rlabels.size(); ii++ )
183  { // Propagate list widget with labels
184  QString runID = rlabels.at( ii );
185 
186  tw_data->setItem( ii, 0, new QTableWidgetItem( runID ) );
187  tw_data->setItem( ii, 1,
188  new QTableWidgetItem( runmap[ runID ].date ) );
189  tw_data->setItem( ii, 2,
190  new QTableWidgetItem( runmap[ runID ].DB_id ) );
191  tw_data->setItem( ii, 3,
192  new QTableWidgetItem( runmap[ runID ].label ) );
193 
194  tw_data->setRowHeight( ii, rowht );
195  }
196 
197  tw_data->setSortingEnabled( true );
198  tw_data->sortByColumn( 1, Qt::DescendingOrder );
199  tw_data->resizeColumnsToContents();
200  tw_data->adjustSize();
201  int twwid = size().width() - 4;
202  int twhgt = qMax( height(), tw_data->size().height() );
203  tw_data->resize( twwid, twhgt );
204  qApp->processEvents();
205 }
206 
207 // Cancel button: no editIDs returned
209 {
210  runIDs.clear();
211  reject();
212  close();
213 }
214 
215 // Accept button: set up to return editID pre-filter information
217 {
218  runIDs.clear();
219 
220  QList< QTableWidgetItem* > selitems = tw_data->selectedItems();
221 
222  if ( selitems.size() == 0 )
223  {
224  QMessageBox::information( this,
225  tr( "No Data Selected" ),
226  tr( "You have not selected any data.\nSelect or Cancel" ) );
227  return;
228  }
229 
230  // Get and return runIDs from selected runID items
231 
232  for ( int ii = 0; ii < selitems.size(); ii++ )
233  { // Loop thru selected runIDs
234  QTableWidgetItem* twi = selitems.at( ii );
235  if ( twi->column() != 0 )
236  {
237  int row = twi->row();
238  twi = tw_data->item( row, 0 );
239  }
240  QString runID = twi->text();
241  if ( ! runIDs.contains( runID ) )
242  runIDs << runID;
243  }
244 qDebug() << "Acpt: runIDs size" << runIDs.size();
245 qDebug() << "Acpt: runIDs" << runIDs;
246 if(sel_db)
247 {
248 US_Passwd pw;
249 US_DB2 db( pw.getPasswd() );
250 QString invID=QString::number( US_Settings::us_inv_ID() );
251 QStringList query;
252 query.clear();
253 query << "count_models_by_runID" << invID << runIDs[0];
254 int nmodl= db.functionQuery(query);
255 qDebug() << "Acpt: runID" << runIDs[0] << "count_models_by_runID" << nmodl;
256 }
257 
258  accept(); // Signal that selection was accepted
259  close();
260 }
261 
262 // Scan database for run sets
264 {
265 //qDebug() << "ScDB:TM:00: " << QTime::currentTime().toString("hh:mm:ss:zzzz");
266  US_Passwd pw;
267  US_DB2 db( pw.getPasswd() );
268 
269  if ( db.lastErrno() != US_DB2::OK )
270  {
271  QMessageBox::information( this,
272  tr( "DB Connection Problem" ),
273  tr( "There was an error connecting to the database:\n" )
274  + db.lastError() );
275  return;
276  }
277 
278  QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
279  QStringList query;
280  QString invID = QString::number( US_Settings::us_inv_ID() );
281 
282  // Build a mapping of experiment labels to experiment DB ids
283  QMap< QString, QString > explabs;
284  query.clear();
285  query << "get_experiment_desc" << invID;
286 
287  db.query( query );
288 
289  while ( db.next() )
290  {
291  QString expID = db.value( 0 ).toString();
292  QString runID = db.value( 1 ).toString();
293  QString label = db.value( 4 ).toString();
294  QString date = US_Util::toUTCDatetimeText( db.value( 5 )
295  .toDateTime().toString( Qt::ISODate ), true )
296  .section( " ", 0, 0 );
297 
298  rdesc.runID = runID;
299  rdesc.label = label;
300  rdesc.date = date;
301  rdesc.DB_id = expID;
302  runmap[ runID ] = rdesc;
303  rlabels << runID;
304  }
305 qDebug() << "ScDB: runmap size" << runmap.size();
306 //qDebug() << "ScDB:TM:88: " << QTime::currentTime().toString("hh:mm:ss:zzzz");
307 
308  build_runids();
309 
310  QApplication::restoreOverrideCursor();
311  QApplication::restoreOverrideCursor();
312 //qDebug() << "ScDB:TM:99: " << QTime::currentTime().toString("hh:mm:ss:zzzz");
313 }
314 
315 // Scan local disk for run sets
317 {
318  QString rdir = US_Settings::resultDir();
319  QStringList aucdirs = QDir( rdir ).entryList(
320  QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name );
321 
322  QStringList aucfilt( "*.auc" );
323  QStringList aucfiles;
324  QApplication::setOverrideCursor( QCursor( Qt::WaitCursor ) );
325 
326  for ( int ii = 0; ii < aucdirs.size(); ii++ )
327  {
328  QString subdir = rdir + "/" + aucdirs.at( ii );
329  QDir dirRun( subdir );
330  QStringList aucfiles = QDir( subdir ).entryList(
331  aucfilt, QDir::Files, QDir::Name );
332 
333  if ( aucfiles.size() < 1 )
334  continue;
335 
336  QString aucfbase = aucfiles.at( 0 );
337  QString aucfname = subdir + "/" + aucfbase;
338  QString runID = aucfbase.section( ".", 0, -6 );
339  QString subType = aucfbase.section( ".", -5, -5 );
340  QString tripl = aucfbase.section( ".", -4, -2 );
341  QString explabel = runID;
342  QString expID = "-1";
343  QString date = "";
344 
345  QStringList edtfilt;
346  edtfilt << runID + "." + subType + ".xml";
347  QStringList edtfiles;
348  edtfiles = dirRun.entryList( edtfilt, QDir::Files, QDir::Name );
349 
350  if ( edtfiles.size() != 1 )
351  continue;
352 
353  QString efpath = subdir + "/" + edtfiles[ 0 ];
354  QFile fileri( efpath );
355  if ( fileri.open( QIODevice::ReadOnly | QIODevice::Text ) )
356  {
357  QXmlStreamReader xml( &fileri );
358  QXmlStreamAttributes attr;
359 
360  while( ! xml.atEnd() )
361  {
362  xml.readNext();
363 
364  if ( xml.isStartElement() )
365  {
366  if ( xml.name() == "experiment" )
367  {
368  attr = xml.attributes();
369  expID = attr.value( "id" ).toString();
370  }
371 
372  else if ( xml.name() == "label" )
373  {
374  xml.readNext();
375  explabel = xml.text().toString();
376  break;
377  }
378  }
379  }
380 
381  fileri.close();
382 
383  date = US_Util::toUTCDatetimeText( QFileInfo( fileri )
384  .lastModified().toUTC().toString( Qt::ISODate ),
385  true ).section( "", 0, 0 );
386  }
387 
388  rdesc.runID = runID;
389  rdesc.label = explabel;
390  rdesc.date = date;
391  rdesc.DB_id = expID;
392 
393  runmap[ runID ] = rdesc;
394  }
395 
396  build_runids();
397 
398  QApplication::restoreOverrideCursor();
399  QApplication::restoreOverrideCursor();
400 }
401 
402 // Build the runID list from full run map
404 {
405  rlabels = runmap.keys();
406 
407  // Add "unassigned" entry
408  QString runID = "Unassigned";
409  rdesc.runID = runID;
410  rdesc.label = "Manual/Custom/Global";
411  rdesc.date = "2011/01/01";
412  rdesc.DB_id = "0";
413  rlabels << runID;
414  runmap[ runID ] = rdesc;
415 qDebug() << "BldR: rlabels size" << rlabels.size();
416 qDebug() << "BldR: runmap size" << runmap.size();
417 }
418 
419 
420 // Investigator button clicked: get investigator from dialog
422 {
423  int invID = US_Settings::us_inv_ID();
424  US_Investigator* dialog = new US_Investigator( true, invID );
425 
426  connect( dialog, SIGNAL( investigator_accepted( int ) ),
427  SLOT( update_person( int ) ) );
428 
429  dialog->exec();
430 }
431 
432 // Slot to handle accept in investigator dialog
434 {
435  QString number = ( ID > 0 ) ? QString::number( ID ) + ": " : "";
436  le_invest->setText( number + US_Settings::us_inv_name() );
437 
438  list_data();
439 }
440 
441 // Slot to handle accept in investigator dialog
443 {
444  emit dkdb_changed( isDB );
445 
446  sel_db = isDB;
447  runmap .clear();
448  rlabels.clear();
449 
450  if ( isDB ) // Scan database
451  {
452  scan_dbase_run();
453  setWindowTitle( tr( "Select Run(s) as Models Pre-Filter (DB)" ) );
454  }
455  else // Scan local disk data
456  {
457  scan_local_run();
458  setWindowTitle( tr( "Select Run(s) as Models Pre-Filter (Local)" ) );
459  }
460 
461  list_data();
462 
463  QString sfilt = le_dfilter->text();
464  if ( ! sfilt.isEmpty() )
465  search( sfilt );
466 }
467